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