2025-05-04 | 原子能 | 软件开发的第一原则

软件开发:别让完美主义拖垮你 先让项目跑起来

媒体详情

上传日期
2025-06-29 23:25
来源
https://www.youtube.com/watch?v=Sju32NqjQUc
处理状态
已完成
转录状态
已完成
Latest LLM Model
gemini-2.5-pro

转录

下载为TXT
speaker 1: 大家好,这里是原子能。 前些天在粉丝群里面有一个大学生很焦虑,他说自己简历上的项目一边写一边踩坑,设计一直在改,一直在优化,每样都要慢慢摸索。 现在快毕业了,这个项目还没有完整做出来。 对他这个情况。
speaker 2: 我引用了一句名言来回复,make it work, make it right and make it.
speaker 1: 这个著名的软件开发原则的字面意思就是把它做出来,把它做对,然后把它做快。 但这句话的重点不在于work right and fast,而是他们的先后顺序。 所以它真正准确的表达应。
speaker 2: 该是make it work first,就make it right,and finally make it fast.
speaker 1: 不然可能听过这个原则,甚至也照着这个来做,但是没有去深究他为什么这么说。 就像第20期视频的核心观点,No Why之后才是no how。 所以我们今天就来剖析这个,我认为是软件开发的最重要的原则。 群里这个小哥这一这一半改了,那一做一半又改了。 永远都在重构,在优化。 表面上来说,你的架构设计,你的代码质量,从专业水平的角度来说确实会变得更好。 但实际上你这个软件没有因此更接近终点,反而是越走越远了。 我看到过很多简历里面列出来那些炫酷的项目,对此我的提问都会是,他做完了吗? 上线了吗? 被谁用过了吗? 而回答往往也都是做完了还没上线,没有用户,这种都不能够算是真的做完了。 因为一个没有实际被使用过的软件,他压根就没有活过。 在整一个让编程再次伟大系列的第一个视频的第一个话题,就是软件的生命周期。 里面有提到软件在设计开发的阶段,这是前期只有在它上线那刻才是它生命的开始。 所以一个没有做完的软件,它的架构有多好,它的代码写的多美,它的性能有多强大,都是空谈,毫无意义。 如果你的主要目的只是为了在简历里面多列出来一些技术名词,那我建议你还不如直接去背诵八股文算了。 因为你压根没有让他运行起来。 所以某某技术在某某软件里面发挥了什么作用? 它的优点,它的缺点,你都没有真正在实战中体验到。 当面试官问起来的时候,你能回答的也只能是八股文的范畴。 那你这个项目还做来干嘛呢? 浪费时间。 所以说make it work是一切软件开发的第一原则。 只有在这个基础上,我们才有资格去讨论后面的make it right和make it fast。 有聪明人就会说了,那我为什么不开始就直接make it right呢? 一步直达终点,这一集就跟第七个包子的故事一个道理,既然吃七个包子就能饱,为什么不直接吃第七个呢? 当然我不是在说人不可能在一开始就知道怎么做是正确的,理论上确实能做到,但实际上很难。 因为正确的做法从来都不是一个constant,它不是一个常量,而是一个变量。 他的取值取决于三个因素,一是你的认知范围。 就像群里这位小哥,他在不断的学习中会接触到新的理论,新的思路。 在数据读取这件事上,他先是用了直连数据库,然后他又认识了connection pool连接池,然后又接触了o后面,还学到了用read进行缓存的优化,这些新的知识隔三差5就会刷新他所了解的正确做法。 二就是行业的发展,我们常常用state of the 2来指代当前的正确做法,但这个东西也不是在一夜之间忽然就怎么样通过全世界的程序员投票决定的,它是一个渐变的过程,就像我们说不出来Linus是在什么时候成为state of the 2的操作系统。 因为不同的社区,比如说学术界、开源界和业界,他们各自的需求不同,对Linus的接纳过程自然也不同。 更别说有些竞争激烈的领域,比如说前端生态,同一个时代都会有好几个不相上下的技术,某个大企业的背书或者是某一个大版本的功能发布,都有可能完全扭转整一个局势。 而第三个因素就是正确的相对性。 软件开发不存在绝对正确或绝对错误的解决方案。 当然那些完全跑不动的情况除外啊。
speaker 2: 从这个角度来说,我们都不应该用right and wrong这个词啊,应该用better和bro这里,不用best and wor是.
speaker 1: 因为在现实中我们不会盲目的追求完美的答案,而是一个足够好的就行了。 因为我们往往有很多事情要做,你在一个地方去纠结完美只会拖累我们解决其他问题的进度。 所以总的来说,正确是在一个时间和空间上的相对概念。 那么它自然要有一个参照系才成立,而这个参照系就是要有一个原点,这个原点就是前面提到的make it work。 然后你会发现你人生中开发的大多数软件都不会走到make it fast这一步。 首先是因为高频、高速、高并发为核心卖点的软件,无非是大家天天开发的东西。 所以在大多数的软件应用场景里面,对于响应速度、运行效率的感知,尤其是从用户的体验的这个角度来说,其实是很微妙的。 你要说从10秒钟到1秒钟的前进时间,大家都能够感受得到。 但是从一秒钟优化到900毫秒,一般人就不会有很明显的感觉。 只要你没有整出什么指数级时间复杂度的代码,通常情况下你的优化就是在1秒到900毫秒这个区间上。 而且在很多场景里面,代码上做优化远远不如在代码外的安排。 比如说在互联网场景,一个好的C D N服务商,一个符合用户的分布规律的一个部署策略,对于用户体验的优化效果远远高出代码层面的优化。 而更常见的情况是在软件项目的不断推进过程中,会持续的有更多更高优先等级的任务被插进来。 比如bug的修复,新功能的开发,为了能够开发某些新功能,而而需要对某些旧功能进行改造。 那从一开始就存在了这个性能优化这个任务,很容易就一直被压在箱底。 如果你开发了这个软件,排除万难,终于来到了make key fast这一步,那么恭喜你可以开始探索计算机技术更多更深层次的奥妙了。 比如在第五期视频里面,我们探索了链表这个数据结构的性能局限,以及相对而言数组结构的优点。 或者在第六期视频里面,我们探索了技术框架带来的额外抽象层所造成的额外负担。 来减少抽象层的价值。 或者第十期视频里我们探索了怎么往底层原理走,从而获得高出几个数量级的优化效果。 或者第13期视频里面我们探索了如何通过砍掉服务间的交流成本,将一切逻辑纳入数据库的高速架构。 或者15期视频里我们探索的正则表达式这种日常工具的性能缺陷,以及不同场景的替换方案。 后者第18集视频里面我们探索了文本作为数据结构的缺点和一些二进制格式的应用场景。 这些探索在这个阶段才有价值。 在你的软件真正运行起来之后,在你给它打造一个足够优秀的架构基础之后,在这之上的优化才能真正的有所发挥。 如果你的根基是千疮百孔的那在上面研究哪个数据结构能够更好的击中cpu缓存,就有点像是在研究回字的4种写法。 这个道理有点像马斯洛需求理论,先满足生存需求,再满足生活需求,最后才有余地去考虑人生的升华。 那么make it work就是生存,make it right是生活,make it fast是升华。 在我的这些视频的评论区里面,也经常会看到有些人对内容嗤之以鼻,不屑一顾。 我想可能就是因为他们误把这些内容当做是软件开发的生存需求了。 所以就会觉得说写个软件而已,还要搞了这么多花里胡哨的,你这是在误人子弟。 回过头来,我觉得整一个原则的最大价值在于把软件开发是一种具有阶段性,是一个动态过程的这个特性给很好的展现了出来。 大多数的理论都是在追求某一个最好的结局,比如某某东西要怎么样做才最好,某某问题的最好的答案是什么等等。 看多了这些理论,就会容易陷入一个错觉,觉得软件开发就是一锤子买卖,要做就做到最好才能拿出手,结果呢永远都出不了手。 所以希望这次讨论能够让大家打开一点思路,让你的编程再次伟大。 我们下期见,拜拜。

