集大软件工程15级个人作业Week2
快速通读教材《构建之法》,并参照提问模板,提出5个问题。
- 在每个问题后面,请说明哪一章节的什么内容引起了你的提问,提供一些上下文
- 列出一些事例或资料,支持你的提问。
- 说说你提问题的原因,你说因为自己的假设和书中的不同而提问,还是不懂书中的术语,还是对推理过程有疑问,还是书中的描述和你的经验(直接经验或间接经验)矛盾?
【附加题】:请将问题提交至豆瓣:https://book.douban.com/subject/27069503/, 并在博客中给出链接
在豆瓣页面的最下方 “读书笔记” 那里发言, 《构建之法》的作者会亲自答复问题
Q1 : 个人技术和流程
来自第2章 p36
PSP有以下的特点:
- ...
- PSP依赖于工程输入数据,记录工程师的各项活动,这本身就需要不小的时间代价
- 如果数据不准确或者有遗失,怎么办?让工程师编造一些?
- 如果一些数据不利于工程师本人(例如:花很多时间修改缺陷),我们怎么才能保证工程师愿意如实地记录这些数据呢?
我的问题是,PSP是否不适合学生?
正如书中所言,PSP这一模型在实施的时候似乎有一些困难的地方,尤其是对于学生来说,例如:
- 数据如何才能较为精确的获取到
- 各个阶段之间的分界点不明确
- 学生的时间比较分散,所以很可能会出现学生利用了好几块分散的时间才做完了一个阶段的事情,那么这样子又该如何统计呢?显然这之间不能简单地线性相加,例如,我要设计接下来一个项目的各模块接口。我花了三天没课的上午在onenote上写好了文档,但是实际上从我开始准备写文档那一刻起,我的脑中就开始构思各模块的接口之间的关系了,可能在某一节无聊的课堂上,也可能是在食堂里吃饭的时候...对于经常没有完整时间块的学生来说,PSP的数据很难获取到
- 文中所举例举例的工程师的问题当然同样也适用于学生身上
问题提出的原因是与我在日常学习生活中的经验矛盾
Q2 :两人合作
来自第4章 p87
如何结对编程
- 驾驶员:写设计文档,进行编码和单元测试等XP开发流程。
- 领航员:审阅驾驶员地文档;监督驾驶员对编码等开发流程的执行;考虑单元测试的覆盖率;思考是否需要和如何重构;帮助驾驶员解决具体的技术问题。领航员也可以设计TDD中的测试用例
- ......
我认为,结对编程可能在现今的大学环境下难以发挥效果。
首先看到书中关于结对编程的例子,一般都是公司内部的两个工程师,二者同为一家公司的工程师,那他们之间一般来说技术、关于技术的思想等等就不会差距太大,而这个技术差距恰恰是学生之间和工程师之间的不同之处。比如说用0到10的数字表示一个人对有关结对编程中使用技术的掌握程度,两个工程师是4和7,而学生之间甚至可能出现0和1的情况(没有其它人比学生更了解学生,作为计算机学院的学生,四年下来连要求的某些编程语言的基本语法都没有学会的也不是没有)。这样的情况下,根本没法结对,别说设计单元测试了,可能连表述出来的设计需求都听不懂。
问题出发点同样是与学习环境中的经验不符。
Q3 : 实战中的软件工程
来自第7章 141
保持敏捷,预期和适应变化......
以及 第3章 p53
“过早优化是一切罪恶的根源”......
当我看到敏捷的思想的时候,就回想起了在本书前面看到的过早扩大化/泛化等的问题。前者的要点是:要预料变化,适应变化,对变化做好准备;而后者的要点是:不要过早地泛化......我感觉这两种思想似乎有着冲突的地方,问题是该如何在二者在过早泛化和提前为变化做好准备之间找到平衡点呢?
举个更具体的例子,我要用C++写一个web/linux/windows/iOS/android上都可以使用的个人事项管理软件。我打算从windows客户端开始设计,在设计其中一些方法的时候,我是应该将函数全部泛型化,抽取出变化的部分全部设置成参数?还是先将这一平台的当前需求以合理的资源和算法结构等先设计实现出来呢?
Q4 :软件测试
来自第13章
章节中的各种测试技术的应用场景......
在阅读软件测试等章节的时候,我认为确实单元测试和软件测试等等都是十分有必要的,那么一个GUI软件该如何更好地测试呢,或者说GUI软件的自动化测试有没有必要呢?
这是我找到的部分观点:
在我看来,GUI测试由于其变化可能性大,测试(覆盖率/成本) 率高,所以难以进行大规模的自动化测试,就像某前辈所说的
keep the UI very, very thin—all it does is forward user gestures to some underlying code, and display the results. No logic. Definitely no database access.
UI就该做UI的事情,并且只做那件事
在测试问题上,该如何找到最佳的GUI测试方案呢
Q5 : 人,绩效和职业道德
来自第17章 p411
软件工程师的职业道德
其中有一个规范:
原则1 公众
软件工程师的行为应与公众利益一致
原则2 客户与雇主
软件工程师应以其客户和雇主利益最大化的方式做事,与公众利益保持一致
......
看到这种一条一条的的准则,就会产生疑问:
- 如何衡量是否与公众利益一致
- 若公众利益与雇主利益不一致,甚至互斥怎么办
举个例子
某大厂开发的一款即时通讯软件,在发布后由于其出色地整合了许多同类应用的优秀功能而大火。之后雇主(公司老板)要求工程师设计出一套付费vip的服务,对于使用该应用的用户来说,这当然不利于他们的利益,但是从雇主的角度来说,他可以凭借该应用的巨大用户基数怒赚一笔