Как на самом деле стать программистом
По многочисленным просьбам. Скорее всего описанное ниже не обрадует, поскольку сильно отличается от популярной картинки «успешного успеха» и «вкатывания в ИТ за пару месяцев». Зато это правда и следуя таким рекомендациям у вас действительно получится стать программистом. Если выживете.

Вводная
Скажу сразу, речь пойдет о полноценных программистах — о тех кто занимается именно разработкой ПО и непосредственно пишет код.
Весь «обслуживающий персонал» в виде менеджеров, аналитиков и тестировщиков с девопсами сегодня идут мимо. Со всем уважением к их сложным профессиям — дело делают не они.
Ниже по шагам и на полном серьезе я расскажу как действительно можно стать самым настоящим программистом, причем так чтобы у вас никогда не было проблем с работой.
Правда могут появиться определенные проблемы с головой, но ничего не поделаешь — без жертв успеха не бывает, увы.
«No pain, no gain» (ц) Джейсон Стетхем.
Если вы сможете пройти все описанное до конца — если уж не в Гугл с Яндексом, то в чуть менее пафосные места вас с радостью возьмут, поскольку станете на голову выше публики, которая обычно шастает по собеседованиям.
Еще описанное основано на личном опыте, как-то так я и учился.

Необходимые жертвы
Начнем с самого сложного и жестокого:
Вам нужен минимум один год чистого времени, без каких-либо отвлечений. Вообще и совсем.
Все прекрасно понимаю: «дом‑жена‑дети‑служба‑учеба‑ипотека», все это слышал, неоднократно. Но оно вот так и по‑другому не бывает — у всего есть цена.
Не можете себе позволить?
Не готовы?
Тогда дальше можете не читать, дальше будет еще жесче:
помимо траты самого драгоценного ресурса — вашего времени, еще нужно получить две самых редких вещи в современном мире: тишину и покой.
Нужно сделать так, чтобы вас целый год никто не отрывал от процесса обучения. И сделать это в 21 веке будет невероятно тяжело.
Нет, места заключения не подойдут — там компьютеры запрещены.
Самое крутое это поселиться на год в монастыре, но не уверен что вам разрешат. Поэтому есть более реалистичный вариант — старая дедушкина дача в какой‑нибудь очень далекой деревне.
Под полным запретом на весь год:
социальные сети и компьютерные игры — мало того что они отнимают нереальное количество времени так еще и сильно отупляют, а вы должны быть в максимальном фокусе.
алкоголь и стимуляторы — очень сильно бьет по концентрации и вниманию, не сможете ясно мыслить.
Смысл всей этой жести в том чтобы создать своеобразный кумулятивный снаряд, для пробивания «каменной стены непонимания», разделяющей обычного человека и программиста.
У вас должны сформироваться нейронные связи в мозгу, отвечающие за «связное изложение мысли в виде кода».
Да да, именно так это и просходит: программисты действительно не просто «чего‑то там пишут в редакторе», а выражают мысли с помощью кода.
Чем вы должны заниматься:
вы не читаете новости, не сидите на форумах, не участвуете в интернет-дискуссиях, не делитесь прогрессом обучения, не смотрите сериалы и котиков — вы пишите код, учитесь писать код, скачиваете примеры кода и гуглите решения проблем со сборкой этого кода.
Интернет должен быть либо медленный и плохой либо вообще отключенный — самый идеальный вариант.
Теперь, когда у вас прошел первоначальный шок, немного расскажу зачем все это надо. Дело в том, что программист это такой специальный человек, который в первую очередь пишет код.
Не рассуждает о том как он пишет код, не смотрит видео, где кто‑то другой пишет код, не учит других писать код и не ставит задачи как писать код.
Все вдруг успели забыть, что программирование это вообще‑то творческий процесс. А любой творческий процесс требует серьезной концентрации и внимания.
Что будет если вы например попробуете постоять рядом с художником и указывать ему как рисовать? — Получите по лицу мольбертом, как минимум.
Тут ровно тоже самое: чтобы научиться нормально программировать, крайне необходимо чтобы вас не отвлекали и не отрывали. Ни по какому поводу.
Поэтому собираете рюкзак, берете ноутбук, набиваете диск исходниками и техническими книжками с примерами и отправляетесь в путь в деревню к дедушке.

Что и как учить
Считаю самый разумный выбор в качестве первого языка это Java.
Cамый лучший язык программирования на свете это разумеется Си, но к сожалению в современных реалиях начинать с него будет слишком тяжело.
Объясняю почему.
C# и .NET привяжет вас к Windows и надолго, еще и неотвратимо повредит мозг особенностями разработки под эту платформу: «недокументированные» функции, хаки, костыли и подпорки, а также реалии большого коммерческого софта. Сразу и с самого начала это точно не надо, успеете потом насладиться на работе.
Node.js, Javascript/Typescript и все веб‑технологии вообще — отдалят понимание внутренних процессов и принципов разработки. Не сможете мыслить как инженер, потому что нельзя изучать асинхронное программирование без основ многопоточности, а многопоточность — без основ самого программирования.
Python — в настоящее время этот язык стал слишком узкоспециализированным и чаще всего применяется для работы с нейросетями, Big Data, AI и подобными научными вещами. Начнете с него — утонете в прикладной информатике, причем без особых перспектив, поскольку одного года на нейросети не хватит никак.
Так что нужна именно Java.
Единственное что Java от вас скроет это работа с памятью, но для современной разработки это не очень важно. Второй хороший вариант это C++ (по тем же причинам), но будет чуть сложнее и дольше в изучении.
Не стоит начинать изучение программирования и с мобильной разработки — утонете в деталях реализации, которые вам точно не нужны на начальном этапе.

