YouIT

Идеальный базовый набор знаний каждого молодого программиста в независимости от специализации

1k   1   3   0 | Добавлено 155 дней назад  

Кто-нибудь может сосчитать количество существующих на сегодняшний день специализаций в разработке программного обеспечения? Java, .NET, Python, Ruby, iOS… Список можно продолжать. Даже в отдельно взятой специализации существуют разделения на более узкие специализации. Например, .NET можно разделить на веб, десктоп и мобильную разработки. Однако даже такое разнообразие направлений объединено немалым количеством общих концепций, методологий, шаблонов и инструментов, которые являются must know для молодых программистов в независимости от их специализации.


ООП, ФП и Шаблоны проектирования

Парадигмы объектно-ориентированного и функционального программирования и шаблоны проектирования относятся к категории фундаментальных знаний, то есть они не устаревают и не ограничены лишь одним языком программирования или фреймворком.

Ключевыми принципами объектно-ориентированного программирования, с которыми нужно разобраться побыстрее, являются Абстракция, Инкапсуляция, Полиморфизм, Наследование. Добавим сюда виды связей между объектами Композицию и Агрегацию, а также GRASP, где особое внимание нужно уделить принципам Сильного сцепления и Слабой связанности. Огромным плюсом также будет почитать о таких пяти принципах Объектно-ориентированного дизайна как SOLID.

Касательно шаблонов проектирования. Молодому разработчику достаточно разобраться с ключевыми GoF шаблонами, такими как Одиночка, Фабричный метод, Стратегия, Декоратор, Фасад, а остальные постигать по мере необходимости в процессе работы.

Несмотря на то, что вероятнее всего 95% читателей данной статьи используют или планируют использовать в своей работе исключительно объектно-ориентированные языки программирования, знание принципов функционального программирования будет огромным плюсом. Такие принципы ФП как Неизменяемость, Функции высшего порядка, Чистые функции не являются чем-то сложным и могут быть легко имплементированы в объектно-ориентированном коде, что только улучшит его качество.

Качество кода и Понятие рефакторинга

Существует немалое количество техник, шаблонов и инструментов, позволяющих получить качественный код. От молодого программиста обычно ожидают владением стандартами кодирования, правилами именования и форматирования кода используемого языка программирования. Также не менее важно понимать идею Рефакторинга, основных “Запахов кода” (Длинный метод, Длинный список параметров, Дублирование кода, Временное поле и другие), а также способов их устранения.

Большим плюсом для молодого программиста будет понимание процесса Код-ревью и его инструментов, а также понятия Статический анализ кода.

Алгоритмы и Структуры данных

Очередная фундаментальная тема. Знание структур данных и алгоритмов позволит писать код в наиболее оптимальный способ. Такой код будет быстро работать, эффективно используя ресурсы компьютера. Код, написанный с использованием алгоритмов и структур данных в конце концов будет выглядеть понятно и лаконично, что важно при работе в команде.

В качестве подтверждения слов выше, рассмотрим такую задачу: существует набор отсортированных в алфавитном порядке имен, в который нужно вставлять новые имена, сохраняя алфавитный порядок. Если решать задачу простым перебором от начала списка с целью найти подходящее место для вставки имени, то время выполнения будет в разы дольше, чем при использовании алгоритма Бинарный поиск.

К основным структурам данных относятся Массив, Список, Хеш-таблица, Стек, Очередь, Списки, Деревья, а к основным алгоритмам - Линейный поиск, Бинарный поиск, Алгоритмы сортировок и Алгоритмы поиска в деревьях (Поиск в ширину BFS и Поиск в глубину DFS). Добавим ко всему еще понимание сложности алгоритмов Big O нотацию и ее основные величины - O(1), O(log n), O(n) и O(n в квадрате).

Основы реляционных и нереляционных баз данных

На первых стадиях изучения реляционных баз данных (MySQL, PostgreSQL или MS SQL) начинайте с таких ключевых концепций как Таблицы, Первичные и Внешние ключи, Виды отношений (Один ко многим, Многие ко многим, Один к одному), Идея нормализации данных, Нормальные формы (Достаточно первые 3), Транзакции и свойства ACID.

После изучения вышеперечисленных концепций, посмотрите в чем заключается идея такого инструмента как Денормализация данных и как ее выполнять. Познакомьтесь с понятием и необходимостью NoSQL, а также с фундаментальными отличиями SQL от NoSQL.

Узнайте какие существуют инструменты доступа к данным ORM (например, NHibernate или Entity Framework) в вашем технологическом стеке и разберитесь с их основными возможностями.

Многопоточность и Асинхронное программирование

Асинхронное программирование и Многопоточность являются мощными инструментами, которые помогут программисту значительно эффективнее использовать ресурсы операционной системы. Однако оба инструмента сложны в использовании и требуют осторожного c ними обращения. По этой причине от молодых программистов обычно ожидают понимания следующих базовых концепций: 1) Отличие Многопоточности от Асинхронного программирования и необходимость их применения, 2) Понимания терминов Процесс, Поток, Пул потоков 3) Понимание идеи синхронизации потоков и знание простых конструкций синхронизации.

Функциональные и не функциональные требования

На первый взгляд вопрос требований к программным продуктам (Software Requirments) выглядит достаточно простым и очевидным для молодых программистов: заказчик должен предоставить полные, точные, непротиворечивые требования к программе, которую он рассчитывает получить. Однако очевидно все только с таким видом требований, как функциональные требования (например, по какой формуле программа должна рассчитывать доход; должно ли отправляться письмо с подтверждением заказа и т.д.). Но существует иная категория требований - нефункциональные требования, примерами которых являются Быстродействие, Доступность, Масштабируемость и многие другие. Такие требования заказчик, как человек нетехнический, часто может просто не документировать.

Безусловно, определением нефункциональных требований занимаются технические лидеры проекта или архитекторы. Однако молодому программисту хорошо бы знать о существовании нефункциональных требований, чтобы не думать, что если в описании функционала отсутствует, например, четкое требование по времени отклика при нажатии гиперссылки, то такое время может быть каким угодно долгим.

Техники оценки времени выполнения работ (Эстимации)

Уже с первых дней работы программисты сталкиваются с необходимостью эстимировать свою работу. Отличным способом дать приближенную к реальной оценку времени выполнения своей работы будет использование техники Оценки по аналогии (Analogy-based Estimation). То есть программист дает эстимейт, используя свой предыдущий опыт решения подобных задач. Молодые программисты без большого опыта за плечами не смогут эффективно использовать данную технику. Поэтому необходимо знать и использовать другие техники: Декомпозиция, 3-Point эстимейт либо “попросить коллегу с опытом помочь вам с эстимейтом”.

Плюсом будет понимание техники оценки в Стори-поинтах и в чем отличия от оценки в человеко-часах/идеальных часах. Также не будет лишним понимать к каким последствиям приводят заниженные или завышенные эстимейты.

Методологии разработки ПО

Разработка программного обеспечения, как и разработка чего угодно сложного, выполняется по определенным общепринятым процессам. Такие процессы делят весь путь разработки ПО на определенные стадии, определяют условия перехода из одной стадии в другую, описывают как часто участники разработки должны коммуницировать друг с другом и так далее. К популярным методологиям сегодня относят Scrum и Kanban. Методология Scrum больше полезна при активной разработке новых проектов, а Kanban для поддержания существующих. Обе методологии относятся к семейству гибких (Agile) методологий.

В чистом виде методологии Scrum и Kanban могут не использоваться. Часто проекты адаптируют их под свои реалии, вместо слепого следования учебникам. Также не редко на практике совмещают методологии Scrum и Kanban с целью выжать лучшее из обеих.

Перед началом знакомства с методологиями Scrum и Kanban, необходимо ознакомиться со стадиями разработки программного обеспечения, такими как Сбор требований, Проектирование, Написание кода, Тестирование, Развертывание, Поддержка. Также будет плюсом знакомство с методологией Waterfall и разбор ее слабых сторон.

Использование системы контроля версий

Система контроля версий (например, Git) является таким инструментом, который программист обычно начинает использовать с первого дня работы в IT-компании. Следовательно, понимание принципов работы систем контроля версий может сэкономить вам много времени и нервов. Разберитесь с фундаментальными концепциями системы Git, к которым относятся Repository, Branch, Working Copy, Commit, Pull, Fetch, Push, Pull Request. Разберитесь с причинами возникновения merge-конфликтов и способами их устранения.

Большим плюсом будет понимание разницы между Централизованными и Распределенными системами контроля версий, а также какими конкретно инструментами они представлены на рынке.

Другое

Если вы закончили с изучением всего вышеперечисленного или просто не нашли там для себя ничего нового, то посмотрите в сторону еще нескольких тем, которые с вероятностью 99% коснутся вас при программировании на .NET, Java, Python и других:

  • Принципы юнит-тестирования: черные, белые, серые ящики; понятия test suite и test case; принципы F.I.R.S.T.; виды тестовых заглушек...
  • Безопасность данных, Криптография: Концепции аутентификации и авторизации, Алгоритмы шифрования данных (Симметричное и Ассиметричное шифрование), OWASP...
  • Компьютерные сети и Протоколы: Понимание моделей OSI и TCP/IP, Понимание HTTP протокола и модели Клиент-Сервер; HTTP vs HTTPS; Понимание DNS; Понимание FTP протокола...

Счастливого обучения!


Похожие статьи

Комментарии (1)

Авторизируйтесь для участия в дискуссии

Google Facebook ВКонтакте
Артём Скрябин
Артём Скрябин 150 дней назад
Благодарю, очень полезная статья. Продолжайте ...!!
0   0
Комментировать
Не комментировать
работа программиста качество кода IT-компания обучение программированию карьера собеседование C# сертификация джуниор алгоритмы ООП энтерпрайз .NET тестирование javascript программирование эстимейты roadmaps информатика фан быстродействие базы данных