最新摘要 (详细摘要)

生成于 2025-06-29 23:28

概览/核心摘要

本内容深入剖析了软件开发的核心原则:“Make it Work, Make it Right, Make it Fast”,并强调其价值在于严格的先后顺序。开发的首要任务是让产品能够运行(Make it Work),因为软件的生命始于上线被用户使用,一个未完成的项目毫无价值。在此基础上,才能进入第二阶段,即逐步优化,使其“正确”(Make it Right)。“正确”并非一成不变的绝对标准,而是受开发者认知、行业趋势和具体场景影响的相对概念。最后,仅在必要时才考虑提升性能(Make it Fast),这一阶段对多数项目并非必需,且常被更高优先级的任务取代。该原则旨在纠正追求“一步到位”的完美主义误区,通过将开发过程类比为马斯洛需求层次(Work为生存,Right为生活,Fast为升华),倡导开发者以阶段性、动态的视角确保项目最终能够成功交付。

软件开发的第一原则:Make it Work

软件开发的首要且不可逾越的原则是“Make it Work”(让它能跑起来),即优先确保软件能够实现核心功能并投入实际运行。

  • 核心观点:广为流传的口号“make it work, make it right, make it fast”其精髓并非并列的三个任务,而是它们之间严格的先后顺序。准确的表述应为:“首先让它跑起来,然后把它做对,最后再让它变快。”
  • 软件生命周期的起点:视频强调,软件只有在上线被实际使用时,其生命周期才真正开始。一个从未上线、没有用户的项目,无论其内部设计多么精妙,都如同“从未活过”,是毫无意义的空谈。
  • 避免完美主义陷阱:许多开发者常陷入持续重构和优化的循环,看似提升了技术水平,实则离项目完成越来越远。这种为了在简历上展示技术而做的项目,因缺乏实战经验,在面试中也只能复述理论知识。
  • 一切的基础:只有在“Make it Work”的基础上,后续的优化和改进才有讨论的资格和价值。

