阅读《构建之法》1-5章
由于第一章比较短,我也就很快地看完了第一章:第一章引入了一个概念“软件=程序+软件工程”,同时讲解了软件开发的不同阶段由“玩具阶段”到最后的“成熟的产业阶段”。同时在看书期间,我看到书中有一句话,感觉挺有意思的“我懂软件工程,我画很多图,写了很多文档,最后得了很高的分数......这些同学是真的懂软件工程,是一个合格的软件工程师么?”听到这句话的时候,我觉得感悟很深,因为在以前我也在脑海中无数次想到这样类似的一个问题,我们在学校里面写的程序作业,每次都能拿到很高的分数,而且都能按时按量的完成,但是就以学校里面所学习的内容,所练习的内容,这对于我们出工作后所做的有联系吗?难道进入企业后也叫我们去写一个四则运算吗?学校学的跟以后工作上的区别在哪里?那我们现阶段到底应该如何正确地评价自己,这样才能让自己能更快的适应社会工作上的种种需求,毕竟,我现在听到很多已经毕业的师兄师姐们,他们都出去工作后,会发现学校学的跟工作需要的完全不一样,而下全部都需要从头开始。希望老师能帮我解决这样一个疑点。谢谢老师。
下面是我在看书过程中记录下的一些简要笔记:
1、光有各种流程的思想是不够的,我们还要有一系列的工具来保证这些思想能够在实践中有效率地运作。
2、软件的特殊性:复杂性,不可见性,易变性,服从性,非连续性。
接下来是第二章的学习,第二章的标题是个人技术和流程,看完标题,就一个陌生的概念出现在我的眼前“单元测试”。全章几乎都在讲单元测试,我也看的一头雾水。虽然不是看得很明白是什么概念,但也记录下了一些。我想问老师的问题就是,因为我的影响中,在过去都没接触过单元测试的概念,我想知道而其实书上说的单元测试的方法,也不是很懂,就我而言,一般我完成了程序,我都是用不断地进行调试,带入很多特定的或者随机的数据进去代码程序中,进行调试查看结果,然后在代码中做好注释,并记录下来,然后再逐个进行完善。我不清楚我这样子的调试跟单元测试有区别吗?看书上说的单元测试,感觉很高效,但是不明白是什么。
同时还有一个问题,我在书本上看到了一个“效能分析”的概念,就是把大家各自的程序放出来,大家跑跑看谁的“跑得快”,类似就这个意思。老师,请问是不是我们现在做的都是一些小程序,很难达到真真意义上的效能分析,也就是大家的程序只要没出错,运行起来的速度都差不多,然后,就对比的不明显?
下面是我在看书过程中记录下的一些简要笔记:
1、怎么样才算一个好的单元测试?单元测试应该准确,快速地保证程序基本模块的正确性
2、从面向对象的设计原理出发,系统中最基本的功能点也应该由一个类及其方法来表现,单元测试要测试API中的每一个方法及每个参数
3、单元测试应该集成到自动测试的框架中,单元测试必须和代码一起保存和维护
4、从学生到职业程序员,并不是更加没完没了地写程序——花在代码上的时间反而少了很多。
5、PSP的特点:P36
6、每当读完项目的要求后:首先估计完成整个项目需要多少时间
附加(摘抄原本):
小飞:我大胆地说一句。如果是一个人写写程序玩玩,单元测试似乎不那么重要。
阿超:你可以大胆地对你的女朋友说:“我们只是玩玩......”
这样的对话绝对是精辟中的精辟,这也难怪很多“程序猿”注定是孤独的。。。
第三章,软件工程师的成长,这样的标目着实很吸引人的眼球。当然看完本章也少不了记录下一些精华。在本章中提到了一点,衡量一个项目的大小:1.用代码的行数来说明这点;2.用所花时间的多少来说明。我认为这点很容易被人们误解,也就是真正意义上的代码行数应该是功能实现和容错性处理的行数吧,因为现在很多同学会误认为,行数写的很多很多了,就觉得这个程序很强大,很厉害。我认为这仅仅也只是停留在字面上而已,毕竟很多时候,copy是最简单实在的方法了,我们可以在实现前一个功能的基础上,继续完成接下来的功能,这样我们完全可以copy前面所用到的代码,这样就能减少手打代码的时间了,从而提高效率。而这样代码行数必定也会相应的增加。而从所花的时间角度来看,也只能够对于那种专业的工程师而已,毕竟对于我们大部分学生现在而言,在做程序的时候容易分心,就不能百分之百全身心投入程序中,从而这样在计算总时间的过程中就会无法避免的加上一些无效时间。不知老师对于这点怎么看?
另外书中也提到了一个方面(软件工程师的职业发展)21世纪以来,中国大陆每年招收李百万大学生,其中百分之十是在学习各种IT相关的专业。在这样的时代背景下,我们势必会在将来就业方面遭遇到许多沉重的压力,面对这样的一种压力,我们当下现在应该如何面对,怎么样处理?
书本上也说到现在很少人能在学校里掌握这么多知识后才毕业找工作,随后把技术运用到时间中,也提到了根据自己的情况,处理好“专和精”和“知道就好”两方面。那我们现在应该如何评估自己?
下面是我对本章做的一些简要笔记:
IC在团队中的流程:
通过交流,实验,快速原型等方法,理解问题需求或任务;
提出多种解决方法并估计工作量;
与相关决赛交流解决问题提出方案,决定一个可行的方案;
把想法变成实际中能工作的代码,同时验证法案的可行性呵呵其他特性;
和团队的其他角色合作,在厕所环境中测试实现方案,修复缺陷;
在解决方案发布出去之后,对结果负责。
初级软件工程师的形成:
1、积累软件开发的相关知识,提升技术技能;
2、积累问题领域的知识和经验;
3、对通用的软件设计思想和软件工程思想的理解;
4、提升职业技能:职业技能包括:自我管理能力表达和交流的能力,与人合作的能力;(重点)
5、实际成果。(基础很重要,必须扎实)
P52:低层次问题(自动操作)——精通;
中层次问题(花脑力解决)——学习中;
高层次问题(无暇顾及)——不宜号称“精通”。
附加:书本P54作者对于魔方技能的各个层次的评价,最后一句话绝对是“绝”!!(666666)
“如果还原了,要求他把魔方恢复成我当初给他的那个混乱的局面,一模一样。”
第四章讲得是合作,这一章也恰好符合我们现阶段的主题。首先介绍的是代码规范问题,显然代码规范很重要,作者在书本上已经很明确的举例子说明了这一点。看完这一章,我一直存在疑惑,到底我们现在的团队间,怎么样才算真正意义上的合作?到底该如何真正地准确地找到自己团队队友?是以能力呢?还是什么?我认为在我们先阶段,每个人的能力都差不多,不会说相差特别大特别明显,只有想学的同学,和不想学的同学,其实大家的能力方面都是一样的,那既然这样,选择团队的人应该怎么选?
如果是让我与一个比较精通专业知识这方面的同学合作,我很经常就变成了“酱油”,很多时候,整个项目完成下来,队友会认为一个人就完成两份工作,而我做的也在此成为可有可无的,老师你觉得这样的团队问题出在哪里?那我是不是不适合这样的团队?
那换个角度而言,如果我在这个团队中专业知识比较精通的,在很多时候,分配工作的时候,不知道该怎么分配?如果按功能模块来分工,可能会出现有的人完成不了?
如果是遇到比较固执的队友,执意要执行对方的方案,然后你说的一切方案都给予否定,那这样慢慢地在整个团队中话语权必将会降低,这样下去那又应该怎么办?(那该不会是要大干一架吧~)
就以上几个问题,我想请老师帮我分析一下,应该如何处理?
下面是我在看书过程中记录下的一些简要笔记:
1、代码复审这一阶段,代码复审是一般拿给最后经验熟悉这一部分代码的人,对于至关重要的代码,我们要请不止一个人来做代码复审;
2、复审者是通过问一些问题来保证软件的质量,而不是有意的找茬儿。
3、在代码复审后要做什么(人不能两次踏入同一条河流,程序员不能两次犯同样的错误。):更正明显的错误;对于无法很快更正的错误,要在项目管理软件中创建BUG把它们记录下来;把所以错误记在自己的一个“我常犯的错误”表中,作为以后自我复审的第一步。
4、结对编程模式:程序员间肩并肩,平等的,互补地进行开发工作;
5、主动参与。任何一个任务都首先是两个人的责任,也是所有人的责任,没有“我的代码”、“你的代码0或”或“他/她的代码”,只有“我们的代码”(我很喜欢这句话。)
第五章团队和流程
这一章也是继第四章讲的团队,进一步深入解析团队这样一个概念。团队的共同点:1、团队有一致的集体目标,团队要一起完成这项目;2、团队成员有各自的分工,互相依赖合作,共同完成任务。同时本章课本也相继介绍了一些团队模式。在看完这些模式后,我简单地得出了这样一个结论,在团队模式中,“功能团队模式”要求团队的技术含量很高,很难实现。而在团队开发模式中,“瀑布模式”这个模式工程量着实很大,需要不断的在整个流程上轮转。
那我的问题是:老师你觉得我们现阶段完成项目,应该采用哪种团队模式和团队开发模式比较实际,在分工上面需要如何分配?
而对于团队模式和团队的开发模式而言,我认为团队模式应该是管理一个团队所需要用到的模式吧,团队的开发模式,应该是基于团队模式为前提下,进一步实现对项目开发的模式吧。