要成为一名高效的程序员,光技术牛X 可不够。除了技术,一名优秀的程序员更需要关注其他的一些方面。我认为最重要的就是和项目组其他人沟通的能力。无论项目是做什么,你都需要通过沟通把事情做完,比如:
-
作为一个开源项目的贡献者,你需要合作审查别人的补丁或者让其他人审查你的补丁,你需要解决用户提出的问题,你需要和新用户沟通功能,和其他提交者或共同维护者一起做计划。
-
作为一个自由职业者,你需要同现在的和潜在的客户进行沟通。你也需要和项目组的其他程序员、设计师和测试人员沟通,你还需要明确每个负责人对应负责的项目。
-
当你在一家公司工作,需要协调你的团队和其他团队的程序员,和你的经理特别是和项目经理进行沟通。
程序员和项目经理……通常不会一见钟情
和项目经理的关系时常会出现一些状况:作为程序员我们很容易去抱怨他们。毕竟他们总是企图让我们为了一些改动而在周五的时候加班,也是他们一直逼迫我们去做一些根本说不通的功能。
但我认为项目经理在一个成功的团队中发挥了至关重要的作用。只有团队成功,我作为程序员才能成功。出于这个原因,我认为和项目经理保持很好的关系,才是交付成果的关键。我很幸运可以和那些很棒的项目经理合作,他们给予我很大的帮助。特别是我在 TripAdvisor 工作的时候:我在那里遇到的项目经理都很棒。但我还时常会和其他程序员一起抱怨他们 :)
但我知道正是由于他们的工作,我们才可以沿着正确的方向前进,快速地发布功能,并在项目上和公司的其他团队展开合作。
所以我深信项目经理对公司的影响力举足轻重。但这种影响可以是极其负面的或是非常积极的。我并不了解一个项目经理所有的职责,而且我也相信有很多事情他们并没有与程序员沟通。我只是在想项目经理应该如何同程序员沟通,以及程序员对项目经理有什么期望。
在我看来,一个项目经理如果做到以下五件事情,就可以帮程序员提高效率。
1) 沟通业务重点,思考技术重点
我们都在超负荷工作,我们有一堆希望可以在本周完成的工作。作为一名程序员,我需要评估每项要完成的工作所花费的精力,以及它们之间的关系。也许某个重构可以简化一项功能的开发,因此对这些工作做相应的排序是非常合理的。某项工作可能需要两周,而其它三个功能每个只需要半天就搞定了。我当然希望可以先完成它们。
但技术方面只是一方面的考量:对这些工作进行排序,需要了解业务的重点。什么功能对客户最重要?什么功能对收入有直接影响?这对我们决定集中精力先交付什么相当重要。我认为项目经理应该和程序员经常沟通项目的优先顺序,并且项目经理也得明白:他需要对业务方面和技术方面的项目优先顺序都加以考虑,才能决定我们下一步的工作是什么。
有时候技术的优先顺序也是很重要的:不能只考虑业务优先顺序而忽视它们,因为如果这样做会影响我们交付软件的质量,进而影响到业务。
2) 提前让开发者知道截止时间
曾几何时你突然发现有件事情需今天晚些时候就要交活?或者昨天的时候有人承诺客户会拿到一个新的版本?它们不是惊喜,而是惊吓。坦白来讲就是一旦出现异常我们需要立刻处理。如果应用程序挂了的话,公司每分每秒都在赔钱:所以无论你手头上有什么事都要停下来,把它解决掉。比如说发现了一个棘手的新的 bug,或者存在安全漏洞需要尽快解决等等。现实生活中很多事情都不是计划好的:我们只能见招拆招。
但不能每件事情都这样,我们不能总是进行应急驱动开发。这是很差的实践。大家需要讨论截至日期并达成共识,开发就可以按计划行事。程序员通常看不到整个项目的全貌,但项目经理又何尝不是呢:他们会忽视技术的方面,但如果不能提前知道这些,是不可能在截止日期前完成工作的。所以亲爱的项目经理们:一旦你们知道截止时间就马上告诉我们。
提醒:我所说的“让程序员知道截止时间”,是指真实的截止时间。项目经理做的最烂的事情就是给出一个假的、自己强加的截止时间。有的项目经理有自己的小算盘,他们给自己留有一定的时间余量,比如他告诉开发者客户希望 1 号交付,但实际上他和客户承诺的日期是 15 号。他们这么做可能是因为我们经常晚交付东西,但是……你猜怎样?程序员早晚都会发现,并认为这些无谓的压力和长时间的工作都是拜你的谎言所赐。你猜他们会有何反应?
3) 沟通管理
我知道这听起来让人不爽,但程序员或多或少都会有些小缺点。其中一点就是开发者的沟通方式……与众不同。他们倾向于直言不讳。这样的性格很适合与机器一起工作,但是对客户也这样就会出问题。是的,客户提供给你的 SDK 是不是看上去不够……优化。是的,如果我们给一群猴子,提供一瓶廉价的威士忌和一本手册,上面记载了所有软件工程上的最差实践,他们也就做成这个样子。好了,还是不要让客户知道这些。项目经理需要重新措词再告诉客户。
每当看到项目经理追着客户要他们确定需求的时候,或者是他们与其他团队的项目经理交涉,说服其他团队回复我们提出的需求的时候,我都感到异常欣慰。是的,我们很迫切地需要回答,但是往往一个同样的需求我们转了三遍,都好几周了还没有回复。
一个出色的项目经理会提供给我们所有工作中所需要的信息,并且可以确保所有参与的团队都可以顺畅地沟通。我们很可能没有意识到他为此所付出的努力。
4) 让程序员远离麻烦
公司里压力很大。压力来自方方面面,所以需要对它进行管理。作为一名程序员,我们需要应对很多的技术难题:一个很难复现的 bug,一个和线程同步有关的偶发问题,一个改动很大的框架发布,一段不可靠的、无法通过集成测试的基础代码。我们有足够的理由感到压力山大。
项目经理也一样:他们需要比我们处理更多的内部规章,参与功能开发的讨论,还要积极为团队争取资源。他们会和其他团队展开竞争,也要接受客户对他们的咆哮发泄。对此我深表同情,但如果项目经理把这些压力转嫁到程序员身上,那我们这些程序员就会成为板上鱼肉,任人宰割。我们会受到两方面的压力,一方面是现实的技术难题,另一方面是疯狂的客户和办公室政治。这些重担太沉重,所以我们需要达成一个共识:技术上的问题,我们会负责搞定。而其余的问题——虽然我同情项目经理——但那些都是你们的责任。
5) 确保我们没做不相关的工作
想要开发对公司产品影响很少的东西是非常困难的。尽管对于那些喜欢长时间开发很酷的东西的人而言,会很享受这一点,但是这对你的职业生涯很不利。如果你一直开发不相关的东西,你很难被升职加薪。相反如果你做的事情可以对于业务开展非常有意义的话,好处是显而易见的:它为你提供额外的动力,容易让人注意到你,也更容易在组织内获得更多的资源和支持。
开发一个不相关的功能并被不是最糟糕的事情。最惨的是工作的项目在完成前或完成后马上被丢弃掉。想象一下你的努力和汗水就这样被丢弃掉。感觉很差,不是吗?所以最好和那些不会把你带入这种境地的项目经理合作。
结束语
我认为项目经理会为我们挡掉很多问题。他们是我们和客户以及公司其他团队的接口。他们保证我们为客户提供有价值的工作。他们来统筹大局,而我们只需要关注下一个功能的开发、产品测试和交付。
事实上很多时候程序员认为项目经理没什么大不了的。我相信大多数程序员都会低估项目经理。我们只是不理解他们的职责。但是请相信我,如果你和优秀的项目经理和不那么棒的项目经理都共事过的话,你肯定能发现差距的。
我希望程序员和项目经理都可以从良好的关系中受益。我可以告诉大家,这是有可能的。因为我现在就和一位项目经理住在一起,没错,她就是我的女朋友 :)