Street Coder: The rules to break and how to break them
书籍定位
《Street Coder: The rules to break and how to break them》是一本颠覆传统软件开发教条的实用指南,由前微软工程师、土耳其最大社交平台Ekşi Sözlük创始人Sedat Kapanoğlu撰写。本书基于作者三十年的自学者和职业开发者经验,挑战了软件开发中的许多"最佳实践",提供了一种务实、接地气的编程哲学。不同于传统的技术书籍,本书更像是一位经验丰富的"街头程序员"的智慧分享,教导读者如何在现实世界的软件开发中生存和繁荣。书中充满了反直觉的建议、实用的反模式,以及如何在保持代码质量的同时打破规则的艺术。
核心内容(章节描述)
本书共9个章节,从基础概念到高级主题,每章都挑战一个或多个软件开发的传统观念:
第1章:走向街头
介绍什么是"街头程序员"——在专业软件开发世界中通过反复试验形成的实用主义开发者。探讨现代软件开发的问题:技术过多、范式滑翔、技术黑箱、低估开销、"不是我的工作"心态,以及"琐碎即天才"的理念。本章为全书定下基调:不是要教读者遵循规则,而是要教他们何时以及如何打破规则。
第2章:实用理论
深入讲解算法和数据结构的实际应用,而不是纯粹的学术理论。包括大O表示法的实际意义、各种数据结构的内部工作原理(字符串、数组、列表、链表、队列、字典、HashSet、栈、调用栈),以及类型系统的实际价值。特别强调类型系统如何提供"有效性证明",帮助开发者编写更安全、更快速、更易维护的代码。
第3章:有用的反模式
这是本书的核心章节,挑战了许多软件开发中的神圣原则:
- "如果没坏,就打破它":面对代码僵化时的策略
- "从头开始写":何时应该重写而不是重构
- "修复它,即使没坏":面向未来的编程
- "重复自己":挑战DRY(不要重复自己)原则
- "在这里发明":何时应该自己实现而不是使用第三方库
- "不要使用继承"和"不要使用类":提倡使用枚举和结构体
- "写糟糕的代码":包括不使用if/else和使用goto的实用场景
- "不要写代码注释":通过好的命名和函数设计来替代注释
第4章:美味的测试
挑战传统的测试驱动开发(TDD)观念,提供实用的测试策略:
- 各种测试类型:手动测试、自动化测试、生产环境测试
- 如何停止担忧并爱上测试
- 不要使用TDD或其他首字母缩略词
- 为自己写测试
- 决定测试什么:尊重边界、代码覆盖率
- 不要写测试:当不写代码或不写所有测试是更好的选择
- 让编译器测试你的代码:消除空检查、范围检查、有效值检查
- 命名测试的艺术
第5章:有价值的重构
提供实用的重构策略,而不是教条的方法:
- 为什么我们要重构
- 架构变更:识别组件、估计工作和风险、重构的"声望"
- 重构以使重构更容易
- 可靠的重构技术
- 何时不重构:识别重构的适当时机
第6章:通过审查实现安全
提供实用的安全方法,而不是复杂的安全理论:
- 超越黑客:理解真正的威胁
- 威胁建模:口袋大小的威胁模型
- 编写安全的Web应用:设计时考虑安全、安全通过模糊性的有用性、不要自己实现安全
- SQL注入攻击、跨站脚本(XSS)、跨站请求伪造(CSRF)的实际防御
- 绘制第一道防线:不要使用验证码、验证码替代方案、不要实现缓存
第7章:有主见的优化
挑战"过早优化是万恶之源"的观念:
- 解决正确的问题:简单的基准测试、性能与响应性
- 缓慢的解剖学:识别性能瓶颈
- 从顶部开始:嵌套循环、字符串导向编程、评估2b || !2b
- 打破瓶颈:不要打包数据、本地购物、保持依赖工作分离、可预测性、SIMD
- I/O的1和0:使I/O更快、使I/O非阻塞、古老的方式、现代async/await、异步I/O的陷阱
- 如果其他都失败,使用缓存
第8章:可口的可扩展性
提供实用的可扩展性策略:
- 不要使用锁:双重检查锁定的陷阱
- 拥抱不一致性:可怕的NOLOCK
- 不要缓存数据库连接:ORM的形式
- 不要使用线程:异步代码的陷阱、使用异步进行多线程
- 尊重单体架构:微服务不是银弹
第9章:与bug共存
提供实用的错误处理哲学:
- 不要修复bug:识别哪些bug值得修复
- 错误恐怖:异常的赤裸真相、不要捕获异常、异常弹性、无事务的弹性、异常与错误
- 不要调试:printf()调试、转储潜水、高级橡皮鸭调试
教学特色
- 反直觉的智慧:书中充满了看似违反直觉但实际上非常实用的建议
- 经验驱动:每一条建议都基于作者三十年的实际开发经验
- 语言不可知:虽然示例使用C#和.NET,但概念适用于任何编程语言
- 实用主义优先:强调什么在实际工作中有效,而不是什么在理论上正确
- 幽默风格:作者以幽默、自嘲的方式讲述严肃的技术话题
核心哲学
- 街头智慧:在专业世界中通过反复试验形成的实用主义
- 质疑一切:不盲目接受"最佳实践",而是理解其背后的原因
- 成本意识:认识到创建软件的成本不仅仅是谷歌搜索和打字
- 务实决策:基于实际约束而不是理论理想做出决策
- 持续学习:将每个问题视为学习机会,而不是障碍
技术深度
- 数据结构的实际应用:不仅讲解数据结构是什么,更重要的是何时使用它们
- 类型系统的力量:展示类型系统如何成为开发者的强大盟友
- 性能优化的务实方法:提供实际的性能优化策略,而不是理论上的最佳实践
- 安全性的实用方法:关注实际威胁和防御,而不是复杂的安全理论
- 错误处理的哲学:重新思考我们如何处理和响应错误
反模式的价值
本书的核心贡献是重新评估了许多被认为是"反模式"的实践,并展示了它们在特定情况下的价值:
- 重复代码:有时重复比抽象的复杂性更好
- 从头开始:有时重写比修复遗留代码更有效
- 糟糕的代码:在某些约束下,"糟糕"的代码可能是最实用的选择
- 不使用测试:在某些情况下,不写测试可能是正确的决定
- 不使用锁:在某些并发场景中,避免锁可能是更好的策略
适用读者
本书特别适合以下人群:
- 有经验的开发者 - 对传统"最佳实践"感到失望,希望获得更实用的指导
- 中级程序员 - 希望超越基础,理解软件开发的现实世界
- 自学者 - 通过非传统途径学习编程的开发者
- 技术领导者 - 需要做出务实技术决策的团队负责人
- 对软件开发哲学感兴趣的任何人 - 希望理解软件开发的本质而不仅仅是语法
- 感到"冒名顶替综合症"的开发者 - 需要确认他们的实用方法实际上是有效的
阅读建议
心态调整:
阅读本书需要开放的心态,愿意挑战自己已有的观念。作者故意使用挑衅性的章节标题(如"不要写测试"、"写糟糕的代码")来引起注意,但每一条建议都有其上下文和理由。
实践方法:
- 不要全盘接受:批判性地思考每一条建议,理解其适用场景
- 实验验证:在实际项目中尝试书中的建议,观察结果
- 上下文意识:记住每条建议都有其适用的上下文
- 平衡艺术:学会在"最佳实践"和"街头智慧"之间找到平衡
阅读路径:
建议按顺序阅读,因为每章都建立在前一章的基础上。特别关注:
- 第1章:建立全书的基本哲学
- 第3章:理解核心的反模式思想
- 第4-5章:学习测试和重构的实用方法
- 第6-9章:掌握高级主题的实际应用
工具准备:
本书使用C#和.NET作为示例语言,但概念是语言不可知的。读者可以使用任何他们熟悉的编程语言来理解和应用这些概念。
本书不仅是一本技术书籍,更是一本关于如何在复杂、混乱的现实世界中有效工作的哲学指南。它教导读者如何思考,而不仅仅是做什么,帮助开发者培养在职业生涯中持续成长所需的批判性思维和实用主义心态。