《码农翻身》读书笔记

前言

五一假期期间在家休息,把《码农翻身》二刷了一遍,之前很久也看过一遍但是刷第二遍还是有很大的收获,特别是 Java 技术栈相关的部分,有些话都是作者的一些经验总结,感觉很有必要摘录下来细品一番。

摘录

CPU
CPU 必须把数据装载到寄存器中才能进行运算
CPU 的运行速度快的丧心病狂,但是它能做的事情却简单得令人发指,主要有以下4种:
(1) 从内存的某个格子中读取数据,放入自己内部的寄存器 Rx
(2) 把 Rx 中的数据写入内存的某个格子中(会覆盖原有的数据)
(3) 进行数学计算和逻辑运算
(4) 根据条件进行跳转
对于那些大神级别程序员来说,汇编语言也是小菜一碟。Ken Thompson 和 Dennis Ritchie 不就用汇编语言写了第一版的 UNIX 操作系统吗?求伯君不就用汇编语言写了 WPS 吗?

Java注解
元注解:可以认为是注解的注解
@Target 表示该注解的应用目标,可以是类、方法、方法参数等;
@Retention 表示这个注解要保留到什么时候,可以只在源码中,或者在 .class 文件中,或者在运行时。
对于 @Controller @RequestMapping @Transactional 这样的注解,大家更喜欢和 Java 方法写在一起,显得简单而直观。

泛型
Java 泛型的限定符还支持 super,Comparable 应该写成 Comparable <? super T?>

协议
计算机所有问题都可以通过增加一个中间层来解决
Java JNI(Java Native Interface),可以用C语言来实现,然后在Java中封装一下。

Spring 的本质
我们在进行软件系统设计的时候,一项非常重要的工作就是把一个大系统按业务功能分解成一个个低耦合、高内聚的模块,分而治之。

什么是框架
  先学了 Java SE,把集合、线程、反射、I/O、泛型、注解之类的基础知识学了一遍。
  你如果对Java后端感兴趣,那还有更多东西可学。用框架实现了业务只是很小一方面,还有系统架构设计、缓存、性能、高可用性、分布式、安全、备份等很多内容。你学得越多,就会发现无知的领域更多,所谓学无止境,就是如此。

HTTP Server
我这样的英语水平,这几十页的英文 HTTP 协议我不吃、不喝、不睡两天也看不完。死猪不怕开水烫,慢慢磨吧。

Build 的演进之路
  大部分人只会抱怨项目很无趣,没有挑战,遇到问题也只会安于现状。只有少数人会发现工作中的“痛点”,并且真正动手解决它,给公司带来价值。这是提高自己,让自己和别人区分开来的重要方法。

再见!Bug
  每个程序员都梦想从头写一个东西,不愿意读别人的代码,甚至同行相轻,瞧不起别人的代码。但实际情况是,自己重写一遍,不见得比现在已经运行的代码好到那里去,甚至更差!除非你了解了所有的细节,用大量的时间仔细规划、小心编程,但是现实中哪有时间让你这么玩啊?

让人怀疑的C语言
  由于太底层,刚接触计算机的学生也不能写出操作系统、数据库、中间件等系统级软件,哪怕写一个简单的、粗糙的软件也难。只能写一点与数据结构相关的小程序,再加上被指针不断地“蹂躏璀璨”,很容易丧失斗志。
  其实学习是一个螺旋上升的过程,在这个上升的过程中,成就感很重要,直接决定了一个人能不能继续学习下去。我在刚学习C语言的过程中就因为没有成就感,差点放弃了。
  通常来说,带图形界面的程序容易激发成就感。所以,我认为C语言不太适合入门。虽然C语言不适合入门,但还是应该学习一下,因为C语言太贴近硬件了,能帮助你理解程序在机器层面到底是怎么工作的。
  想想看,自己用C语言写一个小的Web服务器、简单的数据库、简单的分布式文件管理系统,是不是也很酷?更重要的是,系统级编程博大精深,并且非常稳定,值得深入研究,成为专家。

