做好需求管理让您的产品踏上成功之路

CodeBeamer原厂INTLAND因为欧美对车用与医疗用device(器材)产业对生命安全相关软件的重视,积极地在新版(CB6.0)加了需求管理(RM)的模块.

以下先让大家看看CodeBeamer RM模块目前可让您做到哪些事:

一般来说,很多人习惯采用Words或Excel来整理需求, 因为Words和Excel是标准的办公室软件,且大多客户要求Words的文档. 但用Words或Excel来整理需求,除了符合习惯和写作简单外,以下这些问题仍须借助聪明的人脑和多重沟通协调的管道和信息收集才有可能达成:

  1. 需求规格涉及许多专长,需各方专长或客户/使用者加入讨论,评估完整性,技术可行性和投资效应,或修改规格另提可行需求
  2. 与专业人员制定每个需求相对的设计, 和应通过的测试与检验,以确保达到客户/市场的要求
  3. 检验需求项目的相依性,确保任一变更所牵动的其他需求变更都有照顾到
  4. 每个需求相对的派工与瑕疵是否能在规定时程内完工
  5. 产出是否完全符合最终正确的需求版本

运用CodeBeamer原本的ALM(Application Life Cycle Management)功能和加值的RM模块将帮助您上述所需的沟通协调平行处理, 资料间的追溯和信息同步. 又能…让惯用的Words/Excel融入我们的沟通协调中, 这就是您在影片中一开始第一步就是导入Words/Excel的需求资讯, 最后也是让您可以导出成为Words. 至于资料间的追溯和同步, 以下这个图可以先给您一个概念.

追溯图
上面所提的五点,第一点和第三点是比较属于需求管理的范围,不过由这五点看来您应该也看出需求不是写出来摆著好看的.
第一点…很基本的需求管理,如果做好了,应该是产品开发或代工接案成功的一半, 相反地, 也可能种下失败的命运. 以需求的完整性来说, 如捷运的门没有考虑到突然断电的风险或如线上购物系统只想到客户一路都没改变主意的流程,少了客户购物过程中改变主意或购物后反悔的状况, 都是很严重的问题. 前者牵涉到Hazard Analysis(危害分析)的考量,尤其是针对与生命安全相关的产品,必须将这些考量纳入需求发展中的限制条件或必要元素. 我们建议在做需求发展的同时也做风险管理, 您可参考以下的Hazard Analysis例子和FMEA的表帮助风险的认定并在需求中放入控制/避免元素,如此可以得到比较安心的需求列表.

资料来自http://www.safeware-eng.com/White_Papers/Preliminary%20Hazard%20Analysis.htm
Hazard Analysis后者线上购物的例子牵涉到如何构思Use Case或User Story, Alistair Cockburn的Writing Effective Use Case, 应该是个很不错的参考书. 另外, 需求的技术可行性和投资效应也应该列入每个需求的metadata, 如果不敷成本或技术上实践有困难, 考量替代方案或和客户商讨砍掉此需求都比已经投资了一大堆人力物力开发才发现问题的好.

第二点与第一点息息相关,如果不知道使用的情境,也无法设计出实用的规格和可靠的测试用例. 我们需要很清楚的追溯设计规格和需求的关系, 以及每个需求验证所应通过的测试有哪些,以帮助后续成品的验证.

第三点可藉影片中所述的Traceability Matrix(追溯矩阵)和Baseline(基线)轻松达成,这里如果有任何疏失,很有可能在后续开发埋下许多重工或问题丛生的状况.

第四点 和 第五点 可参考之前于 工作管理, 项目管理, 与 版本发布管理 相关的应用文章, 配合以上彩色的追溯图, 相信您很快就能了解要如何利用CodeBeamer来追溯和检验.

也许您还有个疑问, 真的要花那么多时间在需求管理吗? 开发的时间都不够了…. 这好像又和现在正热的敏捷开发有牴触? 如果您仔细去看敏捷开发, 他也是要看每个Product Backlog(产品订单)的Business Value(企业价值)和Story Points(点数—评估技术难度和可能花的时间), 且要排先后顺序. 敏捷开发也要求团队定义好每个Product Backlog(产品订单)何谓”DONE”的查核点. 至于产品需求的完整度, 在某的程度来说, 敏捷的边执行边加规格的方式可能比较适合具高度scaliability(弹性伸缩)的软体开发, 或可留介面后续加值的嵌入式系统开发, 对于mission critical的产品开发以及像APPLE那种一出来就要让大家惊艳的创意产品开发可能比较不适合.

如果您有好的工具, 需求管理也可以不用那么费时费力. 且还可大量降低花在需求变更和解决问题的时间, 更重要的, 避免不必要的开发成本与有可能埋下炸弹的盲点设计,也给所有参与人(包含客户),一个正确的蓝图. 您说能不花时间在需求管理吗?

什么样的工作环境对开发团队最好?

曾遇过一位敏捷开发的顾问说, 如果他到一家公司, 发现他们办公室很热闹, 表示他们导敏捷开发成功, 如果很安静, 他认为这家公司有问题.  在敏捷开发中, 鼓吹把一格一格的屏风式工作环境改成无屏风障碍让团队坐在一起的工作环境,以方便随时找相关人讨论, 提高沟通协调的效率. 但又有人认为大多数的人还是需要安静与完整(不被切割)的环境让工作完成. 到底什么样的工作环境才能让大家有效率的工作呢?

以知识性工作来说, 大多数人的确需要安静的工作环境来进入状况. 就如Jason Fried:Why work doen’t happen at work说的, 知识工作如同睡觉, 需要时间由浅睡到深睡,  如果曾照顾过新生儿的父母, 应该很能体会不时被吵醒没睡饱的痛苦, 但我们工作时, 却经常遭遇这样的状况. 可能正在研究某个技术, 写某个功能, 写一篇或读一篇与工作相关的文章, 还没进入状况或正要进入状况时, 就来通电话说客户要求出货, 什么时候可完成xxxx; 或是告诉你客户有什么问题, 描述好一阵子, 然后问如何或何时能解决; 有时老板临时召集团队成员到会议室开会, 要review进度. 许多人, 尤其在大公司的朋友, 常常说好像都要等到要下班了, 才有时间安静下来做事, 加班…已经是正常的上班行为. 不加班…好像反而不正常…

但为什么还是有一大票敏捷开发的支持者认为坐在一起(Sit Together)工作比较好呢? 以下整理Sit Together的好处:

  • 有问题可以马上找人讨论, 不会花很多时间等待答案
  • 方便实行Pair Programming, 借此有互相学习和cover的功效, 也可避免个人怠惰
  • 可以随时听到跟自己相关的讨论, 马上配合或纠正
  • 增进团队情感

鼓吹Sit Together的同时, 也有人发现以下的冲突, 并给与建议

  • 其实并非所有人都能适应Pair Programming, 且Pair Programming的组合最好是实力相当者的配对(两个都很菜的也不是什么好组合), 不要勉强Pair Programming
  • 吵杂的环境其实不利于知识工作者工作, 但Pair Programming因为两两要一直讨论写codes, 所以两个人的讨论可以帮助彼此focus
  • 工作环境也请提供可以让个人安静的工作环境区, 让希望安静的人有时可到那区工作

许多敏捷开的Sit Together环境, 通常会布置两两一起工作的桌椅和大大的LCD萤幕, 以便实践Pair Programming. 至于是否实行Pair Programming和实行应注意的状况,  Will Pair Programming Really Improve your Projects? 是篇不错的参考文.  这里不鼓吹也不反对Pair Programming, 但是否实践Pair Programming, 将影响工作环境的布置.

