在阅读了推荐阅读的材料之后,我想了很多东西。最终还是决定,以团队项目的经历为主线,叙述我关于软件工程的一些思考与体会。

凤凰涅槃,浴火重生

如果要我来概况这几周团队项目的经历的话,那么句话是我所能想到的最贴切的一个表述。从最初的雄心壮志,到中间的困顿不堪,再到目前如重生一般的喜悦,我们整个团队经历了太多太多。

重造轮子

  轮子,在软件行业中经常指那些设计好的,用于处理常见功能的库、框架或者可重用的代码。而重造轮子则是说,在已经有可用的“轮子”的情况下,自己重新实现一个自己的“轮子”。有些人经常说,重造轮子是一种很傻的行为。已经有现成的代码可以解决问题,可以工作,我们为什么要重造轮子呢?也有人认为,重造轮子往往会引发一场进步。比如在已有的库的设计无法满足实际需求时,重造轮子则可能产生更为先进而高质量的轮子。因此重造轮子是值得鼓励的。

  在我们的项目开始之初,作为团队中的架构师,我想了很久。我们拥有往届留下的完整的代码。稍微做些修补和部署的工作,那些代码就可以实现很多功能。虽然界面很丑陋,部分功能也恐怕存在诸多问题,但毕竟是八千行代码,几年的课程积累下来的东西。采用它们,我们的工作能够轻松很多。但这样的轻松存在问题:代码遗留bug是肯定存在的,而且据测试的小伙伴说,问题还不小。上一届留下来的文档也提到,他们发现再上一级很多功能没有实现,空有一些接口等等,调了很久。文档不齐,原有开发者又都不在项目中,采用的技术也相对老套。且这套代码经历过多年的开发,缝缝补补修修整整,就像阅读材料中所说的大泥球,谁都很难说现在代码的状态是什么样子。在这样的情况下,我们是否应当重造轮子,将其推翻重来?

  虽然直到现在,我依旧无法衡量,当时的选择正确与否。但经历了重造轮子的过程之后,我对于造轮子有了更深的一些想法。造轮子最痛苦的一点在于:我们需要重新实现原有的功能,而无法依托于哪些东西。所以,造轮子的代价之高昂,是显而易见的。现在看来,我们对于这一点的认识显得过于稚嫩。凭着一股莫名地自信,我们就认为自己能用两千行python能实现原有的8000行代码的功能,现在回想起来,确实感觉有些太过自负了。但彻底的重写也带来了意料之外的好处,我们整个采用了时下较新的技术,以较低的成本实现了很多功能,整个框架无论是实现新功能,还是重新实现原有功能,都很容易。一些看上去很复杂的东西,通过使用现代化的框架就可以轻易解决。我们的系统目前大量地使用了分布式的技术,可以通过增加节点来提升性能。这一点是通过重构原有的代码很难实现的。这些新鲜的技术也带来了很多新鲜的设计和鲜活的动力。我们所采用的框架,都蕴含了很多现代化的设计思想。这些思想也透过这些框架,渗透到了我们的设计中。我们遵循它们所提供的一些设计原则,理解它们的很多设计理念,并试图去应用这些设计哲学。在这个过程中,我认为我们整个项目的整体感觉要比原有项目好得多。团队成员也都很有干劲,每当实现了一个新的功能,或者采用了某些新鲜的东西,都会拍手高呼。由于是全新开始的项目,没有遗留代码的历史负担,我们可以尽情地使用我们所想用的工具,而不必在意历史包袱。

  总结起来,我认为,重造轮子的好处在于没有历史包袱、思路更为大胆开拓、可以给一些项目带来革命性的变化。而采用原有系统,则可以“站得高,望得远”。这二者的权衡,是一件需要更为细致周到地去思考的事,轻易下一个结论,则会招惹意料之外的麻烦。正如我们目前的状态,从最初选择放弃旧有代码,自己重造轮子,到现在,方才认识到,当初的决定影响到底有多么深远,需要考虑的问题又有多么复杂。也许有些事,经历过才会才知道深浅。如何权衡利弊,如何评估方案,也许下一次再做得时候,我们会成熟很多,并且慎重很多。

