LINUX.ORG.RU

Вышло издание 2,92 книги «Программирование: введение в профессию» А. В. Столярова

 , , ,

Вышло издание 2,92 книги «Программирование: введение в профессию» А. В. Столярова

4

6

Тихо и незаметно 30 апреля 2026 года вышло издание 2.92, которое наконец включает в себя читаемый текстовый слой.

Исправлены опечатки и ошибки, обнаруженные в предыдущих изданиях, в частности 2.91 (где введена кликабельная навигация) и 2.9 (первое чисто электронное издание).

Книга предназначена для самообучения основам программирования и в отличии от многих других изданий предполагает фундаментальный подход — вначале основы дискретной математики и использования GNU/Linux или BSD с командной строкой, затем паскаль, потом ассемблер и только потом Си, системное программирование и альтернативные парадигмы (функциональное, логическое и так далее).

Автор книги считает, что только такой порядок обеспечивает полноценное обучение программированию, и обосновывает такой подход в методическом предисловии к первому тому.

Кроме самой книги в трёх томах, издание так же включает отдельный задачник, хотя сам автор считает, что для тренировки в программировании лучше всего решать задачи, возникающие в голове самого обучающегося, а не придуманные кем-то ещё.

>>> Ссылка на страницу издания

>>> Альтернативные способы скачивания

>>> Новость на сайте автора

★★★★★

Проверено: dataman ()
Последнее исправление: CrX (всего исправлений: 10)
Ответ на: комментарий от liksys

Например, компилятор может соптимизировать твой код как угодно, в результате чего ты разыменуешь не NULL, а NULL с каким-нибудь оффсетом.

Логично a[10] = x, если a == NULL, превратится в (int*)(10) = x. И если очень не повезёт, может попасть на разрешённый блок памяти.

Убедил.

monk ★★★★★
()
Ответ на: комментарий от monk

А современные ОС разве возвращают NULL?

Да. Во-первых, ulimit и подобные ограничения. Во-вторых, если попытался выделить абсурдно большое количество памяти.

Кстати, когда Столярову указали на то, что существует ulimit, он сказал что-то вроде «ну да, я забыл про это, но в такой ситуации всё равно продолжать работу не имеет смысла, нужно упасть. А вас я забыл в игнор кинуть — старость не радость, да».

А разыменование NULL всё равно успешно завершает программу безо всяких проверок.

Нет, это UB. Произойти может всё, что угодно. А если ты root, то можно замаппить нулевую страницу в своём процессе.

ad hominem?
Мы обсуждаем моральный облик автора или его книгу и утверждения в книге?

Это связанные вещи. Если человек продаёт на базаре «лекарство от всех болезней», а кто-то подходит и говорит, что этот человек уже был судим за мошенничество и обращение фальсифицированных лекарственных средств — это ad hominem? «Мы обсужаем моральный облик торговца или его лекарство и утверждения о лекарстве?»

shdown ★★
()
Последнее исправление: shdown (всего исправлений: 3)
Ответ на: комментарий от monk

Хоть один новый проект за последний десяток лет был начат на Си, не говоря уж про Паскаль?

Кем? Вашим «любимцем» - Столяровым? ;P ;)))) Не знаю. Кем-то другим? Наверняка. И что??..

Somebody ★★★★
()
Ответ на: комментарий от monk

Побочный эффект в sin в виде вывода возвращаемого результата на стандартный вывод - плохо

А побочный эффект в виде установки errno в EDOM или кидания floating-point exception — плохо? В стандартной библиотеке sin делает одну из этих вещей, если передать ∞.

shdown ★★
()
Ответ на: комментарий от monk

Число возвращает? Возвращает. Значит функция.

Если бы у Столярова не было аллергии на новшества, мог бы свою идею излагать как «в Си, насколько возможно, надо писать функции так, чтобы к ним можно было применить атрибут pure».

Так «•функциями•» являются все четыре сущности (поскольку они возвращают число), или же только те, к которым можно применить атрибут pure (первые две)? Вы уж определитесь.

Кстати, «возвращает число» — это значит гарантированно завершается после конечного числа операций? Или просто тип возвращаемого значения? Если первое, можно написать сущность, которая будет функцией тогда и только тогда, когда ZFC is non-sound.

shdown ★★
()
Последнее исправление: shdown (всего исправлений: 2)
Ответ на: комментарий от liksys

Слышал я когда-то историю об одной универской преподше по черчению, кототорая очень любила чиркать чертежи красной ручкой прямо по ватману,

Это нормально, в совке преподами становятся в основном садюги, мечтающие безнаказанно доминировать. Нормальному человеку эта профессия отвратительна. Вне совка думаю ситуация не сильно лучше.

bread
()
Последнее исправление: bread (всего исправлений: 1)
Ответ на: комментарий от shdown

А побочный эффект в виде установки errno в EDOM или кидания floating-point exception — плохо?

Это не совсем эффект, это возврат результата, не входящего в double. И в общем случае это плохо, так как фактически запрещает использовать sin в выражениях, если значение аргумента может быть бесконечным и в выражении есть больше одной функции, устанавливающей errno.

В данном конкретном случае это не очень плохо, так как возвращается всё равно NaN, а всё остальное используется только для разграничения случаев когда пришёл NaN или пришла бесконечность. Это разграничение требуется крайне редко, поэтому второй результат обычно можно игнорировать.

monk ★★★★★
()
Ответ на: комментарий от shdown

Так «•функциями•» являются все четыре сущности (поскольку они возвращают число), или же только те, к которым можно применить атрибут pure (первые две)? Вы уж определитесь.

