﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-一步一个脚印，走在自己前面！-随笔分类-Experience and Thought</title><link>http://www.cppblog.com/zerolee/category/3017.html</link><description>想想自己5年后会是什么样子……</description><language>zh-cn</language><lastBuildDate>Mon, 19 May 2008 18:27:28 GMT</lastBuildDate><pubDate>Mon, 19 May 2008 18:27:28 GMT</pubDate><ttl>60</ttl><item><title>精神病人管理着精神病院</title><link>http://www.cppblog.com/zerolee/archive/2006/12/23/16770.html</link><dc:creator>仄洛</dc:creator><author>仄洛</author><pubDate>Sat, 23 Dec 2006 06:36:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2006/12/23/16770.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/16770.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2006/12/23/16770.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/16770.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/16770.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Courier New" size="2">   在一家中等规模、非常成功的硅谷公司，有这样一种控制。参加会议的是总经理，他是创建这个公司的一位资深商业人士，还有一位就是负责产品开发的资深程序员。总经理向我们展示了产品，演示了它的强大功能。我们看到了，但是也看到了它很难用，用户界面过于复杂。我和我的设计组成员立刻认识到，是那位程序员边“施工”边“设计”了这个产品。<br />   总经理抱怨说，一个竞争者以品质更差的产品抢走了自己公司的部分市场份额。他在结实时抱怨很困惑，因为他认为自己的产品功能更强。虽然这位总经理叫我们来帮助他摆脱困境，但是他将决策权交给了那位资深程序员。对我们来讲，产品需要进行一些“行为”上的改动是现而易见的事情。我们向他们两个展示了我们的方案。对我们来讲，简单而易见的再设计项目需要几个月的时间。如果采纳我们的方案，这家公司可以使产品更有用、更实际、更强大、更令人愉快、更有竞争力。但是，那位资深程序员却意外地让我们不要对产品行为做任何改动。他认为产品没有什么不好。他感觉产品之所以销路不好，是因为销售队伍在使用产品方面没有得到更好的培训。他想让我们制作一些内部促销资料材料，用来培训销售人员。他完全否认产品有缺陷，尽管无可争议的证据说明“不好”的产品是问题的根源。<br />   程序员花了很多时间和精力去掌握软件，因而他无法想像用户不愿花时间弄明白程序员们编写的软件。他愿意接受自己的公司面临着问题这样一个事实，但是不愿意承认自己应负的责任。他责备销售队伍不能帮助客户了解产品。他愿意接受编写新培训资料的任务，做一些工作以解决现实问题，但是他完全没有意识到，他应为产品销量的递减而承担责任。<br />   这位资深程序员的专横程度让人吃惊。他不仅被自己创建强大产品的能力所蒙蔽，他还蒙蔽了他的老板——总经理。这位资深程序员没有能力设计出让用户高兴的东西。<br />   这家公司的产品是在同类产品中率先面市的产品。这家公司高速成长并在两年前公开上市，是华尔街的宠儿，得到了商业媒体的称赞，也得到许多民间和业界的奖项，似乎一切都很完美，而它的市值也的确证明了它的成功。<br />   然而除了他的投资商、合作伙伴和其他支持者之外，竞争者们也在关注着这家公司的举动。他们看到了市场的潜力，也看到了这家公司产品的弱点。他们看到了这家公司的产品很强大，有很多功能，但他们也看到了这是一只“跳舞的熊”。它有新功能，但是没有能让用户愉快。它跳舞，但跳得不好。挑出这家公司的弱点很容易，因而竞争者复制了这家公司产品中很好的功能，并让产品易于使用。新的竞争者利用一个功能没那么多的产品获得了近60%的市场份额。<br />   总经理自身的技术背景防碍了他作出正确的判断。这种背景帮助他创建了有力的产品，但是现在它挡住了视线，让他看不到他的资深程序员是多大的障碍。他认为资深程序员的态度非常正常，而我的设计组成员却感到异常惊谔。在这家公司里，总经理是局外人。他的程序员从后座“驾驶”着整个企业。</font>
		</p>
<img src ="http://www.cppblog.com/zerolee/aggbug/16770.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">仄洛</a> 2006-12-23 14:36 <a href="http://www.cppblog.com/zerolee/archive/2006/12/23/16770.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>建造原型的代价</title><link>http://www.cppblog.com/zerolee/archive/2006/12/22/16718.html</link><dc:creator>仄洛</dc:creator><author>仄洛</author><pubDate>Fri, 22 Dec 2006 02:55:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2006/12/22/16718.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/16718.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2006/12/22/16718.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/16718.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/16718.html</trackback:ping><description><![CDATA[
		<font face="Courier New" size="2">   编写原型也是编写代码。原型具有与编写代码相同的惯性和成本，但是缺乏真正的软件产品所要求的可靠性、稳定性。软件的原型类似于建筑工程中的脚手架，而真正的软件和石墙类似，具有永久、可维护、可扩展的特性。经理们不愿舍弃能够工作的代码，即便是原型代码。他们说不出脚手架和石墙的区别。<br />   编写原型要比编写真正的程序快得多。编写原型的费用很低，因而极具吸引力。但是只有通过真正的程序才能建造可靠的产品，而原型是脆弱的平台。原型是应该抛弃的实验程序，但是实际上很少如此。经理们查看原型后会问：“我们不能将它用于产品吗？”对于程序员来说，通俗的回答是很困难的。经理们奢望通过使用原型来节约数以月计的编程时间。<br />   良好编程的精髓在于后期的满足感。先期辛勤工作，后期收获。多数手工工作都非常昂贵。而程序一旦编写完毕，就可以运行百万次而不需要额外成本。最昂贵的程序是只运行一次的程序，最便宜的程序是运行百万次的程序。但是，便宜程序中的任何问题也会出现百亿次。软件的经济原理让多数人感到陌生：最便宜程序的编写成本最为昂贵，最昂贵程序的编写成本最为低廉。<br />   编写大的程序有些像堆砌一叠砖块。将1000块叠放起来，需要及其精确的放置每一块砖。如果第998块砖偏移了1/4英寸，将余下的两快摆上去不会有什么问题。但是如果第5块就没有摆好，摆放10块以上的砖几乎不可能的。<br />   软件也具有这样的特性。对于软件基础部分的变动要比对上面部分的变动敏感得多。现实当中，多数程序员起始于错误的起点，随着进程而不断修正行进路线。因而，程序充满着修改过的痕迹。很多功能需求是在编程开始之后才发现的。这些功能被强行加入到程序中。程序修改的痕迹与叠放砖块的偏移类似。将一个按牛从对话框的一侧移到另一侧，就像摇晃一下第998块砖，但是修改描述所有按钮的代码，就像摇晃第5块砖。面向对象编程技术和封装技术是专门让程序免于修改伤痕的防范技巧。但是确切地说，面向对象技术只是将1000块砖分割成10组100块砖，不是根本的解决之道。<br />   水平高的程序员在编写大程序之前，花费很多时间和精力做准备工作。单配置编程环境就需要几天的时间。还需要选择合适的程序库，定义数据项。还必须对存储恢复系统作出分析，对其进行定义、编码和测试。<br />   随着编程工作的展开，程序员们必然会发现计划中的错误、假设中的缺陷。他们面临两个选择，或者从头再来，或者对程序中有问题的部分打补丁，引入新的“伤痕”。选择前者的成本非常高，不过选择后者，“伤痕”将限制程序的规模——叠加砖块的高度。</font>
