Есть много разных понятий для человека, который занимается программированием: кодер, разработчик, программист и т.д. Мне же больше по душе такое понятие, как инженер-программист или software engineer, т.к. данное понятие охватывает наибольшее количество тем и направлений, необходимых для разработки. Это лично моё виденье.
Так чем же принципиально software engineer отличается от остальных регалий? Ответ достаточно прост и очевиден - набором знаний о технологиях и большим кругозором в сфере, которой он себя посветил. Кроме того, сталкиваясь с какой-либо проблемой или задачей, он уже понимает какой подход нужен для её решения, или знает, что надо "подтянуть", чтобы быть компетентным в данном вопросе.
Т.к. на данный момент мой основной язык программирования Java, то и рассматривать данный вопрос я буду со стороны Java. Однако общая концепция хорошо ложится на другие языки с небольшой корректировкой "под себя".
Цель статьи привести - познакомить читателя с предлагаемым мною набором знаний. Ниже я привожу набор направлений и технологий, которыми должен обладать с теоретической и практической точки зрения software engineer.
Алгоритмы...
TCP/IP
Типы БД:
habr.com
Так чем же принципиально 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, …)
- 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
Есть много разных понятий для человека, который занимается программированием: кодер, разработчик, программист и т.д. Мне же больше по душе такое понятие, как инженер-программист или software engineer,...
