标签: 项目管理

为什么程序员总是不能准确预估工作量

一个经验丰富的项目经理声称,他拿到程序员的时间估算以后,先将它乘以π,然后单位变为下一个时间数量级后,才能得到真正的值。即1天转化成3.14周。他过去因为程序员不擅长估算时间而吃尽了苦头。我创建了一个用来翻译程序员时间估算的表格,来尽量缩小估算错误。

 time

时间估算是困难的。每一个程序员都有一个现实的估计区间。低于这个区间的估计意味着(构件,测试,检查代码的)时间开销被低估了。超过这个区间的估计意味着这个任务太大而很难预估。

对于初级开发者来说,这个区间甚至都不存在。他们忽略(构件,测试,检查代码的)时间开销,同时困难的任务他们却又无法预估。我想说一个有经验的开发者应该在0.5至24小时将事情做完。超过24小时,就需要细分。这项工作应该在开发者的头脑中完成,然后总和到60小时。但是即使是有一些有经验的开发者也需要有利用管理时间块来思考。

同样重要的是明白:编程经验不等同于估算经验。一个不被包含在估算流程中的开发者将不会擅长估算。同样,如果实际的时间花费不被测量和用于与估算比较,那么将没有反馈来学习。

最后,每个程序员都应该具备估算的技能。为磨练这个技能,接手每个任务时,先决定你要做什么。然后在开始之前估算任务所需时间。最后测量实际花费时间,并与估算相比较。同样比较你实际完成的与计划完成的。这样你将会既提高你对一个任务包含细节的理解,同样也提高了你的估算技能。

项目经理是干什么的

项目经理

小M是一名毕业于名牌大学软件专业的研究生,在学校中随导师参加过一些国家级的科研项目。毕业后,小M如愿加入某知名IT公司。

为了适应管理要求,该公司已经引进并实施了“项目型”管理模式,企业内按行业划分成事业部,项目是事业部最基本的业务运作单位;各事业部内设专职的项目经理,项目经理对项目的全过程负责,因此是公司最重要的基层管理角色之一。

小M觉得,项目经理受人尊重、令人羡慕。不仅羡慕他们每次完成一个项目回到公司后受到英雄般的欢迎,跟公司高层可以面对面直接沟通,还有老客户、老同事经常寄来的土特产。就拿小M的顶头上司事业部总经理S总来说,原来是做技术的,后来成了项目经理,之后连续做了几个大项目,就成了领导眼里的“红人”,在客户那里也有很高威信。现在,年纪轻轻已经成了一名总经理,独立负责了公司的一大块业务。

项目经理也是公司的稀缺资源。由于公司的项目技术性比较强,需要既懂得IT技术又具备项目管理技能的人才,因此鼓励技术人员转型做项目经理。小M觉得自己符合项目经理的要求,但是,做一名项目经理是个严肃的职业选择,在进入亮丽的光环之前,首先需要弄清楚,项目经理是干什么的?

于是,小M找到了S总,谈了自己的想法,希望得到S总的指导。S总热情接待了小M,并回答了小M的问题。

小M首先问:“S总,请问项目经理是个什么样的角色呢?”

S总说:“项目经理是公司委派的负责实现项目目标的个人,是公司授权的项目负责人,是项目的直接组织者和领导者。项目经理对外代表公司与客户和分包单位进行联系,处理合同有关的商务事宜;对内全面负责项目的实施。一些企业中由职能经理代替项目经理,项目经理是兼职和客串的角色。这种兼职的项目经理实际上并不承担上述职责。”
小M接着问:“那项目经理的具体职责是什么呢?”

S总说:公司里的项目经理的职责有三个方面:

1.对项目全过程进行组织和管理,按预期交付项目的成果;
2.管理客户关系,以取得客户对交付的成果及过程的最满意评价;
3.管理项目团队,使之高效而又愉快地工作,并获得最满意的工作体验。
也就是说,一个合格的项目经理必须同时做到 ‘按预期交付成果’、‘让客户满意’、‘让员工满意’

小M又说:“那IT项目经理的主要任务是什么呢?”

S总说:

第一,支持售前过程。IT项目一般比较复杂,交付风险比较大,需要在合同中约定工作范围、进度计划,要估算成本和人力资源。项目经理近距离地了解需求、资源等约束,制定的项目实施方案才会切实可行。参加售前过程不仅有助于项目经理深入了解客户需求,也可以帮助客户了解项目经理的能力。有的时候,客户会因为相中‘项目经理’而促成合同的签订,甚至要求将锁定某位项目经理作为合同的条件。

第二,负责项目交付。签订合同之后,项目经理负责围绕预期目标、遵循确定的规范执行项目。项目经理不仅要制定思路清晰、考虑周密的计划,还要调集资源、委派任务,推进计划的执行;过程中,还要及时处理出现的问题,定期向有关人员汇报进展,保证在规定的时间和预算内交付项目成果。

第三,完成项目收尾。完成交付成果之后,要将成果移交给客户,确保客户可以稳定地使用系统。然后,将后续服务移交给服务部门,确保客户得到持续的服务保障。项目经理交付的成果直接决定客户满意度、影响客户是否愿意付款,因此公司里还要求项目经理负责完成收款工作。

第四,管理干系人的关系。一个IT项目可能涉及投资方、客户、分包单位、合作伙伴,甚至可能包括政府、社会等各方面的关系;面对的‘客户’也不是一个人,而是一个群体。项目经理作为各方的桥梁和纽带,要随时处理各方信息,保持密切沟通,解决矛盾冲突,只有这样才能让‘客户’满意。

第五,管理项目团队。由于项目团队的临时性,项目经理需要花费很大的精力寻找合适的资源,优化资源配置,建立合理的组织结构,确定清晰的职责分工。项目过程中还需要通过各种措施进行团队建设,打造高效团队。”

从这些工作任务的性质来看,项目经理是项目的推动者,也是关系的协调者。 阅读详细 »

程序员的五个阶段

第一阶段:编码机器

这是最低级的阶段,程序员拿到详细设计文档,上面连许多方法接口都定义好了。重构一些代码,写一些实现,调用一些既定的API,然后花许多时间在各种各样的场景测试上面。从做的工作上看,这都不能算程序员,最多,只是编码技巧卓越的码农而已。因为它几乎扼杀了一切创造力,但是这很常见,比如在一些对日外包公司,就是如此。

过程

第二阶段:独立的实现者

程序员得到的只是粗略的设计文档,也许注明了外部接口的清单,还有框架和基础设施的API,需求已经澄清清楚,接下去要做的就是发挥聪明才智把软件实现设计好,把代码写好,测试通过。这项工作可以在安静和独立的环境中完成,因为没有什么是不够明确的,那些本不清楚的部分,项目经理、架构师和产品经理已经搞定了。这样的环境下可以诞生许许多多OO设计优秀、代码清晰简洁的程序员,但是这始终只是在做一个残缺的项目而已。很多程序员新手都是从这个阶段开始的,但是程序员如果只会代码层面的设计、编码和测试,并不能算一个完整的程序员,也许连一半都算不上。

第三阶段:项目沟通者和管控者

程序员要和需求工程师,甚至客户澄清需求,分析可行性;需要自行分析设计项目中的技术难点;参与决定和管理迭代周期和计划表;组织和参与项目组内运作跟踪会议。编码以外的事情会占用一些时间,这些时间大多来自沟通的成本。如果说,前两个阶段还未能明显看出沟通的重要性的话,那么到这个阶段,一个不能良好沟通的程序员,将成为项目组运转的瓶颈。国内至少有一半的软件公司的程序员做项目应该处于这个阶段。 阅读详细 »