前几个月微博看到有人推荐这本书,翻了一下,觉得重点总结到位,对日常工作有很强的指导意义和实践参考。老外写书比较啰嗦,我做个简要的读书总结。网上有中文翻译,不过还是建议大家看原版的,这本书的英语阅读体验还是比较愉快的,不是那种语法晦涩,句子巨长,脑回路打结的高级英语。

本书作者John Ousterhout是Tcl语言与Raft协议的发明人,有着丰富的学术界与工业界经验。所以这本书绝不是理论的说教,而是实践与理论的高度结合。

这本书的最核心内容就是告诉你复杂度才是软件系统设计最核心的问题,不好的设计会导致系统复杂度爆炸,导致维护成本上升,性能下降,运行不稳定等一系列问题。为了解决复杂性问题,你必须先知道如何识别会导致复杂度上升的因素,然后是有哪些手段可以借鉴参考来降低复杂度。

我个人阅读后有几点总结:

  1. 软件复杂度是日积月累的,如果只是打补丁总有一天会失控。可以容忍一开始不好的设计,但是之后每次都可以试着去优化一点。但也不要想动不动就整个大新闻,毕竟业务的稳定和投入产出也是要考虑的。你必须一直去思考这个问题,如果一切只会完成短期任务,那么复杂度一定会失控。
  2. 模块和类要有深度。我觉得这个问题在Java的框架里特别明显,一层套一层,理论上是面向对象,可复用可替换,但是对于99%的应用来说,这个需求根本不存在。一个模块或类,甚至是函数,要解决一个完整的问题。能原子化的就不要再为了拆分而拆分。
  3. 信息隐藏。在接口层面要暴露的是做什么,至于怎么做留到实现层面。复杂度尽可能下沉,接口的调用者不要去想,也不应该去操心底层实现的细节。
  4. 尽量为通用的场景提供默认的行为,不要让用户自己去理解。以下这段Java代码就让我挺抓狂的,这也是我不喜欢Java的原因。不管是C,C++还是Python,都没见过操作一个文件需要这么坑的写法。
    FileInputStream fileStream = new FileInputStream(fileName);
    BufferedInputStream bufferedStream = new BufferedInputStream(fileStream);
    ObjectInputStream objectStream = new ObjectInputStream(bufferedStream);
  5. 错误处理不要过度设计。Define Errors Out Of Existence我实在不知道该怎么翻译,排除不需要的错误?英语好的指出一下。程序能消化的错误就自己消化掉,不要扔给用户。比如自动重试重写,处理不了的极端情况就地躺倒,因为这时用户也不知道该怎么办。这里有举了Java的例子,subString就不是一个好的设计。如果索引范围不符合返回一个空字符串就能解决大部分问题,非得扔个IndexOutOfBoundsException异常出来。不要把错误扔给用户处理,很多时候用户也不知道该怎么处理。
  6. 写注释,注释一定要有用,要把那些不容易理解的东西解释清楚,而不是翻译代码。建议先写注释,这样你会更关注于你要做什么。不然等写完代码思路就固化了,变成围绕代码去写注释,变成尾巴摇狗了。代码尽可能集中注释,一件事尽量在一个地方写清楚。如果确实不行,建议使用design notes集中管理。比如写个wiki,或者别的什么地方,在注释里引用参考XXX。
  7. 一致性,命名,代码风格,处理逻辑尽可能统一。哪怕是低水平的统一也好过各自放飞。尽量不要改变一致性标准,除非有重大收益。不然统一已有系统的一致性就是很高的成本,如果新老一致性不兼容会导致更多麻烦。
  8. 测试驱动开发是伪命题。这点我非常赞同。大多数人根本没有先写用例,再写代码的能力。另外用例不可能一次写对,但用例摆在那里,开发的时候代码就会已通过测试为目标,很多时候容易导致拼凑补丁。但是有一种情况必须先写用例,就是处理历史遗留屎山。当前代码支持的业务场景,以及你对代码功能的所有猜测必须有用例作为支撑,这样在修改完成后可以快速检查有没有影响现有功能。
  9. 性能是设计时就要考虑的。优化性能时优先考虑关键路径,如何用最少最高效的代码实现关键路径。这里不是82法则,很多时候是95%(甚至更高)的关键路径对5%的异常路径。即使异常路径的成本提高100%,但是关键路径的成本只要降低20%,总成本就可以降低约15%。
  10. 最重要的原则,把自己的第一个想法毙掉。至少要想两个方案,有选择才有比较,

读完本书后有两个感觉:

  1. Java是面向咨询公司和外包公司的编程语言。生在了一个好时候赶上互联网大跃进卡住了重要生态位,写起来感觉就是我花半天PHP能撸个功能出来,Java还没把框架相关的基础代码写完。
  2. 如果你真是追求技术的程序员,避免以下两类场所:1)传统企业的信息化研发部门,那就是天天在屎山里折腾,口味万年不变;2)大厂业务部门,充分享受99.99到100的极致内卷,虽然也是天天在屎山里折腾,但是拥抱变化,偶尔能欢欢口味,偶尔还能蹲到一个新的坑位。去硬技术公司或是业务飞速增长的初创型公司会是一个比较好的选择,能让你有机会实践这本书里的大部分内容。

