<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>冒号空间 &#187; 架构师</title>
	<atom:link href="http://blog.zhenghui.org/tag/architect/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.zhenghui.org</link>
	<description>自然、人类、机器</description>
	<lastBuildDate>Fri, 30 Dec 2011 03:14:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>冒号课堂§5.4：语言误区</title>
		<link>http://blog.zhenghui.org/2009/09/27/colon-class-5_4/</link>
		<comments>http://blog.zhenghui.org/2009/09/27/colon-class-5_4/#comments</comments>
		<pubDate>Sun, 27 Sep 2009 00:50:01 +0000</pubDate>
		<dc:creator>hui</dc:creator>
				<category><![CDATA[冒号课堂]]></category>
		<category><![CDATA[宗教]]></category>
		<category><![CDATA[架构师]]></category>
		<category><![CDATA[程序员]]></category>
		<category><![CDATA[编程语言]]></category>

		<guid isPermaLink="false">http://blog.zhenghui.org/?p=457</guid>
		<description><![CDATA[<b>语言误区</b>——语言的宗教情结（<em>关于编程语言认识上的一些误区</em>）<br/> • 如果说编程范式是一种文化，那么编程语言更像是一种宗教——尽管它本不该是<br/> • 语言只有两种：一种怨声载道，一种无人问津<br/> • 对待一门语言的态度应该是：与其抱怨争执，不如扬长避短<br/> • 过分拔高一种语言与抹煞语言之间的差别是两种极端，皆为秕言谬说<br/> • 这些人若有幸拜关公为师，他们最艳羡的一定他的赤兔马和青龙偃月刀，或许还会抹红脸蓄长须什么的，就是不太愿学他的盖世武功<br/> • 理想的架构师应当如文学大师，既有恢弘大气的构思，又有细腻深刻的笔法；应当如统军大帅，既有运筹帷幄的韬略，又有冲锋陷阵的武功 [...]]]></description>
			<content:encoded><![CDATA[<h1 style="text-align: center"><span style="font-family: 宋体">冒号课堂</span></h1>
<strong><span style="font-size: 13pt; font-family: 宋体">第五课 语言小谈(4)</span></strong>

<!-- below comes from generated html -->
<head><link rel="stylesheet" href="http://blog.zhenghui.org/css/colonclass.css" type="text/css"></head>

<div lang="zh-CN" class="article" title="语言误区"><div class="titlepage"><div><div><h1 class="title"><a name="id592979"></a>5.4 语言误区——语言的宗教情结</h1></div><div><div class="author"><h3 class="author">郑晖</h3></div></div><div><div class="abstract" title="摘要"><p class="title"><b>摘要</b></p><p>关于编程语言认识上的一些误区</p></div></div></div><hr /></div><div class="toc"><p><b>目录</b></p><dl><dt><span class="section"><a href="#preview">！预览</a></span></dt><dt><span class="section"><a href="#question">？提问</a></span></dt><dt><span class="section"><a href="#explaination">：讲解</a></span></dt><dt><span class="section"><a href="#note">，插语</a></span></dt><dt><span class="section"><a href="#summary">。总结</a></span></dt><dt><span class="section"><a href="#reference">“”参考</a></span></dt></dl></div><div class="epigraph"><div class="literallayout"><p>爱而不知其恶，憎而遂忘其善</p></div><div class="attribution"><span>—<span class="attribution">《吴兢•贞观政要》</span></span></div></div><div class="section" title="！预览"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="preview"></a>！预览</h2></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>
                    如果说编程范式是一种文化，那么编程语言更像是一种宗教——尽管它本不该是
                </p></li><li class="listitem"><p>
                    语言只有两种：一种怨声载道，一种无人问津
                </p></li><li class="listitem"><p>
                    对待一门语言的态度应该是：与其抱怨争执，不如扬长避短
                </p></li><li class="listitem"><p>
                    过分拔高一种语言与抹煞语言之间的差别是两种极端，皆为秕言谬说
                </p></li><li class="listitem"><p>
                    这些人若有幸拜关公为师，他们最艳羡的一定他的赤兔马和青龙偃月刀，或许还会抹红脸蓄长须什么的，就是不太愿学他的盖世武功
                </p></li><li class="listitem"><p>
                    理想的架构师应当如文学大师，既有恢弘大气的构思，又有细腻深刻的笔法；应当如统军大帅，既有运筹帷幄的韬略，又有冲锋陷阵的武功
                </p></li></ul></div></div><div class="section" title="？提问"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="question"></a>？提问</h2></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>为什么那么多人对某些编程语言都有浓厚的宗教情结？</p></li><li class="listitem"><p>存在至高无上的语言吗？</p></li><li class="listitem"><p>“语言不过是工具，其实都差不多”。这种论调正确吗？</p></li><li class="listitem"><p>IDE、框架、设计工具等比语言更重要吗？</p></li><li class="listitem"><p>语言是低级的代名词，设计是高级的代名词吗？</p></li><li class="listitem"><p>架构师就不关心语言了吗？</p></li></ul></div></div><div class="section" title="：讲解"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="explaination"></a>：讲解</h2></div></div></div><p>
            “最后该谈谈你们最为关心的语言问题了。”冒号环视一番，众人眼球的瓦数显见增大，“如果说编程范式是一种文化，那么编程语言更像是一种宗教——尽管它本不该是。每种流行的语言都有大批忠实的信徒，随时可能与其他的信徒发生宗教战争。”
        </p><p>
            逗号深有同感：“周围和网上关于语言的争论从来不绝于耳，志不同道不合者动辄恶语相向。”
        </p><p>
            提起这些，冒号不免有些忿忿然：“这些信徒或准信徒们认为他们所崇拜的语言鹤立鸡群，远比其他语言高明得多，恨不得成为全天下程序员的通用语言。对其他语言的使用者，或居高临下地同情，或不屑一顾地讥讽。无知与偏见总是相辅相成的，他们中的绝大多数顶多熟悉一两种语言，其他的或浅尝辄止、或道听途说，却敢妄评优劣，岂不可笑之极？”
        </p><p>
            引号点头称是：“是啊，没有深入的了解，怎会有深入的比较。”
        </p><p>
            冒号进而尖锐地指出：“从心理学上分析，一个人在某种观点形成后，会通过自我的暗示和倾向性的证据不断地强化这种观点，并对其他观点本能地选择性失明。这背后折射的其实是一种懒人心态——认定自己掌握的语言是最好的，便不必费事再学其他语言了；这更是一种弱者心态——无论是耿耿忠心的铁杆卫士，还是振振有词的辩护律师，一旦丧失<span class="strong"><strong>自我批判的勇气和精神</strong></span>，声嘶力竭的挞伐只能反证他们的偏狭浅薄与自信缺失。”
        </p><p>
            冒号刻意借辛辣十足的嘲讽再次传递精神的信号。
        </p><p>
            叹号道出苦衷：“只是真正掌握好一门语言已殊为不易，同时掌握几种就更难。学完一种语言再看另一种，怎么都觉得别扭。”
        </p><p>
            “这就是第一堂课所说的‘学会’与‘会学’的差距。”冒号挑明要害，“每种语言都有天然设计上的不同，当你用得很别扭时，恰恰说明没有真正掌握。正如刀法以劈为主，枪法以扎为主，你若反其道而行之，刀扎枪劈，能不别扭吗？如果愣拿双节棍当单节棍使，恐怕没砸到别人倒先砸晕自己了。可见不是兵器问题，而是招法问题。”
        </p><p>
            下面隐约传来周杰伦《双截棍》的调子。
        </p><p>
            问号注意到：“似乎不只是初学者，大师们也会对一些语言提出过尖锐的批评。”
        </p><p>
            冒号引用道：“C++的发明者Bjarne Stroustrup说过这样一句话，语言只有两种：一种怨声载道，一种无人问津（There are only two kinds of languages: the ones people complain about and the ones nobody uses）。”
        </p><p>
            众笑。
        </p><p>
            句号有所体会：“一种语言如果用者甚众，自有其可取之处。没有一种语言是完美的，爱之深者尚苛之切，何况其余者乎？”
        </p><p>
            冒号忽然问：“你们知道对一种语言最大的批判是什么吗？”
        </p><p>
            众人纷纷摇头。
        </p><p>
            “那就是发明一种与此语言有类似功用的新语言。”冒号语速放缓，“Stroustrup认为Simula太慢、BCPL又太底层，于是发明了C++；Gosling觉得C++用得不爽，于是发明了Java；微软恼恨Java，于是请Hejlsberg发明了C#；Matsumoto用了两年多的C++仍不顺手，于是发明了Ruby。如此这般，不一而足。”
        </p><p>
            叹号无奈地说：“那是牛人的批评方法，常人怎能办到？”
        </p><p>
            “没有能力发明语言，就老老实实地用别人的吧。”冒号酷酷地说，“对待一门语言的态度应该是：与其抱怨争执，不如扬长避短。”
        </p><p>
            引号顺势道：“按这种说法，编程语言的发展史就是一种批判史咯？”
        </p><p>
            冒号祭起辩证法：“从另一个角度看，发明一种语言也是对先前语言的一种最高的赞美。C++之于C，Java之于C++，C#之于Java，都是后者对前者的一种承认，哪怕是极不情愿的承认。批判与赞美，继承与发展，谓之扬弃。”
        </p><p>
            众人心想，语言课又改哲学课了。
        </p><p>
            冒号续道：“对于编程语言还有一种论调：语言只是一种工具，哪种都差不多。”
        </p><p>
            逗号接茬：“是啊，经常在论坛上看到一些高手这么说。”
        </p><p>
            “一群伪高手，是工具就差不多？能拿锤子当刀使吗？”冒号嗤之以鼻，“<span class="strong"><strong>过分拔高一种语言与抹煞语言之间的差别是两种极端，皆为秕言谬说</strong></span>。图灵奖获得者Alan Perlis曾说过：如果一种语言不能影响你对编程的看法，那么就不值得去了解。试想，一种没有独特魅力的语言如何吸引程序员趋之若骛？了解这些独特之处对于编程往往至关重要，如果沿袭以前语言的做法，会显得不伦不类甚至可能铸成大错。”
        </p><p>
            问号要求：“能说得具体点吗？”
        </p><p>
            冒号举例：“有人说，学C++要先学C；还有人说，学会了C，C++就不在话下了。”
        </p><p>
            叹号一惊：“难道不是吗？”
        </p><p>
            冒号解释：“其实C++的真正来源是Simula而不是C，向下兼容C只是因为C效率高、普及广。换句话说，C++与C形同而神异。学会了C当然对C++有一定帮助，但若不能理解C++的OOP思想，那么C的背景反而是一种障碍。”
        </p><p>
            逗号想当然：“C++与Java都是OOP语言，差别该不大了吧？”
        </p><p>
            冒号再次否定：“不同编程范式的语言差别固是不可以道里计，即使同一范式的语言也是千差万别。一个纯粹的C++程序员用Java编程，会非常不习惯没有指针运算、没有内存控制、没有运算符重载、没有自由函数等等。一个纯粹的Java程序员用C++编程，会极度不适应相对贫乏的标准库；会困惑于指针、引用、数组、字符串还有头文件等的用法；会毫不吝惜地在<span class="term">堆</span>（heap)上创建新对象，并且从来不去释放它们。这些概念或用法都是贯穿整个程序始终的，差别能不大吗？”
        </p><p>
            叹号听罢叹曰：“做一个好的程序员还真不容易。”
        </p><p>
            “如果容易，我们开这个班做什么？” 冒号笑道，“提一个问题，程序员最不能离开的应用软件是什么？”
        </p><p>
            逗号顺嘴道：“当然是IDE了。”
        </p><p>
            引号纠正：“应该是编辑器，有些程序员用vi甚至记事本来写程序。”
        </p><p>
            冒号插一句：“有人还在命令行下写程序。”
        </p><p>
            叹号眼瞪得溜圆：“怎么可能？”
        </p><p>
            冒号眉毛一挑：“当然可能，一些简单的程序完全可以在命令行下完成，然后重定向（redirect）到一个文件中或者直接编译执行。这种情况虽有些极端，对于那些离开IDE就没法编程的人来说更是不可思议，但至少说明编程离开编辑器还是有可能的<a class="link" href="#note1"><sup>[1]</sup></a>。”
        </p><p>
            句号突然明白了：“是编译器！”
        </p><p>
            “不错，是编译器或解释器。”冒号作了一点修正。
        </p><p>
            问号有点茫然：“为什么谈这个呢？”
        </p><p>
            “因为编译器或解释器是语言实现的标志。”冒号提高了声调，“我想借此说明一个简单的道理：<span class="strong"><strong>对一个程序员而言，编程语言乃立身之本</strong></span>。许多人偏偏本末倒置，常常为在IDE、框架、设计工具等中挖掘到某些新功能而欣喜不已，或者津津乐道于各种语言的优劣高下，却对正在使用的语言中大量的宝藏视而不见，与执金碗而行乞者何异？这些人若有幸拜关公为师，他们最艳羡的一定他的赤兔马和青龙偃月刀，或许还会抹红脸蓄长须什么的，就是不太愿学他的盖世武功。”
        </p><p>
            引号质疑：“我明白您是想修研强调内功的重要性，但似乎有些唯语言论，设计思想不是更重要吗？”
        </p><p>
            冒号补充道：“我所谈的语言，自然不是孤立的语法和用法，也包括背后的编程范式和设计思想。当然更高层的架构设计可能会脱离具体的语言，但那不在考虑之列，因为我们谈论的主体是程序员，而不是架构师。”
        </p><p>
            提到架构师，众人神往之情油然而生。
        </p><p>
            冒号看透了大家的心思：“架构师并没有多么神秘，他们也是从程序员过来的。也不要以为架构师就不关心语言了，相反需要对语言有更广博、更深刻的认识。理想的架构师应当如文学大师，既有恢弘大气的构思，又有细腻深刻的笔法；应当如统军大帅，既有运筹帷幄的韬略，又有冲锋陷阵的武功。那些在语言与低级之间、设计与高级之间毫不犹豫地划等号的人，多半高不成低不就，既不懂语言，也不懂设计。”
        </p><p>
            逗号仍有疑惑：“语言真有那么重要吗？IDE的一些集成工具可以辅助生成许多代码，或许到了某一天，拖拖鼠标、画些UML图之类的，程序就大功告成了。”
        </p><p>
            冒号哈哈一笑：“这不就是元编程吗？元编程也是用语言实现的。且不说你描绘的美景是否可能，即便实现了，程序员的任务也是用更高级的语言做更高级的编程——还是离不开语言。别忘了，技术含金量是与工资含金量成正比的，你永远需要比别人多一门扎实的功夫。程序员这门职业，你选择，你担当。好了，闲话打住，欲知在下如何评价各种编程语言，且听下回分解。”
        </p><p>
            众人听兴正浓之际，课堂却在说书式的结语中戛然而止了。
        </p></div><div class="section" title="，插语"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="note"></a>，插语</h2></div></div></div><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><p><a name="note1"></a>
                    当然，命令行本身也可看作编辑器，比如Bash提供vi和emacs两种命令行编辑模式。
                </p></li></ol></div></div><div class="section" title="。总结"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="summary"></a>。总结</h2></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>
                    凡事因了解而喜爱，因无知而憎恶。
                </p></li><li class="listitem"><p>
                    破除语言的宗教情结，保持自我批判的勇气和精神。
                </p></li><li class="listitem"><p>
                    过分拔高一种语言与抹煞语言之间的差别是两种极端观点，皆不可取。
                </p></li><li class="listitem"><p>
                    每种语言都有其特到之处和不足之处，与其抱怨争执，不如扬长避短。
                </p></li><li class="listitem"><p>
                    编程语言在批判与赞美中逐步发展。
                </p></li><li class="listitem"><p>
                    编程语言是程序员的立身之本。切不可本末倒置，忽视语言的学习，却热衷于挖掘IDE、框架、设计工具等的新功能。
                </p></li><li class="listitem"><p>
                    语言不等于低级，设计也不等于高级。
                </p></li><li class="listitem"><p>
                    架构师同样关心语言，并且需要对语言有更深更广的认识。
                </p></li></ul></div></div><div class="section" title="“”参考"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="reference"></a>“”参考</h2></div></div></div><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><p>
                    Bjarne Stroustrup．The Design and Evolution of C++．Reading, MA：Addison-Wesley，1994．19-25
                </p></li><li class="listitem"><p>
                    Alan Perlis．EPIGRAMS IN PROGRAMMING．<a class="link" href="http://www.cs.yale.edu/homes/perlis-alan/quotes.html" target="_top">http://www.cs.yale.edu/homes/perlis-alan/quotes.html</a>
                </p></li></ol></div></div></div>

<!-- below is edited manually -->
<strong><span style="font-family: 宋体">课后思考</span></strong>
<ul style="margin-top: 0cm; list-style-type: none">
    <li>
        05-01 程序员这个职业合适你吗？你在工作中胜任愉快吗？
    </li>
    <li>
        05-02 你认为理想的类型系统应该有哪些规则？
    </li>
    <li>
        05-03 你喜欢duck typing吗？它有何优点？如何防止它的误用和滥用？
    </li>
    <li>
        05-04 你是如何看待动态语言的？与静态语言相比，哪些是你所欣赏的，哪些是你所不满的？
    </li>
    <li>
        05-05 你最熟悉哪种编程语言？你认为它是最好的语言吗？
    </li>
    <li>
        05-06 对一门不熟悉的编程语言，你是乐于了解和学习它，还是本能地漠视或排斥它？
    </li>
    <li>
        05-07 爱可以不需要理由，恨却需要。能说说你恨某种语言的理由吗？你确信它们站得住脚吗？
    </li>
    <li>
        05-08 你是更愿意把时间花在编程工具的功能挖掘上，还是花在编程语言的深造学习上？
    </li>
</ul><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.zhenghui.org%2F2009%2F09%2F27%2Fcolon-class-5_4%2F&amp;title=%E5%86%92%E5%8F%B7%E8%AF%BE%E5%A0%82%C2%A75.4%EF%BC%9A%E8%AF%AD%E8%A8%80%E8%AF%AF%E5%8C%BA" id="wpa2a_2">分享/保存</a></p><h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2011年07月12日 -- <a href="http://blog.zhenghui.org/2011/07/12/hard-thinking-and-soft-thinking-4/" title="论思维的刚性与柔性（科学的迷信-4）">论思维的刚性与柔性（科学的迷信-4）</a> (0)</li><li>2010年06月3日 -- <a href="http://blog.zhenghui.org/2010/06/03/advice-on-programmer/" title="答读者问(1)——对程序员的一些个人建议">答读者问(1)——对程序员的一些个人建议</a> (6)</li><li>2009年09月21日 -- <a href="http://blog.zhenghui.org/2009/09/21/colon-class-5_1/" title="冒号课堂§5.1：教学计划">冒号课堂§5.1：教学计划</a> (1)</li><li>2009年09月17日 -- <a href="http://blog.zhenghui.org/2009/09/17/colon-class-4_3/" title="冒号课堂§4.3：汇总范式">冒号课堂§4.3：汇总范式</a> (5)</li><li>2009年09月13日 -- <a href="http://blog.zhenghui.org/2009/09/13/colon-class-4_1/" title="冒号课堂§4.1：函数范式">冒号课堂§4.1：函数范式</a> (0)</li><li>2009年08月29日 -- <a href="http://blog.zhenghui.org/2009/08/29/colon-class-1_4/" title="冒号课堂§1.4：初识范式">冒号课堂§1.4：初识范式</a> (2)</li><li>2009年08月26日 -- <a href="http://blog.zhenghui.org/2009/08/26/colon-class-1_2/" title="冒号课堂§1.2：首轮提问">冒号课堂§1.2：首轮提问</a> (1)</li><li>2009年08月24日 -- <a href="http://blog.zhenghui.org/2009/08/24/colon-class-1_1/" title="冒号课堂§1.1：开班发言">冒号课堂§1.1：开班发言</a> (2)</li><li>2009年08月21日 -- <a href="http://blog.zhenghui.org/2009/08/21/contents-of-colonclass/" title="《冒号课堂》目录">《冒号课堂》目录</a> (29)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://blog.zhenghui.org/2009/09/27/colon-class-5_4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

