在设计方面,作决定的时候好必须有开发者参与。但是,在一个项目中,它们不该该作全部决定,特别是业务方面的决定。程序员
Decide what you shouldn’t decide.
开发者(及项目经理)能作的一个最重要的决定就是:判断哪些是本身决定不来的,应该让企业主作决定。你不须要本身给业务上的关键问题作决定。毕竟那不是你的事情。若是遇到了一个问题,会影响到系统的行为或者如何使用系统,把这个问题告诉业务负责人。若是项目领导或经理试图全权负责这些问题,要委婉地劝说他们,这些问题最好仍是和真正的业务负责人或客户商议。数据库
当你和客户讨论问题的时候,准备好几种可选择的方案。不是从技术的角度,而是从业务的角度,介绍每种方案的优缺点,以及潜在的成本和利益。和他们讨论每一个选择对时间和预算的影响,以及如何权衡。不管他们作出了什么决定,他们必须接受它,因此最好让他们了解一切以后再作这些决定。若是时候他们又想要其余的东西,能够公正地就成本和时间从新谈判。promise
毕竟,这是他们的决定。安全
“设计”是软件开发过程不可缺乏的步骤。它帮助你理解系统的细节,理解不见和子系统之间的关系,而且指导你的实现。服务器
一些成熟的方法论很强调设计,他们但愿在开始编码以前,先有完整的设计和文档。另外一方面,敏捷方法建议你早在开发初期就开始编码。是否那就意味着没有设计呢?不,绝对不是,好的设计仍然十分重要。画关键工做图是必不可少的,由于要使用类及其交互关系来描述系统是如何组织的。在作设计的时候,你须要画时间去思考各类不一样选择的缺陷和益处,以及如何作权衡。架构
而后,下一步才考虑是否须要开始编码。若是你在前期没有考虑清楚这些问题,就草草地开始编码,极可能会被不少意料以外的问题搞晕。可是,即便以前已经提交了设计文档,也还会有一些意料以外的状况出现,时刻谨记,此阶段提出的设计知识基于你目前对需求的理解而已。一旦开始了编码,一切都会改变。设计及其代码实现会不停地发展和变化。框架
Design should be only as detailed as needed to implement.
严格的需求-设计-代码-测试开发流程源于理想化的瀑布式开发方法,它致使在前面进行了过分的设计。这样在项目的生命周期中,更新和维护这些详细的设计文档变成了主要工做,须要时间和资源方面的巨大投资,却只有不多的回报。ide
若是你本身都不清楚所谈论的东西,就根本不可能精确地描述它。
设计能够分红两层:战略和战术。前期的设计属于战略,一般只有在没有深刻理解需求的时候须要这样的设计。更确切地说,它应该只描述整体战略,不该深刻到程序方法、参数、字段和对象交互精确顺序的具体细节。那应该留到战术设计阶段,它应该在项目开发的时候再具体展开。这时更适合讨论如何设计类的职责。由于这仍然是一个高层次、面向目标的设计。事实上,CRC(类-职责-协做)卡片的设计方法就是用来作这个事情的。工具
如何知道一个设计上好的设计,或者正合适?代码很天然地为设计的好坏提供了最好的反馈。若是需求有了小的变化,它仍然容易去实现,那么它就是好的设计。而若是小的需求变化就带来了一大批基础代码的破坏,那么设计就须要改进。单元测试
Blindly picking a framework is the having kids to save taxes.
在考虑引入新技术或框架以前,先要把你须要解决的问题找出来。你的表述方式不一样,会让结果有很大差别。找到了须要解决的问题,接下来就要考虑:
在产品的开发过程当中,集成是一个主要的风险区域。让你的子系统不停地增加,不去作系统集成,就等于一步一步把本身置于愈来愈大的风险中,潜在的分歧会继续增长。相反,尽量早地集成也更容易发现风险,这样风险及相关的代价就会至关低。而等的时间越长,你也就会越痛苦。
你能集成而且独立
集成和独立不是相互矛盾的,你能够一边进行集成,一边进行独立开发。
使用mock对象来隔离对象之间的依赖关系,这样在集成以前就能够先作测试。用一个mock对象模拟真实的对象(或者子系统)。mock对象就是真实对象的替身,它并不提供真实对象的功能,可是它更容易控制,可以模仿须要的行为,使测试更加简单。
你可使用mock对象,编写独立的单元测试,而不须要马上就集成和测试其余系统,只有当你自信它能工做的时候,才开始集成。
当早期就进行集成的时候,你会看到子系统之间的交互和影响,你就能够估算它们之间通讯和共享的信息数据。相反,若是你推迟集成的时间,解决这些问题就会变得很难,须要大量和大范围地修改代码,会形成项目延期和一片混乱。
Checked-in code is always ready for action.
在团队里工做,修改一些东西的时候必须很谨慎。你要时刻经济,没错改动都会影响系统的状态和整个团队的工做效率。下面是一个简单的工做流程,能够防止你提交破坏系统的代码:
最好的办法是你有一个持续集成系统,能够自动集成并报告集成结果。持续集成系统就是在后台不停地检出、构建和测试代码的应用。你能够本身使用脚本快速实现这样的方式,但若是你选择已有的免费、开源的解决方案,它们会提供更多的功能且更加稳定。
系统能在你的机器上运行,或者能在开发者和测试人员对机器上运行,固然很好。可是它同时也须要可以部署在用户的机器上,若是系统能运行在开发服务器上,那很好,可是它同时也要运行在生产环境中。
QA should test deployment.
这就意味着,你要能用一种可重复和可靠的方式,在目标机器上部署你的应用。若是如今你仍是手工帮助质量保证人员安装应用,花一些时间,考虑如何将安装过程自动化。这样只要用户须要,你就能够随时为它们安装系统。要提前实现它,这样让质量保证团队既能够测试应用,又能够测试安装过程。
有了自动化部署系统后,在项目开发的整个过程当中,会更容易适应互相依赖的变化。极可能你在安装系统的时候,会忘记添加须要的库或组建——在任意一台机器上运行自动化安装程序,你很快就会知道什么丢失了。
从第一天起就开始交付
一开始就进行全面部署,而不是等到项目的后期,这会有不少好处。事实上,有些项目在正式开发以前,就设置好了全部的安装环境。
在咱们公司,要求你们为预期客户实现一个简单的功能演示——验证一个概念的可行性。即便项目尚未正式开始,咱们就有了单元测试、持续集成和基于窗口的安装程序。这样,咱们就能够更容易更简单地给用户交互这个演示系统。
在签约以前,就能提供出如此强大的演示,这无疑证实了咱们很是专业,具备强大的开发能力。
Requirements are as fluid as ink.
没有人的思想和观点能够及时冻结,特别是项目的客户。就算算他们已经告诉你想要的东西了,他们的指望和想法仍是在不停地进化——特别是当他们在使用新系统的部分功能时,他们才开始意识到它的影响和可能发生的问题。这就是人的本性。
此处省略了数值分析中偏微分方程的例子……
应该按期地,每隔一段时间,例如一个迭代,就与客户会晤,而且演示已经完成的功能特性。若是你能与客户频繁协商,根据他们的反馈开发,每一个人均可以从中受益。客户会清楚你的工做进度。反过来,他们也会提炼需求,而后趁热反馈到你的团队中。这样,他们就会基于本身进化到指望和理解为你导航,你编写的程序也就愈来愈接近他们的真实需求。客户也会基于可用的预算和时间,根据大家真实的工做进度,排列任务的优先级。
维护项目术语表(Wiki规格)
不一致的术语是致使需求误解的一个主要缘由。企业喜欢用看似普通浅显的词语来表达很是具体、深入的意义。
团队中的程序员们使用了和用户或者业务人员不一样的术语,最后由于“阻抗失调”致使Bug和设计错误。这样的事情常常发生。
为了不这类问题,需维护一份项目术语表。人们应该能够公开访问它,通常是在企业内部网或者Wiki上。
在项目开发过程当中,从术语表中为程序结构——类、方法、模型、变量等选择合适的名字,而且要检查和确保这些定义一直符合用户的指望。
跟踪问题(工做项)
随着项目的进展,你会获得不少反馈——修正、建议、变动要求、功能加强、Bug修复等。要注意的信息不少,随机的邮件和潦草的告示帖上没法应付的。因此,要有一个跟踪系统记录全部这些日志。
统一过程和敏捷方法都使用迭代和增量开发。使用增量开发,可一次开发应用功能的几个小组。每一轮的开发都是基于前一次的功能,增长为产品增值的新功能。这时你就能够发布或者演示产品。
迭代开发式是,你在小且重复的周期里完成各类开发任务:分析、设计、实现、测试和得到反馈,因此叫作迭代。
Show me a detailed long-term plan and I will show you a project that’s doomed.
对付大项目最理想的办法就是小步前进,这也是敏捷方法的核心。大步跳跃大大的增长了风险,小步前进才能够帮助你很好地把握平衡。
大部分用户都但愿如今就有一个够用的软件,而不是在一年以后,获得一个超级的好软件,肯定使产品可用的核心功能,而后把它们放在生产环境中,越早找到用户的手里越好。
询问用户哪些是产品可用且必不可少的核心功能,不要为全部可能须要的华丽功能而分心,不要沉迷于你的想象而去作那些华而不实的用户界面。有一堆的理由,值得你尽快把软件交到用户手中:只要交到用户手里,你就有了收入,这样就有更好的理由,继续为产品投资了。从用户那里获得的反馈会让咱们进一步理解什么是用户真正想要的,以及下一步该实现哪些功能。也许你会发现一些过去认为重要的功能,如今已经再也不重要了。
使用短迭代和增量开发可让开发者更加专一于本身的工做,若是别人告诉你有一年的时间来完成系统,你会以为时间很长,若是目标很遥远,又很难让本身去专一于他。在这个快节奏的社会,咱们都但愿更快地获得结果,但愿更快的见到有形的东西。这不必定是坏事。相反,他会使一件好事,只要把它转换成生产率和正面的反馈。
A fixed price guarantees a broken promise.
固订价格的合同会是敏捷团队的一大难题,咱们一直在讨论如何用持续、迭代和增量的方式工做。可是如今却有些人跑过来,想提前知道他会花费多少时间及多少成本。软件项目,天生就是变化无常的,不可重复。若是要提早给出一个固定的价格,就几乎确定不能遵照开发上的承诺。
根据本身的处境,选择不一样的战略。
对客户来讲,这种方式的好处是项目不可能会死亡。他们能够很早的看到工做的进度或者不足之处。他们老是能够控制项目,能够随时中止项目,不须要缴纳任何违约金。他们能够控制先完成哪些功能,并能精确的知道须要花费多少资金。总而言之客户会承担更低的风险。