Примечание. Это сообщение было впервые опубликовано на Bitshift

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

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

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

1. Изучите теоретические основы

Когда люди, которые хотят изучать программирование, спрашивают, с чего им начать, наиболее распространенный ответ в сети — «просто выберите язык и начните». Хотя на первый взгляд это не звучит как плохой совет, я считаю, что это хорошо только для людей, которые хотя бы немного знакомы с программированием и внутренней работой компьютера. Для начинающих спортсменов это палка о двух концах.

Хорошая сторона здесь в том, что это обеспечивает мгновенное удовлетворение. Любой может состряпать программу в стиле «Привет, мир» за несколько минут, а потом сказать: «Послушай, ма. Я программист".

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

Изучение этих основ — первое, что вы должны сделать, начиная свой путь программирования. Эти основы должны охватывать следующее:

  • Системы счисления — двоичная, восьмеричная, шестнадцатеричная. Вы должны быть в состоянии преобразовать число между этими 3 и десятичными числами. Изучите основные операции с двоичными числами, такие как сложение и вычитание.
  • Булевая алгебра — это теоретическая база цифровой электроники, а в более широком смысле — вычислительной техники. Вам не нужно вдаваться в подробности, но вы должны знать основные операции и законы, определенные в булевой алгебре.
  • Основы цифровой электроники — здесь я не говорю о переходе на транзисторный уровень, но вы должны быть знакомы с основными логическими вентилями и тем, как они комбинируются для формирования более сложных схем, таких как сумматоры.
  • Архитектура компьютера — опять же, здесь нет необходимости вдаваться в подробности. Но вы должны знать и понимать основные строительные блоки ЦП, как организована память и доступ к ней, как данные представлены внутри компьютера (положительные и отрицательные числа, числа с плавающей запятой, наборы символов)
  • Базовые блоки языков программирования — все языки программирования имеют общие структуры. Изучение их независимым от языка способом и умение их распознавать облегчит вам быстрое изучение любого языка программирования. Эти строительные блоки включают переменные, операторы, выражения, операторы, циклы, условные операторы и функции.

2. Изучите основы использования Linux

Хотя вы можете программировать в любой операционной системе (Windows, Mac OS X, Linux, BSD и т. д.), Linux занимает особое место в сегодняшнем мире разработки программного обеспечения.

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

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

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

Вы должны усвоить следующее:

  • Основные команды Linux для манипулирования файлами — копировать, перемещать, читать, редактировать файлы
  • Структура файловой системы Linux — узнайте о структуре каталогов и о том, какие файлы куда помещаются. Вам понадобятся эти знания, чтобы знать, где искать определенные файлы
  • Работа с архивами и сжатие — узнайте о TAR, GZIP, BZ2 как о наиболее часто используемых форматах архивов. Получите удобное создание и извлечение архивов
  • Управление программным обеспечением — научитесь устанавливать, обновлять и удалять пакеты программного обеспечения. Привыкните к работе с менеджерами пакетов, а также освойте установку программного обеспечения из исходного кода.
  • Оболочка — ознакомьтесь с концепцией оболочки, переменными среды, файлами конфигурации. Добавить новые команды в PATH
  • Базовые сценарии оболочки — научитесь писать простые сценарии оболочки для автоматизации простых задач. Это будет ваш первый опыт программирования

3. C как ваш первый язык программирования

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

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

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

Кроме того, согласно TIOBE, C является вторым по популярности языком программирования. Это означает, что для программистов на C существует много возможностей трудоустройства.

Вам не нужно становиться гуру C, но вы должны быть в состоянии изучить и понять следующее:

  • основные типы данных и структуры
  • работа с указателями, массивами и строками
  • ввод/вывод, потоки, чтение и запись файлов, прием пользовательского ввода
  • статические и динамические библиотеки, что это такое и как их использовать
  • уметь пользоваться компилятором и компоновщиком, собирать ПО из исходников

