一、一些疑问

  看书看得比较慢,暂时只思考了以下几个问题,有些自问自答,不知道符合不符合要求……

【1】

  第一章中书上提到了这样一个例子:

  “如果一架民用飞机上有需求,用户使用它的概率是百万分之一,你还要做这个功能么?”

  对此我有个问题:如果这个功能和飞机的安全性能无关,那么还需要实现这个功能吗?

  我一开始的想法是,是否实现这个功能是要根据价值期望(被使用的概率*它的重要性)来决定,对于安全功能,即便它被使用的概率很小,但是它的重要性很高,因此价值期望也就很高。但是后来我考虑到,实现一个功能需要一系列代价,包括开发精力、对运行速度的影响、对稳定性的影响等等……如果飞机的安全保障需要花费庞大的人力和财力(比目前的还要再高不少),这个功能真的还会被应用吗?

  我大概想了一下,如果被应用了,可能是以下这个路线:

  机票价格上升→大众负担不起→客户减少→公司破产……

  这可能有点夸张,但是我正想用此表达我的疑问:开发成本和产品安全性之间应该如何抉择?我认为在这种情况下,产品安全性的地位不是绝对的,只要不虚假宣传,买不买机票是乘客说得算的。如果乘客认为不值得花费更高的金额去换取百万分之一的安全,他有权利选择价格更低的机票。所以最好的办法或许是造出两种飞机(就好像经济舱和商务舱),让乘客决定哪一种更适合自己。实际上现在很多软件也分为“社区版”和“专业版”,后者比前者功能更强大也更稳定,但是要贵得多,不知道这和上面的例子有没有关系呢……?

【2】

  第二章中提到了用“单元测试”去检测代码的正确性,对此我有个疑问:单元测试的正确性应该如何保证?是否还需要写一个单元测试去检测单元测试呢?

  我查了资料[1],博文作者提到了“TEST FIRST”的观点,这一点在《构建之法》中也有提及。在开发之前先设计测试代码的的好处是,测试代码可以更加灵活、清晰,在不受到开发代码制约的同时,也为后面的开发明确了思路。与此同时,作者还强调测试应该针对需求进行,不应该涉及别的类,这倒是省了些工夫,但我个人感触不是很深,之前总感觉测试代码越详细越保险,不知道作者的想法是否有可取之处。总的来说,作者的观点是对于开发人员,测试要针对需求,更加细致的测试是测试人员干的事情。那么也就是说OO还有这次软工个人作业的测试是为将来从事测试方面的工作打下基础?还是说这也是开发人员应该掌握的技能呢?

【3】

  程序的可扩展性与运行速度应当如何取舍?就拿这一次作业来说,我是采用了在模板上变换的做法来生成数独,这样的优点是很快,但是缺点是生成的数独具有很大的共通性,算不上实用。如果后期老师又要求生成一亿个数独甚至更多,这种套路恐怕难以适用。

【4】

  第四章书上特意提到了“只要有助于程序逻辑的清晰体现,什么方法都可以使用,包括goto”。但是已经有人证明过goto语句的不必要性,而且自从大一开始学习c语言以来,老师、学长一再强调不要使用goto,会造成代码可读性下降,这一点和书上所写的不是矛盾的吗?

  后来去了一些论坛看了看,发现使用goto的人好像也不少,毕竟存在即合理,但是使用goto的人都遵循着一个原则——不影响程序的顺序性,也就是说goto只能用于向下跳转,不能向上跳转。一般情况下,goto语句多被用于跳出多层循环,这一点我也在这次数独作业中进行了尝试,感觉还是很方便的。

  但是让我不太明白的是,goto这种不被推荐的用法,有时候也能找到它的“用武之地”,那么如果团队明确规定“不允许使用goto语句”,这是不是一个合理的做法呢?这让我想到了很多团队都对一些代码规范进行严格的规定,比如大括号一定要换行,一定要用四个Space代替Tab等等……这些代码风格经常能成为论坛中的“引战帖”,可以看出各有优劣,那么强硬地要求使用某一种代码风格有没有必要呢?