那么到底什么才是好的工作环境? 先瞧瞧http://www.hongkiat.com/blog/creative-modern-office-designs/ 与 http://www.trendhunter.com/trends/lego-denmark-office#!/photos/143530/1上创意的办公室, 如Lego, Google, Facebook, Skype, Twitter…等. 这些工作环境都很开放, 但也提供私人的工作空间, 此外也有小团队躲进去私密讨论的小房间, 也有随意坐下讨论的空间, 有的置身在大自然中, 有的像在游戏间 …很羨慕吧…

来自上述网站

如此可让大家自由定位的开放式工作环境, 背后都有协同作业, 即时通讯, 与宽频网路基础建设等沟通协调的支持设施. 可以有时坐在一起工作, 有时到角落cool down. Jason Fried:Why work doen’t happen at work 演讲中有个建议, 让团队每星期挑个一天不主动打断彼此的工作时间, 只用沟通协调工具, 给办公室一天的安静, 看看效果如何?  此外, 也可以连续几个星期都挑个一天, 做Pair Programming或Sit Together让大家随时交流, 比较看看.  实际一点来说, 如果目前的座位和办公室装潢都无法变动, 您也可以利用协同作业软件帮助沟通协调, 安排senior对junior的code review, 或进行Auto Build/Test. 协同作业的软件就像CodeBeamer这种含有Tracker, Forum, Document Sharing, Wiki功能的web-based系统, 或CVS, Subversion, Git, Mercurial等版本控制功能, 或Jenkins这类帮助build/test的软件, 即时通讯如MSN, Skype, Google Talk, Yahoo Messanger,或桌面分享工具如GotoMeeting和Skype, 适当利用这些软件可以达到:

  • 自我控制的接受干扰, 但也可利用即时通讯或电话分机紧急联络讨论
  • 可由e-mail或专案涂鸦墙获知伙伴最新的修改或状态变动, 并给与回馈
  • 不用临时停下手边正在进行的工作聆听问题报告或报告进度, 主管可由协同作业系统看到目前进度, 问题也可有记录的追踪, 且一张图胜过口头描述

项目涂鸦墙与仪表板

Sit Together有一个很大的好处是当不清楚主管分派的工作时, 可以很快的请教主管, 避免等待的时间. 但在某个程度, 主管也不想常常被打扰, 建议成员可多多利用协同作业系统跟主管请示, 一方面主管也要常常查e-mail或协同作业系统上的资讯,适时给与部属指导. 政如天下杂志 30招打造A+主管: 管理时间五大法则中的法则2 管理”被打扰”所说, 搭配不同的工具方便部属”打扰”你, 或让工作伙伴”打扰”你

  1. 预留”被干扰”的时间, 让其他人知道什么时候可以去找你谈事情
  2. 要求部属二事情的轻重缓急, 搭配使用不同的工具和时间来”打扰”你
  3. 训练部属把问题一次问完, 让你可以一次回答所有的问题

以上资料提供大家思考一下”什么样的工作环境对开发团队最好? ”

如果有机会, 团队聚在一起时可检验一下目前的工作环境, 是否有什么方式能让工作环境有更好的沟通协调机制, 且能让大家专心工作. 也许您的团队将发现意想不到的成效.

 

 

 

 

 

 

 

 

 

 

 

 

如何运用CodeBeamer帮助每版产出的检验?

这里我们将就之前您的研发团队需要的不只是表单审批流程曾提到许多开发团队, 尤其是包含软体或韧体开发的团队, 关心的需求: 对于每版是否发布成功, 我们需要检验每版产出是否正确, 且是否完成每版的需求. 谈谈可如何运用CodeBeamer, 帮助达成这个目标.

首先, 我们先来看CodeBeamer的版本管理. CodeBeamer的每个项目都有配置管理资料库, 您可在此建立版本管理的类别.  在此项目只要您预定要发布某个版本, 就把此版本加入为版本管理的项目, 您可自定版本管理的追踪表单和流程, 帮助版本的发布与维护. 利用这样的版本管理, 系统将自动帮您整理所有和此版本相关的事项, 如需求, 变更, 缺陷, 测试等(建议不要将Task加”目标版本”的字段, 因为Task是为了完成需求或变更而分发的, 对于每个版本是否完成, 应该检验需求, 变更, 缺陷, 集成测试即可). 收集的准则为只要您在CodeBeamer的追踪事项, 目标版本的字段值参考到此版本项目, 将自动被收罗, 并显示收罗事项的即时状态与相关信息.

如此您可总览之前,目前和预计进行的版本. 如下图, 并可看到每个版本进行的%.

上图中, 也许您也注意到每个版本还有Release Note(发布说明).  这里将自动帮团队整理出目标版本为此版且Closed( 已关闭)的事项(需求, 变更, 瑕疵, 整合测试).

延伸阅读: CodeBeamer版本管理

至于每个事项应如何来把关? 是否可以Closed(关闭)? CodeBeamer也在每个事项中让您方便查看. 如需求的事项, 如果哪些Task或Test为此需求完成的必要事项, 我们将于Task和Test的表单中加入”相关需求”的参考字段. 这些Task和Test将自动列入相关需求的参考列表. 项目经理只需要去查核此需求的参考列表中的事项状态是否完成, 即可了解每一需求完成的状况.

同理也可如此检验变更和缺陷. 有关集成测试, 在CodeBeamer上, 您可以运用Trackers(追踪)中的Test, 追踪所有集成测试的工作, 包含Test Case, 是否已通过测试成功结案.   此外, 嵌艺创研也可帮助您集成CodeBeamer与Jenkins, 就使用团队的开发性质做不同开发语言和平台的Continuous Integration.

我们于最近也听到一些相关需求方面的问题, 如”我们的需求文件都是采用Words档写的或来自客户给我们的Words档, 有没有简单的方式送到CodeBeamer一一追踪呢?”  ”需求不断的修改, CodeBeamer可以让我清楚看出修改后和修改前的版本吗?”  如果您也有这方面的问题, 我们将于后续原厂的RM加值模组正式发布后, 继续跟您报告.  我们也已在新浪CodeBeamer微群透露过部分RM功能. 欢迎加入CodeBeamer微群.

 

DVCS分布式的版本控制图解说明

这篇DVCS(Distributed Version Control System)的文章, 深入浅出, 已征得原文作者的同意, 在此将他的文章翻译为中文. 

传统的版本控制辅助档案的备份,追踪与同步. 分布式的版本控制让变更的分享简单容易. 如果你做的对, 你可以鱼与熊掌兼得: 简单的合并同时并可以集中版本发布.

要分布式的吗? 一般的版本控制到底发生什么问题?

没有问题 — 如果你想快速回忆的话请参考VCS版本控制视觉指引 . 当然, 有些人可能会嘲笑你还在用”古老”的系统. 但在我看来仍然是OK的: 对于任何项目来说有用版本控制系统总是正向的一步. 集中的版本控制系统在1970年代出现, 当初程式设计者有了精简型终端机(thin clients)但同时也欣羨又大又贵又快速的”big iron” mainframes(谁能不被当时风行的大小通吃8bits到1 byte的机器吸引呢?)

集中管理是简单的概念, 很自然是第一步想到的:让每个人到同一个地方签入签出, 就像集中到某个图书馆的书本上注记一样.

如此的做法对于备份,复原和同步行得通, 不过对变更的合并与分支却不太行. 当项目成长时, 通常会想将功能切割, 独立开发与测试, 再逐步将变更并入主开发线. 实际做时, 分支就很麻烦, 新的功能可能要做庞大的签入, 如果中间有任何差错, 变更变得很难管理也很难做问题排解. 当然, 集中控管的系统也总有”可能”做合并, 但并不容易: 你需要亲自确实追踪合并的动作与内容, 以避免同样的变更被做两次. 分布式的版本控制系统让分支与合并无痛执行, 因为这是此类系统的长处. (译注: SVN支持Merge Tracking后就可以避免同样的变更会合并两次以上的问题)

 请看一些图解

