1.2 什么是工程
1.2.1 软件是一门工程学科
为了更深入地探索软件的本质,软件学术界和产业界进行了大量的研究和探索。软件开发追求的目标是什么?软件应是一门什么学科?是艺术、科学,还是工程?
艺术是追求美(beauty)的学科。软件开发和艺术有关系,优秀的软件好用且美,就像艺术品一样。有人曾说,写一行行代码,就像写一首蓝色的诗。软件的开发和艺术的创作在某些方面常常很相似,都需要灵感和创意,非常依赖于创作者的个体能力、思维方式以及当时的情绪和状态。
科学是追求真(truth)的学科。软件开发和科学有关系,它具有数理性质,可以采用数学抽象方法进行一致性分析并细化成更详细的理论。形式化开发方法就是用数学的方法来开发或验证软件的。
工程是追求善(benefit)的学科。软件开发具有很强的工程性质,软件开发需要一群人靠系统的方法一起进行分析、设计、实现和测试来完成,“不是一个人在战斗”,也不是只靠一种技术。它需要多个人的有效协作、多种学科技术的有效综合才能成功。因此,我们认为软件开发更偏向工程学科,如图1-1所示,软件开发的目标是提供最大的价值。
图1-1 软件是一门工程学科
当前,软件工程学科已发展为计算机科学与技术、数学、工程学、管理学等相关学科的交叉学科。2011年初国务院学位委员会和教育部将软件工程确立为一级学科。
1.2.2 工程的定义和特性
所谓工程,是对技术(或社会)实体的分析、设计、建造、验证和管理。应用于不同的领域,则形成系统工程、社会工程、化学工程、冶金工程、机电工程、土木工程、水利工程、交通工程、纺织工程、食品工程,以及软件工程等。工程是一种组织良好、管理严密、各类人员协同配合、共同完成工作的学科,它具有以下特性:
1)以价值为目标。工程的目标就是获得最大的效益,给社会或组织带来价值。
2)高度的组织管理性。工程需要各类人员为了共同的愿景和目标协同配合,需要把相互作用和相互依赖的若干组成部分结合成具有特定功能的有机整体,因此它是一门组织管理的学科。
3)多种学科的综合。工程需要综合使用多门学科的知识和技术。例如,软件工程涉及数学、工程学、美学、经济学、管理学等学科。
4)高度的实践性。工程需要采用实践的研究方法,从实践中总结知识,再应用于实践中。
1.2.3 工程过程
工程过程由以下步骤组成[3],适用于包括软件工程在内的所有工程领域:
1)理解真正的问题。当需求被确认时,工程就开始了,没有现成的解决方案可以满足该需求。然而,需要解决的问题并不总是工程师被要求解决的问题,因此应采用根源分析等技术来发现需要解决的真正的潜在问题是什么。
2)设计方案。设计多个技术上可行的解决方案,从技术、财务、进度等维度进行评估,从中选出最佳解决方案,确保方案能很好地满足需求。
3)监控所选方案的效能。在方案实施过程中监督和评估它的实际效能,并确定其他备选方案是否更好(如果为时不晚)。
工程过程是迭代的,前一个迭代中获得的知识将为后一个迭代提供指导和改进方向。