Вместо вступления
После открытия публичного доступа к Q&A разделу Хабрахабра появилось множество вопросов по теме «Как стать программистом?». Бесспорно прекрасно то, что так много людей хотят избрать для себя эту интересную профессию. Многих интересует конкретное направление (web, game development) или язык (PHP, Java, C#, JavaScript, Ruby). Выработать универсальную инструкцию достаточно сложно, если не сказать невозможно. Поделиться с вами своими мыслями по этому вопросу я бы и хотел сегодня.
Начало начал
Прежде чем начать изучать программирование создадим комфортную рабочую среду.
Выбор операционной системы во многом зависит от предполагаемого основного языка. Если вам импонирует C, C++, C# и нет твердого желания писать кроссплатформенное ПО, то выбор очевиден — Windows. Для присматривающихся к PHP, Ruby, Python, JavaScript больше подойдет простой современный Linux дистрибутив, такой как Ubuntu (Xubuntu — мой выбор). Причина проста — это языки современной web-разработки, а большая часть web-серверов работают под управлением Linux. Использование Linux на рабочем компьютере, поможет разобраться с большим количеством потенциальных вопросов по настройке сервера: работа с консолью и SSH, система прав для файлов и директорий, установка веб-сервера и сервера базы данных и т.д.
Основной рабочий инструмент программиста — IDE. Для семейства C языков лучшим вариантом будет MS Visual Studio. Для Java, возможно, стоит обратить внимание на Eclipse. Различные IDE выпущенные компанией JetBrains уже давно пользуются заслуженной популярностью у любителей Java, PHP, Python, Ruby по всему миру.
Часто возникают ситуации, когда возможности IDE чрезмерны для текущей задачи. На этот случай стоит обзавестись удобным редактором кода. Моим фаворитом на данный момент является Sublime Text. Для Windows стоит упомянуть Notepad++, часто выручавший меня при необходимости срочно исправить пару строчек на удаленном сервере.
Первые шаги
Язык для обучения программированию — тема многогранная. Следует понимать, что основная задача на данном этапе не изучить синтаксис того или иного ЯП, а разобраться со структурами данных и базовыми алгоритмами. В связи с этим, я бы рекомендовал начинать со статически типизированного высокоуровневого языка, такого как Java или C#. Разобраться с реализацией алгоритма сортировки пузырьком, написать программу определения високосного года или вычисления факториала на таких языках будет не сложнее чем на, скажем, Python'e, но даст гораздо лучшее представление о сути программирования как такового.
Хороший список алгоритмов, с реализации которых вы можете начать, можно найти на сайте algolist.manual.ru. Для желающих особого челленджа, там же вы найдете большую подборку олимпиадных задач.
Не забываем о книгах: «Алгоритмы и структуры данных» Никлауса Вирта и «Искусство программирования» Дональда Кнута уже давно являются классикой и обязаны быть на полке у всех программистов.
Вторая ступень
Изучив базовую алгоритмику, можно приступать к изучению синтаксиса и конструктивных особенностей предпочитаемого языка. Любое обучение всегда происходит быстрее на реальных задачах, но где их взять, когда у нас нет опыта? Что ж, Сами-Знаете-Кто начинал с придуманного дизайнерского портфолио, а мы начнем с придуманных задач. Почему бы не написать для матери «Кулинарную книгу», а для отца «Хоккейную турнирную таблицу»? А может соседу дяде Грише нужен сайт-визитка для скромной строительной компании?
Для web-программиста эти и подобные задачи существенно упрощаются наличием различных CMS, большинство из которых имеют развитую инфраструктуру расширений. Разработка расширений для готовой системы значительно проще, чем реализация требуемого функционала с нуля. Популярные (а другие нам пока и неинтересны) системы имеют хорошую документацию, чаще всего с примерами готового кода, и большое сообщество. Изучение примеров расширений, не только даст ценные идеи для ваших проектов, но и привьет определенные стандарты разработки: стиль оформления кода, часто используемые конструкции, базовые шаблоны проектирования. Говоря о конкретных наименованиях, стоит вспомнить о Joomla!, WordPress, Drupal для PHP и Radiant, Refinery для Ruby. Именно с разработки различных расширений для Joomla! начинал и я, о чем, кстати, совершенно не жалею. Из PHP CMS «большой тройки» только у Joomla! на тот момент были MVC структура (пусть и далеко не совершенная), подробная документация и дружелюбное русскоязычное сообщество.
Я, к сожалению, не могу с уверенностью судить о других сферах разработки ПО, но общий подход, я думаю, останется тем же. Интересующиеся разработкой игр могут посмотреть в сторону популярных движков: Unity, OGRE или Cocos2d. Будущим desktop-разработчикам будет сложнее всего, но и здесь есть чем заняться. Например, разработать плагин для популярной программы, такой как Total Commander или AIMP.
Из литературы следует обзавестись, в первую очередь, книгами по структурированию и особенностям реализации программ на выбранном языке. PHP программисты могут почитать: «PHP и MySQL. Библия программиста» Тима Конверса и «PHP 5» Дмитрия Котерова. Рекомендации по другим языкам, я надеюсь, появятся в комментариях.
Третий приступ
Создав несколько своих проектов, наступив на сотни алгоритмических граблей и успешно прорвавшись сквозь баррикады документаций, пора искать первую работу. Основным критерием в процессе выбора будет, конечно же, не заработная плата, а возможность учиться и развиваться в профессиональном плане.
Хорошая команда — определяющий фактор. «Старшие» товарищи помогут быстро заполнить пробелы в знаниях, научат правильно применять шаблоны проектирования и поделятся опытом в решении неочевидных задач. Также важно получить опыт коммерческой разработки: научиться следовать принятым в командах соглашениям; познакомится с системами отслеживания ошибок, такими как Mantis или Jira; привыкнуть использовать системы контроля версий, например Git и Mercurial.
Расширяем книжную полку: «Приемы объектно-ориентированного проектирования. Паттерны проектирования», «Рефакторинг. Улучшение существующего кода», «Чистый код: создание, анализ и рефакторинг», «Программист-прагматик. Путь от подмастерья к мастеру» однозначно стоят потраченного времени и денежных средств. Техники, описанные в этих книгах, универсальны для всех ЯП и пригодятся каждому программисту.
Четвертая грань
Имея за плечами достаточно глубокое представление о процессе разработки ПО, можно переходить на «серьезные» фреймворки. Они помогут избавиться от ограниченности CMS (или движков) и откроют новые возможности для реализации собственных идей. Для web-разработки на ум приходят, горячо любимый мной Symfony 2 и нелюбимый Zend для PHP, культовые RoR (Ruby) и Django (Python), многогранный Spring (Java), необычный Express для любителей серверного JavaScript и Angular.JS для клиентского. Мир desktop фреймворков не столь обширен, но по своему интересен: .NET Framework, Qt, GTK+, wxWidgets.
В личную библиотеку пора добавить профильную для избранной области литературу. Для меня таковыми стали «Предметно-ориентированное проектирование (DDD). Структуризация сложных программных систем» Эрика Эванса и «Шаблоны корпоративных приложений» Мартина Фаулера.
Отличным источником дополнительной информации станут блоги и Twitter активных участников сообщества выбранной технологии. Блоги Fabien Potencier, Benjamin Eberlei, William Durand давно обосновались в моих закладках.
На этом этапе я пока и остановился. Догоняйте!
Заключение
За кадром осталось так много всего: фриланс и биржы по продаже собственных скриптов, онлайн-курсы и тематические конференции. Но это будет уже другая история.
Естественно, предложенный путь далеко не единственный, но один из возможных. Оглядываясь назад, я с улыбкой вспоминаю его. Кипа исписанных листов тетради с алгоритмом генерации подземелий для «убийцы» ADOM. Десятки чашек кофе выпитых вечерами, в попытке осознать особенности Win API, и многочасовые диспуты с дизайнером по поводу структуры очередного сайта. И знаете что я думаю? Я — программист, и быть им совсем неплохо!
Автор: zloyusr