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


  1. csl
    14.09.2021 17:22

    Вы под J2EE подразумеваете Java Enterprise Edition? Целесообразно ли в наши дни использовать сочетание JEE Jakarta Enterprise Edition?


    1. Dimasik_USA Автор
      14.09.2021 23:44
      +1

      В банковской сфере в основном она


  1. vlad4kr7
    14.09.2021 17:47
    +2

    Это хороший учебный план, но не "Что должен знать Java Software Engineer".

    У вас Java, только как один из языков "Backend", плюс фронт и devops в списке. Это Fullstack SD.

    A Maven, Gradle, Ant где?

    Я бы еще добавил Terraform и Azure devops pipelines.


    1. saboteur_kiev
      14.09.2021 18:28

      А еще вот это:

      Unix and Unix-lise OS

      А где тут Андроид, где java один из главных?
      И почему Unix, а не Linux? Юникса все меньше.


      1. Dimasik_USA Автор
        14.09.2021 23:47

        Согласен


    1. Dimasik_USA Автор
      14.09.2021 23:46

      Благодарю, добавлю


  1. dimuska139
    14.09.2021 18:01
    +11

    Вы просто перечислили всё, о чём где-то слышали? Ну, например, в разделе APIs у вас перечислены REST API, Gateways, OpenAPI и Swagger. Чем они различаются, не подскажете?

    Многие вещи, которые вы перечисляете в статье, java-разрабы вовсе не должны знать. Ну вот зачем им знать jQuery, например? Понятно, что любые знания ценны и где-то да пригодятся, но вы статью назвали "Что ДОЛЖЕН знать Java Software Engineer".


    1. dimaaannn
      14.09.2021 23:55

      Пропущен пункт, что всё это он должен знать за ЗП миддла )


  1. mc2
    14.09.2021 19:19

    Самое интересное что не описано, что он должен знать Java :) (это из личного опыта - много людей, которые программируют на Java, не знают как работает JVM)


    1. Dimasik_USA Автор
      14.09.2021 23:47

      В разделе backend


  1. avbochagov
    14.09.2021 19:52
    +3

    Просто оставлю тут это:


    Вакансия: водитель.
    Требования: профессиональные навыки в управлении легковыми и грузовыми автомобилями, троллейбусами, трамваями, поездами метрополитена и фуникулера, экскаваторами и бульдозерами, спецмашинами на гусеничном ходу, боевыми машинами пехоты и современными легкими/средними танками, находящимисяна вооружении стран СНГ и НАТО.
    Навыки раллийного и экстремального вождения обязательны. Опыт управления болидами «Формулы-1» — приветствуется. Знания и опыт ремонта поршневых и роторных двигателей, автоматических и ручных трансмиссий, систем зажигания, антиблокировочных систем, навигационных систем и автомобильных аудиосистем ведущих поизводителей — обязательны. Опыт проведения кузовных и окрасочных работ — приветствуется. Претенденты должны иметь сертификаты Mercedes, BMW, а также справки об участии в крупных международных ралли не более чем двухлетней давности.
    Зарплата: испытательный срок 1-3 месяца, зарплата по результатам собеседования.


  1. iboltaev
    14.09.2021 20:22

    Назвали Angular, но не назвали Spring, Hibernate, ... - это точно для джависта список?

    Protobuf-а еще нет.

    OLTP-базы - это реляционки обычно же. Наверное, OLAP все же имелся в виду.

    Хадупово-спарковский стек aka Hadoop/HBase/Spark/... тоже можно было бы до кучи, а что, Angular знать надо, а спаркохадуп - нет?


    1. Dimasik_USA Автор
      14.09.2021 23:48

      Согласен, можно капнуть глубже, прошелся по верхам


      1. dopusteam
        15.09.2021 06:55
        +3

        Добавьте знание русского языка в список


        1. KvanTTT
          15.09.2021 14:02
          +1

          Лучше английского.


  1. BugM
    14.09.2021 21:37
    +6

    Вы просто перечислили все баззворды которые нашли в интернете?


  1. shaman4d
    15.09.2021 17:22

    Странный список, а автор видимо ютуба обсмотрелся, роликов что должен знать джун чтобы войти в ойти.


  1. alexdoublesmile
    15.09.2021 18:22
    +1

    мух с котлетами понамешал тут, конечно)) просто программировать надо и развиваться, а не демагогией заниматься