Я разработчик Monocle: бесплатной, кроссплатформенной, высокопроизводительной системы управления видео с сервером, настольным клиентом, телефонным приложением и веб-интерфейсом. Эта статья о том, что помогло мне создать этот пакет программного обеспечения и что я мог бы сделать по-другому в следующий раз. Ваши собственные обстоятельства будут другими, и я могу говорить только за себя.

Стремитесь к совершенству, довольствуйтесь хорошим

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

Поддерживайте стабильность общедоступных интерфейсов

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

Диспетчер пакетов

Я потратил много времени на управление зависимостями вручную, которые постепенно становились неработоспособными по мере роста количества пакетов. Миграция на vcpkg заняла много времени, но это то, что я должен был сделать с самого начала. Monocle теперь имеет более 300 зависимостей.

Кроссплатформенность

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

Отладка

Упростите запуск сеанса отладки. Проект Monocle в Visual Studio — хороший пример, когда можно одновременно отлаживать несколько процессов одним щелчком мыши, что упрощает отслеживание проблем. Пошаговое взаимодействие между процессами особенно полезно при выявлении проблем, связанных с неправильным пониманием данных, путем пошагового прохождения конвейера отправки и получения от одного процесса к другому.

Использование стандартных отраслевых систем

Часто стандартное решение не удовлетворяет всем вашим требованиям, однако стоимость создания и поддержки собственного зачастую очень высока. Monocle широко использует vcpkg, Boost io_service, CMake, GRPC, GTest и многие другие, но также имеет множество собственных пользовательских библиотек данных и обработки. Потратьте время на понимание ограничений пакета или платформы и тщательно сбалансируйте затраты, прежде чем зафиксировать выбор.

Ведение журнала

Клиенты, использующие свои собственные серверы, могут загрузить со своих серверов файл «отладки», который содержит моментальный снимок сервера в формате json, включая все журналы, которые затем могут быть отправлены в службу поддержки в случае возникновения технических проблем. Это сэкономило много времени при решении проблем клиентов, поскольку служба поддержки не требует, чтобы пользователи взаимодействовали со своим программным обеспечением для диагностики проблем с сервером.

Документация

Автоматизация захвата скриншотов и создания документации с помощью LaTeX стала частью процесса выпуска и сэкономила много времени.

Шаблоны

По возможности избегайте использования шаблонов в местах, которые могут часто включаться #include. Коммуникационная библиотека ONVIF в Monocle использует слишком много шаблонов, в основном без необходимости, и это привело к резкому увеличению времени компиляции.

Обработка ошибок

Независимо от того, выбираете ли вы исключения, возвращаемые значения или что-то еще, просто сделайте это согласованным.

Настойчивость и решительность

Без этого вы можете получить незавершенные нити или мертвый проект, а проработка и завершение компонентов помогает поддерживать мотивацию.