SlideShare a Scribd company logo
Один день из жизни
разработчика-исследователя
Устройство компаний
• Горизонтальное
• Вертикальное
Горизонтальное Устройство компаний
Горизонтальное Устройство компаний
• Все сотрудники компании равнозначны
• Компания ведет открытую политику касательно всего
• Сотрудник не может вырасти вертикально (программист 
старший программист  технический директор). Должностей как
таковых по сути нет
Горизонтальное Устройство компаний
• Более 300 сотрудников
• Стоймость компании более 2.000.000.000$
valve employee handbook
Team workflow
Горизонтальное Устройство компаний
• Более 30 сотрудников
• Евангелисты современного web2.0 (Ruby On Rails)
• Авторы нескольких культовых книг о разработке ПО и ведении
бизнеса
https://gettingreal.37signals.com/
Вертикальное Устройство компаний
• Становится необходимым при увеличении количества сотрудников
и усложнении структуры бизнеса
• Иерархическая модель исторически более популярна и
широкоприменима
Вертикальное Устройство компаний
• Более 3000 сотрудников
• Самая популярная онлайн игра в мире
National Geographic’s Ultimate Factories: Wargaming
Лаборатория Касперского
Лаборатория Фильтрации Контента
• Антифишинг
• Aнтиспам
• Родительский контроль
• Отдел аналитики
• Команда инфраструктуры
ЗАДАЧИ
• Поддержка и создание инфраструктурных сервисов для
внутреннего использования
• Исследование новых методов анализа контента
(преимущественно в области антиспама)
Команда
• 1 менеджер
• 1 системный администратор
• 3 тестировщика
• 4 разработчика
Общий рабочий процесс
• Год – 4 квартала, глобальные цели
• Квартал – квартальные цели
• Цели – декомпозиция на задачи, необходимые для их достижения
• Задачи – планирование, 2х недельные итерации
• Итерации синхронизованы между всеми командами в отделе
МОДЕЛИ РАЗРАБОТКИ ПО
• Каскадная
• Итеративная
• Спиральная
• Vee/Double-Vee
Методологии Итеративной разработки ПО
• Agile:
• Kanban
• Scrum
• Feature-Driven Development
• eXtreme Programming
• RUP
SCRUM
• Команда маленького размера, все разработчики в идеале должны
обладать одинаковой областью компетенции
• Декомпозиция задач на подзадачи, выполнимые за относительно короткий
промежуток времени (итерацию)
• Длительность итерации – 2 недели
• В конце каждой итерации – ретроспектива по недостаткам в итерации,
демонстрации выполненных задач, планирование следующей итерации
• В каждую итерацию закладывается фиксированное количество часов на
разнообразную “текучку”
• Задачи не привязаны к конкретному разработчику
• Короткие встречи каждый день с обсуждением сделанного за прошлый и
новостей/изменений
SCRUM
В итоге мы получаем гибкую систему, позволяющую подменять одним
разработчикам других в ходе работы над проектом.
Проекты разрабатываются итеративно, маленькими шагами, но с
частыми интеграциями. Это позволяет заметить ошибки на ранних
этапах и оперативно внести корректировки в процесс
разработки/проект.
SCRUM
СИСТЕМЫ УПРАВЛЕНИЯ ПРОЕКТАМИ И отслеживания
ошибок
• JIRA
• Bugzilla
• Trac
• YouTrack
• Redmine
• Basecamp
• TFS
• …
СИСТЕМЫ УПРАВЛЕНИЯ ПРОЕКТАМИ И отслеживания
ошибок
СИСТЕМЫ УПРАВЛЕНИЯ ПРОЕКТАМИ И отслеживания
ошибок
ПРОЦЕСС РАЗРАБОТКИ
• Кодирование
• Тестирование/Подготовка к развертыванию
• Багфикс (если нужен)  повторное тестирование
• Развертывание
Toolchain
• OS: Linux (RHEL/CentOS) / FreeBSD
• Console tools: *nix toolchain (sh/awk/sed/…)
• Programming languages: C / C++ [gcc/clang] / Python [cpython]
• Version control: Git
• Continuous Integration: Jenkins
• Deploy: ansible, system packets (rpm/tgz)
О ПЛОХОМ И ХОРОШЕМ КОДЕ
if (verbosity > 1 && U->last_local_id > 1800 && E->user_id == 6492 &&
((M->flags & 199) == 0 || (U->last_local_id > 1864 && U->last_local_id <
1880)))
https://github.com/vk-com/kphp-kdb/blob/f9a2f927aa97612d0c74a0e296eda8f414f13cce/text/text-index.c#L1372
О ПЛОХОМ И ХОРОШЕМ КОДЕ
case LEV_SEQ_STORE_INF + 0x100 ... LEV_SEQ_STORE_INF + 0x3ff:
s = E->type & 0xff;
if (size < 8 || size < sizeof (struct lev_seq_store_inf) + 4 * s + 4 * E->a) { return -2; }
store_inf ((void *)E);
return sizeof (struct lev_seq_store_inf) + 4 * s + 4 * E->a;
case LEV_SEQ_STORE_TIME + 0x100 ... LEV_SEQ_STORE_TIME + 0x3ff:
s = E->type & 0xff;
if (size < 12 || size < sizeof (struct lev_seq_store_time) + 4 * s + 4 * E->b) { return -2; }
store_inf ((void *)E);
return sizeof (struct lev_seq_store_time) + 4 * s + 4 * E->b;
…
return -1;
https://github.com/vk-com/kphp-kdb/blob/master/seqmap/seqmap-data.c#L1029
О ПЛОХОМ И ХОРОШЕМ КОДЕ
В промышленной разработке код должен писаться с расчетом на
возможную текучку в команде и его долгую поддержку при
необходимости.
Соответственно код должен быть:
• Протестирован и максимально полно покрыт тестами
• Удобочитаем
• Соответствовать командным стандартам кодирования (именование
переменных/функций, применение/неприменение исключений, …)
• Легок в поддержке
О ПЛОХОМ И ХОРОШЕМ КОДЕ
• Книги:
• Идеальный программист. Как стать профессионалом разработки ПО
• Совершенный код
• Идеальный код
• Чистый код
• Джоэл о программировании
• Просмотр и разбор качественно документированных open-source
проектов
• Изучение различных общепризнанных style-guide кодирования
• Опыт и постоянное расширение кругозора
О ПЛОХОМ И ХОРОШЕМ КОДЕ
Быстрый обратный квадратный корень
float Q_rsqrt( float number )
{
long i;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
y = number;
i = * ( long * ) &y; // evil floating point bit level hacking
i = 0x5f3759df - ( i >> 1 ); // what the fuck?
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
// y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed
return y;
}
СИСТЕМЫ УПРАВЛЕНИЯ ВЕРСИЯМИ
Система управления версиями (от англ. Version Control System, VCS или
Revision Control System) — программное обеспечение для облегчения
работы с изменяющейся информацией. Система управления версиями
позволяет хранить несколько версий одного и того же документа, при
необходимости возвращаться к более ранним версиям, определять, кто
и когда сделал то или иное изменение, и многое другое.
СИСТЕМЫ УПРАВЛЕНИЯ ВЕРСИЯМИ
• CVS
• Bazaar
• SVN
• Git
• Mercurial
• Perforce
• TFS
• ….
СИСТЕМЫ УПРАВЛЕНИЯ ВЕРСИЯМИ
Юнит Тестирование
Модульное тестирование, или юнит-тестирование (англ. unit testing)
— процесс в программировании, позволяющий проверить на
корректность отдельные модули исходного кода программы.
Идея состоит в том, чтобы писать тесты для каждой нетривиальной
функции или метода. Это позволяет достаточно быстро проверить, не
привело ли очередное изменение кода к регрессии, то есть к появлению
ошибок в уже оттестированных местах программы, а также облегчает
обнаружение и устранение таких ошибок.
Юнит Тестирование
• Каждый добавленный кусок кода обязательно покрывается тестами.
• Тесты должны успешно отрабатывать.
• Замеряется функциональное (для каждого ли из методов в коде есть
вызывающий его тест) и условное покрытие кода тестами (проход всех
возможных условных веток, покрытие всех крайних условий).
• Суммарное покрытие проекта тестами не должно падать ниже
фиксированного значения.
Юнит Тестирование
• С++: google-mock, google-test, …
• Python: pytest, pyunit, …
Разработка Через Тестирование
Разработка через тестирование (англ. test-driven development, TDD) —
техника разработки программного обеспечения, которая основывается
на повторении очень коротких циклов разработки: сначала пишется тест,
покрывающий желаемое изменение, затем пишется код, который
позволит пройти тест, и под конец проводится рефакторинг нового кода к
соответствующим стандартам.
Разработка Через Тестирование
КОД РЕВЬЮ
Просмотр кода (англ. code review) или инспекция кода (англ. code
inspection) — систематическая проверка исходного кода программы с
целью обнаружения и исправления ошибок, которые остались
незамеченными в начальной фазе разработки.
Каждый коммит до попадания в репозиторий рассматривается одним
(или несколькими) разработчиками с целью поиска в нем очевидных
ошибок, нарушения стилистики кода либо неудачных решений.
Повышает качество кода, улучшает обмен опытом в команде,
тонизирует.
СТАТИЧЕСКИЙ АНАЛИЗ КОДА
Статический анализ кода (англ. static code analysis) — анализ
программного обеспечения, производимый (в отличие от динамического
анализа) без реального выполнения исследуемых программ.
СТАТИЧЕСКИЙ АНАЛИЗ КОДА
Позволяет находить:
• Ошибки, связанные с неопределенным поведением
(неиницализированные переменные)
• Ошибки, связанные с известными недокументированными побочными
эффектами
• Переполнение буфера
• Повторяющийся код
• Ненужный код
• Функционал, связанный с возможными оптимизациями компилятора
• Некросплатформенный код
• …
СТАТИЧЕСКИЙ АНАЛИЗ КОДА
const uint32 kRedCoefficient = 2125;
const uint32 kGreenCoefficient = 7154;
const uint32 kBlueCoefficient = 0721;
const uint32 kColorCoefficientDenominator = 10000;
СТАТИЧЕСКИЙ АНАЛИЗ КОДА
const uint32 kRedCoefficient = 2125;
const uint32 kGreenCoefficient = 7154;
const uint32 kBlueCoefficient = 0721;
const uint32 kColorCoefficientDenominator = 10000;
СТАТИЧЕСКИЙ АНАЛИЗ КОДА
void doSomething(const char* x)
{
char s[40];
sprintf(s, "[%s]", x);
}
СТАТИЧЕСКИЙ АНАЛИЗ КОДА
void doSomething(const char* x)
{
char s[40];
sprintf(s, "[%s]", x);
}
СТАТИЧЕСКИЙ АНАЛИЗ КОДА
• C++: cppcheck, PVS Studio / CppCat, …
• Python: pychecker, pylint, pyflakes
q.viva64.com
НЕПРЕРЫВНАЯ ИНТЕГРАЦИЯ
Непрерывная интеграция (англ. Continuous Integration) — это практика
разработки программного обеспечения, которая заключается в
выполнении частых автоматизированных сборок проекта для скорейшего
выявления и решения интеграционных проблем.
НЕПРЕРЫВНАЯ ИНТЕГРАЦИЯ
• Hudson
• TeamCity
• Jenkins
• BuildBot
• Travis
НЕПРЕРЫВНАЯ ИНТЕГРАЦИЯ
НЕПРЕРЫВНАЯ ИНТЕГРАЦИЯ
• Проект забирается из указанного репозитория
• Собирается в указанном окружении
• После сборки проходит несколько шагов:
• Проверка на прохождение тестов
• Проверка на покрытие тестами
• Проверка статическим анализатором кода
• Проверка на возможные утечки памяти (динамический анализ с помощью
valgrind)
• В зависимости от статуса сборки (успешна/нет) – выполнение
дополнительных шагов (рассылка информационных писем о сборке,
автоматический деплой, любые другие дополнительные действия)
РАЗВЕРТЫВАНИЕ
• Пакеты (rpm/tgz)
• Ansible – платформа для удаленного развертывания ПО, выполнения
задач и конфигурирования. Чистый python + ssh.
РАБОТА ТЕСТИРОВЩИКОВ
Любыми способами сломать то, что мы им отдали, используя метод
“черного ящика”.
Для каждого проекта есть утвержденное описание всех его тест-кейсов,
полностью проверяется его функциональность.
Тестировщик нашел ошибку – заводится баг в TFS, разработчик забирает
задачу, чинит баг, тестер проверяет заново. Повторять до получения
результата.
МОНИТОРИНГ СЕРВИСОВ
В режиме реального времени постоянно производится мониторинг всех
сервисов на предмет их работоспособности.
В случае отказа чего-либо – рассылаются уведомления людям,
связанным с работой этого сервиса.
МОНИТОРИНГ СЕРВИСОВ
• Nagios
• Zabbix
• Cacti
• Icinga
Вопросы?
Y U NO WANT THESE LECTIONS
• Map-Reduce, Message Queues: Hadoop, своя распределенная
реализация на базе ZeroMQ
• Selenium, автоматическое тестирование сторонних продуктов
• NoSQL (Cassandra)