《软件设计的哲学》读书总结相关推荐

  1. 《手把手教你读财报》- 读书总结

    6.18,5折价格在京东买了很多好书新书.昨天,终于静下心来,把<手把手教你读财报>这本财经类的书,大致看了一遍.    总体上,给个五星好评! 感慨     看了作者的经历,感觉民族复兴 ...

  2. 【kindle资源】一本不得不读的投资经典《唐朝-手把手教你读财报》

    <手把手教你读财报>是一位久经沙场的老股民,在经历了无数次惨烈的投资战役之后,总结过往得失,呕心沥血而作.因为不是会计专业出身,所以没有晦涩的术语.难懂的公式.因为有多年的投资经历,所以更 ...

  3. 财务报表是用来排雷的-《手把手教你读财报》

    财务报表是用来排雷的-<手把手教你读财报> 耳小月关注 0.122019.07.26 14:42:02字数 4,579阅读 206 这本书是作者一步一步按照财务报表的要素来解释和分析的,通 ...

  4. 《手把手教你读财报》读后感

    2019年计划里有这一页,每周读20页书,写一篇读后感.自己挖的坑,含泪都得填上.今天第一篇,书名<手把手教你读财报>,在炒股圈里知名度还是很高的,特点是将生涩的财务知识用通俗的文字表达, ...

  5. 手把手教你读财报----银行业---第十一课

    第十一课  票据贴现 票据贴现是银行的一大类生意,以至于银行财报在汇报贷款情况时,需要将其分为公司贷款.票据贴现.个人贷款三大类. 我们谈到银行的票据贴现业务时,指的是商业汇票.商业汇票是企业因为购买 ...

  6. 手把手教你读财报---银行业---第十三课

    第十三课 利润表(上) 其他综合收益 所谓其他综合收益,就是那些影响本期净资产,但不影响本期净利润的各项利得和损失扣除所得税后的净额.这部分以前是计入"资本公积---其他资本公积" ...

  7. 手把手教你读财报----银行业---第九课

    第九课   减值准备(下) 减值准备项目下又分为单项评估和组合评估进行披露: 这就是前面说过的银行计提减值准备的顺序: 首先对大额不良贷款逐笔评估潜在的损失,计提减值准备,这一步叫单项评估. 接着对剩 ...

  8. 手把手教你读财报----银行业----第四课

    由于银行业普遍大杠杆经营,不善的管理很容易蚕食掉股东的权益,因此用合理的价格买入经营良好的银行要比低价买管理不善的银行好的多. 杠杆率: 杠杆率是监管专用名词,而不是股东权益和银行资产的比较.我国银监 ...

  9. 手把手教你读财报----银行业---第十课

    第十课  贷款的定价与管理 违约风险溢价 贷款的价格(利率)=资金成本+运营成本+损失平摊+目标利润 损失平摊部分就是违约风险溢价,平摊,摊的是未来可能发生的损失 银行股投资大原则:真正对银行有杀伤力 ...

  10. 手把手教你读财报----银行业---第八课

    第八课    减值准备 贷款一定会有关注和不良,是银行赚取正常贷款利息支付的成本. 这个成本分两大块: 1.预先从银行的经营收入中扣出来一块去填,这叫计提贷款减值准备 2.在给贷款定价时,就将预期损失 ...

最新文章

  1. 盘一盘 2021 年程序员们喜欢的网站数据
  2. 进程和程序的主要区别是
  3. 如何玩转跨库Join?跨数据库实例查询应用实践
  4. contOS crontab 定时执行python脚本
  5. Hadoop平台K-Means聚类算法分布式实现+MapReduce通俗讲解
  6. Parameter-Efficient Fine-tuning 相关工作梳理
  7. BIO、NIO 和 AIO
  8. vant状态页组件van-empty - 使用篇
  9. 说说程序员应该知道的术语(中文+英文)
  10. GPS串口报文NMEA格式,Python解析L76-gps数据流
  11. 酷派手机android版本,酷派大神F2的手机系统是什么?能升级安卓4.3吗?
  12. C语言队列(排队)先进先出.实现全部函数
  13. 机器学习——卷积神经网络(CNN)
  14. php 打印机样式自动对齐,虚拟打印机怎么快速设置视图样式
  15. PHP+Javascript实现拖动滑块完成拼图验证码
  16. 有关H5第八章的页面布局与规划介绍
  17. 数据分析常见SQL面试笔试题
  18. 无线传感网络在医疗领域的应用
  19. 1094 谷歌的招聘(c语言实现)
  20. 红帽OpenStack私有云部署

热门文章

  1. 掌门优课用户量增多,用户看上了它什么?
  2. 求和计算机教案,初中信息技术《Excel求和》教案.docx
  3. 博途PLC 1200/1500PLC多段曲线控温FB(支持40段控温曲线、段曲线搜索、暂停、跳段等功能)
  4. 删除vlan 华为s5720_华为S5720系列交换机快速配置手册常用命令 - Late Winter
  5. Deli条码打印机如何批量打印二维码
  6. WPF --三维空间(一)(简介)
  7. 【hadoop生态之Hive】Hive的数据类型【笔记+代码】
  8. 名字解析/DNS服务
  9. opencv-python傅里叶变换以及逆变换
  10. 关于PEP8报too long问题的解决方式