Программная инженерия — это инженерный подход к разработке программного обеспечения . [1] [2] [3] Специалист, называемый инженером-программистом , применяет процесс инженерного проектирования для разработки программного обеспечения .
Термины «программист» и «кодер» частично совпадают с термином «инженер-программист» , но они подразумевают только конструктивный аспект типичной рабочей нагрузки инженера-программиста. [4]
Инженер-программист применяет процесс разработки программного обеспечения , [1] [5] , который включает определение, реализацию , тестирование , управление и поддержку программных систем, а также создание и изменение процесса разработки.
Начиная с 1960-х годов программная инженерия была признана отдельной областью инженерии .
Развитие программной инженерии рассматривалось как борьба. Проблемы включали программное обеспечение, которое выходило за рамки бюджета, превышало сроки, требовало обширной отладки и обслуживания и не отвечало потребностям потребителей или вообще не было завершено.
В 1968 году НАТО провело первую конференцию по программной инженерии, где рассматривались вопросы, связанные с программным обеспечением. Были установлены руководящие принципы и передовой опыт разработки программного обеспечения. [6]
Происхождение термина «программная инженерия » приписывают различным источникам. Термин появился в списке услуг, предлагаемых компаниями в выпуске «Computers and Automation» за июнь 1965 года [7] и был использован более формально в выпуске «Communications of the ACM» за август 1966 года (том 9, номер 8) в «Письме президента членам ACM» Энтони А. Эттингера. [8] [9] Он также связан с названием конференции НАТО в 1968 году профессора Фридриха Л. Бауэра . [10] Маргарет Гамильтон описала дисциплину «программная инженерия» во время миссий «Аполлон», чтобы придать легитимность тому, что они делали. [11] В то время воспринималось как « программный кризис ». [12] [13] [14] 40-я Международная конференция по программной инженерии (ICSE 2018) отмечает 50-летие «программной инженерии» основными докладами на пленарных заседаниях Фредерика Брукса [15] и Маргарет Гамильтон . [16]
В 1984 году был создан Институт программной инженерии (SEI) как финансируемый из федерального бюджета научно-исследовательский и опытно-конструкторский центр со штаб-квартирой в кампусе Университета Карнеги-Меллона в Питтсбурге, штат Пенсильвания , США. [17] Уоттс Хамфри основал Программу процессов программного обеспечения SEI, направленную на понимание и управление процессом разработки программного обеспечения. [17] Представленные уровни зрелости процессов стали Интеграцией модели зрелости возможностей для разработки (CMMI-DEV), которая определила, как правительство США оценивает способности команды разработчиков программного обеспечения.
Современные общепринятые передовые практики в области разработки программного обеспечения были собраны подкомитетом ISO/IEC JTC 1/SC 7 и опубликованы в виде Свода знаний по разработке программного обеспечения (SWEBOK). [5] Разработка программного обеспечения считается одной из основных компьютерных дисциплин. [18]
Известные определения программной инженерии включают в себя:
Этот термин также использовался менее официально:
Маргарет Гамильтон продвигала термин «программная инженерия» во время своей работы над программой «Аполлон» . Термин «инженерия» использовался для подтверждения того, что работа должна восприниматься так же серьезно, как и другие вклады в развитие технологий. Гамильтон подробно описывает свое использование термина:
Когда я впервые придумал этот термин, никто о нем раньше не слышал, по крайней мере, в нашем мире. Это была постоянная шутка в течение долгого времени. Они любили подшучивать надо мной над моими радикальными идеями. Это был памятный день, когда один из самых уважаемых гуру в области аппаратного обеспечения объяснил всем на собрании, что он согласен со мной, что процесс создания программного обеспечения также следует считать инженерной дисциплиной, как и в случае с аппаратным обеспечением. Не из-за того, что он принял новый «термин» как таковой, а потому, что мы заслужили его и других в комнате принятие как инженерной области по праву. [28]
Отдельные комментаторы резко разошлись во мнениях о том, как определить программную инженерию или ее легитимность как инженерной дисциплины. Дэвид Парнас сказал, что программная инженерия, по сути, является формой инженерии. [29] [30] Стив Макконнелл сказал, что это не так, но должно быть так. [31] Дональд Кнут сказал, что программирование — это искусство и наука. [32] Эдсгер В. Дейкстра утверждал, что термины «программная инженерия» и «инженер-программист» неправильно использовались в Соединенных Штатах. [33]
Инженерия требований касается выявления, анализа, спецификации и проверки требований к программному обеспечению . Требования к программному обеспечению могут быть функциональными , нефункциональными или предметными.
Функциональные требования описывают ожидаемое поведение (т. е. результаты). Нефункциональные требования определяют такие вопросы, как переносимость, безопасность, ремонтопригодность, надежность, масштабируемость, производительность, возможность повторного использования и гибкость. Они классифицируются на следующие типы: ограничения интерфейса, ограничения производительности (такие как время отклика, безопасность, пространство для хранения и т. д.), эксплуатационные ограничения, ограничения жизненного цикла (ремонтопригодность, переносимость и т. д.) и экономические ограничения. Знание того, как работает система или программное обеспечение, необходимо, когда дело доходит до указания нефункциональных требований. Требования к домену имеют отношение к характеристике определенной категории или домена проектов. [34]
Проектирование программного обеспечения — это процесс создания высокоуровневых планов для программного обеспечения. Проектирование иногда делится на уровни:
Создание программного обеспечения обычно включает в себя программирование (т. е. кодирование), модульное тестирование , интеграционное тестирование и отладку для реализации проекта. [1] [5] «Тестирование программного обеспечения связано с отладкой, но отличается от нее». [5] Тестирование на этом этапе обычно выполняется программистом с целью проверки того, что код ведет себя так, как задумано, и для определения того, когда код готов к следующему уровню тестирования. [ необходима ссылка ]
Тестирование программного обеспечения — это эмпирическое техническое исследование, проводимое с целью предоставления заинтересованным сторонам информации о качестве тестируемого программного обеспечения. [1] [5]
При описании отдельно от конструкции тестирование обычно выполняется инженерами по тестированию или службой обеспечения качества , а не программистами, которые его написали. Оно выполняется на системном уровне и считается аспектом качества программного обеспечения .
Анализ программ — это процесс анализа компьютерных программ с точки зрения таких аспектов, как производительность , надежность и безопасность .
Техническое обслуживание программного обеспечения относится к поддержке программного обеспечения после выпуска. Оно может включать, но не ограничиваться: исправлением ошибок , оптимизацией, удалением неиспользуемых и отброшенных функций, а также улучшением существующих функций. [1] [5]
Обычно расходы на техническое обслуживание составляют от 40% до 80% стоимости проекта. [36]
Знание компьютерного программирования является необходимым условием для того, чтобы стать инженером-программистом. В 2004 году IEEE Computer Society выпустило SWEBOK , который был опубликован как Технический отчет ISO/IEC 1979:2005, описывающий совокупность знаний, которые они рекомендуют освоить выпускнику-инженеру-программисту с четырехлетним опытом работы. [37] Многие инженеры-программисты приходят в профессию, получив университетскую степень или пройдя обучение в профессионально-техническом училище. Одна стандартная международная учебная программа для бакалавриата по программной инженерии была определена Объединенной целевой группой по вычислительным программам IEEE Computer Society и Ассоциации вычислительной техники и обновлена в 2014 году. [18] В ряде университетов есть программы получения степени по программной инженерии; по состоянию на 2010 год в Соединенных Штатах [update]было 244 программы бакалавриата по программной инженерии , 70 онлайн-программ, 230 программ уровня магистра, 41 программа уровня докторантуры и 69 программ уровня сертификата.
Помимо университетского образования, многие компании спонсируют стажировки для студентов, желающих продолжить карьеру в сфере информационных технологий. Эти стажировки могут познакомить студента с реальными задачами, с которыми типичные инженеры-программисты сталкиваются каждый день. Похожий опыт можно получить, пройдя военную службу в сфере разработки программного обеспечения.
Половина всех специалистов сегодня имеет степени в области компьютерных наук , информационных систем или информационных технологий . [ требуется ссылка ] Небольшое, но растущее число специалистов имеют степени в области программной инженерии. В 1987 году факультет вычислительной техники в Имперском колледже Лондона представил первую в мире трехлетнюю степень бакалавра в области программной инженерии ; в следующем году Университет Шеффилда создал аналогичную программу. [38] В 1996 году Рочестерский технологический институт создал первую в США программу бакалавриата в области программной инженерии; однако она не получила аккредитацию ABET до 2003 года, того же года, что и Университет Райса , Университет Кларксона , Школа инженерии Милуоки и Университет штата Миссисипи . [39] В 1997 году Технологический колледж PSG в Коимбатуре, Индия, стал первым, кто начал пятилетнюю интегрированную степень магистра наук в области программной инженерии. [ требуется ссылка ]
С тех пор во многих университетах были учреждены степени бакалавра по программной инженерии. Стандартная международная учебная программа для бакалавриата по программной инженерии, SE2004 , была определена руководящим комитетом в период с 2001 по 2004 год при финансировании Ассоциации вычислительной техники и Компьютерного общества IEEE . По состоянию на 2004 год [update]около 50 университетов в США предлагают степени по программной инженерии, которые преподают как компьютерные науки, так и принципы и практики инженерии. Первая степень магистра по программной инженерии была учреждена в Университете Сиэтла в 1979 году. С тех пор степени магистра по программной инженерии стали доступны во многих других университетах. Аналогично в Канаде Канадский совет по аккредитации инженеров (CEAB) Канадского совета профессиональных инженеров признал несколько программ по программной инженерии.
В 1998 году Военно-морская аспирантура США (NPS) создала первую в мире программу докторантуры по программной инженерии. [ требуется ссылка ] Кроме того, появилось много онлайн-степеней по программной инженерии, таких как степень магистра наук по программной инженерии (MSE), предлагаемая на факультете компьютерных наук и инженерии Калифорнийского государственного университета в Фуллертоне . Стив Макконнелл полагает, что поскольку большинство университетов преподают компьютерные науки, а не программную инженерию, существует нехватка настоящих программных инженеров. [40] Университет ETS (École de technologie supérieure) и UQAM (Université du Québec à Montréal) получили от IEEE поручение разработать свод знаний по программной инженерии ( SWEBOK ), который стал стандартом ISO, описывающим совокупность знаний, охватываемых инженером-программистом. [5]
Юридические требования к лицензированию или сертификации профессиональных инженеров-программистов различаются по всему миру. В Великобритании нет лицензионных или юридических требований для принятия или использования должности инженера-программиста. В некоторых регионах Канады, таких как Альберта, Британская Колумбия, Онтарио [41] и Квебек, инженеры-программисты могут иметь звание профессионального инженера (P.Eng) и/или звание специалиста по информационным системам (ISP). В Европе инженеры-программисты могут получить профессиональное звание европейского инженера (EUR ING). Инженеры-программисты также могут получить профессиональную квалификацию дипломированного инженера через Британское компьютерное общество .
В Соединенных Штатах NCEES начал предлагать экзамен профессионального инженера по программной инженерии в 2013 году, тем самым позволив инженерам-программистам получить лицензию и признание. [42] NCEES прекратил экзамен после апреля 2019 года из-за отсутствия участников. [43] Обязательное лицензирование в настоящее время все еще широко обсуждается и воспринимается как спорный вопрос. [44] [45]
IEEE Computer Society и ACM , две основные профессиональные организации по программной инженерии в США, публикуют руководства по профессии программной инженерии. Руководство IEEE по своду знаний по программной инженерии версии 2004 года , или SWEBOK , определяет область и описывает знания, которые IEEE ожидает от практикующего программиста. Последняя версия SWEBOK v3 является обновленной версией и была выпущена в 2014 году. [5] IEEE также обнародует «Кодекс этики программной инженерии». [46]
По оценкам, по состоянию на 2022 год в мире насчитывается 26,9 миллиона профессиональных инженеров-программистов, что на 21 миллион больше, чем в 2016 году. [47] [48]
Многие инженеры-программисты работают в качестве сотрудников или подрядчиков. Инженеры-программисты работают с предприятиями, государственными учреждениями (гражданскими или военными) и некоммерческими организациями. Некоторые инженеры-программисты работают на себя в качестве фрилансеров . В некоторых организациях есть специалисты для выполнения каждой из задач в процессе разработки программного обеспечения . Другие организации требуют, чтобы инженеры-программисты выполняли многие или все из них. В крупных проектах люди могут специализироваться только на одной роли. В небольших проектах люди могут выполнять несколько или все роли одновременно. Многие компании нанимают стажеров , часто студентов университетов или колледжей во время летних каникул или стажировок . Специализации включают аналитиков , архитекторов , разработчиков , тестировщиков , техническую поддержку , аналитиков промежуточного программного обеспечения , менеджеров проектов , менеджеров по программным продуктам , педагогов и исследователей .
Большинство инженеров-программистов и программистов работают 40 часов в неделю, но около 15 процентов инженеров-программистов и 11 процентов программистов работали более 50 часов в неделю в 2008 году. [49] Потенциальные травмы в этих профессиях возможны, поскольку, как и другие работники, которые проводят много времени сидя перед компьютерным терминалом, печатая на клавиатуре, инженеры и программисты подвержены напряжению глаз, дискомфорту в спине, тромбозу , ожирению , а также проблемам с руками и запястьями, таким как синдром запястного канала . [50]
Бюро статистики труда США (BLS) насчитало 1 365 500 разработчиков программного обеспечения, работающих в США в 2018 году. [51] Из-за своей относительной новизны как области изучения формальное образование в области программной инженерии часто преподается как часть учебной программы по компьютерным наукам, и многие инженеры-программисты имеют степени в области компьютерных наук. [52] BLS оценивает, что с 2023 по 2033 год инженерия компьютерного программного обеспечения увеличится на 17%. [53] Это ниже оценки BLS на 2022–2032 годы в 25% для программной инженерии. [53] [54] И еще ниже их оценки BLS на 2010–2020 годы в 30%. [55] Из-за этой тенденции рост рабочих мест может быть не таким быстрым, как в последнее десятилетие, поскольку рабочие места, которые могли бы достаться инженерам-программистам в Соединенных Штатах, вместо этого будут переданы на аутсорсинг инженерам-программистам в таких странах, как Индия и другие зарубежные страны. [56] [49] Кроме того, BLS Job Outlook для программистов, Бюро статистики труда США (BLS) Occupational Outlook предсказывает снижение на -7 процентов с 2016 по 2026 год, дальнейшее снижение на -9 процентов с 2019 по 2029 год, снижение на -10 процентов с 2021 по 2031 год. [56] а затем снижение на -11 процентов с 2022 по 2032 год. [56] Поскольку программированием можно заниматься из любой точки мира, компании иногда нанимают программистов в странах, где заработная плата ниже. [ 56] [57] [58] Кроме того, доля женщин во многих областях программного обеспечения также снижается на протяжении многих лет по сравнению с другими областями инженерии. [59] Кроме того, существует дополнительная обеспокоенность тем, что недавние достижения в области искусственного интеллекта могут повлиять на спрос на будущие поколения инженеров-программистов. [60] [61] [62] [63] [64] [65] [66] Однако эта тенденция может измениться или замедлиться в будущем, поскольку многие нынешние инженеры-программисты на рынке США покинут профессию или выйдут с рынка в связи со старением в течение следующих нескольких десятилетий. [56]
Институт программной инженерии предлагает сертификацию по определенным темам, таким как безопасность , улучшение процессов и архитектура программного обеспечения . [67] IBM , Microsoft и другие компании также спонсируют свои собственные сертификационные экзамены. Многие программы сертификации в области ИТ ориентированы на определенные технологии и управляются поставщиками этих технологий. [68] Эти программы сертификации адаптированы для учреждений, которые будут нанимать людей, использующих эти технологии.
Более широкая сертификация общих навыков разработки программного обеспечения доступна через различные профессиональные общества. По состоянию на 2006 год [update]IEEE сертифицировал более 575 специалистов по программному обеспечению как сертифицированных специалистов по разработке программного обеспечения (CSDP). [69] В 2008 году они добавили сертификацию начального уровня, известную как сертифицированный специалист по разработке программного обеспечения (CSDA). [ 70] В начале 1980-х годов у ACM была программа профессиональной сертификации, [ необходима ссылка ] , которая была прекращена из-за отсутствия интереса. ACM и IEEE Computer Society совместно изучали возможность лицензирования инженеров-программистов как профессиональных инженеров в 1990-х годах, но в конечном итоге решили, что такое лицензирование не подходит для профессиональной промышленной практики разработки программного обеспечения. [44] Джон К. Найт и Нэнси Г. Левесон представили более сбалансированный анализ вопроса лицензирования в 2002 году. [45]
В Великобритании Британское компьютерное общество разработало юридически признанную профессиональную сертификацию под названием Chartered IT Professional (CITP) , доступную для полностью квалифицированных членов ( MBCS ). Инженеры-программисты могут иметь право на членство в Британском компьютерном обществе или Институте инженерии и технологий и, таким образом, претендовать на статус Chartered Engineer через любой из этих институтов. В Канаде Канадское общество обработки информации разработало юридически признанную профессиональную сертификацию под названием Information Systems Professional (ISP) . [71] В Онтарио, Канада, инженеры-программисты, окончившие аккредитованную Канадским советом по инженерной аккредитации (CEAB) программу, успешно сдавшие экзамен PEO ( Professional Engineers Ontario ) Professional Practice Examination (PPE) и имеющие не менее 48 месяцев приемлемого инженерного опыта, имеют право на получение лицензии через Professional Engineers Ontario и могут стать профессиональными инженерами P.Eng. [72] Однако PEO не признает никакого онлайн- или дистанционного образования; и не считает программы по компьютерным наукам эквивалентными программам по программной инженерии, несмотря на огромное совпадение между ними. Это вызвало споры и войну сертификаций. Это также привело к тому, что число обладателей степени P.Eng для этой профессии было исключительно низким. Подавляющее большинство работающих в этой области профессионалов имеют степень в области CS, а не SE. Учитывая сложный путь сертификации для обладателей не-SE степеней, большинство из них даже не удосуживаются получить лицензию.
Первоначальное влияние аутсорсинга и относительно низкая стоимость международных человеческих ресурсов в развивающихся странах третьего мира привели к массовой миграции деятельности по разработке программного обеспечения из корпораций в Северной Америке и Европе в Индию, а позднее: в Китай, Россию и другие развивающиеся страны. Этот подход имел некоторые недостатки, в основном разницу в расстоянии/часовом поясе, которая препятствовала человеческому взаимодействию между клиентами и разработчиками, и массовую передачу работы. Это оказало негативное влияние на многие аспекты профессии инженера-программиста. Например, некоторые студенты в развитых странах избегают образования, связанного с инженерией программного обеспечения, из-за страха офшорного аутсорсинга (импорта программных продуктов или услуг из других стран) и вытеснения иностранными визовыми работниками . [73] Хотя статистика в настоящее время не показывает угрозы для самой инженерии программного обеспечения, связанная с ней карьера, компьютерное программирование, по-видимому, пострадала. [74] Тем не менее, способность разумно использовать офшорные и прибрежные ресурсы с помощью рабочего процесса follow-the-soln улучшила общие операционные возможности многих организаций. [75] Когда североамериканцы уходят с работы, азиаты только приезжают на нее. Когда азиаты уходят с работы, европейцы приходят на работу. Это обеспечивает непрерывную возможность человеческого контроля за критически важными для бизнеса процессами 24 часа в сутки, без выплаты сверхурочных или нарушения ключевого человеческого ресурса — режима сна.
Хотя глобальный аутсорсинг имеет ряд преимуществ, глобальная и, как правило, распределенная разработка может столкнуться с серьезными трудностями из-за расстояния между разработчиками. Это связано с ключевыми элементами этого типа расстояния, которые были определены как географические, временные, культурные и коммуникационные (включая использование разных языков и диалектов английского языка в разных местах). [76] Исследования проводились в области глобальной разработки программного обеспечения в течение последних 15 лет, и был опубликован обширный объем соответствующих работ, в которых подчеркиваются преимущества и проблемы, связанные со сложной деятельностью. Как и в случае с другими аспектами программной инженерии, исследования продолжаются в этой и смежных областях.
Существуют различные премии в области разработки программного обеспечения:
Некоторые призывают к лицензированию, сертификации и кодифицированным системам знаний как механизмам распространения инженерных знаний и развития этой области. [80]
Некоторые утверждают, что концепция программной инженерии настолько нова, что ее редко понимают, и она широко интерпретируется неправильно, в том числе в учебниках по программной инженерии, статьях и среди сообществ программистов и мастеров. [81]
Некоторые утверждают, что основная проблема программной инженерии заключается в том, что ее подходы недостаточно эмпиричны, поскольку реальная проверка подходов обычно отсутствует или весьма ограничена, и поэтому программная инженерия часто неверно интерпретируется как осуществимая только в «теоретической среде». [81]
Эдсгер Дейкстра , основатель многих современных концепций разработки программного обеспечения, отвергал идею «программной инженерии» вплоть до своей смерти в 2002 году, утверждая, что эти термины являются плохими аналогами того, что он называл «радикальной новизной» компьютерной науки :
Ряд этих явлений были объединены под названием «Программная инженерия». Поскольку экономика известна как «жалкая наука», программная инженерия должна быть известна как «обреченная дисциплина», обреченная, потому что она не может даже приблизиться к своей цели, поскольку ее цель внутренне противоречива. Программная инженерия, конечно, представляет себя как еще одно достойное дело, но это пустая болтовня: если вы внимательно прочтете ее литературу и проанализируете, что на самом деле делают ее приверженцы, вы обнаружите, что программная инженерия приняла в качестве своего устава «Как программировать, если вы не можете». [82]
Идея первой конференции НАТО по программной инженерии, и в частности принятие тогда практически неизвестного термина "программная инженерия" в качестве ее (намеренно провокационного) названия, как я полагаю, изначально принадлежала профессору
Фритцу Бауэру
.
{{cite web}}
: CS1 maint: numeric names: authors list (link){{cite web}}
: CS1 maint: numeric names: authors list (link)(1) Институт был выбран Карнеги-Меллон на конкурсной основе в декабре 1984 года Министерством обороны США (DoD) для улучшения состояния практики разработки программного обеспечения. ... (2) SEI продвигает зрелые решения с доказанной ценностью в широкое использование; примерами служат Модель зрелости возможностей (CMM) ...
{{cite book}}
: CS1 maint: multiple names: authors list (link)Программная инженерия — это инженерная дисциплина, которая касается всех аспектов производства программного обеспечения от ранних стадий спецификации системы до поддержки системы после ее ввода в эксплуатацию. В этом определении есть две ключевые фразы:
1. Инженерная дисциплина Инженеры заставляют вещи работать. Они применяют теории, методы и инструменты там, где это уместно [...] Инженеры также признают, что они должны работать с организационными и финансовыми ограничениями. [...]
2. Все аспекты производства программного обеспечения Программная инженерия касается не только технических процессов разработки программного обеспечения, но и таких видов деятельности, как управление программными проектами и разработка инструментов, методов и теорий для поддержки производства программного обеспечения.
Мы предлагаем, чтобы «программная инженерия» охватывала не только процесс написания кода, но и все инструменты и процессы, которые организация использует для создания и поддержки этого кода с течением времени. Какие практики может внедрить организация-разработчик ПО, чтобы наилучшим образом сохранить ценность своего кода в долгосрочной перспективе? Как инженеры могут сделать кодовую базу более устойчивой, а саму дисциплину программной инженерии более строгой?
Мы считаем, что инженерия программного обеспечения может развиваться как инженерная дисциплина только путем отхода от ее нынешней зависимости от пропаганды и анализа, ...
{{cite book}}
: CS1 maint: location missing publisher (link)Когда этот термин был придуман в 1968 г. FL Bauer из Мюнхенского технологического университета, я приветствовал его. [. . .] Я интерпретировал введение термина "программная инженерия" как удачное отражение того факта, что проектирование программных систем было деятельностью par excellence для инженера-математика. [. . .]. Как только этот термин прибыл в США, он был освобожден от всего своего технического содержания. Так и должно было быть, поскольку в своем первоначальном значении он был совершенно неприемлем [. . .] Тем временем программная инженерия стала почти пустым термином, что прекрасно продемонстрировала компания Data General, которая в одночасье повысила всех своих программистов до высокого звания «инженеров-программистов»!
Предполагается, что общий объем цитируемой литературы будет достаточным для освоения путем завершения бакалавриата плюс четырехлетнего опыта.
представления рекомендаций групп Совет ACM пришел к выводу, что структура лицензированного профессионального инженера, изначально разработанная для инженеров-строителей, не соответствует профессиональной промышленной практике разработки программного обеспечения и не позволит многим из наиболее квалифицированных инженеров-программистов получить лицензию.
{{cite web}}
: CS1 maint: multiple names: authors list (link)