真实在哪里

引子

以下,我总结了这些年对理想的追求,以及看的一些书,还有走的一些弯路,目的是为了把回忆保存起来,过几年再仔细品味。


导火线

游客问毕加索:为什么你的画不像照片上的那么真实呢?毕加索说:你觉得照片上的,就是真实的你吗?

是啊,到底什么是真实的,什么是虚幻的?这句话是我初中时看到的,影响了我十几年,一直为我指引方向。


学生时代

我找到了当时在国内很火的『第一推动系列』,《时间简史》《皇帝新脑》《黑洞与时间弯曲》。

当我认识到物理学是一门研究大自然的学科时,不顾父母发对,选择了冷门的大学专业。

与很多调剂过来的同学不同的是,我的收获简直是太大了,每一门课都认真的学着,并努力向这个『真实』的方向靠拢。

除了把基础物理学好之外,我又对编程产生了浓厚的兴趣,我依稀记得当时,通宵的编写VB,彻夜的学习汇编,仔细的理解C与C++。

终于到了毕业季,本来已经找到工作的我,由于社会的压力,父亲良言相劝,让我读研,至今我觉得这件事情非常正确。

当时有两个选择,跨专业考计算机或者继续学习物理,对物理学我还是比较执着,于是就选择了理论物理。并且,至今我也没有后悔这个决定。

研究生阶段,学的最多的其实是数学,数学基本功渐渐体现出来了。然而,当我了解到国内的科研现状后,我决定还是不要读博了。


厚积而薄发

毕业后,我找了一个程序员的工作,不为什么,因为社会需要。能力再大也没用,社会稀缺才是重要的,这能保证我的生活一直很轻松。

既然选择了程序员的道路,我就决定好好研究一下编程,把基础打牢,同时不忘自己对『真实性』的追求。编程不就是写写代码吗?有什么基础可言?我不这么认为。

因为已经有了很多年的编程经验,一万小时定律已经不算什么了,这才让我能更清醒的做出选择。把基础再打牢一些,基础决定了最后的高度,欲速则不达。

我先是重新研读了《计算机程序的构造与解释》,这本圣经早有耳闻,但只是翻着看了看,我后悔一开始没有认真的阅读,否则可能就改写我当时的学习路线了。

这本书让我对Lisp语言产生了好感,于是,开始疯狂学习大法,『把市面上所有能找到的书都看一遍』。当然,这是不可能的,这不过是一种决心罢了。

不过在这之前,我面临了一个选择,Lisp两大方言中,到底是学Common Lisp还是Scheme?不错,当时Racket还没有这么火。

我做出了艰难的决定,选择大而全的Common Lisp,不为别的,就是因为他可能『更不必需』。

这一向是我的决策准则,在大方向上,总是选择『更不必需』的方案,广度优先。否则,如果不这么做,就可能一辈子都不会再接触它了,总是有更重要的事情等着我。

《ANSI Common Lisp》《Land of Lisp》《Pratical Common Lisp》《On Lisp》《Let Over Lambda》《Lisp语言(马希文)》《Lisp in small pieces》

好了,这些看完后,对Common Lisp有了一个基本的认识了,于是该学Scheme了吧,这个『更必需』一点,看吧,必需的东西早晚会去学的。

《R5RS》《The Litter Schemer》《The Scheme Promgramming Language》《Essentials of Programming Languages》《An Introduction to Scheme and its Implementation》

可以看到Scheme的书更学术一些,如果没有Common Lisp的基础,这里就比较费力了。

在读Scheme的过程中,发现了自己编译原理很弱,于是恶补了一下,不懂形式语言和编译原理,都不敢说自己学计算机的。

《编程语言实现模式》《程序设计语言·实践之路》《形式语言与自动机》《自动机理论,语言和计算导论》《编译原理》《编译器设计》

然后,又发现自己算法很弱,恶补了几本算法。不懂算法,都不敢做工程啊。《算法导论》《算法》《具体数学》

这些刷完之后,我马上发现了更基础的薄弱环节,那就是Lambda演算。Lisp是函数式语言的一种,一门很像Lambda演算的语言,究竟有什么渊源呢,还得看书,同时各种语言的实现原理也吸引了我。

《Lambda-Calculus and Combinators, an Introduction》《Concept in Programming Languages》《Compiling with Continuations》《Lecture notes on the Lambda Calculus》《数学·计算·逻辑(陆汝钤)》《哥德尔·爱舍尔·巴赫 集异璧之大成》

刷怪的途中,是不可能绕过Haskell的,身为函数式家族的一朵奇葩,必须得学,是该死磕一下的时候了。

《Learn you a Haskell for Great good》《Real world Haskell》《A History of Haskell》《Beginning Haskell》《Programming in Haskell》《Haskell函数式编程入门》《Parallel and Concurrent Programming in Haskell》《Haskell: The Craft of Functional Programming》

好吧,我承认,Lisp中遇到Continuation,Haskell中遇到Monad的时候,我真的跪了,只能硬着头皮看,谁叫我不知道别人也跪了呢。这其实也表明学习时最好不要看别人,自己学才能走的更远。


放松一下

