写在前面

项目 内容
所属课程 2020春季计算机学院软件工程(罗杰 任健) (北航)
作业要求 个人博客作业
课程目标 培养软件开发能力
本作业对实现目标的具体作用 阅读教材,了解软件工程,并比较各个项目管理软件

一、《构建之法》的读后疑问与思考

1. 单元测试相关问题 (书本2.1.2)

单元测试必须由最熟悉代码的人(程序的作者)来写。代码的作者最了解代码的目的、特点和实现的局限性。所以单元测试没有比作者更适合的人选了。

虽然我十分肯定没有人比程序员自己更了解自己代码的观点,但对作者的这句话我仍有疑问。作者在 2.1的开头说道:“软件的很多错误都是来源于程序员对模块功能的误解、疏忽或不了解模块的变化。”然而,程序员意识到的可能出错的地方,他在写代码时往往已经注意了。这同时也意味着他写的单元测试的数据不大可能会包含到他没想到的出错情况。我们debug的过程中常常也有这样的困扰,感觉自己没有什么可错的地方,自己写的测试样例测了很多也没问题。但别人的测试样例却常能给我们很大的帮助。一个人自己写自己的单元测试,可能会思维受限,考虑不全。如果在大家都清楚代码实现功能的情况下,有人辅助进行单元测试以避免设计和情况的遗漏,是不是会好一点?

2.软件团队的模式 (书本 5.2)

本节中,作者介绍了多种团队的模式,有 主治医师模式、明星模式、社区模式、业余剧团模式、秘密团队、特工团队、交响乐团模式、爵士乐模式、功能团队模式、官僚模式。然而,作者并没有在文章中直接说明他们之间的优劣,似乎持着“不管白猫黑猫,抓到老鼠就是好猫“的态度。

作为学生的我们,专业能力还在培养之中,课上组队的模式多为主治医师模式业余剧团模式爵士乐模式。之前读过关于”鸡群效应“的相关文章,其在一定程度上否定了”超人“对团队的必需性。然而就我的大学经历来说,组队作业中最突出的不乏有”大佬“的团队(他们可能有时独挑大梁)。虽然这种团队存在一人带不动全组的情况,但能力相当的人组成的团队往往会应没有导向而没有突破性进展。那决定一个模式是否适合的重要因素是什么呢?团队模式是由组队人的水平一开始就决定的呢,还是说在合作过程中可以改变的呢?如果改变,又将怎样过渡以避免尴尬的境地?

3.关于项目经理(书本 9.3 )

在软件行业发展初期,软件都是为维持机器本身的运作服务,或是做科学计算,这时候也许看不出PM的作用。随着产业的发展,软件团队的复杂度都极大地提高了,这时候我们需要一些人,起到沟通、交换、影响、润滑、讨价还价的作用--就像商业社会的金钱一样--PM就是这样的角色。

PM做开发和测试之外的所有事情。

作者在这章中强调了PM的重要性,以及其所担任的任务。从作者的描述中,感觉PM更加注重的是软实力。虽然我们的大学课程有不少团队作业,却往往并没有PM的工作体现。这次软工作业,似乎是可以有PM的担当的,那么其预期的工作量是多少呢?在小型项目中,PM的价值如何更好得体现?

4.质量保障的相关问题 (书本14.1.2)

软件开发过程中的可见性( Visibility)

我们看这个项目开发过程中的场景:

领导:进度如何?

答:可能快了。

问:能看看演示吗?

答:嗯,不知道。可能到了项目的最后一天才能看......

上面的对话不能说明软件的功能如何(也许最后发现功能非常惊艳),项目的可见性是非常差的。不但是小规模、业余项目会出现这样的情况,大规模的专业团队也是如此。

上面的问题我也遇到过。项目开展一段时间后,也许背后的工作很多,然而可展示的部分却很少。可能实际工作进度只差一点了,但由于各个部分关联性很强,没有全部完成的情况下并不好展示。项目开发的可见性,非常重要,但确实也会存在上面我说的情况,那么我们该如何做得更好呢?

5.关于创新的迷思(书本 16.1)

迷思之一:……但是他们没有提到这些科学巨人在顿悟之前已经在相关科学打下了深厚的基础,同时他们也为这些问题思考进行了长时间的思考,那些看似神奇的时刻才能光顾他们。

迷思之五:统计数据表明,70%的创新者说,他们最成功的创新,是在他们的拿手的领域之外发现的。