Все четыре функции без побочных эффектов. Завершимость это отдельная категория. Но чистая функция, которая не завершается за разумное время — это всегда ошибка программирования.

Кстати, «возвращает число» — это значит гарантированно завершается после конечного числа операций? Или просто тип возвращаемого значения?

Тип значения.

С точки зрения применения важна даже не просто завершимость, а завершимость за разумное время. Если доказано, что функция завершима, но её выполнение будет около 100 лет, то для всех практических задач это «зависшая подпрограмма».

monk ★★★★★
()
Ответ на: комментарий от Somebody

Кем-то другим? Наверняка. И что??..

То, что если прикладному программисту сейчас надо будет искать работу, очень вряд ли она будет связана с написанием программ на Си.

monk ★★★★★
()
Ответ на: комментарий от monk

В смысле, функцию, которая всегда завершима только тогда, когда ZFC is non-sound?

Если завершимость подразумевается без использования malloc, то эту завершимость можно вычислить за конечное время.

monk ★★★★★
()
Ответ на: комментарий от liksys

Нет. Ничего на нем уже не пишут, кроме дремучего легаси.

Вокруг Паскаля - это уже спор по кругу. Ты похоже считаешь, что учить программированию надо так, чтобы первый изучаемый ЯП был востребован на рынке, он активно применялся. Такой подход имеет право на жизнь, конечно, но есть и академический подход с постепенным основательным введением. И тут ничего плохого не вижу даже в изучении ассемблера MIX от Кнута - вот уж точно вакансий с ним нет.

Мы не всегда даже помним какие были проблемы в освоении программирования. Новичкам даже концепция массива и его индекса не сразу заходит, а им сразу Python, где и массивы и списки и туплы и словари, да ещё и массив может быть array, а может быть numpy'-евским и ещё в нескольких вариантах. И по синтаксису обращения не всегда ясно что есть, что, например, a[0] - это 1-й элемент массива или тупла? Понятно, не всё сразу давать надо, но всё же Паскаль тут мне кажется педагогически проще и Python и Си, притом Python далёк от железа и есть риск, что может не совсем правильное понимание работы вообще сформировать.

С теми же массивами, питоновский цикл for x in a: не даёт новичку нормально понять, что такое индекс массива. И чем вообще массив от списка (питоновского) отличается. Зачем для массива надо писать import array? Де-факто вместо массива новичок будет иметь дело со списком. Конечно, объяснить всё-равно можно, индекс (и для списка и для массива) можно использовать отдельно от цикла, сделать цикл с явным инкрементом индекса в теле или enumerate() и тд., но Паскаль тут педагогичнее, по-моему, а с Python новичок рискует оказаться с кашей в голове в понимании массивов и списков.

Время на изучения Паскаля не стоит считать потерянным. Во первых, это изучение программирования вообще на примере Паскаля, а его в любом случае необходимо потратить. Во вторых, если конкретно про учебник Столярова, то там того Паскаля не очень и много, по-верхам. Да и то в 1-м томе, в последующих уже совсем другие ЯП. В третьих, какой бы ЯП не изучать, но вряд ли после его изучения абсолютным новичком в программировании он сможет претендовать на какую-то вакансию.

anonymous_incognito ★★★★★
()
Последнее исправление: anonymous_incognito (всего исправлений: 6)
Ответ на: комментарий от monk
#include <stdio.h>
#include <stddef.h>

typedef struct Node {
    struct Node *prev;
    struct Node *next;
    unsigned char x;
} Node;

static const char *ip; // instruction pointer
static Node *dp; // data pointer

static void jump_to_matching_bracket(int direction)
{
    size_t balance = 0;
    for (;;) {
        switch (*ip) {
        case '[': ++balance; break;
        case ']': --balance; break;
        }
        if (balance == 0) {
            break;
        }
        ip += direction;
    }
}

static inline void interp(void)
{
#define RECUR(delta) (ip += (delta), interp())

    Node N;

    switch (*ip) {
    case '+':
        ++dp->x; RECUR(1); break;
    case '-':
        --dp->x; RECUR(1); break;
    case '.':
        putchar(dp->x); RECUR(1); break;
    case ',':
        dp->x = getchar(); RECUR(1); break;
    case '<':
        dp = dp->prev; RECUR(1); break;
    case '>':
        if (dp->next) {
            dp = dp->next;
        } else {
            N = (Node) {.prev = dp, .next = NULL, .x = '\0'};
            dp->next = &N;
            dp = &N;
        }
        RECUR(1);
        break;

    case '[':
        if (!dp->x) {
            jump_to_matching_bracket(1);
        }
        RECUR(1);
        break;

    case ']':
        jump_to_matching_bracket(-1);
        RECUR(0);
        break;

    case '\0':
        break;

    default:
        1 / 0;
    }
}

int main()
{
    ip = ">++++++++[<+++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.>++++++++++[<---------->-]<-.";

    Node N = {.prev = NULL, .next = NULL, .x = '\0'};
    dp = &N;

    interp();
}

Впрочем, в busy beaver не будет ввода-вывода (точнее, он будет эмулироваться) — и оно будет «чистой функцией» (?).

shdown ★★
()
Последнее исправление: shdown (всего исправлений: 3)
Ответ на: комментарий от anonymous_incognito

С теми же массивами, питоновский цикл for x in a: не даёт новичку нормально понять, что такое индекс массива. И чем вообще массив от списка (питоновского) отличается. Зачем для массива надо писать import array? Де-факто вместо массива новичок будет иметь дело со списком.

