Письмо Дейкстры: почему обучение программированию нужно начинать с функционального языка

http://www.cs.utexas.edu/users/EWD/OtherDocs/To%20the%20Budget%20Council%20concerning%20Haskell.pdf
  • Перевод


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

Мы в Хекслете недавно запустили новую версию, ключевой особенностью которой стали практические упражнения по программированию в браузере. В связи с этим мы стали получать еще больше писем от начинающих программистов с вопросами вроде «с чего начать». С одной стороны, они хотят выложить бета-версию приложения в app store через неделю. С другой стороны, мы понимаем, что за такой короткий срок, наверное, можно научиться кодить приложения, но нельзя научиться программировать. И сложно решить, что лучше: как можно быстрее научить созданию простых приложений без реального понимания программирования, алгоритмов и их вычислительной сложности, а потом начать знакомство с этими важными темами, или начать «с начала», и органично придти к созданию приложений и продуктов после освоения фундамента.

В 2001 году, Эдсгер Дейкстра написал письмо экономическому совету университета Техаса. В нем знаменитый ученый призывает членов совета задуматься о смене языка программирования для вводного курса. К сожалению, язык был заменен на Java. Примерно в то же время MIT сменили язык курса «Структура и интерпретация компьютерных программ» с функционального Scheme (диалекта LISP) на Python.

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

Членам Экономического Совета


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

Понимаете, это не мелкая деталь. Коллеги из других штатов (все еще!) не понимают, как я могу выживать в таком месте как Остин, Техас, автоматически полагая что консервативный Техас означает посредственность. Обычно я отвечаю «Не волнуйтесь. Департамент информатики — довольно просвещенное место, например, во вводном курсе по программированию мы знакомим студентов с Haskell». Вначале они не верят, а потом начинают завидовать. Обычно оказывается, что их учебный план до сих пор не оклемался от перехода с Pascal на что-то вроде C++ или Java.

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

Фундаментальная причины выбора в том, что функциональные программы ближе к математическим объектам чем императивные, так что легче объяснять, в чем заключаются строгие рассуждения при программировании. Дополнительный плюс функционального программирования с «ленивыми вычислениями» в том, что оно предоставляет окружение, провоцирующее практические рассуждения.

Наконец, сравнивая конкретно Haskell и Java, хочу сказать, что Haskell хоть и не идеален, но на порядки качественнее чем беспорядочная Java (которой потребовалась широкая рекламна кампания и агрессивные продажники чтобы стать коммерчески приемлемым продуктом). Она настолько плоха, что вся индустрия в целом принимает низкокачественный дизайн как стандарт де факто. Лично я считаю, что университет должен оставить более здоровую альтернативу на плаву.

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

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

Обучение программированию следует начинать с

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

