Обложка: Как стать разработчиком с нуля

Как стать разработчиком с нуля

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

Есть простой тезис: любую проблему можно решить, это лишь вопрос времени и денег. Но прежде чем осознать суть этого высказывания, придётся провести немало времени в поисковике Google. Будет много попыток что-то сделать, сломать или починить, а иной раз и понять, почему оно работает, хотя не должно.

В этом материале мы посмотрим, как стать разработчиком с нуля. Вы узнаете, какие основные направления существуют, какие знания и навыки требуются от разных специалистов.

Подробности — в видео и текстовой расшифровке под ним.

Востребованность на рынке труда

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

Востребованность разработчиков можно увидеть на примере вакансий на сайте HeadHunter. Разработчиков требуется больше, чем водителей, и тенденция роста сохраняется уже давно.

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

Что нужно знать, чтобы стать разработчиком

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

Разработка приложений

Сегодня абсолютное большинство систем работает по одному принципу. Разрабатывается серверная часть, которая выполняет основную функциональность. Для пользователей системы создаются отдельные клиентские приложения под различные платформы: десктоп, смартфоны, браузеры.

  • Серверная часть или backend состоит из приложений, хранилища данных и API для доступа к функциональности системы. Количество приложений и их взаимосвязи определяются архитектурой системы. Например, микросервисная архитектура — это набор слабосвязанных приложений.
  • API системы может быть построен на таких технологиях, как REST API, RPC, gRPC, GraphQL. Для первых проектов можно использовать REST API, который построен на протоколе HTTP. Впоследствии же выбор технологии организации API будет зависеть от конкретной системы и ее функционала.
  • Приложения бэкенда разрабатываются на различных языках программирования: Java, C++, Python, Golang, NodeJS, Ruby, PHP. Хотя сейчас идёт активное продвижение языка Golang, он не так хорош для создания сложной бизнес-логики. Советуем выбрать Java или Python, по ним много книг плюс есть большие сообщества.
  • Система практически не имеет смысла без хранения данных. Хранилища бывают SQL, NoSQL, документоориентированные, графовые и распределённые. Разработчик должен уметь спроектировать схему данных хранилища самостоятельно, исходя из предметной области системы.
  • Кроме написания кода для разработки бэкенда необходимы дополнительные знания работы серверных операционных систем Linux. Готовое приложение необходимо развернуть и запустить на сервере. Чтобы оно было доступно для клиентских приложений из интернета, необходимо ещё знать про веб-серверы. Например, уметь работать с NGINX. Это самый популярный веб-сервер.
  • Самыми популярными ОС являются CentOS, Debian и Ubuntu. Но недавно компания Red Hat выкупила CentOS. Жизненный цикл этой операционной системы закончится в конце 2021 года, так что выбирайте Debian или Ubuntu. Советуем начать с Ubuntu, так как по ней самое большое сообщество и очень много информации.
  • API системы должен быть доступен из интернета, чтобы клиентские приложения могли к нему обратиться. Поэтому необходимо понимать, как работает интернет, и иметь базовое представление о работе сетей. Вас интересуют такие технологии, как DNS, стек протоколов TCP/IP, HTTP и WebSocket. Также необходимо понимать, как работает браузер.

Разработчик, который занимается серверной частью, называется Backend-разработчиком. Обычно их ищут в связке с языком программирования, который используется в той или иной компании. Например Python Backend-разработчик.

Чтобы с системой могли взаимодействовать люди, нужны клиентские приложения. Они разрабатываются отдельно для каждой платформы: десктопа, смартфонов, веба.

  • Для десктопа есть вариации в виде операционных систем Windows, macOS, Linux. Основными языками для разработки нативного приложения под Windows являются C# и C++, но никто не мешает использовать также Python или Java, у которых есть соответствующие библиотеки. Для Linux обычно используется С или С++, а для macOS — ObjectiveC и Swift. Для разработки десктопного приложения необходимо понимание того, как устроена соответствующая операционная система, так как вы будете использовать её API. Есть кроссплатформенные фреймворки для написания приложения сразу под большинство ОС. Но тогда программа будет выглядеть одинаково и не будет нативной.
  • Мобильная разработка — это отдельная история со своим языком и экосистемой. Для Android разрабатываются приложения на C++, Java, Kotlin. Советую пробовать Kotlin. Это новичок среди тройки ЯП для Android, но он имеет крайне положительные отзывы. Для iOS необходимо изучить ObjectiveC или Swift, а также иметь установленную macOS и среду разработки XCode. Без этих компонентов разрабатывать под macOS не получится. Приложения под мобильные устройства и десктоп можно создавать и без бэкенда. Но тогда все вычисления должны происходить на устройстве, что ограничивает функциональность таких продуктов.
  • Для разработки под веб используются в основном следующие фреймворки: React.js, Vue.js и Angular. Рынок сейчас интересуют именно они. Все эти технологии построены на языке программирования JavaScript, который позволяет манипулировать веб-страницами, взаимодействовать с пользователями, посылать запросы и обрабатывать ответы от веб-сервера. Помимо языка и фреймворка необходимо разобраться с понятиями DOM и VirtualDOM, а также изучить HTML и CSS. Всё это позволяет создавать красивые, динамические ресурсы.