Ничем. Питоновский list это плюcовый vector<variant>. А array в питоне это типизированный массив (оптимизация для скорости).

И для понятия индекса лучше не проход по массиву использовать (который одинаков для любой последовательности), а умножение матриц, например: там без индекса никак.

но Паскаль тут педагогичнее, по-моему, а с Python новичок рискует оказаться с кашей в голове в понимании массивов и списков.

В Паскале списков вообще нет, только вручную писать. В питоне хоть есть from llist import sllist.

В третьих, какой бы ЯП не изучать, но вряд ли после его изучения абсолютным новичком в программировании он сможет претендовать на какую-то вакансию.

Знаю людей, у которых первым языком был 1С. После обучения уже могли им зарабатывать, а через пару лет зарабатывать хорошо.

monk ★★★★★
()
Ответ на: комментарий от shdown

А ещё он не считает нужным проверять результат malloc(), calloc() и прочее, на NULL.

А надо? Попытка разыменовать NULL приводит к падению процесса. Это вроде не уязвимость, учитывая что в случае, если памяти не хватает, завершить процесс и так самое разумное дейстие. Или я чего-то не понимаю?

Xenius ★★★★★
() автор топика
Ответ на: комментарий от monk

Те кто пишут systemd и wayland может и не идиоты, но это всё равно хрень. И очень плохо что становится всё труднее работать без неё. Вон в GTK4 собираются иксы дропнуть.

Xenius ★★★★★
() автор топика
Ответ на: комментарий от Xenius

А надо? Попытка разыменовать NULL приводит к падению процесса.

Выше же писали.

a = malloc(n);
a[i] = x; 

при a == 0 превратится в *i = x. Может не упасть, а что-то испортить.

monk ★★★★★
()
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от liksys

Итого, после прочтения книги ты будешь немного знать подмножество си, не противное автору, обладать странным набором авторских перверсий, почерпанных со страниц, и уметь в никому не нужный паскаль.

Ничего плохого в каком-то начальном понимании паскаля нет. Ненужную фигню и тонкости Столяров не даёт, только минимум необходимый для любого императивного ЯП.

Подмножество Си это почти полностью включает в себя ANSI C.

И есть ещё третий том, где рассматривается понятие парадигмы программирования и языки C++ и Tcl, а так же функциональные и логические.

Xenius ★★★★★
() автор топика
Ответ на: комментарий от monk

a[i] = x; при a == 0 превратится в *i = x. Может не упасть, а что-то испортить.

Забавно конечно, но это i должно быть каким-то огромным и специфическим. Посмотри сам какие обычно адреса выдаются программе при маллоке.

Xenius ★★★★★
() автор топика
Ответ на: комментарий от Xenius

Посмотри сам какие обычно адреса выдаются программе при маллоке.

Мир не ограничен x86-64/Linux. И нулевая страница может быть и разрешена админу на запись (а там ядро ОС).

monk ★★★★★
()
Ответ на: комментарий от monk

А ещё он не считает нужным проверять результат malloc(), calloc() и прочее, на NULL.

А современные ОС разве возвращают NULL?

Сколько можно то?

r--r--r--
()
Ответ на: комментарий от monk

И для понятия индекса лучше не проход по массиву использовать (который одинаков для любой последовательности), а умножение матриц, например: там без индекса никак.

Это само собой, но питоновский for удобен конечно, для тех, кто понимает, что он делает, но не уверен, что для новичка годится.

В Паскале списков вообще нет, только вручную писать. В питоне хоть есть from llist import sllist.

Как раз неплохое упражнение для закрепления работы с указателями.

anonymous_incognito ★★★★★
()
Ответ на: комментарий от anonymous_incognito

если реально «правильно учить программированию а не языку» и первым языком использовать Python то структуру данных с которой стоит начинать это dict - как нечто позволяющее ключ отображать в значение затем пояснить за «ассоциативные массивы» и перейти уже к описанию памяти как последовательности ячеек с натуральными адресами

qulinxao3 ★☆
()
Ответ на: комментарий от anonymous_incognito

Ты похоже считаешь, что учить программированию надо так, чтобы первый изучаемый ЯП был востребован на рынке, он активно применялся.

Нет, я считаю, что первый язык должен быть не абстрактным в вакууме, а инструментом для решения практических задач студента. Чтобы он мог взять свежеизученный язык и использовать его, скажем, для подготовки лаб по физике, проведя массу однотипных рассчетов. Или подготовить какие-нибудь данные к пеачати. Или гуй налабать для чего-нибудь. Проблема нашей системы образования в том, что предметы катастрофически оторваны друг от друга. А если бы на одном предмете ты изучал что-то, а потом видел, как это что-то можно применить в другом предмете - изучение обоих шло бы гораздо лучше. Когда я учился в универе, мои однокурсники, изучив на программировании какой-то язык, на той же физике продолжали мучительно считать вручную 40 строк для таблицы по формуле стьюдента. Это полный и бесповоротный абсурд.

Для обучения алгоритмическому базису как раз лучше всего и подходит питон. Тебе не нужно лезть в дебри numpy и array, достаточно использовать базовые структуры языка, на которых объяснять алгоритмику. Сущность списка гораздо более интуитивно-понятна, чем массив, особенно если ты хочешь положить в массив строки. Перво-наперво нужно научить студента собирать свои мысли в кучку и алгоритмизировать их, а не дрочить его ограничениями паскаля и базовыми типами. А чтобы было педагогически проще - надо просто составить грамотно курс обучения с гладкой кривой. Причем, в какой-то момент, когда студент будет уверенно ориентироваться в базовом питоне, нужно начать внедрять си, чтобы показать, как на самом деле работают внизу все структуры, которыми он пользовался раньше. Вот здесь я подробно об этом писал - как должна быть устроена правильная учебная программа с парой питон + си.