Hexlet 52,04
Практические уроки по программированию
Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама
Комментарии 308
  • +22
    К сожалению, в голосовании отсутствует пункт: «Обучение программированию следует начинать с основ теории алгоритмов».
    • +8
      Добавил.
      • +4
        Полная бредятина, извините уж.
        Многим сложно манипулировать абстрактными понятиями и начинать размышления о теории абстрактных алгоритмов в вакууме в силах лишь 1-5% задротской верхушки класса.
        Для остальных же, понятнее и проще написать пальцами и увидеть в stdout результат, поэтапное изменение состояния в дебаггере и пр.
        Не все вещи, что в теории звучат хорошо и *правильно*, являются такими на самом деле на практике.

        В этом плане, функциональные языки программирования занимают золотую середину между двух полюсов — основ теории на бумажке и «дебильным» присваиванием регистров в C. :)
        • +8
          Вы о чем вообще? Какие абстрактные алгоритмы в вакууме? Знать что скрывается за std::sort() и как именно это работает, это задротство или нет?

          Можетбыть, вы, конечно, собираетесь всю оставшуюся жизнь выводить в stdout банальное «Hello, world!», то претензий нет.

          Если вам (или кому-то еще) сложно манипулировать в голове абстрациями типа стека или очереди, так может и вовсе не надо? Мне преподаватель в университете говорил, что много есть хороших профессий: танцоры, повара и т.д. Теория алгоритмов не подразуме
          • +23
            Я же не отрицаю, что этого знать не надо. Просто не начинать с этого, вот и все (см. ответ ниже).
            Я столкнулся с подобной ситуацией на своём курсе, где сначала мы какраз изучали как сортировать массив, как представляется список с указателями и прочее, ниразу их в живую не видев. У большинства людей на потоке были серьёзные проблемы сложить в этой всей наразберихе «2+2».
            На следующий семестр нужно было _написать_ всё то же самое руками на С и всё стало на свои места в сию же секунду. Многие люди в этот момент «прозрели» и стали понимать что такое массив или указатели наконец.
            Поэтому логический порядок вещей не всегда ведет к такому же порядку в обучении.
            • +1
              ИМХО Это проблема программы обучения, а не фундаментальной теории. Если изучать теорию без отрыва от практики, сами понимаете, всё будет нормально. Ну, а кроме того, кто мешал большинству людей сесть и самому написать на C всё то же самое руками сразу, не дожидаясь следующего семестра :)
              • +15
                Вернитесь в тот момент, когда вы еще не видели компьютера, возможно вам было тогда 7 лет. Вам надо начать изучать программирование. Теория алгоритмов как нельзя лучше для этого подходит. Вернитесь в то время когда вам 1 год, вам надо научиться ходить — теория анатомия как нельзя к месту.
                • –2
                  Вы утрируете. Эдсгер всё-таки не про детей писал.
                  • +6
                    Ну обучение специалиста это двухсторонний процесс — со стороны студента, понятное дело, должно быть усилие, но и со стороны программы должна быть грамотная структура и организация. Всегда можно сказать в ответ на хреновую программу, что студентам нужно усерднее работать. Прикол же в балансе. Иначе вобще можно сказать, что программа и универ не нужна, пусть сами всё усредно долбят.
                    Аналогия с детьми сдесь абсолютно к месту. Чем отличается студент, не умеющий кодить от ребёнка, не умеющего ходить? :) (не придираясь к деталям)
                    • 0
                      Согласен с вами. Некоторые, кстати, так и делают (касательно вашей последней фразы) :)
                      • –10
                        Хм.
                        1. Я не согласен с тем, что мне в 7 лет надо учиться программировать. Это высосано из пальца.
                        2. «Чем отличается студент, не умеющий кодить от ребёнка, не умеющего ходить?» — это, простите, софистика. К сожалению, у меня сегодня нет желания философстовать, сорри.
                      • +2
                        Заголовок: «обучение программированию нужно начинать с функционального языка»
                        Опрос: «Обучение программированию следует начинать с»

                        Ключевое слово НАЧИНАТЬ. Или нам придется вернуться ко временам наших праотцов, когда обучение начинали лет в 30-40? Если мы рассуждаем о реальности, то надо сразу ставить все по своим местам. В наше время начинать учиться программированию можно балуясь играми в пять лет. Теория алгоритмов в современном мире никак не может попасть на первое место в этой цепочке — это не возможно в принципе.

                        Вы можете предложить реалистичный сценарий, в котором бы человек, которому требуется знание теории, не пробовал бы попрограммировать в живую?
                        • 0
                          Вам просто не нравится, что теории алгоритмов уделяется такое значимое место в моих комментариях, да? )

                          1. Вот вы так написали:

                          Заголовок: «обучение программированию нужно начинать с функционального языка»
                          Опрос: «Обучение программированию следует начинать с» Ключевое слово НАЧИНАТЬ.

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

                          2. Я не против, что дети будут учиться программированию в пять лет. Да, пожалуйста — я правда не против. При чем здесь теория программирования? Вы очень лихо перескакиваете с одной темы на другую.
                          • 0
                            >>При чем здесь теория программирования?
                            Показалось, что вы встали на защиту позиции «пункт: «Обучение программированию следует начинать с основ теории алгоритмов».»

                            Если это мой глюк, то тема исчерпана. Если нет, предложите реалистичный сценарий как начать целесообразное изучение программирования с теории (биоматериал, не связывающий свою жизнь с информатикой не рассматривается).
                            • 0
                              Я за гармонию :) Скажем так, за правильную подачу теории вкупе с практикой.
                          • +4
                            Забавно, что в голосовании этот вариант (с теорий) занимает первое место. Люди тихо продолжают срать в карму, но «снизойти» и объяснить свою точку зрения не доходят руки. Типичный хабр.
                            Тут далеко по книге ходить не надо, но очевидно, что любому из категории «средняка» этот вариант сразу будет казаться бредом, ибо можно будет на своей же шкуре представить возникающие трудности.
                            Любому, знакомому с основами преподавания (или с опытом) — тоже.
                            Остаётся кучка умников, которые всё в этой жизни знают, по себе меряют и всех за говно держат, которым только дорога в повара и танцоры :)
                            • –3
                              У вас какой-то озлобленный взгляд на всю ситуацию. Поясните, кто это «любому из категории «средняка»»? И вот это тоже «Остаётся кучка умников, которые всё в этой жизни знают, по себе меряют и всех за говно держат, которым только дорога в повара и танцоры :)»?
                    • +1
                      Я видел обратное когда учили языку. И в итоге люди не понимали даже для чего нужны функции, они знали как их описать. знали как вызвать но зачем они не понимали.
                      Бывали случаи и интересней когда студентов обязывали делать лабораторки по всяким способам сортировки которые по названию и в инете не на гуглишь с первого раза.
                      Так вот что первый, что второй случаи одинаково ужасны. Должен быть баланс, и вот найти походу до сих пор не смогли.
                      • +1
                        Нет такого человека, который бы искал, а если и есть, то до него никому нет дела:) Эффективность образования ни в каких единицах не измеряется, кроме набора на первый курс. Стыдно будет на показатели смотреть.
                      • 0
                        // комментарий с опозданием на год :)

                        Поддержу. Начинать стоит с создания собственных алгоритмов. Изучили язык, познакомились с массивами и прочим… Ставим задачу поиска. Как бы вы искали в массиве? А можно ли придумать более быстрый способ? А если данные отсортированы? И т.п.
                        Кстати, с математикой точно также, только там теоремы, а не алгоритмы.
                        • –1
                          Видимо, в Стэнфорде хуже вас знают, как надо преподавать алгоритмы.
                          • 0
                            Можно спокойно найти 20 авторитетов, мнения которых будут не совпадать. Кто-то из них точно ошибётся.
                            А весь Стэнфорд придерживается единого мнения? Вплоть до человека?
                            • +1
                              Да не надо, чтобы все придерживались одного мнения, достаточно, чтобы те, кто составляют программу, имели конкретное мнение.
                              • 0
                                Этого недостаточно: нужно, чтобы они имели ещё и правильное мнение.
                                Ну и, вообще говоря, странно выглядит наш спор: я, да и вы, подозреваю, тоже, не проводили каких-либо опытов, чтобы иметь возможность на их основе оценить, какой вариант лучше. Возможно, вы знаете два каких-либо университета, в которых именно это изучают по-разному, при прочих равных (т.к. сравнивать, например, Стэнфорд с вузом из российской глубинки — явно некорректно)? Я не знаю, так что возможностей сравнить у меня нет.
                                Но, тем не менее, своё мнение у меня сложилось на основе того, как знакомился с этим я. Ну а я научился создавать алгоритмы задолго до того, как познакомился с большинством классических. Я тогда не знал, что такое, например, бинарный поиск, зато спокойно мог создать и написать, скажем, алгоритм поиска подстроки в строке, алгоритм поиска в дереве, алгоритм создания бинарного дерева из массива (если бы мне объяснили, конечно, что такое бинарное дерево, что, впрочем, элементарно). Возможно, не самый быстрый и эффективный, зато свой и сходу.
                                Возможно, поэтому, когда я знакомился с классическими алгоритмами, каких-то больших трудностей не возникало. Именно поэтому я поддерживаю эту идею. Потому что нужно сначала выучить язык, а не сходу переводить на нём тексты.
                                • 0
                                  Этого недостаточно: нужно, чтобы они имели ещё и правильное мнение.

                                  Как определяется правильность?

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

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

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

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

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

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

                                  Иными словами, обучение конкретному языку программирования — это один курс. Обучение алгоритмам — другой курс. Смешивать их не стоит.
                                  • 0
                                    Как определяется правильность?

                                    Правильное мнение — то, которое принесёт наилучший результат. В данном случае.

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

                                    Не отрицаю, что вы можете быть правы. Даже не пытаюсь вас убедить. Просто делюсь своим мнением.

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

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

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

                                    Возможно. Если честно, с этой стороны я не смотрел: мне совершенно непонятен смысл алгоритмов (не общечеловеческих или математических, а именно тех же алгоритмов поиска, сортировки и т.п.) в отрыве от программирования и практики.
                                    Впрочем, сейчас большинство предметов преподаются точно также, математика, например.

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

                                    У меня большой соблазн упомянуть Кнута :). Хоть это и не совсем верно.
                                    • 0
                                      мне совершенно непонятен смысл алгоритмов (не общечеловеческих или математических, а именно тех же алгоритмов поиска, сортировки и т.п.) в отрыве от программирования и практики.

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

                                      Поэтому (классические) алгоритмы — это как раз теоретический предмет, имеющий скорее фундаментальную, нежели прикладную ценность.
                                      • 0
                                        Извините, но в аналогиях математики это похоже на «мне непонятен смысл учиться доказывать теоремы: нужна теорема — посмотри доказательство в интернете».

                                        Смысл элементарен: не под всё есть алгоритмы. Да вот элементарнейшая задача: массив линий, из которых состоит произвольный многоугольник, посчитать boundbox многоугольника. Насколько могу судить, это не похоже ни на разновидность поиска, ни сортировки. Возможно, среди алгоритмов компьютерной графики найдётся что-нибудь такое… Но чёрт, зачем? Зачем, если абсолютно очевидно, как это делается?

                                        Очевидно человеку, умеющему разрабатывать алгоритмы. Очевидно, наверное, человеку, глубоко овладевшим классическими — стоит заметить, это элементарная задача для умеющего разрабатывать.
                                        По большому счёту, вся разработка состоит из создания разной сложности и разного рода алгоритмов. А покажите мне алгоритм, например, побуквенного парсинга XML или JSON… А он относится к классическим?
                                        А сможет ли такой алгоритм написать человек, умеющий создавать алгоритмы? А человек, знакомый с классическими алгоритмами?

                                        Разве я где-то ошибаюсь?
                                        • 0
                                          Извините, но в аналогиях математики это похоже на «мне непонятен смысл учиться доказывать теоремы: нужна теорема — посмотри доказательство в интернете».

                                          Насколько я помню свое обучение математике в школе, мы основные теоремы не доказывали сами, а брали уже существующие доказательства, которые учили (не в смысле «наизусть», а в смысле «осознавали»).

                                          Смысл элементарен: не под всё есть алгоритмы.

                                          Я имел в виду именнно разработку своей версии уже существующего алгоритма.

                                          Зачем, если абсолютно очевидно, как это делается?

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

                                          Поэтому я считаю, что с практической точки зрения надо учить людей не «разрабатывать алгоритмы», а решать поставленные задачи в заданных ограничениях. А в — отдельном — курсе дизайна и анализа алгоритмов уже рассказывать собственно как и почему алгоритмы с большой буквы А устроены именно так, и чем надо руководствоваться при построении своего алгоритма. Понятное дело, что курсы эти взаимопроникающие, и слушая второй учащийся должен мысленно искать подходящие прикладные задачи, а решая задачи из первого — применять навыки, полученные на втором. Но все же у этих курсов разные цели.
                                          • +1
                                            Насколько я помню свое обучение математике в школе, мы основные теоремы не доказывали сами, а брали уже существующие доказательства, которые учили (не в смысле «наизусть», а в смысле «осознавали»).
                                            А мы вот — доказывали всё сами. С чистого листа. Да, у нас была последовательность теорем (лемм), которая помогала не сбиться «с пути истинного», но все доказательства каждый ученик придумывал сам и рассказывал — тоже сам.

                                            Знаете в чём разница? Очень просто: я учился в матклассе, а вы, скорее всего — в обычном.

                                            Вот и здесь та же история. Люди учат доказательства, а не придумывают их, не потому, что так «правильнее», а потому, что на другой подход преподавателей не хватает.
                                            • 0
                                              А мы вот — доказывали всё сами.

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

                                              Очень просто: я учился в матклассе, а вы, скорее всего — в обычном.

                                              Да, в обычном.

                                              Люди учат доказательства, а не придумывают их, не потому, что так «правильнее», а потому, что на другой подход преподавателей не хватает.

                                              Вы серьезно считаете, что каждый студент способен придумать алгоритм Штрассена?
                                              • 0
                                                Ну то есть предполагается, что каждый ученик не глупее тех исторических математиков, которые доказывали это до него?
                                                Нет, предполагается что те «исторические математики» шли через лес напролом, а учеников можно (и нужно!) провести по тропе. Но через тот же самый лес.

                                                Вы серьезно считаете, что каждый студент способен придумать алгоритм Штрассена?
                                                Почему студенты? Школьники, да. Мы же придумывали как-то! Причём я и сейчас легко смогу его «восстановить» если вы меня спросите не про алгоритм Штрассена, а про умножение матриц за O(Nlog27). Там нет ничего сложного. Ответ является очень сильной подсказкой сам по себе.

                                                Разумеется для того, чтобы все достаточно большое количество учеников прошли весь путь нужно аккуратно выстроить серию лемм — они указывают «напраление движения» в лесу, о котором я говорил выше.
                                                • 0
                                                  Кстати говоря…
                                                  Ну то есть предполагается, что каждый ученик не глупее тех исторических математиков, которые доказывали это до него?

                                                  Математика постоянно упрощается, вводит новые термины, новый язык. Пользуясь которыми можно доказать всё то же, но только гораздо проще и быстрее. Теорема Пифагора в комплексных числах доказывается в 2 строчки, не говоря уже о том, что за всё время было придумано больше сотни (а то и двух, точно не помню) её доказательств. Так что же, школьник, догадавшийся до такого доказательства, умнее, *имя_исторического_математика*, который её не мог доказать в 2 строчки? Да нет, у математика просто не было комплексных чисел.
                                                  Это и есть те самые тропы, по которым нужно вести учеников.

                                                  На 1 курсе я, пытаясь понять, что же такое предел, случайно сам вывел определение через эпсилон-дельта. А ведь до Коши (вики уточняет, что это всё же был Больцано) до этого никто не додумался!
                                                  Правда, потом оказалось, что, хоть определение и идентично, понимал я его, скорее, в терминах нестандартного анализа (ещё круче ведь! нестандартный анализ сам придумал), но именно с этого я начал понимать, что же в анализе творится и происходит.

                                                  И да, я полностью уверен, что сегодняшний школьник спокойно выведет и большую часть анализа, и классических алгоритмов, если задавать ему правильные вопросы.
                                                  Например, идея приближённого вычисления площади фигуры через аппроксимацию суммой площадей прямоугольников была для меня полностью очевидна и в школе, а интеграл — всего лишь предельный случай, когда мы говорим о бесконечно малых прямоугольниках (уточню, это, скорее, в терминах нестандартного анализа, но так проще и быстрее).
                                                  Или вот возьмём поиск. У Кормена был пример с книжной полкой, ни один человек в своём уме не будет искать книгу с начала, если фамилия автора начинается на «Я», а книги на полке расположены в алфавитном порядке. Вот вам и вопрос, который подталкивает школьника к идее бинарного поиска.

                                                  Не все, конечно же, можно вывести самому. Но важно, чтобы выводилось буквально всё, что возможно. Зачем? Это гораздо более высокий уровень, это строит правильную модель размышления, которая будет использоваться дальше при аналогичных задачах. И размышлять самому, пусть и направляясь кем-то, гораздо, гораздо эффективнее, чем смотреть размышления другого.
                                                  • 0
                                                    Теорема Пифагора в комплексных числах доказывается в 2 строчки,

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

                                                    Не все, конечно же, можно вывести самому.

                                                    Бинго. Все остальное — вопрос разделения на то, что можно вывести, и то, что выводить неэффективно.

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

                                                    Внимание, вопрос: сколько на это уйдет времени?
                                                    • 0
                                                      Для этого надо знать комплексные числа. Мне кажется, или теорему Пифагора обычно преподают раньше?
                                                      Не кажется. В математике вообще есть много способов придти к одному и тому же результату. Какой из них короче и проще — это тоже большой вопрос. Когда вы просто «выдаёте факты» — это не так важно. Когда вы «прокладываете» вышеописанную тропу — другое дело.

                                                      Внимание, вопрос: сколько на это уйдет времени?
                                                      Это неправильный вопрос. Примерно столько же, сколько и на обычное обучение математике, как ни странно.

                                                      Правильный вопрос: сколько на это уйдёт преподавателей (ну или, скорее, помощников преподавателей)… У нас в классе на ~20 человек их было 5-6 (студенты, понятно, но не в этом дело). К сожалению подобные вещи даже очень богатые школы могут вытворять только с «профильными» предметами.

                                                      Зачем нужно столько учителей? Для того, чтобы проверять выкладки, придумываемые учениками и указывать им на их ошибки. А иначе смысла нет — достаточно часто первое решение, которое придумывает ученик оказывается попросту неверным, а сам он этого не замечает. Если ему на его ошибки не указывать то ничего хорошего из этого метода обучения не выйдет.
                                                      • 0
                                                        Это неправильный вопрос. Примерно столько же, сколько и на обычное обучение математике, как ни странно. Правильный вопрос: сколько на это уйдёт преподавателей

                                                        Это одно и то же. Под временем понимается не только астрономическое время от начала курса до его конца, но еще и время, потраченное учеником и преподавателем. Собственно, так эффективность обучения и считается (в качестве одной из метрик).

                                                        У нас в классе на ~20 человек их было 5-6 (студенты, понятно, но не в этом дело). К сожалению подобные вещи даже очень богатые школы могут вытворять только с «профильными» предметами.

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

                                                          Просто у нас математики было вдвое больше, чем в обычной школе, так что кажется что ученики тратили времени на неё как бы вдвое больше, чем в обычной школе, но в реальности — нет, конечно: мы успели пройти и теорию множеств (строили числа начиная с «пустого множества», «множества содержащего только пустое множество» и так далее — вплоть до комплексных чисел и кватернионов), и некоторую часть линейной алгебры и часть матана («по настоящему»: через эпсилон-дельта) и теорвер… в общем материала было тоже примерно так вдвое (если не втрое) больше, чем в обычной школе…

                                                          Так что с точки зрения затрат времени учеников этот метод не хуже обычного (но даёт, конечно, гораздо более глубокие знания: доказательство, которое ты один раз прочитал ты с лёгкостью неимоверной можешь и забыть — иногда буквально через неделю, а вот если ты его сам придумал — то и через 20 лет вспомнишь), а вот с точки зрения расхода времени учителей — это да… Всех таким способом математике обучать не получится… всё-таки за классы, о которых вы говорите, родители обычно платят дополнительно и не то, чтоб так уж очень мало…
                                                          • 0
                                                            У меня создается ощущение, что, все-таки, этот метод применим не к каждому ученику, а только к обладающим определенными способностями (это же, как уже неоднократно было сказано, не обычная школа). Что, вкупе с добротным расходом преподавательских ресурсов, вряд ли позволяет говорить о том, что аналогичная методика массового преподавания software engineering — правильная.
                                                            • 0
                                                              Почему нет? Если бы software engineer'ов нужно было бы столько же, сколько сантехников — то ваши доводы, может быть, и имели бы смысл. Но их ведь реально столько не нужно… имеется в виду людей, способных создавать реально сложные системы.

                                                              А для «кропателей формочек на PHP» этого действительно не нужно, тут вы правы. Это — вообще ремесло, которому за несколько месяцев на курсах можно обучить…
                                                              • 0
                                                                Не люблю я это пренебрежительное разделение на software engineer и кропателей формочек. В моей системе ценностей software engineering — вообще ремесло (в значении craftsmanship), вне зависимости от того, делаете вы микроформы или гигантские системы. Но образование (или опыт) для этого действительно нужны разные.
                                                                • 0
                                                                  Не только образование. К сожалению это разделение — не моя прихоть, а объективная реальность. Как обычно эту банальность хорошо описывает Джоэл:
                                                                  Многие программисты на Си просто не знают, как заставить работать указатели. Я, как правило, не отказываюсь от кандидата из-за отсутствия у него какого-то навыка. Однако я обнаружил, что понимание указателей в Си — это не навык, а способность. В начале первого курса на факультете кибернетики набирается человек 200 вундеркиндов, писавших в четырехлетнем возрасте игрушки для Atari 800 на BASIC'е. Они хорошо проводят время, изучая Паскаль, но в один прекрасный день профессор заводит речь об указателях, и они внезапно перестают понимать. То есть абсолютно. 90% потока переходит на отделение политологии, обьясняя это тем, что на кибернетике мало симпатичных студенток. На самом же деле, по неизвестной причине часть человечества просто рождается без того отдела мозга, который понимает указатели. Указатели — это не навык, а способность, требующая особого мышления, и некоторые люди им просто не обладают.
                                                                  Есть довольно много вещей, которые бо́льшая часть часть населения этой планеты не в состоянии освоить (либо им для этого требуются какие-то просто сверхчеловеческие усилия): указатели, рекурсия, функциональный анализ, да и вообще работу с функциональными языками… это люди никогда не смогут строить большие системы. Формочки они при это могут клепать влёгкую.

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

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

                                                                  P.S. Это ни в коем случае не ознаает что эти люди в чём-то неполноценны. Ну не считаем же мы неполноценнми людей без абсолютного слуха? Просто кому-то не повезло со слухом, кому-то — с распознованием цветов, а кто-то вот остался без понимания рекурсии. Просто последнее труднее заметить и протестировать…
                                                                  • 0
                                                                    Кстати, как раз на эту тему пару дней назад встретил интересную запись, делюсь:
                                                                    avva.livejournal.com/1716373.html
                                                                    • 0
                                                                      Ну это очень старая запись и она примерно о том же.

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

                                                                      Если начать с обучения алгоритмам на функциональных языках (как рекомендует Дейкстра), то первая группа быстро отсеется (и найдёт себе другую специализацию), из второй получатся хорошие программисты, а вот третья — отсеется «зазря».

                                                                      Если делать так, как рекомендует lair, то для третьей группы всё будет хорошо, но мы будем мучить «почём зря» людей из первой. Если у нас острая нехватка программистов и куча преподавателей — тогда этот вариант ничем неплох. Но, вообще, это редкость — обычно если у вас нехватка програмистов, то у вас и преподавателей мало, а вот как раз желающих обучаться — достаточно.
                                                                      • 0
                                                                        Если делать так, как рекомендует lair, то для третьей группы всё будет хорошо, но мы будем мучить «почём зря» людей из первой.

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

                                                                        Заодно, кстати, отсеем — правда, не в пользу экономического факультета, а в пользу CS — тех, кому нифига не даются указатели, зато всем мило лямбда-исчисление.

                                                                        (Поясню, почему «абстрактные», а не «функциональные» языки: есть алгоритмы, которые в правильном своем виде не ложатся на функциональные языки. Их придется либо выносить из курса на позже — что нелео — либо писать нефункциональным образом.)
                                            • +1
                                              Вы не ошибаетесь. Вы ломитесь в открытую дверь. Вот было сказано:
                                              Нужна тебе сортировка — возьми существующую.
                                              Хороший совет. Есть только пара вопросов:
                                              1. Какую из дюжин известных сотировок предлагается взять?
                                              2. Почему разработчики, скажем, V8, потратили кучу времени на то, чтобы ответить на ворос #1? Они что — идиоты?

                                              Хотя на самом деле, по традиции, вы правы оба, как я уже объяснял.

                                              Только lair описывает как за пару лет выпустить ремесленника, кодера — то, что в других специальностях получается через пару лет обучения в ПТУ. Клепать простые сайтики, подкручивать скрипты в бухгалтерии и прочее и прочее, прочее — вот их удел.

                                              А Keyten — объясняет как выращивать инженеров, которых не страшно и к разработке сложных и ответственных систем допускать. Этим, собственно, и занимаются ВУЗы и как бы понятно что Дейкстра ровно об этом уровне и говорит!
                                              • 0
                                                Только lair описывает как за пару лет выпустить ремесленника, кодера — то, что в других специальностях получается через пару лет обучения в ПТУ. Клепать простые сайтики, подкручивать скрипты в бухгалтерии и прочее и прочее, прочее — вот их удел.

                                                Не угадали. lair говорит, что дизайн и анализ алгоритмов достоен отдельного курса, а не «придумывайте сами в процессе обучения программированию».
                                                • 0
                                                  А что тогда, по вашему, вообще является «обучением программированию»? Дизайн и анализ алгоритмов — это же основа! И, разумеется, лучше всего построить её на логичном и простом в использовании фундаменте. Каковым и являются функциональные языки. Хотя на практике и придётся, скорее всего, сталкиваться с ограничениями, вызванными «протекающими абстракциями» — но это уже следующий этап.
                                                  • 0
                                                    А что тогда, по вашему, вообще является «обучением программированию»?

                                                    Языки программирования, дизайн, управление памятью, обработка ошибок, блаблабла. И problem solving.

                                                    Дизайн и анализ алгоритмов — это же основа! И, разумеется, лучше всего построить её на логичном и простом в использовании фундаменте. Каковым и являются функциональные языки.

                                                    К сожалению, эта «основа» достаточно сложна, чтобы освоить всю ее до того, как садиться за прикладное программирование. Поэтому, как я уже писал, эти дисциплины осмысленно запускать параллельно.
                                                    • 0
                                                      Языки программирования, дизайн, управление памятью, обработка ошибок, блаблабла.
                                                      Это всё уже потом. Языки программирования — это вообще «наносное» (к моменту выпуска они могут измениться 10 раз), управление памятью — это, опять-таки, алгоритмы определённого вида, обработка ошибок — этому вообще непонятно как учить без практических работ (в «малых» задачах их можно обрабатывать как угодно, а «большие и сложные» очень тяжело «уложить» в учебный курс).

                                                      И problem solving.
                                                      А это что вообще такое и как вы этому собрались учить людей, которые исходят из принципа нужна тебе сортировка — возьми существующую?

                                                      К сожалению, эта «основа» достаточно сложна, чтобы освоить всю ее до того, как садиться за прикладное программирование.
                                                      Да ладно вам. За пару лет человек базу явно сможет освоить.

                                                      Поэтому, как я уже писал, эти дисциплины осмысленно запускать параллельно.
                                                      А смысл в этом какой? Прикладное программирование — это мода. Как-то освоить новые модные технологии можно за полгода, а «оттачивать мастерство» потом — всё равно придётся учиться всю жизнь. Так зачем им раньше времени мозги ломать?

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

                                                      Та же самая ситуация, что и с любой другой дисциплиной в любом другом ВУЗе: вначале идут фундаментальные знания, потом — их практическое применение. Почему вдруг программная инженерия должна отличаться?
                                                      • 0
                                                        Языки программирования — это вообще «наносное» (к моменту выпуска они могут измениться 10 раз),

                                                        Странно, я вот пишу на языке, который фундаментально за прошедшие 12 лет не изменился.

                                                        управление памятью — это, опять-таки, алгоритмы определённого вида

                                                        Не совсем. Это подходы и привычки.

                                                        обработка ошибок — этому вообще непонятно как учить без практических работ

                                                        Ну вот на практических и надо.

                                                        А это что вообще такое и как вы этому собрались учить людей, которые исходят из принципа нужна тебе сортировка — возьми существующую?

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

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

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

                                                        Прикладное программирование — это мода.

                                                        Неа. Это то, чем выпускник SE будет зарабатывать на жизни в том или ином виде.

                                                        Как-то освоить новые модные технологии можно за полгода

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

                                                        Та же самая ситуация, что и с любой другой дисциплиной в любом другом ВУЗе: вначале идут фундаментальные знания, потом — их практическое применение.

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

                                                        А смысл в этом какой?

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

                                                        А вообще, забавно. Keyten предлагает сначала обучать программированию, потом теории алгоритмов. Вы — сначала теории алгоритмов, затем программированию. А я — одновременно. Кроме варианта «не обучать» перебрали все.

                                                        PS Кстати, далеко не все алгоритмы, включая фундаментальные, хорошо ложатся на функциональные языки.
                        • +14
                          Я что-то забылся и забыл подбирать осторожные слова, что-бы людей не обижать, но всё же, давайте поговорим по поводу концепции изучения чего-либо, начиная с теоритических основ — имо, абсолютно глупый концепт.
                          Всему своё время и место. Для вещей, которые в иерархической системе дерева знаний находятся очень низко (или глубоко, как предпочитаете), хронологическая последовательность изучения всего дерева не обязательно должна начинаться именно с них!
                          Давайте же физику детям преподавать сразу начиная с квантовой механики. Или алгебру, с теории полей.
                          Тут (начинать программирование с теории алгоритмов) абсолютно такая же ситуация.
                          Если я не прав, с удовольствием выслушаю конструктивное мнение и приму на заметку.
                        • +46
                          Ну не знаю. Обучать программированию нужно уже со школы, лет с 10-ти — 12-ти. А в этом возрасте курс по алгоритмам, напротив, может только отвратить от программирования. А вот написать простую, но настоящую работающую программу (лучше — игровую) может быть очень интересно. А алгоритмы уже изучать попозже, когда придет понимание в их необходимости.
                          • –8
                            Так зачем насильно пропагандировать программирование? Качество обучения важнее. А кто хочет (на самом деле) этим заниматься, тот будет, и никаких проблем не возникнет.
                            • +10
                              Само по себе, учеба в школе — это насилие. К сожалению в школьном возрасте еще не до конца осознает, чего он на самом деле хочет (а хочет он играть и не делать уроки) и что ему в последствии пригодится. Поэтому приходится по немножку учить всему. Крайне опасно выкидывать из школьного курса, скажем, ту же астрономиию на том основании, что дескать, мало кому она потом пригождается в жизни. Этим самым мы потенциально теряем какого-нибудь великого ученого, которому просто в свое время просто не расскзали, что существует такая наука и чем она занимается.
                              • –4
                                Ваша логика не работает. Если вы хотите что-то добавить, то вы должны что-то выкинуть из программы. А выкидывать нельзя. Значит и добавить нельзя. Конечно, можно напичкать кучу всего в программу, так, чтобы ученик уходил утром и приходил вечером, но это уж точно будет насилие, вряд ли вы это подразумевали.
                                • +1
                                  Не нужно вкладывать в мои слова догматизм — я не пропоповедник. Конечно же можно и нужно выкидывать уже не актуальные и устаревшие вещи: черчение, логарифмическую линейку, чистописание, и т.д. Но начальные представления по актуальным и перспективным областям человеческой деятельности ученик получить должен. Простите, но математика — это очень важная наука для современной цивилизации. Чтобы двигать ее вперед и придумывать что-то новое не достаточно просто после школы выбрать себе специализацию, нужно любить ее с детства. Для этого ребенка нужно познакомить с математикой. Конечно, можно отобрать детей, предрасположенных к математике и учить только их, но если вы расскажете как это сделать то сразу же получите новелевку по психологии.
                                  • –1
                                    Возможно будет и лучше, но нужно быть осторожнее в рассуждениях что и для кого лучше. Я вот никакого отношения к школьному образованию не имею и не берусь утверждать что выкидывать а что нет. Иначе вы рискуете стать как Роскомнадзор — он ведь тоже хочет как лучше, запрещает вам всякие гитхабы и стимы, лишь бы вы ненароком марихуаны не попробовали, но почему-то всем он мешает жить и все его ненавидят за это. Вот и вы можете стать как Роскомнадзор для школьников, т.к. это проблема сложная, и тут нужно очень хорошо разобраться перед тем как что-то менять.
                              • +1
                                Вы не правы. В современном мире основы программирования, возможно, даже важнее, чем изучение физики и многих других классических школьных дисциплин. Качественное обучение школьника немыслимо без хотя бы очень приблизительного понимания им, как написаны те компьютерные программы, которые он каждый день использует. Причины, по которым точки зрения, подобные вашей, всё еще имеют место, в молодости программирования и, пока что, в отсутствии настоящего понимания у кого-либо, как именно его нужно преподавать.
                                • +2
                                  Я уже написал по этому поводу — http://habrahabr.ru/company/hexlet/blog/248921/#comment_8246799. Вы наверняка айтишник и смотрите на это однобоко, конечно же программирование у вас важнее всего на свете.
                                  AFAIK, программирование и так есть. У меня оно было, по крайней мере, причем отдельным предметом от «информатики». Я точно не помню, но, кажется, начиналось это в 7 классе и там был Pascal. Просто люди предлагают чуть ли не в начальной школе это давать. И уж точно это не важнее, чем база вроде математики. Тут не важно, в каменном веке мы живем или в цифровом — база есть база.
                                  • 0
                                    Не исключаю, что если бы в начальной школе у меня не было логомиров, я не был бы программистом сейчас. В то время я учился в обычной школе. Считаю, что мне очень повезло. С удивлением узнаю от ребят, кто сейчас учится в школе или недавно закончил, что почти у всех было только заучивание учебника и то в старшей школе. Понимание компьютера в современном мире не менее важно, чем умение читать и считать.
                              • +5
                                Одно неотделимо от другого, ибо любая программа есть воплощение некоего алгоритма. Не надо «курса по алгоритмам», можно просто ненавязчиво объяснять, что сначала надо понять, что и в каком порядке должна программа делать, а потом уже писать.
                                • 0
                                  Само собой, понятие алгоритма, как последовательность простых действий необходимых для достижения результата нужно объяснить сразу. Без этого никакого программирования не получится. Эта всегда так делалось: например мы составляли алгоритм для учителя, чтобы он взял со стола книгу. А вот с изучением конкретных алгоритмов вроде сортировки или быстрого поиска — можно какое-то время погодить.
                                • +8
                                  Например, простая робототехника — что-то типа LEGO MINDSTORMS EV3.
                                  • +3
                                    Лично мой путь начинался с противоположного — с олимпиадного программирования, с изучения и освоения алгоритмов. Но иногда вспоминаю, как я создал именно работающее приложение — и это было классным чувстов. Может быть именно создание первого приложения, легкие деньги и ложные мысли о том, что ты умеешь программировать, новичка улекут именно по этой стезе?

                                    PS может быть нужно создать еще один опрос — с чего начинали вы путь программиста?
                                    • +2
                                      А когда Ваш путь начался? Просто как-то слабо себе представляю, как он сразу начался с олимпиадного программирования.
                              • +1
                                Это с точки зрения учителя хорошо, но ученики вряд ли на такое согласятся.
                                • +3
                                  А почему нет? Тут вроде речь про университеты идёт.

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

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

                                  Тут аналогично: какое-то понятие о программировании можно получить и без всяких алгоритмов и если вы в своей профессиональной деятельности занимаетесь чем-то другим, а программирование для вас — один из многих инструментов, то этого может и хватить, но если вы хотите именно изучать Software Engineering, то без алгоритмов там — никак. Совсем никак. Это основа курса.
                                  • 0
                                    Речь идет об «Обучение программированию следует начинать с».
                                    • 0
                                      Не важно, университеты, или нет. Речь же идет о начальном обучении программированию. Сперва нужно сломать ученику мозг, чтобы он думал не в терминах «программка, которая сделает зашибись», а переменными и циклами. Вот если человек уже может написать что-нибудь простенькое, тогда да, без алгоритмов никак.
                                      • +3
                                        Зачем ему думать переменными и циклами, если в функциональном программировании он не будет писать ни переменных, ни циклов?

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

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

                                        Вот поэтому и нужно начинать писать на функциональном языке, думать сразу алгоритмами, а не их воплощениями. Я бы очень хотел, чтобы кто-нибудь в детстве, лет в 16, меня этому научил. Возможно, я стал бы куда более хорошим программистом.
                                        • +1
                                          Потому, что функциональщину сложнее понять. И концепт «оптимальности», там, насколько я понимаю, отсутствует — как компилятор скомпилирует, так и получится. В реальной жизни оптимизировать придется.
                                          • +2
                                            Неправильно понимаете. Некоторые подходы к оптимизации отличаются, но в целом отношение к ней такое же.
                                            • +5
                                              > Потому, что функциональщину сложнее понять.

                                              так не нужно ударяться в копроморфизмы на хаскеле, а просто сразу решать задачи. Например, как комбинация sort,map и filter поможет в реальной жизни. sort вам отсортирует вне зависимости от знаний о нем. Это просто какая-то магическая машинка, которая выдает магический результат. Для алгоритма, использующего на каком-то этапе сортировку, большего и не надо.

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

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

                                              > И концепт «оптимальности», там, насколько я понимаю, отсутствует — как компилятор скомпилирует, так и получится

                                              самая крутая оптимизация — это выбор правильного алгоритма. Выбрал неверный алгоритм — уже никакая оптимизация не поможет. А функциональщина как раз сразу учит думать алгоритмами. Не отвлекаясь на малозначимые детали реализации.

                                              > В реальной жизни оптимизировать придется.

                                              Опитмизировать «под капотом»? Придется. Но изучать оптимизацию люди будут уже после того, как научились хоть какого-то результата достигать, а не после. Уже на втором-третьем курсе, например. Нет совершенно никакого толка от умения оптимизировать, если продукт не готов.

                                              www.artlebedev.ru/kovodstvo/sections/167/

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

                                              • –2
                                                Вот за подход «магическая машинка» надо расстреливать на месте.
                                                • 0
                                                  это основной подход практической бытовой функциональщины. У нас есть стандартная библиотека, которая по сути есть набор магических машинок. К этим машинкам дан удобный интерфейс для их настройки. Программа строится как использование готовых, но настроенных нами машинок. Язык и стандартная библиотека сдизайнены так, чтобы выходить из этой метафоры нужно было как можно реже. И если уж выходить, то писать новую магическую машинку. Это круто, это работает.
                                                  • 0
                                                    Это работает только если программист знает, что коробка не магическая и способен если не переписать ее, то хотя бы в общих чертах понять ее устройство.
                                                    • +3
                                                      Так это… В любом курсе по ФП реализацию, например, map для списков изучают вместе со списками
                                              • +3
                                                Функциональщина на первый вид может быть и сложна для чистых императивщиков. Это может выглядеть сложно: collection.Where(r => r.Date > DateTime.Now). Еще более сложно то, как оно на самом деле работает. Но это просто. И чертовски упрощает жизнь.

                                                Теперь, по поводу концепта оптимальности. Вы хотите выжрать весь ресурс CPU с максимальной эффективностью? Не делайте этого на Haskell. Не делайте этого на Java. Делайте это на C/C++.

                                                Я тут занимался давеча оптимизацией — переводом работы кривого императивного кода написанного с помощью Entity Framework на декларативный sql. Расскажи мне теперь про понятие оптимальности и необходимости знания архитектуры процессора, чтобы понимать с какой скоростью выполниться запрос к моему REST-сервису.

                                                Дело в том, что в промышленном программировании очень мало задач, которые жрут CPU. Они все написаны и решены за нас. Если вы конечно не в геймдев пошли, там я не знаю ситуации.

                                                Современные программы — это когда один слоупок общается с десятком других слоупоков (озу, диск, сеть). За исключением некоторых задач абсолютно по барабану, насколько эффективно работает ваш однопоточный код. Если у вас есть задачи, требующие параллелизации — их проще параллелить с помощью функциональщины. Низкий уровень абстракции (императивщина) вам позволит писать в десять раз медленнее в два раза более эффективный код — ну и кому это надо, если quicksort можно было заменить сортировкой подсчетом для этого набора данных и получить выигрыш в пять раз?

                                                Хочешь я расскажу про настоящий бич производительности? У меня система постоянно держит загрузку CPU на 5-15 процентах. И полностью не отзывчива. Я доставляю 8 гигабайт оперативы — и оп-па, уже можно работать. Я доставляю еще 8 гигабайт оперативы — и оп-па, лагов практически нет. Никому не интересно, почему понижая процент занятости ОЗУ с 50% до 25 мы резко увеличиваем отзывчивость системы и софта? Я немного размышлял на эту тему, и мой текущий вывод — все механизмы работы с памятью, начиная от аллокации являются полностью кривыми и протекают.

                                                Увы, я сейчас не могу найти ссылку на демонстрационный патчер, который улучшал работу с памятью для программ написанных на C/C++. И тут тебе не помогут никакие супер-ухищрения при написании императивного кода. Повышаешь уровень абстракций до объектов/функций, приходишь в enterprise или просто говноконтору — и все, у тебя нету никакого варианта управлять моделью памяти так как тебе нужно. И по барабану — императивщина/функциональщина. Пока ты не опустишься до уровня ручного управления памятью, ты не сможешь выжать максимум из своего компьютера. Но кому это нужно?

                                                Я тебя не убедил, что никому не нужна оптимальность? Посмотри на веб. Смотри как очаровательна эта структура, слепленная из палок, говна и пластилина. Там вообще всем по барабану на оптимальность. Если хочешь — я подробно опишу в чем проблемы.

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

                                                P.S: Если вы вдруг подумали, что я сторонник чистого функционального программирования — это не так. Я считаю чистое императивное и чистое функциональное программирование двумя отличными идеями, чтобы оказаться в жопе. Смесь парадигм принесет счастье и мир программисту.
                                                • –2
                                                  Дело в том, что в промышленном программировании очень мало задач, которые жрут CPU. Они все написаны и решены за нас.
                                                  Из за такого подхода мы имеем то, что мы имеем.
                                                  все механизмы работы с памятью, начиная от аллокации являются полностью кривыми и протекают.
                                                  Нет, просто в программах слишком много слоев абстракций, которые жрут память.
                                                  Посмотри на веб.
                                                  Смотрю и хочу поубивать всех, кто приложил к этому убожеству руку.
                                                  И очень мало кому нужно знание ассемблера.
                                                  Знание ассемблера нужно чтобы понимать как все это работает и не падать на колени в религиозном ужасе если авторы компилятора накосячили (а такое бывает).
                                                  Смесь парадигм принесет счастье и мир программисту.
                                                  Речь идет о начальном уровне. На начальном уровне хватит и одной парадигмы, и это должно быть императивное программирование.
                                                  • +3
                                                    Из за такого подхода мы имеем то, что мы имеем.

                                                    Ты читать умеешь? У меня 5-10% загрузки ЦП. Мой процессор практически не занят. Ему нету работы. Графику и видео рендерит видеокарта. Если человек играет в игры — то они жрут все (процессор, видеокарту, память). Все, на десктопе для среднестатистического юзера закончились задачи, которые требует огроменных ресурсов. Изредка запускается архиватор (давно не запускал), фотошоп какой-нибудь (опять же, давно не запускал). У меня лично время от времени отъедается значительная часть ЦПУ на компилирование проекта (но это происходит не часто). Если мы берем среднестатистического юзера, то большую часть времени его процессор простаивает. Да, процессоры в росте тактовой частоты остановились. Ну и что, если эти такты все равно не используются?

                                                    Дальше, бекенд. Бекенд это царствие слоупоков. Ваш код практически не жрет ресурсов, а если жрет — вы что-то сделали не так. Забыли про кеширование, например. Процессор просто простаивает пока гоняются запросы туда/сюда. Ну или вы имеете дело с одним из немногих участков кода, которые реально выполняют объемные задачи, которые требуют процессор. Сейчас уже легче, есть асинхронное программирование, но утилизация CPU желает лучшего. Единственное, что жрет ресурсы в бекенде — это всякие прикольные вещи типа sql server, rabbitmq, memcached, elasticsearch. А еще например, задачи конвертации аудио/видео — они работают через ffmpeg. Скажи, вот ты готов что-нибудь из этого полностью реализовать? За две недели. И чтобы все работало быстро, без багов. Если нет, то давай ты откинешь свой аргумент.

                                                    Нет, просто в программах слишком много слоев абстракций, которые жрут память.
                                                    Я не знаю как написать то, что я написал раньше, поэтому повторюсь: ты читать умеешь? Почему при одинаковой утилизации ЦПУ (небольшой — 5-10%) и разной утилизации ОЗУ (75%, 50%, 25%) на глазах видно как отзывчивость системы и приложений меняется? Дело не в том, что им не хватает памяти, или они жрут память. Дело в том, что никто этой вашей памятью распоряжаться эффективно не умеет. И императивное программирование от этого не спасет.

                                                    Смотрю и хочу поубивать всех, кто приложил к этому убожеству руку.

                                                    + + +

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

                                                    Так, я понимаю, ты больше C/C++? Ну и как это тебе помогло? Вот я нашел багу в спецификации языка. Знаешь что я сделал? С полным пониманием ситуации утерся и написал костыль.

                                                    слишком много слоев абстракций

                                                    Допустим много. Я сам так считаю, что многовато. Знаешь в чем проблема? Я вот тебе её в виде вопроса сформулирую. Есть задача — написать приложение, которое, к примеру (на той же Java) будет писаться год командой из десяти девелоперов. Сколько она будет писаться без лишних абстракций на том же ассемблере/си?
                                                    • 0
                                                      Сколько она будет писаться без лишних абстракций на том же ассемблере/си?
                                                      Полтора года командой из трех девелоперов. Ибо абстракции — это прямое следствие мифического человека-месяца.
                                                      • 0
                                                        … или одним человеком за 4 месяца на Хаскеле :)
                                                        • 0
                                                          Я же не говорю, что ФП — это плохо. Просто с него не надо начинать.
                                                • +5
                                                  Стоп. Сначала «ломаем мозги» переменными и циклами, а потом «функциональщину сложнее понять». Если человек хотел просто удвоить каждый элемент в списке, может быть дать ему написать list |> map x => x *2, а не засирать мозги ненужной для задачи ерундой?)
                                                  • 0
                                                    Человек не знает что такое список. Он хочет не удвоить каждый элемент, а, скажем, посчитать количество рогов в каждом колхозе при известном количестве копыт. И ему сперва нужно объяснить, что копыта нужно записывать в список или массив, а не заводить отдельную переменную для каждого колхоза. А уже потом он сам решит, нужна ли в том конкретном приложении функциональщина.
                                                    • +3
                                                      Только надо в таком случае ему сразу показать, что можно или циклом пахать по этому списку или массиву, или map'ом функцию применить, а не культивировать миф «функциональщина — сложно».

                                                      И да, я всегда ставлю вопрос по-другому: «нужна ли в конкретном приложении императивщина»
                                                      • 0
                                                        Только он не знает, что такое функция. И вообще ничего не знает. В лучшем случае — по аналогии с математикой.
                                                        • +2
                                                          Тот, кто учился хотя-бы в 7-м классе не может не знать, что такое функция)
                                                          • НЛО прилетело и опубликовало эту надпись здесь
                                                            • +5
                                                              В функциональном программировании функция представляет собой ровно то же самое)
                                                              • НЛО прилетело и опубликовало эту надпись здесь
                                                                • +5
                                                                  Я это прекрасно осознаю. В чистых функциональных языках (Haskell) функции зависят только от аргументов, если передав в f(x) 2 в качестве x я получу 20, то эта функция всегда вернёт 20 и только 20. Более того, некоторые императивные языки (например, D) могут дать аналогичные гарантии (модификатор pure)
                                                                • 0
                                                                  В функиональной парадигме, если добавить значение «зависло», то это всегда так.
                                                              • 0
                                                                Функциональная парадигма отчетливо дает понять, что даже основные структуры данных, вроде массива, списка и словаря — не что иное, как функции в их чисто математическом понимании.
                                                              • 0
                                                                С одним параметром. А о декартовом умножении и тьюплах догадываются далеко не все первокурсники.
                                                                • +1
                                                                  f(x,y) = x + y
                                                                  Школа закончилась, это универ, детка

                                                                  Если серьёзно, то достаточно показать вышенаписаную функцию и становится всё понятно даже без объяснения
                                                                  • 0
                                                                    достаточно показать вышенаписаную функцию и становится всё понятно даже без объяснения
                                                                    Как называется когнитивное искажение при котором специалист считает неочевидные вещи очевидными? Это на самом деле совсем не очевидно.
                                                                    • +3
                                                                      А как называется искажение, при котором человек не может рассуждать по аналогии?)

                                                                      Ну хорошо, можно показать
                                                                      f(x) = x + 2
                                                                      f(x, y) = x + y

                                                                      можно даже пояснить, что первое — функция с одним аргументом, прибаляющая к аргументу 2, второе — функция с двумя аргументами, складывающая их. Это ни весть какое усложнение по сравнению с переменными :-)

                                                                      P.S. можно долго разводить софистический спор о том, что очевидно, а что — нет.
                                                                      Грудь — единственный интуитивный интерфейс, всему остальному приходится учиться.
                                                                      • –3
                                                                        А как называется искажение, при котором человек не может рассуждать по аналогии?
                                                                        Судя по моему не очень большому жизненному опыту, оно называется нормой. Но проблема не в этом а в том, что в ФП даже для простейшего действия, как например удвоение элементов в списке, нужно вводить функции, функции высшего порядка и т. п. В императивном программировании вводится только одна новая сущность: цикл.
                                                                        • +2
                                                                          В императивном программировании вводится только одна новая сущность: цикл.

                                                                          Неправда. Циклы, переменные, ветвления — этого всего не было.

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

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


                                                                          Неспособность мыслить логически — норма? Ок.

                                                                          И да: если функция от одного аргумента известна со школы, то нужно вводить лишь функции высших порядков.
                                                                          • 0
                                                                            Неправда. Циклы, переменные, ветвления — этого всего не было.
                                                                            Я говорю о данной конкретной задаче. Переменных не было? Списков тоже не было.
                                                                            Неспособность мыслить логически — норма? Ок.
                                                                            Таки да. С рождения мыслить логически никто не способен.
                                                                            • +1
                                                                              С рождения мыслить логически никто не способен.

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

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

                                                            «тут критик воскликнет», а что если у нас нет готового count в апи коллекций? Ну что ж, тут мы тоже можем выехать без всех этих массивов и циклов (это подсчет для кложуровского сиквенса):

                                                            #(reduce 
                                                                (fn [c _] (inc c))
                                                                 0 %)
                                                            


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

                                                            в данном примере не пострадало ни одного человека, заставленного изучать механику работы с памятью, необходимую для массивов, итп
                                            • НЛО прилетело и опубликовало эту надпись здесь
                                              • +1
                                                Ну вот в Стэнфорде показывают алгоритм в псевдокоде, со словами «реализовать на вашем любимом ЯП можете сами». При этом практикум выглядит как «вот вам входные данные, дайте нам результат».
                                              • 0
                                                А чем вам псевдокод не угодил?
                                                • НЛО прилетело и опубликовало эту надпись здесь
                                                  • 0
                                                    Да погодите. Никто и не говорит, что вам надо учиться программированию на бумажке — делайте это с использованием ПК, не надо себя насиловать. Просто изложение фундаментальных алгоритмов с применением — это, как мне кажется, общепринятая практика. Псевдокод позволяет, в первую очередь, сосредоточиться на том, как работает алгоритм. Безусловно, описывать CRM-систему или что-нибудь такое же монстроподобное на нём не надо :)
                                                    • НЛО прилетело и опубликовало эту надпись здесь
                                                      • 0
                                                        Согласен. Теория, не подкрепленная практикой, имеет свойтво исчезать из чертогов знаний :)
                                                    • +1
                                                      Нет, сейчас в МГУ это С. От Pascal отказались.
                                                      • 0
                                                        Все обстоит немного иначе. Одним из мощнейших инструментов для борьбы с чудовищной алгоритмической сложностью является псевдокод. Объем тасков, которые вы можете написать (оставаясь при этом в здравом уме) без псевдокода очень ограничен. За примерами — к Кнуту (который написал TeX на смеси Pascal с псевдокодом).
                                                    • +1
                                                      Сходите откройте фундаментальный труд Искусство Программирования Дональда Кнута. ВНЕЗАПНО там псевдокод для несуществующей машины.
                                                      • НЛО прилетело и опубликовало эту надпись здесь
                                                      • +1
                                                        Раз для машины, даже несуществующей, уже не псевдо. Псевдокодом называют код с не четко прописанной семантикой.
                                                      • –2
                                                        А низкоуровневые императивные алгоритмы можно сразу и не показывать вообще. Вот есть в стандартной библиотеке алгоритм sort. Ну и черт с ним, какая разница как он работает, главное что сортирует! Предположим, что sort и прочее у нас уже есть, и начнем решать настоящие задачи. В качестве языка можно взять как раз какой-нибудь лисп, чтобы не нужно было изучать синтаксис. И только потом, когда человек начинает понимать, что и зачем он делает, тогда углубляться в «что там под капотом».
                                                    • +21
                                                      А потом эти одухотворённые Хаскелем студенты придут в реальную промышленность и их придётся обучать заново?
                                                      • 0
                                                        Ну по крайней мере они будут знать что-то из математики.
                                                        Лично я не могу считать программистом человека, который не может написать бинарный поиск (а таких я, к сожалению, встречал не мало)
                                                        • +38
                                                          А я не могу считать программистом человека, который не понимает указатели.
                                                          • 0
                                                            О, да! Именно математический пуризм Pascal в определении указателей мне сильно мешал в свое время переходу на C.
                                                            • 0
                                                              В чем там математический пуризм-то? :) Я, правда, в Turbo Pascal особо не программировал, сразу на Дельфи сел, но не помню ничего особенно «математического» в них.
                                                              • 0
                                                                А Turbo Pascal это не Pascal, там уже адресная арифметика, нетипизированные ссылки и т.п. Меня учили по чистому творению Никлауса Вирта, не испорченному грязными руками Филиппа Кана и прочей Borland :)
                                                                • 0
                                                                  По-моему, того Паскаля уже «нет» :) Во всяком случае, FreePascal, имеет вполне себе нормальные указатели. Не знаю, какой из вариантов Паскаля кроме Дельфи и FreePascal сейчас стоит использовать для обучения…
                                                        • +5
                                                          А никто не говорит что 5 лет нужно учить Хаскель. Речь идет про первый язык, введение.
                                                          • 0
                                                            Судя по письму Дейкстра, он как раз предполагает, что первый язык уже был императивный.
                                                          • +8
                                                            А что в самом Хаскеле или его парадигмах его мешает «реальной промышленности»?
                                                            • +16
                                                              Ничего, кроме инертности индустрии и армии Java-программистов, которые хотят есть.
                                                              • +14
                                                                Мне кажется что хаскель программиста легко будет научить писать на джаве, а вот наоборот сложновато
                                                                • +8
                                                                  Всё так.
                                                                  • +5
                                                                    Его не нужно будет учить, он сам ее изучит за недели две.
                                                                    • 0
                                                                      Джава сама захочет изучить хаскель-программиста :)
                                                                    • +2
                                                                      Интересная мысль. Можно аргументировать? Переход от одной парадигмы к другой, мне казалось, сложен в обоих направлениях.
                                                                      • +4
                                                                        Боюсь, тут гораздо больше проблем будет в стиле:
                                                                        • я писал 100 строчек на haskell, почему мне приходится писать 1000 строчек на Java, чтобы реализовать эту же ерунду?
                                                                        • и это вы называете системой типов?
                                                                        • ладно, а где автовывод типов?
                                                                        • и это вы называете паттернами?
                                                                        • ребята, вы вообще имеете представление о хорошем коде?


                                                                        Я изначально учился императивному программированию, функциональное освоил после и не в полной мере. Сравнивая свой профессиональный опыт C# и «около-универское-около-хобби» Java я могу однозначно сказать, что для меня во многих случаях вернуться к императивному подходу (там где нету функций высших порядков, там где нету гарантии неизменяемости, там где нету гарантии отсутствия явновыраженных side effects) — это мучительно больно, но все же не составляет затруднений. Ну т.е. я могу с легкостью фигачить на Java говнокод, тогда как тот же код на C# получился бы у меня конфеткой. Как в условиях тотальной ментальной ограниченности языка писать хороший поддерживаемый код — этого я не представляю.

                                                                        Главная трудность программирования — это писать хороший читабельный изменяемый код. Боюсь, программист на Haskell не сможет так легко с наскоку освоить этот навык для Java языка. А к тому моменту когда он сможет освоить этот навык, программист застрелится.
                                                                      • +16
                                                                        Хаскель программист не захочет программировать на Java :)
                                                                    • 0
                                                                      То, что на производстве он редко где используется?
                                                                      • НЛО прилетело и опубликовало эту надпись здесь
                                                                    • +12
                                                                      Зачем, поищут место где будут писать на Scala, Clojure ну или Python или JS на худой конец.
                                                                      Должен признаться, я не особо понимаю, в чем хороша армия разработчиков в «реальной промышленности», которые обожают void методы, боятся слова «монад» и не исходят из того, что immutability должна быть поведением по умолчанию. Разве что поддерживать legacy?
                                                                      • +3
                                                                        Человек, который умеет в Хаскель, скорей всего научится в ваш язык программирования за две недели. Более того, он может быть даже напишет компилятор вашего языка программирования за две недели на хаскеле xD
                                                                        • +1
                                                                          Потом они наконец приведут промышленность в нормальное состояние, когда глюки программ станут редкостью.
                                                                          Функциональный стиль делает и программирование на императивных языках чище.
                                                                        • +9
                                                                          И студенты довольно быстро замечают элегантность функционального подхода

                                                                          Вот что-то не верится…
                                                                          • +5
                                                                            Не верится если представить студента, который начал знакомство с программированием с public static void, а потом ему показывают чистую функцию без побочных эффектов на Лиспе, и он, конечно, никакую элегантность не понимает.
                                                                            • +11
                                                                              Я могу поверить в студентов MIT или заведений сходного уровня подготовки и отбора — но тем не менее — чистый функциональный подход — достаточно тяжелая для головы концепция и даже состоявшиеся и опытные программисты от «пишу код на хаскеле» до «понимаю функциональный подход, его плюсы/минусы/ограничения» тратят не один год. Императивное объектно-ориентированное программирование дальше от математической чистоты, но ближе к «осязаемому» миру — поэтому для восприятия проще. Современные языки позволяют «эмулировать» функциональные подходы в разработке — и как мне кажется — проще на них выйти уже убедившись, что студент смог понять и принять более простые подходы.
                                                                              • +7
                                                                                не могу не вспомнить старую шутку — программист на Фортране на любом языке может писать на Фортране. Хаскель, хоть и усложняет это дело — но не меняет в корне.

                                                                                Из личного опыта — от момента, когда я проникся и восхитился элегантностью TDD, в частности BDD, до момента, когда я смог его эффективно использовать на реальных задачах, сложнее «протестируйте калькулятор» — прошло около полутора лет — и то, потому, что я искренне верил в то, что это нужно и важно.
                                                                                • 0
                                                                                  Коллега, я вам завидую. Кроме шуток. А Вы не могли бы поделиться опытом использования TDD/BDD на реальных задачах? Если, конечно, имеете такое желание и возможность.

                                                                                  Имхо...
                                                                                  Тоже придерживаюсь мнения, что разработка через тестирование абсолютно нужное и важное направление. Правда, в большинстве литературы на этот счет приводятся примеры, не сложнее, как вы сказали «калькулятора». Внимательная медитация над «опусами» Кента Бека и М. Гартнера заставило плевался и вообще послать идею TDD куда подальше. Но все-же есть какое-то внутреннее понимание того сама концепция имеет право на жизнь. Вот только как ее применять на реальных проектах?


                                                                                  • 0
                                                                                    В BitcoinJS тесты вместо документации. Эта библиотека используется в таких крупных проектах, как Blockchain.info. Мне кажется, что ответ на ваш вопрос включает почти все библиотеки и многие приложения. Можно даже писать тесты к сайтам: писать запросы и ставить проверки на ответы. Кроме того, TDD даёт однозначный ответ на вопрос «когда делать коммит» (когда дописали до момента, что все тесты проходят и ими покрыт весь код).
                                                                                    • 0
                                                                                      Ответ хороший, но есть нюанс — если ты не TDD раньше — то ты не напишешь сразу код так, что он будет тестируемый.
                                                                                      Ну и 100 процентное покрытие — это избыточная (иногда значительно) сложность — особенное если имеешь дело не со stateless приложениями. Да и просто возникают тысячи вопросов на тему «о, это так здорово — но как протестировать, когда у нас вон тот объект дергает вон этот синглтон, в котором изменяется состояния вон тем классом и вообще?» На которые «просто писать код иначе» — не самый подходящий ответ))