Make it run, make it right, make it fast
如果问我工作十多年后相比刚毕业参加的时候,学到了哪些重要的经验,那么“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的更多相关文章
- Fast Run:提高 MegEngine 模型推理性能的神奇功能
作者:王博文 | 旷视 MegEngine 架构师 一.背景 对于深度学习框架来说,网络的训练/推理时间是用户非常看中的.在实际生产条件下,用户设计的 NN 网络是千差万别,即使是同一类数学计算,参数 ...
- 深度学习框架如何自动选择最快的算法?Fast Run 让你收获最好的性能!
作者:王博文 | 旷视 MegEngine 架构师 一.背景 对于深度学习框架来说,网络的训练/推理时间是用户非常看中的.在实际生产条件下,用户设计的 NN 网络是千差万别,即使是同一类数学计算,参数 ...
- NB学校的NB课程的NB教材——CSAPP
CMU是全美以至全球公认的CS最猛的大学之一,没办法,作为CS的发源地,再加上三位神一样的人先后在此任教:Alan Perlis(CS它祖宗+第一届Turing奖获得者).Allen Newell(A ...
- bottle源码
import sys __author__ = 'Marcel Hellkamp' __version__ = '0.13-dev' __license__ = 'MIT' ############# ...
- Microsoft SQL Server Trace Flags
Complete list of Microsoft SQL Server trace flags (585 trace flags) REMEMBER: Be extremely careful w ...
- October 26th, 2017 Week 43rd Thursday
For success, attitude is equally as important as ability. 为取得成功,态度与能力一样重要. Today I read a news about ...
- 每日英语: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 ...
- 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 ...
- ZOJ-2972-Hurdles of 110m(线性dp)
Hurdles of 110m Time Limit: 2 Seconds Memory Limit: 65536 KB In the year 2008, the 29th Olympic ...
随机推荐
- C# Delegate 匿名 Delegate
C#6.0新添加了 lambda的强力支持,用lambda的确可以节省好多代码,让代码看起来更简洁,更直观: 这里做一个笔记,C#的匿名委托 Demo class Program { static v ...
- (转)EntityFrameword “Reverse Engineer Code First” 连接 MySql
转自:http://stackoverflow.com/questions/19676624/error-trying-to-reverse-engineer-code-first-mysql-dat ...
- 『TCP/IP详解——卷一:协议』读书笔记——06
2013-08-20 14:41:01 2.8 最大传输单元MTU MTU,最大传输单元:以太网和802.3对数据帧的长度都有一个限制,其最大值分别是1500和1492字节.这个不同网络对应的传输上限 ...
- FileOutputStream保存文件
//保存文件,根据传入的路径,存放在SD卡目录下public boolean saveToPath(String title, String pageName) { Bitmap b = getCha ...
- glRotate函数
void glRotate( GLdouble angle, GLdouble x, GLdouble y, GLdouble z ) API说明:angle为旋转角度,单位为度:x,y,z是旋转轴的 ...
- Java String.split()用法小结(转)
第一种方法:string s=abcdeabcdeabcde;string[] sArray=s.Split('c') ;foreach(string i in sArray)Console.Writ ...
- C++混合编程之idlcpp教程Python篇(3)
上一篇 C++混合编程之idlcpp教程Python篇(2) 是一个 hello world 的例子,仅仅涉及了静态函数的调用.这一篇会有新的内容. 与PythonTutorial0相似,工程Pyth ...
- livequery源码解读
从使用说起: 若干年前,有一天发现,通过js代码创建的html元素及ajax加载的html,无法被$([selector]).click(function(){...})绑定上事件,于是发现了jQue ...
- C#设计模式总结
一.引言 经过这段时间对设计模式的学习,自己的感触还是很多的,因为我现在在写代码的时候,经常会想想这里能不能用什么设计模式来进行重构.所以,学完设计模式之后,感觉它会慢慢地影响到你写代码的思维方式.这 ...
- github心得
心得 : 1:安装:省略 2. 配置 Git 以及上传代码 安装 Git 成功后,如果是 Windows 下,选择 Git Bash ,在命令行中完成一切,可能开始有点麻 烦,不过就那几条命令行,用 ...