Четыре совета для обучения программированию
Оригинал: Four tips for learning how to program
Недавно я получил письмо от человека, который хотел научиться программировать и спрашивал, с чего начать. У него была идея проекта, и он даже начал его реализовывать, но столкнулся с проблемами, которые не мог решить сам.
В первую очередь я был впечатлен тем, что он начал реализовывать свою идею. Идей вокруг много, и больше всего я не люблю «людей идеи» — тех, кто, придумав идею, думает, что их работа уже сделана и им осталось только найти программиста, который напишет код. Этот человек сильно вырос в моих глазах, обратившись ко мне только после того, как попытался сделать все сам.
К сожалению, я не смог помочь ему развить его проект, но это дало мне повод вспомнить то время, когда я сам был новичком (неважно, в веб разработке, разработке под iOs, или какой-либо другой области программирования) и поразмышлять, как действовал в таких ситуациях я.
Я сформулировал четыре пункта, которые являются основой моего способа обучения. Конечно, у каждого свой способ обучения, я просто опишу то, что помогало мне.
1. Начните проект.
Первое, с чего я начинаю — это идея проекта. Когда я начал изучать Ruby, учебным проектом был простой HTTP сервер. Для iOs это был каталог символьных изображений. На CoffeeScript я решил написать несколько интерактивных демонстраций алгоритмов генерации лабиринтов. Выбор проекта неважен, главное — чтобы он был мне интересен, и чтобы я не знал, как его сделать.
Часто учебным проектом становилось то, из-за чего я начинал обучение. Например, вам нужно веб приложение — хороший повод изучить Ruby. Или вам нужно приложение для iPhone и это подталкивает вас к изучению программирования под iOs.
Но что бы ни подталкивало вас к изучению программирования, не пытайтесь учить как в школе. Проект — это практическое воплощение какой-то идеи. Без этого вы не учитесь, а просто ознакамливаетесь с какой либо информацией.
2. Делайте то, что можете.
Во-вторых, я пишу так много, как получится, используя доступные мне источники информации. Если я изучаю новый язык программирования — это справочник по синтаксису. Если разбираюсь с каким-либо фреймворком (например Cocoa или Rails) — я ищу справку по этому фреймворку. (Лично я предпочитаю онлайн документацию из-за удобства поиска и создания закладок, но если вы предпочитаете книги — используйте их.) На этом этапе процесс обычно идет медленно, делается много проб и ошибок. Вы можете решить, что энтузиазм угасает во время этого этапа, но для меня это самая захватывающая часть, чистое исследование и изучение.
Во время второго этапа я активно использую ресурсы наподобие Stack Overflow. Не помню, чтобы я там что-то спрашивал, но когда я изучал программирование под iOs, я очень многое почерпнул из ответов на вопросы других людей. Изучая открытые проекты на GitHub и в других местах, я узнаю, как более опытные программисты решают аналогичные задачи. Главное — удостовериться, что я понимаю, как работают эти решения прежде, чем адаптировать их для себя. Иначе получится, что я не изучаю, а просто копирую чужой код. Нельзя давать себе поблажки и использовать код, который я не понимаю.
Я намеренно пропустил вопросы на форумах, в IRC каналах и т.д. Мне это не сильно помогает. С одной стороны, если вопрос не сильно интересен, на форуме я вряд ли получу полезный и содержательный ответ. С другой, ответ на специфичный вопрос придется ждать пару дней — обычно за это время я уже сам решаю проблему. Что опять ставит под сомнение полезность форумов. Помните, скорее всего кто-то уже сталкивался с этой проблемой до вас, и вместо того, чтобы спрашивать на форумах, поищите ответ сами. Спрашивайте тогда, когда все остальное не помогло.
3. Разделяй и властвуй.
В-третьих, если проблема велика, я стараюсь разбить ее на подзадачи. Когда я писал первую версию Net::SSH на Ruby, я был ошеломлен сложностью спецификации SSH. Вместо написания клиента с нуля, я начал с написания небольших скриптов, которые помогли мне детально изучить тему. Один скрипт тестировал соединение с SSH сервером, другой шел дальше и определял используемые алгоритмы шифрования, а следующий шел еще дальше и устанавливал SSH туннель.
Нужно упомянуть, что именно при таком подходе TDD проявляет себя во всей красе. Он заставляет вас дробить проблему и разбираться с маленькими ее частями. Когда я изучал покрытие плоскости конструкциями Уитхофа, TDD оказал мне неоценимую помощь. Написав подробные тесты, я понял, как работают конструкции Уитхофа.
Если вы зашли в тупик, попробуйте разбить задачу на более мелкие и решить их. Возможно, проблема разрешится сама собой.
4. Получайте отзывы.
В-четвертых, я описываю то, что я узнал в блоге, почтовой рассылке или еще где-либо и прошу оценить. Я делаю это не так часто, как стоило бы, но когда делаю — узнаю много нового. Несколько месяцев назад я изучал CoffeeScript и попросил Сэма Стивенсона оценить мой код (реализацию генератора лабиринтов). Он указал на множество мест, в которых можно было более полно использовать возможности языка. Это было бесценно.
Главное, что нужно помнить — это то, что обучение программированию (да и не только программированию) — это не задача на одну ночь. Не обманывайте себя, не думайте, что это будет просто. Но сложность процесса обучения не значит, что от него нельзя получать удовольствие. Ведь чем больше вы знаете, тем больше вы можете сделать.