本文转载自: https://www.cnblogs.com/jeffreyzhao/archive/2009/09/01/1448271.html 作者:JeffreyZhao 转载请注明该声明。

关注——或“专注”于多语言编程之后,老赵对于语言的关注也越来越多,对于语言在编程中所带来的“美感”也有了越来越深的体会,还在博客的标题中加上“追求编程之美”。关注语言多了,关注纯粹的编程实践多了,自会有所比较,然后写出了引人注目的《为啥老赵不喜欢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:在白晓生“兵器谱”排名中,“天机棍”排名第一,而“小李飞刀”李寻欢排第三。

语言真是不重要的吗?谈语言的*层次*与技术的三六九等相关推荐

  1. 【Go语言】【13】再谈GO语言的结构体

    本文从如下四个方面再领着大家认识结构体 匿名结构体和匿名成员的结构体 值传递和引用传递 再谈嵌套结构体 面向对象 1.匿名结构体和匿名成员的结构体 如上篇所述,一个结构体需要先声明,再初始化,最后把初 ...

  2. java语言与其他语言的区别是_浅谈Java语言和其他语言的区别

    计算机语言中,各种语言都有自己的优势与劣势.本人是在大学期间就学习Java的,听到了过多Java不好的地方,但是Java在近20年里何以独步天下呢?Java语言和其他的语言之间到底有什么区别呢? 学习 ...

  3. c语言 单词变复数_简谈C语言中的复数

    C语言中的复数操作 注: complex类型是自c99标准后引入,具体实现并不是标准的,每个编译器的实现的标准可能不一样,具体的还请查询相关的编译器的实现标准. 复数在数学运算中十分重要,在编写数值运 ...

  4. c语言中申请内存并初始化,c语言中结构体的定义、初始化及内存分配

    #include struct person { char *name; int age; }; int main() { //结构体可以定义在函数内,也可以定义到函数外 //相当于全局变量与局部变量 ...

  5. java和c语言的区别_都说C语言不会过时,但你是否还需要掌握其他语言?

    01为什么C语言不会过时 评价任何一门编程语言,都是招人骂的.永远是这样.就像是春寒料峭的季节, 街上穿棉袄和穿单衣的擦肩而过,双方一定是同时在心里出现了两个字:"傻B!"这个在心 ...

  6. 随机函数c语言对打,20165323 学习基础和C语言基础调查

    20165323 学习基础和C语言基础调查 一.技能学习心得 1.你有什么技能比大多人更好? 我觉得我羽毛球打的还行,不能说打得比大多数人好,但是对于一些打羽毛球的要领还是掌握的. 2.针对这个技能的 ...

  7. 编程之法-C语言应用开发与工程实践-C语言概述

    浅谈计算机系统架构 计算机硬件系统 现代计算机是由运算器.控制器.存储器.输入设备.输出设备五大部分组成,它们各司其职,完成了数据的计算.存储.传输任务,整体架构如下图所示 下面是它们各个组件的功能介 ...

  8. c语言程序设计形成性作业3,C语言程序设计形成性作业3-4..doc

    C语言程序设计形成性作业3-4. 毛送轻囊集凿撤震栖宋求胳多乡靳肪来蹄亲居菩仍何芦潞征谭欺芋祸早访重俭欧哈函炸惯漆膏花昂缺扫袖凰伸几沁蹲欠傍试嘉慷节说陋锯赚故酪添默牺臭能触波圈爷特苦吻酱怎摔江邢葛背湍 ...

  9. c语言倒序输出英文字母表音标,C语言初学问题(分析过程)1) 输出所有的大写英文字母(2) 倒序输出所有大写英文字母(3) 分别输...

    <C程序设计>的内容很丰富,按照我们现在的教学大纲,教学的主要内容是基础知识.四种结构的的程序设计.函数与数组的应用和一些简单的算法.在学习时,同学们应该把主要精力放在这些部分,通过实践( ...

最新文章

  1. Acwing第 32 场周赛【完结】
  2. 区块链开发_以太坊多重签名
  3. eclipse2019-03设置代码编辑区背景为图片
  4. 快速对比UART、SPI、I2C通信的区别与应用
  5. 用DataGrip生成导出整个库数据的方法
  6. 《Python入门到精通》Python基础语法
  7. 2192-Zipper 求最长公共子序列的解题报告
  8. php m.baidu.com,http://m.baidu.com/baidu.php?u
  9. ffmpeg 将拆分的数据合成一帧_FFMPEG 视频分割和合并
  10. 数据库生成数据字典工具(PDMREAD)图解
  11. Python yolo 神经网络实现视频中的行人车辆检测计数(车流量统计)YOLO多目标跟踪与计数
  12. 3dmax材质丢失插件_3dmax找丢失贴图的材质插件怎么用
  13. SVN忽略文件和文件夹
  14. 写一个最简单的mysql编程_要学简单的数据库编程!
  15. 我的世界虚无2可直连服务器IP,我的世界虚无世界服务器1.7.10
  16. 微信H5页面图片上传避坑指南(vant+vue)
  17. Revit平台盗版软件的陷阱与风险
  18. 4400php兑换美金是多少,美金人民币换算(美金兑换人民币换算)
  19. # Python Classes and Inheritance_2
  20. Firefox 使用、设置和常见问题的解决方法

热门文章

  1. 一款效率神器Ditto
  2. 面向对象——类的定义
  3. php fopen 文件路径,php – 使用fopen()将文件写入子目录
  4. 如何防止XP开机密码被破解?
  5. mysql的安装--visual studio C++ Redistritable Packag
  6. FSL 运行错误 error while loading shared libraries: libopenblas.so.0
  7. 从一个jsp页面跳到另一个页面的两种方式
  8. 美国老姐看完200+中国学生SCI论文,怒写超详细“中国人英文论文写作指南”,还被推上了B站热门…...
  9. 如何安装和使用向日葵远程工具
  10. html列表边框有弧度,CSS边框带弧度代码怎么写