Освой программирование за десять лет
(Перевод эссе Петера Норвига (Peter Norvig) “Teach Yourself Programming in Ten Years“, 2001)
Это незавершенный перевод (в частности, нет ни одного линка), приветствуются поправки и дополнения.
Куда так спешить?
Зайдите в любой книжный, и вы обнаружите Освой Java за семь дней 1 среди тьмы предложений освоить Visual Basic, Windows, Интернет и тому подобное всего за несколько дней или даже часов. Я забил в Amazon такой вот поисковый запрос:
pubdate: after 1992 and title: days and
(title: learn or title: teach yourself)
и получил 248 результатов. Первые 78 оказались компьютерной литературой (79-ой была Освой бенгальский язык за 30 дней). Я заменил “дней” на “часов” и получил удивительно похожий результат: еще 253 книги, из них 77 связанных с компьютерами, вплоть до Освой самостоятельно грамматику и стиль за 24 часа на 78 месте. Из 200 верхних лотов 96% составляла компьютерная литература.
Можно заключить, что либо люди очень спешат изучить компьютеры, либо компьютеры много проще в изучении, нежели что-либо еще. Я не встречал книг, посвященных изучению Бетховена, Квантовой Физики или даже Ухода За Собаками за несколько дней.Давайте проанализируем, что же может скрываться под заголовком “Освой Паскаль за три дня”:
Освой: Трех дней явно не хватит на написание хотя бы нескольких значительных программ, с тем чтобы выучиться на успехах и ошибках. Времени не хватит и на то, чтобы поработать с опытным программистом и понять, каково живется в этой среде. Проще говоря, за это время многому не научиться. Очевидно, речь идет о поверхностном ознакомлении, не о глубоком понимании. Как говорил Александр Поуп, учение по верхам - опасная штука.
Паскаль: За три дня, вы, возможно, сможете изучить синтаксис Паскаля (если вы уже знаете похожий язык), но вы не узнаете многого о том, как этот синтаксис применять. Скажем, если бы вы были программистом на Бейсике, вы могли бы научиться писать программы в стиле Бейсика, используя синтаксис Паскаля, но не смогли бы понять, чем же так хорош (и чем плох) Паскаль. Тогда какой в этом смысл? Алан Перлис однажды сказал “Язык, который не заставляет вас смотреть на программирование по-другому, не стоит изучения”. Возможная причина, по которой вы бы хотели изучить Паскаль (или, скорее, какой-нибудь Visual Basic или JavaScript) - это необходимость взаимодействия с существующим инструментарием для выполнения конкретной задачи. Но в этом случае вы учитесь не программированию; вы изучаете способ решения конкретной задачи.
За три дня: К сожалению, этого недостаточно, о чем и говорится ниже.
Изучи программирование за десять лет
Исследования (Хэйес, Блум) показали, что на достижение мастерства в любой области, будь то игра в шахматы, создание музыки, живопись, игра на пианино, плавание, теннис или исследования в области нейропсихологии и топологии требуется около десяти лет. Похоже, более коротких путей нет - даже Моцарт, будучи в 4 года музыкальным вундеркиндом, потратил еще 13 лет, прежде чем смог писать музыку мирового уровня. Другой пример: известно, что Битлз прорвались на сцену с ворохом топовых хитов и появлением в шоу Эда Салливана в 1964 году. Однако они играли в мелких клубах по Ливерпулю и Гамбургу, начиная с 1957, и несмотря на то, что их с ранних пор окружали поклонники, их первый большой успех, Sgt. Peppers, был выпущен в 1967. Сэмуэль Джонсон считал, что на достижение мастерства нужно поболе десяти лет: “Совершенство в любой области может быть достигнуто лишь трудом всей жизни; за меньшую цену его не купишь.” Да и Чосер сокрушался: “жизнь так коротка, ремесло так долго изучить”.
Привожу мой рецепт успеха в программировании:
- Заинтересуйтесь программированием, занимайтесь им ради удовольствия. Убедитесь, что удовольствие, которое вы получаете от процесса стоит того, чтобы потратить на него десять лет.
- Общайтесь с другими программистами, читайте другие программы. Это куда важнее, нежели книги или тренинги.
- Программируйте. Бой - лучшие учения. Выражаясь более научно, “максимальный уровень развития личности в конкретной предметной области не достигается автоматически, не являясь таким образом функцией от накопленного опыта; однако уровень квалификации может быть повышен даже у высокопрофессиональных индивидуумов как следствие настойчивого стремления развиваться” (стр. 366) и “наиболее эффективное обучение требует четко поставленной задачи соответствующего конкретному индививидууму уровня сложности, информативной обратной связи и возможности воспроизведения и исправления ошибок” (стр. 20-21). Книга “Cognition in Practice: Mind, Mathematics and Culture in Everyday Life” содержит весьма интересные рассуждения на эту тему.
- Если хотите, можете потратить четыре года на обучение в техникуме или университете. Это позволит вам поработать там, где нужны корочки, а также даст кое-какие углубленные знания о предмете - но если вас это не вдохновляет, вы можете (если серьезно к этому подойдете) получить аналогичный опыт во время работы. В любом случае, одних книг будет недостаточно. “Изучение компьютерных наук не способно сделать из кого-либо профессионального программиста с большим успехом, чем изучение кистей и красок может сделать из кого-либо профессионального художника”, заявляет Эрик Рэймонд, автор “Нового Словаря Хакера”. Один из лучших программистов из всех, что у меня работали, имел лишь среднее образование; он создал кучу отличного софта, курирует группу новостей и получил уже достаточно дивидендов, чтобы приобрести ночной клуб.
- Работайте на проектах с другими программистами. Будьте лучшим на одних проектах и худшим на других. Пока вы лучший - вы можете проверить свои способности к продвижению проекта и воодушевлению других своим видением. Когда вы худший - у вас есть возможность понаблюдать за мастерами и выяснить, какой работы они не любят (исходя из того, что они сваливают на вас).
- Работайте над проектами, которые писали до вас. Учитесь понимать программы, написанные другими. Почувствуйте, каково это - понять и исправить программу, когда автор вне досягаемости. Думайте, как разрабатывать свои программы так, чтобы тем, кто придет после вас, было легко их поддерживать.
- Изучите как минимум полдюжины языков. Среди них должен быть язык, поддерживающий классовые абстракции (такой, как Java или C++), функциональные абстракции (такой, как Lisp или ML), синтаксические абстракции (как Lisp), декларативные спецификации (как Prolog или шаблоны в C++), сопрограммы (как Icon или Scheme) и поддерживающий параллелизм (как Sisal).
- Не забывайте про слово “компьютер” в словосочетании “компьютерные науки”. Учитывайте, сколько времени требуется вашей машине на исполнение инструкции, чтение слова из памяти (при попадании в кэш и без), чтение с диска цепочки слов и переход к другому участку диска. (Ответы ниже.)
- Включитесь в процесс стандартизации языка. Неважно, станете вы членом комитета ANSI C++, или просто будете обдумывать - двумя или четырьмя пробелами отбивать блоки в своих программах. В любом случае, вы начнете понимать - что другим нравится в языке, насколько сильно им это нравится и, может быть, даже чуть-чуть о том, почему им это нравится.
- Вовремя бросьте попытки стандартизации языка.
Собрав все воедино, спросим - чему же можно выучиться по книгам? Перед рождением моего первого ребенка, я прочитал все книги из серии “How To”, и по-прежнему чувствовал себя неопытным новичком. Спустя 30 месяцев, ко времени появления моего второго ребенка - возвращался ли я ко всем этим книгам, дабы освежить память? Нет. Вместо этого, я опирался на собственный опыт, что оказалось несравненно более полезным и внушительным, нежели тысячи страниц, написанные экспертами.
Фредерик Брукс в своем эссе “Серебряной пули нет” предложил план по нахождению замечательных инженеров программного обеспечения, состоящий из трех частей:
- Систематически выявляйте лучших инженеров - чем раньше, тем лучше.
- Назначьте ответственного за развитие кандидата и бережно храните его личное дело.
- Предоставляйте растущим инженерам возможности для общения и обмена стимулами.
Из этого следует, что некоторые люди уже обладают всеми качествами, необходимыми для отличного инженера; нужно лишь дать им проявиться. Алан Перлис заметил: “Любого можно научить ваять; Микеланджело бы пришлось разучивать. Так же и с хорошими программистами.”
Что ж, пойдите и купите ту книгу по Java: возможно, вы извлечете из нее что-то полезное. Но она не изменит вашу жизнь или ваш уровень как программиста за 24 часа, дня или даже месяца.
Приложение: Выбор языка
Некоторые спрашивают меня, какой язык программирования им стоит выучить первым. Универсального ответа не существует, но стоит принять во внимание следующие соображения:
Спросите у друзей. Когда меня спрашивают, “какой операционной системой пользоваться, Windows, Unix или Mac?”, я обычно отвечаю - “пользуйтесь тем же, чем пользуются ваши друзья” 2. Преимущества обучения через друзей превосходят все различия между операционными системами, или между языками программирования. Кроме того, подумайте о своих будущих друзьях - сообществе программистов, частью которого вы станете, если продолжите этот путь. Как вы охарактеризуете сообщество вокруг выбранного вами языка - большое и растущее или маленькое и умирающее? Существуют ли книги, веб-сайты и онлайновые форумы, на которых можно будет найти ответы? Нравятся ли вам люди, общающиеся на этих форумах?
Не усложняйте себе жизнь. Языки программирования, такие как C++ и Java были созданы для профессиональной разработки в больших командах опытных программистов, которые озабочены эффективностью выполнения их кода. Как следствие, в этих языках есть сложные элементы, разработанные для учета этих обстоятельств. Вы же озабочены изучением программирования. Вам совершенно не нужно усложнять себе жизнь. Вам нужен язык, который был создан простым в обучении и запоминании, подходящий для неопытного разработчика, работающего в одиночку.
Играйте. Как бы вы предпочли обучаться игре на пианино: в нормальном, интерактивном режиме, когда вы слышите каждую ноту после нажатия клавиши - или в “пакетном” режиме, когда вы слышите ноты только после того, как сыграли мелодию целиком? Бесспорно, в интерактивном режиме учиться играть на пианино проще, равно как и учиться программированию. Подыщите язык, имеющий интерактивный режим, и используйте его.
С учетом этих критериев, я бы порекомендовал в качестве первого языка программирования Python 3 или Scheme. Однако все зависит от обстоятельств, и существует достаточно альтернатив. Если ваш возраст выражается одной цифрой, вы можете предпочесть Alice или Squeak (они могут зацепить и тех, кто постарше). Главное - определиться и начать заниматься.
Примечания переводчика
- В оригинале статья озаглавлена “Teach Yourself…”. Это - ссылка на известную серию книг издательства Sams Publishing, которые издавались на русском языке под заголовком “Изучи самостоятельно…”. Так как “самостоятельно”, вообще говоря, здесь не к месту, я взял на себя смелость его выкинуть.
- Эта позиция плохо соотносится со словом “компьютер” в словосочетании “компьютерные науки”. Пользоваться операционной системой - это одно, а изучать ее - другое. Разумно было бы добавить пункт “изучите несколько различных операционных систем - на базе микроядра (как дистрибутивы Linux), с монолитным ядром (как Windows NT), смешанного типа (такие, как FreeBSD), сетевые (как Plan9), реального времени (такие, как QnX) и на основе виртуальной машины (как AOS/BlueBottle или Singularity)”.
- С учетом современной специфики, Ruby может оказаться более удачным выбором, нежели Python. Он более целостен с точки зрения объектной ориентированности, а также приучает программиста к паттерну Strategy вместо использования наследования.
Комментарии (114)
Оставить комментарий | comments rss [?] | трекбек [?]