前些天写了一篇《令人作呕的OpenSSL》,顿时引来了大量的恶评,令我非常尴尬,同时也觉得悲哀。如果说you can you up之类的,我觉得起码这人看出了我的本意,只是怀疑我的能力,但是我看到一些人竟然在我评价了一段僵尸代码后认定我不懂编译代码,这就悲哀了,这段代码大致如下:
#if 0 /*abcdefghijklmn, ( and
ABCDEFGHHHHSASA
*/
.....
#endif
请问有人会这么写代码吗?我只是指出这段代码确实不合理而已。悲哀点在于,有些人为自己能看懂这段代码感到非常荣幸和自豪,因为他知道编译器先处理掉注释再做宏的预处理,这只能说明他没有忘掉当初学C语言时学到的东西,既然编译器的行为标准不是他制定的,那么他一定是学来的。很多人都不是在看第一行代码,写第一行代码的时候才知道它的,如果来了一个新人,他不懂这些,当然只是还没有学到,知道这么一个事实对于coder来讲是早晚的事,知道这一点确实不是什么值得自豪的事情,但他有逻辑,能看懂别人的代码,面对这么一大堆僵尸代码,这不是折磨人吗?难道不令人费解吗?确实,编译器没有迷惑,只是编译器愤怒了而已,如果C标准不允许这么写的话,编译器会轻松很多,能看懂这段代码并觉得这么写没问题的人,记住,是编译器在纵容你,惯着你,不要得寸进尺。
不好的东西不管作者是谁都是不好的东西,即使是大师拉的屎也不是香的。不过我早就猜到会有人不同意我的观点,只要是大家都在用的,存在即是合理的,他们就非要找一个这么做的理由不可,甚至还搞出这么做是“一种艺术”,...请看清楚,关于do {...} while (0)是我之前一直使用的,但是后来我舍弃了这种做法,明白它妙处的人只知其一不知其二,都知道它能代替goto,但是却不知道它应该用在哪里。如果你觉得它比goto好的话,Linux kernel的粉丝们是不是又要站出来为goto来平反呢??事实上,Linux kernel同时使用了do{}while(0)和goto,只不过前者都是用在宏定义中而已,Linux之所以用goto是因为它可以实现序列化的回退,正如:
sth1
...goto err sth1 if error
sth2
...goto err sth2 if error
sth3
...goto err sth3 if error
return
err sth3
err sth2
err sth1
在err sth3往下,一系列的回退可以自动进行。当然,如果你憎恨goto,用多层的do{}while(0)也是可以的,但是问题又来了,不是也有人说过层次太多不好吗?问题是,就因为某个大湿说了一句goto不好,从此goto就背上骂名了?如果你不是存在主义者,是不是应该大骂goto的引入者或者C的发明人呢?其实,goto也是艺术。事实上,以上指出的其二就是,任何东西,看你怎么用,屎不能喂人,但可以喂狗,仅此而已。
诚然,OpenSSL代码可以编译过,也可以运行,它的库已经被用于大量场合,这就说明它是正确的,是的,它并不错,它没有问题。问题在于,我们不应该评价代码本身的错与对,以及编译器如何地将其优化成人看不懂的机器码,我们更应该关注的是它能给我们带来什么,它如何让后来人可以看得懂,不那么令人费解地被理解,从而扩展它实现自己的定制需求,这才是根本,代码的生命力也因此而体现出旺盛。对于OpenSSL而言,可读性是差了点,也许跟它的历史以及开发模式加上缺人手有关,这些社区都是承认的,可是同学们把它当教条就不对了,认为它应用广泛并且是大师参与其中就膜拜它。开源的东西并不都是好的,也并不都是大湿的作品,开源的本质恰恰是消除了阶级门槛而带来的自由,随便一个菜鸟都可以在github上开一个项目,同时,也有很多大湿参与的项目由于各种原因而夭折,这些原因中就包括代码太烂,太过技巧性,别人无法参与进来。英语和普通话的益处有目共睹,那就是它们的通用性,当然,你可以站在民族主义,文化主义的立场上反驳甚至憎恨我,但是我的意思是,不管你再不喜欢,不管它们多大程度的抹杀了你独特方言给与的创造性,你还是接受了它们,不是吗?你有你的方言,你可以说你的母语多么的美,但是面对另外一种同样美的方言,母语的时候,你们将无法交流,无法互通有无...对于计算机编程语言写出的代码而言,可读性,可理解性就是通用性,要让每一个人都能读这段代码,能改这段代码。
别把代码写的易读看成什么没有技术含量的事情,代码本身就不是什么极其重要的东西,它只是一个交流的媒介,不光是人与机器的交流,还包括人与人的交流,不像高深的数学,代码不值得让你写得如此排他。
每个程序员在刚毕业后几乎都曾经认为写一些很有技巧性的绚烂代码会显得自己水平很高,看不惯那种平常的代码,也许老师教过说goto不好,那就再也不用它,然后换成do{}while(0)或者switch case之类的,也许老师又教过,说OO的多态可以免去else if,然后就当成了教条,时刻捍卫这些教条的同时,残留着一点小叛逆,这就造就大量炫技巧的代码,奇葩的代码,比如只用一行代码实现一个复杂的功能之类的。这类代码可读性极差,以至于很难维护,几乎不可扩展,在不久的以后,面临全面重写。这种喜欢炫技的,特别较真儿,钻牛角尖,你说一件事这么做不好,他非要给你找出这么做很艺术的原因,反之你说这么做很不错,他却非要挑一个毛病,总之,总是想表现他与众不同,表现的自己很有不同的想法。这种人倒是挺适合参加比赛或者去单打独斗,不太适合在团队工作,同时我也觉得,公司在面试的时候,不要再出那种很能让人炫技巧但是网上答案一搜一大堆的题了...
喜欢唱反调的并不一定是怀疑论者,他们并没有勇气或者能力向权威提出质疑,更多地,他们是捣蛋鬼,毫无针对性,抓住什么都不放,就像大多数记者一样,看到人家做好事,就说是作秀,看到人家无动于衷,就说是冷漠...很多人从大学毕业后,携带了一身的迂腐书生气,爱较真,你说一个观点,他就反驳,你说好,他就找出一点能证明不好的证据,你说不好,他就说你不懂这么玩的艺术性,他们这么做完全就是为了反驳你而反驳你,没有丝毫的逻辑性,经不起任何推敲...他们很喜欢甄别说这话的人是谁,如果是权威,他们反而会把哪怕明显错误的观点当成教条,但是专家权威千万别犯错,否则他们就会永远被攻击,哪怕稍微有一次,权威的观点真的就是对的。这就是一边倒的书生气。这就要扯到教育了...
现如今很多人已经认识到了传统教育的悲哀,迫不及待地想要采用美式教育或者日式教育方式,但在认识到自己的局限性在于态度而不是方法之前,所做的一切最终还是悲哀。
在这个神奇的国度,同样一个问题,美国人日本人那样回答就说是引导思考,自己人如果那样回答相信很多人都会觉得是毫无根据的信口开河,很多人已经丧失了判断能力!生活在一个没有思考的世界,生活在一个只有标准答案的世界,生活在一个鄙视推理重视事实的世界,我每天面对的就是嘲讽和恶意!因此,如何进行教育的方法并不重要,重要的是先改变自己的态度,学会思考和判断!否则,美式日式的教育也会被模式化,成为教条!更正一下,中国人失去推理判断力已经2000年了。也许更久,也许根本就没有推理判断力,必须有人给指个方向才能走!这也许就是集权的原因。拿汉唐雄风反驳我的,那是你根本不懂成长曲线!
很多孩子,在很小的时候表现的绝顶优秀,可是长大后就泯然众人,每个人或者社会都有自己的成长曲线,拥有促进早熟的环境并不是什么值得高兴的事实,相反它是夹生饭的温床,很多人在YY汉唐雄风的时候,说不定来了一队罗马军团就能把皇家卫队给灭了,虽然也有把罗马军团灭了的极大可能性。当初西班牙人灭了美洲帝国之前,那些帝国之间不也轰轰烈烈地上演战国七雄吗?如果当地的人同样YY,说阿兹特克国王的无敌军队可以横扫整个西欧(如果他们确实知道有西欧的话),那么我想大部分的人也会赞同的。有点跑题,但事实就是,不加推理信口开河的可能是你而不是我。我没有依据,我就不会肯定的说某件事,我说的仅仅是自己的设想猜想,或者仅仅是自己的一点看法,如果有人那我所论述的这些看法来较真,那他就真的上套了。
有一点我很相信,那就是喜欢唱反调的人基本就是干活的人,这是最最令人悲哀的地方,因为不唱反调的人基本都当了领导,也基本失去了任何解决问题的能力,当然也包括唱反调的能力...
我发现一个让别人相信你的好办法,那就是表达论点时千万别推理,直接说在某个外国人写的书上看到的即可,但别太具体,因为教育出来的很多人的强烈的钻牛角尖癖好....理论联系实际就是一脬屎,如果牛顿生在中国,那他的所谓毫无摩擦力的理想平面不被骂死才怪!
别人先提一个问题并给个答案,可以回答和反驳,但是却没有能力提出问题或者不敢针对一个问题给出自己的答案或者哪怕是一点点看法。