<?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/programmer/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.zhenghui.org</link>
	<description>自然、人类、机器</description>
	<lastBuildDate>Fri, 16 Jul 2010 18:33:48 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>答读者问——对程序员的一些个人建议</title>
		<link>http://blog.zhenghui.org/2010/06/03/advice-on-programmer/</link>
		<comments>http://blog.zhenghui.org/2010/06/03/advice-on-programmer/#comments</comments>
		<pubDate>Thu, 03 Jun 2010 04:35:30 +0000</pubDate>
		<dc:creator>hui</dc:creator>
				<category><![CDATA[冒号课堂]]></category>
		<category><![CDATA[计算机]]></category>
		<category><![CDATA[抽象]]></category>
		<category><![CDATA[数学]]></category>
		<category><![CDATA[程序员]]></category>
		<category><![CDATA[英语]]></category>

		<guid isPermaLink="false">http://blog.zhenghui.org/?p=716</guid>
		<description><![CDATA[答一位《冒号课堂》读者的提问]]></description>
			<content:encoded><![CDATA[
<h2><strong>答读者问</strong></h2>
<p>以下内容摘自<a href="http://bbs.zhenghui.org">冒号论坛</a>的一个<a href="http://bbs.zhenghui.org/topic/%E8%8F%9C%E9%B8%9F%E8%AF%BB%E3%80%8A%E5%86%92%E5%8F%B7%E8%AF%BE%E5%A0%82%E3%80%8B%E5%90%8E%E7%9A%84%E6%84%9F%E8%A7%A6%EF%BC%8C%E6%9C%9B%E9%83%91%E6%99%96%E8%80%81%E5%B8%88%E8%A7%A3%E6%83%91">话题</a>，考虑其具有一定的典型性，故转至<a href="http://blog.zhenghui.org">冒号空间</a>，希望能对更多的读者有所帮助，也算是一种<span style="text-decoration: underline;">代码重用</span>吧。</p>
<p>&nbsp;</p>

<p><strong>读者Jee问</strong>：</p>
<blockquote>
<p>之前在Top  language里的一位网友像我推荐您的《冒号课堂》，书中eric向您建议开设社区，我猜测可能会有，就找到您的博客发现此地，很幸运您是一个如此有责任心的作者。</p>
<p>我是一名没有什么理论基础的不合格的计算机专业毕业生，毕业后却对软件方面技术非常感兴趣，可能与个性有关。于是在这近2年的找工作和工作过程中看了一些书，也和一些过来人聊过，总体来说让我对软件编程有了一点认识。在阅读您的冒号课堂之前，我曾一度认为我所差的是经验和一些诸如高级算法之类的进阶技术， 可现在，一个用了一个多月时间的夜晚阅读《冒号课堂》之后的我发现我所差的不仅仅是那些，而是最基础最根本的对计算机本身的认识，对数学的认识，对软件工程的认识。</p>
<p>我不想能有速成一说，只想能够现在正视自己，脚踏实地的一点一点的学习和进步，哪怕让我自学4年大学课程也未尝不可，只是有些时候有点找不到一个开始。我数学不好，作为一名程序员我想这是个令人沮丧的事实，我英语也不好，当看到蹩脚的一些翻译著作后痛苦不已。我想尝试着去改变这些，但是却不知该如何去做， 您知道，作为一名已经进入社会的成年人，我需要承受一些生存的压力和一些生活的负担，我希望能更好的利用每天那抽出来的时间，所以望郑晖老师能给我指出一条明道。</p>
<p>我一直没有说我从事的语言和方向，因为我知道这并不是核心，也不是想从您这得到如何学习XX语言等。万分打扰，还望见谅。</p></blockquote>
<p>&nbsp;</p>

<p><strong>作者</strong>hui答：</p>
<blockquote>
<p>你提到的问题十分典型，我非常理解你的心情，同时也非常乐意分享一些个人的看法。</p>
<p>虽然你在言语之中流露出不少负面的情绪，但我看到的却是正面的希望。首先，你对软件技术很感兴趣，而兴趣是学习和工作的最大动力。一般说来，我也没兴趣回答那些对编程不感兴趣者的有关编程的问题。一方面，我会劝他们改行，否则彼此都痛苦；另一方面，我建议的方法通常也不适合他们。其次，你很清楚地意识到自己在哪些方面不足，这是一切进步的基础。许多程序员意识不到自己的无知，甚至自以为足够有知，那又如何能进步呢？最后，你不指望任何捷径，愿意通过踏踏实实的学习来弥补不足。在浮躁之风盛行的当下，这点也是难能可贵的。</p>
<p>关于数学基础，窃以为并非什么太大的问题。几乎每个得知我数学背景的人都会对我说：哦，学数学的人来学计算机自然容易啦。事实上，这种观点虽然极为普遍，但也极为肤浅。本人从事数学14年（从本科算起）、从事计算机12年（与前者有部分重合），在这一点上还是比较有发言权的。事先说明，以下提到的数学不包括高中数学。其实大多数从事软件开发的人员用不到太多的数学知识，他们只需要正常的逻辑思维能力和抽象思维能力。整天拿数学说事，要么是无知，要么是找借口，要么是装高深。当然，我不否认一些高级算法、计算机理论以及人工智能等领域可能涉及到高深的数学知识（其实也只是图论、组合数学、数论、概率论、计算几何、抽象代数、数学逻辑等中的一小部分），但那毕竟只是少数。我也不否认自己的数学背景有助于对编程的理解，但投入产出比太低，不值得作为经验来推广。不过若想成为一位计算机科学家，那就另作别论了——这时数学懂得再多也会嫌少的。</p>
<p>倒是英语我希望你更重视些。我在<a href="http://blog.zhenghui.org/2009/09/10/colon- class-3_3/">《冒号课堂》中</a>专门提过阅读原著的必要性，而且你也意识到译著的质量问题。建议不必特地去学习英语（你本来就会了，不是吗？），只要坚持读经典原著即可。其实，计算机方面的英文算是很容易的了，关键是克服自己的惯性和惰性。开始可能不习惯，看多了就习惯了。在此提醒一点，在阅读时请有意识地培养自己对英语的语感，就像编程时要有意识地培养自己对编程语言的语感一样。</p>
<p>总之，<strong>对于程序员来说，数学没有人们认为的那么重要，英语没有人们认为的那么不重要</strong>。</p>
<p>再说说专业方面的问题。你提到愿意重新自学大学课程，虽精神可嘉，但未必可取。从软件（或建筑）设计的观点来看，这是<span style="text-decoration: underline;">bottom-up</span>法。作为学生，最好采用这种方法，但你已经参加工作了，所以我建议你更多地采用<span style="text-decoration: underline;">top-down</span>法。这当然不是轻视基础知识，而是认为获取知识最高效的方法莫过于<span style="text-decoration: underline;">按需</span>（on  demand）学习。在实际工作中意识到某个知识点的重要性，从而有针对性地弥补短板，这样学习起来不仅更有效率，也更有兴味。需要强调的是，绝不能只是 “头痛医头”，而要“拔萝卜带出泥”。只有寻根究底、以点带面，才能快速有效地建立起自己的知识结构体系。对于软件开发这类实践性很强的专业来说，该法尤其奏效。</p>
<p>话又说回来，这种项目驱动式的学习方法也是有一定局限的。毕竟大多项目涉及的深度和广度通常都很有限，单纯凭此建立起来的知识体系不可能非常完善。 这就需要平时有计划地阅读一些经典著作以加强深度，并定期浏览一些高质量的技术网站以加强广度。</p>
<p>以上谈的都是一些较为宏观的建议，我想你需要的是更加具体的建议。《冒号课堂》上已经阐述了不少关于编程语言、编程范式、设计原则方面的观点，此处不复赘言。我想特别强调一点——<strong>把握抽象</strong>（abstraction）。事实上，无论是在书中还是本论坛中，我都不厌其烦地再三提到抽象的重要性，今后有时间还会深入地挖掘这一主题。对编程的语言、范式、设计、实现体会得越深，对抽象体会得也越深。借用Hakell的设计者之一Paul  Hudak的一句略带夸张的话（overstatement）：<em>“abstraction, abstraction, abstraction” are  the three most important things in  programming</em>。一定会有人会问：难道编程语言就不重要了吗？设计模式就不重要了吗？算法设计就不重要了吗？那是他们尚未真正理解何为抽象——抽象不仅渗透在编程范式之中，也渗透在编程语言之中；不仅反映在设计原则之中，也反映在设计模式之中；不仅体现在架构设计之中，也体现在算法设计之中。</p>
<p>说来也怪，明明是想提“具体”建议的，偏偏又扯出了“抽象”，大概不是你想要的答案吧？既然你是计算机专业毕业的，又有一定的工作经验，其实也不需要太过具体的建议。你的苦恼是找不到努力的方向，而这个方向恐怕还是得靠自己去寻找。建议试试两种方法：研读一本有趣的名著或开发一个有趣的应用。只要深入其中，相信绝不会再为找不到方向而发愁，说不定倒会为方向太多而发愁呢。</p>
<p>最后，说句更实际点的话：如果平时能有意识地积累一些计算机以外的<span style="text-decoration: underline;">领域知识</span>（domain  knowledge），比如金融、电信、教育、企业管理等等，对提高个人在IT业的核心竞争力也是大有裨益的。当然，前提是你有兴趣或有条件获得这些知识。</p>
<p>一家之言，希望能对你有所帮助。</p></blockquote>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fblog.zhenghui.org%2F2010%2F06%2F03%2Fadvice-on-programmer%2F&amp;linkname=%E7%AD%94%E8%AF%BB%E8%80%85%E9%97%AE%E2%80%94%E2%80%94%E5%AF%B9%E7%A8%8B%E5%BA%8F%E5%91%98%E7%9A%84%E4%B8%80%E4%BA%9B%E4%B8%AA%E4%BA%BA%E5%BB%BA%E8%AE%AE">分享/保存</a>]]></content:encoded>
			<wfw:commentRss>http://blog.zhenghui.org/2010/06/03/advice-on-programmer/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<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><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fblog.zhenghui.org%2F2009%2F09%2F27%2Fcolon-class-5_4%2F&amp;linkname=%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">分享/保存</a>]]></content:encoded>
			<wfw:commentRss>http://blog.zhenghui.org/2009/09/27/colon-class-5_4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>冒号课堂§5.1：教学计划</title>
		<link>http://blog.zhenghui.org/2009/09/21/colon-class-5_1/</link>
		<comments>http://blog.zhenghui.org/2009/09/21/colon-class-5_1/#comments</comments>
		<pubDate>Mon, 21 Sep 2009 02:39:08 +0000</pubDate>
		<dc:creator>hui</dc:creator>
				<category><![CDATA[冒号课堂]]></category>
		<category><![CDATA[程序员]]></category>
		<category><![CDATA[编程范式]]></category>
		<category><![CDATA[迭代学习法]]></category>

		<guid isPermaLink="false">http://blog.zhenghui.org/?p=440</guid>
		<description><![CDATA[<b>教学计划</b>——接下来的故事（<em>讨论下一步教学计划</em>）<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: 宋体;">第五课 语言小谈（1）</span></strong>

<p><strong><span style="font-family: 宋体;">课前导读</span></strong></p>
<p style="text-indent: 18pt;"><span style="font-family: 宋体;">本课承上启下，为今后的学习作一些铺垫。在确定教学计划后，对数据类型和动态语言作了简单的介绍，并对有关编程语言的一些观点作出评论。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 18pt;"><span style="font-family: 宋体;">本课共分四节——</span></p>
<p style="text-indent: 18pt;"><em>1.</em><em><span style="font-family: 宋体;">教学计划——接下来的故事</span></em></p>
<p style="text-indent: 18pt;"><em>2.</em><em><span style="font-family: 宋体;">数据类型——规则与变通</span></em></p>
<p style="margin-left: 18pt;"><em>3.</em><em><span style="font-family: 宋体;">动态语言——穿着彩衣飞舞的脚本语言</span></em></p>
<p style="margin-left: 18pt;"><em>4.</em><em><span style="font-family: 宋体;">语言误区——语言的宗教情结</span></em></p>

<!-- 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="id600625"></a>5.1 教学计划——接下来的故事</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></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></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>
            引号不以为然：“我倒觉得应该更深入地去了解编程范式，现在有了一些感性认识，但还非常肤浅，希望以后能进一步展开。”
        </p><p>
            逗号挺实在：“有些地方似懂非懂，听起来挺费劲的，直到情景编程才觉得轻松了些。以后可不可以多谈些具体的编程知识、编程技巧和编程经验？”
        </p><p>
            句号拍了拍他的肩膀：“你想学的是招法，老冒传的是心法。”
        </p><p>
            逗号不服：“没有招法再多心法也白搭——光说不练假把式。”
        </p><p>
            句号反驳：“只关注招法，境界永远得不到提升——光练不说傻把式。”
        </p><p>
            “二位请暂停争论。”冒号把头转向问号，“你怎么看？”
        </p><p>
            问号很干脆：“管它心法还是招法，能解决问题的就是好法。”
        </p><p>
            “你倒滑头，整个一白猫黑猫论嘛！”冒号哈哈一笑，“首先，编程范式绝非中看不中用的屠龙之术，它有助于我们更快速地掌握、更深刻地理解、更纯熟地运用编程语言，故有心法之谓。其次，心法只有通过招法才能落到实处，也只有通过招法才能融会贯通。”
        </p><p>
            “那传说中的‘无招胜有招’呢？”引号问。
        </p><p>
            冒号哂道：“武侠小说看多了，容易想入非非，那种境界岂是一般人所能达到的？对绝大多数人来说，无招就意味着自己没招而将中他人之招。”
        </p><p>
            众人窃笑。
        </p><p>
            “还有一样是至关重要的。”冒号提醒道，“那就是实战。”
        </p><p>
            句号深有体会：“以前在学校里编程似乎还得心应手，到了公司就时感力有不逮。”
        </p><p>
            “花拳绣腿对付小喽啰绰绰有余，真碰到高手自然漏洞百出了。”冒号直言道，“编程水平的提升之道是：在实战中演练招法，在招法中领会心法，心法反过来提升招法，进而提高实战水平，如此循环往复呈螺旋式上升过程。正所谓<span class="strong"><strong>熟能生巧，巧能生通</strong></span>。”
        </p><p>
            问号询道：“下面我们的主题是什么？”
        </p><p>
            冒号亮出他的一套学习理论：“软件工程中有个<span class="emphasis"><em>迭代开发法</em></span>，本班则采用<span class="emphasis"><em>迭代学习法</em></span>：即在具体知识与抽象理论之间进行折返式学习。当然这种迭代不是机械式的重复，而是<span class="emphasis"><em>增量式的循环</em></span>。假定你们以前更关注具体的编程语言，那么遵循这种方式，先介绍抽象的编程范式是合适的。在初步了解范式之后，不妨重新回到编程语言上来。”
        </p><p>
            叹号唯唯连声：“是啊，在空中飘久了，会染上恐高症的。”
        </p><p>
            冒号笑着警告：“不要高兴太早，着陆后我们还会再次起飞的——别忘了我们的迭代式学习是周而复始的。至于眼下谈什么，还是先征求各位的意见，这样开放式教学才名副其实嘛。”
        </p><p>
            众人开始交头接耳、七嘴八舌地议论起来。
        </p><p>
            一阵商讨之后，大家似乎未能达成共识。冒号见状，便让他们一一道来。
        </p><p>
            问号再次充当急先锋：“能不能比较一些当今主流语言各自的优缺点？”
        </p><p>
            冒号笑言：“我怎么恍惚间又回到了第一堂课？你的潜台词还是那句话：到底学哪种语言好？”
        </p><p>
            问号被窥破心事，微露窘色。
        </p><p>
            “不过我非常理解你们的想法。”冒号体谅道，“虽然这是编程中最易提出却又最难回答的问题，但考虑到大家对它如此兴致盎然，我决定不顾引火烧身之危，铤而走险一回。”
        </p><p>
            众人鼓掌。
        </p><p>
            冒号故作疑惑：“你们这是对问题的答案表示期待呢，还是对我的勇气表示赞赏？”
        </p><p>
            众皆笑曰：“兼而有之，兼而有之！”
        </p><p>
            叹号提出：“近来动态语言非常流行，能说说它与静态语言到底有何不同，是否会取而代之？”
        </p><p>
            “嗯，这个问题总算简单了些。”冒号如释重负。
        </p><p>
            逗号坚持道：“我还是那个建议，希望学些具体的编程知识和技巧，比如将最流行的Java语言中的一些重点和难点分几个专题来讨论。”
        </p><p>
            冒号颔许：“这是个很好的建议，可以采纳。”
        </p><p>
            引号有不同意见：“Java没有C++来劲：要说难点，C++多得多；要说流行度，按照TIOBE的数据，C与C++之和还超过Java六个百分点呢。”
        </p><p>
            逗号不服：“你没看到C和C++正在逐渐没落吗？”
        </p><p>
            引号冷哼一声：“开玩笑，什么时候操作系统、数据库、游戏软件和嵌入式系统都改用Java了再说这话。别忘了，Java的虚拟机都还是C或C++写成的呢。”
        </p><p>
            冒号忙止住干戈：“我还没来得及成为众矢之的呢，你们二位倒先掐上了。”
        </p><p>
            句号提议：“最好找一个项目实例，从头至尾演练一次，既能贯穿各个知识点，又能让我们对软件开发有个整体认识。”
        </p><p>
            “这个想法听起来非常不错。”冒号沉吟了一会又道，“只是一个真正企业级的项目，涉及面太广。比如一个完整的web应用，不论是采用重量级的Java EE或.NET技术，还是采用轻量级的Perl、PHP、Ruby、Python等动态语言技术，除了要掌握各自的主体语言外，还涉及到相应的框架、集成环境和各种工具，以及JavaScript、CSS、HTML和XML等技术，同时数据库的知识也是不可或缺的。”
        </p><p>
            问号奇道：“JavaScript、CSS和HTML这些不主要是网页设计人员的语言吗？”
        </p><p>
            冒号解释：“网页设计人员大多用Dreamweaver之类的工具来设计HTML页面，开发一般网站尚可勉力而为，若开发企业级软件则有些力不从心了。更何况web应用的趋势是具有更丰富用户体验的Rich Internet application （RIA），采用大量的AJAX、FLEX等技术，需要熟悉Javascript或Actionscript之类的语言，这些就更非一般网页设计人员所能胜任。”
        </p><p>
            引号插言：“据我所知，许多公司都是请网页设计师来编写HTML和Javascript等代码的。”
        </p><p>
            冒号指出：“网页的迷人之处就在于，能够用精美的画皮来包裹冗长低效的代码。出于软件开发的时间和成本的考虑，公司的选择无可非议，但如果要提高软件竞争力，这些代码至少要经过程序员的加工处理。”
        </p><p>
            逗号复言：“那数据库总该是数据库管理员的事吧？程序员至多用到hibernate、iBATIS之类的ORM<a class="link" href="#note1"><sup>[1]</sup></a>框架。”
        </p><p>
            冒号断然否定：“数据库绝不只是DBA的事，ORM也不能取代数据库的设计和SQL的使用。另外，复杂的应用需要编写大量的<span class="term">存储过程</span>（stored procedure），故还应掌握PL/SQL或Transact-SQL等扩展数据库语言。换句话说，从web开发最前端的网页到最后端的数据库，都应该有程序员的身影。”
        </p><p>
            句号联想到：“借用前面餐馆的例子，不妨把接待员看作<span class="term">客户层</span>（client tier），把服务员看作<span class="term">表现层</span>（presentation tier），把厨师看作<span class="term">业务层</span>（business tier），把收银员看作<span class="term">数据层</span>（data tier），把厨工看作常用的<span class="term">辅助类</span>（helper class）<a class="link" href="#note2"><sup>[2]</sup></a>。”
        </p><p>
            冒号微微点头：“比较靠谱。要说不当之处，就是服务器端的表现层不会如服务员那样直接与客户打交道，此外业务层常与数据层打交道，但厨师好像不会与收银员有什么瓜葛。”
        </p><p>
            叹号夸张地捂住脸：“天哪，程序员竟然身兼五职，太惨了吧？”
        </p><p>
            “当然程序员会各有分工，不过如果你总局限某一层的应用开发，今后凭什么谋取更高的职位？”冒号苦口婆心，“<span class="strong"><strong>无论干哪一行，要想胜任愉快，离不开四样东西：才能、兴趣、方法和努力。没有才能则难以胜任；没有兴趣则难以愉快；没有方法则事倍功半；没有努力则一事无成</strong></span>。我相信好的方法最终能激发人的才能、兴趣和努力，这也是本班的一个理念。希望大家能通过各种问题的讨论，获得一些方法上的启示。”
        </p><p>
            问号急切地询问：“那么我们的下一步是什么？”
        </p><p>
            “综合各位的意见，我们从简到繁。”冒号公布计划，“先简单谈谈动态语言；再对主流语言作简评；然后范式上以OOP为主，语言上以C++、Java和C#为主，作一些专题讨论；最后如果时间允许，找一个项目来实践一番。”
        </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>
                    ORM（Object-Relational Mapping）是一种编程技术，能将OOP中的对象模型映射到数据库的关系模型。
                </p></li><li class="listitem"><p><a name="note2"></a>
                    传统的三层架构为：表现层、业务层和数据层。其中表现层可进一步分为客户端的客户层和服务器端的表现层，数据层有时用集成层（integration tier）和资源层（resource tier）代替。
                </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></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>
                    Deepak Alur，John Crupi，Dan Malks．Core J2EE Patterns: Best Practices and Design Strategies．Upper Saddle River, NJ：Prentice Hall PTR，2003．120-121
                </p></li></ol></div></div></div><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fblog.zhenghui.org%2F2009%2F09%2F21%2Fcolon-class-5_1%2F&amp;linkname=%E5%86%92%E5%8F%B7%E8%AF%BE%E5%A0%82%C2%A75.1%EF%BC%9A%E6%95%99%E5%AD%A6%E8%AE%A1%E5%88%92">分享/保存</a>]]></content:encoded>
			<wfw:commentRss>http://blog.zhenghui.org/2009/09/21/colon-class-5_1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>冒号课堂§1.1：开班发言</title>
		<link>http://blog.zhenghui.org/2009/08/24/colon-class-1_1/</link>
		<comments>http://blog.zhenghui.org/2009/08/24/colon-class-1_1/#comments</comments>
		<pubDate>Mon, 24 Aug 2009 14:38:57 +0000</pubDate>
		<dc:creator>hui</dc:creator>
				<category><![CDATA[冒号课堂]]></category>
		<category><![CDATA[学习]]></category>
		<category><![CDATA[思想]]></category>
		<category><![CDATA[知识]]></category>
		<category><![CDATA[程序员]]></category>
		<category><![CDATA[精神]]></category>

		<guid isPermaLink="false">http://blog.zhenghui.org/?p=49</guid>
		<description><![CDATA[<b>开班发言</b>——程序员的四层境界（<em>对程序员的一些忠告和建议</em>）<br/>
•	学会不如会学，会学不如会用，会用不如被用<br/>
•	如果知识是水，我们要挖掘最先涌动的泉眼；如果知识是火，我们要捕捉起初点燃的火花<br/>
•	如果知识是树，其树大根深，不究立固之本则无以知过去；其枝繁叶茂，不握支撑之干则无以知当下；其蓬勃旺盛，不察生长之点则无以知将来<br/>
•	越是喧嚣的世界，越需要宁静的思考，让躁动的心灵得以平息，让蕴藏的灵性得以释放<br/>
•	知识之上是思想，思想之上是精神]]></description>
			<content:encoded><![CDATA[<h1 style="text-align: center" align="center"><span style="font-family: 宋体">冒号课堂</span></h1>
<p><strong><span style="font-size: 13pt; font-family: 宋体">第一课 开班导言(1)</span></strong></p>

<p><strong><span style="font-family: 宋体">课前导读</span></strong></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 18pt"><span style="font-family: 宋体">第一课为整个课堂学习的内容和风格定调，主要围绕三个问题进行展开：要成为一个优秀的程序员，最需要学习什么知识？领会什么思想？具备什么精神？</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 18pt"><span style="font-family: 宋体">本课共分五节——</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 18pt"><em><span style="font-family: 'Times New Roman'">1.</span></em><em><span style="font-family: 宋体">开班发言</span></em><strong>&#8212;</strong><em><span style="font-family: 宋体">&#8212;程序员的四层境界</span></em></p>
<p style="margin-left: 18pt"><em>2.</em><em><span style="font-family: 宋体">首轮提问——什么语言好？</span></em></p>
<p style="margin-left: 18pt"><em>3.</em><em><span style="font-family: 宋体">语言选择——合适的就是好的</span></em></p>
<p style="margin-left: 18pt"><em>4.</em><em><span style="font-family: 宋体">初识范式——程序王国中的世界观与方法论</span></em></p>
<p style="margin-left: 18pt"><em>5.</em><em><span style="font-family: 宋体">软件技术——实用还是时髦？</span></em></p>

<!-- 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="id470645"></a>1.1 开班发言——程序员的四层境界</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="#summary">。总结</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>要想在IT业中生存与发展，传统的学习方式是否够用？</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>
            冒号开了个程序员提高班，今天迎来了首期学员，他们是问号、句号、逗号、引号和叹号，皆为IT业的新兵。望着台下洋溢着青春与渴望的脸庞，冒号开始了他的开班发言——
        </p><p>
            大家好！先自我介绍一下，本人姓冒名号字解之。诸位不必叫我老师，就叫老冒好了。比在座各位痴长几岁，“老”是担得的，“师”却不敢妄言。在下编程多年，自觉小有所成，不敢专藏，特开此班与众共享。虽系一家之言、一孔之见，若能抛砖引玉，又何惧方家之哂？疏谬之处，还望海涵斧正，不致自误误人。
        </p><p>
            客套已毕，言归正传。本班主要采取讨论的形式，只要是软件开发中值得讨论的，但凡本人力之所及，均可共同探讨。
        </p><p>
            本班的宗旨是：<span class="strong"><strong>学会不如会学，会学不如会用，会用不如被用</strong></span>。对于一个软件开发者来说，这意味着四个阶段：
            </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p><span class="strong"><strong>学会</strong></span>（知其所然）——掌握一些具体编程知识的初级程序员</p></li><li class="listitem"><p><span class="strong"><strong>会学</strong></span>（知所以然）——能快速而深刻地理解技术并举一反三的程序员</p></li><li class="listitem"><p><span class="strong"><strong>会用</strong></span>（人为我用）——能将所学灵活运用到实际编程设计之中的高级程序员</p></li><li class="listitem"><p><span class="strong"><strong>被用</strong></span> （我为人用）——能设计出广为人用的应用程序（application）、库（library）、工具包（toolkit）、框架（framework）等的系统分析师和架构师</p></li></ul></div><p>
        </p><p>
            至于被用的更高层次，如发明出主流的设计模式、算法、语言乃至理论等，则可称得上计算机专家了。本班的目的，正是为各位向更高阶段的提升助一臂之力。
        </p><p>
            大家可能都习惯了在小学、中学和大学里的课堂，那里的知识大多是系统而完备且貌似终极的，那里的学习大多是单向而被动的。但习惯并不意味着享受，更多的是因为别无选择。你们曾被引入一座座知识殿堂，被告知它们如何美轮美奂、巧夺天工，尽管很多时候你们或不以为然、或不解其妙，但还是不得不记下每一处被指点的细微结构。很少有人带你们看看当初为建造这些殿堂而打下的地基、搭设的脚手架，哪怕只是上漆前的模样也好，更遑论一瞻数易其稿的设计图纸了。那些与殿堂相比显得有些原始、甚至丑陋的东西，被有意无意地挡在视线之外。可没有那些，你们将来如何为这些宫殿添砖加瓦，又如何另起楼阁呢？
        </p><p>
            中国学生恐怕是世界上最擅长考试、最习惯考试、也最厌倦考试的群体了。你们告别了学生生涯，踏上了职业之旅。首先我要恭喜你们，脱离苦海了！同时也要悲告你们，掉进火坑了！危言耸听吗？如果你选择了做程序员，你时时都得学习，没有手把手教你的老师，没有指定的教科书和参考书，有的是层出不穷令人眼花缭乱的新概念、新技术、新问题，好不容易学到一些皮毛，有的已成明日黄花。你时时都得考试，每提交一段代码就是上交一份答卷，你不知道什么时候、什么人会批改，直到——开发组同事发现你的代码难以看懂，系统分析员指出你的程序不符合规范，测试工程师检验到你的软件有缺陷，客户抱怨你的产品太慢太难用，最后老板倒可能告诉你一个好消息：明天起放长假！
        </p><p>
            其实，又有哪行哪业的人不需要学习和考试呢？IT业只是相对更激烈、更富挑战性而已。在这个瞬息万变、适者生存的时代，如果还沿用封闭、被动的学习方式，恐有淘汰之虞。有鉴于此，本班的风格与你们习惯的课堂有所不同：这里的知识不一定是系统或完备的，但一定是生动鲜活的。如果知识是水，我们要挖掘最先涌动的泉眼；如果知识是火，我们要捕捉起初点燃的火花。如果知识是树，其树大根深，不究立固之本则无以知过去；其枝繁叶茂，不握支撑之干则无以知当下；其蓬勃旺盛，不察生长之点则无以知将来。这里的问题不一定是预设的，结论不一定是终极的，甚至不一定是正确的，但一定是有的放矢、发人深思的。由此决定了这里的学习方式将是开放多元、双向互动的。
        </p><p>
            越是喧嚣的世界，越需要宁静的思考，让躁动的心灵得以平息，让蕴藏的灵性得以释放。学习编程没有速成大法、没有必杀之技、没有锦囊秘笈、没有终南捷径，只有思考、实践、再思考、再实践。中国的IT界乃至整个学术界都过于浮躁和急功近利了，既盲从又自大，缺乏务实精神与研究精神、独立精神与合作精神、批判精神与自省精神。如果一个程序员沾染这种风气，哪怕有再好的学习方法和学习能力，他都注定与“优秀”绝缘。这就是本班极力倡导并将贯穿始终的理念——知识之上是思想，思想之上是精神。
        </p><p>
            我的开场白到此为止，现在把话语权交给你们，大家自由发问吧。
        </p></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>软件开发者的成长阶段：学会-&gt;会学-&gt;会用-&gt;被用。</p><p>这是一个从“知其所然”到“知所以然”、从“人为我用”到“我为人用”的历程。</p></li><li class="listitem"><p>传统的学习方式大多有如下特征：</p><p>封闭——系统完备的终极式知识</p><p>单向——师教生学的单向式传输知识</p><p>被动——师命生从的被动式接受知识</p><p>静态——只注重知识的现状，忽略知识的起源、历程和未来趋势</p><p>继续沿袭这种学习方式，是很难在竞争日趋激烈、技术日新月异的IT业中求生存、谋发展的。开放多元、双向互动的现代课堂乃大势所趋。
                </p></li><li class="listitem"><p><span class="quote">“<span class="quote">知识之上是思想，思想之上是精神。</span>”</span></p><p>一个优秀的程序员，除了要迅速掌握知识、善于领悟思想外，还必须具备务实与研究精神、独立与合作精神、批判与自省精神。</p></li></ul></div></div></div>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fblog.zhenghui.org%2F2009%2F08%2F24%2Fcolon-class-1_1%2F&amp;linkname=%E5%86%92%E5%8F%B7%E8%AF%BE%E5%A0%82%C2%A71.1%EF%BC%9A%E5%BC%80%E7%8F%AD%E5%8F%91%E8%A8%80">分享/保存</a>]]></content:encoded>
			<wfw:commentRss>http://blog.zhenghui.org/2009/08/24/colon-class-1_1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>《冒号课堂》目录</title>
		<link>http://blog.zhenghui.org/2009/08/21/contents-of-colonclass/</link>
		<comments>http://blog.zhenghui.org/2009/08/21/contents-of-colonclass/#comments</comments>
		<pubDate>Fri, 21 Aug 2009 15:34:27 +0000</pubDate>
		<dc:creator>hui</dc:creator>
				<category><![CDATA[冒号课堂]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[目录]]></category>
		<category><![CDATA[程序员]]></category>
		<category><![CDATA[编程范式]]></category>
		<category><![CDATA[软件设计]]></category>

		<guid isPermaLink="false">http://blog.zhenghui.org/?p=4</guid>
		<description><![CDATA[《冒号课堂》一书的目录]]></description>
			<content:encoded><![CDATA[<h3 style="text-align: left;"><span style="font-family: 宋体;">
</span></h3>
<ul style="margin-top: 0cm; list-style-type: none;">
	<li style="font-size: 14pt; color: #3366ff;">上篇：<strong>编程范式与编程语言</strong></li>
	<li style="font-size: 14pt; color: #3366ff;"><strong>
</strong></li>
	<li><strong>第一课 开班导言</strong></li>
	<li><a href="http://blog.zhenghui.org/2009/08/24/colon-class-1_1/">§1.1：开班发言——<em>程序员的四层境界</em></a></li>
	<li><a href="http://blog.zhenghui.org/2009/08/26/colon-class-1_2/">§1.2：首轮提问——<em>什么语言好？</em></a></li>
	<li><a href="http://blog.zhenghui.org/2009/08/27/colon-class-1_3/">§1.3：语言选择——<em>合适的就是好的</em></a></li>
	<li><a href="http://blog.zhenghui.org/2009/08/29/colon-class-1_4/">§1.4：初识范式——<em>程序王国中的世界观与方法论</em></a></li>
	<li><a href="http://blog.zhenghui.org/2009/08/31/colon-class-1_5/">§1.5：开发技术——<em>实用还是时髦？</em></a></li>
	<li><em>
</em></li>
	<li><strong>第二课 重要范式</strong></li>
	<li><a href="http://blog.zhenghui.org/2009/09/03/colon-class-2_1/">§2.1：命令范式——<em>一切行动听指挥</em></a></li>
	<li><a href="http://blog.zhenghui.org/2009/09/04/colon-class-2_2/">§2.2：声明范式——<em>目标决定行动</em></a></li>
	<li><a href="http://blog.zhenghui.org/2009/09/06/colon-class-2_3/">§2.3：对象范式——<em>民主制社会的编程法则</em></a></li>
	<li><a href="http://blog.zhenghui.org/2009/09/07/colon-class-2_4/">§2.4：并发范式——<em>合作与竞争</em></a></li>
	<li><em>
</em></li>
	<li><strong>第三课 常用范式</strong></li>
	<li><a href="http://blog.zhenghui.org/2009/09/08/colon-class-3_1/">§3.1：泛型范式——<em>抽象你的算法</em></a></li>
	<li><a href="http://blog.zhenghui.org/2009/09/09/colon-class-3_2/">§3.2：超级范式——<em>提升语言的级别</em></a></li>
	<li><a href="http://blog.zhenghui.org/2009/09/10/colon-class-3_3/">§3.3：切面范式——<em>多角度看问题</em></a></li>
	<li><a href="http://blog.zhenghui.org/2009/09/11/colon-class-3_4/">§3.4：事件驱动——<em>有事我叫你，没事别烦我</em></a></li>
	<li><em>
</em></li>
	<li><strong>第四课 重温范式</strong></li>
	<li><a href="http://blog.zhenghui.org/2009/09/13/colon-class-4_1/">§4.1：函数范式——<em>精巧的数学思维</em></a></li>
	<li><a href="http://blog.zhenghui.org/2009/09/15/colon-class-4_2/">§4.2：逻辑范式——<em>当算法失去了控制</em></a></li>
	<li><a href="http://blog.zhenghui.org/2009/09/17/colon-class-4_3/">§4.3：汇总范式——<em>一张五味俱全的大烙饼</em></a></li>
	<li><a href="http://blog.zhenghui.org/2009/09/19/colon-class-4_4/">§4.4：情景范式——<em>餐馆里的编程范式</em></a></li>
	<li><em>
</em></li>
	<li><strong>第五课 语言小谈</strong></li>
	<li><a href="http://blog.zhenghui.org/2009/09/21/colon-class-5_1/">§5.1：教学计划——<em>接下来的故事</em></a></li>
	<li><a href="http://blog.zhenghui.org/2009/09/23/colon-class-5_2/">§5.2：数据类型——<em>规则与变通</em></a></li>
	<li><a href="http://blog.zhenghui.org/2009/09/25/colon-class-5_3/">§5.3：动态语言——<em>披着彩衣飞舞的脚本语言</em></a></li>
	<li><a href="http://blog.zhenghui.org/2009/09/27/colon-class-5_4/">§5.4：语言误区——<em>语言的宗教情结</em></a></li>
	<li><em>
</em></li>
	<li><strong>第六课 语言简评</strong></li>
	<li><a href="http://blog.zhenghui.org/2009/09/29/colon-class-6_1/">§6.1：系统语言——<em>权力的双刃剑</em></a></li>
	<li><a href="http://blog.zhenghui.org/2009/10/03/colon-class-6_2/">§6.2：平台语言——<em>先搭台后唱戏</em></a></li>
	<li><a href="http://blog.zhenghui.org/2009/10/08/colon-class-6_3/">§6.3：前台语言——<em>视觉与交互的艺术</em></a></li>
	<li><a href="http://blog.zhenghui.org/2009/10/10/colon-class-6_4/">§6.4：后台脚本——<em>敏捷开发的利器</em></a></li>
	<li><em>
</em></li>
</ul>
<ul style="margin-top: 0cm; list-style-type: none;">
	<li style="font-size: 14pt; color: #3366ff;">下篇：<strong>抽象机制与对象范式</strong></li>
	<li style="font-size: 14pt; color: #3366ff;"><strong>
</strong></li>
	<li><strong>第七课 抽象封装</strong></li>
	<li>§7.1：抽象思维——<em>减法和除法的学问</em></li>
	<li>§7.2：数据抽象——<em>“做什么”重于“怎么做”</em></li>
	<li>§7.3：封装隐藏——<em>包装的讲究</em></li>
	<li><em>
</em></li>
	<li><strong>第八课 抽象接口</strong></li>
	<li>§8.1：软件应变——<em>随需而变，适者生存</em></li>
	<li>§8.2：访问控制——<em>代码的多级管理</em></li>
	<li>§8.3：接口服务——<em>讲诚信与守规矩</em></li>
	<li><em>
</em></li>
	<li><strong>第九课 继承机制</strong></li>
	<li>§9.1：继承关系——<em>继承财富，更要继承责任</em></li>
	<li>§9.2：慎用继承——<em>以谨慎之心对待权力</em></li>
	<li><em>
</em></li>
	<li><strong>第十课 多态机制</strong></li>
	<li><a href="http://blog.zhenghui.org/2009/10/20/colon-class-10_1/">§10.1：多态类型——<em>静中之动</em></a></li>
	<li><a href="http://blog.zhenghui.org/2009/10/24/colon-class-10_2/">§10.2：抽象类型——<em>实中之虚</em></a></li>
	<li><em>
</em></li>
	<li><strong>第十一课 值与引用</strong></li>
	<li>§11.1：语法类型——<em>体用之分</em></li>
	<li>§11.2：语义类型——<em>阴阳之道</em></li>
	<li><em>
</em></li>
	<li><strong>第十二课 设计原则</strong></li>
	<li>§12.1：间接原则——<em>柔胜于刚，曲胜于直</em></li>
	<li>§12.2：依赖原则——<em>有求皆苦，无欲则刚</em></li>
	<li>§12.3：内聚原则——<em>不是一家人，不进一家门</em></li>
	<li>§12.4：保变原则——<em>与魔鬼打交道的艺术</em></li>
	<li><em>
</em></li>
	<li><strong>第十三课 设计模式</strong></li>
	<li>§13.1：创建模式——<em>不要问我从哪里来</em></li>
	<li>§13.2：结构模式——<em>建筑的技巧</em></li>
	<li>§13.3：行为模式——<em>君子之交淡如水</em></li>
	<li>§13.4：闭班小结——<em>软件无形，编程有道</em></li>
</ul><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fblog.zhenghui.org%2F2009%2F08%2F21%2Fcontents-of-colonclass%2F&amp;linkname=%E3%80%8A%E5%86%92%E5%8F%B7%E8%AF%BE%E5%A0%82%E3%80%8B%E7%9B%AE%E5%BD%95">分享/保存</a>]]></content:encoded>
			<wfw:commentRss>http://blog.zhenghui.org/2009/08/21/contents-of-colonclass/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
	</channel>
</rss>
