7. Проект - о разделе
О разделе
Как мы уже выяснили, разработка в IT - процесс широкий и комплексный, и он охватывает множество направлений, включая как разработку, аналитику и тестирование, так и проектирование, маркетинг и управление.
Представим себе ситуацию. Вы - бизнесмен, которому нужно обеспечить автоматизацию процесса согласования договоров в организации. К этой идее вы пришли либо самостоятельно, либо увидели на форуме презентацию новой технологии. Но у вас строительная компания, и вам нужна помощь профессионалов!
Так, вас судьба привела к договору на оказание услуг по разработке информационной системы силами исполнителя. Этим исполнителем оказывается некая IT-компания, у которой всё чётко поставлено и организовано. И эта организация управления проектами в сфере информационных технологий является таким же специфичным для отрасли стилем, как и ведение проектов в строительстве, или финансовой сфере.
Общий поток всегда один:
Договоренность - Выполнение работ/оказание услуг - Сдача результата в срок.
И чтобы сдать результат в срок в строгом соответствии с условиями договора, нужно внутри организации-исполнителя грамотно поставить "конвейер" поставки продуктов. Для этого мы должны собрать команду, которая включает в себя руководителя проекта (с которого будем требовать), всех сопутствующих обслуживающих менеджеров и специалистов (эксперты, финансисты, бухгалтера, экономисты, юристы, маркетологи, администраторы, безопасники и прочие важные спецы), и самое главное - команду разработки.
В этой команде разработки мы должны включить несколько важных категорий:
- Архитектор системы. Он должен будет, по договорённости с руководством и с заказчиком-бизнесменом, обсудить единую общую картину, как всё должно работать в результате, и именно ему предстоит всё распределить, спроектировать, и подготовить итоговое крупное видение всех элементов системы. Он проектирует набор инструментов, языков, протоколов, способов интеграции, согласует коммуникации и тому подобное, абсолютно так же, как главный архитектор здания. Это, как можно понять, должен быть самый грамотный специалист, с большим опытом работы, ведь именно его ошибка будет стоить максимально дорого. Если ошибается архитектор в выборе технологии или подхода, вся система будет не соответствовать ожиданиям и это очень, очень плохо.
- Аналитики. Тут могут быть разные ребята - бизнес-аналитики, системные аналитики, аналитики данных, но они объединены единой целью - разобраться, и детализировать конкретные направления, которые решил архитектор. Ошибка аналитика является второй по приоритетности, так как он должен изучить логику, и если реализация будет хромать из-за него, придётся откатываться назад по целому направлению.
- Разработчики. Это "строители", которые будут строить по проекту и анализу, как по чертежам. Это глубокие технические специалисты, которые сами разберутся с кодом и низкоуровневыми проблемами, но при этом они не лезут в выбранные решения по технологиям и реализациям. Аналитиком сказано, что нужно сделать так - разработчик сделает именно так, как сказано, так как он не видит всей картины. Пример со строителями - они положат бетонные плиты и кирпичи именно там, где сказано в проекте, их обязанность - соблюдать точность, ведь они не знают всей задумки. Сказано на 5 сантиметров выше - значит делаем так. Если это плохое решение, отвечать будет тот, кто выставил требование. Ошибку разработчика можно исправить, попросить переделать, пофиксить баг, изменить код, переписать и улучшить. Так что она третья в приоритете.
- Тестировщики. Это те, кто проверит, точно ли в соответствии с требованиями реализована работа программы. Словом, точно ли там 5 сантиметров? По приоритетности ошибки тестировщика спорно. По идее, это четвертый приоритет, но всё же могут быть ситуации и критичные. С одной стороны, если ошибка допущена, и не замечена тестировщиком, то она всё равно есть, и выплывает позже рано или поздно, и её останется лишь исправить. Если это ошибка разработчика. Ошибку аналитика или архитектора тестировщик лишь выявит/не выявит, но природа ошибки, как её приоритет, сохранится за ответственными лицами. Поэтому ответственность тестировщика равнозначная любому проверяющему - если пропустить важный момент, то ошибка тестировщика лишь сохранит чужую ошибку. Можно сказать, что тестировщик это второй шанс, спасительная инстанция, которая может в перспективе защитить от убытков. Многие IT-компании (особенно в игровой индустрии) высший приоритет ставят именно тестированию, чтобы ничего не упустить.
И в этой книге мы должны будем разобраться, как всем этим "хозяйством" грамотно управлять. Нужно узнать, как проектируются системы - паттерны проектирования, принципы SOLID, архитектурные стили (монолит, микросервисы), а также как работать аналитику, тестировщику, как работать с задачами и документацией. Если вы менеджер или планируете управлять командой в дальнейшем, вам неизбежно придётся изучить всю внутреннюю кухню работы над проектом.
Проекты бывают разные, порой они требуют глубокого изучения предметной области, а порой представляют собой уже кем-то созданный проект, который надо "подхватить" и вытащить из болота. Тогда перед нами открывается новая проблема - когда кто-то уже сделал работу, а нам придётся в ней разобраться. Это мы тоже разберём, изучив культуру кода, хороший тон, соглашения, и конечно легаси-код, как работать с чужим кодом.
Здесь сосредоточимся на команде, процессе и ответственности. В реальном мире заказчик не спросит, как мы написали код, нас спросят, решена ли задача.
Помните - вас нанимают не потому что вы умный или хороший, а потому что вы решаете проблему заказчика/работодателя.
Общее о бизнесе
- 7.01. Основы бизнеса в IT-проектах
- 7.01. Модели IT-бизнеса
- 7.01. Договор и приёмка глазами разработчика
- 7.01. Бизнес-логика
- 7.01. Управление бизнесом
- 7.01. Общее о бизнесе — итоги
- 7.01. Общее о бизнесе — чек-лист
Команда и управление
- 7.02. Основы управления IT-проектами
- 7.02. Культура уважения к инженерному труду
- 7.02. Цифровая трансформация организаций
- 7.02. Командная работа в разработке ПО
- 7.02. Роли и функции менеджмента в IT
- 7.02. Эффективное управление разработчиками
- 7.02. Роль тимлида — ожидания, риски и выбор траектории
- 7.02. Компетенции в управлении проектами
- 7.02. Microsoft Project — планирование и контроль графика
- 7.02. BOK, PMBOK и прочие «бабоки» — своды знаний в IT-проектах
- 7.02. Ежедневные стендапы и коммуникация
- 7.02. Оценка трудозатрат
- 7.02. Как общаться с бизнесом
- 7.02. Первые 90 дней тимлида
- 7.02. Встречи один на один (1-on-1)
- 7.02. Мотивация команды для руководителя
- 7.02. Найм в команду разработки — портрет и вакансия
- 7.02. Команда и управление — итоги
- 7.02. Команда и управление — чек-лист
Методология и жизненный цикл ПО
- 7.03. Жизненный цикл программного обеспечения
- 7.03. Методологии разработки государственных ИТ-систем
- 7.03. Agile — гибкая методология разработки
- 7.03. Как выбрать процесс разработки под контекст
- 7.03. Extreme Programming, TDD и BDD
- 7.03. Методология и жизненный цикл ПО — итоги
- 7.03. Методология и жизненный цикл ПО — чек-лист
Аналитика
- 7.04. История развития аналитики в IT
- 7.04. Основы анализа требований
- 7.04. Профессиональная аналитика
- 7.04. Роль бизнес-аналитика в проекте
- 7.04. Роль системного аналитика в разработке
- 7.04. Исследование и декомпозиция систем
- 7.04. Формализация и управление требованиями
- 7.04. Документация аналитика
- 7.04. Типы технической и пользовательской документации
- 7.04. Confluence
- 7.04. Создание руководств и инструкций
- 7.04. Дополнительные виды проектной документации
- 7.04. Документация в процессах
- 7.04. Артефакты аналитической деятельности
- 7.04. Моделирование бизнес-процессов
- 7.04. Прототипирование интерфейсов и сценариев
- 7.04. Инструменты аналитика
- 7.04. Взаимодействие аналитика с командой
- 7.04. Технический дизайн на основе требований
- 7.04. Справочник по нотации BPMN 2.0
- 7.04. BPMN-движки Camunda и Flowable
- 7.04. Аналитика — итоги
- 7.04. Аналитика — чек-лист
- 7.04. Как переводить бизнес-задачи на язык данных
- 7.04. SQL для аналитики
- 7.04. Основы продуктовой аналитики
- 7.04. Основы диаграмм и моделирования
Тестирование программного обеспечения
- 7.05. Основы тестирования программного обеспечения
- 7.05. Тестирование и анализ API
- 7.05. Добро пожаловать в тестирование
- 7.05. Классификация видов тестирования
- 7.05. Жизненный цикл тестирования
- 7.05. Артефакты качества в проекте
- 7.05. End-to-End и системное тестирование
- 7.05. Автоматизация тестирования
- 7.05. Последовательность этапов тестирования
- 7.05. Объекты и уровни тестирования
- 7.05. Инструменты для ручного и автоматизированного тестирования
- 7.05. Документация тестировщика
- 7.05. Юнит-тестирование
- 7.05. Интеграционное тестирование
- 7.05. Нагрузочное и стресс-тестирование производительности
- 7.05. Тестирование информационной безопасности
- 7.05. Особенности тестирования мобильных приложений
- 7.05. Мутационное тестирование
- 7.05. Покрытие кода и метрики полноты тестирования
- 7.05. Техники проектирования тестов
- 7.05. Ручное тестирование веб-приложений
- 7.05. SQL для тестировщика
- 7.05. White-box — тестирование потоков управления и данных
- 7.05. Unit, Integration, UI, E2E, TDD и BDD
- 7.05. Основы тестирования веб-приложений — маршрут для QA
- 7.05. Тестирование программного обеспечения — итоги
- 7.05. Тестирование программного обеспечения — чек-лист
- 7.05. Подготовка среды и создание первого теста
- 7.05. Проверка взаимодействия компонентов
- 7.05. Проверка пользовательского сценария
- 7.05. Проверка надежности под нагрузкой
- 7.05. Практикум Java — JUnit и REST Assured
- 7.05. Практикум JavaScript — Playwright и Jest
- 7.05. Selenium
- 7.05. Playwright
- 7.05. Самовосстанавливающиеся тесты
- 7.05. Инструменты с низким кодом для тестирования
- 7.05. Тестирование нейроморфных систем
- 7.05. Дополнительные модули для тестировщика
Проектирование и архитектура
- 7.06. Основы проектирования и архитектуры программного обеспечения
- 7.06. Масштабируемость и параллелизм в системном проектировании
- 7.06. Практика архитектурного проектирования
- 7.06. Архитектурные стили и их применение
- 7.06. Стили внутренней организации кода
- 7.06. Принципы компонентно-ориентированной архитектуры
- 7.06. Стратегии декомпозиции монолитных систем
- 7.06. Влияние инфраструктуры на архитектурные решения
- 7.06. Классификация типов классов в объектно-ориентированном проектировании
- 7.06. Построение систем на основе классов и объектов
- 7.06. Доменная модель
- 7.06. Паттерны проектирования
- 7.06. Системный подход и системное мышление
- 7.06. Роль и практика архитектора программного обеспечения
- 7.06. 12 концепций архитектуры распределённых систем
- 7.06. Алгоритмы выбора лидера в распределённых системах
- 7.06. System Design — карта тем и подготовка
- 7.06. Email-рассылка как распределённая система
- 7.06. Асинхронная обработка данных в высоконагруженных системах
- 7.06. Проектирование и архитектура — итоги
- 7.06. Проектирование и архитектура — чек-лист
- 7.06. Типы классов в DDD
- 7.06. Имитационное моделирование
- 8.00. Основы развития информационных систем
Проектирование и архитектура
- 7.06. Обзор паттернов проектирования
- 7.06. Порождающие паттерны
- 7.06. Структурные паттерны
- 7.06. Поведенческие паттерны
- 7.06. Архитектурные паттерны
- 7.06. Паттерны интеграции внешних систем
- 7.06. Паттерны проектирования доменных моделей
- 7.06. Стратегия в C#
- 7.06. Итератор в C#
- 7.06. Фабрика в C#
- 7.06. Команда в C#
- 7.06. Наблюдатель в C#
- 7.06. Цепочка обязанностей в Java
- 7.06. Итератор в Java
- 7.06. Посредник в Java
- 7.06. Мементо в Java
- 7.06. Команда в Java
- 7.06. Наблюдатель в Java
- 7.06. Proxy в Java
- 7.06. Фасад в Java
- 7.06. Builder в Java
- 7.06. Bridge в Java
- 7.06. Composite в Java
- 7.06. Decorator в Java
- 7.06. Prototype в Java
- 7.06. Abstract Factory в Java
- 7.06. Factory Method в Java
- 7.06. Adapter в Java
- 7.06. Singleton в Java
- 7.06. Strategy в Java
- 7.06. GoF в Java - большой гид
- 7.06. Частые паттерны GoF
- 7.06. Принципы перед паттернами
- 7.06. Составные паттерны и MVC
- 8.00. Основы развития информационных систем
Проектирование
- 7.06. Проектирование программных систем
- 7.06. Проектирование распределенных систем
- 7.06. Проектирование баз данных
- 7.06. Проектирование API и интеграций
- 7.06. Паттерны микросервисной архитектуры
- 7.06. Проектирование веб-разработки
- 7.06. Хранилища DWH и ETL-процессы
- 7.06. Уровни развития API и модель Ричардсона
- 7.06. Методы и ключ идемпотентности
- 7.06. Подходы к проектированию
- 7.06. Принципы проектирования
- 7.06. Проектирование сервисов и методов
- 7.06. Проектирование функциональных UI
- 7.06. Проектирование под нефункциональные требования
- 7.06. Документация как инструмент проектирования
- 7.06. Публичный API, OAuth 2.0 и webhooks
- 7.06. mTLS, JWS-подпись webhooks и AsyncAPI с outbox
- 7.06. Лестница проектирования систем
- 7.06. Вертикальное масштабирование
- 7.06. Горизонтальное масштабирование
- 7.06. Горизонтальное дублирование
- 7.06. Competing Consumer Pattern
- 7.06. Read Replicas
- 7.06. Shared Nothing Architecture
- 7.06. Shared Storage Architecture
- 7.06. Single Node architecture
- 7.06. Модельная архитектура микросервисов
- 7.06. Стратегии совместного использования кода в микросервисах
- 7.06. CQRS
- 7.06. Event Sourcing
- 7.06. Saga
- 7.06. Strangler Fig
- 7.06. Модульный монолит
- 7.06. Событийно-ориентированная архитектура
- 7.06. Сервисно-ориентированная архитектура
- 7.06. Пространственная архитектура
- 7.06. Архитектура конвейера
- 7.06. Одноранговая архитектура
- 7.06. Чистая архитектура
- 7.06. Многоуровневая архитектура
- 7.06. Надежность и доступность
- 7.06. Уровни SLA и реальное время простоя
- 7.06. Инженерия устойчивости
- 7.06. Масштабирование чтения и записи в веб-приложении
- 7.06. Стратегии работы с базами данных при разных нагрузках
- 7.06. GRASP и паттерн ADR для веб-бэкенда
- 7.06. Event Storming — совместное проектирование домена
- 7.06. Оценка архитектурных альтернатив
- 7.06. Threat modeling для архитекторов
- 7.06. Clean Architecture на ASP.NET Core
- 7.06. Паттерны перехода от монолита к микросервисам
Интеллектуальные права
- 7.07. Права интеллектуальной собственности в IT
- 7.07. Коммерческая тайна и защита исходного кода
- 7.07. Регистрация авторских прав и патентов
- 7.07. Юридические соглашения в разработке ПО
- 7.07. Лицензирование программного обеспечения
- 7.07. Передача прав и наследование цифровых активов
- 7.07. Цифровые активы
- 7.07. Интеллектуальные права — итоги
- 7.07. Интеллектуальные права — чек-лист
- 7.07. Механизмы лицензионных ключей и активации
Техническое письмо
- 7.08. Техническое письмо
- 7.08. Документирование API с использованием Swagger/OpenAPI
- 7.08. Стилевые паттерны технической документации
- 7.08. Техническое задание по ГОСТ
- 7.08. Спецификация по ГОСТ
- 7.08. ПМИ по ГОСТ
- 7.08. ПЗ по ГОСТ
- 7.08. Руководство системного программиста по ГОСТ
- 7.08. Руководство программиста по ГОСТ
- 7.08. Руководство оператора по ГОСТ
- 7.08. Руководство по техническому обслуживанию по ГОСТ
- 7.08. Руководство пользователя по ГОСТ
- 7.08. Руководство администратора по ГОСТ
- 7.08. Навигатор по нормативной документации
- 7.08. Техническое письмо — итоги
- 7.08. Техническое письмо — чек-лист
- 7.08. Документация
- 7.08. Виды документации
- 7.08. Технический писатель
- 7.08. Качество документации
- 7.08. Архитектура документации
- 7.08. Экосистема технического письма
- 7.08. Word и Excel в проектной документации
Базы знаний и задачники
- 7.09. Базы знаний в IT-проектах
- 7.09. Системы управления задачами и баг-трекинг
- 7.09. Организация внутренней Wiki
- 7.09. Jira, YouTrack и настройка трекера
- 7.09. Wiki, Confluence и структура базы знаний
- 7.09. ADR и docs-as-code
- 7.09. Онбординг-пакет в базе знаний
- 7.09. Docusaurus
- 7.09. Базы знаний и задачники — итоги
- 7.09. Базы знаний и задачники — чек-лист
Культура кода
- 7.10. Культура написания и поддержки кода
- 7.10. Цикломатическая сложность и читаемость кода
- 7.10. Культура кода — итоги
- 7.10. Культура кода — чек-лист
- 7.10. MAPPER — модель кода и предметная область
- 7.10. Анемичные модели и примитивная одержимость
- 7.10. Изменяемость, побочные эффекты и неизменяемые данные
- 7.10. Условия, null и явные контракты
- 7.10. Связанность, глобалы и запахи модульности
- 7.10. YAGNI, быстрый провал и техдолг в коде
- 7.10. Тесты как часть культуры кода
- 7.10. Исключения и обработка ошибок в читаемом коде
- 7.10. Справочник тем чистого кода
- 7.10. Декларативный код — что и как
Легаси-код
- 7.11. Что такое легаси и как его узнать
- 7.11. Понимание легаси-системы
- 7.11. Безопасные изменения в легаси
- 7.11. Стратегии модернизации легаси
- 7.11. Легаси-код — итоги
- 7.11. Легаси-код — чек-лист
Конструирование ПО
- 7.12. Конструирование ПО — понятие, жизненный цикл, стандарты
- 7.12. Связность и сцепление модулей
- 7.12. Модели жизненного цикла для конструирования
- 7.12. Планирование конструирования — PERT, CPM, оценки
- 7.12. Языки конструирования программных систем
- 7.12. Тестирование на стадии конструирования
- 7.12. Конструирование ПО — итоги
- 7.12. Конструирование ПО — чек-лист
Экономика производства ПО
- 7.13. Модель COCOMO II — прогноз трудоёмкости и стоимости
- 7.13. Модель качества ISO/IEC 25010
- 7.13. Управление конфигурацией программных комплексов
- 7.13. Сопровождение программных комплексов
- 7.13. Заказные системы реального времени
- 7.13. Сертификация и приёмка заказных программных продуктов
- 7.13. Квалификация команды для заказной разработки
- 7.13. Экономика производства ПО — итоги
Scrum
- 7.14. Зачем Scrum и откуда он взялся
- 7.14. Scrum — роли, артефакты и события
- 7.14. Scrum — команда и Scrum Master
- 7.14. Scrum — спринт, ритм и прозрачность
- 7.14. Scrum — потери, фокус и готово
- 7.14. Scrum — бэклог, приоритеты и оценка
- 7.14. Scrum — внедрение и типичные ошибки
- 7.14. Scrum — итоги раздела
- 7.14. Scrum — чек-лист самопроверки
Внедрение ERP
- 7.15. ERP-система — что это и зачем бизнесу
- 7.15. Выбор ERP — требования, тендер и fit-gap
- 7.15. Методологии внедрения ERP
- 7.15. Участники проекта внедрения ERP
- 7.15. Жизненный цикл проекта внедрения ERP
- 7.15. Обследование и прототип ERP
- 7.15. Срок и бюджет внедрения ERP
- 7.15. Риски проекта внедрения ERP
- 7.15. Разработка, тесты и опытная эксплуатация ERP
- 7.15. Промышленная эксплуатация и сопровождение ERP
- 7.15. Внедрение ERP — итоги и шпаргалка
- 7.15. Внедрение ERP — чек-лист самопроверки
ITSM и ИТ-услуги
- 7.16. ITSM — управление ИТ-услугами
- 7.16. SLA — соглашение об уровне предоставления услуги
- 7.16. ITIL — практики управления ИТ-услугами
- 7.16. ITAM — управление ИТ-активами
- 7.16. Словарь ITIL 4 и ИТ-услуг
Начало работы на проекте
- 7.17. От идеи к старту проекта
- 7.17. Команда, роли и найм на старте проекта
- 7.17. Инфраструктура, доступы и администрирование на старте
- 7.17. Репозиторий, трекер и wiki на старте проекта
- 7.17. Архитектура и проектирование на старте проекта
- 7.17. План, декомпозиция и первые задачи
- 7.17. Онбординг участника проекта
- 7.17. Начало работы на проекте — итоги раздела
- 7.17. Начало работы на проекте — чек-лист самопроверки
Kanban
- 7.18. История Kanban и отличие от Scrum
- 7.18. Доска Kanban, колонки и WIP-лимиты
- 7.18. Классы обслуживания и приоритеты в Kanban
- 7.18. Метрики потока в Kanban
- 7.18. Когда Kanban лучше Scrum
- 7.18. Внедрение Kanban и типичные ошибки
- 7.18. Kanban в поддержке и инцидентах
- 7.18. Kanban — итоги раздела
- 7.18. Kanban — чек-лист самопроверки
Продуктовые роли
- 7.19. Product Owner и Product Manager
- 7.19. Продуктовые роли — итоги раздела
- 7.19. Продуктовые роли — чек-лист самопроверки
ADR и архитектурная память
Инциденты и эксплуатация
- 7.21. Инциденты, on-call и postmortem
- 7.21. Инциденты — итоги раздела
- 7.21. Инциденты — чек-лист самопроверки
Управление изменениями
- 7.22. Change request и управление изменениями scope
- 7.22. Управление изменениями — итоги
- 7.22. Управление изменениями — чек-лист
Удалённая команда
- 7.23. Удалённая и распределённая команда
- 7.23. Удалённая команда — итоги
- 7.23. Удалённая команда — чек-лист