More Related Content

PDF
Технологии разработки ПО
PPTX
Лучшие практики на практике
PPTX
Промышленная разработка ПО. Лекция 5. Особенности работы тестировщика
PPTX
Промышленная разработка ПО. Лекция 3. Особенности работы программиста. Часть...
PPTX
Промышленная разработка ПО. Лекция 2. Инструменты
PDF
Тестирование ПО, основанного на сторонних компонентах, на примере дистрибут...
PPTX
2014 ALM Summit - ALM and 1C
PDF
QAFest. Роль тестирования в Devops
Технологии разработки ПО
Лучшие практики на практике
Промышленная разработка ПО. Лекция 5. Особенности работы тестировщика
Промышленная разработка ПО. Лекция 3. Особенности работы программиста. Часть...
Промышленная разработка ПО. Лекция 2. Инструменты
Тестирование ПО, основанного на сторонних компонентах, на примере дистрибут...
2014 ALM Summit - ALM and 1C
QAFest. Роль тестирования в Devops

What's hot (19)

PPTX
Промышленная разработка ПО. Лекция 6. Особенности работы системного аналитика
PPTX
Развитие навыков 1с специалиста до 5 го уровня
PPTX
Промышленная разработка ПО. Лекция 4. Особенности работы программиста. Ча…
PDF
Юрий Василевский "Автоматизация в XCode"
PDF
Дефицит ресурсов тестирования... или нет?
PDF
Как 3 тестировщика играючи тестируют приложение для 10млн пользователей
PPTX
Тестирование (QA) в 1С:Предприятии 8
PPTX
Continious integration-Automated Testing-Solid-Agile
PDF
CodeFest 2014. Павлов И. — Как делать прототипы в автоматизации тестирования
PDF
Highway to Сontinuous Integration, Денис Трифонов (2GIS)
PPTX
GUI-автоматизация в Telerik Test Studio
PPT
Промышленная разработка ПО. Лекция 1. Общие понятия
PPTX
QA Fest 2016. Алексей Виноградов. Цель тестирования. А на самом деле?
PPTX
Автоматизация тестирования ролей и привилегий
PDF
Алексей Халайджи, Mail.Ru Group, «Как мы автоматизируем UI-тестирование в iOS...
PPTX
Как развить отдел тестирования от палки-копалки до CI
PDF
DevOps guide for awesome quality assurance
PPTX
Становление процесса автоматизированного тестирования в интернет-магазине ОКЕЙ
PDF
Виталий Шибаев - Креативный менеджмент глазами разработчика: как выжить в agi...
Промышленная разработка ПО. Лекция 6. Особенности работы системного аналитика
Развитие навыков 1с специалиста до 5 го уровня
Промышленная разработка ПО. Лекция 4. Особенности работы программиста. Ча…
Юрий Василевский "Автоматизация в XCode"
Дефицит ресурсов тестирования... или нет?
Как 3 тестировщика играючи тестируют приложение для 10млн пользователей
Тестирование (QA) в 1С:Предприятии 8
Continious integration-Automated Testing-Solid-Agile
CodeFest 2014. Павлов И. — Как делать прототипы в автоматизации тестирования
Highway to Сontinuous Integration, Денис Трифонов (2GIS)
GUI-автоматизация в Telerik Test Studio
Промышленная разработка ПО. Лекция 1. Общие понятия
QA Fest 2016. Алексей Виноградов. Цель тестирования. А на самом деле?
Автоматизация тестирования ролей и привилегий
Алексей Халайджи, Mail.Ru Group, «Как мы автоматизируем UI-тестирование в iOS...
Как развить отдел тестирования от палки-копалки до CI
DevOps guide for awesome quality assurance
Становление процесса автоматизированного тестирования в интернет-магазине ОКЕЙ
Виталий Шибаев - Креативный менеджмент глазами разработчика: как выжить в agi...
Ad

