1 of 48

Хроники стартапа, созданного программистами

14 лет, 4 принципа

Андрей Карпов

PVS-Studio, DevRel

2 of 48

Андрей Карпов

Один из основателей проекта PVS-Studio,

DevRel, к.ф.-м.н.,

karpov@viva64.com

2

Докладчик

3 of 48

Что такое PVS-Studio

  • Статический анализатор кода
  • Ищет ошибки и потенциальные уязвимости
  • Является B2B решением

  • www.pvs-studio.com

3

4 of 48

Пример

  • Вместо многих слов рассмотрим интересный пример
  • Библиотека Protocol Buffers
  • Подробности смотрите в статье “31 февраля” �https://pvs-studio.com/ru/blog/posts/cpp/0550/

4

5 of 48

static const int kDaysInMonth[13] = {

0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31

};

bool ValidateDateTime(const DateTime& time) {

if (time.year < 1 || time.year > 9999 ||

time.month < 1 || time.month > 12 ||

time.day < 1 || time.day > 31 ||

time.hour < 0 || time.hour > 23 ||

time.minute < 0 || time.minute > 59 ||

time.second < 0 || time.second > 59) {

return false;

}

if (time.month == 2 && IsLeapYear(time.year)) {

return time.month <= kDaysInMonth[time.month] + 1;

} else {

return time.month <= kDaysInMonth[time.month];

}

}

6 of 48

static const int kDaysInMonth[13] = {

0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31

};

bool ValidateDateTime(const DateTime& time) {

if (time.year < 1 || time.year > 9999 ||

time.month < 1 || time.month > 12 ||

time.day < 1 || time.day > 31 ||

time.hour < 0 || time.hour > 23 ||

time.minute < 0 || time.minute > 59 ||

time.second < 0 || time.second > 59) {

return false;

}

if (time.month == 2 && IsLeapYear(time.year)) {

return time.month <= kDaysInMonth[time.month] + 1;

} else {

return time.month <= kDaysInMonth[time.month];

}

}

7 of 48

static const int kDaysInMonth[13] = {

0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31

};

bool ValidateDateTime(const DateTime& time) {

if (time.year < 1 || time.year > 9999 ||

time.month < 1 || time.month > 12 ||

time.day < 1 || time.day > 31 ||

time.hour < 0 || time.hour > 23 ||

time.minute < 0 || time.minute > 59 ||

time.second < 0 || time.second > 59) {

return false;

}

if (time.month == 2 && IsLeapYear(time.year)) {

return time.month <= kDaysInMonth[time.month] + 1;

} else {

return time.month <= kDaysInMonth[time.month];

}

}

8 of 48

static const int kDaysInMonth[13] = {

0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31

};

bool ValidateDateTime(const DateTime& time) {

if (time.year < 1 || time.year > 9999 ||

time.month < 1 || time.month > 12 ||

time.day < 1 || time.day > 31 ||

time.hour < 0 || time.hour > 23 ||

time.minute < 0 || time.minute > 59 ||

time.second < 0 || time.second > 59) {

return false;

}

if (time.month == 2 && IsLeapYear(time.year)) {

return time.month <= kDaysInMonth[time.month] + 1;

} else {

return time.month <= kDaysInMonth[time.month];

}

}

time.day

9 of 48

2008 год. Первый офис, два основателя

9

10 of 48

Генезис

  • … поиск 64-битных ошибок в C, C++ коде
  • 2010 – поиск ошибок общего типа в C, C++
  • 2014-2015 – CppCat
  • 2015 – C#
  • 2016 – Linux
  • 2019 – Java
  • 2020 – освоили удалённый режим, SAST

10

11 of 48

2021. 40 человек

11

12 of 48

2022, 50 человек

12

13 of 48

Как суметь развиваться 14 лет

13

14 of 48

4 главных принципа

  • Принцип MVP в разработке
  • Принцип MVP в процессах
  • Профилактика выгорания
  • Эксперименты

14

15 of 48

MVP - minimum viable product

  • Минимально жизнеспособный продукт, который позволяет получить осмысленную обратную связь от пользователей, понять что им нужно и не создавать то, что им неинтересно. Сразу зарабатываем деньги.

15

16 of 48

Статья в тему

16

17 of 48

MVP в разработке

17

18 of 48

Разработка

18

19 of 48

Разработка

  • Нет смысла делать идеальный разбор кода
  • Пользователи не оценят, что разобрали 99,99% кода, а не 99%
  • Главное - не падать
  • А время лучше потратить, чтобы находить не 100 ошибок, а 110

19

20 of 48

Разработка

  • Плохо:
    • Сделать идеально и никому не рассказать
  • Хорошо:
    • Сделать нормально и рассказать миру

  • Идеально:
    • Переосмыслить имеющееся, минимально поработать и рассказать миру
    • Как PVS-Studio стал SAST решением
      • CWE (Common Weakness Enumeration)
      • CERT
      • Страничка SAST�

20

21 of 48

Разработка

  • Compiler Explorer: https://godbolt.org/
  • Можно заморочиться с бесплатной лицензией
  • А можно просто проверять без лицензии файлы tmp/example.cpp

21

22 of 48

Разработка

  • "Признак хорошей диагностики - про неё можно написать в статье"�(с) Менеджер продукта Святослав Размыслов

  • Это не значит, что не надо делать MISRA и т.д.
  • Но явно не лучшая идея начинать с формальных диагностик
  • Много про ошибку “в коде есть goto” не написать