把这些放一放,容我先把其他主流语言刷一遍,压压惊。

《C与指针》《C专家编程》《程序员的自我修养》《Rust Essentials》《Realm of Racket》《Seven Concurrency Models in Seven Weeks》《Programming in Standard ML》《Learn you some Erlang for Great Good》《Scala编程》《C++模板元编程》

各种工业级的语言就不说了,语法过一下就行了,反正以后有的是机会学的,这些不是『更不必需』的。

Go,Java,C#,PHP,Python,Ruby,JavaScript,Clojure,Swift,C++。


数学与逻辑学交相呼应

好了,有了这些『基本功』之后,让我们再来一战吧。那我必须先把类型理论搞一搞,这个始终是个没有填的坑。

《类型和程序设计语言》《Type Systems》《The Litter Prover》

然后,发现类型其实和逻辑学有一腿,逻辑学可是一个大的方向,琢磨了好几天,我决定还是先尝试一下吧。

《Teach yourself Logic 2015》《Logic and Structure》《数理逻辑》《计算机科学中的现代逻辑学》

其实,决定后发现并不是那么难,难的是决定不是决定后的行动。让我感到惊讶的是,逻辑学的很多结论都暗示着人们对『真实性』问题的探索,我非常幸运走到了这里。

以集合论,证明论,递归论,模型论为基础的逻辑学,完美的诠释了『真实性』问题的最新进展。

感叹之余,可以绕回来了学学数学了,读读范畴论,然而还要从抽象代数开始。

《近世代数基础》《Categories for the Working Mathematician》

幸亏研究生阶段学了一些数学,群论,集合论,拓扑学,微分流形,都已经学过,这里就相对容易了一些。

到后来才发现了计算机科学的数学基础,《离散数学教程》——北大版,其中包含了集合论,图论,代数结构,组合数学,数理逻辑,5大部分,早看这本就好了。

其中,逻辑和代数,分别在语法和语义层面为计算机科学打下了坚实基础。

目前有一些遗憾,那就是同调代数,代数拓扑,同伦类型论还没有看,希望以后坚持读下去,

《Practical Fundations of Programming Languages》是一本好书,只读了一半,希望能读完,《程序设计语言的理论基础》,《计算机语言的形式语义》值得认真学习。


其他的

其实以上过程中,我故意的隐藏了作为一个软件工程师应该读的那部分书。

让我们来看看吧,软件工程是一个不小的领域,也是需要修炼的,幸亏是工作需要,让我不得不学好它。

从哪开始呢,当然是设计模式了,不懂设计模式,怎么进行『面向对象』的编程呢?《大话设计模式》《设计模式之禅》《软件架构模式》

然后是代码质量,《测试驱动开发》《代码大全》《程序员修炼之道》《重构》《重构与模式》

软件开发方法论,《快速软件开发》《软件需求模式》《人月神话》《大教堂与市集》《没有银弹》《敏捷软件开发: 原则,模式与实践》

编程思想,《UNIX编程艺术》《代码之殇》《高效程序员的奥秘》《理解专业程序员》《软件随想录》《程序员的呐喊》《黑客与画家》《代码的未来》《图灵的秘密》《你的灯亮着吗》

新潮的东西也该玩玩,《大数据时代》《集体智慧编程》《统计学习方法》

有过Lisp的基础,Emacs应该是正常的选择了吧,《GNU Emacs Lisp Reference Manual》

还有很多没有看完的书,太难的太无聊的,或者印象不够深刻的书,没有提到,希望以后能够再有机会拿起来读一下。不过,也可能根本就没有这个机会了。

总结一下,Scheme和Haskell绝对是两个正确的切入点,越早接触越好。同时也会更早接触到领域内的大神,粉碎自尊与自傲,含着泪跪着走完剩下的路。


结语

那么,言归正传,到底什么是真实呢?我的理解是,科学方法就是目前最有效的对真实性的保障。

科学方法讲究从假设出发,约定一套推理规则,那么就可以推导出很多结论来了。然而这些结论并不是现实世界本身,这些结论与现实世界之间的解释关系构成了一个数学模型。

我们看到,不同的假设和推理规则构成了不同的公理系统,连同对它们的解释又构成了不同的模型,所解释的现实世界是公理系统的语义。

怎样证明某个公理系统是『对』的呢?不幸的是,无法证明,只能证伪。而且,只需要找出一个反例即可。

这就是科学方法。以上是数学(集合论),逻辑学(一阶逻辑),哲学(科学哲学),自然科学(物理学),计算机科学(可计算性理论)的交汇点。

我庆幸之前的所有选择,给了我这样的认识,我还会一直坚持下去,直到有更深入的理解。

我觉得一个人终究会走到自己想要去的地方,不管经过何种途径,沿途中任何我们所做的积累都是有用的,未来的某一天真的就能用上。

人们也不可能在一个阶段同时抓住两件东西,只能舍弃一个,没关系,舍弃说明你得到了更重要的那个,过后你完全可以再有机会得到失去的那个,只要你坚持自己的梦想。

相反,如果当时你拥有了失去的那个,应得的就会被错过,人生本来就是不完美的。