㈠ 如何学习编程
最近有几个朋友私信问我如何学编程。我上知乎基本就是随便写点代码来着,这种误人子弟的问题我真的不敢乱说。也罢,找个问题随便谈谈吧,聊胜于无。千万不要当真。
我觉得SICP作为第一本编程书非常合适。SICP可以让我们从零开始建立起整个对于程序语言和程序语言如何被解释的粗浅认识。
知道什么是数据,数据结构如何用一个小小的cons组织起来,什么是过程,过程可以接受过程做参数并且返回过程,还有和解释器息息相关的囿变量、自由变量、环境,等等这些重要的概念。
然后我们需要接触机器相关的知识了。我建议学汇编。8086汇编就行了(硬核的话,或许可以学PDP-6汇编)。注意一开始从最基础的move,add,lea开始。
然后引入栈的push和pop指令,有了栈就可以很方便的复用过程了。栈一定要好好理解,这是过程在机器里面如何抽象的关键。然后引入call和ret两个语法糖。学会汇编写二叉树就够了。
因为用汇编写二叉树,一大堆dword,lea,肯定迷糊死了。这个时候可以上C语言了。看TCPL就行,简单了解C语法就够了。
C语言有指针和int等基础类型,用C写一遍二叉树,明显能体会到类型的好处。另外,C是汇编语言的又一层抽象,这里可以结合SICP里的数据抽象和过程抽象好好理解,C到底是怎么抽象汇编的。
写过一些C之后,了解类型的好处了。这个时候可以看TAPL。结合SICP就知道scheme基本上就是λNB的少糖形式。TAPL也是SICP这种从零开始逐渐复杂的结构,非常适合萌新看。完全弄懂λ cube和subtype就够了。TAPL里面还有很多细节,萌新看的时候可以忽略。
到这,编程基本上就入门了。对机器底层感兴趣的去学体系结构;对数据结构和算法感兴趣的去打ACM;对PLT感兴趣的继续看ATTAPL,SF;对钱感兴趣的忍着自己对C++语法的恶心去学C++;对John McCarthy感兴趣的去学ML,等等。安排的明明白白。