语言真是不重要的吗?谈语言的*层次*与技术的三六九等
关注——或“专注”于多语言编程之后,老赵对于语言的关注也越来越多,对于语言在编程中所带来的“美感”也有了越来越深的体会,还在博客的标题中加上“追求编程之美”。关注语言多了,关注纯粹的编程实践多了,自会有所比较,然后写出了引人注目的《为啥老赵不喜欢Java*语言*》。这篇文章所得到的负面评论的确也和想象中差不多,大部分朋友的观点是“语言不是关键”或类似说法,似乎对语言的讨论和比较非常没有必要。有个朋友说的更是直接:“在看到这些文章之前,我还是比较敬重老赵的,不过现在发现你也就这点高度”。老赵认为,这是对这方面的误解,而有这种误解无论是对于社区还是个人的发展都是没有益处的,因此单独开篇,讨论一下这个问题1。
“高度”,是个多么“发人深省”的名词,往往直接就将事物分了三六九等。封建社会将人认为三六九等即从“出身”或“行业”决定了一个人的社会地位高低,例如,即使是“戏子”或“工匠”等下等职业,就算成就再高也被主流社会所排斥,大部分人依旧从心底里瞧不起那些人。不知道您对这样的划分有什么看法,老赵对此没有看出任何科学性,也没有任何好感。不过现在国内“主流”观点也在技术方向分了三六九等,例如以下便是一个典型:
- 上等:系统架构
- 中等:框架设计
- 下等:语言实现
为了证明自己的“高度”,为了避免接下去讨论的内容把老赵“下等人”的老底给显露出来,老赵先用一段话为自己披上“上等人”的外衣:
“如果要实现一个‘高性能’、‘大并发’的网站,前端使用4层7层负载均衡,如果不用F5等商业产品可以先用Nginx等做反向代理。后台实现要对系统作划分,避免单点失败,也可以作独立优化。系统之间可以用异步消息传递来降低耦合;系统中不采用二段式提交或分布式事务,CAP原则中的“一致性”往往需要做出让步,而采用‘最终一致’策略。数据存储方面可以做横向或纵向的划分,或者构建查询表。合理使用Schemaless的设计方式或如何MemcacheDB或Tokyo Cabinet等Key-Value存储方式可以带来更好的伸缩性。除此之外,系统中还需要部署Memcached集群作为缓存。静态文件可以使用Squid或Varnish作为缓存,避免所有IO都直接落到文件存储上……”
其实老赵只是把大脑皮层最表面的某些“知识”给倾倒出来一些,我不知道这些内容给您感觉是什么,是不是会觉得很有“高度”。但是老赵觉得,这些东西看起来可能会“过瘾”,但是却毫无营养。其实所谓我们很多草根人士平时在谈论“系统架构”的时候,往往就是把各种产品,原理,实践进行组合拼接,其实说起来和看着市场上产品报价然后攒出一台电脑没有本质的区别。因此老赵现在看到这些东西已经不太感冒了,目前一直在设法研究从某个细节方面真正有效地提高“某个参数”,而不是从一个非常高屋建瓴的方面对整体提出一个所谓的“指导”。
不是每个人都有能力和条件成为邓爷爷那样伟大的改革开放总架构师的。
作为一个普通人,我们很容易对自己不太了解的东西产生一种崇敬之情。例如搞.NET编程的,往往会对“操作系统”,“线程调度”,“文件系统”,“汇编”等名词望眼欲穿,觉得那些才是真正有“技术含量”的东西。其实每个人的工作都是建立在另一批人的抽象之上,然后再这个抽象上产生更多的价值,如果因此对自己产生怀疑,硬要分个高低贵贱三六九等,这估计可以算作一种“妄自菲薄”。而“语言”作为我们技术人员每天都会接触的事物,似乎人人都会,人人都懂,谈了再多也只是一种“低级”的问题。如果还在专注,还在比较,那么“你也只能算是这点高度了”。
我们每个人从接受计算机教育的一开始似乎都会被告知一个正确的道理:“语言只是工具,重要的是能力与思想”。这句话本没有错,但是一句正确的话被强调过渡了可能也会成为一种错误。例如KISS原则的本意是要避免“过渡设计”,而老赵不止一次发现它已经被某些朋友用作“不设计”的理由。语言之余技术人员,就好比兵器之于武林人士。强调“能力”好比强调“武功内力”这不会有错,但是根据老赵多年阅读的没有上百也有数十本武侠小说中,的确没有发现武林人士对神兵利器的品评与追求体现出嗤之以鼻的态度。
很多朋友认为,高手是不会介意语言的选择,而语言也不会影响高手的能力。老赵并不同意这个看法。老赵同意“对于同样的工具来说,能力决定了生产力”,却不同意“有了能力,工具对于生产力的作用微不足道”。在TL上有朋友说了一句老赵认为非常有道理的话:有些武功也必须是有特定的兵器才能修炼的。如果只有汇编语言,那么大部分人都无法突破“子过程”这个抽象级别,更别说“面向对象”了。因为“语言”往往会对“设计”有巨大影响,所以Linus会炮轰C++,Anders Hejlsberg和James Gosling会对语言设计中是否应该有Checked Exception持不同意见。
看大师争论很过瘾,那些总不会是“低层次”的争论吧!
“图灵完备”已经从理论上保证了语言的能力“足够”表现出任何逻辑,但是世界上还是有各种各样的语言层出不穷,在一个又一个地方放出不同光辉。而由于一般的“通用语言”在表现某个特定问题的时候会显得比较“嘈杂(Noise)”,因此现在DSL的概念也愈发蓬勃了起来。老赵怀疑,高手的能力真能忽略语言的特性的不同,得到同样高度的生产力吗?如果真是这样的话,老赵现在所追求的“混合编程”的意义又在哪里?老赵不知道Martin Fowler为什么会说“People may say that Ruby is less noisy than Java, or that external DSLs are less noisy than internal DSLs”。不过我怀疑小李探花手持天机棍2后是否还能在兵器谱上排名第三。
诚然,高手超能力的作用无法被忽视,他们也可以用Java写出流畅的API(fluent interface),正如jMock在为Java平台带来了一股清新的空气。但是Moq使用C# 3.0中引入了Lambda表达式之后,从Rhino Mocks(与jMock的语法类似)手中抢走了大量的市场份额,迫使它也不得不使用Lambda表达式应战。同样,即使C#的扩展方法特性可以在一定程度上改进单元测试的语义,如果您把它和Scala实现的specs,或者F#实现的FsUnit相较“Behavior-Driven Development”,高下立判。今后老赵也会给出自己在混合编程上的探索,您一定可以更明显地发现不同语言在解决相同问题时产生的区别。
“语言只是工具,重要的是能力与思想”。这句话本没有错,但是如果把它作为“轻视语言”的理由,认为“语言”是低层次的东西,那只能说是一种误用了。
最后,老赵再稍微谈一下对另一个观点的看法:“一个好的程序员应该兼容并包,不该有门户之见”。老赵举双手双脚同意这个看法,这也是老赵推崇“混合编程”的原因。但是老赵认为这不代表不能“批评”一个语言,“兼容并包”讲究的是“各取所长”而并非是“各护其短”。老赵不搞“平衡论”,不代表老赵有“门户之见”,不是吗?
就用“门户之见”来结束这篇文章吧:有错误的是“重语言而轻其他”,或者仅从语言来说明事物(例如通过语言来说明程序员能力高低,项目好坏等等)。而研究语言,比较语言,思考语言,谈不上所谓层次浅,高度低——“层次”所指的是“怎么搞”,而不是“搞什么”。否则,不也是一种“门户之见”吗?
注1:这篇文章的内容原本属于《老赵看“伪专业”》一文,但是在写作过程中发现这一块可能是误解最深,也最难以被人识破的观念,因此单独成文,想把这个问题说明清楚。
注2:在白晓生“兵器谱”排名中,“天机棍”排名第一,而“小李飞刀”李寻欢排第三。