第二阶段:理解“Make it Right”的相对性

当软件能够稳定运行后,便进入了“Make it Right”(把它做对)的阶段。然而,“正确”并非一个固定的终点,而是一个动态变化的相对概念。

  • “正确”的演变性:试图一开始就做到完美是不切实际的,这好比“既然吃第七个包子能饱,为何不直接吃第七个?”。正确的做法是一个变量,而非一成不变的常量。
  • 影响“正确”的三大因素
    1. 认知范围:开发者的知识和视野会不断更新,从而改变对“最佳实践”的理解(如数据访问方式从直连数据库到使用连接池、ORM乃至缓存的演进)。
    2. 行业发展:“state of the art”(当前最佳技术)是渐变形成的,而非一蹴而就。在前端等快速发展的领域,不同技术路线可能长期并存,局势随时可能因大厂背书或版本更新而改变。
    3. 解决方案的相对性:软件开发中不存在绝对的“对”与“错”,更合适的描述是“更好”(better)与“更差”(worse)。现实中应追求“足够好”的方案,而非在单一问题上过度纠结完美,从而拖累整体进度。
  • “Work”作为参照系:“正确”是一个时空上的相对概念,它的确立需要一个参照原点,这个原点就是第一阶段“Make it Work”的成果。

第三阶段:“Make it Fast”的适用场景

“Make it Fast”(让它跑得快)是开发的最后阶段,但大多数软件项目并不会,也无需走到这一步。

  • 非普遍需求:以高并发、高速度为核心卖点的软件毕竟是少数。对大多数应用而言,用户对毫秒级的性能提升感知并不明显。只要代码没有指数级的时间复杂度,通常的性能表现已足够满足需求。
  • 外部优化更具性价比:在许多场景下,代码层面的优化效果远不如外部策略。例如,在互联网应用中,选用合适的CDN服务或优化服务器部署策略,对用户体验的提升远超于修改代码。
  • 优先级的现实:在项目迭代过程中,缺陷修复、新功能开发等任务的优先级通常远高于性能优化,导致后者常常被无限期搁置。
  • 优化的真正价值:只有当软件已稳定运行且架构合理(Make it Work & Right)之后,深入的性能优化才具备价值。此时,对数据结构、框架抽象、底层原理等进行探索,才能真正发挥作用。否则,在一个根基不稳的系统上谈论微观优化,无异于“研究回字的四种写法”。

总结与启示

该原则的最大价值在于揭示了软件开发是一个阶段性的动态过程,而非一蹴而就的“一锤子买卖”。它有力地反驳了那种“要做就做到最好才能拿出手”的完美主义心态,正是这种心态导致许多项目“永远都出不了手”。

通过将开发过程类比为马斯洛需求理论(Work是生存,Right是生活,Fast是升华),它为开发者提供了一个清晰的行动指南:首先确保生存,再追求生活品质,最后才有余力实现自我升华。遵循这一务实的原则,能帮助开发者摆脱困境,真正将想法变为现实。