[2017BUAA软工]个人阅读作业+总结
阅读作业
没有银弹 No Silver Bullet - Essence and Accidents of Software Engineering - Brooks
在这篇论文中,作者阐述了软件的四个本质:Complexity,Conformity,Changeablity, Invisibility
在解释复杂性时,作者首先把软件和其他的人类建造物做对比:
Software entities are more complex for their size than perhaps any other human construct, because no two parts are alike (at least above the statement level). If they are, we make the two similar parts into one, a subroutine, open or closed. In this respect software systems differ profoundly from computers, buildings, or automobiles, where repeated elements abound.
在软件开发中,如果我们遇到两个相同的部分,我们一般的做法是把他们写成一个函数,以便于重用,因此软件的每个组成部分可以说是互不相同的,不可替代的。而在人类的其他建造物,例如楼房,则是由重复的砖块,或者是钢筋混凝土搭建而成,因此软件的复杂性远超于普通的事物。
而作者又把软件的复杂性与基础科学例如数学物理的复杂性做对比,我觉得这里的对比真的让人豁然开朗,它突出了软件的复杂性的本质性
Mathematics and the physical sciences made great strides for three centuries by constructing simplified models of complex phenomena, deriving properties from the models, and verifying those properties experimentally. This worked because the complexities ignored in the models were not the essential properties of the phenomena. It does not work when the complexities are the essence.
物理和数学学科之所以在建立了基本概念和模型后,可以快速发展的原因就是物理和数学的“本质”并不复杂,但是为什么软件工程没有这样的基础模型和概念呢?就是因为软件的复杂性就是软件的本质之一!
软件的可变性也是软件的本质之一,为什么软件一直在被改变呢?就是因为软件是一个embedded system,它和硬件有关,和写软件的人有关,和需求有关,一旦这些影响因素发生变化,例如硬件更新换代,需求变更,那么软件就需要随之更新,所以软件是在一直变化的。
软件也是“不可见”的,一个软件实体不能用一张图或者一个立体模型给表现出来,因为它的复杂性和易变性,如果尝试为一个软件建立一个可视化的模型,那么可能需要几个图模型,有的表示数据流向,有的表示依赖关系等等,但是这些都无法像现实世界的实体一样,通过一个立体模型直观的表现出来。
在之后作者提出的一些建议中,我觉得这个建议很关键:
Incremental development−grow, not build, software.
我们要做的不是建造软件,而是不断的更新软件,关于这一点,神策数据的CEO桑文锋老师就在α阶段的总结会上提到过类似的,就是不要想着一开始就造一个大工程,好的软件是靠不断的更新换代产生的,可惜的是,我们在这个学期的软件开发过程中并没有很好的贯彻这个原则,不过我是非常赞同这个观点的。虽然在我们的团队开发中没有实现不断迭代版本,但是我自己在写一些个人项目,例如我们的编译大作业,再比如之前的计组等的过程中可以感受到 迭代的重要性。我们无法在一开始写出一个软件就保证它是最好的,只有在不断的根据用户反馈或者自己的重构中不断的提高软件的质量。
Big Ball of Mud
“大泥球代码”,这个比喻非常生动,它形容那些结构杂乱无章的代码。我觉得这样的代码的产生有两个情况,如果设计者只有一个,那么这个设计者在一开始肯定没有想好怎么组织代码,就糊里糊涂的开始写,如果代码的参与者有多个,那么这些参与者在一开始一定没有统一代码的编写规范,导致各写各的,合在一起就变成了四不像。
为了避免这种代码的产生,我觉得首先是要有一个清醒的头脑,在开始写之前先想好大致的架构,然后是要有不断改正更新的勇气,很多人因为重构比较麻烦就懒于重构修改,导致代码结构越来越混乱庞杂,最后只能推到重来,这是极其费时费力的行为,最后是要有一个统一的原则和规范,这个在多人合作时极为重要,在我们自己的团队开发中,就经常会因为一些原则规范不明确,导致一些时候开发工作效率低下,不过这种情况下只需要及时补充规范,严格执行规范,及时纠正即可。
Cathedral and the Bazaar
作者拿“教堂”和“集市”类比软件开发的两种模式,教堂模式就好像封闭的建设,会有精致的设计,充足的成本,长期的建设,而集市模式则更像是自然而然的形成,大家都来参与集市的建设,当然最后质量通常不如精心设计和建造的教堂。
我觉得软件开发如果可以吸收两个模式的优点会更好,首先吸收教堂模式的优点,就是必须要有一个软件设计主导者或者大家都要遵守的设计原则,防止这个软件不会跑偏,然后就是要结合集市模式的特点,大家都可以为软件开发做出自己的贡献,集百家之长。
我们的开发模式一开始是大教堂模式,就是由一个人制定设计,其他人执行设计,但是后来发现其他课程的课业太繁重了,如果还由一个人设计,可能导致开发进度过慢,所以之后就变成了集市模式。
所谓质量,只有在某人对它负责时才有意义,而这个“某人”只能是一个人,不能是几个人——二重奏除外
我认为这句话很有道理,在我们的团队开发中,一开始是由多个人讨论设计,但是很快就发现,每个人往往都只会关注和推崇自己的设计,对他人的设计往往采取排斥的态度,所以后来我们的设计只由一人负责,其他人仅仅审查并提出一些意见而已,这样做才能保证质量。
我们团队曾经遇到过这种情况,不过很快改正了
瀑布模型
我觉得我们团队开发的瀑布模型是这样的: 游戏内容设计(相当于需求分析) -> 内容设计转化为代码的设计 -> 实际代码编写 -> 测试运行并调整游戏平衡性
这个开发过程给人的感觉就好比单周期流水线的运作,效率很低(至少我是这么认为的),因为下一阶段的负责人必须要等待上一阶段结果的产生,最重要的是不能并行运作,例如如果游戏内容设计人员给了你一部分内容设计,在你把这部分转化为代码的设计后,发现如果把游戏设计人员给你的另一部分设计参与到已有的逻辑设计中的话,很多原来的结构都不适用了。虽然我们经常要求软件设计要有可扩展性,但是这个可扩展性的“扩展能力”我认为有时根本不能满足需求的改变,因为总有一些扩展的情况是你想不到的。
如果软件开发的过程能够达到像CPU流水线那样精巧的并行设计该多好,至少在我们的团队开发中,我们没有实现并行。
个人总结
这个学期的软工学习了很多,一开始的个人项目和结对编程,让我学习了C++和QT的基本使用,这也为之后的编译打下了坚实的C++语言基础,之后的团队项目,虽然坑很多,但是让我第一次体验了团队开发,同时也体会到了一个好的PM,一个好的团队交流,一个确定的代码规范对于团队编程是多么重要。
不过这里也需要着重说明一下最大教训,就是框架的选择,不成熟的框架可能会造成很多不必要的麻烦,这里也不一一列举了,总之在选择框架时不仅仅需要要看它的可用性,还要注意它支不支持单元测试!
[2017BUAA软工]个人阅读作业+总结的更多相关文章
- 软工个人阅读作业2 —— 构建之法与CI/CD
项目 内容 这个作业属于哪个课程 2021春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人阅读作业#2 我在这个课程的目标是 阅读思考教材,调研软工工具 这个作业在哪个具体方面帮助我实 ...
- [2017BUAA软工]第零次作业
第一部分:结缘计算机 你为什么选择计算机专业?你认为你的条件如何?和这些博主比呢?(必答) 我当初选择计算机,是因为:1.北航的前辈对北航计算机专业评价非常高:2.我也喜欢通过编程来代替我完成 ...
- [2017BUAA软工助教]第0次作业小结
BUAA软工第0次作业小结 零.题目 作业链接: This is a hyperlink 一.评分规则 本次作业满分10分: 按时提交有分 一周内补交得0分 超过一周不交或抄袭倒扣全部分数 评分规则如 ...
- [2017BUAA软工助教]收集个人信息
如题 我们要收集三个东西 1.学号 2.Github地址 ① 3.博客园博客地址 ② 请各位同学自行创建,并按照如下的格式评论在这篇博客下 "14061195+https://github. ...
- 2020BUAA软工结伴项目作业
2020BUAA软工结伴项目作业 17373010 杜博玮 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 结伴项目作业 我在这个课程的目标是 学 ...
- 软工实践——结对作业2【wordCount进阶需求】
附录: 队友的博客链接 本次作业的博客链接 同名仓库项目地址 一.具体分工 我负责撰写爬虫爬取信息以及代码整合测试,队友子恒负责写词组词频统计功能的代码. 二.PSP表格 PSP2.1 Persona ...
- 2020BUAA软工个人项目作业
2020BUAA软工个人项目作业 17373010 杜博玮 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人项目作业 我在这个课程的目标是 学 ...
- [2017BUAA软工助教]第0次个人作业
学习别人的经验和体会 零.前言 我认为人生就是一次次地从<存在>到<光明>. 一.软件工程师的成长 0.这是一个博客索引 同学们在上这门课的时候基本都是大三,觉得在大学里,到教 ...
- [2017BUAA软工]第3次个人作业
软工第3次个人作业--案例分析 一. 调研,评测 1.软件的bug(至少两个,不少于40字) 测试软件: 必应词典移动端 测试平台:iPhone 6 bug1 对于翻译功能中的图片翻译功能,必应词典是 ...
随机推荐
- BZOJ4245:[ONTAK2015]OR-XOR(贪心)
Description 给定一个长度为n的序列a[1],a[2],...,a[n],请将它划分为m段连续的区间,设第i段的费用c[i]为该段内所有数字的异或和,则总费用为c[1] or c[2] or ...
- 页面中php传值后循环列表js获取点击的id
页面中php传值后循环列表js获取点击的id值进行js操作 <script type="text/javascript" src="__PUBLIC__/js/jq ...
- 哪些地方会出现css阻塞,哪些地方会出现js阻塞?
Js的阻塞特性: 所有浏览器在下载JS的时候,会阻止一切其他活动,比如其他资源的下载,内容的呈现等等.直到JS下载.解析.执行完毕后才开始继续并行下载其他资源并呈现内容.为了提高用户体验,新一代浏览器 ...
- 测试udp服务的端口是否可用
测试tcp服务的端口是否可用,可以使用: telnet ip port 但是如果这个用在upd服务上,就会报错, 因为telnet走的是tcp协议, 比如说192.168.80.131在8888端 ...
- day68
昨日回顾:1 虚拟环境 -1 pycharm里创建 -2 用命令串讲2 视图层: 1 Request对象---GET,POST,method,body,FILES,META,path(只是路径),ge ...
- jqgrid 基础应用
jqgrid 是一个在jquery基础上做的一个表格插件,以ajax的方式和服务器端通信. 一个jqgrid的基础示例(基础参数说明)如下: $("#jqGrid").jqGrid ...
- VMware 克隆多台Linux机器并配置IP
1.查看并分配虚拟网络 我们首先要知道 VMware 三种网络模式的区别. ①.Bridged(桥接模式):就是将主机网卡与虚拟机虚拟的网卡利用虚拟网桥进行通信.在桥接的作用下,类似于把物理主机虚拟为 ...
- 笔记:载入viewcontroller的几种方式
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; ...
- Java转python第一天
1.python xx.py 2.字符串可以与数字相乘 str = "abc" msg = str*3 print(msg) # 结果:abcabcabc 3.换行用三个单引号 ' ...
- QQ 的一些URI 协议命令
//System.Diagnostics.Process.Start(@"C:\Program Files\Tencent\TIM\Bin\Timwp.exe", "te ...