别的教学多是严肃的命令列指令, 在此提供您视觉化的说明. 让你回想一下运用典型集中控管的版本库的状况:

每个人与主开发线同步也将档案签入主开发线: Sue加入soup, Joe加入juice, Eve加入eggs. Sue的变更必须先签入主开发线才会被其他人看到. 的确, 理论上, Sue可以另开一个新的分支让其他人测试她的变更, 可是在一般的版本控制系统(VCS)如此做很麻烦.

分布式版本控制系统(DVCS)

分布式模式, 每位开发者有他们自己的版本库. Sue的变动存在她个人端计算机的版本库,她可以决定是否要跟Joe或Eve分享:

不过是否有可能造成像无头的圆环一样循环呢? 不会的, 如果想要的话, 每个人可以将他的变动推(push)给同一个版本库, 存疑地, 就像上述集中的模式一般. 此人为的版本库(franken-repo)包含了Sue, Joe和Eve的变动.

我希望分布式版本控制DVC(distributed version control)可以有不同的名称, 如 “独立的(independent)”, “联合的(federated)” 或 “点对点的(peer-to-peer)”. 此字 “分散”让人联想到分布式运算, 工作被分派给一群机器(如寻找外星智慧讯号的 SETI@home {可参考SETI@home台湾网站} 或做 蛋白质摺叠分析Protein folding).

DVCS并不像Seti@home: 每一端(node)是各自独立的且是否分享由各端自我决定(在Seti, 你必须回覆你的结果)

5分钟说明主要观念

此给你基本概念; 如果你有兴趣, 可参考相关patch theory的说明书 .

核心概念

    • 集中式版本控制聚焦于同步,追溯(tracking), 和备份档案.
    • 分布式版本控制聚焦于变动分享; 每一变更有其 全域唯一辨识码(guid-global unique id)或unique id.
    • 记录/下载以及采用一个变更被视为分别的步骤 (在集中式系统, 此三者同时发生).
    • 分布式系统没有强制的架构. 你可以建立”中央管理”区或让个人保持各自端运作.

新术语

    • 推(push): 将变更送给其他的版本库 (应该需要其它版本库拥有者的允许)
    • 拉(pull): 从另一版本库下载同步档案变更

关键优势

    • 每人都有其本地端的沙盒(local sandbox). 你可以在自己的工作计算机上修改或回覆前版, 不需要大量的签入. 你自己的工作记录都累积存在自己的版本库.
    • 可离线工作. 你只有当你想分享变更时才需要上线. 否则你可随你高兴一直在自己的工作计算机上独立作业, 签入或复原, 没有所谓”伺服器”当掉或在飞机上的问题.
    • 速度很快. 差异(diff), 提交源码与变更回复都在本地端即可完成. 没有因网路或伺服器不稳而必须用一年前开发版本的问题.
    • 可妥善做变动的处理. DVCS针对分享的变更做建置. 每个变更都有其独一无二的辨识码(GUID)以方便追踪.
    • 分支与合并很容易. 因为每一开发人员”有自己的分支”, 每一分享的变动就像交换整合. 但独一无二的辨识码(GUID)让自动合并变更与避免重复合并动作变的简单容易.
    • 较少的管理. DVCS很容易执行; 没有所谓的“总在运作的”伺服器软体需要安装. 此外, DVCS也不太需要你去”加”新的使用者; 你只是去捡选你想从那里拉(pull)版本库的URLs. 这样可以避免大型项目中令人头痛的政治性问题.

