1 什么是软件工程

软件工程师要利用与计算机和计算相关的知识来解决问题。通常情况下,我们要处理的问题是与计算机或现有的计算机系统相关的。但是,也有时候,解决问题的潜在困难与计算机无关。因此,首先要理解问题的本质,这是至关重要的。尤其是,我们必须十分谨慎,不要把计算机器或技术按我们的意愿强加给遇到的每个问题。我们必须首先解决这个问题;然后,如果需要的话,再把技术作为工具来实现我们的解决方案。

1.1 问题求解

多数问题是大型问题,往往难以处理,尤其是,当它含有一些以前从未解决过的新问题的时候。因此,首先要通过分析(analyzing)对问题进行研究,也就是说,将问题分解成可以理解并能够处理的若干小的部分。这样,就可以将较大的问题变为一组较小的问题以及它们之间的关系。图1-1说明了如何进行分析。子问题之间的关系(用图中的箭头以及子问题的相对位置来表示)与子问题本身同样是非常重要的。有时,正是这种子问题之间的关系而不是子问题本身提供了解决大型问题的线索。

推荐几本软件工程方向的书_架构

图1-1 分析的过程

一旦分析了这个问题之后,就需要根据针对问题不同方面的构件来构造解决方案。图1-2说明了这样的逆向过程:合成(synthesis)是把小的构造块组合成一个大的结构。如同分析一样,将每个解决方案组合在一起可能与寻找解决方案本身同样具有挑战性。要了解其中的原因,可以考虑写一本小说的过程:字典中包含了写作过程中可能用到的所有单词,但是,写作最困难的部分是决定如何将单词组织好写成句子,以及如何将句子组织为段落,乃至于如何把章节组织成一本完整的书。因此,任何问题求解技术都必须包括两部分:通过分析问题来确定问题的本质含义,然后,再基于分析来合成解决方案。

推荐几本软件工程方向的书_范型_02

图1-2 合成的过程

为了帮助我们解决问题,我们会采用各种方法、工具、过程和范型。方法(method)或技术(technique)是产生某些结果的形式化过程。例如,厨师可能使用严格定时的、有序的方式,把一系列调料成分组合成调味汁,使得调味汁变稠,但不会凝结或散开。调制调味汁的过程包括时间选择和调料成分,但并不依赖于使用了哪种烹饪设备。

工具(tool)是用更好的方式完成某件事情的设备或自动化系统。这个“更好的方式”可能是工具使我们更精确、更高效或生产率更高,也可以是它能够提高最终产品质量。例如,我们使用打字机或者键盘加打印机来写信,因为这样写出的信件比手写的更易于阅读。再如,我们使用剪刀作为工具是因为用它裁纸要比直接用手撕纸更快、更整齐。然而,要做好一件事情,工具并不总是必需的。例如,使调味汁更美味的是烹调技术,而不是厨师用的锅和羹匙。

过程(procedure)如同食谱:把工具和技术结合起来,共同生产特定产品。例如,就像后面的章节所论述的那样,测试计划描述测试过程:它告诉我们,在什么情况下将使用哪种工具处理哪个数据集,以便我们能够确定软件是否满足了需求。

最后,范型(paradigm)就像烹饪风格。它表示构造软件的特定方法或哲学。就像我们能够区分法国菜烹饪法与中国菜烹饪法一样,我们也能够区分面向对象开发和过程开发这样的范型。并不是某一种范型就一定比另一种范型好,每一种范型都有其各自的优缺点,只是在某些情况下,一种范型可能要比另外一种范型更合适。

软件工程师使用工具、技术、过程和范型来提高软件产品的质量。他们的目标就是使用高效的、高生产率的方法形成相关问题的有效解决方案。下面的章节将重点介绍支持我们所说的开发和维护活动的特定方法。读者可以在本书的万维网主页中找到相关工具和技术的最新链接。

1.2 软件工程师的角色是什么

要理解软件工程师在计算机科学领域中所扮演的角色,我们先看看另外一个学科的例子。考虑一下化学研究以及用它来解决问题这两者之间的区别。化学家研究化学物质:它们的结构、它们的相互作用以及现象背后的理论。而化学工程师则用化学家的研究结果解决各种问题。化学家将化学作为研究对象;但对化工人员而言,化学是用来解决一般问题(这个问题本质上甚至可能不是“化学”领域的问题)的工具。

