Hello World
Spiga

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

2009-05-03 17:24 by 老赵, 24855 visits

关注——或“专注”于多语言编程之后,老赵对于语言的关注也越来越多,对于语言在编程中所带来的“美感”也有了越来越深的体会,还在博客的标题中加上“追求编程之美”。关注语言多了,关注纯粹的编程实践多了,自会有所比较,然后写出了引人注目的《为啥老赵不喜欢Java*语言*》。这篇文章所得到的负面评论的确也和想象中差不多,大部分朋友的观点是“语言不是关键”或类似说法,似乎对语言的讨论和比较非常没有必要。有个朋友说的更是直接:“在看到这些文章之前,我还是比较敬重老赵的,不过现在发现你也就这点高度”。老赵认为,这是对这方面的误解,而有这种误解无论是对于社区还是个人的发展都是没有益处的,因此单独开篇,讨论一下这个问题1

“高度”,是个多么“发人深省”的名词,往往直接就将事物分了三六九等。封建社会将人认为三六九等即从“出身”或“行业”决定了一个人的社会地位高低,例如,即使是“戏子”或“工匠”等下等职业,就算成就再高也被主流社会所排斥,大部分人依旧从心底里瞧不起那些人。不知道您对这样的划分有什么看法,老赵对此没有看出任何科学性,也没有任何好感。不过现在国内“主流”观点也在技术方向分了三六九等,例如以下便是一个典型:

  • 上等:系统架构
  • 中等:框架设计
  • 下等:语言实现

为了证明自己的“高度”,为了避免接下去讨论的内容把老赵“下等人”的老底给显露出来,老赵先用一段话为自己披上“上等人”的外衣:

如果要实现一个“高性能”、“大并发”的网站,前端使用4层7层负载均衡,如果不用F5等商业产品可以先用Nginx等做反向代理。后台实现要对系统作划分,避免单点失败,也可以作独立优化。系统之间可以用异步消息传递来降低耦合;系统中不采用二段式提交或分布式事务,CAP原则中的“一致性”往往需要做出让步,而采用“最终一致”策略。数据存储方面可以做横向或纵向的划分,或者构建查询表。合理使用Schemaless的设计方式或如何MemcacheDB或Tokyo Cabinet等Key-Value存储方式可以带来更好的伸缩性。除此之外,系统中还需要部署Memcached集群作为缓存。静态文件可以使用Squid或Varnish作为缓存,避免所有IO都直接落到文件存储上……

其实老赵只是把大脑皮层最表面的某些“知识”给倾倒出来一些,我不知道这些内容给您感觉是什么,是不是会觉得很有“高度”。但是老赵觉得,这些东西看起来可能会“过瘾”,但是却毫无营养。其实所谓我们很多草根人士平时在谈论“系统架构”的时候,往往就是把各种产品,原理,实践进行组合拼接,其实说起来和看着市场上产品报价然后攒出一台电脑没有本质的区别。因此老赵现在看到这些东西已经不太感冒了,目前一直在设法研究从某个细节方面真正有效地提高“某个参数”,而不是从一个非常高屋建瓴的方面对整体提出一个所谓的“指导”。

不是每个人都有能力和条件成为邓爷爷那样伟大的改革开放总架构师的。

作为一个普通人,我们很容易对自己不太了解的东西产生一种崇敬之情。例如搞.NET编程的,往往会对“操作系统”,“线程调度”,“文件系统”,“汇编”等名词望眼欲穿,觉得那些才是真正有“技术含量”的东西。其实每个人的工作都是建立在另一批人的抽象之上,然后再这个抽象上产生更多的价值,如果因此对自己产生怀疑,硬要分个高低贵贱三六九等,这估计可以算作一种“妄自菲薄”。而“语言”作为我们技术人员每天都会接触的事物,似乎人人都会,人人都懂,谈了再多也只是一种“低级”的问题。如果还在专注,还在比较,那么“你也只能算是这点高度了”。

我们每个人从接受计算机教育的一开始似乎都会被告知一个正确的道理:“语言只是工具,重要的是能力与思想”。这句话本没有错,但是一句正确的话被强调过渡了可能也会成为一种错误。例如KISS原则的本意是要避免“过渡设计”,而老赵不止一次发现它已经被某些朋友用作“不设计”的理由。语言之余技术人员,就好比兵器之于武林人士。强调“能力”好比强调“武功内力”这不会有错,但是根据老赵多年阅读的没有上百也有数十本武侠小说中,的确没有发现武林人士对神兵利器的品评与追求体现出嗤之以鼻的态度。

很多朋友认为,高手是不会介意语言的选择,而语言也不会影响高手的能力。老赵并不同意这个看法。老赵同意“对于同样的工具来说,能力决定了生产力”,却不同意“有了能力,工具对于生产力的作用微不足道”。在TL上有朋友说了一句老赵认为非常有道理的话:有些武功也必须是有特定的兵器才能修炼的。如果只有汇编语言,那么大部分人都无法突破“子过程”这个抽象级别,更别说“面向对象”了。因为“语言”往往会对“设计”有巨大影响,所以Linus会炮轰C++Anders HejlsbergJames 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:在白晓生“兵器谱”排名中,“天机棍”排名第一,而“小李飞刀”李寻欢排第三。

Creative Commons License

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名赵劼(包含链接),具体操作方式可参考此处。如您有任何疑问或者授权方面的协商,请给我留言

Add your comment

