交付高质量的产品
目前我们生活中所依赖的很多系统都依赖软件,每个系统功能的增强会带来代码规模和复杂性的增加,出现严重问题的几率也在增加。软件质量的首要目标就是要提供对用户来说重要的功能,解决用户的痛点。所以在开发前必须要准确的理清楚用户的需求这是开发出高质量程序的前提。其次是软件的缺陷,大多数情况下编译和测试会修正大部分,但还是在最终交付的产品中会遗留,软件工程师必须要学会管理这些缺陷。发现并改正缺陷需要花费的代价很大,为了减少缺陷,软件工程师必须总结前面的经验,在以后的工作中少犯类似的错。对软件质量的追求是一段没有终点的旅程,质量的改进是迭代式的持续不断的改进。软件开发的起点要有明确目标,目标为团队提供了努力的焦点,建立了优先次序。
为高质量项目制定计划
最难制定计划的时候也是最需要计划的时候,因为管理者和开发者都不知道这个项目会花费多少时间,唯一能把你从中解脱出来的办法就是制定一个可行的计划并且尽最大努力完成。计划分为阶段计划(基于时间)和产品计划(基于行动)。
一份合格的产品计划应该包括以下三项内容
- 将要生产的产品规格和重要的性能指标
- 估算工作所需的时间
- 进度预测
但是现实中软件开发计划通常不完整也不精确,所有的开发团队都没有一个计划过程来保证计划制定的完整并得到了全面审查和准确核实。由于软件开发的复杂性和管理者的贪婪一般给的时间进度都是最具有挑战性的。但是步步紧逼的开发进度带来的是匆忙的编码和测试,这样的开发节奏通常比有良好项目计划花费更多的时间。计划的不当会让跟这个项目有关的所有人员都蒙受损失。计划必须满足下面的五条基本要求 - 易于理解(恰当的格式,文档的完整性)
- 清晰明白(内容完整没有明显错误)
- 详细具体(应该做什么,什么时间做,由谁来做,成本多少)
- 精确缜密(精确性反映计量单位和测试总量之间的关系)
- 准确无误(过高和过低估计的次数应该相互抵消对整体的计划来说更加精确)
对于项目中出现的需求变更情况,要不断重新评估你的计划,通过动态的计划来评估每个需求变更带来的成本影响。详尽的计划只在较短的时间内是精确的,随着项目的深入,开发人员会对产品认识更加深刻,因此定期重新进行计划是最简单、最快捷的处理团队之间进度不平衡的办法。
高效团队的基本要素
团队应该要有共同目标,团队的所有人必须都致力于实现这个目标。团队的合作往往比个人独立工作表现更出色。虽然团队合作有巨大的优势,但也存在很多问题,常见的有下面几个
- 无效的领导(监督推进计划和维持纪律)
- 缺乏妥协或合作(团队成员之间相处不融洽)
- 缺少参与(如果团队中有个别人明显没有真正去努力,整个士气就会受到影响)
- 拖延和缺乏信心(设置了不合理的截止期限导致项目管理混乱)
- 低劣的质量(日常工作的不严谨)
- 功能蔓延(实际的需求和需求之外额外的附加没有一条清晰的分界线)
- 无效的对等评估(使团队成员之间产生竞争,降低团队成员协作的愿望)
一支团队要成为高效团队就要为团队提供以下四项额外的支持 - 团队凝聚力(把团队成员紧密联结成一个整体,相互协作,密切配合)
- 富有挑战性的目标(团队成员清楚的看到他们是如何朝目标前进的)
- 反馈(根据时间节点查看目标的进度,从团体的整个成就中分辨出个人的表现,因为当个人的工作再团队中看不出来时,他们就不会努力了)
- 共同的工作架构(根据团队共同的目标来明确成员在团队中所扮演的角色和承担的责任)
团队的建设不是一撮而就的,需要时间的不断磨合。在团队建设的过程交流至关重要,对于团队来说,交流最重要的三要素是:透明、倾听和协商。有种误解就是好的交流者就是那些表达清晰、辩才无碍并且能吸引注意力的人。实际上最好的交流者是优秀的倾听者,其中共鸣型倾听对软件团队尤其重要,效率也最高。
做一位高效的团队成员
优秀的团队成员应该有一种主动性,主动去做认为团队应该做的事情。在团队协作中一旦达成协议就应该相互遵守,对此负责努力去实现。一般在实际的执行过程中所有事情都按照计划进行是不常见的,也就是说总会有意外的事情发生。在处理完意外的情况后,团队应该对之前的工作进行反思总结经验并重新评估当前的工作情况。通过不断的重复这个过程,团队成员就会很快学会怎么估算自己的工作。在交流和承诺之后,团队合作的第三项要求就是参与团队活动。集合团队众多人的知识和经验是团队强有力的资源,当遇到问题时集思广益非常重要。团队讨论时所有的新思想都开始在少数派身上,由一个标新立异的观点会引起其他团队成员的新想法起到抛砖引玉的效果。每个团队成员应该接受并扮演一个团队中的角色,让他们充分感受到在团队中的存在感,对自己的工作和团队的目标负责。
领导和指导你的团队
领导力事关团队的成败,真正的创新性工作只有杰出的领导者带领团队才能完成。团队的做事方式很大程度上取决于和领导者进行协调的方式。这里有些因素你可以改变有些是你无法控制的。对开发人员来说有三条最重要的极力因素,分别为恐惧、贪婪和承诺。领导者可以利用恐惧心理来推动工作,但这不是一个建设性的策略,可能会引发不好的反应。贪婪表现在对工作的渴望,是最常见的激励方式,有一个巨大的缺点就是报酬与业绩挂钩,但是有些业绩的指标不好衡量,也会很大程度上导致员工在工作中过度重视表面上的业绩导致工作的短视。综上对开发工作来说贪婪恐惧都不是一个很好的方法。对团队来说最好的激励因素还是承诺。
项目进度的落后往往是每一次小落后累积而成的,对日常进度的管理可以设置一个短期的小目标即短期内任务完成的时间节点并且定期开会检查,来制造一些紧迫感。但是这个时间节点的跨度要掌握好有助于维持团队的紧迫感和积极性。
讨论项目并捍卫你的计划
如果项目一开始就陷入麻烦比如定了一个不可能完成的期限,你该怎么办?
首先你必须让管理者相信你知道项目会花费多少时间,你必须要了解你自己的水平。如果你认为进度需要的时间比管理者预期的要长,不要立即和他争论。让你的团队和你一起制定详细的计划,告诉管理者,并与管理者讨论让他们相信你的计划。如果有人能证明你的估算有偏差,要及时调整计划。
然而来自管理层的控制是最难以应付的,管理层一步步升上领导者的岗位当然是希望开发人员无条件服从命令。这种领导对于有详细计划日程的开发团队来说确实很不适应,而且这种控制会极大的影响团队的日程进度。应对这种情况的有效方式就是默默为每项变更调整计划,然后调整团队的工作进度并和管理者协商。
争取管理者的支持将会是团队管理的助力器,但是管理者为什么要支持你?可能是你要做的事情和他的工作目标或者利益一致也可能是你在做彼此都认为争取的事。管理者所处的位置不同关心的目标也会不同,位置更高的更看重长期的发展。在向更高层的管理者提交建议的时候,最好先把草案交给你的直接管理者过目并征求建议。
管理者日常要做的事情不应该是插手员工的具体工作,更应该是利用所有的团队资源完成团队的项目目标。1)按日程进度利用已有的资源完成此项工作2)团队的开发产品同时满足明确和暗含的要求3)让上级管理者随时了解自己团队的工作进展情况4)出现问题能及时采取正确的对策5)协调与其他部门的工作6)遵守组织的各种规章制度
管理你自己
当外部环境变得不那么好的时候,最正确的方式不是抱怨,而是对这些问题进行管理。第一步主动改进自己的工作流程,定位到不合理的地方并改进,对于那些更复杂的过程需要多次循环这种过程。在实际工作中会充满着各种干扰,造成有效的工作时间会是总工作时间的一半都不到,提高有效的工作时间就能加快工作进度。管理好个人的工作,你需要跟踪你的时间知道都花费在了什么地方,从而来制定切实可行的计划。
在生活工作中总免不了问自己这样一个问题,你想在人生中获得些什么?作者认为外在的东西比如金钱和地位终究会褪去,当你老了以后,什么样的人生是你最满意的这很重要。当然追求这种满足感的基础就是做高质量的工作,不断挑战自己去完成更优质的工作。人生极少会按照我们计划那样前进,我们精心计划的对策可能毁于一旦,而新的,更大的机会也可能不期而至。
学会领导
领导者的个人特质会直接影响到你得团队。如果你相信你的团队会成功那就不断鼓励他们,如果你怀疑团队可能会失败,那就坐下来和团队成员一起讨论风险和问题。作为领导你的主要工作就是分配你的资源给项目团队和对团队所有的事情负责。团队的开发目标虽然最终目标很清晰,但是短期目标会有很多含糊不清的地方,作为领导者你的一个重要工作就是帮团队理清每一个阶段性目标。领导的速度就是团队的速度,因为你不能指望团队中有其他人会比你更有责任心。