在软件工程早期,软件开发基本上没有可遵循的方法,程序员只是依据自己的经验并根据需要解决的问题直接编写代码。根据M. H. Hamilton的回忆 [13],在她负责的早期飞行控制软件开发项目中,当时程序员主要关心的是,理解硬件和软件的关系以及如何利用这类知识来提升软件的性能。由于没有任何辅助工具,程序员最担心的是代码出错,需要不断地花时间进行手工调试。
在总结早期飞行控制软件开发经验的基础上,M. H. Hamilton设计了一个通用系统语言(Universal System Language, USL)[14],其灵感来自她对Apollo软件开发过程中出现的错误模式或错误类别的认识。当时,子系统间的接口错误占了软件错误的绝大部分,而且这些错误通常是最难找到和调试正确的。USL给出了不同接口错误的类别定义,通过这些系统定义来识别错误并在系统设计的时候预防它们。 USL定义了六个公理,形成了控制逻辑的数学构造性理论的基础。该语言还在Hamilton Technologies,Inc推出的001 Tool Suite软件上得到实现。
许多软件工程任务可以建模位计算搜索、组合优化问题,基于搜索的软件工程就是用来解决这些软件工程任务的。这类方法最早在1976年出现,当时,Webb Miller 和 David Spooner尝试把优化算法用于浮点测试数据的生成[27]。1992年,Xanthakis等将搜索算法用于解决软件测试问题[28]。2001年,Harman 和 Jones正式基于搜索的软件工程[29]。
除了采用工程方法来组织、管理软件的开发过程,并根据标准检验过程的正确性外。还有一类工作就是深入探讨程序和程序开发过程的规律,建立严密的理论,以其用来指导软件开发实践,这类工作推动了形式化方法的深入研究,其目标是以严格的数学推演为基础,通过对系统的形式规约、验证和逐步精化来构造并实现软件,从而提高软件设计的可靠性和鲁棒性。通过对系统的形式规约、验证和逐步精化来构造并实现软件。其中,形式规约是使用形式语言构建所开发的软件系统的规约,对应软件生命周期不同阶段的制品,刻画系统不同抽象层次的模型和性质。形式化开发就是构造并证明形式规约之间的等价转换和精化关系,以系统的形式模型为指导,通过逐步精化,最后开发出满足需要的系统,也称为构造即正确(Correct by Construction)的开发。
单一的软件开发工具很多时候由于缺少必要的上下文信息或与其他工具的联系而很难使用。因此,基于多种软件开发工具形成的集成开发环境(IDE)逐渐发展起来。20世纪80年代,通用编程语言Ada带有自己的编程支持环境APSE,提供了编辑界面、编译器、测试器、连接加载器等功能模块,将集成开发环境提升到一个新的阶段。此后,微软(Microsoft)、宝蓝(Borland)等软件公司相继开发出各自的开发环境用于支持相应编程语言的开发与调试。IDE的出现为软件开发人员在开发过程中集中完成软件开发任务提供了统一的环境,也为后续进一步扩展新的软件工程工具奠定了基础。例如,1987年宝蓝公司推出的Turbo C开发环境,在字符界面上提供了灵活的代码编写和调试环境,使得开发人员能够一站式完成程序编写、测试和调试。1991年为了适应微软公司的视窗(Windows)操作系统界面风格,宝蓝公司又推出Borland C++,并在90年代后期推出Borland C++ Builder提升了集成开发环境的易用性和代码编译链接的效率。在这个工具的升级过程中,不仅需要适应C/C++语言标准的变化、操作系统的变化,还考虑了开发人员的易用性需求,通过可视化的窗体设计器、对象观察器等可视化元素加入到开发环境中,推出了VCL构件库,引领了快速应用程序开发(RAD)开发方法,大大降低了开发Windows应用程序的难度。
[1] P. Naur and B. Randell, eds., Software Engineering: Report on a Conference Sponsored by the NATO Science Committee, Garmisch, Germany, 7th to 11th October 1968, NATO Scientific Affairs Div., Jan. 1969
\noindent
\hangafter=1
\setlength{\hangindent}{2em}
[2] E. W. Dijkstra, The Humble Programmer, Communication of ACM 15(10): 859-866, 1972
\noindent
\hangafter=1
\setlength{\hangindent}{2em}
[3] F. P. Brooks, The Mythical Man-Month, Addison-Wesley, 1975
\noindent
\hangafter=1
\setlength{\hangindent}{2em}
[4] F. P. Brooks, No Silver Bullet: Essence and Accidents of Software Engineering, Computer, 20(4): 10-19, 1987
\noindent
\hangafter=1
\setlength{\hangindent}{2em}
[5] P. Laplante, What Every Engineering Should Know about Software Engineering, Boca Raton: CRC, 2007, ISBN 978-0-8493-7228-5
\noindent
\hangafter=1
\setlength{\hangindent}{2em}
[6] Systems and software engineering -Vocabulary, ISO/IEC/IEEE std 24765:2010(E), 2010.
\noindent
\hangafter=1
\setlength{\hangindent}{2em}
[7] IEEE Standard Glossary of Software Engineering Terminology, IEEE std 610.12-1990, 1990.
\noindent
\hangafter=1
\setlength{\hangindent}{2em}
[8] Ian Sommerville, Software Engineering, Harlow, England: Pearson Education, 1982.
\noindent
\hangafter=1
\setlength{\hangindent}{2em}
[9] R. S. Pressman, Software Engineering: A Practitioner’s Approach, Mc Grew Hill, 2005
\noindent
\hangafter=1
\setlength{\hangindent}{2em}
[10] C. Ghezzi, M. Jazayeri and D. Mandrioli, Fundamentals of Software Engineering, Prentice-Hall, 2002
\noindent
\hangafter=1
\setlength{\hangindent}{2em}
[11] H. van Vliet, Software Engineering: Principles and Practice, John Wiley \& Sons, Ltd., 2000
[13] M. H. Hamilton, What the Errors Tell Us, Software Engineering’s 50th Anniversary, IEEE Software, September/October 2018, 32-37
\noindent
\hangafter=1
\setlength{\hangindent}{2em}
[14] M. H. Hamilton and W. R. Hackler, Universal Systems Language: Lessons Learned from Apollo, IEEE Computer, Dec. 2008, 34-43
\noindent
\hangafter=1
\setlength{\hangindent}{2em}
[15] P. Checkland and J. Scholes, Soft Systems Methodology in Action, Wiley, 1990
\noindent
\hangafter=1
\setlength{\hangindent}{2em}
[16] E. Yourdon and L. Constantine, Structured Design: Fundamentals of a Discipline of Computer Program and System Design, Prentice-Hall, 1979
\noindent
\hangafter=1
\setlength{\hangindent}{2em}
[17] E. Yourdon, Modern Structured Analysis, Yourdon Press, 1989
\noindent
\hangafter=1
\setlength{\hangindent}{2em}
[18] M. Jackson, Principle of Program Design, Academic Press, 1975
\noindent
\hangafter=1
\setlength{\hangindent}{2em}
[19] M. Jackson, System Development, Prentice-Hall International, 1983
\noindent
\hangafter=1
\setlength{\hangindent}{2em}
[20] T. DeMarco, Structured Analysis and System Specification, Prentice Hall, 1979
\noindent
\hangafter=1
\setlength{\hangindent}{2em}
[21] G. Booch, R. A. Maksimchuk, M. W. Engle, J. Conallen, B. J. Young and K. A. Houston, Object-Oriented Analysis and Design with Applications (2nd Edition), Addison-Wesley, 1993
\noindent
\hangafter=1
\setlength{\hangindent}{2em}
[22] J. Rumbaugh, M. Blaha, W. Premerlani, F. Eddy and W. Lorensen, Object-Oriented Modeling and Design, Prentice Hall International, 1991
\noindent
\hangafter=1
\setlength{\hangindent}{2em}
[23] I. Jacobson, Object Oriented Software Engineering: A Use Case Driven Approach, Addison-Wesley Professional, 1992
\noindent
\hangafter=1
\setlength{\hangindent}{2em}
[24] I. Jacobson, G. Booch and J. Rumbaugh, The Unified Software Development Process, Addison Wesley Longman, 1998
\noindent
\hangafter=1
\setlength{\hangindent}{2em}
[25] P. Kruchten, The Rational Unified Process: An Introduction, Addison-Wesley, 2004
\noindent
\hangafter=1
\setlength{\hangindent}{2em}
[26] E. Gamma, R. Helm, R. Johnson and J. Vlissides, Design Patterns, Addison-Wesley Professional, 1994
\noindent
\hangafter=1
\setlength{\hangindent}{2em}
[27] W. Miller and D. L. Spooner, Automatic Generation of Floating-Point Test Data, IEEE Transactions on Software Engineering. SE-2 (3): 223–226, 1976
\noindent
\hangafter=1
\setlength{\hangindent}{2em}
[28] S. Xanthakis, C. Ellis, C. Skourlas, A. Le Gall, S. Katsikas and K. Karapoulios, Application of genetic algorithms to software testing, Proceedings of the 5th International Conference on Software Engineering and its Applications: 625–636, 1992
\noindent
\hangafter=1
\setlength{\hangindent}{2em}
[29] M. Harman and B. F. Jones, Search-based software engineering, Information and Software Technology. 43 (14): 833–839, 2001
\noindent
\hangafter=1
\setlength{\hangindent}{2em}
[30] C. Larman and V. R. Basili, Iterative and Incremental Developments: A Brief History, IEEE Computer, 36(3): 47-56, 2003
[38] K. Pohll, Requirements Engineering: Fundamentals, Principles and Techniques, Springer-Verlag, 2010.
\noindent
\hangafter=1
\setlength{\hangindent}{2em}
[39] A. van Lamsweerde, Requirements Engineering: From System Goals to UML Models to Software Specification, John Wiley, 2009
\noindent
\hangafter=1
\setlength{\hangindent}{2em}
[40] E. Yu, Social Modeling for Requirements Engineering, MIT Press, 2010
\noindent
\hangafter=1
\setlength{\hangindent}{2em}
[41] A. G. Sutcliffe, Scenario-Based Requirements Engineering, Proceedings of IEEE International Requirements Engineering Conference (RE2003): 320-329, 2003
\noindent
\hangafter=1
\setlength{\hangindent}{2em}
[42] M. Jackson, Problem Frames: Analyzing and Structuring Software Development Problems, Addison-Wesley, 2001
\noindent
\hangafter=1
\setlength{\hangindent}{2em}
[43] Z. Jin, Environment Modelling based Requirements Engineering for Software Intensive Systems, Elsevier, Morgan Kaufmann Publisher, 2017
\noindent
\hangafter=1
\setlength{\hangindent}{2em}
[44] K. C. Kang, S. Kim, J. Lee, K. Kim, E. Shin and M. Huh, FORM: A feature-oriented reuse method with domain-specific reference architectures, Annals of Software Engineering, 5: 143-168, 1998
\noindent
\hangafter=1
\setlength{\hangindent}{2em}
[45] R. Lu and Z. Jin, Domain Modeling based Software Engineering, Kluwer Academic Publishers, 2000.
[p1] Ruben Prieto-Diaz, James M.Neighbors. Module interconnection languages. Journal of Systems and Software, Volume 6, Issue 4, November 1986, Pages 307-334.