А все эти пляски вокруг паскаля - это борьба за чистоту академизма против здравого смысла изучения на практике.

liksys ★★★★
()
Последнее исправление: liksys (всего исправлений: 3)
Ответ на: комментарий от Xenius

Ничего плохого в каком-то начальном понимании паскаля нет. Ненужную фигню и тонкости Столяров не даёт, только минимум необходимый для любого императивного ЯП.

Паскаль не нужен сам по себе, я уже оскомину набил, повторяя этот простой факт, и предлагая вам простой и понятный путь обучения программированию на примере связки питон + си.

Подмножество Си это почти полностью включает в себя ANSI C.

Сейчас какой год? Это уже полный абсурд.

И есть ещё третий том, где рассматривается понятие парадигмы программирования и языки C++ и Tcl, а так же функциональные и логические.

То есть чтобы научиться программированию, придется читать как минимум полтора тома словоблудия, и только потом ты подойдешь чуть ближе к практике. Великолепно. Белиссимо.

Сказать тебе, как я изучал питон? Прочитал первые 50 страниц какой-то книжки в 2006 году. Всё. Остальное доделала практика.

liksys ★★★★
()
Ответ на: комментарий от anonymous_incognito

Это само собой, но питоновский for удобен конечно, для тех, кто понимает, что он делает, но не уверен, что для новичка годится.

Что тебе мешает на стерте использовать while в питоне, чтобы явным образом показать принцип индексации, а когда студент освоится - перейти к for?

liksys ★★★★
()
Ответ на: комментарий от Xenius

Это вроде не уязвимость

Это UB, с которым есть херова гора CVE, я об этом выше писал.

liksys ★★★★
()
Последнее исправление: liksys (всего исправлений: 1)
Ответ на: комментарий от monk

Знаю людей, у которых первым языком был 1С. После обучения уже могли им зарабатывать, а через пару лет зарабатывать хорошо.

Я знаю человека, у которого первым языком был китайский. После обучения он уже мог им зарабатывать.

Тут как бы стоит разделять…

CrX ★★★★★
()
Ответ на: комментарий от liksys

я считаю, что первый язык должен быть не абстрактным в вакууме, а инструментом для решения практических задач студента. Чтобы он мог взять свежеизученный язык и использовать его

Таки с этим все согласны. Вот только ещё НЕ умеющий программировать студен НЕ сможет взять и изучить полезный живой язык. Просто потому что для него фразы «в Си есть три оператора цикла» пустой звук.

Т.е. необходимы самоучители вида «Питон как первый язык программирования для ещё не умеющих программировать». В которых первая треть будет посвящена тому, что такое программирование, алгоритмы и структуры данных и т.п. После которой, на каком бы языке ни были бы иллюстрации, программировать на нём никто не сможет.

для подготовки лаб по физике, проведя массу однотипных рассчетов

С этим справиться даже bc, который после любого ЯП осваивается за 2 часа. Если же надо с извлечением данных из файла и записью результатов в файл, то bc внутри шелл-скрипта, что будет быстрее и понятнее для начинающего.

Или гуй налабать для чего-нибудь.

Это перпендикулярная к любому ЯП задача, поскольку гуй сейчас лабается применением внешней к ЯП библиотеки, т.о. знать надо эту библиотеку (Tk, GTK, Qt), которую можно применить с любым ЯП.

mister_VA ★★★
()
Ответ на: комментарий от mister_VA

Таки с этим все согласны.

Таки не все, учитывая что ты и прочие паскалефанбои отчаяно напираете на паскаль.

необходимы самоучители

А кто говорил, что не нужны? Нужны. Речь именно о том, что книга, дающая паскаль в качестве первого языка, просто отнимает полезное время, которое можно было бы потратить на аналогичную книгу, но с питоном, и получить больше выхлопа.

С этим справиться даже bc

У тебя студент не осиляет один язык из-за его чрезмерной низкоуровневости, а ты его еще и чем-то дополнительным хочешь нагрузить. Гениально.

Это перпендикулярная к любому ЯП задача

Нет. На одних языках гуи писать проще, чем на других. При этом для питона есть большой выбор кроссплатформенных библиотек дял гуев. Но это всё совершенно не важно: ты предлагаешь распылять внимание студента ради академического подхода, а я говорю, что время ограничено и его надо потратить на живой язык общего назначения, по которому существует вагон мануалов и библиотек.

Хватит тратить время студента на бесполезную ерунду.

liksys ★★★★
()
Последнее исправление: liksys (всего исправлений: 1)
Ответ на: комментарий от liksys

Чтобы он мог взять свежеизученный язык и использовать его, скажем, для подготовки лаб по физике, проведя массу однотипных рассчетов. Или подготовить какие-нибудь данные к пеачати. Или гуй налабать для чего-нибудь.

Для этих целей паскаль в виде FreePascal годен и для лаб по физике и для GUI (Lazarus). Я сам в начале 90-х лабы делал на турбо-паскале (на фортране тоже делал), принципиально лабы с тех пор не изменились. Python может даже более годен для лаб, но для этого студенту нужно не просто Python немного изучить, а освоить Pandas, Numpy, Mathplotlib и т.д. Впрочем, аналоги, позволяющие работать с табличными данными и библиотеки численных алгоритмов есть и для паскаля (FreePascal).

