几个星期前,我阅读过一篇文章,一位老师教导自己的学生要积极地去阅读文学文献,其中,我很欣赏他的一句话:“Just think of liturature as if you're reading a long text-message”。引申到这里,对比后才发现自己在现实生活中真的很少在课后花时间来细看自己的专业书籍,说来惭愧,这种情况出现的频率最多的就是在学期末备战考试了。因为这次的作业,我似乎告诉自己这是一个非常“恰当”的理由去让自己提前去完成未完的“任务”。阅读一本书,就要认真,要对得起自己,还要对得起作者。这次阅读邹欣老师著作的《现代软件工程——构造之法 》的第一到第五章,我在课堂上用了3节课的时间,在课下用了一个半小时,受益匪浅!
-
第一章(概论)1-19
这一章主要是把“软件工程”这四个字剖析了。从一开始的介绍,就让我们了解到 软件=程序+软件工程,程序=数据结构+算法 。
软件工程是把系统的、有效的、可量化的方法应用到软件的开发、运营和维护上的过程。一个复杂的软件不但要有合理的软件架构、软件设计与实现,还要有各种文件和数据来描述各个程序文件之间的依赖关系、编译参数等等。“软件工程”是一个大项目,里面有很多的概念需要我们理解:源代码管理(配置管理)、质量保障、软件测试、需求分析、程序理解、软件维护(服务运营)、软件生命周期、项目管理、用户体验等等。
“软件工程”的概念是在1968年第一次被提出来的,为了更好的了解它的历史及影响,我们拿软件业和航空业来做对比,可以得出好多相似的地方:
软件它是属于逻辑产品,生产的团队很大,虽然维护比较复杂且易退化,但是它不会磨损老化。在1.2.5节中,谈到了什么是好的软件?同时,我也很疑惑,因为Bug的多少可以直接衡量一个软件的开发效率、用户满意度、可靠性和可维护性,那么是不是软件没有Bug就是好软件呢?我觉得不然,因为有实际用处的同时又是完美的软件,在这个世界上是不存在的。就算微软很自豪的window8系统也会有偶尔出现蓝屏的现象,但是这并不会直接影响到微软公司的能力,也不会直接影响到window8系统的可用性,因为你的RP是由你的程序质量决定的,所以我个人觉得软件不存在完美,总会有顾客的客观或主观因素而感到不满意,我们不能迎合所有的市场需求,最重要的还是考核市场的主流需求而不断完善自己跟团队研发的作品。
-
第二章(个人技术和流程)20-41
这一章主要是介绍 PSP(Personal Software Process),也就是指个人软件开发的流程,主要由单元测试和效能分析工具组成。
单元测试可以准确、快速地保证程序程序基本模块的正确性,创建单元测试函数的主要步骤是:设置数据、使用被测试类型的功能、比较实际结果和预期的结果。在2.1.2节中谈到了怎样才算一个好的单元测试,经总结后应该是:单元测试应该在最低的功能/参数上验证程序的正确性;单元测试必须由最熟悉代码的人(程序的作者)来写;单元测试过后,机器状态保持不变;单元测试要快(一个测试的运行时间是几秒钟,而不是几分钟);单元测试应该产生可重复、一致的结果;单元测试的运行/通过/失败不依赖于别的测试,可以人为构造数据以保持单元测试的独立性;单元测试应该覆盖所有代码路径;单元测试应该集成到自动测试的框架中;单元测试必须和产品代码一起保存和维护。
效能分析主要有抽样和代码注入这两种分析方法。抽样方法不需要改动程序,运行较快,可以很快找到瓶颈,但是不能得出精确的数据,也不能准确表示代码中的调用关系树。而代码注入可以使程序的各个数据都可以被精确地测量,但运行的时间会大大加长,还会产生很大的数据文件,同时也增加了数据分析的时间,这会影响程序的运行情况。如果我们不经分析就盲目优化分析,也许会事倍功半,所以我们要根据实际情况来选择适合自己程序的分析方法。
在2.3节中,对比了大学四年级的学生和工作三年的软件工程师的个人项目耗时,表中可以明显的发现在需求分析和测试这两组数据上,工程师会比大四的学生用时多,而在具体编码上大四学生是比工程师花费的时间多。那这样是不是就一定说明大四的学生不软件工程师弱?我觉得不然,软件工程师是比大四学生多读了3年书,多工作了3年,两类人所处的环境跟所经历的东西不同,所以两个人任务完成的质量要求也就不一样,我觉得,按照目前来说,大四学生在对软件工程运用的熟悉程度上或许还及工程师,但只要经过刻苦的锻炼,丑小鸭也会变成漂亮的天鹅的!
-
第三章(软件工程师的成长)40-54
这一章主要讲述了软件工程师中,高级工程师为何会比刚入职的工程师优秀。
初级软件工程师要让自己成长并强大起来,就需要做到:积累软件开发的相关知识,提升技术能力(如对具体技术的掌握,动手能力);积累问题领域的知识和经验;对通用的软件设计思想和软件工程思想的理解深入;提升职业技能(区别与技术技能);有实际成果。高级软件工程师,对于我们现在的水平来说,是不是就触不可及了呢?其实不然,我们现在还年轻,还有很多时间去学习、去实践,在通往高级软件工程师的路途上,我们可以考相关的证书来获取理论上的技能,然后去各相关的单位上实习来获取经验,最后通过自主研究或团队开发来进行实践,进而开发大脑和提升自己的动手能力。
同时,我们要时刻对自己进行自我评估。绝大部分的软件工程师都不是技术天才,很多都是后天形成的,我们要多对自己的能力进行评估并作出及时的改进,然后通过不断的学习,把那些低层次的问题都解决了,变成不用经大脑的自动操作,然后才有时间和脑力来解决较高层次的问题。
-
第四章(两人合作)56-82
这一章主要讲述了两人合作的不同阶段和影响他人的技巧。
软件都是在相互合作中完成的,翅膀只剩一边是飞翔不起来的,尽管很努力的飞到半空,也不够双翅滑翔的轻松自如,所以合作真的很重要。在合作中,只有互相交流、交换思想,才会发现自己的优势和不足之处在哪里。有了同伴的监督,可以让自己不敢偷懒,让自己更认真的去查看和更正程序的不足,有了一个方向和目标,让大家更有追求。
在4.4节中,强调了代码复审的重要性。那我们应该以怎样的情况和环境下进行复审呢?代码复审有自我复审、同伴复审和团队复审,在软件工程中最基本的复审手段就是同伴复审。复审者是要通过发现问题来确保软件质量的,我们做代码复审的目的是为了减少错误的发生,而不是找一个人来对着自己点头,所以,找到一个适合自己的同伴来一起工作是很重要的,让两个人在驾驶员和领航员的角色中互换,进而提高双方的能力水平。
-
第五章(团队和流程)83-99
这一章主要介绍的是团队精神
那是不是说只要能组合在一起的就是组成了一个团队了呢?其实不是的,软件团队有各种形式,适用于不同的人员和需求。适合自己的团队才能共赢!