Научитесь программировать за десять лет

Питер Норвиг

(автор книги «Искусственный интеллект: современный подход» AIMA, 2-е издание)

Статья обсуждается в блоге Виктора Штонда:
http://shtonda.blogspot.com/2011/09/peter-norvig-teach-yourself-programming.html

Почему все так спешат?

Зайдите в любой книжный магазин и вы увидите, что вам предложат изучить язык 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 году, а до этого просто пользовались определенной популярностью. Сэмюэль Джонсон считает, что фактически требуется больше десяти лет: “Превосходства в любой области можно достичь только упорным трудом в течение всей жизни; его нельзя купить по меньшей цене”. И даже Чосер жаловался: “Жизнь так коротка, что не хватает времени на овладение мастерством”.

Поэтому я предлагаю следующий рецепт достижения успеха в программировании:

  • Заинтересуйтесь программированием и занимайтесь им ради развлечения. Старайтесь сделать эти занятия достаточно привлекательными для того, чтобы не хотелось их бросать в течение десяти лет.
  • Общайтесь с другими программистами; читайте программы, написанные другими. Это гораздо важнее по сравнению с любой книгой или курсом обучения.
  • Программа. Лучший вид обучения — это обучение на собственном опыте. Более формально эта мысль выражена так, что “максимальный уровень производительности труда в определенной области не достигается автоматически как результат приобретения опыта, но даже очень опытные специалисты могут повысить продуктивность своего труда в результате сознательного стремления к усовершенствованию” (с. 366) и “действительно эффективное обучение невозможно без постановки вполне определенных заданий с соответствующим уровнем сложности конкретным лицам, информативной обратной связи и возможности повторения и исправления ошибок” (с. 20-21). Книга 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 изложил план поиска превосходных проектировщиков программ, состоящий из трех частей:

  1. Систематически проводите поиск выдающихся проектировщиков, стараясь выявить их как можно раньше.
  2. Назначьте наставника, ответственного за подготовку перспективного сотрудника, и тщательно контролируйте весь ход подготовки.
  3. Предоставьте растущим проектировщикам возможность взаимодействовать и стимулировать друг друга.

Эти рекомендации основаны на том, что некоторые люди уже имеют качества, необходимые для того, чтобы стать великолепным проектировщиком; нам остается только содействовать их развитию. Алан Перлис выразил эту мысль более кратко: “Каждого можно научить ваять, а Микеланджело достаточно было только объяснить, как не надо ваять. Точно так же обстоят дела с выдающимися программистами”.

Если вы со мной не согласны, не отказывайтесь от своего решения купить книгу по языку Java; по-видимому, она не станет для вас бесполезной. Но вы не почувствуете, что ваша жизнь изменилась коренным образом, и не станете действительно многоопытным программистом после того, как пройдут 24 часа, несколько дней или даже месяцев.


Литература

Bloom, Benjamin (ed.) Developing Talent in Young People, Ballantine, 1985.

Brooks, Fred, No Silver Bullets, IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.

Hayes, John R., Complete Problem Solver Lawrence Erlbaum, 1989.

Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life, Cambridge University Press, 1988.


Ответы

Приблизительные затраты времени при выполнении различных операций на типичном персональном компьютере с частотой 1 ГГц летом 2001 года

Выполнение одной команды

1 нс = (1/1 000 000 000) с

Выборка слова из кэш-памяти L1

2 нс

Выборка слова из оперативной памяти

10 нс

Выборка слова без позиционирования головок диска

200 нс

Выборка слова после позиционирования головок диска (после поиска)

8 000 000 нс = 8 мс


