Заметки про студентов
2007-12-16 18:06Я немножко преподаватель, обучаю программированию под Zope3, в основном, на добровольных началах. В результате этой деятельности у меня получился ряд каких-то общих замечаний к тому, как следует изучать программирования.
Они немного шутливые, немного злые. В общем, всем, начинающим изучать наш курс, хорошо бы прочитать это как руководство к действию. Или как не надо делать.
В общем, что-то в этом роде.
О вреде раздумий
Не могу никак привыкнуть. Я, наверно, в психологии обучения, когнитивной психологии и вообще в психологии не двинулся дальше банального бихевиоризма: научения правильным сценариям поведения.И я иной раз устаю объяснять студентам что они не должны думать. Программирование - это как игра на рояле. В основном, отточенные до автоматизма движения. Думание - это занятие, в свободное от программирование время. Программирование это не игра в 15ть, где тупым перебором и отсечением вариантов можно прийти к успеху. Программирование это как рубка дров - если полено не рубится, его откладывают в сторону, до прихода сильного товарища или просто до после обеда.
Но однако это какой-то болезненный синдром, я наблюдаю его уже не первый и даже не десятый раз, когда человек начинает-таки это неудачное полено стесывать в опилки, вместо того, что бы заниматься делом. Обычная аргументация - я хочу сам найти решение. Это тупость. Это как высшая математика: за пять лет обучения по специальности "Инженер-Математик" студент доказывает сам меньше одного процента материала. Остальное время он врубается в доказательства Коши, Вейерштрасса и остальных.
Это нельзя придумать самому. Надо просто прочитать как это придумали другие и потом следовать тому, что они сделали.
Тогда может быть - только может быть. У вас останется два часа после обеда, когда вы _не_программируя_ и не работая, а лежа сытым брюхом кверху и отдыхая что-то придумаете. И вот тогда ваше умение копипастить, писать код на автомате, рубить дрова не задумываясь, играть на рояле не прислушиваясь - вот тогда все это выстрелит и вы за пять минут запрограммируете то, что придумывали два часа после обеда. И получите свой венок рядом с Дейкстрой, Декартом и еще сотней неизвестных имен.
Вы должны встать на плечи гигантов, что бы другие могли встать на вас. Так сделайте это.
О поленьях, которые не рубятся
В статье О вреде раздумий я привел сравнение решения задач с рубкой дров, и посоветовал упорное полено отложить на после обеда. Но, прохлаждаясь между трудами праведными и заготавливая дрова, я обнаружил что советик-то с гнильцой: бывают, ох бывают поленья, которые не разрубить ни вам, ни после обеда, ни старшему товарищу. Так что дорогие студенты: бывают задачи, которые не решаются. И это не только задача комивояжера, бывает и просто код который не отлаживается (был у меня такой... 100 строк приличного кода на фортране-IV которые не мог отладить никто).
И что же делать? Долбится лбом в стену? Ну уж нет. Отложите задачу. Стойкому полену всегда найдется нестандартное применение: обнаружив, что после обеда два полена все равно не разрубились, я прибил к ним доску и сделал скамейку, а из задачи можно сделать конкурс: три доллара тому, кто отладит программу на фортране, которую не смог отладить никто... (кстати, если участие платное - это уже бизнес ... ).
Займитесь чем-нибудь другим. Может быть, задача сама решится. Потом. Много решается, когда вы лежите в постели с любимой подругой и тогда, спешно перелезая через нее, втыкаете ноут где-то в районе унитаза, что бы не разбудить, но проверить свои выкладки.
Мораль у этой басни: обучение программированию - тренировка мышц мозга. Мышцы тренируются тогда, когда работают. Работа - это движение, преодолевающее силу. Точно также и с мозгом. Не решайте нерешаемые задачи - чтобы быть полезной, работа должна быть успешной. Нужно дать стране угля, пусть мелкого, но много :).
А если кто ищет славы ... Вейерштрасса помнит больше людей, чем Коши :)
Про студентов
Вообще, интересно наблюдать за людьми после года обучения и работы по специальности. Забавно то, что независимо от реально полученных знаний, у всех развивается "синдром сапера": т.е. уверенность в своих силах, помноженная на отсутствие реальной ответственности.
Такой юный гений просто стремится браться за "сверхсложные" с его точки зрения задачи, причем "сложность" меряется то ли в строках кода, то ли в его запутанности до безобразия. Иногда они достают малоизвестные конструкции и плодят программных монстрров по принципу: "каждая программа должна делать все! Если делается пакет маленьких программ, каждая программа пакета должна использовать все остальные!".
Я вдруг понял, что я упускаю из обучения. Я прекрасно рассказываю теорию и архитектуру используемой системы. Даю много действующих и полезных примеров. И даже стараюсь прививать какой-то вразумительный стиль программирования и следование регламенту. Но один момент я упускаю начисто: факторизация системы. Разбивка системы на _независимые_ части, которые могут использоваться и продаваться отдельно. И насколько я помню свое собственное обучение, меня этому тоже никто не учил.
Дошел своим умом. Когда понял, что прекрасная функция из моей распрекрасной системы пытается подгрузить все остальные функции вообще и загрузить систему целиком. Сейчас я осознал это, но тем не менее, я понимаю что и выбора особого нет. Даже мой любимый Zope3 не так уж хорошо бьется на отдельные пакеты: из каждого нужно выносить какой-то инвариант, которые отвечает за связь компонент и ссылается на них все.
Ну а со студентами просто мрак. Те, что попроще, с большим апломбом просаживают деньги инвесторов на потенциально неработающий код: они наивно наступают на грабли, которые все давно обходят по интуиции. Те что поумнее - занимаются готическим программированием: "Программа должна подавлять и устрашать", - я вижу как простые изначально идеи, найденные ими, постепенно доводятся до полного абсурда: из простого и понятного решения они превращаются в тысячу кнопочек с тысячами неясных возможностей.
Так что глядя со стороны, автоматически разбиваешь решение на более простые эффективные составляющие, показываешь их студенту как оригинальное решение, он в восторге берется за поддержку - и каждая из них превращается в монстра.
С методологией факторизации программных средств надо что-то делать. Хотя бы довести до ума пакет pd.requires. Конечно, автоматический поиск зависимостей сам по себе ничего не решит, но даже визуализация этого бреда может быть, наверно, полезной.



