Гниение программного обеспечения ( битовая гниль , гниение кода , эрозия программного обеспечения , распад программного обеспечения или энтропия программного обеспечения ) — это деградация, ухудшение или потеря возможности использования или производительности программного обеспечения с течением времени.
С точки зрения пользовательского опыта программного обеспечения, это эволюция операционной среды, включая аппаратное обеспечение. Первой причиной объективной потери практического использования программного обеспечения является потеря хост-системы как практической операционной среды.
Jargon File , сборник хакерских знаний, определяет «битовую гниль» как шутливое объяснение деградации программного обеспечения с течением времени, даже если «ничего не изменилось»; идея, лежащая в основе этого, почти такая же, как если бы биты, составляющие программу, подвергались радиоактивному распаду. [1]
На ухудшение качества программного обеспечения влияют несколько факторов, в том числе изменения среды, в которой работает программное обеспечение, ухудшение совместимости между частями самого программного обеспечения и появление ошибок в неиспользуемом или редко используемом коде.
Когда в среде программы происходят изменения, особенно изменения, которые разработчик программы не предвидел, программное обеспечение может больше не работать так, как изначально предполагалось. Например, многие ранние разработчики компьютерных игр использовали тактовую частоту процессора в качестве таймера в своих играх. [2] Однако более новые тактовые частоты процессора были быстрее, поэтому скорость игрового процесса соответственно увеличивалась, делая игры менее удобными с течением времени.
Изменения в среде связаны не с разработчиком программы, а с ее пользователями. Изначально пользователь может привести систему в рабочее состояние и заставить ее работать безупречно в течение определенного времени. Но когда система перестает работать правильно или пользователи хотят получить доступ к элементам управления конфигурацией, они не могут повторить этот начальный шаг из-за другого контекста и недоступной информации (утерян пароль, отсутствуют инструкции или просто сложный в управлении пользовательский интерфейс , который был изначально настроен методом проб и ошибок). Информационный архитектор Йонас Сёдерстрём назвал эту концепцию onceability [3] и определяет ее как «качество в технической системе , которое не позволяет пользователю восстановить систему после того, как она вышла из строя».
Редко используемые части кода, такие как фильтры документов или интерфейсы, разработанные для использования другими программами, могут содержать ошибки, которые остаются незамеченными. При изменении требований пользователя и других внешних факторов этот код может быть выполнен позже, тем самым выявляя ошибки и делая программное обеспечение менее функциональным.
Нормальное обслуживание программного обеспечения и систем также может привести к порче программного обеспечения. В частности, когда программа содержит несколько частей , которые функционируют на расстоянии вытянутой руки друг от друга, неспособность учесть, как изменения в одной части, влияющие на другие, могут привести к ошибкам.
В некоторых случаях это может выражаться в изменении библиотек, используемых программным обеспечением, таким образом, что это негативно влияет на программное обеспечение. Если старая версия библиотеки, которая ранее работала с программным обеспечением, больше не может использоваться из-за конфликтов с другим программным обеспечением или из-за уязвимостей безопасности, обнаруженных в старой версии, возможно, больше не будет жизнеспособной версии необходимой библиотеки для использования программой.
Современное коммерческое программное обеспечение часто подключается к онлайн-серверу для проверки лицензии и доступа к информации. Если онлайн-сервис, обеспечивающий работу программного обеспечения, закрыт, оно может перестать работать. [4] [5]
С конца 2010-х годов большинство веб-сайтов используют защищенные HTTPS- соединения. Однако для этого требуются ключи шифрования, называемые корневыми сертификатами, которые имеют даты истечения срока действия. После истечения срока действия сертификатов устройство теряет подключение к большинству веб-сайтов, если ключи не обновляются постоянно. [6]
Другая проблема заключается в том, что в марте 2021 года старые стандарты шифрования TLS 1.0 и TLS 1.1 были объявлены устаревшими . [7] Это означает, что операционные системы, браузеры и другое онлайн-программное обеспечение, которые не поддерживают как минимум TLS 1.2, не могут подключаться к большинству веб-сайтов, даже для загрузки исправлений или обновления браузера, если они доступны. Это иногда называют «TLS-апокалипсисом».
Продукты, которые не могут подключаться к большинству веб-сайтов, включают PowerMac, старые Unix-боксы и версии Microsoft Windows старше Server 2008/Windows 7 (по крайней мере без использования стороннего браузера). Браузер Internet Explorer 8 в Server 2008/Windows 7 поддерживает TLS 1.2, но он отключен по умолчанию. [8]
Программное гниение обычно классифицируется как «спящее гниение» или «активное гниение».
Программное обеспечение, которое в настоящее время не используется, постепенно становится непригодным к использованию, поскольку остальная часть приложения изменяется. Изменения в требованиях пользователей и программной среде также способствуют ухудшению.
Постоянно модифицируемое программное обеспечение может со временем потерять свою целостность, если не применять надлежащие смягчающие процессы последовательно. Однако большая часть программного обеспечения требует постоянных изменений для соответствия новым требованиям и исправления ошибок, а перепроектирование программного обеспечения каждый раз после внесения изменений редко бывает практичным. Это создает то, что по сути является процессом эволюции программы, заставляя ее отходить от первоначального спроектированного проекта. Вследствие этого и изменяющейся среды предположения, сделанные первоначальными проектировщиками, могут оказаться недействительными, тем самым внося ошибки.
На практике добавление новых функций может быть приоритетнее обновления документации ; однако без документации возможна потеря определенных знаний, относящихся к частям программы. В некоторой степени это можно смягчить, следуя лучшим современным практикам кодирования соглашений .
Активное гниение программного обеспечения замедляется, когда приложение приближается к концу своей коммерческой жизни и дальнейшая разработка прекращается. Пользователи часто учатся обходить любые оставшиеся программные ошибки , и поведение программного обеспечения становится постоянным, поскольку ничего не меняется.
Многие основополагающие программы из ранних дней исследований ИИ пострадали от непоправимой программной гнили. Например, оригинальная программа SHRDLU (ранняя программа понимания естественного языка) не может быть запущена ни на одном современном компьютере или компьютерном симуляторе, поскольку она была разработана в те дни, когда LISP и PLANNER все еще находились в стадии разработки, и поэтому использует нестандартные макросы и программные библиотеки, которые больше не существуют.
Предположим, администратор создает форум с использованием программного обеспечения для форумов с открытым исходным кодом , а затем значительно модифицирует его, добавляя новые функции и опции. Этот процесс требует значительных изменений в существующем коде и отклонения от исходной функциональности этого программного обеспечения.
Отсюда следует, что сбой программного обеспечения может повлиять на систему несколькими способами:
Предположим, что веб-мастер устанавливает последнюю версию MediaWiki , программного обеспечения, которое поддерживает вики, такие как Wikipedia, а затем никогда не применяет никаких обновлений. Со временем веб-хостинг, скорее всего, обновит свои версии языка программирования (например, PHP ) и базы данных (например, MariaDB ) без консультации с веб-мастером. По прошествии достаточно длительного времени это в конечном итоге сломает сложные веб-сайты, которые не были обновлены, потому что последние версии PHP и MariaDB будут иметь критические изменения, поскольку они жестко устарели некоторые встроенные функции , нарушая обратную совместимость и вызывая фатальные ошибки . Другие проблемы, которые могут возникнуть с необновленным программным обеспечением веб-сайта, включают уязвимости безопасности и спам .
Рефакторинг — это способ решения проблемы гниения программного обеспечения. Он описывается как процесс переписывания существующего кода для улучшения его структуры без влияния на его внешнее поведение. [9] Это включает удаление мертвого кода и переписывание разделов, которые были значительно изменены и больше не работают эффективно. Необходимо проявлять осторожность, чтобы не изменить внешнее поведение программного обеспечения, поскольку это может привести к несовместимости и, таким образом, само по себе способствовать гниению программного обеспечения. Некоторые принципы проектирования, которые следует учитывать при рефакторинге, — это поддержание иерархической структуры кода и реализация абстракции для упрощения и обобщения структур кода. [10]
Энтропия программного обеспечения описывает тенденцию к исправлению и модификации программной системы, приводящую к постепенной потере ее структуры или увеличению сложности. [11] Мэнни Леман использовал термин «энтропия» в 1974 году для описания сложности программной системы и для проведения аналогии со вторым законом термодинамики . Законы эволюции программного обеспечения Лемана гласят, что сложная программная система будет требовать постоянных модификаций для поддержания своей релевантности окружающей среде, и что такие модификации будут увеличивать энтропию системы, если не будет выполнена определенная работа по ее снижению. [12]
Ивар Якобсон и др. в 1992 году описали энтропию программного обеспечения аналогичным образом и утверждали, что это увеличение беспорядка по мере модификации системы в конечном итоге всегда делает поддержку программной системы неэкономичной, хотя время, пока это произойдет, во многом зависит от ее первоначальной конструкции и может быть увеличено путем рефакторинга. [13]
В 1999 году Эндрю Хант и Дэвид Томас использовали починку разбитых окон в качестве метафоры для избежания программной энтропии при разработке программного обеспечения. [14]