在国内,只有一本学校会教编译原理和计算理论的课程。我们这边的招聘经验也表明,好学校学过编译原理的学生的代码能力还是非常不错的。视野也宽阔的多。我认为,学习的语言少了,只有一两门,就会容易鄙视其他的语言使用者。 我认为这是潜意识的一种自我保护行为。视野容易变得狭隘。我认为这是软件工程专业学生的必修课。很不幸,我就读的只是普通的二本学校。我的同学中也很少有人自修过这么课程的。这么有意思的课程在最有时间的阶段被错过了,很可惜。我能自学这门课程是因为一个人,王垠,我看了他早期的新浪博客,很受启发。虽然他现在的一些文章显得有点偏激了,但是,他的整个经历,就是一个绝佳的案例,他也以己为例的告诉后来者,不要着急,不要陷入对技术的宗教崇拜,不要对所谓的成名的人陷入崇拜,要自己思考,要去了解本质,要去感受编程的乐趣。
不知谁提出了“程序员的三大浪漫,编译原理,图形学,操作系统”这个说法。这三个方向,我都看了一些书研究过,我的过程是编译原理-> 操作系统 -> 图形学。现在只做图形学方向了,其他两个暂停掉了,或者说暂时够用了。我当时自学这门课程的一个重要原因,是我想克服内心的恐惧:我不能认识程序世界的运行原理的恐惧,为什么 Magnus Lie Hetland 会那么多程序语言,为什么我不会。学习操作系统同样处于此条。之后学习图形学方面,促使我前进的动力不再是恐惧,而是探索的乐趣。后来我总结:对于一个领域的初学者,初始阶段前进的动力很大一部分是恐惧,对于未知的恐惧。现在我明白了,只要我投入足够多的时间,就能克服这些恐惧,他人能够获取的成就,我也有肯能获取到。
学习编译原理是一个笼统的说法,其实分为两个部分:形式语言理论 和 编译原理实践。我当初认为要弄明白语言运行原理,就要了解多种语言的特征,所以就学习了Python, Scheme, Common Lisp, 汇编,Erlang,Java,JS,C++,学习了《程序设计语言概念》(第9版)、《程序设计语言:实践之路》(第3版),这也是我经常向身边做技术的人推荐的书籍。要想了解一个东西,就要去了解它的历史。学完了这些,我才开始学龙书。 看不懂,就找来《编译原理与实践》,两本书一起看,反复看。后来感觉不够,买了 《形式语言,自动机理论与计算导论》、《自动机理论.语言和计算机导论》,我特别喜欢后面一本。我现在也写不出一门完整的计算机语言,但是,这个学习过程中,我基本上明白了诸多语言运行的基本原理。这对我编程帮助很大。它是是我大学四年中学过的最为受用的课程。从毕业到现在,我还没有遇到对这个方向特别感兴趣并且研究的比较深入的人,甚为可惜。一直都是我在给身边的同伴讲解一些语言上的特征、原理,解决编译上遇到的问题,我也想能够找个人来解决我的疑问。
我想说的只是: 去了解事物的本质,是一件非常愉快的事情。我希望学习软件工程的同学们都能享受到这份愉悦。