Make It Work, Make It Right, Make It Fast
在软件开发的世界里,我们经常会遇到这样的场景:一个满怀热情的开发者开始了一个项目,但随着学习的深入,不断发现"更好"的做法,于是一遍遍地重构代码,优化架构,却始终无法完成项目。这种现象背后反映的是对软件开发本质认知的偏差。
今天我们来深入探讨一个被广泛认同却常被误解的软件开发原则:Make It Work, Make It Right, Make It Fast。这不仅仅是三个并列的目标,更重要的是它们之间严格的先后顺序。
为什么顺序如此重要?
这个原则的精髓不在于三个目标本身,而在于它们必须按照特定的顺序来执行。正确的理解应该是:首先让它运行起来,然后让它变得正确,最后让它变得快速。
Make It Work:软件生命的起点
让我们从一个根本问题开始思考:什么是一个真正"完成"的软件?
许多开发者会展示他们精心设计的架构图,优雅的代码结构,或者令人印象深刻的技术栈。但当被问及"这个项目上线了吗?有用户在使用吗?"时,答案往往是否定的。一个没有被实际使用过的软件,无论其内部多么精美,都不能算是真正的软件——它只是一堆沉睡的代码。
软件的生命周期可以分为两个根本不同的阶段:设计开发阶段和实际运行阶段。前者只是准备工作,真正的生命始于软件上线运行的那一刻。就像一辆汽车,无论设计图纸多么完美,只有真正在路上行驶时,我们才能验证它是否真的是一辆好车。
这就是为什么"Make It Work"是第一原则。如果你的主要目的只是为了在简历上罗列技术关键词,那么直接背诵技术文档可能更有效率。因为没有让软件真正运行起来,你就无法体验到各种技术在实际场景中的表现,无法了解它们的真正优势和局限性。
Make It Right:动态的"正确性"
有人会问:既然最终要做对,为什么不一开始就直接做对呢?
这个问题的答案涉及到"正确性"的本质。在software开发中,"正确"从来不是一个固定的标准,而是一个动态变化的概念。它的定义受到三个关键因素的影响:
认知范围的扩展:随着学习的深入,我们会不断接触新的理论、工具和最佳实践。今天认为正确的数据库直连方式,明天可能就被连接池技术取代;后天又可能发现ORM框架更适合;再后来又学会了Redis缓存优化。每一次认知的升级都会刷新我们对"正确做法"的理解。
技术生态的演进:我们常用"state of the art"来描述当前的最佳实践,但这个标准本身也在不断变化。Linux成为主流操作系统不是一夜之间发生的,而是一个渐进的过程。在竞争激烈的前端生态中,同一时期可能同时存在多个各有优势的技术方案,任何一个重大版本更新或企业背书都可能改变整个格局。
相对性的本质:软件开发中很少存在绝对正确或绝对错误的解决方案(完全无法运行的情况除外)。我们追求的不是完美,而是在给定约束条件下的"足够好"。因为在现实项目中,我们总是需要在多个目标之间做权衡,在一个地方追求完美往往会拖累整体进度。
因此,"正确性"需要一个参照系才有意义,而这个参照系的原点就是"Make It Work"。只有在软件真正运行起来之后,我们才能以此为基础去讨论什么是更好的做法。
Make It Fast:优化的艺术
有趣的是,大多数软件项目永远不会走到"Make It Fast"这一步,这背后有几个现实原因:
需求的现实性:以高并发、高性能为核心卖点的软件并非主流。在大多数应用场景中,用户对响应速度的感知是有阈值的。从10秒优化到1秒,用户能明显感受到改善;但从1秒优化到900毫秒,普通用户很难察觉差异。而通常情况下,如果没有犯下时间复杂度的低级错误,我们的优化空间往往就在这个微妙的区间内。
系统性的优化策略:在许多场景下,代码层面的优化效果远不如系统架构层面的改进。在互联网应用中,选择合适的CDN服务商,制定符合用户地理分布的部署策略,对用户体验的提升远超代码级别的微调。
优先级的现实:在项目的持续推进过程中,会不断有更高优先级的任务插入:bug修复、新功能开发、旧功能改造等。性能优化这种"锦上添花"的任务很容易被一再推迟。
但是,如果你的项目真的走到了"Make It Fast"这一步,那么恭喜你——你可以开始探索计算机科学更深层次的奥秘了。这时候讨论数据结构的缓存友好性、减少抽象层的开销、探索底层原理的优化潜力才变得有意义。
阶段性思维的价值
这个MMM原则最大的价值在于揭示了软件开发的阶段性特质。它提醒我们,软件开发是一个动态过程,不是一锤子买卖。
许多理论和最佳实践都在追求某个"最优解",看多了容易产生一种错觉:认为软件开发就应该一步到位,要做就做到最好。结果往往是永远都做不出来。
这种思维模式就像马斯洛的需求层次理论:先满足生存需求,再追求生活品质,最后才考虑自我实现。在软件开发中,Make It Work是生存,Make It Right是生活,Make It Fast是自我实现。
如果基础不牢固,在上层研究各种优化技巧就像是在研究"回字的四种写法"——技术上可能很精妙,但实际价值有限。
给开发者的启示
对于正在学习编程的同学,这个原则提供了一个清晰的行动指南:
先让代码跑起来:不要被完美主义困扰,先实现基本功能
在实践中学习:只有真正运行的软件才能提供有价值的反馈
拥抱迭代改进:认识到"正确"是一个演进的过程,而不是一次性的决定
理解优化的时机:性能优化是高级话题,需要在前两个阶段的基础上进行
这个原则不是在鼓励写糟糕的代码,而是在强调一种务实的开发哲学:承认软件开发的复杂性和不确定性,通过阶段性的改进来逐步接近理想状态。
记住,一个运行中的平凡软件,永远比一个完美的概念更有价值。让我们从让代码跑起来开始,踏实地走好软件开发的每一步。