团队管理及开发方法

  软件工程没有“银弹”。我十分认同这一观点。从之前的结对编程,到目前的敏捷开发。所有的方法都有它的应用范围。比如结对编程对于结对双方的性格、关系等等都有一定的要求。两个人一见面就掐的那种,还是不结对效率来得高。而我们目前所采用的敏捷开发,对于任务的分解、分配,人员的协调,角色之间的关系,都有着很强的要求。而这对于一个团队来说,不见得是很容易达到的。比如PM和程序员之间,就是位置很纠结的一组关系。按理来说,PM负责协调工作、项目宏观方向、跟踪进度等等,但如果程序员相对比较强势,那么PM的工作往往难以进行。PM把握不了项目的基本走向,而程序员们毫无组织地松散开发着。除了PM和程序员外,测试、UI等各个角色之间的关系,都可能成为整个项目的瓶颈。

  阅读材料里所说,“有人负责,才有质量”。经历过一轮团队项目的开发后,我非常认同这一观点。而且,我认为,这里的负责有两层含义:一、有一个特定的人负责处理这件事。二、这个人有能力处理好这件事。第一层相对是显而易见的,一个任务必须指派给某一个固定的人,否则,这个任务若是没人认领,自然很难期盼它被良好地完成。就像一棵无人搭理的树苗,虽然最后也能长起来,但是相比起被园林工人精心呵护的树苗来说,其形态样貌等都会有一些程度的差距。第二层则是经历过团队项目后,我所得出的一个理解。所谓负责,并不是说指派给某人,某人就能负责。这个人必须有能力负责才行。例如,你指派一个小学生去进行[完成高等数学习题]这样一个任务。虽然指定了特定的人去负责处理,但是,显而易见地是,被指派这根本没能力对这件事负责。即使他最终做出来,做的不好再打回去一遍遍改,仍然很难改好。这也就是有能力负责的意义所在。

  我们团队所面临的最惨痛的一次教训也正是源于此。我们虽然按照要求,每天都开"每日立会",有时遇到问题,几个人也经常串宿舍讨论,但却没有明确地指定负责人。于是,手里有一波又一波松散的记录、不正式的文字,却一直未能整合到一起。专门负责维护的同学又是对于内容十分较真的人,质量不够绝不会往出发。结果,每日立会相关的文档就一直拖了下来,造成了很严重的后果。现在想来,如果当初能够指定一个特定的人,有足够能力的人来专门负责这件事,也许最后就不会出现这样的局面。我们一直采用集市式的方式进行我们的团队项目,大多数任务几乎都是自己主动要来的。团队内部的大部分人都很积极,任务也大多数都有明确的人来真正去负责。所以大体上十分顺利。但是,集市式方式所面临的问题,我们自然也不可避免的遇到了。而且,我们甚至没能及时注意到这成为了一个问题。大教堂式的开发是设计好了一切,按部就班地完成开发。而集市式则更像一个闹哄哄的集市,每个人选择其自己感兴趣的任务去进行。我们顺利地采用集市式的模式完成了几份高质量的作品。一个人初稿、一个人复审迭代更新、一个人再度审核排版等等,每个人都出于个人的责任、荣誉以及兴趣等复杂情感,深入地参与到了整个过程中。虽然没有非常明确的安排,但是大家都主动承担了某一部分的任务。我们用集市搭建起了一座教堂。然而,这种搭建是有条件的,正如《大教堂与集市》的作者所总结得那样:

1)项目首先必须是你自己感兴趣的,但是最终能对其他人有用。

2)将用户当作合作者。

3)尽快地和经常地做出改进,多听取用户的意见。

4)健壮的结构远比精巧的设计来得重要。换句话说,结构是第一位的,功能是第二位的。

5)保持项目的简单性。设计达到完美的时候,不是无法再增加东西了,而是无法再减少东西了。

之前的成功使得我们没能认清楚上面所叙述的一些本质性的东西,从而导致了后面的问题。我认为其中最主要的是第一条:项目必须首先是你感兴趣的,最终对其他人有用的。之前构筑的一系列文档,源自团队中对于文字有执着追求的青年的努力,也源自团队自身开发设计的需求,因此,大家参与得较为深入。特别是一些每个成员都能够用到的文档,比如设计文档、需求分析等等。然而,我们没有认识到'每日立会'的会议记录的作用,因而也没有人对其感兴趣。大家都觉得,这个东西似乎没那么重要,没有给予太多的重视。现在回想起来,我觉得这确实是违背了上面的第一条条件:项目必须首先是自己感兴趣的。没有人愿意关注的东西,自然难以采用集市式的方式进行。于是,在这一次,集市没有起到任何作用,我们一直所倚靠的集市式成了低质量的罪魁祸首。

在经历了这样许多之后,我认为,我们依旧需要坚持我们所一直依赖的集市式模式,它是我们成功的基石。但在此之上,我们必须另想办法解决那些不适用于它的情景。在我看来,一个适合我们团队情况的开发模式是这样的:对于每一个任务或者需求,首先应当尽量采用集市式的思路去完成它。但同时,我们应当设置一个警戒时间。如果超过这个时间依旧没有任何起色,那么就说明集市模式已经不再适用于这个任务或需求了。我们应当综合各方面意见,选定一个特定的,有足够能力的且适合完成这个任务的人。让他为此事负责,这样才能产生足够的质量。从而避免集市式模式失效后直接崩盘的惨痛结果。

