«Совершенство — враг хорошего»

"Оптимизировать позже"

«Все будет хорошо» / «Это достаточно хорошо»

«В полевых условиях этого никогда не случится»

Каждый слышал любую из этих фраз? Я уверен, что у вас есть. Все слышали о них в отношении программного обеспечения? Возможно. Но если речь шла о встроенном или системном программном обеспечении, кто бы это ни говорил, он глубоко ошибался.

Почему? Есть множество причин, по которым встроенное программное обеспечение должно быть (почти) идеальным, но есть несколько простых и очевидных. Это программное обеспечение, которое лежит в основе всего; это нижний уровень в устройствах; все остальное программное обеспечение — логика промежуточного программного обеспечения, базы данных, веб-серверы, пользовательские интерфейсы, все это в конечном итоге зависит от правильной работы нижнего уровня программного обеспечения.

А на верхнем уровне программного обеспечения — и при всем уважении к тем, кто прилагает невероятные усилия, чтобы сделать их правильными — иногда не имеет значения, отсутствуют ли пиксели в пользовательском интерфейсе или это неправильный цвет — это не особенно важно. влияют на работу нижележащего программного обеспечения.

Тестирование — это скучно

Есть грязный секрет программного обеспечения. Многие из них плохо проверены. Часть этого делается в спешке без учета остальной части системы. Тестирование поверхностное или проводится без полного понимания системы. Разработчики находят тестирование скучным или боятся того, что могут найти. QA-инженеры (те, чья работа заключается в тестировании), иногда работают без полных спецификаций или глубокого понимания, которое было у разработчика, когда они это делали (источник вечного разочарования для QA-инженеров).

Так оно и есть. Даже в мире систем/встраиваемых систем это остается верным. Но мы должны быть гораздо более осторожными при создании этого программного обеспечения. Любой промах становится очевидным быстро — по причинам, которые я изложил ранее. И поэтому прилагаются реальные усилия, чтобы сделать все очень и очень хорошо — мы проверяем ошибки везде, даже в том, что «никогда» не произойдет.

Есть много вещей, которые вы можете сделать, чтобы улучшить код заранее. Эти инструменты часто используются, но, к сожалению, не так широко. Многие разработчики никогда о них не слышали или не утруждают себя их запуском. Рассмотрим некоторые из них (это далеко не полный список):

cppcheck

Это анализатор исходного кода. Он может обнаружить логику, стиль и другие проблемы, которые компилятор часто не замечает. Иногда очень тонкие вещи, которые не очевидны на первый взгляд, такие как утечка дескриптора файла или несоответствие с бесплатным/удалением.

предупреждения компилятора

Как и некоторые разработчики, я максимально накрутил предупреждения в GCC (-Wall -Wextra -Werror), и все исправил. Некоторые из них утомительны, но, учитывая, насколько свободными могут быть языки C и C++, это может окупиться в долгосрочной перспективе. Особенно несоответствие знаков.

Вальгринд

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

Эти проблемы с памятью могут быть коварными. Они могут вызывать случайные сбои или просто сбои далеко от того места, где была создана проблема. Неинициализированная память может вызвать случайность там, где она не предполагалась, а утечки памяти — это плохо в долго работающих программах. Так что ценность подобных инструментов должна быть очевидна.

Это никогда не произойдет

В одном случае мне стало ясно, что некоторое устаревшее программное обеспечение было несколько нестабильным и могло зависнуть, а теперь еще и потому, что оно было вызвано недавними улучшениями в программном обеспечении, с которым оно взаимодействовало. Мне было ясно, помимо различных отчетов клиентов, что это будет реальная проблема клиента.

Полная сага длинная и неприятная, но было много возражений даже против того, чтобы исправить это, и неверия, что это вообще произойдет. Конечно, во время одного из моих посещений сайта именно это и произошло. В конце концов, я все-таки исправил ее — и почти 30 других подобных проблем — к сожалению, было уже слишком поздно — вовлеченные заказчик и подрядчик были настолько раздражены, что это стало в значительной степени политической катастрофой.

Вывод

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