程序:在这里指的是源程序,就是一行行的代码。它们是建立在数据结构上的一些算法。程序还要对数据进行操作,这此数据有些是静态的(例如软件的图标、提示信息),有些是动态的(例如程序生成的随机数字、程序通过网络下载的数据、用户的文字或语音输人等)。
软件构建的过程:构建不仅仅是cc和ink命令,一个复杂的软件不但要有合理的软件架构(SoftwareArchitecture)、软件设计与实现(SoftwareDesign,ImplementationandDebug),还要有各种文件和数据来描述各个程序文件之间的依赖关系、编译参数、链接参数,等等。。
源代码管理(SourceCodeControl)的问题:也叫配置管理(SoftwareConfigurationManagement),例如有些程序要配置不同的界面,运行在中文,英文或其他语言的操作系统上;有些程序还有32位版本、64位版本等。
质量保障(QualityAssurance):一系列的工具、流程和文档来保证程序的正确性,这些工具(也是软件)、流程应该达到很高的质量,才能保证开发出来的软件的质量。
软件测试(Test):具体的验证过程为软件测试。
软件的发布流程:软件团队要从需求分析(RequirementAnalysis)开始,把合适的需求梳理出来,然后逐步展开后续工作,如设计(软件架构)、实现(写数据结构和算法)、测试,到最后发布软件。
程序理解(ProgramComprehension):软件团队的人员也会流动,新的成员要尽快读懂已有的程序,了解程序的设计。
软件维护(SoftwareMaintenance):或者服务运营(ServiceOperation)软件在运行过程中还会出这样那样的问题,也许我们要时不时给软件打一个补丁,或者维护众多的服务,团队的新老成员要一起修复各种各样的问题。
软件的生命周期(SoftwareLifeCycle,SLC):这一系列过程就是软件的生命周期。
软件项目的管理(ProjectManagement):在软件的生命周期中,有人得负责软件项目的管理。
软件的用户体验(UserExperience):一个好的软件,即使功能和同类软件区别不大,但却会让人感觉到非常好用。用户体验和数据结构、算法没有直接的关系,但是很多非常成功的软件就赢在这个方面。
软件的国际化和本地化(Globalization&Localization):软件要处理不同语言、不同地区的用户对界面和功能的不同需求。
所以,一个推论是:
软件=程序+软件工程
一个扩展的推论是:
软件企业=软件+商业模式
1.1.2软件开发的不同阶段
1.2软件工程是什么
软件工程是把系统的、有序的、可量化的方法应用到软件的开发、运营和维护上的过程。
软件工程包括下列领域:软件需求分析、软件设计、软件构建、软件测试和软件维护。
软件工具系统:MicrosoftVisualStudio、GitHub、Eclipse、ClearCase和ClearQuest等等。
1.2.1软件的特殊性
软件:可以运行在计算机及电子设备中的指令和数据的有序集合。
软件的分类:
●系统软件:操作系统、设备驱动程序、工具软件等
●恶意软件:软件病毒等。
软件的(本质)特殊性:
●复杂性(Complexity):大型软件(操作系统、办公软件、搜索引擎)有超过百万行的源代码,上万个不同的文件。软件的各个模块之间有各种显性或隐性的依赖关系,随着系统的成长和模块的增多,这些关系的数量往往以几何级数的速度增长。
●不可见性(Invisibility):软件以机器码的形式高速运行,还可能在几个CPU核上同时运行,商用软件出现了错误,工程师可以看到程序在出错的一瞬间留下的一些痕迹(错误代号、大致的目标代码位置、错误信息),但是几乎无法完整重现到底程序出现了什么问题。
●易变性(Changeability):人们自然地期待软件能在下面两种情况下“改变”:a)让软件做新的事情;b)让软件适应新的硬件。但是与此同时,正确地修改软件是件很困难的事情。
●服从性(Conformity):软件不能独立存在,它总是要运行在硬件上面,它要服从系统中其他组成部分的要求,它还要服从用户的要求、行业系统的要求(例如银行利率的变化)。
●非连续性(Discontinuity):许多软件系统没有这样连续的特性,有时输人上很小的变化,会引起输出上极大的变化。
软件的(其他)特殊性:
●有许多不同的程序设计语言、软件工具和软件开发平台。
●存在许多不同的软件开发流程。
●软件团队中存在许多不同的角色。
●软件既可以存储在磁带上,也可以存储在CD/DVD上。
1.2.2软件工程与计算机科学的关系
软件工程中的“工程”二字也大有来历,人们把下面的活动称之为工程:创造性的运用科学原理,设计和实现建筑、机器、装置或生产过程;或者是在实践中使用一个或多个上述实体;或者是实现这些实体的过程。
计算机理论的进展会帮助软件工程(例如对程序正确性的分析);软件工程的进展(更好的工具,更多的应用领域)会帮助计算机科学家更有效的进行实验和探索。
托尼·霍尔(TonyHoare)比较的计算机科学和软件工程的不同侧重点,如下图1.2.2。
计算机科学
软件工程
发现和研究长期的、客观的真理
短期的实际结果(具体的软件会过时
理想化的
对各种因素的折衷
确定性,完美,通用性
对不确定性和风险的管理,足够好,具体的应用
各个学科独立深入研究,做出成果
理论的统一
百花齐放的实践方法
强调原创性
最好的、成熟的实践方法
形式化,追求简明的公式
在实践中建立起来的灵感和直觉
正确性
可塑性
图1.2.2计算机科学和软件工程的不同侧重点
1.2.3软件工程的知识领域
2014年,IEEE发布了SWEBOKV3.0(SoftwareEngineeringBodyofKnowledge),完整地回答了这一问题,下面是其中提到的15个知识领域(KnowledgeArea,KA)。在15个KA中,有三个是软件工程的三大类基础知识领域:计算基础、数学基础和工程基础。
生命周期
软件需求,软件设计,软件构建,软件测试,软件维护
专门领域
软件配置管理,软件工程管理,软件工程过程,软件工程模型和方法,软件质量
理论基础
计算基础,数学基础,工程基础
1.2.4软件工程的目标——创造“足够好”的软件
●用户满意度:用户在使用时发现了软件的很多问题,影响了用户使用软件的效率。
●可靠性:某个软件经常会崩溃,某个操作系统会时不时死机,某个网站往往在最需要的时候登不上去。
●软件流程的质量:软件团队和开发流程的问题太多,导致团队成员无法互相协作,按时交付软件。这也可以说是软件团队的bug。
1.3练习与讨论(P18)
P18-2
1)在问题后面说明哪一章节的什么内容引起了你的提问,提供一些上下文。
2)列出一些事例或资料,支持你的提供。
3)说说你提问题的原因,你是因为自己的假设和书中的不同而提问,还有不懂书中的术语,
还是对推理过程有疑问,还是对推理过程有疑问,还有书中的描述和经验(直接或间接经验)相矛盾。
答:问题一:怎样才算一个好的单元测试
第二章个人技术和流程中的术语我没有怎么理解,单元测试应该准确、快速地保证程序基本极块的正确性。
问题二:学什么,怎么学,核心竞争力是什么
1.学什么:第三章软件工程师的成长中我认为软件工程是培养适应计算机应用学科的发展,具备计算机软件的基础理论、基本知识和基本技能,具有用软件工程的思想、方法和技术来分析、设计和实现计算机软件系统的能力的高级软件工程技术人才。
3.核心竞争力:我查找思考出了很多答案:技术、代码、天赋激情、经验、想象力等等.....我思考过这些答案,觉得答案挺好,但是还没有突出核心竞争力,没有展现软件工程师的特点。
例如技术和代码的能力,这个是属于基础能力;天赋和激情哪个行业都需要,何况天赋不是决定性的因素。经验也很重要,但不能说明太多问题,也许有三年开发经验的程序员只是把一年的经验重复了三次罢了;想象力我觉得更适合搞艺术和科研的,因为他们需要通过想象力在未知的领域去探索,而我们软件工程师是利用已有的知识去打造产品。
我觉得软件工程师的核心竞争力,不是单一能力的体现,而应该是多种能力和价值的综合体,学习能力、解决问题能力和影响力构成了软件工程师的核心竞争力。
问题三:阅读别人的代码有多难,怎么样可以让代码更容易阅读和维护呢?
在第四章两人合作的单元中个人觉得使代码遵从工具,坚持使用一种命名模式,使用断言来记录先决条件(preconditions)和后置条件(postconditions),别缩写英文单词,C语言标准运行时库的设计不是很优秀。别去效仿它,别写“聪明”的代码,理解编程语言特性的设计初衷,使用这些特性去做它们适合完成的工作,而不是它们能做到的工作,按功能单元划分源码树,而不是按组织结构。
问题四:团队模式和团队的开发模式有什么关系
在第五章团队和流程中我查资料了解了一下,团队模式,更偏向于多人合作的那种,而且我理解的“团队”会是一种多人合作的情况下,长期磨合后的一个组织,他们是相互了解的,是拥有巨大的默契存在的。
对于团队的开发模式我并没有查到具体的解释,但对于开发模式,是有查到几种开发模式,比如瀑布开发模式、快速应用开发模式等等,我们的课本上有这些模式,所以我在这里认为开发模式是更偏向于后边的“模式”两个字的,更注重方法,用什么方法。
我个人认为他们之间的关系是:团队模式是一种组织的存在,而团队的开发模式更注重于方法,团队采用什么样的方法开开发项目。
问题五:若是带领开发团队现在软件面对的问题都包括什么呢?
在第九章项目经理中我了解到,好的团队各具特色,单是不好的团对却如出一辙,基本上都存在以下几个方面的问题:
1、项目经理领导不力有效的领导是高效率软件开发团队的基本要求,如果领导不力,工作计划就不一定会合理,团队成员也不一定会投入工作的热情,使团队的凝聚力大打折扣;如果领导不力,就不一定有明确且具有挑战性的目标,团队成员就无法完成高质量的项目产品,无法投入信心和激情。
2、成员缺少必要的信心和激情
也许周围的一些同事仅仅是为了薪水而工作,在执行工作的时候即使发现了上层领导忽略的问题依然照糊涂画瓢也不反馈问题所在,其实这些同事并不是一开始就缺少激情的,原因也许是失去了信心,而暂时做"糊涂人"而已,无论如何,缺少信心和激情的团队,只会是一盘散沙。
3、成员相互的合作并不协调
在一个开发团队中偶尔有部分人不愿意与整个团队合作,也许是这些人性格比较保守,也许是有某些不平衡的心态,也许是他们还没有明白目标是什么,也许他们并没有体验到团队开发成功的快乐,等等。不管怎样,这种情况的出现必然影响融洽的交流环境。
4、团队中角色职责定义模糊不清软件开发是由不同角色的成员共同协作完成的,但一些开发团队却没有对各种角色成员的职责做出明确的定义,成员就无法明确知道自己的目标,很简单的道理,都不知道要做的是什么,能按时准确的完成吗?如果每人都按自己想象中的职责去工作,那么有多少工作冲突、多少遗漏,谁能给出正确的估计?没有明确的职责定义人力资源的安排可能合理吗?结果可能是找了个资格较老的程序员做了项目经理,找了个没有理会对象概念的人去做面向对象的系统分析,找个不顾网络安全、网络流量、事务特性、运行费用的人去设计一个分布式系统,等等。
P18-3
1)这些软件的开发者是怎么说服你(陌生人)成为他们的用户的?他们的目标都是盈利么?他们的目标都是赚取用户的现金么?还是别的
2)这些软件是如何到你手里的(邮购、下载、互相拷贝)?你当时上几年级?你对这个软件的感觉如何?
我的手机软件分成以下七类:
系统设备:天气、计算器、镜子、日历、闹钟、设置、手电筒、文件管理;
支付软件:美团APP、招商银行APP、中国工商银行App、云闪付APP、支付宝;
购物软件:京东App、淘宝App、小红书APP;
办公学习软件:Wpsoffice、百度网盘、网易有道词典、考虫APP、一起学网校APP、作业帮APP、知米背单词、驾考宝典、运动世
界校园APP、番茄TODOAPP;
生活软件:高德地图、铁路12306App、美团外卖、美颜相机、最美证件照;