一些看过的计算机科学专业课外书的读后感

人月神话这本书的作者具有丰富的软件开发经验和软件项目管理经验,是对他自己一线软件开发经验的总结。

这本书会对软件从业人员给予开发流程思维上的启发和引导,例如,软件项目经理、软件项目技术主管、程序员等有很大的帮助,避免走入人员神话的陷阱—增加人员并不能简单地加快项目的开发速度。因为它会增加项目的中断时间、新人的培训时间、及沟通交流的时间。

一、缺乏进度安排是造成项目滞后最主要的原因,容易出现问题的点:
1.错误的估计了项目进度。没有预估可能的风险,假设一切顺利的情况下,过于乐观的估计了项目进度。 
2.错误地假设人和月可以互换,将进度和工作量互相混淆。 作者认为“用人月作为衡量一项工作的规模是一个危险和带有欺骗性的神话”。
3.项目经理通常不会有耐心持续地估计工作。
4.对进度缺乏跟踪和监督。
5.当意识到进度偏移时,下意识(以及传统)的反应是增加人力。这就像火上浇油一样,让事情会变得糟糕。

书中还提到了作者对新出现的OO编程方面及OO编程语言的分析:

面向对象在整个开发周期中都得到了应用,但真正的收益只有在后续的开发、扩展和维护活动中才能体现出来。

很多人学习面向对象仅仅认为它比较时髦,比较新就开始学,而没有深入地思考它背后的优缺点和应用领域。 软件工程属于工程学的范畴,却比任何其他工程都复杂。比如,汽车工程,一辆设计好的汽车卖出去后,后期的维护的工作量是很少的,功能的增加是违反交通法的;而软件工程不同,后期的维护占了很大一部分工作量。更进一步,软件的通用不强,不同的领域有不同的需求,甚至同一领域产生的需求也不同,这就造成了软件开发方面的复杂性,而面向对象开发通过减少项目中各个对象的耦合可以为后续开发与维护提供很多便利。

java编程思想:

第 1 章 对象入门

第 2 章 一切都是对象

...

...

1.static变量是在编译期初始化的
2.final变量不一定是在编译期初始化。如果在编译期初始化,那该变量必须是基本数据类型;如果是对象类型,在其初始化之后,不可再给句柄引用新的对象,但可以对原引用对象的对象本身进行改变
3.当new一个子类对象时的顺序:
(1) 在采取其他任何操作之前,为对象分配的存储空间初始化成二进制零。(成员变量也会分配初始值,根绝数据类型不同,如int就是0)
(2)调用父类构建方法。(这一步是先给成员变量按顺序初始化,然后再执行构造方法内其余代码)
(3)调用子类构建方法。(执行内容同上)
4.匿名内部类调用外部变量时,外部变量必须是final修饰的,原因有:为了保持内部外部变量的一致性,为了在外部变量被gc处理之后,内部类仍然可以用相同值的变量。内部类中会默认拷贝一份外部变量
5.java中只有传值调用,没有传址调用,对于方法中参数值改变的情况:
(1)对于基本类型参数和String、Integer、Double等,在方法体内对参数进行重新赋值,并不会改变原有变量的值
(2)对于引用类型参数,在方法体内对参数进行重新赋予引用,并不会改变原有变量所持有的引用。
(3)方法体内对参数进行运算,不影响原有变量的值
(4)方法体内对参数所指向对象的属性进行操作,将改变原有变量所指向对象的属性值
6.将字符串按照\分割:String s = "23\\56\\78";
String sp = "\\\\";
String[] ss = s.split(sp);
7.内部类部分没全明白,第二遍重点学习
8.获取数组的下一个元素,判断是否已经遍历了一次循环:(书中7.6.9章节)
next = (next+1)%length;
9.类的继承中,如果有类重写了父类的finalize()方法,则在该类的finalize()方法中,需要在自己的操作之后调用父类的finalize()方法,不然在对象回收时并不调用其父类的finalize()。子类与父类的回收顺序与初始化顺序相反,先回收子类再回收父类。
10.移位运算符:a<<b表示符号a的二进制数向左移动b位,低位补0,等同于a*(2的b次方)。“有符号”右移位运算符(>>)则将运算符左边的运算对象向右移动运算符右侧指定的位数。“有符号”右移位运算符使用了“符号扩展”:若值为正,则在高位插入0;若值为负,则在高位插入1。Java 也添加了一种“无符号”右移位运算符(>>>),它使用了“零扩展”:无论正负,都在高位插入0
11.hashtable存放键值对,是Dictionary的子类,在get方法中,先获取参数的 hashCode,然后用hashCode值去查找key集合中对应的对象,然后在根据key所在的索引,查找value集合内对应的对象,完成get
12.ListIterator类:
(1)
ListIterator指向的位置1在调用next()方法之后,移动到了2
(2)add(Object o)方法,是在当前位置之前插入元素(左边)
(3)remove()方法,是移除当前位置之后的元素(右边),但是,必须在next()或者previous()之后调用,且期间不可调用add(Object o)方法(因为调用后目标元素指向不明)
(4)set(Object o)方法,改变最近一次的next()方法或者previous()方法的返回元素为o
(5)new ListIterator(int index),调用该构造器,会把ListIterator的位置放到对应索引元素之前(左边)
13.Set接口:
(1)添加到Set中的元素,用equals方法进行比较,不允许重复
(2)HashSet用于除非常小以外的所有Set。对象也必须定义hashCode()
(3)ArraySet面向非常小的Set设计,特别是需要频繁创建和删除的,不需要定义hashCode()
(4)ArraySet和HashSet采用不同的方法来保存元素,以便他们以后的定位,ArraySet 保持着它们的顺序状态,而HashSet使用一个散列函数(这是特
别为快速检索设计的)
14.Map接口
(1)key的集合不允许重复
15.数组排序与搜索:在执行一次binarySearch()之前如果不调用sort()便会发生不可预测的行为,其中甚至包括无限循环





猜你喜欢

转载自blog.csdn.net/hyo555/article/details/80170965