Есть много разных понятий для человека, который занимается программированием: кодер, разработчик, программист и т.д. Мне же больше по душе такое понятие, как инженер-программист или 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-у. Если что-то упустил или в чём-то был неточен, жду комментарием.
Комментарии (18)
vlad4kr7
14.09.2021 17:47+2Это хороший учебный план, но не "Что должен знать Java Software Engineer".
У вас Java, только как один из языков "Backend", плюс фронт и devops в списке. Это Fullstack SD.
A Maven, Gradle, Ant где?
Я бы еще добавил Terraform и Azure devops pipelines.
saboteur_kiev
14.09.2021 18:28А еще вот это:
Unix and Unix-lise OS
А где тут Андроид, где java один из главных?
И почему Unix, а не Linux? Юникса все меньше.
dimuska139
14.09.2021 18:01+11Вы просто перечислили всё, о чём где-то слышали? Ну, например, в разделе APIs у вас перечислены REST API, Gateways, OpenAPI и Swagger. Чем они различаются, не подскажете?
Многие вещи, которые вы перечисляете в статье, java-разрабы вовсе не должны знать. Ну вот зачем им знать jQuery, например? Понятно, что любые знания ценны и где-то да пригодятся, но вы статью назвали "Что ДОЛЖЕН знать Java Software Engineer".
mc2
14.09.2021 19:19Самое интересное что не описано, что он должен знать Java :) (это из личного опыта - много людей, которые программируют на Java, не знают как работает JVM)
avbochagov
14.09.2021 19:52+3Просто оставлю тут это:
Вакансия: водитель.
Требования: профессиональные навыки в управлении легковыми и грузовыми автомобилями, троллейбусами, трамваями, поездами метрополитена и фуникулера, экскаваторами и бульдозерами, спецмашинами на гусеничном ходу, боевыми машинами пехоты и современными легкими/средними танками, находящимисяна вооружении стран СНГ и НАТО.
Навыки раллийного и экстремального вождения обязательны. Опыт управления болидами «Формулы-1» — приветствуется. Знания и опыт ремонта поршневых и роторных двигателей, автоматических и ручных трансмиссий, систем зажигания, антиблокировочных систем, навигационных систем и автомобильных аудиосистем ведущих поизводителей — обязательны. Опыт проведения кузовных и окрасочных работ — приветствуется. Претенденты должны иметь сертификаты Mercedes, BMW, а также справки об участии в крупных международных ралли не более чем двухлетней давности.
Зарплата: испытательный срок 1-3 месяца, зарплата по результатам собеседования.
iboltaev
14.09.2021 20:22Назвали Angular, но не назвали Spring, Hibernate, ... - это точно для джависта список?
Protobuf-а еще нет.
OLTP-базы - это реляционки обычно же. Наверное, OLAP все же имелся в виду.
Хадупово-спарковский стек aka Hadoop/HBase/Spark/... тоже можно было бы до кучи, а что, Angular знать надо, а спаркохадуп - нет?
shaman4d
15.09.2021 17:22Странный список, а автор видимо ютуба обсмотрелся, роликов что должен знать джун чтобы войти в ойти.
alexdoublesmile
15.09.2021 18:22+1мух с котлетами понамешал тут, конечно)) просто программировать надо и развиваться, а не демагогией заниматься
csl
Вы под J2EE подразумеваете Java Enterprise Edition? Целесообразно ли в наши дни использовать сочетание JEE Jakarta Enterprise Edition?
Dimasik_USA Автор
В банковской сфере в основном она