关键劣势

    • 仍需要备份. 有个说法是你的“备份”就是其他人有你变更资料的终端机信息. 我无法认同—如果这些其他人终端机资料并没有采用你所有的变更呢? 或是当你变更的时候他们都不在线上? 用DVCS, 你仍希望可以有台机器让你push所有的变更到那里保存“以防万一”. (在Subversion, 你有一台随时待命的机器做主要的资料贮存库, 建议您在DVCS也做一样的事). (译注: 如有兴趣了解架设与管理DVCS服务器的工具, 欢迎参考CodeBeamer+Mercurial实务操作手册  CodeBeamer+Git实务操作手册
    • 没有所谓的“最近的版本”存在. 如果没有集中地, 你无法马上知道是否要到Sue, Joe或Eve那取得最近变更的版本(version). 再者, 一个中央集中地才可帮助大家清晰知道最近的”稳定版本”为何.
    • 没有真正的修订版号码(revision numbers). 每一版本库有依变更做出的修订版号码. 和传统的版本库不同的方法,人们依变更的修订号码做沟通: “请问你有变更号码 fa33e7b? ” (记住, 这ID是一个不好看的GUID总体唯一辨识码). 还好, 你可以用有意义的名字贴标你发布的版本.

Mercurial 快速上手(Quickstart)

Mercurial速度很快,是个简易的DVCS. 暱称是hg, 就像水银(Mercury)元素一样.
一旦Mercurial已经初始化一个目录, 看起来将如下:

你将有:

    • 一个工作拷贝(working copy). 你正在编辑的档案群.
    • 一个版本库. 一个目录(Mercurial的.hg)包含所有的补钉(patches)以及可转译资料(metadat:comments, guids, dates, etc.). 因为没有集中的伺服器, 所以这些资料都放在你这里.
在我们的分布式案例, Sue, Joe和Eve有他们各自的版本库, 储存他们不相干的修订版历史资料(revision histories).

理解更新(Updates)与合并(Merging)

在研究DVCS时有几项让我有些混淆. 第一, 有几步将造成更新(updates)

    • 取得变更到版本库:推(pushing) 或 拉(pulling)
    • 采用变更到档案中:更新(update) 或 合并(merging)
    • 储存新版:签入/提交源码(commit)

第二, 依据变更, 你可以更新或合并:

    • 当无模糊地带时,更新(Updates)发生. 譬如, 我将变更拉(pull)到一直以来都是你在编辑的档案. 因没有重叠的变更,档案将跳到最近的修订版(revision).
    • 当我们的变更发生冲突时,就有必要合并(Merge). 如果我们两个都去编辑档案,最后会变成两个”分支”, 类似平行宇宙(alternate universes-多种假设同时发展的各个故事)的样子. 有个我修改的世界, 也有个你修改的世界. 在此例, 我们可能想要合并成一个单一的宇宙.
我仍在整理DVCS到底可多容易的产生分支与摺叠分支:

在此案,因为 (+Soup) 和 (+Juice) 为同一个母项(parent-仅一个 “Milk”的列表)的变更, 有必要做合并(merge). 经过Joe合并档案后, Sue可以做一般的 “pull和update” 即可获得Joe已合并的结果. 她不需要亲自做合并的动作. .

在Mercuril, 你可如下执行:

是的, “pull-merge-commit” 周期蛮长的. 幸运地, Mercurial有整合多指令(commands)为单一的捷径. 虽说看起来好像蛮复杂的, 但仍比在Subversion手动合并简单多了.

大多数的合并是自动完成的. 当发生冲突时, 一般可以很快被解决. Mercurial持续追踪每一变更的母/子关系(我们的合并列表有两个母项), 与”最新版(heads)”或每一分支的最近变动. 在合并前我们有两个heads;之后, 一个.

组织一分布式项目

此为一种组织方式:

Sue, Joe和Eve将变更加入一共同的分支. 他们可以跟任一人交易补丁(patches)来做”兄弟建置(buddy builds)”:嘿 老兄, 请问要试试这些补丁吗? 在推给实验分支(experimental branch)前,我需要看看此是否可行.

然后, 经维护守门员在看过,将实验分支的变更拉到稳定的分支(stable branch), 此有最近的版本. 分布式的版本控制系统(DCVS)帮助每一变更独立进行, 但也提供集中系统所有的”单一来源(single source)”. 有多种开发的模式可用, 如”pull only”,此只有维护守门员决定是否要从别人拿取变更资料, Linux的开发采用此种,或”shared push”, 此和集中管理的系统作业模式很类似. DVCS让您弹性选择要采用哪种方法来维护您的项目.

练习和严厉批评以臻至善

我是DVCS新手,但很高兴分享我目前已了解的. 我觉得SVN很好用, 但觉得去了解如何可以让合并简单容易也有趣. 我的建议是你可以从Subversion起步, 感受一下什么是团队协同作业,再实验分布式的模式. 如果你适当的筹划, DVCS可以达到集中控管系统的效果, 你也同时可享有简易合并的好处.

线上资源


从Linus演说影片节录:

    • “How many have done a branch and merged it? How many of you enjoyed it?”
    • “When you do a merge, you plan ahead for a week, then set aside a day to do it.”
    • “Some people have 5, 10, 15 branches”. One branch is experimental. One branch is maintenance, etc.
    • “CVS — you don’t commit. You make changes without committing. You never commit until it passes a giant test suite. People make 1-liner changes, knowing it can’t possibly break.”

所以呢…. 祝好运囉, 密切注意圣战状况…

VCS版本控制图解指引-A Visual Guide to Version Control

以下为我们翻译的”VCS(Version Control System)的图解说明”所参考的说明版本控制文章, 这篇文章采用图解说明,清楚且容易了解,征得作者的同意,在此将他的文章翻译为中文, 原文的网址为

http://betterexplained.com/articles/a-visual-guide-to-version-control/

版本控制(又称Revision Control或Source Control) 让您随时追踪档案的内容变动.为什么你要关心这档事? 这样当你搞砸时可以很简单的回复前一工作版本.你也许自己编造了版本控制系统, 却没发现你在用如下”天才”的档案名称. 你有这样的档案吗? (但愿..你没有完全和下面相同的…..)

  • KalidAzadResumeOct2006.doc
  • KalidAzadResumeMar2007.doc
  • instacalc-logo3.png
  • instacalc-logo4.png
  • logo-old.png

这就是为何我们都用“Save As”. 你想要新档不会将旧档盖掉. 这是常发生的问题, 解决方法经常像这样:

  • 做个独立备份拷贝 例如:Document.old.txt.
  • 如果我们够聪明, 我们加个版本号码或日期: 例如:Document_V1.txt, DocumentMarch2007.txt
  • 我们甚至会用共享目录, 这样其他人可以不用e-mail传档即可看到或编辑档案. 希望他们记得重取档案名再存回去.

所以呢…为什么我们需要Version Control System (VCS)?

运用分享的目录/命名系统对于典型的项目或一次完成的论文还可以. 可是对于软体开发的项目呢? 没有什么机会行得通的…
你可以想像在分享的档案夹中的Windows source code像“Windows2007-Latest-UPDATED!!”给大家来编辑吗? 那么每位程式设计师只会在各自的子档案夹工作? 不可能这么做的.
大型的, 同时多人参与编辑, 快速变更的项目需要一个版本控制系统(Version Control System )- “file database”的专业说法, 来追踪所有变更以避免混乱. 一个好的版本控制系统(VCS)应可满足以下需求:

  • 备份与复原. 档案在编辑时被储存, 你可以跳回之前的每一时刻所编辑的版本. 如你需要回溯到2007年2月23日的档案…没问题.
  • 同步. 让大家分享档案且随时可取得最新的版本.
  • 短期的版本回复. 随意玩弄档案或搞砸时? (你就是有可能如此, 不是吗?). 就把所做的变更扔掉吧, 并回到版本库(repository)中所知的”好”版本.
  • 长期的版本回复. 有时我们真的搞得太糟了. 假设你是在一年前做了这个不良的修改,产生了bug. 这系统应能帮你跳到那个版本, 并了解当时做了什么变动.
  • 追踪变动. 当更新档案时, 你可以留下为何变更的纪录(此要存在VCS,不是在档案里). 这样可以容易的看出这个档案随著时间的演进与原因.
  • 追踪负责人. VCS可以标出每个变更的人名,已示负责.
  • 沙盒(SandBoxing), 或自我的保险. 正在做大幅的变动吗? 你可以暂时到独立的区域做此变动, 测试, 将问题解开, 然后才将你的变动提交(check in)回去.
  • 分支与合并. 更大的沙盒(sandbox). 你可将你的程式码拷贝一份branch(分支)到独立的区域做修改, 并独立追踪在上面的变更. 过些时候, 再将你的工作成果合并到主要共同开发的区域.
分享的目录虽然快又简单, 但无法做到以上所说的这些功能.

学习相关用语

大多数的版本控制系统牵涉以下的观念, 有可能用词有点不同.
基本设定

  • 版本库(Repository or repo): 储存档案的数据库.
  • 伺服器: 版本库所在的计算机.
  • 局端(Client): 与版本库连线的计算机.
  • 工作组合或工作备份(Working Set/Working Copy): 你局端(Client)上的档案目录,与你工作编辑变更的地方.
  • 主开发线(Trunk/Main): 在版本库里存放程式码的主要地方. 将程式码想像为一个族谱(family tree)–”trunk”即为主支.

基本动作

  • 新增: 将一个档案第一次放进版本库, 也就是说开始用版本控制来追踪此档案
  • 修订版本(Revision): 一个档案位于哪个版本 (v1, v2, v3, etc.).
  • 版头(Head): 存在版本库的最新版本.
  • 签出(Check out): 从版本库下载一个档案.
  • 签入/提交(Check in): 如档案内容变动时,将档案上载到版本库. 此档案将获得新的版本号码, 别人将可”check out”最近的版本.
  • 签入/提交说明: 说明做了什么变动的简短讯息.
  • 变更历史纪录: 从一个档案成立起所经历的所有变更列表.
  • 更新/同步: 将你局端计算机中的档案与版本库的最新资讯做同步. 此可让您撷取到所有最新的档案.
  • 回复(Revert): 抛弃你局端计算机上的变更并叫出上次从版本库签出最新的档案版本.

进阶动作

  • 分支(Branch): 制作分开的档案/档案夹备份以便独立运作(解bug, 测试等等). 分支可说是动词(分支源码)也可说是名词(在哪一个”分支”?).
  • 差异分析(Diff)/变更/差异部分(Delta): 找出两的档案的差异. 可帮忙看出版本间的变动内容.
  • 合并/补钉(Merge/Patch): 将一个档案的变更运用到另一个, 使其为最新内容. 譬如, 你可以合并一个分支到另一个分支或是主开发线做功能的整合. (在Microsoft, 此称为 Reverse Integrate and Forward Integrate)
  • 冲突(Conflict): 当一个档案的变更与其他变更发生冲突时, 两者无法同时采用各自的变更.
  • 解决(Resolve): 解决变更的冲突问题并签入(check in)正确版本
  • 上锁(Locking): “掌控” 某档案至你解锁(unlock)此档案其他人才能编辑此档. 有的版本控制系统有这样的功能以避免同一档案中变更的冲突.
  • 强力解锁(Breaking the lock): 强迫解锁某一个档案以便编辑. 这个功能也许在某人把哪个档案锁起来后度假去了(或当Halo 3游戏发行那天”请病假”).
  • 签出编辑: 签出(Checking out)一档案的“可编辑”版本. 有些版本控制系统原始设定即有可编辑的档案,有的需要清楚的指令.
典型的剧情可发展如下:
Alice 新增一个档案(list.txt)到版本. 她将此档案签出,做了些变动(把 “milk”放到列表中),然后将此签入/提交, 同时写签入的说明 (”加入需要的项目.”). 隔天早上, Bob 更新 他计算机的工作备份, 看到最新list.txt的版本, 此含有“milk”. 他可以浏览变更历史纪录是做差异分析 看到Alice在前一天加了 “milk” .

视觉化案例

在此故意给您高阶的说明:大多的教学指引都给你一堆文字指令. 让我们走过高阶的观念,不在指令语法上打转( Subversion手册 永远都在那里, 不用担心). 有时去试探到底有什么可能性总是不错的.

签入/提交(Checkins)

最简单的情境是签入一个档案(list.txt)且花时间去修改它.

每次我们签入一个档案的新版, 我们就会得到一个新修订版(new revision-每个revision的内容含多个档案at different version) (r1, r2, r3, etc.). 在Subversion你将会做:

svn add list.txt
(modify the file)
svn ci list.txt -m "Changed the list"

此 -m 旗标(flag) 使用来做此签入的说明.

签出与编辑

实作上, 你有可能不是一直签入档案. 你应该是签出, 编辑签入. 这样的周期看起来如下:

如果你不喜欢你做的变更, 想重头来的话, 你可以回复到前一版本再重新来过(或就此停止). 当签出时, 原始设定让你取得最近的修订版本(revision). 如果你想要的话, 你可以指定所要的修订版(revision). 在Subversion, 执行:

svn co list.txt (get latest version)
...edit file...
svn revert list.txt (throw away changes)

svn co -r2 list.txt (check out particular version)

差异(Diffs)

主开发线(trunk)有档案变更的历史纪录. 差异是你编辑(editing)的变更内容 : 想像你可以 “剥下” 他们然后将他们放入一个档案:

例如, 从 r1 到 r2, 我们加入eggs (+Eggs). 想像剥出红标然后将其放入r1, 以变成r2.
又如要从 r2到 r3, 我们加入 Juice (+Juice). 由 r3 到 r4, 我们去掉 Juice 并加入 Soup (-Juice, +Soup).

大多数的版本控制系统 储存差异(DIffs)而非 所有档案的内容. 如此可以省磁碟空间: 4个版本并非指有 4个复制; 我们有1个复制和4个小小的差异. 很简洁, 是吧?

SVN, 我们如下做两个修订版(revisions)的差异:

svn diff -r3:4 list.txt

差异帮助我们看到变更内容(”你如何再次修正bug?”) 甚至用到一个branch和其他的比较.
加码问题: r1 到 r4的差异(diff)是?

+Eggs
+Soup

请注意“Juice”甚至完全没出现 — 若直接从 r1 跳到 r4 根部不需要此变更, 因为 Juice 被Soup盖掉了.

分支(Branching)

分支让我们拷贝程式码到一个独立的档案夹随意修改运用:

譬如, 我们可以开一个分支来实验新想法: 疯狂的事情像加入Rice和 Eggo waffles. 要看你用的是什么版本控制系统,有的系统在你开分支时会变动版本的号码. 好了, 现在我们有一个分支, 我们可以变更我们的程式码并实验我们的怪怪想法. (“嗯..waffles? 我不知道老板会怎么想. 打赌用Rice应该安全才对) 由于我们是在分开的分支上行事, 我们可以独立修改或测试, 看看这些修改会不会伤害其他的部份. 且在分支里的修改都有版本控管的历史纪录.

在Subversion,你可以很简单地将一个目录做个copy另取名字, 就可以开一个branch了.

svn copy http://path/to/trunk http://path/to/branch

如此分支不是个太艰深的观念: 假装你已拷贝你的程式码到另一个目录. 你有可能已将学校的项目的程式码做了分支, 确保你有一个安全的环境尝试失败版本以便如果搞砸了可以回复没问题的版本.

合并(Merging)

分支听起来很简单,对吧? 不过, 不见得喔 — 解决如何将一个分支的变更合并到另一个可以说很伤脑筋.

让我们假设要将 “Rice” 从我们实验性的分支并入主开发线(mainline). 我们要如何做呢? 做 r6 和 r7的差异分析(diff)然后将差异并到主线?

错错错. 我们只想取用在分支上做的变动. 意思是我们做 r5和r6的diff, 然后将diff送到主开发线 (main trunk):

如果你做r6 和 r7的差异分析, 我们将漏掉 “Bread” (译者注:因为r6和r7的diff将为-Bread, +Rice, 将这个diff加到r7, r8将少了Bread),而”Bread”应该在主开发线上. 这是精巧之处 — 想像从实验性branch“剥出”的变更(+Rice)并加进去主线. 主线上也许有别的变更, 如此做就没问题了-我们只是插入Rice功能.

在Subversion, 合并和差异分析非常相近. 请在主线上, 执行以下指令 :

svn merge -r5:6 http://path/to/branch

此在实验性的分支上所做的指令diffs r5-r6并将此diff加到目前所在. 不幸地, Subversion并没有简单的方法来追踪已做过那些合并,如果你不小心, 有可能会重并同样的变更. merge tracking为SVN改善计画中的功能, 目前我们劝你做好变更记录,提醒自己”r5-r6变动已合并到主开发线了”. (译者注:SVN1.5后已经开始支援merge tracking功能)

冲突(Conflicts)

大部分的版本控制系统可以自动合并一个档案不同地方的变更. 当有些变更显然无法黏合时冲突就出现了: Joe想要去掉eggs以cheese替代(-eggs, +cheese), 而Sue 想要以hot dog 替代eggs(-eggs, +hot dog).

此时竞赛产生: 若 Joe 先签入, 系统可自然接受此变更 (而后Sue就无法做她要的变更了).

当变更的地方相同且有像这样的冲突时, 版本控制系统将可能呈报冲突讯息(conflict)而不让你签入— 此时如果你是Sue, 你可以决定是否要签入一个解决(resolves)两难的新版本. 处理方法可为:

  • 重新导入你的变更. 先同步到最近的版本(r4)然后再到此最新版做你要的变更: 到此已经有cheese的列表加入hot dog.
  • 以你的变更去覆盖别人的变更. 将最新的版本(r4)签出,将你的版本内容拷贝过去 , 再签入. 结果, 这将把cheese换成hot dog.

虽然冲突不会常常发生, 但蛮恼人的. 通常我采用先同步到最近版本再将我的变更加进去.

标籤(Tagging)

谁曾想过版本控制系统竟然有Web 2.0的观念? 很多系统让你在任一想要的版本贴标籤tag(label)以方便参考. 如此你可以说参考”“Release 1.0″而不用指出在系统内特有的建置号码(build number):

在Subversion, 标籤跟分支编辑方法类似,只要你想要做即可执行; 此功能存在乃为了清楚之后所有版本的发展, 所以你可以完全清楚看出在 version 1.0的发布版本中内容为何. 且且就终止于此. 没有别的地方可去了. (译注: 也就是说标籤具有”冻结”的作用, 不会看到不相干的资讯)

(in trunk)
svn copy http://path/to/revision http://path/to/tag

实作的案例: 管理Windows开发程式

我们猜想Windows开发可运用其自己的分享档案夹来管理它的开发程式, 不过事实并非如此. 那么, 它是如何做的呢?

  • 有个主开发线, 此处存有稳定建置的Windows.
  • 每一个功能群组(网路, 使用者介面, 多媒体播放器, 等等.) 有他们自己的分支发展他们各自的功能. 相较于主开发线这些分支为正在开发中且较不稳定的发展内容.

你在新功能的分支开发,然后用“Reverse Integrate (RI)” 并回主线. 之后, 你 “Forward Integrate”且从主线拿到最近的变更并入你的分支:

 

假设我们在 Media Player 10 和 IE 6. Media Player 团队在他们的分支做了version 11. 当其完成并通过测试, 产生从10到11的patch, 此被主线采用 (就像 “Rice” 的例子, 不过复杂些 ). 此为reverse integration, 从branch到trunk. IE团队也可同样执行.

之后, Media Player 团队可以取得其他团队最近更新的程式码, 如IE的. 如此, Media Player forward integrates 并从主线获得最近的patches整合回他们的branch. 这有点像之前的例子去拉主线的”Bread”到实验性的branch, 但, 也是比较复杂.

所以这就是所谓的RI和FI. 哼哼, 这样的安排可以让变更先在分支互相协调, 也同时让新的程式码不干扰主线的稳定度. 酷吧 ?

事实上, 可以有很多层次的分支和副分支, 配合品管度量来决定你何时要做RI. 不过要知道: 分支帮助您处理复杂度. 现在你知道一个大型的软体项目基本上是如何组织了吧.

重点提示

我的目标是分享有关版本控管系统的高阶想法. 以下为基础要点: :

  • 使用版本控制. 认真告诉你,这是个好东西,就算你不是写OS那么大的东西. 就算单人用也值得.
  • 从小处著手(Take it slow). 我也是现在才开始为我的项目了解如何做分支和合并. 才开始要运用这样的功能来管理. 如果你的项目还小, 分支和合并可能不是个问题. 维护大项目的人应该对分支和补丁的追踪很有经验了.
  • 保持学习. 可以参考很多指引: SVNCVSRCSGitPerforce 或更多你正在使用的系统资料. 重要的是把观念搞清楚并意识到每个系统有它自己的行话和哲理. 也建议参考Eric Sink的 detailed version control guide.

以上是基础资料 — 随著时间我将分享我从做my projects学到的东西. 现在你已了解一般的版本控制系统(VCS),也可以看看 an illustrated guide to distributed version control (DVCS分布式版本控制系统图解说明).

译注: 如有兴趣了解简便安装与管理Subversion的工具, 欢迎参考 CodeBeamer+Subversion实务操作手册

要过关? 先给过关的资料吧….

这篇我们将针对“您的研发团队需要的不只是表单签核流程”中提到的需求一: 在”设计”这关, 我需要执行者呈交设计文档, 在”验证”那关, 我需要执行者提交测试总表和每项测试的结果.  聊聊如何在CodeBeamer实践.

这个需求其实并非在一个工作一气呵成, 而是对于多个工作, 检验是否完成应执行的事物. 一般的开发流程如下:

 

“开发执行”这个阶段, 包含设计或coding, 都需要提交文件, 有可能是机构图, UML的图, 也有可能是codes, 这些文档提交后, 经过自我测试或peer review后才算完工. 这里我们让”开发执行”的流程简化如下, 当然, 您可以就团队的需求制定较复杂的流程, 我们这里主要是要demo如何在每一status通过前, 必须确定有呈交相关文件, 以便于review:

在CodeBeamer上您可做以下的客制化:

  • 设计流程需过的关卡(Status选项)
  • 规置哪个Status只可转移到哪些Status, 由谁来移转(role或被指定者)
  • 预设每个流程移转时将出现的提示(Transition Hint)
  • 规范每个流程要转哪个Status时必填的字段

有关如何设置Tracker Transition, 请参考CodeBeamer使用者操作指引追踪的流程

以上设定完后, 流程操作将如下:
(1) 项目经理新增一工作, 系统将自动指派给开发部经理Mark
 (2) 开发部经理Mark收到通知, 看过此工作内容后, 指派给 Esabella

(3) Esabella收到通知, 于SVN(附注一) 开始执行开发, commit档案到SVN时顺便带个分派的工作#做好关联.  多次修改与commit后, Esabella确定完成, 便到CodeBeamer这个Task将Status修改为Implement, 系统将自动转Assign to给Esabella的主管 Mark, 并自动通知Mark

已提交档案并与Task做SCMLoop的链结

(4) Mark收到通之后, 便点入此Task, 看看关联的设计是否OK. 如果OK, Mark将把Status改为Finish.

在许多开发工作进行告一段落, 团队将进行Build和Release. 运用CodeBeamer的CMDB(配置管理数据库)中的version(release management), 可让您如上述的类似做法, 做版本发布的流程检验.  只要在SVN(附注一)tag后commit时带上相对的version item #(此例V1.1的#是13500), 系统将如下图于SCM提交出现tag的链结.

在CodeBeamer, 您可以将Build的结果放到CodeBeamer的文件区, 随手与此version item做关联.

完成如下版本管理流程中的Build & Tag, 即可让系统于Status转换时顺便通知品管部门的主管安排测试.

版本管理

如果您记得前述的”一般开发流程”的图, 照理说品管部门应该是在”规格厘清”后就可以开始做测试计画.  不过在版本管理的流程这边, 我们将”完成测试计画(Test Plan Done)”放在Build之后, 主要是要让Build版本接著就要接受测试检验.  有关测试计画如何做, 您也不妨参考一下”协同作业的测试用例管理“视频上所提的协作概念把计画中的Test Cases运用tracker完整列表, 确定计画完成时, 即可导出成Excel表, 放到CodeBeamer上相对项目的Documents(文档)区/Test Plan档案夹中.  置入文档后, 即可到此版本V1.1关联此文档, 并将此版本的Status改为Test Plan Done.  在转Test Plan Done的同时, 系统将依项目经理设定, 自动转给执行Test Plan者(我们假设是Kiwi).

George提交Test Plan Excel档

test plan excel档与V1.1版本关联后, 转status为Test Plan Done, 并填入Test Plan Submit Date. 将请Kiwi执行计画的Test工作.

Kiwi收到Test Plan Done的通知后, 可以将Test Plan中的Test Cases输入到CodeBeamer上此项目的Test追踪, 指派不同人来做测试, 如”协同作业的测试用例管理“视频中所介绍的测试工作追踪部分.  当所有的Test Case完成后, Kiwi负责将这些追踪事项导出成一个Excel档, 再放到CodeBeamer此项目Documents(文档)的Test Result档案夹中. 然后到此版本(V1.1)做和此Excel文档关联的动作(association), 并将Status改为Test Passed 或 Test Failed.

Kiwi submit the Test Result on Documents

过Test Passed关时, 必须确定已关联提交的Test Result并填入Test Result Submit Date

如果是Test Passed:CodeBeamer可让您预先设定Status变动同时自动指派多人, 如品管部经理,开发部经理与项目经理, 系统将自动通知被指派人.  如此品管部经理知悉这版没问题, 开发部经理知道他要准备Deploy, 项目经理收到通知即可做正式的版本Release, 再转开发部经理做Deploy.

如果是Test Failed:CodeBeamer可让您预先设定Status变动同时自动指派品管经理, 开发部经理和项目经理. 如此品管部经理知悉这版有问题, 开发部经理需要找组员解决这版的问题, 以做下一版的Build和Tag, 项目经理负责将这版以失败结案.

由上面的案例, 您可能清楚看到每关需要关联的codes 或文件, 都能让把关的人很轻松找到以便查核检验.   此外, CodeBeamer的Tracker(追踪)还可以在过关时自动指派给特定人或角色.  如果您到JavaForge (CodeBeamer架的Open Source开发网)去新增个项目试用看看, 您还会发现CodeBeamer的Tracker(追踪)有许多一般open source没有的功能:

  1. 不同的角色在每一状态可读写的表单字段可随需求设定
  2. 过关时的介面依设定显示状态移转时的提示句
  3. 可预设过关时将自动填入哪些字段数据(包含在某日期字段自动填入当下过关时间)
  4. 可设置过关时的必填字段, 如果没有填将无法过关
  5. 可规定某关只能指派给哪种角色的人
  6. 如果启动staff功能, 还能设定特定角色中的哪几个人才能被指派过关
  7. 对于critical的事件, 不能让一人前后关都自己核准
  8. 可设置危机处理条件, 系统自动发警告通知相关人或做状态更换(Escalation Management)
  9. 双向链结多个文档, 追踪事项或 版本控制系统中的commit codes
  10. 字段有逻辑运算功能

以上还没提到CodeBeamer中最强大的功能:帮您整理所有相关的追踪资料, 以便了解这版Release或这个需求到底完成多少? 有哪些还没做? 以上说明也许您可能觉得已有部分做到”您的研发团队需要的不只是表单审批流程“中所提的另一客户常问的需求:对于每版是否发布成功, 我们需要检验每版产出是否正确, 且是否完成每版的需求.   我们将另辟篇幅做Traceability方面的说明, 并跟各位报告目前原厂正在进行的Requirement Managment加值功能.

CodeBeamer有免费测试版, 欢迎到http://cb.esast.com 注册下载并跟我们申请标准完整功能的试用License玩玩看喔.

附注一: CodeBeamer的SCMLoop除了支持Subversion(SVN)外,也支持CVS, Git, Mercurial

紧急事件太多, 怎么办?CodeBeamer+Mylyn帮您在这状况下仍能有效工作

相信您在公司工作, 应该有正进入状况,如作家文思泉涌般地专心写程式或某个文件的时候,突然项目经理或业务来通电话问工作进度,或请你解决问题,或问客户需求是否可以做到…等等…..使得您不得不先中断目前的工作,来回应紧急要求的经验.

根据我们之前曾做的研发团队问卷调查第12个问题:”您觉得团队最需要先解决的是什么问题”. “紧急事件太多” 排在前三名. 可想而知大家在办公室常常受到打扰, 很难专心一致地把一件事完成后再去进行下一件. 如此便必须常在做Content Switch–工作内容转移, 但Content Switch对Performance真是一大杀伤力. 如何降低这杀伤力呢?

这里, 我们想介绍您CodeBeamer+Mylyn的解决方案, 帮助您在这样的状况下也能有效的工作.

先介绍Mylyn:
请先看这个图

如Task 1047为工作被打断当下的活动(Activity),您在Mylyn设定这个Task为Active Context.如此,在开发的时候,Mylyn将于背景记录您所做的每件事,包含你点过的Class、member function,修改过的function、档案等等. 所以当工作突然被中断,非去处理其他工作或是问题时,Mylyn让您可比较接近电脑对于Context switch的多工模式,帮您留住先前Task Context,当您再度回到这个工作时(设此工作回active), Mylyn将开启那时这个工作所修改的function或files,唤起您先前的记忆,听起来很神奇吧! 您如果运用Mylyn,就有这样的好处.

但Task来自那里呢?  我们建议您可运用CodeBeamer+Eclipse+Mylyn的集成, 让Task来自项目的协同作业系统CodeBeamer.  如此, 在项目排工作时, 工作已经同步到Eclipse和Mylyn, 您在工作中, 即可在工作的IDE将您的工作表现反应给您的主管、项目经理或工作伙伴, 更方便地与相关人讨论, 并获得其他人的支援. 请看CodeBeamer+Eclipse+Mylyn的CodeBeamer Eclipse Studio功能操作说明.

CodeBeamer Eclipse Studio功能操作说明
  • Eclipse Studio安装
设置CodeBeamer connector for Mylyn
设置CodeBeamer的追踪(Tracker)同步到Eclipse的工作事项列表的查询条件
  • 工作事项编辑与CodeBeamer同步
显示工作事项的详细信息
在Eclipse中修改工作事项并保存修改-离线作业
新增工作事项并同步回CodeBeamer
将有修改的工作事项同步回CodeBeamer
将CodeBeamer服务器端的工作事项变更同步到Eclipse工作事项
恢复工作事项变更到原本设置
创建子工作事项
直接连到对应的CodeBeamer网页
Eclipse工作列表与CodeBeamer定期同步一次
桌面通知
  • 个人工作事项排程
排程功能介绍
如何排程
  • 工作事项列表筛选器的使用
依分类(Categorized)显示工作列表
依排程(Scheduled)显示
依流向(Incoming/Outgoing)分类显示
  • 使用Mylyn集成功能
设置目前进行中的工作事项
切换进行中的工作事项
回到上个工作的Context
将工作事项的Context导出到CodeBeamer, 与工作伙伴共享工作的Context
从CodeBeamer导入工作事项的Context
SCMLoop集成-提交原代码自动工作事项ID填入
  • 结语

您的研发团队需要的不只是表单审批流程

推行CodeBeamer多年来, 有的客户问过如下的问题:
公司内已经有流程控管工具,  为什么研发团队还需要像CodeBeamer这样的开发协同作业解决方案?

但同时我们也遇到一些客户, 内部已经有Lotus Notes, 或有SharePoint, 或已经买了流程引擎, 可以自行开发工具, 虽然他们看似有马上能运用到开发流程中的工具, 但还是会来询问CodeBeamer, 有的也购买CodeBeamer, 为什么呢?

原因如下:

自制工具开发赶不上需求: 如果有一现成的工具只要设定一下就可以达到80%的需求(我们不敢说100%, 因为开发项目的方便性需求永远都有进步空间), 马上上线, 另外是利用既有的流程引擎、 Lotus Notes、SharePoint, 需要找专门的人花半年以上的时间来开发, 且功能还没有前一种工具完整, 您会选择哪一种?  我们曾遇过几个案例客户告诉我们CodeBeamer看来可以达到需求, 但高层仍想省钱自己自制, 一年后我们询问, 还是用原来土法炼钢的方式, 问题依然存在.  为什么呢?  一是没有人力资源厘清需求, 常常我们估计的是开发需要的时间, 但将规格具体化所花的时间可能跟开发需要的时间一样多, 如果需求单位一忙, 更可能把这样的系统制作无限延期了.  另一个是公司内有现成的MIS部门, 但MIS没有相对的人才, 或事情太多, 还没排到这个工具的开发.  与流程引擎、 Notes、 SharePoint相较, CodeBeamer就像已经煮好的菜, 而流程引擎、Notes、 SharePoint比较像是煮菜的材料. 当然, 他们也有厨师, 专门的SI, 您可以雇用他们来帮您制作.  只是这种单独为您的公司制作的产品, 基本上还没经过市场验证, 我们曾遇过一家上市公司, 公司的MIS请了国际级的SI开发了一套追踪流程管控的工具, 但系统跑起来很慢, 且他们的人看过CodeBeamer, 觉得系统功能都还不及CodeBeamer, Performance更不用说. 这家上市公司当初花的开发费用来买CodeBeamer都绰绰有余, 但系统好不容易开发完成, 没人敢说要去撤掉, 只能回去继续花钱改善囉, 遇到这种客户我们也爱莫能助….
现成的工具, 如CodeBeamer, 等于是其他人已经就市场大多数的需求为您开发好工具, 也帮您先检验过了, 您只要看适不适用就可以了, 且公司不用养专门的开发和维护此系统的人力资源. 您说要自制还是买现成的?

自制工具永续维护的问题:  对于高段的web工程师, 看到CodeBeamer的第一眼是…我来写应该很快就可以写好吧(因为介面看起来很简单易懂)…但我们常常只看到表面, 估算到写出类似介面的时间, 很可能漏掉程式运作的信息流细节, 以及debug和后续维护所需的人力和时间的成本.  以我们多年推广CodeBeamer的经验, 我们看过可能出资老板仔细想想都会觉得很不值得的案例, 如原本高薪雇用来开发高科技产品的高手, 发现团队需要一个辅助大家协同作业的系统, 就卯足劲下来自制工具(从open source来修改或自己来写). 到最后这位高手到底是来开发产品, 还是来开发工具, 就厘不清了.   当然, 最好他能永远留在这家公司服务, 不然我们看过人离开后, 系统就跟著废了的问题.  此外, 如果是由公司的MIS来操刀自制, 除非MIS做出让研发单位能自己很简单修改流程的介面, 不然当使用单位有任何流程变动, MIS的人就得随时待命, MIS一方面要负责全公司所有的系统, 又要操刀做专门给研发使用的系统, 多少会力不从心, 在某个程度, 这样的系统在MIS部门的绩效评估中是比较不重要的(因系统使用者非全公司人员,  如果是制造业, 还是以生产相关的ERP系统为主), 如果能一版定型, 当然就最好囉, 但事实常常不是这样.. 可是, 您说开发团队的品质和效率对公司不重要吗?  ……那…后续改进什么时候做呢?慢慢排吧…
如果采用专业公司生产的研发团队协同作业解决方案, 像CodeBeamer, 就不会发生这样的问题, 且系统也随著市场需求跟著升级, 如果有任何使用上的问题, 也可得到专业的服务.

流程表单没有关联研发产出的内容: 流程表单的重点多在如何将表单传给不同的人去审批, 至于每关完成了什么就不是那么重要.  可是, 研发/开发是知识生产的工作, 非一般性事务(差勤,请款….), 是否过关, 不检查产出内容怎么可以过关?  这内容绝对不是attachment就能解决的, 更糟的是…如果产出内容会随著时间变动, 你要如何去把关呢?  这时, 支持版本控制工具就很重要了.  CodeBeamer提供有版本控制的文件管理, 也支持CVS、 Subversion、Git、Mercurial等市场最夯的版本控制工具, 这些信息都可和每个跑流程的事项做双向的连结.  且CodeBeamer对于Subversion, Git, Mercurial还有Repository Management的功能, 这是大多数来询问CodeBeamer最大的主因.

说到这里, 我想到两个客户常提的需求, 让您看看为什么需要关联研发产出的内容, 甚至有的还需要多方的关联事件与每个事件产出的审查才能确定是否可以批准过关:
需求一: 在”设计”这关, 我需要执行者呈交设计文档, 在”验证”那关, 我需要执行者提交测试总表和每项测试的结果.
需求二: 对于每版是否发布成功, 我们需要检验每版产出是否正确, 且是否完成每版的需求

以上两项看似流程的需求, 但重点都在检验内容和是否完成该做的事项.  如果您只采用一般的表单审批的概念来进行研发的管理, 对于流程当下的检验与后续的维护也只能多仰赖人治罗.  如此, 把关的人真的很辛苦, 后续维护的人也不好回溯.  所以您的研发团队需要的不只是表单审批流程, 应该想想是否有更方便的工具将团队的研发产出和所有相关事项串连起来, 让大家都获得即时的信息, 这样大家一起帮忙过关, 才能过得轻松实在呀.

后续我们将于别篇部落格说说以上两个需求可以如何在CodeBeamer上实行.

 

CodeBeamer+Subversion的集成功能与使用说明

Subversion目前应该是企业中最受欢迎的版本控制软件, CodeBeamer有内建Subversion管理功能, 这个功能相当便利, 这个功能不是只有做 “链结” 与 “同步” 而已, 而是让你在管理与推导Subversion的过程中更轻松, 这样的集成解决了以下几个问题.

  1. 减轻Subversion版本库(Repository)的管理负担,例如:版本库建置,使用者管理,权限控管. 这些功能透过CodeBeamer的Web人机介面就可以管理,并且可将版本库的建置权限开放给有权限的项目管理者来建置
  2. 让Subversion版本库与项目有相依或是对映的关系, Subversion版本库越建越多, 可是这个版本库是属于哪个项目?? 这个版本库还在维护吗? 还是已经结案?? 使用CodeBeamer来管理Subversion版本库这个问题迎刃而解.
  3. Subversion仅是一个档案与原始码的版本控制软件,但是原始码与Issue(例如:工作,Bug,变更,需求)要如何做到Traceability??透过CodeBeamer建置版本库, CodeBeamer就会将这个版本库与项目建置关系, 并设置好Hook script, 让开发者在送交(commit)原始码的时候就可以与Issue建置关连. 在CodeBeamer中就可以看到原始码变更与Issue之间的关系. Traceability可做到从Issue观看关联的是哪些原始码, 或是透过CodeBeamer Web端的版本库浏览介面从原始码变更记录观看关连是哪些Issue.

为了客户可以快速使用CodeBeamer来建置Subversion服务器, 嵌艺创研提供一份Step By Step的文件, 只要照著做, 就可以马上感受到使用CodeBeamer来管理Subversion服务器的好处, 如果你是Subversion网管人员, 不用再使用指令帮你的同事来建置SVN版本库与设置权限, 这些工作甚至可以让项目管理者来做就可以了, 这份文件请登入http://cb.esast.com后, 点选http://cb.esast.com/cb/wiki/35398.

这份文件除了说明CodeBeamer的Subversion管理功能, 也同时说明了

  1. CodeBeamer 5.7版起一个项目可建置多个SVN版本库,与svn:external的用法
  2. Apache+SVN+CodeBeamer的安装与设置

如果您已经是CodeBeamer客户, 可再读一次以温故而知新:-)

