那些年我眼中的神
前两天,王垠写了一篇博文,叫《我和权威的故事》,我虽然对王垠的很多东西并不那么赞同,但这篇文章却让我深有感触。我想,每个人心中都或多或少住着这样的“神”,只不过不一定都是人,有可能是编程语言,工具,甚至某本编程书籍。但随着时间的增长,心中的“神”,也会逐渐褪去光环,走下神坛,变得普通。
到目前为止,自己理解的对技术认知的几个境界,大致有以下几种:
1、盲目崇拜:觉得心中的“神”就是完美的存在,不允许任何人诋毁之,否则,轻则鄙视之:“你懂不懂啊”;重则对其展示自己高超的人身攻击功夫
2、 模仿/实践:如果心中的神是人,就开始模仿(神用Linux,那我也用Linux);如果是工具或者语言,就开始实践,到处找资料,一心想让自己看起来更加Professional,让别人刮目相看:“哇,你看那个谁,会用XX耶,而且用得好好哦,好生崇拜哦”
3、 开始反思:感觉心中的神好像也不是那么完美,好像这里有点问题,那里也有点问题
4、 从头开始:既然渐渐地对神有所不满意,于是就开始自己从头捣腾,渐渐地,在别人眼中,自己就成了神,自己捣腾出来的东西,也成了神
这篇废话,就说说这些年来,我心中的“神”。 注意:这篇文章只是我自己的感触,有一些言辞带有强烈的个人观点倾向,而且,仅仅是个人在某个阶段的看法。如果这些言辞让你感到不适或者伤害了你幼稚的心灵,我表示诚挚的歉意。
一、工具
Emacs & Vim
说到工具,就不能不提这两个“神”了:一个是“编辑器之神”,一个是“神之编辑器”。我当初接触这两个工具,正是因为别人总是说它们是如何如何地“神”,自然地,作为一个凡人,我也想一睹“神”的真容。
我最初尝试的是VIM,可是打开之后,界面老土不说,我按了半天键盘,结果连一个字母都没能够输入进去。于是,我直接放弃。从此,VIM在我眼中,就变成了“神”,在我看来,VIM这种“神器”,不是我这种凡人所能掌握的。
然后,我又开始尝试Emacs,这次比VIM好一点,一开始便能输入了,虽然界面老土了一点,我忍了。然后便开始大量Google配置我自己的Emacs,过了没多久,我又放弃了。因为,当时Emacs Lisp对我如同天书,所以照抄一些比较Common的配置还好,但是要想有一点自己的Customization,基本不可能,就算万能的Google,也没法回答。因为,如果Google能回答,那便不算是Customization,那只能算是Common配置了。所以,我又放弃了。于是,Emacs在我眼中,也成“神”了,原因很简单:我不能掌握它嘛。
再次拾起VIM,是在毕业入职的时候。刚入职时,偶然看到一个同事在使用VIM,这!货!居!然!在!用!VIM!!当时被我视为神器的东西,居然有凡夫俗子在用!于是,我又开始新一轮的尝试,这一次不是浅尝辄止,因为我觉得,既然别人能用起来,那我也能用起来。终于,经过一番折腾,包括对按键的习惯以及配置文件的个性化之后,我对VIM算是用得比较熟了。清楚地记得,在当时的Team中,我负责的前端javascript的绝大部分代码,我都是用VIM完成的。
在用VIM大概半年后,我再次到了瓶颈期:还是有一些自己期望的功能,VIM没法做到,至少是没法做得很好,比方说代码的智能提示。而且,对于VIM配置文件的语法,我也没有找到比较正规和完整的说明文档,所以我的配置文件还是东抄一点,西抄一点,想要更加个性化的配置(之所以没说“个性化的配置”,是因为,用VIM的人太多了,稍微“个性化的配置”,都能Google到解决办法,至少能Google到相似的解决办法,自己再照葫芦画瓢即可),还是不太方便。于是,我再次将目光转向了我曾经放弃的另一“神器”:Emacs。
于是,我再次转向Emacs。在基本熟悉了默认的按键之后,我便又开始了自己的Emacs个性化路程。这条路比VIM难走多了,因为相对使用VIM的人数来讲,使用Emacs的人实在是太少了!!幸好的是,在GNU的网站上,有完整的Emacs Lisp语言的Reference。于是,为了配置Emacs,我开始学习Emacs Lisp,你没看错,我仅仅为了配置Emacs,学习了一门编程语言,而且是和平常使用的常规编程语言大相径庭的编程语言!!
在慢慢熟悉Emacs Lisp和Emacs之后,我可以对Emacs进行自己想要的定制了。甚至,在学习使用 Org-mode 之后,我还写了一个用于将org-mode文件生成博客的工具,叫 Org-page ,你现在看到的这篇文章,就是通过Org-page发布的。现在,我自认为对Emacs有了一定的了解,当然,从另一种角度来讲,对Emacs的学习才刚刚开始,你难道没有看过Emacs那弯弯曲曲的学习曲线么? :-p
现在回头想想,我不知道我是否还有动力和热情,为了使用一个工具而去学习一门小众并奇怪的编程语言。但我并不后悔,不去尝试,就不会了解,于是Emacs在我心中就永远是“神一般的存在”(当然,现在还是“神一般的存在”,只不过更加理性:-p)。但话说回来,和VIM一样,Emacs还是没有达到我期望的标准,例如代码的智能提示。不要跟我说auto-complete或者CEDET,甚至后来的auto-complete-clang,我都有尝试过。auto-complete只是一个补全的框架,它本身并不提供任何补全功能;CEDET?算了吧,它野心太大了,想要用Emacs Lisp实现一个C++解析器?我不是说这不能完成,而是完成后,你想过它的运行速度吗?至于auto-complete-clang,它确实可以实现C/C++的补全,而且我当初看到它的补全菜单时还确实激动了好一阵子,可是有一个问题,它太慢了,你能忍受敲一个.之后,等半天你的编辑器才响应,然后给你一个补全菜单吗?是的,我能忍受,但没有能忍受多久,我就把它从我的配置文件里给禁掉了。
总结
编辑器就是编辑器,你非要用它来当IDE,那只能说明你too yong too naive。例如写java,你试过Intellij IDEA吗?如果试过,你就知道什么才是真正的IDE了。当然,在编辑文件的时候,这两个工具还是很高效的。所以,在写一些对IDE依赖不是那么强的语言,比方说小型的C/C++项目,我还是用Emacs,但是像java/C#这种强烈依赖于IDE的语言,还是换回Intellij IDEA和Visual Studio吧,那才是你真正该选择的。而且,这两个IDE都有相应的模拟VIM和Emacs的插件,装上之后,可以方便地使用VIM或者Emacs的按键,在提高编辑效率的同时,还能享受智能补全和配置文件自动生成带来的快感,是不是比你用Emacs/VIM从头编辑那一个个的xml配置文件要好太多了呢?
附:最近觉得VIM的按键确实比Emacs要短多了,而且Emacs老是要按Control键,为了防止我小小年纪就患上RSP,我使用了一个叫evil的插件——它能在Emacs中,模拟出VIM的按键。有人说,同时使用Emacs和VIM的人,已经被烧死了。他们该不会把我拖出去烧了吧?:-p
二、书籍
黑客与画家
我记得当时,在听说《黑客与画家》这本书的时候,我对Emacs和Elisp正处于狂热的程度,而且我碰巧知道了这本书里有讲Lisp的部分。于是,我毫不犹豫,买下了这本书,同时买的,还有一本《实用CommonLisp编程》(看看我当时对Lisp的痴迷程度:-p)。
而后,我在一次往返的旅途中,看完了这本书。初次打开书的时候,我对它充满了期待:既然是倍受推荐的书,必然是如春天的雨,能够滋润我等凡人的心灵。可是,书的第一章便大讲特讲书呆子不受欢迎,这不废话嘛,谁不知道,书呆子不会受大众欢迎?关键是,既然是论证为什么书呆子不受欢迎,那么应该很有逻辑才是。可是,我在第一章却并没有感觉到清晰的逻辑(再次强调,只是我个人的感觉,因为我只是个渣凡人,所以可能是我理解力不够,而不是书没有逻辑)。所以,我感觉有点枯燥。但当时在飞机上,也没有别的可打发时间,更何况这是一本神书,怎么也得把它看完吧!于是,我便坚持看完了这本书。只是看完这本书后,我有所怀疑:这本书真的有那么神么?
后来在某论坛中,偶尔还会看到有讨论这本书的帖子,但我从来没敢在这些帖子中表达过自己的怀疑。因为,一是会遭到众多开篇所说的等级一的人的围攻;二是,我还是在怀疑自己的理解能力不够,而不是书的问题。直到某个帖子,有一个人留言,他的原话记不请了,只记得大致是:“难道只有我觉得这本书不知所云吗”(抱歉,我尝试过搜索这个帖子,但关于这本书的讨论帖太多了,我找了几个,都没能找到原话),后面,也有几个人跟帖“+1”。于是,在那时候我才敢肯定,应该不是我理解力的问题,而是,这本书真的没有这么神。
总结
我觉得,一本真正的好书,先不提能潜移默化地影响人,至少在看完之后,一些核心的内容,会深深印在脑海中。可现在再回想起来,我已经不太记得清这本书的详细内容了。只记得讲了书呆子、创业、Lisp,以及一个产品,作者用Lisp来做,竞争对手用别的语言需要很多倍于Lisp的时间才能做出来。至于别的,实在是记不起来了。
现在想想,这本书,是被过于神化了,其实它充其量就是作者的一本散文集而已,关键是作者——Paul Graham,YC的创始人,在很多人心中是神一般的人。所以,神写的书,当然也是神一般的书了。至于那些说“此书将迫使你重新思考计算机编程的本质”的人,不知道是自愿的水军,还是作者给他们发了五毛。:-D
当然,就算如此,我也并不就这么下结论说这本书不好。我会在一段时间后再次尝试阅读这本书,不排除那时候,我又能够在这本书中,看到一些深层次的内容。
三、编程语言
Lisp
对于我来说,Lisp,是和Emacs和《黑客与画家》紧密不可分的。我说的Lisp,指Common Lisp
以及各种Lisp的方言,包括 Emacs Lisp
和 Scheme
等。我上文有提过,正处于对Emacs和Elisp狂热的时候,我听说了《黑客与画家》,而这本书里也对Lisp推崇备至。于是,我便买了一本《实用Common Lisp编程》开始学习Common Lisp,在看这本书之前,我对Emacs Lisp已经比较了解了,所以看这本书并不算太艰难。
可是,在草草地看完《实用Common Lisp编程》之后,我却对Lisp逐渐退烧了。它不是“神”。
我不得不承认,Lisp是一门强大的语言。相对于计算机的历史来说,Lisp可以说是古董级别的了,但是直到现在,它的很多先进的特性,仍然是许多语言模仿的对象,例如lambda。尤其是Lisp宏,我丝毫不能忘记刚接触它时的惊讶:这货居然能自己生成代码好吗!!和Lisp宏相比,C语言的宏简直和小孩子的玩具一样。在《SICP》中,一些很艰难高深的数学抽象,用几行Scheme代码就完成了。
可是,一个现实的问题被提了出来:既然Lisp这么强大,为什么不见有什么著名的软件/系统是用Lisp写的,除了屈指可数的,如Emacs之外?为什么那些有名的大公司,如Google,不使用Lisp作为它们的首要编程语言?在 这篇译文 里,作者道出了原因:因为Lisp太过强大。Lisp是黑客的语言,他们用Lisp来hack出自己的“玩具”——而且很容易。可是,每个黑客都有自己的玩具,没有人能统一它们。另外,黑客用Lisp做玩具,大多只是想简单证明:看!Lisp能如何如何。所以,你能想象每个人用C++写一个自己的STL出来么?而且写出来的STL还只是玩具水平?
TeX
我不记得是如何接触TeX的了,只记得看介绍是用一些奇奇怪怪的符号,能排版出比Word精美许多的内容。而且,它还有一个另类的版本增加方式:初始版本为3,每新出一个版本,便按圆周率的数字在小数点后加一位。
于是,我便开始学习,看一本名叫《LaTeX Beginner's Guide》的书。可是,看了没多久,就看不下去了:这毕竟不是编程语言!!形形色色的指令,都需要记忆。刚看的时候,可能会记得,每个指令是什么作用,可是几天不用,就全忘了。毕竟我们不是每天都要用TeX写文档。于是现在,需要写文档的时候,我都是先用org-mode写好,然后导出成beamer,再加一些自定义样式,最后利用TeX给publish成文档。而这些自定义的样式,可以去google搜索。和自己去熟悉TeX的命令,再从头写自己的样式相比,直接利用前辈的样式再稍加修改,效率要高多了。
总结
我并不是想黑Lisp,我很喜欢Lisp,也依旧在使用EmacsLisp编程,我只是想客观地评价它。我觉得,Lisp其实是数学的代名词,很多数学抽象和一些偏理论的东西,用Lisp很容易实现,但是要写工业级别的实际应用,还是C++/Java等语言吧。Lisp不是“神”,和《黑客与画家》一样,它只是被神化了。
而TeX,其实不算是编程语言,只是一种工具,对于需要写书的童鞋,用这个来排版,再合适不过了。
四、最后
人就是人,工具就是工具,不是神。我们觉得某个事物如何如何“神”,只是因为我们对它没有足够的理解。毕竟,这里是我等渣渣凡人的世界,不是神的世界。
当然,如我开头所说,人在每个阶段的认知水平都不相同。以上的废话,都是我在当前状态当前水平下的感悟,我可以感觉到,在一段时间以后,我再回头来看这些废话,会觉得,怎么跟小孩子写的一样。:-)