赖以谋生的Java
《Effective Java》
《Java 编程思想》
《Java 核心技术》
《深入Java虚拟机》
《深入理解Java虚拟机》
  不仅看书,还去读 JUnit源码、Spring 源码、Hsqldb源码、Jive 源码,再加上工作中写的大量代码,终于可以得心应手地使用 Java 编程了。
  后来我明白了,Java 最适合的还是后端编程,别让它干那些它不想干也干不好的事情,如桌面编程。
  后端编程还有很多事情需要处理,像负载均衡、灾难恢复、缓存、消息、分布式、数据备份、搜索等。后端的技术还是相对稳定的,这些知识介于业务层和系统层之间,值得发掘和积累。
  很多时候用 Java 解决一个问题,基本上就只有那么一种方案,照着规矩做就是了。Java 本身的特点也适合大型项目的合作开发。

优雅的Ruby
  动态语言由于缺乏静态检查,所以只好把运行时的检查写好,这就是单元测试。对 Ruby 来说,测试代码量和业务代码量 1:1 是非常正常的事情,有的甚至是 2:1,动态语言都有这样的劣势,但我们主要还是要利用它们的优点,让我们的编程生活更加舒适,不是吗?

老司机的精进
  凡事必先骑上虎背,有了问题的引导,你会疯狂地学习,迅速地提升自己。
  对于性格内向的程序员,很多时候你认为基本准备好了其实就够了,凡事必先骑上虎背,勇敢地迈出去,努力地争取一下,你就会发现自己登上了更高一层的台阶。

好奇心
  对于程序员,如果你看到新技术、新产品没有像小孩看到新玩具那样两眼放光,没有立刻在自己电脑上试试的冲动,你就需要仔细考虑一下是否真的对软件开发有兴趣。如果根本没兴趣,那不要蓝费时间,还是趁早转行,有更多适合你的职业在等着你。
  没有好奇心,就不愿意学习新技术。一名架构师,如果没有对技术的敏感度和前瞻性,一直抱着一套技术架构不变,估计很快就会被淘汰。所以对技术的好奇心/兴趣是一切的基础。
  很多人会语法,也懂框架,但是在基本功上却不过关,因而只能在初级程序员上踏步。
  这个基本功的训练就是数据结构和算法,我的经验是多做习题,让这种思维在脑子里固化,以后的编程就可以信手拈来了。

透彻理解技术的本质
只是学会使用是不行的,不但要知道 How,还要知道 Why。
停下来,思考,才是进步的本质。

写出漂亮的代码并不容易

  1. 需要思路清晰
  2. 有良好的编程基础
  3. 有优秀的抽象能力
  4. 对一门语言的熟练掌握
    学习Java开发的可以思考一下为什么 Spring 有 Controller、ViewResolver 这样的概念?

技术领导力
  要用技术的影响力来领导人,而不是威权和职位。换句话说,就是要能让技术人员服你。有了技术影响力,你在团队里发出的声音才会被倾听、被尊重。但影响力不是很快就建成的,这是一个漫长的过程:你解决了一道技术难题,你提出的方案被证明可行……

对自己狠一点,开始写作吧
  如果你们把一门技术通俗易懂地给别人讲明白,那就说明你已经掌握了。这种“转教别人(Tech others)”的方法属于主动学习,效率是最高的。但是在工作和生活当中,你是很少有机会去给别人讲授的。既然没法给别人讲,那就退而求其次吧,把自己的理解写出来。
  有人可能要问了:我也可以按照这个思路去学习,为什么要写下来呢?原因很简单,不写出来,很容易放弃深度思考。你会觉得,我已经知道是怎么回事儿了————其实一些关键的细节被大脑给忽略了。
  我们已经进入了一个碎片化的时代,我们的大脑已经养成了碎片化文化的习惯,一天不看碎片化的信息就觉得不舒服,这样下去会慢慢地丧失深度思考的能力。写作会逼着你思考,梳理知识体系,防止自己被碎片化所填满。
好的程序员都是代码喂出来的,动手实践必不可少,所以我还经常写代码。
优秀和平庸的差别可能就是那一点点坚持吧!坚持不懈地做一件事,每天前进一点点,最后量变会发生质变。

评论