22

23 of 48

MVP в процессах

23

24 of 48

Процессы

  • Нужно использовать как можно более простые процессы, пока это не начинает мешать

  • Идеология с «прочным фундаментом» не подходит.�Можно умереть, вкладывая силы в ненужную бюрократию.�Процессы, в отличие от фундамента, можно менять и совершенствовать!

24

25 of 48

Процессы

  • Вернёмся во времена, когда в команде было 2-4 человека
  • Мы не использовали багтрекер
  • Было:
    • Письма в почте
    • У каждого свой todo-файл
  • Помню, кому-то рассказывал, он смеялся: «Не серьезно всё у вас»

  • Это было осознанное, правильное решение!
  • Подобные упрощения помогают не умереть из-за преждевременной бюрократии

25

26 of 48

Процессы

  • Развитие процессов по необходимости

  • Учёт задач в багтрекере
  • DevOps, CI/CD (непрерывная интеграция / непрерывное развертывание)
  • Митинги
  • Один-на-один
  • Канбан
  • Автоматизация отдела продаж

26

27 of 48

Процессы

  • Усложнение процессов неизбежно. Не переживайте про «когда».�Вы почувствуете! ☺

  • Главное развиваться и учиться новому
  • Как почувствуете, что назрело - внедряйте
  • Не внедряйте «про запас»

27

28 of 48

Рост людей вместе с компанией

  • Это может быть непонятно проактивным людям
  • Некоторым не нужно больше определённого уровня
  • С такими людьми будет сложно в стартапе
  • Кто-то может не захотеть развиваться вместе с усложнением процессов
  • Придётся расставаться

28

29 of 48

Процессы

  • Книги
    • Дейл Карнеги, например: Как эффективно общаться с людьми
    • Камиль Фурнье. От разработчика до руководителя. Менеджмент для IT-специалистов

29

30 of 48

Профилактика выгорания

30

31 of 48

Профилактика выгорания

  • PVS-Studio - айсберг
  • В долгосрочном проекте основатели и сотрудники работают ДОЛГО
  • Значит, надо понять и принять, что необходима профилактика выгорания

31

32 of 48

Профилактика выгорания

  • Что такое выгорание
  • Надеюсь подробнее расскажу в одном из следующих докладов

  • t.me/programming_events_uz

32

33 of 48

Профилактика выгорания

  • Что нам помогает жить: разнообразие задач и воля начинать новое
    • Программирование разной направленности
    • Написание статей
    • Выступление с докладами
    • Работа на стенде
    • Помощь отделу маркетинга
    • Внедрение новых процессов (Канбан, один-на-один)
    • Улучшения офиса

    • Есть реакция: отвлекает от дела.�Но по итогу разнообразие лучше, чем монотонное «дело».

33

34 of 48

Профилактика выгорания

  • Различные активности в офисе и во вне

34

35 of 48

Профилактика выгорания

35

36 of 48

Эксперименты

36

37 of 48

Эксперименты

  • Многие делают ошибку в жизни и бизнесе, стараясь сразу силой мысли найти одно верное решение
  • Так это не работает
  • Нужно перебирать, перебирать варианты

  • Это как при поиске лекарства,�пробуешь, пробуешь и что-то вдруг работает

37

38 of 48

Удачи и неудачи

  • + Откуда пошли общие диагностики
  • - История CppCat (на тему «советчиков»)
  • + Написание статей про проверку проектов
  • - Поддержка OpenMP
  • + Дарить сувениры докладчикам на конференциях (потом легче общаться)
  • - Вынужденный эксперимент с удалённой работой

38

39 of 48

Выводы

  • Надо делать то, что надо!�А что не надо, делать не надо!

  • «Идеальными решениями вымощена дорога к банкротству»�(чем меньше компания, тем актуальнее)

  • Обучение. Полезно для развития процессов и как профилактика выгорания

  • Профилактика выгорания

  • Сделай что-то, и обретёшь силу

39

40 of 48

И под конец, немного историй

40

41 of 48

Время забавных историй

  • Вот будет своя собственная компания, будем делать только то, что интересно (программировать)
  • Угадайте, чем можно развлечь себя зимой?

41

42 of 48

Время забавных историй

  • Вот будет своя собственная компания, будем делать только то, что интересно (программировать)
  • Угадайте, чем можно развлечь себя зимой?

42

43 of 48

Время забавных историй

  • Что может сорвать релиз?

43

44 of 48

Время забавных историй

  • Что может сорвать релиз?

44

45 of 48

Время забавных историй

  • Много интересного с поддержкой
  • Рекомендую:�Юрий Минаев “Не связывайтесь с поддержкой C++ программистов”�https://youtu.be/o7YhI5-YaEk

45

46 of 48

Время забавных историй

  • Самый сложный случай, как объяснить таксисту куда ехать

46

47 of 48

Время забавных историй

  • Самый сложный случай, как объяснить таксисту куда ехать
  • Уехать с парковки на крыше Crocus City

47

48 of 48

Время ответов на вопросы

48

PVS-Studio www.pvs-studio.com

Андрей Карпов karpov@viva64.com

Telegram PVS-Studio & IT Events UZ

https://t.me/programming_events_uz