О преподавании Computer Science
Jul. 13th, 2010 06:11 pmЯ несколько раз сетовал о проблемах в преподавании математики (см. Плач математика или And then he became Enlightened). На днях
fregimus обратил мое внимание на статью о преподавании Computer Science (http://www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html), которая вызвала у меня ответную реакцию.
Суть статьи в том, что в университетах традиционные способы преподавания программирования, основанные на классических учебных языках, заменяются на преподавание на простых распространенных языках, например, Java. С одной стороны, составителей университетских программ можно понять, Java язык достаточно простой, но функционально оснащенный, да и еще пригодится, наверняка, в будущей работе. Но с другой, на Java нельзя или неудобно объяснить и научить таким базовым вещам, как работа с указателями, рекурсии и т.д. А без понимания основ, образование неполно. Автор утверждает, что хороший программист, знающий, скажем, C/C++ и LISP, куда более ценен, и сможет за пару дней освоить Java, чем "программист", которого научили Java и все. И я его понимаю.
На мой взгляд, Java (С#, PHP) -- это лишь распространенный инструмент. Этакий современный Фортран, для которого написано большое количество библиотек. И как инструмент -- вполне оправдывает себя. Однако, инструмент от знания предмета отличается очень существенно. Любой инструмент, он, во-первых, не совершенен, во-вторых, ограничен. Но беда в том, что многие программисты, находясь внутри инструмента, не понимают этих отличий. Молотком можно отлично забивать гвозди, но нельзя закрутить шуруп. Забить, можно, но это вряд ли оптимальный способ.
Фундаментальное образование, будь-то Computer Science или другая наука, дает именно знание, на основании которого можно выбрать тот или иной инструмент. LISP или Schema учат думать рекурсиями и функциями, и писать компактные программы минимумом выразительных средств. Функции высоких порядков -- это мощнейший инструмент, который отсутствует или неудобен в не-функциональных языках. С/C++, а лучше даже рафинированный Pascal, -- прекрасный инструмент для работы с классическими структурами данных: списками, деревьями и т.п. И не важно, что эти структуры и операции над ними входят в современные библиотеки. Всегда может найтись задача, когда придется придумать что-то свое, и надо знать, как это делается. Forth -- уникальный язык для глубокого понимания, что такое стек, без необходимости опускаться до ассемблера. Smalltalk -- идеальный язык для того, чтобы почувствовать ООП (чуть хуже -- С++). На классическом С, удобно изучать механизмы IPC, благо на нем они в Юниксе изначально реализованы. И т.д. Чем больше кругозор, тем лучше программист сможет решить ту или иную задачу. Важен не сам язык, а умение применить правильный инструмент и правильную методологию для конкретной задачи. И понимать, почему она правильная, и как это работает.
Вообще, отсутствие функционального программирования в программе Computer Science сродни отсутствию логики или геометрии в школьной программе. Именно функциональная парадигма учит думать строго, концентрироваться на сути, а не коде.
Другая беда, которую я часто наблюдаю в последнее время, -- это непонимание элементарных вещей, влияющих на быстродействие программ. Быстрый рост вычислительной мощности компьютеров в последние 20 лет привел к тому, что программисты просто разучились писать быстрые и короткие программы. Нередки проекты, в которых делают "все правильно", используют всякие разные универсальные паттерны и замечательные библиотеки, но при запуске оказывается, что программа еле-еле работает на реальной нагрузке. Стеки библиотек и языков высокого уровня прячут от программиста то, что на самом деле происходит в недрах процессора, операционной системы или СУБД, и провоцируют неоптимальный код. Не понимая основ, программисты часто просто не задаются вопросом, а почему это медленно, и как сделать быстрее и лучше. Это выходит за рамки применимости их инструмента.
Радует то, что в последнее время как раз вырос интерес и к функциональным языкам (Haskell, Scala), и к высокопроизводительным масштабируемым системам (многие проекты в NoSQL движении, язык Erlang). Индустрия переживает некоторый ренессанс. Надеюсь, образовательная система заметит этот тренд и вернется к основам. Как говорили наши бабушки -- поживем-увидим.
Суть статьи в том, что в университетах традиционные способы преподавания программирования, основанные на классических учебных языках, заменяются на преподавание на простых распространенных языках, например, Java. С одной стороны, составителей университетских программ можно понять, Java язык достаточно простой, но функционально оснащенный, да и еще пригодится, наверняка, в будущей работе. Но с другой, на Java нельзя или неудобно объяснить и научить таким базовым вещам, как работа с указателями, рекурсии и т.д. А без понимания основ, образование неполно. Автор утверждает, что хороший программист, знающий, скажем, C/C++ и LISP, куда более ценен, и сможет за пару дней освоить Java, чем "программист", которого научили Java и все. И я его понимаю.
На мой взгляд, Java (С#, PHP) -- это лишь распространенный инструмент. Этакий современный Фортран, для которого написано большое количество библиотек. И как инструмент -- вполне оправдывает себя. Однако, инструмент от знания предмета отличается очень существенно. Любой инструмент, он, во-первых, не совершенен, во-вторых, ограничен. Но беда в том, что многие программисты, находясь внутри инструмента, не понимают этих отличий. Молотком можно отлично забивать гвозди, но нельзя закрутить шуруп. Забить, можно, но это вряд ли оптимальный способ.
Фундаментальное образование, будь-то Computer Science или другая наука, дает именно знание, на основании которого можно выбрать тот или иной инструмент. LISP или Schema учат думать рекурсиями и функциями, и писать компактные программы минимумом выразительных средств. Функции высоких порядков -- это мощнейший инструмент, который отсутствует или неудобен в не-функциональных языках. С/C++, а лучше даже рафинированный Pascal, -- прекрасный инструмент для работы с классическими структурами данных: списками, деревьями и т.п. И не важно, что эти структуры и операции над ними входят в современные библиотеки. Всегда может найтись задача, когда придется придумать что-то свое, и надо знать, как это делается. Forth -- уникальный язык для глубокого понимания, что такое стек, без необходимости опускаться до ассемблера. Smalltalk -- идеальный язык для того, чтобы почувствовать ООП (чуть хуже -- С++). На классическом С, удобно изучать механизмы IPC, благо на нем они в Юниксе изначально реализованы. И т.д. Чем больше кругозор, тем лучше программист сможет решить ту или иную задачу. Важен не сам язык, а умение применить правильный инструмент и правильную методологию для конкретной задачи. И понимать, почему она правильная, и как это работает.
Вообще, отсутствие функционального программирования в программе Computer Science сродни отсутствию логики или геометрии в школьной программе. Именно функциональная парадигма учит думать строго, концентрироваться на сути, а не коде.
Другая беда, которую я часто наблюдаю в последнее время, -- это непонимание элементарных вещей, влияющих на быстродействие программ. Быстрый рост вычислительной мощности компьютеров в последние 20 лет привел к тому, что программисты просто разучились писать быстрые и короткие программы. Нередки проекты, в которых делают "все правильно", используют всякие разные универсальные паттерны и замечательные библиотеки, но при запуске оказывается, что программа еле-еле работает на реальной нагрузке. Стеки библиотек и языков высокого уровня прячут от программиста то, что на самом деле происходит в недрах процессора, операционной системы или СУБД, и провоцируют неоптимальный код. Не понимая основ, программисты часто просто не задаются вопросом, а почему это медленно, и как сделать быстрее и лучше. Это выходит за рамки применимости их инструмента.
Радует то, что в последнее время как раз вырос интерес и к функциональным языкам (Haskell, Scala), и к высокопроизводительным масштабируемым системам (многие проекты в NoSQL движении, язык Erlang). Индустрия переживает некоторый ренессанс. Надеюсь, образовательная система заметит этот тренд и вернется к основам. Как говорили наши бабушки -- поживем-увидим.
no subject
Date: 2010-07-14 07:36 am (UTC)У нас, конечно, демократия :), и со мнением студентов надо считаться, но не в плане программы образования. А то так можно дойти до абсурда. Представьте себе абитуриента филфака, который спрашивает: "А как у вас русскую литературу преподают, не по Пелевину? Тогда я у вас учиться не буду".
no subject
Date: 2010-07-14 07:09 pm (UTC)