Введение
История разработки программного обеспечения начинается примерно в 1960-х годах. Написание программного обеспечения превратилось в профессию, которая занимается поиском наилучших способов повышения качества программного обеспечения и его создания. Качество может относиться к поддерживаемости программного обеспечения, его стабильности, скорости, удобству использования, тестируемости, читаемости, размеру, стоимости, безопасности и количеству дефектов или "ошибок", а также к менее измеримым качествам, таким как элегантность, краткость и удовлетворенность заказчика, среди множества других характеристик. Вопрос о том, как лучше всего создавать высококачественное программное обеспечение, является отдельной и дискуссионной проблемой, охватывающей принципы проектирования программного обеспечения, так называемые "лучшие практики" написания кода, а также более широкие вопросы управления, такие как оптимальный размер команды, процессы разработки, наилучшие способы своевременной и максимально быстрой поставки программного обеспечения, "культура" на рабочем месте, методы подбора персонала и так далее. Все это подпадает под широкое понятие разработки программного обеспечения.
The history of software engineering begins around the 1960s. Writing software has evolved into a profession concerned with how best to maximize the quality of software and of how to create it. Quality can refer to how maintainable software is, to its stability, speed, usability, testability, readability, size, cost, security, and number of flaws or "bugs", as well as to less measurable qualities like elegance, conciseness, and customer satisfaction, among many other attributes. How best to create high quality software is a separate and controversial problem covering software design principles, so called "best practices" for writing code, as well as broader management issues such as optimal team size, process, how best to deliver software on time and as quickly as possible, work place "culture", hiring practices, and so forth. All this falls under the broad rubric of software engineering.
1945-1965: Начало
Ранние упоминания термина «инженерия программного обеспечения» включают письмо президента ACM Энтони Эттингера 1965 года и лекции Дугласа Т. Росса в MIT в 1950-х годах. Маргарет Х. Гамильтон – человек, который предложила назвать эту дисциплину «инженерией программного обеспечения», чтобы придать ей авторитет во время разработки бортового компьютера «Аполлона». Как она сама говорила: «Я боролась за признание значимости программного обеспечения, чтобы оно и те, кто его создавал, получили заслуженное уважение. Поэтому я начала использовать термин «инженерия программного обеспечения», чтобы отделить его от аппаратной и других видов инженерии, при этом рассматривая каждый вид инженерии как часть общего процесса системной инженерии. Когда я впервые начала использовать эту фразу, она казалась довольно забавной. Долгое время это было предметом шуток. Они любили подшучивать надо мной из-за моих радикальных идей. В конечном итоге программное обеспечение закономерно получило такое же уважение, как и любая другая дисциплина».
Комитет по науке НАТО спонсировал две конференции по инженерии программного обеспечения в 1968 году (Гармиш-Партенкирхен, Германия – см. отчет о конференции) и 1969 году, что дало толчок развитию этой области. Многие считают, что эти конференции ознаменовали официальное начало профессии инженера-программиста.
1965-1985: Кризис программного обеспечения
Инженерное дело в области программного обеспечения было вызвано так называемым кризисом программного обеспечения 1960-х, 1970-х и 1980-х годов, который выявил многие проблемы разработки программного обеспечения. Многие проекты выходили за рамки бюджета и сроков. Некоторые проекты приводили к повреждению имущества. Несколько проектов стали причиной гибели людей. Кризис программного обеспечения изначально определялся в терминах производительности, но затем стал акцентировать внимание на качестве. Некоторые использовали термин «кризис программного обеспечения», чтобы обозначить свою неспособность нанять достаточно квалифицированных программистов. Превышение стоимости и бюджета: операционная система OS/360 была классическим примером. Этот десятилетний проект, начавшийся в 1960-х годах, в конечном итоге создал одну из самых сложных программных систем того времени. Питер Г. Нойманн вел актуальный список проблем и катастроф в области программного обеспечения. Кризис программного обеспечения постепенно уходит в прошлое, поскольку психологически крайне сложно находиться в кризисном состоянии в течение длительного периода времени (более 20 лет). Тем не менее, программное обеспечение – особенно встроенное программное обеспечение реального времени – остается рискованным и широко распространенным, и крайне важно не поддаваться самоуспокоению. За последние 10–15 лет Майкл А. Джексон много писал о природе разработки программного обеспечения, выявил основную причину ее трудностей как недостаток специализации и предположил, что его концепции проблемных рамок могут служить основой для «нормативной практики» разработки программного обеспечения, что является необходимым условием для превращения разработки программного обеспечения в инженерную науку.
1985 - 1989: "Никакой серебряной пули"
В течение десятилетий решение кризиса программного обеспечения было первостепенной задачей для исследователей и компаний, разрабатывающих программные инструменты. Стоимость владения и поддержки программного обеспечения в 1980-х годах была вдвое выше стоимости его разработки. В 1990-х годах стоимость владения и поддержки увеличилась на 30% по сравнению с 1980-ми годами. В 1995 году статистика показала, что половина опрошенных проектов разработки были внедрены, но не считались успешными. В среднем, проекты программного обеспечения отстают от графика на 50%. Три четверти всех крупных программных продуктов, поставляемых заказчикам, оказываются неудачными – либо не используются вовсе, либо не соответствуют требованиям заказчика.
Программные проекты
Каждая новая технология и практика с 1970-х по 1990-е годы преподносилась как "серебряная пуля" для решения кризиса программного обеспечения. Инструменты, дисциплина, формальные методы, процессы и профессионализм объявлялись "серебряными пулями":
Инструменты: Особое внимание уделялось инструментам: структурированное программирование, объектно-ориентированное программирование, CASE-инструменты, такие как система CADES CASE от ICL, язык Ada, документация и стандарты – все это преподносилось как "серебряные пули". Дисциплина: Некоторые эксперты утверждали, что кризис программного обеспечения вызван недостаточной дисциплиной программистов. Формальные методы: Некоторые полагали, что применение формальных инженерных методологий к разработке программного обеспечения сделает производство программного обеспечения столь же предсказуемой отраслью, как и другие инженерные дисциплины. Они выступали за доказательство корректности всех программ. Процессы: Многие рекомендовали использовать определенные процессы и методологии, такие как модель зрелости возможностей (Capability Maturity Model). Профессионализм: Это привело к разработке кодексов этики, лицензирования и профессиональных стандартов. В 1986 году Фред Брукс опубликовал статью "Нет серебряной пули", утверждая, что ни одна отдельная технология или практика никогда не обеспечит десятикратного улучшения производительности в течение десяти лет. В течение следующего десятилетия продолжались дебаты о "серебряных пулях". Сторонники Ada, компонентного подхода и процессов в течение многих лет утверждали, что их любимая технология станет "серебряной пулей". Скептики не соглашались. В конечном итоге почти все признали, что "серебряной пули" не существует. Однако разговоры о "серебряных пулях" возникают время от времени и сегодня. Некоторые интерпретируют отсутствие "серебряной пули" как неудачу программной инженерии. Однако, продолжая читать, Брукс пишет: "Мы, безусловно, добьемся существенного прогресса в течение следующих 40 лет; порядок величины за 40 лет вряд ли можно назвать чудом".
Поиск единственного ключа к успеху никогда не приводил к результату. Все известные технологии и практики лишь постепенно улучшают производительность и качество. Однако и для других профессий не существует "серебряных пуль". Другие интерпретируют отсутствие "серебряной пули" как доказательство того, что программная инженерия наконец-то созрела и признала, что успех проектов зависит от упорной работы. Однако можно также сказать, что сегодня существует целый ряд "серебряных пуль", включая легковесные методологии (см. "Управление проектами"), табличные процессоры, специализированные браузеры, внутренние поисковые системы, генераторы отчетов баз данных, интегрированные редакторы для разработки, тестирования и кодирования с функциями памяти, сравнения и отмены, а также специализированные компании, которые создают нишевое программное обеспечение, например, информационные веб-сайты, за значительно меньшую стоимость, чем полностью индивидуальная разработка веб-сайтов. Тем не менее, область программной инженерии представляется слишком сложной и разнообразной, чтобы одна "серебряная пуля" могла решить большинство проблем, и каждая проблема составляет лишь небольшую часть всех проблем в программном обеспечении.
1990-1999: популярность Интернета
Рост Интернета привел к очень быстрому росту спроса на международные системы отображения информации и электронной почты во Всемирной паутине. Программистам потребовалось обрабатывать иллюстрации, карты, фотографии и другие изображения, а также простую анимацию, с невиданной ранее скоростью, при этом существовало мало известных методов оптимизации отображения и хранения изображений (например, использование эскизов). Распространение браузеров, работающих на языке гипертекстовой разметки (HTML), изменило принципы организации отображения и поиска информации. Широкое распространение сетевых подключений способствовало росту и распространению международных компьютерных вирусов на компьютерах MS Windows, а массовый спам стал серьезной проблемой при разработке систем электронной почты, засоряя каналы связи и требуя полуавтоматической предварительной фильтрации. Системы поиска по ключевым словам эволюционировали в веб-поисковые системы, и многие программные системы пришлось перепроектировать для международного поиска с учетом поисковой оптимизации (SEO). Появилась потребность в системах машинного перевода для обработки информационных потоков на нескольких иностранных языках, и многие программные системы были разработаны для многоязычного использования, основываясь на принципах, применяемых профессиональными переводчиками. Типичная пользовательская база компьютеров увеличилась с сотен или тысяч пользователей до, как правило, многих миллионов пользователей по всему миру.
2000-2015 гг.: Легкие методологии
С ростом спроса на программное обеспечение во многих небольших организациях потребность в недорогих решениях привела к развитию более простых и быстрых методологий, позволяющих создавать работающее программное обеспечение – от определения требований до развертывания – быстрее и легче. Использование быстрого прототипирования эволюционировало в целые легковесные методологии, такие как экстремальное программирование (XP), которые стремились упростить многие аспекты разработки программного обеспечения, включая сбор требований и тестирование надежности для постоянно растущего числа небольших программных систем. В то время как для очень крупных программных систем по-прежнему использовались тщательно документированные методологии, состоящие из множества томов документации, небольшие системы получили более простой и быстрый альтернативный подход к управлению разработкой и поддержкой программных вычислений и алгоритмов, хранением и извлечением информации, а также отображением данных.
Текущие тенденции в области разработки программного обеспечения
Инженерия программного обеспечения – молодая дисциплина, которая всё ещё находится в стадии развития. Направления, в которых развивается инженерия программного обеспечения, включают:
Аспекты
Аспекты помогают инженерам-программистам работать с атрибутами качества, предоставляя инструменты для добавления или удаления шаблонного кода в различных частях исходного кода. Аспекты описывают, как все объекты или функции должны себя вести в определенных ситуациях. Например, аспекты могут добавлять отладку, ведение журналов или управление блокировками во все объекты определенных типов. В настоящее время исследователи изучают, как использовать аспекты для проектирования кода общего назначения. Связанные концепции включают генеративное программирование и шаблоны.
Экспериментальный
Экспериментальная разработка программного обеспечения — это область разработки программного обеспечения, занимающаяся разработкой экспериментов над программным обеспечением, сбором данных из этих экспериментов и формулированием законов и теорий на основе этих данных.
Линии программных продуктов
Линии программных продуктов, также известные как семейная инженерия программных продуктов, – это систематический подход к созданию семейств программных систем, а не к разработке последовательности совершенно независимых продуктов. Этот метод делает акцент на широком, систематическом и формальном повторном использовании кода, чтобы попытаться индустриализировать процесс разработки программного обеспечения. Конференция "Будущее программной инженерии" (FOSE), прошедшая в рамках ICSE 2000, задокументировала современное состояние дел в области разработки программного обеспечения в 2000 году и обозначила множество проблем, которые предстояло решить в течение следующего десятилетия. Направления FOSE на конференциях ICSE 2000 и ICSE 2007 также способствовали определению современного состояния дел в области разработки программного обеспечения.
Инженеры-программисты сегодня
Профессия стремится определить свои границы и содержание. Состав знаний по инженерии программного обеспечения SWEBOK был предложен в качестве стандарта ISO в 2006 году (ISO/IEC TR 19759). В 2006 году журнал Money Magazine и сайт Salary.com признали разработку программного обеспечения лучшей работой в Америке по критериям роста, заработной платы, уровня стресса, гибкости рабочего графика и условий труда, креативности, а также легкости трудоустройства и карьерного роста.
Искусственный интеллект
Широкий спектр платформ способствовал развитию различных областей искусственного интеллекта, от экспертных систем, таких как Cyc, до глубокого обучения и роботизированных платформ, таких как Roomba с открытым интерфейсом. Недавние достижения в области глубоких искусственных нейронных сетей и распределенных вычислений привели к появлению множества программных библиотек, включая Deeplearning4j, TensorFlow, Theano и Torch. Исследование, проведенное McKinsey Global Institute в 2011 году, выявило нехватку 1,5 миллиона высококвалифицированных специалистов и менеджеров в области анализа данных и искусственного интеллекта, в связи с чем ряд частных интенсивных курсов разработали программы для удовлетворения этого спроса, включая бесплатные программы, такие как The Data Incubator, и платные программы, такие как General Assembly.
Языки
Ранний символический ИИ вдохновил языки Lisp и Prolog, которые доминировали в раннем программировании в области ИИ. Современная разработка ИИ часто использует широко распространенные языки, такие как Python или C++, или специализированные языки, такие как Wolfram Language.
Известные деятели в истории разработки программного обеспечения
Чарльз Бахман (1924–2017) особенно известен своей работой в области баз данных. Ласло Белади (1928–2021) был главным редактором журнала IEEE Transactions on Software Engineering в 1980-х годах. Фред Брукс (род. 1931) наиболее известен управлением разработкой OS/360. Питер Чен (род. 1947) известен разработкой моделирования «сущность-связь». Эдсгер В. Дайкстра (1930–2002) разработал основы для одной из форм структурированного программирования. Дэвид Парнас (род. 1941) разработал концепцию сокрытия информации в модульном программировании. Майкл А. Джексон (род. 1936) – методолог в области разработки программного обеспечения, ответственный за метод проектирования программ JSP, метод разработки систем JSD (в соавторстве с Джоном Кэмероном) и подход "Проблемные рамки" для анализа и структурирования задач разработки программного обеспечения. Ричард Столлман создал системные утилиты GNU и стал сторонником свободного программного обеспечения.