软件工程是研究和应用如何以系统性的、规范化的、可定量的过程化方法去开发和维护软件,以及如何把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来的学科。它涉及到程序设计语言、数据库、软件开发工具、系统平台、标准、设计模式等方面。
20世纪40年代初第一台数字计算机出现时[1] 指示它们运行的指令被连接到了机器上。从业者很快意识到这种设计不灵活,并提出了“存储程序结构”,即冯·诺依曼结构。因此,“硬件”和“软件”之间的划分是从用来处理计算复杂性的抽象开始的。
编程语言在20世纪50年代初开始出现,[2] 这也是抽象的另一个重要步骤。Fortran、ALGOL和COBOL等主要语言在20世纪50年代末发布,分别用于处理科学、算法和商业问题。大卫·帕纳斯(David Parnas)在1972年引入了模块化和信息隐藏的关键概念,[3] 以帮助程序员处理日益复杂的软件系统。
“软件工程”一词的起源被归因于多种来源。“软件工程”一词出现在1965年6月发布的《计算机与自动化》中所列公司提供的服务列表中,并在1966年8月发布的《美国计算机协会通讯》—致协会会员信(第9卷,第8期)中由协会主席安东尼·奥汀格(Anthony A. Oettinger)更正式地使用。[4]该词也与1968年由弗里德里希·鲍尔教授(Friedrich L. Bauer)主持的北约会议名称有关,那是第一次召开关于软件工程的会议。[5] 当时,人们认为存在“软件危机”。[6][7][8] 第40届国际软件工程会议(ICSE,2018年)以展示弗雷德里克·布鲁克斯(Frederick Brooks)[9] 和玛格丽特·汉密尔顿(Margaret Hamilton)的成就和贡献为全会主题来庆祝“软件工程”50周年[10]。
1984年,软件工程研究所(SEI)作为一个由联邦政府资助的研发中心成立,总部位于美国宾夕法尼亚州匹兹堡卡内基梅隆大学校园内。瓦茨·汉弗莱(Watts Humphrey)创立了SEI软件过程程序,旨在理解和管理软件工程过程。引入的过程成熟度级别后来成为开发能力成熟度模型集成(CMMI-DEV),它定义了美国政府如何评估软件开发团队的能力。
软件和系统工程分技术委员会收集了现代的、公认的软件工程最佳实践,并将其作为软件工程知识体系(SWEBOK)出版。[11]
软件工程可以分为几个子学科。[12] 其中一些是:
计算机编程知识是成为软件工程师的先决条件。2004年,IEEE计算机学会出版了《软件工程知识体系》,该书作为国际标准化组织/国际电工委员会(ISO/IEC)技术报告(1979:2004)出版,描述了他们建议拥有四年经验的软件工程师研究生应该掌握的知识体系。[13]许多软件工程师通过获得大学学位或在职业学校接受培训来进入这个行业。IEEE计算机学会和美国计算机协会(ACM)计算课程联合工作组制定了一套标准的国际本科软件工程学位课程,并于2014年更新这一课程。[14] 许多大学都有软件工程学位课程,截至2010年,美国共有244个校园软件工程学士项目、70个在线项目、230个硕士项目、41个博士项目和69个证书项目。
除了大学教育之外,许多公司资助希望从事信息技术职业的学生实习。这些实习让这些学生了解软件工程师通常每天都会遇到的有趣的现实任务。在软件工程领域工作,也可以获得类似的经验。
世界各地对专业软件工程师的许可或认证的法律要求各不相同。在英国,承担或使用软件工程师这个职位时,没有许可或法律要求。在加拿大的某些地区,如艾伯塔省、不列颠哥伦比亚省、安大略省[15] 和魁北克省,软件工程师可以拥有专业工程师(P. Eng)称号和/或信息系统专业人员(I.S.P)称号。在欧洲,软件工程师可以获得欧洲工程师(EUR ING)职称。
自2013年以来,美国开始举办美国国家勘察设计考试者理事会(NCEES)软件工程专业工程师考试,从而允许软件工程师获得许可和认可。[16]由于很少有人参与考试,NCEES将在2019年4月后终止这一考试。[17] 强制性许可目前仍在深入考虑中,并被认为是有争议的。在美国的一些地方,如得克萨斯州,工程师一词的使用受法律管制,且该词仅允许持有专业工程师许可证的个人使用。
美国的两个主要软件工程专业组织—IEEE计算机学会和ACM联合出版了软件工程专业指南。IEEE2004版软件工程知识体系指南(SWEBOK),给软件工程这一领域下了定义,并描述了IEEE期望一名实践软件工程师应该拥有的知识。最新的SWEBOK v3是该指南的更新版本,发布于2014年。[18] IEEE还颁布了“软件工程道德规范”。[19]
据美国劳工统计局统计,2016年有1,256,200名软件开发人员(工程师)在美国就业。从2016年到2026年,计算机和信息技术行业的就业率预计将增长13%,高于所有行业的平均水平。这些职业预计将增加约557,100个新工作岗位。由于这一领域格外重视云计算、大数据收集和存储以及信息安全,所以这些岗位对从业人员的要求很高[20]。然而,劳工统计局也表示,这些岗位的雇佣正在放缓,预计从2016年到2026年,计算机程序员的数量将下降7%,因为计算机编程可以在世界任何地方完成,所以公司有时会在工资较低的国家雇佣程序员[21]。由于软件工程是一个相对较新的研究领域,正规的软件工程教育通常作为计算机科学课程的一部分来教授,许多软件工程师拥有计算机科学学位,却没有任何工程背景。[22]
许多软件工程师以雇员或承包商的身份工作。软件工程师与企业、政府机构(民用或军用)和非营利组织合作。一些软件工程师作为自由职业者为自己工作。一些组织有专家来执行软件开发过程中的每一项任务。其他组织要求软件工程师做许多或全部工作。在大型项目中,人们可能只专注于一个角色。在小项目中,人们可能同时扮演几个或所有角色。专业包括:行业(分析师、架构师、开发人员、测试人员、技术支持人员、中间件分析师、经理)和学术界(教育者、研究人员)。
大多数软件工程师和程序员每周工作40小时,但2008年,大约15%的软件工程师和11%的程序员每周工作超过50小时。这些职业可能存在潜在伤害,因为像其他长时间坐在电脑终端前用键盘打字的工作人员一样,工程师和程序员也容易出现眼睛疲劳、背部不适以及腕管综合征等手和手腕问题。[23]
软件工程研究所提供特定主题的认证,如安全性、过程改进和软件体系结构。[24] IBM、微软和其他公司也赞助他们自己的认证考试。许多信息技术认证计划面向特定技术,并由这些技术的供应商管理。[25] 这些认证计划是为那些雇佣使用这些技术的人的机构量身定做的。
更广泛的通用软件工程技能认证可通过各种专业协会获得。截至2006年,IEEE已认证超过575名软件专业人员为认证软件开发专业人员(CSDP)。[26] 2008年,IEEE增加了一个入门级认证,称为认证软件开发助理(CSDA)。[27] ACM在20世纪80年代初有一个专业认证项目,但由于缺乏兴趣而中止了。ACM在20世纪90年代末对软件工程师获得专业认证的可能性进行了研究,但最终认为这种认证不适合软件工程的专业行业实践。[28]
在英国,英国计算机学会开发了一种法律认可的专业认证,名为特许信息技术专业人员(CITP),完全合格的会员(MBCS)均可获得该认证。软件工程师可能有资格成为英国工程技术学会的成员,因此有资格获得特许工程师身份。[29] 在加拿大,加拿大信息处理协会开发了一种法律认可的专业认证,称为信息系统专业人员(ISP)。在加拿大安大略省,从加拿大工程认证委员会(CEAB)认证项目毕业、成功完成安大略省专业工程师(PEO)专业实践考试(PPE)并具有至少48个月可接受工程经验的软件工程师有资格通过安大略省专业工程师认证获得许可,并可以成为专业工程师(P.Eng)。[30] 但是,PEO不承认任何在线或远程教育;并且认为计算机科学项目不等同于软件工程项目,尽管两者之间存在巨大的重叠。这引发了争议和认证战。这还使得该行业的专业工程师人数极少。该领域的绝大多数在职专业人员都拥有计算机科学学位,而不是软件工程学位。鉴于非软件工程学位持有者的认证道路艰难,大多数人都不愿费心去取得许可证了。
外包的最初影响,以及发展中第三世界国家相对较低的国际人力资源成本,导致软件开发活动从北美和欧洲的公司大规模迁移到印度,后来又迁移到中国、俄罗斯和其他发展中国家。这种方法有一些缺陷,这些缺陷主要是由距离/时区的差异造成的,因为这一差异阻碍了客户和开发人员之间的人际互动以及大量的工作转移。这对软件工程专业的许多方面都有负面影响。例如,一些发达国家的学生因为害怕离岸外包(从其他国家进口软件产品或服务)和被外国签证工作人员取代而不愿接受与软件工程相关的教育。[31] 尽管统计数据目前没有显示软件工程本身面临威胁,但与之相关的职业—计算机编程似乎确实受到了影响。[32][33] 然而,通过“follow-the-sun”工作流程和灵活利用离岸和近岸资源的能力,许多组织的整体运营能力得到了提高。[34] 北美人离开工作岗位时,亚洲人刚 到达工作岗位,亚洲人离开工作岗位时,欧洲人到达工作岗位。这提供了一种持续的能力,可以全天24小时对关键业务流程进行人工监控,而无需支付加班薪酬或中断关键人力资源、改变睡眠模式。
虽然全球外包有一些优势,但由于开发人员之间的距离,全球开发(通常是分布式开发)可能会遇到严重困难。这是因为这种距离的关键因素已被确定为地理、时间、文化和交流(包括在不同地点使用不同的语言和英语方言)。[35] 过去15年已在全球软件开发领域进行了研究,发表了大量相关工作成果,强调了与复杂活动相关的益处和问题。如同软件工程的其他方面一样,这个领域和相关领域的研究也在进行中。
软件工程将其从业者视为遵循定义明确的工程方法来解决问题的个体。这些方法在各种软件工程书籍和研究论文中都有详细说明,其内涵总是具有可预测性、精确性、降低风险和专业性。这一观点导致了对许可、认证和编纂知识体系的呼吁,将其作为传播工程知识和使该领域成熟的机制。
许多软件开发人员提出将软件工艺作为一种替代方案,强调软件开发人员自身的编码技能和责任,而没有职业标准或任何规定的课程,导致了解决临时问题(工艺)时没有遵循工程化原则(缺乏可预测性、精确性、风险缓解、正式方法以及明确定义)。《软件工艺宣言》扩展了敏捷软件宣言,[39] 并在现代软件开发和中世纪欧洲学徒模式之间作了一个比喻。
软件工程的一个核心问题是,它的方法不够经验化,因为对方法的实际验证通常是不存在的,或者非常有限的,因此,软件工程常常被误解为只有在“理论环境”下才是可行的。
软件工程的核心问题之一是它的方法不够经验性,因为对方法的现实世界验证通常不存在,或者非常有限,因此软件工程常常被误解为只有在“理论环境”下才是可行的。
艾兹格·迪科斯彻(Edsger Dijkstra)是当今软件开发中许多概念的创始人,直到2002年去世之前,他一直拒绝接受“软件工程”这一概念,他认为这些术语与他所称的计算机科学的“激进新奇”没有什么相似之处:
许多这样的现象都被捆绑在“软件工程”的名下。正如经济学被称为“悲惨的科学”,软件工程应该被称为“注定要失败的学科”,之所以说软件工程注定要失败,是因为它的目标是自相矛盾的,这一目标甚至都达不到。当然,软件工程本身是另一项有价值的事业,但那只是表面文章:如果你仔细阅读它的文献并分析它的奉献者实际做了什么,你会发现软件工程已经接受了它的章程—“如果你不能编程,如何编程”。
^Leondes, Cornelius T. (2002). Intelligent Systems: Technology and Applications. CRC Press. p. I-6. ISBN 978-0-8493-1121-5. 1.4 Computers and a First Glimpse at Al (1940s).
^Campbell-Kelly, Martin (April 1982). "The Development of Computer Programming in Britain (1945 to 1955)". IEEE Annals of the History of Computing. 4 (2): 121–139. doi:10.1109/MAHC.1982.10016..
^Parnas, David (December 1972). "On the Criteria To Be Used in Decomposing Systems into Modules". Communications of the ACM. 15 (12): 1053–1058. doi:10.1145/361598.361623. Retrieved 2008-12-26..
^"The origin of "software engineering"". Retrieved 17 Nov 2017..
^Randall, Brian. "The 1968/69 NATO Software Engineering Reports". Retrieved 17 Nov 2017..
^Sommerville 2008,第26页.
^Peter, Naur; Randell, Brian (7–11 October 1968). Software Engineering: Report of a conference sponsored by the NATO Science Committee (PDF). Garmisch, Germany: Scientific Affairs Division, NATO. Retrieved 2008-12-26..
^Randell, Brian (10 August 2001). "The 1968/69 NATO Software Engineering Reports". Brian Randell's University Homepage. The School of the Computer Sciences, Newcastle University. Retrieved 2008-10-11. The idea for the first NATO Software Engineering Conference, and in particular that of adopting the then practically unknown term "software engineering" as its (deliberately provocative) title, I believe came originally from Professor Fritz Bauer..
^2018 International Conference on Software Engineering celebrating its 40th anniversary, and 50 years of Software engineering. "ICSE 2018 - Plenary Sessions - Fred Brooks". Retrieved 9 Aug 2018..
^2018 International Conference on Software Engineering celebrating its 40th anniversary, and 50 years of Software engineering. "ICSE 2018 - Plenary Sessions - Margaret Hamilton". Retrieved 9 Aug 2018..
^"ISO/IEC TR 19759:2005". Retrieved 2012-04-01..
^"Software Engineering Body of Knowledge (SWEBOK Version 3), 2014" (pdf). www.swebok.org. IEEE Computer Society. Retrieved 24 May 2016..
^Abran 等人 2004,第1–1页.
^"SE2014 Software Engineering Curriculum" (PDF)..
^Williams, N.S.W. (19–21 February 2001). "Professional Engineers Ontario's approach to licensing software engineering practitioners". Software Engineering Education and Training, 2001 Proceedings. 14th Conference on. Charlotte, NC: IEEE. pp. 77–78..
^"NCEES Software Engineering Exam Specifications" (PDF). Archived from the original (PDF) on 2013-08-27. Retrieved 2012-04-01..
^"NCEES discontinuing PE Software Engineering exam". National Council of Examiners for Engineering and Surveying. 13 March 2018. Retrieved 6 August 2018..
^"SWEBOK Guide Version 3". Retrieved 2015-03-09..
^"Software Engineering Code of Ethics" (PDF). Retrieved 2012-03-25..
^https://web.archive.org/web/20221026010834/https://www.bls.gov/ooh/computer-and-information-technology/home.htm.
^https://web.archive.org/web/20221026010834/https://www.bls.gov/ooh/computer-and-information-technology/computer-programmers.htm.
^"Software Engineering". Retrieved 2008-02-01..
^"Computer Software Engineers and Computer Programmers". Retrieved 2009-12-17..
^"SEI certification page". Sei.cmu.edu. Retrieved 2012-03-25..
^Wyrostek, Warren (March 14, 2008). "The Top 10 Problems with IT Certification in 2008". InformIT. Retrieved 2009-03-03..
^IEEE Computer Society. "2006 IEEE computer society report to the IFIP General Assembly" (PDF). Retrieved 2007-04-10..
^IEEE. "CSDA". Retrieved 2010-04-20..
^ACM (July 17, 2000). "A Summary of the ACM Position on Software Engineering as a Licensed Engineering Profession" (PDF). Association for Computing Machinery (ACM). Archived from the original (PDF) on May 17, 2008. Retrieved 2009-03-03. At its meeting in May 2000, the Council further concluded that the framework of a licensed professional engineer, originally developed for civil engineers, does not match the professional industrial practice of software engineering. Such licensing practices would give false assurances of competence even if the body of knowledge were mature; and would preclude many of the most qualified software engineers from becoming licensed..
^Canadian Information Processing Society. "I.S.P. Designation". Retrieved 2007-03-15..
^"Professional Engineers Ontario: Welcome to PEO's website". Peo.on.ca. Retrieved 2012-03-25..
^Thibodaux, Patrick (2006-05-05). "As outsourcing gathers steam, computer science interest wanes". Computerworld.com. Retrieved 2016-12-06..
^"Computer Programmers". Bls.gov. Retrieved 2012-03-25..
^Mullins, Robert (2007-03-13). "Software developer growth slows in North America". InfoWorld. Archived from the original on 2009-04-04. Retrieved 2012-03-25..
^"Gartner Magic Quadrant" (PDF). Cognizant.com. Retrieved 2012-03-25..
^Casey, Valentine (2010-08-20). "Virtual software team project management". Journal of the Brazilian Computer Society. 16 (2): 83–96. doi:10.1007/s13173-010-0013-3..
^https://web.archive.org/web/20221026010834/https://www.dagstuhl.de/Reports/96/9635.pdf.
^https://web.archive.org/web/20221026010834/http://www.stevemcconnell.com/psd/04-senotcs.htm.
^https://web.archive.org/web/20221026010834/https://engiegirlsatuwaterloo.wordpress.com/2013/08/29/computer-engineering-software-engineering-or-computer-science/.
^Beck, Kent; et al. (2001). "Manifesto for Agile Software Development". Agile Alliance. Retrieved 14 June 2010..
暂无