Добрый день, меня зовут Михаил Емельянов, я Python backend программист, и я хотел бы накидать небольшой путеводитель для тех, кто только делает первые шаги в программировании. Когда несколько лет назад я менял специализацию с инженера-электронщика на программиста, мне бы очень пригодился такой список с кратким перечислением необходимых компетенций. Со временем я составил такой перечень для себя сам, надеюсь, вам он тоже пригодится.


Вообще, на мой взгляд, на тему вхождения в IT многовато ехидного ёрничинья, чересчур эмоциональных обсуждений и излишне субъективных пикировок, но маловато сухих, объективных, беспристрастных мануалов.


Представим, что я пью чай с моим хорошим знакомым. Даже другом. Может быть, даже знакомой девушкой. Может быть… А нет, не стоит, давайте не будем углублять наши отношения. Пусть будет просто друг.
И вот однажды он отставляет рюмку с недопитым чаем и вопрошает:
— Слушай, я тут подумываю пойти в IT, объясни по-человечески, какой примерно объем материала мне придется ассимилировать? Голова у меня варит, я профессионал в своём деле, просто хочу взвесить, стоит ли менять профессию. И давай без эмоций, ОК? Даже так — просто дай мне краткий список тем для гуглежа, ключевики, затравку, так сказать, дальше я попробую разобраться сам.


Что ж, можем просто взять четвертушку бумаги, ручку и начать отбивать по пунктам всё, что я могу припомнить...


Давайте попробуем?


Выбор сферы деятельности


Прежде чем говорить о выборе языка программирования или о еще более специфических прибамбасах, поразмыслите сначала о сфере приложения ваших сил. Ведь силы-то прикладывать придётся весьма неиллюзорно, сегодня, завтра, каждй день, неделями и месяцами. Подумайте, какую именно работу вы готовы делать годами, что мотивирует вас это делать и, собственно, почему вы не делали этого раньше?


Что гуглить в первую очередь: embedded, frontend, backend, full stack, high-load, devops, data science, dba, mobile, gamedev, desktop.


Выбор операционной системы


Необходимо стать специалистом хотя бы в одной из широко распространённых ОС. Тонкие настройки, решение проблем сетевого взаимодействия и вообще каких-то специфических проблем этой конкретной операционки не только не должны вызывать у вас особых проблем, но даже стать привычными, рутинными и ненапряжными, должны решаться «одной левой».


Что гуглить в первую очередь: windows, linux, macos, android, ios.


Выбор языка программирования


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


С другой стороны — «чисто по фану» освоить язык программирования не получится, никогда и никакой. Когнитивная нагрузка, подразумевая реализацией реальных приложений в реальном мире, сравнима для всех ЯП, даже если это не Хаскель и не Эликсир, а «всего лишь» Пайтон или «всего лишь» Яваскрипт.


С третьей стороны — смена языка программирования при переходе на новую работу или даже на новый проект не должна вызывать какого особого благоговейного трепета.
Да, смена инструмента дается нелегко, библиотеки и фреймворки придется поменять, но суть — суть останется прежней. Все современные языки предоставляют примерно сопоставимые структуры данных и способы работы с ними, все так или иначе решают проблему многопоточности и асинхронности. В любом языке вам придется учиться работать с сетью и с базами данных (подробнее об этом поговорим чуть ниже), а специфические приёмы, которые вам понадобятся для этого, будут слабо привязаны к конкретному ЯП.


Что гуглить в первую очередь: tiobe index, pypl, javascript, typescript, python, java, c, c++, c#, php, swift, kotlin, golang, rust.


Структуры данных


Тут максимально уместно будет вспомнить цитату Линуса «Наше всё» Торвальдса, создателя Linux: «Для своих высоконагруженных проектов с особыми требованиями к надёжности я арендую выделенные сервера только у компании ...» Что? Не закинули денег? Бли-ин...
Ну ладно, на самом деле Торвальдс говорил: «Плохие программисты думают о коде. Хорошие программисты думают о структурах данных и их взаимосвязях».


