Программное обеспечение состоит из компьютерных программ , которые дают указания компьютеру о выполнении работы . [ 1] Программное обеспечение также включает в себя проектную документацию и спецификации.
История программного обеспечения тесно связана с развитием цифровых компьютеров в середине 20-го века. Ранние программы были написаны на машинном языке, специфичном для аппаратного обеспечения. Введение языков программирования высокого уровня в 1958 году позволило использовать больше инструкций, понятных человеку, что сделало разработку программного обеспечения более простой и переносимой между различными архитектурами компьютеров . Программное обеспечение на языке программирования запускается через компилятор или интерпретатор для выполнения на оборудовании архитектуры. Со временем программное обеспечение стало сложным из-за развития сетей , операционных систем и баз данных .
Программное обеспечение можно разделить на два основных типа:
Рост облачных вычислений привел к появлению новой модели поставки программного обеспечения — Software as a Service (SaaS). В SaaS приложения размещаются у провайдера и доступны через Интернет .
Процесс разработки программного обеспечения включает несколько этапов. Эти этапы включают проектирование программного обеспечения , программирование , тестирование , выпуск и обслуживание . Обеспечение качества и безопасность программного обеспечения являются критически важными аспектами разработки программного обеспечения, поскольку ошибки и уязвимости безопасности могут привести к сбоям системы и нарушениям безопасности. Кроме того, юридические вопросы, такие как лицензии на программное обеспечение и права интеллектуальной собственности, играют важную роль в распространении программных продуктов.
Первое использование слова «программное обеспечение» приписывают математику Джону Уайлдеру Тьюки в 1958 году. [3] Первые программируемые компьютеры, которые появились в конце 1940-х годов, [4] были запрограммированы на машинном языке . Машинный язык сложен для отладки и непереносим на другие компьютеры. [5] Первоначально аппаратные ресурсы были дороже человеческих ресурсов . [6] По мере того, как программы становились сложными, производительность программистов стала узким местом. Введение языков программирования высокого уровня в 1958 году скрыло детали оборудования и выразило базовые алгоритмы в коде. [7] [8] Ранние языки включают Fortran , Lisp и COBOL . [8]
Существует два основных типа программного обеспечения:
Программное обеспечение также можно классифицировать по способу его развертывания . Традиционные приложения приобретаются с бессрочной лицензией на определенную версию программного обеспечения, загружаются и запускаются на оборудовании, принадлежащем покупателю. [17] Развитие Интернета и облачных вычислений позволило создать новую модель — программное обеспечение как услуга (SaaS), [18] в которой поставщик размещает программное обеспечение (обычно построенное поверх арендованной инфраструктуры или платформ ) [19] и предоставляет использование программного обеспечения клиентам, часто в обмен на абонентскую плату . [17] К 2023 году продукты SaaS, которые обычно поставляются через веб-приложение , стали основным методом, с помощью которого компании доставляют приложения. [20]
Компании-разработчики программного обеспечения стремятся поставлять высококачественный продукт в срок и в рамках бюджета. Проблема заключается в том, что оценка усилий по разработке программного обеспечения часто бывает неточной. [21] Разработка программного обеспечения начинается с замысла проекта, оценки его осуществимости, анализа бизнес-требований и создания программного обеспечения . [22] [23] Большинство программных проектов ускоряют свою разработку за счет повторного использования или включения существующего программного обеспечения, либо в форме коммерческого готового программного обеспечения (COTS), либо программного обеспечения с открытым исходным кодом . [24] [25] Обеспечение качества программного обеспечения, как правило, представляет собой комбинацию ручного просмотра кода другими инженерами [26] и автоматизированного тестирования программного обеспечения . Из-за ограничений по времени тестирование не может охватить все аспекты предполагаемой функциональности программного обеспечения, поэтому разработчики часто сосредотачиваются на наиболее важной функциональности. [27] Формальные методы используются в некоторых критически важных для безопасности системах для подтверждения правильности кода, [28] в то время как тестирование пользовательского приема помогает гарантировать, что продукт соответствует ожиданиям клиентов. [29] Существует множество методологий разработки программного обеспечения , которые варьируются от выполнения всех шагов по порядку до параллельных и итеративных моделей. [30] Разработка программного обеспечения обусловлена требованиями, полученными от потенциальных пользователей, в отличие от обслуживания, которое обусловлено такими событиями, как запрос на изменение. [31]
Часто программное обеспечение выпускается в незавершенном состоянии, когда у команды разработчиков заканчивается время или финансирование. [32] Несмотря на тестирование и обеспечение качества , практически все программное обеспечение содержит ошибки , из-за которых система не работает так, как задумано. Техническое обслуживание программного обеспечения после выпуска необходимо для устранения этих ошибок, когда они обнаруживаются, и для поддержания работоспособности программного обеспечения, поскольку окружающая среда со временем меняется. [33] Новые функции часто добавляются после выпуска. Со временем уровень технического обслуживания становится все более ограниченным, прежде чем полностью прекратиться, когда продукт изымается с рынка. [34] По мере старения программного обеспечения оно становится известным как устаревшее программное обеспечение и может оставаться в использовании в течение десятилетий, даже если не осталось никого, кто знает, как его исправить. [35] В течение срока службы продукта техническое обслуживание программного обеспечения, по оценкам, составляет 75 процентов или более от общей стоимости разработки. [36] [37]
Завершение программного проекта требует различных форм экспертизы, не только в области программирования , но и тестирования, написания документации, управления проектами , графического дизайна , пользовательского опыта , поддержки пользователей, маркетинга и сбора средств. [38] [39] [23]
Качество программного обеспечения определяется как соответствие заявленным требованиям, а также ожиданиям клиентов. [40] Качество — это всеобъемлющий термин, который может относиться к правильному и эффективному поведению кода, его возможности повторного использования и переносимости или простоте модификации. [41] Обычно более экономически выгодно встраивать качество в продукт с самого начала, а не пытаться добавить его позже в процессе разработки. [42] Более качественный код снизит стоимость жизненного цикла как для поставщиков, так и для клиентов, поскольку он более надежен и прост в обслуживании . [43] [44] Сбои программного обеспечения в критически важных для безопасности системах могут быть очень серьезными, включая смерть. [43] По некоторым оценкам, стоимость некачественного программного обеспечения может достигать 20–40 процентов от продаж. [45] Несмотря на цель разработчиков поставлять продукт, который работает полностью так, как задумано, практически все программное обеспечение содержит ошибки. [46]
Развитие Интернета также значительно увеличило потребность в компьютерной безопасности , поскольку это позволило злоумышленникам проводить кибератаки удаленно. [47] [48] Если ошибка создает риск безопасности, она называется уязвимостью . [49] [50] Для исправления выявленных уязвимостей часто выпускаются исправления программного обеспечения , но те, которые остаются неизвестными ( нулевые дни ), а также те, которые не были исправлены, по-прежнему подлежат эксплуатации. [51] Уязвимости различаются по своей способности использоваться злоумышленниками , [49] и фактический риск зависит от характера уязвимости, а также от ценности окружающей системы. [52] Хотя некоторые уязвимости могут использоваться только для атак типа «отказ в обслуживании» , которые ставят под угрозу доступность системы, другие позволяют злоумышленнику внедрять и запускать собственный код (так называемое вредоносное ПО ) без ведома пользователя. [49] Чтобы предотвратить кибератаки, все программное обеспечение в системе должно быть разработано так, чтобы выдерживать внешние атаки и восстанавливаться после них. [48] Несмотря на усилия по обеспечению безопасности, значительная часть компьютеров заражена вредоносным ПО. [53]
Языки программирования — это формат, в котором пишется программное обеспечение. С 1950-х годов были изобретены тысячи различных языков программирования; некоторые из них использовались десятилетиями, в то время как другие вышли из употребления. [54] Некоторые определения классифицируют машинный код — точные инструкции, непосредственно реализуемые аппаратным обеспечением — и язык ассемблера — более понятную человеку альтернативу машинному коду, операторы которой могут быть переведены один в один в машинный код — как языки программирования. [55] Программы, написанные на языках программирования высокого уровня, используемых для создания программного обеспечения, имеют несколько основных характеристик: для их написания не требуется знание машинного кода, их можно переносить на другие компьютерные системы, и они более лаконичны и понятны человеку, чем машинный код. [56] Они должны быть как понятными человеку, так и способными быть переведенными в однозначные инструкции для компьютерного оборудования. [57]
Изобретение языков программирования высокого уровня произошло одновременно с компиляторами, необходимыми для их автоматического перевода в машинный код. [58] Большинство программ не содержат всех ресурсов, необходимых для их запуска, и полагаются на внешние библиотеки . Часть функции компилятора заключается в связывании этих файлов таким образом, чтобы программа могла быть выполнена оборудованием. После компиляции программа может быть сохранена как объектный файл , а загрузчик (часть операционной системы) может взять этот сохраненный файл и выполнить его как процесс на оборудовании компьютера. [59] Некоторые языки программирования используют интерпретатор вместо компилятора. Интерпретатор преобразует программу в машинный код во время выполнения , что делает их в 10–100 раз медленнее, чем компилируемые языки программирования. [60] [61]
Программное обеспечение часто выпускается с осознанием того, что оно неполное или содержит ошибки. Покупатели сознательно покупают его в таком состоянии, что привело к правовому режиму, в котором ответственность за программные продукты значительно урезана по сравнению с другими продуктами. [62]
Исходный код защищен законом об авторском праве , который наделяет владельца исключительным правом копировать код. Базовые идеи или алгоритмы не защищены законом об авторском праве, но часто рассматриваются как коммерческая тайна и скрываются такими методами, как соглашения о неразглашении . [63] Авторское право на программное обеспечение было признано с середины 1970-х годов и принадлежит компании, которая производит программное обеспечение, а не сотрудникам или подрядчикам , которые его написали. [64] Использование большей части программного обеспечения регулируется соглашением ( лицензией на программное обеспечение ) между владельцем авторских прав и пользователем. Проприетарное программное обеспечение обычно продается по ограничительной лицензии, которая ограничивает копирование и повторное использование (часто реализуется с помощью таких инструментов, как управление цифровыми правами (DRM)). [65] Лицензии с открытым исходным кодом , напротив, разрешают свободное использование и распространение программного обеспечения с небольшим количеством условий. [64] Большинство лицензий с открытым исходным кодом, используемых для программного обеспечения, требуют, чтобы модификации были выпущены по той же лицензии, что может создать сложности при повторном использовании программного обеспечения с открытым исходным кодом в проприетарных проектах. [66]
Патенты предоставляют изобретателю исключительную, ограниченную по времени лицензию на новый продукт или процесс. [67] Идеи о том, чего может достичь программное обеспечение, не защищены законом, а конкретные реализации вместо этого защищены законом об авторском праве . В некоторых странах требование, чтобы заявленное изобретение оказывало влияние на физический мир, также может быть частью требований для того, чтобы патент на программное обеспечение считался действительным. [68] Патенты на программное обеспечение исторически были спорными . До дела 1998 года State Street Bank & Trust Co. против Signature Financial Group, Inc. патенты на программное обеспечение, как правило, не признавались в Соединенных Штатах. В том случае Верховный суд постановил, что бизнес-процессы могут быть запатентованы. [69] Патентные заявки сложны и дорогостоящи, а судебные иски, связанные с патентами, могут привести к увеличению стоимости продуктов. [70] В отличие от авторских прав, патенты, как правило, применяются только в той юрисдикции, где они были выданы. [71]
Инженер Кейперс Джонс пишет, что «компьютеры и программное обеспечение вносят глубокие изменения во все аспекты человеческой жизни: образование, работу, войну, развлечения, медицину, юриспруденцию и все остальное». [73] Оно стало повсеместным в повседневной жизни в развитых странах . [74] Во многих случаях программное обеспечение дополняет функциональность существующих технологий, таких как бытовая техника и лифты . [75] Программное обеспечение также породило совершенно новые технологии, такие как Интернет , видеоигры , мобильные телефоны и GPS . [75] [76] Новые методы общения, включая электронную почту , форумы , блоги , микроблоги , вики и социальные сети , стали возможны благодаря Интернету. [77] Огромные объемы знаний, превосходящие любую бумажную библиотеку, теперь доступны с помощью быстрого поиска в Интернете . [76] Большинство творческих профессионалов перешли на программные инструменты, такие как автоматизированное проектирование , 3D-моделирование , цифровое редактирование изображений и компьютерная анимация . [72] Почти каждое сложное устройство управляется программным обеспечением. [76]
Программное обеспечение состоит из компьютерных программ, которые управляют работой компьютера.