Есть много разных понятий для человека, который занимается программированием: кодер, разработчик, программист и т.д. Мне же больше по душе такое понятие, как инженер-программист или 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-у. Если что-то упустил или в чём-то был неточен, жду комментарием.
ссылка на оригинал статьи https://habr.com/ru/articles/577888/
Добавить комментарий