- PVSM.RU - https://www.pvsm.ru -

Эссе на тему «Как стать программистом?»

    Вместо вступления

    После открытия публичного доступа к Q&A разделу Хабрахабра появилось множество вопросов по теме «Как стать программистом?». Бесспорно прекрасно то, что так много людей хотят избрать для себя эту интересную профессию. Многих интересует конкретное направление (web, game development) или язык (PHP, Java, C#, JavaScript, Ruby). Выработать универсальную инструкцию достаточно сложно, если не сказать невозможно. Поделиться с вами своими мыслями по этому вопросу я бы и хотел сегодня.

    Начало начал

    Прежде чем начать изучать программирование создадим комфортную рабочую среду.
    Выбор операционной системы во многом зависит от предполагаемого основного языка. Если вам импонирует C, C++, C# и нет твердого желания писать кроссплатформенное [1] Ubuntu [2] (Xubuntu — мой выбор). Причина проста — это языки современной web-разработки, а большая часть web-серверов работают под управлением Linux. Использование Linux на рабочем компьютере, поможет разобраться с большим количеством потенциальных вопросов по настройке сервера: работа с консолью и SSH, система прав для файлов и директорий, установка веб-сервера и сервера базы данных и т.д.
    Основной рабочий инструмент программиста — IDE [3]. Для семейства C языков лучшим вариантом будет MS Visual Studio [4]. Для Java, возможно, стоит обратить внимание на Eclipse [5]. Различные IDE выпущенные компанией JetBrains уже давно пользуются заслуженной популярностью у любителей Java, PHP, Python, Ruby [6] по всему миру.
    Часто возникают ситуации, когда возможности IDE чрезмерны для текущей задачи. На этот случай стоит обзавестись удобным редактором кода. Моим фаворитом на данный момент является Sublime Text [7]. Для Windows стоит упомянуть Notepad++ [8], часто выручавший меня при необходимости срочно исправить пару строчек на удаленном сервере.

    Первые шаги

    Язык для обучения программированию — тема многогранная. Следует понимать, что основная задача на данном этапе не изучить синтаксис того или иного статически типизированного [9] высокоуровневого [10] языка, такого как Java или C#. Разобраться с реализацией алгоритма сортировки пузырьком [11], написать программу определения високосного года или вычисления факториала на таких языках будет не сложнее чем на, скажем, Python'e, но даст гораздо лучшее представление о сути программирования как такового.
    Хороший список алгоритмов, с реализации которых вы можете начать, можно найти на сайте algolist.manual.ru [12]. Для желающих особого челленджа, там же вы найдете большую подборку олимпиадных задач.
    Не забываем о книгах: «Алгоритмы и структуры данных» [13] Никлауса Вирта и «Искусство программирования» [14] Дональда Кнута уже давно являются классикой и обязаны быть на полке у всех программистов.

    Вторая ступень

    Изучив базовую алгоритмику, можно приступать к изучению синтаксиса и конструктивных особенностей предпочитаемого языка. Любое обучение всегда происходит быстрее на реальных задачах, но где их взять, когда у нас нет опыта? Что ж, Сами-Знаете-Кто [15] начинал с придуманного дизайнерского портфолио, а мы начнем с придуманных задач. Почему бы не написать для матери «Кулинарную книгу», а для отца «Хоккейную турнирную таблицу»? А может соседу дяде Грише нужен сайт-визитка для скромной строительной компании?
    Для web-программиста эти и подобные задачи существенно упрощаются наличием различных CMS [16], большинство из которых имеют развитую инфраструктуру расширений. Разработка расширений для готовой системы значительно проще, чем реализация требуемого функционала с нуля. Популярные (а другие нам пока и неинтересны) системы имеют хорошую документацию, чаще всего с примерами готового кода, и большое сообщество. Изучение примеров расширений, не только даст ценные идеи для ваших проектов, но и привьет определенные стандарты разработки: стиль оформления кода, часто используемые конструкции, базовые шаблоны проектирования [17]. Говоря о конкретных наименованиях, стоит вспомнить о Joomla! [18], WordPress [19], Drupal [20] для PHP и Radiant [21], Refinery [22] для Ruby. Именно с разработки различных расширений для Joomla! начинал и я, о чем, кстати, совершенно не жалею. Из PHP CMS «большой тройки» только у Joomla! на тот момент были MVC [23] структура (пусть и далеко не совершенная), подробная документация и дружелюбное русскоязычное сообщество [24].
    Я, к сожалению, не могу с уверенностью судить о других сферах разработки ПО, но общий подход, я думаю, останется тем же. Интересующиеся разработкой игр могут посмотреть в сторону популярных движков: Unity [25], OGRE [26] или Cocos2d [27]. Будущим desktop-разработчикам будет сложнее всего, но и здесь есть чем заняться. Например, разработать плагин для популярной программы, такой как Total Commander [28] или AIMP [29].
    Из литературы следует обзавестись, в первую очередь, книгами по структурированию и особенностям реализации программ на выбранном языке. PHP программисты могут почитать: «PHP и MySQL. Библия программиста» [30] Тима Конверса и «PHP 5» [31] Дмитрия Котерова. Рекомендации по другим языкам, я надеюсь, появятся в комментариях.

    Третий приступ

    Создав несколько своих проектов, наступив на сотни алгоритмических граблей и успешно прорвавшись сквозь баррикады документаций, пора искать первую работу. Основным критерием в процессе выбора будет, конечно же, не заработная плата, а возможность учиться и развиваться в профессиональном плане.
    Хорошая команда — определяющий фактор. «Старшие» товарищи помогут быстро заполнить пробелы в знаниях, научат правильно применять шаблоны проектирования и поделятся опытом в решении неочевидных задач. Также важно получить опыт коммерческой разработки: научиться следовать принятым в командах соглашениям; познакомится с системами отслеживания ошибок, такими как Mantis [32] или Jira [33]; привыкнуть использовать системы контроля версий [34], например Git [35] и Mercurial [36].
    Расширяем книжную полку: «Приемы объектно-ориентированного проектирования. Паттерны проектирования» [37], «Рефакторинг. Улучшение существующего кода» [38], «Чистый код: создание, анализ и рефакторинг» [39], «Программист-прагматик. Путь от подмастерья к мастеру» [40] однозначно стоят потраченного времени и денежных средств. Техники, описанные в этих книгах, универсальны для всех ЯП и пригодятся каждому программисту.

    Четвертая грань

    Имея за плечами достаточно глубокое представление о процессе разработки ПО, можно переходить на «серьезные» фреймворки [41]. Они помогут избавиться от ограниченности CMS (или движков) и откроют новые возможности для реализации собственных идей. Для web-разработки на ум приходят, горячо любимый мной Symfony 2 [42] и нелюбимый Zend [43] для PHP, культовые RoR [44] (Ruby) и Django [45] (Python), многогранный Spring [46] (Java), необычный Express [47] для любителей серверного JavaScript и Angular.JS [48] для клиентского. Мир desktop фреймворков не столь обширен, но по своему интересен: .NET Framework [49], Qt [50], GTK+ [51], wxWidgets [52].
    В личную библиотеку пора добавить профильную для избранной области литературу. Для меня таковыми стали «Предметно-ориентированное проектирование (DDD). Структуризация сложных программных систем» [53] Эрика Эванса и «Шаблоны корпоративных приложений» [54] Мартина Фаулера.
    Отличным источником дополнительной информации станут блоги и Twitter активных участников сообщества выбранной технологии. Блоги Fabien Potencier [55], Benjamin Eberlei [56], William Durand [57] давно обосновались в моих закладках.
    На этом этапе я пока и остановился. Догоняйте!

    Заключение

    За кадром осталось так много всего: фриланс и биржы по продаже собственных скриптов, онлайн-курсы и тематические конференции. Но это будет уже другая история.
    Естественно, предложенный путь далеко не единственный, но один из возможных. Оглядываясь назад, я с улыбкой вспоминаю его. Кипа исписанных листов тетради с алгоритмом генерации подземелий для «убийцы» ADOM. Десятки чашек кофе выпитых вечерами, в попытке осознать особенности Win API, и многочасовые диспуты с дизайнером по поводу структуры очередного сайта. И знаете что я думаю? Я — программист, и быть им совсем неплохо!

Автор: zloyusr

Источник [58]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/programmirovanie/48960

Ссылки в тексте:

[1] кроссплатформенное: http://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%BE%D1%81%D1%81%D0%BF%D0%BB%D0%B0%D1%82%D1%84%D0%BE%D1%80%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D0%B5%D1%81%D0%BF%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5

[2] Ubuntu: http://www.ubuntu.com/

[3] IDE: http://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D1%80%D0%B5%D0%B4%D0%B0_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8

[4] MS Visual Studio: http://www.visualstudio.com/ru-ru

[5] Eclipse: http://www.eclipse.org/

[6] Java, PHP, Python, Ruby: http://www.jetbrains.com/products.html

[7] Sublime Text: http://www.sublimetext.com/

[8] Notepad++: http://notepad-plus-plus.org/

[9] статически типизированного: http://ru.wikipedia.org/wiki/%D0%A1%D1%82%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D1%82%D0%B8%D0%BF%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F

[10] высокоуровневого: http://ru.wikipedia.org/wiki/%D0%92%D1%8B%D1%81%D0%BE%D0%BA%D0%BE%D1%83%D1%80%D0%BE%D0%B2%D0%BD%D0%B5%D0%B2%D1%8B%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F

[11] алгоритма сортировки пузырьком: http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%BF%D1%83%D0%B7%D1%8B%D1%80%D1%8C%D0%BA%D0%BE%D0%BC

[12] algolist.manual.ru: http://algolist.manual.ru

[13] «Алгоритмы и структуры данных»: http://www.ozon.ru/context/detail/id/4803785/

[14] «Искусство программирования»: http://www.ozon.ru/context/detail/id/1335648/

[15] Сами-Знаете-Кто: http://ru.wikipedia.org/wiki/%D0%9B%D0%B5%D0%B1%D0%B5%D0%B4%D0%B5%D0%B2,_%D0%90%D1%80%D1%82%D0%B5%D0%BC%D0%B8%D0%B9_%D0%90%D0%BD%D0%B4%D1%80%D0%B5%D0%B5%D0%B2%D0%B8%D1%87

[16] CMS: http://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B8%D0%BC%D1%8B%D0%BC

[17] шаблоны проектирования: http://ru.wikipedia.org/wiki/%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F

[18] Joomla!: http://www.joomla.org/

[19] WordPress: http://ru.wordpress.org/

[20] Drupal: https://drupal.org/

[21] Radiant: http://radiantcms.org/

[22] Refinery: http://refinerycms.com/

[23] MVC: http://ru.wikipedia.org/wiki/Model-View-Controller

[24] сообщество: http://joomlaportal.ru/

[25] Unity: http://unity3d.com/

[26] OGRE: http://www.ogre3d.org/

[27] Cocos2d: http://cocos2d.org/

[28] Total Commander: http://wincmd.ru/

[29] AIMP: http://www.aimp.ru/

[30] «PHP и MySQL. Библия программиста»: http://www.ozon.ru/context/detail/id/5264620/

[31] «PHP 5»: http://www.ozon.ru/context/detail/id/4030251/

[32] Mantis: http://www.mantisbt.org/

[33] Jira: https://www.atlassian.com/software/jira

[34] системы контроля версий: http://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D1%8F%D0%BC%D0%B8

[35] Git: http://git-scm.com/

[36] Mercurial: http://mercurial.selenic.com/

[37] «Приемы объектно-ориентированного проектирования. Паттерны проектирования»: http://www.ozon.ru/context/detail/id/20217137/

[38] «Рефакторинг. Улучшение существующего кода»: http://www.ozon.ru/context/detail/id/1308678/

[39] «Чистый код: создание, анализ и рефакторинг»: http://www.ozon.ru/context/detail/id/21916535/

[40] «Программист-прагматик. Путь от подмастерья к мастеру»: http://www.ozon.ru/context/detail/id/21441069/

[41] фреймворки: http://ru.wikipedia.org/wiki/%D0%A4%D1%80%D0%B5%D0%B9%D0%BC%D0%B2%D0%BE%D1%80%D0%BA

[42] Symfony 2: http://symfony.com/

[43] Zend: http://framework.zend.com/

[44] RoR: http://rubyonrails.org/

[45] Django: https://www.djangoproject.com/

[46] Spring: https://spring.io/

[47] Express: http://expressjs.com/

[48] Angular.JS: http://angularjs.org/

[49] .NET Framework: http://www.microsoft.com/net

[50] Qt: http://qt-project.org/

[51] GTK+: http://www.gtk.org/

[52] wxWidgets: http://www.wxwidgets.org/

[53] «Предметно-ориентированное проектирование (DDD). Структуризация сложных программных систем»: http://www.ozon.ru/context/detail/id/5497184/

[54] «Шаблоны корпоративных приложений»: http://www.ozon.ru/context/detail/id/4884925/

[55] Fabien Potencier: http://fabien.potencier.org/

[56] Benjamin Eberlei: http://whitewashing.de/

[57] William Durand: http://williamdurand.fr/

[58] Источник: http://habrahabr.ru/post/202988/