Здесь мы приводим интересную статью Питера Норвига об очень важном вопросе, касающемся обучения программированию - о времени, необходимом для достижения результатов.
Кстати, в заголовке нет опечатки или неточности перевода. Попытка перевода или прочтения заголовка статьи как "Научитесь программировать в десять лет" - является серьёзнейшей ошибкой и просто не имеет смысла.
Следует также обратить внимание, что смысл понятий "научиться программировать" и "изучить язык программирования" не просто различный: это настолько разные понятия, что их даже не стоит пытаться сравнивать, точно так же, как не стоит сравнивать, например, компьютерный вирус и туманность Ориона...
Питер Норвиг
Зайдите в любой книжный магазин и вы увидите, что вам предложат изучить язык Java за семь дней с помощью книги Teach Yourself Java in 7 Days, а также, обнаружите другие бесчисленные варианты учебных пособий, предлагающих изучить Visual Basic, Windows, Интернет и многое другое через несколько дней или часов. Я провел следующий расширенный поиск на узле Amazon.com:
pubdate: after 1992 and title: days and (title: learn or title: teach yourself)
и получил 248 результатов. Первые 78 указывали на компьютерные книги, а под номером 79 стояла книга Learn Bengali in 30 days (Изучите бенгальский язык за 30 дней). Я заменил слово “days” (дни) словом “hours” и получил такие же удивительные результаты: запрос возвратил еще 253 книги, среди которых первые 77 были компьютерными книгами, а за ними под номером 78 следовала книга Teach Yourself Grammar and Style in 24 Hours (Овладейте грамматикой и стилем за 24 часа). Из общего количества в 200 книг, в наибольшей степени соответствующих запросу, 96% были компьютерными книгами.
На основании этих фактов можно сделать одно из двух заключений: либо читатели очень спешат узнать что-либо о компьютерах, либо изучение компьютерной тематики в чем-то невероятно проще по сравнению с любыми другими занятиями. В продаже не нашлось ни одной книги, которая позволяла бы за несколько дней постичь музыку Бетховена, изучить квантовую физику и даже научиться ухаживать за собаками.
Попытаемся проанализировать, что могло бы означать такое название, как Learn Pascal in Three Days (Изучите язык Pascal за три дня):
- Learn: В течение трех дней вы не найдете времени для написания хотя бы нескольких значимых программ и не сможете извлечь опыт из своих успехов и неудач в работе с ними. У вас не хватит времени, чтобы поработать вместе с опытным программистом и понять, сумеете ли вы когда-либо почувствовать себя комфортно в среде этого языка программирования. Короче говоря, трех дней не будет достаточно для того, чтобы действительно чему-либо научиться. Таким образом, авторы подобных книг могут пообещать вам достичь только поверхностного знакомства, а не глубокого понимания. Но, как сказал английский поэт Александр Поп, недостаточно полное обучение несет в себе большую опасность.
- Pascal: За три дня вы сможете изучить синтаксис языка Pascal (если вы уже знакомы с подобным языком), но не сможете в достаточной степени научиться тому, как использовать этот синтаксис. Короче говоря, программист Basic может научиться писать программы в стиле синтаксиса Pascal с использованием Basic, но не сможет понять, в чем фактически состоят преимущества (и недостатки) языка Pascal. Но неужели это столь важно? Алан Перлис однажды заметил: “Язык, освоение которого не позволяет найти новые подходы к программированию, не заслуживает изучения”. Ознакомление лишь с начальными сведениями о языке Pascal (или, что более вероятно, о языке Visual Basic или JavaScript) может быть оправдано только в том случае, если это необходимо, чтобы воспользоваться существующим инструментальным средством для выполнения конкретного задания. Но в таком случае речь идет не об обучении программированию, а о том, как приобрести навыки выполнения конкретного задания.
- in Three Days: К сожалению, как показывает следующий раздел, этого недостаточно.
Научитесь программировать за десять лет
Исследователи (Хейес, Блум) показали, что для приобретения экспертных знаний в любой широкой области человеческой деятельности, включая шахматную игру, сочинение музыки, рисование, игру на фортепьяно, плавание, теннис, а также проведение исследований по нейропсихологии и топологии, требуется приблизительно десять лет. Причем создается впечатление, что в действительности этот срок невозможно сократить: даже Моцарту, который проявил выдающиеся музыкальные способности в возрасте 4 года, потребовалось еще 13 лет для того, чтобы он начал сочинять музыку мирового класса. Рассмотрим другой музыкальный жанр; неосведомленные люди считают, что Битлз совсем внезапно появились на музыкальной арене, выпустив ряд хитов, занявших первые места, и появившись в шоу Эда Сэлливена в 1964 году. Но они играли в маленьких клубах Ливерпуля и Гамбурга с 1957 года, и смогли издать диск Sgt. Peppers, который стал их первым важным успехом, лишь в 1967 году, а до этого просто пользовались определенной популярностью. Сэмюэль Джонсон считает, что фактически требуется больше десяти лет: “Превосходства в любой области можно достичь только упорным трудом в течение всей жизни; его нельзя купить по меньшей цене”. И даже Чосер жаловался: “Жизнь так коротка, что не хватает времени на овладение мастерством”.
Поэтому я предлагаю следующий рецепт достижения успеха в программировании:
- Заинтересуйтесь программированием и занимайтесь им ради развлечения. Старайтесь сделать эти занятия достаточно привлекательными для того, чтобы не хотелось их бросать в течение десяти лет.
- Общайтесь с другими программистами; читайте программы, написанные другими. Это гораздо важнее по сравнению с любой книгой или курсом обучения.
- Программа. Лучший вид обучения — это обучение на собственном опыте. Более формально эта мысль выражена так, что “максимальный уровень производительности труда в определенной области не достигается автоматически как результат приобретения опыта, но даже очень опытные специалисты могут повысить продуктивность своего труда в результате сознательного стремления к усовершенствованию” и “действительно эффективное обучение невозможно без постановки вполне определенных заданий с соответствующим уровнем сложности конкретным лицам, информативной обратной связи и возможности повторения и исправления ошибок”. Книга "Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life" является интересным справочником по этой теме.
- Если у вас есть такое желание, посвятите четыре года обучению в колледже (или еще больше — в магистратуре). Благодаря этому вы получите доступ к некоторым должностям, для занятия которых требуется документ об образовании, а также сможете приобрести более глубокие знания в избранной специальности, но если вам не нравится сидеть на лекциях, то сможете (пройдя посвящение) приобрести аналогичный опыт непосредственно на рабочем месте. В любом случае одних книжных знаний не будет достаточно. Как сказал Эрик Рэймонд, автор книги The New Hacker's Dictionary, “Никто не сможет стать выдающимся программистом, изучая компьютерные науки, или выдающимся художником, изучая кисти и краски”. Один из лучших программистов, которые когда-либо у меня работали, имел лишь среднее образование; он создал большой объем превосходного программного обеспечения, ведет собственную группу новостей, а благодаря полученным им опционам на акции, несомненно, стал намного богаче по сравнению с тем, чего мне когда-либо удастся достичь.
- Работайте над проектами с другими программистами. Будьте лучшим программистом в некоторых проектах; будьте худшим в некоторых других. Будучи лучшим, вы сможете проверить свои способности вести проект и внушать другим свои взгляды. Будучи худшим, вы сможете учиться у мастеров и сумеете понять, что им самим не нравится делать (потому что они будут заставлять вас делать это за них).
- Работайте над проектами после других программистов. Старайтесь разобраться в программах, написанных кем-то другим. Узнайте на собственном опыте, что требуется, чтобы понять и исправить чужую программу без помощи автора. Подумайте о том, как спроектировать собственные программы, чтобы облегчить работу для тех, кто будет сопровождать их без вашего участия.
- Изучите по крайней мере полдюжины языков программирования. Включите в это число по одному языку из тех, которые поддерживают абстракцию классов (Java или C++), функциональную абстракцию (Lisp или ML), синтаксическую абстракцию (Lisp), декларативные спецификации (Prolog или шаблоны C++), сопрограммы (Icon или Scheme) и параллелизм (Sisal).
- Не забывайте, что термин “компьютерные науки” содержит слово “компьютер”. Узнайте, сколько времени требуется вашему компьютеру для выполнения команды, выборки слова из памяти (с попаданием и без попадания в кэш), чтения последовательных блоков с диска и перевода головок на новый участок диска.
- Примите участие в работе по стандартизации языка. Это может быть комитет по разработке стандарта ANSI C++ или проводимое в вашей компании совещание по выбору стиля отступа на 2 или 4 пробела. В любом случае деятельность в этой области позволит вам узнать, нравится ли другим тот или иной язык, насколько явно выражены их предпочтения, и даже, возможно, немного о том, чем обусловлены их предпочтения.
- Но призовите на помощь свой здравый смысл, чтобы правильно выбрать время расставания с этой работой по стандартизации.
Если учесть все сказанное, возникают сомнения в том, насколько далеко можно продвинуться, получая только книжные знания. Ожидая рождения своего первого ребенка, я прочитал все книги Для чайников, которые только мог достать, и все равно чувствовал себя неискушенным новичком. Как вы думаете, я стал перечитывать эти книги через 30 месяцев, когда пришло время родиться моему второму ребенку? Конечно, нет. Вместо этого я рассчитывал на свой личный опыт, который оказался гораздо более полезным и надежным, чем тысячи страниц, написанных экспертами.
Фред Брукс в своем эссе "No Silver Bullets" изложил план поиска превосходных проектировщиков программ, состоящий из трех частей:
- Систематически проводите поиск выдающихся проектировщиков, стараясь выявить их как можно раньше.
- Назначьте наставника, ответственного за подготовку перспективного сотрудника, и тщательно контролируйте весь ход подготовки.
- Предоставьте растущим проектировщикам возможность взаимодействовать и стимулировать друг друга.
Эти рекомендации основаны на том, что некоторые люди уже имеют качества, необходимые для того, чтобы стать великолепным проектировщиком; нам остается только содействовать их развитию. Алан Перлис выразил эту мысль более кратко: “Каждого можно научить ваять, а Микеланджело достаточно было только объяснить, как не надо ваять. Точно так же обстоят дела с выдающимися программистами”.
Если вы со мной не согласны, не отказывайтесь от своего решения купить книгу по языку Java; по-видимому, она не станет для вас бесполезной. Но вы не почувствуете, что ваша жизнь изменилась коренным образом, и не станете действительно многоопытным программистом после того, как пройдут 24 часа, несколько дней или даже месяцев...
Поделиться: