Разработка архитектуры для чайников. Часть 1
Всем привет. Меня зовут Тетка Андрей, я занимаюсь программированием уже больше 10 лет и за это время несколько раз приходилось разрабатывать архитектуру как крупных проектов, так и не больших фич. Я когда то уже делал вебинар на эту тему, но сейчас хотелось бы всё систематизировать и рассказать об этом вам.
И прежде чем мы начнем проектировать архитектуру, давайте сначала ответим на вопрос, а что же это собственно такое?
Ниже я привёл несколько картинок которые описывают ту или иную архитектуру
И как мы видим все эти картинки абсолютно разные. Так что же всё таки такое архитектура?
Архитектура программного обеспечения относится к фундаментальным структурам программной системы и дисциплине создания таких структур и систем. Каждая структура включает элементы программного обеспечения, отношения между ними, а также свойства как элементов, так и отношений. Архитектура программной системы — это метафора, аналогичная архитектуре здания. Он функционирует как план для системы и проекта разработки, в котором излагаются задачи, которые должны быть выполнены командами разработчиков.
Ну теперь когда мы разобрались с тем что такое архитектура, давайте разберемся, а зачем она собственно то нужна? И на самом деле ответ довольно простой и легко изобразить на следующей картинке.
Чем старше становится проект, тем больше у нас технического долга, даже если функциональность проекта не сильно меняется, то технический долг всё равно накапливается со временем и в какой то критический момент мы уже занимаемся тем, что пытаемся просто исправлять баги, а на новую функциональность времени попросту не хватает.
Ну хорошо, мы разобрались что такое архитектура и зачем она собственно нужна, но как же её собственно строить?
Первое что нужно понимать, это что мы вообще строим. Нужно понять что за проект мы делаем. Это кажется очевидным, но я часто видел в своей практике когда архитектор просто приходит и говорит что давайте сделаем микросервисы, не разобравшись в том, что мы делаем и вообще зачем мы это делаем.
Далее нам нужно понять, а зачем вообще заказчику понадобилась новая архитектура и почему мы должны её продумывать. Так же мы должны ответить на вопрос, а почему была выбрана именно текущая архитектура, и почему мы попали в ситуацию что заказчику нужно её поменять? Какие проблемы мы имеем с текущей архитектурой?
Ну и самое главное, мы должны собрать требования к нашей архитектуре, данные требования могут быть абсолютно разными, вот лишь некоторые из них:
- fault tolerance (reliability) / отказоустойчивость (надёжность)
- speed of development / скорость разработки
- ease deployed / простота деплоя
- scalability by the number of people in the project / масштабируемость по количеству человек в проекте
- scalability in terms of requests per second / масштабируемость по количеству запросов в секунду
- fast entry / exit to resolution / быстрый вход/выход в разработку
- application deployment speed / скорость развертывания приложения
- remove old code / избавиться от старого кода
- complexity of adding new integrations / сложность новых интеграций
- etc. / И т.д.
Например на одном из моих проектов важно была отказоустойчивость, но вот масштабируемость проекта, чтобы на нём могли находиться тысяча человек одновременно — не требовалось. Есть проекты в которых наоборот нужно чтобы миллионы пользователей могли одновременно сидеть, но если у одного из них случались проблемы(например сообщение не отправилось за 5 секунд), то это не критично, отправим его через 10 секунд.
К сожалению не существует золотой пули и идеально архитектуры которая подойдёт для всего, поэтому нам требуется как можно точнее собрать требования под конкретную архитектуру которую нам требуется разработать.
Такс, а теперь давайте ещё раз повторим вопросы на которые нам нужно ответить. Их всего 5:
- Что мы делаем?
- Почему мы имеем текущую архитектуру?
- Почему нам нужна новая архитектура?
- Какие проблемы мы имеем с текущей архитектурой?
- Что хочет наш клиент от новой архитектуры?
Ну а теперь мы можем приступать к разработке нашей новой архитектуры.