【5】

  第五章开头,作者强调了“团队”与“非团队”的区别——“团队目标一致,互相依赖合作,共同完成任务;而非团队成员则彼此独立,甚至可以随时脱离队伍”。非团队给我的感觉就是聘用者和受聘者的关系,leader给受聘者发放薪水,受聘者给leader打工,一分钱一分货。我于是在想,如果按照这种定义来看,岂不是企业中就不存在团队了?

  但是仔细想了想,我觉得也不一定。衡量一伙人是不是一个团队不能只看薪水,而是他们在关心什么。团队的成员关心团队是否能够取得成功,而非团队的成员只关心还有没有工资可以拿。也就是说,即便拿了工资,偶尔也能关心一下项目进展,那么这也可以作为一个团队。

  那么我的问题是,作为一个由“雇员”组成的团队,成员为什么会愿意关心团队的状况呢?在软工课上,之所以每一名成员都努力为团队做贡献,是因为团队的期末答辩拿到了高分,每名成员都可以收获不错的成绩。在创业初期的团队中,可能每名成员不仅可能吃不上饭,还需要付出相当大的努力。那么是什么维系着这个团队呢?大概是如果创业成功了,每名成员都将得到巨大的利益,这份利益完全对得起他们的付出。

  我的理解是,团队之所以是团队,是因为团队的成功可以为每一个成员带来好处,如果一个吝啬的leader不愿意将队伍的成果分享给每一名成员,而仅仅用工资打发他们,那么我想成员也没必要再关心这个队伍的进展了。实际上,很多企业都会根据当年的业绩发放“年终奖”,这就是将团队利益共享的一个很好的方式。

  所以我在想,是不是一个非团队,如果能够实现利益的共同化,它就可以变成一个团队呢?


二、“软件”和“软件工程”这些词汇是如何出现的?

  1958年,Tukey发表了一篇题为“The Teaching of Concrete Mathematics”的论文,这是所知的“software”一词最早的用法。[2]

  “software engineering”是Apollo计划中,Hamilton在MIT提出的,她想要给予软件“合法性”,就像其它工程学科一样。[3]


三、软件工程发展的趣事和冷知识

  “I'm an egotistical bastard, and I name all my projects after myself. First Linux, now git.”

  Git这个名字是Linus Torvalds在编写第一个版本的时候起的,他将这个工具自诩为“the stupid content tracker”(傻瓜内容跟踪器)。我从Git的官方wiki找到了关于这个名字的多种解释,用自己的渣英语翻译一下:

  1. 三个随机的、可发音的字母,并且它没有被作为任何UNIX的指令,它是被误读的“get”这件事变得无关紧要;
  2. 辣鸡、卑鄙、简陋,字典里的粗话随你挑;(该词在英国俚语貌似是脏话OTZ)
  3. 是“global information tracker”(全局信息跟踪器)的简写:如果你心情不错,并且它正常地运行着,天使们在歌唱,一缕阳光洒进房间;
  4. 是“g*dd*mn idiotic truckload of sh*t”的简写:如果它崩了……

四、上网调查一下目前流行的源程序版本管理软件和项目管理软件都有哪些, 各有什么优缺点?

  其它的不太了解,Github在2013年用户数量突破了300万[4],而且根据2016年GitHub的Octoverse报告显示,在过去一年中,来自中国的新用户注册增长最快,同比增长了97%,其次是印尼(90%)、印度(76%)、俄罗斯、巴西和日本。[5]

[GIT]

优点:

  1.分支能力特别强大,体验特别好。加上支持离线提交,分布式推送拉取,使得代码层面的协作相当流畅;[6]

  2.GIT的分支模型很全面很好用,可以自由地修改历史,方便多个版本库的交流。

缺点:

  1.概念过于复杂;

  2.命令行语法设计得比较随意且不一致;

  3.命令行帮助提示晦涩难懂;

  4.缺乏良好的封装;

  5.对代码的维护者友好,但却牺牲了共享者的使用体验;

  6.版本管理未必安全;

  7.一些简单的操作需要用到过多的命令。[7]

[TFS]

优点:

  1.任务版上能将需求、项目进度一览无余,对于小团队而言,比甘特图更有用;

  2.集成了项目管理、版本控制、BUG 跟踪,能有效实现 SCRUM;

  3.能与VS无缝接合。

缺点:

  1.用浏览器访问相当慢;

  2.从 IE 上访问、填写各种开发、测试记录,也是很慢,不如 mantis BT 这样基于 php 的那么方便、迅速。[8]