Тебе не нужно лезть в дебри numpy и array, достаточно использовать базовые структуры языка, на которых объяснять алгоритмику. Сущность списка гораздо более интуитивно-понятна, чем массив, особенно если ты хочешь положить в массив строки.

С моей точки зрения проблема в том, что человеку с околонулевым знанием программирования сходу предлагаются несколько высокоуровневых абстракций, при этом со слабой типизацией, для новичка можно сказать, что её даже нет.

Перво-наперво нужно научить студента собирать свои мысли в кучку и алгоритмизировать их, а не дрочить его ограничениями паскаля и базовыми типами.

Ну какие там ограничения-то? Не предлагается же на ISO Pascal всё делать, а уже с 90-х годов Delphi и FreePascal не имеют дурацких ограничений оригинала.

Вот здесь я подробно об этом писал - как должна быть устроена правильная учебная программа с парой питон + си.

Выглядит неплохо, но проблема в том, что я не знаю апробирована ли эта методика на реальных студентах или нет?

Столяров со всеми его заскоками всё же более 10 лет вёл реальный курс в МГУ, имеет опыт работы наверное с сотнями студентами за всё время и худо-бедно, но кого-то он таки выучил и столько лет он не вёл бы курс, если бы не добивался успеха.

По-хорошему, как раз было бы интересно обсудить с ним перспективы твоего более совремённого подхода, но к сожалению, тут он просто невменяем: и вообще абсолютно против Python где-либо, а за Python как первый ЯП, страшно представить какие кары готов обрушить :)

anonymous_incognito ★★★★★
()
Ответ на: комментарий от anonymous_incognito

Для этих целей паскаль в виде FreePascal годен и для лаб по физике и для GUI (Lazarus).

Мало годен. Если студент столкнется с какой-то проблемой - для живого языка ему будет проще найти решение в интернетах, чем для мертвого паскаля.

Python может даже более годен для лаб, но для этого студенту нужно не просто Python немного изучить, а освоить Pandas, Numpy, Mathplotlib и т.д.

Для простых вычислений ничего из этого не нужно. Второе и третье можно дать, когда студент уже освоится с алгоритмизированием. Первое не нужно для студенческих работ почти никогда.

С моей точки зрения проблема в том, что человеку с околонулевым знанием программирования сходу предлагаются несколько высокоуровневых абстракций

Это как раз не проблема, а ее решение. «Список элементов» более интуитивно понятен, чем массив в памяти, потому что человеку не надо задумываться, чем этот список является. ООП на примере питона объясняется проще, чем на других языках, потому что он в питоне очень кастрированный - и хорошо.

Ну какие там ограничения-то?

Ну то есть ты предлагаешь учить не классический паскаль, а его версию на стероидах. То есть - уже достаточно мощные, хотя и мертвые ныне языки. Уже на этом этапе можно задуматься, что лучше использовать что-то другое, если тебе всё равно не хватает классическо-академического паскаля.

Выглядит неплохо, но проблема в том, что я не знаю апробирована ли эта методика на реальных студентах или нет?

Курс MIT по программированию начинается с питона.

столько лет он не вёл бы курс, если бы не добивался успеха

А мы и не знаем, добивался ли он какого-то успеха, или просто грел стул, как 99% преподов, работающих по двадцать-тридцать лет на кафедрах. Я думаю, что в универе его могли облизывать по остаточному принципу, потому что он выпускает какую-то литературу и типа-знаменитость. О качестве его образования можно косвенно судить по его протеже, который писал статью rust-must-die, где навалил кучу безграмотных утверждений, буквально пересказывая утверждения столярова один к одному. Ее еще на хабре разбирали, если помнишь.

По-хорошему, как раз было бы интересно обсудить с ним перспективы твоего более совремённого подхода, но к сожалению, тут он просто невменяем

Я был бы только за. Проблема в том, что он неизбежно скатится в оскорбления, нытье про то, что я не преподавал, книг не писал и так далее, и конструктивного диалога у нас не получится.

liksys ★★★★
()
Ответ на: комментарий от anonymous_incognito

И чем вообще массив от списка (питоновского) отличается.

Вот-вот, это одна из основных причин изучения паскаля у Столярова, там можно сделать record из значения и указателя, затем в цикле заполнить список. В сишке тоже можно, но менее наглядно выходит.

Хотя мне проще рекурсией делать и в FPC есть tailcall elimination с каким-то -O так что стек она не забивает.

Xenius ★★★★★
() автор топика
Последнее исправление: Xenius (всего исправлений: 2)
Ответ на: комментарий от liksys

Когда я учился в универе, мои однокурсники, изучив на программировании какой-то язык, на той же физике продолжали мучительно считать вручную 40 строк для таблицы по формуле стьюдента. Это полный и бесповоротный абсурд.

Может такие студенты? Когда я учился, лабу на ассемблере я один из всей группы сделал, остальные у меня списали.

Кто мешает по формуле Стьюдента считать на паскале? Норм язык для практических задач. А уже освоив его можно переходить на другие языки, когда в нём становится тесно.

То есть чтобы научиться программированию, придется читать как минимум полтора тома словоблудия, и только потом ты подойдешь чуть ближе к практике. Великолепно. Белиссимо.

Нет, достаточно первых двух разделов первого тома: предварительные сведения и паскаль. Ничего плохого в написании практически полезных программ на паскале нет.

Сказать тебе, как я изучал питон? Прочитал первые 50 страниц какой-то книжки в 2006 году. Всё. Остальное доделала практика.