我们可以从类似的角度看待计算技术。人们可以集中精力研究计算机和程序设计语言,也可以把它们看作是用于设计和实现问题解决方案的工具。软件工程显然属于后一种情形,如图1-3所示。软件工程师的精力集中于把计算机作为问题求解的工具,而不是研究硬件设计或者算法的理论证明。在本章的后面,我们会了解到,软件工程师使用计算机的功能进行工作,并将其作为一般解决方案的一部分,而不是研究计算机本身的理论和结构。

推荐几本软件工程方向的书_范型_03

图1-3 计算机科学和软件工程之间的关系

书单推荐

1、领域驱动设计:软件核心复杂性应对之道(修订版)

推荐几本软件工程方向的书_架构_04

“领域驱动设计之父”经典著作,众多声名显赫软件大师鼎力推荐,凝聚领域建模专家数十年的实战经验,深度剖析构建高质量复杂系统的核心技术。

本书主要是为面向对象软件开发人员编写的。软件项目团队的大部分成员都能够从本书的某些部分获益。本书最适合那些正在项目上尝试这些实践的人员,以及那些已经在这样的项目上积累了丰富经验的人员。

一些中级软件开发人员可能已经了解面向对象设计的一些知识,也许读过一两本软件设计的书,那么本书将填补这些读者的知识空缺,向他们展示如何在实际的软件项目上应用对象建模技术。本书将帮助这些开发人员学会用高级建模和设计技巧来解决实际问题。

高级软件开发人员或专家可能会对书中用于处理领域的综合框架感兴趣。这种系统性的设计方法将帮助技术负责人指导他们的团队保持正确的方向。此外,本书从头至尾所使用的明确术语将有助于高级开发人员与他们的同行沟通。

全书围绕着设计和开发实践,结合若干真实的项目案例,向读者阐述如何在真实的软件开发中应用领域驱动设计。书中给出了领域驱动设计的系统化方法,并将人们普遍接受的一些实践综合到一起,融入了作者的见解和经验,展现了一些可扩展的设计新实践、已验证过的技术以及便于应对复杂领域的软件项目开发的基本原则。

2、重构:改善既有代码的设计(第2版)

推荐几本软件工程方向的书_软件工程_05

软件开发大师的不朽经典,生动阐述重构原理和具体做法,普通程序员进阶到编程高手必须修炼的秘笈。

本书是经典著作《重构》出版20年后的更新版。书中清晰揭示了重构的过程,解释了重构的原理和实践方式,并给出了何时以及何地应该开始挖掘代码以求改善。书中给出了60多个可行的重构,每个重构都介绍了一种经过验证的代码变换手法的动机和技术。本书提出的重构准则将帮助开发人员一次一小步地修改代码,从而减少了开发过程中的风险。

3、领域特定语言

推荐几本软件工程方向的书_架构_06

1.本书由世界软件开发大师Martin Fowler历时多年完成,堪称DSL领域的丰碑之作,书中充分介绍了在适用的场景中构建DSL的多种有效技。

2.本书介绍的技巧可用于大多数现代面向对象语言。书中给出了许多采用Java和C#编写的示例,并精选了部分适合采用Ruby编写的示例。

3.通过这部内容丰富、覆盖范围广泛的著作,开发人员能够掌握做出DSL重要决策所需的知识,并在恰当使用DSL时获得技术和业务上的显著收益。

全书共57章,分为6个部分,全面介绍了DSL概念、DSL常见主题、外部DSL主题、内部DSL主题、备选计算模型以及代码生成等内容,揭示了与编程语言无关的通用原则和模式,阐释了如何通过DSL有效提高开发人员的生产力以及增进与领域专家的有效沟通,能为开发人员选择和使用DSL提供有效的决策依据和指导方法。

本书适合想要了解各种DSL及其构造方式,理解其通用原则、模式和适用场景,以提高开发生产力和沟通能力的软件开发人员阅读。

4、分析模式:可复用的对象模型

推荐几本软件工程方向的书_架构_07

要开发复杂的企业应用,先要为业务领域建立准确而深刻的分析模型。本书不是通过简化的案例讲述抽象的理论,而是直接给出来自真实项目的复杂模型,并以“模式”的方式进行归纳。本书不仅包括这些模式本身,还体现了作者丰富的实践经验和对建模技术的深入洞见。本书主要包括两部分:第一部分介绍来自人员与组织管理、观察与测量、存货与会计、计划、金融衍生品交易等多个业务领域的“分析模式”;第二部分则给出一系列“支持模式”,用于将分析模型实现为具体的软件。

