本文是北京航空航天大学计算机学院软件工程课程的我的博客做业。本次做业的主要目标在于,经过通读教材《构建之法》,造成对软件工程这门学问的初步理解,对于不理解的地方,提出困惑之处,在以后这门课程的学习中,经过实践反复印证与体会书中方法,找到问题的答案。html
项目 | 内容 |
---|---|
这个做业属于哪一个课程 | 博客园班级连接 |
这个做业的要求在哪里 | 我的博客做业 |
我在这个课程的目标是 | 得到成为一名软件工程师的能力 |
这个做业在哪一个具体方面帮助我实现目标 | 造成对软件工程的初步理解 |
书中第二章介绍了单元测试的方法,我在面向对象课程中也使用过java的单元测试,不过仅仅流于形式,象征性完成课程的目标。在作编译课设的时候,也想过没写完一个模块都要作单元测试。可是我发现了一个难点,有时只有最开头的输入数据好构造(甚至能够构造),那么如何对中间一个单元作单元测试?java
好比在测试编译器的第一个模块词法分析的时候,构造数据输入就特别容易,由于是第一个模块,直接输入字符串就能够了。可是从第二个模块语法分析开始就麻烦了,它的输入时词法分析的输出,这个输出是我定义的一个Class的实例,只有在跑完词法分析以后才能获得。若是我要对语法分析作单元测试,单元测试代码里就必须先跑词法分析获得输入,这跟直接测试整个程序就同样了,还叫单元测试吗?git
除了输入之外,输出也是问题,有些时候,程序的运行结果人脑很难算出来甚至算不出来,我写程序的目的其实就是想把他算出来,那么我怎么能获得正确的输出来测试个人程序呢?好比写编译器时,中间的某些结果靠人脑就要花很长时间的推演。咱们一般是靠和其它同窗对拍来作测试,可是实际生产中,可能这一个模块只有一我的写,就无法对拍,这种状况下如何方便地获得测试标准结果呢?github
还有一个问题就是单元测试要拆分到什么程度?代码短的单元没有测的必要,代码长的单元定位又不精准。我是以函数/方法为单元来测,仍是以一个功能块为单元测,尺度如何把握?web
书中在讲代码管理的时候,提到要尽量多的提交当前的修改,哪怕是只改了一个小bug,也要及时提交。我在使用git管理代码的时候,常常遇到这样的状况,在写git commit -m ""的message信息时,总不知道应该写什么,愣了半天写了一句“fix some bugs“或者之类的话。可是这种作法在须要版本回退的时候是很是痛苦的,真的不知道当时修了什么bug,若是去挨个diff分析本身改了什么又很低效。数据库
因此这个message相当重要,可是对我而言有时写message又真的很难用语言表达我所作的修改,有没有什么技巧可以简洁清楚地描述修改了什么、目的是什么从而让版本回退时一目了然?xcode
这个问题是我以前写代码时遇到的,在读书中代码管理时提炼了出来。描述以下:安全
好比要开发两个连续流程A、B、C、D,顺序开发完ABCD,并commit。在开发完D并commit后,发现A中有bug,此时应该怎么作?是直接在D中改了,无论以前的A的正确性了?仍是回退到A,改bug,commit到新的A‘,以后merge A’ 和D保证D的正确性?服务器
分析一下,这二者都不太合理,首先第一种,若是我以后想版本回退,ABC版本都包含这个bug,那时候可能已经忘了这个bug了。第二种只能保证回退到A'是正确的,BC都无法正确回退。那么若是把BC也都改了呢?一个问题的是提交的message怎么写,"B1:B fixed bug xxx"? 假如以后再发现别的bug呢?用B一、B2这么编号好吗?另外一个更难搞的是假如AD之间不仅有BC,而是有几十个commit咋办?git的管理机制彷佛没提供在以前某个提交的版本上修改,后面的提交自动改的方法(或者我不知道hh,git太难了)。事实上按照git的机制咱们根本不能修改某次提交,最可能是像从A分出一个改过bug的A‘。最终这个commit树就变成这样了,非常蛋疼。网络
但愿经过以后对git的进一步理解,可以更优雅地解决这个问题。
当Apull下来解决merge冲突,并测试无误以后,想要push,发现又有人push过了,这就还得再pull下来,解决冲突,并测试。这个无疑很浪费时间,可是彷佛也没办法,书中提到了用一些宽和严的制度来规定这个处理方法。我以前没经历过多人合做开发,实际遇到这个问题时咱们应该怎么办呢?
在11.6的讨论中,若是有队员的基础差怎么办,好比你们要用C#开发,但我不会C#,得现学现用,致使开发效率低,且容易出bug。软工课上要怎么解决这个问题呢?让基础差的同窗作PM或者测试吗?他们不肯意怎么办?
在阅读第16章创新的时候,书中有这样一个论断,当一个产品要发布的时候,一般都留有一些已知的bug而不去改。一方面缘由是产品要即便发布才能有盈利,另外一个缘由是为下一阶段的产品迭代留有余地,团队会更有干劲。
这里涉及到一个把握平衡的问题,若是你尚未解决一些问题就发布,这个产品可能没法获得用户承认;可是若是一味追求解决全部技术问题,永无止境地作技术创新和技术改进,而不去经营营销,这样又无法盈利。因此如今有很多由技术出身的人办的初创公司面临着这个平衡的问题。有些公司一味地追求改进技术,忽略了经营营销的重要性,这样也是不可取的。那么如何找到这个平衡点呢?但愿软件工程课能给我一些体会。
读完了整本书,涵盖的内容十分繁杂,设计的领域也很是多,包括计算机,软件,经济,管理,方法论等等。也针对不少特定的问题给出了软件工程的解决方案。那么,有没有软件工程无法解决的问题呢?有没有人类使用了软件工程方法也无法实现出的软件?软件行业目前面临的痛点在哪?软件工程应该针对这些痛点提出什么新的方法呢?...
这些问题可能用一生的软件开发经历都不能彻底回答,可是我但愿经过软件工程这门课,加之从此软件开发的经历,可以认真思考这个问题,争取为软件工程的发展进步提出本身的看法。
术语"软件"(Software)的最先发表记录是在1958年John Wilder Tukey发表的论文"The Teaching of Concrete Mathematics"中。然而没有证据能证实是Tukey发明了"Software"这个词,其最先发明时间可能更早,在1953年Richard R. Carhart曾在engineering context中使用过这个词,是目前最先的"Software"术语的使用记录。
Tukey(1915-2000)是美国的数学家,其最知名的成就是发明了快速傅里叶变换(FFT)和箱型图(box plot)。1947年,在贝尔实验室工做的Tukey发明了术语"bit",并且还有诸多术语都是以Tukey命名的,如Tukey's range test, Tukey lambda distribution, Tukey's test of additivity, Tukey's lemma, 和 Tukey window
术语"软件工程"(Software Engineering)被认为是在1968-1969年与NATO组织的会议上提出的。在60年代,因为大的复杂的系统开发困难,人类面临"软件危机"(Software Crisis)。所以人们提出引入工程化方法指导软件开发,从而下降软件开发的成本,提高开发效率。
在NATO会议正式提出"软件工程''术语以前,就曾有屡次提出此术语的尝试,早在50年代 Douglas T. Ross 在MIT的讲座中就曾提到软件工程这个词,以后 Margaret H. Hamilton正式命名了这个术语。
Hamilton是著名的美国女性计算机科学家,系统工程师和企业家。她最重要的贡献就是曾担任MIT仪器实验室软件工程部主管,帮助开发阿波罗计划中航天器搭载的飞行软件。其编写的程序都以最大程度防止崩溃为目的,从而防止了阿波罗11号登月计划中缀。
微软2001年推出WindowsXP系统时,好不容易想好了广告语“prepare to fly”,911事件发生了。没办法,微软只好把“带你飞”,临时换成“你能行”。这一换,前期砸进去的两亿美圆宣传费,就正式打水漂了。
控告之路,1994年苹果公司把微软告上法庭,理由是侵权。对此比尔盖茨是这么说的“咱们有一个富邻居——施乐,他家有一台电视。当咱们想偷的时候,发现早就被乔布斯偷走了,可他却说咱们是小偷。”什么意思呢?EyeOpener简单“翻译”下,就是“你也是偷别人(施乐)的,好意思出来告我?”。在微软被告时,施乐以类似的理由把苹果也告了,固然最后的结果是:原告们都输了官司。
Bitbucket是Atlassian公司提供的一个基于web的版本库托管服务,支持Mercurial和Git版本控制系统。Bitbucket既提供免费账号,也提供商业付费方案。Bitbucket提供的服务相似于GitHub(仅支持Git)。BitBucket的目标用户是开发专有软件的专业开发者,在2010年它被Atlassian收购后此定位更加明确。
优势:支持Hg同时支持Git。
缺点:GitHub私有仓库再也不收费后市场减小。
是一款用于软件缺陷的追踪管理网络程序,由Mozilla计划开发和应用。1998年,网景公司开放其源代码后,以Mozilla公共许可证协议许可。有许多组织采用其做为旗下软件(特别是自由软件)的产品缺陷追踪系统。
优势:是bug管理工具,比较出名的开源软件。
缺点:只能管理缺陷,界面效果差。
请按照最近一两年使用人数的多少, 从多到少排序并说明各自有多少用户
Name | User |
---|---|
GitHub | 31,000,000 |
Bitbucket | 5,000,000 |
Launchpad | 3,965,288 |
SourceForge | 3,700,000 |
GitLab | 100,000 |
GNU Savannah | 93,346 |
OSDN | 54,826 |
Ourproject.org | 6,353 |
目前用户量最大的源代码管理工具,我使用的比较多,上图是从github上clone了一个仓库,而后再本地切换分支,修改并提交。
Mercurial 也是一款经常使用的代码管理软件,利用conda或pip就能够安装,方便易用。
如图所示,clone了一个远端的仓库到本地,修改,并经过add和commit的操做进行提交。
能够看出Mercurial的用法和git很像,可是因为使用范围没有git广,因此我并无深刻研究它。