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