Процесс обучения
Самое главное:
вы должны непрерывно и постоянно писать код, не отвлекаясь.
Чтобы происходило формирование нейронных связей между описанием задачи, способом реализации и непосредственно написанием.
Вы надо делать два типа задач:
Примеры из книг и упражения
Тестовые доработки открытого ПО
И делать это надо непрерывно.
Примеры из книг и упражения
Книги по программированию лучше всего выкачивать массово, в виде коллекций и подборок.
Нужны будут сотни (если не тысячи) книг — работа с технической литературой отличается от обычного чтения запоем художественной литературы, техническая книга это в первую очередь справочник, к которому вы будете обращаться адресно для решения какой‑то конкретной проблемы.
Так что «прочитать от корки до корки» — не про техническую литературу.
Если только это не божественный SICP, который я все же настоятельно рекомендую читать целиком и с молитвой.
Если владеете английским — ищите сразу оригинал на английском, не тратьте время на перевод.
С каждой нормальной книгой по программированию обязательно идут учебные примеры, чаще всего они выкладываются в свободный доступ на Github или на сайте автора книги.
Найти их можно вот таким запросом в поисковых системах:
github "название книги" code samples
Эти примеры важнее чем сама книга, поэтому в первую очередь стоит собирать и скачивать именно их.
Тестовые доработки открытого ПО
Примеры и упражения из книг это конечно замечательно, но их одних не хватит для полноценного обучения. Поэтому параллельно нужно учиться задачам, «приближенным к боевым».
Самый лучший вариант это взять несколько популярных проектов с открытым исходным кодом и пробовать их переделывать: отключать какие‑то ветки логики, переименовывать текстовые вставки, отключать какие‑то управляющие кнопки и так далее.
Это крайне эффективный способ обучения, который сразу же приблизит вас к реальным задачам программистов, за которые их отлавливают нанимают и платят деньги.
Для примера можно взять:
Apache Netbeans — универсальная среда разработки на Java,
Eclipse Jetty — сервлет‑контейнер,
JBoss Wildfly — сервер приложений.
Все эти проекты собираются в один шаг, без необходимости установки каких-то дополнительных библиотек или средств разработки.
Да, все они большие и сложные, при первой сборке будут выкачиваться сотни зависимых библиотек и врядли что-то будет понятно с первого раза.
Но такая работа необходима, потому что на реальных задачах большую часть времени вы будете работать с большим количеством уже написанного чужого кода.
Ковыряние всех этих проектов, плюс примеры из книг — по 10 часов в день в течение года дадут нужный кумулятивный эффект и начальное понимание профессии.

Менторство, ютуб и онлайн-курсы
Наверное процентов так 90 от всех виденных автором за жизнь серьезных программистов были… самоучками.
Большинство конечно все равно где‑то когда‑то учились, кто‑то заканчивал и получал диплом о высшем образовании, кто‑то бросал. У некоторых не было даже законченного ПТУ, а у пары особо ярких деятелей — лишь 8 классов школы и коридор.
И все это никак не мешало им хорошо работать.
У самого автора достаточно редкая ситуация для тех лет — профильное высшее образование, в дипломе от 2005 го года так и написано: инженер-программист.
Что характерно, за все время работы в качестве наемного сотрудника, наличие диплома о профильном образовании так никто ни разу и не спросил. Нельзя сказать что «вышка» совсем уж ничем не помогла, но основные свои знания и навыки автор получал самостоятельно и отнюдь не в стенах учебного заведения.
Поэтому фетишировать наличие ВО и образования вообще не стоит, несмотря на все кризисы — «корочки» все также не являются определяющим фактором для найма.
Резюмируя, есть важная особенность профессии программиста:
необходимость учиться самостоятельно и постоянно.
Напрямую связанная с тем самым навыком «изложения мысли в виде кода», который я описал выше.
Концепция менторства, наставничества и всех этих видеокурсов напрямую противоречит идее самообучения, поэтому не дает необходимого результата — у вас банально не формируется необходимый для работы навык.
Практические знания?
Да, вы их получите и в большинстве случаев чему‑то научитесь, но не более того. К реальной работе это может не иметь отношения вообще и дело тут не в объеме учебного материала или часов практики, дело в самом подходе.
Закрепление и результат
По итогам такого марафона, у вас должны выработаться реальные навыки разработки, сборки, доработки и отладки приложений, но повторюсь:
самое главное что должен выработаться навык выражения мысли с помощью кода — ключевой для любого программиста.
Также возможно вы поймете и убедитесь, что программирование — не для вас и это не тот вид деятельности, которым вы бы хотели заниматься.
Это нормально, поскольку программирование действительно не для всех.
Но год интенсивных занятий с полной фокусировкой на конкретной задаче и непрерывные упражнения на логику точно поставят вашу голову на место, заодно научив дисциплине, если у вас были с этим проблемы.
А дисциплина (если вы вдруг не знали) — царица любых достижений и побед.
Сложно сказать, хватит ли одного года, даже с такой интенсивностью для того чтобы вас сразу взяли на хорошую должность, но любых современных «джуниоров» вы точно обойдете на голову.
P.S.
Это доведенная до ума, вычищенная и облагороженная версия статьи, оригинал которой находится в нашем блоге. Статья в свое время вызвала живейший интерес и дискуссию, в том числе на сторонних ресурсах, так что повод для ее повторной выкладки на Хабре точно есть.