Структура данных, правильно подобранная под решаемую задачу, не только упростит реализацию алгоритма, но и сделает прозрачнее и проще сопровождение и модернизацию разрабатываемого ПО. Прежде чем бежать писать код, подберите структуру, максимально полно способствующую решению задачи, подобно тому, как профессиональный взломщик подбирает отмычку, максимально подходящую к замку. Не торопитесь долбить каждую задачу одним и тем же ломом, возможно, использование скрепки ускорит решение на порядок.


Что гуглить в первую очередь: list, tuple, dictionary, hash collisions, set, array, singly linked list, doubly linked list, binary tree, heap, b-tree, red-black tree, avl tree, trie.


Базовая манипуляция данными


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


Что гуглить в первую очередь: leetcode, hackerrank, slice, sorting, linear search, binary search, comprehension, linq, string built-in functions, regex, datetime management, file (text, binary), json, serialization/deserialization, protocol buffers, combinatorics.


Продвинутая манипуляция данными. Алгоритмы


Воистину, безграничная тема. Если, например, C++ можно хотя бы в теории «выучить от корки до корки» (правда, не исключено, что после этого вам понадобится помощь целителей в белых халатах), то «выучить» алгоритмы совершенно невозможно. Это область, плотно соприкасающаяся с математикой и периодически ею подпитываемая, и даже сточив зубы в этой науке, можно периодически услышать от коллеги (такого же седовласого профессора): «Эх ты, лопух, проще же можно сделать!»


Но в ваших силах определить свой круг интересов, сориентироваться в алгоритмах своей предметной области и периодически расширять свои познания.


Что гуглить в первую очередь: niklaus wirth, thomas cormen, big o notation, fizzbuzz, bubblesort, quicksort, mergesort, heapsort, insertionsort, radixsort, adjacency matrix, incidence matrix, adjacency list, incidence list, dfs, bfs, dijkstras, bellman-ford, divide and conquer, recursion, greedy algorithm, dynamic programming.


Базы данных


Нравится вам это или нет, но по нынешним временам умение работать с БД входит в малый джентельменский набор каждого программиста.
Тоже очень глубокая тема, не такая глубокая, как «Алгоритмы», но всё же. К счастью, если вы не хотите развиваться по пути DBA, то для начала можно ограничиться погружением на среднюю, так сказать, глубину, включающую в себя, в частности:
• написание запросов средней сложности;
• базовые навыки анализа плана выполнения;
• хорошее владение ORM.


Что касается конкретных БД, то я бы посоветовал начать с SQLite (просто чтобы вообще не задумываться о разворачивании и инсталляции чего-либо), а потом, с ростом опыта, переходить на PostgreSQL. Но это не точно; если вы выберете C#, то растут шансы, что вам надо будет осваивать MS SQL Server, да и MySQL тоже пока не сдаёт своих крепких позиций.


Что гуглить в первую очередь: relational model, transaction, consistency, isolation, acid, n+1 problem, query plan, nosql, sqlite, mysql, postgresql, orm, ddl, dml, dcl, tcl.


Работа с сетью


Еще один инструмент из малого джентльменского набора. Очень маловероятно, что вы будете работать над проектом, у которого отсутствуют сетевые функции, если только это не какой-то подвально-хтонический embedded.


Тут вы в полный рост столкнётесь с неидеальностью сетей передачи данных, недетерминированными задержками, проблемами, связанными с распределённым хранением данных и прочими сетевыми «фишками».


М-м-м, отладка распределённого асинхронного кода на реальном объекте в условиях плохо работающей сети...
Видели, наверное, видео на «Ютубе», где в условиях ураганного ветра самолёт садится практически боком, лихорадочно маша всеми имеющимися органами управления с припиской в комментариях: «Вот почему у пилотов такие большие зарплаты». Очень скоро вы узнаете, почему у программистов такие большие зарплаты :)


Что гуглить в первую очередь: http/https, cors, rest, api, authentication, jwt tokens, swagger, graphql.


Развёртывание и администрирование


В самом начале мы говорили немного про то, что вам нужно стать если не экспертом, то хотя бы очень опытным пользователем какой-нибудь ОС. Пришла пора расширить горизонты.
Тут так же, как с DBA, имеет место довольно глубокая кроличья нора, но даже если вы не планируете погружаться с головой в DevOps, оставьте в своём расписании место для следующих дисциплин:
• git (и в первую очередь ветвление/слияние плюс работа с GitHub);
• Linux (инсталляция, структура каталогов, работа в терминале, базовый bash);
• понимание принципов, преимуществ и недостатков гибкой разработки;
• CI/CD;
• контейнеризация.