Ну так, если знать любой другой язык, питон действительно изучается за пару дней. Поэтому и нет смысла начинать обучение с питона. Можно начать с паскаля и перейти на питон моментально, если внезапно понадобится.

которое можно было бы потратить на аналогичную книгу, но с питоном, и получить больше выхлопа.

У Столярова есть предварительные сведения — дискретная математика, комбинаторика, использование юникс-подобных ОС. А в «аналогичной» книге про питон наверняка пишут, как поставить какую-то неведомую хрень под Windows и использовать IDE, не так ли?

Ну то есть ты предлагаешь учить не классический паскаль, а его версию на стероидах. То есть - уже достаточно мощные, хотя и мертвые ныне языки. Уже на этом этапе можно задуматься, что лучше использовать что-то другое, если тебе всё равно не хватает классическо-академического паскаля.

Ты книгу Столярова вообще не читал что ли? Он там явно пишет, причём в предисловии, что классический паскаль не нужен и объясняет, что кроме паскаля вообще ничего толкового нет в качестве первого языка и почему. При этом он берёт минимальное полезное подмножество паскаля и не рассматривает всякие with и set.

Для всяких численных методов и тд этого должно быть более чем достаточно и не нужно заморачиваться с питоном.

Xenius ★★★★★
() автор топика
Последнее исправление: Xenius (всего исправлений: 12)
Ответ на: комментарий от Xenius

А уже освоив его можно переходить на другие языки, когда в нём становится тесно.

Если он нужен только для обучения - то он не нужен. Почему - уже неоднократно объяснялось. Бери питон и учи на нём. Учить придется меньше, учебные часы не будут потрачены впустую.

Ничего плохого в написании практически полезных программ на паскале нет.

Кроме того, что их можно писать на питоне. И не только их, но и вещи посложнее.

Поэтому и нет смысла начинать обучение с питона.

Ты, кажется, вообще не отдупляешь, в чем проблема. Повторяю уже в который раз: на питоне проще показать суть инженерного подхода и декомпозиции при решении задач. На нем проще объяснять алгоритмы и структуры данных, потому что он позволяет меньше привязываться к низкому уровню, а сосредоточиться на том, чтобы перекладывать алгоритмы на код. На си потом будет проще перейти, потому что студент уже будет знать, как облекать свои мысли в код - просто на си он будет это делать, заботясь о дополнительных деталях платформенной реализации.

А в «аналогичной» книге про питон наверняка пишут, как поставить какую-то неведомую хрень под Windows и использовать IDE, не так ли?

Если исходная цель состоит в том, чтобы научить человека программированию - то да, пусть ставит язык под удобной ему системой, потому что ось не имеет никакого значения. У столярова есть мантра о том, что если человек не поставил юникс в первые три недели и не смог разобраться в его книгах - можно даже не пытаться учиться дальше. У меня есть контридея: столяров как преподаватель - говно, и подход его к преподаванию - тоже говно, потому что вместо организации плавной кривой обучения, он бросает студента в омут с головой в незнакомую ему среду, где ему придется бороться не только со своим мозгом, чтобы научиться алгоритмике, но еще и незнакомой ОС. Но поскольку самокритика у столярова напрочь отсутствует (как и у вас - критический взгляд на мнение вашего недоделанного гуру), то вместо того, чтобы попытаться разобраться в том, почему люди не могун научиться по его книгам, он клеймит их необучаемыми.

Ты книгу Столярова вообще не читал что ли?

Я не с книгой столярова общаюсь, чудо, а с человеком, который предлагал брать современный паскаль.

объясняет, что кроме паскаля вообще ничего толкового нет в качестве первого языка и почему

Отлично, я всё это разбирал, и объяснял, почему это бред.

Для всяких численных методов и тд этого должно быть более чем достаточно и не нужно заморачиваться с питоном.

Нет. Питон нужен по четырем причинам: (1) он очень высокоуровневый и позволяет организовать гладкую кривую обучения; (2) он живой, в отличие от паскаля; (3) на нем можно решать широкий спектр практических задач; и (5) он отлично интегрируется с си, что позволит плавно перейти от одного к другому.

Ни одну из этих задач паскаль не решает.

liksys ★★★★
()
Последнее исправление: liksys (всего исправлений: 1)
Ответ на: комментарий от liksys

Если студент столкнется с какой-то проблемой - для живого языка ему будет проще найти решение в интернетах, чем для мертвого паскаля.

В этом смысле, на Паскале проще найти, чем на Си. Потому что Паскаль входит в языки для ЕГЭ, а Си не входит (входит Си++). А начинать учить с Си++, по-моему, перебор.

Это как раз не проблема, а ее решение.

Здесь проблема не со списками (тем более, что в Питоне они на самом деле массивы). Проблема в том, что базовым типом является словарь. То есть, если человек первым языком изучает Перл или Питон, то он сначала все алгоритмы строит на словарях, а только потом, если видит что ключ - только натуральные числа в непрерывном диапазоне, тогда переходит к массиву-list, а если ещё и значение всегда одного типа, тогда к массиву-array.

Чтобы потом перейти к массивам/указателям как основному типу, приходится очень сильно перестраивать мышление. А скорость работы программы на словарях примерно на два порядка ниже, чем на массивах.

В том же 1С алгоритм поиска наименьшего значения студенты часто записывают как «отсортировать и взять первый элемент». Потому что сортировка есть как функция стандартной библиотеки, а так весь алгоритм сводится к одной строке.

В принципе, для современного программирования это некритично. Почти все программы пишутся не оптимально. Но вроде как учить надо правильному программированию.

