Принципы работы
===
### 1.1 Мы следуем принятым принципам, независимо от согласия с ними
Персональное несогласие — не причина отступать от принципов. Тем не менее, можно начать обсуждение любого принципа, если изменились обстоятельства и он перестал быть полезным.
### 1.2 Мы открыто говорим о проблемах и рисках
Не согласен с техническим решением или план невозможно выполнить — скажи. Сломал базу или профакапил сроки — скажи сразу. Тимлид пришел с дурацким предложением — не молчи. Часто кажется, что проще согласиться или промолчать. Помни, что это приведёт к ещё большим проблемам позже.
### 1.3 Мы непредубеждены
По-максимуму избавляемся от эго. Не доказываем, кто прав. Не думаем о личной выгоде. Не боимся выглядеть глупо. Помним, что часто мы неправы. Искренне стараемся понять оппонента. Не спорим впустую. Забываем о личном отношении. Цель — найти лучшее решение.
### 1.4 Мы не делаем ничего зря
Постоянно боремся с потраченным впустую временем: задача не принесет пользу, новый процесс нужен только менеджеру, бессмысленная встреча, ненужная кнопка. Мы — борцы с мудой. Увидел муду — уничтожь.
### 1.5 Лучше не стесняться и спросить, чем потом долго чинить
### 1.6 Мы общаемся культурно
Честный фидбек и открытость — не повод для хамства и оскорблений. Мы вежливо и культурно общаемся со всеми: друг с другом, заказчиками, другими командами, персональными ассистентами.
### 1.7 Мы не оставляем белых пятен
Мы избегаем абстрактных и не до конца понятных формулировок. Задаём вопросы, ресёрчим, высказываем сомнения. Потратим время сейчас — сэкономим потом.
### 1.8 Мы даём друг другу честную обратную связь
Давать честный фидбек — трудно, получать — тоже. Мы осознаём пользу обратной связи, боремся с собой и учимся давать и принимать фидбек. Мы говорим прямо, не используем намёки и абстрактную критику.
### 1.9 Мы доверяем друг другу и можем положиться друг на друга
### 1.10 Наша цель — счастливые заказчики
Мы работаем, чтобы ученики получили свои уроки, преподаватели — зарплаты, компания — прибыль. Остальное вторично: задачи, графики, тикеты, обращения. Мы не зарываемся в коде ради кода, рефакторинге ради рефакторинга, планах ради планов и презентациях ради презентаций. Мы не делаем что-то, потому что "так правильно", "так написано в книжке" или "я всегда так делал". Помним о цели и делаем то, что максимально приближает к ней.
### 1.11 Хорошо бы, надо бы, было бы неплохо
Мы не произносим такие фразы впустую. Видишь возможное улучшение — впиши в план, создай карточку, найди ответственного, а лучше — сделай сам.
### 1.12 Мы не меняем приоритеты спонтанно
Приоритеты не могу меняться внезапно. Требуются веские аргументы и согласования с заинтересованными сторонами.
Технические принципы
===
### 2.1 Мы думаем о последствиях
Перед сложной выкаткой или миграцией мы думаем, что будем делать, если всё пойдет не так. Делаем бекапы, скрипты отката, оцениваем риски падения. Отгоняем мысли "ай, пронесёт, всё будет ок"
### 2.2 У нас не должно быть мест, которые знает только один человек
Мы стремимся избегать "белых пятен" в коде и поддерживать высокий бас-фактор.
### 2.3 Целостность данных
При написании кода, который манипулирует с данными биллинга, особенно балансом или деньгами, мы делаем эти изменения атомарными. Если мы меняем структуру хранения или массово изменяем данные, делаем изменения обратимыми.
### 2.4 Простые решения лучше сложных
Качество и стабильность != сложные универсальные решения. Мы против оверинжиринга в пользу простых и понятных решений.
### 2.5 Мы знаем, что биллинг — не пуп земли
Биллинг — это проект который используется многими поздразделениями в Skyeng. Внося изменения в его работу, мы задумываемся о командах, работающих с биллингом или данными биллинга.
### 2.6 Мы кодим осознанно, а не наугад
Мы разбираемся детально, почему что-то так работает и выясняем причины, если что-то работает не так. Не добавляем строки с мыслью "это может помочь" и не удаляем строки с мыслью "кажется, это не нужно".
### 2.7 У нас есть список обязательных знаний
Каждый должен потратить время и выучить вещи, которые нам важны:
* Основы работы с RabbitMQ: обменники и их типы, очереди
* БД: транзакции и уровни изоляции, блокировки
* Двойная запись в бухгалтерии
* SOLID, DI, IoC
### 2.8 Качество важнее скорости
Биллинг — инфраструктурная команда, а не хипстерский продукт. Наши приоритеты: стабильность и масштабируемость. "Быстро поднятое не считается упавшим" — не о биллинге. В нашем случае падение может повлечь существенную потерю денег и мы не идём на риск ради скорости.
### 2.9 Мы пишем код так, как будто у нас нет отдела QA
Стараемся самостоятельно протестировать код. Если не знаем как его вызвать — узнаем. Если тестировать тяжело или долго — подробно в комментариях к задаче пишем инструкцию для QA. Это увеличит время "in development", но время до production уменьшится: задача не зависнет в непонятных статусах.
### 2.10 Мы тестируем код
Мы не стремимся к 100% coverage кода, но у тестируемых методов обеспечиваем 100% coverage.
### 2.11 Мы не аутсорсим разработку биллинга
Это увеличивает технический долг и небезопасно.
### 2.12 Мы с осторожностью удаляем данные
Просто так ничего не удаляем: ни поля, ни данные.
### 2.13 Делаем ограничения на уровне БД
Проставляем уникальные ключи, правильные типы данных. Лучше ошибка о нарушении уникального ключа, чем двойные выплаты.
### 2.14 Читаемость важнее скорости и краткости
Код гораздо чаще читают, чем пишут. Уделяем внимание форматированию, phpdoc, описанию, README.
### 2.15 Мы не переписываем проекты с нуля
Шанс того, что это хорошая идея — минимален. Мы отгоняем от себя мысли написать что-то с нуля, выбросив работающий код, проверенный годами. Мы постоянно улучшаем и рефакторим, делая говнокод кодом мечты. Избавляемся от "двойных" систем, а не создаём их.