作者的这两段话,乍一看是挺矛盾的。我挺赞成第一段话的,且不说创新性地解决问题,连精准地发现可突破创新的点所在何处,大致有个前进的方向,就需要很深厚的领域知识了。然而,第二段话却用数据表明,领域的专家没有领域外的创新者那么有创意。是不是存在领域专家长期深陷本领域的研究,导致其思想被已有的专业知识限制的可能呢?这似乎牵扯到了学识的广度与深度的问题。在时间精力有限的情况下,深与广又该如何平衡呢?生活中不少例子表明,创新的方向往往以需求为导向。创新又带来了新一轮的需求。那么能敏锐发现需求的人,是不是更加可能创新呢?

二、 “软件” 和 “软件工程” 词汇的由来

软件

化学家和统计学家约翰·图基(john W. Tukey)1958年撰写的一篇科学文章时,首次使用了“软件”这一 术语。据报道,他早在1953年就已经提出这个概念,用来标记计算机程序(即”软件“)与使用这些程序的计算机(或”硬件“)之间的区别。

软件工程

1968年秋季NATO(北约) 的科技委员会召集了近50名一流的编程人员、计算机科学家和工业界巨头,讨论和制定摆脱“软件危机”的对策。在那次会议上第一次提出了软件工程(software engineering)这个概念,研究和应用如何以系统性的、规范化的、可定量的过程化方法去开发和维护软件,以及如何把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来的学科。

三、软件发展过程中有趣的冷知识和故事

之前看到一篇文章,总结了一些在软件开发中的有趣而著名的定理。详见

  • 墨菲定律 (Murphy's Law)

    凡是可能出错的事就一定会出错。

推论:计算机会按照你写出来的方式运行,而不是你臆想出来的。

防御性编程、版本控制、测试驱动开发、模型驱动开发等等都是预防墨菲定律很好的做法。

  • 布鲁克斯法则(Brook's Law)

    向一个延期的项目增加人手只会让它延期得更加厉害

如果一个项目进展落后了,仅仅增加人力很有可能会带来灾难性的后果。相反,提高编程效率、审查软件开发方法和技术架构是否合理,几乎总是会比增加人力带来更好的效果。如果没有,这可能意味着霍夫施塔特定律在起作用。

  • 霍夫斯塔特定律 (Hofstadter's Law)

    事情总是要花费比你预想更长的时间,即使你把霍夫斯塔特定律也考虑在内。

这条定律的递归性反映出,即使付出最大的努力,也知道任务是复杂的,去精确地估算它依然是非常难的,所以要给估算留一个缓冲区出来。

四、流行的源程序版本管理软件和项目管理软件

  • 近年来,源程序版本/项目管理软件的使用人数情况如下:
Software Usage Project
GitHub more than 40 million* people 100 million*
GitLab 100,000 organizations ------
Bitbucket 6 million developers and 1 million teams ------
Bugzilla hundreds or thousands of organizations ------
Trac list of uesrs ------
  • 工具的优缺点比较
软件名 优点 缺点
Git 1.分支与合并
2.小而快速
3.分散式
4.资料保证
5.登台区
6.免费和开源
1. 前期学习知识较多
2. 对中文支持差
3. 代码历史保密性差,一旦开发者把整个库克隆到本地,就可以完全查看到所有的历史版本信息
Mercurial 1.更简洁好用的命令行指令
2.易于扩展
3.服务器配置相对于Git更加容易。
1.Mercurial的分支模型十分复杂,分支管理与Git相比不方便
2. Mercurial改写历史很麻烦 3. 没有命名空间
Trac 1.十分灵活,支持定制
2.良好的扩充性
3.权限体系设计得比较完备
1. 不支持多项目
2. 中文化不完整
3. 核心功能很少,不安装插件基本无法使用
Bugzilla 1. 检索功能强大
2. 优化的数据库结构
3. 定制功能强
1. 安装需要Perl和配置MySQL数据库,过程比较繁琐
2. 修改配置文件很麻烦
3.UI设计差
Bitbucket 1.支持私有免费项目
2.提交大文件速度快
1.项目检索不便
2.社区活跃度低

五、 软件使用尝试

(1) git

新建文件hello.txt

保存后 ,使用 git add命令,把文件添加到仓库缓冲区

使用 git commit 命令,把缓存区的所有文件正式提交到仓库

​ 现修改 hello.txt的内容

实现版本回退

感受:git因为6系课程要求,接触有一段时间了。git使用起来是很方便的,只是之前对其知识的学习需要一定的时间。

(2)Mercurial

感受:轻量级,安装比较方便;命令行使用和git很相似,有些更加简洁。

BUA软件工程个人博客作业的更多相关文章

  1. BUAA软件工程个人博客作业

    软件工程个人博客作业 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业 我在这个课程的目标 团队完成好的软件,并对自己作出规划 这个作 ...

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

    BUAA 2020 软件工程 个人博客作业 Author: 17373051 郭骏 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业 ...

  3. 软件工程个人博客作业-软件案例分析:VS与VS Code

    项目 内容 本作业属于北航 2020 年春软件工程 博客园班级连接 本作业是本课程个人项目作业 作业要求 我在这个课程的目标是 提高软件开发能力.团队协作能力 这个作业在哪个具体方面帮助我实现目标 提 ...

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

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

  5. 【BUAA 软工博客作业】个人博客作业

    项目 内容 课程:2020春季软件工程课程博客作业(罗杰,任健) 博客园班级链接 作业:热身作业,阅读并撰写博客 作业要求 课程目标 学习大规模软件开发的技巧与方法,锻炼开发能力 作业目标 阅读教材, ...

  6. [2017BUAA软件工程]第0次博客作业

    [2017BUAA软件工程]第0次博客作业 结缘计算机 你为什么选择计算机专业?你认为你的条件如何?和这些博主比呢? 计算机是你喜欢的领域吗?是你擅长的领域吗? 我当时报考高考志愿的时候就已经是想好报 ...

  7. 【2020BUAA软件工程】个人博客作业

    个人作业博客 项目 内容 北航2020软工 班级博客 作业要求 具体要求 我的课程目标 学习软件工程,掌握团队合作,锻炼自我 作业在哪个方面帮助我实现目标 通读<构建之法>,尝试理解软件工 ...

  8. 初窥软件工程 2020BUAA软件工程$\cdot$个人博客作业

    初窥软件工程 2020BUAA软件工程\(\cdot\)个人博客作业 目录 初窥软件工程 2020BUAA软件工程$\cdot$个人博客作业 一.作业要求简介 二.正文 (一) 快速看完整部教材,列出 ...

  9. BUAA_2020_软件工程_个人博客作业

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业 我在这个课程的目标是 了解软件工程的技术,掌握工程化开发的能力 这个作业在哪个具体方 ...

随机推荐

  1. Spark中普通集合与RDD算子的sortBy()有什么区别

    分别观察一下集合与算子的sortBy()的参数列表 普通集合的sortBy() RDD算子的sortBy() 结论:普通集合的sortBy就没有false参数,也就是说只能默认的升序排. 如果需要对普 ...

  2. HCL实验8:NAT搭建私有网络

    NAT 通过NAT技术,进行私有网络的搭建 拓扑图 先对路由器的端口进行配置 R1 [H3C]sys R1 [R1]INT G0/0 [R1-GigabitEthernet0/0]ip address ...

  3. JS基础学习第六天

    数组(Array) 数组也是一个对象,它和普通的对象一样,也是用来存储一些值的,不同的是普通对象是使用字符串作为属性名的,而数组使用数字作为索引来操作元素数组的存储性能比普通对象好,再开发中我们经常使 ...

  4. .NET管道应用——工作池

    名词解释 工作池:一组等待任务分配的线程.一旦完成了所分配的任务,这些线程可继续等待任务的分配. .NET管道:命名空间System.Threading.Channels中的Channel和Chann ...

  5. 数据结构☞二叉搜索树BST

    二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它可以是一棵空树,也可以是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它 ...

  6. 浅入Kubernetes(11):了解 Service 和 Endpoint

    目录 Srevice Service 的创建及现象 Service 定义 Endpoint slices 创建 Endpoint.Service Service 创建应用 创建 Endpoint 浅入 ...

  7. ASP.NET Core扩展库之Http请求模拟

    如今,完全独立的业务应用几乎不存在,不管是在企业内部微服务之间的调用,还是与外部第三方服务的调用,Http的API交互是常见的场景,这些实际情况给我们的开发带来了比较大的挑战,一是第三方服务可能会牵制 ...

  8. python3函数可变输入参量

    技术背景 通常我们在python中定义一个函数的时候,需要给出明确的函数输入参量,比如对于一个数学函数\(z=f(x,y)\)就表示,\(z\)是关于\(x\)和\(y\)的一个函数.但是如果对于未知 ...

  9. 『动善时』JMeter基础 — 3、JMeter插件管理

    JMeter是一个Java开发的开源软件,开源的软件有一个好处,就是会有很多第三方开发出来的插件,使得JMeter在处理某一些功能的时候更加的方便.并且这些插件拿过来就可以使用,完全免费的. 我们安装 ...

  10. 分解uber依赖注入库dig-使用篇

    golang的依赖注入库非常的少,好用的更是少之又少,比较好用的目前有两个 谷歌出的wire,这个是用抽象语法树在编译时实现的. uber出的dig,在运行时,用返射实现的,并基于dig库,写了一个依 ...