4. Базовые структуры данных и алгоритмы

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

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

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

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

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

  • Список — научитесь реализовывать список на основе динамического массива и связанных списков. Попрактикуйтесь в реализации одно- и двусвязных списков.
  • Стек — реализуйте свой собственный стек, используя только базовые операции, такие как push и pop.
  • Очередь — реализуйте как одностороннюю, так и двустороннюю очередь (где предметы можно забирать с обоих концов)
  • Хеш-таблица — при ее реализации вы также узнаете о хеш-функциях.
  • Heap — очень полезная структура для реализации алгоритмов сортировки и приоритетных очередей.
  • Дерево — это более общая форма кучи, и очень хорошее упражнение для ее реализации.

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

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

5. Объектно-ориентированное программирование с помощью Java

Объектно-ориентированное программирование (ООП) — наиболее часто используемая парадигма программирования в современном мире разработки программного обеспечения. Несмотря на критику и недостатки, это, безусловно, самая важная парадигма для изучения.

В качестве компаньона ООП вы должны изучать язык, основанный на ООП. Java — лучший выбор для этого. Это довольно простой язык для изучения, у него огромная экосистема и сообщество. Кроме того, это один из самых популярных языков в мире, на котором можно найти множество рабочих мест. И, поскольку Java в значительной степени основан на C (который вы изучали на предыдущих шагах, верно?), вам не составит труда изучить его.

В качестве дополнительного преимущества, как только вы освоитесь с Java, вы сможете легко подобрать другой язык программирования на основе JVM (Java Virtual Machine). Одними из самых популярных являются Kotlin, Scala и Clojure.

При изучении объектно-ориентированного программирования крайне важно понимать 4 столпа ООП:

Чтобы использовать эту теорию с пользой, вам нужно будет узнать, как эти теоретические концепции реализованы в Java. Вам нужно будет изучить и понять классы, интерфейсы, абстрактные классы, перегрузку и переопределение методов, приведение типов и т. д. Это в дополнение к основным концепциям программирования, которые вы изучили в C (переменные, циклы, условные операторы и многое другое).

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

  • Платформа коллекций — общие структуры данных для использования с коллекциями данных. Это также должно включать Stream API
  • Multithreading API — научитесь создавать и выполнять потоки, синхронизировать их, обмениваться состоянием и данными между ними
  • API ввода и вывода — изучите операции ввода-вывода, используя как блокирующие, так и неблокирующие API.
  • Инструменты сборки — Maven является стандартом де-факто, так что вам обязательно нужно его изучить. Если вам так хочется, вам также следует ознакомиться с Gradle.
  • по крайней мере, одна популярная IDE (интегрированная среда разработки) — IDE практически необходима для разработки Java, и вы должны хорошо с ней работать. Выберите между InteliJ IDEA, Eclipse или NetBeans.

6. Основы работы в сети

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

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

Для начального уровня вы должны изучить и понять следующее:

  • Уровни OSI — ознакомьтесь с сетевым стеком OSI, за что отвечает каждый уровень и как они сочетаются друг с другом.
  • TCP/IP stack — это, безусловно, самый широко используемый сетевой стек, и крайне важно хорошо его знать. Вы должны быть знакомы с:
  • TCP против UDP — знайте различия
  • Адреса IPv4 и IPv6, маска сети, шлюз по умолчанию
  • сети подсетей, CIDR, сетевые классы
  • что такое порт и сокет

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

  • DNS — «телефонная книга» интернета. Вы должны быть в состоянии описать, как работает DNS, и иметь возможность самостоятельно создавать записи DNS.
  • HTTP — это, безусловно, самый широко используемый протокол в Интернете. Вам не нужно вдаваться в мельчайшие подробности, но вы должны знать формат запроса-ответа, общие заголовки, согласование содержимого, кэширование и функции безопасности.
  • SSH — вы должны иметь возможность подключаться к серверам с помощью ключей SSH, безопасно копировать файлы с помощью SCP и настраивать клиентские подключения на своем компьютере.

Этого должно быть достаточно, чтобы подготовить вас к более сложным задачам разработки с использованием сетевых ресурсов.

7. Основы базы данных

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

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

Чтобы улучшить свои навыки, вы должны быть знакомы с обоими видами. Тем не менее, я советую вам сосредоточиться на реляционных базах данных и SQL.

Вы должны быть знакомы со следующими темами, касающимися реляционных баз данных:

  • как данные организованы в базах данных — таблицы, представления, индексы
  • отношения между данными — первичный ключ, внешний ключ, кардинальность (отношения «один к одному», «один ко многим», «многие ко многим»)
  • проектирование и нормализация базы данных (первая, вторая и третья нормальные формы)
  • Основы SQL — вставка, обновление и удаление данных, запросы, объединения, агрегация, группировка
  • познакомиться хотя бы с одним движком базы данных. Хороший выбор — MySQL, одна из самых популярных баз данных в мире.

Что касается нереляционных баз данных, здесь ситуация несколько иная. Нет установленного стандарта, но базы данных NoSQL подходят для конкретных случаев использования. Есть базы данных документов, базы данных ключ-значение, базы данных графов и так далее. Таким образом, трудно выбрать один, если вы не знаете точный вариант использования, над которым будете работать.

Возможно, лучший подход — изучить одну базу данных NoSQL, чтобы ознакомиться с различиями между реляционными и нереляционными базами данных. Например, Mongo DB — хороший выбор, так как это очень популярная база данных с открытым исходным кодом.

8. Основные концепции CI/CD

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

Хотя CI/CD не является частью разработки программного обеспечения, хороший программист должен быть знаком с основными понятиями и подходами к этой практике. Вы должны уметь настраивать простые конвейеры CI/CD для создания и развертывания своего кода.

В рамках этого шага вы должны узнать о следующем:

  • работа с git — научитесь настраивать репозиторий, настраивать хуки для запуска сборок, создавать и объединять пулл-реквесты
  • изучить хотя бы один инструмент CI. Хорошей отправной точкой является Jenkins, популярный инструмент CI с открытым исходным кодом. Он имеет отличную поддержку многих языков и инструментов сборки, и вы можете использовать его практически с любым языком.
  • работа с репозиториями артефактов — в репозиториях артефактов хранятся выходные данные сборки. Последним шагом сборки является развертывание артефакта сборки в репозитории. В зависимости от того, какой язык программирования вы используете, вы будете работать с различными типами репозиториев. Изучите тот, который в основном используется с вашим языком программирования.

9. Лучшие практики безопасности

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

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

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

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

Еще одно очень важное для разработчиков направление — работа с цифровыми сертификатами, SSL/TLS и инфраструктурой открытых ключей. Как разработчик, вы будете постоянно использовать сертификаты и ключи, и у вас должно быть четкое представление о том, как они работают.

Знакомство с лучшими практиками безопасности сделает вас намного лучшим программистом.

10. Виртуализация и облако

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

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

Вкратце, вы должны усвоить следующее:

  • гипервизор для запуска виртуальных машин. В этом случае Virtualbox является хорошей отправной точкой. Это бесплатный многоплатформенный программный пакет с открытым исходным кодом. Вы можете установить его на свой компьютер для разработки и запускать виртуальные машины с другой операционной системой.
  • контейнерная платформа — существует множество платформ для запуска контейнеров, но Docker является стандартом де-факто. Вы должны научиться создавать образы контейнеров Docker, запускать их, выставлять порты, создавать сети. Кроме того, как инструмент для оркестровки контейнеров, вы должны быть знакомы с Docker Compose.
  • как минимум один поставщик общедоступного облака — большая тройка — это AWS, Azure и Google Cloud Platform. Я рекомендую здесь AWS, так как он самый популярный из трех. У AWS есть уровень бесплатного пользования, на котором вы можете бесплатно тестировать большинство сервисов в течение 12 месяцев.

Если вы новичок в облаке, взгляните на этот пост Введение в облачные вычисления. Он ориентирован на новичков, которые хотят понять основы облачных вычислений.

Последние мысли

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

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

Я хотел бы услышать ваши мысли по этому поводу. Если у вас есть какие-либо вопросы, комментарии, мнения, просто отправьте комментарий, используя форму ниже. Буду рад ответить на любой комментарий.

Первоначально опубликовано на https://bitshifted.co 28 декабря 2021 г.