Есть много разных понятий для человека, который занимается программированием: кодер, разработчик, программист и т.д. Мне же больше по душе такое понятие, как инженер-программист или software engineer, т.к. данное понятие охватывает наибольшее количество тем и направлений, необходимых для разработки. Это лично моё виденье.
Так чем же принципиально software engineer отличается от остальных регалий? Ответ достаточно прост и очевиден - набором знаний о технологиях и большим кругозором в сфере, которой он себя посветил. Кроме того, сталкиваясь с какой-либо проблемой или задачей, он уже понимает какой подход нужен для её решения, или знает, что надо "подтянуть", чтобы быть компетентным в данном вопросе.
Т.к. на данный момент мой основной язык программирования Java, то и рассматривать данный вопрос я буду со стороны Java. Однако общая концепция хорошо ложится на другие языки с небольшой корректировкой "под себя".
Цель статьи привести - познакомить читателя с предлагаемым мною набором знаний. Ниже я привожу набор направлений и технологий, которыми должен обладать с теоретической и практической точки зрения software engineer.
Computer science
Информатика является основой всех знаний, которые нужны любому человеку, который занимается IT, независимо от роли. Информатика включает в себя основы многого из того, что я приведу здесь и является неким базисом и фундаментом для дальнейшего построения себя как специалиста IT. Изучая информатику, можно закрыть большинство общих вопросов, возникающих в процессе работы. Начинать свой путь я бы рекомендовал именно с этого направления. Приведу только часть тем, которые охватывает информатика:
математические основы
математическая логика
булева логика
информационная безопасность
теория основ баз данных
теория языков программирования и т.д.
Data structures and algorithms
Знания в области структур данных и алгоритмов являются следующим по значимости. По моему мнению решение любой задачи можно и нужно декомпозировать до мельчайших подзадач. А вот решение их уже сводится к выбору алгоритма и структуры данных. Уверенное владение алгоритмами, способность точно и быстро простроить путь до решения, а также понимание принципов действия структур данных позволит решать поставленные задачи с наименьшими трудозатратами и с наименьшей скоростью выполнения конечной программы.
Алгоритмы...
сортировки
поиска
рекурсия
Структуры данных...
массив
список
дерево
хеш-таблица
стек
очередь
куча
граф
Design patterns
Шаблоны проектирования являются более высоким уровнем абстракции после структур данных и алгоритмов и представляют собой устоявшиеся подходы к решению общих проблем проектирования системы. Основной плюс знания шаблонов проектирования - возможность общаться с коллегами на одном языке в разрезе подходов к решению той или иной проблемы проектирования. Однако следует понимать, что использование шаблона в коде ради шаблона является worst practice. Здесь необходимо знать:
GoF patterns (singleton, prototype, …)
J2EE patterns (intercepting filter, context object, …)
Architectural pattens (layed pattern, client-server pattern, …)
Software arhitecture styles
Для создания полноценных систем требуется знать и понимать типы построения их архитектуры. Знание стилей архитектуры программного обеспечения даёт возможность посмотреть на систему в целом, увидеть узкие места, определить технологии, которые можно использовать в том или ином узле, а также для из связи. На данный момент существуют следующие стили архитектур:
монолитный
микросервисный
сервис-ориентированный
бессерверный
Service models
Данная тема содержит в себе такие понятия, как "Программное обеспечение как услуга", "Платформа как услуга", "Инфраструктура как услуга". Все они связаны с предоставлением IT-платформы под разрабатываемое ПО. Знание этих моделей позволит принять взвешенное решение при выборе между созданием своей инфраструктуры или покупкой уже имеющейся. Ниже приведены общепринятые модели предоставления таких услуг:
IaaS
PaaS
SaaS
Development principles
Применение принципов разработки в своей практике кодирования позволяет писать чистый код. Стиль написания кода является почерком программиста. Чем он лучше, тем понятней становится. Код пишут один раз, а читают его гораздо больше, поэтому дайте другим возможность понять, что вы имели ввиду в своём коде. Набор общепринятых принципов разработки:
SOLID
KISS
YAGNI
DRY
TDD
DDD
BDD
Development methodologies
Методологии разработки являются частью более общего понятия процесса разработки программного обеспечения. Знания в этой области необходимы для понимания общего процесса и набора шагов, которые мы применяем для достижения конечной цели - работающего ПО. Сюда входят:
Agile
Waterfall
Extreme
Scrum
etc.
Programming paradigms
Знания парадигм программирования помогает в выборе подхода, а иногда и языка программирования для решения задачи. Кроме того, является хорошим тоном какие парадигмы присутствуют в языке, на котором вы пишите и как они там себя проявляют. Основные парадигмы:
императивная
декларативная
объектно-ориентированная
процедурная
функциональная
APIs
Знание актуальных на данный момент интерфейсов приложений позволит выбрать наилучшее решение взаимодействия компонент системы. Ниже приведен список таких API:
REST API
gRPC
Json API
GraphQL
SOAP
Gateways
OpenAPI
Swagger
HATEOAS
Web technologies
Важно понимать, какие веб-технологии на данным момент актуальны, какие набирают обороты, а какие устарели. К таким технологиям относятся:
Web 1.0
Web 2.0
Web 3.0
Authentication
Способы аутентификации и авторизации в приложение важно понимать по той простой причине, что это первая преграда, которая разделяет пользователя и вашу систему. Очень плохо, если аутентификация слишком сложна, слишком проста или непонятна. Это может оттолкнуть от вашей системы или быть дырой в безопасности. Важно выдерживать баланс между всеми аспектами, поэтому важно знать следующие механизмы аутентификации:
OAuth
JWT
SAML
OpenID
TCP/IP & OSI
Знание протоколов и моделей сетевого взаимодействия даёт понимание, как работает "общение" программ под капотом. Здесь не требуется от и до зубрить протоколы, важно понимать уровни, что происходит на них и какие протоколы используются. Ниже приведены основные слои моделей и основные протоколы:
TCP/IP
Application layer (HTTP, SMTP, FTP, SSH, …)
Transport layer (TCP, UDP)
Internet layer (DVMRP, ICMP, IGMP, …)
Network access layer (Ethernet, IEEE 802.11 WLAN, …)
OSI
Application layer (HTTP, SMTP, FTP, SSH, …)
Presentation layer (XDR, AFP, TLS, SSL)
Session layer (ISO 8327, RPC, PPTP, L2TP, …)
Transport layer (TCP, UDP, SCTP, …)
Network layer (IP, ICMP, IGMP, …)
Data link layer (Ethernet, PPP, X.25, …)
Physical layer
Servers
Большинство приложений запускаются и работают на серверах. Некоторые из них наиболее простые в применении и использовании, другие требуют специальной подготовки для использования и применяются для запуска больших промышленных приложений. Знать какой сервер использовать в тот или иной момент разработки ПО, а также какой в итоге будет использоваться в "проме", очень важно. Кроме того, важно понимать различия между ними. Основные сервера для Java-приложений:
Apache Tomcat
Jetty
Apache TomEE
Oracke WebLogic
Webshere Application Server
WildFly
GlassFish
Apache Geronimo
nginx
Operating systems
Операционная системы - неотъемлемая часть работы ПО. Очень важно понимать особенности ОС, на которой ваша система будет работать. Тут важно знать:
MS Windows
Unix and Unix-lise OS
Databases
Базы данных представляют собой набор данных, которые хранятся в электронном виде в компьютерной системе и управляются СУБД. Все приложения, которые работают с информацией, и должны каким-то образом её хранить, используют базы данных. Важно понимать разницу между той или иной БД, когда и какую лучше использовать, а также понимать их типы.
Типы БД:
реляционные
объектно-ориентированные
распределенные
графовые
хранилища данных
NoSQL
OLTP
Виды БД:
Postgres
MySQL
Oracle
MS SQL
Mongo DB
Dynamo DB
H2
HSQLDB
SQL
Язык структурированных запросов применяется для получения требуемого набора данных из БД. Знание SQL необходимо в основном для реализации CRUD операций в своих системах для дальнейшей её обработки и помещения в БД. Весь набор команд SQL делится на основные типы:
DDL (create, alter, drop, rename, truncate, comment)
DML (select, insert, update, delete, merge, call)
DCL (grant, revoke)
TCL (commit, rollback, savepoint, set transaction)
PL/SQL
IDE
Интегрированная среда разработки является основным инструментов в работе инженера-программиста. Отличное знание своего инструмента даёт большой прирост производительности в написании кода. Например, вместо того, чтобы искать нужный пункт меню, можно нажать сочетание горячих клавиш, что сократит поиск в разы. Основное, что нужно знать по IDE - доступные фичи, вспомогательные инструменты и дополнительные полезные плагины. Самые популярные среды разработки для Java:
IntelliJ IDEA
Eclipse
Netbeans
Control version system
Система контроля версий является неотъемлемой частью командной разработки. Основная её задача - хранение и предоставление истории кодовой базы проекта. В разных компаниях и в разных проектах могут использоваться разные системы контроля версий, поэтому важно иметь представление о нескольких:
CVS
SVN
Mercurial
Git
Backend
Здесь я применяю понятие backend, как набор языков программирования и их особенностей для написания серверной части приложения. К таким языкам относятся:
Java
Kotlin
Scala
Frontend
Здесь я применяю понятие frontend, как набор языков программирования, языков разметки и фреймворков для написания клиентской части приложения. К ним относятся:
HTML
CSS
Java Script
jQuery
Bootstrap
Angular
React
Vue.js
etc…
Scripting
Скриптовые языки программирования необходимы для автоматизации процессов, требуемых ручных действий. Очень важно понимать, что можно автоматизировать и ещё важнее понять, какой инструмент для этого лучше применить:
Bash
Batch
Python
Message brokers
Важно, чтобы ваши компоненты системы могли асинхронно общаться друг с другом. Для решения данной задачи были разработаны брокеры сообщений:
Apacke Kafka
RabbitMQ
ActiveMQ
Search engines
Поисковые движки необходимы вашей системе тогда, когда требуется быстро найти данные среди большого объема информации. К наиболее популярным относятся:
Apache Solr
Elacticsearch
MeiliSearch
Typesense
Containarization
Контейнеризация достаточно зрелая технология для виртуализации на уровне операционной системы. Самый распространенные и удобный инструмент сейчас является Docker.
Orchestration
Оркестровка позволяет упростить управление сложными задачами и процессами. На данный момент самыми популярным инструментами являются:
Kubernetes
k9s
Jenkins
В данной статье я постарался собрать все технологии, которые необходимо знать Java Software Engineer-у. Если что-то упустил или в чём-то был неточен, жду комментарием.