总结

Posted by ZY on January 27, 2020

1.

今天推荐另一本书,陈海贤老师的《了不起的我》。

里面有一句话给了我一些启发:

改变的过程就是这样,我们心里有目的地,可是在行动上,只能看清脚下。也许有一天回过头,我们会发现,走着走着,自己已经走得很远了。

这几年自己有没有一直坚持做的事呢,发现还真有 —— 写作。

自己写的文章,大概分为几类:

  • 技术类
    • Java
    • Spring
    • MySQL
    • RPC
    • ZK
    • Elasticsearch
    • Redis
    • MQ
  • 非技术类
    • 阅读
    • 管理
    • 学习
    • 工作

这些文章都反映了我对特定领域的认知,汇集起来,那就是我对这个世界的认知。

写作有很多好处,其中之一,就是你写过的文章,会成为你审视自己的原材料。

比如,我在看自己写过的 Java 文章时,就想到了一些事。

在学习一门编程语言的过程中,你会学到一些这门语言独有的知识,也会学到一些通用的、可移植的能力。

语言独有的知识:

  • Java 语法:如何用 Java 写一个快速排序?
  • JVM 内存模型:JVM 的垃圾回收机制?
  • Java 线程池:如何用多线程提高代码性能?
  • …..

通用的、可移植的能力:

  • 什么是好代码:这是一种对代码的世界观,什么样的代码才是好代码,这是在用 Java ,或者其他语言写代码的时候,肯定会去想过的一个问题,很自然的,你就会去看《代码整洁之道》、《重构》、《程序员职业素养》,这些书都会塑造起你对代码的嗅觉。
  • 系统思维:什么叫系统思维,就是要知道,你写的语言,是「高级语言」,是给人看的,给程序员看的,而计算机最终看到的、执行的,并不是你写的代码,以 Java 为例,你写的「高级语言」,会被编译成 JVM 能识别的「字节码指令」,再被 JVM 翻译成对应操作系统的机器指令,最后计算机再拿着这份机器指令去执行。知道了系统的原理,当你写的代码出现事与愿违的 bug 时,你就知道要怎么去分析了。
  • 并发思维:如何用 Java 语言去写多线程的代码,这个是不可迁移的能力,换了别的语言,比如 GO,就不适用了;但是在什么情况下可以用多线程,在哪些模块使用多线程,如何避免死锁等等,这些,却是可移植的思想。
  • ……

这两块能力,哪块更重要?

直觉上,肯定觉得后者更重要,举一反三,一通百通。

然而,我想说的是,这两者并不是一碗水端平的能力,只有你在「语言独有的知识」上钻研的足够深入,你才能思考总结出「通用的、可移植的能力」:

  • 只有你写了很多 Java 代码后,不断地审视自己的代码,才会去想到底什么才是好代码;
  • 只有你深入学习了 Java,踩过了一些坑,研究了 JVM,才懂得要有「系统思维」;
  • 只有你尝试着用 Java 写并发代码,才会去思考多线程到底要怎么用。

对于很多程序员(包括我本人)来说,这一层都是很尴尬的一层 —— 接触这一层的时间最久,却对这一层投入的时间最少。

因为一旦踏入了框架、中间件、分布式的学习,很多人就再也没有回过头来系统性的学习编程语言了。

就我个人而言,看我写的文章就知道,虽然以前写了很多关于 Java 的文章,但最近这一年都没写过了,也就是说,我已经很久没有审视过自己对 Java 的认知。

Oracle 官网上有一张图:

img https://www.oracle.com/technetwork/java/javase/tech/index-jsp-140763.html

也许很多人见过,也许很多人也没见过,这都不要紧,每个人都可以从这张图开始,重新审视一遍 Java。

带着你不一样的阅历,带着你在学习中间件、学习分布式时收获的知识,重新审视一遍 Java。

编程语言就像杨绛的文章,随着人的成长,每次学习都会有新的收获。

3.

没完,我还想上一下价值。

有一本书叫《能力陷阱》,大概就是说你越擅长的事,你就越乐意去做,结果就是你擅长的事更加擅长,但你不了解的领域你就还是不了解。

于是有人就焦虑了,说我一直在学习我这个领域的知识,是不是学太多了,我要不要学点别的领域的知识。

