Второе поколение

Вот еще — хочу сознаться, что зря я гнобил TU D-stadt, и даже там на факультете информатики можно научиться чему-то полезному, если вам повезет, конечно. Дело в том, что вводный курс по информатике, с программированием на Java, читают два разных преподавателя — раньше в четные годы это был Prof. Dr. Johannes Furnkranz (ссылки на его курс можно найти у меня), сейчас курс на основе сделанного Furnkranz’ем читает более молодой преподаватель, Prof. Dr. Christian Reuter. А если повезет, и вы поступите на факультет информатики в нечетный год — то курс с формально тем же содержанием читает Prof. Dr. Karsten Weihe (в отличие от предыдущих, заслуживший страничку в немецкой википедии) — и это совершенно другое дело!

Нет, формально оба преподавателя читают примерно одно и то же — но возьмем тот же пример с определением, является ли строка палиндромом. Самостоятельная ценность у этой задачи близка к нулю — но она прекрасно демонстрирует, как писать нетривиальные циклы и обращаться к элементам массива по индексу (да еще и с возможностью «попасть» на off-by-one error). В лекциях и домашних заданиях курса господина Weihe прослеживается какое-то понимание того, зачем нужны все эти задания, и что за ними стоит на самом деле; если же посмотреть на «альтернативный» курс — то иногда возникает впечатление, что автор заданий, типа того же палиндрома, держал перед глазами список «типовых задач», да так и не понял его.

Что же такое происходит, и чего нам ждать в будущем? У меня есть на этот счет довольно злобная теория — дело в том, что со сменой поколений в преподавании computer science исчезает и понимание сути материала. Вот возьмем какую-нибудь не менее «популярную» учебную задачку — не надоевшие всем палиндромы, а, скажем, структуры данных. Реализовывали ли вы стек на базе массива? А на базе списка? Пожалуй, если дочитали до этого места — для вас это не пустые слова. Предположим, реализацию стека на базе массива вы увидите и так (собственно, «стек вызовов» так и делается в большинстве более-менее адекватных систем) — но зачем делать это на базе списка? Да и вообще, откуда такая любовь к связным спискам, это же совершенно бестолковая и никому не нужная структура данных? Если вы засомневались — почему же списки никому не нужны? — постарайтесь вспомнить, когда они вам последний раз пригодились за исключением изучения информатики и программистских «технических» собеседований.

А ведь если подумать — то связные списки — это «естественный» для Lisp-подобных языков способ организации данных, да и аппаратная их поддержка — не так уж и сложна (примером чему служат всевозможные «Lisp-машины»). Ничто не мешает рассматривать их, как вполне равноправные с массивами (которые имитируют обычную память с линейной адресацией) «элементарные» структуры данных — и строить на их основе что-то более сложное. Но многие ли в «нашем поколении», полностью захваченном обычными фон-неймановскими компьютерами, могут себе представить «альтернативные» варианты? Многие ли могут понять теоретическую важность других способов организации памяти, чем очевидный «массив из int8_t»? Да и рассуждать о способах построения алгоритмов — скажем, об «индуктивных функциях» или доказательстве правильности рекурсивных функций, имея под рукой такую структуру данных, как список, очень удобно (хотя никто не мешает делать это в «императивном» духе).

И возвращаясь к «смене поколений» — если «старики» еще понимают, чему соответствуют все эти нетривиальные штуки в курсе «информатики», то новое поколение действует «по инерции», понимая свою задачу скорее в «начетническом» ключе — если те же списки или палиндромы встречаются в курсе, то достаточно предъявить некоторое количество задач, где как-то фигурируют эти понятия (при этом совершенно теряя суть происходящего). Худший же вариант — рассказать о списках на примере встроенного в Java интерфейса List — встречается, на мой взгляд, пугающе часто.

PS Интересно, а бывают ли учебные курсы Java, где в качестве примеров разбираются реальные классы из JDK? Тот же java.lang.String — прекрасное наглядное пособие для изучения массивов, например :)

Второе поколение: 7 комментариев

  1. А что там сейчас с учебными курсами типа Курсеры? Или ты только за академическими следишь

  2. Саня, по твоему стилю изложения осмелюсь предположить, что ты созрел на написание книги в стиле «зачем нужен паяльник программисту». Интерфейс List — это наше всё при парсинге.

  3. В реальной жизни видел связные списки в ядре, драйверах и некотором ПО. Например, список сетевых интерфейсов в dnsmasq.

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

        Ну и встречал системы куда не лезла libstdc++ но при этом очень хотелось классы, чтобы «не вот это вот всё опять на си говнякать».

        1. «Ну и встречал системы», где в каждом более-менее нетривиальном модуле была наговнякана «медленная, глючная и неспецифицированная реализация половины языка Common Lisp» :)

Добавить комментарий для Дмитрий Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *