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


AliExpress RU&CIS

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