Hitech logo

Кейсы

Как эффективно организовать работу IT-отдела и снизить риск технических ошибок

TODO:
Елена Верещагина18 июля 2022 г., 08:35

Ошибки в программировании могут нанести экономический ущерб и даже стать угрозой здоровью и жизни людей. Ярким примером явился громкий случай, когда ошибка программистов при создании аппарата лучевой терапии Therac-25 в 1990 году унесла жизни 10 человек. Если говорить о происшествиях XXI века, то всего несколько лет назад из-за роковой ошибки в новой версии программного обеспечения по контролю топлива в двигателях грузового самолета Airbus погибли 4 члена экипажа (Испания, 2015 год). Когда ошибка вызывает просто экономический ущерб, это все равно может привести к существенным потерям: например, Knight Capital Group в 2012 году за 40 минут лишилась сотен млн долларов и 75% своей стоимости. В 2017 компания GitLab потеряла данные 300 млн пользователей. Какие ошибки бывают в программировании и как компаниям организовать работу IT-отдела, чтобы минимизировать риск ошибок, рассказывает эксперт в сфере информационных технологий, программист, старший инженер-разработчик «Авито» Илья Сергунин.

Самые интересные технологические и научные новости выходят в нашем телеграм-канале Хайтек+. Подпишитесь, чтобы быть в курсе.

— Илья, вы много лет разрабатываете программное обеспечение, в том числе при вашем участии созданы такие важные для общества инновационные цифровые решения как медицинская информационная система «Смарт Медицина»  и платформа по выкупу смартфонов в компании «Авито». С высоты вашего опыта можете сказать, какие ошибки бывают в программировании?

— Прежде всего, синтаксические. Для наглядности можно провести аналогию с орфографическими и грамматическими ошибками в русском языке: например, разработчик неправильно написал команду (ошибся в слове), забыл специальный символ (неправильно поставил запятую) или перепутал местами слова (вместо «буду дома в девять» — «девять буду дома в»).

Есть группа ошибок, которые носят название «компиляционные». Они чаще всего происходят из-за синтаксических, но только в языках программирования, которые преобразовываются в машинный код (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-отдел, — это тот случай, когда есть шанс, сэкономив один рубль, получить убыток на десять.

И, конечно, необходимо заранее назначить ответственных за контроль качества. Так вы сразу очертите границы зон ответственности, и команда будет мотивирована работать с большим вниманием. Это также позволит оперативно реагировать на проблемы и вносить коррективы в процессы разработки.