具有一定经验的架构师、业务分析师以及高级开发人员通过研读本书可以很快将书中的模式和思路应用于实践,有效提高开发水平。软件开发的入门者阅读本书尽管未必能立刻领悟其全部内涵,但也足以打开一扇通向新境界的窗户,为日后的提高奠定基础。

5、代码整洁之道

推荐几本软件工程方向的书_架构_08

阅读本书需要你做些什么呢?你将阅读代码——大量代码。本书会促使你思考何谓正确的代码,何谓错误的代码。更重要的是,本书将促使你重新评估自己的专业价值观,以及对自己技艺的承诺。

书中的具体内容包括:

  • 好代码和糟糕的代码之间的区别;
  • 如何编写好代码,如何将糟糕的代码转化为好代码;
  • 如何创建好名称、好函数、好对象和好类;
  • 如何格式化代码以实现其可读性的最大化;
  • 如何在不妨碍代码逻辑的前提下充分实现错误处理;
  • 如何进行单元测试和测试驱动开发。

6、敏捷整洁之道 回归本源

推荐几本软件工程方向的书_软件开发_09

1.回顾敏捷的历史,重述敏捷最初的用意,阐述敏捷的本质;
2.澄清长久以来人们对敏捷的误解与混淆,让敏捷回归正途;
3.正本清源,为软件行业从业者讲述敏捷的价值观与原则;
4.敏捷宣言提出20年后敏捷开发人员面临的关键问题的实用答案。
《敏捷宣言》签署近20年后,软件开发界的传奇人物罗伯特·C. 马丁(“鲍勃大叔”)重出江湖,为新一代软件行业从业者——不论是程序员还是非程序员——讲述敏捷的价值观与原则。马丁著有《代码整洁之道》等极-具影响力的软件开发指导性著作,也是敏捷最初的奠基人之一。如今,在本书中,他澄清了长久以来人们对敏捷的误解与混淆,重述敏捷最初的用意。

马丁明确地阐述了敏捷的本质:敏捷虽然是一种帮助小团队运作小项目的小方法,但它对整个IT 行业有着巨大的影响,因为任何大项目都是由若干小项目组成的。他将自己50年的从业经验融入平实的文字,展示了敏捷如何帮助软件行业从业者达到真正的专业水准。

7、代码整洁之道 程序员的职业素养

推荐几本软件工程方向的书_软件开发_10

《代码整洁之道 程序员的职业素养(异步图书出品)》([美]罗伯特·C.马丁(Robert C.Martin))【摘要 书评 试读】

软件开发大师Robert C. Martin在书中介绍了真实软件技艺中的各项原则、技术、工具和实践,展示了怎么以自豪、自尊和自信的心态进行软件开发,怎么取得卓越表现和丰硕成果,怎么做到有效沟通和确切估算,怎么以坦诚的心态面对困难,并引导读者认识到专业程序员肩负的责任重大,阐述了什么才是程序员的职业素养。

书中的具体内容包括:

● 成为真正的软件专业人士需要具备哪些条件,如何应对彼此冲突又紧张的进度表和不近情理的管理人员;

● 如何做到流畅编程,克服阻塞状态;

● 如何应对无休止的工作压力,避免崩溃;

● 如何培养坚持不懈的态度,如何拥抱新的开发范式;

● 如何管理好时间,避免身陷泥潭无法自拔;

● 如何培育有利于程序员和开发团队茁壮成长的环境;

● 什么时候应该说“不”,怎么说;

● 什么时候应该说“是”,承诺意味着什么。

8、软件工程 第4版 修订版

推荐几本软件工程方向的书_范型_11

1.软件工程课程的经典教材,国际上众多名校均采用本书。
2.配有专门的配套网站,包含教学PPT和习题答案等丰富的教学资源。

本书是软件工程领域公认的经典名著,也是业界常引用的主要文献之一,被国内外众多名校广泛采用。与其他软件工程著作不同,本书注重从实践出发选择和安排素材,同时又从理论上进行了全面深入的探讨。对诸如复用、风险管理和质量工程、测度和度量等理论性比较强的主题,没有专设章节,而是融合在相关的各种软件工程活动中讲述。

本书理论阐述循序渐进,善于揭示各知识点之间的内在联系,并通过大量实例和工程实践深化和丰富理论知识;选材与时俱进,反映了业界动态,尤其是建模和敏捷方法方面的重要进展。两个贯穿全书的研究案例——信息系统案例和实时系统案例,以及书中的学期项目,引导读者很好地将概念有机地应用到实际项目中去。