项目 | 内容 |
---|---|
这个作业属于哪个课程 | 2020春季计算机学院软件工程(罗杰 任建) |
这个作业的要求在哪里 | 个人博客作业 |
我在这个课程的目标是 | 学习软件工程相关知识,培养自己独立和团队开发能力 |
这个作业在哪个具体方面帮助我实现目标 | 了解软件工程的相关历史和现状,学会提问 |
作业正文...... | 见下文 |
其他参考 | John Tukey - Engineering and Technology History Wiki Margaret H. Hamilton - Computer History Museum IT冷知识 |
1 提问
(1)关于goto的用法
在4.3节,讲代码设计规范的时候提到了 goto的用法,书中这样写道:
函数最好有单一的出口,为了达到这一目的,可以使用goto。只要有助于程序逻辑的清晰体现,什么方法都可以使用,包括goto。
然而,在大一的C语言课程中,任何一个老师在讲到循环的时候都会特别强调“尽量不要使用goto”,并且在Dijkstra的这篇文章中也提到了使用goto有着诸多害处,甚至想要提议在高级编程语言中废除goto。
由此我产生了疑问:是否应该使用goto语句呢?或者说什么时候使用goto是合适的呢?注意到书中提到了一个比较模糊的标准,即“只要有助于程序逻辑的清晰体现”,那么具体来讲什么样的goto才有助于体现程序的逻辑呢?(因为C语言课上老师们的观点一直都是“goto”会破坏程序的逻辑和可读性)
(2)关于类的使用
在4.3.4节,谈到如何处理C++中的类的时候,作者提到了“仅在必要时才使用类”。但是在面向对象的编程中,提倡的是“万物皆类”的思想,这就产生了矛盾。固然,面向对象编程并不是在所有条件下都适用,但是C++本身是一门面向对象的语言,采用面向对象编程的方法无可厚非。那么作者这样“一刀切”式的下结论是否太过绝对了呢?
(3)关于“创新者”和“先行者”的关系
在16.1.4节,作者探讨了创新者和先行者的关系。作者提出,“大部分成功的创新者都不是先行者”,并举了很多领域的多家公司的例子来佐证这个观点。但我并不完全认同这个观点。我认为,成功的创新者之所以能够成功,是因为他们在某一领域做出了大胆的创新,这个创新是其他公司没有并且符合用户的需求和偏好的,例如一个新的商业模式、一个令人耳目一新的用户界面等等。从这个角度讲,它们也可以说是这个领域的先行者。教材上的“先行者”似乎被界定为了仅仅指技术上的先行者,我认为这是不够全面的,毕竟技术并不是关乎一个创新成功与否的最重要因素。
(4)关于创新的时机
在16.2节,作者探讨了创新的时机,并提出了新技术基本都要经历的几个发展阶段,鼓励我们在观察到一门新技术出现或者正在被炒作的时候,能思考其正处于哪个发展阶段。但是我们知道,市场是有滞后性的,有可能大众正在追捧一门技术的时候,它却已经处于下降期了。那么如何才能真正地辨别出一个新技术所处的发展阶段呢?我认为,如果不是亲自去了解和参与到这门技术中,是很难得知它的前景到底如何的。
(5)关于小故事“魔方的创新”
在16.4节中,作者使用一个小故事,来讲述我们在创新的过程中要明确目标用户,并时刻注意自己是否在面向目标用户进行创新。故事之中有这么一小段情节:
果冻是学校里第一个学会了魔方口诀的,在学校这个小范围里姑且算一种创新,但是你的竞争力有护城河么——你能否保持只有你会背这个口诀?
在故事中,果冻和其他竞争者采用了发表论文的方式来实现这个“护城河”。但我有一个疑问:为什么不通过申请专利的方式来实现这个“护城河”呢——你要用我的技术可以,但得给我交专利费。这是不是一种更好的保护自己的创新的方式呢?
2 “软件”与“软件工程”
软件(software):软件这个词第一次出现在出版物上是在1953年8月,由Richard R. Carhart著的书籍中。而John Tukey在他1958年发布的论文"The Teaching of Concrete Mathematics"中,也提到了“software”这个单词。
软件工程(software engineering):该单词是由美国计算机科学家Margaret H. Hamilton提出的。她在1965年左右一边在MIT仪器实验室担任主管,一边在为阿波罗计划编写软件。正是在这段时间,她提出了软件工程这个词。
3 软件工程冷知识
第一款数字化电脑游戏从未带来任何利润回报
现在的视频游戏已经成为了最受瞩目的程序开发成果,然而历史上第一款数字计算机游戏则遭遇巨大失败。第一个电脑游戏出现于1962年,由麻省理工学院的计算机程序员Steve Russell与其团队一同编写,这款名为《太空大战》的游戏耗费了他们近200个小时。该游戏允许两名玩家分别控制两艘飞船,目标是击中并摧毁对方飞船,并且玩家还需要躲避屏幕中代表星球的小白点。如果玩家撞上这些星球,则游戏失败。虽然Russell和他的团队从未在这个游戏说的任何收益,但必须承认如果没有这一突破我们可能永远不会拥有如今蓬勃发展的视频游戏产业。
4 版本管理软件
使用人数比较(表格数据来源于维基百科):
Name | Users | Projects | Alexa rank (lower = more popular) |
---|---|---|---|
GitHub | 31,000,000 | 100,000,000 | 65 as of 9 September 2019 |
SourceForge | 3,700,000 | 500,000 | 407 as of 9 September 2019 |
Bitbucket | 5,000,000 | Unknown | 989 as of 9 September 2019 |
GitLab | 100,000 | 546,000 | 2,146 as of 9 September 2019 |
OSDN | 54,826 | 6,294 | 8,529 as of 9 September 2019 |
Launchpad | 3,965,288 | 40,881 | 12,344 as of 9 September 2019 |
Assembla | Unknown | 526,581+ | 23,052 as of 9 September 2019 |
Rosetta code | Unknown | Unknown | 62,045 as of 9 September 2019 |
Buddy | Unknown | Unknown | 73,518 as of 9 September 2019 |
GNU Savannah | 93,346 | 3,848 | 100,244 as of 9 September 2019 |
Gitea | Unknown | Unknown | 209,697 as of 9 September 2019 |
CloudForge | Unknown | Unknown | 339,271 as of 9 September 2019 |
OW2 Consortium | Unknown | Unknown | 610,052 as of 9 September 2019 |
Ourproject.org | 6,353 | 1,846 | 1,191,954 as of 9 September 2019 |
SEUL | Unknown | Unknown | 1,268,571 as of 9 September 2019 |
优缺点比较
Microsoft TFS
优点:是一个团队工具,贯穿需求,开发,测试,发布各个流程提供自动化工具。
缺点:各种细节配置比较复杂,而且访问比较慢。
Git
优点:适合分布式开发,强调个体;速度快、灵活;任意两个开发者之间可以很容易的解决冲突;可离线工作。
缺点:学习周期相对而言比较长;代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。
Mercurial
优点:适合分布式开发;可离线工作;多人之间版本控制容易。
缺点:权限控制安全性不高;分支的时候不能对单独的子目录进行。
GitHub
优点:是一个集成了git的服务,拥有git的优点,部署方便,有巨大的社区资源。是目前世界上最先进的分布式版本控制系统。
缺点:国内访问速度太慢,基于git,学习起来较难。
Bitbucket
优点:免费支持私有仓库,同时支持 git。
缺点:不开源,系统不稳定。
Trac
优点:有良好的扩充性,权限体系的设计比较完备。
缺点:不支持多项目,核心功能很少,不安装插件基本上没法用。
Bugzilla
优点:免费,支持中文版。
缺点:仅仅是针对bug的管理,对于版本管理软件来说功能太过单一。
Apple XCode
优点:启动、编译速度快,相比其他软件与macOS系统兼容更好。同时也支持git的版本管理。
缺点:XCode本身更新之后,其他的插件也需要跟着更新,比较耗费时间。
个人实践
我选取了两个常见的版本管理软件Github和Apple XCode,并使用以下的修改前和修改后的代码来进行使用的实践。
修改前:
#include <stdio.h>
int main(){
int a = 1;
int b = 2;
printf("%d
", a + b);
return 0;
}
修改后:
#include <stdio.h>
int main(){
int a = 1;
int b = 2;
printf("%d
", a + b);
printf("%d
", a + b + 1);
return 0;
}
再次修改后:
#include <stdio.h>
int main(){
int a = 1;
printf("%d
", a);
printf("%d
", a + 1);
return 0;
}
Github
1、首先初始化本地的git仓库并添加远程的github仓库
2、将修改前的文件添加并提交
这时可以在自己的github仓库上看到了已提交的代码:
3、本地修改代码后重新通过git向github提交代码
这时可以在github仓库上看到修改后的代码,并可以查看具体修改了哪几行:
总结:总体来说,github的使用体验还是很不错的,而且由于它是目前使用人数最多的项目管理软件,有着庞大的社区,有别人的优秀、有趣的代码可以学习和参考。
Apple XCode
1、XCode内置了git功能用于代码的版本管理,版本管理的相关选项可以在工具栏的"Source Control"中找到,由于在用github的时候已经初始化了本地代码仓库,因此这里可以直接进行commit操作:
2、选择commit,可以看到本次相对上次的修改,以及可以选择是否提交每个修改:
3、之后仍然是在"Source Control"中找到push,可以将本地代码push到远程仓库:
总结:Xcode仍然使用git作为其代码提交工具,但它将git的各种功能作为其内置的功能,而不需要使用命令行的git指令,这点对不熟悉命令行的人比较友好。此外,在commit的时候可以预览更改,并选择哪些更改提交,哪些不要提交,这是git命令所不具备的功能。