Ease of use
Используемая технология должна быть максимально прозрачна для разработчика. Мы поощряем поиск наиболее простых и понятных путей решения задачи. Там, где это возможно, используем принятый в компании технологический стек, вместо того чтобы создавать изолированную область системы с высоким порогом входа и низким уровнем внесения изменений. Для поиска используемых технологий мы обращаемся к Tech Radar. Основными характеристики здесь становятся readability, simplicity, maintainability.
Best code – code that doesn't exists
Лучший код — это код, который не был написан. Любой код — это усложнение. Добавление бизнес-логики в сервис или компонента в архитектуру должно быть взвешенным и обоснованным решением. Главный тезис данного принципа — изменения в системе должны происходить исходя из нужд бизнеса, а не наоборот — когда бизнес меняется в ответ на изменения в IT. Мы аргументируем, какую ценность несет в себе изменение и как это улучшит продукт.
Not invented here
Мы используем готовые решения и не стремимся изобретать велосипед. Мы используем сторонние решения, которые удовлетворяют нашим требованиям и помогают решить задачи. Это могут быть платные или open source решения.
Do not try to predict the future
Часто мы делаем сложные решения. В них мы хотим учесть кейсы, которые «должны» произойти в будущем. Но предсказать будущее удается лишь в одном случае из десяти. Взамен мы проектируем сервисы, открытые для инкрементальных изменений. Именно это позволяет нам гибко адаптироваться под изменяющиеся условия. Лучше сделать пять простых сервисов под конкретную задачу "здесь и сейчас", чем один большой с множеством конфигураций "на будущее". Важен процесс и прогресс. Нет конечного состояния: внешние условия и потребности меняются постоянно — это главное отличие той сферы, в которой мы работаем.
Autonomy based and Service based orientation
Мы стремимся проектировать компоненты системы со слабой связанностью. Для принятия решения о выделении части системы в отдельный сервис мы опираемся на 2 возможных пути решения:
1) DDD (Domain driven design)
2) Профиль нагрузки сервиса (баланс чтения / записи)
Мы предпочитаем небольшие сервисы, по возможности с минимальным количеством кода. Проектируемый сервис должен быть максимально автономен, а значит и иметь целостную, единую зону ответственности. Под автономностью сервиса мы подразумеваем его запуск в отдельном процессе, независимый deployment, инкапсулированный data storage внутри сервиса (подход share nothing). Под автономностью сервиса мы подразумеваем: запуск сервиса в отдельном процессе, независимый deployment, не разделять data storage с другими сервисами.
Non Blocking communication
Мы стремимся к асинхронному взаимодействию и event driven сервисам там, где это возможно. Services producers отправляют события в стрим данных. Другие services consumers подписываются на определенные события. Взаимодействие между сервисами становится неблокирующим. Мы используем такие подходы, как Inner Source, Release Train, Feature toggle и многие другие для поддержания неблокирующих процессов.
Just a tool
Технология — всего лишь инструмент. С фреймворком или без мы решим поставленную задачу. Мы рассматриваем фреймворк к использованию, если он позволяет сделать быстро, легко, качественно и без вреда системе.
Best, Known, Tested, Promising
Мы не используем сомнительные, малоизвестные и не развивающиеся решения. Часто такие технологии называют "Boring Technologies". Полезность инструмента описывается не его "интересностью", а тем, насколько точно он реализует поставленную задачу. Стабильность и качество инструмента — важнейшие критерии.