Так как фронтенд делает запросы в бэкэнд, разработчику необходимо уметь работать со всеми способами организации API, а также иметь представление о сетевых технологиях. Это то же, что требуется от Backend-разработчика, но в меньшей детализации. Специалист, который создаёт приложение под браузер, называется Frontend-разработчиком. А человек, который способен сам спроектировать систему, разработать и бэкенд, и фронтенд, называется Fullstack-разработчиком.

Machine Learning (ML) и Data Science

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

R и Python — основные языки программирования, которые используются для работы с большими массивами данных. В 2013 году в США  провели опрос среди специалистов в области Big Data для определения самого популярного языка. R победил, набрав 61 %. Второе место занял Python. Также недавно появился язык Julia. Он удобен, как Python, и эффективен, как R, но ещё молодой, поэтому для него не создано так много библиотек и инструментов.

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

Обработка больших данных появилась вместе с трендом Big Data. Например, в Яндексе есть отдельная вакансия аналитика. Это человек, который пишет скрипты на языке Python, делая выборки и обрабатывая миллиарды данных. На основе этих выборок строится аналитика и делаются выводы, которые влияют на принятие решений. В Яндексе даже создали специальное хранилище ClickHouse для хранения такого объёма данных.

Инфраструктура

Для любых приложений и систем требуются серверы, которые необходимо настраивать. Сложные системы используют также дополнительную инфраструктуру: хранилище кэша, очереди, системы мониторинга и оркестрации. Все эти продукты необходимо разворачивать и настраивать. Разработчик, который всё это делает, называется Software Engineer. В России это название непопулярно. Здесь такие вакансии называют DevOps, системный администратор или просто разработчик инфраструктуры.

Софтверный инженер — это разработчик, который может написать небольшое приложение, скрипты, облегчающие его задачи по конфигурированию продуктов и ОС. Обычно он использует bash, Python, реже Perl. Он умеет пользоваться инструментами автоматизации конфигурации, такими как Ansible, Chef, Puppet, разворачивает системы оркестрации — например, Nomad, Apache Mesos, Kubernetes, Docker Swarm.  По-хорошему ему необходимо иметь базовое представление обо всех продуктах и комплексных системах различных применений, например, мониторинга, сбора логов и метрик, серверов приложений, обработки очередей, системы Complex Event Processing и Stream Event Processing и так далее.

Как стать разработчиком: общий план развития

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

Например, вы решили стать Python Backend-разработчиком и хотите создать свой собственный сервис заметок, чтобы ваши записи хранились не у сторонней компании, а под вашим контролем у вас на сервере. Вы определились, что у вас будет  бэкенд с базой MongoDB и REST API. Теперь пришло время открыть туториалы по Python и перепечатать оттуда код, который поднимет у вас веб-сервер, создаст endpoint вашего REST API и будет отдавать текст Hello World. Потом открыть другой туториал по работе с MongoDB и понять, как из Python работать с базой данных.

Редактируйте код и смотрите на результат, делая выводы о внутреннем устройстве языка и кода. Через 10-20-100 итераций вы сможете создавать свои endpointы, которые будут записывать данные в БД. Попутно вы узнаете, что такое и из чего состоит HTTP-запрос. Повторяйте процесс до тех пор, пока не реализуете весь функционал своего приложения. Всегда задавайте себе вопросы: почему не работает, как сделать. Не забывайте читать профильную литературу и статьи, которые помогут узнать о новых возможностях языка или инструмента.

Когда разберётесь с синтаксисом и возможностями языка, начинайте думать о структуре вашего приложения и использовании паттернов программного проектирования. Это как раз тот момент, когда можно читать книгу по этой теме или прослушать курс обучения. Так вы будете уже понимать, о чём идёт речь, и сможете думать о том, как это применить в вашем проекте.

Итак, приложение создано, вы разворачиваете и запускаете его на удалённом сервере, оно работает. Но в какой-то момент на сервере проводятся технические работы, он перезагружается. Ваше приложение уже не работает, необходимо запускать его заново. Вы размышляете, как сделать так, чтобы приложение стартовало при запуске сервера. Гуглите, находите ответ в виде утилит systemd и supervisord, читаете описание и порядок использования, пытаетесь их внедрить, ловите кучу ошибок, опять читаете книги, статьи и в итоге всё успешно настраиваете. Вот первый опыт работы с ОС и первый решенный кейс. А теперь вы хотите, чтобы ваше приложение работало в Docker-контейнере, а потом хотите сделать асинхронный API. Теперь вы знаете, как этого добиться.

Советы для тех, кто только начинает свой путь разработчика

  1. Сразу скачивайте лучшую IDE для вашего языка. Правильное использование IDE ускоряет написание кода многократно за счёт использования горячих клавиш. Не убирайте руки от клавиатуры. Под большинство языков программирования есть IDE от компании JetBrains. В большинстве случаев у них есть бесплатная версия с ограниченным функционалом.
  2. Заведите записную книжку и записывайте туда все идеи, проблемы, чтобы потом проводить ретроспективу.
  3. Изучайте инструменты и технологии, которые вы используете, от А до Я.
  4. Идея первого домашнего проекта должна быть простой в реализации, потому что ничто так не мотивирует, как быстрый результат с минимальными усилиями — это закон Парето. Мотивация — это единственное, что вам нужно на начальном этапе.
  5. Найдите профильные чаты в телеграме или в социальной сети, общайтесь, задавайте вопросы.

Быть разработчиком — это значит уметь создать практически любой продукт с любым функционалом, решить любую проблему и задачу. Вопрос лишь во времени и деньгах.

Группа автора «ВКонтакте»TelegramTwitter.