测不准的程序员(Heisenberg Developers)
故事是这样的,数年以前我在一个颇具规模的项目里干活。一开始十分顺利,不懂技术的老板和一些用户给我们指个大方向,等我们做出来他们就来测试功能。该重构就重构,该整个抛弃就抛弃。不用事事找老板授权,只要功能按时完成,大家都happy。
接着遇到一个难搞定的用户,他要用软件来替代专业用户多年的经验和直觉,他提的需求不能再模糊了,必须在下一个版本就实现。我们说什么都没用。干了几个月什么也没做出来。
老板没办法,找来了一个看简历是顶级的项目经理。工作流程立马变了,我们开始使用Jira,每个功能都被细分到不超过一天的工作量,每两个星期开一次持续一天的会分配下一阶段任务。
奇怪的是,进度反而更慢了。计算好的项目交付时间还在往后拖。然后项目经理就开始做一件最常见的事:招人。
我们对招什么样的人没有发言权,新来的人明显有文化差异。当我们认为需要重构,或者抛弃功能时,他们就反对,说我们不干正事,项目经理支持他们。
我们变得士气不振,吵了几次以后,选择很简单:要么闭嘴干活,要么走人。我们最好的程序员走了。我学会了夸大工作量,让做什么就做什么,把想象力和创造力留给业余项目。
新来的同事没有几个享受软件开发,以前办公室里聊编程语言,现在聊汽车。而他们看起来很喜欢这种管理方式。有个人这么对我说:“你从待办事项找到下一项,搞定它,划勾,然后就再不用理了”。他们不用负责,不用作任何艰难的决定,不需要有大局观。
项目进度越来越慢,bug越来越多,队伍越来越大,却没见改善。公司花的钱越来越多,收益越来越少。
到底哪里出了问题?
在商业领域,细分式的软件项目管理很吸引人。每个机构都渴望事情尽在掌控之中:给开发者那么多薪水获得了什么回报,系统交付的时间多长,这样才能做出准确的成本效益分析,预测生意。
这完全误解了软件开发的本质。软件开发本身是一个创造性和实验性并存的过程。它本来就需要试错。无数研究表明有效的创造性工作需要交给专家自主完成。作为开发者我们需要尝试的自由,多试几次才能找到一个有效的。我们也说不清为什么要这样,很多都是直觉,而且其中有一部分是错的。
如果你问我开发一个功能需要多久,我只能老实说我真的不知道。我有一个大概的想法,但是没法确定。
一旦你问一个开发者告诉你接下来的8天他每天都要做什么,你就把大部分创造力和意外之喜谋杀了。
当然,对于那些喜欢工资多过编程艺术的人,微观管理会很有吸引力。你按时提交自己的任务,经理怎么说你就怎么做。如果用户不满意,系统bug一堆,也不关你的事,你的工作已经完成了。
细分式的管理直接导致人才流失。那些真正厉害的程序员会直接走人,他们不愁找不到工作。那些不喜欢做决定,喜欢找借口的人会流下来。你会发现你的队伍变得越来越会抱怨,但对你的每项指令都顺从的执行,对需求没任何意见,好好填写Jira表格,然后生产出质量极差的软件。
到底应该如何管理开发者?
简单:给他们自主权。设定一个大目标,让开发者来实现就行了。他们有时会失败,你对此需要留有余地。不要因为失败就增加干预。建设一个人人都有贡献、值得信赖的团队,而不是雇一屋子的被动消极的程序猿。
测不准的程序员(Heisenberg Developers)的更多相关文章
- LeetCode 到底怎么刷?GitHub 上多位大厂程序员亲测的高效刷题方式
作者:HelloGitHub-小鱼干 在众多的诸如阿里.腾讯等大厂之中,最看中面试者刷题技能的大概要数有"链表厂"之称的字节跳动了.作为一个新晋大厂,字节跳动以高薪.技术大佬云集吸 ...
- 写给后端程序员的HTTP缓存原理介绍
There are only two hard things in Computer Science: cache invalidation and naming things. -- Phil Ka ...
- [PHP]程序员技能栈
[PHP]程序员技能栈.md-/Users/zjh/Documents/我的文章/[PHP]程序员技能栈 html{font-family: sans-serif;-ms-text-size-adju ...
- 南京都昌信息科技有限公司招聘C#程序员
南京都昌信息科技有限公司招聘全职C#程序员 本公司核心产品为DCWriter电子病历文本编辑器,DCTimeLine时间轴软件等自研产品,现招聘全职C#程序员. 职位描述: 1.使用C#进行软件开发, ...
- 推荐!国外程序员整理的 PHP 资源大全
推荐!国外程序员整理的 PHP 资源大全 2014/08/02 · PHP, 工具与资源 · 8.5K 阅读 · 1 评论· php 分享到:0 与<YII框架>不得不说的故事—安全篇 R ...
- 转:程序员最值得关注的10个C开源项目
程序员最值得关注的10个C开源项目 1. Webbench Webbench 是一个在 linux 下使用的非常简单的网站压测工具.它使用 fork ()模拟多个客户端同时访问我们设定的 URL,测试 ...
- 程序员MM的自白:磨人小妖精之安卓碎片化
文/腾讯优测 章婉霞 除了crash问题,Android平台的碎片化越来越受到移动开发的关注,且不谈支持Android系统的移动设备早已过万款,屏幕.品牌以及传感器等方面的碎片化问题也困扰着开发者. ...
- C/C++程序员面试易错题
c部分::::::::::::::::::::::::::::::::::: . 关键字volatile有什么含意? 并给出三个不同的例 子. [参考答案]一个定义为volatile的变量是说这变量可 ...
- [闲谈] 有经验的程序员用Google用得多么?
关于程序员有没有必要记一些API什么的讨论有很多,我个人觉得能Google到的就没必要刻意去记,可以简单的做个笔记,需要用的时候查一下就好了.真正有必要记的东西,用得多了自然也就能记住了. 文章不难, ...
随机推荐
- ABAP屏幕设计
转自 http://www.cnblogs.com/aBaoRong/archive/2012/06/05/2536591.html abap 屏幕控制 ******************** 屏幕 ...
- 使用Quartz.net动态设置定时时间问题
关于使用Quartz.net就不用解释了.. 应客户需求问题..需要将做一个界面设置定时的时间.因此我在百度一番..用CronExpression类可以设置时间... 我知道这个类有定义好的字段..不 ...
- (转)COM组件里的AddRef()
D3D是 COM组件,它在服务进程中运行,而不在当前的客户进程中.在DX组件运行过程中,要创建一系列接口对象,如CreateDevice()返回接口指针,这些接口及其占用内存什么时候释放,要通过“引用 ...
- C++的深拷贝与浅拷贝
对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面是一个类对象拷贝的简单例子. #i ...
- 让xterm更舒服的设置
转自:http://codespider.is-programmer.com/posts/25247.html X11相关的配置位于/etc/X11下. xterm的配置是/etc/X11/app-d ...
- 原生js发送ajax请求
堕落了一阵子了,今天打开博客,发现连登录的用户名和密码都不记得了.2016年已过半,不能再这么晃荡下去了. 参加了网易微专业-前端攻城狮 培训,目前进行到大作业开发阶段,感觉举步维艰.但是无论如何,不 ...
- halcon运行版设置
- case when
SELECT * FROM category WHERE EXISTS (SELECT * FROM goods WHERE goods.cat_id = category.cat_id) cat ...
- Ubuntu14.04用apt在线/离线安装CDH5.1.2[Apache Hadoop 2.3.0]
目录 [TOC] 1.CDH介绍 1.1.什么是CDH和CM? CDH一个对Apache Hadoop的集成环境的封装,可以使用Cloudera Manager进行自动化安装. Cloudera-Ma ...
- [linux] linux shell 将解析完毕的文件备份至其他目录
#!/bin/bash # #将解析完毕的日志备份到别的目录 # #日志目录 rjPath=`ls /home/bgftp/orj` #当前时间戳 cur=`date +%s` #一小时 chtm=3 ...