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