<img src ="http://www.cppblog.com/zerolee/aggbug/16718.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">仄洛</a> 2006-12-22 10:55 <a href="http://www.cppblog.com/zerolee/archive/2006/12/22/16718.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从Coding Fan到真正的技术专家[转载]</title><link>http://www.cppblog.com/zerolee/archive/2006/12/21/16676.html</link><dc:creator>仄洛</dc:creator><author>仄洛</author><pubDate>Thu, 21 Dec 2006 01:05:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2006/12/21/16676.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/16676.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2006/12/21/16676.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/16676.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/16676.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Courier New" size="2">以下文章都是经典，看不看随你的便，我只希望知识掌握在更多中国人的手里！ </font>
		</p>
		<p>
				<font face="Courier New" size="2">中国有很多小朋友，他们18,9岁或21,2岁，通过自学也写了不少代码，他们有的代码写的很漂亮，一些技术细节相当出</font>
		</p>
		<p>
				<font face="Courier New" size="2">众，也很有钻研精神，但是他们被一些错误的认识和观点左右，缺乏对系统，对程序的整体理解能力，这些人，一个网</font>
		</p>
		<p>
				<font face="Courier New" size="2">上的朋友说得很好，他们实际上只是一些Coding fans，压根没有资格称为程序员，但是据我所知，不少小网络公司的</font>
		</p>
		<p>
				<font face="Courier New" size="2">CTO就是这样的coding fans,拿着吓人的工资，做着吓人的项目，项目的结局通常也很吓人。 <br />程序员基本素质： </font>
		</p>
		<p>
				<font face="Courier New" size="2">作一个真正合格的程序员，或者说就是可以真正合格完成一些代码工作的程序员，应该具有的素质。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">1：团队精神和协作能力 <br />把它作为基本素质，并不是不重要，恰恰相反，这是程序员应该具备的最基本的，也是最重要的安身立命之本。把高水</font>
		</p>
		<p>
				<font face="Courier New" size="2">平程序员说成独行侠的都是在呓语，任何个人的力量都是有限的，即便如linus这样的天才，也需要通过组成强大的团队</font>
		</p>
		<p>
				<font face="Courier New" size="2">来创造奇迹，那些遍布全球的为linux写核心的高手们，没有协作精神是不可想象的。独行侠可以作一些赚钱的小软件发</font>
		</p>
		<p>
				<font face="Courier New" size="2">点小财，但是一旦进入一些大系统的研发团队，进入商业化和产品化的开发任务，缺乏这种素质的人就完全不合格了。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">2：文档习惯 <br />说高水平程序员从来不写文档的肯定是乳臭未干的毛孩子，良好的文档是正规研发流程中非常重要的环节，作为代码程</font>
		</p>
		<p>
				<font face="Courier New" size="2">序员，30％的工作时间写技术文档是很正常的，而作为高级程序员和系统分析员，这个比例还要高很多。缺乏文档，一</font>
		</p>
		<p>
				<font face="Courier New" size="2">个软件系统就缺乏生命力，在未来的查错，升级以及模块的复用时就都会遇到极大的麻烦。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">3：规范化，标准化的代码编写习惯 <br />作为一些外国知名软件公司的规矩，代码的变量命名，代码内注释格式，甚至嵌套中行缩进的长度和函数间的空行数字</font>
		</p>
		<p>
				<font face="Courier New" size="2">都有明确规定，良好的编写习惯，不但有助于代码的移植和纠错，也有助于不同技术人员之间的协作。 <br />有些coding fans叫嚣高水平程序员写的代码旁人从来看不懂，这种叫嚣只能证明他们自己压根不配自称程序员。代码具</font>
		</p>
		<p>
				<font face="Courier New" size="2">有良好的可读性，是程序员基本的素质需求。 <br />再看看整个linux的搭建，没有规范化和标准化的代码习惯，全球的研发协作是绝对不可想象的。 <br />4：需求理解能力 <br />程序员需要理解一个模块的需求，很多小朋友写程序往往只关注一个功能需求，他们把性能指标全部归结到硬件，操作</font>
		</p>
		<p>
				<font face="Courier New" size="2">系统和开发环境上，而忽视了本身代码的性能考虑，有人曾经放言说写一个广告交换程序很简单，这种人从来不知道在</font>
		</p>
		<p>
				<font face="Courier New" size="2">百万甚至千万数量级的访问情况下的性能指标是如何实现的，对于这样的程序员，你给他深蓝那套系统，他也做不出太</font>
		</p>
		<p>
				<font face="Courier New" size="2">极链的并访能力。性能需求指标中，稳定性，并访支撑能力以及安全性都很重要，作为程序员需要评估该模块在系统运</font>
		</p>
		<p>
				<font face="Courier New" size="2">营中所处的环境，将要受到的负荷压力以及各种潜在的危险和恶意攻击的可能性。就这一点，一个成熟的程序员至少需</font>
		</p>
		<p>
				<font face="Courier New" size="2">要2到3年的项目研发和跟踪经验才有可能有心得。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">5：复用性，模块化思维能力 <br />经常可以听到一些程序员有这样的抱怨，写了几年程序，变成了熟练工，每天都是重复写一些没有任何新意的代码，这</font>
		</p>
		<p>
				<font face="Courier New" size="2">其实是中国软件人才最大浪费的地方，一些重复性工作变成了熟练程序员的主要工作，而这些，其实是完全可以避免的</font>
		</p>
		<p>
				<font face="Courier New" size="2">。 <br />复用性设计，模块化思维就是要程序员在完成任何一个功能模块或函数的时候，要多想一些，不要局限在完成当前任务</font>
		</p>
		<p>
				<font face="Courier New" size="2">的简单思路上，想想看该模块是否可以脱离这个系统存在，是否可以通过简单的修改参数的方式在其他系统和应用环境</font>
		</p>
		<p>
				<font face="Courier New" size="2">下直接引用，这样就能极大避免重复性的开发工作，如果一个软件研发单位和工作组能够在每一次研发过程中都考虑到</font>
		</p>
		<p>
				<font face="Courier New" size="2">这些问题，那么程序员就不会在重复性的工作中耽误太多时间，就会有更多时间和精力投入到创新的代码工作中去。 <br />一些好的程序模块代码，即便是70年代写成的，拿到现在放到一些系统里面作为功能模块都能适合的很好，而现在我看</font>
		</p>
		<p>
				<font face="Courier New" size="2">到的是，很多小公司软件一升级或改进就动辄全部代码重写，大部分重复性工作无谓的浪费了时间和精力。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">6：测试习惯 <br />作为一些商业化正规化的开发而言，专职的测试工程师是不可少的，但是并不是说有了专职的测试工程师程序员就可以</font>
		</p>
		<p>
				<font face="Courier New" size="2">不进行自测；软件研发作为一项工程而言，一个很重要的特点就是问题发现的越早，解决的代价就越低，程序员在每段</font>
		</p>
		<p>
				<font face="Courier New" size="2">代码，每个子模块完成后进行认真的测试，就可以尽量将一些潜在的问题最早的发现和解决，这样对整体系统建设的效</font>
		</p>
		<p>
				<font face="Courier New" size="2">率和可靠性就有了最大的保证。 <br />测试工作实际上需要考虑两方面，一方面是正常调用的测试，也就是看程序是否能在正常调用下完成基本功能，这是最</font>
		</p>
		<p>
				<font face="Courier New" size="2">基本的测试职责，可惜在很多公司这成了唯一的测试任务，实际上还差的远那；第二方面就是异常调用的测试，比如高</font>
		</p>
		<p>
				<font face="Courier New" size="2">压力负荷下的稳定性测试，用户潜在的异常输入情况下的测试，整体系统局部故障情况下该模块受影响状况的测试，频</font>
		</p>
		<p>
				<font face="Courier New" size="2">发的异常请求阻塞资源时的模块稳定测试等等。当然并不是程序员要对自己的每段代码都需要进行这种完整测试，但是</font>
		</p>
		<p>
				<font face="Courier New" size="2">程序员必须清醒认识自己的代码任务在整体项目中的地位和各种性能需求，有针对性的进行相关测试并尽早发现和解决</font>
		</p>
		<p>
				<font face="Courier New" size="2">问题，当然这需要上面提到的需求理解能力。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">7：学习和总结的能力 <br />程序员是人才很容易被淘汰，很容易落伍的职业，因为一种技术可能仅仅在三两年内具有领先性，程序员如果想安身立</font>
		</p>
		<p>
				<font face="Courier New" size="2">命，就必须不断跟进新的技术，学习新的技能。 <br />善于学习，对于任何职业而言，都是前进所必需的动力，对于程序员，这种要求就更加高了。但是学习也要找对目标，</font>
		</p>
		<p>
				<font face="Courier New" size="2">一些小coding fans们，他们也津津乐道于他们的学习能力，一会学会了asp，一会儿学会了php，一会儿学会了jsp，他们</font>
		</p>
		<p>
				<font face="Courier New" size="2">把这个作为炫耀的资本，盲目的追逐一些肤浅的，表面的东西和名词，做网络程序不懂通讯传输协议，做应用程序不懂</font>
		</p>
		<p>
				<font face="Courier New" size="2">中断向量处理，这样的技术人员，不管掌握了多少所谓的新语言，永远不会有质的提高。 <br />善于总结，也是学习能力的一种体现，每次完成一个研发任务，完成一段代码，都应当有目的的跟踪该程序的应用状况</font>
		</p>
		<p>
				<font face="Courier New" size="2">和用户反馈，随时总结，找到自己的不足，这样逐步提高，一个程序员才可能成长起来。 <br />一个不具备成长性的程序员，即便眼前看是个高手，建议也不要选用，因为他落伍的时候马上就到了。 <br />具备以上全部素质的人，应当说是够格的程序员了，请注意以上的各种素质都不是由IQ决定的，也不是大学某些课本里</font>
		</p>
		<p>
				<font face="Courier New" size="2">可以学习到的，需要的仅仅是程序员对自己工作的认识，是一种意识上的问题。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">那么作为高级程序员，以至于系统分析员，也就是对于一个程序项目的设计者而言，除了应该具备上述全部素质之外，</font>
		</p>
		<p>
				<font face="Courier New" size="2">还需要具备以下素质： </font>
		</p>
		<p>
				<font face="Courier New" size="2">第一，需求分析能力 <br />对于程序员而言，理解需求就可以完成合格的代码，但是对于研发项目的组织和管理者，他们不但要理解客户需求，更</font>
		</p>
		<p>
				<font face="Courier New" size="2">多时候还要自行制定一些需求，为什么这么说呢？ <br />一般而言，进行研发任务，也许是客户提出需求，也许是市场和营销部门提出的需求，这时候对于研发部门，他们看到</font>
		</p>
		<p>
				<font face="Courier New" size="2">的不是一个完整的需求，通常而言，该需求仅仅是一些功能上的要求，或者更正规些，可能获得一个完整的用户视图；</font>
		</p>
		<p>
				<font face="Courier New" size="2">但是这都不够，因为客户由于非技术因素多一些，他们可能很难提出完整和清晰，或者说专业性的性能需求，但是对于</font>
		</p>
		<p>
				<font face="Courier New" size="2">项目组织者和规划者，他必须能够清醒认识到这些需求的存在并在完成需求分析报告的时候适当的提出，同时要完整和</font>
		</p>
		<p>
				<font face="Courier New" size="2">清晰的体现在设计说明书里面，以便于程序员编码时不会失去这些准则。 <br />程序设计者必须正确理解用户需求所处的环境，并针对性做出需求的分析，举例而言，同样一个软件通过ASP租用方式</font>
		</p>
		<p>
				<font face="Courier New" size="2">发布和通过License方式发布，性能需求可能就是有区别的，前者强调的是更好的支撑能力和稳定性，而后者则可能更强</font>
		</p>
		<p>
				<font face="Courier New" size="2">调在各种平台下的普适性和安装使用的简捷性。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">第二，项目设计方法和流程处理能力 <br />程序设计者必须能够掌握不少于两到三种的项目设计方法（比如自顶至下的设计方法，比如快速原型法等等），并能够</font>
		</p>
		<p>
				<font face="Courier New" size="2">根据项目需求和资源搭配来选择合适的设计方法进行项目的整体设计。设计方法上选择不当，就会耽误研发周期，浪费</font>
		</p>
		<p>
				<font face="Courier New" size="2">研发资源，甚至影响研发效果。 <br />一个程序设计者还需要把很多功夫用在流程图的设计和处理上，他需要做数据流图以确立数据词典；他需要加工逻辑流</font>
		</p>
		<p>
				<font face="Courier New" size="2">图以形成整体的系统处理流程。一个流程有问题的系统，就算代码多漂亮，每个模块多精致，也不会成为一个好的系统</font>
		</p>
		<p>
				<font face="Courier New" size="2">。当然，做好流程分析并选择好项目设计方法，都需要在需求分析能力上具有足够的把握。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">第三，复用设计和模块化分解能力 <br />这个似乎又是老调重谈，前面基本素质上不是已经说明了这个问题吗？ <br />作为一个从事模块任务的程序员，他需要对他所面对的特定功能模块的复用性进行考虑，而作为一个系统分析人员，他</font>
		</p>
		<p>
				<font face="Courier New" size="2">要面对的问题复杂的多，需要对整体系统按照一种模块化的分析能力分解为很多可复用的功能模块和函数，并针对每一</font>
		</p>
		<p>
				<font face="Courier New" size="2">模块形成一个独立的设计需求。举个例子，好比是汽车生产，最早每辆汽车都是独立安装的，每个部件都是量身定做的</font>
		</p>
		<p>
				<font face="Courier New" size="2">，但是后来不一样了，机器化大生产了，一个汽车厂开始通过流水线来生产汽车，独立部件开始具有一定的复用性，在</font>
		</p>
		<p>
				<font face="Courier New" size="2">后来标准化成为大趋势，不同型号，品牌甚至不同厂商的汽车部件也可以进行方便的换装和升级，这时候，汽车生产的</font>
		</p>
		<p>
				<font face="Courier New" size="2">效率达到最大化。软件工程也是同样的道理，一个成熟的软件行业，在一些相关项目和系统中，不同的部件是可以随意</font>
		</p>
		<p>
				<font face="Courier New" size="2">换装的，比如微软的许多桌面软件，在很多操作模块（如打开文件，保存文件等等）都是复用的同一套功能模块，而这</font>
		</p>
		<p>
				<font face="Courier New" size="2">些接口又通过一些类库提供给了桌面应用程序开发者方便挂接，这就是复用化的模块设计明显的一个佐证。 <br />将一个大型的，错综复杂的应用系统分解成一些相对独立的，具有高度复用性的，并能仅仅依靠几个参数完成数据联系</font>
		</p>
		<p>
				<font face="Courier New" size="2">的模块组合，是作为高级程序员和系统分析员一项最重要的工作，合适的项目设计方法，清晰的流程图，是实现这一目</font>
		</p>
		<p>
				<font face="Courier New" size="2">标的重要保证。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">第四，整体项目评估能力 <br />作为系统设计人员，必须能够从全局出发，对项目又整体的清醒认识，比如公司的资源配置是否合理和到位，比如工程</font>
		</p>
		<p>
				<font face="Courier New" size="2">进度安排是否能最大化体现效率又不至于无法按期完成。评估项目整体和各个模块的工作量，评估项目所需的资源，评</font>
		</p>
		<p>
				<font face="Courier New" size="2">估项目可能遇到的困难，都需要大量的经验积累，换言之，这是一种不断总结的累计才能达到的境界。在西方一些软件</font>
		</p>
		<p>
				<font face="Courier New" size="2">系统设计的带头人都是很年长的，比如4，50岁，甚至更老，他们在编码方面已经远远不如年轻人那样活络，但是就项</font>
		</p>
		<p>
				<font face="Courier New" size="2">目评估而言，他们几十年的经验积累就是最重要和宝贵的财富。中国缺这么一代程序员，主要还不是缺那种年纪的程序</font>
		</p>
		<p>
				<font face="Courier New" size="2">员，而是那种年纪的程序员基本上都是研究单位作出来的，都不是从专业的产品化软件研发作出来的，他们没有能积累</font>
		</p>
		<p>
				<font face="Courier New" size="2">那种产品化研发的经验，这也是没有办法的事情。<br /> <br />第五，团队组织管理能力 <br />完成一个项目工程，需要团队的齐心协力，作为项目设计者或研发的主管人，就应当有能力最大化发挥团队的整体力量</font>
		</p>
		<p>
				<font face="Courier New" size="2">，技术管理由于其专业性质，不大同于一般的人事管理，因为这里面设计了一些技术性的指标和因素。 <br />首先是工作的量化，没有量化就很难做到合适的绩效考核，而程序量化又不是简单的代码行数可以计算的，因此要求技</font>
		</p>
		<p>
				<font face="Courier New" size="2">术管理人员需要能真正评估一个模块的复杂性和工作量。 <br />其次是对团队协作模式的调整，一般而言，程序开发的协作通常分为小组进行，小组有主程序员方式的，也有民主方式</font>
		</p>
		<p>
				<font face="Courier New" size="2">的，根据程序员之间的能力水平差距，以及根据项目研发的需求，选择合适的组队方式，并能将责权和成员的工作任务</font>
		</p>
		<p>
				<font face="Courier New" size="2">紧密结合，这样才能最大发挥组队的效率。 <br />一个代码水平高的人，未必能成为一个合格的项目研发主管，这方面的能力欠缺往往是容易被忽视的。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">综上可以看到，作为一个主管研发的负责人，一个项目设计者，所需要具备的素质和能力并不是程序代码编写的能力，</font>
		</p>
		<p>
				<font face="Courier New" size="2">当然一般情况下，一个程序员通过不断的总结提高达到了这种素质的时候，他所具有的代码编写能力也已经相当不简单</font>
		</p>
		<p>
				<font face="Courier New" size="2">了，但是请注意这里面的因果关系，一个高水平的项目设计者通常已经是代码编写相当优秀的人了，但是并不是一个代</font>
		</p>
		<p>
				<font face="Courier New" size="2">码相当优秀的程序员就可以胜任项目设计的工作，这里面存在的也不是智商和课本的问题，还是在于一个程序员在积累</font>
		</p>
		<p>
				<font face="Courier New" size="2">经验，逐步提升的时候没有意识到应当思考哪方面的东西，没有有意识的就项目的组织和复用设计进行揣摩，没有经常</font>
		</p>
		<p>
				<font face="Courier New" size="2">性的文档习惯和总结习惯，不改变这些，我们的合格的项目设计者还是非常欠缺。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">另外，为防止有无聊的人和我较真，补充一点，本文针对目标是作商业化的软件项目和工程，那些科研机构的编程高手</font>
		</p>
		<p>
				<font face="Courier New" size="2">，比如算法高手，比如图象处理高手，他们的工作是研究课题而非直接完成商业软件（当然最终间接成为商业产品，比</font>
		</p>
		<p>
				<font face="Courier New" size="2">如微软研究院在作的研究课题），因此他们强调的素质可能是另外的东西，这些人（专家），并不能说是程序员，不能</font>
		</p>
		<p>
				<font face="Courier New" size="2">用程序员的标准去衡量。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">最后补充一点东西，一个软件项目研发的设计流程是怎样的呢？以通常标准的设计方法为例，（不过笔者喜欢快速原型</font>
		</p>
		<p>
				<font face="Courier New" size="2">法）。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">第一个步骤是市场调研，技术和市场要结合才能体现最大价值。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">第二个步骤是需求分析，这个阶段需要出三样东西，用户视图，数据词典和用户操作手册。用户视图是该软件用户（包</font>
		</p>
		<p>
				<font face="Courier New" size="2">括终端用户和管理用户）所能看到的页面样式，这里面包含了很多操作方面的流程和条件。数据词典是指明数据逻辑关</font>
		</p>
		<p>
				<font face="Courier New" size="2">系并加以整理的东东，完成了数据词典，数据库的设计就完成了一半多。用户操作手册是指明了操作流程的说明书。请</font>
		</p>
		<p>
				<font face="Courier New" size="2">注意，用户操作流程和用户视图是由需求决定的，因此应该在软件设计之前完成，完成这些，就为程序研发提供了约束</font>
		</p>
		<p>
				<font face="Courier New" size="2">和准绳，很遗憾太多公司都不是这样做的，因果颠倒，顺序不分，开发工作和实际需求往往因此产生隔阂脱节的现象。 <br />需求分析，除了以上工作，笔者以为作为项目设计者应当完整的做出项目的性能需求说明书，因为往往性能需求只有懂</font>
		</p>
		<p>
				<font face="Courier New" size="2">技术的人才可能理解，这就需要技术专家和需求方（客户或公司市场部门）能够有真正的沟通和了解。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">第三个步骤是概要设计，将系统功能模块初步划分，并给出合理的研发流程和资源要求。作为快速原型设计方法，完成</font>
		</p>
		<p>
				<font face="Courier New" size="2">概要设计就可以进入编码阶段了，通常采用这种方法是因为涉及的研发任务属于新领域，技术主管人员一上来无法给出</font>
		</p>
		<p>
				<font face="Courier New" size="2">明确的详细设计说明书，但是并不是说详细设计说明书不重要，事实上快速原型法在完成原型代码后，根据评测结果和</font>
		</p>
		<p>
				<font face="Courier New" size="2">经验教训的总结，还要重新进行详细设计的步骤。 <br />第四个步骤是详细设计，这是考验技术专家设计思维的重要关卡，详细设计说明书应当把具体的模块以最‘干净’的方式(</font>
		</p>
		<p>
				<font face="Courier New" size="2">黑箱结构）提供给编码者，使得系统整体模块化达到最大；一份好的详细设计说明书，可以使编码的复杂性减低到最低</font>
		</p>
		<p>
				<font face="Courier New" size="2">，实际上，严格的讲详细设计说明书应当把每个函数的每个参数的定义都精精细细的提供出来，从需求分析到概要设计</font>
		</p>
		<p>
				<font face="Courier New" size="2">到完成详细设计说明书，一个软件项目就应当说完成了一半了。换言之，一个大型软件系统在完成了一半的时候，其实</font>
		</p>
		<p>
				<font face="Courier New" size="2">还没有开始一行代码工作。那些把作软件的程序员简单理解为写代码的，就从根子上犯了错误了。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">第五个步骤是编码，在规范化的研发流程中，编码工作在整个项目流程里最多不会超过1/2，通常在1/3的时间，所谓磨</font>
		</p>
		<p>
				<font face="Courier New" size="2">刀不误砍柴功，设计过程完成的好，编码效率就会极大提高，编码时不同模块之间的进度协调和协作是最需要小心的，</font>
		</p>
		<p>
				<font face="Courier New" size="2">也许一个小模块的问题就可能影响了整体进度，让很多程序员因此被迫停下工作等待，这种问题在很多研发过程中都出</font>
		</p>
		<p>
				<font face="Courier New" size="2">现过。编码时的相互沟通和应急的解决手段都是相当重要的，对于程序员而言，bug永远存在，你必须永远面对这个问</font>
		</p>
		<p>
				<font face="Courier New" size="2">题，大名鼎鼎的微软，可曾有连续三个月不发补丁的时候吗？从来没有！ </font>
		</p>
		<p>
				<font face="Courier New" size="2">第六个步骤是测试 <br />测试有很多种：按照测试执行方，可以分为内部测试和外部测试；按照测试范围，可以分为模块测试和整体联调；按照</font>
		</p>
		<p>
				<font face="Courier New" size="2">测试条件，可以分为正常操作情况测试和异常情况测试；按照测试的输入范围，可以分为全覆盖测试和抽样测试。以上</font>
		</p>
		<p>
				<font face="Courier New" size="2">都很好理解，不再解释。 <br />总之，测试同样是项目研发中一个相当重要的步骤，对于一个大型软件，3个月到1年的外部测试都是正常的，因为永远</font>
		</p>
		<p>
				<font face="Courier New" size="2">都会又不可预料的问题存在。 <br />完成测试后，完成验收并完成最后的一些帮助文档，整体项目才算告一段落，当然日后少不了升级，修补等等工作，只</font>
		</p>
		<p>
				<font face="Courier New" size="2">要不是想通过一锤子买卖骗钱，就要不停的跟踪软件的运营状况并持续修补升级，知道这个软件被彻底淘汰为止。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">写这些步骤算不上卖弄什么，因为实话讲我手边是一本《软件工程》，在大学里这是计算机专业的必修课程，但是我知</font>
		</p>
		<p>
				<font face="Courier New" size="2">道很多程序员似乎从来都只是热衷于什么《30天精通VC》之类的，他们有些和我一样游击队出身，没有正规学过这个</font>
		</p>
		<p>
				<font face="Courier New" size="2">专业，还有一些则早就在混够学分后就把这些真正有用的东西还给了老师。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">网上现在也很浮躁，一些coding fans乱嚷嚷，混淆视听，实际上真正的技术专家很少在网上乱发帖子的，如笔者这样不</font>
		</p>
		<p>
				<font face="Courier New" size="2">知天高地厚的，其实实在是算不上什么高手，只不过看不惯这种对技术，对程序员的误解和胡说，只好挺身而出，做拨</font>
		</p>
		<p>
				<font face="Courier New" size="2">乱反正之言，也希望那些还沉迷于一些错误人士的coding fans们能认真想想，走到正途上，毕竟那些聪明的头脑还远远</font>
		</p>
		<p>
				<font face="Courier New" size="2">没有发挥应有的价值。 </font>
		</p>
		<p>
				<font face="Courier New">
						<br />
						<font size="2">
						</font>
				</font> </p>
<img src ="http://www.cppblog.com/zerolee/aggbug/16676.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">仄洛</a> 2006-12-21 09:05 <a href="http://www.cppblog.com/zerolee/archive/2006/12/21/16676.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>将电脑和银行结合在一起，你会得到什么?</title><link>http://www.cppblog.com/zerolee/archive/2006/12/18/16588.html</link><dc:creator>仄洛</dc:creator><author>仄洛</author><pubDate>Mon, 18 Dec 2006 10:44:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2006/12/18/16588.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/16588.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2006/12/18/16588.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/16588.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/16588.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Courier New" size="2">将电脑和银行结合在一起，你会得到什么?<br />---------------------------------<br />   电脑！每次从ATM取钱时，我都会遭遇到与电脑通病相同的让人生气难堪的行为。如果我的操作有一点失误，它就拒绝所有交易，将我踢出交易过程。我必须拽出银行卡，重新插入，重新输入密码，重新开始我的请求。多数情况下我没有犯错误，而是ATM诱导我犯错误。即使我只有一个个人支票帐户，它总是问我从支票帐户 、储蓄帐户和货币市场帐户中的哪一个取钱。结果，我总是忘记我的帐户属于哪一类，问的问题也让我茫然。大约一个月一次，我会不经意地选择“储蓄”帐户，内部机器立即将我踢出整个交易，然后让我重新开始。机器理应知道我没有储蓄帐户，不应该让我做出选择。选择“储蓄”和965航班飞行员选择“REMEO”的唯一区别就是惩罚的程度不同。<br />   ATM还限制我每天只能取200美元。如果我顺利通过所有操作，输入密码，选择帐户，输入220美元金额，电脑就会毫不客气的拒绝整个交易，粗暴地告诉我要取的数额超过200美元限制。它不事先告诉我这个限制，不给我重新输入少一些金额的机会。它吐出我的卡，给我重新尝试整个过程的机会。排在我身后的人们躁动着，叹着气。ATM是正确和如实的，但是没有给我任何帮助。<br />   ATM有它必须遵循的规定，而我并不是不愿意遵守，但是它像电脑那样无理地不告诉我它的规则，给我矛盾的提示，然后因我无辜地越界而突然惩罚我。这种行为是电脑的普遍行为，却不是它们固有的。事实上，电脑中的任何东西均不是固有的：它们仅仅表现得像软件，即程序。软件程序像人类语言那样有灵活性。一个人的言词可以粗鲁、礼貌，有帮助或让人不舒服。让电脑的行为带有尊敬和礼貌与让人的言语有尊敬和礼貌一样简单。所要做的就是让某人描述如何做。不幸的是，程序员不善于教电脑如何做。</font>
		</p>
<img src ="http://www.cppblog.com/zerolee/aggbug/16588.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">仄洛</a> 2006-12-18 18:44 <a href="http://www.cppblog.com/zerolee/archive/2006/12/18/16588.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>李开复博士谈博士生的出路[转载]</title><link>http://www.cppblog.com/zerolee/archive/2006/12/16/16526.html</link><dc:creator>仄洛</dc:creator><author>仄洛</author><pubDate>Sat, 16 Dec 2006 14:24:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2006/12/16/16526.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/16526.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2006/12/16/16526.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/16526.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/16526.html</trackback:ping><description><![CDATA[
		<font face="Courier New" size="2">   在读了博士生远潇给本报的来信后，GOOGLE公司中国区总裁李开复说，有这些困惑和担心，实际上是很多博士生们在读博士之前并没有认真地想过，自己是不是能耐得住寂寞做学问，是不是能抵御来自物质世界的诱惑。另外，如果读博士抱有“一顶博士帽能给自己找工作时加分”的想法，不仅会增加自己学习期间的痛苦，而且在找工作时会发现，博士头衔不能有多少优势后会更加失落。 </font>
		<p>
				<font face="Courier New" size="2">　　由于是最早进入微软公司高管层的华人，又常常在高校亮相做巡回演讲，而且还在中国创办了“开复学生网”，给中国学生解答“大到人生观，小到如何学好英语”的各种问题，这使卡内基梅隆大学毕业的工科博士李开复，在中国高校学生中的名气不小。就博士生远潇的困惑，记者专访了李开复。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　<strong>多问问自己为什么要去戴博士帽</strong></font>
		</p>
		<p>
				<font face="Courier New" size="2">　　“选择读博士就等于选择了在未来三五年，或者是更长的一段时间，你必须要成为孤独的人，要远离物质的花花世界，甚至要无数次承担失败或者不被学界认可的痛苦”。这就注定了不是每个人都具备能成为博士的潜质。在李开复看来，当你犹豫自己是不是要去读个博士之前，一定要向自己问问这些问题： </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　首先，你是不是有创新的热情。因为要取得博士学位，最后就得看你在某一领域的研究有没有突破和创新。如果你是一个墨守成规，不太富有挑战精神的人，那么做创新研究可能就不太适合你。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　其次，要问问自己愿意孤独地追求知识吗？看到同学发财、出名，会羡慕、甚至感到痛苦吗？如果你是个物质欲比较强、对挣钱还有兴趣的人，或许你该去读个MBA，或者找一份好工作，而不是去读博士。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　在美国，一个博士生毕业后可能能拿到10万美元的年薪，而一个MBA毕业后或许能拿到15万美元，但拿到博士学位要花上5年时间，或者更长，但MBA只要两年的时间，MBA的投入产出比要高一些。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　第三，你愿意花很多时间拼命工作，即便你知道你正在探究的问题有可能在短时间内无解。如果你是一个很在意失败的人，那么读博士可能会使你的人生变得灰暗。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　李开复说，只有当你肯定自己读博士确实是为了享受做学问、超越前人的乐趣时，才有可能愉快地度过学习生涯。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　李开复回忆，他自己念博士的时候虽然有奖学金，但日子也不富裕，有时候假期也得出去打打工，但每个人在自己不同的生活阶段就应该享受不同阶段的乐趣，学生时代就应该是物质清贫，学习而快乐着的。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　<strong>毕业时，你应该成为你研究领域中世界第一的专家</strong></font>
		</p>
		<p>
				<font face="Courier New" size="2">　　跨入博士生的门槛后，李开复建议，要给自己设计一个3年的学习和科研计划。首先，需要彻底地了解在相关领域他人已有的工作和成绩，然后再提出自己的想法和见解，脚踏实地工作。另外，还要不断跟踪这个领域的最新研究进展，把握好方向，避免重复性工作，把精力集中在最有价值的研究方向上。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　李开复说，他至今还记得在他进入卡内基梅隆大学攻读计算机博士学位时，当时的系主任说的话：“当你拿到你的博士学位时，你应该成为你所从事的研究领域里世界第一的专家。” </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　这样的要求似乎对大多数刚刚起步的人来说都是高不可攀的，可李开复说，他本人正是确立了这样的目标，在经过五年寒窗、夜以继日的努力工作后，他所期待的结果就自然而然地出现了。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　一个打算攻读博士学位的人，就应该给自己树立一个很高的目标。李开复想告诫博士生远潇：读博士不是一件轻松的事，切忌浮躁的情绪，而要一步一个脚印，扎扎实实地工作。也不可受一些稍纵即逝的名利的诱惑，而要200%地投入。也许你会疲劳，会懊悔，会迷失方向，但是要记住，你所期待的成功和突破也正孕育其中。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　李开复回忆说，他在攻读博士学位时，每周工作7天，每天工作16个小时，大量的统计结果和分析报告几乎让人崩溃。他也曾不止一次地怀疑自己的所作所为是否真的能够成功，但终于有一天，在凌晨3时做出的一个结果让他感受到了成功的滋味。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　“那种一切都很顺利，谁都可以得到的工作和结果，我相信研究价值一定不高。”李开复说，另外，一个人如果打算一辈子从事研究工作，那么从他在读博士学位期间所形成的做事习惯、研究方法和思维方式，基本上就可以判断出他未来工作的轮廓。所以，你一定要做一个“有心人”，充分利用在校的时间，为自己的将来打好基础。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　<strong>你找的导师，最好有“我不赞成你，但我一定支持你”的胸怀</strong></font>
		</p>
		<p>
				<font face="Courier New" size="2">　　“在学术界，人们普遍认为‘名师出高徒’。可见导师在你的成长道路上作用是多么的大。”李开复建议说，在确定自己要开始读博士之后，应该主动去寻找自己所研究的领域里最好的老师，甚至应该去求教于周围能找到的专家，看看大家对你想选择的导师有怎样的评价，更不要忘了常去求教“最博学的老师”——互联网。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　李开复说，他还鼓励准博士生们直接发电子邮件去咨询一些世界公认的专家和教授。以他的经验，对于这样的邮件，他们中的大部分人都会很快给回复。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　李开复听到过一些博士生抱怨说，在3年的学习生涯中没有得到导师充分的指导。他把自己听到的案例归纳出了几类准博士们要慎重选择的导师。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　有一类导师，有很多的项目，学生跟着这样的老师，3年的工夫大概都在替老师打工赚钱。这样的导师暂且看到他长处的一面，可能增加了学生的动手能力，但博士找工作，招聘的企业看的还是你作为博士的突破和研究能力，而不是你做过多少项目。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　李开复说，这类导师中，有一种最恶劣的是，看到一些能干的学生能为自己做点事，即便到了毕业的时间也不让学生毕业，还要让学生多打几年工。所以在选导师之前，一定要多方打听导师的人品如何。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　还有一类导师也被李开复认为是要当心的，这类导师虽然很安心做研究，但他几乎两耳不闻窗外事，研究思路和方向都是很落伍的，而且他给你选定的方向有可能早就被证明是过时的。李开复说，有的导师可能上了年纪，近年来也没有太多的研究成果，但这个老师人品不错，能允许和鼓励学生不同常规的想法，并且从方法论上能指导学生，这样的导师应该是可以选择的。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　李开复多次在各种演讲和文章中提到他当年读博士时的导师。他说，虽然读博士期间，他的导师确实没有教给他有关他专业的知识，但是他能给学生大方向的指导，而且能毫不吝啬地与学生分享他在学术上的经营和他在学术界的各种资源。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　李开复说，博士生导师或许就是那种没有太多时间给你，也不会给你太多具体而细节的指导，但他却有“我不赞成你，但我一定支持你”的胸怀。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　<strong>戴上博士帽不等于就能一步跨进挣钱多的地方</strong></font>
		</p>
		<p>
				<font face="Courier New" size="2">　　有了博士的头衔不一定就等于增加了你找工作的砝码。李开复说，从他在微软和GOOGLE公司的招聘经历和他所了解的一些著名跨国公司在华招聘的情况来看，大家招聘博士的范围都会巧合地限定在国内排行前十几名的大学中。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　李开复解释，一般大公司、尤其是IT类的企业在挑选本科生或者硕士研究生时，尺度是比较松的，即便有的硕士没有太多学术上的造诣，但只要拿出做过的像样的项目，一般也是会被认可的，但对博士就不同了。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　李开复说，他在招聘博士时会仔细阅读应聘者的博士论文，因为对博士的水平评判就全靠这篇论文了，博士论文如果没有新意，或者观点方法陈旧，即使应聘者有再多的实践能力，做过再多的项目，也得不到认可。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　正因为一些大公司在招聘时反而对博士的水平更加挑剔，所以李开复说，千万不要以为戴上博士帽就能找到好工作。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　<strong>做个快乐的人最重要</strong></font>
		</p>
		<p>
				<font face="Courier New" size="2">　　最近李开复写了一篇文章，提到在21世纪企业喜欢什么样的人，其中他认为很关键的要素是，应聘的人是不是一个热爱工作、积极乐观的人。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　李开复希望告诉远潇，即便现在有很多不如意和困惑，但还是要努力让自己成为一个快乐、积极的人。他希望把台湾企业家张忠谋的一个故事告诉远潇。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　张忠谋是台基电的董事长，一次朋友请他题词，他给朋友写下了“常想一二”，朋友问他是什么意思。张忠谋说，“我们都说人生不如意之事十有八九，我要告诉你常想那剩下的一二比较如意的事情。” </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　张忠谋说，他从小就看了很多大人物的传记，发现了一个规律，凡是成功者都受苦受难，他们的生命几乎就是人生不如意事十有八九的真实写照。但是他发现这些人之所以能够成功，就是因为他们保持了正面的思考，通过“常想一二”，超越不愉快。苦难对他们来说反而成了生命中最好的养料，为他们未来的成功做了良好的铺垫。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　李开复说，其实在21世纪，还有很多其他的理由要做一个乐观向上的人，因为21世纪有一个更实时善变的环境，我们尝试的事情会碰到很多很多的失败。 </font>
		</p>
<img src ="http://www.cppblog.com/zerolee/aggbug/16526.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">仄洛</a> 2006-12-16 22:24 <a href="http://www.cppblog.com/zerolee/archive/2006/12/16/16526.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>“笨”人更容易成功[转载]</title><link>http://www.cppblog.com/zerolee/archive/2006/12/14/16422.html</link><dc:creator>仄洛</dc:creator><author>仄洛</author><pubDate>Thu, 14 Dec 2006 04:15:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2006/12/14/16422.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/16422.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2006/12/14/16422.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/16422.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/16422.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Courier New" size="2">Author: <a href="http://blog.sina.com.cn/m/huangxiqing"><font color="#000000">黄玺庆</font></a><br /><br />   由于工作性质使然，我几乎每天都要面对一些上门洽谈合作的人。这些人中，有的很容易让我接受，有的则让我避之唯恐不及。</font>
				<br />
				<font face="Courier New" size="2">　　与人打交道多了，我也看出了道道。我发现那些看起来比较“笨”的人往往能够打动我，而那些话很多，总是试图在短时间内改变我的观念，甚至试图“教育”我的人则很难与我合作成功。</font>
				<br />
				<font face="Courier New" size="2">　　我担心自己的经验比较片面，于是询问了好几个与我工作性质差不多的朋友，发现大家的感觉竟然惊人的一致：大家更接受那些坦诚朴素的业务人员。</font>
				<br />
				<br />
				<font face="Courier New" size="2">　　下面是我亲身经历的两件事情。</font>
				<br />
				<font face="Courier New" size="2">　　去年夏天，一个公关活动公司年轻的小伙子找到我，向我推荐一个活动。在我的面前坐定，我发现他比较紧张，口齿与一些伶牙俐齿的业务人员无法相提并论。我耐心听完他的介绍后，觉得与项目的推广重点不太吻合，便说我会安排策划推广部论证一下，然后送走了他。</font>
				<br />
				<font face="Courier New" size="2">　　十多分钟后，我经过公司二层大厅，发现他一个人站在那里，我还以为他在等人，礼节性地与他点了个头，便继续忙着做我的事。大约二十多分钟过后，他又来敲我的门。进屋后，他显得更加紧张，甚至有点儿结巴地说：“您看，我刚才是不是没有讲清楚，我刚参加工作，第一次单独跑业务。我想再跟您讲一遍。”</font>
				<br />
				<font face="Courier New" size="2">　　他的话象电击一样让我的内心颤栗了一下。我一下子想起来他为什么在大厅里站着了。从他离开我的办公室到鼓足勇气再进入我的办公室，在半个小时的时间里，这个刚刚参加工作、第一次单独跑业务的年轻人该做了多么大的心理挣扎啊。我不由得想起了我第一次独立工作的样子以及我人生中的许多第一次，我在想，在许多第一次面前我是否能象这位年轻人那样虽紧张但却坦诚呢？我是否会故作聪明地去装作老练呢？人都会有第一次，人都是由生手逐渐变为熟手的。生手并不丢脸，关键是生手不能故作聪明地去扮演熟手。因为你面对的谈判对象可能要比你有经验得多。故作聪明不仅贻笑大方，更容易弄巧成拙。</font>
				<br />
				<font face="Courier New" size="2">　　那个上午，我花了近一个半小时的时间与这位年轻人交谈。我不仅认真听了他对活动的再次介绍，而且还帮助他分析了方案的优缺点。对于这个第一次独立工作的年轻人，我希望他的“第一次”得到的是鼓励而不是挫折。后来尽管由于推广周期的原因我没有与他合作，但是我把他介绍给了其他的朋友。如今，经过一年的历练，这个小伙子已经取得了很优异的成绩。</font>
				<br />
				<br />
				<font face="Courier New" size="2">　　还有一件事情是一个女孩子的。</font>
				<br />
				<font face="Courier New" size="2">　　也是去年夏天，一个杂志社的女孩子来采访我。我知道现在许多杂志的采访都是要广告回报的。有的杂志刚开始采访时说得很热闹，但是只要项目不给回报，那些采访就决不会变成铅字。</font>
				<br />
				<font face="Courier New" size="2">　　但是这个女孩子却只字不提回报的事情。采访完后，我就把这件事丢到了脑后。以至于这个女孩子的模样我都想不起来了。谁想一个星期后，我的邮箱里竟然收到了这个女孩子的文章初稿，整整10个P，两万多字。这是完全出乎我的预料的。我接受过很多采访，见过太多的敷衍了事的文章。象这个女孩子这样如此用心写文章的非常罕见。两万字，要付出多少心血啊，而且是在没有任何回报的情况下来写作。我立即产生了要见这个女孩子一面的冲动。我非常想知道在如此浮躁的社会，是什么让这个女孩子有如此的定力。</font>
				<br />
				<font face="Courier New" size="2">　　后来这篇文章刊登后，取得了很好的宣传效果。我告诉推广经理，找机会一定要安排回报。</font>
				<br />
				<br />
				<font face="Courier New" size="2">　　上述我经历过的两件事情已经过去了一年时间。但是现在我还是能够很轻易地想起来。那两个年轻人现在发展得都不错。我想他们之所以能够不断取得进步，源于他们身上具有一种共同的品格：脚踏实地，不耍小聪明，有时候看起来甚至用的都是笨功夫。但是，这个世界的规律却是：成功更青睐看起来“笨”的人。</font>
		</p>
<img src ="http://www.cppblog.com/zerolee/aggbug/16422.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">仄洛</a> 2006-12-14 12:15 <a href="http://www.cppblog.com/zerolee/archive/2006/12/14/16422.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>庸人与懒人[转载]</title><link>http://www.cppblog.com/zerolee/archive/2006/12/10/16211.html</link><dc:creator>仄洛</dc:creator><author>仄洛</author><pubDate>Sun, 10 Dec 2006 04:36:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2006/12/10/16211.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/16211.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2006/12/10/16211.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/16211.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/16211.html</trackback:ping><description><![CDATA[
		<font face="Courier New" size="2">从学生时代开始，我就发现了这个世界很多庸人。<br />到了大学，就发现基本都是庸人和懒人这两种人。 </font>
		<p>
				<font face="Courier New" size="2">到了现在，终于明白到一些道理：</font>
		</p>
		<p>
				<font face="Courier New" size="2">天空之所以美丽，不是因为天空上有马戏团，而是因为天空什么也没有，这是一种清澈的美丽。</font>
		</p>
		<p>
				<font face="Courier New" size="2">而人之所以庸碌，就是因为内心装了一个马戏团。</font>
		</p>
		<p>
				<font face="Courier New" size="2">庸人总是很爱惜自己，给自己最好的待遇，绝对不会亏待自己。</font>
		</p>
		<p>
				<font face="Courier New" size="2">庸人会随大流，因为爱惜自己，所以需要保护自己，英雄也好，枭雄也好，他们都不欣赏，因为这都是高危职业。因为这样，所以庸人不可能成为英雄或枭雄。</font>
		</p>
		<p>
				<font face="Courier New" size="2">庸人绝对不懒，同时也鄙视懒人，庸人会留意任何有利于自己的情况，会追逐一切利益，前提是，性价比高的。庸人以为自己是最聪明的人，因为总是放弃小豆米，选择大西瓜。但是因为如此，放弃手中的“小豆米”就成了家常便饭。</font>
		</p>
		<p>
				<font face="Courier New" size="2">这就是一切庸人的共同点。因为有这些领悟，我知道了一些现象的由来：</font>
		</p>
		<p>
				<font face="Courier New" size="2">为何有差生，优生的分别。因为差生都是庸人，优生不是天才，但是内心清澈。</font>
		</p>
		<p>
				<font face="Courier New" size="2">为何看到那么多人，看两眼c++就说难，说根本不是人学的东西。为什么那么多人看到数学就觉得讨厌，而还鄙视的说，都是傻瓜在学。因为庸人总是选择最高性价比的东西，固然不可能会对这些没什么性价比的东西保持热诚。</font>
		</p>
		<p>
				<font face="Courier New" size="2">当然自我欺骗也是常用的伎俩。</font>
		</p>
		<p>
				<font face="Courier New" size="2">我认为人类所具备的机能都是类似的，强度也差别不大，但是拥有非常强的可塑性。一个人可以锻炼得比自己强几倍，甚至100倍，千倍。而类似的机能，类似的强度，为何却只有一部分人能变得更加强。</font>
		</p>
		<p>
				<font face="Courier New" size="2">为什么？一切的原因都是——“心”。与其说自然的，还不如说是选择，有人选择保持原状，有人选择提升，这一切都是内心的决定。或客观的说，是心智的影响，因为选择并不是有意识的。一个人选择了保持原状，然后仍能沾沾自喜的，无非就是庸人所具备的心智了。</font>
		</p>
		<p>
				<font face="Courier New" size="2">教育制度，无疑是在考学生家长的社会实力，而学生家长无疑又在考学生的忍耐力。因此，很多大学生满腔热诚的选择自己一点不熟悉的专业，然后堕落在学校落后的现实中，失去奋斗目标的情况比比皆是。因此不想做一个庸人，又不想做一个懒人，请听我的忠告：</font>
		</p>
		<p>
				<font face="Courier New" size="2">要看不起自己，不要太将自己当回事，以后能找份平平凡凡的工作已经算好了。自己不可能是李嘉诚，也不可能中大奖，也不会有什么艳遇横财。</font>
		</p>
		<p>
				<font face="Courier New" size="2">不要过普通人的生活，可以贱，可以烂，但是也要鄙视一切普通人的生活模式。</font>
		</p>
		<p>
				<font face="Courier New" size="2">要懒，懒到不去找任何替代的精神寄托，不要日夜操劳的去玩。</font>
		</p>
		<p>
				<font face="Courier New" size="2">保持这种心态去搞学习，去想办法将以后的普通生活提高一点点趣味吧。</font>
		</p>
		<p>
				<font face="Courier New" size="2">这个忠告的好处是：</font>
		</p>
		<p>
				<font face="Courier New" size="2">知道自己平凡，但是比很多人早知道4年。</font>
		</p>
		<p>
				<font face="Courier New" size="2">生活习惯可以塑造人格，但是人却不能通过意志纠正自我，可是要改变生活习惯还是可能的。习惯的改变，虽然是会有一段的戒断期，但是当需要的生活模式渐渐成为习惯后，就自然而然的得到解脱，这比不断给自己压力要健康得多。</font>
		</p>
		<p>
				<font face="Courier New" size="2">最懒的人反而容易找到自己的方向。</font>
		</p>
<img src ="http://www.cppblog.com/zerolee/aggbug/16211.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">仄洛</a> 2006-12-10 12:36 <a href="http://www.cppblog.com/zerolee/archive/2006/12/10/16211.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>国外著名大学计算机教学考察随笔[转载]</title><link>http://www.cppblog.com/zerolee/archive/2006/12/09/16158.html</link><dc:creator>仄洛</dc:creator><author>仄洛</author><pubDate>Fri, 08 Dec 2006 17:33:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2006/12/09/16158.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/16158.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2006/12/09/16158.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/16158.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/16158.html</trackback:ping><description><![CDATA[
		<font face="Courier New" size="2">   为了解国外大学计算机教学情况，2002年春季，清华大学组团到美国进行了一次考察。考察组先后到斯坦福、伯克利、加州理工等著名学府进行了调研，旁听了一些计算机方面的课程，与有关教授、教务管理人员和中国留学生进行了座谈，并参观了学校的图书馆和计算机机房。下文就是我们约请清华大学计算机与信息管理中心副主任王行言教授撰写的考察随笔。</font>
		<div>
				<font face="Courier New">
						<font size="2"><font color="#ff0000"><strong>4</strong><strong>月<span>9日</span></strong><strong> 斯坦福大学</strong></font></font>
				</font>
		</div>
		<div>
				<font face="Courier New" size="2">上午，我们<span>分头听了“数据库”和“编译原理”的课程。数据库为大班课程，本节课主要讲</span>ER图和ER模型。授课方式是“黑板+粉笔”，6块黑板来回切换。教室有电视和录像设备，电视跟踪和放大黑板内容，所以无论坐在哪个角落，都能看到黑板的内容。教室后有制作室，可以对课堂教学当场录制。课上同学提问题很踊跃，老师也不时地提出问题，回答最好的几乎都是中国留学生。</font>
		</div>
		<div>
				<font face="Courier New" size="2">中午饭后，我们参观计算中心和图书馆，两处都有学生上机的环境。学生来去匆匆，多半都是上网看一下课程通知或下载、打印几页文档资料。</font>
		</div>
		<div>
				<font face="Courier New" size="2">我们在浏览网页时，看到上午的数据库课程已制作成视频课件(不到半天时间)。学生可以自主选择听老师的某段讲解，或看某页的板书。在斯坦福，有专门制作人员(并有学生参与)对部分课程进行录制加工，并及时放到网上，供学生下课复习。这些课件还有一个重要的目的，就是用于继续教育，为学校周围的在职人员学习提供方便。</font>
		</div>
		<div>
				<font face="Courier New" size="2">在计算中心入口处的通知栏上，我们看到了白板上公布的一些课外讲座，如UNIX操作系统使用、Office工具软件的使用等,此外还有一些编程语言的入门课程。</font>
		</div>
		<div>
				<font face="Courier New" size="2">下午我们又听了一门“程序设计”课程，估计教室可容纳四、五百人。学生进教室时，每人在门口拿一份本节课的讲义。很多老师在上课时都习惯准备随<span>堂使用的讲义，内容包括补充的素材和本节课布置的习题。本课程由<strong>斯坦福大学计算机</strong>系副主任</span>Eric S. Roberts教授主讲，他就是IEEE和ACM推出的“Computing Curricula 2001<span><span>”</span>的主要执笔人。这节课他主要是讲解算法设计(</span>树搜索，迷宫等)和程序调试。Roberts教授使用笔记本电脑及大屏幕投影授课，屏幕上显示的是讲课用到的代码及程序调试环境，但他大部分时间是坐在讲台上，面向学生滔滔不绝地讲解。程序设计课程使用的教材是Roberts教授写的两本书：“The Art and Science of C”和“Programming Abstractions in C”。这两本教材在美国被多所大学所采用。</font>
		</div>
		<div>
				<font face="Courier New">
						<font size="2"><font color="#ff0000"><strong>4</strong><strong>月<span>10日</span></strong><strong> 斯坦福大学</strong></font></font>
				</font>
		</div>
		<div>
				<font face="Courier New" size="2">上午，我们与计算机系副系主任Eric S. Roberts教授座谈，请他谈一下斯坦福大学的计算机教育(包括非计算机专业的计算机教育)。他饶有兴趣地谈到了<strong>斯坦福大学计算机</strong>系的发展和<strong>计算机课程</strong>的设置情况。</font>
		</div>
		<div>
				<font face="Courier New" size="2">他说，与大多数专业相比，计算机科学是一个非同寻常的领域。当100年前斯坦福大学成立之际，大多数学科就已经有了一定的历史。50年后，才发明了世界第一台计算机。又过了25年，计算机科学才成为一个独立的学科。斯坦福计算机科学系成立于1965年，并一直保持世界前4名的位置。</font>
		</div>
		<div>
				<font face="Courier New" size="2">在最近25年中，计算机科学飞速发展，并极大地推动了社会的进步。计算机科学将继续成为一个令人兴奋的领域。</font>
		</div>
		<div>
				<font face="Courier New">
						<font size="2">在斯坦福，大多数学生愿意学习计算机科学的主修课程。在CS主修课程中，学生可以追踪很多不同的领域：程序语言、图形学、数据库、计算理论、人机交互、机器人学、人工智能、数值分析等。随着近年来需求的变化，CS主修<span>课更加灵活并满足大多数学生的需求。</span></font>
				</font>
		</div>
		<div>
				<font face="Courier New" size="2">在斯坦福大学，新生入校时不分专业，学生的专业要根据个人选修课程的情况到高年级才逐步明朗。当然，在入校时，学生还是有自己的意向。学校为每位想学计算机的同学都提供一份指导性文件，说明在斯坦福学习计算机的几种途径。除CS之外，还有五种其他选择供学生考虑：</font>
		</div>
		<div>
				<font face="Courier New" size="2">1．C omputer Science Minor(CS辅修专业)</font>
		</div>
		<div>
				<font face="Courier New" size="2">该辅修专业提供 CS主修课中本科的核心课程(见图1)，由6-8门课组成，安排在两年中学完。</font>
		</div>
		<div>
				<font face="Courier New">
						<font size="2">完成辅修课后，学生将获得很强的编程基础，并进入计算机科学的<span>某个理论分支。进而，学生可以在自己感兴趣的领域学习更多更深入的课程。</span></font>
				</font>
		</div>
		<div>
				<font face="Courier New" size="2">图1是辅修专业的课程设置。</font>
		</div>
		<div>
				<font face="Courier New" size="2">2. Computer Systems Engineering (CSE)</font>
		</div>
		<div>
				<font face="Courier New" size="2">CSE是跨计算机科学和电子工程两个系的交叉学科。</font>
		</div>
		<div>
				<font face="Courier New" size="2">CSE的主修课类似于计算机科学系，但一些<span>偏理论的<strong>计算机课程</strong>被电子工</span><span>程方面</span>的课程所代替(如数字设计与电路分析)。</font>
		</div>
		<div>
				<font face="Courier New" size="2">3. Electrical Engineering (EE)</font>
		</div>
		<div>
				<font face="Courier New" size="2">适合于对计算机科学、特别是对硬件更感兴趣的同学选修。除了侧重硬件外，EE学位和其他学位的主要不同是侧重于工程。</font>
		</div>
		<div>
				<font face="Courier New" size="2">4. Mathematical and Computational Sciences (Math/CS)</font>
		</div>
		<div>
				<font face="Courier New" size="2">计算机科学和纯数学的结合。学位课包括计算机科学基础核心课以及各种数学课。除这些核心课程外，学生还侧重计算机或数学选一些课。</font>
		</div>
		<div>
				<font face="Courier New" size="2">5. Symbolic System</font>
		</div>
		<div>
				<font face="Courier New" size="2">是交叉学科，结合了计算机科学、心理学、社会学、以及语言学，研究人-机的认知。将人和计算机视为符号处理系统。</font>
		</div>
		<div>
				<font face="Courier New">
						<font size="2">Roberts教授还讲到，由于计算机技术的发展，可以用计算机解决更复杂的问题，并且可以不需要编程，起码不是传统意义上的编程。所以计算机系和计算中心还面向全校开设了一些更侧重于应用的课程(包括各种语言与工具类课程)，主要是满足<span>全校非计算机专业学生自己学习计算机和应用计算机的需求。其中一些课程的内容就类似于我们计算机文化基础课的内容。这些课程包括：</span></font>
				</font>
		</div>
		<div>
				<font face="Courier New" size="2">CS1I—Using the Internet</font>
		</div>
		<div>
				<font face="Courier New" size="2">CS193D—C++ and Object-Oriented Programming</font>
		</div>
		<div>
				<font face="Courier New" size="2">CS193I—Internet Programming</font>
		</div>
		<div>
				<font face="Courier New" size="2">CS193J—Programming in Java</font>
		</div>
		<div>
				<font face="Courier New" size="2">CS193U—Software Engineering in C</font>
		</div>
		<div>
				<font face="Courier New" size="2">CS193W—Microsoft Windows Programming</font>
		</div>
		<div>
				<font face="Courier New" size="2">如何开始学习<strong>计算机课程</strong>呢？Roberts教授给我们画了一张图(见图2)。</font>
		</div>
		<div>
				<font face="Courier New" size="2">Roberts教授指出，如果要从技术的角度(而不是从文化的角度)学习计算机，CS106A(即程序设计)是第一门必修的基础课。学完CS106A后，如果想继续深入学习编程的知识，可选修CS106B。对那些在中学就已具有一定编程能力的学生，如果想学习C语言或想进一步提高编程水平，可选修一学期的CS106X(浓缩两门课的快班)。学完CS106B后，学生就有了比较明确的意向，如果想进计算机专业，就可开始系统学习计算机专业的课程。而不想选择计算机专业的同学，可以选修计算机系等单位为非计算机专业开设的其他 课程。</font>
		</div>
		<div>
				<font face="Courier New" size="2">CS106课程采用的教学语言是C语言，Roberts教授解释说：C语言广泛应用于工业界，而且是学习更先进语言的基础(C++ 和Java)。</font>
		</div>
		<div>
				<font face="Courier New" size="2">我们向Roberts教授提出一个问题：如果学生自己选专业，会不会有很多学生都选计算机专业？计算机<span>系如何接纳这么多学生？</span>Roberts教授说，的确新生中有很多人想学计算机，但学过1、2门<strong>计算机课程</strong>之后，不少同学就感到计算机专业不适合自己。经过多年操作，选择计算机系的人数已经趋于稳定。另外，美国的学生不见得都喜欢计算机，觉得整天坐在计算机前没有意思，而对于考古、地质等野外作业觉得更富有挑战性。</font>
		</div>
		<div>
				<font face="Courier New">
						<font size="2"><font color="#ff0000"><strong>4</strong><strong>月</strong><strong>11</strong><strong>日</strong><strong>斯坦福大学</strong></font></font>
				</font>
		</div>
		<div>
				<font face="Courier New" size="2">今天与计算机系教务座谈。系教务对我们讲，每个教授每年都要开一门核心课(研究生课程也算核心课)。教师的教学工作量要够<span>一定点数，大课点数多，小课点数少。系里有一套评价体系，学生给系主任和教师本人打分，这些对教师的评级有影响。新生提前一周到校，招生办公室根据学生兴趣分派导师指导学生选课。每个学生都有一个导师帮助选课</span>(一名导师负责若干名学生)。学校设有注册办公室，管理各种教学资源。</font>
		</div>
		<div>
				<font face="Courier New" size="2">随后我们参观了硬件实验室。硬件实验普遍采用模拟软件，控制盒里有关键芯片。</font>
		</div>
		<div>
				<font face="Courier New" size="2">下午我们听了一节毕业设计课，该节课的安排是请IBM公司的工程师讲解正在研究的一些新技术。根据我们的感觉，学校和公司的联系很密切。</font>
		</div>
		<div>
				<font face="Courier New" size="2">下午我们和一位在斯坦福半导体研究所长期任教的清华老师进行了座谈。针对我们提的一些问题，这位老师说了一些自己的观点：对于硬件实验，电的教学、电路课做一些实验，单板机也有，但不是重点(有些爱动手的学生选修)。斯坦福大学还是偏软的多，同学出去主要是搞设计，搞算法。例如利用spice软件，10个星期设计一个芯片。硅谷对半导体人才需求很明确，学会三门电路设计课就要。斯坦福实验室很少，偏专门化的课就外聘教师。而基础的物理、化学都是大牌教授。美国毕业生专门化很突出，工作中就做自己专业的事，不管别的杂七杂八的事，否则是浪费人才、时间。计算机各行各业都在用，但要懂多少，并不见得很多，硬件结构、软件OS、C语言、数值分析、专业用软件等。计算机能力强，表现在把计算机作为工具，会算法、数据分析，自己专业算法强。光会计算机编程是中等人才，最有价值是专业的东西。</font>
		</div>
		<div>
				<font face="Courier New" size="2">之后，我们又与部分中国留学生举行了座谈。在座谈过程中，不时有人进进出出，有的刚下课，有的要去上辅导课(助教)，大家显得都很忙碌。很多同学是在网上看到要和国内来的大学老师座谈，就主动赶来参加，即使只能参加一会儿也要来。同学们见到我们都非常兴奋，也谈了很多在这里学习、生活的情况。他们说，这里的房东最喜欢租房子给中国学生，因为他们早出晚归。在美国念书，作业负担很重，每学期课的门数不多，但课程的强度非常大，例如程序设计，一周就有两到三次大课。斯坦福不太重视文章，没有文章要求。但学校中的研究气氛很浓，很多低年级的学生就自动组织起来，找一些具有挑战性的课题来做。</font>
		</div>
		<div>
				<font face="Courier New">
						<font size="2"><strong></strong><font color="#ff0000"><strong>4</strong><strong>月</strong><strong>13</strong><strong>日</strong><strong>加州理工</strong></font></font>
				</font>
		</div>
		<div>
				<font face="Courier New" size="2">今天主要是与留学生座谈，我们谈的范围很广，以下是我们聊的一些感兴趣的内容。</font>
		</div>
		<div>
				<font face="Courier New" size="2">同学们说，这里系的差别不是很大，天文、物理、数学，无论是什么系，都要上一大堆公共课，本科是通才教育。教师与学生的比例是1∶3 ，TA与学生的比例是1∶20。编程的课主要是上TA的课。学校每学期为10周，课程强度高，难度大，每学期学5门课已经很吃力了。同学们异口同声地说，作业又多又难，交作业时间卡的很死，作业有时做到第二天天亮。作业绝对不能抄，在成绩中所占比例也很大。</font>
		</div>
		<div>
				<font face="Courier New" size="2">我们问了一些有关计算机教育的问题，他们说，计算机系主要是讲理论。非计算机系的学生选一些计算机理论课，可以扩展知识面。他们感到计算机的哪门课都是数学课。各系并没有强迫学生选什么计算机的课，但聪明的学生会选一些计算机课。根据他们接触的情况，专业老师用计算机，学生就会学计算机。各系教师交流很密切，教授用计算机，会带动计算机教学。各领域的权威、教授应该知道学生在计算机方面需要用到什么。计算机教学不要与其他教学分开，用的时候就会学。他们认为，计算机的基础是程序设计。计算机<span>教学分理论</span>(<span>计算机系开</span>)和应用(与各专业结合，各系可开)。</font>
		</div>
		<div>
				<font face="Courier New" size="2">同学们还告诉我们，期末考试时，监考老师一般站在教室外面，有问题再进到教室解决，以此表示对同学的信任。有的考试干脆让同学把卷子拿回去做，规定1到2天内交卷。我们问，那如果互相抄袭怎么办？同学说基本没有抄袭，因为学生自我约束很严，非常看重诚信二字。他们讲了正在发生的一件事情：一个同学将公共场所的一把椅子私自搬到了自己的宿舍里，学生委员会正在对此事进行处理(据说是要开除)，学生委员会做出的决定，学校也不得不认真考虑。</font>
		</div>
		<div>
				<font face="Courier New">
						<font size="2"><font color="#ff0000"><strong>4</strong><strong>月<span>18日</span></strong><strong> 伯克利分校</strong></font></font>
				</font>
		</div>
		<div>
				<font face="Courier New" size="2">今天安排和一个留学生座谈，因为他在美国念了多年的书，拿了一个硕士学位，两个博士学位，至今还没有离开学校之意。他向我们讲述了自己的一些感受和建议。</font>
		</div>
		<div>
				<font face="Courier New" size="2">他说，国内有些大学把理论和市场对立起来是不对的。我们可以培训出非常好的程序员(写一个软件)，但没有独到见解，没有算法。计算机理论，图论、线性代数等都是非常有用的。美国学校很重视数学怎么用到实际问题。学到一点数学，就知道用到哪，就有成就感，而不重视技巧。美国学生做东西比较深入，想得深。最出色的是美国学生。</font>
		</div>
		<div>
				<font face="Courier New" size="2">美国研究生主动性很强，自发组织在一起，找题目研究(如人工智能、机器学习等)。新生进校后，学生会就组织学生参观专业，引发他们对专业的兴趣。国内的学生要脱俗，胆子要大一些。</font>
		</div>
		<div>
				<font face="Courier New" size="2">在考察的过程中，我们也浏览了各校的一些主页，其中印象最深的是各校在使用网络教学环境时比较讲究实效，花样不多但内容丰富、规范。例如，几乎每门课程都有自己的主页，老师的一些讲稿也放在网上。课程主页一般包括以下栏目：</font>
		</div>
		<div>
				<font face="Courier New">
						<font size="2">
								<span>l</span> 课程内容概要</font>
				</font>
		</div>
		<div>
				<font face="Courier New">
						<font size="2">
								<span>l</span> 授课人员(列出讲师、TA的名单及他们的电话和email地址)</font>
				</font>
		</div>
		<div>
				<font face="Courier New">
						<font size="2">
								<span>l</span> 上课时间/地点(<span>一门课周学时</span>一般为150分钟，75*2 或50*3)</font>
				</font>
		</div>
		<div>
				<font face="Courier New">
						<font size="2">
								<span>l</span> 答疑安排(时间、地点、答疑老师姓名)</font>
				</font>
		</div>
		<div>
				<font face="Courier New">
						<font size="2">
								<span>l</span> 课程先修要求(不是必须)</font>
				</font>
		</div>
		<div>
				<font face="Courier New">
						<font size="2">
								<span>l</span> 教材，参考书(一些参考书就是公司的产品文档，如Oracle documents)</font>
				</font>
		</div>
		<div>
				<font face="Courier New">
						<font size="2">
								<span>l</span> 考核方式(书面作业、上机实验、Project、期中、期末考试等安排和所占分数)</font>
				</font>
		</div>
		<div>
				<font face="Courier New">
						<font size="2">
								<span>l</span> 纪律规定(抄袭作业的处罚、如何保护知识产权，网上资源引用的规定和限制等)</font>
				</font>
		</div>
		<div>
				<font face="Courier New" size="2">以上是我们出国考察了解到的一些情况，写出来与大家分享与借鉴。</font>
		</div>
		<div>
				<font face="Courier New" size="2">附：几个学校的课程网址：</font>
		</div>
		<div>
				<font face="Courier New" size="2">http://www.stanford.edu/class/cs106斯坦福课程主页(以cs106课程为例)</font>
		</div>
		<div>
				<font face="Courier New" size="2">http://www.cs.Berkeley.edu伯克利</font>
		</div>
		<div>
				<font face="Courier New" size="2">http://www.schedule.berkeley.edu伯克利</font>
		</div>
		<div>
				<font face="Courier New" size="2">http://www.cs.Caltech.edu/courses.html加州理工</font>
		</div>
<img src ="http://www.cppblog.com/zerolee/aggbug/16158.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">仄洛</a> 2006-12-09 01:33 <a href="http://www.cppblog.com/zerolee/archive/2006/12/09/16158.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个母亲一生撒的8个谎言</title><link>http://www.cppblog.com/zerolee/archive/2006/09/21/12780.html</link><dc:creator>仄洛</dc:creator><author>仄洛</author><pubDate>Thu, 21 Sep 2006 02:11:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2006/09/21/12780.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/12780.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2006/09/21/12780.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/12780.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/12780.html</trackback:ping><description><![CDATA[
		<div class="operation" id="blogIndex">
				<div class="col-body">
						<div class="entry-preview">
								<div class="entry-title" style="CURSOR: hand" onclick="resize(this)">
										<h2>
												<font face="Courier New" size="2">
														<font size="3">一个母亲一生撒的8个谎言(转载)</font>
												</font>
										</h2>
										<h2>
												<font face="Courier New">
														<font size="2">    1、儿时，小男孩家很穷，吃饭时，饭常常不够吃，母亲就把自己碗里的饭分给孩子吃。母亲说，孩子们，快吃吧，我不饿！——母亲撒的第一个谎 </font>
												</font>
										</h2>
										<h2>
												<font size="2">
														<br />
														<font face="Courier New"> </font>
												</font>
												<font face="Courier New">
														<font size="2">　<font color="#000000"><font style="BACKGROUND-COLOR: #ffffff">2、男孩长身体的时候，勤劳的母亲常用周日休息时间去县郊农村河沟里捞些鱼来给孩子们补钙。鱼很好吃，鱼汤也很鲜。孩子们吃鱼的时候，母亲就在一旁啃鱼骨头，用舌头舔鱼骨头上的肉渍。男孩心疼，就把自己碗里的鱼夹到母亲碗里，请母亲吃鱼。母亲不吃，母亲又用筷子把鱼夹回男孩的碗里。母亲说，孩子，快吃吧，我不爱吃鱼！——母亲撒的第二个谎 </font></font></font>
												</font>
										</h2>
								</div>
								<div class="entry-body">
										<div>
												<font face="Courier New" size="2">
												</font> </div>
										<div>
												<font face="Courier New" size="2">　　 3、上初中了，为了缴够男孩和哥姐的学费，当缝纫工的母亲就去居委会领些火柴盒拿回家来，晚上糊了挣点分分钱补点家用。有个冬天，男孩半夜醒来，看到母亲还躬着身子在油灯下糊火柴盒。男孩说，母亲，睡了吧，明早您还要上班呢。母亲笑笑，说，孩子，快睡吧，我不困！——母亲撒的第三个谎 </font>
										</div>
										<div>
												<font face="Courier New" size="2">
												</font> </div>
										<div>
												<font face="Courier New" size="2">　　 4、高考那年，母亲请了假天天站在考点门口为参加高考的男孩助阵。时逢盛夏，烈日当头，固执的母亲在烈日下一站就是几个小时。考试结束的铃声响了，母亲迎上去递过一杯用罐头瓶泡好的浓茶叮嘱孩子喝了，茶亦浓，情更浓。望着母亲干裂的嘴唇和满头的汗珠，男孩将手中的罐头瓶反递过去请母亲喝。母亲说，孩子，快喝吧，我不渴！——母亲撒的四个谎 </font>
										</div>
										<div>
												<font face="Courier New" size="2">
												</font> </div>
										<div>
												<font face="Courier New" size="2">　　 5、父亲病逝之后，母亲又当爹又当娘，靠着自己在缝纫社里那点微薄收入含辛茹苦拉扯着几个孩子，供他们念书，日子过得苦不堪言。胡同路口电线杆下修表的李叔叔知道后，大事小事就找岔过来打个帮手，搬搬煤，挑挑水，送些钱粮来帮补男孩的家里。人非草木，孰能无情。左邻右舍对此看在眼里，记在心里，都劝母亲再嫁，何必苦了自己。然而母亲多年来却守身如玉，始终不嫁，别人再劝，母亲也断然不听，母亲说，我不爱！——撒的五个谎 </font>
										</div>
										<div>
												<font face="Courier New" size="2">
												</font> </div>
										<div>
												<font face="Courier New" size="2">　　 6、男孩和她的哥姐大学毕业参加工作后，下了岗的母亲就在附近农贸市场摆了个小摊维持生活。身在外地工作的孩子们知道后就常常寄钱回来补贴母亲，母亲坚决不要，并将钱退了回去。母亲说，我有钱！——撒的六个谎 </font>
										</div>
										<div>
												<font face="Courier New" size="2">
												</font> </div>
										<div>
												<font face="Courier New" size="2">　　 7、男孩留校任教两年，后又考取了美国一所名牌大学的博士生，毕业后留在美国一家科研机构工作，待遇相当丰厚，条件好了，身在异国的男孩想把母亲接来享享清福却被老人回绝了。母亲说，我不习惯！——撒的七个谎 </font>
										</div>
										<div>
												<font face="Courier New" size="2">
												</font> </div>
										<div>
												<font face="Courier New" size="2">　　 8、晚年，母亲患了胃癌，住进了医院，远在大西洋彼岸的男孩乘飞机赶回来时，术后的母亲已是奄奄一息了。母亲老了，望着被病魔折磨得死去活来的母亲，男孩悲痛欲绝，潸然泪下。母亲却说，孩子，别哭，我不疼。——撒的最后一个谎 </font>
										</div>
								</div>
						</div>
				</div>
		</div>
<img src ="http://www.cppblog.com/zerolee/aggbug/12780.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">仄洛</a> 2006-09-21 10:11 <a href="http://www.cppblog.com/zerolee/archive/2006/09/21/12780.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>STL之父访谈录 </title><link>http://www.cppblog.com/zerolee/archive/2006/09/10/12230.html</link><dc:creator>仄洛</dc:creator><author>仄洛</author><pubDate>Sun, 10 Sep 2006 12:52:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2006/09/10/12230.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/12230.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2006/09/10/12230.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/12230.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/12230.html</trackback:ping><description><![CDATA[
		<div class="postText">
				<font face="Courier New" size="2">STL之父访谈录     <br />  翻译者 : myan<br />出处: http://www.sgi.com/technology/stl  <br /><br />1995年3月，dr.dobb's journal特约记者, 著名技术书籍作家al stevens采访了stl创始人alexander stepanov. 这份访谈纪录是迄今为止对于stl发展历史的最完备介绍, 侯捷先生在他的stl有关文章里推荐大家阅读这篇文章. 因此我将该文全文翻译如下:<br /><br />q: 您对于generic programming进行了长时间的研究, 请就此谈谈.<br />a: 我开始考虑有关gp的问题是在7o年代末期, 当时我注意到有些算法并不依赖于数据结构的特定实现，而只是依赖于该结构的几个基本的语义属性. 于是我开始研究大量不同的算法，结果发现大部分算法可以用这种方法从特定实现中抽象出来, 而且效率无损. 对我来说,效率是至关重要的, 要是一种算法抽象在实例化会导致性能的下降, 那可不够棒.<br />   <br />   当时我认为这项研究的正确方向是创造一种编程语言. 我和我的两个朋友一起开始干起来.一个是现在的纽约州立大学教授deepak kapur, 另一个是伦塞里尔技术学院教授david musser.当时我们三个在通用电器公司研究中心工作. 我们开始设计一种叫tecton的语言. 该语言有一种我们称为"通用结构"的东西, 其实不过是一些形式类型和属性的集合体, 人们可以用它来描述算法. 例如一些数学方面的结构充许人们在其上定义一个代数操作, 精化之,扩充之, 做各种各样的事.<br /><br />   虽然有很多有趣的创意, 最终该项研究没有取得任何实用成果, 因为tecton语言是函数型语言. 我们信奉backus的理念，相信自己能把编程从von neumann风格中解放出来. 我们不想使用副效应, 这一点限制了我们的能力, 因为存在大量需要使用诸如"状态", "副效应"等观念的算法.   <br /><br />   我在70年代末期在tecton上面所认识到了一个有趣的问题: 被广泛接受的adt观念有着根本性的缺陷. 人们通常认为adt的特点是只暴露对象行为特征, 而将实现隐藏起来. 一项操作的复杂度被认为是与实现相关的属性, 所以抽象的时候应予忽略. 我则认识到, 在考虑一个(抽象)操作时, 复杂度(或者至少是一般观念上的复杂度)必须被同时考虑在内. 这一点现在已经成了gp的核心理念之一.<br /><br />   例如一个抽象的栈stack类型,  仅仅保证你push进去的东西可以随后被pop出来是不够的,同样极端重要的是, 不管stack有多大, 你的push操作必须能在常数时间内完成. 如果我写了一个stack, 每push一次就慢一点, 那谁都不会用这个烂玩艺.<br /><br />   我们是要把实现和界面分开, 但不能完全忽略复杂度. 复杂度必须是, 而且也确实是横陈于模块的使用者与实现者之间的不成文契约. adt观念的引入是为了允许软件模块相互可替换. 但除非另一个模块的操作复杂度与这个模块类似, 否则你肯定不愿意实现这种互换.如果我用另外一个模块替换原来的模块, 并提供完全相同的接口和行为, 但就是复杂度不同, 那么用户肯定不高兴. 就算我费尽口舌介绍那些抽象实现的优点, 他肯定还是不乐意用. 复杂度必须被认为是接口的一部分.<br /><br />   1983年左右, 我转往纽约布鲁克林技术大学任教. 开始研究的是图的算法, 主要的合作伙伴是现在ibm的aaron kershenbaum. 他在图和网络算法方面是个专家, 我使他相信高序(high order)的思想和gp能够应用在图的算法中. 他支持我与他合作开始把这些想法用于实际的网络算法. 某些图的算法太复杂了, 只进行过理论分析, 从来没有实现过. 他企图建立一个包含有高序的通用组件的工具箱, 这样某些算法就可以实现了. 我决定使用lisp语言的一个变种scheme语言来建立这样一个工具箱. 我们俩建立了一个巨大的库, 展示了各种编程技术.网络算法是首要目标. 不久当时还在通用电器的david musser加了进来, 开发了更多的组件,一个非常大的库. 这个库供大学里的本科生使用, 但从未商业化. 在这项工作中, 我了解到副效应是很重要的, 不利用副效应, 你根本没法进行图操作. 你不能每次修改一个端点(vertex)时都在图上兜圈子. 所以, 当时得到的经验是在实现通用算法时可以把高序技术和副效应结合起来. 副效应不总是坏的, 只有在被错误使用时才是.<br /><br />   1985年夏, 我回到通用电器讲授有关高序程序设计的课程. 我展示了在构件复杂算法时这项技术的应用. 有一个听课的人叫陈迩, 当时是信息系统实验室的主任. 他问我是否能用ada语言实现这些技术, 形成一个工业强度的库, 并表示可以提供支持. 我是个穷助教, 所以尽管我当时对于ada一无所知, 我还是回答"好的". 我跟dave musser一起建立这个ada库. 这是很重要的一个时期, 从象scheme那样的动态类型语言(dynamically typed language)转向ada这样的强类型语言, 使我认识到了强类型的重要性. 谁都知道强类型有助于纠错. 我则发现在ada的通用编程中, 强类型是获取设计思想的有力工具. 它不仅是查错工具, 而且是思想工具.这项工作给了我对于组件空间进行正交分解的观念. 我认识到, 软件组件各自属于不同的类别.oop的狂热支持者认为一切都是对象. 但我在ada通用库的工作中认识到, 这是不对的. 二分查找就不是个对象, 它是个算法. 此外, 我还认识到, 通过将组件空间分解到几个不同的方向上, 我们可以减少组件的数量, 更重要的是, 我们可以提供一个设计产品的概念框架.<br /><br />   随后, 我在贝尔实验室c++组中得到一份工作, 专事库研究. 他们问我能不能用c++做类似的事.我那时还不懂c++, 但当然, 我说我行. 可结果我不行, 因为1987年时, c++中还没有模板, 这玩意儿在通用编程中是个必需品. 结果只好用继承来获取通用性, 那显然不理想.直到现在c++继承机制也不大用在通用编程中, 我们来说说为什么. 很多人想用继承实现数据结构和容器类, 结果几乎全部一败涂地. c++的继承机制及与之相关的编程风格有着戏剧性的局限. 用这种方式进行通用编程, 连等于判断这类的小问题都解决不了. 如果你以x类作为基类, 设计了一个虚函数operater==, 接受一个x类对象, 并由x派生类y, 那么y的operator==是在拿y类对象与x类对象做比较. 以动物为例, 定义animal类, 派生giraffe(长颈鹿)类. 定义一个成员函数mate(), 实现与另一个哺乳动物的交配操作, 返回一个animal对象. 现在看看你的派生类giraffe,它当然也有一个mate()方法, 结果一个长颈鹿同一个动物交配, 返回一个动物对象. 这成何体统?当然, 对于c++程序员来说, 交配函数没那么重要, 可是operator==就很重要了.<br /><br />   对付这种问题, 你得使用模板. 用模板机制, 一切如愿. <br /><br />   尽管没有模板, 我还是搞出来一个巨大的算法库, 后来成了unix system laboratory standard component library的一部分. 在bell lab, 我从象andy koenig, bjarne stroustrup(andrew koenig, 前iso c++标准化委员会主席; bjarne stroustrup, c++之父 -- 译者)这类专家身上学到很多东西. 我认识到c/c++的重要, 它们的一些成功之处是不能被忽略的. 特别是我发现指针是个好东东. 我不是说空悬的指针, 或是指向栈的指针. 我是说指针这个一般观念. 地址的观念被广泛使用着. 没有指针我们就没法描述并行算法.<br /><br />   我们现在来探讨一下为什么说c是一种伟大的语言. 通常人们认为c是编程利器并且获得如此成功,是因为unix是用c写的. 我不同意. 计算机的体系结构是长时间发展演变的结果, 不是哪一个聪明的人创造的. 事实上是广大程序员在解决实际问题的过程中提出的要求推动了那些天才提出这些体系. 计算机经过多次进化, 现在只需要处理字节地址索引的内存, 线性地址空间和指针. 这个进化结果是对于人们要求解决问题的自然反映. dennis ritchie天才的作品c, 正反映了演化了30年的计算机的最小模型. c当时并不是什么利器. 但是当计算机被用来处理各种问题时, 作为最小模型的c成了一种非常强大的语言, 在各个领域解决各种问题时都非常高效. 这就是c可移植性的奥秘, c是所有计算机的最佳抽象模型, 而且这种抽象确确实实是建立在实际的计算机, 而不是假想的计算机上的. 人们可以比较容易的理解c背后的机器模型, 比理解ada和scheme语言背后的机器模型要容易的多. c的成功是因为c做了正确的事, 不是因为at&amp;t的极力鼓吹和unix.<br /><br />   c++的成功是因为bjarne stroustrup以c为出发点来改进c, 引入更多的编程技术, 但始终保持在c所定义的机器模型框架之内, 而不是闭门造车地自己搞出一个新的机器模型来. c的机器模型非常简单. 你拥有内存, 对象保存在那里面, 你又有指向连续内存空间的指针, 很好理解. c++保留了这个模型, 不过大大扩展了内存中对象的范畴, 毕竟c的数据类型太有限了, 它允许你建立新的类型结构, 但不允许你定义类型方法. 这限制了类型系统的能力. c++把c的机器模型扩展为真正类型系统.<br /><br />   1988年我到惠普实验室从事通用库开发工作. 但实际上好几年我都是在作磁盘驱动器. 很有趣但跟<br />   gp毫不相关. 92年我终于回到了gp领域, 实验室主任bill worley建立了一个算法研究项目, 由我<br />   负责. 那时候c++已经有模板了. 我发现bjarne的模板设计方案是非常天才的. 在bell lab时, 我参<br />   加过有关模班设计的几个早期的讨论, 跟bjarne吵得很凶, 我认为c++的模板设计应该尽可能向ada的<br />   通用方案看齐. 我想可能我吵得太凶了, 结果bjarne决定坚决拒绝我的建议. 我当时就认识到在c++<br />   中设置模板函数的必要性了, 那时候好多人都觉得最好只有模板类. 不过我觉得一个模板函数在使用<br />   之前必须先显式实例化, 跟ada似的. bjarne死活不听我的, 他把模板函数设计成可以用重载机制来<br />   隐式实例化. 后来这个特别的技术在我的工作中变得至关重要, 我发现它容许我做很多在ada中不可能<br />   的任务. 非常高兴bjarne当初没听我的. <br /><br />q: 您是什么时候第一次构思stl的, 最初的目的是什么?<br />a: 92年那个项目建立时由8个人, 渐渐地人越来越少, 最后剩下俩, 我和李梦, 而且李小姐是这个领域的新手. 在她的专业研究中编译器是主要工作, 不过她接受了gp研究的想法, 并且坚信此项研究将带给软件开发一个大变化, 要知道那时候有这个信念的认可是寥寥无几. 没有她, 我可不敢想象我能搞定stl, 毕竟stl标着两个人的名字:stepanov和lee. 我们写了一个庞大的库, 庞大的代码量, 庞大的数据结构组件,函数对象, 适配器类, 等等. 可是虽然有很多代码, 却没有文档. 我们的工作被认为是一个验证性项目,其目的是搞清楚到底能不能在使算法尽可能通用化的前提下仍然具有很高的效率. 我们化了很多时间来比较, 结果发现, 我们算法不仅最通用, 而且要率与手写代码一样高效, 这种程序设计风格在性能上是不打折扣的! 这个库在不断成长, 但是很难说它是什么时候成为一个"项目"的. stl的诞生是好几件事情的机缘巧合才促成的.<br /><br />q: 什么时候, 什么原因促使您决定建议使stl成为ansi/iso标准c++一部分的?<br />a: 1993年夏, andy koenig跑到斯坦福来讲c++课, 我把一些有关的材料给他看, 我想他当时确实是很兴奋.他安排我9月到圣何塞给c++标准委员会做一个演讲. 我演讲的题目是"c++程序设计的科学", 讲得很理论化, 要点是存在一些c++的基本元素所必须遵循的, 有关基本操作的原则. 我举了一些例子, 比如构造函数, 赋值操作, 相等操作. 作为一种语言,  c++没有什么限制. 你可以用operator==()来做乘法. 但是相等操作就应该是相等操作. 它要有自反性,  a == a; 它要有对称性, a == b 则 b == a; 它还要有传递性. 作为一个数学公理, 相等操作对于其他操作是基本的要素. 构造函数和相等操作之间的联系就有公理性的东西在里边. 你用拷贝构造函数生成了一个新对象, 那么这个对象和原来那个就应该是相等的. c++是没有做强行要求, 但是这是我们都必须遵守这个规则. 同样的, 赋值操作也必须产生相等的对象. 我展示了一些基本操作的"公理", 还讲了一点迭代子(iterator), 以及一些通用算法怎样利用迭代子来工作. 我觉得那是一个两小时的枯燥演讲, 但却非常受欢迎. 不过我那时并没有想把这个东西塞在标准里, 它毕竟是太过先进的编程技术, 大概还不适于出现在现实世界里, 恐怕那些做实际工作的人对它没什么兴趣.<br /><br />   我是在9月做这个演讲的, 直到次年(1994)月, 我都没往ansi标准上动过什么脑筋. 1月6日, 我收到andy koenig的一封信(他那时是标准文档项目编辑), 信中说如果我希望stl成为标准库的一部分, 可以在1月25日之前提交一份建议到委员会. 我的答复是:"andy, 你发疯了吗?", 他答复道:"不错, 是的我发疯了, 为什么咱们不疯一次试试看?"<br /><br />   当时我们有很多代码, 但是没有文档, 更没有正式的建议书. 李小姐和我每星期工作80小时, 终于在期限之前写出一份正式的建议书. 当是时也, 只有andy一个人知道可能会发生些什么. 他是唯一的支持者, 在那段日子里他确实提供了很多帮助. 我们把建议寄出去了, 然后就是等待. 在写建议的过程中我们做了很多事. 当你把一个东西写下来, 特别是想到你写的可能会成为标准, 你就会发现设计中的所有纰漏. 寄出标准后,我们不得不一段一段重写了库中间的代码, 以及几百个组件, 一直到3月份圣迭戈会议之前. 然后我们又重新修订了建议书, 因为在重新写代码的过程中, 我们又发现建议书中间的很多瑕疵.<br /><br />q: 您能描述一下当时委员会里的争论吗? 建议一开始是被支持呢, 还是反对?<br />a: 我当时无法预料会发生些什么. 我做了一个报告, 反响很好. 但当时有许多反对意见. 主要的意见是:这是一份庞大的建议, 而且来得太晚, 前一次会议上已经做出决议, 不在接受任何大的建议. 而这个东西是有史以来最大的建议, 包括了一大堆新玩艺. 投票的结果很有趣, 压倒多数的意见认为应对建议进行再考虑, 并把投票推迟到下次会议, 就是后来众所周知的滑铁卢会议.<br /><br />   bjarne stroustrup成了stl的强有力支持者. 很多人都通过建议、更改和修订的方式给予了帮助。bjarne干脆跑到这来跟我们一起工作了一个礼拜。andy更是无时无刻的帮助我们。c++是一种复杂的语言，不是总能搞得清楚确切的含义的。差不多每天我都要问andy和bjarne c++能不能干这干那。我得把特殊的荣誉归于andy， 是他提出把stl作为c++标准库的一部分；而bjarne也成了委员会中stl的主要鼓吹者。其他要感谢的人还有：mike vilot，标准库小组的负责人； rogue wave公司的nathan myers(rogue wave是boland c++builder中stl方案的提供商 —— 译者)，andersen咨询公司的larry podmolik。确实有好多人要致谢。<br /><br />   在圣迭戈提出的stl实际与当时的c++，我们被要求用新的ansi/iso c++语言特性重写stl，这些特性中有一些是尚未实现的。为了正确使用这些新的、未实现的c++特性，bjarne和andy花了无以计数的时间来帮助我们。<br /><br />   人们希望容器独立于内存模式，这有点过分，因为语言本身并没有包括内存模式。所以我们得要想出一些机制来抽象内存模式。在stl的早期版本里，假定容器的容积可以用size_t类型来表示，迭代子之间的距离可以用ptrdiff_t来表示。现在我们被告知，你为什么不抽象的定义这些类型？这个要求比较高，连语言本身都没有抽象定义这些类型，而且c/c++数组还不能被这些类型定义所限定。我们发明了一个机制称作"allocator"，封装了内存模式的信息。这个机制深刻地影响了库中间的每一个组件。你可能疑惑：内存模式和算法或者容器类接口有什么关系？如果你使用size_t这样的东西，你就无法使用 t* 对象，因为存在不同的指针类型(t*, t huge *, 等等)。这样你就不能使用引用，因为内存模式不同的话，会产成不同的引用类型。这样就会导致标准库产生庞大的分支。<br /><br />   另外一件重要的事情是我们原先的关联类型数据结构被扩展了。这比较容易一些，但是最为标准的东西总是很困难的，因为我们做的东西人们要使用很多年。从容器的观点看，stl做了十分清楚的二分法设计。所有的容器类被分成两种：顺序的和关联的，就好像常规的内存和按内容寻址的内存一般。这些容器的语义十分清楚。<br /><br />   当我到滑铁卢以后，bjarne用了不少时间来安慰我不要太在意成败与否，因为虽然看上去似乎不会成功，但是我们毕竟做到了最好。我们试过了，所以应该坦然面对。成功的期望很低。我们估计大部分的意见将是反对。但是事实上，确实有一些反对意见，但不占上风。滑铁卢投票的结果让人大跌眼镜，80%赞成，20%反对。所有人都预期会有一场恶战，一场大论战。结果是确实有争论，但投票是压倒性的。<br /><br />q: stl对于1994年2月发行的ansi/iso c++工作文件中的类库有何影响？<br />a: stl被放进了滑铁卢会议的工作文件里。stl文档被分解成若干部分，放在了文件的不同部分中。mike <br />   vilot负责此事。我并没有过多地参与编辑工作，甚至也不是c++委员会的成员。不过每次有关stl的<br />   建议都由我来考虑。委员会考虑还是满周到的。<br /><br />q: 委员会后来又做了一些有关模板机制的改动，哪些影响到了stl？<br />a: 在stl被接受之前，有两个变化影响到了我们修订stl。其一是模板类增加了包含模板函数的能力。stl广泛地使用了这个特性来允许你建立各种容纳容器的容器。一个单独的构造函数就能让你建立一个能容纳list或其他容器的vector。还有一个模板构造函数，从迭代子构造容器对象，你可以用一对迭代子当作参数传给它，这对迭代子之间的元素都会被用来构造新的容器类对象。另一个stl用到的新特性是把模板自身当作模板参数传给模板类。这项技术被用在刚刚提到的allocator中。<br /><br />q: 那么stl影响了模板机制吗？<br />a: 在弗基山谷的会议中，bjarne建议给模板增加一个“局部特殊化”(partial specialization)的特性。这个特性可以让很多算法和类效率更高，但也会带来代码体积上的问题。我跟bjarne在这个建议上共同研究了一段时间，这个建议就是为了使stl更高效而提出的。我们来解释一下什么是“局部特殊化”。你现在有一个模板函数 swap( t&amp;, t&amp; )，用来交换两个参数。但是当t是某些特殊的类型参数时，你想做一些特殊的事情。例如对于swap( int&amp;, int&amp; )，你想用一种特别的操作来交换数据。这一点在没有局部特殊化机制的情况下是不可能的。有了局部特殊化机制，你可以声明一个模板函数如下：<br />   <br />       template &lt;class t&gt; void swap( vector&lt;t&gt;&amp;, vector&lt;t&gt;&amp; );<br /><br />   这种形式给vector容器类的swap操作提供了一种特别的办法。从性能的角度讲，这是非常重要的。如果你用通用的形式去交换vector，会使用三个赋值操作，vector被复制三次，时间复杂度是线性的。然而，如果我们有一个局部特殊化的swap版本专门用来交换两个vector，你可以得到一个时间复杂度为常数的，非常快的操作，只要移动vector头部的两个指针就ok。这能让vector上的sort算法运行得更快。没有局部特殊化，让某一种特殊的vector，例如vector&lt;int&gt;运行得更快的唯一办法是让程序员自己定一个特殊的swap函数，这行得通，但是加重了程序员的负担。在大部分情况下，局部特殊化机制能够让算法在某些通用类上表现得更高效。你有最通用的swap，不那么通用的swap，更不通用的swap，完全特殊的swap这么一系列重载的swap，然后你使用局部特殊化，编译器会自动找到最接近的那个swap。另一个例子copy。现在我们的copy就是通过迭代子一个一个地拷贝。使用模板特殊化可以定义一个模板函数：<br /><br />template &lt;class t&gt; t** copy( t**, t**, t** );<br /><br />   这可以用memcpy高效地拷贝一系列指针来实现，因为是指针拷贝，我们可以不必担心构造对象和析构对象的开销。这个模板函数可以定义一次，然后供整个库使用，而且用户不必操心。我们使用局部特殊化处理了一些算法。这是个重要的改进，据我所知在弗基山谷会议上得到了好评，将来会成为标准的一部分。(后来的确成了标准的一部分 —— 译者）<br /><br />q: 除了标准类库外，stl对那一类的应用程序来说最有用处？<br />a: 我希望stl能够引导大家学习一种新的编程风格：通用编程。我相信这种风格适用于任何种类的应用程序。这种风格就是：用最通用的方式来写算法和数据结构。这些结构所要求的语义特性应该能够被清楚地归类和分类，而这些归类分类的原则应该是任何对象都能满足的。理解和发展这种技术还要很长时间，stl不过是这个过程的起点。<br /><br />   我们最终会对通用的组件有一个标准的分类，这些组件具有精心定义的接口和复杂度。程序员们将不必在微观层次上编程。你再也不用去写一个二分查找算法。就是在现在，stl也已经提供了好几个通用的二分查找算法，凡是能用二分查找算法的场合，都可以使用这些算法。算法所要求的前提条件很少：你只要在代码里使用它。我希望所有的组件都能有这么一天。我们会有一个标准的分类，人们不用再重复这些工作。<br /><br />   这就是douglas mcilroy的梦想，他在1969年关于“构件工厂”的那篇著名文章中所提出来的东西。stl就是这种“构件工厂”的一个范例。当然，还需要有主流的力量介入这种技术的发展之中，光靠研究机构不行，工业界应该想程序员提供组件和工具，帮助他们找到所需的组件，把组件粘合到一起，然后确定复杂度是否达到预期。<br /><br />q: stl没有实现一个持久化(persistent)对象容器模型。map和multimap似乎是比较好的候选者，它们可以把对象按索引存入持久对象数据库。您在此方向上做了什么工作吗，或者对这类实现有何评论？<br />a：很多人都注意到这个问题。stl没实现持久化是有理由的。stl在当时已经是能被接受的最巨大的库了。再大一点的话，我认为委员会肯定不会接受。当然持久化是确实是一些人提出的问题。在设计stl，特别是设计allocator时，bjarne认为这个封装了内存模式的组件可以用来封装持久性内存模式。bjarne的洞察秋毫非常的重要和有趣，好几个对象数据库公司正在盯着这项技术。1994年10月我参加了object database management group的一个会议，我做了一个关于演说。他们非常感兴趣，想让他们正在形成中的组件库的接口与stl一致，但不包括allocator在内。不过该集团的某些成员仔细分析了allocator是否能够被用来实现持久化。我希望与stl接口一致的组件对象持久化方案能在接下来的一年里出现。<br /><br />q：set，multiset，map和multimap是用红黑树实现的，您试过用其他的结构，比如b*树来实现吗？<br />a：我不认为b*适用于内存中的数据结构，不过当然这件事还是应该去做的。应该对许多其他的数据结构，比如跳表(skip list)、伸展树(splay tree)、半平衡树(half-balanced tree)等，也实现stl容器的标准接口。应该做这样的研究工作，因为stl提供了一个很好的框架，可以用来比较这些结构的性能。结口是固定的，基本的复杂度是固定的，现在我们就可一个对各种数据结构进行很有意义的比较了。在数据结构领域里有很多人用各种各样的接口来实现不同的数据结构，我希望他们能用stl框架来把这些数据结构变成通用的。<br />   （译者注：上面所提到的各种数据结构我以为大多并非急需，而一个stl没有提供而又是真正重要的数据结构是哈希结构。后来在stepanov和matt austern等人的sgi*stl中增补了hashset，hashmap和hashtable三种容器，使得这个stl实现才比较完满。众所周知，红黑树的时间复杂度为o(logn), 而理想hash结构为o(1)。当然，如果实现了持久化，b+树也是必须的。）<br /><br />q：有没有编译器厂商跟您一起工作来把stl集成到他们的产品中去？<br />a：是的，我接到了很多厂家的电话。borland公司的peter becker出的力特别大。他帮助我实现了对应borland编译器的所有内存模式的allocator组件。symantec打算为他们的macintosh编译器提供一个stl实现。edison设计集团也很有帮助。我们从大多数编译器厂商都得到了帮助。<br />   （译者注：以目前的stl版本来看，最出色的无疑是sgi*stl和ibm stl for as/390，所有windows下的的stl实现都不令人满意。根据测试数据，windows下最好的stl运行在piii 500mhz上的速度远远落后与在250mhz sgi工作站（irix操作系统）上运行的sgi*stl。以我个人经验，linux也是运行stl的极佳平台。而在windows的stl实现中，又以borland c++builder的rogue wave stl为最差，其效率甚至低于jit执行方式下的java2。visual c++中的stl是著名大师p. j. plauger的个人作品，性能较好，但其queue组件效率很差，慎用）<br /><br />q：stl包括了对ms-dos的16位内存模式编译器的支持，不过当前的重点显然是在32位上线性内存模式(flat model)的操作系统和编译器上。您觉得这种面向内存模式的方案以后还会有效吗？<br />a：抛开intel的体系结构不谈，内存模式是一个对象，封装了有关指针的信息：这个指针的整型尺寸和距离类型是什么，相关的引用类型是什么，等等。如果我们想利用各种内存，比如持久性内存，共享内存等等，抽象化的工作就非常重要了。stl的一个很漂亮的特性是整个库中唯一与机器类型相关的部分——代表真实指针，真实引用的组件——被封装到大约16行代码里，其他的一切，容器、算法等等，都与机器无关（真是牛啊！）。从移植的观点看，所有及其相关的东西，象是地址记法，指针等，都被封装到一个微小的，很好理解的机制里面。这样一来，allocator对于stl而言就不是那么重要了，至少不像对于基本数据结构和算法的分解那么重要。<br /><br /><br />q：ansi/iso c标准委员会认为像内存模式这类问题是平台相关的，没有对此做出什么具体规定。c++委员会会不会采取不同的态度？为什么？<br />a：我认为stl在内存模式这一点上跟c++标准相比是超前的。但是在c和c++之间有着显著的不同。c++有构造函数和new操作符来对付内存模式问题，而且它们是语言的一部分。现在看来似乎让new操作符像stl容器使用allocater那样来工作是很有意义的。不过现在对问题的重要性不像stl出现之前那么显著了，因为在大多数场合，stl数据结构将让new失业。大部分人不再需要分配一个数组，因为stl在做这类事情上更为高效。要知道我对效率的迷信是无以复加的，可我在我的代码里从不使用new，汇编代码表明其效率比使用new时更高。随着stl的广泛使用，new会逐渐淡出江湖。而且stl永远都会记住回收内存，因为当一个容器，比如vector退出作用域时，它的析构函数被调用，会把容器里的所有东西都析构。你也不必再担心内存泄漏了。stl可以戏剧性地降低对于垃圾收集机制的需求。使用stl容器，你可以为所欲为，不用关心内存的管理，自有stl构造函数和析构函数来对付。<br /><br /><br />q：c++标准库子委员会正在制订标准名空间（namespace）和异常处理机制。stl类会有名空间吗，会抛出异<br />常吗？<br />a：是的。该委员会的几个成员正在考虑这件事，他们的工作非常卓越。<br /><br />q：现在的stl跟最终作为标准的stl会有多大不同？委员会会不会干预某些变化，新的设计会不会被严格地控<br />制起来？<br />a：多数人的意见看起来是不希望对stl做任何重要的改变。<br /><br />q：在成为标准之前，程序员们怎样的一些stl经验？<br />a：他们可以从butler.hpl.hp.com/stl当下stl头文件，在borland和ibm或其他足够强劲的的编译器中使用它。学习这种编程技术的唯一途径是编程，看看范例，试着用这种技术来编程。<br /><br />q：您正在和p. j. plauger合作一本stl的书。那本书的重点是什么？什么时候面世？<br />a：计划95年夏天面世，重点是对stl实现技术的详解，跟他那本标准c库实现和标准c++库实现的书类似。他是<br />这本书的第一作者。该书可以作为stl的参考手册。我希望跟bjarne合作另写一本书，在c++/stl背景下介绍语言与库的交互作用。<br /><br />   好多工作都等着要做。为了stl的成功，人们需要对这种编程技术进行更多的试验性研究，更多的文章和书籍应该对此提供帮助。要准备开设此类课程，写一些入门指南，开发一些工具帮助人们漫游stl库。stl是一个<br />框架，应该有好的工具来帮助使用这个框架。<br />   （译者注：他说这番话时，并没有预计到在接下来的几年里会发生什么。由于internet的大爆炸和java、vb、delphi等语言的巨大成功，工业界的重心一下子从经典的软件工程领域转移到internet上。再加上标准c++直到98年才制订，完全符合要求的编译器直到现在都还没有出现，stl并没有立刻成为人们心中的关注焦点。他提到的那本书也迟迟不能问世，直到前几天（2001年元旦之后），这本众人久已期盼的书终于问世，由p. j. plauger, alexander stepanov, meng lee, david musser四大高手联手奉献，prentice hall出版。不过该书主要关注的是stl的实现技术，不适用于普通程序员。<br /><br />     另外就p. j. plauger做一个简介：其人是标准c中stdio库的早期实现者之一，91年的一本关于标准c库的书使他名满天下。他现在是c/c++ use's journal的主编，与microsoft保持着良好的，甚至是过分亲密的关系，visual c++中的stl和其他的一些内容就是出自他的那只生花妙笔。不过由于跟ms的关系已经影响到了他的中立形象，现在有不少人对他有意见。<br /><br />     至于stepanov想象中的那本与stroustrup的书，起码目前是没听说。其实这两位都是典型的编程圣手，跟ken thompson和dennis ritchie是一路的，懒得亲自写书，往往做个第二作者。如果作为第一作者，写出来的书肯定是学院味十足，跟标准文件似的，不适合一般程序员阅读。在计算机科学领域，编程圣手同时又是写作高手的人是凤毛麟角，最著名的可能是外星人d. e. knuth, c++领域里则首推前面提到的andrew koenig。可惜我们中国程序员无缘看到他的书。）<br /><br />q：通用编程跟oop之间有什么关系？<br />a：一句话，通用编程是oop基本思想的自然延续。什么是oop的基本思想呢？把组件的实现和接口分开，并且让组件具有多态性。不过，两者还是有根本的不同。oop强调在程序构造中语言要素的语法。你必须得继承，使用类，使用对象，对象传递消息。gp不关心你继承或是不继承，它的开端是分析产品的分类，有些什么种类，他们的行为如何。就是说，两件东西相等意味着什么？怎样正确地定义相等操作？不单单是相等操作那么简单，你往深处分析就会发现“相等”这个一般观念意味着两个对象部分，或者至少基本部分是相等的，据此我们就可以有一个通用的相等操作。再说对象的种类。假设存在一个顺序序列和一组对于顺序序列的操作。那么这些操作的语义是什么？从复杂度权衡的角度看，我们应该向用户提供什么样的顺序序列？该种序列上存在那些操作？那种排序是我们需要的？只有对这些组件的概念型分类搞清楚了，我们才能提到实现的问题：使用模板、继承还是宏？使用什么语言和技术？gp的基本观点是把抽象的软件组件和它们的行为用标准的分类学分类，出发点就是要建造真实的、高效的和不取决于语言的算法和数据结构。当然最终的载体还是语言，没有语言没法编程。stl使用c++，你也可以用ada来实现，用其他的语言来实现也行，结果会有所不同，但基本的东西是一样的。到处都要用到二分查找和排序，而这就是人们正在做的。对于容器的语义，不同的语言会带来轻微的不同。但是基本的区别很清楚是gp所依存的语义，以及语义分解。例如，我们决定需要一个组件swap，然后指出这个组件在不同的语言中如果工作。显然重点是语义以及语义分类。而oop所强调的（我认为是过分强调的）是清楚的定义类之间的层次关系。oop告诉了你如何建立层次关系，却没有告诉你这些关系的实质。<br />   （这段不太好理解，有一些术语可能要过一段时间才会有合适的中文翻译——译者）<br /><br />q：您对stl和gp的未来怎么看?<br />a：我刚才提到过，程序员们的梦想是拥有一个标准的组件仓库，其中的组件都具有良好的、易于理解的和标准的接口。为了达成这一点，gp需要有一门专门的科学来作为基础和支柱。stl在某种程度上开始了这项工作，它对于某些基本的组件进行了语义上的分类。我们要在这上面下更多的功夫，目标是要将软件工程从一种手工艺技术转化为工程学科。这需要一门对于基本概念的分类学，以及一些关于这些基本概念的定理，这些定理必须是容易理解和掌握的，每一个程序员即使不能很清楚的知道这些定理，也能正确地使用它。很多人根本不知道交换律，但只要上过学的人都知道2+5等于5+2。我希望所有的程序员都能学习一些基本的语义属性和基本操作：赋值意味着什么？相等意味着什么？怎样建立数据结构，等等。<br /><br />   当前，c++是gp的最佳载体。我试过其他的语言，最后还是c++最理想地达成了抽象和高效的统一。但是我觉得可能设计出一种语言，基于c和很多c++的卓越思想，而又更适合于gp。它没有c++的一些缺陷，特别是不会像c++一样庞大。stl处理的东西是概念，什么是迭代子，不是类，不是类型，是概念。说得更正式一些，这是bourbaki所说的结构类型（structure type），是逻辑学家所说的理念（theory），或是类型理论学派的人所说的种类（sort），这种东西在c++里没有语言层面上的对应物（原文是incarnation，直译为肉身——译者），但是可以有。你可以拥有一种语言，使用它你可以探讨概念，精化概念，最终用一种非常“程序化”（programmatic，直译为节目的，在这里是指符合程序员习惯的——译者）的手段把它们转化为类。当然确实有一些语言能处理种类（sorts），但是当你想排序（sort）时它们没什么用处。我们能够有一种语言，用它我们能定义叫做foward iterator（前向迭代子）的东西，在stl里这是个概念，没有c++对应物。然后我们可以从forword iterator中发展出bidirectional iterator（双向迭代子），再发展出random iterator。可能设计一种语言大为简化gp，我完全相信该语言足够高效，其机器模型与c/c++充分接近。我完全相信能够设计出一种语言，一方面尽可能地靠近机器层面以达成绝对的高效，另一方面能够处理非常抽象化的实体。我认为该语言的抽象性能够超过c++，同时又与底层的机器之间契合得天衣无缝。我认为gp会影响到语言的研究方向，我们会有适于gp的实用语言。从这些话中你应该能猜出我下一步的计划。<br /><br />mengyan<br />译于2001年1月<br /></font>
		</div>
<img src ="http://www.cppblog.com/zerolee/aggbug/12230.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">仄洛</a> 2006-09-10 20:52 <a href="http://www.cppblog.com/zerolee/archive/2006/09/10/12230.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>