monk ★★★★★
()
Ответ на: комментарий от Xenius

там можно сделать record из значения и указателя, затем в цикле заполнить список. В сишке тоже можно, но менее наглядно выходит.

А чем? Вроде программы построчно совпадают.

monk ★★★★★
()
Ответ на: комментарий от CrX

Я знаю человека, у которого первым языком был китайский. После обучения он уже мог им зарабатывать.

Так это же хорошо?

Тут как бы стоит разделять…

Зачем?

monk ★★★★★
()
Ответ на: комментарий от monk

В этом смысле, на Паскале проще найти, чем на Си. Потому что Паскаль входит в языки для ЕГЭ, а Си не входит (входит Си++). А начинать учить с Си++, по-моему, перебор.

В своем абзаце я говорил о питоне - там-то сильно проще будет найти, чем для паскаля. А про плюсы вообще ничего не говорил.

тем более, что в Питоне они на самом деле массивы

Нет, в питоне список - это буквально список: Lists are typically implemented either as linked lists (either singly or doubly linked) or as arrays, usually variable length or dynamic arrays. Ты, наверное, путаешь со связными списками и другими разновидностями списков.

Проблема в том, что базовым типом является словарь. То есть, если человек первым языком изучает Перл или Питон, то он сначала все алгоритмы строит на словарях…

Это какой-то несусветный бред. В списках при изъятии значения по индексу этот индекс переназначается другому элементу списка, и вообще весь список сдвигается. В словаре этого не происходит. Это фундаментально разные структуры. И потом, как научишь человека - так он и будет писать. Начнешь со списков с числами - он и будет обращаться с ними, как положено.

Чтобы потом перейти к массивам/указателям как основному типу, приходится очень сильно перестраивать мышление.

Если ты изначально не будешь заниматься ерундой с попытками прстроить словарь как базовый тип (что уже само по себе некорректно) - ничего перестраивать и не придется. Учи нормально - будет нормально.

В том же 1С алгоритм поиска наименьшего значения студенты часто записывают как «отсортировать и взять первый элемент».

Что тебе мешает для целей обучения не пользоваться стандартными алгоритмами, если твоя цель на начальном этапе - научиться алгоритмостроению? В этом проблема столярова и его поклонников: у вас полная каша в голове. Вместо того, чтобы разбить задачу обучения на последовательные маленькие этапы, вы сразу выливаете на студента ушат информации: и про побочные эффекты, и про массивы, и про память, и про указатели, и про прочую хренотень, забывая, что базовым навыком для успешного обучения программированию является в первую очередь алгоритмика, а не вот это вот всё. Как только студент научится облекать свои мысли в код и сможет мыслить системно, можно усложнять задачу, давая ему новые типы и большие алгоритмы, и упрощая ее в других местах, разрешив пользоваться стандартными функциями (например сортировки).

Но вроде как учить надо правильному программированию.

Как учить правильно программированию - я написал абзацем выше. А результат обучения по-академическому мы тоже уже все видели: абсолютно неготовые к работе студенты, не способные даже применить свои знания на практике, потому что вы навалили им кучу каши. Причем всё настолько плохо, что в РФ компаниям приходится свои курсы по программированию открывать и хантить на них студентов вузов. Отдельным пунктом идут фанаты столярова, которые программировать в итоге так и не научились, но почему-то отчаянно его подход защищают.

liksys ★★★★
()
Последнее исправление: liksys (всего исправлений: 1)
Ответ на: комментарий от Xenius

явно пишет, причём в предисловии

Кто читает предисловия?!

vM ★★★
()
Последнее исправление: vM (всего исправлений: 1)
Ответ на: комментарий от liksys

Если студент столкнется с какой-то проблемой - для живого языка ему будет проще найти решение в интернетах

Пайтон идеально подходит для обучения вайбкодингу?

vM ★★★
()
Ответ на: комментарий от liksys

В своем абзаце я говорил о питоне - там-то сильно проще будет найти, чем для паскаля. А про плюсы вообще ничего не говорил.

Где-то выше вроде было про питон и си. Ладно, значит я не понял. Про питон согласен.

Нет, в питоне список - это буквально список: Lists are typically implemented either as linked lists (either singly or doubly linked) or as arrays, usually variable length or dynamic arrays. Ты, наверное, путаешь со связными списками и другими разновидностями списков.

Я не путаю. Я указываю, что массив является списком (как абстрактным типом данных). И что в питоне list это динамический массив. Связные списки если нужны, то в библиотеках.

В списках при изъятии значения по индексу этот индекс переназначается другому элементу списка, и вообще весь список сдвигается.

Если нужна именно такая операция, то да. Можно удалять значение просто отмечая, что его нет (значением «пусто»). На словарях сдвиг можно явно циклом сделать.

И потом, как научишь человека - так он и будет писать. Начнешь со списков с числами - он и будет обращаться с ними, как положено.

Может быть. Просто дописывал программу за человеком, который учился писать на Perl. У него всё было в ассоциативных массивах.

monk ★★★★★
()
Ответ на: комментарий от monk

учился писать на Perl. У него всё было в ассоциативных массивах.

Как привык, так и делает. Мозг хитрый и ленивый.

vM ★★★
()
Ответ на: комментарий от vM

Как привык, так и делает. Мозг хитрый и ленивый.

Я именно про это. И если в Си и Паскале ассоциативный массив надо писать двумя экранами кода, в Си++ хотя бы сочинять достаточно длинную строку типа, то в Перле/Питоне/Яваскрипте работа с ассоциативными массивами настолько же проста, как и с обычными. Поэтому желание перейти на простой появляется только если понадобился сдвиг индексов у хвоста массива или что-то подобное.

