个人博客作业
项目 | 内容 |
---|---|
这个作业属于哪个课程 | 2020春季计算机学院软件工程 |
这个作业的要求在哪里 | 第一次博客作业 |
我在这个课程的目标是 | 通过做中学了解软件工程 |
这个作业在哪个具体方面帮助我实现目标 | 阅读教材对软件工程有个大概的认识 |
一、快速看完整部教材,列出你仍然不懂的5到10个问题
1.在3.4技能的反面这一节里面提到了怎么提高技能的解答方式是不断练习
你发现他把时间都花在"解决(低层次)问题"上了,你想考察的"算法技能"、 "C# 程序设 计技能"都无暇顾及 注意,这是在他认为非常精通的编程T.具和编程语言中出现这样的问题你要这样的员工么? 那怎么提高技能呢?答案很简单 ,通过不断的练习,把那些低层次的问题都解决了,变成不用 经过大脑的自动操作,然后才有时间和脑力来解决较高层次的问题
我们补充一个问题:什么样的练习才是有效率的呢?
畅销书《刻意练习》的作者艾利克斯在他作品里提出的一个观点是:
那些处于中上水平的人们,拥有一种较强的记忆能力:长时记忆。长时记忆正是区分卓越者与一般人的一个重要能力,它才是刻意练习的指向与本质。
按照我的解释来说,这样的长时记忆不是通过简单重复来得到的短时记忆,是在洞悉本质之后,能够把练习的问题和自身用于理解问题的模块一一对应,也就是我们常说的“加入了知识体系”。就比如刚学习编程的时候,编译器和书本提醒你这儿少个分号,那里引用函数的参数格式不正确。而我们如果没理解到编程语言为什么需要这分号,为什么参数形式是这样,即使通过重复试错适应了规范,其实是没有抓到本质的。这种记忆也不一定牢固,可能别的专业的同学学完大学计算机基础,大二就不写代码了,过了几年有个课题迫使他又阴差阳错下回编译器开始写程序,就又回归到好似刚学编程,编译器报错一个个纠正格式错误那段时间。
而当我们通过了汇编和编译原理的学习之后,对高级语言一步步转化为底层语言或是机器语言这个过程有一定的了解了,我们就能体会到一个简单的句末分号,和参数类型的强制声明对应,给编译工作的语义处理带来了多大的方便。如果我们是编程语言的设计者,为了在适合复杂的功能和对人友好之间达到平衡,一个格式规范是必不可少的!区别只是格式越硬性处理越方便,格式越自由处理难度就越高,格式像自然语言那样自由那真是不得了了。了解到这些的我们如果退居写代码第一线几年,又或者开始学习一种新的语言,自然都能快速适应和熟悉语法特点,避开格式的错误迅速把学习的重心放在更高级的问题上。这种了解到问题本质的练习就是有效率的。
因此我认为想要通过练习快速培养一个技能,有目的的去了解这些技能为什么被要求,深层次的需要是什么,对我们理解本质提高效率有着显著的帮助。具体到软件工程这门课程上,为什么要结对编程的方式,为什么要做单元测试,这些都可以在练习之前了解一下必要性,方便练习的过程中抓到重点,有意识的去练习掌握。
2.在4.2里对代码风格规范做出了要求:
代码风格的原则是:简明,易读,无二义性 提示:这里谈的风格是一家之言,如 遇争执,关键是妥本着"保持简明,让代码更容易读" 的原则,看看争执中的代码规范能否让程序员们更好地理解和维护程序
那么怎么写出简明、易读、无二义性的代码?
这里直接贴出几个Google官方代码规范的链接(需要梯子):
3.在4.5.2给出了结对编程的好处:
结对编程有如下的好处:
1.在开发层次,站对编程能提供更奸的设计质量和代码质量.两人合作解决问题的能力更 两人合作,还有相互激励的作用,工程师看到别人的思路和技能,得到实时的讲解,受到激励,从而努力提高自己的水平,提出更多创意。
2.对开发人员自身来说,结对工作能带来更多的信心,高质量的产出, 能带来更高的满足感。
3.在企业管理层次上,结对能更有效地交流 相互学习和 传递经验,分享知识.能更好 也应对人员流动 总之,如果运用得当,结对编程可以得更高投入产 出比 Return of lnvestment ) 。
对于第2点:结对工作能带来更多的信心,高质量的产出,能带来更高的满足感。我有着以下的疑问:
- 结对编程真的可以带来更多的信心吗?我怎么相信我的结对伙伴能够提高我的效率?相等地,我怎么让我的结对伙伴相信我?
- 和结对工作伙伴磨合的过程本身就需要时间,真的能提高我的产出,保证高质量吗?
- 我更愿意一个人承担编程任务,如果和一个经验丰富但是性格强势的人结对工作使我提高了效率,可是我并没学到东西还觉得不自在,我从哪得到满足感呢?
我认为结对编程应该和小型的团队合作区分开来,结对编程本身是一个通过两人面对面的一种极限编程应用的高强度工作,结对编程面对面的两人不断转换角色,少去了传统复审模式复审者对项目了解不深、复审流程时间造成效率浪费的情况,有的人适合和别人沟通分享交流,结对编程很显然能使他们得到1+1>2的效果。而有的人不愿意自己工作的状态和细节暴露在别人面前,对于沟通交流也存在芥蒂,那么显然在他们的身上结对编程很可能是一种不但难为情,而且分心降低工作效率的方式。
4.在8.3获取用户需求——用户调研里有这么一副秋千图,来表示在理解用户需求这个问题上,用户的表达,产品经理的理解,开发人员和测试人员的实现修改,存在一定的差异。如何减少这种差异?如何真正的了解用户需求进行需求分析?
在这里贴出一个博客链接:
5. 13.3.1 中提到
测试的时候尽量用 Debug 版本.便于发现 Bug 阿超:如果你的目的是尽快让问题显现,尽快找到问题,那我建议用 Debug 版本,"尽快 发现问题"在软件开发周期的早期特别重要 如果你的目的是尽可能测试用户所看 到的软件,则用 Release 版本,这在软件开发的后期特别是执行效能和压力测试时 很有价值
什么是debug版本,什么是release版本?
这里引用百度百科的release词条:
二、请问“软件”和“软件工程”这些词汇是如何出现的-何时、何地、何人?
- 1953年8月美国兰德公司的Richard R.Carhart 在公司的研究备忘录中首次提出软件的概念
- 阿波罗11号期间,Margaret Hamilton在MIT Draper 实验室开始使用“软件工程”这样的字眼来将之与硬件还有其他工程学类做出区别。
三、大家知道了软件和软件工程的起源,请问软件工程发展的过程中有什么你觉得有趣的冷知识和故事?
第一个bug被Grace Hopper命名。有一次,格蕾丝使用的MarkⅡ机出了故障。出错的继电器找到了,故障的原因也找到了:里面有一只死蛾子。蛾子被用镊子夹了出来,她们用胶条贴在记录This is the first actual bug found。”(这是发现的第一只虫子。)
四、上网调查一下目前流行的源程序版本管理软件和项目管理软件都有哪些, 各有什么优缺点?请按照最近一两年使用人数的多少, 从多到少排序并说明各自有多少用户(估计),工具的优缺点(可以引用相关资料并注明来源)。
- git
- git的优点:
- 分布式开发,对于公共服务器压力不会太大。
- 速度快、灵活、分支之间可以任意切换。都可以在本地操作不同步到远程。
- 冲突解决,多人开发很容易就会出现冲突,可以先pull远程到本地,然后在本地合并一下分支,解决好冲突,在push到远程即可。
- 离线工作,如果git服务器出现问题,也可以在本地进行切换分支的操作,等联网后再提交、合并等操作。
- git的缺点:
- git没有严格的权限控制,一般是通过系统设置文件的读写权限来做权限控制
- 工作目录只能是整个目录。
- 学习门槛较高
- git的优点:
- Microsoft TFS
- 优点
- 对敏捷、msf、cmmi提供支持
- 与VS无缝结合
- 能将需求、项目进度一览无余,对于小团队而言,比甘特图更有用。
- 缺点
- 能应用起来的团队、公司的数量极少,多数真正用起来,也就是源代码管理这部分,这也仅仅是占TFS极小部分功能。
- 优点
- Mercurial
- 优点
- 基于python,拓展性强
- 缺点
- 分支管理不灵活
- 优点
- GitHub
- 优点
- 基于Web,提供Git存储库服务,版本控制灵活
- 使用用户多,是很好的协作开发工具
- 缺点
- 具有git不好上手的特点
- 可能不是捕捉创意过程和记录创意点子的最佳工具。
- 优点
- Trac
- 优点
- 具有良好的扩充性,权限体制比较完备。
- 非常灵活,可以随心所欲的定制,可以和TortoiseSVN集成。
- 缺点
- 不支持多项目
- 不支持中文,需要安装插件
- 优点
- Bugzilla
- 优点
- 免费、有中文版支持
- 缺点
- 只能管理缺陷
- 优点
- Apple Xcode
- 优点
- 自动提供撤消、重做和保存功能,无需编写任何编码
- 可以自动创建分类图表
- 优点
部分资料参考:
Name | Users | Projects |
---|---|---|
GitHub | 31,000,000 | 100,000,000 |
Bitbucket | 5,000,000 | unknown |
Launchpad | 3,965,288 | 40,881 |
SourceForge | 3,700,000 | 500,000 |
GitLab | 100,000 | 546,000 |
GNU Savannah | 93,346 | 3,848 |
OSDN | 54,826 | 6,294 |
Ourproject.org | 6,353 | 1,846 |
版本控制工具使用:
用git和GitHub保存一个含readme的远程仓库: