写在前面

项目 内容
所属课程 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. 5、Spring教程之依赖注入

    概念 依赖注入(Dependency Injection,DI). 依赖 : 指Bean对象的创建依赖于容器 . Bean对象的依赖资源 . 注入 : 指Bean对象所依赖的资源 , 由容器来设置和装 ...

  2. fork、exec 和 exit 对 IPC 对象的影响

    GitHub: https://github.com/storagezhang Emai: debugzhang@163.com 华为云社区: https://bbs.huaweicloud.com/ ...

  3. Activity类组成分析(一)Instrumentation

    目录 前言 解剖 继承关系 重要成员 Instrumentation 总结 前言 要了解清楚StartActivity的过程,Activity对象实例的构造过程是重要组成部分:而要弄清楚Activit ...

  4. 半监督学习方法(Semi-supervised Learning)的分类

    根据模型的训练策略划分: 直推式学习(Transductive Semi-supervised Learning) 无标记数据就是最终要用来测试的数据,学习的目的就是在这些数据上取得最佳泛化能力. 归 ...

  5. 数据调度组件:基于Azkaban协调时序任务执行

    一.Azkaban概述 1.任务时序 在数据服务的业务场景中,很常见的业务流程就是日志文件经过大数据分析,再向业务输出结果数据:在该过程中会有很多任务需要执行,并且很难精准把握任务执行的结束时间,但是 ...

  6. java 基础知识储备

    初始JAVA JAVA 帝国的诞生 1972年C诞生 贴近硬件,运行极快,效率极高. 操作系统,编译器,数据库,网络系统等 指针和内存管理 1982年C++诞生 面向对象 兼容C 图形领域.游戏等 纵 ...

  7. 借鉴Elasticsearch 7.x 深入系列学习

    开始 Elasticsearch 深入系列目录如下: Elasticsearch 7.x 深入 数据准备 Elasticsearch 7.x 深入[1]索引[一]原理 Elasticsearch 7. ...

  8. 【C/C++】memset方法的误区

    目录 一.前言 二.函数作用 三.效率对比 四.误区总结 1.按字节设置 2.设置的值只有最低字节有效 3.堆内存不可直接 sizeof 取首地址 4.传参数组不可直接 sizeof 取首地址 一.前 ...

  9. MindSpore函数拟合

    技术背景 在前面一篇博客中我们介绍过基于docker的mindspore编程环境配置,这里我们基于这个环境,使用mindspore来拟合一个线性的函数,演示一下mindspore的基本用法. 环境准备 ...

  10. Netcore webapi action swagger response返回参数使用匿名类型

    问题:action中返回匿名对象时,swagger只能按强类型生成返回值描述 解决办法:使用roslyn在内存中动态执行代码,使用json.net反序列化匿名对象,向swagger返回动态匿名对象 效 ...