《The Pragmatic Programmer》读书笔记

记录了一下自己学习The Pragmatic Programmer的读书笔记。

绪论

一切阅读都是误读。古人云,读书有三上:「马上,枕上,厕上。」

高手给中手的书最难写:

  1. 高手体谅的珠玑对于没有经历过的中手而言很难有深刻的认识
  2. 大道至简,中手会认为太简单产生不过如此的感受而没有上升到更上层的认识

好书推荐:

  1. pragmatic programmer
  2. the art of unix programming
  3. elements of programming style
  4. the productive programmer

思想内化的过程:

认知科学认为,频繁的高强度的训练外部刺激,以及自主有意识的反复提醒是加速内化的两个重要原因。要强化有意识的实践过程,可以每周争取实践2-3个tips

Tips

  • think about your work

  • provide options, don’t make lame execuses

    要提供选择,而不是找借口。不要说事情做不到,而是说明你能够做什么。

  • don’t live with broken windows

  • it’s both important what you say and the way you say

  • DRY: don’t repeat yourself

    如果不太注重效率,那么DRY的其中一个思想就是:实时的计算,而不是有状态变量。因为一旦有状态变量就需要进行状态的维护,实时的计算不会出现状态不一致的问题。

    注重效率的时候,再去分析缓冲的方式。当然%80的程序只会占用到20%的时间,你需要时刻记住这一点。

  • make it easy to resue

    千万不要自己重复的去造轮子。使用别人写好的测试好的模块再学习别人如何进行实现,比自己从头开始去构建要效率高的多。最重要的是你在没有了解别人的基础上的实现一定不会比之前这么多年许多有智慧程序员可以想到的要更多。

  • eliminate effects between unrelated things

    保证数据的正交性。

    • 编写更小的组件,便于测试
    • 更小的组件会更加方便组合,会促进复用
    • 正交的组件组合的效果是乘法的关系。

    大全的东西就代表着不带好替换!!!想想visual studio

  • there are no final decisions

    要把抉择写在沙滩上,记住程序设计这块,永远都存在大浪。

  • use tracker bulletes to find the target

    曳光弹:一种可以反应是否击中目标的跟踪系统。

    在相同的环境下,搭建可以运行的整体框架,然后根据反馈进行不断需该,填充设定好的接口。

    曳光弹的好处在于,可以立刻有一个可以runable的课演示之物。同时也可以在此基础上迭代进行改进。同时开始就构建原型,可以检视自己的思路。如果上来就直接完整框架搭好,细节全部到位的编码,那么一定会由开始没有想到或者不对假设的地方。完蛋,从头再来吗?为什么不开始只是些一些框架代码,其中的细节也许就是给一个指定的数值,然后系统可以在框架中有效运行,之后填入细节就会更加有的放矢,同时在完整的框架构建完成之后可以对原来的设想进行检视,这样子才更加的好。

    构建原型的另外一个好处是可以战胜拖延,全部都准备好的开始时痛苦的,拖延会让你觉得还需要准备,何不先不要考虑全部,单一个简单的原型,开始之后再慢慢的一边准备一边填充呢。

    还有一个好处在于一旦写出了曳光弹一样的原型,那么在和用户交流的过程中就有了一个实际拿得出手的东西,对于和用户的需求交流就会更加的具体和方便。

  • 使用纯文本

    • 便于理解
    • protable
    • 版本控制
  • 按合约进行设计

    • precondition
    • postcondition
  • 断言与错误处理

    断言不是错误处理,用来保证不可能出现情况的正确性

    断言:

    • 你不能确保debug得到所有的可能性
    • 断言的性能影响没有那么高
    • 只在那些确实需要性能的地方去掉断言。

    异常:

    • 异常就是表示异常的情况
    • 也可以统一作为一种不需要立刻处理的错误处理方式
    • 可以看做是带有描述信息的错误处理方式。
  • 德墨忒尔原则

    每一个函数都不应该使用不受到自己控制的物体。有效的减少耦合。

  • 时间耦合

    时间由两个方面的考虑:1)并发 2)顺序

    时刻考虑事物的并发性,便于以后同步。

    考虑使用UML的活动图来表示事物之间时间方面的特性:

    • 箭头:次序关系
    • 同步条:到同步条的所有动作都需要完成之后才可以进行下一个动作(类似于多个进程之间的同步)
    • 没有箭头进行活动可以任何使用进行
    • 活动使用椭圆形来表示

    考虑一下搅拌机的例子。

  • 序列图

    表示不同对象之间的通信方式以及通信顺序。

    • 方框代表对象
    • 直线代表对象间通信的消息
    • 如果直线上面有星号,表示消息可以多次发送。
  • some things are better done than described

    考虑一下如何描述解鞋带,以及示范一下如何系鞋带吧。

    这也是为什么有些时候,就是需要视频的video来看到实际的操作才是有效的方式。

  • test early, test often, test automatically

    编一段,测试一段。 测试代码将会比代码还多。 通过了测试会带给你自信。

  • 解开不可能解开的谜题

    Think out of the box。 转换一下思路,很有可能就会柳暗花明。

  • 额外的一公里

    需要和用户保持紧密的联系,不断修正需求以符合他们的预期,但是绝不是仅仅完全的预期。

    要让他们惊讶,不是惊吓他们,而是要让他们高兴。

    给他们的东西永远比他们知道的多一点点,会在商誉上获得回报。

    同样的道理放在生活中,按照既定的要求做事情,同时一定要留有余地,或者是保留一些什么东西,这样子在需求增加,或是是没有顺利交叉的过程中,都可以得到更好的回报。当然这个可算作是一种”善意的谎言“。

  • find bugs once

    不断收网bug,发现了一个bug之后就使用一个测试来波保证bug不会再次的发生。

  • 傲慢与偏见

    sign your work,在你的作品上面签名。

    注重时效的程序员不会逃避责任,匿名的代码是邋遢,错误,槽糕代码的聚集地。

    努力使你的签名成为一种质量的保证:我的代码是可靠的,用心编写的,测试过以及有文档的。