[Mercuria]

优点:

  命令行简单、容易上手。

缺点:

  1.Mercurial 在不同平台上(尤其 Windows 与 Linux 之间)有档名编码的问题,如果版本库可能使用到中文档名,会造成跨平台的交流障碍;

  2.分支方式各有缺点和不便之处;

  3.改写历史很麻烦,操作繁琐,难以还原错误操作之前的状态,更容易导致版本库混乱,也更容易出错导致丢失历史;

  4.Mercurial 没有命名空间,一但和很多个版本库交流,很容易导致自己与别人的代码混成一团。[9]

[github]:

优点:

  功能设计简洁实用上手很快,可用性好,已有很多相当质量的各类项目和优秀开发者在上面。[10]

缺点:

  1.国内访问速度太慢,经常出现connect time-out;

  2.不能很好的解决GB2312/GBK,对中文不够友好;

  3.wiki功能太弱,直接导致文档经常被分离到一个独立站点。[11]

[Bitbucket]

优点:

  1.支持Hg,最易学易用的分布式版本管理工具;

  2.完全免费的闭源项目,还支持5人以内的合作开发;

  3.支持中文;

  4.官方的git工具SourceTree比GitHub for windows好用。[12]

[Trac]

优点:

  Trac做一个SCM配置管理平台,意味着它有良好的扩充性。通过WebAdmin界面中的Plugin功能,可以很方便的安装下载的插件,也可以通过此功能查看已经安装的插件,并可对其中的插件进行启用或停用操作。[13]

[Bugzilla]

优点:

  1.强大的检索功能,强大的后端数据库支持, 丰富多样的配置设定等;[14]

  2.BugZilla的定制功能的确更强,能满足更多用户差异化的需求。

缺点:

  界面比较糟糕。

[Rational]

优点:

  提高了团队生产力,在迭代的开发过程、需求管理、基于组建的体系结构、可视化软件建模、验证软件质量及控制软件变更等方面、针对所有关键的开发活动为每个开发成员提供了必要的准则、模版和工具指导,并确保全体成员共享相同的知识基础。它建立了简洁和清晰的过程结构,为开发过程提供较大的通用性。

缺点:

  RUP只是一个开发过程,并没有涵盖软件过程的全部内容,例如它缺少关于软件运行和支持等方面的内容,此外,他没有支持多项目的开发结构,这在一定程度上降低了在开发组织内大范围实现重用的可能性。

参考资料:

[1] http://www.xuebuyuan.com/821497.html

[2] https://en.wikipedia.org/wiki/John_Tukey

[3] https://en.wikipedia.org/wiki/Margaret_Hamilton_%28scientist%29

[4] http://kuailiyu.cyzone.cn/article/1453.html

[5] http://digi.163.com/16/0919/06/C1A9M69J001680N8.html

[6] http://www.cnblogs.com/lwl123/p/5253184.html

[7] https://www.zhihu.com/question/20401926/answer/15034642

[8] https://www.zhihu.com/question/21943395

[9] https://www.zhihu.com/question/21905835/answer/94503278

[10] https://www.zhihu.com/question/19591651/answer/12314492

[11] https://www.zhihu.com/question/19591651/answer/12798445

[12] https://www.zhihu.com/question/20053312/answer/20005315

[13] https://baike.baidu.com/item/trac/7367196?fr=aladdin

[14] http://blog.csdn.net/qq_33336155/article/details/53321885

[13] http://blog.csdn.net/wayne_ran/article/details/1555686

[14] http://www.docin.com/p-1614947229.html

