- 浏览: 307373 次
- 性别:
- 来自: 合肥
文章分类
最新评论
-
Xiaoanemy:
我怎么就是不行Error opening zip file o ...
javarebel不用再反复重启tomcat -
fly_hyp:
lvwenwen 写道相对hessian来说有其他什么优势?应 ...
一个很牛的架构组件(Dubbo) -
lvwenwen:
相对hessian来说有其他什么优势?
一个很牛的架构组件(Dubbo) -
dj4307665:
想了解下,相对hessian来说有其他什么优势?
一个很牛的架构组件(Dubbo) -
fly_hyp:
sweat89 写道怎么解决的啊?忘了。怎么说呢?自己写的代码 ...
Spring之恶心错误记录
几个软件研发团队管理的小问题
最近在与一位总经理交流的时候,他谈到他们公司的软件研发管理,说:“我们公司最大的问题是项目不能按时完成,总要一拖再拖。”他问我有什么办法能改变这个境况。从这样一个问题开始,在随后的交谈中,又引出他一连串在软件研发管理中的遇到的问题,包括:
. 现有代码质量不高,新来的开发人员接手时宁愿重写,也不愿意看别人留下的“烂”代码,怎么办?
. 重构会造成回退,怎样避免?
. 有些开发人员水平相对不高,如何保证他们的代码质量?
. 软件研发到底需不需要文档?
. 要求提交代码前做Code Review,而开发人员不做,或敷衍了事,怎么办?
. 当有开发人员在开发过程中遇到难题,工作无法继续,因而拖延进度,怎么解决?
. 如何提高开发人员的主观能动性?
其实,每个软件研发团队的管理者都面临着或曾经面临过这些问题,也都有着自己的管理“套路”来应对这些问题。我把我的“套路”再此絮叨絮叨。
1. 项目不能按时完成,总要一拖再拖,怎么改变?
找解决办法前,当然要先知道问题为什么会出现。这位总经理说:“总会不断地有需求要改变和新需求提出来,使原来的开发计划不得不延长。”原来如此。知道根源,当然解决办法也就有了,那就是“敏捷”。敏捷开发因其迭代(Iterative)和增量(Incremental)的思想与实践,正好适合“需求经常变化和增加”的项目和产品。在我讲述了敏捷的一些概念,特别是Scrum的框架后,总经理也表示了对“敏捷”的认同。
其实仔细想想,这里面还有一个非常普遍的问题。对于产品的交付时间或项目的完成时间,往往由高级管理层根据市场情况决策和确定。在很多软件企业中,这些决策者在决策时往往忽略了一个重要的参数,那就是团队的生产率(Velocity)。生产率需要量化,而不是“拍脑门子”感觉出来的。敏捷开发中有关于如何估算生产率的方法。所以使用敏捷,在估算产品交付时间或项目完成时间时,是相对较准确的。Scrum创始人之一的Jeff Sutherland说,他在一个风险投资团队做敏捷教练时,团队中的资深合伙人会向所有的待投资企业问同一个问题:“你们是否清楚团队的生产率?”而这些企业都很难做出明确的答复。软件企业要想给产品定一个较实际的交付日期,就首先要弄清楚自己的软件生产率。
2. 现有代码质量不高,新来的开发人员接手时宁愿重写,也不愿意看别人留下的“烂”代码,怎么办?
这可能是很多软件开发工程师都有过的体验,在接手别人的代码时,看不懂、无法加新功能,读代码读的头疼。这说明什么?排除接手人个人水平的因素,这说明旧代码可读性、可扩展性比较差。怎么办?这时,也许重构是一种两全其美的办法。接手人重构代码,既能改善旧代码的可读性和可扩展性,又不至于因重写代码带来的时间上的风险。
从接手人心理的角度看,重构还有一个好的副作用,就是代码重构之后,接手人觉得那些原来的“烂”代码被修改成为自己引以自豪的新成就。《Scrum敏捷软件开发》的作者Mike Cohn写到过:“我的女儿们画了一幅特别令人赞叹的杰作后,她们会将它从学校带回家,并想把它展示在一个明显的位置,也就是冰箱上面。有一天,在工作中,我用C++代码实现了某个特别有用的策略模式的程序。因为我认定冰箱门适合展示我们引以为豪的任何东西,所以我就将它放上去了。如果我们一直对自己工作的质量特别自豪,可以骄傲地将它和孩子的艺术品一样展示在冰箱上,那不是很好吗?”所以这个积极的促进作用,将使得接手人感觉修改的代码是自己的了,而且期望能够找到更多的可以重构的东西。
3. 重构会造成回退,怎样避免?
重构确实很容易造成回退(Regression)。这时,重构会起到与其初衷相反的作用。所以我们应该尽可能多地增加单元测试。有些老产品,旧代码,可能没有或者没有那么多的单元测试。但我们至少要在重构前,增加对要重构部分代码的单元测试。基于重构目的的单元测试,应该遵循以下的原则(见《重构》第4章:构筑测试体系):
- 编写未臻完善的测试并实际运行,好过对完美测试的无尽等待。测试应该是一种风险驱动行为,所以不要去测试那些仅仅读写一个值域的访问函数,应为它们太简单了,不大可能出错。
- 考虑可能出错的边界条件,把测试火力集中在哪儿。扮演“程序公敌”,纵容你心智中比较促狭的那一部分,积极思考如何破坏代码。
- 当事情被公认应该会出错时,别忘了检查是否有异常如期被抛出。
- 不要因为“测试无法捕捉所有Bug”,就不撰写测试代码,因为测试的确可以捕捉到大多数Bug。
- “花合理时间抓出大多数Bug”要好过“穷尽一生抓出所有Bug”。因为当测试数量达到一定程度之后,测试效益就会呈现递减态势,而非持续递增。
说到《重构》这本书,其实在每个重构方法中都有“作法(Mechanics)”一段,在重构的实践中按照上面所述的步骤进行是比较稳妥的,同时也能避免很多不经意间制造的回退出现。
4. 要求提交代码前做Code Review,而开发人员不做,或敷衍了事,怎么办?
如果每个开发人员都是积极主动的,Code Review的作用能落到实处。但如果不是呢?团队管理者需要一些手段促使其有效地进行Code Review。首先,我们采用的Code Review有2种形式,一是Over-the-shoulder,也就是2个人座在一起,一个人讲,另一个人审查。二是用工具Code Collaborator来进行。无论哪种形式,在提交代码时,必须注明关于审查的信息,比如:审查者(Reviewer)的名字或审查号(Review ID,Code Collaborator自动生成),每天由一名专职人员来检查Checklist中的每一条,看是否有人漏写这些信息,如果发现会提醒提交的人补上。另外,某段提交的代码出问题,提交者和审查者都要一起来解决出现的问题,以最大限度避免审查过程敷衍了事。
博主Inovy在某个评论说的很形象:“木(没)有赏罚的制度,就是带到厕所的报纸,看完就可以用来擦屁股了。”没有奖惩制度作保证,当然上面的要求没有什么效力。所以,当有人经常不审查就提交,或审查时不负责任,它的绩效评定就会因此低一点,而绩效的评分是跟每年工资涨落挂钩的。说白了,可能某个人会因为多次被查出没有做Code Review就提交代码,而到年底加薪时比别人少涨500块钱。
5. 软件研发到底需不需要文档?
软件研发需要文档的起原可能有2种,一是比较原始的,需要文档是为了当开发人员离职后,企业需要接手的人能根据文档了解他所接手的代码或模块的设计。二是较高层次的,企业遵从ISO9001质量管理体系或CMMI。
对于第一种,根源可能来自于两个方面:
- 原开发人员设计编码水平不高,其代码可读性较差。
- 设计思想和代码只有一个人了解,此人一旦离职,无人知道其细节。
在编码前写一些简单的设计文档,有助于理清思路,尤其是辅以一些UML图,在交流时也是有好处的。但同时,我们也应该提高开发人员的编码水平增加其代码的可读性,比如增强其变量命名的可读性、用一些被大家所了解的设计模式来替代按自己某些独特思路编写的代码、增加和改进注释等等,以减少不必要的文档。另外推行代码的集体所有权(Collective Ownership),避免某些代码只被一个人了解,这样可以减少以此为目的而编写的文档。
对于第二种,情况有些复杂。接触过敏捷开发的人都知道《敏捷宣言》中的“可以工作的软件胜于面面俱到的文档”。接触过CMMI开发或者ISO9001质量管理体系的人知道它们对文档的要求是多么的高。它们看起来水火不相容。但是,它们的宗旨是一致的,即:构建高质量的产品。
对于敏捷,使用手写用户故事来记录需求和优先级的方法,以及在白板上写画的非正式设计,是不能通过ISO9001的审核的,但当把它们复印、拍照、增加序号、保存后,可以通过审核。每次都是成功的Daily Build和Auto Test报告无法证明它们是否真正被执行并真正成功,所以不能通过ISO9001的审核。但添加一个断言失败(类似assert(false)的断言)的测试后,则可以通过审核。
CMMI与敏捷也是互补的,前者告诉组织在总体条款上做什么,但是没有说如何去做,后者是一套最佳实践。SCRUM之类的敏捷方法也被引入过那些已通过CMMI5级评估的组织。很多企业忘记了最终目标是改进他们构建软件及递交产品的方式,相反,它们关注于填写按照CMMI文档描述的假想的缺陷,却不关心这些变化是否能改进过程或产品。
所以敏捷开发在过程中只编写够用的文档,和以“信息的沟通、符合性的证据以及知识共享”作为主要目标的质量体系文档要求并不矛盾。在实践中,我们可以按以下方法做,在实现SCRUM的同时,符合审核和评估的要求:
- 制作格式良好的、被细化的、被保存的和能跟踪的Backlog。复印和照片同样有效。
- 将监管需要的文档工作也放入Backlog。除了可以确保它们不被忘记,还能使监管要求的成本是可见的。
- 使用检查列表,以向审核员或评估员证明活动已执行。团队对“完成”的定义(Definition of “Done”)可以很容易转变为一份检查列表。
- 使用敏捷项目管理工具。它其实就是开发程序和记录的电子呈现方式。
总而言之,软件研发需要文档(但文档的形式可以是多种多样的,用Word写的文字式的文件是文档,用Visio画的UML图也是文档,保存在Quality Center中的测试用例也是文档),同时我们只需写够用的文档。
6. 当有开发人员在开发过程中遇到难题,工作无法继续,因而拖延进度,怎么解决?
这也是个常遇到的问题。如果管理者对于某个工程师的具体问题进行指导,就会陷入过度微观管理的境地。我们需要找到宏观解决办法。一,我们基于Scrum的“团队有共同的目标”这一规则,利用前面提到的集体所有权,当出现这些问题时,用团队中所有可以使用的力量来帮助其摆脱困境,而不是任其他人袖手旁观。当然这里会牵扯到绩效评定的问题,比如:提供帮助的人会觉得,他的帮助无助于自己绩效评定的提高,为什么要提供帮助。这需要人力资源部门在使用Scrum开发的团队的绩效评估中,尽量消除那些倾向个人的因素,还要包含团队协作的因素,广泛听取个方面的意见,更频繁地评估绩效等等。
二,即使动用所有可以使用的力量,如果某个难题真的无法逾越,为了减少不能按时交付的风险,产品负责人应当站出来,并有所作为。要么重新评估Backlog的优先级,使无法继续的Backlog迟一点交付,先做一些相对较低优先级的Backlog,以保证整体交付时间不至于延长;要么减少部分功能,给出更多的时间去攻克难题。总之逾越技术上难关会使团队的生产率下降,产品负责人必须作出取舍。
7. 有些开发人员水平相对不高,如何保证他们的代码质量?
当然首先让较有经验的人Review其要提交的代码,这几乎是所有管理者会做的事。除此之外,管理者有责任帮助这些人(也包括水平较高的人)提高水平,他们可以看一些书,上网看资料,读别人的代码等等,途经还是很多的。但问题是你如何去衡量其是否真正有所收获。我们的经验是,在每年大约3月份为每个工程师制定整个年度的目标,每个人的目标包括产品上的,技术上的,个人能力上的等4到5项。半年后和一年后,要做两次Performance Review,目标是否实现,也会跟绩效评定挂钩。我们在制定目标时,遵循SMART原则,即:
Specific(明确的):目标应该按照明确的结果和成效表述。
Measurable(可衡量的):目标的完成情况应该可以衡量和验证。
Aligned(结盟的):目标应该与公司的商业策略保持一致。
Realistic(现实的):目标虽然应具挑战性,但更应该能在给定的条件和环境下实现。
Time-Bound(有时限的):目标应该包括一个实现的具体时间。
比如:某个人制定了“初步掌握本地化技术”的目标,他要确定实现时间,要描述学习的途经和步骤,要通过将技术施加到公司现有的产品中,为公司产品的本地化/国际化/全球化作一些探索,并制作Presentation给团队演示他的成果,并准备回答其他人提出的问题。团队还为了配合其实现目标,组织Tech Talk的活动,供大家分享每个人的学习成果。通过这些手段,提高开发人员的自学兴趣,并逐步提高开发人员的技术水平。
8. 如何提高开发人员的主观能动性?
提高开发人员的主观能动性,少不了激励机制。不能让开发人员感到,5年以后的他和现在比不会有什么进步。你要让他感到他所从事的是一个职业(Career),而不只是一份工作(Job)。否则,他们是不会主动投入到工作中的。我们的经验是提供一套职业发展的框架。框架制定了2类发展道路,管理类(Managerial Path)和技术类(Technical Path),6个职业级别(1-3级是Entry/Associate,Intermediate,Senior。4级管理类是Manager/Senior Manager,技术类是Principal/Senior Principal。5级管理类是Director/Senior Director,技术类是Fellow/Architect。6级是Executive Management)。每个级别都有13个方面的具体要求,包括:范围(Scope)、跨职能(Cross Functional)、层次(Level)、知识(Knowledge)、指导(Guidance)、问题解决(Problem Solving)、递交成果(Delivering Result)、责任感(Responsbility)、导师(Mentoring)、交流(Communication)、自学(Self-Learning),运作监督(Operational Oversight),客户响应(Customer Responsiveness)。每年有2次提高级别的机会,开发人员一旦具备了升级的条件,他的Supervisor将会提出申请,一旦批准,他的头衔随之提高,薪水也会有相对较大提高。从而使每个开发人员觉得“有奔头”,自然他们的主观能动性也就提高了。
上面的“套路”涉及了软件研发团队管理中的研发过程、技术实践、文档管理、激励机制等一些方面。但只是九牛一毛,研发团队管理涵盖的内容还有很多很多,还需要管理者在不断探索和实践的道路上学习和掌握。
发表评论
-
为什么中文编程项目失败率特别高?
2017-06-11 10:58 429不少中文编程语言都是创造者一时热情。觉得发明很伟大,想当然的 ... -
智语言介绍
2017-05-26 14:49 625智语言介绍 智语言介绍 智语言是一 ... -
中文编程的奋斗历程
2017-05-10 11:12 475中文编程的奋斗历程 ... -
阿里大数据架构
2014-06-26 10:16 764阿里大数据架构 -
大型Web系统三种主要的数据类别
2013-12-24 13:16 7501. Web静态文件服务 主要提供构建WebUI需要的一些 ... -
大型团队Java项目日志自由激活的设计
2013-11-25 13:40 858大型团队Java项目日志自由激活的设计 摘要: ... -
一个企业级的自动化工具gradle
2013-09-02 16:08 815还没有用过,理念不错,我喜欢。值得研究一下。 ... -
10 个非常重要的 HotSpot JVM 参数
2013-08-17 20:42 8261) 跟 Java 堆大小相关的 JVM 内存参数 下 ... -
A JSP to print all the stacks
2013-06-19 17:29 878A JSP to print all the stacks ... -
Ubuntu11.10下解决 jmap等jdk工具attach pid错误
2013-05-13 18:05 8541.错误案例 java] view plaincop ... -
GlusterFS集群文件系统研究
2013-02-26 11:17 1004http://blog.csdn.net/liuben/ar ... -
云中的数据岌岌可危 储存毫无保密性?
2013-02-26 11:05 860想想也是,从构架角度考虑,不加密的数据放在别人的服 ... -
7条工作晋升建议
2013-01-21 16:13 7551. 观察:学习他人如何获得提升; 2. 多做:体现 ... -
论语之软件开源
2013-01-11 16:37 953摘自淘宝某领导的演讲 小故事: 领导: 今天决 ... -
一个很牛的架构组件(Dubbo)
2012-12-27 17:52 2722这是一个在阿里内部广泛使用的,管理SOA组件间互相调用的基本框 ... -
中国计算机核心期刊
2012-11-15 09:58 58281.计算机科学与技术 英文版: 《Journal of Com ... -
身体的秘密大全
2011-08-25 15:27 1042眼睛告诉你的6个 ... -
关于编程,大学没有传授的十件事
2011-08-17 17:17 810笔者依然记得当年完成学业时,深信自己已经准备好进入任何一家 ... -
做人 做事 做架构师 架构师能力模型解析
2011-08-16 10:35 890究竟是什么让你在同 ... -
介绍山寨android的文章
2011-06-10 08:41 961摘录一篇介绍山寨Andro ...
相关推荐
此外,软件研发管理体系还涉及到知识管理、质量管理、成本管理、风险管理、项目管理等几个方面。知识管理是指对研发团队的知识和经验进行管理和共享。质量管理是指对研发过程和产品的质量进行管理和控制。成本管理是...
IPD,全称为Integrated Product Development,是一种先进的产品开发管理模式,源于华为等大型企业的实践经验,旨在打造高效的研发团队,提高产品的质量和市场竞争力。IPD的核心理念是集成化、跨部门协作,强调在整个...
项目团队管理 - **功能概述**:管理和协调项目团队成员的工作,确保团队协作顺畅、高效。 - **关键活动**:团队组建、人员分配、团队沟通等。 #### 11. 项目计划管理 - **功能概述**:制定详细的项目计划,包括...
软件研发项目管理体系的流程可以分为以下几个方面: 1. 项目管理:包括项目的制定、计划、执行、控制和结束等阶段。 2. 产品管理:包括产品的设计、开发、测试和发布等阶段。 3. 技术管理:包括技术的选择、设计、...
综上所述,打造高效的研发体系需要在软件研发、产品研发和研发管理三个方面下功夫,结合先进的工具和方法,持续优化流程,提升团队效率,以实现产品的高质量与快速迭代。通过不断学习和实践,我们可以建立一个适应...
为了解决软件研发管理问题,我们需要建立一个完整的解决方案,包括企业研发管理的理念、常见问题分析、基础方法论介绍、整体解决方案等方面。 在企业研发管理中,我们需要建立一个企业研发管理的目标和策略,确保...
软件测试质量管理的实施需要注意以下几个方面: 1. 质量计划:软件测试质量管理需要制定质量计划,以确定软件项目的质量目标和质量指标。 2. 质量保证:软件测试质量管理需要制定质量保证计划,以确保软件项目的...
针对软件企业的研发管理问题,主要体现在以下几个方面: 1. 组织结构和人力资源管理:可能缺乏明确的角色定义和有效的激励机制,导致团队协作效率低下。 2. 产品生命周期管理:新产品开发过程中的需求分析、设计、...
下面,我将从几个方面详细解读这份管理制度的内容及其对企业的影响。 首先,软件研发部管理制度的核心在于确保软件开发的每个环节都有明确的执行标准和监督机制。为达到此目的,管理制度首先明确了遵循的基本原则,...
【华为软件简要研发流程管理体系】是华为公司在其软件开发过程中采用的一种高效、规范化的管理方法,旨在确保软件产品的质量、进度和成本控制。该体系基于IPD(Integrated Product Development)理念,结合CMM...
选择合适的软件研发流程取决于项目的特点,如项目的规模、需求的稳定性、团队的专业技能以及可用的资源。小型、需求明确的项目可能更适合瀑布模型,而大型、复杂的项目可能需要采用螺旋模型、RUP或IPD等更灵活、全面...
本文将根据提供的资料,详细解析软件度量沙龙中关于“通用软件产品研发的成本管理”的相关内容,包括传统行业的成本管理原理及其在软件行业的应用、软件成本管理的特点以及如何通过最佳实践来提高研发效率。...
软件研发流程管理办法是确保软件开发高效、有序进行的重要指导文档,旨在缩短开发周期、提高产品质量、降低成本和提升开发效率。本办法涵盖了从立项到维护的全过程,主要分为以下几个关键章节: 1. **立项**:基于...
产品研发管理流程是实现产品从概念到上市的全过程管理,主要包括以下几个阶段: 1. **综合决策分析**:包括资源分析、进度分析、质量分析、预算成本分析、合同执行分析、风险问题分析等。 2. **需求设计**:根据...
在 DevOps 的实施过程中,我们需要关注以下几个方面: 首先,我们需要建立一个统一的研发平台,实现敏捷和 DevOps 的转型。这个平台需要整合软件研发工具、容器化技术、运营监控工具等,以支持敏捷和 DevOps 的研发...
软件开发团队绩效考核制度的考核内容包括项目进度考核、项目质量考核、项目客户满意度考核、技术资料汇总考核等几个方面。项目考核内容和各阶段考核所占权重将根据项目的实际情况进行调整。 5. 项目目标调整 软件...
未来教育软件研发中心研制"进一步明确了软件的核心功能和来源,它是一个专注于Access数据库管理系统的考试模拟平台,专为应对计算机二级考试而设计,同时凸显了其专业性和权威性,源于有经验的教育软件研发团队。...
华为的软件简要研发流程管理体系基于IPD+CMM(Integrated Product Development + Capability Maturity Model)模型,这是一种高效、规范化的软件开发管理模式,旨在提升软件产品的质量和开发效率。IPD是集成产品开发...