Система Orphus

 

Поиск по сайту

 

Статьи » Стать программистом за десять лет

Стать программистом за десять лет

Teach Yourself Programming in Ten Years (essay)

© Питер Норвиг, 2001

Примечание: В сети уже имеется перевод данной статьи. Этот вариант отличается полнотой и максимальной приближенностью к оригиналу.

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

Зайдите в любой книжный магазин, и вы обнаружите там самоучитель ”Как выучить в Java за 7 дней” и другие бесконечные вариации, предлагающие выучить Visual Basic, Windows, интернет и так далее в течение нескольких дней или часов. Я сделал следующий поисковый запрос на Amazon.com:

pubdate: after 1992 and title: days and
      (title: learn or title: teach yourself)

дата публикации: после 1992 года и название: дни и
      (название: выучить или название: научиться)

и получил 248 результатов. Первыми 78 были компьютерные книги (под номером 79 был самоучитель бенгальского языка за 30 дней). Я заменил "дни" на "часы" и получил удивительно похожие результаты: более 253 книг, сначала 77 компьютерных книг, затем под номером 78 следовал ”Самоучитель грамматики и стиля за 24 часа”. В общей сложности из топ-200 результатов компьютерные книги составляли 96%.

На этом основании можно сделать выводы: либо люди очень сильно спешат узнать все о компьютерах либо сами компьютеры являются той областью, которую неправдоподобно легко изучить, легче, чем что-либо другое. Нет книг о том, как научиться Бетховену, квантовой физики или даже стричь собак в течение нескольких дней. Felleisen, один соавторов книги “How to Design Programs”, так отмечает эту тенденцию, когда говорит о том, что "Плохо программировать легко”. Идиоты могут изучить программирование за 21 день, даже если они ”чайники”.

Давайте проанализируем, что может означать “Выучите язык C за три дня”:

Выучите: 3-х дней вам не хватит, чтобы написать несколько важных программ, а вместе с тем учиться на своих успехах и неудачах. У вас не будет времени на совместную работу с опытным программистом, для того чтобы понять, каково это жить в среде C. Короче говоря, у вас не будет времени многому научиться. Таким образом, книга может только дать вам поверхностное знакомство, но не глубокое понимание. Как сказал Александр Поуп, ”небольшое” обучение - опасная вещь.

Язык C: За 3 дня вы сможете познакомиться с синтаксисом языка C (если вы уже знаете другой язык), но вы не можете многое узнать о том, как использовать язык. Короче говоря, если бы вы были, скажем, программистом Basic, то вы могли бы научиться писать программы в стиле Basic, используя синтаксис языка С, но вы бы не могли узнать для чего C действительно хорош (или плох). Так в чем же дело? Алан Перлис однажды сказал: "язык, который не влияет на то, что вы думаете о программировании, не стоит знать". Возможно, вам действительно нужно выучить немного C (или, скорее, что-то вроде JavaScript или Flash-Flex), потому что вам нужно взаимодействовать с существующими инструментами для выполнения конкретной задачи. Но тогда вы не научитесь программировать, вы просто выполните эту задачу.

За три дня: К сожалению, этого не достаточно, как показывает следующая глава.

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

Исследователи (Bloom (1985), Bryan & Harter (1899), Hayes (1989), Simmon & Chase (1973)) показали: для того чтобы стать экспертом в некоторой области, будь то игра в шахматы, написание музыки, телеграфия, живопись, игра на фортепиано, плавание, теннис или исследования в области нейропсихологии и топологии, требуется около десяти лет. Ключом к успеху является совещательная практика: не только делать что-то снова и снова, но и пытаться решать сложные для себя задачи, которые соответствуют уровню ваших текущих способностей или выше; при этом нужно стараться анализировать вашу работу, как во время решения задачи, так и после и исправлять ошибки. Затем повторять. И снова повторять. Кажется, более короткого пути нет: даже Моцарту, который был музыкально одаренным в возрасте 4 лет, потребовалось более 13 лет, прежде чем он начал создавать музыку мирового класса. Казалось бы, в другом жанре, Beatles ворвался на сцену, заняв первые строчки хит-парадов, появившись на шоу Эда Салливана в 1964 году. Однако они играли в маленьких клубах Ливерпуля и Гамбурга с 1957 года, и хотя они стали популярны у широкой публики очень рано, их первый большой успех среди критиков связан с появлением альбома Sgt. Peppers в 1967 году. Малкольм Гладуэлл (Malcolm Gladwell) приводит данные его исследований среди студентов Берлинской академии музыки. Для этого он опросил лучших, средних и худших студентов о том, сколько они практиковали:

Любой студент из любой группы начал играть примерно в одно и то же время - около пяти лет. Первые годы все практиковали примерно одно и тоже время - около 2-3 часов в неделю. Но около восьми лет начали проявляться реальные различия. Студенты, которые оказались лучшими в своем классе, начали заниматься больше, чем все остальные: 6 часов в неделю в возрасте 9 лет, 8 - в возрасте 12, 16 – в возрасте 14 лет и все больше и больше, пока в возрасте 20 лет они не стали практиковаться более 30 часов в неделю. В возрасте 20 лет элитные исполнители имели за плечами в общей сложности более 10 000 часов практики за всю свою жизнь. Просто хорошие студенты имели в общей сложности 8000 часов, а будущие учителя музыки - чуть более 4000 часов.

Поэтому, может быть, 10000 часов, а не 10 лет является магическим числом. (Анри Картье-Брессон (1908-2004) сказал: "Ваши первые 10000 фотографий являются вашими худшими фотографиями", он фотографировал более часа в день). Сэмюэль Джонсон (1709-1784) считал: "Превосходство в любой деятельности достигается трудом всей своей жизни, его нельзя приобрести по меньшей цене". А Чосер (1340-1400) жаловался: "Жизнь так коротка, а ремесло так долго изучать". Гиппократ (ок. 400 до н.э.) известен отрывком "ars longa, vita brevis", который является частью более длинной цитаты " Ars longa, vita brevis, occasio praeceps, experimentum periculosum, iudicium difficile" и переводится так "Искусство вечно, жизнь коротка, возможность мимолетна, опыт обманчив, решение трудно". Несмотря на то, что на латыни ars может означать и искусство и ремесло, в греческом оригинале слово "ars" может означать только "мастерство", а не "искусство".

Итак, Вы хотите стать программистом

Вот мой рецепт успеха в программировании:

  • Интересуйтесь программированием, и делайте это так, чтобы было нескучно. Пусть вам будет нескучно на протяжении 10 лет /10000 часов.

  • Программа. Лучший способ обучения – обучение на собственном опыте. Выражаясь технически, "максимальный уровень производительности для физических лиц в некоторой области не достигается автоматически в зависимости от большого опыта, однако уровень производительности может быть увеличен даже для очень опытных людей в результате целенаправленных усилий по его улучшению" и "наиболее эффективное обучение требует наличия четко определенных задач с соответствующим уровнем сложности для конкретного человека, информационной обратной связи и возможности для повторения и исправления ошибок". Книга Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life ("Познания на практике: разум, математика и культура в повседневной жизни") является хорошей ссылкой на эту точку зрения.

  • Общайтесь с другими программистами, изучайте чужие программы. Это важнее, чем любая книга или обучающий курс.

  • Если у Вас есть желание, потратьте четыре года на колледж (или больше на аспирантуру). Это даст вам доступ к рабочим местам, где требуется документ об образовании и это даст вам более глубокое понимание области..

  • Работайте над проектами с другими программистами. Будьте лучшим программистом в некоторых проектах, будьте худшим в некоторых других. Когда вы - лучший, вы получаете возможность проверить свои способности в качестве лидера проекта, а также как вы вдохновляете других своим видением. Когда вы - худший, вы узнаете, что делают мастера, и чего они не любят делать (потому что они заставляют вас делать это за них).

  • Узнайте, по крайней мере, полдюжины языков программирования. Включите один язык, поддерживающий абстракции на основе классов (как Java или С++), один, поддерживающий функциональную абстракцию (как Lisp или ML), один, поддерживающий синтаксическую абстракцию (как Lisp), один, поддерживающий декларативные спецификации (как Prolog или C++ - шаблоны), один, поддерживающий сопрограммы (как Icon или Scheme), и тот, который поддерживает параллелизм (как Sisal).

  • Помните, что есть "компьютер" в "компьютерных науках". Узнайте, сколько времени требуется вашему компьютеру для выполнения инструкции, выборки слова из памяти (с кэшом и без него), чтения упорядоченных слов с диска, и обращения в другое место на диске (Ответы ниже).

  • Участвуйте в процессе стандартизации языка. Это может быть ANSI C++ комитет или обсуждение стиля кодирования внутри компании, где пространство отступа составляет 2 или 4 уровня. В любом случае, вы узнаете о том, что другим людям нравится в языке, как глубоко они чувствуют его, а может быть даже немного о том, почему они так чувствуют.

  • Будьте готовы начать пытаться стандартизировать язык как можно скорее.

