You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
193 lines
9.6 KiB
193 lines
9.6 KiB
Большинство идей в этом документе известны опытным разработчикам.
|
|
|
|
ПРИНЦИПЫ УПРАВЛЕНИЯ
|
|
|
|
Есть множество моделей управления разработкой, из которых сейчас возобладали разные вариации Agile.
|
|
Причем эта методология приобрела статус догмы и ожидаемо породила секты фанатиков.
|
|
|
|
Мы не следуем какой-либо готовой модели и используем свою, беря наилучшее из разных подходов.
|
|
При этом всячески остерегаемся догматизма, соблазна "забронзоветь".
|
|
|
|
Из Agile мы берем гибкость.
|
|
Это значит что мы меняем любые мешающие правила.
|
|
Итеративность и связанные с нею ритуалы не нужны, из-за специфики потребителей нашего софта.
|
|
|
|
Мы сохраняем отсутствие иерархичности в анархической самоорганизации:
|
|
- прямое общение каждого с каждым по любому вопросу
|
|
- прямое общение разработчика с заказчиком
|
|
- сетевую организацию рабочих групп
|
|
- множество ролей у участника в зависимости от вовлеченности в тот или иной проект
|
|
(тех.лид в проекте А, исполнитель в проекте Б, заказчик в проекте В)
|
|
|
|
Из методик разработки свободного ПО мы берем систему контроля версий и систему учета ошибок.
|
|
Эти системы стали широко применяться именно в начале 90-х в рамках разработки проекта Mozilla и другого свободного ПО,
|
|
хотя почему-то считаются атрибутами Agile.
|
|
|
|
От бюрократии проектной разработки мы берем историчность, возможность найти то, что уже когда-то было.
|
|
|
|
Помним: ЖИЗНЬ является самоорганизацией хаотической материи.
|
|
Хаосу свойственна самоорганизация на потоках энергии.
|
|
Мы и есть этот ХАОС.
|
|
ЖИЗНЬ сама нас поправит, когда мы начнем коснеть (а вовсе не некие волшебные методики).
|
|
|
|
|
|
ПРИНЦИПЫ КОДИРОВАНИЯ
|
|
|
|
* В стиле кодирования основное - это имена. А вовсе не скобочки и отступы.
|
|
Умение давать имя, именовать - это показатель уровня разработчика.
|
|
Если вы дали хорошее и подходящее имя переменной или функции или классу, то все остальное почти автоматически будет хорошо.
|
|
Если наоборот - то почти автоматически все остальное будет плохо.
|
|
|
|
Хорошее имя - это не значит длинное.
|
|
Это значит уместное, подходящее, меткое, точно отражающее суть, наилучшим образом характеризующее,
|
|
грамматически правильное, используемое и узнаваемое другими в похожем контексте.
|
|
|
|
Возможно вы замечали, что в подменю Visual Studio "Рефакторинг" пункт "Переименовать" стоит первым.
|
|
|
|
Неверный выбор прорастет в коде навеки!
|
|
Бойтесь опечаток наподобие imfo или autometic - ошибаетесь один раз и навсегда.
|
|
Хуже всего, если такой идентификатор с опечаткой попадет в интерфейс!!!
|
|
|
|
Если у вас код разнесен по нескольким подсистемам на разных языках программирования и интерфейсах, используйте одно и то же имя везде.
|
|
Трудно искать несоответствия, когда на С++ переменная звучит как errno, в HTTP API передается как errLvl,
|
|
а в логах выписывается как errorLevel.
|
|
|
|
* Комментарии объясняют то, что не объясняют хорошо выбранные имена.
|
|
У нас много магии используется.
|
|
Объясняйте _намерения_ кроме _методов_, по максимуму, развернутыми комментами.
|
|
Надо писать не только "что и как я делаю", а в первую очередь "зачем я делаю, какую цель достигаю, какую проблему решаю".
|
|
|
|
плохо
|
|
// аллоцируем память в удаленном процессе и запускаем шелл-код
|
|
хорошо
|
|
// нам нужно снять хуки на такую-то функцию в удаленном процессе, потому что иначе не заработает то и это
|
|
// поэтому аллоцируем память в удаленном процессе и запускаем шелл-код, который взят вот отсюда с гитхаба https://...
|
|
// шелл-код отыщет такие-то байты в прологе такой-то функции и пропатчит их на нужные нам.
|
|
// были еще варианты раз (ссылка) и два (ссылка), но они не подходят, т.к. плохо отрабатывают на таких-то системах
|
|
|
|
В компилируемых языках программирования (далее ЯП) комментарии пишутся на русском языке.
|
|
В интерпретируемых ЯП комментарии и идентификаторы только на английском, только грамматически чисто!
|
|
Попавшие противнику скрипты не должны указывать на вашу национальную принадлежность.
|
|
|
|
* Лучший код тот, которого нет.
|
|
Не пишите лишнего.
|
|
Не делайте заделы на годы вперед.
|
|
"Завтра" может не настать, и задел никому не понадобится.
|
|
"завтра" окажется, что вы не угадали.
|
|
|
|
Лаконичность, минимализм - наше все.
|
|
Не плодите сущностей. Это величайший грех инженера!
|
|
|
|
Отсеките Бритвой Оккама все лишнее - фреймворки, ООП, сторонние библиотеки, обертки.
|
|
|
|
Идеальный код должен занимать ноль байт (это реальный случай, когда используется чужой софт).
|
|
|
|
* нет смысла писать код, если он кем-то уже написан. Перед тем как писать, поищите в Сети.
|
|
Если взяли чужой код, обязательно воткните в исходники линк, откуда он взят.
|
|
|
|
|
|
ОБРАБОТКА ОШИБОК
|
|
|
|
Предлагается следующая методика обработки ошибок в коде:
|
|
- исключения С++ не используются
|
|
- исключения SEH/VEH используются только для снятия посмертного стека либо для защиты опасных секций кода
|
|
(например, выполнение произвольного shell-кода)
|
|
- все функции пишут об ошибке немедленно в stderr, предваряя строку именем функции. Например:
|
|
|
|
fprintf(stderr, __FUNCTION__ " Invalid file handle\r\n");
|
|
|
|
- если функция возвращает коллекцию (например, найденных символов), то в случае ошибки возврат - пустая коллекция;
|
|
- если функция возвращает указатель, то NULL - это ошибка;
|
|
- если функция возвращает строку, то пустая строка - это ошибка;
|
|
- если функция возвращает целое, то 0 или -1 - это ошибка;
|
|
Вызывающий контекст проверяет возврат, и если он неожиданный, и нету возможности подставить значение по умолчанию,
|
|
мы делаем возврат из текущего места по приведенным выше правилам сигнализации об ошибках.
|
|
|
|
|
|
ПОЛИТИКА GIT
|
|
|
|
* Мы используем Git не потому что так делают все, а для решения вот таких задач:
|
|
1. Резервное копирование.
|
|
Мы видели множество случаев потери работы за длительное время (месяцы, и однажды - год), просто из-за неаккуратности разработчика.
|
|
2. Совместная работа нескольких людей над проектом
|
|
3. Поиск автора конкретных строк кода
|
|
4. Поиск регресса путем отката и последовательных сборок по истории
|
|
5. Ведение истории изменений (Release notes, Changelog)
|
|
6. Версионирование, управление релизами
|
|
|
|
Поэтому правила ниже и написаны для извлечения этих выгод.
|
|
Для других задач могут быть другие правила.
|
|
|
|
* Коммиты обязательны всякий раз, когда есть что коммитить (то есть примерно каждый день).
|
|
Даже если код не работает и не дописан, коммитьте во временную ветку.
|
|
Это лучше чем потерять работу за день.
|
|
|
|
* Желательно хранить стабильный код в отдельной ветке, и вливать в нее только проверенные изменения.
|
|
|
|
* Если у проекта есть версии, то каждой версии соответствует либо ветка (если она передается на поддержку),
|
|
либо метка (если нужна лишь историчность без поддержки).
|
|
|
|
* Если вы на проекте один, то вы ведете ветки как вам угодно.
|
|
|
|
* Если проектом заняты несколько, то разработку следует вести в личной ветке.
|
|
Влитие в основную ветку всегда делается двойным слиянием (merge)
|
|
- сначала из основной ветки в свою (с разрешением конфликтов и дымным тестом)
|
|
- потом из своей в основную.
|
|
|
|
* У коммита всегда должен быть комментарий, на русском языке, описывающий краткую суть изменений.
|
|
Например: "Исправление переполнения сетевого буфера при высокой частоте запросов".
|
|
В комментарии должен быть указан номер бага или задачи из системы учета,
|
|
например: "B-1655 Исправление переполнения сетевого буфера при высокой частоте запросов".
|
|
Когда вы проставите ИД бага, интеграция Git с системой учета ошибок автоматически свяжет коммит с багом.
|
|
|
|
* Коммит должен быть атомарным и минимальным.
|
|
Один коммит - один баг/задача.
|
|
Это значит, что больше нельзя фигакнуть git push не разбираясь прямо из каталога проекта.
|
|
Если вы из командной строки, то нужно перечислять файлы поименно, и перед коммитом обязательно делать diff с апстримом.
|
|
Коммитятся только те файлы, которые имеют отношение к одной-единственной задаче.
|
|
Коммитятся только те строки файла, которые имеют отношение к одной-единственной задаче.
|
|
|
|
Если не следовать этому правилу, становятся недоступными или затрудненными следующие выгоды Git:
|
|
- cherry pick (перенос кода между несинхронными ветками)
|
|
- blame (поиск автора кода) становится очень зашумленным
|
|
- поиск регресса путем последовательных сборок по истории (при возникновении ошибки в таком коммите, невозможно сказать, к изменению по какой задаче она относится)
|
|
|
|
* Используйте утилиты с UI для работы с Git. Они показывают что именно изменено относительно основной ветки,
|
|
позволяют отправлять только отдельные строки из файла, и игнорировать ваши личные отладочные изменения и настройки,
|
|
которые не должны попасть на сервер.
|
|
|
|
* Запрещено коммитить
|
|
- любые тексты с реальными именами, никнеймами, паролями, URL и IP-адресами наших ресурсов, адресами криптовалют, итд итп (если не оговорено особо)
|
|
- архивы и бинарные файлы, не являющиеся частью шагов сборки проекта
|
|
|
|
|
|
СИСТЕМА УЧЕТА ОШИБОК И ПРОЕКТНОЙ РАЗРАБОТКИ
|
|
|
|
Этой системой мы пользуемся не потому, что ими пользуются все, а для решения вот каких задач:
|
|
1. Чтобы сократить писанину.
|
|
Можно ткнуть в уже написанный текст, а не писать кому-то повторно.
|
|
Это может быть текст задачи, комментарий с описанием шагов воспроизведения ошибки, картинка или лог во вложении.
|
|
|
|
2. Чтобы найти концы (историчность).
|
|
Ошибки могут повторяться, особенно плавающие.
|
|
Большое число ошибок группируется вокруг одних и тех же строк кода.
|
|
Словом, ситуация "такое уже было" является частой.
|
|
|
|
3. Для концентрации знаний и аналитики.
|
|
Через какое-то время в системе накапливается существенное количество информации.
|
|
Куда идти разработчику или руководителю за информацией, как не в эту систему?
|
|
|
|
4. Для управления разработкой.
|
|
Ведение списка задач, назначение задач исполнителям, выбор приоритетов, отслеживание стадии работ, планирование.
|
|
Коллеги разработчики, когда вас сотня, а я один (ну ладно, двое или трое), держать в голове это все очень тяжко.
|
|
|
|
Багтрекер кроме всего прочего является вашим рабочим журналом.
|
|
При работе над задачей, записывать заметки для самого себя - это нормально.
|
|
Когда что-то получается, или наоборот что-то не получается - записи вида "не получилось это, вот формулировка проблемы" - очень ценны.
|
|
|
|
|
|
ПРАВИЛА ОФОРМЛЕНИЯ ОТЧЕТОВ ОБ ОШИБКАХ
|
|
|
|
См.соответствующий документ.
|
|
|
|
|