Этот текст является переводом публикации Джэмиса Бака в блоге signalvnoise.com
Недавно я получил письмо от кого-то, кто вникал в программирование и спрашивал, как нужно действовать. У него была идея проекта, он начал её воплощать, но пришел к пониманию, что его текущих знаний недостаточно, чтобы решить поставленную задачу.
Во-первых, я был очень впечатлен, что он вообще начал работу. Идей пруд пруди, и одна из наименее любимых мной вещей - это “люди идеи”, которые считают, что их работа уже сделана, когда они придумали идею, и все, что им осталось - это найти программиста, который захочет заполнить пробелы. То, что этот человек обратился ко мне после первой попытки решить задачу самостоятельно, уже является большим плюсом, говорящим в его пользу.
К сожалению, я не мог помочь ему в развитии его проекта, но это дало мне возможность подумать о тех временах, когда я был начинающим (неважно, в веб-программировании, iOS-программировании или даже в каких-то вещах, не относящихся к программированию вообще), и поразмыслить, как я подходил к этим начинаниям. Я выделил четыре вещи, которые, по моему мнению, являются основополагающими для конкретно моего стиля обучения. Очевидно, что существует множество стилей, возникающих в процессе обучения, но конкретно этот работает для меня.
1. Выберите Проект
Во-первых, я начал с идеей проекта в голове. Когда я впервые начал изучать Ruby, моим “ученическим” проектом был миниатюрный HTTP сервер. Для iOS это был каталог веревочных головоломок. Для CoffeeScript, я хотел написать своего рода интерактивную демонстрацию алгоритмов генерации лабиринтов. На самом деле, сам проект не столь важен, все, что имеет значение - это чтобы ваш проект был вам по-настоящему интересен и вы не знали, как незамедлительно его реализовать.
Зачастую случается так, что выбор проекта является тем, что побуждает желание немедленно начать учиться. Возможно, у вас есть идея о приложении, которым вы хотели бы пользоваться и вы думаете, что это может быть возможностью начать изучать Rails. Или вы хотите приложение для вашего iPhone, которое побуждает вас научиться разработке для iOS. Но что бы ни рождало в вас желание учиться программированию, не пытайтесь подойти к обучению академически. Проект - это то, что заставляет взять заплесневелые, пыльные факты и воплотить их в реальность. Без проекта вы не учитесь, вы просто принимаете к сведению некоторую информацию.
2. Делайте то, что можете
Во-вторых, я пишу так много, как могу, используя доступные ресурсы. Если я изучаю новый язык программирования, ресурсы, возможно, будут включать в себя онлайновую документацию по синтаксису языка. Если это новый фреймворк (такой, как Cocoa или Rails), я воспользуюсь документацией к фреймворку. (Лично я предпочитаю онлайновые документации, поскольку в них легко воспользоваться поиском и добавлением в закладки, но если вы предпочитает книги - используйте их.) Обычно, прогресс на этом этапе развивается очень медленно, с множеством фальстартов и возвратов назад, поскольку я учусь и прихожу к пониманию, что работает, а что нет. Вы можете подумать, что это будет разочаровывающая фаза, но я, на самом деле, нахожу её одним из самых волнующих шагов. Все благодаря открытиям и исследованию.
На протяжении второй фазы я так же постоянно использую ресурсы вроде Stack Overflow. Я не думаю, что я когда-либо задавал вопросы на эом сайте, но когда я учился программированию под iOS, я узнал множество нового из вопросов других людей, которые размещали их на этом сайте, и ответов на них. Подобным образом, просмотр других (open-source) проектов на GitHub и где-нибудь в другом месте, мог помочь мне увидеть, как более опытные программисты решают похожие проблемы. Однако, главное здесь то, что я должен был убедиться, что понимаю эти решения, прежде чем применю их сам; если я просто слепо копирую их код, я не учусь, я копирую. Я никогда не позволял себе использовать код, который я не понимаю.
Обратите внимание, что я нарочно не упомянул постинг в списки рассылок, форумы или IRC просьбы о помощи. Я нашел их не особенно полезными для себя. С одной стороны, пока мой вопрос является очень необычным, на форумах вряд ли помогут полезным советом. С другой, если у меня есть специфичный вопрос, я могу подождать день или два подходящего ответа, и, по моему опыту, я зачастую решаю проблему к исходу этих двух дней. Что лишний раз подтверждает мои сомнения в полезности форумов. Помните, что вы практически наверняка не первый человек в мире, встретившийся с конкретной проблемой: на форумах наверняка уже есть этот вопрос. Вместо того, чтобы спрашивать, потратьте время на поиск ответа. И лишь когда все прочие способы не принесут вам результата, вы можете попросить о помощи.
3. Разделяй и властвуй
В третьих, если проблема, которую я затрагиваю, велика, я, для начала, стараюсь разбить её на на небольшие части. Когда я писал первую версию Net::SSH для Ruby, я был перегружен сложностью спецификаций SSH. Вместо того, чтобы пытаться написать весь клиент с нуля, я начал с набора более простых скриптов, которые помогли изучить мне область и понять её составляющие. Нпример, у меня был скрипт, который просто тестировал соединение с SSH сервером, другой, который двигался дальше и согласовывал используемые алгоритмы шифровки, и третий, который двигался еще дальше и открывал SSH-канал на соединении.
Несомненно, это тот случай, когда TDD проявляет себя на все сто. Она заставляет вас отстраниться от проблемы и думать о ней в в мелких деталях. Когда я учился, как выкладывать мозаику, используя конструкции Wythoff, я нашел TDD бесценным. Я написал Kaleidoscope практически полностью test-first, и по завершении работы имел хорошее понимание, как работают конструкции Wythoff. Когда проблема, с которой вы столкнулись, заводит вас в тупик, посмотрите, возможно ли поделить её на несколько мелких проблем, которые могут быть решены по отдельности. Вы можете обнаружить, что общая проблема решается сама по себе по мере решения мелких.
4. Просите отзывов
Четвертое, я стараюсь писать о том, что я изучил: в блоге, IRC, на статичных веб-страницах, где-то, где мою запись можно увидеть, и прошу обратной связи. Я не делал этого последовательно, как мне следовало бы, но когда я делал это, я узнавал много нового. Несколько месяцев назад я изучал CoffeeScript и попросил Сэма Стивенсона взглянуть на мой код (реализация генератора лабиринтов). Он указал на множество мест, где мой код мог бы быть более читабельным. Это было бесценно.
Самое важное, что нужно постоянно держать в голове - это то, что обучение программированию (или как делать что-либо вообще) это не то, что можно осилить за ночь. Не думайте, что это будет легко. Но это не значит, что вы не получите от этого удовольствия! Поймите, что оно того стоит и оно будет того стоить. В конце, чем больше вы учитесь, тем больше можете сделать.