Viewers also liked (10)

PDF
Distributed systems
PDF
Data mining and antispam
PPTX
FinTech Universal Reconciliation Datamart
PDF
New European Economy Central Maine
PPTX
Feminism - Second Wave Of A Movement
PDF
AYMAN GAD BEBAWY[1]
PDF
Games Sense to Coaching Basketball
PDF
Charlotte Bobcats Scouting Report of Utah Jazz
PDF
A Sports Coaching Introduction
Distributed systems
Data mining and antispam
FinTech Universal Reconciliation Datamart
New European Economy Central Maine
Feminism - Second Wave Of A Movement
AYMAN GAD BEBAWY[1]
Games Sense to Coaching Basketball
Charlotte Bobcats Scouting Report of Utah Jazz
A Sports Coaching Introduction
Ad

Similar to Team workflow (20)

PPTX
разработка бизнес приложений (8)
PPTX
лекция типовые ошибки
PPTX
Code review как средство обеспечения качества программного обеспечения
PDF
Максим Гуртовенко - The future is wild | HappyDev'12
PPTX
C++ осень 2012 лекция 12
PPT
Refactorings with RubyMine
ODP
Борьба с ошибками (TDD)
PDF
На пути к совершенному инжинирингу
PPTX
Сергей Смирнов (Altair Engineering Inc.) | Организация работы распределенной ...
PPTX
Mva stf module 1 - rus
PPTX
Основы и применение статического анализа кода при разработке лекция 1
PPTX
Mva stf module 4 - rus
PPTX
метод организации репозитория исходного кода
ODP
RnDM MSU CMC 7.5 Управление процессом разработки
PDF
РИФ 2016, Внедрение контроля качества в большом web-проекте на примере Badoo
PPTX
Управление конфигурациями и артефакты тестирования
PDF
серёжа пономарёв @ Kuchyn.com.ua junior java developer программируем по-взро...
PDF
доклад на SQADays 2011 в Казани
PPTX
Расширяем идею статического анализа от проверки кода до других процессов разр...
PPTX
Конфигурационное управление и управление изменениями с IBM Rational ClearCase...
разработка бизнес приложений (8)
лекция типовые ошибки
Code review как средство обеспечения качества программного обеспечения
Максим Гуртовенко - The future is wild | HappyDev'12
C++ осень 2012 лекция 12
Refactorings with RubyMine
Борьба с ошибками (TDD)
На пути к совершенному инжинирингу
Сергей Смирнов (Altair Engineering Inc.) | Организация работы распределенной ...
Mva stf module 1 - rus
Основы и применение статического анализа кода при разработке лекция 1
Mva stf module 4 - rus
метод организации репозитория исходного кода
RnDM MSU CMC 7.5 Управление процессом разработки
РИФ 2016, Внедрение контроля качества в большом web-проекте на примере Badoo
Управление конфигурациями и артефакты тестирования
серёжа пономарёв @ Kuchyn.com.ua junior java developer программируем по-взро...
доклад на SQADays 2011 в Казани
Расширяем идею статического анализа от проверки кода до других процессов разр...
Конфигурационное управление и управление изменениями с IBM Rational ClearCase...

