如果问我工作十多年后相比刚毕业参加的时候,学到了哪些重要的经验,那么“Make it work, make it right, make it fast”一定是其中最重要的经验之一。第一次听到这句话是从以前老板 @沈嵘 那里,然后发现是来源自大牛 Kent Beck 《Make It Work Make It Right Make It Fast》。这是软件项目开发的一条经典原则,实际上不限于软件开发领域,它把一个项目分成三个阶段,每个阶段有不同的侧重。

Make it work

在这个阶段,了解项目需求后,聚焦于项目所需要的最小需求,尽快让项目先跑起来,不必过于追求设计和性能。同时,展示你的结果,并根据反馈快速调整。

这个阶段的重点在于需求的响应,以最快的速度实现需求。这是个快速试错,快速迭代,验证需求的过程。

Make it right

到了这个阶段,需求基本上已经稳定,要保证项目执行结果正确,更多的测试,尽可能少的bug。但"Make it right"并不仅仅意味着只要结果正确就够了,还需要对系统进行重构,优化系统设计,让代码更简洁结构更清晰,易于扩展和维护。
这个阶段的重点在于保障系统的稳定,同时优化设计和重构。

Make it fast

当系统已经稳定,设计也趋于成熟的时候,还需要对系统进行性能上的优化,良好的性能,不仅可以提升用户体验,同时也能降低运维的成本。这里的“fast”,不仅体现在程序的性能,也包括对整体项目流程效率的提升,例如自动编译、自动部署的工具或脚本,如果前期没有做,那么这时候就要加上了。

这个阶段的重点在于系统的性能优化,包括项目流程效率的优化。

常见误区

“Make it work, make it right, make it fast” 这个原则拆开来很好理解,但这三个阶段不是孤立的,而是一个整体,同时又是有先后次序的。

在我初学编程的时候,要达到Make it work也并不是太难的事情,网上找些开源项目,参考书上的教程,总能把一个不算太复杂的项目搭出来,但却没有能力去make it right,更没有办法去make it fast。最终的结果就是做出来的项目难以维护,性能低下。

在我学了一段时间编程后,懂了一些设计模式,了解了一些性能优化的办法,于是开始直接省略第一步,首先考虑的是“Make it fast”,假想系统有超大用户超大访问量,然后考虑的是“Make it right”,设计的时候为了设计模式而设计模式,恨不得把所有设计模式应用个遍,最后再想着"Make it work",但这时候因为前期的过度设计,系统复杂而臃肿,要让它work,简直是太难了,最终就是开发频繁延期,甚至难产,做出来的程序也难以维护。

经过这么多年的磨炼,现在大到项目,小到具体功能,在每个版本都会尽可能的按照这个原则来实行:

Make it work: 首先最低限度满足项目需求,将初步结果拿出来演示,根据反馈快速调整
Make it right: 需求稳定后,对代码进行重构,良好的设计,易于维护和扩展
Make it fast: 设计稳定后,对实际运行情况中出现的性能问题进行优化
经历这些阶段后,项目的进度和质量都会有一个比较好的结果。