我想说的有以下几点:

  • 第一,学习专业领域的知识,和学习其他领域的知识,可以同时进行,不矛盾
  • 第二,从专业领域的知识里,可以学习到其他领域也适用的通用能力
  • 第三,如果你觉得自己专业知识足够了,那不妨画一个数轴,数轴左边是0,右边是10,代表这个领域的知识水平,你觉得你在数轴的哪个位置?在你右边的,也就是你还没掌握的,都有哪些知识?然后再决定要不要继续在这个领域深入学习。

4.

最后把我写过的Java、Spring的文章整理了一下

关于Java虚拟机性能调优的清单
用画小狗的方法来解释Java值传递
为什么说Java匿名内部类是残缺的闭包
Java 设计类和接口的七条优秀实践清单
如何写出线程不安全的代码
如何用一句话介绍synchronize的内涵
Volatile趣谈——我是怎么把贝克汉姆的进球弄丢的
Java趣谈——如何构建一个高效且可伸缩的缓存
Java趣谈——如何像Tomcat一样处理请求
Java趣谈——如何写出一个高效的页面渲染器
Java线程池是如何诞生的?
如何学习Java多线程
Java第一课
ThreadLocal趣谈 —— 杨过和他的四个冤家
Java AQS无码讲解

TDD
如何说服你的同事使用TDD
如何在Spring Boot中使用TDD写出高质量的接口

Spring
用小说的形式讲解Spring(1) —— 为什么需要依赖注入
用小说的形式讲解Spring(2) —— 注入方式哪家强
用小说的形式讲解Spring(3) —— xml、注解和Java Config到底选哪个
用小说的形式讲解Spring(4) —— 使用Spring Boot创建NoXml的Web应用
BeanPostProcessor —— 连接Spring IOC和AOP的桥梁
玩转Spring —— 消失的事务
Spring的声明式事务模型
Spring的统一事务模型
那些年,我们一起追的Spring

数据库通识
数据库是什么
如何选择数据库

MySQL
Mysql索引简明教程
Mysql可重复读(1) —— 快照何时创建
Mysql可重复读(2) —— 快照真的就是快照吗
MySQL锁:灵魂七拷问
MySQL Replication 简明教程
MySQL 是如何实现 ACID 中的 D 的?
MySQL 的 InnoDB 存储引擎是怎么设计的?

RPC
如何给老婆解释什么是RESTful
如何给老婆解释什么是微服务
如何给老婆解释什么是RPC
如何实现一个简单的RPC

ZK
为什么需要 Zookeeper

Elasticsearch
为什么需要 Elasticsearch
聊聊 Elasticsearch 的倒排索引
从 Lucene 到 Elasticsearch

Redis
Redis简明教程
如何用Redis实现分布式锁(1)—— 单机版
如何用Redis实现分布式锁(2)—— 集群版

MQ(消息队列)
Kafka简明教程
MQ(1)—— 从队列到消息中间件
MQ(2) —— 一条消息是如何从生产到被消费的
MQ(3) —— 刨根问底
MQ(4) —— 如何设计一个靠谱的消息中间件
MQ(5) —— Nsq vs Kafka
MQ(6) —— Nsq in 有赞
像读一本书那样,去学习一项编程技术
观察者模式 vs 发布订阅模式

关于思考
做一个有批判性思维的程序员
做一个清醒思考的程序员
神算子工程师 —— 系统思考与技术设计

每个人都值得做一件事,那就是把自己的职业,用文字记录下来。

如果我是一位老师,我会把我从第一天教课,到备课、上课、辅导、改试卷,以及和学生和家长之间发生的一些有趣的事,写成一本书,我会希望这本书,能给看到这本书的人,也许是某个刚刚当上老师的小伙子,也许是某个在犹豫报什么专业的学生,也许是某个教了很多年书的数学老师,带去一些思考,从我的视角,用我的眼睛,带他们去看一些他们之前没看见的东西。

关于阅读
书单 | 一份让一个程序员半年内收获1000+粉丝的书单
哈姆雷特,活着,寂寞的游戏
人也要经常重启
阅读串烧

关于管理
管理和猴子(1)

关于心理学
如何让顾客在你的超市里剁手

关于学习
学习之道 —— 在两个领域都拿到世界冠军的人是如何学习的
《终身成长》:你为何总想着证明自己
聊聊学习
《论语》 —— 学习首先是寂寞的

关于工作
像个专业人士一样去调试Bug
怎样成为一名专业的程序员
程序员,是知识工作者,还是体力工作者?
你有多久没更新过简历了?
大佬们做事的七条原则
管理精力,而非时间