Что гуглить в первую очередь: git-flow, trunk-based development, continuous testing, github actions, docker, kubernetes, Jenkins, New Relic.


Архитектурные принципы и паттерны проектирования


Ну и в конце — попробуйте обобщить и систематизировать полученные знания. К счастью, попытки разложить всё по полочкам предпринимались и до нас, и не раз, так что нам нужно просто, памятуя Ньютона, взобраться на «плечи гигантов».
Самое главное — пожалуйста, не зубрите архитектурные принципы, не надо. Если вы плохо понимаете, какую проблему данный архитектурный принцип или паттерн проектирования решает и ничего в вашем предыдущем опыте не взывает к его применению — не используйте его. По крайней мере, пока.


Тут хорошо ляжет цитата Тима Питерса, связанная с метапрограммированием в Python: «Metaclasses are deeper magic than 99% of users should ever worry about. If you wonder whether you need them, you don’t (the people who actually need them know with certainty that they need them, and don’t need an explanation about why)», что в вольном переводе означает «Метаклассы нужны только уверенным в себе людям, которые точно знают, чего хотят от жизни, а вовсе не тебе».


Но — мотайте, что называется, на ус; постарайтесь держать даже пока что туманные архитектурные принципы и паттерны в горячем резерве. Чем сложнее будет уровень решаемых вами задач, чем больше шишек вы набьёте, тем выше шанс того, что вы найдёте в общепринятых архитектурных подходах рациональное зерно.


Что гуглить в первую очередь: solid (srp, ocp, lsp, isp, dip), coupling vs cohesion, kiss, dry, yagni, object-oriented paradigm (inheritance, encapsulation, polymorphism, abstraction), functional Paradigm, observer, decorator, factory method, adapter, facade, microservices, decentralization, smart endpoints dumb pipes, design for failure, messaging, rabbitmq, apache kafka, cqrs, two-phase commit, load-balanced services, patterns of distributed systems, cloud design patterns.


Стоит ли идти на курсы программирования?


Стоит ли идти на курсы и вообще платить кому-либо за образование в IT-сфере?


Самый лучший способ ответить на этот вопрос — попробовать учиться самому. Попытайтесь спокойно взвесить затрачиваемые усилия и получаемый выхлоп (не забывая о том, что кривая любого образования бывает особенно крута на начальных стадиях).


Постарайтесь абстрагироваться от рекламных обещаний, оцените сухой остаток, могущий остаться у вас после обучения, соотнесите его с тем перечнем, который мы только что обсуждали. Прикиньте соответствие скорости подачи материала на курсах и комфортную лично для вас скорость переваривания материала.


Не особо соблазняйтесь тем документом, который вам обещают выдать по окончанию учёбы, он (почти) никому не нужен, даже если это красивый и официальный диплом. В этом отношении IT похож на профессиональный спорт — ваш диплом будет осмотрен, отксерокопирован и учтён, но чтобы оценить вашу подготовку, вас обязательно попросят пробежать стометровку.
Кандидат, способный крутить на доске красно-чёрное дерево и аргументированно изложить свои взгляды на архитектуру хай-лоад апликаций, будет иметь огромное, просто непреодолимое преимущество перед претендентом с толстой стопкой бумаг, подтверждающих квалификацию, но без глубоких реальных знаний.


И, главное, не забывайте, IT (как, впрочем, и многие другие области знаний) — это бесконечная перманентная учёба, всё время нужно гуглить, читать книжки, советоваться с коллегами и думать, думать, думать.


Выведение


Что-то всплыло у меня тут одно воспоминание, со школьных времён, возможно, достаточно релевантное тем эмоциям, которые непривитый IT человек испытывает после ознакомления с озвученным выше списком.


Нас, школьников, в первый раз повезли в колхоз, на прополку овощей. Вместе с нами в поле послали одного представителя этого самого колхоза, для первичной постановки задачи (потом он уехал, оставив нас на попечение учителей).


