— Илья, вы много лет разрабатываете программное обеспечение, в том числе при вашем участии созданы такие важные для общества инновационные цифровые решения как медицинская информационная система «Смарт Медицина» и платформа по выкупу смартфонов в компании «Авито». С высоты вашего опыта можете сказать, какие ошибки бывают в программировании?
— Прежде всего, синтаксические. Для наглядности можно провести аналогию с орфографическими и грамматическими ошибками в русском языке: например, разработчик неправильно написал команду (ошибся в слове), забыл специальный символ (неправильно поставил запятую) или перепутал местами слова (вместо «буду дома в девять» — «девять буду дома в»).
Есть группа ошибок, которые носят название «компиляционные». Они чаще всего происходят из-за синтаксических, но только в языках программирования, которые преобразовываются в машинный код (exe, dll, so и другие файлы-программы).
Предыдущие два вида ошибок можно легко найти и исправить при запуске программы, но другие нет. Во время выполнения программы (runtime) нередко допускаются ошибки по таким причинам, которые можно выявить только во время работы или тестирования программы. К этой категории относятся арифметические, логические, ресурсные ошибки и ряд других. Примерами могут служить невозможность найти удаленный файл, попытка поделить на ноль в калькуляторе, нехватка памяти, неправильное округление числа.
Периодически арифметические ошибки случаются при неаккуратном обращении со сверхбольшими и сверхмалыми числами: например, 1/333333333*333333333 может стать 0.99999994 вместо 1 на 32 разрядных машинах.
Если во внешнюю систему должна попадать цена в рублях без копеек, а команда разработчиков передает ее с копейками, то это относится к неправильной стыковке работы нескольких систем (как программных, так и аппаратных) и называется ошибкой взаимодействия.
Периодически допускают ошибки среды выполнения, когда ПО писалось под другую аппаратную или программную оснастку. Например, создавали программу для Linux, а пытаются запустить для Windows (или переписали для Windows, но не учли некоторые различия).
Грамотные специалисты непременно должны разбираться во всевозможных ошибках и стремиться избегать их в своей работе.
— В «Авито» и «Smart Медицине» вы сделали большой вклад в то, чтобы получились цифровые продукты высокого качества. Можете рассказать, как надо исправлять ошибки в программах на этапе разработки?
— Если говорить простыми словами, то прежде всего ошибку необходимо выявить. Некоторые дефекты и нарушения, допущенные в процессе разработки, обнаружить легко. А бывают такие ошибки — логические, — которые найти тяжелее всего: например, если программист перепутал знак < или >; сделал бесконечный цикл; сложил там, где нужно вычитать; перепутал местами поля «налоги» и «зарплата». Обнаружить подобные дефекты помогают тестирование (проверка) и логирование (запись информации об ошибке в базу данных), для того чтобы в случае возникновения ошибки команда тестировщиков могла ее быстро найти и исправить.
Выявив ошибку, необходимо определить ее приоритет и серьезность. За оценку по критерию серьезности отвечает специалист контроля качества (Quality Assurance): он анализирует, насколько сильный вред ошибка наносит проекту.
А проектная команда (менеджер проекта и иногда разработчики) оценивает приоритет ошибки (Priority). Он бывает высоким, средним и низким.
P1 — Высокий (High). Означает, что необходимо исправить ошибку незамедлительно, потому что из-за нее в проекте будет серьезное нарушение.
P2 — Средний (Medium). Подразумевается, что ошибку следует непременно исправить и, по возможности, чем скорее, тем лучше, однако во вторую очередь, после того, как не остается ошибок из категории P1.
P3 — Низкий (Low). Здесь понятно, что ошибку надо исправить, но в плановом порядке, так как она не наносит проекту большого вреда.
Количество приоритетов может зависит от области, для которой разрабатывается ПО.
После того, как определили серьезность и приоритет ошибки, начинают работать над ее устранением. Для каждой категории дефектов существуют разные способы. Например, бывают ресурсные ошибки — нехватка памяти или вычислительной мощности на компьютере: здесь быстром решением является увеличение мощности компьютера. Альтернатива — оптимизация ПО.
— Как происходит такое, что в наше время ошибки не замечаются даже в крупных компаниях, у которых есть средства, чтобы нанять хороших программистов и управлять, применяя передовые практики менеджмента?
— Опираясь на свой профессиональный и жизненный опыт могу сказать — в мире, а в частности, и в сфере информационных технологий, не бывает такого, что нашли некую общую причину, устранили ее, и в дальнейшем никаких нарушений и дефектов нет. Людям свойственно допускать ошибки, и машинам тоже: автоматизация помогает улучшить ситуацию, но не делает ее идеальной.
На этапе создания ПО всегда оцениваются различные риски и рассматриваются возможные сценарии, однако могут быть не учтены специфические случаи, которые и приведут к ошибке. Далее, на этапе реализации, разработчик может устать или поспешить и в результате допустить логическую ошибку. Также и на этапе тестирования сотрудник, ответственный за контроль качества, может ее не заметить: поэтому ошибка просочится в готовую систему. Да, существует мутационное тестирование, оно меняет код и подсвечивает тесты, которые не отлавливают новых ошибок. Также есть фаззинг-тестирование, — изменение входных данных в попытках найти случаи, когда программа отрабатывает некорректно. Но даже весь этот набор инструментов не даст нам 100% гарантию, что ПО будет работать безошибочно. И так может произойти в компании любого масштаба.
— Как в компании, основной бизнес которой не связан с информационными технологиями, организовать работу IT-отдела, чтобы свести к минимуму шансы ошибок в программировании?
— На этот вопрос нельзя дать простой ответ. Организация IT-отдела в компании, основная деятельность которой не связана напрямую с информационными технологиями, может представлять собой сложную задачу. На мой взгляд, чтобы снизить риск ошибок в IT-отделе, руководителю полезно учесть следующее.
Команда IT-отдела должна тесно сотрудничать с другими подразделениями, чтобы полностью вникнуть в процессы, цели и задачи компании. Такой подход позволит снизить риск ошибок, связанных с тем, что программисты плохо понимают потребности бизнеса. Разные отделы (развития бизнеса, маркетинга, производства) должны озвучивать IT-команде свое видение и рассказывать об ожиданиях от проекта. Если что-то непонятно в объяснениях программистов, надо обязательно задавать вопросы.
Важную роль в предотвращении ошибок играют правильный подбор и обучение сотрудников IT-отдела. Подчеркну снова, так как считаю это критически важным, что программистов, системных администраторов, менеджеров проектов, тестировщиков необходимо знакомить с бизнес-процессами компании уже во время онбординга и обучения.
Значительно уменьшить вероятность ошибок помогает автоматизация — прежде всего, системы непрерывной интеграции и доставки (CI/CD: Continuous integration and continuous delivery). Некоторые компании предпочитают снижать расходы и не приобретать специализированное ПО. Отказываться от CI/СD, когда на предприятии есть IT-отдел, — это тот случай, когда есть шанс, сэкономив один рубль, получить убыток на десять.
И, конечно, необходимо заранее назначить ответственных за контроль качества. Так вы сразу очертите границы зон ответственности, и команда будет мотивирована работать с большим вниманием. Это также позволит оперативно реагировать на проблемы и вносить коррективы в процессы разработки.