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

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

    После открытия публичного доступа к 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, и многочасовые диспуты с дизайнером по поводу структуры очередного сайта. И знаете что я думаю? Я — программист, и быть им совсем неплохо!
    Поделиться публикацией

    Комментарии 38

      +3
      Сдается мне, что для людей, не имеющих никакого представления о разработке ПО, данная статья еще больше их запутает. А в целом с посылом согласен. Но к Java и C# я бы еще C++ добавил. Все-так у начинающего программиста должно быть сформировано представление о работе с памятью.
        0
        Может все-таки C тогда, а не C++?
          0
          Автор вел речь об объектно-ориентированных языках, так что С++.
          0
          По этой-же теме пишет
          kak-stat-programmistom.ru
          0
          Теперь когда будут спрашивать как стать программистом, буду ссылать на данную статью. Спасибо!
            +1
            Это чтобы отбить напрочь у человека желание стать программистом?

            PS: Автор вообще кашу намешал, «Первые шаги» — читайте Кнута и Вирта, «Вторая ступень» — делайте сайт визитку и простенькие программы для мамы и папы.
              0
              Кнут и Вирт для меня это как хорошая классика — каждый раз перечитывая, находишь что то новое. И прочить их на этапе изучения алгоритмики, я считаю более чем уместным.

              Визитки и простые программы — это реальные проекты. Хорошо, может «условно» реальные. Я считаю, что любое обучение всегда идет быстрее и проще на реальных задачах.
                +1
                Кнут, вообще говоря, врядли является хорошим пособием для людей которые хотят стать программистом. Чтобы его читать нужно приличное количество свободного времени, математическся база и понимание того, зачем его вообще нужно читать.
                  0
                  И вот нескромный вопрос, но очень интересно, а Кнута реально осилили? Всего? Сколько раз перечитывали? Вопрос ни в коем случае не флеймообразующий, просто интересно:)
                    0
                    Читал два раза. И буду читать еще.
            +6
            Для web-программиста эти и подобные задачи существенно упрощаются наличием различных CMS, большинство из которых имеют развитую инфраструктуру расширений. Разработка расширений для готовой системы значительно проще, чем реализация требуемого функционала с нуля.

            Мне кажется, что хоть использовать готовые CMS проще, но для начала как раз лучше писать своё с нуля, ведь так гораздо проще понять как все работает. Особенно если человек до этого не сталкивался с программированием.
              0
              Писать с нуля свои велосипеды конечно интересней, но вряд ли полезней. Зачем расширять коллекцию govnokod.ru?
                +4
                Как раз таки дико полезно, если подходить к этому правильно. Попользовался готовым решением, в качестве хобби написал свое, выкинул. Это помогает понять, как все работает изнутри. Магия — хорошо, но когда понадобится сделать что-то выходящее за рамки используемого инструмента, хотелось бы не ударить в грязь лицом. Даже написание того же расширения для CMS может обернуться катастрофой, если не знать, что конкретно днелает та или иная функция API CMS. Ровно как и использование ORM без знаний SQL.
                Когда-то давно мы с коллегой писали свой фреймворк. Сейчас, оглядываясь назад, я могу сказать, что это была страшная поделка, но она внесла неоценимый вклад в мое развитие как программиста.

                Зачем расширять коллекцию govnokod.ru?

                Все когда-то писали говнокод, это глупо и бессмысленно отрицать. Никто не начал писать идеальный код с первого дня.
                  0
                  А разве написание собственной CMS не обернется катастрофой без знания архитектуры приложений? Написать что-то свое (в тех же целях обучения) можно и нужно, но мне кажется начинать с этого глупо.
                  Насчет говнокода: писали все и продолжаем писать. Без этого никуда. Часто это даже не является проблемой.
                    0
                    Если цель — быстренько сделать сайтик с новостями и картинками — да, с этого начинать не стоит. За это вообще не нужно браться. Если цель — стать программистом, то начинать нужно именно с этого.

                    Когда кто-то берется что-то писать, он рано или поздно посмотрит, как это сделано у других, особенно если этот человек очень новичок. (Если он так не сделает, то гнать такого «специалиста» в хвост и гриву). И на тот момент, когда он создаст что-то работоспособное, у него уже будет багаж знаний относительно архитектуры. Конечно, писать таким образом нужно только то, на чем можно экспериментировать. Я, например, писал систему DKP для онлайн-гильдии. Конечно, выйдет далеко не идеально, и написанное вы, скорее всего, больше никогда пользовать не будете. Но знания — останутся.

                    А если человек с самого начала начал клепать сайты на друпале, не представляя, что у него под капотом, и как оно работает, это не программист, это сайтошлеп.
                      0
                      Рано или поздно сайтошлепу перестанет хватать встроенного функционала CMS. Они все сильно ограничены. И тогда уже придется учить API и писать что то свое. Но зачем писать целиком систему, если можно ограничится написанием расширения, для меня загадка.
                        0
                        Для разработки расширения хватит знания названий методов API. Для эффективной разработки расширения — нет, тут уже нужно знать принципы работы той части CMS, которой касаешься.

                        Пример не про CMS, но близкий: ORM. При наличии хорошей ORM разработчик может вообще не касаться SQL. Но если этот разработчик хочет иметь эффективную работу с БД, ему необходимо знать этот самый SQL, знать его специфику для используемой БД и знать, какой запрос генерируется каждым из методов. Я видел код людей, посылающий тонны запросов к БД только потому, что разработчик не заглядывал при работе дальше ActiveRecord. Это было ужасно, поверьте.

                        Заметьте, я не предлагаю всегда все писать с нуля. При достижении определенного опыта, когда написание тех или иных кусков кода будет похоже скорее на рутину, чем на создание чего-то новго, нужно переходить на уровень выше — переиспользование чужого кода (фреймворки, CMS).
                  0
                  Обычно путь следующий: страничка → статический html-сайт → установленная cms → + свои расширения для cms → своя cms.
                  Не все до этого доходят, но, мне кажется, последний этап тоже неплохо развивает. Помогает закрепить знания по шаблонам проектирования, реализовать тот же MVC с нуля и так далее.
                +11
                Если вам импонирует C, C++, C# и нет твердого желания писать кроссплатформенное ПО, то выбор очевиден — Windows

                Эта фраза прямо глаз режет, тут все под одну гребенку, как будто разницы особой между языками нет и это все решения в первую очередь под win. Совсем новичков может ввести в заблуждение.
                  0
                  Понимаю, что фраза, возможно, не совсем корректна, но выбор тут продиктован IDE. Visual Studio действительно прекрасный инструмент, уровня которого я не встречал на Linux.
                    0
                    Visual Studio сделает половину работы за вас. В результате, вы в принципе будете понимать как программировать, но вот на интуитивный уровень не выйдете.
                      +1
                      Ну для того вроде и пользуемся IDE, чтобы они делали «половину» работы за нас.
                        0
                        При обучении?
                          0
                          Опять же не понимаю что в этом плохого.
                            –1
                            Да ничего. Просто если в VS я кликаю на кнопку на форме, а он мне сразу разворачивается объявление функции обработкий клика со всеми параметрами, или в яве я передаю объект параметром, а эклипс мне предлагает 100 вариантов каста и 500 альтернатив — чему я научусь? Кликать в код ассисте? Растаскивать кнопочки по форме?
                            В том же PHP некоторые IDE, вроде зенда, выбрасывают варнинги, если пишешь говно. Ну и типа исправил, да, так надо. Почему? А хрен его знает. IDE получается умнее меня.

                            А вот если бы потрахался, неделю выясняя почему сайт тормозит — запомнил бы раз и навсегда почему надо так а не так.
                              –1
                              <!sarcasm>Может тогда сразу писать на Ассемблере? Будет полное понимание что и почему.
                              А если серьезно, то меня в свое время описанная вами ситуация наоборот подстегивала к попыткам разобраться как и что изнутри работает.
                                +1
                                А почему <!sarcasm> то? Пописать на Ассемблере очень и очень правильно для обучения.
                      +6
                      Извините, а в чем преимущества Visual Studio Express (мы же об обучении говорим?) перед QtCreator?

                      P.S. Насколько у меня сохранились воспоминания несколько-летней давности (2010 студия, вроде, была тогда) это был жуткий тормоз, который почти никак не умел парсить и автокомплитить C++, но это могло и поменяться.
                    0
                    -del
                      +3
                      Хочется дополнить, что если дядя Гриша (папин друг детства) окажется одним из адовых клиентов, то создание сайта-визитки для него отобьет всякую охоту не то что программировать, но и вообще общаться с живыми людьми.
                        +1
                        А я б еще посоветовал для веб разработки обратить свой взгляд на ASP.NET.
                        И следует упомянуть так же и разработку приложений для мобильных устройств… ибо этот рынок уже достаточно развит и спросна такие вакансии растет с каждым днем.
                          –3
                          Основной рабочий инструмент программиста — IDE.

                          У меня основной рабочий инструмент — специализированный текстовый редактор с подсветкой и пр. Я — не программист?
                            +2
                            Я всегда считал, что основной инструмент программиста — это мозг… Видимо ошибался :)

                            Насчет советов: все хорошо, но новички ( по крайней мере, кого я вижу) хотят всего и сразу, а на классические алгоритмы смотрят как на…
                            +1
                            Забыли CLRS — имхо, ГОРАЗДО полезнее при обучении, чем творение Кнута, при всем уважении к последнему
                              +2
                              А еще, если зазадротить алгоритмы хорошо, не составит большого труда попасть на стажировку в крупную компанию — а там начинающему программисту дадут наставника, будут делать review его кода, и тд — это будет гораздо эффективнее, чем самому грызть гранит
                                +1
                                По моему нескромному мнению, глубоко ошибочно оставлять за бортом основной современный тренд обучения — MOOC.

                                Когда меня спрашивают «как стать программистом», я отвечаю — «английский знаешь?», и если да, то добавляю две ссылки:
                                www.udacity.com/course/cs101 — «Introduction to Computer Science» at Udacity
                                www.edx.org/course/mitx/mitx-6-00-1x-introduction-computer-1122 — «6.00.1x: Introduction to Computer Science and Programming» от MIT
                                (или аналогичные — Stanford CS50 тоже хорош, например)
                                а если английского человек не знает, то это первый навык, который ему стоит освоить, а потом — то же самое.

                                Ну и в целом, чему бы вы ни захотели научиться, первое, куда стоит заглянуть — это class-central.com

                                P.S. Языки с динамической типизацией, вроде python, для изучения азов алгоритмики ничуть не хуже статически типизированных. А из статически типизированных лучше сразу брать C/C++ и взрывать мозг падавана магией указателей, указателей на указатели и прочего $ворца.
                                    0
                                    Спасибо, полезная статья

                                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                    Самое читаемое