[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 对于翻译功能中的图片翻译功能,必应词典是 ...
随机推荐
- Oracle rdbms Brush password
Restore database user history account password 1. 用户状态 select * from user_astatus_map; select * from ...
- jsp泛型支持
今天在使用idea做练习时,某个jsp页面报错如下: '<>'operator is not allowed for source level below 1.7 出错代码如下: Map& ...
- Android检查手机上是否安装了第三方软件的方法------本文以百度地图为例
package com.example.myapi.thirdbaidumap; import java.net.URISyntaxException; import java.util.ArrayL ...
- 'utf-8' codec can't decode byte 0xbc in position 1182: invalid start byte
2.如果是字符集出现错误,建议多选择几种字符集测试一下: 选择的经验是: 如果是爬取到的网页文件,可以查看网页文件的meta标签下的charset属性值.例如: <meta charset=&q ...
- # 2017-2018-2 20155231《网络对抗技术》实验九: Web安全基础实践
2017-2018-2 20155231<网络对抗技术>实验九: Web安全基础实践 实验要求: 本实践的目标理解常用网络攻击技术的基本原理.Webgoat实践下相关实验. 实验内容: ( ...
- 20155321 《网络攻防》 Exp4 恶意代码分析
20155321 <网络攻防> Exp4 恶意代码分析 计划任务监控 在C盘根目录下建立一个netstatlog.bat文件(先把后缀设为txt,保存好内容后记得把后缀改为bat),内容如 ...
- ucosii笔记(一)
.ucosii是按照优先级高低来切换任务执行顺序的抢占式实时系统. 2.在被高优先级的任务抢占时,这个任务会将寄存器的数据(xPSR.PC.LR.R0.R1.R2.R3.R12等的值)存放在该任务自己 ...
- vue 监听页面宽度变化 和 键盘事件
vue 监听页面窗口大小 export default { name: 'Full', components: { Header, Siderbar }, data () { return { scr ...
- [UOJ#276][清华集训2016]汽水[分数规划+点分治]
题意 给定一棵 \(n\) 个点的树,给定 \(k\) ,求 \(|\frac{\sum w(路径长度)}{t(路径边数)}-k|\)的最小值. \(n\leq 5\times 10^5,k\leq ...
- Django实现websocket完成实时通讯、聊天室、在线客服等
一 什么是Websocket WebSocket是一种在单个TCP连接上进行全双工通信的协议 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据.在WebS ...