[2017BUAA软工]第一次博客作业的更多相关文章

  1. [BUAA软工]第一次博客作业---阅读《构建之法》

    [BUAA软工]第一次博客作业 项目 内容 这个作业属于哪个课程 北航软工 这个作业的要求在哪里 第1次个人作业 我在这个课程的目标是 学习如何以团队的形式开发软件,提升个人软件开发能力 这个作业在哪 ...

  2. 2020BUAA软工个人博客作业

    2020BUAA软工个人博客作业 17373010 杜博玮 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业 我在这个课程的目标是 学 ...

  3. 2020BUAA软工个人博客作业-软件案例分析

    2020BUAA软工个人博客作业-软件案例分析 17373010 杜博玮 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业-软件案例分 ...

  4. 初窥构建之法——记2020BUAA软工个人博客作业

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任建) 这个作业的要求在哪里 个人博客作业 我在这个课程的目标是 完成一次完整的软件开发经历并以博客的方式记录开发过程的心得掌握 ...

  5. BUAA 软工 个人博客作业(一)

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业 我在这个课程的目标是 通过阅读<构建之法>大致了解软件工程 这个作业在哪 ...

  6. [2017BUAA软工助教]博客格式的详细说明

    一.为什么要强调博客格式 可以对比粗读一下这几篇博客然后自己感受一下博客格式对博客阅读体验的影响: MarkDown流:    [schaepher]2017春季 JMU 1414软工助教 链接汇总 ...

  7. 软工个人博客作业Week 1

    问题1:在瀑布模型中提到模型,模型(模拟版本)和原型有什么不同,如果与原型有同样的功能,那为什么称之为模型?如果没有同样的功能,又是怎么测试那些程序的? 问题2:怎样才能高效率的广泛而深入地了解用户的 ...

  8. OO第一次博客作业

    OO第一次博客作业 一.三次作业的bug反省 1.自己发现别人的问题 (1)输入处理的问题,比如第一次作业,主要就是处理输入的字符串,然后有同学的正则表达式有问题,则对于一些错误输入就不能正确判断. ...

  9. oo 第一次博客作业

    oo 第一次博客作业 早在大一就听说了oo的各种传奇故事,大二下学期终于也开始了我的oo之旅. 基于度量来分析自己的程序结构 第一次作业 类图分析 耦合度分析 可以看出在第一次作业中,我的耦合度非常高 ...

随机推荐

  1. Python学习:18.Python异常处理

    一.为什么使用异常处理 当程序运行的时候出现了异常,导致程序终止运行,为了解决这种情况,我们需要预先对可能出现的异常进行处理,一旦出现这种异常,就使用另一种方式解决问题,还有就是错误信息是使用者没有必 ...

  2. 理解 ajax、fetch和axios

    背景 ajax fetch.axios 优缺点 ajax基于jquery,引入时需要引入庞大的jquery库,不符合当下前端框架,于是fetch替代了ajax 由于fetch是比较底层,需要我们再次封 ...

  3. ubuntu 设置环境变量

    两种方式设置环境变量: 1,添加到环境变量路径$PATH中 # 加到PATH末尾 export PATH=$PATH:/path/to/your/dir # 加到PATH开头 export PATH= ...

  4. OpenStack入门篇(一)之云计算的概念

    1.云计算 云计算是一种按使用量付费的模式,这种模式提供可用的.便捷的.按需的网络访问, 进入可配置的计算资源共享池(资源包括网络,服务器,存储,应用软件,服务),这些资源能够被快速提供,只需投入很少 ...

  5. python 布尔值 bool( ) 与逻辑运算符

    逻辑运算符 not and or 运算符优先级 not > and >or printer(x or y)  x为非零,则返回x,否则返回y print(1 or 2) print(3 o ...

  6. Yii 2.0 使用验证码

    Yii2.0 提供了验证码组件.调用起来比较方便.以登录页面添加验证码为例. 1. 模型中添加字段和验证规则. common\models\LoginForm 添加如下代码 public $captc ...

  7. 一个web应用的诞生(2)--使用模板

    经过了第一章的内容,已经可以做出一些简单的页面,首先用这种方式做一个登录页面,首先要创建一个login的路由方法: @app.route("/login",methods=[&qu ...

  8. Android 自动化测试及性能数据采集的 Python 脚本

    文主要介绍一个基于 uiautomator2 封装的一个 Python 库 android-catcher ,该库的功能主要有对 Android 设备进行 UI 自动化测试 和 采集手机性能数据 ,适 ...

  9. Selenium2+python自动化-操作浏览器基本方法

    前言 从这篇开始,正式学习selenium的webdriver框架.我们平常说的 selenium自动化,其实它并不是类似于QTP之类的有GUI界面的可视化工具,我们要学的是webdriver框架的A ...

  10. 抓包工具Charles学习总结

    最近由于工作需要对App进行测试,功能方面还好说,但是在网络测试方面遇到了一些问题.由于公司App是使用https进行通信,直接在路由器上抓包下来,数据包都是加密的,没法看到接口返回的内容,给测试的B ...