Make it run, make it right, make it fast的更多相关文章

  1. Fast Run:提高 MegEngine 模型推理性能的神奇功能

    作者:王博文 | 旷视 MegEngine 架构师 一.背景 对于深度学习框架来说,网络的训练/推理时间是用户非常看中的.在实际生产条件下,用户设计的 NN 网络是千差万别,即使是同一类数学计算,参数 ...

  2. 深度学习框架如何自动选择最快的算法?Fast Run 让你收获最好的性能!

    作者:王博文 | 旷视 MegEngine 架构师 一.背景 对于深度学习框架来说,网络的训练/推理时间是用户非常看中的.在实际生产条件下,用户设计的 NN 网络是千差万别,即使是同一类数学计算,参数 ...

  3. NB学校的NB课程的NB教材——CSAPP

    CMU是全美以至全球公认的CS最猛的大学之一,没办法,作为CS的发源地,再加上三位神一样的人先后在此任教:Alan Perlis(CS它祖宗+第一届Turing奖获得者).Allen Newell(A ...

  4. bottle源码

    import sys __author__ = 'Marcel Hellkamp' __version__ = '0.13-dev' __license__ = 'MIT' ############# ...

  5. Microsoft SQL Server Trace Flags

    Complete list of Microsoft SQL Server trace flags (585 trace flags) REMEMBER: Be extremely careful w ...

  6. October 26th, 2017 Week 43rd Thursday

    For success, attitude is equally as important as ability. 为取得成功,态度与能力一样重要. Today I read a news about ...

  7. 每日英语:Three Shows That Changed The Way Networks Think About Viewership

    As we continue examining this season’s DVR success stories in The Blacklist and Sleepy Hollow it mak ...

  8. TZOJ 1545 Hurdles of 110m(01背包dp)

    描述 In the year 2008, the 29th Olympic Games will be held in Beijing. This will signify the prosperit ...

  9. ZOJ-2972-Hurdles of 110m(线性dp)

    Hurdles of 110m Time Limit: 2 Seconds      Memory Limit: 65536 KB In the year 2008, the 29th Olympic ...

随机推荐

  1. 斯坦福第十八课:应用实例:图片文字识别(Application Example: Photo OCR)

    18.1  问题描述和流程图 18.2  滑动窗口 18.3  获取大量数据和人工数据 18.4  上限分析:哪部分管道的接下去做 18.1  问题描述和流程图

  2. cell跳出动画

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  3. 条形码软件开发包Dynamic .NET TWAIN v5.0提供WPF功能

    Dynamsoft是一家著名的开发条形码控件开发包的公司,其旗下 Dynamic .NET TWAIN产品近日升级到v5.0版本,对于在支持WPF功能方面有着较大的改进.下面就让我们一起来看看这次更新 ...

  4. 能省则省:在ASP.NET Web API中通过HTTP Headers返回数据

    对于一些返回数据非常简单的 Web API,比如我们今天遇到的“返回指定用户的未读站内短消息数”,返回数据就是一个数字,如果通过 http response body 返回数据,显得有些奢侈.何不直接 ...

  5. KALI LINUX WEB 渗透测试视频教程—第16课 BEEF基本使用

    Kali Linux Web 渗透测试视频教程—第16课  BeEF基本使用 文/玄魂 目录 Kali Linux Web 渗透测试视频教程—第16课  BeEF基本使用............... ...

  6. jenkins2 Jenkinsfile和load

    更复杂的pipeline实例,使用了Jenkinsfile和load. 文章来自:http://www.ciandcd.com 文中的代码来自可以从github下载: https://github.c ...

  7. JavaScript函数绑定

    一个简单的函数绑定 在JavaScript与DOM交互中经常需要使用函数绑定,定义一个函数然后将其绑定到特定DOM元素或集合的某个事件触发程序上,绑定函数经常和回调函数及事件处理程序一起使用,以便把函 ...

  8. 算法练习26-xx

    26.左旋转字符串(字符串) 题目:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部. 如把字符串abcdef左旋转2位得到字符串cdefab.请实现字符串左旋转的函数.要求时间对长 ...

  9. CSS/JS图片鼠标悬浮一道光闪过

    看到有些网站logo鼠标悬浮上面的时候,会出现一道光,一闪而过,刚开始以为是gif图,已审查, 居然不是:现在就实现在这种效果: 先看看CSS实现的效果图: 看到没,就是这道刺眼的白光....   啊 ...

  10. Javascript--练习(包括主界面图片轮播效果)

    练习一 例子1:做一个问题,如果输入的答案正确则弹出正确,错误弹出错误: 这里在text里面写了一个daan属性,里面存了答案的值,点击检查答案的时候cheak输入的内容和答案是否一样: Body中代 ...