— Ну что ж, ребятки, работа несложная, быстренько всё сделаете и поедете домой, — улыбаясь, уже заранее радуясь за нас, мелких городских недорослей, сказал представитель, — просто вырываете сорняки с корнем, отбрасываете их в сторону, а когда, — тут узловатый палец колхозника на не сильно подъятой руке обозначил впереди какой-то ориентир, — дойдете до того стога, то и всё, свободны, значит.


— До какого стога? — слегка засуетились мы. Поднимающееся утреннее солнце уже слегка припекало наши неокрепшие розовые шеи, намекая, как чудно было бы поскорее вернуться в относительно прохладное нутро автобуса, где нас ждали закупленные на школьные фонды сок и бутерброды с сыром.


Наши глаза забегали по земле впереди, надеясь выискать там стожок размером с муравейник, брошенный заботливой рукой человека, дальновидно рассудившего, что первый, тренировочный заезд на прополку овощей не должен быть излишне длительным, ибо может отбить у детишек желание помогать пригородным хозяйствам в будущем, а это было бы крайне непедагогично. Да где же этот стог?


Восклицание было непроизвольно произнесено вслух, овощевод понял наше затруднение, и всё так же улыбаясь, начал поднимать свою руку, пока она не образовала с туловищем идеально прямой угол.
— Да вон же стог, вон! — долгая секунда ушла на топологическую привязку дополнительных ориентиров, — за трактором!
Мы наконец перестали шарить глазами по грядкам, подняли головы и увидели ЕГО. Стог-монстр, больше похожий на стену средневекового замка, длиной метров сто и высотой этажа в три, немного скрытый утренней дымкой, развалился ровно на воображаемой линии горизонта. Его основание было слегка скрыто выпуклостью поля, проистекающей из шарообразности Земли, а крошечный трактор, контур которого размывали токи разогревающегося воздуха, выглядел так одиноко и беззащитно на фоне соломенного монстра, что чувствовалось, как печальная судьба этого брошенного дизельного малыша вполне может стать сюжетом следующего романа Стивена Кинга.


— До того стога дойдете, говорю, и всё, и свободны. — резюмировал сын бескрайних полей. — На сегодня хватит!


И что? Да, собственно, ничего. Мы всем классом, каждый в своей грядке, приняли позу, извеку знакомую всем пропалывателям урожая — сильный наклон, руки расслаблены, одна нога выдвинута вперёд, чтобы ловчее было тянуть сорнячину из земли и — пошли-пошли-пошли...


Уже в обед мы, уставшие, но довольные, смотрели на пролетающие за окнами автобуса поля, пили сок с бутербродами и наперебой обсуждали, что пейзане из нас получились хоть куды, и что при наличии присутствия такого мощного кадрового резерва, как городские школьники, временный тотальный недостаток техники никак не должон сказаться на урожае...


Собственно, сделать примерно то же самое я посоветовал бы и вам. Вхождение в IT займёт полтора-два года, и если поднимать голову и пытаться отследить свой прогресс после каждой написанной строчки, шея может очень скоро заболеть, а голова — утомиться. Посему — заварите себе кофе, откройте учебник, примите в кресле позу поудобнее, занесите руки над клавиатурой или над листом бумаги и — пошли-пошли-пошли...


И — может быть, если вы будете достаточно настойчивы, умны и чуточку везучи, то узнаете, что линяя горизонта вовсе не воображаема, что до неё можно дойти, опереться, положить на неё усталые руки и наконец воочию увидеть — что там, за горизонтом...


P.S. Крошечная просьба ко всем хабражителям: добавьте, по возможности, буквально пару строк в комментариях, как вы видите будущее IT и в какую сторону сейчас лучше развиваться. Наверняка, у многих из вас есть что сказать, но даже если пилить отдельную статью было бы как-то вроде лишка, то вот сейчас ваше мнение пришлось бы очень в тему. Почитает начинающий программист ваши комментарии, и, глядишь, составит более-менее целостную картину...
К тому же, я написал эту статью буквально за одну ночь, под влиянием бессонницы и надвигающегося выходного дня, так что материал поневоле зияет огромными лакунами. Всё дельное, что вы выскажете в комментариях, я постараюсь оперативно добавить в текст.

Комментарии (0)