详细摘要 摘要
生成:2025-06-06 20:51摘要详情
- 音频文件
- 2024-04-03 | 让编程再次伟大#2 | 听君一席话,胜上十年班
- 摘要类型
- 详细摘要
- LLM 提供商
- openai
- LLM 模型
- gemini-2.5-pro-preview-06-05
- 已创建
- 2025-06-06 20:51:37
摘要内容
概览/核心摘要 (Executive Summary)
本次分享的核心论点是,软件开发中的许多困难和焦虑源于程序员自身的主观行为,如过度设计、无谓争论和盲目追逐技术,而非工作本身的客观难度。演讲者(speaker 1)倡导“大道至简”的原则,认为随着技术和硬件的发展,开发工作本应越来越简单。他通过一系列亲身经历和行业案例,批判了多种导致项目复杂化、效率低下的“反模式”。
主要观点包括:
1. 避免过度开发:不要为不存在或遥远的需求构建复杂功能,如为一个纯国内产品设计国际化框架,或用Hadoop集群处理手机都能装下的小数据。
2. 建立并遵守规则:通过自动化工具(如CI/CD中的格式化)强制执行统一的代码规范,以杜绝在括号位置、命名等琐碎问题上的无谓争论。
3. 代码是工具,以人为本:规则应以提升效率为目的,而非追求虚无缥缈的“优雅”。演讲者尖锐批评了Clean Code中部分脱离实际、反人性的教条。
4. 精简技术栈:技术栈与技术债成正比,应追求“越小越好”。引入新技术的标准是它能否替代多个旧技术,同时应深入掌握PostgreSQL这类功能强大的成熟技术以解决多样化问题。
5. 停止造轮子:自研工具的长期维护成本极高,多数以失败告终。演讲者还对比了中美大厂在开源文化上的差异。
6. 崇尚朴素方案:面对复杂问题(如数据库扩容),最简单直接的方案(如按业务或客户拆分数据库)往往最有效。Pinterest通过此方法,用88个独立的MySQL数据库支撑了千万级月活。
最终结论是,程序员应回归工程本质,聚焦于用最简单、直接的方式解决实际问题,从而提升效率、减少不必要的内耗。
一、过度开发:自寻烦恼的根源
演讲者认为,程序员常常为了“未雨绸缪”或显得经验丰富,而凭空想象出一些不存在的需求并投入大量精力去实现,造成了严重的资源浪费。
-
前端案例:不必要的国际化 (i18n)
- 背景:一个产品明确只面向中国市场,没有出海计划。
- 过度设计:项目主设计者坚持构建了一套完整的国际化框架,包括:
- 将所有前端文字提取到词典。
- 为测试效果,完整翻译了一整套英语词典,甚至自创了一些名词。
- 预留了德语、法语、日语等多种语言接口。
- 负面影响:
- 工作量巨大:每次UI文字修改都需同步更新所有词典。
- 技术复杂性:引入了代码与词典的版本对应、浏览器缓存、CDN缓存等一系列问题。
- 性能问题:词典文件的异步加载可能导致页面抖动。
- 最终结果:该功能从未被实际使用,投入的工时被完全浪费,唯一的价值是成为一个“警醒”的反面教材。
-
后端案例:用“高射炮打蚊子”
- 背景:一个数据处理任务,本质上只是简单的周期性统计(每小时、每日)。
- 过度设计:项目负责人坚持使用Hadoop全家桶来处理。
- 数据量:实际上线后,每小时处理的数据量仅约10GB,完全可以载入内存直接处理。
- 引用观点:演讲者引用其大学教授的话:> “你们的数据如果连这一台手机都装不满,那你就别好意思说自己的什么鬼大数据,也别去想什么分布式处理那种东西啊,都是高射炮打蚊子。”
- 负面影响:
- 时间浪费:仅部署和接入Hadoop集群就耗费了数月工时。
- 性能更差:通过网络调用Hadoop集群的速度远慢于直接在内存中处理,存在“好几个量级的区别”。
- 反思:演讲者表示,如果当时能提出反对,本可以为团队节省数月宝贵时间。
二、规范与纪律:没有规矩不成方圆
演讲者指出,在缺乏明确和自动化规范的情况下,团队会陷入无休止的、关于代码风格的低效争论中。
-
常见问题:
- 在Code Review中为琐碎问题激烈争吵,例如:
- 大括号放哪里。
- 缩进是几格。
- 函数和参数的命名。
- 新函数应该放在哪个文件。
- 演讲者提到,曾有人为文件放置问题在评论区来回争论十几条长篇大论,比周报写得都长。
- 在Code Review中为琐碎问题激烈争吵,例如:
-
解决方案与建议:
- 事前约定:在项目开始前,团队应统一指定规则。
- 自动化执行:将规范整合到CI/CD流程中,通过自动化工具(如
formatting工具)在代码提交、合并、构建前强制格式化。这能从根本上杜绝冲突。 - API设计:API是重要的对外交流工具,其设计混乱会给所有合作方带来困难。
- 反面教材:点名批评微信的API,称其为“软件工程史上数一数二的反面教材”,> “你说他的api是屎,那就是对屎的侮辱”。
- 正面建议:遵守成熟的规范(如RESTful API)或统一的内部标准,像专业人士一样按规则执行。
三、代码的本质:作为工具,而非艺术
此部分是对上一观点的补充,演讲者批判了部分为了“美感”而牺牲实用性的编码规范,尤其是Clean Code。
- 核心观点:代码是解决问题的工具,其发展的方向始终是“让他更容易写、更容易看、更容易用、更容易合作”,是一种以人为本的工程实践。
- 对
Clean Code的批判:- 动机错误:当规则是源于“虚无缥缈的所谓的美观的理由”,而不是为了让工作更容易时,其方向就是错误的。
- 追捧者画像:
- 刚毕业的学生:被书中“高大上、好优雅”的概念所迷惑。
- 不参与一线开发的管理层:只听到
Clean Code纸面上的好处,便要求下属强制遵守。演讲者认为这类人还催生了Scrum Master这种“狗都闲的职业”。
- 推崇的理念:Unix哲学
- 演讲者视之为“软件设计层面的圣经”,因为它处处提醒开发者要“接地气,不要花里胡哨”。
- 例如,Unix哲学提倡纯文本是最好的API接口,因为它能保证长久的兼容性和可读性。
四、技术栈:越小越好,警惕技术债
演讲者强调,庞大的技术栈非但不是能力的体现,反而是技术债的温床。
- 普遍误解:许多程序员喜欢在项目中“堆料”,认为使用的技术越多,越能显得自己有知识,从而得到赏识。
- 残酷现实:
- 上级只关心产品功能的实现,技术选型多是程序员的“自娱自乐”。
- 技术栈与技术债成正比:“你的堆叠的技术单越多,你借的债就越多,你欠的东西以后都是要还的。”
- 正确的实践:
- 引入新技术的标准:当一项新技术能同时取代多项老技术时,它才具有价值。
- 案例:引入Kubernetes,直接替代了多个旧的DevOps技术,简化了CI/CD和运维,最终缩小了技术栈、降低了人力成本和维护难度。
- 精通成熟技术:一个成熟的技术往往能解决多种问题。
- 案例:精通PostgreSQL,可以同时处理关系型数据、JSON数据(替代NoSQL)、图数据(替代Neo4j)和键值数据(替代Redis),从而将技术栈大幅减少。
- 引入新技术的标准:当一项新技术能同时取代多项老技术时,它才具有价值。
五、造轮子:被严重低估的难度
造轮子是一项高风险、高成本的活动,绝大多数以失败告终。
- 造轮子的陷阱:
- 开发者最初只想解决眼前问题,但随后会希望将其通用化,这便意味着这个“轮子”变成了一个需要长期维护的独立产品。
- 随着应用场景增多,修改难度、维护兼容性和引入Bug的风险会急剧增加。
- 结果:大部分自造的轮子在被大规模应用前,就已被开发组“弃坑”。
- 造轮子的原因(据国内某咨询公司调研):
- 别人的轮子不好用,缺少关键功能。
- 在企业内部使用别人的轮子,沟通和扯皮成本太高。
- 中美大厂文化对比:
- 中国大厂:喜欢“关起门来自己用”,甚至不分享给隔壁部门,有一种“天国上朝”的心态。
- 美国大厂:喜欢第一时间开源,到处宣传推广,通过先发优势和社区力量巩固其地位,如同“好莱坞”模式。
- 国产技术的国际影响力:
- 演讲者个人表示见识有限,仅能想到百度的ECharts和阿里的Ant Design这两个前端工具在国际上有一定知名度。
- 他明确指出Vue.js不算在内,因为它只是华人开发的个人项目。
六、大道至简:最好的解决方案往往最朴素
演讲者通过案例论证,面对复杂工程问题时,最简单、最直接的“笨办法”往往是最高效、最可靠的。
-
案例一:Pinterest的数据库扩容
- 问题:数据量增长,数据库面临扩容压力。
- 复杂的常规方案:分布式架构、数据库集群。演讲者强调,将集群与数据库的ACID特性结合,其复杂度是“图灵奖的级别”。
- Pinterest的朴素方案:数据拆分 (Sharding)。
- 初期:他们曾拥有一个极其复杂的集群环境,包括14个MySQL、15个Couchbase、10个Redis等共七种数据库集群,而当时团队只有3个程序员。
- 转型:他们放弃了所有集群,改为简单的拆分逻辑。
- 不同客户的数据分库存放。
- 特别大的表单独拆分到一个数据库。
- 成果:当月活用户达到2000万时,其主数据库
MySQL已被拆分为88个独立实例,依然稳定支撑所有业务。
- 收益分析:用几行应用层代码(判断数据来源)的微小代价,解决了一个“图灵奖级别的难题”,性价比极高。
-
案例二:演讲者的个人经历
- 他曾用一个Excel表格替代了某子公司整个用Java Web编写的CMS系统。
- 用户不仅没有抱怨简陋,反而认为Excel比原来的系统“好用100倍”,因为它更直接地解决了问题。
核心结论
演讲者总结全文,所有观点都指向一个核心思想:大道至简。在软件开发中,应当始终追求最简单、最直接、最朴素的解决方案,这才是通往高效和成功的正确道路。