Учитывая все это, еще большой вопрос, как многому вы можете научиться только по книгам. Перед рождением моего первого ребенка, я прочитал все How To книги и все еще чувствовал себя, как невежественный новичок. 30 месяцев спустя, при рождении моего второго ребенка, вернулся ли я к книгам для того, чтобы освежить свои знания? Нет. Вместо этого, я положился на мой личный опыт, который оказался гораздо более полезным и обнадеживающим для меня, чем тысячи страниц, написанные экспертами.

Фредерик Брукс в своем эссе ”No Silver Bullet” определил план из трех частей по поиску великих дизайнеров программного обеспечения:

  1. Как можно раньше систематически выявляйте ведущих проектировщиков.

  2. Назначьте наставника, ответственного за развитие будущих проектировщиков и тщательно контролируйте ход их развития.

  3. Обеспечьте возможность для роста проектировщиков через их взаимное взаимодействие и стимулирование.

Все это предполагает, что некоторые люди уже обладают качествами, необходимыми, для того чтобы стать великими дизайнерами. Алан Перлис выразился более лаконично: "Всех можно научить лепить: Микеланджело бы пришлось учить, как лепить не надо. Так же и с великими программистами". Перлис говорит, что у великих людей есть внутреннее качество, которое выходит за рамки их профессиональной подготовки. Но откуда это качество берется? Оно врожденное? Или же оно развивается через трудолюбие? Как выразился Огюст Густо (шеф-повар в Ratatouille), "каждый может готовить, но только бесстрашные делают это великолепно". Я думаю об этом больше как о желании посвятить большую часть своей жизни совещательной практике. Но, возможно, бесстрашие является способом резюмировать это. Или, как говорит критик Густо, Антон Эго: "Не каждый может стать великим художником, однако великий художник может прийти откуда угодно".

Так что вперед за покупкой Java/Ruby/Javascript/PHP книг; вероятно, вы получите некоторую пользу от них. Но вы не измените свою жизнь и не станете опытным программистом за 24 часа, дня или даже недели. А как насчет упорного труда над улучшением профессиональных навыков в течение 24 месяцев?

Ответы

Приблизительная временная оценка для выполнения различных операций на типичном PC:

Выполнение типичной инструкции 1/1,000,000,000 сек = 1 наносек
Выборка из кэш-памяти 1 уровня 0.5 наносек
Ошибочное предсказание ветви 5 наносек
Выборка из кэш-памяти 2 уровня 7 наносек
Mutex lock/unlock 25 наносек
Выборка из основной памяти 100 наносек
Посылка 2 KB данных через сеть c пропускной способностью 1 гигабит в секунду 20,000 наносек
Последовательное чтение 1MB из памяти 250,000 наносек
Выборка через новое позиционирование на жестком диске (seek) 8,000,000 наносек
Последовательное чтение 1MB на жестком диске 20,000,000 наносек
Посылка пакета из США в Европу и обратно 150 мс = 150,000,000 наносек

Приложение: выбор языка

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

  • Используйте ваших друзей. На вопрос "какую операционную систему следует использовать Windows, Unix, Mac?", я обычно отвечаю: "используйте ту, которую используют ваши друзья". Преимущество, которое вы получите от обучения с помощью друзей, будет компенсировать любые внутренние различия между ОС или между языками программирования. Также учитывайте ваших будущих друзей: сообщество программистов, частью которого вы будете, если будете продолжать. Выбранный Вами язык имеет большое растущее сообщество или оно небольшое и умирает? Есть ли книги, веб-сайты и онлайн-форумы, где можно получить ответы? Нравится ли вам люди на этих форумах?.

  • Будьте проще. Языки программирования, такие как C++ и Java, предназначены для профессиональной разработки большими командами опытных программистов, которых беспокоит эффективность исполнения их кода. В результате эти языки имеют сложные части, предназначенных для удовлетворения таких требований. Ваша же цель - обучение программированию. Вам не нужны эти сложности. Вам нужен язык, который можно легко изучить и использовать единственным программистом.

  • Играйте. Какой путь вы избрали, чтобы научиться играть на фортепиано: нормальный, интерактивный способ, в котором вы слышите каждую ноту, как только вы нажмете клавишу или "пакетный" режим, в котором Вы слышите только ноты после того, как вы закончите песню целиком? Очевидно, что интерактивный режим проще для обучения как игры на фортепиано, так и для программирования. Используйте язык с интерактивным режимом.

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

Источник: http://www.norvig.com/21-days.html