Что должен знать Java Software Engineer

Kate

Administrator
Команда форума
Есть много разных понятий для человека, который занимается программированием: кодер, разработчик, программист и т.д. Мне же больше по душе такое понятие, как инженер-программист или 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

 
Сверху