Приложение. Выбор языка

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

  • Прибегайте к помощи друзей. На вопрос о том, какую операционную систему следует использовать, Windows, Unix или Макинтош, я обычно отвечаю: ту, которую используют ваши друзья. Преимущества, которые получите, воспользовавшись помощью друзей, перевесят любые сложности, связанные с освоением операционной системы или языка программирования. Подумайте также о том, что круг ваших друзей обязательно должен расшириться: ведь вы со временем войдете в сообщество программистов, с которыми будете заниматься совместной деятельностью. Связано ли с выбранным вами языком крупное растущее сообщество или небольшая и постепенно редеющая группа людей? Можно ли найти необходимые для получения консультаций книги, Web-узлы и сетевые форумы? Довольны ли вы общением с участниками этих форумов?
  • Не усложняйте себе жизнь. Такие языки программирования, как C++ и Java, предназначены для проведения профессиональной разработки с участием крупных коллективов опытных программистов, которые стремятся достичь максимального быстродействия создаваемого ими кода. В связи с этим в ходе разработки программ на подобных языках применяются сложные технологии, созданные с учетом специфики их применения. Но вы желаете лишь научиться программировать. Вам не нужны лишние усложнения. Вам нужен язык, который мог бы легко изучить и запомнить начинающий программист, который вынужден во всем разбираться сам.
  • Превращайте обучение в игру. Какой способ обучения игре на фортепьяно кажется вам предпочтительным: обычное, “интерактивное” общение с преподавателем, при котором вам подсказывают как правильно действовать после каждого нажатия клавиши, или “пакетный” режим, в котором вам делают замечания только после того, как сыграна вся мелодия? Очевидно, что интерактивный режим упрощает обучение не только игре на фортепьяно, но и программированию. Остановитесь на одном из языков с интерактивным режимом программирования и используйте его.

В соответствии с этими критериями, я бы порекомендовал в качестве первого изучаемого языка программирования выбрать Python или Scheme. Но все зависит от конкретных обстоятельств, и можно найти много других подходящих вариантов. Молодые люди, возраст которых измеряется одной цифрой, могут предпочесть Alice или Squeak (эти языки часто привлекают и людей постарше). Важнее всего выбрать что-то одно и приступить к работе.


Приложение. Книги и другие ресурсы

Меня часто спрашивают, какие книги и web-узлы я мог бы порекомендовать для учебы. Еще раз повторяю, что “одних книжных знаний недостаточно”, но могу порекомендовать следующее:

  • Scheme: Structure and Interpretation of Computer Programs (Abelson & Sussman). По-видимому, наилучшее введение в компьютерные науки, в котором действительно программирование преподносится как способ постижения компьютерных наук. К этой книге прилагаются оперативные видеозаписи лекций. Однако книга требует для своего усвоения значительных усилий и может заставить отказаться от первоначальных планов многих людей, которые, возможно, добились бы успеха с помощью другого подхода.
  • Scheme: How to Design Programs (Felleisen et al.). Одна из лучших книг, посвященных проектированию изящных и эффективных программ.
  • Python: Python Programming: An Intro to CS (Zelle). Хорошее введение в проблематику использования языка Python.
  • Python: Несколько интерактивных учебников можно найти на узле Python.org.
  • Oz: Concepts, Techniques, and Models of Computer Programming (Van Roy & Haridi). Эту книгу многие считают современным продолжением указанной выше книги Абельсона и Зюссмана. Она представляет собой обзор наиболее выдающихся идей программирования, охватывает большую область, чем книга Абельсона и Зюссмана, но, возможно, является более легкой для чтения и изучения. В ней используется язык Oz, который не столь широко известен, но служит основой для обучения другим языкам.

Примечания

Т. Кейпи отметил, что на странице узла Amazon, посвященной книге Complete Problem Solver, в свое время рекламировались книги “Teach Yourself Bengali in 21 days” и “Teach Yourself Grammar and Style” в разделе “Customers who shopped for this item also shopped for these items” (Книги, которые заказывают вместе с этой книгой). Я полагаю, что многие из тех, кто решает для себя, стоит ли купить данную книгу, вначале посетили эту страницу.


Peter Norvig (Copyright 2001)

ссылка на первоисточник http://www.norvig.com/21-days.html

Rambler's Top100