Team workflow

  • 1. Один день из жизни разработчика-исследователя
  • 4. Горизонтальное Устройство компаний • Все сотрудники компании равнозначны • Компания ведет открытую политику касательно всего • Сотрудник не может вырасти вертикально (программист  старший программист  технический директор). Должностей как таковых по сути нет
  • 5. Горизонтальное Устройство компаний • Более 300 сотрудников • Стоймость компании более 2.000.000.000$ valve employee handbook
  • 7. Горизонтальное Устройство компаний • Более 30 сотрудников • Евангелисты современного web2.0 (Ruby On Rails) • Авторы нескольких культовых книг о разработке ПО и ведении бизнеса https://gettingreal.37signals.com/
  • 8. Вертикальное Устройство компаний • Становится необходимым при увеличении количества сотрудников и усложнении структуры бизнеса • Иерархическая модель исторически более популярна и широкоприменима
  • 9. Вертикальное Устройство компаний • Более 3000 сотрудников • Самая популярная онлайн игра в мире National Geographic’s Ultimate Factories: Wargaming
  • 11. Лаборатория Фильтрации Контента • Антифишинг • Aнтиспам • Родительский контроль • Отдел аналитики • Команда инфраструктуры
  • 12. ЗАДАЧИ • Поддержка и создание инфраструктурных сервисов для внутреннего использования • Исследование новых методов анализа контента (преимущественно в области антиспама)
  • 13. Команда • 1 менеджер • 1 системный администратор • 3 тестировщика • 4 разработчика
  • 14. Общий рабочий процесс • Год – 4 квартала, глобальные цели • Квартал – квартальные цели • Цели – декомпозиция на задачи, необходимые для их достижения • Задачи – планирование, 2х недельные итерации • Итерации синхронизованы между всеми командами в отделе
  • 15. МОДЕЛИ РАЗРАБОТКИ ПО • Каскадная • Итеративная • Спиральная • Vee/Double-Vee
  • 16. Методологии Итеративной разработки ПО • Agile: • Kanban • Scrum • Feature-Driven Development • eXtreme Programming • RUP
  • 17. SCRUM • Команда маленького размера, все разработчики в идеале должны обладать одинаковой областью компетенции • Декомпозиция задач на подзадачи, выполнимые за относительно короткий промежуток времени (итерацию) • Длительность итерации – 2 недели • В конце каждой итерации – ретроспектива по недостаткам в итерации, демонстрации выполненных задач, планирование следующей итерации • В каждую итерацию закладывается фиксированное количество часов на разнообразную “текучку” • Задачи не привязаны к конкретному разработчику • Короткие встречи каждый день с обсуждением сделанного за прошлый и новостей/изменений
  • 18. SCRUM В итоге мы получаем гибкую систему, позволяющую подменять одним разработчикам других в ходе работы над проектом. Проекты разрабатываются итеративно, маленькими шагами, но с частыми интеграциями. Это позволяет заметить ошибки на ранних этапах и оперативно внести корректировки в процесс разработки/проект.
  • 19. SCRUM
  • 20. СИСТЕМЫ УПРАВЛЕНИЯ ПРОЕКТАМИ И отслеживания ошибок • JIRA • Bugzilla • Trac • YouTrack • Redmine • Basecamp • TFS • …
  • 21. СИСТЕМЫ УПРАВЛЕНИЯ ПРОЕКТАМИ И отслеживания ошибок
  • 22. СИСТЕМЫ УПРАВЛЕНИЯ ПРОЕКТАМИ И отслеживания ошибок
  • 23. ПРОЦЕСС РАЗРАБОТКИ • Кодирование • Тестирование/Подготовка к развертыванию • Багфикс (если нужен)  повторное тестирование • Развертывание
  • 24. Toolchain • OS: Linux (RHEL/CentOS) / FreeBSD • Console tools: *nix toolchain (sh/awk/sed/…) • Programming languages: C / C++ [gcc/clang] / Python [cpython] • Version control: Git • Continuous Integration: Jenkins • Deploy: ansible, system packets (rpm/tgz)
  • 25. О ПЛОХОМ И ХОРОШЕМ КОДЕ if (verbosity > 1 && U->last_local_id > 1800 && E->user_id == 6492 && ((M->flags & 199) == 0 || (U->last_local_id > 1864 && U->last_local_id < 1880))) https://github.com/vk-com/kphp-kdb/blob/f9a2f927aa97612d0c74a0e296eda8f414f13cce/text/text-index.c#L1372
  • 26. О ПЛОХОМ И ХОРОШЕМ КОДЕ case LEV_SEQ_STORE_INF + 0x100 ... LEV_SEQ_STORE_INF + 0x3ff: s = E->type & 0xff; if (size < 8 || size < sizeof (struct lev_seq_store_inf) + 4 * s + 4 * E->a) { return -2; } store_inf ((void *)E); return sizeof (struct lev_seq_store_inf) + 4 * s + 4 * E->a; case LEV_SEQ_STORE_TIME + 0x100 ... LEV_SEQ_STORE_TIME + 0x3ff: s = E->type & 0xff; if (size < 12 || size < sizeof (struct lev_seq_store_time) + 4 * s + 4 * E->b) { return -2; } store_inf ((void *)E); return sizeof (struct lev_seq_store_time) + 4 * s + 4 * E->b; … return -1; https://github.com/vk-com/kphp-kdb/blob/master/seqmap/seqmap-data.c#L1029
  • 27. О ПЛОХОМ И ХОРОШЕМ КОДЕ В промышленной разработке код должен писаться с расчетом на возможную текучку в команде и его долгую поддержку при необходимости. Соответственно код должен быть: • Протестирован и максимально полно покрыт тестами • Удобочитаем • Соответствовать командным стандартам кодирования (именование переменных/функций, применение/неприменение исключений, …) • Легок в поддержке
  • 28. О ПЛОХОМ И ХОРОШЕМ КОДЕ • Книги: • Идеальный программист. Как стать профессионалом разработки ПО • Совершенный код • Идеальный код • Чистый код • Джоэл о программировании • Просмотр и разбор качественно документированных open-source проектов • Изучение различных общепризнанных style-guide кодирования • Опыт и постоянное расширение кругозора
  • 29. О ПЛОХОМ И ХОРОШЕМ КОДЕ
  • 30. Быстрый обратный квадратный корень float Q_rsqrt( float number ) { long i; float x2, y; const float threehalfs = 1.5F; x2 = number * 0.5F; y = number; i = * ( long * ) &y; // evil floating point bit level hacking i = 0x5f3759df - ( i >> 1 ); // what the fuck? y = * ( float * ) &i; y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration // y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed return y; }
  • 31. СИСТЕМЫ УПРАВЛЕНИЯ ВЕРСИЯМИ Система управления версиями (от англ. Version Control System, VCS или Revision Control System) — программное обеспечение для облегчения работы с изменяющейся информацией. Система управления версиями позволяет хранить несколько версий одного и того же документа, при необходимости возвращаться к более ранним версиям, определять, кто и когда сделал то или иное изменение, и многое другое.
  • 32. СИСТЕМЫ УПРАВЛЕНИЯ ВЕРСИЯМИ • CVS • Bazaar • SVN • Git • Mercurial • Perforce • TFS • ….
  • 34. Юнит Тестирование Модульное тестирование, или юнит-тестирование (англ. unit testing) — процесс в программировании, позволяющий проверить на корректность отдельные модули исходного кода программы. Идея состоит в том, чтобы писать тесты для каждой нетривиальной функции или метода. Это позволяет достаточно быстро проверить, не привело ли очередное изменение кода к регрессии, то есть к появлению ошибок в уже оттестированных местах программы, а также облегчает обнаружение и устранение таких ошибок.
  • 35. Юнит Тестирование • Каждый добавленный кусок кода обязательно покрывается тестами. • Тесты должны успешно отрабатывать. • Замеряется функциональное (для каждого ли из методов в коде есть вызывающий его тест) и условное покрытие кода тестами (проход всех возможных условных веток, покрытие всех крайних условий). • Суммарное покрытие проекта тестами не должно падать ниже фиксированного значения.
  • 36. Юнит Тестирование • С++: google-mock, google-test, … • Python: pytest, pyunit, …
  • 37. Разработка Через Тестирование Разработка через тестирование (англ. test-driven development, TDD) — техника разработки программного обеспечения, которая основывается на повторении очень коротких циклов разработки: сначала пишется тест, покрывающий желаемое изменение, затем пишется код, который позволит пройти тест, и под конец проводится рефакторинг нового кода к соответствующим стандартам.
  • 39. КОД РЕВЬЮ Просмотр кода (англ. code review) или инспекция кода (англ. code inspection) — систематическая проверка исходного кода программы с целью обнаружения и исправления ошибок, которые остались незамеченными в начальной фазе разработки. Каждый коммит до попадания в репозиторий рассматривается одним (или несколькими) разработчиками с целью поиска в нем очевидных ошибок, нарушения стилистики кода либо неудачных решений. Повышает качество кода, улучшает обмен опытом в команде, тонизирует.
  • 40. СТАТИЧЕСКИЙ АНАЛИЗ КОДА Статический анализ кода (англ. static code analysis) — анализ программного обеспечения, производимый (в отличие от динамического анализа) без реального выполнения исследуемых программ.
  • 41. СТАТИЧЕСКИЙ АНАЛИЗ КОДА Позволяет находить: • Ошибки, связанные с неопределенным поведением (неиницализированные переменные) • Ошибки, связанные с известными недокументированными побочными эффектами • Переполнение буфера • Повторяющийся код • Ненужный код • Функционал, связанный с возможными оптимизациями компилятора • Некросплатформенный код • …
  • 42. СТАТИЧЕСКИЙ АНАЛИЗ КОДА const uint32 kRedCoefficient = 2125; const uint32 kGreenCoefficient = 7154; const uint32 kBlueCoefficient = 0721; const uint32 kColorCoefficientDenominator = 10000;
  • 43. СТАТИЧЕСКИЙ АНАЛИЗ КОДА const uint32 kRedCoefficient = 2125; const uint32 kGreenCoefficient = 7154; const uint32 kBlueCoefficient = 0721; const uint32 kColorCoefficientDenominator = 10000;
  • 44. СТАТИЧЕСКИЙ АНАЛИЗ КОДА void doSomething(const char* x) { char s[40]; sprintf(s, "[%s]", x); }
  • 45. СТАТИЧЕСКИЙ АНАЛИЗ КОДА void doSomething(const char* x) { char s[40]; sprintf(s, "[%s]", x); }
  • 46. СТАТИЧЕСКИЙ АНАЛИЗ КОДА • C++: cppcheck, PVS Studio / CppCat, … • Python: pychecker, pylint, pyflakes q.viva64.com
  • 47. НЕПРЕРЫВНАЯ ИНТЕГРАЦИЯ Непрерывная интеграция (англ. Continuous Integration) — это практика разработки программного обеспечения, которая заключается в выполнении частых автоматизированных сборок проекта для скорейшего выявления и решения интеграционных проблем.
  • 48. НЕПРЕРЫВНАЯ ИНТЕГРАЦИЯ • Hudson • TeamCity • Jenkins • BuildBot • Travis
  • 50. НЕПРЕРЫВНАЯ ИНТЕГРАЦИЯ • Проект забирается из указанного репозитория • Собирается в указанном окружении • После сборки проходит несколько шагов: • Проверка на прохождение тестов • Проверка на покрытие тестами • Проверка статическим анализатором кода • Проверка на возможные утечки памяти (динамический анализ с помощью valgrind) • В зависимости от статуса сборки (успешна/нет) – выполнение дополнительных шагов (рассылка информационных писем о сборке, автоматический деплой, любые другие дополнительные действия)
  • 51. РАЗВЕРТЫВАНИЕ • Пакеты (rpm/tgz) • Ansible – платформа для удаленного развертывания ПО, выполнения задач и конфигурирования. Чистый python + ssh.
  • 52. РАБОТА ТЕСТИРОВЩИКОВ Любыми способами сломать то, что мы им отдали, используя метод “черного ящика”. Для каждого проекта есть утвержденное описание всех его тест-кейсов, полностью проверяется его функциональность. Тестировщик нашел ошибку – заводится баг в TFS, разработчик забирает задачу, чинит баг, тестер проверяет заново. Повторять до получения результата.
  • 53. МОНИТОРИНГ СЕРВИСОВ В режиме реального времени постоянно производится мониторинг всех сервисов на предмет их работоспособности. В случае отказа чего-либо – рассылаются уведомления людям, связанным с работой этого сервиса.
  • 56. Y U NO WANT THESE LECTIONS • Map-Reduce, Message Queues: Hadoop, своя распределенная реализация на базе ZeroMQ • Selenium, автоматическое тестирование сторонних продуктов • NoSQL (Cassandra)