在阅读这份文件与测试过程有任何问题, 欢迎透过CodeBeamer技术支持这个Help Desk与我们讨论您遇到的问题

 


					

利用CodeBeamer Forum做多元的团队知识收集与分享和高效有序的客户服务

采用CodeBeamer的收件箱( inbox) , 您可让系统内的某个论坛(forum)接收某邮件帐号的所有收件, 让系统储存与查找.

开发团队可利用收件箱(inboxes)的功能让CodeBeamer的论坛成为某些社交网知识的收集箱, 如某Linux社群, Android社交网, iPhone/iPad开发社交网, 或Java, C语言, 或 CMMI, ITIL,软件工程等社群的讨论, 对于某些专案或整个团队的实力建设将有很大的帮助的话, 团队可考虑到这些社交网订阅讨论内容, 将这些主题订阅送到不同的电子邮件位址, 然后做CodeBeamer对应论坛的设置, 这些对应论坛将成为团队收集与分享的特定知识区. 团队成员也将可利用CodeBeamer上的全文检索查找到所收集的资料.

另外, 收件箱(Inboxes)也可做为您不同产品线的问题收集站和服务区. 如A产品线的服务信箱为a@company.com, B产品的服务信箱为b@company.com. 公司可对外告知客户针对不同产品的问题请反应到哪些特定的信箱. 然后,利用CodeBeamer的收件箱(inboxes)的设定, 寄到A产品线服务信箱的问题将被收集到CodeBeamer相对专案的”A产品问题”论坛, 并通知A产品的服务工程师, B产品或C产品亦然.

以上的运用让团队的知识收集与分享更加方便, 也能更加敏捷有效的服务客户.

如何设置收件箱(inbox)功能, 欢迎注册/登入http://cb.esast.com/cb/wiki/35690