monk ★★★★★
()
Ответ на: комментарий от liksys

Если он нужен только для обучения - то он не нужен.

Не только для обучения, но и для работы на первых порах. А когда уже уложатся в голове знания и понимание как надо делать — не только на учебных, но и на практических задачах, можно переходить на более серьёзные языки — ассемблер и Си. Или если нужен питон, то можно и на питон.

Ничего плохого в написании практически полезных программ на паскале нет.

Кроме того, что их можно писать на питоне. И не только их, но и вещи посложнее.

Питон кстати ещё и жутко тормозной, тот же Tcl быстрее. Если ты настаиваешь на высокоуровневом скриптовом языке, то Tcl лучше, причём не только скоростью работы, но и чистотой синтаксиса.

Повторяю уже в который раз: на питоне проще показать суть инженерного подхода и декомпозиции при решении задач.

Чем проще?! Ну чем вот? Где пруфы что на питоне проще?

потому что он позволяет меньше привязываться к низкому уровню, а сосредоточиться на том, чтобы перекладывать алгоритмы на код.

А где ты в паскале привязываешься к низкому уровню? Массивы, записи, ввод-вывод и так далее (в общем-то всё в рамках школьной программы и первого семестра универа) там выглядят приблизительно так же как на питоне, просто пишутся другими словами.

Если исходная цель состоит в том, чтобы научить человека программированию - то да, пусть ставит язык под удобной ему системой, потому что ось не имеет никакого значения

Вот Столяров как раз обосновывает это так: учиться программированию надо на реальных задачах, а не на игрушечных. Написать графическое приложение можно только уже будучи программистом. А вот консольное приложение-фильтр можно легко написать имея лишь начальные знания паскаля (в пределах первого тома). А консольные программы-фильтры полезны только в юникс-подобных ОС, поскольку в винде пайпы через задницу и консолью почти никто не пользуется.

Заметь что в этом пункте твой и его подход совпадают.

У столярова есть мантра о том, что если человек не поставил юникс в первые три недели и не смог разобраться в его книгах - можно даже не пытаться учиться дальше.

В этом я с ним не согласен. Я например Windows (XP) пользовался целых четыре года после покупки первого компа, прежде чем наконец его снёс и полностью перешел на GNU/Linux. Кстати перешел я в связи с выходом Vista, я её поставил, она ужасно тормозила, а линукс современной версии летал не хуже XP.

Я не с книгой столярова общаюсь, чудо, а с человеком, который предлагал брать современный паскаль.

Так Столяров тоже предлагает современный паскаль. А твоя критика паскаля основана на древнем паскале, который никто и не предлагал.

Нет. Питон нужен по четырем причинам: (1) он очень высокоуровневый и позволяет организовать гладкую кривую обучения; (2) он живой, в отличие от паскаля; (3) на нем можно решать широкий спектр практических задач; и (5) он отлично интегрируется с си, что позволит плавно перейти от одного к другому.

В задачах уровня школы и первого курса код на паскале, C++, Бейские, Python и КуМире выглядит примерно одинаково. Если не веришь, посмотри решения задач ЕГЭ по информатике. Там один в один то же самое, ключевые слова только разные. Для практического применения ввода-вывода через stdio и параметры комадной строки в принципе достаточно, так что и в первых практических задачах код будет один-в-один.

Ни одну из этих задач паскаль не решает.

Первый пункт я разобрал. Высокоуровневость в начальном обучении роли не играет и только забивает мозги ненужной хренью. Для начала достаточно двух составных типов — записи и массивы, которые есть в паскале. Прежде чем использовать более сложные типы вроде списков, деревьев и словарей надо разобраться, как они устроены внутри, а питон это делать не позволяет.

2, 3 и 5 свойствено и питону и паскалю, а пункт 4 ты пропустил.

Xenius ★★★★★
() автор топика
Последнее исправление: Xenius (всего исправлений: 1)
Ответ на: комментарий от monk

Если нужна именно такая операция, то да. Можно удалять значение просто отмечая, что его нет (значением «пусто»). На словарях сдвиг можно явно циклом сделать.

То есть ты сейчас просто придумал на ровном месте проблему, совершенно некорректно заявив, что в питоне базовым типом является словарь, а теперь героически его решаешь. Еще раз повторяю: учи нормально - будет нормально.

Может быть. Просто дописывал программу за человеком, который учился писать на Perl. У него всё было в ассоциативных массивах.

Не может быть, а точно. Ты приводишь частный случай укушенного перлом человека, потому что ему никто не показал, как правильно. Мы же говорим об обучении по литературе и с преподавателем.

liksys ★★★★
()
Последнее исправление: liksys (всего исправлений: 1)
Ответ на: комментарий от liksys

Мы же говорим об обучении по литературе и с преподавателем.

Вот, кстати! Книги Столярова предназначены для обучения без преподавателя. Он вообще считает, что программированию невозможно научить, ему можно только научиться самостоятельно, а преподаватель может максимум что-то подсказать или направить.

Xenius ★★★★★
() автор топика
Ответ на: комментарий от liksys

совершенно некорректно заявив, что в питоне базовым типом является словарь

Может быть, и не базовым, но очень важным для внутреннего устройства основной реализации питона

>>> str( str.__dict__)[:80]
"{'__repr__': <slot wrapper '__repr__' of 'str' objects>, '__hash__': <slot wrapp"
vM ★★★
()
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.