结语

几周的团队项目开发,我们从高潮到低谷,再重新一步一步向上爬。跌宕起伏的过程,让我们更充分地意识到了哪些是对的,又有哪些是存在问题的。我们团队的前路依然艰险,但我认为,我们已经摸索到了正确的模式。在下一轮开发中,我们能够应用这些经验与感悟,小步快跑,达到更高的一个层次上。

[个人博客作业Week7]软件工程团队项目感想与反思的更多相关文章

  1. 【个人博客作业Week7】软件工程团队项目一轮迭代感想与反思

    (发布晚原因:发到团队博客了 一.关于银弹 在佛瑞德·布鲁克斯于1986年发布的<没有银弹:软件工程的本质性与附属性工作>这篇软件工程的经典论文中,作者向我们讲述了软件工程没有银弹这样的理 ...

  2. 个人博客作业Week7(阅读文章,心得体会)

    Alpha阶段结束了,内心可以说是五味杂陈.不是说我们的产品拿不上台面那般差劲,复杂的心绪主要来源于和别的队的比较,别的队才刚刚发布没多久访问量和注册量就破百了,并且还发起了找bug送红包的活动.可能 ...

  3. 个人博客作业week7

    个人阅读作业week7 一.瀑布 软件工程的瀑布模型是1970年由Winston Royce提出来的,即软件的开发按照一个严格的.顺序的.单次的瀑布流开发周期.例如需求分析阶段.概要设计阶段.详细设计 ...

  4. 个人博客作业-Week7

    团队任务中个人感想 我们团队选的题目是爬虫, 采用用AVA平台开发了, 我原来JAVA语言不熟悉了, PM考虑这部分之后分配任务这部分感觉很多谢 团队当中的PM很清楚每个组员的力量, 所以PM跟每个组 ...

  5. BUA软件工程个人博客作业

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

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

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

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

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

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

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

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

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

随机推荐

  1. 4.4Python数据类型(4)之字符串函数

    返回总目录 目录: 1.字符串的查找计算 2.字符串的转换 3.字符串的填充压缩 4.字符串的分割拼接 5.字符串的判定 (一)字符串的查找计算 (1)len(str)计算字符串的总数 (2)find ...

  2. Visualbox与CentOS 6.4之间鼠标切换

    按住键盘右边的Alt键,再按一下(右边)ctrl键,这样可以实现鼠标能在主机与虚拟机之间自由切换.

  3. Python用户名密码登录系统(MD5加密并存入文件,三次输入错误将被锁定)及对字符串进行凯撒密码加解密操作

    # -*- coding: gb2312 -*- #用户名密码登录系统(MD5加密并存入文件)及对字符串进行凯撒密码加解密操作 #作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.co ...

  4. 用智能TFT液晶模块这种串口屏做产品界面设计太简单了,大大的节省了开发时间

    随着科技的发展,TFT液晶显示屏在我们日常中可以随处可见. 工业设备上的显示也逐渐由段式显示.黑白显示转向彩色的TFT液晶显示屏. 普通的TFT液晶显示屏由于开发起来比较麻烦, 需要嵌入式工程时写程序 ...

  5. File类_常见的方法(获取目录中指定规则的内容)_listFiles

    import java.io.File; public class ListDemo { public static void main(String[] args) { ListDemo(); } ...

  6. Spring集成JUnit单元测试框架

    一.JUnit介绍 JUnit是Java中最有名的单元测试框架,用于编写和运行可重复的测试,多数Java的开发环境都已经集成了JUnit作为单元测试的工具.好的单元测试能极大的提高开发效率和代码质量. ...

  7. B - Cube HDU - 1220 (数学计数)

    题意:一个边长为N的正方体,切割成N*N*N个单位正方体,问有多少对正方体之间有0个,2个公共点. 思路:因为正方体之间出现公共点的情况有0,2,4. 那么直接正面求,肯定不好求,那么先求出有4个公共 ...

  8. 莫比乌斯函数 51nod-1240(合数分解试除法)

    就是输出n时,莫比乌斯函数的值.直接将n唯一分解即可. 思路:筛出105以内的素数,因为109开方,105就差不多.当一个大数还没有被1000个素数分解,那么这个数基本上可以认为是素数(为合数为小概率 ...

  9. ethereum/EIPs-607 Hardfork Meta: Spurious Dragon硬分叉相关

    eip title author type status created requires 607 Hardfork Meta: Spurious Dragon Alex Beregszaszi Me ...

  10. java mysql的latin1转UTF-8

    public String convertCharset(String s) { if (s != null) { try { int length = s.length(); byte[] buff ...