111 条回复

  1. JimLiu
    *.*.*.*
    链接

    JimLiu 2009-05-03 17:29:00

    沙发?
    老赵最近爱讨论“敏感”话题啊,又一个百楼帖即将诞生……

  2. Haozes
    *.*.*.*
    链接

    Haozes 2009-05-03 17:31:00

    在TL上有朋友说了一句老赵认为非常有道理的话:有些武功也必须是有特定的兵器才能修炼的
    -------------
    狂顶一下,我直接学.NET的,这直接导致自己对系统底层的了解程序不够.很难深入.

  3. xiaotie
    *.*.*.*
    链接

    xiaotie 2009-05-03 17:32:00

    登录了一下,板凳就没了

  4. 老赵
    admin
    链接

    老赵 2009-05-03 17:33:00

    @JimLiu
    有争议才好,不思考不讨论,就没法进步。
    最好大家都来摆事实讲道理,老赵无比追求一个优秀的社区氛围。

  5. JimLiu
    *.*.*.*
    链接

    JimLiu 2009-05-03 17:34:00

    @Jeffrey Zhao
    讨论当然是好的,但是讨论常常变成口水之争,大家都不切题是一个问题,还只维护着自己的想法,没有开放心,这样的讨论恐怕不太健康吧。

  6. 老赵
    admin
    链接

    老赵 2009-05-03 17:34:00

    --引用--------------------------------------------------
    Haozes: 狂顶一下,我直接学.NET的,这直接导致自己对系统底层的了解程序不够.很难深入.
    --------------------------------------------------------
    其实学了.NET不应该成为你深入的阻碍吧,难度不会比什么都没有学过的人要高。

  7. 老赵
    admin
    链接

    老赵 2009-05-03 17:39:00

    @JimLiu
    我不知道该如何让尽可能多的人可以开始健康的讨论(有想法的朋友也可以给老赵一些建议)。
    所以我只能从自己做起,起个好头,希望能影响更多人,这样总比回避问题什么都不作要强吧。

  8. JimLiu
    *.*.*.*
    链接

    JimLiu 2009-05-03 17:40:00

    其实人的思维是最容易卡壳的东西,前几天在JavaEye上看到了一个讨论Montools和jQuery的文章,有网友说Montools中的get(i)形式非常优雅,比jQuery中的a[i]形式更直观。我诧异,难道这些人都没用过STL吗?重载一个下标运算符对于类库的使用者会是一个多么惬意的事情!可以看出,当我们处于一个环境下,时间长了,习惯了,就会把一些本来不是优点(虽然不一定说是缺点)的东西,当做顺理成章的了,甚至当做优点了,这样一来,不就是坐井观天吗?
    我们常遇到一些类似的言论“刚推出不久,还无法投入使用”,这是一种思维定势吗?是什么决定一个刚推出的东西就不能投入使用呢?就好比大学生就业,单位都要求两年工作经历,如果所有单位都如此,那么学生的这两年又由什么单位来提供?
    人的思维是最容易被自己封堵的,所以我才告诫自己一定要常常拍拍脑门,看看外面的世界。

  9. 老赵
    admin
    链接

    老赵 2009-05-03 17:51:00

    @JimLiu
    不过JavaScript倒真没法“重载”的,呵呵。
    你的说法我很同意,人类思维是最容易被封堵的。
    我觉得可能强调一种“做事方式”是非常关键的,例如你说的“拍拍脑门”。
    我往往发现,良性的讨论是“理由驱动”而不是“结论驱动”的,当大家都使用“结论”来“论证”,却总是不给出“理由”,坚持下去往往就变味了。
    例如get(i)一方,我不知道他们用什么理由来支持自己的观点,有没有具体的举例和论证。

  10. redmoon
    *.*.*.*
    链接

    redmoon 2009-05-03 18:03:00

    我从接触电脑那天,就对编程语言情有独钟,期间尝试了很多语言,虽然大部分都是浅尝即止。
    但我相信,构架、框架层面会有很多相通的地方,而语言可以让你获得更多新鲜感,也最具创新性。

  11. JimLiu
    *.*.*.*
    链接

    JimLiu 2009-05-03 18:18:00

    不得不承认,我自己也有严重的思维封闭,从我学C语言的第一天开始,我就被这个语言深深的吸引了,我认为以前学的VB那简直是污七八糟的语言,于是乎到现在我对所有非C风格的语言都有莫名其妙的排斥感,以至于我一直无法安心看看Python或者Ruby的书,而对于JavaScript却乐此不疲。

  12. fffff[未注册用户]
    *.*.*.*
    链接

    fffff[未注册用户] 2009-05-03 18:34:00

    看了标题,没耐心看完这么长的东西。
    我认为语言真的不重要。

  13. 本园第一神棍
    *.*.*.*
    链接

    本园第一神棍 2009-05-03 18:44:00

    WINDOWS 平台下:
    论敲码之爽:
    C# > JAVA > C++
    论框架理致:
    C# > JAVA > C++
    论类库组件:
    JAVA > C# > C++
    论平台迁移:
    JAVA > C++ > C#
    论性能体验:
    C++ > C# > JAVA
    论底层调用:
    C++> C# > JAVA

  14. 老赵
    admin
    链接

    老赵 2009-05-03 18:46:00

    @JimLiu
    为什么这样呢?我觉得,除了内置的类库之外,JavaScript和Ruby在语言上的差别很不明显。

  15. 老赵
    admin
    链接

    老赵 2009-05-03 18:47:00

    @本园第一神棍
    就目前看来,基本同意你的看法。

  16. JimLiu
    *.*.*.*
    链接

    JimLiu 2009-05-03 18:49:00

    @Jeffrey Zhao
    Ruby我看的倒是比较少
    Python是很抵制,莫名其妙的抵制
    我现在是看着不打花括号、不打分号的语言就莫名其妙的觉得不爽
    这是心理变态啊!!!

  17. 老赵
    admin
    链接

    老赵 2009-05-03 18:52:00

    --引用--------------------------------------------------
    redmoon: 我从接触电脑那天,就对编程语言情有独钟,期间尝试了很多语言,虽然大部分都是浅尝即止。
    但我相信,构架、框架层面会有很多相通的地方,而语言可以让你获得更多新鲜感,也最具创新性。
    --------------------------------------------------------
    语言是很难改造的,就算容易改造,也是因为“改造”已经成为“语言”的一部分。所以我目前认为,语言在一定程度上也是一种不可忽视的根本。

  18. 幸存者[未注册用户]
    *.*.*.*
    链接

    幸存者[未注册用户] 2009-05-03 19:14:00

    为什么说做底层开发的比做应用开发的技术含量更高,我觉得有两点原因:

    抽象层次越高,越接近人的思考方式;抽象层次越低则越接近计算机的方式,因此底层开发无论学习还是使用门槛都要高于应用开发

    高度的抽象也高度屏蔽了细节,.NET程序员不用面对烦人的指针,在他们的世界里内存没有限制,进程和线程无比简单,算法都封装进了类库,几乎不用直接面对HTTP,Socket等等等等

    虽然我不认为技术人员有高下贵贱之分,不过做底层开发似乎的确比做应用开发对技术人员的专业素质要求更高。

  19. 老赵
    admin
    链接

    老赵 2009-05-03 19:26:00

    @幸存者
    您的说法有一定道理,不过有些地方我觉得值得商榷。
    比较技术含量的话,我不觉得有什么差距,或者说可比性不同,很难做出比较。
    应用层也不是多么按照人类思维在开发,也是在抽象事物。
    底层开发也不是多么纯粹计算机思维,因为计算机也是按照人类思维,由人类发明的。

    当然我是在比“做得好”的人,如果比较门槛和技术人员整体专业素质的话,我也同意底层开发比应用开发要高。

  20. Nick Wang
    *.*.*.*
    链接

    Nick Wang 2009-05-03 20:15:00

    @幸存者
    我不是很同意你的说法。虽然抽象层次越高,就越接近人的思考方式,但是人类世界的关系和事物往往更加的复杂,反而计算机系统的世界要单纯许多。操作系统算是底层开发了吧,已经有一套成熟的理论了,而且几个主流的操作系统已经可以被广泛使用了;但是同一套ERP系统却几乎无法在不做修改和定制的情况下,卖给不同的买家。
    可能你所说的“专业素质”指的是计算机方面的知识和修养,但是在我看来,计算机行业就是为了解决问题而存在的,不管是系统级的还是应用级的,因此解决问题的能力也是“专业素质”的一部分。
    所以我觉得没有必要也不可能用这个来划分人的素质,任何地方都有素质高的,任何地方也都有素质低的,就看你做的东西到底有多复杂,而不是底层与否。

  21. Nick Wang
    *.*.*.*
    链接

    Nick Wang 2009-05-03 20:20:00

    语言其实还是挺重要的,如果只是比较Java与C#,那么说不重要也没什么,因为太相似了。对于那些压根就不像的语言,每种语言提供的抽象方式是不一样的,直接影响你的思维方式。例如在C里,就没法用面向对象,你可以说C也可以写面向对象的代码,但是如果你没学过C++,没学过C#,你还能写么?再比如internal dsl, 为什么ruby现在是最好的选择,因为他的语法比较的便利,同样的东西不是不能用C#来做,但是做出来就是不好看。

  22. Mr.Slippery
    *.*.*.*
    链接

    Mr.Slippery 2009-05-03 20:24:00

    语言只是工具,重要的是能力与思想!这句话本没有错,但是一句正确的话被强调过渡了可能也会成为一种错误。
    对这句话深有感触,我学习的第一门语言就是C#,那时候老师就开始灌输语言只是工具,重要的是能力和思想这句话,甚至于学数据结构的时候,因为找不到c#的教材,用了java的课件,老师也这么说,你们不用管具体怎么实现,知道是怎么回事就行.........
    虽然我现在还是个刚刚入门的菜鸟,但就我自己的经历,这句话完完全全对初学者是个误导,思想是站在一定高度上去理解的,如果还没达到这个高度,说起来就很搞笑了,就如同剑不会使,你在会背《独孤九剑》的剑谱也没啥用。
    所以,我感觉追求语言的细节是你在到达令狐冲那种水平之前的必经之路,令狐冲没有华山20来年的扎马步,一招一式的练剑,再牛X的独孤九剑,他也学不会~
    众位大牛,别再用这句话误导还没入门的初学者了,语言作为一种工具就是学会怎么走,而编程思想是跑意义上的东西,没学会走~,怎么去跑呢?
    老赵就老赵,呵呵~你要在我们学校当老师,俺就不会走这么弯路了,到现在才感觉刚刚入门。哎~还是静下心来好好修炼,明年就毕业了,还指望者老赵的公司再招人的时候,好跟着混来着~呵呵

  23. 温景良(Jason)
    *.*.*.*
    链接

    温景良(Jason) 2009-05-03 20:25:00

    支持老赵的说法

  24. ZOK[未注册用户]
    *.*.*.*
    链接

    ZOK[未注册用户] 2009-05-03 20:45:00

    那些说语言不重要的人,一定是对电脑被糖化了
    如果语言不重要,微软为什么要不断地开发新语言?为什么不把性能高的C/汇编,做一个很好的IDE...............
    开发底层就是C/汇编嘛,,,,选择这个语言很重要
    开发应用的就是用C++/C#/Delphi................1101....选择前者是不理智的

  25. 老赵
    admin
    链接

    老赵 2009-05-03 21:08:00

    @Mr.Slippery
    总之,不要过。认为语言没有意义,或者语言就是全部,都是不对的。

  26. xiao_p(未登陆)[未注册用户]
    *.*.*.*
    链接

    xiao_p(未登陆)[未注册用户] 2009-05-03 21:57:00

    无论如何,手上要有一把好用的刀(也就是语言),这是一个coder的最基本要求。

    特殊场合,使用特殊的语言实现,比如erlang之于并发,ruby之于web快速开发,各有擅长!

  27. xiao_p(未登陆)[未注册用户]
    *.*.*.*
    链接

    xiao_p(未登陆)[未注册用户] 2009-05-03 21:59:00

    不过,有些时候,等级这种事情会让人很郁闷。

    比如,我们公司的工资基本就和老赵文章开头提到的一样
    上等:系统架构
    中等:框架设计
    下等:语言实现

    从上到下,依次排列。。。

  28. 老赵
    admin
    链接

    老赵 2009-05-03 22:16:00

    @xiao_p(未登陆)
    很明显,我不同意这样的分法的,比如Anders他就是搞语言的,他在微软的待遇可不是随便谁都能比得过。
    我认为是工资的关键在于创造价值多少,而创造价值在于“怎么搞”而不是“搞什么”。
    但是如果在某个地方,“搞什么”就差不多决定了“怎么搞”,而且的确提高不了,那么这样的等级划分也不能算是有问题……

  29. xiaotie
    *.*.*.*
    链接

    xiaotie 2009-05-03 22:54:00

    @xiao_p(未登陆)
    上等:系统架构
    中等:框架设计
    下等:语言实现

    你们公司是打仗的,上等、中等、下等就类似于军长、团长、班长。。。

    @Jeffrey Zhao
    Anders属于造枪的,班长之类的属于玩枪的。。。

  30. ~Q~[未注册用户]
    *.*.*.*
    链接

    ~Q~[未注册用户] 2009-05-03 23:05:00

    --引用--------------------------------------------------
    JimLiu: @Jeffrey Zhao
    Ruby我看的倒是比较少
    Python是很抵制,莫名其妙的抵制
    我现在是看着不打花括号、不打分号的语言就莫名其妙的觉得不爽
    这是心理变态啊!!!
    --------------------------------------------------------
    我也是啊, vb我也讨厌. 虽说省了几次输入, 但就是很不爽. vb至少还有对称的一些关键字来标识控制片段. python 完全靠缩进,本能的讨厌这样的格式. 但愿不是强迫症.^_^

  31. virus
    *.*.*.*
    链接

    virus 2009-05-03 23:06:00

    “如果要实现一个‘高性能’、‘大并发’的网站,前端使用4层7层负载均衡,如果不用F5等商业产品可以先用Nginx等做反向代理。后台实现要对系统作划分,避免单点失败,也可以作独立优化。系统之间可以用异步消息传递来降低耦合;系统中不采用二段式提交或分布式事务,CAP原则中的“一致性”往往需要做出让步,而采用‘最终一致’策略。数据存储方面可以做横向或纵向的划分,或者构建查询表。合理使用Schemaless的设计方式或如何MemcacheDB或Tokyo Cabinet等Key-Value存储方式可以带来更好的伸缩性。除此之外,系统中还需要部署Memcached集群作为缓存。静态文件可以使用Squid或Varnish作为缓存,避免所有IO都直接落到文件存储上……”

    不错,这就是老赵的反击

  32. ~Q~[未注册用户]
    *.*.*.*
    链接

    ~Q~[未注册用户] 2009-05-03 23:13:00

    --引用--------------------------------------------------
    幸存者: 为什么说做底层开发的比做应用开发的技术含量更高,我觉得有两点原因:

    抽象层次越高,越接近人的思考方式;抽象层次越低则越接近计算机的方式,因此底层开发无论学习还是使用门槛都要高于应用开发

    高度的抽象也高度屏蔽了细节,.NET程序员不用面对烦人的指针,在他们的世界里内存没有限制,进程和线程无比简单,算法都封装进了类库,几乎不用直接面对HTTP,Socket等等等等

    虽然我不认为技术人员有高下贵贱之分,不过做底层开发似乎的确比做应用开发对技术人员的专业素质要求更高。
    --------------------------------------------------------
    各有偏重吧, 或者说, 总不能说用刀枪肉搏的战士要比发射卫星制导导弹的战士素质更高吧?反过来也一样不成立.

  33. 杜建宇
    *.*.*.*
    链接

    杜建宇 2009-05-03 23:39:00


    老赵最近貌似比较闲……敲这么多字出来……


    语言就是巨人的高度,看多远跟所站在的巨人的高度是有关系的……

    站的高才能看的远嘛……



    赶紧文不对题,建议把标题改为:程序员与开发语言的选择关系。

  34. 老赵
    admin
    链接

    老赵 2009-05-04 00:09:00

    @杜建宇
    1、我不同意“语言是高度”的说法,这个又变得把语言分为三六九等了。虽然我认为有些语言的确全面落后,但是大部分语言还是各有所长。
    2、其实材料收集和内容思考是平时随便走在路上就能积累的,码字只用了短短两小时,再说写blog和思考都是我工作的一部分,赫赫。
    3、我根本没有谈“程序员与开发语言的选择关系”,你为啥会有这个感觉,赫赫。

  35. 老赵
    admin
    链接

    老赵 2009-05-04 00:15:00

    @xiao_p(未登陆)
    针对web开发的是rails框架,不过ruby在里面的确有一定作用。
    不过erlang之于并发,是整体虚拟机和平台的优化结果,erlang语言的特性倒并非“并发”所需要的……

  36. 真的被你累到[未注册用户]
    *.*.*.*
    链接

    真的被你累到[未注册用户] 2009-05-04 00:32:00

    呵呵,我很喜欢老赵给出的链接。尤其是linus那一篇,过瘾!!

  37. Dirain
    *.*.*.*
    链接

    Dirain 2009-05-04 00:36:00

    说的好,又一次认识老赵。

  38. benz[未注册用户]
    *.*.*.*
    链接

    benz[未注册用户] 2009-05-04 07:53:00

    讲的很好,很不错,纠正了我的原有看法

  39. 汉子进墙[未注册用户]
    *.*.*.*
    链接

    汉子进墙[未注册用户] 2009-05-04 09:13:00

    凡事有度,过犹不及,在语言的基础上,建立思想。


  40. 伊雪
    *.*.*.*
    链接

    伊雪 2009-05-04 09:34:00

    语言都差不错,重要的是对编程的理解,编程的思想。
    存在即为合理。 语言的比较是在特定的环境下来决定的,每种语言的存在都有他的不可替代性。
    根据环境来选择语言才是合适的!
    就目前最流行的两大编程语言JAVA和C#来讲,他们之间的差别是不大的,有的时候用JAVA写的项目,完全可以随便改改拿到C#中来跑,反之同理!

  41. 香港陈冠希[未注册用户]
    *.*.*.*
    链接

    香港陈冠希[未注册用户] 2009-05-04 09:45:00

    喷吧就

  42. CowNew开源团队
    *.*.*.*
    链接

    CowNew开源团队 2009-05-04 09:46:00

    是不是dudu已经雇佣老赵为cnblogs的专业炒作员了,专业提升博客园的人气?难道老赵就是cnblogs版的流氓燕、宋祖德、杨二车娜姆?

  43. 老赵
    admin
    链接

    老赵 2009-05-04 09:53:00

    --引用--------------------------------------------------
    伊雪: 有的时候用JAVA写的项目,完全可以随便改改拿到C#中来跑,反之同理!
    --------------------------------------------------------
    “反之”不成立。
    我可以很负责的说,Java => C#还算容易,C# => Java是非常困难的事情,Java的特性缺失太多了。
    最容易的验证方式,您可以试试看把我blog里的那些C#程序片断转为Java试试看。

  44. 残叶落花
    *.*.*.*
    链接

    残叶落花 2009-05-04 10:21:00

    “语言只是工具,重要的是能力与思想”。这句话本没有错,但是如果把它作为“轻视语言”的理由,认为“语言”是低层次的东西,那只能说是一种误用了。
    ===
    这句话说的太对了,我身边搞编程的朋友,就是一直说“语言只是工具,重要的是能力与思想”。但是他们可曾真的认真想过,任何一门编程语言内涵的哲学?是否把使用过的语言精髓弄懂?
    诚然我们不能局限于一种语言,但是也不能只说一句“语言只是工具,重要的是能力与思想”。就不重视编程语言本身的含义!

    老赵这边文章说的在理,顶了!

  45. 大胃
    *.*.*.*
    链接

    大胃 2009-05-04 10:38:00

    编程语言重要吗?看对谁说。

    对不懂编程的人来说,不重要。
    对不需要敲代码的人来说,不重要。
    对编程只为了付账单的人来说,不重要。
    对不关心编程效率和质量的人来说,不重要。
    对某种语言背景很深的人来说,其他语言不重要。

    欢迎大家对号入座,如果觉得座位不够,请自带板凳,没有板凳,板砖也行。

  46. AlexLiu
    *.*.*.*
    链接

    AlexLiu 2009-05-04 10:43:00

    也许您会对以下内容感兴趣:。。。。
    这个东西做的挺不错的。

    前辈的文章看到最后似乎明白了一点您说的是什么。

  47. 1-2-3
    *.*.*.*
    链接

    1-2-3 2009-05-04 11:18:00

    这一篇很精彩,先赞一个。
    语言是框架/类库的基石,也是程序员每天都要用的表达工具,语言的设计是否灵巧、优雅不仅关系到生产力、可读性,也同时影响我们的心情,怎能说不重要呢?
    只是,如果一个用剑的说刀不如剑好用,哼哼,那用刀的必然十分不爽,非得砍个你死我活不可。这不是个可以用理性讨论的问题,它牵扯到荣誉和信仰,三字真言实属正常,就算老赵回家路上被暗算也并非不可能。

  48. zhangbojin[未注册用户]
    *.*.*.*
    链接

    zhangbojin[未注册用户] 2009-05-04 11:28:00

    就会个C#别的,不会,做了3年了,还是觉得对C#理解不透彻

  49. 小猴子
    *.*.*.*
    链接

    小猴子 2009-05-04 11:29:00

    如果大家站的角度是系统层次而不是具体的敲代码,对待一个具体的系统开发,要考虑的东西就很多很多,需求就是一个典型,到最后发现语言对于这个系统来说,不是那么重要。那些使用人员、需求分析的人员讨论具体的语言的机会就不说了,在具体的开发过程,讨论最多的是如何实现XX功能,类该如何封装,代码该如何组织,架构大致会是个什么样子的,很少去讨论这个东西具体要如何去实现。开发人员最可怕的是对用户的需求不做评判审核,最可贵的是有想法有思路有创新。开发4年的真实感受。
    最后,觉得LZ说的是不错的,对自己使用的语言都不熟悉,那也是一个不合格的CODER。

  50. ZOK[未注册用户]
    *.*.*.*
    链接

    ZOK[未注册用户] 2009-05-04 11:45:00

    那些说语言不重要的人,一定是被软件公司糖化了
    如果语言不重要,微软为什么要不断地开发新语言?为什么不把性能高的C/汇编,做一个很好的IDE...............
    开发底层就是C/汇编嘛,,,,选择这个语言很重要
    开发应用的就是用C++/C#/Delphi..............选择这些语言很重要......选择前者是不理智的

  51. 张伟kk
    *.*.*.*
    链接

    张伟kk 2009-05-04 11:48:00

    老赵的话题,挺值得大家思考的~

    人类和动物不同,区别是什么?
    其中非常重要的一点就是:制造和使用工具
    如果忽略工具的重要性,人类能有今天?

    是否使用工具、是否正确选择工具、是否熟练的使用工具
    已经可以说都直接影响到事情的成败!

    回到编程角度:
    总的来说,语言是工具,那么什么时候选择什么语言,已经越显重要,老赵探索多语言的编程,也许正是有所体会。

    讨论语言本身的优劣只是一个方面的比较,语言所运行的平台,他们的同样值得讨论的~
    毕竟,语言和其运行环境息息相关,不能脱离平台去运用。
    综合考虑,也许更加贴近实际运用。

  52. 深山老林
    *.*.*.*
    链接

    深山老林 2009-05-04 11:49:00

    功力再高,如果再有一个好的兵器,当然会更加的得心应手,语言既然是工具,难免会有好坏之分。老赵说的还是有一些道理的。

  53. 老赵
    admin
    链接

    老赵 2009-05-04 11:56:00

    @张伟kk
    多语言编程,其实主要还是在同一平台下,结合多语言,这个和项目对语言/平台的选型出发点倒也不一样。
    我其实一直是在比较语言,可以认为是“多语言编程”中的选型,不过很多朋友喜欢把平台拉进来。
    虽然平台讨论也是有价值的,但是非要用平台来比较语言,我就觉得不是味道了。
    这方面原因,排开面子,信仰等等,可能“多语言编程”中的理念还不太能让人理解吧。

  54. 老赵
    admin
    链接

    老赵 2009-05-04 12:01:00

    @深山老林
    高手还是很挑兵器的,其实……因为这篇文章在谈语言,有些例子不好说。例如拿框架举例子的话:
    Gavin King为Hibernate胜过JDO也吵了骂了无数次,颇有Linus气势,
    DHH也是看不惯J2ee因此搞Rails,
    还有比如GPL那大胡子,不是GPL也骂——不算骂,他说话方式还是客气,内容倒很偏激,比如认为云计算,SAAS不自由,应该禁止使用,“装过”Windows的机器应该扔了等等,呵呵。

  55. 阿鹏
    *.*.*.*
    链接

    阿鹏 2009-05-04 12:21:00

    @Jeffrey Zhao
    看到您在,赶紧问个问题。困扰好久。太谢谢了。
    就是假设做个用户注册。是应该使用
    function Register(User user) {
    if(checkUserEmail(user.Email)) {} // 验证邮箱是否已被注册
    if(checkUserName(user.UserName)){} // 验证用户是否已被注册
    int userId = dataLayer.Register(user);
    if(userId <=0)
    {} // 注册失败
    else
    {} // 注册成功
    }
    每次操作与数据库交互。还是应该使用存储过程。一次解决。根据存储过程返回值来判断是哪一种情况。
    由于注册成功存储过程会返回新创建的用户编号。所以错误要与其区别,可以使用-1,-2,-3之类的。

    不知道哪一种做法会比较好。看到很多人说减少与数据库交互会提升性能。
    又看到很多人说把逻辑放到存储过程中会使代码逻辑不清晰。。
    还有就是-1,-2,-3有点不那么清晰。其它都很好。
    有的人说看情况,,,但我不知道看什么情况。。很复杂。但是有什么标准。sql多一些。一多逻辑就带进去了,很正常啊。。。
    有点混乱。希望您能看懂。谢谢您。

  56. 阿水
    *.*.*.*
    链接

    阿水 2009-05-04 12:44:00

    就像干活一样,有个趁手的工具,当然做着爽!!!但是如果没有这个工具你就什么都干不了。那么相信你的价值会打折扣哈。所以说思想也很重要,到底有多重要?就看你的思想能解决多大的问题。好像扯远了,不好意思。

  57. 老赵
    admin
    链接

    老赵 2009-05-04 13:30:00

    @阿水
    嗯,工具爽人人都知道,但是目前主流思想还是有看轻工具的意思,我写文章也是为了说明这个问题。思想肯定也是重要,应该看不出我有否定思想的意思吧?

  58. 第一控制.NET
    *.*.*.*
    链接

    第一控制.NET 2009-05-04 13:33:00

    话说天机棒原来是个大烟袋锅子。而小李飞刀不过是大冶铁匠两个小时打造。
    百晓生死的很凄惨。

  59. 小猴子
    *.*.*.*
    链接

    小猴子 2009-05-04 14:22:00

    --引用--------------------------------------------------
    第一控制.NET: 话说天机棒原来是个大烟袋锅子。而小李飞刀不过是大冶铁匠两个小时打造。
    百晓生死的很凄惨。
    --------------------------------------------------------
    说的不错,关键还是谁在用。思想和工具比起来,就象大海和湖泊,
    湖泊比较小,所以容易掌握,到了一定的程度不说精通吧,也谈得上熟悉;
    思想则很大,以至于每个人的体验都不同,大家常常一起交流心得。

  60. 韦恩卑鄙
    *.*.*.*
    链接

    韦恩卑鄙 2009-05-04 14:41:00

    话说古龙本来写的就不是武侠
    是梦

  61. 小张空间
    *.*.*.*
    链接

    小张空间 2009-05-04 14:51:00

    我觉得楼主有偷换该年之嫌,虽说语言是武器,可是也要分使用的人,我联系的内功就是使用这个武器的,你给我再好的武器不适合,还是白搭。
    所以,我个人认为,语言还要看具体的环境来说,不一定说语言的熟练度就非常重要,或者思想、架构这些抽象的东西就重要。

  62. 韦恩卑鄙
    *.*.*.*
    链接

    韦恩卑鄙 2009-05-04 15:11:00

    老赵哇
    现在孩子没看懂你的尾递归 还以为递归是个高新技术
    啥都跟着用递归 还不优化
    我有点郁闷 想实现一个IList
    帮他们做一个利用stack <> 模拟递归的封装
    又怕这些孩子拿来就用 不看原理
    你说做还是不做。。。。

  63. 韦恩卑鄙
    *.*.*.*
    链接

    韦恩卑鄙 2009-05-04 15:16:00

    class RecursionList<T>:IList<T>
    {
    void RecursionList(int maxdepth, T root, Func<IEnumerable<T>,T> childrenfunc)

    }

    恩 深度和广度优先各做一个

  64. ddda
    *.*.*.*
    链接

    ddda 2009-05-04 15:18:00

    中国需要这样的讨论,说不定不知不觉,哪天我们也发明了一种语言,嘿嘿

  65. 老赵
    admin
    链接

    老赵 2009-05-04 15:34:00

    --引用--------------------------------------------------
    小张空间: 我觉得楼主有偷换该年之嫌,虽说语言是武器,可是也要分使用的人,我联系的内功就是使用这个武器的,你给我再好的武器不适合,还是白搭。
    所以,我个人认为,语言还要看具体的环境来说,不一定说语言的熟练度就非常重要,或者思想、架构这些抽象的东西就重要。
    --------------------------------------------------------
    嗨嗨嗨,我是在一个“轻视语言”的环境里强调一下而已,哪里表现出“使用者能力不重要”的意思了?
    怎么还是那么喜欢搞二分法,我说个“A”就觉得我在说“非B”了。
    再说我没有提过“熟练度”的意思,我是说对语言的研究比较是不是有意义。

  66. 老赵
    admin
    链接

    老赵 2009-05-04 15:46:00

    --引用--------------------------------------------------
    ddda: 中国需要这样的讨论,说不定不知不觉,哪天我们也发明了一种语言,嘿嘿
    --------------------------------------------------------
    嗯嗯。不过我觉得语言不好说,因为天下那么多人呢,又有多少语言,可以尝试,但不必强求。
    现在的人大部分还是在搞框架/类库,或是方法学,这些东西我相信是可以突破的。
    我目前在思考一个框架,一个框架,一个框架……

  67. 老赵
    admin
    链接

    老赵 2009-05-04 15:54:00

    @小猴子
    工具也是体现思想的,讨论工具比较工具,最终只要是讨论思想比较思想,或者其它有价值的东西,就是好事,值得鼓励。
    至于思想和工具要说哪个大,应该鼓励哪个,我觉得不好比较。不过我深信,通过正确的方法,无论搞其中哪个,都不得不涉及到另外一个。

  68. 老赵
    admin
    链接

    老赵 2009-05-04 16:02:00

    @韦恩卑鄙
    别做……让他们自己动手丰衣足食,锻炼思维的时候不得偷懒……

  69. 小猴子
    *.*.*.*
    链接

    小猴子 2009-05-04 16:37:00

    @Jeffrey Zhao
    恩。是这样的!工具能促进人的思维方式,用MS的话说,能释放更多的精力去专注其它的东西。.net使用方便、开发快速也是我选择的主要原因。

  70. 黑羽飘舞
    *.*.*.*
    链接

    黑羽飘舞 2009-05-04 17:32:00

    一个刀客要了解自己的刀,一个剑客要了解自己的剑,而一个大侠则除了要了解自己的武器,也要了解其他侠客的武器、招式,才能知己知彼百战不殆

    一个程序员,必定是要了解自己的招式,武器。

  71. zzzzz[未注册用户]
    *.*.*.*
    链接

    zzzzz[未注册用户] 2009-05-04 17:34:00

    其实所谓我们很多草根人士平时在谈论“系统架构”的时候,往往就是把各种产品,原理,实践进行组合拼接,其实说起来和看着市场上产品报价然后攒出一台电脑没有本质的区别。

    非常精辟

  72. 装配脑袋
    *.*.*.*
    链接

    装配脑袋 2009-05-04 17:35:00

    做语言可不是一个轻松的活,我是说当真做现代语言的话。如果做一个C,甚至于C#1.0都不是什么困难的事情。
    但是,为了实现VB9中的XML嵌入语法的解析,我思考采用双Scanner的解决方法数月时间才终于发现了可行的方法。想想你在VS里就能轻易用到如此高深的技术,但却从未思考过它的原理以及如何实现,就知道忽略了多少东西吧^_^

  73. 逃话费
    *.*.*.*
    链接

    逃话费 2009-05-04 17:41:00

    对于这个问题,我基本看完了所有评论,我觉得这个话题本身就不值得讨论。难不成过两天还要讨论一下:语言很重要吗?
    很简单的理解方式就是像我们学习英文一样。
    英文不重要吗?
    如果你不懂英文,看资料,与人交流处处受限。
    英文很理要吗?
    那为什么N多人到现在连一句英文都不懂呢?

    英文有无优势?语言分三六九等吗?如果有不懂的,躲在被窝里别出来见人了,或者重新投胎算了。

    做事都是在不偏激的情况下,夯实基础,一步步地向前做。没有不懂计算机语言的架构师,更没有不懂语言的程序员!

  74. 老赵
    admin
    链接

    老赵 2009-05-04 17:44:00

    @逃话费
    如果人人都知道这个道理,那么的确没有必要说。
    可惜就是很多人轻视语言,所以我拿出来谈一谈。

    比如你拿英语作类比,应该没有人看到谈论英语会说“没层次没高度”吧,可惜对于编程语言就会这样,这就说明对这方面有所误解。
    所以我来谈一下。

  75. 老赵
    admin
    链接

    老赵 2009-05-04 18:01:00

    @装配脑袋
    你居然不写出来,该当何罪。

  76. 装配脑袋
    *.*.*.*
    链接

    装配脑袋 2009-05-04 18:35:00

    @Jeffrey Zhao
    有想法了,代码没出来啊……

  77. 算法城管
    *.*.*.*
    链接

    算法城管 2009-05-04 18:53:00

    对大多数人来说,语言都是不重要的,就如出生学了那种语言就那种了。
    你换一种也不会让你变得表达能力好一点。

    去评判语言,还是留给语言工作者来做吧。

  78. CowboyRyan
    *.*.*.*
    链接

    CowboyRyan 2009-05-04 19:08:00

    一直都在思考,大牛们设计一种语言出来的真正目的,处于商业考虑还是本身对当前的语言不爽。

  79. SharpDeveloper
    *.*.*.*
    链接

    SharpDeveloper 2009-05-04 19:25:00

    我很赞成老赵的想法, 其实我也不是不喜欢JAVA,但是我很烦那些坚持以JAVA框架多,理论牛B,还能跨平台,能处理超大的商业应用的JAVA coder们,说框架他们也只用到了一点皮毛,百万用户级别的应用都没做过,就天天想着做千万级,亿级用户的程序,再说跨平台,我不知道有多少人写过的程序在Linux服务器上跑过?好像用JAVA这样牛B的语言才能做牛B的程序员.
       

  80. 老赵
    admin
    链接

    老赵 2009-05-04 22:44:00

    @装配脑袋
    有价值的就是想法阿

  81. 老赵
    admin
    链接

    老赵 2009-05-04 22:52:00

    @算法城管
    不同的语言有不同的能力,用不同的语言做事可以有差别。
    就好比语言可能无法直接给你什么能力上的提高,但是能力相同的情况下,不同语言带来不同的生产力,因此不能忽视语言。
    至于评判语言,语言的使用者也是非常有“资格”和“必要”的,就像工具使用者评判工具好不好用一样,并非只有生产商才需要关注这些。
    语言、框架、类库都是工具,都可以比较,都可以评判,都可以选择,而且它们是有机结合的,可以互补,可以互通。
    打个比方,erlang直接实现了actor model,scala没有,因此有人补充了actor model的框架,让scala也有了actor model。.net呢?CCR,如果嫌表达能力不够,上F#直接配合Tuple,也有一定程度的补充。
    因此,对语言,框架,类库应该平衡,否则就可能会丧失生产力,当然,对能力和工具的掌握也应该平衡。

  82. 韦恩卑鄙
    *.*.*.*
    链接

    韦恩卑鄙 2009-05-05 12:01:00

    --引用--------------------------------------------------
    装配脑袋: 做语言可不是一个轻松的活,我是说当真做现代语言的话。如果做一个C,甚至于C#1.0都不是什么困难的事情。
    但是,为了实现VB9中的XML嵌入语法的解析,我思考采用双Scanner的解决方法数月时间才终于发现了可行的方法。想想你在VS里就能轻易用到如此高深的技术,但却从未思考过它的原理以及如何实现,就知道忽略了多少东西吧^_^
    --------------------------------------------------------
    脑袋
    给c#开发一个类似的addin 才是正徒阿

    。。。。

  83. 阿水
    *.*.*.*
    链接

    阿水 2009-05-05 16:08:00

    个人觉得老赵还是写一篇文章,说说,语言,工具,平台,框架,思想等东西对于一个开发者的意义。当然对开发者也要区分,普通的,高级的,架构师等等。这样更有意义,虽然这篇文章没有什么不好的地方。但是容易让人感觉凸显语言的作用,会容易产生以偏盖全的感觉。
    就像老赵说的很多人没有意识到以上的东西的作用和地位,我怕这篇文章更容易让他们误入歧途。哈哈 个人的一点杞人忧天。

  84. 老赵
    admin
    链接

    老赵 2009-05-05 16:24:00

    @阿水
    如果语言的重要性被大众舍弃了那么久,却能被我一篇文章就整个翻身了,我的影响力也太大了。
    所以放心吧,不会有问题的,只要保持正确的内容,逻辑的分析,无论些什么都没有问题。
    比如我在文章里也强调过不能以偏盖全,不能非A即B,不能眼高手低,也强调了框架的作用。
    如果谁看到这些内容还会“误入歧途”的话,说明他看文章不仔细,逻辑不清,思维混乱,那么也只能说“责任自负”了。
    不过我同时也怀疑,这样的人到底应该看什么文章。
    // 至于“语言,工具,平台,框架,思想等东西对于一个开发者的意义”……我想想看哦,有什么想法你也告诉我让我参考一下,呵呵。

  85. GWPBrian
    *.*.*.*
    链接

    GWPBrian 2009-05-06 08:28:00

    我认为语言很重要!

  86. 蠢净水
    *.*.*.*
    链接

    蠢净水 2009-05-06 09:46:00

    基础不能少吧

  87. PowerBy[未注册用户]
    *.*.*.*
    链接

    PowerBy[未注册用户] 2009-05-06 13:55:00

    你以为就你一SB会编程其他人就不会了么?一个愣头青发什么瓜啊?你以为你在CNBLOGS火的很么?其实我觉得你瓜的很。真不知道MS怎么选人的,你这种垃圾也能在WEBCAST讲课,难怪现在李建忠老师也不再WEBCAST讲课了。就你TMD这一垃圾搞得。真希望你TMD早点从世上消息。

  88. 老赵
    admin
    链接

    老赵 2009-05-06 13:59:00

    @PowerBy
    是“消失”吧,别激动,打字慢点,呵呵。
    其实李建中不在WebCast讲是因为转型了啊,主要做管理,不做一线培训了。真可惜。

  89. 老赵
    admin
    链接

    老赵 2009-05-06 14:01:00

    --引用--------------------------------------------------
    蠢净水: 基础不能少吧
    --------------------------------------------------------
    我这里没有谈基础啊

  90. guozili@163.com
    *.*.*.*
    链接

    guozili@163.com 2009-05-06 17:23:00

    老赵的敢言还真多啊,相信你已经走向思考人生价值、挖掘程序员本质的境界了,可惜俺们还在猥琐埋头研究该死的语言中。。。。

  91. stabley107
    *.*.*.*
    链接

    stabley107 2009-05-07 10:09:00

    赞一个
    有多大的眼界,决定有多高的思想
    有多高的思想,决定有多大的心胸
    有多大的心胸,决定有多大的成就

  92. 鲜红
    *.*.*.*
    链接

    鲜红 2009-05-07 22:57:00

    其实说语言不重要不是程序员的错,程序员也要吃饭也没办法啊,而是我们社会的价值观造成的,不重视基础的细节的东西,这也是我们得不到诺贝尔奖的原因。我本来对哲学感兴趣的可是我能搞吗,我还对深山的奇怪昆虫感兴趣可是我能去研究吗。

  93. jilin[未注册用户]
    *.*.*.*
    链接

    jilin[未注册用户] 2009-05-12 14:07:00

    --引用--------------------------------------------------
    Haozes:狂顶一下,我直接学.NET的,这直接导致自己对系统底层的了解程序不够.很难深入.

    --------------------------------------------------------
    .net框架没有从电脑里蹦出来抓住你的手,不让你学windows系统编程吧

  94. 混世魔王
    *.*.*.*
    链接

    混世魔王 2009-05-13 23:32:00

    赵大哥,我越来越崇拜你了。是没引号的崇拜。我这辈子没有崇拜过任何人,呵呵

  95. sps.shareach.com
    *.*.*.*
    链接

    sps.shareach.com 2009-05-16 09:40:00

    呵呵,总感觉你这种文章有点炒作和做作的感觉.
    "语言只是工具,重要的是能力与思想”。我觉得你说得不是语言,而换成framework和library比较好. c# Vb.net as js java,这些语言有多大难度哪? 要深入的是他的类库,框架和包.

    还是希望多点技术心得和文章共享,呵呵

  96. 老赵
    admin
    链接

    老赵 2009-05-16 11:46:00

    @sps.shareach.com
    做作和炒作是你先入为主的感觉,因为你觉得这个话题是没有必要讨论的,所以我肯定也知道这些,只是我还在说,自然就变成“做作和炒作”了。
    其实你根本就没有看我的文章,以及我文章举的示例。例如,不要拿C#和Java比“思想”,它们是同宗的。
    我文章里明显说的是比如C#,Python,Ruby,Scheme,F#,Scala这些不同“文化”的东西。

  97. 老赵
    admin
    链接

    老赵 2009-05-16 11:48:00

    @sps.shareach.com
    对了,补充一句。
    我认为国内很多程序员提高不了的一个重要原因,就是总是轻易认为某某东西是没有价值,或理所当然的,没有自己思考,没有critical thinking(想明白)。
    别人讨论也不看,不愿意更新自己的想法,却一直喜欢“XX编程三百例”,“XX从入门到精通”之类的文章。
    也就是说,喜欢学习“技术”,但是不喜欢“思想”——虽然一直嚷嚷着思想最重要,呵呵。

  98. 山丘田边
    *.*.*.*
    链接

    山丘田边 2009-05-16 17:33:00

    我喜欢老赵……个人喜好
    我喜欢老赵的观点(思想)……高层次的追求
    :-)

  99. sps.shareach.com
    *.*.*.*
    链接

    sps.shareach.com 2009-05-16 19:16:00

    @Jeffrey Zhao
    呵呵,我没别的意思,只是个人感觉的, 莫生气.
    其实我感觉你的 "技术"和"思想",是实践和理论的区别.
    300例对 初级入门的人不失是好的demo, thinking XXX 是想深入的东西, 你不觉得没有那些demo, thinking xxx是很枯燥的么.
    我不是说thinking不好, 呵呵. 不善表达, 个人观点.

  100. 老赵
    admin
    链接

    老赵 2009-05-16 19:20:00

    @sps.shareach.com
    嗯,我不满的不是“三百例”这样的书,而是只关注“三百例”,而觉得“thinking”没有价值甚至是在“做作和炒作”的态度。

  101. sps.shareach.com
    *.*.*.*
    链接

    sps.shareach.com 2009-05-16 19:35:00

    @Jeffrey Zhao
    呵呵,你神速啊, 刚发上去,刷新一下,你就回复了
    我没有说thinking是没价值的啊, 现在很多程序员喜欢google search, 300例也是被公司逼出来的. 前面的项目和新知识还没搞完, 新的又要上马的. 我看到有些程序员做.net 3~4年了, msdn怎么用还不知道, 别说thinking了.
    即使thinking了也仅仅限于理论, 不知道怎么在实际里面用起来. 所以很多.net程序员觉得 IL 离自己很遥远.

  102. 老赵
    admin
    链接

    老赵 2009-05-16 19:42:00

    @sps.shareach.com
    这是对thinking的理解有误吧,thinking是一种做事方法,就算是做简单的hello world也可以有思考啊,自己多问几个为什么就是了。
    听一些人聊起国外一些大学教授,培养学生思考能力,就是“毫无道理”的问“为什么”。
    所以我认为,“思考”永远是离自己很近的,反而某个具体“技术”倒的确会离自己很远。
    就好比我也觉得大部分.NET程序员去了解或研究IL每个指令做什么是没有意义的。
    .NET程序员对IL的了解,能知道“IL是什么”,然后知道“必要时”研究IL的“方法”即可。

  103. sps.shareach.com
    *.*.*.*
    链接

    sps.shareach.com 2009-05-16 19:50:00

    @Jeffrey Zhao
    同意
    我说的IL只是例子, 就是程序员有好奇心之类的东东, 好奇心有了才会去多想多学. 否则就不会去好好学和想了.

  104. 体育[未注册用户]
    *.*.*.*
    链接

    体育[未注册用户] 2009-05-25 10:35:00

    --引用--------------------------------------------------
    PowerBy: 你以为就你一SB会编程其他人就不会了么?一个愣头青发什么瓜啊?你以为你在CNBLOGS火的很么?其实我觉得你瓜的很。真不知道MS怎么选人的,你这种垃圾也能在WEBCAST讲课,难怪现在李建忠老师也不再WEBCAST讲课了。就你TMD这一垃圾搞得。真希望你TMD早点从世上消息。
    --------------------------------------------------------
    你就一垃圾,那有你“SB”这么不礼貌的,要文明用语,知道吗?

  105. Yin.Pu@CQUSoft
    *.*.*.*
    链接

    Yin.Pu@CQUSoft 2009-05-26 22:44:00


    文中的“兼容并包”这个词是最能表达我想法的词了。我认为作为程序员应该要有较好的“兼容性”,也即开发语言不应成为程序员发展的瓶颈。程序员要从更高的层次关注行业的问题而非语言本身。所以学习和了解多种语言并不是程序员的目的,而是一种从多方面解决问题的手段。

    以解决问题为核心而不提倡以学习多种语言为目的

  106. 钢盅郭子
    *.*.*.*
    链接

    钢盅郭子 2009-08-12 17:22:00

    万丈高楼平地起,千层架构语言生

  107. sps.shareach.com
    *.*.*.*
    链接

    sps.shareach.com 2009-08-12 20:48:00

    @钢盅郭子
    哈哈, 诗意很浓啊,小改一把, 押运一点:
    万丈高楼砖瓦筑,千层架构语言生

  108. sps.shareach.com
    *.*.*.*
    链接

    sps.shareach.com 2009-08-12 20:51:00

    @钢盅郭子
    感觉还是不对, 架构和具体语言没多大关系吧, 机器语言
    高楼现在用的东西也多, 和砖瓦可以毫无关联了

  109. 钢盅郭子
    *.*.*.*
    链接

    钢盅郭子 2009-08-13 09:29:00

    @sps.shareach.com
    上联赞的
    架构和具体的语言未必有关
    但若是不学语言,如何能理解架构?若是没有语言的具体实现,抽象的架构如何产生价值?

  110. 忠杰
    *.*.*.*
    链接

    忠杰 2009-08-29 15:25:00

    很鄙视那些自己什么语言都 不会,而叫嚣“语言并不重要,重要的是能力”的大学教授 。而现实中他们又接到了项目,然后找年青的老师给他们做东西的人。

  111. 鞠文广
    *.*.*.*
    链接

    鞠文广 2009-09-01 15:34:00

    理想的编程语言 鞠文广

    以下纯粹是个人观点, 不代表任何组织或社团.

    现在流行的编程语言如Java和C#, 大多是面向对象的, 程序的各部分是通过方法调用连在一起, 其编程范式是命令编程, 即使支持其他范式也包装得很难理解和使用.

    面向对象实际上只适合实现抽象数据类型, 让它去完成除此之外的任务确实是勉为其难, 即便能完成也给人不伦不类的感觉, 既不像面向对象编程, 也不像它的前任(过程编程). 这些语言中的对象与物质世界的物质(或对象)很不一致, 它使用方法调用的方式与其他对象进行相互作用, 而这与物质之间的(通过通信或媒介)相互作用是截然不同的, 因此用面向对象无法很确切地模拟现实世界(面向对象思想的初衷), 更不用说准确地为现实世界建立模型.

    这几年流行的web服务和SOA虽使程序间交互更方便, 但它从本质上说还是使用”面向对象+命令编程+方法调用”的思路, 在编程方法论上并没有实质的进步.

    用现在流行的语言实现的完成复杂功能的程序逻辑不清晰, 原因在于”命令编程+方法调用”的设计机制. 这使程序很难模块化, 副作用无所不在, 因此很难正确实现复杂功能.

    现实世界的发展变化是通过事物间的相互作用实现的, 而这种相互作用用计算机科学的语言来说就是进程间的并发(concurrency). 软件的本质是什么? 我觉得:软件总是完成某种功能的,归根到底是对现实世界的事物间相互作用进行建模. 因此软件的组成部分间自然就是并发的关系, 而不是过程调用的关系. 用相互通信的进程来对现实世界的事物间相互作用进行建模是比较合理的. 所以进程应该作为语言的基础成分, 是软件的基本组成部分, 而不是只为了提高效率才采用的.

    为了使程序能准确地为现实世界建立模型, 从而正确性更高, 结构更合理, 模块化程度更高, 因此在几种编程思想或语言的基础上(见references), 我提出一种新的编程思想: 面向进程+函数编程+逻辑编程+约束编程(constraint programming)+其他合理的范式(命令编程除外)和以此为方法论的一门编程语言Processlog (全称process logic).

    由于现有的并发机制要么不够理想, 存在不能接受的缺陷(如Java中的monitor机制); 要么很难应用于实际(如CSP的通道(channel)通信), Processlog中采用的并发机制是: 程序中同时运行的进程相互间通过端口来通信. 这种并发机制是我根据Abstract Behavior Types[1]的思想提出来的. 要完成两个进程间通信, 需把一个进程的输出端口和另一进程的输入端口相连, 然后在输出端口发送消息, 在输入端口接收消息就可以了. 这种机制很自然, 和现实世界的事物间相互作用是类似的.

    Processlog的语法概要如下:

    1 运算符
    (1) ? 输入; c ? x 从输入端口c上接收输入值放到变量x中
    (2) ! 输出; c ! v 把v的值从输出端口c上输出
    (3) -> 顺序进行的事件的先后关系
    (4) | b : s 分支
    (5) a >> p.b 输出端口a连接到进程p的输入端口b
    (6) a << p.b 输入端口a连接到进程p的输出端口b
    (7) and, or, not 逻辑运算符
    (8) 算术运算符和关系运算符 与Java中相同

    2 程序的组成成分
    (1) Unit 程序单元
    (2) Process 进程
    (3) Function 函数
    (4) Predicate 谓词
    (5) DataInPort 数据输入端口类型
    (6) OutPort 输出端口类型
    (7) InPort 输入端口类型
    (8) ResultPort 结果输出端口类型

    3 原子数据结构
    (1) List (函数编程中的List类型, 对List的操作函数与函数编程中相同);
    (2) Tuple 元组, 同Clean.
    (3) Set 集合
    没有数组

    4 进程的定义
    Process ChangeRel
    ( DataInPort dataIn(List, Em, Em);
    ResultPort resultOut(Em);
    InPort fromGetRel;
    OutPort toGetRel, toDetach, toAttach, toChangeRel
    )
    % 生成(或使用已有的)与当前进程相连接的进程, 并配置端口间的连接
    (
    GetRel getRel; Detach detach; Attach attach;

    toGetRel >> getRel.dataIn,
    fromGetRel << getRel.resultOut;

    toDetach >> detach.dataIn;

    toAttach >> attach.dataIn
    )

    {
    dataIn?(list, rlEm, em) ->
    ( | list=[cem:cems]:
    ( ChangeRel changeRel;
    toChangeRel >> changeRel.dataIn % 递归进程
    )
    toGetRel!(rlEm.id) -> fromGetRel?rel
    -> toDetach!(cem, rlEm.id)
    -> toAttach!(cem, em.id, rel.level, rel.weight, rel.relation)
    -> toChangeRel!(cems, rlEm, em)
    ) -> self % 进程是一直运行的, 直到整个系统终止
    }

    进程由事件组成, 如fromGetRel?rel是输入事件, toGetRel!(rlEm.id)是输出事件.

    5 函数
    [Function] compute(double x)=
    | x<=0: x*x+3
    | x>0: compute(x-5)* compute(x-3)
    函数只能以事件的方式在进程中使用或在其他函数中使用, 不能独立使用.

    6 谓词
    /* 建图 */
    Predicate createGraph(t, graph):-
    addNode(t, null, ({},{}), graph1),
    getDS(t, graph1.ns, tlist),
    addList(tlist, t, graph1, graph).
    /* 加节点 */
    Predicate addNode(t, null, (ns, es), (ns1, es):-
    merge(ns, {t}, ns1).
    Predicate addNode(t, upper, (ns, es), (ns1, es1)):-
    merge(ns, {t}, ns1),
    merge(es, {(upper, t)}, es1).

    7 把谓词转换为函数
    create(t)= graph
    where createGraph(t, graph)

    谓词不能独立使用也不能在进程中直接使用, 先转换为函数后再在进程中使用.

    8 程序单元: 包含进程和数据类型
    Unit PMDAO;
    interface
    Tuple M;
    Process GetReleasedVersion(DataInPort dtIn, OutPort pt1 , InPort pt2);

    implementation
    M=(String id, String name, String version, …);
    Process GetReleasedVersion(DataInPort dtIn, OutPort pt1 , InPort pt2)
    (…)
    {

    }

    指导原则: 程序是由通过端口相连接的进程组成的. 数据处理和算法用函数编程实现, 如果函数编程不适用于要处理的问题, 就使用逻辑编程或约束编程.

    Processlog语言限制了编程的随意性, 要求只能用进程+函数编程+逻辑编程的方式编程, 不允许用Java或c#的命令方式编程.

    Processlog 现在还没有在机器上实现. 我用该语言重写了实际项目中的一些复杂代码(原是Java代码), 证实用它写的程序确实简单清晰, 有类似数学的简洁美. "7 谓词"就是其中一部分代码.

    我的想法是: 应先在纸面上规定它的语法与语义, 再通过使用它完成一些复杂的项目代码来发现它的不足, 再进而改进它, 再实践, 再改进, 直到它基本完善再在机器上实现.

    现在需解决的问题是:
    在这种并发机制下, 怎么实现事务控制?

    希望有识之士和我一起共同发展这种编程方法论和这门语言.

    联系方式: juwenguang2000@yahoo.com.cn
    博客: http://www.cnblogs.com/forrestju/

    References
    1. Farhad Arbab, Abstract Behavior Types: a foundation model for components and their composition
    2. Clean http://clean.cs.ru.nl/
    3. Prolog
    4. Delphi

    注: 转载时请注明作者.

发表回复

登录 / 登录并记住我 ,登陆后便可删除或修改已发表的评论 (请注意保留评论内容)

昵称:(必填)

邮箱:(必填,仅用于Gavatar

主页:(可选)

评论内容(大于5个字符):

  1. Your Name yyyy-MM-dd HH:mm:ss

使用Live Messenger联系我