我不会写链表

也许很多人会觉得这说出来很丢人:一个程序员连链表都不会写。

是的,现在的我不会写链表。大学的我还会这些链表、树、栈等数据结构,以及各种排序算法。但是工作几年后,这些内部实现早已忘光。现在我只会使用这些数据结构和算法。

当我思考时,我在思考什么?

大多数人的大部分思维都是处在潜意识水平的,没有将思考的细节提升到词语水平。[1]

前几个月我在知乎上开了一个专栏叫「ADoyle 的深度思考」,我常常在思考各种各样的问题,因而开专栏以专门输出我的思考。有一天某人问我“你都在思考些什么呢?”突然我意识到自己的思考其实很模糊,不精确,并且是碎片化的。我真的懂什么是深度思考吗?不,我无法对思考行为给出一个合理解释,甚至都不能回答为什么我要思考。
虽然不能清晰认知自身的行为,事实上这并不妨碍我进行思考这个行为,并总结出一些结论和经验。这样的现象让我觉得很神奇。
我想通过写下文字试图理清思路,以便回答以下几个问题:

  1. 我在思考什么内容?
  2. 为什么我会思考?
  3. 我思考的目的是什么?
  4. 我思考的产出是什么?

本文是我对思考这件事入门阶段的输出。它阐述了我的思考过程和思维模式,不一定适合你,但是希望能给你带来启发。

问题分析框架

一年前,我读了高杉尚孝著的《麦肯锡问题分析与解决技巧》,其中对于问题的清晰定义和 MECE 分析法让我印象深刻(只记得这两个了)。

我觉得清晰定义问题是什么,是决策的根基。一切决策应当从问题出发。
因此基于此书的 1~4 章节,以及个人的深度思考,我实践总结了一套思维框架,与你分享一下。这个框架的目标是清晰辨识问题,快速分析出问题的本质。

不过在谈问题分析之前,先来看看在问题的认知上,我们可能会陷入什么误区。

提问的框架

你是否曾困扰于这样的情况,提了一个问题却无人问津;口干舌燥跟人讲了一堆,别人还是没听懂你的问题;又或者没有得到令自己满意的回答。
如果你没有这方面的困扰,很好,下文就不必读了你可以跳到文末总结看下思维导图。

我整理了一个提问的框架,目的是为了帮助建立有效的问答,从而让提问者的问题能够得到彻底解决。
此框架可能不适合用于话题性质的提问,以及不求甚解的提问。
下文将介绍提问时的原则、技巧和注意点。

DSL 设计参考

前言 (Intro)

向想要自己设计 DSL 的新手,分享一点我的经验总结。很多概念想法代入了个人见解,不具备权威性,请辩证看待。
本文不介绍 DSL 适合的场景,不解释为什么要用 DSL。以后我会另写一篇文章进行说明的。
本文主要介绍某种风格的 DSL 设计参考:基于 YAML 等通用数据结构设计 DSL。

同一文件的两次 zip 内容不一致

前言 (Intro)

有个朋友提了这样的一个问题:

同样的文件,用 zip 打包两次,打包出来的文件 md5 怎么不一样啊?

我自己做了一遍惊讶地发现真是如此,第一反应是打包混入了时间戳。但 google 却没找到恰当的答案。于是开启了我的探索之旅。

如何面试他人

前言 (Intro)

我做了一份关于技术面试的思维导图。主要是站在面试官的角度,看面试官和面试者这两个角色的关注点,以及整个面试流程的步骤。电话面试为主,现场笔试比较少。

这份导图是根据我的经验,并参考网络上很多人的文章,在一年前就大致作成的。之后又经历了一年的实践验证修改。我每次面试前都会看一遍。

虽然是技术面试,但面试思路对其他领域也是有借鉴意义。

一种声明式编程语言

前言 (Intro)

我设计了一种声明式编程语言,以下暂称为 comia language。
该语言借鉴了函数式编程的思想,冯·诺依曼机器模型,以及 Minecraft 的红石原理。
它是一种可以基于任何编程语言实现的高级抽象语言。

它既不是 OOP,也不是 FP。它跟命令式编程语言有很大差别,请做好心理准备。