<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-862949426938573101</id><updated>2012-02-12T19:51:41.639+08:00</updated><category term='walker'/><category term='fiction'/><category term='progamming'/><category term='work'/><category term='software'/><category term='family'/><category term='thinking'/><title type='text'>杨贵福的blog</title><subtitle type='html'>重剑无锋，大巧不工。</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default?start-index=101&amp;max-results=100'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>1238</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-5373938088735743627</id><published>2012-02-11T00:19:00.001+08:00</published><updated>2012-02-11T00:19:52.599+08:00</updated><title type='text'>台湾掠影</title><content type='html'>台湾掠影&lt;p&gt;我们都读过不少对台湾版的资料，对岸很文艺把网上邻居译成了网上芳邻，把鼠&lt;br&gt;标称为滑鼠，把软件称为软体。我们早已熟知。不过，我真正新眼看到出售&amp;quot;软&lt;br&gt;体&amp;quot;，第一反应仍然是蜗牛贝壳之类的&amp;quot;软体&amp;quot;动物。&lt;p&gt;前几天，单位组织台湾游，分成两组，我在前一半，另一半现在还没回来。很多&lt;br&gt;体会，很多也与计算机没啥关系，絮絮叨叨回顾一下吧。&lt;p&gt;与前十几年或更早的旅游已经不同，大家现在不再捎带大宗的电器了，购买的多&lt;br&gt;是土特产，当地的小吃什么的。如果不提台湾二字，可能想不到目的地是个发达&lt;br&gt;地区，更像是农村风俗游。有位上点岁数的同事说，以前捎菲利蒲的随身听的很&lt;br&gt;多。他不经意地把菲利蒲称为菲利蒲斯，是不是像有些老一辈的官宦子弟把味素&lt;br&gt;称为味之素？回程的时候，行李箱里最多的，是绿豆皇、凤犁酥什么的，烟和酒&lt;br&gt;也不多，说是台湾的烟抽不惯，酒也不太对路。&lt;p&gt;所以整个行程，基本是在观景和民风，购物不怎么受欢迎，尤其是不受男士欢迎。&lt;p&gt;这可能反映了在经济上，我们确实越来越有底气了。评论修某段路桥的时候，当&lt;br&gt;地导游提到，由于没有钱，新的工程停停修修，旧的用了很多年，说如果在大陆&lt;br&gt;就不会有这个问题。言下之意，你们真的很有钱呐。&lt;p&gt;风景，像高楼、温泉、大山，都太小家子气了，也没啥，不提出罢。连当地导游&lt;br&gt;自己都说，与咱们的名山大川比起来，不值一提。&lt;p&gt;岛内的高山也有3000多米，似乎还有近4000米的，都在东部，在太平洋旁边很短&lt;br&gt;的距离迅速拔起，真正爬起来，应该相当峻峭。不过此次没有机会亲身实践。徒&lt;br&gt;步了一段蒋经国当年带老兵们修的栈道一般的公路，周围全是坚硬的大理石，立&lt;br&gt;陡石崖，很险。&lt;p&gt;阿里山也3000以上，步行了一路公路，张老师和封老师认为有高山反应。我认为&lt;br&gt;他们是累的。&lt;p&gt;日月潭海拔也不低，远处的山上也有浮云。不过，甚为遗憾的是，日月潭完全没&lt;br&gt;有一点雄伟，与当年课本上留下的印象根本不符。潭水一倾，看着也就净月潭那&lt;br&gt;么大吧。这还是水面上升以后的，先前中间有座山，现在是几间房子大小的岛礁。&lt;br&gt;怪不得净月潭和日月潭能结成姐妹湖，发起人看来两湖都见过了，差别不大。&lt;p&gt;在阿里山坐了小火车，还从一片森林中穿过，鬼子当年砍树的痕迹尤在。一片片&lt;br&gt;大树盘根错节，合抱以上的大树，当以千计，这些是没砍光的。据说，鬼子砍了&lt;br&gt;很多树以后，出现了一些灵异事件，他们特意建了一座塔，叫树灵塔，不知道是&lt;br&gt;想镇一下，还是祈福。&lt;p&gt;资源，数不清的矿藏和森林。遥想当年鬼子占据的时候，一定眼睛都蓝了。&lt;p&gt;阿里山地区，据说有不少民族，是高山族又细分的结果。其中有一个民族，就是&lt;br&gt;新电影 赛德克・巴莱 那个抗日的民族。此区域的民族似乎尽皆好武，风不调雨&lt;br&gt;不顺的时候要祭天的时候，就杀个敌人或外乡人。有个民族就被周围打得不行，&lt;br&gt;狩猎的时候跟着一头白鹿跑到了日月潭。这就是现在的邵族。邵族一共五六百&lt;br&gt;人，其中纯血的，二百多人，正广招男女，愿意去的从速，生一个孩子当地政府&lt;br&gt;给发似乎好几万元。&lt;p&gt;几百人的民族，一方面让人觉得像是在作假，另一方面，也似乎说明了当地对不&lt;br&gt;同文化的包容和认同--不是强调求同，而是强调存异。在芬兰的时候，几个人谈&lt;br&gt;起新疆的文化建设。有人提到：中国人怎么能不认识汉字呢。提到这观点的这&lt;br&gt;位，是久在芬兰的汉人。而另一个背景是，芬兰有两种官方文字，一种是芬兰&lt;br&gt;语，如果我没记错，97%的人口讲芬兰语，而其他仅3%的人口，为了他们，官方&lt;br&gt;语言还有一种是瑞典语。&lt;p&gt;所谓包容，不是要求另一批人跟我们一定相同，甚至不是允许他们与我们的差&lt;br&gt;异，而是，尊重甚至刻意保护这种差异。&lt;p&gt;唐某位太子，最喜欢玩的，是自己装死，让跟班大臣们模仿突厥人的葬礼礼仪，&lt;br&gt;把自己的脸用刀划上口子。这是大唐。只有足够的自信，我们才会不怕嘲笑，不&lt;br&gt;怕去接纳异文化，而不担心淹灭了自己。&lt;p&gt;扯远了。&lt;p&gt;阿里山和日月潭，负了盛名。在我看来，不过如此。但是台湾东部的太平洋和高&lt;br&gt;山，真是让人看不过瘾。我以前看过几次大海，都是风平浪静的。在大连附近，&lt;br&gt;有一次大雨里看涨潮，以为已经算是状观，觉得更雄奇的都是诗人作家们夸张扯&lt;br&gt;淡的。此去台湾，远远几百米看到了，高于一人的浪不断拍向岸边，然后摔得粉&lt;br&gt;碎；风声呼啸，让人不能站直腰行走；往远处看，太平洋分成很多层次，各种深&lt;br&gt;沉的颜色勾勒出海底迅速深陷的地貌；看看身后近在眼前的高山隐在云雾里，可&lt;br&gt;以知道海下会是如何陡峭。&lt;p&gt;有一处景点是珊瑚形成的很多小丘，当地导游说：这里原来是海下，地壳变迁逐&lt;br&gt;渐抬升成这样。他说，我们可以想像自己是鱼，正在水里珊瑚之间游着。抬头看&lt;br&gt;蓝天的些许碎片在亚热带繁茂的植物遮挡所剩无几，我们弓腰走过的小径两侧满&lt;br&gt;眼深绿，脚下不经常踩踏处全是苔鲜。我不禁想起Nimo生活的场景，水下也就是&lt;br&gt;这样吧。&lt;p&gt;说到这里，感受尤其是当地导游在内的台湾人民，人文素养可能确实普遍高于我&lt;br&gt;们。当地导游在解说和聊天时，常出口成章，成语和典故的引用，信手拈来，我&lt;br&gt;们所不及也。说起来，这位导游姓岳，是岳飞的第33（？）代子孙，回来认过家&lt;br&gt;谱的。也曾经身为武将，当过团长。整个导游其间，没有信口开合介绍些道听途&lt;br&gt;说扯谈的传闻，也没有问&amp;quot;你们看这块石头像不像个七仙女或猪八戒&amp;quot;这样的傻问&lt;br&gt;题。&lt;p&gt;在高雄的一家书店，百货商场里的，想来不是特别大不是特别综合的书店里，尚&lt;br&gt;且有一列专柜，是留给自然科学和科普的。从书店里的计算机书看来，很多ASP之&lt;br&gt;类的，应该不是特别大的书店，而自然科学类书籍之多，恐怕还远在我们很多省&lt;br&gt;会城市的书店之上吧。&lt;p&gt;我想起有些人提到中国足球为什么臭的时候，论据之一是我们有多么少的足球场&lt;br&gt;和基础群众。我想，计算机的发达，也是同样，文化素养的提高、基础群众的培&lt;br&gt;养，还需要时间吧。好在，经济的发达，同时也在 (即使缓慢地)带来文化的提&lt;br&gt;高。很久以前，我们就知道台湾的那些城镇的名字，从大富翁游戏里，从那些小&lt;br&gt;说里，比如淡水，比如太鲁阁。而这些年，台湾随经济的衰退，文化输出似乎也&lt;br&gt;在衰退。我们每天埋汰大陆的本土电影，但是并不伴随对港台电影的推崇了。前&lt;br&gt;几天我看了个香港的片子，唉，仍然是80年代末录相厅里的感觉，而且还不是你&lt;br&gt;能记住名字和演员的那种。&lt;p&gt;书店跟我们差不多，读书的人都不是很多。所不同者，我见到有人坐在地上看&lt;br&gt;书，长春未见过，可以地上太凉，北京西单图书大厦里倒是有不少坐地上的。&lt;p&gt;中文书都是繁体，这个早有心理准备，没有想到的有两件事。一是营业员居然不&lt;br&gt;知道大陆人民大多能读繁体，而仅仅不会写而已，她为我们认识&amp;quot;两种&amp;quot;文字而表&lt;br&gt;示很惊讶。二是居然很多书不仅繁体，而且竖版。繁体读起来略有不适而已，竖&lt;br&gt;版现在可能很多人不容易消受了吧。从书目看来，尤其人文类的显得有些文化气&lt;br&gt;息的，似乎更喜欢做成竖版的，可能是竖版暗示着更有文化？&lt;p&gt;核算成人民币，书略贵，但也不算贵得离谱。买了几本留作纪念。&lt;p&gt;在南部，绿党老家，我以为人民会比较排外，结果也没有遇到。跟出租车司机聊&lt;br&gt;天，他问我们，&amp;quot;是从对岸来的吧&amp;quot;，我们没听清，他又问，&amp;quot;同胞吧&amp;quot;。沟通完全&lt;br&gt;没有问题，令人感叹，几十年间语言的变化其实比想像中要小很多。&lt;p&gt;台湾旅行仍未对所有大陆城市开放自由行，许多城市的人只能跟团从这里跑到那&lt;br&gt;里，购物观光，没有机会停下来细致地感受。期待，有一天能自由地在台湾地土&lt;br&gt;地上徒步，任我行止；期待，有一天能自由地在所有的土地上徒步，任我行止。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-5373938088735743627?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/5373938088735743627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=5373938088735743627' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/5373938088735743627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/5373938088735743627'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2012/02/blog-post.html' title='台湾掠影'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-8616674343079084076</id><published>2012-01-26T15:42:00.001+08:00</published><updated>2012-01-26T15:42:20.058+08:00</updated><title type='text'>整理书架子</title><content type='html'>整理书架子&lt;br&gt;从除夕那天，我开始整理书架子。有两年没整了，自从上次挪书架子，把书都卸下来，突然有什么任务，没有时间按类别放回去，后来的书有很多就直接堆起来。&lt;br&gt;混乱一旦开始，就会愈演愈烈，直到，最近决定全都重新整理一遍。&lt;br&gt;整理书架是个体力活，同时也是梳理知识结构和学习过程的思考。&lt;br&gt;这几年，似乎一共整理了四五次吧，一般是搬家以后，或者乱得自己受不了。最初的一批书，是大学毕业的时候幸存的几本，教材加上特别钟爱的，没有卖掉。由于我彼此那么痛恨自己的专业，以致于把绝大部分教材都扔掉了。过了很多年，或者说，越是到了后来，我越发现，本科的学习所形成的世界观和方法论，深入到了骨髓，深入到你自己都不知道它们在那里。一个不太好的比喻，就像有些小资口声声谈西方思想什么的，但是骨子里，如果你深挖，却发现他们比上位的那些人更加东方。这里的东方，丝毫不含神秘哲学或者我们的文化的褒义。&lt;br&gt;这第一批书，几乎都是理工类的。&lt;br&gt;再后来的一批书，是从旧书市场上买到的，有各种品相。大多暗黄了，书页卷曲。这些书，好多在购买前就已经看过了，有些知识甚至都已过时，尤其是小时候就特别想拥有的那种，虽然借着看过几遍，仍然买了珍藏。这第二批书，大部分是人文类的，持续了好多年，有一些和第三批书的购买时间重叠，甚至延续到那以后。&lt;br&gt;第三批书，是读研究生期间，到了期末，突然说是有一笔经费，可以买U盘，或者买书。我全都用来买书了。这一批书中最重要的是计算机网络方面的几本专著。当时，我仍然未能清楚地知道，网络和系统管理&lt;br&gt;(现在流行叫做系维)的知识结构和职业前途与程序员是完全不同的。最终，计算机网络与通信，130厘米左右；操作系统45厘米左右。&lt;br&gt;第三批书当中，包括我最初读的英文原著，Douglas E. Comer的 计算机网络与因特网，和 Andrew S.&lt;br&gt;Tanenbaum的现代操作系统，封皮上有马戏团的那个。如果不算文档和电子版，这两本是最初读物。&lt;br&gt;很多人读书需要心态，或者心情，或者油墨的清香，或者纸张的声音。那纯粹是家里有钱惯出的...特质。读书所需要的，不过是一个能站立或坐下的地方，然后，就是书本身。至于它的材质，是纸的，电子的，印刷质量如何，在能找到书就高呼万岁的时候，这些统统不必考虑。&lt;br&gt;那两本书，是在不上课的时候，一页一页慢慢看完的。我的英语那个时候极差，不是说现在有多么好，那时我差到除了英文文档，基本看不懂别的什么。英语老师建议的小说啦电影啦新闻啦，没一样能流畅看明白的。不能看懂四级阅读，但是能阅读英文文献，其实也没啥奇怪的，因为二者所需要的词汇量的范围大不相同。后来单词量增长的时候，我注意到，很多单词，我都是首先知道它在计算机领域的含义。&lt;br&gt;读书，我们所需要的，只是几个小时的时间。&lt;br&gt;以后的书，基本不是成批购买了，需要哪方面的，就添置点啥，逐渐多起来。软件工程的，175厘米左右；文学类的，大约两个175厘米。&lt;br&gt;就阅读的时间分配，我在软件工程方面分配的时间远多于文学类的，尽管文学类的量大约是软件工程的二倍。这也是个有意思的事情，为什么理工学生的工资要比文学类的高，因为第一理工类学生花费了更多的时间来学习。第二，如果仅仅是浏览观赏性地阅读的话，读文学类的书是一种休息，没有人应该为你休息付钱的。而即使是观赏地阅读理工类书籍，即使那最终确实是一种愉悦的话，也是一种劳累的愉悦--这跟在健身房的努力差不多。&lt;br&gt;我曾经计划读某小说好几年，后来几天就看完了。那是我第一次发现，啊，以完全没有注意到，原来这两种不同的作品的阅读速度差别如此之大。&lt;br&gt;上述关于文学类学生工资的讨论，不包括那种牛到可以指导别人观赏，或者创造出作品来供别人观赏的同学。不幸的是，从现在的影视作品或者评论来看，文学类同学应该可以达到更高的水平，而不仅是自己没事欣赏一下自己的快乐。&lt;br&gt;是的，我们的理工很糟烂，可能除了这个词，不足以形容我们目前的水平在世界的地位；文学类，如果用糟烂这个词来形容，是对糟烂这个词的侮辱。&lt;br&gt;整理书架子，也回顾了一些知识学习的艰辛。有90厘米纯粹各种计算机语言的书，还有同等长度的书，是用这些语言调用网络、API、MFC什么的。后者不包括数据库调用之类的，这些基本上只有电子文档，而没有书籍。当年为了学习网络编程&lt;br&gt;(不是指 web programming，是指socket)&lt;br&gt;，MFC和API，也着实花了不少工夫，但是俱往矣。这些知识一旦获取了，如果不需要进一步深入研究的话，它就只是知识，而不是方法。&lt;br&gt;一大悲哀。我们要花很多时间，才能知道，有一些东西，恰恰不是你想要的；而如果你不花上这么多时间，你根本无法知道那是什么，更不必说了解那是不是你的目标。&lt;br&gt;而那个时间，你往往找不到一个人能够和愿意告诉你。即使有那样一个人在你的身份，年少轻狂，你也不一定就会相信。&lt;br&gt;然后，很多个小时，很多年，就这样流逝。再也不会重来。&lt;br&gt;要整理书架子的一个原因，我发现如果书堆在那，根本就想不起来看它，甚至忘了它的存在，或者记得有这本书，但是却找不到它。很多年过去以后，我发现，很多书需要重读，一遍一遍重读，每一次，你可能会有新的收获。那些需要重读的书，恰恰与前面提到的api,mfc的使用那种书不同，它们是历久弥新的。每一次读，你都有不同的动机，又深入地了解了作者这么写这么说的原因。&lt;br&gt;就像锻炼身体，只有你亲自流汗，然后才能了解，为什么教练或书里说，要这样动作，要避免那样，为什么呼吸而不是别的，才是最重要的。&lt;br&gt;就像大三和弦是明亮的，小三和弦是暗淡的，甚至是蓝色的绿色的。你不亲自去听，跟你说了也是白扯。有很多书，很多特别好的话，在我这里，就这么白扯过去了。时常感叹，如果当年就能明白那些，该有多好啊。&lt;br&gt;同学们现在都喜欢看视频了，喜欢在网上找个贴子。但是，真正的知识，尤其是深刻的那些，且不说需要训练才能掌握的，往往不可能容纳在一个贴子的长度之中。这就是几十年来，也许更久&lt;br&gt;(？)，学者们提到的浮噪。我们浮噪到马上就要看到结果，马上就要得益，马上就要看到作用。&lt;br&gt;我们在网络里跑来跑去，不断去点击5分钟以下的小视频。我们看各种大片的特效。我们不断地转移注意力。我们从成年人，退化为三五岁的孩子，注意力只能保持三五分钟，甚至更短。又或者，我们中的一些希望得到成年人权利的人，从来也没有成年过，无所谓退化。&lt;br&gt;迅速反应，而不沉思，这正是动物而非人类的特性。&lt;br&gt;我把那些读过的书，收在书架上。开始制定漫长的计划，很多，都要重读一遍。&lt;br&gt;我抚摸那些书页，回想我曾经阅读它们的时光。&lt;br&gt;有一本，C++ Primer。那一年除夕的晚上，我坐火车返回通化。整个车厢里只有三两个人，还包括列车员。我一直低头读这本平时没有时间看的大部头。从上次读到的地方开始，几个小时，我读了平时几天几个月的页数。&lt;br&gt;不能做实验，也不能上网。我只能用纸记下所有的疑问，记下所有的收获。&lt;br&gt;晚上十点左右，外面漆黑的天空开始亮起焰火，在车轮的隆隆声里，那些光亮此起彼伏。C++ Primer，就是在这时读完了最主要的部分。&lt;br&gt;有一本，ZigBee技术实践教程，包师弟借给我的。前两天的某夜，我独坐在桌旁，喝光了咖啡，次序翻过那些书页。不能做实验，也不能上网，猜测作者的意思，用纸记下疑问和收获。凌晨五点的时候，天边开始有了亮光，书还剩下一章。&lt;br&gt;这个时候，我们才知道，那些短暂就能获得的快乐，并非我们真正想要的，它们也会瞬间就消失。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-8616674343079084076?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/8616674343079084076/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=8616674343079084076' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/8616674343079084076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/8616674343079084076'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2012/01/blog-post_26.html' title='整理书架子'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-6064454652610964767</id><published>2012-01-17T17:25:00.001+08:00</published><updated>2012-01-17T17:25:35.235+08:00</updated><title type='text'>音程示范歌曲，lilypond example</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-1VK9LF30fCw/TxU-kFe13CI/AAAAAAAANAA/ScrDRB0BRIk/s1600/screenshot_20120117-172301-735236.png"&gt;&lt;img src="http://1.bp.blogspot.com/-1VK9LF30fCw/TxU-kFe13CI/AAAAAAAANAA/ScrDRB0BRIk/s320/screenshot_20120117-172301-735236.png"  border="0" alt="" id="BLOGGER_PHOTO_ID_5698529693174979618" /&gt;&lt;/a&gt;&lt;/p&gt;音程示范歌曲，lilypond example&lt;br&gt;下面的文件是音程示范歌曲，lilypond源代码，可以生成pdf文件，五线谱带歌词的。&lt;br&gt;音程，比如，用简谱表示1=C时，1和2的距离与5和6的距离是相等的，3和4的距离与7和1的距离是相等的。&lt;br&gt;lilypond [&lt;a href="http://lilypond.org/"&gt;http://lilypond.org/&lt;/a&gt;]&lt;br&gt;是著名的音乐engraving程序。有人把engraving翻译成雕版，这也正是这个词的本意。在这里，并不特别强调采用这种工艺，而是表达一般地指美丽漂亮的印刷乐谱的工具。&lt;br&gt;希望对其他也跑调的同学有所帮助，也可以作为lilypond的示例文件，语法忘了的时候参考一段。&lt;br&gt;又想起了刘俐俐和张绍刚的事件。&lt;br&gt;有同学评论，大致意思是这样的：当Boss问到问题的时候，都是有动机的，你应该小心作答。比如，领导问，你爱好些什么啊。你千万别说什么英雄双行体，那表明你不合群。你应该说，我喜欢二人传，这表明你尊重民间艺术，或者品味低下；你应该说，我喜欢歌剧，这表明你品味高雅，或者崇洋媚外。&lt;br&gt;一个人喜欢什么，怎么可能会因为问的人不同而有所变化？唯一的可能就是假装，或者你无法判定他是不是假装[参见《士兵突击》中的成才同志。同志，呵呵。]。&lt;br&gt;的确，有些人喜欢下属 (如果有这么个阶级，并且因为经济基础而能决定上层建筑甚至人格的话)迎和--即，你说的内容并不重要，但是要对上级的胃口。很多对白都有背后的意思[参见《红楼梦》]，虽然很累，但是揣摩有时必不可少。不过，这并非意味着你揣摩完了就一定要赞一个，即使从功利的角度看，也并非每个领导都好这一口。你注意到网上那些对张的反对的声音了么，并非每个看起来像愤怒青年的都是loser，很有一些是winner，这从行文风格和内容可以看出。你可以选择和这样的人合作。&lt;br&gt;所谓&amp;quot;求职&amp;quot;，并不像这两个字求暗示的，是&amp;quot;求&amp;quot;什么人&amp;quot;求&amp;quot;什么东西，无论市场供需如何，那也只是&amp;quot;找&amp;quot;一份工作，而不是&amp;quot;乞求&amp;quot;。有些女士的态度在这时非常正确，她们说，&amp;quot;就是世界上只剩你一个男人了，也绝不嫁你。&amp;quot;&lt;br&gt;求职确实是有底线的，那就是尊严。如果现在我低头从你胯下钻过，那么，今后呢？我们可以表达对领导的尊重，毕竟工作中的事务的决定权需要尊重地执行，但是并非一定要向他们展示假的自己。有时，所要做的是，告诉他们，我的这些爱好，与工作无关。我只是来工作，又不是卖身为奴；我热爱我工作的内容，但是不必也同时热爱领导你。&lt;br&gt;说到这里想起博士面试的时候，主任问的一句话，&amp;quot;听说你们搞计算机的都喜欢玩游戏，你玩不？&amp;quot;&lt;br&gt;我心想，玩啊，很爱玩，不爱玩游戏的，而爱计算机的没几个啊。&lt;br&gt;我的答复是非常缓慢地说：偶尔。&lt;br&gt;我庆幸这个世界上有程序设计和自然科学，它们的评判者高于人类和权力。我庆幸这世界上有音乐这样的东西，它的美丑虽然可能大家各执一词，却都是纯净的。&lt;br&gt;关于程序设计，补充解释一句。人类思考的规则，是人类发现的，却并非由人类所规定。对不，偶像？&lt;br&gt;&amp;quot;安能摧眉折腰事权贵，使我不得开心颜。&amp;quot;这句话我以前引用过一次，当时在人事处工作，处长问，&amp;quot;杨啊，你有没有座佑铭&amp;quot;，然后我傻了吧唧地答了这么一句。所以，对读这贴子里知道典故的老家伙们来说，现在再引用容易笑场。&lt;br&gt;我补充一句吧，那些用来威胁我的，我愿意全部放弃。而剩下的，编程序，就像自己写作，在心里唱歌，谁又能禁止得了。&lt;br&gt;让我们歌唱，由关注音律、法则、美，不要关心那些狗P&amp;quot;柯老师&amp;quot;们的看法。&lt;br&gt;\version &amp;quot;2.12.3&amp;quot;&lt;br&gt;\header{&amp;#160; title = &amp;quot;音程示范歌曲&amp;quot;}&lt;br&gt;% 鲜花曾告诉（3 4）我你怎样（1 2 1）走过 小二度 大二度 《同一首歌》&lt;br&gt;\markup {&amp;#160; 上行}&lt;br&gt;\markup {&amp;#160; 大二度 同一首歌}&lt;br&gt;{\time 4/4&amp;#160;\huge&amp;#160;\set fontSize = #3&amp;#160;g2 c&amp;#39;4 d&amp;#39;4 | e&amp;#39;4. f&amp;#39;8 e&amp;#39;4&lt;br&gt;c&amp;#39;4_\thumb |&amp;#160;d&amp;#39;2_\thumb c&amp;#39;4_\thumb a4 | c&amp;#39;1 |}\addlyrics { 鲜 花 曾 | 告 诉&lt;br&gt;我 你 &amp;#160;| 怎 样 走 | 过 }&lt;br&gt;\markup {&amp;#160; 小二度 同一首歌}&lt;br&gt;{\time 4/4&amp;#160;\huge&amp;#160;\set fontSize = #3&amp;#160;g2 c&amp;#39;4 d&amp;#39;4 | e&amp;#39;4._\thumb&lt;br&gt;f&amp;#39;8_\thumb e&amp;#39;4 c&amp;#39;4 |&amp;#160;d&amp;#39;2 c&amp;#39;4 a4 | c&amp;#39;1 |}\addlyrics { 鲜 花 曾 | 告 诉 我 你&lt;br&gt;| 怎 样 走 | 过 }&lt;p&gt;% 不要（5 6）问，不要说 &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;大二度 &amp;#160; &amp;#160; 《祝福》&lt;br&gt;\markup {&amp;#160; 大二度 祝福}&lt;br&gt;{\time 4/4&amp;#160;\huge&amp;#160;\set fontSize = #3&amp;#160;c&amp;#39;2.&amp;#160;&amp;#160;g8_\thumb a8_\thumb | c&amp;#39;4&lt;br&gt;d&amp;#39;8 e&amp;#39;8 d&amp;#39;4 e&amp;#39;8 g&amp;#39;8}\addlyrics {你。 不 要 | 问 不 要 说 一 切 }&lt;br&gt;% 大风从坡上刮过（5 6） &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;大二度 &amp;#160; &amp;#160; &amp;#160;《黄土高坡》&lt;br&gt;\markup {&amp;#160; 大二度上行 黄土高坡}&lt;br&gt;{\time &amp;#160;4/4&amp;#160;\huge&amp;#160;\set fontSize = #3&amp;#160;f&amp;#39;4 f&amp;#39;8. e&amp;#39;8 d&amp;#39;8 d&amp;#39;8&amp;#160;&amp;#160;c&amp;#39;8_\thumb&lt;br&gt;d&amp;#39;8_\thumb}\addlyrics { 大 风 从 坡 上 刮 过 }&lt;br&gt;% 我们（3 5）坐在高高的谷堆旁边 小三度 《听妈妈讲那过去的事情》\markup {小三度上行 听妈妈讲那过去的事情}{\time&lt;br&gt;2/4&amp;#160;\huge&amp;#160;\set fontSize = #3&amp;#160;e&amp;#39;8_\thumb&amp;#160;g&amp;#39;8_\thumb&amp;#160;a&amp;#39;8 g&amp;#39;8 c&amp;#39;&amp;#39;4 b&amp;#39;8.&lt;br&gt;a&amp;#39;16&amp;#160;g&amp;#39;8 a&amp;#39;8 g&amp;#39;8 e&amp;#39;8 ~ e&amp;#39;1&lt;br&gt;}\addlyrics { 我 们 坐 在 高 高 的 谷 堆 旁 边 }&lt;p&gt;% 长亭外，古道（6 1[高]）边 &amp;#160; &amp;#160; &amp;#160; &amp;#160;小三度 &amp;#160; &amp;#160; 《送别》&lt;br&gt;\markup {小三度上行 送别}&lt;br&gt;{\time &amp;#160;4/4&amp;#160;\huge&amp;#160;\set fontSize = #3&amp;#160;g&amp;#39;4 e&amp;#39;8 g&amp;#39;8 c&amp;#39;&amp;#39;2&amp;#160;a&amp;#39;4 c&amp;#39;&amp;#39;4_\thumb&lt;br&gt;g&amp;#39;2_\thumb}\addlyrics { 长 亭 - 外 古 道 边 }&lt;br&gt;% 明天你是否会想起（5 7） &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;大三度 &amp;#160; &amp;#160; 《同桌的你》&lt;br&gt;\markup {大三度上行 同桌的你}&lt;br&gt;{\time &amp;#160;6/8&amp;#160;\huge&amp;#160;\set fontSize = #3&amp;#160;g&amp;#39;8 g&amp;#39;8 g&amp;#39;8 g&amp;#39;8 e&amp;#39;8 f&amp;#39;8&lt;br&gt;g&amp;#39;4._\thumb b&amp;#39;&amp;#39;4._\thumb}\addlyrics { 明 天 你 是 否 会 想 起 }&lt;br&gt;% 月亮在白（2 5）莲花般的云朵里 &amp;#160; &amp;#160;纯四度 &amp;#160; &amp;#160;《听妈妈讲那过去的事情》&lt;br&gt;\markup {纯四度上行 听妈妈讲那过去的事情}&lt;br&gt;{\time &amp;#160;2/4&amp;#160;\huge&amp;#160;\set fontSize = #3&amp;#160;s4 a&amp;#39;4 | g&amp;#39;4. e&amp;#39;8 | d&amp;#39;8._\thumb&lt;br&gt;g&amp;#39;16_\thumb e&amp;#39;8 g&amp;#39;8 | d&amp;#39;8 c&amp;#39;8 a8 c&amp;#39;8|}\addlyrics { 月 亮 在 白 - 莲 花 般 的 云&lt;br&gt;朵 }&lt;br&gt;% 风中（3 6）有朵雨做的云 纯四度 《风中有朵雨做的云》&lt;br&gt;\markup {纯四度上行 风中有朵雨做的云}&lt;br&gt;{\time &amp;#160;4/4&amp;#160;\huge&amp;#160;\set fontSize = #3&amp;#160;g&amp;#39;4_\thumb a&amp;#39;4_\thumb a&amp;#39;4 e&amp;#39;4 |&lt;br&gt;g&amp;#39;4 b&amp;#39;8 g&amp;#39;8 b&amp;#39;2 |&amp;#160;}\addlyrics { 风 中 有 朵 雨 做 的 云 }&lt;br&gt;% 也温暖不了你的视线（6 2[高]） &amp;#160; 纯四度 &amp;#160; &amp;#160;《吻别》&lt;br&gt;\markup {纯四度上行 吻别}&lt;br&gt;{\time &amp;#160;3/4&amp;#160;\huge&amp;#160;\set fontSize = #3&amp;#160;d&amp;#39; d&amp;#39;16 d&amp;#39;16 e&amp;#39;8 a16_\thumb&lt;br&gt;d&amp;#39;16_\thumb ~ d&amp;#39;4 r4&amp;#160;}\addlyrics { 不 了 你 的 视 线 }&lt;br&gt;% 天上的星星（3 6） &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; 纯四度 &amp;#160; &amp;#160; &amp;#160; &amp;#160;《鲁冰花》&lt;br&gt;\markup {纯四度上行 鲁冰花}&lt;br&gt;{\time &amp;#160;4/4&amp;#160;\huge&amp;#160;\set fontSize = #3&amp;#160;a&amp;#39;8 a&amp;#39;4 a&amp;#39;8 e&amp;#39;4_\thumb&lt;br&gt;a&amp;#39;4_\thumb}\addlyrics { 天 上 的 星 星 }&lt;br&gt;% 分给我快乐的往昔（6[低] 3） &amp;#160; &amp;#160; 纯五度 &amp;#160; &amp;#160; &amp;#160; 《睡在我上铺的兄弟》&lt;br&gt;\markup {纯五度 睡在我上铺的兄弟}&lt;br&gt;{\time &amp;#160;6/8&amp;#160;\huge&amp;#160;\set fontSize = #3&amp;#160;b8 b8 b8 b8 b8 g8 | g4._\thumb&lt;br&gt;e&amp;#39;4._\thumb |}\addlyrics { 分 给 我 快 乐 的 往 昔 }&lt;br&gt;\markup {————————}&lt;br&gt;% ————————% 下行% 夜（1 7）色茫茫 &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;小二度 &amp;#160; &amp;#160; 《明月千里寄相思》&lt;br&gt;\markup {小二度下行 明月千里寄相思}&lt;br&gt;{\time &amp;#160;4/4&amp;#160;\huge&amp;#160;\set fontSize = #3&amp;#160;s4 s4 s4 c&amp;#39;&amp;#39;8_\thumb b&amp;#39;8_\thumb |&lt;br&gt;a&amp;#39;4. g&amp;#39;8 e&amp;#39;8 d&amp;#39;8 e&amp;#39;4 |}\addlyrics { 夜 - 色 - 茫 - 茫 &amp;#160;}&lt;p&gt;% 难解百般愁相知爱意浓（1 7 6） &amp;#160; &amp;#160;小二度 &amp;#160; &amp;#160; 《相思风雨中》&lt;br&gt;\markup {小二度下行 大二度下行 相思风雨中}&lt;br&gt;{\time &amp;#160;4/4&amp;#160;\huge&amp;#160;\set fontSize = #3&amp;#160;a4 e&amp;#39;8 b&amp;#39;8 e&amp;#39;4 a4 | b&amp;#39;8. b&amp;#39;16 a&amp;#39;8&lt;br&gt;c&amp;#39;8_\thumb b8_\thumb a2_\thumb}\addlyrics { 难 解 百 般 愁 相 知 爱 意 浓 }&lt;p&gt;% 月亮（6 5）在白莲花般的云朵里 &amp;#160; &amp;#160;大二度 &amp;#160; &amp;#160;《听妈妈讲那过去的事情》&lt;br&gt;\markup {大二度下行 听妈妈讲那过去的事情}&lt;br&gt;{\time &amp;#160;2/4&amp;#160;\huge&amp;#160;\set fontSize = #3&amp;#160;s4 a&amp;#39;4_\thumb | g&amp;#39;4._\thumb e&amp;#39;8 |&lt;br&gt;d&amp;#39;8. g&amp;#39;16 e&amp;#39;8 g&amp;#39;8 | d&amp;#39;8 c&amp;#39;8 a8 c&amp;#39;8|}\addlyrics { 月 亮 在 白 - 莲 花 般 的 云 朵&lt;br&gt;}&lt;br&gt;% 愿心中永远留着我的笑容（1[高]6） 小三度 &amp;#160; &amp;#160;《祝福》&lt;br&gt;\markup {小三度下行 祝福}&lt;br&gt;{\time &amp;#160;4/4&amp;#160;\huge&amp;#160;\set fontSize = #3&amp;#160;s2 s4 d&amp;#39;8 d&amp;#39;8 | c&amp;#39;4 d&amp;#39;8 e&amp;#39;8 g&amp;#39;8&lt;br&gt;a&amp;#39;8 g&amp;#39;8 a&amp;#39;8 | c&amp;#39;&amp;#39;8._\thumb a&amp;#39;16_\thumb ~ a&amp;#39;2}\addlyrics { 愿 心 中 永 远 留&lt;br&gt;着 我 的 笑 容 }&lt;br&gt;% 高高的谷堆旁边（5 3） &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;小三度 &amp;#160; &amp;#160;《听妈妈讲那过去的事情》\markup {小三度下行&lt;br&gt;听妈妈讲那过去的事情}{\time &amp;#160;2/4&amp;#160;\huge&amp;#160;\set fontSize = #3&amp;#160;e&amp;#39;8&amp;#160;g&amp;#39;8&amp;#160;a&amp;#39;8 g&amp;#39;8 c&amp;#39;&amp;#39;4&lt;br&gt;b&amp;#39;8. a&amp;#39;16&amp;#160;g&amp;#39;8 a&amp;#39;8 g&amp;#39;8_\thumb e&amp;#39;8_\thumb ~ e&amp;#39;1}\addlyrics { 我 们 坐 在 高 高&lt;br&gt;的 谷 堆 旁 边 }&lt;br&gt;% 空独（7 5）眠的日子 &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;大三度 &amp;#160; &amp;#160; 《追梦人》\markup {大三度下行 追梦人}{\time &amp;#160;4/4&lt;br&gt;\huge&amp;#160;\set fontSize = #3&amp;#160;b&amp;#39;8_\thumb g&amp;#39;8_\thumb g&amp;#39;16 a&amp;#39;16 b&amp;#39;8&lt;br&gt;a&amp;#39;4}\addlyrics { 空 独 眠 的 日 子 }&lt;p&gt;% 风中有朵（6 3）雨做的云 &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;纯四度 &amp;#160; &amp;#160; 《风中有朵雨做的云》&lt;br&gt;\markup {纯四度下行 风中有朵雨做的云}&lt;br&gt;{\time &amp;#160;4/4&amp;#160;\huge&amp;#160;\set fontSize = #3&amp;#160;g&amp;#39;4 a&amp;#39;4 a&amp;#39;4_\thumb e&amp;#39;4_\thumb |&lt;br&gt;g&amp;#39;4 b&amp;#39;8 g&amp;#39;8 b&amp;#39;2 |&amp;#160;}\addlyrics { 风 中 有 朵 雨 做 的 云 }&lt;br&gt;% 狼山起，江山北望（3 6[低]） &amp;#160; &amp;#160; &amp;#160;纯五度 &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;《精忠报国》&lt;br&gt;\markup {纯五度下行 精忠报国}&lt;br&gt;{\time &amp;#160;4/4&amp;#160;\huge&amp;#160;\set fontSize = #3&amp;#160;a&amp;#39;4. g&amp;#39;8 e&amp;#39;4. b&amp;#39;8 | c&amp;#39;8 c&amp;#39;8 d&amp;#39;8&lt;br&gt;e&amp;#39;8_\thumb a2_\thumb |&amp;#160;}\addlyrics { 狼 烟 起 - 江 山 北 - 望 }&lt;br&gt;% 上行% 鲜花曾告诉（3 4）我你怎样（1 2 1）走过 小二度 大二度 《同一首歌》% 不要（5 6）问，不要说&lt;br&gt;大二度 &amp;#160; &amp;#160; 《祝福》&amp;#160;% 大风从坡上刮过（5 6） &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;大二度 &amp;#160; &amp;#160; &amp;#160;《黄土高坡》% 我们（3&lt;br&gt;5）坐在高高的谷堆旁边 小三度 《听妈妈讲那过去的事情》% 长亭外，古道（6 1[高]）边 &amp;#160; &amp;#160; &amp;#160; &amp;#160;小三度 &amp;#160; &amp;#160; 《送别》%&lt;br&gt;明天你是否会想起（5 7） &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;大三度 &amp;#160; &amp;#160; 《同桌的你》% 月亮在白（2 5）莲花般的云朵里 &amp;#160; &amp;#160;纯四度&lt;br&gt;《听妈妈讲那过去的事情》% 风中（3 6）有朵雨做的云 纯四度 《风中有朵雨做的云》% 也温暖不了你的视线（6 2[高]） &amp;#160; 纯四度&lt;br&gt;《吻别》% 天上的星星（3 6） &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; 纯四度 &amp;#160; &amp;#160; &amp;#160; &amp;#160;《鲁冰花》% 分给我快乐的往昔（6[低] 3）&lt;br&gt;纯五度 &amp;#160; &amp;#160; &amp;#160; 《睡在我上铺的兄弟》&lt;br&gt;% ————————% 下行% 夜（1 7）色茫茫照四周 &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;小二度 &amp;#160; &amp;#160; 《明月千里寄相思》%&lt;br&gt;难解百般秋相知爱意浓（1 7 6） &amp;#160; &amp;#160;小二度 &amp;#160; &amp;#160; 《相思风雨中》% 月亮（6 5）在白莲花般的云朵里 &amp;#160; &amp;#160;大二度&lt;br&gt;《听妈妈讲那过去的事情》% 愿心中永远留着我的笑容（1[高]6） 小三度 &amp;#160; &amp;#160;《祝福》% 高高的谷堆旁边（5 3）&lt;br&gt;小三度 &amp;#160; &amp;#160;《听妈妈讲那过去的事情》% 空独（7 5）眠的日子 &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;大三度 &amp;#160; &amp;#160; 《追梦人》% 风中有朵（6&lt;br&gt;3）雨做的云 &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;纯四度 &amp;#160; &amp;#160; 《风中有朵雨做的云》% 狼山起，江山北望（3 6[低]） &amp;#160; &amp;#160; &amp;#160;纯五度&lt;br&gt;《精忠报国》&lt;p&gt;% Local Variables:% coding: utf-8% End:% EOF&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-6064454652610964767?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/6064454652610964767/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=6064454652610964767' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/6064454652610964767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/6064454652610964767'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2012/01/lilypond-example.html' title='音程示范歌曲，lilypond example'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-1VK9LF30fCw/TxU-kFe13CI/AAAAAAAANAA/ScrDRB0BRIk/s72-c/screenshot_20120117-172301-735236.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-5084783333635205126</id><published>2012-01-15T01:18:00.001+08:00</published><updated>2012-01-15T01:18:20.283+08:00</updated><title type='text'>上位机与下位机的交流：编码与字节序的实验</title><content type='html'>上位机与下位机的交流：编码与字节序的实验&lt;br&gt;下午在南区的讨论班居然提前结束了，而且，到预定吃晚饭的时候还剩两个半小时，按包师弟的说法，真是个尴尬的时间啊。干做两个半小时，太无聊，如果赶回所编程序，似乎时间又不太够的样子。我甚至想提议去暴走吧，但是想到冷得冻肺子的天气，想到包师弟和我都正感冒，也就只是想想。&lt;br&gt;包师弟说：要编这程序的想法，真是搅得人...&lt;br&gt;我忘了他原来的措词，为避免他跑上来纠正，只好留了空白。大意是，热血沸腾啊，夜不能寐啊之类的。现场表现是坐立不安。&lt;br&gt;好吧。&lt;br&gt;我们迅速用了十来分钟重新回顾了一下以前做过的计划，然后跑出来打车去所里。&lt;br&gt;1. 实验计划及基本原理&lt;br&gt;我们要做的是一个原型实验，确定STM32某芯片 (意法半导体)&lt;br&gt;的浮点型变量的编码方案与PC[&lt;a href="http://en.wikipedia.org/wiki/IEEE_754-2008]"&gt;http://en.wikipedia.org/wiki/IEEE_754-2008]&lt;/a&gt;是相同的，且大小头&lt;br&gt;(Endianness) 也是一样的。&lt;br&gt;几天来，包师弟已经把下位机的板子都整完了，昨天半夜的时候邮件说USB芯片及驱动都整完了。&lt;br&gt;我们计划的技术路线是：由上位机通过USB向下位机发送一个浮点数的二进制形式，下位机接收到以后，写到串口，然后用PC从串口读了显示出来。&lt;br&gt;如果PC下发的和最后显示的如果不一致，即可判定STM32与PC使用了不同的浮点变量编码。我们希望一致。&lt;br&gt;为初学者同学们解释一下，这并非是为了验证PC-STM32-串口的链路是正常的，而是为了验证上位机与下位机使用相同的方式表示一个浮点。&lt;br&gt;上位机就是PC，下位机是单片机或者ARM芯片的机器。&lt;br&gt;有的同学可能会问：难道上位机和下位机表示同一个数，会使用不同的方式，不都是&amp;quot;3.14&amp;quot;这样的形式么？&lt;br&gt;可能不相同，一定不是&amp;quot;3.14&amp;quot;这样的形式。因为我们知道，计算机只接受二进制，而&amp;quot;3.14&amp;quot;显示不是二进制。所以&amp;quot;3.14&amp;quot;是以一种有点诡异的方式表示的。&lt;br&gt;(1) 编码&lt;br&gt;在上位机中，一个浮点数，比如3.14，需要经过归一化、求符号、求指数、求有效数字、求尾数……一系列的步骤，终于变成了下面的形式。&lt;br&gt;如果是32位系统，用十六进制表示就是: 4048F5C3&lt;br&gt;具体的步骤和4048F5C3中每个二进制位的含义略过，感兴趣的同学请去文后的两个地址自行观赏。&lt;br&gt;我和包师弟打算用实验确认，上位机与下位机使用了相同的计算方法，或者说，相同的编码方法。即，当上位机发送3.14的时候，它发送4048F5C3这四个字节；当下位机接收4048F5C3这四个字节的时候，它认为这是3.14。&lt;br&gt;上位机与下位机使用相同的语言，才能通信。如果一方对另一方一无所知，还要指导，情况就可能比较糟糕了。&lt;br&gt;比如下面的对话。&lt;br&gt;上位机：你最喜欢莎士比亚的什么作品。&lt;br&gt;请注意上位机知道莎士比亚是一个人，而是有作品的人，不是意法半导体生产的某个芯片型号。&lt;br&gt;下位机：英雄双行体。&lt;br&gt;上位机：……&lt;br&gt;如果上位机在日本动画里，估计会说&amp;quot;那呢？&amp;quot;。我文学基本白痴，以前从来只知道莎士比亚还写十四行诗，从来没听说过英雄双行体这种东西，不过上位机似乎更白痴一些，他似乎认定莎士比亚就只写过戏剧。&lt;br&gt;恩，我比较喜欢李清照的词。&lt;br&gt;上位机：你读过莎士比亚的哪部作品？&lt;br&gt;下位机：我演过麦克白中的巫婆。&lt;br&gt;上位机：你是演员？&lt;br&gt;上位机显然不知道，而不是在调笑，他不知道英文专业学习英文的重要方法之一，从高中的时候就是这样，就是表演英文经典名著或者非名著。每个学英语的好像还都有剧照什么的。&lt;br&gt;不幸的是，下位机也不知道上位机如此无知。&lt;br&gt;上位机：你英语这么好，为什么要学英语呢？&lt;br&gt;下位机：我们为什么要学汉语呢？&lt;br&gt;我补充一下：因为英语系根本不是学英语的，就像下位机的回答所暗示的，中文系不是学中文的，历史系不是学历史演义的，而计算机系也不是学计算机的。很多英语系还有个全称，叫英语言文学，中文系一般还有个名字，叫汉语言文学，历史系……历史系好像叫历史文化学院，计算机系则根本不学怎么修理计算机拆壳子什么的。&lt;br&gt;深入地研究一个东西，跟简单的使用，根本就是天壤之别。&lt;br&gt;有人可能误认为：上位机误会了自己的身份，那些指责只有BOSS们才有资格做。&lt;br&gt;不，不是这样。没有人有资格指责别人，尤其，尤其，尤其是你身居高位的时候。身为BOSS，被安排居高临下，你对看不惯的人唯一能说的话也就是：我们不适合你。被你指责的那个人，没有花钱请你做他的顾问。&lt;br&gt;上位机下位机，不过是为了称呼方便给的一个名字，你真以为自己就高人一等了，你当小资的时候口口声声赞扬的独立宣言里有一句&amp;quot;人生而平等&amp;quot;不知道是不是忘光了。你花钱买到的不过是劳动时间，并不包括人的尊严。&lt;br&gt;所以，如果编码不同，还是承认不同罢了，少扯别人低级自己高级什么的。&lt;br&gt;又，故做平易近人和蔼可亲低下头来和你说话这样的姿态的，也不是什么好鸟，因为他们假设自己高人一等。&lt;br&gt;(2)大小头&lt;br&gt;目前有两种Endianness在计算机中普遍存在，一种是，在内存里，4048F5C3就表示为4048F5C3，这个叫做 big endian，大头儿。&lt;br&gt;有同学说，还能有啥表示方法？&lt;br&gt;还有一种叫 little endian，小头儿，4048F5C3会表示成C3F54840，正好按逆序排列每个字节。&lt;br&gt;有同学可能说，居然还有小头儿这么诡异的表示方法。是啊，事实上，我们一般用的PC，x86体系的，都是小头儿，是诡异的那一方。而ARM，是大头那一方。&lt;br&gt;大头小头，这个名字来自格列弗游记，两个小人国战争的原因是，到底吃鸡蛋应该从大头还是小头先打碎。这个问题也困扰计算机网络，发送数据前，也可能需要重排一下字节的顺序。&lt;br&gt;说到这里插一句，有意思的是，在小头的x86体系中，浮点数恰恰很诡异地使用了大头方案。这是由于历史的原因，你看，我们已经是一门有历史的学科了。&lt;br&gt;以上，我和包师经要验证的是上位机 (并非多么尊贵) 与下位机 (并非理应谦卑)使用了相同的 (1)编码、 (2)大小头。&lt;br&gt;可能有的同学会说：查下手册不就完了么。大多数时候我乐意相信手册，不过昨天马利同学刚刚抱怨了Thinkphp手册之不咋地，还是小心为妙。&lt;br&gt;2. 实验环境&lt;br&gt;上位机一台，跑windows7，64位CPU。杨注：可能运行在32位模式，或者应用程序工作在32位模式。&lt;br&gt;上位机的应用程序包括：&lt;br&gt;* labview&lt;br&gt;* symbolink 可能是这个名字，不能确认了。windows驱动开发工具之一，用来显&amp;#160; 示驱动提供用来读写的文件名的。&lt;br&gt;* 虚机里跑了个windows xp，里面有个visual studio.&lt;br&gt;* 下位机的交叉编译和烧写软件&lt;br&gt;* 串口通信工具，用来看下位机发到串口的东西&lt;br&gt;* bushond&lt;br&gt;下位机：&lt;br&gt;* 意法办导体STM32某芯片，USB驱动已完成，串口驱动已完成&lt;br&gt;其他的硬件环境包括：我和包师弟各据一个显示器，连接在同一台上位机上，两套鼠标两套键盘。&lt;br&gt;两套鼠标两套键盘的结对编程方式，是ZHUMAO同学最先采用的，我们两个似乎当时调的是个JAVA程序。两套输入设备，结对时就不必抢键盘了，只要说一句&amp;quot;放着我来&amp;quot;，就行了。论起争执和争夺，嘴还是比手快。&lt;br&gt;其他的硬件环境，我在实验其间还征用了关同学的座机一会，用来拷出symbolink，包师弟其间用过他的笔记本一阵，查资料。&lt;br&gt;还用了一个不知道什么软件，为了计时工作，西红柿时间管理。一共两次迭代，第二次严重超时，刚好在最后一分钟结束所有工作。&lt;br&gt;2. 实验过程&lt;br&gt;* 下位机输出到串口，浮点变量&lt;br&gt;改下位机程序，把浮点数，比如3.14，忘记当时用的是什么了，输出到串口。用上位机的串口通信软件读，符合3.14。&lt;br&gt;这步是为了确认串口通信及下位机的浮点数格式化输出正确。&lt;br&gt;float a = 3.14;printf(&amp;quot;%f&amp;quot;, a);&lt;br&gt;我们观察到了单精度浮点数精度不够的情况，略。&lt;br&gt;* labview，不知道如何把浮点写下去&lt;br&gt;用labview，打算把浮点数对应的二进制四个字节写到USB口。遇到个问题，不知道应该怎么取得浮点数对应的二进制那四个字节。&lt;br&gt;这时，我们转到了另一个技术路线。&lt;br&gt;请某些同学注意，这里的另一个技术路线，原本就是我们计划的技术路线之一，而不是因为前一路线&amp;quot;可能&amp;quot;不通，而临时想到的。同时，我们非常确认另一条技术路线可能，而且我和包师弟各喜欢一条路线，所以才会转向。这与某些同学&amp;quot;一遇困难就转向，再遇困难再转回来，始终也不知道毛病在哪里，这个方法到底行不行&amp;quot;是完全不同的。事实上，我们基本确认labview有这样的能力，只是不打算再花时间。前面提过，我们原计划加交通也只有两个半小时。&lt;br&gt;* C，不知道symbolic link name&lt;br&gt;然后，开始用C写USB口，但是CreateFile的时候不知道驱动给提供的文件名(symbolic&lt;br&gt;link)是什么，因为正使用labview的驱动，不是我们自己写的那个版本。&lt;br&gt;自己马上写个驱动，也是方法，但是我们需要马上架起驱动开发的环境。原来有个驱动，但当前的这块板子vid,pid,endpoint设置全不一样。时间关系，也放到一边。请还是那部分同学注意，我们仍随时可以开始这一路线。&lt;br&gt;* 用symbolink (？) ，不能确定文件名是正确的，CreateFile没有发出数据&lt;br&gt;开关同学的机器，找到了能查驱动提供的文件名的工具。&lt;br&gt;这里有个插曲，我们拥有N多个虚拟机，以致于找到需要的那个，花了不少时间。后来全盘搜索才找到。&lt;br&gt;当时我想起了之前某次&amp;quot;结对&amp;quot;编程，我的身后有四位同学，包独坐一边，还是上面的硬件环境，我们把众多文件在真实的和虚拟的共达七台计算机间来回挪腾，最终一切都跑了起来。大家说，这很盗梦空间。&lt;br&gt;不过，这一次比较不幸，我按symbolikn查到的文件名发数据，下位机没有接收到。&lt;br&gt;* 包接受用C写用文件，然后用labview读&lt;br&gt;这时包提到一个之间的方案：我用C语言把float变量的二进制写到一个文件中，然后包用labview读进来，按字节读。&lt;br&gt;我说：咱们还是直接用手写吧。&lt;br&gt;* 用C输出float的4个字节&lt;br&gt;我们用C程序，把float变量对应的十六进制，显示在控制台上。这样：&lt;br&gt;#include &amp;lt;stdio.h&amp;gt;main(){&amp;#160; &amp;#160; float a = 3.14;&amp;#160; &amp;#160; printf(&amp;quot;%x&amp;quot;, *&lt;br&gt;(unsigned char*) &amp;amp;a);&amp;#160; &amp;#160; printf(&amp;quot;%x&amp;quot;, * ((unsigned char*) &amp;amp;a + 1) );&lt;br&gt; printf(&amp;quot;%x&amp;quot;, * ((unsigned char*) &amp;amp;a + 2) );&amp;#160; &amp;#160; printf(&amp;quot;%x&amp;quot;, *&lt;br&gt;((unsigned char*) &amp;amp;a + 3) );}&lt;br&gt;* 用bushound，而不是labview写到下位机&lt;br&gt;然后，我们没有用labview，而是用另一个更轻量级的工具，bushound，直接向usb的endpoint中写入了十六进制。&lt;br&gt;* 下位机，强制转换指针类型&lt;br&gt;在下位机中，我们按收到数据以后，把这四个字节十六进制转换成了浮点型变量，然后printf到串口。大致这样：&lt;br&gt;printf(&amp;quot;%f&amp;quot;, * (float*) buf);&lt;br&gt;* 上位机显示下位机串口&lt;br&gt;上位机显示，下位机的串口输出了 3.14。&lt;br&gt;我们又改了几个浮点数，由上位机把C算出来的十六进制通过USB口写给下位机，下位机又通过串口把这四个字节当成浮点型变量格式化输出。上位机显示下位机的串口输出，与我们预期的值是相同的。&lt;br&gt;* 然后，我们去东方肉馆吃肉去了。&lt;br&gt;虽然我的挂钩还疼着，尤其嚼脆骨的时候，不过心情不错。当你知道这个世界上有一些人与你用相同的语言交流，有些相同的习惯，比如大半夜的上网发贴子看贴子，怎么能心情不好。&lt;br&gt;就让那些 听不懂别人说话，还命令别人按自己的方式说话的 上位机孤独去吧。&lt;br&gt;3. 结论&lt;br&gt;浮点型单精度变量，PC与ARM使用了相同的编码和字节序。&lt;br&gt;参考文献：&lt;br&gt;[&lt;a href="http://en.wikipedia.org/wiki/IEEE_754-2008][http://babbage.cs.qc.cuny.edu/IEEE-754/"&gt;http://en.wikipedia.org/wiki/IEEE_754-2008][http://babbage.cs.qc.cuny.edu/IEEE-754/&lt;/a&gt;]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-5084783333635205126?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/5084783333635205126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=5084783333635205126' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/5084783333635205126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/5084783333635205126'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2012/01/blog-post_15.html' title='上位机与下位机的交流：编码与字节序的实验'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-1962451441191785804</id><published>2012-01-13T21:07:00.001+08:00</published><updated>2012-01-13T21:07:26.753+08:00</updated><title type='text'>面试，为什么总问些没用的，及emacs支持正则表达式替换</title><content type='html'>面试，为什么总问些没用的，及emacs支持正则表达式替换&lt;p&gt;* 题外话&lt;p&gt;李记者辞职了，纪念一下。&lt;p&gt;李记者不是记者，这是他的绰号。李记者辞职前是某二三线城市IT公司的技术负&lt;br&gt;责人。李记者和我相识，是一起参加一个吃不好睡不好啥也不好的比赛，我们都&lt;br&gt;获了吉林省的奖，所以，都是取得了高级技工资格。&lt;p&gt;想李记者也面试人无数，肯定背地里被人骂过&amp;quot;面试，为什么总问些没用的&amp;quot;。今&lt;br&gt;天我试着解答一下。&lt;p&gt;对了，李记者，高级技工证，我有两个。你有两个么？&lt;p&gt;* 先说一个例子，emacs支持正则表达式替换&lt;p&gt;Emacs，如同李记者这个名字，众所周知，是伪装成编辑器的操作系统，能完成&lt;br&gt;基本的编辑器功能，比如文本替换。&lt;p&gt;替换这个功能没啥稀奇的，连WORD都有。如果你确信匹配条件是对的，那么尽可&lt;br&gt;能大胆地不搜索不一个个确认，直接替换全部。&lt;p&gt;但有时候，世界不那么美妙简单，或者简单的事情都被别人做完了。比如，你想&lt;br&gt;进行下面这样的替换。&lt;p&gt;有一段文字，其中的一段如下：&lt;br&gt;----引文开始----&lt;br&gt;14. &amp;#39;This is a private conversation!&amp;#39;&lt;p&gt;课文2 早餐还是午餐？&lt;br&gt;15. It was Sunday.&lt;br&gt;----引文结束----&lt;p&gt;明眼人一看便知，这是我们背诵了无数遍，如此熟悉的《新概念2》的...第一课&lt;br&gt;结尾和第二课的开头。也许整本书，你就只熟悉这两课，不过并不影响我们的讨&lt;br&gt;论。&lt;p&gt;现在的要求是，把整个文件中的每一课的标题，如&amp;quot;课文2 早餐还是午餐？&amp;quot;这样&lt;br&gt;的文字，后面都加个回车。&lt;p&gt;面试提出这样的问题，有的同学可能会说：哈，不过就是90几课么，我一个个回&lt;br&gt;车下去。&lt;p&gt;面试官就会问：如果文件非常非常长呢？&lt;p&gt;当然，找很多人，把文件切割了，每人分一小块，处理完再合并，也算是个办法。&lt;br&gt;不过，也许你去应聘管理岗位的时候这么答效果更好。&lt;p&gt;我们技术人员是这样解决的：找到那一行的特征，然后替换那一行，替换的方法&lt;br&gt;是原来的内容不变，在最后加个回车。&lt;p&gt;1. 特征&lt;p&gt;凡东西，你不先指出特征，就找不到它。马丁叔叔说：&amp;quot;如何藏起一棵树呢？把它&lt;br&gt;放在森林里。&amp;quot;这就是用大量的共性掩盖特性。&lt;p&gt;这一行的特征是，开头有&amp;quot;课文&amp;quot;二字。还有别的特征，但是这个特征足够我们完&lt;br&gt;成任务了。&lt;p&gt;齐同学请注意。为什么考试的时候要考概念，因为按我上面的这种描述特征的方&lt;br&gt;法，是不专业的，不方便技术人员之间沟通，也不方便与机器沟通。&lt;p&gt;我们这样描述：&lt;p&gt;课文.*&lt;p&gt;这就是大名鼎鼎的正则表达式。学过编译原理的同学都如遇故人，因为这是我们&lt;br&gt;熟悉的领域，终于又回到我们的知识结构之中。&lt;p&gt;数学家的方法是值得赞扬的，他们把未解决的问题转化为已解决的问题。典型的&lt;br&gt;例子是消防员的那个故事。队长问：如果你看到胡同口着火了怎么办？答：用灭&lt;br&gt;火器。再问：如果你看到胡同口没着火怎么办。答：点着它，接下来就是我们熟&lt;br&gt;悉的问题了。&lt;p&gt;正则表达式 课文.* 的意思是，前面是&amp;quot;课文&amp;quot;二字，然后是任意个 (*的含义)任&lt;br&gt;意字符 (.的含义)。凡符合这样的特征的行，都会被搜索出来，准备被替换。&lt;p&gt;2. 替换&lt;p&gt;替换成什么呢？&lt;p&gt;替换成 (1) 还是这样一行， (2)后面接一个回车。&lt;p&gt;写作：\&amp;amp;^J&lt;p&gt;其中，&amp;quot;\&amp;amp;&amp;quot;的意思是，匹配的文本的全部，上例中，即&amp;quot;课文2 早餐还是午餐？&amp;quot;&lt;br&gt;这一行；&amp;quot;^J&amp;quot;是这么键入的&amp;quot;C-q C-j&amp;quot;，其中C-q相当于转义，C-j就是回车。你&lt;br&gt;可以试一下，在windows下，C-j就是ctrl-j也是回车。&lt;p&gt;3. 命令&lt;p&gt;在emacs下，M-x执行下面的命令：&lt;p&gt;replace-regex RET 课文.* RET \&amp;amp;^J&lt;p&gt;然后，任务完成了。凡是符合特征&amp;quot;开头是课文二字的行&amp;quot;，找到它们，在每一行&lt;br&gt;后面加个回车。&lt;p&gt;4. 补充&lt;p&gt;[&lt;a href="http://www.emacswiki.org/emacs/ReplaceRegexp%5D%E6%8F%90%E5%88%B0"&gt;http://www.emacswiki.org/emacs/ReplaceRegexp]提到&lt;/a&gt;&lt;br&gt; M-x replace-regexp&lt;br&gt;  Replace regexp:  \(\w+\)&lt;br&gt;  Replace regexp with:  \,(capitalize \1)&lt;p&gt;这里， \1 代表的是第一个括号分组里的部分，\, 代表后面跟的不是要用来替&lt;br&gt;换的东西，而是一段lisp程序。上例执行的结果，会把一个或多个单词，替换为&lt;br&gt;把 它们中的第1部分 (刚好就是全部) 大写开头字母的结果。&lt;p&gt;这个故事告诉我们，emacs很强大。马利同学，及其他尊敬的vim使用者们，我猜&lt;br&gt;vim一定也有这样的功能 :)&lt;p&gt;这个故事还告诉我们，无论emacs还是vim，还是类似强大的编辑器，必然会以某&lt;br&gt;种方式支持 正则表达式 这种强大工具。&lt;p&gt;(1) 因为正则表达式是计算机学科的基本概念，所以，很多方法 (包括gaga新的&lt;br&gt;.net)都建立在它的基础之上。它已经诞生很久了，我刚刚查了下，1950年代，相&lt;br&gt;信咱们没几个人比它的年龄还大的。许多人抱怨计算机学科学习的东西太古老，&lt;br&gt;答案在于，这些东西从来都没有过时，而且所有的新东西，都建立在它们的基础&lt;br&gt;之上。&lt;p&gt;《故事 : 材质、结构、风格和银幕剧作的原理》告诉我们，叛逆是可以的，前&lt;br&gt;提是你已经充分了解和纯熟运用你准备叛逆的东西。&lt;p&gt;(2) 对正则表达式支持得好的，必然会提供某种方式，允许你深入到其中，操控&lt;br&gt;所有的一切，只要你愿意。&lt;p&gt;&lt;a href="http://xn--cet.net"&gt;对.net&lt;/a&gt;的诟病之一，正是因为它走向了这一原则的反面。有位老外牛人，一时忘&lt;br&gt;了是谁，他说：&lt;a href="http://xn--bvs014a.net"&gt;如果.net&lt;/a&gt;是一个烤炉的话，它是这样的，特别容易就能做出比如&lt;br&gt;6.5英寸的汉堡，按标着6.5的那个钮就行 (请准备面试的同学考虑，公司为啥要&lt;br&gt;为一个只能按某个钮的员工付很多钱呢) 。但是，如果你想做，比如7.4英寸的汉&lt;br&gt;堡，对不起，不行。原因非常简单，没有那个按钮。&lt;p&gt;它引导你规范你，按它的要求去操作，去完成它特别擅长完成的工作。这一部分&lt;br&gt;非常友好。但是，如果你打算做点特别的格路的，对不起，壳子拆不开，汉堡供&lt;br&gt;料仓与烘焙的部分是焊死的，汉堡来的时候是一箱一箱的，把箱子放在供料仓里&lt;br&gt;就行，不过你想放点别的，不行。&lt;p&gt;用崭新的包装把一切遮盖起来，仿佛一切就真的简单的。如果理论上没有突破，&lt;br&gt;仅靠小技巧，这只是梦想。&lt;p&gt;有的同学可能会说，.net具有重要的意义，它降低了编程的门槛。当然，是的，&lt;br&gt;完全正确。那么，我们是否能够重新思考一下这一段话呢？它降低了编程的门&lt;br&gt;槛， (1) 它会让一些某些工作变得简单--因此更不值钱， (2)那些不容易解决&lt;br&gt;的工作，仍然不容易解决，因此仍然值钱。&lt;p&gt;这就是面试的时候，很多打算长久使用你的公司并不太关心你对新技术了解程度&lt;br&gt;的原因。因为，那一点也不重要。&lt;p&gt;* 面试1&lt;p&gt;前几天看到有同学问，为什么面试的时候，我明明应聘前端，却要问我些乱七八&lt;br&gt;糟的东西，而jquery啊html5啊，这些新的非常有前途的技术，这些我非常熟悉&lt;br&gt;和感兴趣的技术，他们完全不问。&lt;p&gt;因为，那些东西对于理论基础正常的同学，学起来非常之快，可能两周之后就开&lt;br&gt;始使用，虽然深入某种技术，往往需要N年的时间，而如此精确有时并无必要。他&lt;br&gt;们学起来如此迅速的原因非常简单，因为手册、书籍 (我 没有、没有、没有 提&lt;br&gt;到网上短文中的示例)都使用了相同的术语和基本技术，这些术语和基本技术正是&lt;br&gt;计算机专业学习的内容。&lt;p&gt;是的，计算机专业学习的内容是术语和基本技术，而不是什么新鲜的热气腾腾的&lt;br&gt;东西。&lt;p&gt;关于计算机专业课程设置，很多年前偶像曾经开过一个玩笑，他说：现在oracle&lt;br&gt;dba这么值钱 (当时是4万？2万？) ，咱们还教什么专业课，专门培养他们得了。&lt;p&gt;我说：那四年以后，oracle黄了怎么办？&lt;p&gt;oracle没有黄，似乎日益飞黄腾达了。不过，谁知道呢。我们希望培养的是这样&lt;br&gt;的同学，他们在毕业以后可以在短时间内学会任何一种新的技术，而所有的新技&lt;br&gt;术对他来说，区别都不大。&lt;p&gt;另一个关于计算机专业课程设置的讨论。姜同学是北京某大公司的头头，手下二&lt;br&gt;三百人。他希望高校毕业的学生能够熟练，j2ee hibernate struts spring，当&lt;br&gt;年的对话，大致相当于现在的这些技术吧。&lt;p&gt;一个优秀的毕业生，当在一个月内了解所有这些的使用。当然，我们的培养很多&lt;br&gt;都失败了，那是另一回事，且不能作为把高校改为技工学校的理由。&lt;p&gt;为什么面试的时候问你那些特别基础的问题，而不涉及新技术？因为新技术会过&lt;br&gt;时，而拥有基础的同学，能够学习所有的新技术。&lt;p&gt;新技术，不是建立在旧一点的新技术基础之上，而是建立在理论和非常旧的技术&lt;br&gt;基础之上。&lt;p&gt;* 面试2&lt;p&gt;可能有同学还会质疑，只问理论，会不会让那些实践强的同学失去机会呢？&lt;p&gt;以前CCNA考试流行的时候，对通过考试的同学有个分类方法。一种叫paper过去&lt;br&gt;的,他们只读了书，没有做过实验；一种叫bible过去的，他们背了题，甚至书也&lt;br&gt;没看懂；还有一种，真正有实践的--不过，你相信一个有实践经验的同学，他从&lt;br&gt;来没看过书么？&lt;p&gt;微软和思科，和所有网络考试中最基础的部分，关于osi七层模型，关于tcp/ip&lt;br&gt;协议，都是完全相同的。这就是基础。&lt;p&gt;对于了解基础理论的同学，如果，如果他拥有实践的精神，那么，一旦他解决过&lt;br&gt;一次这样的问题，相同原因的问题，无论故障现象看起来多么不一样，他都可能&lt;br&gt;解决。而对于只有实践，见过这个故障，见过如何解决的同学，再次见到另一个&lt;br&gt;故障，他一定无法解决，因为即使原理相同，那也是一个完全不同的故障。&lt;p&gt;我们所要注视的，根本不是故障现象本身，而是导致它的原因。只有理论基础，&lt;br&gt;才能给予解释。&lt;p&gt;我们把理论基础较好的那些，称为学院派。这很多时候是个贬义词，尤其在工业&lt;br&gt;应用中。但是，我看到很多学院派后来接触实践以后成长起来，我还看到很多野&lt;br&gt;路子的同学后来开始钻研理论。&lt;p&gt;* 面试3&lt;p&gt;还有同学提到，为什么我有这么好的想法公司却不用我，或者不用我的想法。&lt;p&gt;你的确很有想法，可能非常杰出，但是企业招的却是员工，不是老板。我们都有&lt;br&gt;把别人当工具的倾向，不过如果想实施 (且不论是否正确)，得先有自己身为工具&lt;br&gt;的觉悟。&lt;p&gt;好想法，应该讲给风险投资商听，或者你自己有钱的话，讲给自己听。&lt;p&gt;* 考试&lt;p&gt;齐同学动手能力挺强的，他抱怨，为什么考试的时候要考概念。&lt;p&gt;因为，我们将使用这些概念进行交流。比如，正则表达式，这是个严格清晰的概&lt;br&gt;念，一点也不像文科同学说的什么...那些乱用词。&lt;p&gt;我们不能使用诸如&amp;quot;开头两个字是课文&amp;quot;，这样的说法只能在跟人类跟用户这样有&lt;br&gt;限的交流范围使用。&lt;p&gt;之所有要考概念的另一个原因，你真的以为自己清楚地掌握了它么？&lt;p&gt;的确，这样，有的同学靠背诵就能得到很高的分数。这是考试技术低下造成的，&lt;br&gt;我们却不能因此放弃对概念的掌握。&lt;p&gt;从难度上看，背诵 &amp;lt; 举例 &amp;lt; 使用 &amp;lt; 复述。&lt;p&gt;有的时候，即使你偶而能正确使用 (在有限的场合下，有时还受到技术主管的辅&lt;br&gt;导或限制，因此不易失控)，也不见得总能正确使用。而复述，可以考察出你是&lt;br&gt;否了解其中所有的要点。&lt;p&gt;齐同学还提到，背概念真没意思。大意如此。&lt;p&gt;概念从来就不是背的。不要使用别人的词汇，而应该使用自己的。如果你对要&lt;br&gt;点有所遗漏，当你应用它的时候，你如何确保充分注意到这一技术的优点、缺点、&lt;br&gt;使用的限制？&lt;p&gt;使用的时候再查书？这确实是个答案，而且是个不错的答案。&lt;p&gt;不过有些东西，我们要求的是 熟练，而不仅仅是掌握和理解。在水里理解自由泳&lt;br&gt;的精要，而不会熟练地扑腾 (还需要足够的心肺功能和肌肉耐力吧) ，也是白扯。&lt;p&gt;要求&amp;quot;熟练&amp;quot;的一个结果，就是那些你最经常用到的知识，绝不会不理解，虽然不&lt;br&gt;能确保你的理解没有编差。&lt;p&gt;谁说的来着：不了解自己的文章中的词意的作者应该枪决。同样，只会抄网上示&lt;br&gt;例，甚至不知道调的那个函数原型，没有读过手册的程序员，也...&lt;p&gt;* 李记者&lt;p&gt;你辞职，我对你还是挺有信心的。相同的技术和理论，总可以应用于不止一家公&lt;br&gt;司和不止一个领域。&lt;p&gt;这个故事告诉我们，新技术等等，都是浮云。我们内心深处的，能长久停留的，&lt;br&gt;才可能成为我们自己的一部分，永不失去。&lt;p&gt;祝你顺利。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-1962451441191785804?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/1962451441191785804/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=1962451441191785804' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/1962451441191785804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/1962451441191785804'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2012/01/emacs.html' title='面试，为什么总问些没用的，及emacs支持正则表达式替换'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-5025888134807160644</id><published>2012-01-10T16:52:00.000+08:00</published><updated>2012-01-10T16:53:06.919+08:00</updated><title type='text'>pics</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/-7jI8YYJepgg/Twv8c56Se5I/AAAAAAAAM_U/4BXcdMHRjFY/s1600/IMG_7627-786920.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/-7jI8YYJepgg/Twv8c56Se5I/AAAAAAAAM_U/4BXcdMHRjFY/s320/IMG_7627-786920.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5695923727251962770" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-jdkKMeIZE5k/Twv8dipUGgI/AAAAAAAAM_g/LdnAa9Hb-44/s1600/IMG_7628-790532.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/-jdkKMeIZE5k/Twv8dipUGgI/AAAAAAAAM_g/LdnAa9Hb-44/s320/IMG_7628-790532.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5695923738186619394" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-K-v6SrFbSOw/Twv8eBC3EVI/AAAAAAAAM_s/ZFzqMnwDRyM/s1600/IMG_7631-792132.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-K-v6SrFbSOw/Twv8eBC3EVI/AAAAAAAAM_s/ZFzqMnwDRyM/s320/IMG_7631-792132.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5695923746346832210" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-5025888134807160644?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/5025888134807160644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=5025888134807160644' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/5025888134807160644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/5025888134807160644'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2012/01/pics.html' title='pics'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-7jI8YYJepgg/Twv8c56Se5I/AAAAAAAAM_U/4BXcdMHRjFY/s72-c/IMG_7627-786920.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-7322690283194261008</id><published>2012-01-10T15:08:00.001+08:00</published><updated>2012-01-10T15:08:30.247+08:00</updated><title type='text'>悠长假期</title><content type='html'>悠长假期&lt;p&gt;1. 悠长假期，带本什么书&lt;p&gt;这些天，不停地做梦编程序。有一次逻辑太难，我只好从梦里醒过来，睁着眼睛&lt;br&gt;看漆黑一片，窗外连隐约的路灯也都熄了。在清醒中解决了那几行，然后又沉沉&lt;br&gt;睡去。&lt;p&gt;昨天，十字路口很多人在烧纸，是过年的前奏。东一堆西一堆，火苗腾跃，旁边&lt;br&gt;的人不停翻动纸堆。&lt;p&gt;我突然想，如果我此刻挂了，该托家人给我烧本什么呢。长夜漫漫一定非常寂&lt;br&gt;莫，无书可读一定更加无聊。&lt;p&gt;出差的时候，我总是随身带本小册子，不沉，又不那么容易看完的。每次出差前&lt;br&gt;整理东西，选书总是要花不少时间。因此，很多年来，设计模式我读了好多遍，&lt;br&gt;直到有了kindle。&lt;p&gt;我见过向龙同学吃饭的时候拿出手机赶紧看两眼《大秦帝国》，那个时候秦始皇&lt;br&gt;已经出世了，估计现在他换另一本了。张科长同学前几个月在看的是《官场现形&lt;br&gt;记》，崔老师看《这才是春秋》。偶像提到过，去大连ACM的路上，我看《编译原&lt;br&gt;理》，现在也只看了四分之一左右。罗同学还提到过，她和韩老师在王府井逛商&lt;br&gt;场，我在门口看书，那本是什么我却不记得了，也许&amp;lt;UML Distilled&amp;gt;?&lt;p&gt;从烧纸的火堆路过，想，如果是漫长的旅程，只选一本，真得好好选选。我想到&lt;br&gt;了SICP，这本挺扛看的，第二遍还没有看完，还要很多细节要想。但是，不配几&lt;br&gt;本参考书，手头没有实验环境，非常不方便啊--毕竟，真的出差，还有机会回来&lt;br&gt;再做实验。&lt;p&gt;也想到了龙书。但这是会看完的，然后对于工程的启发，或者底层的程度，可能&lt;br&gt;也就有限度了。&lt;p&gt;然后我想到了《牛虻》，想到了《高卢战记》。&lt;p&gt;暗无天日，旷日持久，哪本书才适合漫长的相伴？&lt;p&gt;然后，一批书目从我心上掠过。太多了。好多书都难以割舍，只好继续活下去，&lt;br&gt;慢慢把它们看完吧。&lt;p&gt;2. 那些迭代的意义&lt;p&gt;读罗素《幸福之路》。他提到，有人认为人生的意义之虚无，因为不过是一代又&lt;br&gt;一代人登场然后又退场，阳光之下没有新鲜的事情。&lt;p&gt;这让我想起计算机程序设计中的迭代。&lt;p&gt;计算机最擅长的事情是 重复，一次次做相同或类似的动作。为了显得IT男们有&lt;br&gt;文化和品味，我们更乐意使用迭代这样的字眼来代替重复。就像小资们用波希米&lt;br&gt;亚代替吉普赛或捷克斯洛伐克，用HR代替人力资源。那样显得倍有面子。&lt;p&gt;说到重复，人类希望机器做的，自己却并不一定喜欢。想想《摩登时代》里的卓&lt;br&gt;别林，我们就知道为什么后现代们会提出&amp;quot;异化&amp;quot;这样的词。人类并不太适合或者&lt;br&gt;不喜欢一成不变地重复。&lt;p&gt;我们不喜欢变化，但是我们期待重复，它给我们安全感。每个人的心里是不是有&lt;br&gt;断背山我们不知道，但是每个人心里都有半拉雨人是差不了的。我们期待每天发&lt;br&gt;生相同的事情，坐同样的班车，遇到些相似的面孔，他们会做你预料到的行为。&lt;br&gt;这个月铁定会发这么多钱，项目也只能是大约这样的，出不了大格。&lt;p&gt;虽然很多人想做逃跑新娘啥的，想喷领导一口唾沫，想在地铁里遇到哥斯拉什么&lt;br&gt;的，那也只是想想而已，不然就不必有那么电影帮助大家YY这些无法实现的愿望&lt;br&gt;了。&lt;p&gt;重复的生活，不变的仪式，所给我们的安全感，与给雨人的感觉没什么差异。所&lt;br&gt;不同者，我们期待重复里有小小的不同。&lt;p&gt;起-承-转-合。起承，这些都差不多；转一下，生活中的变化；合，再重回到旧&lt;br&gt;有的轨道上，整体上又略有差异。&lt;p&gt;在迭代、重复、循环中，我们有三个部分需要处理。&lt;p&gt;C语言里一般这么写： for (i=0; i&amp;lt;10; ++i) {...}&lt;p&gt;(1)起始条件，就是 i=0。&lt;p&gt;这类似于数学归纳法中的 n=1 时等式成立。经典的求斐波那契数例的最开始，&lt;br&gt;如果用递归法，就是n0=1, n1=1。&lt;p&gt;我们的起始条件各有不同。具体的说，我们初生时根本就不在同一条起跑线上。&lt;br&gt;有些人A出生在好地方，另一些人B需要花费大半生才有资格在A出生的地方生存&lt;br&gt;下来，而A出生就具有这样的资格。很多时候，A认为，这是理所当然的。这个再&lt;br&gt;具体地说，北京出生的人认为自己留在北京是理所当然的，而外地人留下来就是&lt;br&gt;&amp;quot;我就不明白这些人怎么回事儿，非要到北京来&amp;quot;；美国出生的人认为自己留在美&lt;br&gt;国是理所当然的，而其他国家，尤其是亚非拉的，那就是挣夺了他们高贵的工作&lt;br&gt;岗位。我们大概都是这个路子，属于我的，那一定是我的，别人谁也别想抢；至&lt;br&gt;于别人认为应该属于他们的，我们就想，靠，这太不公平了。&lt;p&gt;这基本是极坐标的思考方法，以我为中心。这世界上还有另一种坐标系，叫做迪&lt;br&gt;卡尔坐标系，我们可以回忆一下，虽然久违。&lt;p&gt;血统所造成的差异，可能持续终生。在人人网上刚刚读了某同学的贴子，我很悲&lt;br&gt;伤。贴子大意是某 (女？)同学抱怨男朋友如此小气，过不下去了。历数的事情&lt;br&gt;包括她花自己的钱唱歌请朋友们吃饭是不必经过男朋友批准的，因为那是自己的&lt;br&gt;钱；重申了房租不超过1/5都不算多，他们的房租仅1800。&lt;p&gt;文笔挺好，说得也都在理。凭啥你节省就不让我花钱。&lt;p&gt;后面还提到：男朋友的父母太节省了，买肉只有他的爸爸能吃，他的妈妈发的工&lt;br&gt;作服要穿十几年。&lt;p&gt;如果他的父母有你的父母的收入，还这么节省，几十年下来，该是多么富有啊。&lt;p&gt;叹气。&lt;p&gt;写到这里，想起小牛同学曾经说，&amp;quot;其实中国是没有阶级的。&amp;quot;我当时说，你当然&lt;br&gt;这么认为。或者这么希望。&lt;p&gt;(2)终止条件，就是 i&amp;lt;10。&lt;p&gt;有些人就是能活，没办法。最后把所有意见不同的都靠死了，自己就是老大了。&lt;p&gt;我的平生夙愿就是一直活下去，等你们全死了，给你们挨个立传，想写啥写啥。&lt;p&gt;如果只看起始和终止条件，每个人的一生都差不多。来到世界，经过一些事，然&lt;br&gt;后挂了。那人生还有什么意义？意义在下面。&lt;p&gt;(3)每轮迭代，就是++i及{...}里面的那些东西。&lt;p&gt;在函数式编程中，强调只得到返回值，而不希望在每轮迭代 (及整个计算过程中)对&lt;br&gt;环境有任何影响。凡是对环境的影响，称为副作用。&lt;p&gt;人生的意义，恰恰在于副作用，即你对于别人的帮助。&lt;p&gt;这样当你挂了的时候，就有人怀念你曾经的存在令世界有所不同；也许还有人给&lt;br&gt;你烧书看。&lt;p&gt;正是这些副作用，而不仅仅是求值的结果，让我们区别于外界环境这个纯粹物质&lt;br&gt;的世界。&lt;p&gt;其实，做工程和做练习也是一样的。能得到什么结果，挣多少钱，不过是副带的&lt;br&gt;一个结果而已，我们不必以这些来评判自己的价值。&lt;p&gt;徒步的人，如果只是为了结果，有那么多现代化交通工具可以选择；推哑铃的那&lt;br&gt;些，跑圈的那些，不过是一次次一次次推起来跑过去，又回去终点；做各种实&lt;br&gt;验，最终大体都扔到废纸堆里或者删除。&lt;p&gt;但是，这些过程，令我们从纯物质的世界里分离出来，成为人类--或者工程师。&lt;br&gt;我们所享受的，不是结果，而是过程本身的吸引。&lt;p&gt;想起了以前对建一同学说的：工程本身很重要，但是它远不如 你做工程很爽 重&lt;br&gt;要。&lt;p&gt;人生就像一个短促的假期，你从何而来，终止条件如何。在这期间，你发生了哪&lt;br&gt;些变化，你令世界发生了哪些变化。&lt;p&gt;假期开始了，你快乐么？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-7322690283194261008?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/7322690283194261008/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=7322690283194261008' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/7322690283194261008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/7322690283194261008'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2012/01/blog-post_10.html' title='悠长假期'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-1681359130875394387</id><published>2012-01-07T20:15:00.001+08:00</published><updated>2012-01-07T20:15:26.754+08:00</updated><title type='text'>那些非常好的书</title><content type='html'>有同学问，&amp;quot;哪些书非常好&amp;quot;，答复如下。&lt;p&gt;列表在这里：[&lt;a href="http://book.douban.com/doulist/1371567/"&gt;http://book.douban.com/doulist/1371567/&lt;/a&gt;]&lt;p&gt;1. 很些书因为太好，出了好几个版本，它们之间的区别对初学者不是非常重要；&lt;br&gt;基本上，哪本都非常好。&lt;p&gt;2. 如果可能，建议读英文版。总有一天，你的所有阅读材料都会是英文的，所&lt;br&gt;以，总要有个开始。从哪本开始，区别不是甚大。&lt;p&gt;我的第一本是 计算机网络与因特网，Comer那本，薄，相对简单。读的时候计算&lt;br&gt;机网络有一些基础了，看过不少英文文档。第二本是 计算机网络，Tanenbaum那&lt;br&gt;本，厚，用词非常文雅，所以很多词不认识。以后的我就不记得了。&lt;p&gt;选择你的第一本英文著作，有些原则可供参考。1.选择你喜欢的。所以，男同&lt;br&gt;学，不必非得强迫自己去看 简爱 飘 红楼楼 那些看了就想睡的作品。打打杀杀&lt;br&gt;的似乎不流行了，没品味的样子，词汇也太少，那么，就从技术看起吧。2.复杂&lt;br&gt;或困难的，同时你已经有些了解的方向，想细读的。这时速度就不那么重要，因&lt;br&gt;为阻碍你阅读的不是语言本身，而是思想，所以英语还是汉语的差别不大。3.傻&lt;br&gt;瓜书什么的不行，它们太幽默，俚语太多，这些对老外简单的东西，对我们正是&lt;br&gt;难的，而且啥用没有。&lt;p&gt;Visual C++ 技术内幕，建议第4版，中文的挺好。侯捷先生翻译的，中文版跟英&lt;br&gt;文版一样流畅；潘爱民先生翻译的，也是质量保证。&lt;p&gt;3. 有些书是免费下载的，有电子版。同时，有些书是有版权的，不过也容易找&lt;br&gt;到电子版。有些书英文只有电子版，同时有纸质中文的。对于不习惯电子版的同&lt;br&gt;学，劝告一句，你习惯一下吧。墨香什么的，都是给文学青年们感受人生准备&lt;br&gt;的，技术男就别太介意感受了。此外，未来的世界如此艰难，哪有几家公司会为&lt;br&gt;你准备打印好的文档呢。&lt;p&gt;4. 想说&amp;quot;以后有时间再一一细评这些书&amp;quot;，后来一想，这也太狂妄了。这些都是&lt;br&gt;牛人牛书，还是推祟并表达一下敬仰吧。&lt;p&gt;感谢他们助我成长，也希望你会有同感。&lt;p&gt;	&lt;br&gt;1. 编译原理&lt;br&gt;作者 : Alfred V.Aho/Jeffrey D.Ullman/Ravi Sethi&lt;br&gt;出版社 : 机械工业出版社&lt;p&gt;	&lt;br&gt;2. C程序设计语言&lt;br&gt;作者 : 克尼汉&lt;br&gt;出版社 : 机械工业出版社&lt;p&gt;	&lt;br&gt;3. 现代操作系统&lt;br&gt;作者 : （荷）Andrew S. Tanenbaum&lt;br&gt;出版社 : 机械工业出版社&lt;p&gt;	&lt;br&gt;4. 计算机程序的构造和解释&lt;br&gt;作者 : Harold Abelson/Gerald Jay Sussman/Julie Sussman&lt;br&gt;出版社 : 机械工业出版社&lt;p&gt;	&lt;br&gt;5. 算法导论&lt;br&gt;作者 : [美] Thomas H.Cormen/Charles E.Leiserson/Ronald L.Rivest/Clifford Stein&lt;br&gt;出版社 : 机械工业出版社&lt;p&gt;	&lt;br&gt;6. Applying UML and Patterns&lt;br&gt;作者 : Craig Larman&lt;br&gt;出版社 : Prentice Hall PTR&lt;p&gt;	&lt;br&gt;7. Design Patterns&lt;br&gt;作者 : Erich Gamma/Richard Helm/Ralph Johnson/John Vlissides&lt;br&gt;出版社 : Addison Wesley&lt;p&gt;	&lt;br&gt;8. UML Distilled&lt;br&gt;作者 : Martin Fowler&lt;br&gt;出版社 : Addison-Wesley Professional&lt;p&gt;	&lt;br&gt;9. UML应用建模实践过程&lt;br&gt;作者 : 尤克滨&lt;br&gt;出版社 : 机械工业出版社&lt;p&gt;	&lt;br&gt;10. 数据结构&lt;br&gt;作者 : 严蔚敏/吴伟民&lt;br&gt;出版社 : 清华大学出版社&lt;p&gt;	&lt;br&gt;11. IBM-PC汇编语言程序设计 （第2版）&lt;br&gt;作者 : 沈美明/温冬婵 编著&lt;br&gt;出版社 : 清华大学出版社&lt;p&gt;	&lt;br&gt;12. 软件工程：实践者的研究方法&lt;br&gt;	&lt;br&gt;13. Word排版艺术&lt;br&gt;作者 : 侯捷&lt;br&gt;出版社 : 电子工业出版社&lt;p&gt;	&lt;br&gt;14. Windows 程序设计：第5版&lt;br&gt;作者 : CharlesPetzold&lt;br&gt;出版社 : 北京大学出版社&lt;p&gt;	&lt;br&gt;15. 计算机网络与因特网&lt;br&gt;作者 : (美)Douglas E. C&lt;br&gt;出版社 : 机械工业出版社&lt;p&gt;	&lt;br&gt;16. 计算机网络&lt;br&gt;作者 : 特南鲍姆&lt;br&gt;出版社 : 清华大学出版社&lt;p&gt;	&lt;br&gt;17. 数据与计算机通信&lt;br&gt;作者 : 威廉&amp;#183;斯托林斯&lt;p&gt;	&lt;br&gt;18. C++程序设计语言（特别版）&lt;br&gt;作者 : [美] Bjarne Stroustrup 贝尔实验室&lt;br&gt;出版社 : 机械工业出版社&lt;p&gt;	&lt;br&gt;19. C++ Primer中文版&lt;br&gt;作者 : [美] Stanley B. Lippman/Josee Lajoie&lt;br&gt;出版社 : 中国电力出版社&lt;p&gt;	&lt;br&gt;20. Visual C++技术内幕&lt;br&gt;作者 : 小克鲁格林斯基&lt;p&gt;	&lt;br&gt;21. Java编程思想(英文版.第2版)&lt;br&gt;作者 : Bruce Eckel&lt;br&gt;出版社 :&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-1681359130875394387?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/1681359130875394387/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=1681359130875394387' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/1681359130875394387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/1681359130875394387'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2012/01/blog-post_07.html' title='那些非常好的书'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-8540627876387569213</id><published>2012-01-06T21:24:00.001+08:00</published><updated>2012-01-06T21:24:46.710+08:00</updated><title type='text'>与机器(或男人)沟通的原则</title><content type='html'>与机器(或男人)沟通的原则&lt;p&gt;今天感冒头疼，脑袋不咋清楚，以下主要扯淡，跟技术关系不大。这也反应了最&lt;br&gt;初决定开写博客的原因。我很长时间一直担心所写的东西过于幼稚，不入大家法&lt;br&gt;眼，又担心过几年以后会觉得以前写的东西太担淡了。不过，后来被劝道：1.即&lt;br&gt;使特别糟烂的东西，总也可能对更幼稚的同学有所启发；2.错得离谱的那些，自&lt;br&gt;然会有同学跑上来骂，这样我就可以进步了。&lt;p&gt;这就是写博客的目的：沟通--软件工程中代价最大的部分。&lt;p&gt;* 差异，世界不是你想像的那样&lt;p&gt;需要沟通的原因是，接受信息的人和发出消息的人所了解的信息是不同的。所以&lt;br&gt;跟黄同学提到过几次的一个写文档的原则：&amp;quot;要清楚&amp;quot;，原因就于此。&lt;p&gt;如果读者已经知道了你要写的内容，他为什么还要读。所以，在动笔以前，你就&lt;br&gt;要猜测读者不知道些什么。最简单的猜测是：假设读者啥也不知道。这是安培当&lt;br&gt;年在演讲中用过的方法，也是我们看到很多牛的英文教材写得非常详细 (甚至罗&lt;br&gt;嗦)的原因 。类似的，为什么我们的很多教材非常薄而简洁，我恶意地猜测，作&lt;br&gt;者只是想告诉我们：你看，我懂。如此而已。他并不希望我们也懂，也不愿意为&lt;br&gt;我们懂而努力。&lt;p&gt;所以我们也不愿意买他们的作品。&lt;p&gt;写得简短，可以藏拙，或者期待由于自然语言的二义性，虽然你不明白，但是读&lt;br&gt;者明白了；写得罗嗦，至多是被跳过；或者……我也看到过对我罗嗦不能忍受，跳&lt;br&gt;上来骂我的。&lt;p&gt;沟通需要先预设背景，那是双方都接受和明白的部分，然后才是交换差异的信息。&lt;br&gt;忽略背景，固然简洁，但是那是没有基础的楼宇，清楚打了折扣。&lt;p&gt;所以，讲故事都要先来时间地点。&lt;p&gt;比如以前导师讲：芬兰有公路可以直达北极圈……那一路上都要小心鹿……路边有牌&lt;br&gt;子，上面写着&amp;quot;小心鹿&amp;quot;。就跟咱们有些人跟北海道的鬼子学习，在车上喷个牌子&lt;br&gt;&amp;quot;有熊出没注意&amp;quot;。&lt;p&gt;我当时感叹：看看人家，多环保啊，怕把鹿压着了。&lt;p&gt;导师说：是怕把车撞坏了，鹿长得很大，也够结实。&lt;p&gt;这个故事告诉我们，世界不像我们想像的那样，所以我们才需要沟通。&lt;p&gt;* 不沟通的情况&lt;p&gt;小学的时候看过一个笑话：方程有两种，一种是方程，一种是 非方程。就是有&lt;br&gt;时候你解一个方程 (等式)，解了半天，到最后，才发现，其实那根本不是个方&lt;br&gt;程。&lt;p&gt;但是最初的时候你不知道的时候，也称它过方程来着。&lt;p&gt;是不是有同学想到了很多别的东西？&lt;p&gt;所以，沟通有两种，一种是沟通，一种是不沟通。&lt;p&gt;什么时候不沟通呢？&lt;p&gt;当表达无效的时候，我们会选择停止沟通。双方互骂，互掐，对打，仍然在交流。&lt;br&gt;真正的不爱，不是恨，而是冷漠。&lt;p&gt;在琼瑶还不是奶奶的时候有部小说，名字忘了。女子很多年 (杨注：一般仍很年&lt;br&gt;轻，所以很多年一般是0.5或者0.3年的样子) 后见到了当年的男朋友，然后场&lt;br&gt;景，男子不在场的时候，她问她爸，&amp;quot;他刚刚怎么评价我？&amp;quot;&lt;p&gt;她爸说：他大骂特骂了你，没有一句好话。&lt;p&gt;女生喜极而泣：太好了，还有希望。&lt;p&gt;你会对陌生人发火么？如果会，你会对电线杆子发火么？小时候我们会的，撞了&lt;br&gt;墙还要打墙两下才能解气。&lt;p&gt;所以做项目的时候，你的客户 (还有你的下属和上级) 不跟你沟通的那部分，才&lt;br&gt;是更重要的，所以请他们表达出来非常重要。而&amp;quot;请&amp;quot;他们表达这件事，绝不可能&lt;br&gt;是他们自己的责任。&lt;p&gt;昨天某公司一位常务副经理说：大学做开发啊，进度慢……&lt;p&gt;他说到这的时候我频频点头，不是表达礼貌，而是表示赞同。他的担心不无道理。&lt;p&gt;但是他接着说：意识啊，意识问题。&lt;p&gt;我笑了：某经理，其实这主要是个成本问题。&lt;p&gt;言下之意是，如果你给够钱，当然意识可以更好。不过，我得说，我这不是什么&lt;br&gt;好的沟通：无论从方式，还是从内容上看。&lt;p&gt;很多年前，我还是本科生的时候，就对老板这样说过。这不是意识问题，因为并&lt;br&gt;非这个世界围着你转的就是意识对的，按你的控制操作的，就是好的，而不利于&lt;br&gt;你的就是不咋地的。&lt;p&gt;不是只有你的意识才是意识，每个独立的人类个体都有意识的。&lt;p&gt;当你想要操纵，或者诱导别人的时候，你与他的沟通之路就已经封闭了。人与物&lt;br&gt;之间没有什么好交流的。&lt;p&gt;前面那位常务副经理显然明白了我的意思，停止了沟通或布道。当他过了一阵再&lt;br&gt;次提起意识二字的时候，我又笑了，他又不说了。&lt;p&gt;这时可以判定，这是有效沟通。&lt;p&gt;如果沟通无效，其中有些，可以试着换个方式；有些，则只能停止。&lt;p&gt;在包括面向对象系统分析与设计的方法中，有一个术语叫做 消息。当消息到来的&lt;br&gt;时候，接收消息的信宿要做出一个动作 (执行消息响应函数，转发或执行对应的&lt;br&gt;消息句柄，等等)。这里有一个前提，那就是消息接收者有响应消息的机制，称&lt;br&gt;为责任。不承担责任的对象，就不能响应消息，因此不能接受通信，因此也没有&lt;br&gt;存在的必要--因为你无法调用它。&lt;p&gt;我们所看不到摸不到，也不能沟通的，就是不存在的。&lt;p&gt;* 沟通的原则&lt;p&gt;沟通有时候进行了，但是却没有效果。双方都有责任。当我们用计算机语言跟机&lt;br&gt;器沟通的时候，如果沟通无效，那责任只在我们自己。&lt;p&gt;因为机器是男人设计的，主要是西方的男人设计的，所以文化色彩可能跟咱们习&lt;br&gt;惯的略有差异。&lt;p&gt;经常有人说，日本人说话非常暧昧。这里的暧昧与色情无关，指的是不清楚，模&lt;br&gt;糊的表达。&lt;p&gt;我看到最早的例子是这样的。美国人和日本人谈判，美国人不管说啥，日本人都&lt;br&gt;说&amp;quot;嗨&amp;quot;。美国人一看，这日本人真好说话啊，那就提要求提要求提要求。第二&lt;br&gt;天，日本人不签字，说，我那些个&amp;quot;嗨&amp;quot;，就表示&amp;quot;听到了&amp;quot;，不是&amp;quot;我同意&amp;quot;的意思。&lt;p&gt;其实咱们中国人也差不了多少。我经常见到有人频频点头，就表示我听到了，丝&lt;br&gt;毫也不表示我同意，甚至他说&amp;quot;是啊，对啊&amp;quot;的时候，也并不对应具体的意思，那&lt;br&gt;和脏话差不多，仅表示语气。&lt;p&gt;我们还经常见到，职员对老板说的是：你看，现在物价涨了，房租挺贵的，我媳&lt;br&gt;妇认为我的职业没有前途……他要说的是：我想涨工资。&lt;p&gt;当年一位老板对我如此暧昧地说：小杨家境挺贫寒的。&lt;p&gt;我说：你应该把上次做网的工资给我，这跟我的家境没什么关系。&lt;p&gt;后来我说，某部分是我做的，既然合作失败，我要删除那部分工作。他也同意了。&lt;br&gt;再后来，他说&amp;quot;你痛快把这部分活做了&amp;quot;，这暗示报酬还是可以有的，谈判还是可&lt;br&gt;以继续的。&lt;p&gt;好了好了，回忆这些让我感觉我们大家都是女人，生活在红楼梦之中，每句话里&lt;br&gt;都套着各种话。&lt;p&gt;……女人们也经常交流了半天，却没有传达任何具体的信息。事实上，她们传达了&lt;br&gt;重要的信息，那就是&amp;quot;你看，我乐意和你交流&amp;quot;。这也很重要。&lt;p&gt;不过，当你跟机器 (或男人) 交流的时候，则完全不同。我以前对韩师姐说过一&lt;br&gt;句话，作为原则，跟机器交流可以容易得多：指令要简短，意义要明确。&lt;p&gt;不要试图暗示。&lt;p&gt;当年去芬兰之前，偶像教导我说，如果遇到老外讨厌的，可以一边笑着一边骂他。&lt;br&gt;我挺感激偶像的，不过我不会那么做。一定要选择对方听得懂的语言，表达不满。&lt;br&gt;最礼貌的做法是，在发起攻击之前，要给出明确的信号--这一点，东北人做得不&lt;br&gt;好。东北同学应该理解南北的文化差异，南方的同学们并不认为辱及母亲的词是&lt;br&gt;发起动作攻击的明确信号。&lt;p&gt;同办公室的黎巴嫩同学曾经拿我的一个瓷碗开玩笑，说：你们是把这个东西叫做&lt;br&gt;china？&lt;p&gt;我说：这并不有趣。&lt;p&gt;你会说什么？啊，虽然我知道你并无恶意，大家的文化差异很大，云云？最清晰&lt;br&gt;无误的消息传递就是：明确告诉你你不喜欢。&lt;p&gt;今天在人人网，转了某位同学的博客，她明确告诉她的师姐，非常不喜欢这位师&lt;br&gt;姐的行为。&lt;p&gt;挺好的。&lt;p&gt;明确地表达能够让别人清楚地了解这个世界，包括你的那个部分。&lt;p&gt;蔡依林先生说：&amp;quot;等我跳不动舞的那一天我还会做舞曲，到那时我会唱不需要跳着&lt;br&gt;舞唱的舞曲。&amp;quot;&lt;p&gt;杨注：先生，是一种尊称，与性别可以无关。例如：孙宋庆龄先生。&lt;p&gt;我们知道，她是真的热爱唱歌，可以失去舞蹈，但是不能失去歌唱。&lt;p&gt;有位同学说：她想选文明史两门课，因为特别热爱。有另一位同学说，那就去旁&lt;br&gt;听呗。她说：我还想要学分。&lt;p&gt;当你还想要别的什么的时候，我们就要考虑，你想要的，到底是你先提到的那&lt;br&gt;个，还是后提到的那个。&lt;p&gt;当有人说，我真的喜欢你，如果你有房子就更好了。我们会有同样的思考。有人&lt;br&gt;尽可以补充说：安全感啦，什么的。但是，带了附加条件的，都是另一种东西，&lt;br&gt;而不是你声称的那种东西本身。&lt;p&gt;如果你真的喜欢编程，你还会在乎它是不是赚钱么，在乎编哪种程序最赚钱？你&lt;br&gt;会用钱贴补编程这种行为。&lt;p&gt;有同学说：我真的感到学习理论的迫切，但是图书馆的书太难借了，买书呢，太&lt;br&gt;贵了。&lt;p&gt;有同学说：我真的非常想做项目，但是学习很紧张。&lt;p&gt;请回想，你买魔兽点卡的时候，请回想，你给她买个冰淇淋然后牵着她的手满校&lt;br&gt;园走的时候。&lt;p&gt;当你在乎做什么对你的生活影响的时候，我来告诉你：你并不喜欢它。你在用一&lt;br&gt;种日本人暧昧地方式在眼自己的内心交流。&lt;p&gt;如果一个人骗了你，你想不想整死他？如果你的心骗了你呢。&lt;p&gt;嘿嘿。我听到有人说：也许他 (它)是无意的。&lt;p&gt;是这样，所有的欺骗都是有意的。欺骗这种行为，只能是有意的。啊，对了，唯&lt;br&gt;有一种例外，那就是幼稚。据说三五岁以下的孩子，还不能完全分清现实和想像、&lt;br&gt;愿望和事实。&lt;p&gt;有时候，是一种表演吧。对别人表演，也对自己表演。就像有些经理，要求员工&lt;br&gt;努力工作，不计代价，后来说得自己都信了，直到损失自己的利益的时候才能再&lt;br&gt;重新发现事实的不同。&lt;p&gt;我一直以来对演艺人员不存好感，偏见地认为，他们往往把生活本身也作为一种&lt;br&gt;表演。请参看海报栏里学生会同学们的照片，注意他们的微笑。&lt;p&gt;蔡林依先生的话让我明白，有一种情感，是对表演的热爱，而这种表演并非希望&lt;br&gt;获取不当利益的欺骗。她的直截了当的话，清晰地传达了这一点。&lt;p&gt;你能清晰明白地告诉我们，你热爱什么东西么？&lt;p&gt;前几天在人人网看到一些同学在转一个状态，如果当初不能XX，我就去YY。比&lt;br&gt;如，如果不能编程，我就去做个销售。&lt;p&gt;蔡林依先生估计会说：如果当初不唱歌，我就唱歌。&lt;p&gt;我说：如果不能编程，我就去死。&lt;p&gt;* 还有啥时候不能沟通&lt;p&gt;有的时候无法沟通，仅仅因为回答者没有答案，或者，你想知道答案太早了。&lt;p&gt;夏笳同学在douban上答复某同学的提问如下。&lt;p&gt;问题是：&amp;quot;请问写一篇一万多字左右的科幻小说，除了清晰的情节线条，积极健康&lt;br&gt;的主题，还有完整的格式起承转合之外，要写得好一些，能够得上发表，还需要&lt;br&gt;什么要求？&amp;quot;&lt;p&gt;她的答复是：&amp;quot;请先写出&amp;#39;一万字左右，清晰的情节线条，积极健康的主题，完整&lt;br&gt;的格式起承转合&amp;#39;，然后编辑会告诉你还需要点什么。&lt;p&gt;通常，提问题还会在前面加上，我如此热爱科幻写作啥的。这时，答案可以缩减&lt;br&gt;为：去做你喜欢做的事。&lt;p&gt;不然就可以问：你是喜欢写作，还是喜欢写作成功被吹捧的感觉。&lt;p&gt;又，当你写出了&amp;#39;一万字左右，清晰的情节线条，积极健康的主题，完整的格式起&lt;br&gt;承转合&amp;#39;的作品的时候，通常，你已经知道应该还需要什么了，或者，你知道了&lt;br&gt;如何去寻求到底需要什么。&lt;p&gt;编程也是一样的。&lt;p&gt;经常有同学问：如何才能成为一个好的程序员呢？&lt;p&gt;回答可以是这样的：如果我知道，还会有时间在这里扯淡么？&lt;p&gt;回答也可以是这样的：去编程序。&lt;p&gt;同学可能会追问：然后呢？&lt;p&gt;然后，然后你就知道答案了。&lt;p&gt;有些事情，只有彼时才能理解信息，此时的沟通毫无必要。不是现在不告诉你，&lt;br&gt;而是，只有你自己亲自长大，才能明白。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-8540627876387569213?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/8540627876387569213/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=8540627876387569213' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/8540627876387569213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/8540627876387569213'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2012/01/blog-post.html' title='与机器(或男人)沟通的原则'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-3371122155917665396</id><published>2011-12-31T01:20:00.001+08:00</published><updated>2011-12-31T01:20:44.030+08:00</updated><title type='text'>当一名战士就是一支军队，那些不需要软件工程的时候</title><content type='html'>当一名战士就是一支军队，那些不需要软件工程的时候&lt;p&gt;* 最初的代码&lt;p&gt;1994年，当我开始对编程感兴趣的时候，还没有软件蓝领这一说法，但是我已经&lt;br&gt;有了后来软件蓝领流行起来以后的困惑。&lt;p&gt;我第一次做的比较大的程序，是用GW-BASIC写的，没有IDE界面，需要按行号插&lt;br&gt;入，黑底绿字的显示器，单个软驱倒腾用两张盘。 (感谢我们的导员刘春光老师&lt;br&gt;每天中午借我用他的计算机) 要编的程序是自己想出来做着玩的，一个DOS界面下&lt;br&gt;CGA显示模式，菜单方式的……班费管理程序。如同齐同学的那个定票系统，这个软&lt;br&gt;件并没有实际应用，不过，它对我来说，比此后所有写的程序都更难。&lt;p&gt;代码后来参加一个比赛的时候，打印了唯一的一份纸质版，打印纸抻开比我举起&lt;br&gt;手还要高。我当时遇到了程序设计中的核心问题--大量的代码，复杂的逻辑。&lt;p&gt;我当时使用了GW-BASIC提供的一个非BASIC的功能 gosub，类似于函数调用，它帮&lt;br&gt;助我逃过了程序彻底混乱的厄运。后来当我学到模块化思想的时候，如遇故人。&lt;br&gt;我毫不费力地就接受了这个观念，因为痛过，所以印象深刻。&lt;p&gt;后来经常见到有初学的同学函数写得超出两三屏，还很得意自己逻辑控制能力。&lt;br&gt;我就在心里撇嘴，你那是还没受够罪。&lt;p&gt;大量的代码，复杂的逻辑。软件工程给了我们某个答案，就是软件蓝领，它声称&lt;br&gt;大量的人工、短期培训、重复地简单劳动，能够解决--以工程的方法--大量代码&lt;br&gt;和复杂逻辑的问题。&lt;p&gt;是的，我们这么干过，好几千看前就这样做。埃及盖金字塔，是没有起重机的，&lt;br&gt;而是靠几千几万人力完成的；中国的古长城 (不是当代的) ，也没有等待现代电&lt;br&gt;子计算机和通信技术的发展，而是靠万喜良们的双手堆砌出来的。&lt;p&gt;那个时候，他们一定期待一种东西，可以用燃油作为动作，稳妥精确地运输沉重&lt;br&gt;的材料。&lt;p&gt;但是他们没有。因为是时代是父亲是民族选择我们，而不是反过来，所以很多时&lt;br&gt;候很多事情都不能一蹴而就。&lt;p&gt;有的时候，智力或自然的法则也参与限制。&lt;p&gt;* 他们说，没有解析解&lt;p&gt;在数学当中，有一种解题的方法得出的结论称为解析解。我们解一个方程，得到&lt;br&gt;结果，如果我们所做的常见运算只需要 有限次，那么，这个结果就称为解析解。&lt;p&gt;这是什么意思呢？就是说，你可以通过公式，只需要一个大式子，可能非常大，&lt;br&gt;但是最终可以计算出结果，直接地。&lt;p&gt;难道不都是这样么？不幸的是，还有一些方程，伟大的牛人数学家们告诉我们，&lt;br&gt;有些方程就是不能通过公式求出来。而我们在工业生活中还需要求解。&lt;p&gt;数学家牛人们还是有办法的。他们创造了另一种方法，用猜测-比较-再猜测，大&lt;br&gt;致这样的方法，逼近我们寻找的那个数。这些牛人们中的第一位就是著名的牛顿。&lt;p&gt;但是，我们得到的是那个&amp;quot;数&amp;quot;，是整个方程中的一段，而且是粗糙的。精细的完&lt;br&gt;全一致的解，可能永远也无法求得，我们得到的就是对于当前的应用&amp;quot;足够&amp;quot;精确&lt;br&gt;的个案。&lt;p&gt;人类是多么地热爱形而上，热爱一次性解决所有问题啊。可是，数学牛人们说，&lt;br&gt;有时候，你哭也没有用，就是不行。&lt;p&gt;在程序设计中也是一样，只有工程方法，有人说，就是蓝领方法，才能解决大量&lt;br&gt;代码和逻辑复杂的问题。&lt;p&gt;如果没有燃油，没有热功当量，除了征服更多的奴隶，又有什么方法能够赢得自&lt;br&gt;己的自由呢？&lt;p&gt;但是，我们是否已经判定程序设计一定没有解析解，所以只能靠人力逼近？&lt;p&gt;* 解析解&lt;p&gt;我和李记者曾经对刘典同学怀有偏见，认为他(没有虽然技)技术极好 ，但是却从&lt;br&gt;不注重软件中的工程，也不怎么注重合作。&lt;p&gt;今天，关同学用事实给了我强烈的教育。她用事实告诉我：软件工程为什么有时&lt;br&gt;可以忽略？因为有的程序员，她一个人可以完成超过100个程序员的。&lt;p&gt;就像有的战士，一个人就是一支军队。&lt;p&gt;刘典同学讲过他写数据库的程序用了编译原理生成代码，讲过写手机游戏的时候&lt;br&gt;用虚拟机。前几天，我刚刚写了3千多的代码生成器，吐出来近6万行代码。这些&lt;br&gt;给我的印象也都没有今天这样深刻。&lt;p&gt;程序设计，是一种创造工作，就像写小说。与写小说不同的，你所创造的是一台&lt;br&gt;机器，它可以做很多事，你甚至可以制造一台机器，它以代替你写作最终需要的&lt;br&gt;代码。&lt;p&gt;在所有的计算机本科都开设了相关的课程，叫做编译原理。在一定程度上，这是&lt;br&gt;一个解析解。&lt;p&gt;* 关同学&lt;p&gt;今天我CIAC的导师请大家吃饭，辛苦一年。导师本人想参加，我托包师弟说：不&lt;br&gt;欢迎他。如果导师出现，今天稍微拘谨的场面，就可能令聚会完全不同。&lt;p&gt;我们讨论了，我们吃午饭了，我们唱歌了，我们又吃晚饭了。&lt;p&gt;刚开始吃晚饭没多久，包师弟说：2012的上半年，我们有一些任务要完成，相当&lt;br&gt;于本年度完成任务的40倍工作量。&lt;p&gt;他说：这些工作都是相似的。&lt;p&gt;可是这些相似的工作如果不能抽象出其中相同的部分，就没有一点相似。我们人&lt;br&gt;类看到的相似，对于构造代码而言，毫无用处。&lt;p&gt;我看不出来相似。然后我想了几个方案，又都推翻--我在想从哪里抓那么多奴隶&lt;br&gt;来，又用什么报偿他们，工程本身于他们何益。其实，同学们并非奴隶，必须保&lt;br&gt;证同学们有足够利益和受益，否则除了我自己，一个人也派不出来。&lt;p&gt;我说：包师弟啊，你能不能别在吃饭的时候说这个，我都吃不下去了。&lt;p&gt;我真的吃不下去了。焦虑。而且，从这以后，我真的几乎没吃啥。&lt;p&gt;奇迹时刻。&lt;p&gt;关同学说：老师其实我想了，这些方案都是类似的。&lt;p&gt;我说：啊？&lt;p&gt;她说：所有的界面都可以……根据配置文件，new 出 一个 label来……&lt;p&gt;是的，不熟悉关同学的，对女生能否写好程序有疑问的，请仔细看一下，她，不&lt;br&gt;是他。&lt;p&gt;而且，她也不必再解释这个方案，因为软件组可以全体解散，而剩下的工作，只&lt;br&gt;需她一个人短时间就可以完成。&lt;p&gt;这就是抽象的力量。&lt;p&gt;她没有写GUI，而是解析配置文件生成了GUI；她绕过了令我头疼的C#如何表示&lt;br&gt;GUI--这样就可以生成RC文件，在编译前，我考虑过的方案--而是在运行时，new&lt;br&gt;出所有的GUI控件来，相当于解释执行的。&lt;p&gt;* 后来&lt;p&gt;后来，全体软件组成员加入了硬件组，将承担下位机的代码。很好，我终于不用&lt;br&gt;再讨厌他们用的IDE了，因为再也没有他们熟悉的VS什么的了。我们都开始进入&lt;br&gt;单片机或ARM的世界。&lt;p&gt;后来，关同学对我的赞不绝口指出：这个方案是你告诉我的啊。&lt;p&gt;我说：啊？&lt;p&gt;她说：就是大仪网的时候，你告诉我blabla。&lt;p&gt;我想起来了。不过，这仍不是我的方案，而是她的。一个方案之所以好(像这个，&lt;br&gt;好到如此突出，以致你一眼就能看到，绝不可能错过，如果你看到了的话)，是&lt;br&gt;因为它被应用在一个恰好合适的领域，恰好解决了一个难题。至于这个方案有多&lt;br&gt;难有多容易，有多高科技，其实不是多重要。&lt;p&gt;关同学刚毕业的时候，我们在CIAC讨论一个框架，当时我说：这个倒是可以再抽&lt;br&gt;象，不过我的方案有点耍赖了。&lt;p&gt;关同学说：你是不是要用函数指针。&lt;p&gt;是的。而且我非常欣慰了一下，因为学生优秀。&lt;p&gt;黄同学当时认为：函数指针，也没啥难的啊。&lt;p&gt;是的。函数指针一点也不难，能想到用函数指针解决这个问题，是一个高度。&lt;p&gt;关同学在此刻想到了一个如此好的方案，所以接下来的半年，我们都不必那么焦&lt;br&gt;虑了。&lt;p&gt;这就是解析解。&lt;p&gt;关的方案，不是减轻了劳动，不是像我以工程的方法、各种测试 (关今天还提出&lt;br&gt;用MATLAB生成测试数据，也很好，后来给齐同学用上了) 来控制代码质量，用框&lt;br&gt;架规范程序员的行为，这些都不是，关同学直接替代十来个人把40个用例生成了&lt;br&gt;出来。&lt;p&gt;代码质量如此一致和优秀，是由图灵保证的。&lt;p&gt;* 后后记&lt;p&gt;上午，与一位技术人员和一位经理谈话。&lt;p&gt;我提到 通用的CMS &amp;gt; 定制的站点 &amp;gt; 使用CMS。&lt;p&gt;那位技术人员不认可。我说：我刚刚说错了啊，我不是指复杂，而是指困难。&lt;p&gt;那位技术人员blabla说，这不困难，只要如何如何即可。&lt;p&gt;我说：其实我们也不必达成一致意见。我的意思不是说我们无法实现，我说的我&lt;br&gt;会收更多的钱。&lt;p&gt;争执略去，我同意那位技术人员的下面这个观点 (大致意思，我翻译过的) ，但&lt;br&gt;是当时没有时间表达：这不是工作量，而是更高的高度。&lt;p&gt;是的，那不是更复杂，不是更消耗时间，甚至不是更困难。&lt;p&gt;那就是更值钱。&lt;p&gt;关同学用事实告诉我：一名战士完全可以是一支军队。没错。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-3371122155917665396?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/3371122155917665396/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=3371122155917665396' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/3371122155917665396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/3371122155917665396'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/12/blog-post_31.html' title='当一名战士就是一支军队，那些不需要软件工程的时候'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-6653699737401977224</id><published>2011-12-21T01:21:00.001+08:00</published><updated>2011-12-21T01:21:30.542+08:00</updated><title type='text'>我早就说过</title><content type='html'>我早就说过&lt;p&gt;&amp;quot;我早就说过&amp;quot;，经常有牛人说出这一句话，配合气场，一般代表我多么地牛啊，&lt;br&gt;早就有些先见之明。有时候，还附带对听众的嘲笑，你看，你们居然不识货。&lt;p&gt;我们常听到：某某观点我们祖宗早已有之，某某技术不过是啥啥技术的翻版……&lt;p&gt;再来看两个例子。&lt;p&gt;云服务的。当年，我整了几张大纸，画下了一个方案，命名为&amp;quot;科技改变生活&amp;quot;，&lt;br&gt;内容是把计算和服务、软件都放在主机端，终端都用计算性能非常性的机器，只&lt;br&gt;负责显示。跟丁老师聊，他认为，这根本不可能。几个月后，云服务的概念正式&lt;br&gt;提出，当然，由别人，不是我。&lt;p&gt;我的先见之明值得自豪么？不。因为我只有瞎扯的能力，如果整不出来，我也不&lt;br&gt;用负任何责任，所以，我也没有投入所有家当去整这个极有前途的东西。&lt;p&gt;又。ZHUMAO有天提起来，他刚工作，或者还没工作的时候，跟我提到可以在计算&lt;br&gt;机里面装两个操作系统，一个跑在另外一个里面。我完全不相信，我觉得只有多&lt;br&gt;启动这一类的吧，怎么能一起跑呢。他说我都装出来了，我也不相信，直到亲眼&lt;br&gt;见到。说实话，我忘了这事很久了，因为不是我的光荣史的一部分。经他一提，&lt;br&gt;才想起来。ZHUMAO同学比我在云服务中的表现要好多了，他真的搭了个虚拟机出&lt;br&gt;来。&lt;p&gt;我没有这种先见之明很应该惭愧么？也不。因为，即使我能预见到虚拟机巨大的&lt;br&gt;市场和技术潜力，我也没有能力实现。自己无法实现的事情，远观则可，没有必&lt;br&gt;要为没生出来的鸡蛋们打碎了而悲伤。&lt;p&gt;前几天去学习精品课，听到两则八卦，也能说明类似的问题。某学校有个计划：&lt;br&gt;根据学生的既有表现和举趣，为学生提供下一步的建议，该学生该看什么，都可&lt;br&gt;以计算出来。&lt;p&gt;很有雄心的计划，问题是，用什么样的技术手段可以实现呢？对于无法实现，至&lt;br&gt;少我们无法实现的东西，讨论到细节和投入资金，除了丰富一下想像力又有何益？&lt;p&gt;另一个故事。说一位博士设计了个CPU，能在o(n^7)--可能是7--时间复杂度内解&lt;br&gt;决某个问题。更牛的人判定，这个问题像是个NP难问题，也就是说，这个问题理&lt;br&gt;论告诉我们，不能在这种时间内解决。即1.这位博士创造了奇迹，他很快就要得&lt;br&gt;图灵奖了，整个计算机行业的数学基础也快要换了；2.他整错了。&lt;p&gt;在严格地论证以前，你更愿意相信哪个？&lt;p&gt;能尽早地判断美好地梦想不能实现，并承认这一点，非常重要。甚至比美好梦想&lt;br&gt;本身更重要。&lt;p&gt;判断那是美好梦想还是可能未来的一个重要的方法：你是否具有实现它的能力。&lt;p&gt;如何度量能力本身呢？&lt;p&gt;我并不太知道能力应该如何，不过，对于这种能力不是什么，我略有考虑，与你&lt;br&gt;分享。&lt;p&gt;实现梦想的能力，不应该是聪明和飞跃的。&lt;p&gt;《三宝大闹宝莱坞》里，编剧和导演为了表现主角是聪明睿智的，设计他完成了&lt;br&gt;以下任务：用照明灯的电惩罚向门上撒尿的学长、带无线摄像头的四旋翼直升机、&lt;br&gt;把危重病人绑在自己身上用两轮摩托车送去医院……用自行车带动（发电？）电推&lt;br&gt;子剪羊毛。各种聪明的做法。这些都很了不起，但是这些做法有个共同的特点，&lt;br&gt;使得它们的效用受限，那就是，这些做法不能用于设计航空母舰、航天飞机、导&lt;br&gt;弹，甚至AK47。我们在这些工业成果中，看到的是智慧，聪明无所置其身。&lt;p&gt;也许吧，印度和我们一样，作为第三世界国家，对于技术具有这样的幻想，我们&lt;br&gt;认为英雄可以拯救世界。而事实上，即使有一千个刺客，也不能攻下四平。孙子&lt;br&gt;说，以正合，以奇胜。没有正，奇是没有用武之地的。杀伐掠地，最终靠的还是&lt;br&gt;野战攻城，而非奇技淫巧。&lt;p&gt;《黑客与画家说》编程有三个层次：&lt;p&gt;: （a）使用一种强大的语言，（b）为这个难题写一个事实上的解&lt;br&gt;: 释器，或者（c）你自己变成这个难题的人肉编译器。&lt;p&gt;使用lisp语言，就是方案a；先写接口和函数库，或者写个dsl，大致相当于方案&lt;br&gt;b；用设计模式，或者把可能用编译器或者lisp macro生成的代码用手一行行写出&lt;br&gt;来，大致是方案c。&lt;p&gt;作者暗示我们，方案a是最高妙的，方案b等而下之，方案c最基础。&lt;p&gt;估计有很多人想，俺们应该按方案a行事。&lt;p&gt;问题是，如果你能够使用lisp macro的话，有一个前提，你本人必是编译器/解释&lt;br&gt;器的专家，才有能力运用这种高级的特性。利剑在一个居家的妇男手中，可能还&lt;br&gt;不如切菜刀好使。如果你想用方案b，写个解释器，除了要具备写解释器的能力&lt;br&gt;外（此时不需要具备lisp macro的运用能力，也不需要会lisp语言），有一个前&lt;br&gt;提，那就是你本人必须能像编译器生成代码一样用手把代码写出来。你只是不想&lt;br&gt;这么做，不是没有这样的能力。&lt;p&gt;你自己能完成的任务，才能指派别人去做。自己没有能力完成，却偏偏觉得别人&lt;br&gt;能够完成，而能够完成的人还不如他，这样的人也存在，不过大家面对他的时候&lt;br&gt;都感觉不太爽。&lt;p&gt;而很多人的问题是，代码写得尚且人和编译器都不忍卒读，又怎么可能写出解释&lt;br&gt;器，或者更高级地用lisp macro作为编译器生成出代码来再执行呢。&lt;p&gt;作者这样说，固然指出了一条光辉大道，但这大道必须从脚下走起。他只是没有&lt;br&gt;指出我们和他之间的鸿沟，估计会令很多人淹死在眼前的小河沟里。鸿鹄之飞固&lt;br&gt;然舒展而高级，不过虫子有虫子的移动之法，那就是爬。更何况同样飞得不错的&lt;br&gt;蝴蝶，当初爬得也是飞快的，虽然可能并不是最快。&lt;p&gt;这里，还需要小心，实现的能力，是指能切实操作的能力，而不是感觉似乎大概&lt;br&gt;可以。&lt;p&gt;能够和不能够，二者必居其一。&amp;quot;差不多&amp;quot;这种程度，根本就不存在。&lt;p&gt;我初中的学校，以前提过，是山上片，升重点高中比例不高。每年大约十多个。&lt;br&gt;也就是说，如果你不是在这十多个里面，你是25名，27名，又或者&lt;br&gt;100名，150名，在升重点高中这一点上，是没有什么差别的。&lt;p&gt;要么行，要么不行，&amp;quot;差不多&amp;quot;的内部，没有级别。而不行和行之间，有天渊之别。&lt;p&gt;大学刚入学的时候，我以为我的听力老好了，还去过外语系请教学长，应该怎么&lt;br&gt;才能学得更好。很多年以后我才知道，如果只是听个一知半解，再加上看字幕或&lt;br&gt;者根据故事情节猜测，那根本不能算是听懂。要知道，一句外语也不会，光靠表&lt;br&gt;情，我们就能跟老外聊个半天。&lt;p&gt;但是，你能告诉他你对于世界局势的看法么？你能精确地传达，斜上45度角倾望&lt;br&gt;天空是当今很多被另一些人称为脑残青年的生活态度，这样复杂的含义么？又或&lt;br&gt;者：&lt;p&gt;: Lisp functions take Lisp values as input and return Lisp values. They&lt;br&gt;: are executed at run-time. Lisp macros take Lisp code as input, and&lt;br&gt;: return Lisp code. They are executed at compiler pre-processor time,&lt;br&gt;: just like in C. The resultant code gets executed at run-time.&lt;p&gt;不能精确表达，我们就只能生存，而不能工作--工作，就是对别人有意义的事。&lt;br&gt;在这种情况下，你除了用父母的钱和微笑表达对别人的情感以外，对他人毫无帮&lt;br&gt;助。&lt;p&gt;其实，一个秘密，我们还有一个办法。&lt;p&gt;那就是，我们假装仍然生活在1500年以前的乡村，无论世界的哪个地方。我们施&lt;br&gt;施然穿过大街，任车流抚过身体，如同流水抚过舒蔓柔美的水草。&lt;p&gt;然后，我们要快乐的生活，全然忘记明天及以后。我们满足于我们的幻想，过&lt;br&gt;去，我们无比伟大，未来也是。&lt;p&gt;我们无论做什么，都&amp;quot;差不多&amp;quot;和最牛的那些想法非常接近了。只是，我们没有再&lt;br&gt;稍微努力一点，或者再精确一点，被他们占了先。但是，我们仍然是最聪明的个&lt;br&gt;体或者民族。只有哪天一发力，那世界就完全不同啦。&lt;p&gt;这很简单。只要我们忘掉，这世界就像编译器一样残忍，只要你写错一个字符，&lt;br&gt;那么，一切就都是错的。任你流着眼泪说，我不过就差一点点，它都无动于衷。&lt;br&gt;孩子，这也是一种生活。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-6653699737401977224?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/6653699737401977224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=6653699737401977224' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/6653699737401977224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/6653699737401977224'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/12/blog-post_21.html' title='我早就说过'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-9025244071498164644</id><published>2011-12-18T14:26:00.001+08:00</published><updated>2011-12-18T14:26:15.547+08:00</updated><title type='text'>pics</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-ns9C2slGPwo/Tu2HiKo0m_I/AAAAAAAAM-g/BUSvTgDDNt4/s1600/IMG_7601-775548.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/-ns9C2slGPwo/Tu2HiKo0m_I/AAAAAAAAM-g/BUSvTgDDNt4/s320/IMG_7601-775548.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5687350925479681010" /&gt;&lt;/a&gt;&lt;/p&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-9025244071498164644?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/9025244071498164644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=9025244071498164644' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/9025244071498164644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/9025244071498164644'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/12/pics_18.html' title='pics'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-ns9C2slGPwo/Tu2HiKo0m_I/AAAAAAAAM-g/BUSvTgDDNt4/s72-c/IMG_7601-775548.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-2412451261522636077</id><published>2011-12-18T00:09:00.001+08:00</published><updated>2011-12-18T00:09:24.798+08:00</updated><title type='text'>穷人如何使用测试驱动开发进行重构</title><content type='html'>穷人如何使用测试驱动开发进行重构&lt;p&gt;重构这个词现在已经被用烂了。我们经常听经理啥的说，咱们应该把系统重构一&lt;br&gt;下。当他用重构这个词的时候，想表达两个意思。一，把这个系统重写一遍，大&lt;br&gt;手术，二，我很fation.&lt;p&gt;重构具有更严格的意义，就是需要在重写的同时，保证系统原有的功能。如果对&lt;br&gt;系统原有的功能不变做出保证呢？&lt;p&gt;我听过很多人保证：我的U盘绝对没有病毒。你用什么保证。我见过用脑袋保证&lt;br&gt;某事的，最后，他的脑袋还留在他自己的脖子上。我并非对他的脑袋搬移有什么&lt;br&gt;兴趣，而是想说，他的脑袋确实很值钱，但是于我却毫无用处。&lt;p&gt;我们用什么保证？胡适先生说：证据。测试驱动开发能给出证据。&lt;p&gt;测试用例如果在重构前和重构后都通过，就说明重构至少在功能不变上是成功的。&lt;p&gt;重构有不少好工具了，可是对于我等穷人，没有大公司啥的作为支撑，有时机器&lt;br&gt;连eclipse跑不起来都不顺畅。没有利器，如果重构？&lt;p&gt;测试驱动开发也有不少好工具，可是如果你用的既不是C++也不是Java，甚至&lt;br&gt;&lt;a href="http://xn--w73a.net"&gt;连.net&lt;/a&gt;也不是，cppunit,junit这些工具又如何助力呢？&lt;p&gt;刘慈欣先生在《全频道阻塞干扰》的最后，让被逼到毫无退路的美国军官说：我&lt;br&gt;们的祖先也不是最开始就有坦克大炮导弹核武器的，士兵们，上刺刀。&lt;p&gt;我们总可以在更原始的工具中找到新技术的精神，因为牛人们从前就是以此这些&lt;br&gt;丑陋陈旧的工具创造了这些新的技术。&lt;p&gt;昨天还是前天，二猫像个小大人一样一直坐桌前陪我吃饭，跟我聊。谈到她喜欢&lt;br&gt;吃这个吃那个。这几乎就是目前她生活的全部，所以有些事情是她想不到的。&lt;p&gt;我说：爸爸小的时候没吃过香蕉。&lt;p&gt;她问：为什么不吃？你不喜欢吃么。&lt;p&gt;我说：因为买不起。&lt;p&gt;她问：香蕉很贵么？&lt;p&gt;我说：不贵，是我没有钱。&lt;p&gt;我曾经教育才外教Dave同学。是的，教育，爱国主义教育。他看到我读《鸿：中&lt;br&gt;国的三个女儿》，问我：允许你读这种书么？&lt;p&gt;我说：啥？为什么不能。&lt;p&gt;他说：这书不是中国出版的。&lt;p&gt;这书确实不是咱们出版的，是阿于同学从美国给我带回来的。&lt;p&gt;这面这段对话可以看出，他对于陌生的国度有怎么的不了解。所以，在后来，我&lt;br&gt;对他进行了如下教育：&lt;p&gt;我问：你是不是以为俺们政府真的就挺虐待她一家的，她家还给俺们做出那么多&lt;br&gt;贡献和牺牲。他说，是啊。我说：那我来给你讲一些事。&lt;p&gt;作者，五岁的时候，因为不喜欢上幼儿园，把牛奶倒在桌子上，挨了批评，很委&lt;br&gt;屈。&lt;p&gt;Dave说：我记得这个情节。淘气的女孩。&lt;p&gt;我以为，不打死她个败家的就已经是手下留情了。中国很多孩子至今都不能每天&lt;br&gt;喝上牛奶，我在大学以前，就很少喝到牛奶。&lt;p&gt;他很难相信。&lt;p&gt;我再问：你记不记得，她妈妈去医院（或者临时监狱？）看她爸，因为不能坐单&lt;br&gt;位的车（她爸单位的），而只能骑着自行车。你认为这很艰苦？&lt;p&gt;他说：是。&lt;p&gt;我告诉他：那是195X年，整个中国，就没有几个人有自行车。我想，不亚于现在&lt;br&gt;的宝马吧。直到197X年，20年后，自行车仍然是结婚时必备的四大件之一。可&lt;br&gt;见，它多么昂贵。&lt;p&gt;同样的数据，同样的事实，我们可能得到完全不同的结论。&lt;p&gt;但是，即使我们买不起香蕉也仍然活了下来。重构，测试驱动开发，也是一样。&lt;br&gt;尤其是在最艰苦的时候，比如你所用的语言没有测试驱动工具，就更能体现出穷&lt;br&gt;人方法的必要性。&lt;p&gt;1. 我们假设所有的输出都是向控制台的。&lt;p&gt;至于gui程序，你可以先写一个console版本，让未来要写的gui与console版本使&lt;br&gt;用相同的业务逻辑库，凡是与计算机的机制无关，而与用户特定需求的，都放这&lt;br&gt;里。gui消失触发以后，别的啥也不干，调用业务逻辑库中的某个函数。&lt;p&gt;2. 先跑一把程序，整个输出，重定向到一个文本文件里。&lt;p&gt;这时，输出的文本文件十有八九不是你想要的。因为特别简单的程序，会轻量级&lt;br&gt;到甚至无须测试驱动开发。&lt;p&gt;3. 手动修改这个文本文件，改成你最后需要输出的样子，重命名为&lt;br&gt;expected.txt。&lt;p&gt;这就是以后我们用以对比的素材了。&lt;p&gt;4. 跑你的程序，改它，再跑，再改。估计好多人都要先改语法错误，让编译通&lt;br&gt;过。&lt;p&gt;始终把输出由控制台重定向到 output.txt。这样做：&lt;p&gt;假如你有输入文件的话，那么，假定它命名为 input.txt。&lt;p&gt;program.exe &amp;lt; input.txt &amp;gt; output.txt&lt;p&gt;5. 当你需要测试驱动的时候，执行这样一条指令：&lt;p&gt;diff output expected.txt&lt;p&gt;如果啥结果也没输出，成功了。我第一次见到比较成功的时候没有输出，很惊度。&lt;br&gt;李记者教导我说，diff么，就是找不同，没有不同，它就应该不吱声。&lt;p&gt;如果有任何输出，你的程序仍然没有符合要求，继续改，继续跑。&lt;p&gt;6. 以上，是测试驱动开发。测试驱动开发，是重构的前提。没有测试驱动，一&lt;br&gt;次次用眼睛在程序输出里找你想要发现的错误或者期待的字符，你就是在构建性&lt;br&gt;能可怜而其实非常宝贵的人肉计算机。&lt;p&gt;如果不同太多，你又想找特定的字符，请使用 grep。&lt;p&gt;7. 以上的 diff 和 grep 是标准unix系统的小工具，所有的Linux版本里都有。&lt;br&gt;如果你使用windows，那么，可以下载 mingw &amp;amp; msys，或者 gnuwin&lt;br&gt;[&lt;a href="http://gnuwin32.sourceforge.net/"&gt;http://gnuwin32.sourceforge.net/&lt;/a&gt;]。&lt;p&gt;8. 关于重构，补充一点。&lt;p&gt;想各种办法，始终保持约20分钟内，代码可以编译和运行和测试通过。尽可能不&lt;br&gt;要冒险长时间不编译或不运行或者测试不通过。你可能会期待在一个大~~~的不间&lt;br&gt;断的重构之后，代码一下子跑起来了，而且正常了。&lt;p&gt;这就像打算沿着海岸游泳到达某个地方，我们可能遇到一个海湾，抄近路似乎一&lt;br&gt;下子就过去了。你可以想像一下，从丹东到青岛，一种方案是沿着渤海湾一次半&lt;br&gt;公里，另一种方案是取直线。取直线，真的是极富有吸引力。毕竟，我们编程大&lt;br&gt;半是为了快感，而不是为了资本家。可是，如果你沉了呢，后果很严重。这也是&lt;br&gt;为什么需要测试驱动开发的原因。&lt;p&gt;小步的迭代，每步都要确保能活着再次接触海岸。我妈说了：宁走十步远，不走&lt;br&gt;一步险。&lt;p&gt;我曾经4个小时左右，不编译，不执行，不测试，这个期间程序就跟大手术尚未缝&lt;br&gt;合，根本不能跑。一下子跑起来，是的，非常兴奋。可是，也有几个小时以后完&lt;br&gt;成失败，甚至回滚到几分钟前都没有意义，只能一下回滚到几小时以前。那种挫&lt;br&gt;败感也令人印象深刻。这些经历，我知道你也有，就像牛仔的伤疤，如果没死是&lt;br&gt;大可以拿出来显摆的。&lt;p&gt;不过，还是每天写一点，每小时写一点，20分钟写一点。以微小的可控的单位前&lt;br&gt;进。像竹子那样，每走一步，就要做个小节。&lt;p&gt;未来无限美好，此刻却虚无飘渺。如果有经理老板导师男朋友女朋友对你这样&lt;br&gt;说，你就给他讲讲测试驱动开发和重构的道理。&lt;p&gt;----&lt;p&gt;完成所有今天能完成的任务，喝一杯咖啡，然后倒头大睡。人生当如此，哪怕就&lt;br&gt;此长眠，也了无遗憾。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-2412451261522636077?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/2412451261522636077/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=2412451261522636077' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/2412451261522636077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/2412451261522636077'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/12/blog-post_18.html' title='穷人如何使用测试驱动开发进行重构'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-5732142823042454996</id><published>2011-12-16T23:03:00.000+08:00</published><updated>2011-12-16T23:04:18.459+08:00</updated><title type='text'>pics. gone with the wind</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-eAvWccVr1Us/Tutd83XkucI/AAAAAAAAM-E/Tow6N-rcm8I/s1600/20111216-758460.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-eAvWccVr1Us/Tutd83XkucI/AAAAAAAAM-E/Tow6N-rcm8I/s320/20111216-758460.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5686742254721743298" /&gt;&lt;/a&gt;&lt;/p&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-5732142823042454996?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/5732142823042454996/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=5732142823042454996' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/5732142823042454996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/5732142823042454996'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/12/pics-gone-with-wind.html' title='pics. gone with the wind'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-eAvWccVr1Us/Tutd83XkucI/AAAAAAAAM-E/Tow6N-rcm8I/s72-c/20111216-758460.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-2687950765711269038</id><published>2011-12-16T18:27:00.001+08:00</published><updated>2011-12-16T18:27:34.759+08:00</updated><title type='text'>一见钟情 vs. 众里寻他</title><content type='html'>一见钟情 vs. 众里寻他&lt;p&gt;1.搜索与遍历&lt;p&gt;一见钟情 与 众里寻他千百度，是爱情的两种境界，这在文本编辑和软件工程中&lt;br&gt;也经常遇到。&lt;p&gt;我们最经常进行的文本编辑是编程序。请考虑一下这个情境，你要跳到文本的某&lt;br&gt;个位置。&lt;p&gt;相信有不少人的右手伸向了鼠标，是打算去用滚轮了吧。但是，这并不是最快的&lt;br&gt;方法，而且是一种打算你思路的方法。&lt;p&gt;什么样的情况最可能发生一见钟情？当你不知道自己想要的是什么样的人。那&lt;br&gt;么，你就只好一个一个一个一个看下去，直到遇到某一个，你感叹&amp;quot;啊，原来上&lt;br&gt;天为我准备好的那个人就在这里！&amp;quot;&lt;p&gt;心理学告诉我们，在这之前，你的心中早就有一个对象的原型了。但是，你一直&lt;br&gt;可能都不知道。你看那一个一个一个一个的时候，每个都要判断，是这样么，是&lt;br&gt;那样么。&lt;p&gt;如果我们换成众里寻他模式，情况会完全不同。这时，你事先就知道自己想要的&lt;br&gt;是什么。我们俗一些，比如：年薪百年，年少俊美，恩，还有很简单的要求，大&lt;br&gt;落地窗，大大的浴缸和大大的床。对了，还有满床的阳光。&lt;p&gt;那么，就好办了。你根本不用一个一个...地看下去。因为全世界绝大多数人都&lt;br&gt;不符合你的要求。要求越明确就越容易实现，或者被否定。&lt;p&gt;有人可能会说，这本身就是一个学习的过程。爱情我就不懂了，文本编辑的时候&lt;br&gt;跳转到你想去的地方，那不是一个渐近的学习的过程，而是：&lt;p&gt;要么，你知道自己要跳到哪里；要么，你不知道自己要跳到哪里。&lt;p&gt;如果你一行一行地看下去，停下来挠挠，上上人人网，听会歌，又很心烦，又一&lt;br&gt;行一行看回去。我打赌一块钱，你不知道自己想要到哪里去。&lt;p&gt;请对比女性和男性去商场买东西。女性可以不断地比较，了解，徘徊，而男性直&lt;br&gt;达目标，买到或买不到，然后就走了。为什么？因为我们的祖先里，女性是采摘&lt;br&gt;者，她们可以站那儿比较这个果子和那个果子，果子是不会跑掉的也不会烂掉的。&lt;br&gt;而男性是猎人，就这么一只兔子，打还是不打，一犹豫，肥不肥，毛色如何，白&lt;br&gt;不白，可爱么。这些都是好问题，不过，你的兔子已经跑了。&lt;p&gt;更可怕的是，当你在森林中遇到一头黑熊。然后，你开始犹豫。&lt;p&gt;我们应该做的是：断然按下 ctrl-s 输入你想要去的地方，然后回车。&lt;p&gt;接下来继续你的工作。&lt;p&gt;一行一行地看下去，你也会找到想要的地方，但是这中间的过程，会打断你的思&lt;br&gt;路。这就是目录、书签、回城卷轴存在的目的。&lt;p&gt;当你去找某个朋友的时候，会挨个屋子推开门，然后施施然进去一个个对比么。&lt;br&gt;先知道你想要的，然后行动。&lt;p&gt;遍历一行行，就是在等待自己终于知道想要的是什么。这个过程也是很美好的，&lt;br&gt;可叹人生缺少时间去经历。或者，别人缺少时间。&lt;p&gt;2. 搜索 vs. 选择&lt;p&gt;常看到有人这样看网页，一下下往下翻，只右手抓着鼠标，眼睛盯着某一处，别&lt;br&gt;的地方都不与计算机接触。&lt;p&gt;这是被动的信息获取方式，就像发呆的同学看着老师的嘴一张一合。你同意某个&lt;br&gt;观点么，你不同意某个观点么，你事先预想了作者可能的观点么，你如何表达赞&lt;br&gt;同或者反对。&lt;p&gt;还是，你毫无意见，只是想经历一下这个世界。&lt;p&gt;看到不少同学在使用搜索引擎时遇到困难。为什么他总是找不到想要的东西呢？&lt;br&gt;因为他没有预设当他要表达这个信息的时候，会使用什么样的措辞。更深层次，&lt;br&gt;因为他不表达。搜索引擎需要你大声地喊出你要什么，然后他帮你找到。&lt;p&gt;在网络上还有另一种东西，与搜索引擎不同的，类似黄页，叫open directory,&lt;br&gt;比如[&lt;a href="http://dmoz.org/%5D%E3%80%82"&gt;http://dmoz.org/]。&lt;/a&gt;它像个殷勤的小跟班，老板，你要这个么，老板，你&lt;br&gt;要那个么。&lt;p&gt;它与搜索引擎最大的不同是：它不需要你*主动*地表达。你只要对某个选项点头&lt;br&gt;就可以了。&lt;p&gt;想到ABCD单选题了么。当你拥有选择的自由的时候，你失去了所有其他的可能。&lt;br&gt;只有随心所欲的表达，才是真正的自由。如果心里没有，那么连枷锁都不&lt;br&gt;需要。&lt;p&gt;主动搜索，而不是选择各种别人提供的可能。&lt;p&gt;武侠小说里的高手们，往往能在对手有弱点的地方，等着对方撞过来。那是因为&lt;br&gt;他们预判，知道对方要做什么。对未来的预测，也是主动搜索的一种。更高级&lt;br&gt;的，不是等对方如何，而是引导他去做。&lt;p&gt;3. 规模&lt;p&gt;在信息量少的时候，你当然可以慢慢地阅读。我想这是大多一只手看网页的人这&lt;br&gt;么做的原因--他的生命有足够的时间。&lt;p&gt;但是，有时不行。比如系统管理员查日志的时候。日志有成万上百万行，你绝无&lt;br&gt;可能有足够的时间一行行看下去，慢慢形成对故障现象的认识，一行行去看某行&lt;br&gt;是不是记录了故障发生的原因。&lt;p&gt;所以，你必须事先知道故障看起来应该是什么样子。然后，不是让那些行在你眼&lt;br&gt;前飞过，抓住符合特征的那行，而是使用grep，用匹配字符串或者正则表达式匹&lt;br&gt;配来搜索故障。&lt;p&gt;使用这些工具，瞬间，通常不到一秒，可以完成。前提是，你要知道你要想的是&lt;br&gt;什么。并且，你要用语言描述出来。&lt;p&gt;五笔打字比拼音快的原因，就在于，五笔是不必选择的。时间就消耗在你在一大&lt;br&gt;堆选项里跋涉。命令行比菜单快的原因也在于此。旋钮的微波炉比按键电脑的容&lt;br&gt;易使用的原因，也在于此。因为不必交互。&lt;p&gt;如果你找不到你想要的，而他事实上是存在的，十有八九，是你并不知道你想要&lt;br&gt;的是什么。&lt;p&gt;3. 现实生活&lt;p&gt;而现实是残酷的。&lt;p&gt;我们经常见到点菜的时候，你我就这么做过，我们对付账的人说：随便。&lt;p&gt;我们经常见到领导不明确说出自己想要的，而是等下属提出或实现出几种，然后&lt;br&gt;点头一种，其余的否定。&lt;p&gt;我们经常见到清宫剧里的皇儿上儿，是这么个发音吧，他一句话也不说，等奴才&lt;br&gt;们实现各种方案，然后嘉许一种，其余的斥责。&lt;p&gt;我们可以看到，这些主子并不表达自己想要的还不是最糟糕的部分，最糟糕的部&lt;br&gt;分是他还会对你的实现做出评价。&lt;p&gt;所以，那些能指别人需要却不能或无能说出来的人，都是牛人。&lt;p&gt;比如心理医生，他说：你看，你就是这么这么这么想的，所以这事也没啥。然后&lt;br&gt;你点头，对啊，我早就该知道我是这么想的。&lt;p&gt;你之外的另一个人，比你更了解你想要什么。&lt;p&gt;但是，说&amp;quot;对对，这就是我想要的那个人&amp;quot;，在现代社会，往往是病人，而不是君&lt;br&gt;主。或者既是病人，也是君主。&lt;p&gt;你是不是点头了？对对，这就是我想要的。&lt;p&gt;我们习惯于在交互中表达。我们说了一小段，然后等别人的肯定或否定，或复&lt;br&gt;述，然后才敢于或舍得继续下去。而在真正有价值的交流中，这样的沟通太低效&lt;br&gt;了。&lt;p&gt;当你写作论文，文献，手册的时候，如果你的表达不够清晰严谨，读者要做的比&lt;br&gt;喝令你闭嘴还简单，他会直接关闭文档转身走开。他绝不会巴巴地问&amp;quot;您老要说&lt;br&gt;的是不是啥啥啊&amp;quot;，然后你说，&amp;quot;着啊，小某子，进步了啊。&amp;quot;这绝不会发生。&lt;p&gt;想要求别人理解领导的心思，需要一个前提，那就是你得是领导。而写论文、文&lt;br&gt;献、手册的人，往往都是被领导的。&lt;p&gt;哲学家们写作时也是一样。他们思考世界我们啥的都是怎么回事。可悲的是，每&lt;br&gt;个时代，或者几个时代，才出一个哲学家。他们都非常孤独。我读罗素&amp;lt;西方哲&lt;br&gt;学史&amp;gt;的时候，每每感叹，谁谁太孤独了，等到一个能读他的人出生的时候，他&lt;br&gt;都死了好几百年了。&lt;p&gt;如果这些哲学家们以信赖于交互的方式写作，他们对于世界的思考，一行字也不&lt;br&gt;会传下来。他们边写作边猜测，我们会如何理解这段话，会有二义性么，会误解&lt;br&gt;到什么程度。我们读不懂，不是他们写得诲涩，而是因为这东西就是这么难，同时，&lt;br&gt;我们就是这么面。&lt;p&gt;我们面到不仅不清楚领导想要什么，有时候甚至不清楚自己想要什么。&lt;p&gt;人人网上我见到有同学抱怨机房在课前开得太晚了，只有&amp;quot;到点&amp;quot;的时候才能放同&lt;br&gt;学们进去。我提醒一点：机房的老师要做准备工作。&lt;p&gt;要做哪些准备工作呢，我不权威，只能猜测。机房的卫生（请回想我们扔的瓜果&lt;br&gt;皮壳和饮料瓶）、重启机器、维护机器处于正常状态、电力系统保养。&lt;p&gt;如果每次课前没有打扫，同学们可能会抱怨卫生不好。如果打扫，同学们可能会&lt;br&gt;抱怨机房没有&amp;quot;提前&amp;quot;让大家进入。&lt;p&gt;我们有时候不知道自己想要什么，或者，没有意识到我们想要的是矛盾的。又想&lt;br&gt;让马儿跑，又不想让马儿吃草。&lt;p&gt;不仅同学，老师们导师们老板们领导们也经常如此。&lt;p&gt;4. 表面&lt;p&gt;表面上，我们只要知道自己想要的，就可以搜索了。但是，很多时候，我们所知&lt;br&gt;道的，不过是表面上的需求。&lt;p&gt;用户需求到分析，这个过程可以use-case driven，让用户讲故事啥的，了解他&lt;br&gt;们想要什么。他们一定会说真话么？&lt;p&gt;我们自己，说的就是真话么？&lt;p&gt;有人追求传统，有人追求流行。表面上看差异很大，无外乎追求 认同。追求传统&lt;br&gt;的人说：我是优秀啥啥，才不屑于啥啥。追求流行的人也这样说。&lt;p&gt;但是，在否定自己不是什么人的同时，传统与流行，都不过是*别人的*，老了的&lt;br&gt;死了的那群人认同的观点，或者当前大众认同的观点。&lt;p&gt;连追求小众的人，都是希望更好地获得小集团的认同。为了小集团，甚至不惜违&lt;br&gt;背更大范围和更长历史的认同。&lt;p&gt;我们自己，说的就是真话么？&lt;p&gt;我们觉得大人物们渺视我们是他们愚蠢，觉得我们渺视更小的人物，那也是因为&lt;br&gt;他们愚蠢，但是我们没有质问人物应该有大小么？我们追示隐身查看好友，追求&lt;br&gt;星星月亮图标的的差异。我们想开宝马车，想坐红旗。表面上，我们追求的是与&lt;br&gt;众不同，但是，我们追求的是与某一部分&amp;quot;众&amp;quot;不同，期待的是对我们的高等级的&lt;br&gt;认同，对我们所获得的特权的认同。&lt;p&gt;我们批评学生，表面上是为了他们好，而有些时候，不过是为了维护自己的威权。&lt;br&gt;更有甚者，我们还可以说：这是为了让他们到社会上的时候不吃亏。&lt;p&gt;我们自己，说的就是真话么？&lt;p&gt;5. 规范&lt;p&gt;以上，搜索时，我们希望自由地随心所欲的表达，但是，这真的那么容易实现&lt;br&gt;么？为什么会有菜单的存在。&lt;p&gt;是为了规范和限制一部分人的行为。&lt;p&gt;写代码的时候，黄同学告诉我：appfuse会按java规范，把所有下划线删除，把下&lt;br&gt;划线后的字母转成大写。这可以避免程序员犯非常愚蠢的错误，强制使用骆驼符&lt;br&gt;号法，同时它拒绝了程序员的自由选择。&lt;p&gt;因为它认为你是愚蠢的，所以，你没有能力自由表达，再所以，你没有资格拥有&lt;br&gt;自由表达的权利。&lt;p&gt;我们捂住孩子的眼睛，我们给他们一块红布。告诉他们，这个世界是什么样的，&lt;br&gt;而不允许他们伸出手去触碰哪怕一点点细菌。&lt;p&gt;请不要联想太过丰富，至少在工程上，菜单有存在的必要。不是受用户的智商&lt;br&gt;所限，而是他们时间太紧，没有功夫接受培训。&lt;p&gt;6. 领导&lt;p&gt;当领导划出道道来，说这就是解决问题的全部可能方案，你只需选择的时候，那&lt;br&gt;就是你失去创新的时候。那是领导的创新。&lt;p&gt;在工程上，我们按受上级指派的任务，按规定的方案实施。那是因为技术的差异&lt;br&gt;和责任承担范围的不同，我们在自己的领域内仍然可以创新，不是因为上级的等&lt;br&gt;级更高，也不是因为上级拥有更多更好的特权。&lt;p&gt;当GFW封住因特网，告诉我们只要看什么就能富国强民创新科技的时候，我就想&lt;br&gt;起了以上这些。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-2687950765711269038?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/2687950765711269038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=2687950765711269038' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/2687950765711269038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/2687950765711269038'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/12/vs.html' title='一见钟情 vs. 众里寻他'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-8250723572192050628</id><published>2011-12-15T17:52:00.001+08:00</published><updated>2011-12-15T17:52:38.979+08:00</updated><title type='text'>pics</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/--2qhGE1IEwI/TunDZ13BziI/AAAAAAAAM80/sKVJKMjeMFc/s1600/IMG_7534-758979.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/--2qhGE1IEwI/TunDZ13BziI/AAAAAAAAM80/sKVJKMjeMFc/s320/IMG_7534-758979.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5686290853253991970" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-GgNhWB0Rdxg/TunDaZP_SJI/AAAAAAAAM9c/l0nZo-iWGxI/s1600/IMG_7535-760958.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/-GgNhWB0Rdxg/TunDaZP_SJI/AAAAAAAAM9c/l0nZo-iWGxI/s320/IMG_7535-760958.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5686290862753925266" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/-_vutXdzuo0U/TunDblINvDI/AAAAAAAAM9s/ZsSuBby_6pU/s1600/IMG_7593-766529.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/-_vutXdzuo0U/TunDblINvDI/AAAAAAAAM9s/ZsSuBby_6pU/s320/IMG_7593-766529.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5686290883122412594" /&gt;&lt;/a&gt;&lt;/p&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-8250723572192050628?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/8250723572192050628/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=8250723572192050628' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/8250723572192050628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/8250723572192050628'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/12/pics_15.html' title='pics'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/--2qhGE1IEwI/TunDZ13BziI/AAAAAAAAM80/sKVJKMjeMFc/s72-c/IMG_7534-758979.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-6669998021670415885</id><published>2011-12-11T00:34:00.001+08:00</published><updated>2011-12-11T00:34:33.854+08:00</updated><title type='text'>罗马十二铜表法的进步与软件工程需求与原型实验</title><content type='html'>罗马十二铜表法的进步与软件工程需求与原型实验&lt;p&gt;&amp;quot;十二铜表法就其阶级实质说，是一部分严格维护私有财产，维护贵族利益的法典。&lt;br&gt;然后，十二铜表法的颁为罗马法的发展奠定了基石，是整个罗马历史的发展过程&lt;br&gt;中的一座里程碑。尽管法律条文极力地对贵族的特权地位加以维护，例如，在第&lt;br&gt;十一表的内容中，强调了&amp;quot;平民与贵族不得通婚&amp;quot;。可是，制定法律并将其以文字&lt;br&gt;形式公布于众，本身就是法律史上的一个巨大进步。从此，国家对法律行为的有&lt;br&gt;效、无效、赔偿、处罚等都有了明确的规定，在一定程度上限制了贵族官吏的专&lt;br&gt;横。&amp;quot;&lt;p&gt;罗马：从共和走向帝制&lt;br&gt;宫秀华 著&lt;br&gt;高等教育出版社&lt;br&gt;2006年7月第2版&lt;p&gt;这个故事告诉我们，在软件工程中，清晰的需求，哪怕是错误的，也比模糊的需&lt;br&gt;求要好。甚至可以说，模糊的需求比没有需求更坏。&lt;p&gt;陈述观点的时候也是一样，清晰的观点，即使是错误的，也可以拿出来作为靶子&lt;br&gt;进行充分的讨论。&lt;p&gt;鲁迅先生说：水有的浅而清,有的深而浊,有的浅而浊,有的深而清.世间的人,大凡&lt;br&gt;可归此四种.宁可要浅而清的人,也不要深而浊的人.&lt;p&gt;所以，我们听完别人的观点，可以复述一遍：我理解的是否你的原意？&lt;p&gt;当我们读完教材或者文献，不妨做个实验，验证一下我们对于理论的理解是否正&lt;br&gt;确。这就是工程原型。如果原型是错误的，我们的代价相对较小，如果没有原&lt;br&gt;型，等到工程正式实施的时候，代价则可能是惨重的。&lt;p&gt;当我们操作真实世界的时候，由于要花费水泥沙子木料，所以我们相对谨慎。其&lt;br&gt;实，当我们操作虚拟世界的时候也是一样，因为我们正在花费更宝贵的东西，你&lt;br&gt;的时间。&lt;p&gt;尽早发现错误，则损失比更晚发现要少，因为如果错误保持下去，我们还将在此&lt;br&gt;基础上做很多工作，这些工作都将废弃。&lt;p&gt;尽早发现错误的一个方法就是，尽可能清晰地描述。&lt;p&gt;这就又回到了老问题上：你真正想要的，是什么？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-6669998021670415885?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/6669998021670415885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=6669998021670415885' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/6669998021670415885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/6669998021670415885'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/12/blog-post.html' title='罗马十二铜表法的进步与软件工程需求与原型实验'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-3171954484691616741</id><published>2011-12-06T23:06:00.001+08:00</published><updated>2011-12-06T23:06:07.907+08:00</updated><title type='text'>pics</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/-ox5opeYU_a8/Tt4vYHBq1nI/AAAAAAAAM8k/MnGtj62dS7o/s1600/IMG_7532-767908.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/-ox5opeYU_a8/Tt4vYHBq1nI/AAAAAAAAM8k/MnGtj62dS7o/s320/IMG_7532-767908.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5683031871037560434" /&gt;&lt;/a&gt;&lt;/p&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-3171954484691616741?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/3171954484691616741/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=3171954484691616741' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/3171954484691616741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/3171954484691616741'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/12/pics_5515.html' title='pics'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-ox5opeYU_a8/Tt4vYHBq1nI/AAAAAAAAM8k/MnGtj62dS7o/s72-c/IMG_7532-767908.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-8536144724214622115</id><published>2011-12-06T22:54:00.001+08:00</published><updated>2011-12-06T22:54:36.516+08:00</updated><title type='text'>pics</title><content type='html'>.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-8536144724214622115?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/8536144724214622115/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=8536144724214622115' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/8536144724214622115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/8536144724214622115'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/12/pics_06.html' title='pics'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-4755112318044571701</id><published>2011-12-06T00:17:00.001+08:00</published><updated>2011-12-06T00:17:37.425+08:00</updated><title type='text'>源代码：使用Antlr+Stringtemplate生成method chaining，一个不太简单的案例</title><content type='html'>源代码：使用Antlr+Stringtemplate生成method chaining，一个不太简单的案例&lt;p&gt;在[&lt;a href="http://antlr.org/share/1323101639207/antlr.zip"&gt;http://antlr.org/share/1323101639207/antlr.zip&lt;/a&gt;]&lt;p&gt;里面有所有源代码和正文。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-4755112318044571701?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/4755112318044571701/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=4755112318044571701' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/4755112318044571701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/4755112318044571701'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/12/antlrstringtemplatemethod-chaining.html' title='源代码：使用Antlr+Stringtemplate生成method chaining，一个不太简单的案例'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-4983284359593768145</id><published>2011-12-05T22:50:00.001+08:00</published><updated>2011-12-05T22:50:13.170+08:00</updated><title type='text'>使用Antlr+Stringtemplate生成method chaining，一个不太简单的案例（6）</title><content type='html'>使用Antlr+Stringtemplate生成method chaining，一个不太简单的案例（6）&lt;br&gt;- 题外话&lt;br&gt;在森林里迷路的时候，我们希望手里有一张地图，还要有个指南针。我们心里有一个目标，要到那里去。&lt;br&gt;这是很多人首先想到的。还缺什么呢？还缺少我们当前的位置。你只有知道到自己在哪里，才能接下来的步骤。&lt;br&gt;我们要开发一个杨氏语言编译器，用 input.pipe 中的那些指令，生成C++代码。在这条路上，我们已经走了多远。&lt;br&gt;我们根据输入的格式确定了语法 pipe.g，根据输出的格式确定了模板st/header.stg，根据语法制导写翻译出了语义动作&lt;br&gt;decl.g。我们在decl.g中应用了模板。&lt;br&gt;接下来，我们需要一个东西，它能够把 调用 pipe.g 和 &amp;#160;decl.g，并且输入文件 pipe.g 输给它们。严格的说，被调用的不是&lt;br&gt;*.g，而是antlr由 *.g 生成的词法解析、语法解析、AST遍历的java程序。&lt;br&gt;这个推动大跑的东西，可以名之为 driver，它是个java程序。&lt;br&gt;- driver java&lt;br&gt;这个程序是用于header生成的，所以我们称之为 header.java。你可能还记得，我们不只要生成头文件，还有cpp和go.cpp。&lt;br&gt;代码不复杂，但是略微有点长，我们分成三段来看。&lt;br&gt;-- 头部&lt;br&gt;我得承认，我没有命名的天份。除了头部，我还是想不出什么名字称呼这一段。在java中，它应该有专门的术语吧。&lt;br&gt;代码1：1 import java.io.*;2 import org.antlr.runtime.*;3 import&lt;br&gt;org.antlr.runtime.tree.*;&lt;br&gt;因为我们要在程序里用到这些类，所以import进来。这是常规的java写法。&lt;br&gt;题外话：有的时候，我们因为初涉足一个全新的领域，动物本能让我们保持恐惧和谨慎。在进化中，这具有优势，凡是连那是什么都不知道，就敢去碰敢吃的家伙，都年纪轻轻时候就死掉了，没有机会成为我们的祖先。所以，我们每个人的身上都保留了这样的特质。但是在学习中，有的时候，恐惧和谨慎可能过了头，阻碍我们。&lt;br&gt;我初中的时候参加数字竞赛培训。通化的初中分为山上片和山下片，山下片--我不记得那个时候的术语了--山下片的的生源较好，或者说那是富人区。我惊恐地看到老师才把题写到黑板上，有的学校的同学答案就出来了。这令我震恐。你可以想像一个非常非常难，你一辈子可能都编不出来的程序，一位大牛抽着烟喝着茶，可能还看着碟，谈笑间就写出来了。当你佩服得五体投地时，他说：没啥，就是个小小地练习。&lt;br&gt;这就是我当时的感觉。后来我看到老师写了一个式子，要因式分解的：&lt;br&gt;a^2 - b^2&lt;br&gt;全班同学瞬间就解出来啦。(a+b)(a-b)。而我完全不知道他们是怎么解出来的。我毛了，小声问旁边的同学，&amp;quot;这是咋整出来的啊。&amp;quot;如果我现在不问，老师马上就讲过去啦。&lt;br&gt;他说：这非常简单。&lt;br&gt;是的，那确实非常简单，是因式分解中最简单的公式之一，叫平方差公式，就是这个公式本身，不是灵活应用。&lt;br&gt;你明白我的意思了。恐惧，阻碍我们思考，让我们不敢假设。&lt;br&gt;其实上面的那些import就是java本身，因为我们正写的，就是java程序。纯正的，不是.g文件中的。我这么说的意思就是：.g文件的那些{}中的动作，也不过就是java程序而已，只是出现的位置略有些奇怪。如果你知道它们会在什么时候执行，就与java无异。&lt;br&gt;-- 词法和语法&lt;br&gt;接下来，我们在一个类 header 里跑 main函数。&lt;br&gt;代码2：45 public class header {6 &amp;#160; &amp;#160; public static void main(String&lt;br&gt;args[]) throws Exception {7 &amp;#160; &amp;#160; &amp;#160; &amp;#160; pipeLexer lex = new pipeLexer(new&lt;br&gt;ANTLRFileStream(args[0]));8 &amp;#160; &amp;#160; &amp;#160; &amp;#160; CommonTokenStream tokens = new&lt;br&gt;CommonTokenStream(lex);9&amp;#160;10 &amp;#160; &amp;#160; &amp;#160; &amp;#160; pipeParser parser = new&lt;br&gt;pipeParser(tokens);11 &amp;#160; &amp;#160; &amp;#160; &amp;#160; pipeParser.starting_return r =&lt;br&gt;parser.starting(); // launch parsing12 &amp;#160; &amp;#160; &amp;#160; &amp;#160; if ( r!=null )&lt;br&gt;System.out.println(&amp;quot;parser tree:&lt;br&gt;&amp;quot;+((CommonTree)r.tree).toStringTree());13&amp;#160;14&lt;br&gt;System.out.println(&amp;quot;---------------&amp;quot;);15&lt;br&gt;这个main函数的前半段，如上所述。&lt;br&gt;第7行，我们构造了一个 词法分析器。&lt;br&gt;7 &amp;#160; &amp;#160; &amp;#160; &amp;#160; pipeLexer lex = new pipeLexer(new ANTLRFileStream(args[0]));&lt;br&gt;其中 pipeLexer 这个类的名字是这么来的：pipe是我们的grammar的名字，参见pipe.g（请参考昨天博客里的pipe.g源代码。）；&lt;br&gt;Lexer是词法分析器的意思。&lt;br&gt;new ANTLRFileStream(args[0]) 的意思，是以此作为词法分析器的输入。&lt;br&gt;我们用这个lexer做什么呢？&lt;br&gt;8 &amp;#160; &amp;#160; &amp;#160; &amp;#160; CommonTokenStream tokens = new CommonTokenStream(lex);&lt;br&gt;我们用它作为参数，构造了一个 CommonTokenStream。token 的流。&lt;br&gt;这个流用来做什么呢？&lt;br&gt;10 &amp;#160; &amp;#160; &amp;#160; &amp;#160; pipeParser parser = new pipeParser(tokens);&lt;br&gt;我们用这个流构造了 pipeParser，这是一个&lt;br&gt;（语法的）解析器。类似pipeLexer，pipeParser的名字由两部分组成：pipe是grammar的名字，Parser是解析器。&lt;br&gt;pipeLexer，pipeParser这两个类的名字，是antlr处理pipe.g时生成的两个类。就是我这一篇博客上面提到的&lt;br&gt;&amp;quot;而是antlr由 *.g 生成的词法解析、语法解析&amp;quot;。&lt;br&gt;当终于沿 输入文件 input.pipe (即new&lt;br&gt;ANTLRFileStream(args[0]))、词法分析器pipeLexer、语法解析器pipeParser这条线走到这里，我们就可以调用语法解析器了。&lt;br&gt;11 pipeParser.starting_return r = parser.starting(); // launch parsing&lt;br&gt;我们调用了parser。调用的方法是&lt;br&gt;parser.starting()。starting()这个名字，来自我们在pipe.g中的一条规则的名字，starting。请参考昨天博客里的pipe.g源代码。&lt;br&gt;parser.starting()的返回值的类型 pipeParser.starting_return，其中starting_return&lt;br&gt;的命名，就是规则 starting 加 下划线 _，再加上 return。&lt;br&gt;以上这些命名规则，是 antlr 约定的。由antlr处理 .g 文件后，生成的lexer&amp;amp; parser 将遵循这样的规则，我们也遵循这样的规则来调用。&lt;br&gt;这个世界遵循两类规则。一种是强制性的。比如，如果你的C代码写得不符合C编译处标准，它就啪地给你个错误，然后甩脸子不干了。还有传说故事里的美国交警拦住你的车，要求你出示驾照，你要是敢醉么哈的冲过去，还敢动武把超啥的，他就可能会一枪把你撂倒。这是强制性的规则，有些是自然的法则，有些是人为的。&lt;br&gt;还有一种规则，是约定，即使你违反了，没有严重后果的时候似乎也没有惩罚。比如当红灯亮起，如果车辆还是强行压过斑马线，如果没有行人，也没有其他车辆，也没有摄像头和交警叔叔，那么，似乎，什么也不会发生。似乎。我们考试都做过弊，可能你没有，我有。我们口口声声说这于人无害，只要监考老师对我们仁慈一些就可以了。我们并非于人无害，这个世界上，于己有益，却于人无害的事情不多--罗素的观点，大致，你拥有很多数学知道是无害的。当我们作弊，我们无疑地伤害了没有作弊的那些同学。更严重的，我们破坏了规则。前面我说了，我也做过弊，之所以这么说的意思就是，即使我也做过，也并不意味着这件事就是正确的。&lt;br&gt;antlr的约定，大致类似于第二种。你没有遵循约定，它似乎也没有什么抱怨的。事实上，不是。它只是以另一种方式抱怨，它不工作，或者说，它不按你想像的方式工作。&lt;br&gt;当我们不认真对待代码，她也将以相同的方式回报你。君视民如草芥，民当视君如寇仇。然后我们只能感叹德国人如何如何，中国人如何如何，好像能把自己摘出去，中国人里没有你我一份似的。&lt;br&gt;如果你前面全都按 antlr 的规则，那么现在，你可以得到结果了。&lt;br&gt;12 if ( r!=null ) System.out.println(&amp;quot;parser tree:&lt;br&gt;&amp;quot;+((CommonTree)r.tree).toStringTree());&lt;br&gt;那个 (CommonTree)r 里的 r，就是刚刚的规则返回值 starting_return 。它是一棵AST。为什么？因为我们在&lt;br&gt;pipe.g 里面写着 output = AST，请参见昨天博客里的 pipe.g。这不是 delc.g 里的同一条语句，还没到它。&lt;br&gt;第12行的意思是，把 pipe.g (严格地说，antlr用它生成的 lexer &amp;amp; parser)处理输入 input.pipe&lt;br&gt;的结果，那棵AST，转化为 toStringTree() 打印到控制台上。&lt;br&gt;我之所以写这一条语句的目的，是检查解析输入文件是否正确。&lt;br&gt;我输入了&lt;br&gt;mario:pipe_a 123 | pipe_b | pipe_c&lt;br&gt;peach:stage_1 123 | stage_2&lt;br&gt;bowser:lose_1 123 | lose_2 | lose_3 | lose_4 234&lt;br&gt;header.java运行到此处，我得到了：&lt;br&gt;parser tree: (CLASS mario (NODE pipe_a PARA 123) (NODE pipe_b)&lt;br&gt;(NODEpipe_c)) (CLASS peach (NODE stage_1 PARA 123) (NODE stage_2))&lt;br&gt;(CLASSbowser (NODE lose_1 PARA 123) (NODE lose_2) (NODE lose_3) (NODE&lt;br&gt;lose_4PARA 234))&lt;br&gt;我们看到了那些大写字母，它们是 imaginary tokens，在pipe.g中定义的。&lt;br&gt;有的同学可能发现，这里为什么没有NEXT，我们明明在 pipe.g 中定义了它，&lt;br&gt;&amp;#160; &amp;#160; NEXT=&amp;#39;|&amp;#39;;&lt;br&gt;而且，在输入文件中，我们看到了那些非常明显的 |。&lt;br&gt;因为，此处我们得到的，是 pipe.g 的输出树，而不是解析时的树。它的输出树，应用了 rewrite 规则，我们整理了这棵树，把 |&lt;br&gt;这样不携带信息的结点砍掉了。有了AST，我们可以通过结点在树中的位置确定它的语法功能，进而决定语义， | 就没有必要存在了。以下是&lt;br&gt;pipe.g 中的一段，供懒人同学们查看。我之所以没有总是贴上引用的代码，是因为那会打乱我们叙述的线索。&lt;br&gt;game&amp;#160; &amp;#160; : SYMBOL_NAME &amp;#39;:&amp;#39; node? ( NEXT node)*&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; -&amp;gt; ^(CLASS&lt;br&gt;SYMBOL_NAME (node)*)&amp;#160; &amp;#160; ;&lt;br&gt;以上，我们完成了词法分析和语法解析，得到了AST。这棵抽象树，就供下面的步骤遍历，并在遍历过程中执行语义。&lt;br&gt;-- 语义&lt;br&gt;在 decl.g 中描述语义很复杂，但是调用则简单的多。&lt;br&gt;代码3：16 &amp;#160; &amp;#160; &amp;#160; &amp;#160; // walker17 &amp;#160; &amp;#160; &amp;#160; &amp;#160; try18 &amp;#160; &amp;#160; &amp;#160; &amp;#160; {19&lt;br&gt;CommonTreeNodeStream nodes = new&lt;br&gt;CommonTreeNodeStream((CommonTree)r.tree);20&lt;br&gt;nodes.setTokenStream(tokens);21 &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; decl walker = new&lt;br&gt;decl(nodes);22 &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; walker.starting();23 &amp;#160; &amp;#160; &amp;#160; &amp;#160; }24&lt;br&gt;catch (RecognitionException e) {&amp;#160;25 &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; System.err.println(e);&lt;br&gt;26 &amp;#160; &amp;#160; &amp;#160; &amp;#160; }27&amp;#160;28 &amp;#160; &amp;#160; }29 }&lt;br&gt;我们从前往后看。&lt;br&gt;第19行，我们由AST构造出了 节点的流。&lt;br&gt;19 CommonTreeNodeStream nodes = new CommonTreeNodeStream((CommonTree)r.tree);&lt;br&gt;第20行，我们指定，这个 节点的流 里的 tokens 将使用 tokens&lt;br&gt;20 &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; nodes.setTokenStream(tokens);&lt;br&gt;这里的 tokens，就是在代码2第8行里定义的那个。为什么需要这一步呢？&lt;br&gt;回顾代码2和代码3，我们生成这些东西的流程：&lt;br&gt;&amp;#160;args[0](即 input.pipe) -&amp;gt; lex -&amp;gt; tokens -&amp;gt; parser -&amp;gt; r -&amp;gt; nodes&lt;br&gt;注意，nodes 是由 tokens 间接生成的。既然 r 是由 tokens 生成的，那么 r中原本就应该包含 token&lt;br&gt;的信息，为什么还要多余地再设置由 r 而来的 nodes的 tokenstream呢？&lt;br&gt;antlr的作者在 The Definitive ANTLR Reference 一书中这样说：&lt;br&gt;&amp;quot;The one key piece that is different from a usual parser and&lt;br&gt;treeparser test rig is that, in order to access the text for a tree,&lt;br&gt;youmust tell the tree node stream where it can find the token stream:&amp;quot;&lt;br&gt;我猜测可能在上述生成的流程中，tokens的信息被抛弃了。这一猜测是否正确，感谢哪位老师同学指点。&lt;br&gt;不过，我注释了第20行，似乎也没有什么改变，运行结果没有什么不同。也许，新的版本中，tokens信息始终携带着？&lt;br&gt;我们得到了由AST构造出的stream，接下来，我们要遍历它了，并在遍历的过程中动作。&lt;br&gt;第21行，我们用 nodes 这个 tree nodes stream 构造出一个遍历器-- walker。&lt;br&gt;21 &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; decl walker = new decl(nodes);&lt;br&gt;你注意到了，这个 walker 的类型是 decl，这个名字从 decl.g 中的 grammar的名字而来，它被声明为 tree&lt;br&gt;grammar。请参见昨天博客中的 decl.g 。&lt;br&gt;然后，我们用这个遍历器开始：&lt;br&gt;22 &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; walker.starting();&lt;br&gt;startinging() 的名字来自 decl.g 中的一条规则。请参见昨天博客中的decl.g 。&lt;br&gt;从 starting 开始，遍历AST，然后在遍历的过程中，执行语义动作。&lt;br&gt;有的同学可能会问，在以上java代码中，动作在哪里？动作在 decl.g 的动作部分中。当遍历 starting&lt;br&gt;这个树枝（也就是根）时，动作同时执行着。这，就是那些动作被调用的时机，解析或遍历到特定的结点，动作就开始执行。&lt;br&gt;你是不是想起了 龙书 里如何表示动作的位置。&lt;br&gt;以上，这个 header.java 调用了 *.g 产生的 *.java（里的类和方法），一边解析 input.pipe&lt;br&gt;（或遍历树），一边做着这个杨氏语言源代码要求的动作。&lt;br&gt;我们看到，一台大机器在精确地运行，输入 input.pipe 中的字符，不断地转换状态，输出 input.pipe 所规定的产品。&lt;br&gt;- 脚本，或者 调用/跑起来的 方法&lt;br&gt;调用antlr把*.g翻译为*.java，编译以上的*.java和header.java，编译并运行得到的那些c++代码，这些动作在写编译器的时候，会不断地重复。&lt;br&gt;会不断重复很多次的动作，我们应该写个程序来完成。换句话说，我们描述重复很多次的动作并命名它。&lt;br&gt;实现这个需求的最简单的工具是shell脚本。&lt;br&gt;题外话，昨天，给同学们看我写的一小段脚本，用来把一个叫做 unicode&lt;br&gt;的程序输出的东西转换为特定的格式。建一说，windows下也肯定有这样的程序，能求一个字符的 unicode 编号，弹出一个窗口……&lt;br&gt;那个弹出窗口的程序估计是存在的，它与linux下的这个程序的区别在于，linux下的这个，能用shell非常方便地取出数据，然后加工成另一种形式。易于自动化。弹出窗口那个，你如何取其中的数据呢？用hook么，是的，我们会有很多办法，但是，那是多么地不方便。因为GUI程序特意地关闭了允许你取得输出的途径，它封闭如国内的很多站点，根本就不想提供API供你调用。&lt;br&gt;张炜同学建议我贴博文的时候，同时提供主博客的URL。我还是犹豫，因为我的主博客在&lt;br&gt;blogspot，它在这个世界上是不存在的，至少在我看来。是的，我看不到我的博客。我为什么坚持使用呢？因为在那上面发贴子真的非常简单，简单到它支持向某个信箱发封信，那信的正文就是博文。&lt;br&gt;如果一个人关闭自己的心灵，不喜欢你了解他，还有什么理由抱怨大家不愿意了解和理解他呢。难道他喜欢破门而入或者喜欢各种猜测--还是他所要的不是了解和理解，而仅仅是关注。&lt;br&gt;Linux，承袭了Unix shell的血统，他一直对你张开怀抱。&lt;br&gt;代码4：1 echo cleaning2 rm -rf output &amp;amp;&amp;amp; \3 rm -rf method_chaining_demo&lt;br&gt;&amp;amp;&amp;amp; \4 echo mkdir &amp;amp;&amp;amp; \5 mkdir output &amp;amp;&amp;amp; \6 mkdir output/classes &amp;amp;&amp;amp; \7&lt;br&gt;mkdir method_chaining_demo &amp;amp;&amp;amp; \8&amp;#160;9 echo header file generating10 echo&lt;br&gt;generating code &amp;amp;&amp;amp; \11 java -cp&lt;br&gt;/home/young/Downloads/antlr-3.4-complete-no-antlrv2.jar org.antlr.Tool&lt;br&gt;-o output pipe.g decl.g &amp;amp;&amp;amp; \12 echo compiling lexer and parser &amp;amp;&amp;amp; \13&lt;br&gt;javac output/*.java -cp ~/Downloads/antlr-3.4-complete-no-antlrv2.jar&lt;br&gt;-d output/classes &amp;amp;&amp;amp; \14 echo compiling header.java &amp;amp;&amp;amp; \15 javac -cp&lt;br&gt;/home/young/Downloads/antlr-3.4-complete-no-antlrv2.jar:output/classes&lt;br&gt;header.java &amp;amp;&amp;amp; \16 echo running test.java &amp;amp;&amp;amp; \17 java -cp&lt;br&gt;.:/home/young/Downloads/antlr-3.4-complete-no-antlrv2.jar:output/classes&lt;br&gt;header input.pipe&lt;br&gt;第8行以前，是删除前次运行的结果，避免对本次运行造成干扰。&lt;br&gt;那些 echo 是提醒我他运行到了哪里，避免我担心。你看，他不会一直停在那不动，跟个青春期叛逆少年一样什么也不告诉你。&lt;br&gt;第11行，11 java -cp&lt;br&gt;/home/young/Downloads/antlr-3.4-complete-no-antlrv2.jar org.antlr.Tool&lt;br&gt;-o output pipe.g decl.g &amp;amp;&amp;amp; \告诉 antlr 由 pipe.g 和 decl.g 两个文件，生成&lt;br&gt;*.java，放在 output 目录下。&lt;br&gt;生成了以下东西：&lt;br&gt;decl.java &amp;#160;decl.tokens &amp;#160;pipe.tokens &amp;#160;pipeLexer.java &amp;#160;pipeParser.java&lt;br&gt;你可以根据名字猜测它们的用途，相信你还看到了熟悉的面孔。&lt;br&gt;第13行，13 javac output/*.java -cp&lt;br&gt;~/Downloads/antlr-3.4-complete-no-antlrv2.jar -d output/classes &amp;amp;&amp;amp; \&lt;br&gt;编译这些东西。生成一堆 .class。&lt;br&gt;我把 antlr-3.4-complete-no-antlrv2.jar 放在了 ~/Downloads/&lt;br&gt;目录下，一个糟糕的选择，它表明我没有良好的组织文件位置的习惯。&lt;br&gt;&amp;quot;-cp&amp;quot; 是做什么的？请 javac -help ，然后 RTFM。&lt;br&gt;第15行，15 javac -cp&lt;br&gt;/home/young/Downloads/antlr-3.4-complete-no-antlrv2.jar:output/classes&lt;br&gt;header.java &amp;amp;&amp;amp; \&lt;br&gt;编译 header.java，我们今天写的东西。&lt;br&gt;第17行，跑。17 java -cp&lt;br&gt;.:/home/young/Downloads/antlr-3.4-complete-no-antlrv2.jar:output/classes&lt;br&gt;header input.pipe&lt;br&gt;JVM启动，许多class争先恐后装载进来，header 读入 input.pipe，然后调用那些载入的 class。大机器开动，产品在源代码的指令下生产出来。&lt;br&gt;- 后记&lt;br&gt;头文件以外，我们还需要 *.cpp 和 go.cpp 的生成，但是其余的那些，也没有什么不同。就像，当你坐上班车地铁公交，一切日子，看似没有什么不同。&lt;br&gt;当它们全部生成，我们执行：&lt;br&gt;g++ -I. *cpp -o go&lt;br&gt;*.h &amp;amp; *.cpp 被编译链接成了一个可执行程序 go。当我们运行go，它说：&lt;br&gt;I am mario, created in: marioI am peach, created in: peachI am bowser,&lt;br&gt;created in: bowserI am running in pipe_adata: 123I am running in&lt;br&gt;pipe_bI am running in pipe_cI am running in stage_1data: 123I am&lt;br&gt;running in stage_2I am running in lose_1data: 123I am running in&lt;br&gt;lose_2I am running in lose_3I am running in lose_4data: 234I am mario,&lt;br&gt;and game is over in: ~marioI am peach, and game is over in: ~peachI am&lt;br&gt;bowser, and game is over in: ~bowser&lt;br&gt;这像一首诗或者歌曲，让我想起另一个宣言 &amp;quot;I&amp;#39;m youth, I&amp;#39;m joy&amp;quot;。少年总会成长，承担起责任。不是保护公主，而是其他的什么人。&lt;br&gt;承担责任，也不是念两句诗，或者唱几句歌，甚至也不是声明 我愿意为你承受何种苦难。&lt;br&gt;承担责任，是虽然这些日子没有什么不同，但是如果没有你的工作，这些日子将非常不同，非常糟烂；承担责任，是拿起工具，开几亩自留地，种上土豆白菜。&lt;br&gt;这样的工具，能让你使某些人的世界不同的，有很多。其中有两种，分别叫做antlr 和 stringtemplate。&lt;br&gt;祝你开垦顺利，有收获。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-4983284359593768145?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/4983284359593768145/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=4983284359593768145' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/4983284359593768145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/4983284359593768145'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/12/antlrstringtemplatemethod-chaining6.html' title='使用Antlr+Stringtemplate生成method chaining，一个不太简单的案例（6）'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-5337790439140266391</id><published>2011-12-05T00:38:00.001+08:00</published><updated>2011-12-05T00:38:43.586+08:00</updated><title type='text'>使用Antlr+Stringtemplate生成method chaining，一个不太简单的案例（5）</title><content type='html'>使用Antlr+Stringtemplate生成method chaining，一个不太简单的案例（5）&lt;p&gt;- 一个悲惨的开始&lt;p&gt;这个悲惨的开始是我今天的生活，而不是 antrl+stringtemplate。如果你从头&lt;br&gt;看到这里，最苦的地方已经过去了。&lt;p&gt;昨天一点或两点睡的时候，心里想，这早晨6：40起来赶班车，对付吧。结果没睡&lt;br&gt;着，3：17，爬起来写了半张白板，又睡下，又爬起来写了不少。早晨，如果我没&lt;br&gt;记错的话，第一次，我没有听到闹表。后来复查了一下设置，没错，它响了，我&lt;br&gt;没有听到。约的是9点，8：55，孙同学电话来，她到应化所了。我当时头脑蒙&lt;br&gt;着，对话大致是这样的：啊，你去那干什么。应该在软件所啊。你回来吧。不用&lt;br&gt;急，我也得迟到。&lt;p&gt;结果，迟到26分钟。屋子不大，但是有一屋子人坐好了等你。&lt;p&gt;唉。&lt;p&gt;我们之悲惨缘于很多因素，其中之一希望一蹴而就。我们希望开个企业，然后它&lt;br&gt;自己就能赚钱了，再也不用管；我们希望上了大学，然后就能玩了；我们希望在&lt;br&gt;什么什么之前表现得非常怎么怎么的，然后以后就可以再也不怎么怎么的了。&lt;p&gt;后来发现，由于阻尼的存在，理想的无磨擦世界竟然是不存在的。&lt;p&gt;我也也希望一下子就把什么学明白，或者得到什么结果。坐着抻懒腰也能减肥&lt;br&gt;啦，在家里玩也能赚钱啦，吃点什么病就好了，从此不再复发啦。&lt;p&gt;而现实世界的规律有时原本就复杂，或者简单的那些规律，比如麦克斯韦四个方&lt;br&gt;程、爱因斯坦的质能方程，这些简单的规律却需要复杂的基础才能理解。我们往&lt;br&gt;往忘了，理解这些规律的复杂基础，这一工作本身也异常艰苦。&lt;p&gt;编译器生成器 antlr 的使用也是如此。&lt;p&gt;- 上次忘了的&lt;p&gt;在语法解析中，其中有个符号 ^ ，它是AST的根。至于什么是AST，什么是&lt;br&gt;根，RTMF。我提到这个概念的动机，就是想说它时挺重要，你可能会用到。&lt;p&gt;另外，我们写的语法解析的表达式，叫 EBNF，即 扩展的巴克斯-诺尔范式。编&lt;br&gt;译原理书中提到。&lt;p&gt;- 语义&lt;p&gt;我们用语法匹配了输入的源代码，接下来，就要在匹配的时候做点什么。这就是&lt;br&gt;语义。&lt;p&gt;我们仍然以生成头文件为例。&lt;p&gt;语义也写在一个.g文件里，叫decl.g，后面会和昨天我们写的 pipe.g 一起由&lt;br&gt;antlr一起生成为杨氏语言的编译器。因为anltr用于生成编译器，所以是编译器&lt;br&gt;生成器。&lt;p&gt;之所以在使用语义的decl.g文件时还需要pipe.g这个语法文件，是因为我们要使&lt;br&gt;用pipe.g中的语法规则。decl.g和pipe.g共享一些语法规则，decl.g利用这些语&lt;br&gt;法规则为纲，在匹配到某个结点的时候执行特定的动作，这称为 语法制导的翻&lt;br&gt;译。&lt;p&gt;语法制导，就是因为沿语法树遍历结点。这个语法树，即AST，pipe.g(严格的&lt;br&gt;说，由它生成的编译器的parser部分)的输出。&lt;p&gt;我们来看decl.g的内容。&lt;p&gt;-- 头部&lt;p&gt;我也是词汇贫乏，想不起来什么新词，还是叫头部吧。手册里可能有专门的名字&lt;br&gt;人，但是我猜距离优雅应该同样很远。&lt;p&gt;代码1：&lt;br&gt;1 tree grammar decl;&lt;br&gt;2&lt;br&gt;3 options {&lt;br&gt;4     tokenVocab=pipe;&lt;br&gt;5     output=AST;&lt;br&gt;6     ASTLabelType=CommonTree;&lt;br&gt;7 }&lt;br&gt;8&lt;br&gt;9&lt;br&gt;10 @header {&lt;br&gt;11 import org.stringtemplate.v4.*;&lt;br&gt;12 import java.util.HashMap;&lt;br&gt;13 import java.io.FileWriter;&lt;br&gt;14 }&lt;p&gt;第1行，表示这是grammar，并且，这是用来遍历树的，不是lex or parser。&lt;p&gt;这里的decl必须与文件同名，也就是说 tree grammar 什么东西必须放在 什么东&lt;br&gt;西.g文件 里。不然，其实也好解决，antlr会报错。&lt;p&gt;上次忘了，grammar pipe 的那个文件，也同理，要叫做 pipe.g。&lt;p&gt;第3行至第7行，一些配置。其中第4行，表示这一grammar将与pipe共享相同的&lt;br&gt;token。&lt;p&gt;说到这里，题外话，读技术文章与小说有一处相同：如果你从中间读起，要么读&lt;br&gt;不懂，需要看前面，要么你已经看过这个故事的电影或者电视剧或者缩写版了。&lt;br&gt;还有一种可能，就是那个小说非常地好，或者非常得简单。我曾经捡到几张当时&lt;br&gt;称为大书的小说页面，看了半个下午。后来知道那是 天龙八部，萧峰用拳头慢&lt;br&gt;慢钻透墙，救段的那个场景。相信如果你看我这篇，从中间看起的话，断断不会&lt;br&gt;有那个效果，一定如坠五里雾中，除非你是来指点我的。&lt;p&gt;第5行，&lt;br&gt;5     output=AST;&lt;br&gt;是很有意思的一行。它告诉antlr，我要输出一个AST。这pipe.g是一样的。后&lt;br&gt;面，我们会看到，有个东西能遍历AST。&lt;p&gt;这里，因为马上就要有语义，已经是杨氏语言编译器的末端，其实也可以输出别&lt;br&gt;的东西，比如直接的结果。我们之所以选择AST的原因，请参见&lt;br&gt;[&lt;a href="http://www.cnblogs.com/sonce/archive/2011/03/13/1982555.html]"&gt;http://www.cnblogs.com/sonce/archive/2011/03/13/1982555.html]&lt;/a&gt;，探索&lt;br&gt;Antlr（Antlr 3.0更新版）。感谢这位牛人教导我明白了AST与SAX/DOM间的类比&lt;br&gt;关系。谢谢。&lt;p&gt;第10行至第14行，是因为我们的语义动作中要用到这些类，所以import进来。你&lt;br&gt;猜对了，实现动作的，就是Java语言。&lt;p&gt;-- 规则，语法制导的翻译&lt;p&gt;接下来的部分，就是在语法的指引下，我们来告诉antlr，遇到某些结点或者&lt;br&gt;token，我们需要做哪些特定动作。&lt;p&gt;代码2：&lt;br&gt;1 starting : game+ ;&lt;p&gt;这一行简单，简单到与昨天的pipe.g没有任何区别。也就是说，遇到starting的&lt;br&gt;时候，解析为+个game，然后呢，啥也不错，没有动作。&lt;p&gt;接下来是规则game，这段相当之长，请有心理准备。我把它拆成了几段来介绍。&lt;p&gt;--- 开始之前&lt;p&gt;代码3：&lt;br&gt;1 //^(CLASS SYMBOL_NAME (node)*)&lt;br&gt;2 game&lt;br&gt;3     :&lt;br&gt;4         {&lt;br&gt;5             STGroup header = new STGroupFile(&amp;quot;st/header.stg&amp;quot;);&lt;br&gt;6             ST class_delc = header.getInstanceOf(&amp;quot;class_delc&amp;quot;);&lt;br&gt;7         }&lt;br&gt;8         ^(CLASS SYMBOL_NAME&lt;br&gt;9             {&lt;br&gt;10                 class_delc.add(&amp;quot;CLASS_NAME&amp;quot;, $SYMBOL_NAME.text);&lt;br&gt;11                 class_delc.add(&amp;quot;CLASS_UPPER&amp;quot;,&lt;br&gt;$SYMBOL_NAME.text.toUpperCase());&lt;br&gt;12             }&lt;p&gt;第1行是用来我自己备忘的。下边的动作把语法打得七零八碎的，不然我根本记&lt;br&gt;不住自己正写的动作匹配的是哪个结点。&lt;p&gt;1 //^(CLASS SYMBOL_NAME (node)*)&lt;br&gt;这一行，刚好就是pipe.g的game规则的rewrite规则。如果你还记着的话。不，&lt;br&gt;你十有八九不会记得，你得翻回昨天的博客去看pipe.g的game规则。&lt;p&gt;这里，就匹配pipe.g的AST输出的东西。&lt;p&gt;{} 里面的东西，就是动作；{} 以外的，就是被折散了的这个东西：&lt;br&gt;1 //^(CLASS SYMBOL_NAME (node)*)&lt;p&gt;第4行至第7行意思是，在开始匹配子结点以前，初始化模板相关的东西。模板，&lt;br&gt;就是StringTemplate。&lt;p&gt;5             STGroup header = new STGroupFile(&amp;quot;st/header.stg&amp;quot;);&lt;br&gt;6             ST class_delc = header.getInstanceOf(&amp;quot;class_delc&amp;quot;);&lt;p&gt;第5行，从文件 st/header.stg 中载入 string template group。文件&lt;br&gt;st/header.stg 的内容和解释，请参见昨天的博客。&lt;p&gt;第6行，我们要使用这个 string template group 中的 class_delc 模板。这一&lt;br&gt;模板的定义和解释，请参见昨天的博客。&lt;p&gt;--- 一个简单的动作&lt;p&gt;接下来，&lt;br&gt;8         ^(CLASS SYMBOL_NAME&lt;br&gt;9             {&lt;br&gt;10                 class_delc.add(&amp;quot;CLASS_NAME&amp;quot;, $SYMBOL_NAME.text);&lt;br&gt;11                 class_delc.add(&amp;quot;CLASS_UPPER&amp;quot;,&lt;br&gt;$SYMBOL_NAME.text.toUpperCase());&lt;br&gt;12             }&lt;p&gt;这是我们遇到的第一个真正的动作，语法导制下的语义。&lt;p&gt;CLASS 结点是一个imaginary结点，有印象没？参见……&lt;p&gt;当我们遇到SYMBOL_NAME结点的时候，我们要执行第10行至第11行的动作。&lt;p&gt;这个动作的意义是，向模板 class_delc（它是谁呢，看上面第6行）中填加变&lt;br&gt;量，这个变量的名字叫做 CLASS_NAME，它的值是$SYMBOL_NAME.text，即&lt;br&gt; SYMBOL_NAME 这个结点的文本。&lt;p&gt;比如 mario。&lt;p&gt;CLASS_NAME，参见昨天的博客中 header.stg 文件中的 class_delc。你是不是&lt;br&gt;把今天和昨天的博客都打开来对比着往下行进呢？我也在这么做。如果你也是的&lt;br&gt;话，请感慨一下，这个世界没有多少记忆超群的人，至少你我不是。握手。&lt;p&gt;11 class_delc.add(&amp;quot;CLASS_UPPER&amp;quot;, $SYMBOL_NAME.text.toUpperCase());&lt;p&gt;这行就简单了，我们要再加入一个变量--你可能已经找到了，模板class_delc有&lt;br&gt;三个参数，还有一个在后面--这第二个变量是CLASS_UPPER，值是&lt;br&gt;$SYMBOL_NAME.text.toUpperCase()。&lt;p&gt;$SYMBOL_NAME.text是一个String，所以toUpperCase()可以RTFM&lt;br&gt;[&lt;a href="http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#toUpperCase()"&gt;http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#toUpperCase()&lt;/a&gt;]&lt;br&gt;。&lt;p&gt;有的同学已经想到了，有时还可以把这个text转成int，转成float。&lt;p&gt;此外，有的同学可能也注意到了，加入变量的时候，我们总是关注两个东西：变&lt;br&gt;量的名字，变量的值，这就像map，键 和 值。&lt;p&gt;以上，就是语义动作。没有看到输出？因为我们的动作，就是把一些变量放到模&lt;br&gt;板里，后面统一渲染。没错，还是这个小资词汇，render。那个时候，我们就得&lt;br&gt;到了真正的输出。&lt;p&gt;我们为什么不直接输出，而要使用stringtemplate这么个间接的东西呢？跟我们&lt;br&gt;不用CGI perl的道理是一样的，因为很多要输出的东西，是固定的，而要填充的&lt;br&gt;东西，那些占位符，只是其中的少数。我们不想把固定的东西放在程序的逻辑中&lt;br&gt;输出。&lt;p&gt;--- 一个复杂的动作，带有聚合的，应用模板于变量之上&lt;p&gt;接下来，我们遇到了一个复杂的语义动作。&lt;p&gt;代码4：&lt;br&gt;13             (node&lt;br&gt;14                 {&lt;br&gt;15                     HashMap mf = new HashMap();&lt;br&gt;16                     mf.put(&amp;quot;class_name&amp;quot;, $SYMBOL_NAME.text);&lt;br&gt;17                     mf.put(&amp;quot;function_name&amp;quot;, $node.node_name);&lt;br&gt;18                     mf.put(&amp;quot;para_name&amp;quot;, $node.para_name);&lt;br&gt;19                     class_delc.add(&amp;quot;member_function_list&amp;quot;, mf);&lt;br&gt;20                 }&lt;br&gt;21             )*)&lt;p&gt;看第19行，我们也是加入了一个变量，名为 member_function_list 。也许你还&lt;br&gt;记得，这本身就是一个模板（函数），我们要 apply that template on 这个传&lt;br&gt;入的变量的值上。那个函数只有一个参数，就是mf；而在那个函数中，我引用了&lt;br&gt;这个参数的成员。&lt;p&gt;代码4.1&lt;br&gt;1 member_function (mf)  ::= &amp;lt;&amp;lt;&lt;br&gt;2 $mf.class_name$* $mf.function_name$($mf.para_name$);&lt;br&gt;3 &amp;gt;&amp;gt;&lt;p&gt;第15行，我们建立一个HashMap，它有来形成聚合（aggregation），也就是说，&lt;br&gt;传一个对象，就是mf，进去。&lt;p&gt;我们看到，这个对象有三个成员，&lt;br&gt;16                     mf.put(&amp;quot;class_name&amp;quot;, $SYMBOL_NAME.text);&lt;br&gt;17                     mf.put(&amp;quot;function_name&amp;quot;, $node.node_name);&lt;br&gt;18                     mf.put(&amp;quot;para_name&amp;quot;, $node.para_name);&lt;br&gt;刚好与代码4.1，也就是header.stg中的函数里引用的变量的成员对应。&lt;p&gt;19                     class_delc.add(&amp;quot;member_function_list&amp;quot;, mf);&lt;br&gt;我们把做好的这个对象做为变量加进去。&lt;p&gt;以上，是一个复杂的动作，带有聚合的，需要应用模板（函数）的。&lt;p&gt;--- 渲染&lt;p&gt;当我们把模板中所有的变量都赋了值，就可以渲染模板了。&lt;p&gt;代码5：&lt;br&gt;22         {&lt;br&gt;23             String result = class_delc.render();&lt;br&gt;24             System.out.println(result);&lt;br&gt;25&lt;br&gt;26             try{&lt;br&gt;27                 FileWriter fw = new&lt;br&gt;FileWriter(&amp;quot;method_chaining_demo/&amp;quot;+$SYMBOL_NAME.text+&amp;quot;.h&amp;quot;);&lt;br&gt;28                 fw.write(result);&lt;br&gt;29                 fw.flush();&lt;br&gt;30             }&lt;br&gt;31             catch (java.io.IOException e)&lt;br&gt;32                 {&lt;br&gt;33                     System.err.println(e);&lt;br&gt;34                 }&lt;br&gt;35         }&lt;br&gt;36     ;&lt;p&gt;第23行，渲染模板。渲染这个词挺优雅的，实质就是得到一个字符串--把模板里&lt;br&gt;的占位符，那些洞，都用变量填上，然后把模板作为字符串返回来。&lt;p&gt;第24行，把这个字符串输出到控制台。&lt;p&gt;第26至第35行，是把这个字符串输出到磁盘文件中，并以&lt;br&gt;$SYMBOL_NAME.text+&amp;quot;.h&amp;quot; 作为文件名。这里的$SYMBOL_NAME，根据语法&lt;br&gt;1 //^(CLASS SYMBOL_NAME (node)*)&lt;br&gt;正是 类名mario。&lt;p&gt;之所以要操作文件的原因，是因为我还要生成 cpp，要生成go.cpp(driver)，并&lt;br&gt;且不希望自动为输出文件命名，而不希望由 go.sh 负责命名。&lt;p&gt;我们以上为模板中的占位符赋值了变量。事实上，即使不对任何变量赋值，也可&lt;br&gt;以渲染模板。stringtempalte会认为那些变量都是null，直接跳过，输出占位符&lt;br&gt;没有被代换的模板。&lt;p&gt;--- 语义动作的返回值&lt;p&gt;在 antlr 中，动作还可以有返回值。我们在上面的代码6的第17行和第18行，引&lt;br&gt;用过node规则的返回值。&lt;p&gt;17 mf.put(&amp;quot;function_name&amp;quot;, $node.node_name);&lt;br&gt;18 mf.put(&amp;quot;para_name&amp;quot;, $node.para_name);&lt;p&gt;接下来，是node规则的动作。&lt;p&gt;代码6：&lt;br&gt;1 //^(NODE SYMBOL_NAME (PARA INT)?)&lt;br&gt;2 node&lt;br&gt;3 returns [String node_name, String para_name]&lt;br&gt;4 @init {&lt;br&gt;5     $node_name = &amp;quot;&amp;quot;;&lt;br&gt;6     $para_name = &amp;quot;&amp;quot;;&lt;br&gt;7 }&lt;br&gt;8     :&lt;br&gt;9 ^(NODE SYMBOL_NAME (PARA INT&lt;br&gt;10                 {&lt;br&gt;11                     $para_name = &amp;quot;int par&amp;quot;;&lt;br&gt;12                 }&lt;br&gt;13             )?)&lt;br&gt;14         {&lt;br&gt;15             $node_name=$SYMBOL_NAME.text;&lt;br&gt;16         }&lt;br&gt;17     ;&lt;p&gt;第3行，表示 返回值分别为 String node_name, String para_name。当在上一&lt;br&gt;级规则中引用的时候，我们就使用 $node.node_name.text,&lt;br&gt;$node.para_name.text 这样的形式。&lt;p&gt;是的， antlr的规则可以有多个返回值，这与C/C++不太一样。&lt;p&gt;第4行至第7行，是初始化部分，在匹配这条规则之前执行。这与前面代码3中的第&lt;br&gt;4行至第7行的不同之处在于，代码3是执行于某个 alternative（若干个由 | 分&lt;br&gt;隔开的规则匹配&amp;quot;路径&amp;quot;） 之前，而这里的初始化，是在整个规则所有的&lt;br&gt;alternative之前。&lt;p&gt;我们在初始化部分中把要返回值赋值为空串了。也可以赋值为报错信息，如果在&lt;br&gt;语义动作中没有正确赋值，就报错。&lt;p&gt;9 ^(NODE SYMBOL_NAME (PARA INT&lt;br&gt;10                 {&lt;br&gt;11                     $para_name = &amp;quot;int par&amp;quot;;&lt;br&gt;12                 }&lt;br&gt;13             )?)&lt;p&gt;第9行至第13行的动作，是当 (PARA INT)? 存在的时候执行的，因为我们把动作&lt;br&gt;放在了这个位置：&lt;p&gt; (PARA INT 这个位置 )?&lt;p&gt;这完成了一个逻辑判断，即 只有当参数 PARA INT 存在的时候，才会对&lt;br&gt;$para_name 赋值。这样，当输入的杨氏语言源代码中有参数时，函数的声明就有&lt;br&gt;参数；当源代码中没有参数时，$para_name 就是空串，模板渲染以后，在函数&lt;br&gt;的参数列表里什么也没有。&lt;p&gt;14         {&lt;br&gt;15             $node_name=$SYMBOL_NAME.text;&lt;br&gt;16         }&lt;p&gt;这个动作，不同于带?的部分，只要匹配了 node 这条规则，就一定会在最后执&lt;br&gt;行--为 $node_name 赋值。这就是目标代码中的函数名。&lt;p&gt;今天又整了这么多，相信你也累了。明天继续，将介绍header.java将如何调用&lt;br&gt;lexer, paser, and tree walker，也将介绍脚本如何编译和运行一切。&lt;p&gt;附录 以上涉及到的源代码&lt;p&gt;1.  st/header.stg&lt;p&gt;delimiters &amp;quot;$&amp;quot;, &amp;quot;$&amp;quot;&lt;p&gt;class_delc(CLASS_UPPER, CLASS_NAME, member_function_list) ::= &amp;lt;&amp;lt;&lt;br&gt;#ifndef _$CLASS_UPPER$_H_&lt;br&gt;#define _$CLASS_UPPER$_H_&lt;p&gt;#include &amp;lt;iostream&amp;gt;&lt;p&gt;class $CLASS_NAME$&lt;br&gt;{&lt;br&gt;  private:&lt;br&gt;    int data;&lt;p&gt;  public:&lt;br&gt;    $member_function_list:member_function();  separator=&amp;quot;\n&amp;quot;$&lt;br&gt;    $CLASS_NAME$();&lt;br&gt;    ~$CLASS_NAME$();&lt;br&gt;};&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-5337790439140266391?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/5337790439140266391/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=5337790439140266391' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/5337790439140266391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/5337790439140266391'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/12/antlrstringtemplatemethod-chaining5.html' title='使用Antlr+Stringtemplate生成method chaining，一个不太简单的案例（5）'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-3000548444281838045</id><published>2011-12-04T22:07:00.001+08:00</published><updated>2011-12-04T22:07:49.859+08:00</updated><title type='text'>pics</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/-rxAQnd2tP4k/Ttt-tr1bKpI/AAAAAAAAM70/2ffIvHnIvm8/s1600/comment-769860.jpg"&gt;&lt;img src="http://3.bp.blogspot.com/-rxAQnd2tP4k/Ttt-tr1bKpI/AAAAAAAAM70/2ffIvHnIvm8/s320/comment-769860.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5682274678184028818" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-LEH4YFySE24/Ttt-tylgMCI/AAAAAAAAM8M/PvvX7VJ4WXM/s1600/ffff-771122.jpg"&gt;&lt;img src="http://1.bp.blogspot.com/-LEH4YFySE24/Ttt-tylgMCI/AAAAAAAAM8M/PvvX7VJ4WXM/s320/ffff-771122.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5682274679996297250" /&gt;&lt;/a&gt;&lt;/p&gt;所以说，unsigned和symbol name很重要。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-3000548444281838045?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/3000548444281838045/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=3000548444281838045' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/3000548444281838045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/3000548444281838045'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/12/pics.html' title='pics'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-rxAQnd2tP4k/Ttt-tr1bKpI/AAAAAAAAM70/2ffIvHnIvm8/s72-c/comment-769860.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-8677597034946892444</id><published>2011-12-03T18:06:00.001+08:00</published><updated>2011-12-03T18:06:34.213+08:00</updated><title type='text'>使用Antlr+Stringtemplate生成method chaining，一个不太简单的案例（4）</title><content type='html'>使用Antlr+Stringtemplate生成method chaining，一个不太简单的案例（4）&lt;p&gt;- 题外话&lt;p&gt;昨天看到一个笑话。有个人在论坛上问，为什么车总是不走直路呢。后面一堆问&lt;br&gt;细节的。楼主又跑上来说，难道不是方向盘上的那个横档是平的，车就应该一直&lt;br&gt;向前走么。&lt;p&gt;以方向盘判定车应该走直线，如果方向盘和车轮都不偏的话，那应该是正确的一&lt;br&gt;种渠道，而且比用眼睛看车轮更间接，也更便利一些。不过，再后面回贴的人提&lt;br&gt;到：应该眼前向前看，向远处看。换句话说，以车走直线作为车走直线的标准。&lt;p&gt;写程序也是一样，&amp;quot;难道不应该是...&amp;quot;，我们就是以输出结果为准的。现实世界&lt;br&gt;也是一样，到底牛顿对爱因斯坦对还是玻尔对，判定的标准再直接不过，以事实&lt;br&gt;为准。&lt;p&gt;至于说事实如何判定，那就是更深入的另一个问题了。&lt;p&gt;想起这个笑话，是因为今天安装宜家风格的柜子。宜家风格，就是一堆板子和一&lt;br&gt;堆螺丝，你自己把它们装配起来。我发现自己看不清螺丝顶部和螺丝刀结合的地&lt;br&gt;方。用手摸着对上，卡住--对了，螺丝刀能卡住的地方，就是结合正确的位置。&lt;p&gt;马克思说：实践是检验真理的唯一标准。&lt;p&gt;近年来，小资老资们对各种东西都开始质疑了。不过，在工程中，实践仍然是检&lt;br&gt;验真理的唯一标准。车怎么才能开得直呢，当你检验结果是车走直线的时候，你&lt;br&gt;开得就直了。&lt;p&gt;当我们生成的代码与我们期望生成的代码一致时，我们就成功了。其他的无论什&lt;br&gt;么，权威、领导、老师、教科书，说你对了，都不一定是正确的。有人可能问，&lt;br&gt;为什么我制造与我期待的一致，但是却没有达到我想要的效果呢--比如我们的&lt;br&gt;method chaining 代码可能编译失败。&lt;p&gt;其实原因很简单的，你制造的与你期待的一致，但是那却不是你想要的。换句话&lt;br&gt;说，你还不知道你想要的是什么。&lt;p&gt;且慢哭泣，你的努力也没有白费，因为你至少知道了，这，不是你想要的。&lt;p&gt;你可能还想继续问：你想要的是什么。孩子，如果你自己都不知道，我又怎么会&lt;br&gt;知道呢？&lt;p&gt;解决方法有很多，但是并非你喜欢的。我当年剧烈头疼的时候发现，喝了酒头就&lt;br&gt;不疼了；当年抑郁的时候，发现喝了咖啡心情就舒畅多了。所以，当我头疼当我&lt;br&gt;抑郁的时候，我的解决手段就是喝酒喝咖啡。你该问了，如果一直一直头疼一直&lt;br&gt;一直抑郁，怎么办呢？那就一直一直喝酒一直一直喝咖啡啊。你可能还会追问，&lt;br&gt;那得到啥时候是个头啊。某关同学（不是小关，是韩师姐夫）这样解答：喝咖啡&lt;br&gt;能预防心脏病，为啥哩，因为它能让心脏PENGPENG跳。有人问，那心脏的寿命岂&lt;br&gt;不是要受到影响？是啊。但是，心脏通常能比人活得更长久，也就是说，你会因&lt;br&gt;为别的毛病死掉，在这种情况下，为什么还要担心心脏呢。&lt;p&gt;这也是一种解决之道，当然，对于希望 *一劳永逸* 地解决问题的同学，不太对&lt;br&gt;胃口。不过，让我告诉你一个事实，一劳永逸根本就是骗局，请回想你高中老师&lt;br&gt;是怎么对你描述美好的大学生活的。&lt;p&gt;我们还是继续来看这个简单的问题，antlr+stringtemplate 使用吧。&lt;p&gt;我们按这样的顺序来介绍：语法，模板，语义，脚本，或者 调用/跑起来的 方&lt;br&gt;法。因为语法规定了输入，模板规定了输出，这两个更简单和易于观察验证；语&lt;br&gt;义规定了如何把输入翻译为输出；脚本规定如何把上述这些东西整到一起跑起来。&lt;p&gt;我们仍然先讨论头文件 .h 的生成。&lt;p&gt;- 语法&lt;p&gt;回顾，我们的输入是这样的：&lt;p&gt;代码1：&lt;br&gt;1 mario:&lt;br&gt;2 pipe_a 123 | pipe_b | pipe_c&lt;br&gt;3&lt;br&gt;4 peach:&lt;br&gt;5 stage_1 123 | stage_2&lt;br&gt;6&lt;br&gt;7 bowser:&lt;br&gt;8 lose_1 123 | lose_2 | lose_3 | lose_4 234&lt;p&gt;它重复了很多次类的声明，类里面有几个方法。这些方法的调用顺序在当前的问&lt;br&gt;题头文件 .h中是不需要考虑的。&lt;p&gt;我们把语法在 pipe.g 中规定，这个文件由四部分组成。我们依次来看。&lt;p&gt;1. grammar&lt;p&gt;这部分非常短，是这样的，只有一行：&lt;p&gt;代码2：&lt;br&gt;1 grammar pipe;&lt;p&gt;上次我们提到，pipe.g 将由antlr处理，生成一些java源代码，我们把它们叫做&lt;br&gt;parser们。这些parser用于完成语法解析。这行代码的意思就是告诉 antlr ，我&lt;br&gt;要生成一个这个东西。&lt;p&gt;有的同学可能会问，.g文件们本来就是用来描述语法（grammar，又译作文&lt;br&gt;法）的，为什么还要特别指出要生成它呢，难道还能生成别的么。&lt;p&gt;是的，antlr能指定 词法lexer, 语法parser, treeparser，和混合的这几种grammar。我&lt;br&gt;们这里指定的是混合的，既有lerxer，也有parser。&lt;p&gt;有了这条指令，antlr就将试图把下面的东西作为grammar规定来看待，生成我们&lt;br&gt;指定的lexer+parser。&lt;p&gt;2. 头部（？）信息&lt;p&gt;我不知道应该怎么称呼这一部分，各种选项什么的。如果不指出选项的细节，选&lt;br&gt;项二字也没有什么意义，我们直接来看细节吧。&lt;p&gt;代码3：&lt;br&gt;1 options {&lt;br&gt;2 output = AST;&lt;br&gt;3 ASTLabelType=CommonTree;&lt;br&gt;4 language = Java;&lt;br&gt;5 }&lt;br&gt;6&lt;br&gt;7 tokens {&lt;br&gt;8 NEXT=&amp;#39;|&amp;#39;;&lt;br&gt;9 CLASS;&lt;br&gt;10 NODE;&lt;br&gt;11 PARA;&lt;br&gt;12 }&lt;p&gt;第1行和第7行，就那么写，分别代表它们英文本身的含义。token是个好玩的词，&lt;br&gt;极有历史，指法老手里的权杖。学习网络的同学也会觉得它面熟，令牌环网&lt;br&gt;IEEE802.5。它旁证了计算机专业的大师们是多么地没有文化，好不容易找到个&lt;br&gt;好词，到处用啊。不像人文类的，连 现如今，为了强调与众不同，都要重新起&lt;br&gt;个名字，叫做当下。当下啊当下，立马就小资情怀出众了。不是么？你把token&lt;br&gt;改成更有文化的词试试，antlr立马翻脸不认你，&amp;quot;滚犊子，能不能说人话？&amp;quot;。&lt;p&gt;第2行，表示我们要把输入变成啥东西，不是变成输出，那还得在挺后面模板那&lt;br&gt;里才能涉及到。在这一步，我们把输入变成 AST，抽象语法树。&lt;p&gt;如果简单理解AST，可以想像成语法描述的手段，在AST的结点里，存储着从输入&lt;br&gt;中不同位置剥离出来的信息--要创造的类的名字啦，它的方法都叫什么名字啦，&lt;br&gt;有没有参数啦。这些东西，都挂在AST的结点里，所以当你想办法遍历这棵树的&lt;br&gt;时候，你就看到了那些信息。&lt;p&gt;关于AST，建议参考两份资料。一份是本书，《编译原理》，随便哪本都有，《龙&lt;br&gt;书》最佳。另一份是一篇文章，伟大的七格同学的作品《语法树》，是一篇极其&lt;br&gt;光辉灿烂摇曳多姿的小说。&lt;p&gt;即然输出类型需要指出可能是AST，当然就还可以是别的什么。如果感兴趣，请&lt;br&gt;参考antlr手册，或者作者的两本书。官方网站上有提到。&lt;p&gt;第3行，ASTLabelType=CommonTree; 意思是生成CommonTree，当然也可能是别&lt;br&gt;的。别的，请参考手册，同上。以后这个请参考手册，同上，就不写全了，我们&lt;br&gt;简写为 RTFM。这个词不是我杜撰的，其含义请google。&lt;p&gt;第4行，language = Java; 表示目标语言，就是那些parser们的java代码的语&lt;br&gt;言是java。你猜对了，还可以是别的语言，比如C,C++啥的。RTFM。关于这个词&lt;br&gt;的使用，请参见上一段。&lt;p&gt;以上，RTFM，这个词在某处定义了，然后到处使用，正是编程的核心思想之一，&lt;br&gt;重用。编译器的存在，其意义也在于此。&lt;p&gt;3. parser&lt;p&gt;这一部分就是语法解析的核心了。&lt;p&gt;代码4：&lt;br&gt;1 starting&lt;br&gt;2 : game+&lt;br&gt;3 ;&lt;br&gt;4&lt;br&gt;5 game&lt;br&gt;6 : SYMBOL_NAME &amp;#39;:&amp;#39; node? ( NEXT node)*&lt;br&gt;7 -&amp;gt; ^(CLASS SYMBOL_NAME (node)*)&lt;br&gt;8 ;&lt;br&gt;9&lt;br&gt;10 node&lt;br&gt;11 : SYMBOL_NAME INT? -&amp;gt; ^(NODE SYMBOL_NAME (PARA INT)?)&lt;br&gt;12 ;&lt;p&gt;上述代码4，就是对杨氏语言的语法描述。&lt;p&gt;第1行至第3行，表示：杨氏语言的源文件是由很多个叫做 game的结点组成的。&lt;br&gt;有多个少这样的结点呢，+，这个符号的意思是 1 个或者更多。还有些别的符&lt;br&gt;号，*啊，?啊什么的，RTFM。&lt;p&gt;加号个game形成了一个叫starting的节点，后面我们解析的时候，就要告诉&lt;br&gt;header.java从这里开始动手。&lt;p&gt;第2行的冒号和第3行的分号，就这么写。&lt;p&gt;很多个game组成starting，那么game是什么呢？第5行至第8行回答了这个问题。&lt;p&gt;5 game&lt;br&gt;6 : SYMBOL_NAME &amp;#39;:&amp;#39; node? ( NEXT node)*&lt;br&gt;7 -&amp;gt; ^(CLASS SYMBOL_NAME (node)*)&lt;br&gt;8 ;&lt;p&gt;第6行表示：每个game在输入里，都是应该是这样的，先是一个SYMBOL_NAME，然&lt;br&gt;后跟一个冒号（输入里没引号的），然后是一个叫做node的结点（？表示它可能&lt;br&gt;存在也可能不存在）；接下来是一堆东西 ( NEXT node)* ，*个（即0个或者更&lt;br&gt;多）NEXT node，其中的node和上述node是同一个东西。&lt;p&gt;有人说，停，SYMBOL_NAME和NEXT和node都是什么呢？类似于game，后面有定义。&lt;br&gt;我们一会再谈这个。&lt;p&gt;继续看，第7行有个有意思的东西。&lt;br&gt;7 -&amp;gt; ^(CLASS SYMBOL_NAME (node)*)&lt;p&gt;-&amp;gt;，叫做 rewrite，有译作重写。-&amp;gt;后面的东西，是我们要把输入变成什么样的&lt;br&gt;语法树传到输出里。估计你还记得，pipe.g的输出不是最终输出的C++代码，&lt;br&gt;而是AST。-&amp;gt;就规定了这个输出的AST与输入（的语法树）间的对应关系。&lt;p&gt;为什么要rewrite呢？一个原因是我们希望在后继的解析和语义过程中，语法树能&lt;br&gt;以一种更方便我们（杨氏语言编译器程序员）一些，而不是更方便盟友（杨氏语&lt;br&gt;言源代码程序员）。我们在-&amp;gt;之前的语法，是为了盟友提供服务的，要尽可能让&lt;br&gt;他们用起来方便，就是 input.pipe 的样子；这里，通过 -&amp;gt; 改变成方便我们工&lt;br&gt;作的形式。有时，我们还可以舍弃一些没用的节点，或者添上一些 虚的&lt;br&gt;（imaginary）结点。第7行中的CLASS就是一个虚的节点，有时候需要用虚结点来&lt;br&gt;区别语法树相同的规则--即两条规则都使用了相同的语法树。&lt;p&gt;对了，补充，类似第1第至第3行，或者类似第5行至第8行，这样的条目，我们称&lt;br&gt;为规则（rule）。&lt;p&gt;4. lexer&lt;p&gt;上面提到，还有些东西没有定义。比如SYMBOL_NAME和NEXT和node。node已经在&lt;br&gt;parser部分第10行定义了，与前两条规则没啥区别。&lt;p&gt;SYMBOL_NAME和NEXT不太一样，一个曲型的特征就是它们是全大写的。它们放在&lt;br&gt;lexer部分，称为token。&lt;p&gt;代码5：&lt;br&gt;1 SYMBOL_NAME&lt;br&gt;2 : (&amp;#39;A&amp;#39;..&amp;#39;Z&amp;#39;|&amp;#39;a&amp;#39;..&amp;#39;z&amp;#39;|&amp;#39;_&amp;#39;) (&amp;#39;A&amp;#39;..&amp;#39;Z&amp;#39;|&amp;#39;a&amp;#39;..&amp;#39;z&amp;#39;|&amp;#39;_&amp;#39;|&amp;#39;0&amp;#39;..&amp;#39;9&amp;#39;)*&lt;br&gt;3 ;&lt;br&gt;4&lt;br&gt;5 WS&lt;br&gt;6 : (&amp;#39; &amp;#39;|&amp;#39;\t&amp;#39;|&amp;#39;\n&amp;#39;|&amp;#39;\r&amp;#39;)+ {$channel = HIDDEN;}&lt;br&gt;7 ;&lt;br&gt;8&lt;br&gt;9 INT&lt;br&gt;10 : (&amp;#39;0&amp;#39;..&amp;#39;9&amp;#39;)+&lt;br&gt;11 ;&lt;p&gt;第1行至第3行表示：定义SYMBOL_NAME。SYMBOL_NAME是大小写字母或下划线开头，&lt;br&gt;后面接*个大小写字母或下划线或数字。就是C语言变量或函数名（合称symbol&lt;br&gt;name）的规范。&lt;p&gt;第5行至第7行，定义了要跳过的符号，空格，tab什么的。&lt;p&gt;第9行至第11行，定义了parser部分引用的一个token，整形数据INT。为了简单，我&lt;br&gt;们的目标代码，如果有参数，就只传int的，且只有一个。&lt;p&gt;语法（parser）和词法（lexer）看起来差不多。因为一些机制上的不同，所以&lt;br&gt;要分开对待。细节，RTFM。&lt;p&gt;- 模板&lt;p&gt;接下来我们针对输出的结果写一个模板文件。我放在了工作目录下的st目录下，&lt;br&gt;头文件生成要用的模板是 header.stg。&lt;p&gt;.stg只有三部分，在简单的案例中，甚至可以紧缩成一部分。&lt;p&gt;1. 头部。头部这个名字也是我瞎起的，不知道手册里叫做什么。&lt;p&gt;代码6：&lt;br&gt;1 delimiters &amp;quot;$&amp;quot;, &amp;quot;$&amp;quot;&lt;p&gt;也只有一行。告诉stringtemplate，不是告诉antlr，我们要用$作为开始一个占&lt;br&gt;位符的标志，也用$作为结束一个占位符的标志。占位符这个词我们此前提到过，要&lt;br&gt;准备用一个变量去填充的东西。&lt;p&gt;2. 正文&lt;p&gt;如果紧缩为一个部分，这部分是必须有的。它规定了我们打算输出什么样的东&lt;br&gt;西，架子，以及放在架子某个位置的占位符。&lt;p&gt;代码7：&lt;br&gt;1 class_delc(CLASS_UPPER, CLASS_NAME, member_function_list) ::= &amp;lt;&amp;lt;&lt;br&gt;2 #ifndef _$CLASS_UPPER$_H_&lt;br&gt;3 #define _$CLASS_UPPER$_H_&lt;br&gt;4&lt;br&gt;5 #include &amp;lt;iostream&amp;gt;&lt;br&gt;6&lt;br&gt;7 class $CLASS_NAME$&lt;br&gt;8 {&lt;br&gt;9 private:&lt;br&gt;10 int data;&lt;br&gt;11&lt;br&gt;12 public:&lt;br&gt;13 $member_function_list:member_function(); separator=&amp;quot;\n&amp;quot;$&lt;br&gt;14 $CLASS_NAME$();&lt;br&gt;15 ~$CLASS_NAME$();&lt;br&gt;16 };&lt;br&gt;17&lt;br&gt;18&lt;br&gt;19&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-8677597034946892444?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/8677597034946892444/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=8677597034946892444' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/8677597034946892444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/8677597034946892444'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/12/antlrstringtemplatemethod-chaining4.html' title='使用Antlr+Stringtemplate生成method chaining，一个不太简单的案例（4）'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-4304473726757816568</id><published>2011-12-02T21:59:00.001+08:00</published><updated>2011-12-02T21:59:26.019+08:00</updated><title type='text'>使用Antlr+Stringtemplate生成method chaining，一个不太简单的案例（3）</title><content type='html'>使用Antlr+Stringtemplate生成method chaining，一个不太简单的案例（3）&lt;p&gt;- 前面忘了交待的事&lt;p&gt;之所以要写这篇博客的原因，是因为在网上看到的 antlr 教程大部分都是进行四&lt;br&gt;则运算。四则运算的确很经典，不过对于学生来说，有另一个例子比只有一个例&lt;br&gt;子更好。&lt;p&gt;前几天查别的资料的时候，我抱怨过到处都是同一个贴子，赵秋实同学：那你就&lt;br&gt;自己写一个吧。写一个挺累的，但是他说的对，所以我就写了一个不是四则运算&lt;br&gt;的。&lt;p&gt;- 开发工具及版本&lt;p&gt;上次提到要生成的东西，现在终于说到正题，生成这些产品的工具，代码生成我&lt;br&gt;们的开发工具版本是antlr-3.4-complete-no-antlrv2.jar。为了方便看语法树和&lt;br&gt;简单调试，你还可以下载 antlrworks-1.4.3.jar。这两个东西都可以从&lt;br&gt;[&lt;a href="http://antlr.org/download.html]"&gt;http://antlr.org/download.html]&lt;/a&gt;下载。其中已经包含stringtemplate了，不&lt;br&gt;必另外下载。&lt;p&gt;此外，antlr需要java运行时库，目前的版本要求是1.5或更高。&lt;p&gt;为了跑我们生成的代码，还需要g++。我用的版本是 g++ (Ubuntu&lt;br&gt;4.4.3-4ubuntu5) 4.4.3。因为生成的代码涉及规范都很基本，理论上，你用啥版&lt;br&gt;本都行。&lt;p&gt;我在Linnux下跑所有这些东西，Ubuntu。因为这些东西都是跨平台的，你用什么&lt;br&gt;操作系统都应该可以。不过，请原谅我给的运行脚本--相当于批处理，只有&lt;br&gt;Linux版本。脚本只是为了运行方便，即使你不懂脚本，根据我的解释，手动重现&lt;br&gt;或编个批处理应该都不是难事。&lt;p&gt;- 生成&lt;p&gt;仅有工具而没有操纵工具的灵魂，是无法赋予工具以智慧的。所以，我们需要一&lt;br&gt;些文件，用以指导 antlr+stringtemplate 工作。&lt;p&gt;我们一共要生成三种东西：.h, .cpp. go.cpp(driver)，还要再写两个脚本，一&lt;br&gt;个用于调用生成的过程，另一个用于编译和执行生成的产品。&lt;p&gt;为了生成这三种产品，我们需要以下文件，作为指导 antlr+stringtemplate 运&lt;br&gt;行的指令。这几个文件，除了扩展名，可以认为都是瞎起的，只是为了方便我们&lt;br&gt;记忆，没有别的意义。&lt;p&gt;以下，以生成头文件为例说明。除了&lt;a href="http://pipe.xn--ggo-9i4e.sh"&gt;pipe.g和go.sh&lt;/a&gt;，头文件、cpp文件、go.cpp&lt;br&gt;每个目标都需要一组以下这些东西。&lt;p&gt;1. pipe.g：.g表示这是grammar，文法文件。这里，存有我们要实现的杨氏语言的&lt;br&gt;语法。&lt;p&gt;语法，在自然语言中，是规定一个句子的主谓宾和时态等如何表达的规则。现在&lt;br&gt;的中国人，都很熟悉英语的语法。你没看错，是中国人，熟悉的是英语的语法，&lt;br&gt;另一个国家的。其实汉语本身也是有语法的，只是当今有些年轻人不再知道了。&lt;p&gt;当年我们语文课中学到：主谓宾定状补，这都是句子的成份。还在偏正短语啥的。&lt;br&gt;当然，与英语不同（这也谈不上特殊，请不要走到另一个极端，和咱们类似的也&lt;br&gt;有的是），汉语使用助词而不是动词的变形表示时态。&lt;p&gt;你吃了吗 和 你吃吗 的区别就在于时态。&lt;p&gt;汉语和英语，都是 主+谓+宾 这种形式。而日文（还有德文？）就是 主 + 宾 +&lt;br&gt;谓 这种形式。&lt;p&gt;位置、变形等决定了词的语法意义。&lt;p&gt;比如我们的输入文件：&lt;p&gt;mario:&lt;br&gt;pipe_a 123 | pipe_b | pipe_c&lt;p&gt;其中的 &amp;quot;mario:&amp;quot; 表示打算建个类，名字叫做 mario。&lt;p&gt;&amp;quot;pipe_a 123 | pipe_b | pipe_c&amp;quot;表示打算在这个类里建三个方法，其中pipe_a&lt;br&gt;有个参数。调用的时候传参123进去，调用的顺序依次是 pipe_a, pipe_b,&lt;br&gt;pipe_c。&lt;p&gt;这些打算，就是语法（syntax）告诉我们的。根据语法判断输入文件&lt;br&gt;input.pipe，即杨氏语言的源文件打算做什么，这个过程叫做解析（parser）。&lt;p&gt;2. decl.g：.g表示这是grammar，确切地说，是tree grammar文件。我们使用了&lt;br&gt;AST（抽象语法树）来帮助实现pipe.g的语法中指定的那些&amp;quot;打算&amp;quot;。&lt;p&gt;我们把为了实现这些打算而写的代码，称为动作（action）。&lt;p&gt;打比方来说。一句话，对于源代码而言，通常是一个命令，比如&amp;quot;吃饭&amp;quot;。这是个&lt;br&gt;祈使句。&lt;p&gt;通听懂&amp;quot;吃饭&amp;quot;，分解为 动词吃 和 宾语名词饭，这就是语法分析。用什么样的动&lt;br&gt;作才能实现吃这个动作，怎么把饭作为动词吃执行的对象，这就是动作需要指定&lt;br&gt;的。杨氏语言的编译器，就像一台机器，语法指定了它能听懂你的指令，而动作&lt;br&gt;规定了它执行这些命令的措施--移动哪个肢张开多大口--包括这些针对不同规格&lt;br&gt;的饭的行为。&lt;p&gt;我们把这些动作--针对语法而执行的语义（semantics）。&lt;p&gt;3. header.java&lt;p&gt;语法和语义文件，会经antlr处理生成几个java类，这些类的调用是由&lt;br&gt;header.java完成的。header.java这个名字也基本是随意起的，之所以称为&lt;br&gt;header是因为要用于生成头文件，之所以.java，那是因为它就真的是个java源&lt;br&gt;文件，后来会被编译为.class。&lt;p&gt;这个比较简单，基本是套路的，抄来改吧改吧就能用。&lt;p&gt;4. input.pipe&lt;p&gt;就是它：&lt;p&gt;mario:&lt;br&gt;pipe_a 123 | pipe_b | pipe_c&lt;p&gt;peach:&lt;br&gt;stage_1 123 | stage_2&lt;p&gt;bowser:&lt;br&gt;lose_1 123 | lose_2 | lose_3 | lose_4 234&lt;p&gt;我们的杨氏语言编译器读了这个输入的杨氏语言源代码以后，会生成三个类，分&lt;br&gt;别是mario，即马利，peach，那个公主，还有bowser，乌龟壳boss。它们分别有&lt;br&gt;两三四个类，如上所示。估计你完全能看懂，这比C++简单多了。&lt;p&gt;5. go.sh&lt;p&gt;这个是脚本，是用来调用header.java的，及一些前期处理工作，删除以前的生成&lt;br&gt;结果啦，建个工作目录啦，编译那些java文件(antlr从我们.g里生成出来的，还&lt;br&gt;有header.java)啦啥的。对了，它还会把 input.pipe 作为 杨氏语言编译器的&lt;br&gt;输入，并且编译杨氏语言编译器输出的C++代码，然后执行一下。&lt;p&gt;脚本的动机是，我改一下.g文件，然后运行一次go.sh，就能自动地把上述工作完&lt;br&gt;成。顺便说一句为什么非得有个自动的东西，而不是手动执行那几行命令--因为&lt;br&gt;真的要执行非常非常多次。.g文件，也就是整个事情的核心，非常地不容易写。&lt;br&gt;非常不容易写的原因，如某位外国友人程序员说的：antlr的报错，也就是对.g处&lt;br&gt;理的报错信息，就像加过密一样难读。&lt;p&gt;我们之所以还要容忍它的原因，是因为同时它也真的很富有生产力。&lt;p&gt;6. header.stg：String Template Group，模板（组）。&lt;p&gt;header.stg源代码中有的地方看起来像这样：&lt;p&gt;#ifndef _$CLASS_UPPER$_H_&lt;br&gt;#define _$CLASS_UPPER$_H_&lt;p&gt;对比一下我们要生成的头文件&lt;p&gt;#ifndef _MARIO_H_&lt;br&gt;#define _MARIO_H_&lt;p&gt;是不是觉得似曾相识？&lt;p&gt;我们要做的，就是要在.g里把模板载入，然后用从源代码 input.pipe 中解析出&lt;br&gt;来的 mario 再改成大写，用来代替 CLASS_UPPER，即两个$中间的内容。&lt;p&gt;当然，实际要替换的东西比这要复杂，尤其是当模板中的某一区域要重复很多&lt;br&gt;次，而次数和内容取决于源代码 input.pipe 的时候。&lt;p&gt;我们一共就要生成这些东西。它们之间的关系，也就是整个系统跑起来的原理是：&lt;p&gt;下面的 &amp;quot;-&amp;gt;&amp;quot; 表示数据流，而不是谁变成了谁。有括号&amp;quot;()&amp;quot;的节点，表示程序，&lt;br&gt;没 &amp;quot;()&amp;quot; 的，表示数据。&lt;p&gt;1. pipe.g + header.g -&amp;gt; (antlr) -&amp;gt; 一些java文件--parser们&lt;p&gt;2. input.pipe -&amp;gt; （header.java 调用 parser们） -&amp;gt; .cpp和.h们 + go.cpp&lt;p&gt;3. go.sh 调用以上过程。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-4304473726757816568?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/4304473726757816568/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=4304473726757816568' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/4304473726757816568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/4304473726757816568'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/12/antlrstringtemplatemethod-chaining3.html' title='使用Antlr+Stringtemplate生成method chaining，一个不太简单的案例（3）'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-2189227096382121320</id><published>2011-12-02T15:04:00.001+08:00</published><updated>2011-12-02T15:04:15.903+08:00</updated><title type='text'>shell助我去战斗</title><content type='html'>shell助我去战斗&lt;p&gt;客户催进度的消息传来几次，我恨恨地想：再催再催，我就把你们全带去封闭开&lt;br&gt;发。好吃好喝，不让睡觉，天天干活。&lt;p&gt;我估算了一下，担保不等项目结束，客户全过劳死光，我一定还能幸存。&lt;p&gt;编码间歇看邮件，ZHUMAO同学带来噩耗，他要暂时关闭我们的GIT服务器，得备&lt;br&gt;份。&lt;p&gt;不少项目都有单儿的 git repository，在ZHUMAO的服务器上中央存储。关键是，不&lt;br&gt;少，我得把它们全pull一次，有些不紧急的，我已经一段时间没pull了。&lt;p&gt;恩。背影知识：git是一种版本控制系统，版本控制就是你写一大篇文章，中间&lt;br&gt;的很多过程都要记录下来，留着有用。pull，就是把git服务器上的东西整下来。&lt;p&gt;一个个项目。一个个进入那些目录，pull，然后再进入下一个目录。&lt;p&gt;非常不好。那么，编段程序完成这个任务吧。&lt;p&gt;编程序完成的好处在于：虽然花了时间，可能是等长甚至更长的时间，却可以更&lt;br&gt;容易保证质量。&lt;p&gt;这好比你打算用蜡烛做十个小兔子，如果一个个用手雕刻，那个每个的质量都是&lt;br&gt;无关的。如果花时间做个模具，那么，只要有一个小兔子是质量过关的（并且工&lt;br&gt;艺上，比如温度，控制得当），那么其他所有的小兔子就都是质量过关的。&lt;p&gt;1. 统一规格&lt;p&gt;我找到所有的配置文件，把 remote 和 url （就是远程的git服务及指定上面的&lt;br&gt;项目）都改成相同的。&lt;p&gt;当然，可以编个awk&amp;amp;sed程序直接改了，但是我没那个功力，且学会了&amp;quot;对付一下&lt;br&gt;得了，不要么通用&amp;quot;的原则。所以，我找到每一个 不符合 要求的配置文件，然&lt;br&gt;后手动修改。&lt;p&gt;这么找：&lt;p&gt;: find . -name config  | xargs grep -i &amp;quot;.231&amp;quot; -nH&lt;p&gt;-nH参数的作用是打印是哪个文件的哪行命中了。&lt;p&gt;2. 写个程序，遍历目录，挨个pull&lt;p&gt;就这样：&lt;p&gt;1 for i in $(ls -d */)&lt;br&gt;2 do&lt;br&gt;3     echo pulling $i&lt;br&gt;4     cd $i&lt;br&gt;5     convmv * -r -f utf-8 -t gb2312 --notest &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;br&gt;6     git pull origin master&lt;br&gt;7     convmv * -r -f gb2312 -t utf-8 --notest &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;br&gt;8     cd ..&lt;br&gt;9 done&lt;p&gt;啥意思呢？&lt;p&gt;第1行，for是个循环，它将令变量i遍历 $() 里的东西，即 ls -d */。&lt;p&gt;ls -d */ 的作用是列出当前目录下所有的目录。&lt;p&gt;第2行至第9行，是循环体。在每次循环时，都完成以下任务。&lt;p&gt;1. 第3行，显示当前正pull谁呢，让我心里有个数。不然，通常我就等不及强制&lt;br&gt;结束了。&lt;p&gt;2. 第4行，进入以$i这个变量为名的目录。&lt;p&gt;3. 第5行和第7行，是把文件名在utf-8和gb2312间编码转换。原因是：a.祖国尚&lt;br&gt;未统一世界，万码奔腾的局面还会存在很多年;b.虽然通知了所有的程序员不要&lt;br&gt;使用中文文件名，大家还是有时候会忘。&lt;p&gt;解释一下&amp;quot;&amp;gt; /dev/null 2&amp;gt;&amp;amp;1&amp;quot;的意思。&amp;gt; /dev/null 是把输出重定向到黑洞里&lt;br&gt;去，免得烦我。你肯定也有那感觉，多余的信息，不如没有。2&amp;gt;&amp;amp;1 的意思是把错&lt;br&gt;误信息，即出错时的报错信息也扔到黑洞里去。你看，我连错误也不想看到...跟&lt;br&gt;我们中的某些人类似。&lt;p&gt;4. 第6行，是核心，也就是 git pull origin master，从origin指向的url中&lt;br&gt;pull下东西，放到master分支中去。&lt;p&gt;为了核心的，我们真正要做的事，我们做了多少准备工作啊。而且，还有收尾工&lt;br&gt;作。&lt;p&gt;5. 第8行，收尾，回到上一级目录，以便继续遍历下一个项目。故事再次上演，&lt;br&gt;没有一点改变。&lt;p&gt;这个故事告诉我们，真正的我们想做的事，往往在一大堆看似无关和无聊的事情&lt;br&gt;当中。我们需要发现本质，同时，我们也需要有能力完成核心以外的事情。&lt;p&gt;这个故事还告诉我们，第8行，收尾工作非常重要。项目的开始并非开始于项目开&lt;br&gt;始的时候，而是开始于上一个项目结束的时候。&lt;p&gt;所以，令我们安慰的，如果当前有什么事情无法完成，那不是此刻的你的错误，&lt;br&gt;而是更早的你积累的结果。非常简单的推论，如果未来的你有什么事情无法完&lt;br&gt;成，其错肇始于此刻。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-2189227096382121320?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/2189227096382121320/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=2189227096382121320' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/2189227096382121320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/2189227096382121320'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/12/shell.html' title='shell助我去战斗'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-4141357478611206528</id><published>2011-12-01T17:11:00.000+08:00</published><updated>2011-12-01T17:12:24.599+08:00</updated><title type='text'>使用Antlr+Stringtemplate生成method chaining，一个不太简单的案例（2）</title><content type='html'>使用Antlr+Stringtemplate生成method chaining，一个不太简单的案例（2）&lt;p&gt;前传，母模 method chaining&lt;p&gt;我们要用 antlr+stringtemplate 开发的东西，是 method chaining 的生成器。&lt;br&gt;因此，我们得先知道 method chaining 个什么样子。正如当我们想做个蜡烛小东&lt;br&gt;西的时候，我们得先做出这个小东西的母模来。&lt;p&gt;母模与最终的批量产品看起来样子完全相同，但是，母模是用手工打造的。&lt;p&gt;method chaining 是实现 Fluent interface 的一种手段，这俩在 wikiepdia&lt;br&gt;上都是条目，详情请自己去查。&lt;p&gt;Fluent interface 是软件工程中的一种方法，希望能让代码更可读。试对比：&lt;p&gt;方案A：&lt;p&gt;o_mario-&amp;gt;pipe_a(123);&lt;br&gt;o_mario-&amp;gt;pipe_b();&lt;br&gt;o_mario-&amp;gt;pipe_c();&lt;p&gt;方案B：&lt;p&gt;o_mario-&amp;gt;pipe_a(123)-&amp;gt;pipe_b()-&amp;gt;pipe_c();&lt;p&gt;或者&lt;p&gt;方案C：&lt;p&gt;o_mario-&amp;gt;pipe_a(123)&lt;br&gt;        -&amp;gt;pipe_b()&lt;br&gt;        -&amp;gt;pipe_c();&lt;p&gt;是不是觉得方案B和方案C的可读性更好一些？况且，我们少键入几次o_mario，&lt;br&gt;也减少了错误的可能。&lt;p&gt;Fluent interface 的提出者是牛人 Martin Fowler。如果你读书不注意作者的&lt;br&gt;话，可能会不记得他。他的作品包括 分析模式（不是四人帮的设计模式），UML&lt;br&gt;精粹，重构，Domain-Specific Languages 等。他是敏捷方法、极限编程、UML&lt;br&gt;和模式领域的专家，还推动了 依赖注入（控制反转）一词的流行 。&lt;p&gt;以上八卦结束，无外乎想说明 method chaining 这技术系出名门，有纯正的民间&lt;br&gt;血统。&lt;p&gt;Fluent interface 能够让调用这一方法的程序员写出的代码，看起来像是一种&lt;br&gt;领域定义语言，更专门，也更容易被本领域的专家（或人类）识读。也就是说，&lt;br&gt;读者可以经受更少的训练即可读懂。&lt;p&gt;凡是具有平易近人特性的东西，似乎也都具有另一个特性，那就是精美的包装。&lt;br&gt;而包装是需要代价的。&lt;p&gt;不过，我们遵循这样的原则：当你是一个库函数的程序员的时候，库函数的接&lt;br&gt;口，应该以令使用它的人感到愉悦为原则。你在此时多花费的时间，不仅楚人失&lt;br&gt;之楚人得之，而且将以十倍百倍在别人那里得到节省。&lt;p&gt;这也正是我们的价值所在。那种认为&amp;quot;我依赖你对你撒娇，那都是看得起你&amp;quot;的&lt;br&gt;人，可能从来没想过它的反命题，&amp;quot;我不允许你依赖不允许你撒娇，那都是看得起&lt;br&gt;你&amp;quot;，因为把你视为平等的人类而不是低一等级的什么。&lt;p&gt;工程中没有小情小调。你真的以为现在撒娇的你，将来遇到问题的时候能够替大&lt;br&gt;家挡下风雨么？&lt;p&gt;所以，如果我们是库函数程序员，我们要提供令别人觉得享受的接口去调用。&lt;br&gt;method chaining就令人愉悦，所以我们要考虑一下怎么实现了。&lt;p&gt;我们的盟友需要的效果是这样的：&lt;p&gt;o_mario-&amp;gt;pipe_a(123)-&amp;gt;pipe_b()-&amp;gt;pipe_c();&lt;p&gt;那么，我们考虑一下实现。&lt;p&gt;1. o_mario-&amp;gt;pipe_a(123)，第一个函数的调用&lt;p&gt;o_mario（严格的说，是这个指针类型的变量的类类型）需要有一个方法，这&lt;br&gt;个方法是pipe_a.这个容易，就是这样：&lt;p&gt;代码1：&lt;p&gt;class mario&lt;br&gt;{&lt;br&gt;   public:&lt;br&gt;     pipe_a(int par);&lt;br&gt;};&lt;p&gt;以上是头文件中的内容，函数的实现非常简单，先不讨论.&lt;p&gt;2. o_mario-&amp;gt;pipe_a(123)-&amp;gt;pipe_b()，第二个函数的调用，及第一个函数的声明&lt;p&gt;后面这个pipe_b()是个什么东西呢？&lt;p&gt;这应该是另一个方法。谁的方法呢。从库函数使用者的角度看，它应该是&lt;br&gt;o_mario-&amp;gt;pipe_a(123) 这段代码的返回值 的成员函数。&lt;p&gt;这里有两件重要的事。第一，重申：它应该是o_mario-&amp;gt;pipe_a(123) 这段代码的&lt;br&gt;返回值 的成员函数。因为pipe_b()的前面有 -&amp;gt;，所以无疑的，前面是个类的实&lt;br&gt;例的指针。看不懂的同学，请回去复习一下C语言中的structure的成员变量如何&lt;br&gt;引用 和 这个structure的指针如何引用成员变量。&lt;p&gt;第二，一种思维方法。当我们讨化如何实现的时候，我们可以从接口（广义的）&lt;br&gt;的形势入手，而不从对实现的猜测本身入手。也就是说，我们先明确它应该是个&lt;br&gt;什么样子，而不是应该如何实现。因为在这里，接口，是动机，要首先明确，而&lt;br&gt;实现手段，可以有千千万万，我们一个个穷举起来代价比较大。&lt;p&gt;以上两件重要的事讨论完毕，我们再回头来看，这句话有点长：&lt;p&gt;o_mario-&amp;gt;pipe_a(123)-&amp;gt;pipe_b()中的pipe_b()是 o_mario-&amp;gt;pipe_a(123) 这段&lt;br&gt;代码的返回值 的成员函数。&lt;p&gt;即 第二个函数，是第一个函数的返回值的成员。&lt;p&gt;理解了这一点以后，我们可以再进入一步问，我们需要的是第一个函数返回值的&lt;br&gt;成员，那么，第一个函数的返回值是什么东西么？&lt;p&gt;它应该是一个类类型(class type)实例的指针。&lt;p&gt;哪一个类类型为好呢？ class mario 就非常适合。&lt;p&gt;所以，我们把代码1改一下，确定第一个函数的返回值类型，变成下面这样：&lt;p&gt;代码2：&lt;br&gt;class mario&lt;br&gt;{&lt;br&gt;   public:&lt;br&gt;     mario* pipe_a(int par);&lt;br&gt;};&lt;p&gt;以上是这个函数的&amp;quot;接口&amp;quot;，即怎么去调用它。&lt;p&gt;3. 第一个函数的实现&lt;p&gt;我们需要的已经明确，下一步才是如何得到。&lt;p&gt;在这里，我还是想再一次强调，明确自己需要的是什么非常重要，远远比知道如&lt;br&gt;何去实现要重要。始终坚守并提醒自己想要的是什么，希望能有效地避免走上与&lt;br&gt;自己的愿望相反的道路。&lt;p&gt;WG同学提到过一个问题，如果把一群人关起来，不让他们了解外部的世界，给他&lt;br&gt;们好吃好喝，或者教育他们认为自己得到的是最好的，这是否给了他们幸福。&lt;p&gt;这个问题可以用另外的两个似乎无关的事情来回答。&lt;p&gt;一是，有日本人称中国人为支那人，我们很不喜欢，认为受到了侮辱。有人提到&lt;br&gt;过，那不就是个名字么，为什么认定这是侮辱。提这个问题的人显然没有意识到&lt;br&gt;这样一个道理：当你认定自己受到了侮辱的时候，那么就是受到了侮辱。这与发&lt;br&gt;出行为的人的动机甚至关系都不那么紧密。所谓尊重，就是不做对方认为侮辱的&lt;br&gt;事情。&lt;p&gt;所以前面提到的类似观点&amp;quot;我欺负你正是爱你&amp;quot;，可以问问对方，他喜欢这样的爱&lt;br&gt;么。这类似于百年前的男人问问自己的老婆，我殴打你才是爱你，你接受么？&lt;p&gt;对方不接受的，就不是他想要的。当我们讨论对方的感受时，我们必须讨论对方&lt;br&gt;的感受，而不是你的感受。你没看错，我说的就是&amp;quot;当我们讨论对方的感受时，我&lt;br&gt;们必须讨论对方的感受&amp;quot;，即，当我们讨论A时，我们必须讨论A。&lt;p&gt;道理朴素到可以归结为 A就是A，但是有些人仍然不懂，因为他们加了很多附加&lt;br&gt;条件，却无视这些条件都与A无关。&lt;p&gt;WG同学的方案里，如果被关起来的那些人觉得好，那就是好呗。问题是，那些人&lt;br&gt;*真的*觉得好么？&lt;p&gt;家长包办婚姻（这个词对你来说，是不是史前时代的古拉丁语）的时候对孩子&lt;br&gt;说，&amp;quot;我都是为了你好啊&amp;quot;。且住，那得由你来判定。&lt;p&gt;第二个回答WG同学的例子。扯淡的。我喜欢一个人，我把他，对不起，我把她捆&lt;br&gt;起来，不放走，每天喂猴头燕窝鲨鱼翅。最后她终于逃脱，找来一群人要揍我。&lt;p&gt;我可不可以说：至少，你吃到并消化了那么多好东西，那都是我卖血换来的啊。&lt;br&gt;你如何报偿我呢。&lt;p&gt;这个例子如此浅显，以至于你都愤慨了吧。但是它和WG同学那个看似合理的方案&lt;br&gt;有一个共同点，即 被捆起来饲养的那位，她愿意吗。&lt;p&gt;愿意，意愿，希望得到的是什么，这非常重要。这比如何实现重要一百倍。&lt;p&gt;以上扯淡结束。我们已知库函数使用者想要的是 代码2。其实，至此我们还没有&lt;br&gt;做一点自己的库函数开发的工作，只是明确了盟友的需求。&lt;p&gt;应该是这样实现的。&lt;p&gt;代码3，加了行号。&lt;p&gt;1 mario* mario::pipe_a(int par)&lt;br&gt;2 {&lt;br&gt;3     std::cout &amp;lt;&amp;lt; &amp;quot;I am running in &amp;quot; &amp;lt;&amp;lt; __FUNCTION__ &amp;lt;&amp;lt; std::endl;&lt;br&gt;4     this-&amp;gt;data = par;&lt;br&gt;5     std::cout &amp;lt;&amp;lt; &amp;quot;data: &amp;quot; &amp;lt;&amp;lt; data &amp;lt;&amp;lt; std::endl;&lt;br&gt;6     return this;&lt;br&gt;7 }&lt;p&gt;其中，第1行就是声明的重复。&lt;p&gt;第3行和第5行，是为了调试的时候方便，能看着点啥。__FUNCTION__ 是编译成&lt;br&gt;debug版内置的，函数名。第4行，是为了显示效果，有一个成员变量，data，int型&lt;br&gt;的。&lt;p&gt;第6行是有意思的一行，它的作用，即我们刚刚讨论的，我们的盟友需要的，返&lt;br&gt;回值。&lt;p&gt;返回值是什么呢?是this指针。它是一个指针，指向了这个类类型的这一个实例。&lt;p&gt;所以，pipe_a 和 pipe_b 是同一个实例（的指针）调用的成员函数，这些方法&lt;br&gt;的数据将存储在（或读取自）同一个实例中。也正因为同一实例这一点，经常有&lt;br&gt;人用 method chaining 来初始化类类型的变量。&lt;p&gt;比如这样；&lt;br&gt;代码4，出自[&lt;a href="http://en.wikipedia.org/wiki/Fluent_interface#C.2B.2B"&gt;http://en.wikipedia.org/wiki/Fluent_interface#C.2B.2B&lt;/a&gt;]&lt;p&gt;     FluentGlutApp(argc, argv)&lt;br&gt;          .withDoubleBuffer().withRGBA().withAlpha().withDepth()&lt;br&gt;          .at(200, 200).across(500, 500)&lt;br&gt;          .named(&amp;quot;My OpenGL/GLUT App&amp;quot;)&lt;br&gt;          .create();&lt;p&gt;4. o_mario-&amp;gt;pipe_a(123)-&amp;gt;pipe_b()-&amp;gt;pipe_c()&lt;p&gt;我们目前实现到 pipe_b()，容易看出，后面的 pipe_c() 与 pipe_b() 没有区&lt;br&gt;别。&lt;p&gt;这样，代码5：&lt;p&gt;mario* mario::pipe_c()&lt;br&gt;{&lt;br&gt;     std::cout &amp;lt;&amp;lt; &amp;quot;I am running in &amp;quot; &amp;lt;&amp;lt; __FUNCTION__ &amp;lt;&amp;lt; std::endl;&lt;br&gt;     return this;&lt;br&gt;}&lt;p&gt;5. 调用者&lt;p&gt;我们替盟友写一段代码，测试一下是否能工作，然后再交付。交付的时候才发现&lt;br&gt;很多麻烦没有解决，无论是多小的麻烦，都应该认识到，那是我们的责任，不能&lt;br&gt;推给库函数使用者去完成，因为他不替你领工资。&lt;p&gt;我们把这段调用库函数的代码称为 driver，推动事情运行的东西。&lt;p&gt;代码6：&lt;p&gt;#include &amp;lt;mario.h&amp;gt;&lt;br&gt;int main(int argc, char *argv[])&lt;br&gt;{&lt;br&gt;     mario* o_mario    =    new mario();&lt;br&gt;     o_mario-&amp;gt;pipe_a(123)-&amp;gt;pipe_b()-&amp;gt;pipe_c();&lt;br&gt;     delete o_mario;&lt;br&gt;     return 0;&lt;br&gt;}&lt;p&gt;6. 对生成 method chaining 的展望&lt;p&gt;这样，我们需要三个文件：&lt;p&gt;mario.h 头文件，类及其成员的声明；&lt;br&gt;mario.cpp cpp文件，类及其成员的定义；&lt;br&gt;go.cpp driver文件，负责调用mario的函数们，即&lt;br&gt;o_mario-&amp;gt;pipe_a(123)-&amp;gt;pipe_b()-&amp;gt;pipe_c()。&lt;p&gt;7. 重提母模&lt;p&gt;如果我们仅只需要马利这样一个类，那么手写就可以了，手写完交给库函数程序&lt;br&gt;员成千上万次像driver那样调用.&lt;p&gt;但是我们可能需要很多个这样的类，而它们的结构如此类似。所以，我们需要大&lt;br&gt;量地成批地生成它们。&lt;p&gt;对于每一个类，我们都需要 .h和.cpp文件各一个，用类的名字命名；所有这些&lt;br&gt;类，我们还需要一个driver.cpp，调用它们。&lt;p&gt;以上，明确了1.我们的代码需要生成，2.我们需要生成哪些东西，3.这篇博客的&lt;br&gt;主体，这些生成的代码都应该是什么样子的。&lt;p&gt;8. 附录，那些文件 的代码&lt;p&gt;以下是我们明天要生成的代码。它们现在也可以编译，这样：&lt;p&gt;g++ -I. *.cpp -o go&lt;p&gt;执行的时候：&lt;p&gt;./go&lt;p&gt;此外，从下面的driver.cpp中你可以看出，其实，我已经有了不止mario一个类。&lt;br&gt;它们都能通过我们接下来要介绍的杨氏语言编译器生成出来。&lt;p&gt;你猜到了，下面的代码，确实就是生成出来的。&lt;p&gt;8.1 mario.h&lt;p&gt;1 #ifndef _MARIO_H_&lt;br&gt;2 #define _MARIO_H_&lt;br&gt;3&lt;br&gt;4 #include &amp;lt;iostream&amp;gt;&lt;br&gt;5&lt;br&gt;6 class mario&lt;br&gt;7 {&lt;br&gt;8   private:&lt;br&gt;9     int data;&lt;br&gt;10&lt;br&gt;11   public:&lt;br&gt;12     mario* pipe_a(int par);&lt;br&gt;13     mario* pipe_b();&lt;br&gt;14     mario* pipe_c();&lt;br&gt;15     mario();&lt;br&gt;16     ~mario();&lt;br&gt;17 };&lt;br&gt;18&lt;br&gt;19&lt;br&gt;20&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-4141357478611206528?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/4141357478611206528/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=4141357478611206528' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/4141357478611206528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/4141357478611206528'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/12/antlrstringtemplatemethod-chaining2.html' title='使用Antlr+Stringtemplate生成method chaining，一个不太简单的案例（2）'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-4732794781570975619</id><published>2011-11-30T22:03:00.001+08:00</published><updated>2011-11-30T22:03:18.620+08:00</updated><title type='text'>使用Antlr+Stringtemplate生成method chaining，一个不太简单的案例（1）</title><content type='html'>使用Antlr+Stringtemplate生成method chaining，一个不太简单的案例（1）&lt;br&gt;引言&lt;br&gt;听着douban电台，很多新的旧的听说过和完全不认识的歌者在网络的另一端歌唱。我也不知识他们和她们都在想些什么，为了哪些感动的事情而快乐忧伤，我知道的是，这些歌声是某种数据流，彩色的发光的，在网络中穿行，最后然后驱动线圈振荡，驱动膜片振荡，驱动我的耳蜗。&lt;br&gt;这些背后，是信息论和电子学，以及无数理论支撑的结果。因为这些，世界才可能令这样美丽。&lt;br&gt;听说，BBC声称，编程技术正成为拉丁文学一样的东西。我们正尽享生活，就越来越不屑于了解世界背后的原理。令人不禁想起古罗马一片欢乐声里那些正催吐，以便吃下更多美食的达官。他们正忘记如何战斗，也正失去古希腊探索世界本源的精神。&lt;br&gt;读罗马史，我看到了散落一地的破碎镜片，很多碎片闪着耀眼的光，也同样是在这些碎片中，我看到我们自己的影像。&lt;br&gt;----&lt;br&gt;计算机由语言操纵运行，语言表达了人类的思想。人类的，或更精准的更形式化的语言要转化为机器唯一能了解的代码，然后，机器方能听命于人。&lt;br&gt;这种翻译人类可识读语言（C/C++,java,python,perl...html）为机器语言的工具，名为编译器。&lt;br&gt;Antrl是一款编译器生成工具，Stringtemplate是同一作者开发的模板工具，供编译器在解析输入文件后，填充模板中保留的占位符为另一些东西。此作者是一位大学教授，网页上的照片把两只手张开放在脑袋旁边，不知是在戏仿兔子还是蝙蝠，孩童一样微笑着。&lt;br&gt;他的硕士研究生，做了antlr+stringtemplate的PPT报告，用了童稚的字体，还有他模仿导师动作的个人照片。&lt;br&gt;导师模仿兔子，我们模仿导师。人类的动作具有丰富的内容，据说甚至承载了超出语言的信息量。不过，动作和表情传达的信息又是模糊的，对于计算机而言，模糊的指令甚至不如没有指令。&lt;br&gt;在讨论计算机精确的指令系统以前，我想先介绍一些别的。然后到了明天的博客，非计算机专业的同学，就基本可以无视了。&lt;br&gt;刚刚，我在音乐里睡着了，醒来的时候手里捧着罗素的《自由之路》还没有掉到地上。也许，我只不过迷糊过去了不到一分钟。如果我注意了刚刚在听什么歌，也许我可以判断时间。但是，我唯一知道的是，灯光仍亮着，屏幕仍黑着，长夜仍刚刚开始，我正读的，仍然是那一页&lt;br&gt;政治与自由。&lt;br&gt;一般我们认为，罗素是数学家，逻辑学家。他同时还有另一个身份，他也是一位哲学家。他以哲学著作获得诺贝尔文学奖，因为他的文字中对于人类的关怀。&lt;br&gt;在读《自由之路》的过程中，我不断地发现许多书页中夹着的暗红色叶子，并为此而感动。这当时许多年前某位读者放进去的，某个秋天，她读了其中的很多页，把那个秋天的纪念放在这里。后来的很多位读者，都看到并保留了这份心意。&lt;br&gt;我执意认为，这位读者当是一位女士。因为男士少有此种闲情。而她之所以令我感动，并非出于性别，而是智慧。读了这些书页的，能读懂这些书页的，应该具有与性别无关的智慧。我见过许多美女抱怨&amp;quot;他喜欢我一定只是因为我的容貌&amp;quot;，就像男子抱怨&amp;quot;她喜欢我绝然是为了我的钱&amp;quot;。他们和她们都没有想过一个问题，那是否因为你的智慧并非明显地超出你的容貌或者金钱。&lt;br&gt;当你的智慧超出性别，那么人们自然尊重你的智慧，与性别无涉。当你注视罗素在很多年前，把他的智慧倾吐在这些纸上的时候，你见到的是一位长者，还是一位老帅哥？&lt;br&gt;尤其是当岁月洗去他的容貌和声音以后。当你与他的生活毫无交集，因此绝无情感置于你与他之间。&lt;br&gt;你所看到的，是一个人，他在探索人类所未知的领域。&lt;br&gt;那些领域，哪怕仅是我们自己所未知的，而别人尽已了解，也仍然是非常有意思的事。&lt;br&gt;而有些人，不是这样做的。他们并不想了解这个世界，只是想消费它。&lt;br&gt;听到一个笑话，就是牛顿说我不是牛顿，我站在一平方米上，所以我是帕斯卡那个。我看到有人说：我是文科生，看不懂，猜那是公式，所以我笑了。&lt;br&gt;所以我叹气了。有些人，并不想了解这个世界，只是想消费它。牛顿每平方米不是大学物理中的公式，而是高中知识。也就是说，能说&amp;quot;我是文科生&amp;quot;的人，既然已分文理，他一定是学过这个公式的。&lt;br&gt;他只是不愿意去看去想，这个世界，只是他发表意见的垃圾筒，他根本不屑于明白。我确实十分不明白，对于一个你不了解的领域，这整个世界，你怎么敢于发表一丁点意见。&lt;br&gt;对于我们未知的领域，保持探索，这是后面这个例子的引子，也是antlr+stringtemplate这系列博客的引子。&lt;br&gt;-----&lt;br&gt;这个例子，是探索仅我未知的世界，这个领域的人，早就知道了。&lt;br&gt;前几天以蜡烛做为质料，做了几个小东西，有小兔子，有小娃娃，还有一头小驴子。后来想做松塔，失败了。&lt;br&gt;其中一种方法是这样的。&lt;br&gt;第一步，把橡皮泥在橡皮泥的模具（材质是塑料）上压紧；&lt;br&gt;第二步，小心揭下橡皮泥，不要整变形了；&lt;br&gt;第三步，把热熔的蜡烛烧在橡皮泥里；&lt;br&gt;第四步，等蜡烛冷却凝固，把橡皮泥扣下来。&lt;br&gt;似乎是这样的，这些步骤在某个学科里都是有专门名字的，这些东西也是有专门名字的。&lt;br&gt;我仅约略知道，在这里，第一步中的橡皮泥模具，塑料的那个，称为母模（还有一种说法，公模母模，按这种说法，这应该是公模）；第二步里以橡皮泥为材质的那个，称为阴模，或者简称模具；第三步和第四步里蜡烛的那个东西，叫做什么呢，我们称它为产品吧。&lt;br&gt;以上的这些步骤看似简单，其实里面诸多细节，任何一个细节的卡死，可能都会令你全盘失败。&lt;br&gt;有的同学会问，都成功80%了，那也叫失败么。谁说的来着，失败只有一种，就是半途而废。后面种种理想，只要没有实现的，也不过是你大脑里的一些神经电脉冲而已，能有几毫瓦呢。&lt;br&gt;凡是没有做出产品的，就是完全失败的。这也是为什么某些表现为领导者的干部令人厌恶的原因，他们完全没有实施的能力，只有观点。&lt;br&gt;在操作以前，有些细节，由于学科训练，我能够想到，有些，则完全没有预料到。&lt;br&gt;我想到的，书里也提到，蜡烛加热是件危险的事，要始终看着火温。我们都知道那是易燃品。我想到的方法是水浴，即隔水加热，这能保证在加热中蜡烛只会融化，不会燃烧。&lt;br&gt;水浴，这个方法很令我得意。我还跟包师弟吹嘘来着，同时提到数据，石蜡的融点是47-64度。包师弟说，水什么浴什么热，我做个电子的恒温器。&lt;br&gt;这就是能力差别。因为他还将避免另一个我在实验时发现的问题，烧铸的时候，蜡的温度非常重要。如果温度过高，会把橡皮泥中的水析出来，留在橡皮泥和蜡液之间，这非常影响对模具细节的表现。如果温度过低，蜡液将开始成为半流体，容易断裂。&lt;br&gt;我猜到，有些同学正对这些细节不屑。那是因为你只有观点，既不打算了解这个世界，也不解它，因此并无亲自实施的习惯。&lt;br&gt;这些细节足以使你的作品变成垃圾。&lt;br&gt;就像你的那些错别字，那些矮油的感叹把你从一个严肃讨论问题的公民转变为一个戏谑或无知的看客。因为你既不尊重你讨论的对方，也不尊重你讨论的问题。这正如打CS的时候作弊，你当然有这样的自由，但是没有人乐意陪你玩，又或者陪你玩的人是和你一样或更不严肃的人，你们一起把这个游戏变成甚至不如一个的游戏。（这里，感谢子龙和兔子的教诲，打CS作弊是不对的。）&lt;br&gt;同理，antlr+stringtemplate中的细节，也都是非常重要的。仅知道它们干什么的工具，并不能帮助你有能力使用这些工具--仅达到指手划脚的能力吧。&lt;br&gt;为什么我要提铸模这个例子呢？&lt;br&gt;因为从明天的博客开始，我会使用母模、阴模、产品这样的比喻。&lt;br&gt;我将谈到：antlr, stringtemplage的基本原理，我将用它们从下面这样的杨氏语言中生成c++源代码，包括头文件,cpp文件，调用它们的cpp文件，能编译并执行的。&lt;br&gt;杨氏语言的一个例子：&lt;br&gt;mario:pipe_a 123 | pipe_b | pipe_c&lt;br&gt;peach:stage_1 123 | stage_2&lt;br&gt;bowser:lose_1 123 | lose_2 | lose_3 | lose_4 234&lt;br&gt;没错，这就是超级马利的一个粗糙模仿。马利同学依次穿过了pipe_a,pipe_b，pipe_c，并且在pipe_a那个场景里得到了123这么个道具。&lt;br&gt;最后生成的cpp代码大致像这样：&lt;br&gt;&amp;#160;o_mario-&amp;gt;pipe_a(123)-&amp;gt;pipe_b()-&amp;gt;pipe_c();&lt;br&gt;o_peach-&amp;gt;stage_1(123)-&amp;gt;stage_2();&lt;br&gt;o_bowser-&amp;gt;lose_1(123)-&amp;gt;lose_2()-&amp;gt;lose_3()-&amp;gt;lose_4(234);&lt;br&gt;生成的代码中，还包括o_mario等这些对象的类的声明和实现。&lt;br&gt;另外，下面这种调用方法，就是fluent interface的实现手段之一：methodchaining。是不是看着挺人性化的？&lt;br&gt;o_mario-&amp;gt;pipe_a(123)-&amp;gt;pipe_b()-&amp;gt;pipe_c();&lt;br&gt;明天开始，我们整个模具生成它们。明天，我们先看母模啥样。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-4732794781570975619?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/4732794781570975619/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=4732794781570975619' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/4732794781570975619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/4732794781570975619'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/11/antlrstringtemplatemethod-chaining1.html' title='使用Antlr+Stringtemplate生成method chaining，一个不太简单的案例（1）'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-8224137687318429594</id><published>2011-11-30T20:13:00.001+08:00</published><updated>2011-11-30T20:13:02.686+08:00</updated><title type='text'>pics</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/-SA5-zg1zZaE/TtYdzwDjPFI/AAAAAAAAM2o/lRfFXRr5tm8/s1600/IMG_1639-782687.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/-SA5-zg1zZaE/TtYdzwDjPFI/AAAAAAAAM2o/lRfFXRr5tm8/s320/IMG_1639-782687.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5680760754884787282" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/-ZJ35o-fXqJg/TtYd0P5ipVI/AAAAAAAAM3E/frAnv3Tjad0/s1600/IMG_1655-784629.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/-ZJ35o-fXqJg/TtYd0P5ipVI/AAAAAAAAM3E/frAnv3Tjad0/s320/IMG_1655-784629.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5680760763432740178" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-c1vZgbse1pM/TtYd1PMQgdI/AAAAAAAAM30/6mnYgr0YGpI/s1600/IMG_7506-788503.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-c1vZgbse1pM/TtYd1PMQgdI/AAAAAAAAM30/6mnYgr0YGpI/s320/IMG_7506-788503.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5680760780422676946" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-jTH2XheZ90I/TtYd2SbDA0I/AAAAAAAAM38/88n9OEWQZNc/s1600/IMG_7518-793211.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-jTH2XheZ90I/TtYd2SbDA0I/AAAAAAAAM38/88n9OEWQZNc/s320/IMG_7518-793211.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5680760798469882690" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-3sfDR2y0L3A/TtYd2pRhjuI/AAAAAAAAM48/OX9BKx4GVYA/s1600/IMG_7519-794424.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/-3sfDR2y0L3A/TtYd2pRhjuI/AAAAAAAAM48/OX9BKx4GVYA/s320/IMG_7519-794424.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5680760804603956962" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-UjPELKhxG9o/TtYd4HFkRrI/AAAAAAAAM5w/pkh10v4-FBY/s1600/IMG_7520-700394.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-UjPELKhxG9o/TtYd4HFkRrI/AAAAAAAAM5w/pkh10v4-FBY/s320/IMG_7520-700394.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5680760829786736306" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-VKjLhxfyzxo/TtYd5Cfw7RI/AAAAAAAAM58/8I0llI_cUHI/s1600/IMG_7521-703903.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-VKjLhxfyzxo/TtYd5Cfw7RI/AAAAAAAAM58/8I0llI_cUHI/s320/IMG_7521-703903.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5680760845734309138" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/-stdi0l3Mxwc/TtYd5rcUjrI/AAAAAAAAM6I/C-iTsT3GfwA/s1600/IMG_7522-705958.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/-stdi0l3Mxwc/TtYd5rcUjrI/AAAAAAAAM6I/C-iTsT3GfwA/s320/IMG_7522-705958.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5680760856725720754" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/-wU7QYQJDQYo/TtYd6bNt-KI/AAAAAAAAM6Q/Oec08d5VcdA/s1600/IMG_7523-708923.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/-wU7QYQJDQYo/TtYd6bNt-KI/AAAAAAAAM6Q/Oec08d5VcdA/s320/IMG_7523-708923.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5680760869549373602" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://2.bp.blogspot.com/-2IVJB_otu4A/TtYd7TB4u0I/AAAAAAAAM6k/WbTh8BLz5pU/s1600/IMG_7524-713498.JPG"&gt;&lt;img src="http://2.bp.blogspot.com/-2IVJB_otu4A/TtYd7TB4u0I/AAAAAAAAM6k/WbTh8BLz5pU/s320/IMG_7524-713498.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5680760884532132674" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://2.bp.blogspot.com/-Bq9gl_yBtY8/TtYd74y6JhI/AAAAAAAAM60/joGxGVaB2ok/s1600/IMG_7530-714992.JPG"&gt;&lt;img src="http://2.bp.blogspot.com/-Bq9gl_yBtY8/TtYd74y6JhI/AAAAAAAAM60/joGxGVaB2ok/s320/IMG_7530-714992.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5680760894669858322" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-tUDJkt-Kg5Q/TtYd8Ty3zJI/AAAAAAAAM68/7uTVqNXrAyE/s1600/IMG_7531-717606.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-tUDJkt-Kg5Q/TtYd8Ty3zJI/AAAAAAAAM68/7uTVqNXrAyE/s320/IMG_7531-717606.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5680760901917461650" /&gt;&lt;/a&gt;&lt;/p&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-8224137687318429594?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/8224137687318429594/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=8224137687318429594' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/8224137687318429594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/8224137687318429594'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/11/pics_30.html' title='pics'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-SA5-zg1zZaE/TtYdzwDjPFI/AAAAAAAAM2o/lRfFXRr5tm8/s72-c/IMG_1639-782687.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-6719305276862018081</id><published>2011-11-24T23:30:00.001+08:00</published><updated>2011-11-24T23:30:31.491+08:00</updated><title type='text'>我想买个键盘：用户需求可以多么刁钻</title><content type='html'>我想买个键盘：用户需求可以多么刁钻&lt;p&gt;套用那句著名的&amp;quot;我想要的很简单&amp;quot;，今天我想要的也很简单，我想买个键盘。&lt;p&gt;为了这个简单的愿望，不仅昨天在网上查了半个晚上，今天又跑了半天。这证明，所有的用户需求都是不简单的，包括某些看起来非常简单的。&lt;p&gt;只要这个要求是特异的，那么就不简单；如果这个要求不是特异的，它根本就不会存在。&lt;p&gt;如果我要求键盘上面有ABCD几个字母，那么你就会哈哈大笑，这个要求容易满足。如果我要求这个键盘只有数字，要非常的小，你会问我&amp;quot;是不是银行里输密码的那种布局&amp;quot;。如果我明白什么是布局的话，那么你我就可以很好的沟通。如果我想要的是无线蓝牙或者有线，那么你可能推荐我罗技。&lt;p&gt;这些，都不是我想要的。&lt;p&gt;1.我想要的键盘应该只有&amp;quot;基本区&amp;quot;：用户的基本需求，不同于平常的&lt;p&gt;键盘从左到右可以划分成三个部分，最右边区域是数字小键盘，中间的区域是翻页和光标移动键，最左边的区域就是我说的&amp;quot;基本区&amp;quot;。我要这样的一个键盘，它从基本区的右侧切了一刀，右边的都不要。&lt;p&gt;昨天晚上，我在网上找，&amp;quot;迷你&amp;quot;，找到的是一巴掌宽的那种。我想要不是这种，而是尺寸正常，只是切除了右半边的。&lt;p&gt;2. 我不喜欢苹果：用户需求变更&lt;p&gt;在百脑汇，老板们给我找到了不少符合我上述需求的。但是我突然发现，它们有个共同特征，像苹果的键盘。&lt;p&gt;苹果引领了新时尚，但我打算不跟随啊。苹果键盘的键帽，表面有个不同以往的特征。咱们传统的键盘的中间是凹下去的，而苹果的键帽上面是平坦的。&lt;p&gt;那个洼洼兜对我非常重要，它能让我在全黑的环境下也能确保每个手指都在正确的键位上。F和J上的小突起，仅能帮助我定位这两个手指的位置，但是我是否按到了键盘的边缘以外，是不是一直都打在键的正中心上这个洼兜。平坦的键顶，让我恶意猜测苹果的大多数用户都是偶尔才使用键盘的，或者键盘只是玩具，而不是工具。可能不止苹果，所用的计算机用户都步入娱乐的时代了。无线键盘很难找到单独卖的，而鼠标和键鼠套装却可以，也是一个旁证，大家不再那么需要键盘了，而是更依赖鼠标。鼠标可以用于选择，就像答ABCD的选择题，鼠标也能用来表达思想么？就像转载能用来传达态度，转载也能用来表达思想么？&lt;p&gt;我需要工作，需要即使在黑暗中也能准确定位按键，所以，我不能用苹果风格的新潮键盘。&lt;p&gt;有人可能会建议开灯低头看一眼。恩，有一种技术叫做盲打，是程序员的基本功。&lt;br&gt;3. 右边的CTRL：用户说，看到了才知道，这不是我想要的&lt;p&gt;终于找到了符合上述要求的。此时，如果是我们在做用户需求，可能已经报怨过了，&amp;quot;你不喜欢苹果的，为什么不早说，我白给你拿来。&amp;quot;&lt;p&gt;此时，你还会再次抱怨。因为符合上述要求的，仍然不符合我的要求。因为用户说&amp;quot;只有当我看到了你的作品，我才知道，这不是我要的。&amp;quot;&lt;p&gt;而用户想要什么，你永远也不能提前预知，因为连他自己也还不知道呐。我就是在看到了符合上述所有要求的键盘，并且按了几下，才发现，还是不行。&lt;p&gt;手感啊，键的行程啊，按下去半天不弹起来啊，没有后背上方的小支架啊，这些也就算了。20元+的键盘，你还能有什么更多的要求呢。&lt;p&gt;可是，怎么可以没有右边的CTRL键。&lt;p&gt;我之所以想要一款这样小的键盘，是因为我用EMACS编程。所以，1.我不需要光标移动键和翻页键，2.我有时会用鼠标，为了编程的时候上网查资料。这时右侧的数字键和编辑键区域就是累赘，那正是我的右手腕要通过的区域，我的右手腕从那里伸向鼠标。&lt;p&gt;你可能会建议，把键盘向左移一下，不就行了么？如果键盘向左移动10厘米，确实为右手腕空出了地方，但是当我要用键盘输入的时候呢？我的手腕不得不为了键盘在左侧而扭曲。而编程，毕竟是键入比上网的时间要多。如果手腕再向右呢？你可以试试右臂张开的角度，并保持一段时间，而此时你的键盘&amp;quot;基本区&amp;quot;在你的正前方。&lt;p&gt;顺便说一句，我不需要数字区，是因为1.我很少连续输入数字，2.我能半盲打所有的数字和它们的上档键。&lt;p&gt;这些跟右CTRL有什么关系呢。用户MOJI完上面这些，你可能会问。用户会接着	MOJI下去，他认为重要的事情，并传达一下情绪。&lt;p&gt;很多人用EMACS的时候都会遇到一个问题—恩，很多问题，这是其中的一个。许多人用EMACS时间长了，会左小手指疼，因此有些人还会把CAPSLOCK和左CTRL交换。我没有这个问题，一个原因是我不仅使用左CTRL，也会使用右CTRL。Ctrl-C，就是用右CTRL。而且，这是标准做法。&lt;p&gt;问题来了，符合上述所有要求的键盘，居然个个的右CTRL都缺失了。也不知道是大家伙山寨哪位大爷最初设计的结果。应该是CTRL的地方，换成了INS和DEL键。DEL还算有用，我一辈子能按INS键几次啊。&lt;p&gt;4. 后来我终于找到了基本符合要求的：拒绝用户部分需求&lt;p&gt;其中一款是微软的，300元+。小众么，就会是这么个结果。非量产，小资情怀，纯手工，它们都具有共同的特点，那就是贵。后来发现，它是苹果风格的，之前只看大家评论的优点，忽略了。&lt;p&gt;另一款不那么贵，不到100元。右CTRL非常窄小。这适用用户需求获取的另一个原则：拒绝不那么重要的用户需求。我准备映射一下，把右边那几个键都改成CTRL，这样就不容易按错了。&lt;p&gt;用户是上帝，前提是用户付得起钱。或者说，用户打算承担由这些变更或需求引起的时间、费用、人力上的开销。用户喜欢花样百出，但是只要你坦诚地告诉他，花样都可以满足，不过是要收费的，用户往往就突然变得不喜欢这些花样了。&lt;p&gt;其实我们应该喜欢这些花样，这是我们存在的原因和用户付我们钱的原因。但是，往往天不遂人愿，工期或者用户的荷包刚好不敷。&lt;p&gt;这个世界上，就没有简单的需求。无论多小的需求，都可以极尽刁钻。不仅缺失的是问题，比如右CTRL，有时连多出来免费提供的也是问题，比如编辑区和数字键盘区。&lt;p&gt;还有的用户，像孩子一样，只会哇哇大叫，表达的是&amp;quot;我不舒服我不爽&amp;quot;。但是他需要的是什么，连他自己也不知道。这又让人有什么法子呢。&lt;p&gt;我们，就真的知道自己想要的是什么吗？如果你真的知道，为什么没有去做，没有尽力去做。&lt;p&gt;你真的想要的是什么？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-6719305276862018081?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/6719305276862018081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=6719305276862018081' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/6719305276862018081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/6719305276862018081'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/11/blog-post_24.html' title='我想买个键盘：用户需求可以多么刁钻'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-2004845020354340062</id><published>2011-11-23T22:37:00.001+08:00</published><updated>2011-11-23T22:37:20.581+08:00</updated><title type='text'>pics</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-iSSqqaq15qk/Ts0FIJrZi2I/AAAAAAAAM0E/1k_zWS9w9zk/s1600/IMG_7487-740581.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-iSSqqaq15qk/Ts0FIJrZi2I/AAAAAAAAM0E/1k_zWS9w9zk/s320/IMG_7487-740581.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5678200342779104098" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-SHlfJS09ong/Ts0FItWerII/AAAAAAAAM0c/YkOo7uQSVRg/s1600/IMG_7493-742351.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/-SHlfJS09ong/Ts0FItWerII/AAAAAAAAM0c/YkOo7uQSVRg/s320/IMG_7493-742351.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5678200352355036290" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-o9X8U6f2tqk/Ts0FJHEZ3GI/AAAAAAAAM04/CPbhgczwPU4/s1600/IMG_7494-744719.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-o9X8U6f2tqk/Ts0FJHEZ3GI/AAAAAAAAM04/CPbhgczwPU4/s320/IMG_7494-744719.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5678200359258545250" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://2.bp.blogspot.com/-Yyura3khAuc/Ts0FJ23bhUI/AAAAAAAAM1Q/0lnzVK0a1v8/s1600/IMG_7501-747467.JPG"&gt;&lt;img src="http://2.bp.blogspot.com/-Yyura3khAuc/Ts0FJ23bhUI/AAAAAAAAM1Q/0lnzVK0a1v8/s320/IMG_7501-747467.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5678200372089029954" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-NwhouDs0nns/Ts0FKsMXpMI/AAAAAAAAM1k/E_3cOApzWQk/s1600/IMG_7502-749835.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-NwhouDs0nns/Ts0FKsMXpMI/AAAAAAAAM1k/E_3cOApzWQk/s320/IMG_7502-749835.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5678200386403935426" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-uCNkljGv5UM/Ts0FLOqk4dI/AAAAAAAAM14/CW6ohT7O8cg/s1600/IMG_7503-752748.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/-uCNkljGv5UM/Ts0FLOqk4dI/AAAAAAAAM14/CW6ohT7O8cg/s320/IMG_7503-752748.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5678200395657437650" /&gt;&lt;/a&gt;&lt;/p&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-2004845020354340062?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/2004845020354340062/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=2004845020354340062' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/2004845020354340062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/2004845020354340062'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/11/pics_23.html' title='pics'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-iSSqqaq15qk/Ts0FIJrZi2I/AAAAAAAAM0E/1k_zWS9w9zk/s72-c/IMG_7487-740581.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-2487243443217126868</id><published>2011-11-18T23:20:00.001+08:00</published><updated>2011-11-18T23:20:55.376+08:00</updated><title type='text'>没打游戏，我非常难过</title><content type='html'>没打游戏，我非常难过&lt;p&gt;雾气在窗玻璃上凝结了薄薄的一层，慢慢滑落，勾勒出几条平行弯折的河流。河&lt;br&gt;流的底下，是毫无亮光的浓黑，如同大地。&lt;p&gt;我是多么地想打游戏啊。&lt;p&gt;升到最高级的投石车轰开在森林里轰开一条小径，三五弓骑兵悄悄潜入敌人的基&lt;br&gt;地。突然间警钟响起，骑兵开始射杀农民矿工和猎手，远方的敌军驰援而回。另&lt;br&gt;一处，据河防守，城门铁闸升起，成群重装骑兵火速冲出，去砍断攻城器的木架。&lt;br&gt;攻击器收起退入戟兵丛中，追击的骑兵头上红缨如火般抖动。&lt;p&gt;在某一种森林，雾气升起，只看到林木的剪影，敌人隐藏其中。背后追击的，精&lt;br&gt;灵族满怀仇恨，因为我们收留了与我们同样身为人类的强盗，前方拦截的，不死&lt;br&gt;族蓄势已久，正等着截断我们的归路。我们是一群老弱残兵，不敢与任何强敌稍&lt;br&gt;加接触。我们结成人墙，把医生和法师围在当中。当遇到攻击，活下来的人听到&lt;br&gt;的是满耳的战友的悲号，但是没有一个人敢稍作停留反击。只有毫不停息，才可&lt;br&gt;能有人活下来回去通知故乡的人立即组织防御。&lt;p&gt;我不记得了。是不是每一次，当丛林散尽，终于能见到天日。看一条大河横在面&lt;br&gt;前，河上只有一桥，桥上是一名敌人的悍将。是不是每一次，欲哭无泪的时候，&lt;br&gt;都有一员使长枪的将军站出来大喊一声：我来断后。&lt;p&gt;应该是的，不然，我们怎么能够走出这么远。&lt;p&gt;&amp;quot;我来断后&amp;quot;的意思是：只有我在战线的最后，只有我与敌人接触。请你们，无论&lt;br&gt;谁也不要回顾、迟疑、救援。&lt;p&gt;一句话的意思，就是它本身的意思。而不是它背后隐含的意思。&lt;p&gt;下午听ZHUMAO报告，并参观机房。之前我提到：只许看啊，谁也不许碰。中间有&lt;br&gt;人靠近，有人碰了。&lt;p&gt;事后我说，这件事需要说一下，然后我说，我并不是批评某一位同学，因为有另&lt;br&gt;外一位同学也碰了。&lt;p&gt;其实我的表达不清晰。并非因为有别人也碰了，所以不批评你。我说不是批评你&lt;br&gt;的意思，就是不是批评。因为，我并有因此对你所做的事情也并未因此对你做出&lt;br&gt;任何否定。你之所以那么做，是因为你还不了解。不知者不为罪。&lt;p&gt;这里我又提起，是因为很多人在说&amp;quot;我不是批评你&amp;quot;的时候，她的意思恰恰是&amp;quot;我&lt;br&gt;就是在批评你&amp;quot;。我完全不是那样的人。我说不是批评的时候就是不是批评，如&lt;br&gt;果我的意图是批评，我也会直接说：我就是在批评你。&lt;p&gt;关于为什么不能碰机房的机器，我下午说过了，可能你也并非计算机专业的同&lt;br&gt;学，不必了解更多。只需猜想，不影响我接着扯。&lt;p&gt;前几天与编辑讨论，编辑大人说：秉笔直书，只管描述。&lt;p&gt;我说：如果我这样这样再这样描述，你觉得行么。&lt;p&gt;当然不行，那体现了作者错误的人生观价值观和...世界观（？）。俺们学校是有&lt;br&gt;要求的，要求教师不仅在学术上，也要在德育上教育学生。我真的得小声地说：&lt;br&gt;我道德水平本身就非常不咋地，怎么能够再在道德上教育学生。&lt;p&gt;下午跟ZHUMAO还提到，当然，我还算有点自知之明的。还有道德水平比我略高，&lt;br&gt;却远低于正确三观标准的，仍然坚持德育学生，这是正确啊正确啊还是正确的做&lt;br&gt;法。&lt;p&gt;我们怎么能够教育学生我们自己都不相信不执行的东西？&lt;p&gt;-----------------&lt;p&gt;描述就是描述，观点就是观点。捍卫观点，从来也不是问题，把观点伪装成客观&lt;br&gt;描述，就很成问题。&lt;p&gt;国人用词暧昧娓婉，语多曲折，不输于小鬼子。很多时候表面上看是出于尊敬，&lt;br&gt;其实多是伪装中肯。&lt;p&gt;前些日子某机构发文，要求某些同事去拍照。文件写的大意就是：这是给大家的&lt;br&gt;机会。&lt;p&gt;我写信询问，到底这是福利呢还是行政命令。如果是福利，我不喜欢，不想参加。&lt;br&gt;我没有说的是，如果是行政命令，我们来讨论一下管辖权。&lt;p&gt;明明是命令你的时候，偏要说：你看，这样做比较好，尤其是对你比较好。让我&lt;br&gt;想起多年前，老板们找你干活，偏偏要说这是对你能力的锻炼，给你创造机会。&lt;p&gt;-----------------&lt;p&gt;又想起下午在ZHUMAO那里提起的一件事。讲C++的时候，胡同学曾经在课程结束&lt;br&gt;后跟我要课件。我说，不行。后来考试结束了，胡同学说：老师，这回可以了吧。&lt;p&gt;我说，不行。&lt;p&gt;胡同学问：为什么呢。&lt;p&gt;我的回答是：因为那是我的啊。&lt;p&gt;我知道你可能猜测我不给课件的原因，是担心考试题目吧。不是。原因是...因&lt;br&gt;为那是我的，所以我可以不必给出原因而拒绝。&lt;p&gt;我只是把你和所有的组织机构上级领导一视同仁。我的，就是我的。那些完全属&lt;br&gt;于我的东西，除我以外，没有任何人可以用任何方式替我做任何决定。&lt;p&gt;你与组织机构上级领导是一样的。我与你，也是一样的。我与你一样，是多么地&lt;br&gt;想打游戏啊。&lt;p&gt;会有很多同学表扬胡同学的钻研精神，大加鼓励...最后以各种借口不能给出课&lt;br&gt;件。&lt;p&gt;-----------------&lt;p&gt;与某些同学所不同者，我没有用矫词伪饰，并以为那是对别人智商的侮辱。&lt;p&gt;你之于我，正如给笼子里的狗喂水的那位富妇人。无论言辞多么漂亮，举止多么&lt;br&gt;优雅和符合韵律，多少升同情的眼泪，在我的称谓前加上多少形容词顺便彰显你&lt;br&gt;的文化，总归不能脱出这样的事实：在你的眼里，我是狗--或者可资使用的物件。&lt;p&gt;加多少尊重、掩饰，对于本质也没有什么改变。&lt;p&gt;除此以外的情感，回忆里的美好，我希望能放在另一个时候来谈：当没有利害关&lt;br&gt;系的时候。&lt;p&gt;昨天读到《查太莱夫人的情人》的评论时注意到，那位男主人公说：很多人都没&lt;br&gt;有得到，但是他们假装得到了；如果我没有得到，我决不能欺骗自己说得到了。&lt;p&gt;决计不能欺骗自己。我非常想打游戏，我没有打，我非常难过。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-2487243443217126868?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/2487243443217126868/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=2487243443217126868' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/2487243443217126868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/2487243443217126868'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/11/blog-post_18.html' title='没打游戏，我非常难过'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-9046755355106952053</id><published>2011-11-16T23:47:00.000+08:00</published><updated>2011-11-16T23:48:25.264+08:00</updated><title type='text'>教学相长，和我的学生</title><content type='html'>教学相长，和我的学生&lt;p&gt;今天下午被要求听讨论教学的会。高哥提到两句对我非学有启发：一句是教学相&lt;br&gt;长。这篇日志都是关于这个的。另一句是，马克思说，人的创造力在于他的自由&lt;br&gt;时间。自由--我努力追求能让内宁静的自由。&lt;p&gt;以下是教学相长的。&lt;p&gt;1. 大毅同学&lt;p&gt;一大清早去单位，有讨论。&lt;p&gt;趁正题开始前，我画了半个白板的某架构或者工具链。又一次燃起雄心壮志整那&lt;br&gt;个难整的东西。绘图控件。&lt;p&gt;很多年前，刘同学就开始和我整这个，用了好几种编译器生成器。到现在，那些&lt;br&gt;中间结果都没有用上。而他已经要毕业了。他和建一一起提到，这世界，更多的&lt;br&gt;需要做web前端的什么的。&lt;p&gt;我坚定地相信，底层，或者说深入核心的部分，仍然需要有人去做，而且一定是&lt;br&gt;我们。我们不跟踪时尚，我们固守那些基本的原则，并不断深入探索。&lt;p&gt;但是，我不敢去触动做了好几年也不敢整的绘图控件。按与包师弟谈时我提到&lt;br&gt;的，我甚至不敢开始。&lt;p&gt;刘同学说：你找个本科生，就光做这个呢？&lt;p&gt;他指的是本科中的强人，我们都知道指的是谁。&lt;p&gt;我说：比如那位某某吧。我舍不得啊。&lt;p&gt;他说：做不出来就算了呗。&lt;p&gt;我说出我的顾虑：那学生不就毁了么。&lt;p&gt;我想的是多年前，我们做了好几年的编译器生成器。那些没有成果的工作。心怀&lt;br&gt;愧疚。&lt;p&gt;刘说：其实做不出来，学生也有收获。&lt;p&gt;后来同学们问我，为什么看起来很累。我说：我晚上1点多睡的。又说，一大早&lt;br&gt;KFC关门，没喝成咖啡。&lt;p&gt;这些都不是原因，我在想刘同学的话。也许你们是真的对咱们啥也做不出来的那&lt;br&gt;些工作心无抱怨，但是我却不能没有遗憾和抱歉。&lt;p&gt;糟烂工作之所以糟糕的原因，正应该归疚于导师或者项目组长或者技术负责人。&lt;p&gt;也许吧，刘同学说的对，即使我们什么也没做出来，却仍然有收获。&lt;p&gt;&lt;br&gt;2. 建一同学&lt;p&gt;建一同学也快毕业了。前一段公安厅的项目，请他帮助我指导齐同学，齐同学甚&lt;br&gt;有收获。&lt;p&gt;我后来问建一，你咋整的呢。&lt;p&gt;我之所以问，是因为我经常把同学们整得JJWW的，感觉我逼得很紧太过严厉，同&lt;br&gt;时我经常觉得这些简单的问题都应该你们自己整，咋能啥都指着我手把手教呢。&lt;p&gt;我问建一，你咋整的。齐同学出成果太快，大大出乎我的意料啊。我记得是期待&lt;br&gt;一周，结果三天左右吧。&lt;p&gt;当时的任务是写个GUI，把我写的业务逻辑包起来。齐同学将在这里看到项目中&lt;br&gt;的分工，接口，写代码的经验。我希望建一不亲自参与写代码。&lt;p&gt;建一把任务分成了三步，让齐同学去做。第一步是建个简单的GUI，啥消息响应也&lt;br&gt;没有；第二步是添加一些控件，就是我在项目里要求的那些，图片label，文字&lt;br&gt;label等等；第三步是把GUI套在我的业务逻辑之外，调用我提供的函数。&lt;p&gt;于是事情就成了。&lt;p&gt;我想起了袁师弟以前教我RESET笔记本。&lt;p&gt;我说：这破玩意根本从来就不好使。不是按4秒就重启么。&lt;p&gt;袁说：你不能这么数4秒，1234，你得这么数，1--2--3--4。&lt;p&gt;他按住reset，于是机器重启了。而我此前从不能成功。&lt;p&gt;我太缺乏耐心，不能等待各种反应缓慢地发生。&lt;p&gt;当年家教的时候，那学生的妈妈说孩子挺聪明的。我就信了。我讲完基本概念和&lt;br&gt;解法以后，问：你明白了没？&lt;p&gt;明白了。&lt;p&gt;我从书后找道难度还可以的题目，他不会。&lt;p&gt;很多年以后，二猫妈提醒我：你得整一道跟那原理完全完全相同的题目，让他有&lt;br&gt;成就感。&lt;p&gt;我说：那不是侮辱他的智商么。&lt;p&gt;我缺乏耐性如此，而我的学生们一直一直忍耐着我，等我明白。&lt;p&gt;而且，你们教会我：&lt;p&gt;2.凡是不能一蹴而就的任务，其中好多可以分解成一个个阶段，依次完成。&lt;p&gt;那些无法划分阶段，或者每个阶段我们仍无法完成，或者穷我们毕生也无法完成&lt;br&gt;这些阶段的，就是不能完成的。对于不能完成的，我们又有什么遗憾的。&lt;p&gt;而且，1.即使一无所成，我们仍有收获。&lt;p&gt;人生，正是如此。谢谢教导，敬受教。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-9046755355106952053?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/9046755355106952053/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=9046755355106952053' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/9046755355106952053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/9046755355106952053'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/11/blog-post_16.html' title='教学相长，和我的学生'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-561048368005437359</id><published>2011-11-14T21:36:00.000+08:00</published><updated>2011-11-14T21:37:32.475+08:00</updated><title type='text'>白板基本清空了</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/-ra7b0hYv5Us/TsEZnA6_1UI/AAAAAAAAMzk/eTyI0r0XyF8/s1600/IMG_1636-752476.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/-ra7b0hYv5Us/TsEZnA6_1UI/AAAAAAAAMzk/eTyI0r0XyF8/s320/IMG_1636-752476.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5674845163516581186" /&gt;&lt;/a&gt;&lt;/p&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-561048368005437359?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/561048368005437359/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=561048368005437359' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/561048368005437359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/561048368005437359'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/11/blog-post_14.html' title='白板基本清空了'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-ra7b0hYv5Us/TsEZnA6_1UI/AAAAAAAAMzk/eTyI0r0XyF8/s72-c/IMG_1636-752476.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-218645312429208049</id><published>2011-11-13T23:31:00.000+08:00</published><updated>2011-11-13T23:43:13.851+08:00</updated><title type='text'>pics</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-bc-ZYy6e0ro/Tr_lkokBxEI/AAAAAAAAMsE/NyuZ4AC-N0Q/s1600/IMG_1633-793852.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-bc-ZYy6e0ro/Tr_lkokBxEI/AAAAAAAAMsE/NyuZ4AC-N0Q/s320/IMG_1633-793852.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5674506473036694594" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/--83vf53QwzA/Tr_llP7htLI/AAAAAAAAMsQ/dSjWzC6dp7Y/s1600/IMG_1634-795554.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/--83vf53QwzA/Tr_llP7htLI/AAAAAAAAMsQ/dSjWzC6dp7Y/s320/IMG_1634-795554.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5674506483604239538" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-SowopB4c3TU/Tr_lltpQbMI/AAAAAAAAMs8/EVRwkZ1NIhQ/s1600/IMG_7452-798399.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/-SowopB4c3TU/Tr_lltpQbMI/AAAAAAAAMs8/EVRwkZ1NIhQ/s320/IMG_7452-798399.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5674506491580673218" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/-yhvKHydy5qE/Tr_lm7yuaQI/AAAAAAAAMtE/DLn1BgPw08s/s1600/IMG_7454-702838.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/-yhvKHydy5qE/Tr_lm7yuaQI/AAAAAAAAMtE/DLn1BgPw08s/s320/IMG_7454-702838.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5674506512558352642" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-45XFAMRLpeA/Tr_lnElXCUI/AAAAAAAAMtg/W29ySpQpxpk/s1600/IMG_7457-704410.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-45XFAMRLpeA/Tr_lnElXCUI/AAAAAAAAMtg/W29ySpQpxpk/s320/IMG_7457-704410.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5674506514918213954" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-PDA7a1vWKTE/Tr_ln74DwEI/AAAAAAAAMts/mPauDuSbj5E/s1600/IMG_7462-707267.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/-PDA7a1vWKTE/Tr_ln74DwEI/AAAAAAAAMts/mPauDuSbj5E/s320/IMG_7462-707267.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5674506529760591938" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://2.bp.blogspot.com/-WzC0qTeEwaA/Tr_loQXz8aI/AAAAAAAAMuM/H2vQmHzjR9s/s1600/IMG_7467-708832.JPG"&gt;&lt;img src="http://2.bp.blogspot.com/-WzC0qTeEwaA/Tr_loQXz8aI/AAAAAAAAMuM/H2vQmHzjR9s/s320/IMG_7467-708832.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5674506535262482850" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://2.bp.blogspot.com/--x9IIW2s6JM/Tr_lpKHErnI/AAAAAAAAMuc/Pukdi-_rFMg/s1600/IMG_7468-712027.JPG"&gt;&lt;img src="http://2.bp.blogspot.com/--x9IIW2s6JM/Tr_lpKHErnI/AAAAAAAAMuc/Pukdi-_rFMg/s320/IMG_7468-712027.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5674506550761533042" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-qwqd-AgS2zg/Tr_lpW5mtoI/AAAAAAAAMvE/-uHq74D53Ew/s1600/IMG_7470-713669.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-qwqd-AgS2zg/Tr_lpW5mtoI/AAAAAAAAMvE/-uHq74D53Ew/s320/IMG_7470-713669.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5674506554194704002" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-JKdbmwaifn8/Tr_lrUHOtOI/AAAAAAAAMvM/hfEBnqTs0KA/s1600/IMG_7473-721045.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-JKdbmwaifn8/Tr_lrUHOtOI/AAAAAAAAMvM/hfEBnqTs0KA/s320/IMG_7473-721045.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5674506587806282978" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-ZFK4TB6iBLE/Tr_lsctdOVI/AAAAAAAAMvo/z00if6cTqOw/s1600/IMG_7474-724568.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/-ZFK4TB6iBLE/Tr_lsctdOVI/AAAAAAAAMvo/z00if6cTqOw/s320/IMG_7474-724568.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5674506607293970770" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-Qcj1crnJt9M/Tr_ls-xQjYI/AAAAAAAAMwk/owQ0rVxaw-w/s1600/IMG_7475-727468.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-Qcj1crnJt9M/Tr_ls-xQjYI/AAAAAAAAMwk/owQ0rVxaw-w/s320/IMG_7475-727468.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5674506616436723074" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/--oivs3d7XaM/Tr_lu_dcqrI/AAAAAAAAMxE/2P-OYMvt_sM/s1600/IMG_7476-735533.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/--oivs3d7XaM/Tr_lu_dcqrI/AAAAAAAAMxE/2P-OYMvt_sM/s320/IMG_7476-735533.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5674506650981804722" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/--VKZT9XTI6M/Tr_lv2HDDRI/AAAAAAAAMxQ/6rgILeRFQ7U/s1600/IMG_7478-738937.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/--VKZT9XTI6M/Tr_lv2HDDRI/AAAAAAAAMxQ/6rgILeRFQ7U/s320/IMG_7478-738937.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5674506665651801362" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/-ZLqCdPYqZzw/Tr_lwEYpi7I/AAAAAAAAMx0/cr-fa020HO8/s1600/IMG_7479-740242.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/-ZLqCdPYqZzw/Tr_lwEYpi7I/AAAAAAAAMx0/cr-fa020HO8/s320/IMG_7479-740242.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5674506669483723698" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://2.bp.blogspot.com/-N15Hq5s2DRc/Tr_lxIwwwYI/AAAAAAAAMyA/n3eRUwLbGvI/s1600/IMG_7480-744026.JPG"&gt;&lt;img src="http://2.bp.blogspot.com/-N15Hq5s2DRc/Tr_lxIwwwYI/AAAAAAAAMyA/n3eRUwLbGvI/s320/IMG_7480-744026.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5674506687838470530" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-O8cP6yHiEMM/Tr_lxS82ScI/AAAAAAAAMyc/PksLQUyoTZM/s1600/IMG_7481-745093.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-O8cP6yHiEMM/Tr_lxS82ScI/AAAAAAAAMyc/PksLQUyoTZM/s320/IMG_7481-745093.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5674506690573519298" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-ldqiiC1d7xI/Tr_lyXuyFeI/AAAAAAAAMyo/9gOnVbHoFak/s1600/IMG_7482-749475.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-ldqiiC1d7xI/Tr_lyXuyFeI/AAAAAAAAMyo/9gOnVbHoFak/s320/IMG_7482-749475.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5674506709036570082" /&gt;&lt;/a&gt;&lt;/p&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-218645312429208049?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/218645312429208049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=218645312429208049' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/218645312429208049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/218645312429208049'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/11/pics_13.html' title='pics'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-bc-ZYy6e0ro/Tr_lkokBxEI/AAAAAAAAMsE/NyuZ4AC-N0Q/s72-c/IMG_1633-793852.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-7271254802725928220</id><published>2011-11-12T15:11:00.001+08:00</published><updated>2011-11-12T15:11:39.148+08:00</updated><title type='text'>二猫的蜡烛兔子</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-qo7u1pUVSfY/Tr4cLNXX0bI/AAAAAAAAMq8/rhv_ReSlSqs/s1600/IMG_7449-799148.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/-qo7u1pUVSfY/Tr4cLNXX0bI/AAAAAAAAMq8/rhv_ReSlSqs/s320/IMG_7449-799148.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5674003559425233330" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-byrqutPDv5s/Tr4cL26FatI/AAAAAAAAMro/LHNutRutE7E/s1600/IMG_7450-702300.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-byrqutPDv5s/Tr4cL26FatI/AAAAAAAAMro/LHNutRutE7E/s320/IMG_7450-702300.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5674003570576681682" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://2.bp.blogspot.com/-RiFnUCbaIBg/Tr4cNJ5B01I/AAAAAAAAMr4/xvRxd2eeS5Q/s1600/IMG_7451-707764.JPG"&gt;&lt;img src="http://2.bp.blogspot.com/-RiFnUCbaIBg/Tr4cNJ5B01I/AAAAAAAAMr4/xvRxd2eeS5Q/s320/IMG_7451-707764.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5674003592852394834" /&gt;&lt;/a&gt;&lt;/p&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-7271254802725928220?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/7271254802725928220/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=7271254802725928220' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/7271254802725928220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/7271254802725928220'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/11/blog-post_12.html' title='二猫的蜡烛兔子'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-qo7u1pUVSfY/Tr4cLNXX0bI/AAAAAAAAMq8/rhv_ReSlSqs/s72-c/IMG_7449-799148.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-4078296568302510772</id><published>2011-11-11T01:32:00.000+08:00</published><updated>2011-11-11T01:33:10.132+08:00</updated><title type='text'>牛人与弱手的区别，不是线性的，而是指数的 及他们之间的道路</title><content type='html'>牛人与弱手的区别，不是线性的，而是指数的 及他们之间的道路&lt;p&gt;1.误操作&lt;p&gt;今天傍晚，我删除了整个下午的工作成果。误操作。执行的是那个著名的指令&lt;br&gt;&amp;quot;rm * -rf&amp;quot;。&lt;p&gt;我发了会呆，再三确认是这个目录，然后手悬在键盘上不知道该敲些什么。我跑&lt;br&gt;到GOOGLE，没有解决方案。牛同学说，能不能恢复啊？&lt;p&gt;我说：不能，十好几年前我就知道不能恢复。&lt;p&gt;这命令太著名，且令人印象深刻了。上网查一下，只是安慰一下自己。恩，我并&lt;br&gt;不孤独，傻子真多啊。&lt;p&gt;有多少人有这样的经历呢，先是对着心爱的人喊&amp;quot;我再也不想见到你&amp;quot;，当如愿以&lt;br&gt;偿的时候，开始对着空虚哭泣。&lt;p&gt;rm是remove，-f是不必再问一次，-r是递归。递归的意思是，把目录下的目录下&lt;br&gt;的目录下的...东西，都照此处理。类似于，我烧掉你的信，烧掉提到你的信的&lt;br&gt;日记，烧掉提到日记的作文，烧掉提到作文的...我想你明白了。&lt;p&gt;大半夜的，刚又调了半宿，我可不是跑这伤感来了。当时，我对着屏幕发了一会&lt;br&gt;呆，然后对张宇同学说：你回家吧，今天的观摩到此结束。最重要的内容你刚刚&lt;br&gt;学到了，今天学不着啥了。&lt;p&gt;然后，我开始键入，跟张健一边回忆下午的全部工作。我们花了大约1小时20分&lt;br&gt;钟，把整个下午的工作完成了。接下来的半个晚上，我证明了这1小时20分中，&lt;br&gt;大部分时间是在试图解决一个暴露出的新问题，而不是恢复下午的工作。&lt;p&gt;一整个下午 对比 1小时20分，其实这正是令人悲哀的差距。&lt;p&gt;1小时20分 说明，我们，具体地说就是我，一整个下午，大部分工作是在发现错&lt;br&gt;误和改正错误，而真正的工作，1小时20分钟足以完成。&lt;p&gt;这就是高手与我们这样的低手的差别：我们引以为豪的一整个下午的工作，对于&lt;br&gt;不犯那些愚蠢错误的高手而言，只值1小时20分。&lt;p&gt;2.效率之差&lt;p&gt;高手通过避免错误节省时间，从突显出他的效率。即使犯了错误，他也能更快地&lt;br&gt;发现错误的原因，也更快地修正错误。&lt;p&gt;想起ACM比赛，牛人和面人之间的差距，岂可以道里计。相信有过比赛经验的同&lt;br&gt;学深有体会。在工程中，面对牛人深感绝望的各位也一定深有同感。&lt;p&gt;更可悲哀的是有一些同学尚无法看到自己与牛人的差距，动辄认为：我也能整出&lt;br&gt;来。&lt;p&gt;他所看到的，是现实或者电影里牛人几乎不犯错误的流程，并投射到自己，却不&lt;br&gt;知道 不犯错误本身正是至难的事情；犯了错误能够以别人几乎无法发现的速度&lt;br&gt;发现和更正，也并非人人能够。&lt;p&gt;我们把大部分时间都花费在犯错误上了。&lt;p&gt;骄傲的同学认为：其实再给我一点时间，我也可以。&lt;p&gt;时间。这个世界最吝惜给予我们的，恰恰就是时间。&lt;p&gt;如果我们有足够的时间，我们就可以在战场上迂回到敌人的后方；如果我们有足&lt;br&gt;够的时间，我们就可以比对手更早地把刀切在某个部位；如果我们有足够的时&lt;br&gt;间，我们就能把这些兵那些兵都调到敌人的基地，把所有的矿全占了……&lt;p&gt;所有这些愿望，只需要一个前提，那就是当我们拥有时间的时候，别人没有同样&lt;br&gt;拥有。&lt;p&gt;你这为这个前提可能实现么？&lt;p&gt;时间。这个世界最吝惜给予我们的，恰恰就是时间。所以，我们在战场以下用小&lt;br&gt;时计算以天计算以年月计算的时间，却换取战场上的几秒钟。&lt;p&gt;我们用这些时间训练自己避免错误，也训练自己迅速改正错误。这样，在战场&lt;br&gt;上，我们就可以有更多的时间做正确的事。&lt;p&gt;经常有年轻人抱怨，失声痛哭，为什么结果会是这么悲惨。为了让你自己好受一&lt;br&gt;些，请假设我在讨论的是中国男足。其实结果如此悲惨的原因非常简单而直接，&lt;br&gt;在过去所有的岁月中，你做出了这样的选择。&lt;p&gt;我们与牛人能有多大的差距，在甚至不足一生的努力之后？&lt;p&gt;想想你和你的小学同学现在的差别，和你的高中同学，和你的大学同学。有一些&lt;br&gt;人，如偶像YMH，对够达到令我认为 对比是没有意义的，因为永远不可能达到，&lt;br&gt;更遑论超越。&lt;p&gt;据说巨牛的程序员的效率是面手程序员的10倍。我想，做出这个统计数字的人，&lt;br&gt;一定没有参观我们的教室和实验室。&lt;p&gt;3.图书馆案例&lt;p&gt;正确的方法与糟烂的方法效率之差能有多大？一个真实的案例，但是今天不细说。&lt;p&gt;当年在图书馆导数据出来。&lt;p&gt;预定的方案导出全部书目所需的时间是：200个工作日左右，每天8小时，需要一&lt;br&gt;位工作人员陪着机器。&lt;p&gt;我们经过1个月还是一周的研究，最终的方案导出数据花费了：半小时，人类按&lt;br&gt;键花费了不到1分钟，然后就离开了。&lt;p&gt;如果我们更牛，避免错误技术路线的尝试，这两个方案的对比就是 200天&lt;br&gt;vs. 30分钟。&lt;p&gt;4.于同学的问题&lt;p&gt;周三李记者讲座以后，于同学留言问到：&lt;p&gt;&amp;quot;其实老师，我还有一个问题没有问（我怕老师们回答不了）：如果一个人很热爱&lt;br&gt;代码，很喜欢计算机，但是他学的就是不好，编程就是不如别人，他还有存在的&lt;br&gt;价值吗，他如何生存（可以译为小人物的生存之道）。习编程。&amp;quot;&lt;p&gt;其实这个问题一点也不难回答。初步的回答是：&lt;p&gt;&amp;quot;我唱歌跑调挺严重的，但是我学习弹琴；我体质挺差的，但是我坚持做俯卧撑--我&lt;br&gt;一直在进步。結果并非总是重要的，过程也是我们所追求的；试想，人生如果忽&lt;br&gt;略过程，只看結果，还有什么意思。&amp;quot;&lt;p&gt;只要努力总会进步，而且进步是成指数，而不是线性的。牛人，一般都是从面人&lt;br&gt;过来的，当年也都面得可笑。&lt;p&gt;很难想像热爱却不能精通，如果你用一生的时候去追求。&lt;p&gt;是的，由于天份所限--我们不得不承认--直到生命最后一刻，我们也没有成为巨&lt;br&gt;牛的牛人，但是你的高度已经可以被很多人仰视了。你三两岁的时候，如果像现&lt;br&gt;在这样畏难，一定会被自己当时走路和语言的能力吓得每天哇哇大哭。&lt;p&gt;我知道，你当时确实是那样做的，每天哇哇大哭。现在，请别再以另一种形式继&lt;br&gt;续哭了。&lt;p&gt;而且，我们的人生并非用来与人比较，这一进步的过程，也正是我们所享受的。&lt;p&gt;我们终无可能踏入神的队列，但是我们从未停止努力的脚步。正是持久的努力之&lt;br&gt;路，而并非结果，令我们不同于凡俗。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-4078296568302510772?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/4078296568302510772/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=4078296568302510772' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/4078296568302510772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/4078296568302510772'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/11/blog-post_11.html' title='牛人与弱手的区别，不是线性的，而是指数的 及他们之间的道路'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-1547750321182043077</id><published>2011-11-09T20:44:00.001+08:00</published><updated>2011-11-09T20:44:20.271+08:00</updated><title type='text'>2011年11月9日，我的理想</title><content type='html'>2011年11月9日，我的理想&lt;p&gt;2011年11月9日，历史从这一天改写了。&lt;p&gt;李记者下午讲座，问同学们，以后想干啥。王同学说：想做像杨老师那样的人。&lt;p&gt;我非常激动。极其激动。&lt;p&gt;当年去丹麦和Lars闲扯。他问我，你想你的学生们么？我说：想。他给我看大家&lt;br&gt;的照片，我愈加想念。Lars说你的学生都挺喜欢你的。我说：啊。L&lt;p&gt;又经过了若干谈话，Lars说：做一名教师，应该能够让学生希望将来成为自己这&lt;br&gt;样的人。&lt;p&gt;今天，当我听到王同学这样说的时候，我想起了Lars的话，想起了几次中丹合作&lt;br&gt;项目，回想起我们成功和失败的项目。&lt;p&gt;人生不如意十有八九，今天这算是人生的一点亮色。偶而，我做教师也有成就感&lt;br&gt;的时候啦。&lt;p&gt;领导和上级的评价不足为凭，学生喜欢老师扯淡吹牛讲笑话也不足为据，学生N&lt;br&gt;多年以后后悔或感谢你当年的教诲也算不了什么。但是，我的学生想成为像我一&lt;br&gt;样的人。谢谢，我很自豪。&lt;p&gt;----&lt;p&gt;晚上吃饭，提到风投啊，就业形势越来越好啊，什么的。好象我们已经整到了很&lt;br&gt;多钱，可以大把地花了。&lt;p&gt;我说：我要把那些钱都发了。每个学生每个月四十万。每个人再发条狗，有男朋&lt;br&gt;友女朋友的都带着，每天就是去大连海边遛狗。没对象的，一人发一个对象。男&lt;br&gt;生发个女朋友，女生发个男朋友。&lt;p&gt;恩，如果有男生要求男朋友的，也可以满足。&lt;p&gt;考虑到中国的男女比例，我在女生要求女朋友这犹豫了一下。后来想想，也行。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-1547750321182043077?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/1547750321182043077/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=1547750321182043077' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/1547750321182043077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/1547750321182043077'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/11/2011119.html' title='2011年11月9日，我的理想'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-2349794413461552583</id><published>2011-11-05T22:06:00.000+08:00</published><updated>2011-11-05T22:23:40.927+08:00</updated><title type='text'>轻轨的尽头</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/-_41mThXQrOw/TrVG7TIaG0I/AAAAAAAAMnw/qDg_UkrDExI/s1600/20111105-1-720928.jpg"&gt;&lt;img src="http://3.bp.blogspot.com/-_41mThXQrOw/TrVG7TIaG0I/AAAAAAAAMnw/qDg_UkrDExI/s320/20111105-1-720928.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5671517290304772930" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-UNsJE2o3QRw/TrVG7x9K0nI/AAAAAAAAMn8/8_h6R1Gov4Q/s1600/20111105-2-722837.jpg"&gt;&lt;img src="http://1.bp.blogspot.com/-UNsJE2o3QRw/TrVG7x9K0nI/AAAAAAAAMn8/8_h6R1Gov4Q/s320/20111105-2-722837.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5671517298579133042" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-mtSFL_KKGDQ/TrVG8Nv81oI/AAAAAAAAMok/HFkOOtC_nSI/s1600/IMG_7400-724346.jpg"&gt;&lt;img src="http://4.bp.blogspot.com/-mtSFL_KKGDQ/TrVG8Nv81oI/AAAAAAAAMok/HFkOOtC_nSI/s320/IMG_7400-724346.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5671517306039883394" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-x50VOrC1pZo/TrVG9OXkdQI/AAAAAAAAMps/jdxeqgw2wG8/s1600/IMG_7403-728132.jpg"&gt;&lt;img src="http://4.bp.blogspot.com/-x50VOrC1pZo/TrVG9OXkdQI/AAAAAAAAMps/jdxeqgw2wG8/s320/IMG_7403-728132.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5671517323385926914" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-YMP4pC24AKE/TrVG_J98FiI/AAAAAAAAMp4/8a1wCzQ2DpQ/s1600/IMG_7404-736651.jpg"&gt;&lt;img src="http://4.bp.blogspot.com/-YMP4pC24AKE/TrVG_J98FiI/AAAAAAAAMp4/8a1wCzQ2DpQ/s320/IMG_7404-736651.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5671517356564420130" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/-jiMRrkCHQDA/TrVG_vKlu-I/AAAAAAAAMqA/nqHNVv_eM4I/s1600/IMG_7410-738325.jpg"&gt;&lt;img src="http://3.bp.blogspot.com/-jiMRrkCHQDA/TrVG_vKlu-I/AAAAAAAAMqA/nqHNVv_eM4I/s320/IMG_7410-738325.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5671517366549593058" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-Umblke3uj7M/TrVHAHagx8I/AAAAAAAAMqQ/T7BSZYZBJd4/s1600/IMG_7412-739976.jpg"&gt;&lt;img src="http://4.bp.blogspot.com/-Umblke3uj7M/TrVHAHagx8I/AAAAAAAAMqQ/T7BSZYZBJd4/s320/IMG_7412-739976.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5671517373058828226" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-CCf4vNU_6ss/TrVHAj6WNtI/AAAAAAAAMqc/Jd8XQO4KOn8/s1600/IMG_7414-742003.jpg"&gt;&lt;img src="http://4.bp.blogspot.com/-CCf4vNU_6ss/TrVHAj6WNtI/AAAAAAAAMqc/Jd8XQO4KOn8/s320/IMG_7414-742003.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5671517380708546258" /&gt;&lt;/a&gt;&lt;/p&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-2349794413461552583?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/2349794413461552583/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=2349794413461552583' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/2349794413461552583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/2349794413461552583'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/11/blog-post_05.html' title='轻轨的尽头'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-_41mThXQrOw/TrVG7TIaG0I/AAAAAAAAMnw/qDg_UkrDExI/s72-c/20111105-1-720928.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-8898459097885231560</id><published>2011-11-03T20:13:00.000+08:00</published><updated>2011-11-03T21:13:51.577+08:00</updated><title type='text'>包师弟的放大镜</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/-lh-QOnFJVnQ/TrKTkFD-ZaI/AAAAAAAAMnY/PNSBWMQcUhw/s1600/20111103-1-731578.jpg"&gt;&lt;img src="http://3.bp.blogspot.com/-lh-QOnFJVnQ/TrKTkFD-ZaI/AAAAAAAAMnY/PNSBWMQcUhw/s320/20111103-1-731578.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5670757128856298914" /&gt;&lt;/a&gt;&lt;/p&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-8898459097885231560?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/8898459097885231560/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=8898459097885231560' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/8898459097885231560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/8898459097885231560'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/11/blog-post.html' title='包师弟的放大镜'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-lh-QOnFJVnQ/TrKTkFD-ZaI/AAAAAAAAMnY/PNSBWMQcUhw/s72-c/20111103-1-731578.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-8987691772707434790</id><published>2011-11-03T01:08:00.000+08:00</published><updated>2011-11-03T01:09:15.176+08:00</updated><title type='text'>pics</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://2.bp.blogspot.com/-DtlMkM6Co-I/TrF5PCci6dI/AAAAAAAAMmI/GuGU_b68ozQ/s1600/IMG_7382-755177.JPG"&gt;&lt;img src="http://2.bp.blogspot.com/-DtlMkM6Co-I/TrF5PCci6dI/AAAAAAAAMmI/GuGU_b68ozQ/s320/IMG_7382-755177.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5670446705097763282" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-sTZeFhZXajs/TrF5PA34zfI/AAAAAAAAMmU/cFpX1mn_oO4/s1600/IMG_7383-756759.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/-sTZeFhZXajs/TrF5PA34zfI/AAAAAAAAMmU/cFpX1mn_oO4/s320/IMG_7383-756759.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5670446704675573234" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-PDzrgSrksCI/TrF5Ptu79-I/AAAAAAAAMmg/0U43q-ncI1g/s1600/IMG_7388-758295.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-PDzrgSrksCI/TrF5Ptu79-I/AAAAAAAAMmg/0U43q-ncI1g/s320/IMG_7388-758295.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5670446716717627362" /&gt;&lt;/a&gt;&lt;/p&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-8987691772707434790?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/8987691772707434790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=8987691772707434790' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/8987691772707434790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/8987691772707434790'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/11/pics.html' title='pics'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-DtlMkM6Co-I/TrF5PCci6dI/AAAAAAAAMmI/GuGU_b68ozQ/s72-c/IMG_7382-755177.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-6323376232250674789</id><published>2011-11-02T23:21:00.001+08:00</published><updated>2011-11-02T23:21:22.876+08:00</updated><title type='text'>lambda过程作为返回值的例子-分析，及一个作用域的例子</title><content type='html'>lambda过程作为返回值的例子-分析，及一个作用域的例子&lt;p&gt;1. 昨天的例子的分析&lt;p&gt;昨天整完lambda过程作为返回值的例子就被二猫叫走了，没来得及分析.&lt;p&gt;以下是分析及另一个的例子（似乎出自SICP，记不大清了）.&lt;p&gt;以下混用过程和函数.&lt;p&gt;: guile&amp;gt; (define (foo x)&lt;br&gt;:     (cond   ((= x 1) (lambda (y) (+ y 10)))&lt;br&gt;:         ((= x 2) (lambda (y) (+ y 20)))&lt;br&gt;:         (else    (lambda (y) (+ y 0)))))&lt;p&gt;这段代码可以理解为&lt;p&gt;(define (foo x) (啥啥东西))&lt;p&gt;这意味着，定义了一个过程名为foo，有一个参数.&lt;p&gt;我们再看 (啥啥东西) 的里面&lt;p&gt;: (cond   ((= x 1) (lambda (y) (+ y 10)))&lt;br&gt;:         ((= x 2) (lambda (y) (+ y 20)))&lt;br&gt;:         (else    (lambda (y) (+ y 0))))&lt;p&gt;一个条件判断，有三种可能，每种可能都形如&lt;p&gt;: ((= x 1) (lambda (y) (+ y 10)))&lt;p&gt;其中 (= x 1) 是 判断条件部分，后面的 (lambda (y) (+ y 10)) 是整个表达式&lt;br&gt;的值，即foo这个过程的返回值.&lt;p&gt;这个返回值是什么呢？&lt;p&gt;: (lambda (y) (+ y 10))&lt;p&gt;这个返回值是一个函数，匿名，有一个参数，函数体是 (+ y 10)，即把这个参数&lt;br&gt;加10以后返回.&lt;p&gt;整理一下.&lt;br&gt;1.foo这个函数返回值是一个函数；&lt;br&gt;2.这个作为返回值的函数，函数体是 (+ y 10).&lt;p&gt;我们再测试一下.&lt;p&gt;: guile&amp;gt; (foo 1)&lt;br&gt;: #&amp;lt;procedure #f (y)&amp;gt;&lt;p&gt;意思是：foo这个函数传参数值为1，返回值是个函数，有一个参数.&lt;p&gt;: guile&amp;gt; ((foo 1) 23)&lt;br&gt;: 33&lt;p&gt;当foo的参数为1的时候，cond求值为&lt;br&gt;: ((= x 1) (lambda (y) (+ y 10)))&lt;p&gt;(lambda (y) (+ y 10)) 的参数是&lt;br&gt;: guile&amp;gt; ((foo 1) 23)&lt;br&gt;中的23.&lt;p&gt;即，把(foo 1)代换为(lambda (y) (+ y 10))，这正是对(foo 1)求值的结果.&lt;p&gt;那么 ((foo 1) 23) 就成了 （(lambda (y) (+ y 10)) 23）.&lt;p&gt;在一个参数的函数上，传参（apply）值为23，所以值为(+ 23 10)，即33.&lt;p&gt;以下例子请作为练习分析.&lt;p&gt;: guile&amp;gt; ((foo 2) 23)&lt;br&gt;: 43&lt;br&gt;: guile&amp;gt; ((foo 3) 23)&lt;br&gt;: 23&lt;br&gt;: guile&amp;gt; ((foo 2) 33)&lt;br&gt;: 53&lt;p&gt;2. 新的例子.&lt;p&gt;2.1&lt;p&gt;: guile&amp;gt;(define (f x y)&lt;br&gt;: ((lambda (a b)&lt;br&gt;: (+ (* x (* a a)) (* y b) (* a b)))&lt;br&gt;: (+ 1 (* x y))&lt;br&gt;: (- 1 y)))&lt;p&gt;即 (define (f x y) (啥啥东西) )&lt;p&gt;定义函数f，有两个参数.&lt;p&gt;啥啥东西是：&lt;p&gt;: ((lambda (a b)&lt;br&gt;: (+ (* x (* a a)) (* y b) (* a b)))&lt;br&gt;: (+ 1 (* x y))&lt;br&gt;: (- 1 y))&lt;p&gt;这是什么呢？&lt;p&gt;这是 ((lambda (a b) (又一个啥啥东西))&lt;br&gt;(东西1)&lt;br&gt;(东西2))&lt;p&gt;这是什么意思呢？&lt;p&gt;这是 (一个匿名函数 (参数1) (参数2)).&lt;p&gt;其中 参数1 = 东西1； 参数2 = 东西2.&lt;p&gt;请先回顾一下，然后我们继续.&lt;p&gt;所以这是什么呢？这是给有两个参数的一个匿名函数传参，求值.&lt;p&gt;这个匿名函数是什么呢？(lambda (a b) (又一个啥啥东西)&lt;p&gt;原文是 (+ (* x (* a a)) (* y b) (* a b)).&lt;p&gt;2.2&lt;p&gt;所以，我们退回去一些，下式得到了解释.&lt;p&gt;: ((lambda (a b)&lt;br&gt;: (+ (* x (* a a)) (* y b) (* a b)))&lt;br&gt;: (+ 1 (* x y))&lt;br&gt;: (- 1 y))&lt;p&gt;它的意思是&amp;quot;这是给有两个参数的一个匿名函数传参，求值.&amp;quot;&lt;p&gt;再往回退一点，第2节提到的式子，如下，得到了解释.&lt;p&gt;: (define (f x y)&lt;br&gt;: ((lambda (a b)&lt;br&gt;: (+ (* x (* a a)) (* y b) (* a b)))&lt;br&gt;: (+ 1 (* x y))&lt;br&gt;: (- 1 y)))&lt;p&gt;我们定义了一个函数名为f，两个参数，这个函数f的作用是 给两个参数的一个匿 &lt;br&gt;名函数传参求值.&lt;p&gt;我们测试一下.&lt;p&gt;: guile&amp;gt;(f 1 2)&lt;br&gt;: 4&lt;p&gt;2.3&lt;p&gt;这个例子的求值，一个关键因素是那些 x、y、a、b 的值，或者说，它们的作用域。&lt;p&gt;在没有被覆盖的情况下，lambda里面的x、y就是f里面的x、y。请看下面的等价测&lt;br&gt;试。&lt;p&gt;: guile&amp;gt; (define x 1) (define y 2) (define a 3) (define b -1)&lt;br&gt;:&lt;br&gt;: guile&amp;gt; (+ (* x (* a a)) (* y b) (* a b))&lt;br&gt;: 4&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-6323376232250674789?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/6323376232250674789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=6323376232250674789' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/6323376232250674789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/6323376232250674789'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/11/lambda_02.html' title='lambda过程作为返回值的例子-分析，及一个作用域的例子'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-4844710505134539968</id><published>2011-11-01T21:49:00.001+08:00</published><updated>2011-11-01T21:49:51.231+08:00</updated><title type='text'>lambda过程作为返回值的例子</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-luTyO8iGLIE/Tq_4_0fjc8I/AAAAAAAAMlw/nrAZKbqycDs/s1600/IMG_7378-791232.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/-luTyO8iGLIE/Tq_4_0fjc8I/AAAAAAAAMlw/nrAZKbqycDs/s320/IMG_7378-791232.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5670024231189181378" /&gt;&lt;/a&gt;&lt;/p&gt;课堂上的BUG，是if语法错误。&lt;p&gt;guile&amp;gt; (define (foo x)&lt;br&gt;     (cond   ((= x 1) (lambda (y) (+ y 10)))&lt;br&gt;         ((= x 2) (lambda (y) (+ y 20)))&lt;br&gt;         (else    (lambda (y) (+ y 0)))))&lt;br&gt;guile&amp;gt; (foo 1)&lt;br&gt;#&amp;lt;procedure #f (y)&amp;gt;&lt;br&gt;guile&amp;gt; ((foo 1) 23)&lt;br&gt;33&lt;br&gt;guile&amp;gt; ((foo 2) 23)&lt;br&gt;43&lt;br&gt;guile&amp;gt; ((foo 3) 23)&lt;br&gt;23&lt;br&gt;guile&amp;gt; ((foo 2) 33)&lt;br&gt;53&lt;br&gt;guile&amp;gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-4844710505134539968?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/4844710505134539968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=4844710505134539968' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/4844710505134539968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/4844710505134539968'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/11/lambda.html' title='lambda过程作为返回值的例子'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-luTyO8iGLIE/Tq_4_0fjc8I/AAAAAAAAMlw/nrAZKbqycDs/s72-c/IMG_7378-791232.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-3150460679899083051</id><published>2011-10-31T23:37:00.000+08:00</published><updated>2011-10-31T23:38:07.203+08:00</updated><title type='text'>pics</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-O-9JnltGXIM/Tq7A4B18EHI/AAAAAAAAMlk/H5-ZMDpxnLE/s1600/IMG_7377-787203.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-O-9JnltGXIM/Tq7A4B18EHI/AAAAAAAAMlk/H5-ZMDpxnLE/s320/IMG_7377-787203.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5669681049705910386" /&gt;&lt;/a&gt;&lt;/p&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-3150460679899083051?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/3150460679899083051/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=3150460679899083051' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/3150460679899083051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/3150460679899083051'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/10/pics_31.html' title='pics'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-O-9JnltGXIM/Tq7A4B18EHI/AAAAAAAAMlk/H5-ZMDpxnLE/s72-c/IMG_7377-787203.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-2440212748387473694</id><published>2011-10-31T21:33:00.001+08:00</published><updated>2011-10-31T21:33:23.244+08:00</updated><title type='text'>当你说不行时，你应该说些什么：以Android播放midi为例</title><content type='html'>中国好几年前都对能对美国说&amp;quot;不&amp;quot;，软件工程师也经常要对用户和同事说&amp;quot;不&amp;quot;。但是别人经常还要在你说不以后继续喋喋不休，为什么呢？&lt;br&gt;据说男生说不的时候，就是不的意思；据说女生说不的时候，是请再继续表现的意思。这坑害了很多猥琐男。因为，只有她希望你继续表现的时候，那时&amp;quot;不&amp;quot;的意思才是请继续表现，否则，&amp;quot;不&amp;quot;的意思就是&amp;quot;不&amp;quot;。一些女生假设对方能够理解这一显然的事实：即，你是否是被欢迎继续表现的。&lt;br&gt;而这个世界上没有显然的事情。继续表现的，多是猥琐男，被希望继续表现的，通常很快就引退了。&lt;br&gt;关于如何说是，咱们今天不讨论；今天单讨论一下如何明确地说不。&lt;br&gt;会发生上述误会，盖因东方民族隐晦含蓄的表达方式传统。看过一个日本片子。某个提了个什么主意，女主角坐在那里，低头着头，很坚毅地说：&amp;quot;虽说很好。&amp;quot;&lt;br&gt;你不要以为还有下文，她说到这里就戛然而止了。日本人就是这样说话的。她发出的声音是&amp;quot;虽说很好&amp;quot;，但实际想传达的是后面所有没说的内容。&lt;br&gt;在工程中，用户和同事也经常会误解。那么如何准确地传达&amp;quot;不&amp;quot;的信息呢？&lt;br&gt;1. 对用户&lt;br&gt;这个简单。&lt;br&gt;除了告诉他不以外，还要告诉他 技术上完全可以，但是...然后开始罗列代价：时间（工期）、经费等等。&lt;br&gt;然后他就自动引退了。这在女生说不的场景中，类似于，女生说完不以后，再补充，&amp;quot;其实呢，也不是不行，但是需要加些条件。我想要的很简单：一座大大的露台，上面有个秋千……&amp;quot;&lt;br&gt;明确的回绝，就是 不行 + 你不具备&amp;quot;行&amp;quot;的理由。&lt;br&gt;2. 对同事&lt;br&gt;明确告诉同事，尤其是分配给你任务的那个人，&amp;quot;你的想法很猪头&amp;quot; 的方法是，告诉他，他的想法不可行的原因。&lt;br&gt;并且，为了交流简洁起见，把他所有可能的提问，所有可能修正的主意都罗列出来，然后一一否定。写文档或报告的时候，不要期待交互，不要期待他问你答，用答案堵住他所有可能下嘴的地方。&lt;br&gt;不恃敌所不攻也，恃吾有以待也。&lt;br&gt;以下是一个实例故事。这也我们为什么要训练写实验报告的原因，它记录了过程和数据，以此支持你的看法。没有人会像科幻电影里的总统啥的那样，因为你琼瑶般喊&amp;quot;你们相信我吧，地球真的要毁灭啦&amp;quot;就相信你。&lt;br&gt;我们应该做的是：告诉小伙不行，然后对他淡定地笑笑，然后准确清晰完整地说出他不行的原因。&lt;br&gt;背景：&lt;br&gt;我请牛同学做Android下的一个程序原理，播放音乐合弦，比如大三度。意思是，同时把do,re,mi的声音发出来。&lt;br&gt;技术方案之一是用PCM混音，之二是在MIDI中同时播放这几个音。牛同学分别试了。&lt;br&gt;牛同学试了一段时间以后，说终于找到一个生成midi文件的方法。&lt;br&gt;我提出新的要求，不要把midi文件写到文件系统（internal&lt;br&gt;storage）中，而是用java的stream，在内存（RAM）中直接发给MediaPlayer播放。&lt;br&gt;牛同学说：不行。&lt;br&gt;故事开始了。&lt;br&gt;你说不行，我当然不能因为是你说的，然后就信了。要有事实。&lt;br&gt;所以牛同学发来他的代码，我学习了一段，发现真的不行。然后写了下面这封信。略有修改。&lt;br&gt;----信的正文由此开始----&lt;br&gt;下面提到的&amp;quot;应该&amp;quot;是指 建议给你的&lt;br&gt;报告的写法.有了这些你&amp;quot;应该&amp;quot;提供的资料，我才能了解你研究了哪些必要的方法.这是用以证明你研究的路线是正确的方法.或者换种说法，如果以下报告中的&amp;quot;应该&amp;quot;部分你已经告诉我，我就不必看你的代码了.&lt;br&gt;1. 你应该提供我MidiFile的出处，以便我参考，因为MidiFile不是你写的，且不是java/android的一部分；&lt;br&gt;2. 你是否参考了此邮件后面网址的实现？[&lt;a href="http://kevinboone.net/javamidi.html"&gt;http://kevinboone.net/javamidi.html&lt;/a&gt;]&lt;br&gt;3. 我提到的不必向文件系统中写出midi文件，原计划的路线是这样的：通过重写 writeToFile&lt;br&gt;实现，把这个方法中的写到文件系统中转为对Stream赋值，也可以把midi的内容放在 vector&amp;lt;byte&amp;gt;中；&lt;br&gt;4. 然后设置MediaPlayer.SetDataSource()的参数为这个vector或者Stream.&lt;br&gt;下面是我寻找解决方案的路线。&lt;br&gt;4.1 MediaPlayer需要FileDescriptor&lt;br&gt;[&lt;a href="http://developer.android.com/reference/android/media/MediaPlayer.html#pubmethods]MediaPlayer.setDataSource(FileDescriptor"&gt;http://developer.android.com/reference/android/media/MediaPlayer.html#pubmethods]MediaPlayer.setDataSource(FileDescriptor&lt;/a&gt;&lt;br&gt;fd)Sets the data source (FileDescriptor) to use.&lt;br&gt;4.2 FileDescriptor可以由FileInputStream/FileOutputStream建立&lt;br&gt;[&lt;a href="http://developer.android.com/reference/java/io/FileDescriptor.html]It&amp;#39;s"&gt;http://developer.android.com/reference/java/io/FileDescriptor.html]It&amp;#39;s&lt;/a&gt;&lt;br&gt;possible to get the file descriptor used by some classes (such&lt;br&gt;asFileInputStream, FileOutputStream, and RandomAccessFile), and&lt;br&gt;thencreate new streams that point to the same file descriptor.&lt;br&gt;[&lt;a href="http://developer.android.com/reference/java/io/FileOutputStream.html]FileInputStream.getFD()public"&gt;http://developer.android.com/reference/java/io/FileOutputStream.html]FileInputStream.getFD()public&lt;/a&gt;&lt;br&gt;final FileDescriptor getFD ()Returns the underlying file descriptor.&lt;br&gt;4.4 到这里，我的思路走不下去了。因为FileInputStream的构造函数要求存储在FLASH中的文件。&lt;br&gt;你应该列出以下方法，并说明MediaPlayer没有其他的方法 setDataSource.&lt;br&gt;void	 setDataSource(String path)Sets the data source (file-path or&lt;br&gt;http/rtsp URL) to use.void	 setDataSource(FileDescriptor fd, long&lt;br&gt;offset, long length)Sets the data source (FileDescriptor) to use.void	&lt;br&gt;setDataSource(FileDescriptor fd)Sets the data source (FileDescriptor)&lt;br&gt;to use.void	 setDataSource(Context context, Uri uri, Map&amp;lt;String,&lt;br&gt;String&amp;gt; headers)Sets the data source as a content Uri.void	&lt;br&gt;setDataSource(Context context, Uri uri)Sets the data source as a&lt;br&gt;content Uri.&lt;p&gt;4.5 然后我开始查是否有其他的办法。因为利用stream而不通过文件系统，这实在应该是个非常通用的方案，android sdk没有理由不支持啊。&lt;br&gt;[&lt;a href="http://developer.android.com/reference/android/content/Context.html#getCacheDir()]"&gt;http://developer.android.com/reference/android/content/Context.html#getCacheDir()]&lt;/a&gt;讨论了这一问题，播放内存中，而不是flash(internal&lt;br&gt;storage)中的midi文件。&lt;br&gt;4.6 下面这个方法我同意[&lt;a href="http://code.google.com/p/android/issues/detail?id=739"&gt;http://code.google.com/p/android/issues/detail?id=739&lt;/a&gt;]&lt;br&gt;: Comment 7 by &lt;a href="mailto:steveold...@gmail.com"&gt;steveold...@gmail.com&lt;/a&gt;, Aug 19, 2008: From the ReadMe&lt;br&gt;included with 0.9 SDK.:&amp;#160;: Unfortunately, the ability to play audio&lt;br&gt;streams from memory (such as via an&amp;#160;: InputStream or Reader) will not&lt;br&gt;be possible in Android 1.0. &amp;#160;As a workaround, we&amp;#160;: recommend that&lt;br&gt;developers save media content to SD card and use MediaPlayer to play&amp;#160;:&lt;br&gt;from a file URI, or embed a small HTTP server and play from a URI on&lt;br&gt;localhost (such&amp;#160;: as &lt;a href="http://127.0.0.1:4242/something"&gt;http://127.0.0.1:4242/something&lt;/a&gt;&lt;br&gt;杨注：但是第二天一早，我又意识到这是不行的。因为读http必然要求那个midi文件已经存在了。这与我原计划不希望写入文件系统相违背。&lt;br&gt;同一贴子有人提到&lt;br&gt;: Comment 12 by &lt;a href="mailto:seeingwi...@gmail.com"&gt;seeingwi...@gmail.com&lt;/a&gt;, May 19, 2009: Issue now&lt;br&gt;resolved with AudioTrack in Android 1.5 (Cupcake)&lt;br&gt;这是我们以前提到过的方法，在[&lt;a href="http://developer.android.com/reference/android/media/AudioTrack.html"&gt;http://developer.android.com/reference/android/media/AudioTrack.html&lt;/a&gt;]&lt;br&gt;里提到，不过需要PCM作为buffer而不能用midi作为buffer.&lt;br&gt;正如同一贴子的人回答道：&lt;br&gt;: Comment 22 by sam.clegg, Sep 13, 2011: Is there really still no&lt;br&gt;streaming audio support in android?:&amp;#160;: AudioTrack doesn&amp;#39;t help as it&lt;br&gt;only works for PCM samples, not encoded files.&lt;br&gt;4.7 至此，我提出的从stream中写入midi，然后从stream中构造MediaPlayer，这一方案可以得出结论 不行.&lt;br&gt;我们不能因为谁说不行就认定不行，而只能根据以上的分析.&lt;br&gt;4.8 我们仍然可以用PCM的方法合成和弦.我建议还是试回这个方法.&lt;br&gt;杨注：然后第二天一早，我又反悔了，因为PCM的尺寸会比MIDI大很多，这不是我们希望的。&lt;br&gt;请用MATLAB做这样的试验：&lt;br&gt;杨注：所以下面的实验我就在此省略了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-2440212748387473694?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/2440212748387473694/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=2440212748387473694' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/2440212748387473694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/2440212748387473694'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/10/androidmidi.html' title='当你说不行时，你应该说些什么：以Android播放midi为例'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-3740481589777422441</id><published>2011-10-30T21:23:00.000+08:00</published><updated>2011-10-30T21:24:04.453+08:00</updated><title type='text'>徒步 20111030,4.0km, 15:00-16:30.</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-1_XdxoQBSZ4/Tq1P9fhYgBI/AAAAAAAAMlI/cHt7Oef0rbk/s1600/20111030-744454.jpg"&gt;&lt;img src="http://1.bp.blogspot.com/-1_XdxoQBSZ4/Tq1P9fhYgBI/AAAAAAAAMlI/cHt7Oef0rbk/s320/20111030-744454.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5669275423781453842" /&gt;&lt;/a&gt;&lt;/p&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-3740481589777422441?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/3740481589777422441/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=3740481589777422441' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/3740481589777422441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/3740481589777422441'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/10/2011103040km-1500-1630.html' title='徒步 20111030,4.0km, 15:00-16:30.'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-1_XdxoQBSZ4/Tq1P9fhYgBI/AAAAAAAAMlI/cHt7Oef0rbk/s72-c/20111030-744454.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-1883715360220395945</id><published>2011-10-30T20:56:00.000+08:00</published><updated>2011-10-30T20:57:09.782+08:00</updated><title type='text'>pics</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/-BqDqrbOsINc/Tq1JpqpJWWI/AAAAAAAAMfY/SomEDbKrXy4/s1600/IMG_7341-729783.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/-BqDqrbOsINc/Tq1JpqpJWWI/AAAAAAAAMfY/SomEDbKrXy4/s320/IMG_7341-729783.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5669268486099655010" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-nrcJsruDEVk/Tq1JqBWdmYI/AAAAAAAAMgg/7az2JeXrc9Q/s1600/IMG_7343-731532.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-nrcJsruDEVk/Tq1JqBWdmYI/AAAAAAAAMgg/7az2JeXrc9Q/s320/IMG_7343-731532.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5669268492195305858" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/--SdbPbHRvaI/Tq1Jr7LWYJI/AAAAAAAAMgs/h6DuSvo3BoY/s1600/IMG_7344-738782.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/--SdbPbHRvaI/Tq1Jr7LWYJI/AAAAAAAAMgs/h6DuSvo3BoY/s320/IMG_7344-738782.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5669268524897820818" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-y6F_MOUpqJk/Tq1JsEeNdiI/AAAAAAAAMg4/7KCKHKeK4f8/s1600/IMG_7345-740282.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-y6F_MOUpqJk/Tq1JsEeNdiI/AAAAAAAAMg4/7KCKHKeK4f8/s320/IMG_7345-740282.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5669268527392847394" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/-QnspBF-Za-A/Tq1JsZWinZI/AAAAAAAAMhc/5J6IKPTBwBA/s1600/IMG_7346-741159.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/-QnspBF-Za-A/Tq1JsZWinZI/AAAAAAAAMhc/5J6IKPTBwBA/s320/IMG_7346-741159.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5669268532997823890" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-Uz8GdUH8Qhw/Tq1JtCg9GGI/AAAAAAAAMho/FJYWcdA4Ksk/s1600/IMG_7349-743705.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-Uz8GdUH8Qhw/Tq1JtCg9GGI/AAAAAAAAMho/FJYWcdA4Ksk/s320/IMG_7349-743705.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5669268544047356002" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-ERS9YY5uhyI/Tq1JtYBAD_I/AAAAAAAAMiU/hkxXVVvkztM/s1600/IMG_7352-745035.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-ERS9YY5uhyI/Tq1JtYBAD_I/AAAAAAAAMiU/hkxXVVvkztM/s320/IMG_7352-745035.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5669268549818912754" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-baXES7Zx91c/Tq1JuAmRlMI/AAAAAAAAMic/aU7Pe5yNb14/s1600/IMG_7353-748379.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-baXES7Zx91c/Tq1JuAmRlMI/AAAAAAAAMic/aU7Pe5yNb14/s320/IMG_7353-748379.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5669268560712668354" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-cKRwOjeWLBQ/Tq1JuXFDFTI/AAAAAAAAMi4/z4ACul4He-M/s1600/IMG_7357-749049.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/-cKRwOjeWLBQ/Tq1JuXFDFTI/AAAAAAAAMi4/z4ACul4He-M/s320/IMG_7357-749049.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5669268566747321650" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/-nF0BhDcqXVY/Tq1JvGn3sRI/AAAAAAAAMjE/YCsoV1KinRQ/s1600/IMG_7358-751878.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/-nF0BhDcqXVY/Tq1JvGn3sRI/AAAAAAAAMjE/YCsoV1KinRQ/s320/IMG_7358-751878.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5669268579509842194" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-KwFuZCf1yDs/Tq1JvfMUU0I/AAAAAAAAMjo/3BHghXZM6iw/s1600/IMG_7360-753033.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-KwFuZCf1yDs/Tq1JvfMUU0I/AAAAAAAAMjo/3BHghXZM6iw/s320/IMG_7360-753033.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5669268586105164610" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/-sOJe9EvAnn8/Tq1Jwkg9_AI/AAAAAAAAMj4/rm0KcmEoTkY/s1600/IMG_7364-757781.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/-sOJe9EvAnn8/Tq1Jwkg9_AI/AAAAAAAAMj4/rm0KcmEoTkY/s320/IMG_7364-757781.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5669268604713827330" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-MMjQIDqDr6w/Tq1JwlpynwI/AAAAAAAAMkE/4LUaDF0nF_E/s1600/IMG_7369-758575.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/-MMjQIDqDr6w/Tq1JwlpynwI/AAAAAAAAMkE/4LUaDF0nF_E/s320/IMG_7369-758575.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5669268605019266818" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-yty1sMkku5Y/Tq1JxekoWOI/AAAAAAAAMkQ/MRFpPskzbpU/s1600/IMG_7370-761022.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-yty1sMkku5Y/Tq1JxekoWOI/AAAAAAAAMkQ/MRFpPskzbpU/s320/IMG_7370-761022.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5669268620298442978" /&gt;&lt;/a&gt;&lt;/p&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-1883715360220395945?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/1883715360220395945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=1883715360220395945' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/1883715360220395945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/1883715360220395945'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/10/pics_4356.html' title='pics'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-BqDqrbOsINc/Tq1JpqpJWWI/AAAAAAAAMfY/SomEDbKrXy4/s72-c/IMG_7341-729783.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-8190894415167268546</id><published>2011-10-30T20:27:00.001+08:00</published><updated>2011-10-30T20:27:28.487+08:00</updated><title type='text'>pics</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-OrTxq80xIQI/Tq1CsfTvdYI/AAAAAAAAMe0/-SXOcfdM968/s1600/20111028-748488.jpg"&gt;&lt;img src="http://4.bp.blogspot.com/-OrTxq80xIQI/Tq1CsfTvdYI/AAAAAAAAMe0/-SXOcfdM968/s320/20111028-748488.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5669260838015300994" /&gt;&lt;/a&gt;&lt;/p&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-8190894415167268546?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/8190894415167268546/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=8190894415167268546' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/8190894415167268546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/8190894415167268546'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/10/pics_30.html' title='pics'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-OrTxq80xIQI/Tq1CsfTvdYI/AAAAAAAAMe0/-SXOcfdM968/s72-c/20111028-748488.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-9144328575490302182</id><published>2011-10-29T22:34:00.001+08:00</published><updated>2011-10-29T22:34:36.961+08:00</updated><title type='text'>pics</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-KPPtr0nFeS8/TqwO_XiFWDI/AAAAAAAAMcM/qwTYjzD0IEM/s1600/20111029-776962.jpg"&gt;&lt;img src="http://1.bp.blogspot.com/-KPPtr0nFeS8/TqwO_XiFWDI/AAAAAAAAMcM/qwTYjzD0IEM/s320/20111029-776962.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5668922512764131378" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-WXKgyaUWeEQ/TqwO_6ubKFI/AAAAAAAAMcY/dpGtj902HnE/s1600/IMG_7338-779022.jpg"&gt;&lt;img src="http://1.bp.blogspot.com/-WXKgyaUWeEQ/TqwO_6ubKFI/AAAAAAAAMcY/dpGtj902HnE/s320/IMG_7338-779022.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5668922522211133522" /&gt;&lt;/a&gt;&lt;/p&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-9144328575490302182?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/9144328575490302182/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=9144328575490302182' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/9144328575490302182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/9144328575490302182'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/10/pics_29.html' title='pics'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-KPPtr0nFeS8/TqwO_XiFWDI/AAAAAAAAMcM/qwTYjzD0IEM/s72-c/20111029-776962.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-9006897588892315582</id><published>2011-10-26T15:42:00.001+08:00</published><updated>2011-10-26T15:42:49.878+08:00</updated><title type='text'>pics</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://2.bp.blogspot.com/-1fYHomYxWek/Tqe5-vK2AUI/AAAAAAAAMV4/fGMh0Fz-0i4/s1600/IMG_7334-769879.JPG"&gt;&lt;img src="http://2.bp.blogspot.com/-1fYHomYxWek/Tqe5-vK2AUI/AAAAAAAAMV4/fGMh0Fz-0i4/s320/IMG_7334-769879.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5667703143534035266" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-1G8GlsUKbZU/Tqe5-xFr7LI/AAAAAAAAMWE/5H6O12ta0RA/s1600/IMG_7317-771328.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/-1G8GlsUKbZU/Tqe5-xFr7LI/AAAAAAAAMWE/5H6O12ta0RA/s320/IMG_7317-771328.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5667703144049274034" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-AfBknYFsiKE/Tqe5_G_KAlI/AAAAAAAAMWk/MVc8ItxG3M8/s1600/IMG_7325-772622.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/-AfBknYFsiKE/Tqe5_G_KAlI/AAAAAAAAMWk/MVc8ItxG3M8/s320/IMG_7325-772622.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5667703149927465554" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/-OhWOzUD-GaE/Tqe6AJUlCoI/AAAAAAAAMXA/91g-vjJg4KI/s1600/IMG_7331-776294.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/-OhWOzUD-GaE/Tqe6AJUlCoI/AAAAAAAAMXA/91g-vjJg4KI/s320/IMG_7331-776294.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5667703167734057602" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/--W2JIpGeTzg/Tqe6A28bumI/AAAAAAAAMXI/BhkkIKs3bjo/s1600/IMG_7333-779694.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/--W2JIpGeTzg/Tqe6A28bumI/AAAAAAAAMXI/BhkkIKs3bjo/s320/IMG_7333-779694.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5667703179980814946" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/-0aQAjp3IzF8/Tqe6BHyxZJI/AAAAAAAAMXg/gIUsirF62XI/s1600/IMG_7311-780660.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/-0aQAjp3IzF8/Tqe6BHyxZJI/AAAAAAAAMXg/gIUsirF62XI/s320/IMG_7311-780660.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5667703184503694482" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-98kGeiucp_0/Tqe6Biu4gOI/AAAAAAAAMYE/TnNS3yLJDIQ/s1600/IMG_7312-782392.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/-98kGeiucp_0/Tqe6Biu4gOI/AAAAAAAAMYE/TnNS3yLJDIQ/s320/IMG_7312-782392.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5667703191735140578" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://2.bp.blogspot.com/-14IkD-hhyXw/Tqe6ClBm36I/AAAAAAAAMYM/rCxsEmQ6uVM/s1600/IMG_7308-786126.JPG"&gt;&lt;img src="http://2.bp.blogspot.com/-14IkD-hhyXw/Tqe6ClBm36I/AAAAAAAAMYM/rCxsEmQ6uVM/s320/IMG_7308-786126.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5667703209530417058" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-RNnu1uCc1oM/Tqe6C5CA_vI/AAAAAAAAMZE/UJqpOhdFatg/s1600/IMG_7307-787349.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-RNnu1uCc1oM/Tqe6C5CA_vI/AAAAAAAAMZE/UJqpOhdFatg/s320/IMG_7307-787349.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5667703214900838130" /&gt;&lt;/a&gt;&lt;/p&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-9006897588892315582?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/9006897588892315582/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=9006897588892315582' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/9006897588892315582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/9006897588892315582'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/10/pics_26.html' title='pics'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-1fYHomYxWek/Tqe5-vK2AUI/AAAAAAAAMV4/fGMh0Fz-0i4/s72-c/IMG_7334-769879.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-3174820682001861515</id><published>2011-10-22T19:34:00.000+08:00</published><updated>2011-10-22T19:44:29.399+08:00</updated><title type='text'>回顾大连ACMICPC之行 照片 5</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/-rk0083X0AXw/TqKsnUEBsCI/AAAAAAAAMS0/OyUHx6u0ZhY/s1600/DSC03653-769400.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/-rk0083X0AXw/TqKsnUEBsCI/AAAAAAAAMS0/OyUHx6u0ZhY/s320/DSC03653-769400.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666281072585977890" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-hlSfDuKTEGg/TqKsn5fgkLI/AAAAAAAAMTQ/4mBoZrdlD_s/s1600/DSC03656-770831.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/-hlSfDuKTEGg/TqKsn5fgkLI/AAAAAAAAMTQ/4mBoZrdlD_s/s320/DSC03656-770831.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666281082633359538" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/-BkENjvjuEmQ/TqKsoTih0BI/AAAAAAAAMTw/j5VfKNj9EeA/s1600/DSC03660-773304.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/-BkENjvjuEmQ/TqKsoTih0BI/AAAAAAAAMTw/j5VfKNj9EeA/s320/DSC03660-773304.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666281089625346066" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://2.bp.blogspot.com/-dCa_lmaUra0/TqKspFDtPFI/AAAAAAAAMT8/_vmBs6Rv9sw/s1600/DSC03662-775933.JPG"&gt;&lt;img src="http://2.bp.blogspot.com/-dCa_lmaUra0/TqKspFDtPFI/AAAAAAAAMT8/_vmBs6Rv9sw/s320/DSC03662-775933.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666281102917844050" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-Iric70tqJlM/TqKspT_SJgI/AAAAAAAAMU0/zn-z0Yt_b7U/s1600/DSC03632-777333.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/-Iric70tqJlM/TqKspT_SJgI/AAAAAAAAMU0/zn-z0Yt_b7U/s320/DSC03632-777333.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666281106925823490" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://2.bp.blogspot.com/-4dnhZBuwX1Y/TqKsqtorPzI/AAAAAAAAMVE/WT8W8LX8I5Y/s1600/DSC03647-781618.JPG"&gt;&lt;img src="http://2.bp.blogspot.com/-4dnhZBuwX1Y/TqKsqtorPzI/AAAAAAAAMVE/WT8W8LX8I5Y/s320/DSC03647-781618.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666281130990190386" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-eqT75UxNkkc/TqKsrXKT9-I/AAAAAAAAMVQ/7pcnzMh_8XI/s1600/DSC03650-785360.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-eqT75UxNkkc/TqKsrXKT9-I/AAAAAAAAMVQ/7pcnzMh_8XI/s320/DSC03650-785360.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666281142137124834" /&gt;&lt;/a&gt;&lt;/p&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-3174820682001861515?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/3174820682001861515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=3174820682001861515' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/3174820682001861515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/3174820682001861515'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/10/acmicpc-5.html' title='回顾大连ACMICPC之行 照片 5'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-rk0083X0AXw/TqKsnUEBsCI/AAAAAAAAMS0/OyUHx6u0ZhY/s72-c/DSC03653-769400.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-8738442930054806991</id><published>2011-10-22T19:33:00.001+08:00</published><updated>2011-10-22T19:41:38.486+08:00</updated><title type='text'>回顾大连ACMICPC之行 照片 4</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-zud55lqiLRs/TqKr8r8CcxI/AAAAAAAAMOs/trsJ0ZVxenQ/s1600/DSC03687-798487.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-zud55lqiLRs/TqKr8r8CcxI/AAAAAAAAMOs/trsJ0ZVxenQ/s320/DSC03687-798487.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666280340260549394" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://2.bp.blogspot.com/-Bs7du4mjU_A/TqKr8xy-jvI/AAAAAAAAMPM/Xhhrg8B66Ow/s1600/DSC03688-799201.JPG"&gt;&lt;img src="http://2.bp.blogspot.com/-Bs7du4mjU_A/TqKr8xy-jvI/AAAAAAAAMPM/Xhhrg8B66Ow/s320/DSC03688-799201.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666280341833158386" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/-cRxdx5zpf5U/TqKr9kQki-I/AAAAAAAAMPU/krDcVY7cGjQ/s1600/DSC03692-701776.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/-cRxdx5zpf5U/TqKr9kQki-I/AAAAAAAAMPU/krDcVY7cGjQ/s320/DSC03692-701776.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666280355379055586" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/-Rgj38e1qm_Q/TqKr9_Nnl0I/AAAAAAAAMP0/ruwOfRDubDQ/s1600/DSC03720-702739.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/-Rgj38e1qm_Q/TqKr9_Nnl0I/AAAAAAAAMP0/ruwOfRDubDQ/s320/DSC03720-702739.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666280362614429506" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://2.bp.blogspot.com/-faOZYtqipNo/TqKr-dy4RSI/AAAAAAAAMQA/H4lRBZrDQX4/s1600/DSC03666-704913.JPG"&gt;&lt;img src="http://2.bp.blogspot.com/-faOZYtqipNo/TqKr-dy4RSI/AAAAAAAAMQA/H4lRBZrDQX4/s320/DSC03666-704913.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666280370823775522" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/-BWzAoY3LwM0/TqKr-hnkGwI/AAAAAAAAMQQ/ebe9_MSGWyk/s1600/DSC03668-706310.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/-BWzAoY3LwM0/TqKr-hnkGwI/AAAAAAAAMQQ/ebe9_MSGWyk/s320/DSC03668-706310.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666280371850058498" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/-kp5IEOOvAJM/TqKr-6XLIrI/AAAAAAAAMQc/nfw4YHopjT4/s1600/DSC03670-707674.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/-kp5IEOOvAJM/TqKr-6XLIrI/AAAAAAAAMQc/nfw4YHopjT4/s320/DSC03670-707674.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666280378492199602" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-yYcC6OVlIfA/TqKr_VhG0tI/AAAAAAAAMQ4/PHkKcaxx72g/s1600/DSC03672-709174.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/-yYcC6OVlIfA/TqKr_VhG0tI/AAAAAAAAMQ4/PHkKcaxx72g/s320/DSC03672-709174.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666280385781617362" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-P-ONXFV2ZnU/TqKr_1qZZDI/AAAAAAAAMRE/mxGAmmBdNNY/s1600/DSC03674-711066.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-P-ONXFV2ZnU/TqKr_1qZZDI/AAAAAAAAMRE/mxGAmmBdNNY/s320/DSC03674-711066.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666280394410517554" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/-8O2ZU08SFfA/TqKsACAuI7I/AAAAAAAAMRk/8wS_eae8DxY/s1600/DSC03676-712181.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/-8O2ZU08SFfA/TqKsACAuI7I/AAAAAAAAMRk/8wS_eae8DxY/s320/DSC03676-712181.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666280397725377458" /&gt;&lt;/a&gt;&lt;/p&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-8738442930054806991?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/8738442930054806991/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=8738442930054806991' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/8738442930054806991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/8738442930054806991'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/10/acmicpc-4.html' title='回顾大连ACMICPC之行 照片 4'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-zud55lqiLRs/TqKr8r8CcxI/AAAAAAAAMOs/trsJ0ZVxenQ/s72-c/DSC03687-798487.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-5505072713153032577</id><published>2011-10-22T19:33:00.000+08:00</published><updated>2011-10-22T19:39:32.113+08:00</updated><title type='text'>回顾大连ACMICPC之行 照片 3</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-uIOP_-bzTos/TqKrdD8QZ5I/AAAAAAAAMLQ/8JMaQDgJ0BU/s1600/DSC03742-772114.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-uIOP_-bzTos/TqKrdD8QZ5I/AAAAAAAAMLQ/8JMaQDgJ0BU/s320/DSC03742-772114.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666279796948101010" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-94ywCUALZvs/TqKrd45FTmI/AAAAAAAAMLg/0ho65rOj3g4/s1600/DSC03744-775582.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-94ywCUALZvs/TqKrd45FTmI/AAAAAAAAMLg/0ho65rOj3g4/s320/DSC03744-775582.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666279811161869922" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-ZYw6YdSnFwc/TqKreT0TLKI/AAAAAAAAMME/HU9brK1AovU/s1600/DSC03745-776962.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-ZYw6YdSnFwc/TqKreT0TLKI/AAAAAAAAMME/HU9brK1AovU/s320/DSC03745-776962.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666279818389564578" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-7ZKCRg5_Nsk/TqKrfMdPqoI/AAAAAAAAMMk/gxSNArEycUg/s1600/DSC03751-780412.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/-7ZKCRg5_Nsk/TqKrfMdPqoI/AAAAAAAAMMk/gxSNArEycUg/s320/DSC03751-780412.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666279833593686658" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://2.bp.blogspot.com/-rLPl7Ry7ATI/TqKrfwp-yFI/AAAAAAAAMMw/vwxswJAQZI4/s1600/DSC03721-783178.JPG"&gt;&lt;img src="http://2.bp.blogspot.com/-rLPl7Ry7ATI/TqKrfwp-yFI/AAAAAAAAMMw/vwxswJAQZI4/s320/DSC03721-783178.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666279843310782546" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-HScMtD9466c/TqKrgQ8XEbI/AAAAAAAAMNM/JiPBhiHpGLA/s1600/DSC03724-784844.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-HScMtD9466c/TqKrgQ8XEbI/AAAAAAAAMNM/JiPBhiHpGLA/s320/DSC03724-784844.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666279851977806258" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-RYkPKeY3zVc/TqKrhJ3XMYI/AAAAAAAAMNY/5gFMnhwoqrE/s1600/DSC03727-788666.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/-RYkPKeY3zVc/TqKrhJ3XMYI/AAAAAAAAMNY/5gFMnhwoqrE/s320/DSC03727-788666.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666279867257663874" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/-MeG24S2E_cY/TqKrhtSYGrI/AAAAAAAAMNk/iEr9SdNSqdI/s1600/DSC03728-790016.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/-MeG24S2E_cY/TqKrhtSYGrI/AAAAAAAAMNk/iEr9SdNSqdI/s320/DSC03728-790016.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666279876766210738" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-IM4oGKaToC0/TqKriP1groI/AAAAAAAAMNw/KVicLEZ7iGE/s1600/DSC03729-792167.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-IM4oGKaToC0/TqKriP1groI/AAAAAAAAMNw/KVicLEZ7iGE/s320/DSC03729-792167.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666279886040379010" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/-9Pd2jxF1ohA/TqKric2pgCI/AAAAAAAAMN4/_HwyX_zUAoM/s1600/DSC03684-793508.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/-9Pd2jxF1ohA/TqKric2pgCI/AAAAAAAAMN4/_HwyX_zUAoM/s320/DSC03684-793508.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666279889534812194" /&gt;&lt;/a&gt;&lt;/p&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-5505072713153032577?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/5505072713153032577/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=5505072713153032577' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/5505072713153032577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/5505072713153032577'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/10/acmicpc-3.html' title='回顾大连ACMICPC之行 照片 3'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-uIOP_-bzTos/TqKrdD8QZ5I/AAAAAAAAMLQ/8JMaQDgJ0BU/s72-c/DSC03742-772114.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-3058605885979557970</id><published>2011-10-22T19:32:00.001+08:00</published><updated>2011-10-22T19:37:35.519+08:00</updated><title type='text'>回顾大连ACMICPC之行 照片 2</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://2.bp.blogspot.com/-DfQAP61oFmg/TqKq_zRKbJI/AAAAAAAAMGI/XlRafZfvG1Y/s1600/DSC03768-755519.JPG"&gt;&lt;img src="http://2.bp.blogspot.com/-DfQAP61oFmg/TqKq_zRKbJI/AAAAAAAAMGI/XlRafZfvG1Y/s320/DSC03768-755519.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666279294256180370" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://2.bp.blogspot.com/-v7fn6CunLqI/TqKrAR54iFI/AAAAAAAAMGc/t-R3sP7mpHU/s1600/DSC03831-756815.JPG"&gt;&lt;img src="http://2.bp.blogspot.com/-v7fn6CunLqI/TqKrAR54iFI/AAAAAAAAMGc/t-R3sP7mpHU/s320/DSC03831-756815.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666279302480037970" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-7tXH2jrEQa4/TqKrAnhOb2I/AAAAAAAAMGw/-3-du33HnxE/s1600/DSC03832-758324.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-7tXH2jrEQa4/TqKrAnhOb2I/AAAAAAAAMGw/-3-du33HnxE/s320/DSC03832-758324.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666279308282195810" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-1pTT_FIobzQ/TqKrBIBoYrI/AAAAAAAAMHI/nlA_FM4Q4lM/s1600/DSC03837-759522.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-1pTT_FIobzQ/TqKrBIBoYrI/AAAAAAAAMHI/nlA_FM4Q4lM/s320/DSC03837-759522.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666279317008048818" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-dR9hzDyP9BQ/TqKrBRhDRpI/AAAAAAAAMIA/Vded3vIVdUU/s1600/DSC03852-761760.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-dR9hzDyP9BQ/TqKrBRhDRpI/AAAAAAAAMIA/Vded3vIVdUU/s320/DSC03852-761760.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666279319555753618" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-EwkpelFX0V0/TqKrC22hL2I/AAAAAAAAMIM/ThPvSTSrPsE/s1600/DSC03752-766874.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-EwkpelFX0V0/TqKrC22hL2I/AAAAAAAAMIM/ThPvSTSrPsE/s320/DSC03752-766874.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666279346757775202" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-LM-R_8xp0J4/TqKrDHsvVQI/AAAAAAAAMIg/0tCEFILT_R0/s1600/DSC03757-767914.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/-LM-R_8xp0J4/TqKrDHsvVQI/AAAAAAAAMIg/0tCEFILT_R0/s320/DSC03757-767914.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666279351280162050" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-Q0rECBiwMRE/TqKrDZBardI/AAAAAAAAMI8/IbN9mqTrP6Q/s1600/DSC03760-769169.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/-Q0rECBiwMRE/TqKrDZBardI/AAAAAAAAMI8/IbN9mqTrP6Q/s320/DSC03760-769169.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666279355930291666" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-dIH0eI3R3uA/TqKrD-kVjYI/AAAAAAAAMJY/k9fPfzz7ASM/s1600/DSC03765-771131.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-dIH0eI3R3uA/TqKrD-kVjYI/AAAAAAAAMJY/k9fPfzz7ASM/s320/DSC03765-771131.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666279366008868226" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://2.bp.blogspot.com/-yTHJ2nHnDHw/TqKrERgAbGI/AAAAAAAAMJo/O2RKNomseiA/s1600/DSC03734-773049.JPG"&gt;&lt;img src="http://2.bp.blogspot.com/-yTHJ2nHnDHw/TqKrERgAbGI/AAAAAAAAMJo/O2RKNomseiA/s320/DSC03734-773049.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666279371090979938" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://2.bp.blogspot.com/-WiOPBwIoAHk/TqKrExIaqII/AAAAAAAAMJ0/6fpWDPUXDNs/s1600/DSC03736-775023.JPG"&gt;&lt;img src="http://2.bp.blogspot.com/-WiOPBwIoAHk/TqKrExIaqII/AAAAAAAAMJ0/6fpWDPUXDNs/s320/DSC03736-775023.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666279379581970562" /&gt;&lt;/a&gt;&lt;/p&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-3058605885979557970?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/3058605885979557970/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=3058605885979557970' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/3058605885979557970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/3058605885979557970'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/10/acmicpc-2.html' title='回顾大连ACMICPC之行 照片 2'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-DfQAP61oFmg/TqKq_zRKbJI/AAAAAAAAMGI/XlRafZfvG1Y/s72-c/DSC03768-755519.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-7867606587765487186</id><published>2011-10-22T19:32:00.000+08:00</published><updated>2011-10-22T19:35:32.314+08:00</updated><title type='text'>回顾大连ACMICPC之行 照片 1</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://2.bp.blogspot.com/-90DXlD22zw4/TqKqhDWB-qI/AAAAAAAAMDI/GVskK_7diMY/s1600/DSC04006-732315.JPG"&gt;&lt;img src="http://2.bp.blogspot.com/-90DXlD22zw4/TqKqhDWB-qI/AAAAAAAAMDI/GVskK_7diMY/s320/DSC04006-732315.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666278765995621026" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-SPGH8r9g7l8/TqKqis_COfI/AAAAAAAAMD4/GRkITWmTbUU/s1600/DSC03941-738048.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-SPGH8r9g7l8/TqKqis_COfI/AAAAAAAAMD4/GRkITWmTbUU/s320/DSC03941-738048.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666278794353326578" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/-wmLy2WqT4sY/TqKqjeQh3pI/AAAAAAAAMEI/Kz3cw6MpmSA/s1600/DSC03982-741409.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/-wmLy2WqT4sY/TqKqjeQh3pI/AAAAAAAAMEI/Kz3cw6MpmSA/s320/DSC03982-741409.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666278807580040850" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/-hYMwgk-q9G0/TqKqkLXO0wI/AAAAAAAAMEU/ONmwC2mLRXo/s1600/DSC03984-744443.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/-hYMwgk-q9G0/TqKqkLXO0wI/AAAAAAAAMEU/ONmwC2mLRXo/s320/DSC03984-744443.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666278819687748354" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/-eLswZdefD4A/TqKqkwQrmII/AAAAAAAAMEg/_I0qHjwu09g/s1600/DSC03855-746828.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/-eLswZdefD4A/TqKqkwQrmII/AAAAAAAAMEg/_I0qHjwu09g/s320/DSC03855-746828.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666278829592385666" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://2.bp.blogspot.com/-pgkEHvxOPxk/TqKqlGxxviI/AAAAAAAAMEs/z620_VBhN4w/s1600/DSC03858-748097.JPG"&gt;&lt;img src="http://2.bp.blogspot.com/-pgkEHvxOPxk/TqKqlGxxviI/AAAAAAAAMEs/z620_VBhN4w/s320/DSC03858-748097.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666278835636780578" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-MotSBubIACA/TqKqmDvDZLI/AAAAAAAAME4/SYlXWAaSCZE/s1600/DSC03859-752164.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/-MotSBubIACA/TqKqmDvDZLI/AAAAAAAAME4/SYlXWAaSCZE/s320/DSC03859-752164.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666278851999917234" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-FKBYyqMh3yc/TqKqmb3PK9I/AAAAAAAAMFE/e6hGkWw802k/s1600/DSC03868-753101.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-FKBYyqMh3yc/TqKqmb3PK9I/AAAAAAAAMFE/e6hGkWw802k/s320/DSC03868-753101.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666278858476694482" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/-iCAWAz9i3Qc/TqKqmmdIlUI/AAAAAAAAMFQ/aJeTLxMHcXA/s1600/DSC03907-754591.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/-iCAWAz9i3Qc/TqKqmmdIlUI/AAAAAAAAMFQ/aJeTLxMHcXA/s320/DSC03907-754591.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666278861320000834" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-ugiQjx2I87g/TqKqnQnCZkI/AAAAAAAAMFc/Vs8w7RXjR74/s1600/DSC03923-757001.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/-ugiQjx2I87g/TqKqnQnCZkI/AAAAAAAAMFc/Vs8w7RXjR74/s320/DSC03923-757001.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5666278872635827778" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-7867606587765487186?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/7867606587765487186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=7867606587765487186' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/7867606587765487186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/7867606587765487186'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/10/acmicpc-1.html' title='回顾大连ACMICPC之行 照片 1'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-90DXlD22zw4/TqKqhDWB-qI/AAAAAAAAMDI/GVskK_7diMY/s72-c/DSC04006-732315.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-126508728833648076</id><published>2011-10-18T22:45:00.000+08:00</published><updated>2011-10-18T22:46:20.700+08:00</updated><title type='text'>pic</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/-U8VfNYgBcMM/Tp2RPqu1HgI/AAAAAAAAMBs/RFWL_xpjtSE/s1600/IMG_7300-780701.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/-U8VfNYgBcMM/Tp2RPqu1HgI/AAAAAAAAMBs/RFWL_xpjtSE/s320/IMG_7300-780701.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5664843604656725506" /&gt;&lt;/a&gt;&lt;/p&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-126508728833648076?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/126508728833648076/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=126508728833648076' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/126508728833648076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/126508728833648076'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/10/pic.html' title='pic'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-U8VfNYgBcMM/Tp2RPqu1HgI/AAAAAAAAMBs/RFWL_xpjtSE/s72-c/IMG_7300-780701.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-36780733937654779</id><published>2011-10-17T22:19:00.001+08:00</published><updated>2011-10-17T22:19:56.390+08:00</updated><title type='text'>工程训练到底应该是什么样的</title><content type='html'>工程训练到底应该是什么样的&lt;p&gt;工程训练到底应该是什么样的，很多人很多时间都在讨论这个问题。当大家终于&lt;br&gt;承认计算机学科首先是工程学科的时候--或者说比如偶像这样的科学家也认同科&lt;br&gt;研中的学生必须具备一定的编码能力的时候--也许，我们还需要讨论一下计算机&lt;br&gt;科学中的工程训练应该是什么样的。&lt;p&gt;Brooks是位大牛，他主持了IBM的360系统，该系统与后来我国的360没啥关系；&lt;br&gt;他还写了软件工程领域的著作，《人月神话》，让很多管理者的梦想破灭了。&lt;p&gt;他对于计算机学科的工程训练是这样说的：&lt;p&gt;很多学院派教育的弱点在于它们对授课和阅读的依赖，而不是相反地依赖批判实&lt;br&gt;践（critiqued practice）。有效地教育&amp;quot;设计&amp;quot;的方法是这样的，要求学员以学&lt;br&gt;徒的身份，按克雷计算机的风格设计一个受到很好约束的计算机体系，谱写一首&lt;br&gt;巴赫风格的赋格曲，或者设计一座Wren风格的建筑。然后知识渊博和目光敏锐的&lt;br&gt;导师指出其中风格不符之处，并评论该设计在总体上优秀地符合了约束目标的要&lt;br&gt;求。&lt;p&gt;语出[Brooks：设计原本（英文版），机械工业出版社，第245页]&lt;p&gt;我想，好多人马上会感慨，到底是MIT到底是斯坦福到底是GOOGLE到底是IBM，然&lt;br&gt;后说我们啥时候会有这样的训练呢？&lt;p&gt;这和国足……对不起，跑题了。&lt;p&gt;1.我们也可以有这样的训练。所有的国外优秀教材，在网上几乎都能找到盗版，如&lt;br&gt;果你真的特别特别缺钱的话。这些优秀的教材，每个人都可以看，因为既不涉及&lt;br&gt;政治，也不涉及他国机密，完全没有审查和禁止。所以，这方面的借口不找也罢。&lt;p&gt;但是，我们没有去读。&lt;p&gt;几年前，我对学生们说：&amp;quot;面对问题，你们不要就跑到QQ上找个同学问，然后整出&lt;br&gt;份答案来。&amp;quot;现在我才发现，那真是黄金时代啊，现在的同学甚至不跑到QQ上去&lt;br&gt;问同学了，他们更倾向于说：抱歉，我整不出来。&lt;p&gt;几年前，我对学生们说：&amp;quot;千万别去看看那些7天21天精通啥啥，那是不可能的。&lt;br&gt;&amp;quot;现在我才发现，那真是黄金时代啊，现在的同学甚至连这些也不看了，他们更喜&lt;br&gt;欢百度5分钟就能读完就能试试的贴子--然后破口大骂说根本不好使，扔到一边。&lt;p&gt;评论一个贴子好不好使，你得先读懂贴子里的术语。如果贴子没有使用术语，而&lt;br&gt;用正常人类就能读懂的话写的，那一定不是给工程师看的。术语使我们精确。而&lt;br&gt;精确在工程中至关重要，重要到如果不能精确表达，就什么也没有了。&lt;p&gt;请对比下面这两段话：&lt;p&gt;- 化学系北面,排球场南面,北苑的西面?&lt;p&gt;- 这是化学学院前面，地理学院后面，从这张凳子看过去有学生打球的是北苑旁&lt;br&gt;边的排球场&lt;p&gt;易读性适合人类，精确适合工程师。如果你想找个人聊天，当然易读性很重要，&lt;br&gt;如果你想做工程，精确必不可少。不幸的是，没人付我们钱跟我们聊天，想挣钱&lt;br&gt;只能设计东西。因此，你只能忍受这种非人性的表达方法，因为这是用来指导你&lt;br&gt;工程的指南。&lt;p&gt;所以，你必须先学会那些术语，然后再去看那些快餐贴子。术语的解释在手册里&lt;br&gt;都有，有时你看完手册，快餐贴子已经不必再看了。&lt;p&gt;手册比贴子长很多，也枯燥很多，但是工具为什么非要闪闪发光呢？当然，为了&lt;br&gt;你能喜欢它。又一个不幸，如果你不喜欢乌突突的工具的话，不是工具不适合&lt;br&gt;你，而是你不适合工程。&lt;p&gt;2. 设计一个微小的计算机体系，是件非常令人向往和投入的事情，但是你首先要&lt;br&gt;读懂一些东西；设计巴赫风格的赋格曲，一定也令人向往和有成就感，但是我们&lt;br&gt;得先了解乐理、赋格曲等等一大堆东西。&lt;p&gt;没有这些坚持，自我设计学习路线，就没有后面的收获。而很多人，如同建一所&lt;br&gt;说，更喜欢观摩，而且仅仅是观摩。&lt;p&gt;他们说：我特别特别想来学习一下。&lt;p&gt;他们说：我特别特别想参与工程，想得到指到。&lt;p&gt;他们说： ……&lt;p&gt;其实，他们什么也不必说，他们只需要投入时间。是语言还是行动，能够检验一&lt;br&gt;个人到底爱不爱你？那么，是语言还是行动，能够检验你爱不爱工程？&lt;p&gt;如果你骗了工程，正如你骗了你的朋友，当你需要他的时候，他也只来观摩，并&lt;br&gt;对你寄予无限同情。&lt;p&gt;3. 有人会问，我想试试某个技术某个实验，我应该从哪里入手呢？&lt;p&gt;其实答案非常简单，从这里。你要做的就是坐下来，开始写代码，然后发现不&lt;br&gt;行，当然，不行是正常的，然后修改你的设计修改你的代码，直到今天晚上熄灯。&lt;p&gt;还有很多问题没有解决，怎么办？写在纸上，把你的问题拉个单子，明天继续。&lt;br&gt;不要把那些你看了1眼，思考不到5分钟的问题扔给别人。你提的问题标明了你的&lt;br&gt;价值。思考5分钟的意思是，坐在这里，只想着这个问题，不考虑任何其他的东&lt;br&gt;西--人人，QQ，你这个月还剩多少钱可以买几根哈根达斯。思考的投入，如同你&lt;br&gt;对一个女孩说，你在想她，这个时候你应该没有在想着别人。&lt;p&gt;在你尝试解决这个问题的过程中，你进步了。而且唯有如此，你才能进步。观摩&lt;br&gt;不会有任何收益，此事只能躬亲。&lt;p&gt;写作，演讲，音乐，美术，游泳，自行车，打架，编码，莫不如此。对了，为了&lt;br&gt;你容易理解，还有恋爱，也是这样。&lt;p&gt;有人做过比喻，非常精妙。学习就像在体育馆里练肌肉。从来也没有一种方法，&lt;br&gt;能够让被动动作的那些人长出肌肉来--只有主动地努力才会有效果。通常，主动&lt;br&gt;的努力以后，你自然会知道应该如何去做，也会知道应该问谁问什么问题。&lt;p&gt;4. 如果你做不到呢？如果你不能坚持呢？&lt;p&gt;其实答案也很简单。这个世界并非只有程序员这一个职业。并非如马利同学引用&lt;br&gt;的，必须会修灯泡的才是男人，那些管理者，能以各种手段赚钱的，也都是男&lt;br&gt;人，只要他们的女人承认那是男人即可，有很多女人并不那么介意你的收入来源。&lt;br&gt;更何况那也是合法的。&lt;p&gt;金庸先生说，&amp;quot;那些都是很好很好的，可是我偏不喜欢，有什么法子呢。&amp;quot;&lt;p&gt;如果不喜欢，即使导师为你设计了Cray计算机的题目，你也会希望观摩导师或者&lt;br&gt;师兄完成。这就像看别人练肌肉谈恋爱，你能有什么快乐呢。&lt;p&gt;所以，我想说的中心意思是，如果你不喜欢工程，为什么还要做它？&lt;p&gt;去做你喜欢的事吧。&lt;p&gt;&lt;br&gt;5. 补充的&lt;p&gt;有人会说，我喜欢足球啊，我喜欢篮球啊，我喜欢化妆，我喜欢美食。可是，我&lt;br&gt;得挣钱呐，所以不得不做工程。&lt;p&gt;是这样的，如果你喜欢的东西却不能给你带来价值，说明或者你喜欢的程度不&lt;br&gt;够，或者你付出的代价不够，或者，你非常不愿望承认的，你的天资不够。&lt;p&gt;因此，你不能以你的爱好养活自己。那么，怎么办呢？&lt;p&gt;如果你能够养活自己了，在此基础上，你可以花费任意多的时间在你的爱好上。&lt;br&gt;如果你不能够养活自己呢？&lt;p&gt;其实答案也非常简单。&lt;p&gt;如果在你小学的时候，你今天拿到了非常喜欢的游戏，可是又有作业明天一定要&lt;br&gt;交，二者不可兼得。怎么办？有以下选项，你看看：&lt;p&gt;- 完成作业&lt;p&gt;- 打游戏&lt;p&gt;好了，估计你已经选完了。现在，少年，不是忧伤的时间了，去执行你所选择&lt;br&gt;的，然后，勇敢或快乐地去迎接后果吧。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-36780733937654779?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/36780733937654779/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=36780733937654779' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/36780733937654779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/36780733937654779'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/10/blog-post_17.html' title='工程训练到底应该是什么样的'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-6492894607423271942</id><published>2011-10-17T00:02:00.001+08:00</published><updated>2011-10-17T00:02:55.827+08:00</updated><title type='text'>pics</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://2.bp.blogspot.com/-ylp0uV9csig/TpsAMH0A3oI/AAAAAAAAL_A/NOPksDF9Oco/s1600/IMG_7298-775827.JPG"&gt;&lt;img src="http://2.bp.blogspot.com/-ylp0uV9csig/TpsAMH0A3oI/AAAAAAAAL_A/NOPksDF9Oco/s320/IMG_7298-775827.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5664121164604169858" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://2.bp.blogspot.com/-wjPR810Mv0Q/TpsAMTpnr0I/AAAAAAAAL_M/egN19OcwYRM/s1600/IMG_7295-777255.JPG"&gt;&lt;img src="http://2.bp.blogspot.com/-wjPR810Mv0Q/TpsAMTpnr0I/AAAAAAAAL_M/egN19OcwYRM/s320/IMG_7295-777255.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5664121167781801794" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-SosFWXtgeFA/TpsAMmeAgFI/AAAAAAAAL_U/ilU9asks0AY/s1600/IMG_7279-778663.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/-SosFWXtgeFA/TpsAMmeAgFI/AAAAAAAAL_U/ilU9asks0AY/s320/IMG_7279-778663.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5664121172833370194" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-IDS_hAKZcq0/TpsAM9FTD2I/AAAAAAAAL_k/3UeMO3LX8C0/s1600/20111016-779533.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/-IDS_hAKZcq0/TpsAM9FTD2I/AAAAAAAAL_k/3UeMO3LX8C0/s320/20111016-779533.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5664121178903744354" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/-T_gRTN6rg4I/TpsANcJ4-HI/AAAAAAAAL_s/O-tzm3mDIhQ/s1600/IMG_7293-781213.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/-T_gRTN6rg4I/TpsANcJ4-HI/AAAAAAAAL_s/O-tzm3mDIhQ/s320/IMG_7293-781213.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5664121187244505202" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-YsCnMmUJf2o/TpsANpYZF3I/AAAAAAAAMAY/nD8l1QuZTaQ/s1600/IMG_7294-782111.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-YsCnMmUJf2o/TpsANpYZF3I/AAAAAAAAMAY/nD8l1QuZTaQ/s320/IMG_7294-782111.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5664121190794991474" /&gt;&lt;/a&gt;&lt;/p&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-6492894607423271942?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/6492894607423271942/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=6492894607423271942' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/6492894607423271942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/6492894607423271942'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/10/pics_17.html' title='pics'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-ylp0uV9csig/TpsAMH0A3oI/AAAAAAAAL_A/NOPksDF9Oco/s72-c/IMG_7298-775827.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-1339135149221166395</id><published>2011-10-13T16:22:00.001+08:00</published><updated>2011-10-13T16:22:26.349+08:00</updated><title type='text'>降落伞原则</title><content type='html'>降落伞原则&lt;p&gt;一&lt;p&gt;有个降落伞原则，非常简单，最开始可能来自爱情心灵鸡汤之类的。&lt;p&gt;原则说：当我需要你的时候，就像降落伞，如果你不能及时出现，你就永远也不&lt;br&gt;必出现了。因为我死了。&lt;p&gt;在项目中，也是这样的。不能及时完成任务，或者不能及时报告任务不能完成，&lt;br&gt;你认为自己还有多么靠谱。&lt;p&gt;看小牛同学引的孙同学的状态，找弹乐器的作男/女朋友最好了，因为他们靠谱。&lt;br&gt;什么是靠谱？就是在指定的时间完成指定的行为。如果音符不能在指定时间响起&lt;br&gt;来，你即使能把整首曲子的音符一个接一个弹出来，那又是个什么玩意。&lt;p&gt;以后你会知道，时间就是一切力不能及的痛苦的根源。&lt;p&gt;二&lt;p&gt;对于各位研一同学对&amp;quot;各位同学,请改约张健学长把git整好.&amp;quot;的理解，我补充以下解释。&lt;p&gt;1. &amp;gt;以前看到通知以为git是让大二的同学去，与研一无关，理解错了，是我的原因，非常抱歉。&lt;p&gt;原文中的&amp;quot;各位同学&amp;quot;并无暗示不包括研一的同学。且在此前的离线电驴jsp讨论&lt;br&gt;中，我提到：代码暂时由大二同学提交，研一的同学跟大二的同学学习git的使用。&lt;p&gt;我之所以改为请各位联系张健学生，是顾及到各位的自尊心，猜测研一的同学向&lt;br&gt;大二同学请教可能会觉得受了伤害，我完全没有想到向学长请教似乎也伤害你的&lt;br&gt;自尊心。&lt;p&gt;2. &amp;gt;之前的那封邮件我以为不用回，是我的错误&lt;p&gt;这一点你没有任何错误，因为那封邮件确实不必回复。它要求的是你约张健学生&lt;br&gt;把git整好，而不是回复邮件。&lt;p&gt;3. &amp;gt;并未以为&amp;quot;把git整好&amp;quot;是对研一同学&lt;p&gt;参见上文中的1。我要补充的是，即使并不&amp;quot;针对&amp;quot;研一同学，但也并未提到不包括&lt;br&gt;研一同学。换句话说，你认为不只针对研一同学的，就不必完成了；还是研究生&lt;br&gt;同学不是&amp;quot;同学&amp;quot;了。&lt;p&gt;4. &amp;gt;约张健学长学习git这件事是我忘了&lt;p&gt;这是唯一我能接受的解释，谢谢你的坦诚。&lt;p&gt;5. &amp;gt;这次是我们没有读好你发的邮件 所以耽搁了时间&lt;p&gt;真的，你让我怀疑自己的汉语能力了。一直以来，有人指责我语法和用词晦&lt;br&gt;涩，但是尚无人指出我语义含糊。&lt;p&gt;其实，你可以指责我用语不规范，完全不懂什么是 把git&amp;quot;整&amp;quot;好。那样我只能源&lt;br&gt;引以前布置过两次的任务你没有完成，而不能就那封邮件的效果做任何评论。&lt;p&gt;三&lt;p&gt;我们在一起学习和工作，你的动机是完成研究生期间的训练，我的动机是完成单&lt;br&gt;位交给我的的教学和科研任务。我们不是兴趣或者感情而合作。&lt;p&gt;既然你希望完成训练，那么需要知道，所有的训练，都是有起点的。就像初中生&lt;br&gt;必须先掌握汉语，然后才能学习几何和代数--这一类比并无蔑视之意。按时完成&lt;br&gt;任务或者报告任务不能完成，是基本素养，是我们训练的起点。&lt;p&gt;在教导你使用git的过程中，张健学长并不领取任何报酬，希望你能感谢他。他按&lt;br&gt;我约定的时间等候你，你没有出现，希望你能内疚并向他表示歉意。&lt;p&gt;不必对我有任何报歉，我身为教师，明确对你告之训练的起点、方法和评价你训&lt;br&gt;练的结果是我的责任。正如计算机学院和研究生院也会评价我训练的效果--是&lt;br&gt;的，我是在暗示你，你有投诉的权利，并且暗示你投诉的渠道。&lt;p&gt;四&lt;p&gt;就你在完成项目中所受到的训练这一角度而言，项目是你的，不是我的。所以，&lt;br&gt;你可以选择不完成分配给你的任何任务，这是你理性的自由的选择。我只是会通&lt;br&gt;知你我的做法，而不是对你表达不满。&lt;p&gt;我之所以关心项目完成质量和进度的原因，是因为我还要为更多的将来的同学创&lt;br&gt;造完成更好的项目的机会。如上所述，身为教师，这是我的责任。如果你的做法&lt;br&gt;令我认为影响到我的责任--比如你对自己的任务没有足够负责的态度--我会把这&lt;br&gt;一影响造成的损失尽可能降低，最直接有效的做法是停止你参与这一项目。至于&lt;br&gt;你对自己的任务没有足够负责的态度，对于你个人的人生的影响，我认为那是你&lt;br&gt;理性的、未在他人强迫下做出的选择，那是你自己的人生，我尊重你的选择。&lt;p&gt;关于对你的选择的尊重，还出于这样一个理由：我对于我们的项目组及项目有多&lt;br&gt;么优秀并无足够的信心，所以你可能注意到我从来没有向你们吹嘘过这些。也&lt;br&gt;许，选择别的道路对你而言更好。我个人如此失败，怎么可能会认为如何如何要&lt;br&gt;求你，就能确保你有一个光明的未来呢。&lt;p&gt;五&lt;p&gt;解释最后一个问题。为什么我在上一封信中，没有要求本科二年级的同学做出解&lt;br&gt;释，而只要求研一的同学做出解释。那是因为我认为研一的同学更成熟和应该拥&lt;br&gt;有更强的责任心，因此对你的失望更强一些。本科二年级的同学，仍然有漫长的&lt;br&gt;路要走，还有很多小的挫折和严格训练等着他们。而你要知道，就像压腿这种体&lt;br&gt;育训练，开始的越晚，你的痛苦越大，代价也越大。希望，现在你的痛苦来得还&lt;br&gt;算及时。&lt;p&gt;真正的人生，不是玩乐，早就开始了，你可能还没有注意到。这算是我对你大喊&lt;br&gt;了一声。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-1339135149221166395?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/1339135149221166395/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=1339135149221166395' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/1339135149221166395'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/1339135149221166395'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/10/blog-post_13.html' title='降落伞原则'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-4939815379185296120</id><published>2011-10-11T22:39:00.001+08:00</published><updated>2011-10-11T22:39:27.393+08:00</updated><title type='text'>中国足球运动员当然有资格泡妞和逛夜店</title><content type='html'>中国足球运动员当然有资格泡妞和逛夜店&lt;p&gt;0. 今夜有人不眠，因为中国足球又和某个西亚国家对垒了。原本我不知道这个消&lt;br&gt;息，后来看到有同学在网上破口大骂，结合上下文，猜是这样。&lt;p&gt;很多人很多次在很多贴子里痛骂过，就你们这样的，有什么资格泡妞，有什么资&lt;br&gt;格逛夜店，有什么资格...成为中国人类。&lt;p&gt;其实他们有资格的。论证如下。为减少打字起见，下文中的中国足球运动员将简&lt;br&gt;称为Q。&lt;p&gt;在小资产阶级看来，泡妞和逛夜店都是神圣的天赋人权的一部分，尤其对于他们&lt;br&gt;自己来说，更是这样。推而广之，别人有时候，也可以有这样的权利。&lt;p&gt;那么为什么我们一般地认同Q没有资格行使这一神圣的权利呢？&lt;p&gt;1.有些人认为，Q没有很好地代表中国，尤其是没有很好地代表中国男人。可是，&lt;br&gt;为什么我们乐于接受这样的观点：我们应该/能够被另一些人代表呢？他们凭什&lt;br&gt;么就能代表你呢，天赋神权？&lt;p&gt;我们还存在这样的看法：被这样无耻等等的人代表，真是可耻啊。我们更乐于被&lt;br&gt;牛得多的人代表。比如，我们愿意被邓亚萍代表，那显得我们很有智慧和拼劲，&lt;br&gt;我们也愿意被乔布斯代表，那显得我们有创意，我们还愿意被Linux或者啥的代&lt;br&gt;表，好显得我们很Geek，这个词的意思是智力过剩需要找渠道发泄。&lt;p&gt;我们为什么需要别人代表，是因为我们自己长得不够有代表性么。&lt;p&gt;2. Q能代表你的体质和精神么。一定程度上说，能。&lt;p&gt;Q的体质比你好得多。12分钟跑还是什么跑，估计你只能看到烟尘，对大多数同&lt;br&gt;学而言。&lt;p&gt;肯定有人站起来抗议，Q是专门搞体育的，那是他们的工作，我怎么能跟他们比&lt;br&gt;呢。&lt;p&gt;好吧。你不是专业运动员。但是，你总归得有个专业吧。我们在自己的专业上做&lt;br&gt;得比Q在自己的专业上做得好一些？&lt;p&gt;我想最主要的区别可能在于 我们没有在大众面前丢人现眼吧。&lt;p&gt;《菊花与刀》和单位日本旅游的时候的二鬼子导游都说过：日本是耻感文化，与&lt;br&gt;西方的罪文化相对应。即日本人做坏事，只要你看不到，就没事啦。&lt;p&gt;注：二鬼子导游是中国人，这是她的绰号，不是民族。我此处使用这个词也并不&lt;br&gt;包含对某些种族的歧视意味。二战时期一些人的做法也不能代表--如我在上面提&lt;br&gt;到的代表--另一些人和他们的后代。&lt;p&gt;这段注有点长，再复习一次上面的话，&amp;quot;我想最主要的区别可能在于 我们没有在&lt;br&gt;大众面前丢人现眼吧。&amp;quot;这跟鬼子的道德观有什么区别。&lt;p&gt;3. 以我们自己工作的优秀程度来年，我们不仅没有资格对Q泡妞和逛夜店指指点&lt;br&gt;点，恐怕连我们自己行使这些神圣权利的资格都令人怀疑。&lt;p&gt;我们坐在看台上，坐在电视机和pplive前，坐在冰可乐和啤酒前，坐在年纪轻轻&lt;br&gt;肚子溜圆的人群中，忘掉明天的工作，尤其要忘掉因为明天工作糟烂而被训得面&lt;br&gt;红耳赤，指点一群体力远胜于我们，精神与我们一致的人奔跑。&lt;p&gt;他们、的确、代表了我们。&lt;p&gt;当然，这是我们应有的享乐的时光。当然，他们也是在这样的时光中，而不是在&lt;br&gt;草坪上--输掉比赛的。&lt;p&gt;我们也是。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-4939815379185296120?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/4939815379185296120/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=4939815379185296120' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/4939815379185296120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/4939815379185296120'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/10/blog-post_11.html' title='中国足球运动员当然有资格泡妞和逛夜店'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-4870043791491562653</id><published>2011-10-11T21:35:00.001+08:00</published><updated>2011-10-11T21:35:48.454+08:00</updated><title type='text'>pics</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://3.bp.blogspot.com/-m_9JEm--rnk/TpRGNVtjoVI/AAAAAAAAL94/EOu_w5x_UVE/s1600/IMG_7275-748455.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/-m_9JEm--rnk/TpRGNVtjoVI/AAAAAAAAL94/EOu_w5x_UVE/s320/IMG_7275-748455.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5662227826492023122" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-8TUXX031w74/TpRGNk9wIGI/AAAAAAAAL-E/FdRJNuC0LRg/s1600/IMG_7276-749799.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-8TUXX031w74/TpRGNk9wIGI/AAAAAAAAL-E/FdRJNuC0LRg/s320/IMG_7276-749799.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5662227830586482786" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-6rn8WyHiMTU/TpRGN_Gv_eI/AAAAAAAAL-U/9O3_ZOrHC9M/s1600/IMG_7277-751432.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-6rn8WyHiMTU/TpRGN_Gv_eI/AAAAAAAAL-U/9O3_ZOrHC9M/s320/IMG_7277-751432.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5662227837603544546" /&gt;&lt;/a&gt;&lt;/p&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-4870043791491562653?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/4870043791491562653/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=4870043791491562653' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/4870043791491562653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/4870043791491562653'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/10/pics_2970.html' title='pics'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-m_9JEm--rnk/TpRGNVtjoVI/AAAAAAAAL94/EOu_w5x_UVE/s72-c/IMG_7275-748455.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-6186896301571533816</id><published>2011-10-11T21:09:00.001+08:00</published><updated>2011-10-11T21:09:17.528+08:00</updated><title type='text'>pics</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-wmUtyQphWDQ/TpQ__qgnXII/AAAAAAAAL8w/X_tVR8jL7yY/s1600/IMG_7275-757530.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/-wmUtyQphWDQ/TpQ__qgnXII/AAAAAAAAL8w/X_tVR8jL7yY/s320/IMG_7275-757530.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5662220994486951042" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-aoAKhSDB4DE/TpQ__6gOf7I/AAAAAAAAL9M/aQldg3kFlVE/s1600/IMG_7276-759065.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/-aoAKhSDB4DE/TpQ__6gOf7I/AAAAAAAAL9M/aQldg3kFlVE/s320/IMG_7276-759065.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5662220998780288946" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-yPUjYI8VYm0/TpRAASdw1UI/AAAAAAAAL9s/veHEVF9onbQ/s1600/IMG_7277-761622.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/-yPUjYI8VYm0/TpRAASdw1UI/AAAAAAAAL9s/veHEVF9onbQ/s320/IMG_7277-761622.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5662221005212407106" /&gt;&lt;/a&gt;&lt;/p&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-6186896301571533816?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/6186896301571533816/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=6186896301571533816' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/6186896301571533816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/6186896301571533816'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/10/pics_11.html' title='pics'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-wmUtyQphWDQ/TpQ__qgnXII/AAAAAAAAL8w/X_tVR8jL7yY/s72-c/IMG_7275-757530.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-3049916651523514440</id><published>2011-10-07T19:44:00.001+08:00</published><updated>2011-10-07T19:44:27.965+08:00</updated><title type='text'>对于这个世界，我们拥有什么样的权利？</title><content type='html'>&lt;div&gt;对于这个世界，我们拥有什么样的权利？&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;这个问题粗一看，回答起来挺简单的。答案可能类似于这样，&amp;quot;我想要的很简&lt;/div&gt;&lt;div&gt;单……&amp;quot;好吧，这是一个内部的经典笑话了，有些人可能不懂，我们不提。回答可&lt;/div&gt;&lt;div&gt;能是这样的：&amp;quot;只要活着就好吧，这算是非常基本的权利。&amp;quot;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;可是，一旦把这回答放在现实中，我们可能就会附加一些解释--解释权在谁手里&lt;/div&gt; &lt;div&gt;就很难说了--比如，员工认为不加班是基本的生存权利，经理认为能员工在完成&lt;/div&gt;&lt;div&gt;老板部置的任务基础上才谈得上生存权利，老师认为……学生认为……&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;所以，在汉同有定义什么是基本的权利，或者定义活着之前，讨论我们拥有什么&lt;/div&gt;&lt;div&gt;权利是没有意义的。&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;好吧，这个话题太过于抽象了，可能你已经快要睡着了。我们还是来讲两个故事&lt;/div&gt; &lt;div&gt;吧。&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;第一个故事。刚刚在楼下我看到的。一楼左边住户家的小男孩正使劲拽楼门上的&lt;/div&gt;&lt;div&gt;胶条。东北出生的同学应该知道，一楼的门是供公共进出的，且胶条对于冬天的&lt;/div&gt;&lt;div&gt;时候防寒非常重要。冬天东北会冷到什么程度呢，煤气会停，可能因为含有的微&lt;/div&gt;&lt;div&gt;小水汽凝结成了冰堵住一楼的主管道。我不至一次看到过有人用火烤煤气管道。&lt;/div&gt;&lt;div&gt;为了生存，东北人民胆子大些似乎是不可避免的。&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;该拽胶条的孩子的妈妈驻立家门口看着孩子，后来拉走了。但是，她既没有整理&lt;/div&gt;&lt;div&gt;或补偿一下胶条，也没有觉得孩子的行为有什么不好。拉走孩子的原因，更像是&lt;/div&gt;&lt;div&gt;她打算关门了。深秋温度挺低的，一直开着家门确实冷。&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;以上是第一个故事。&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;另一个故事也是这家的。几年前，我看到一楼门上贴着一个通知，上写：冬天关&lt;/div&gt; &lt;div&gt;门希望能动作轻一些，一楼听起来声音太大了。然后，我听到后面的老爷子嘭地&lt;/div&gt;&lt;div&gt;一声把门摔上了，声音巨大。那位老爷子住左边，估计通知是右边那户贴的。&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;两次我都没吱声，因为我住五楼，既冻不着我也吵不到我，煤气炼了也一定有人&lt;/div&gt;&lt;div&gt;在我之前受不了去烤。同学，你不能奢求我。&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;回到刚才的话题，我们对这个世界拥有什么样的权利。更好回答的是，对于这个&lt;/div&gt; &lt;div&gt;世界而言，哪些不是我们的权利。这容易得多。&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;凡是不是我们的东西，我们对它们都不拥有任何权利。&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;所以，如果胶条和门是公共的，你不拥有任何权利。从198X年开始，就有人讨论&lt;/div&gt;&lt;div&gt;过，公有制国家里，那些东西难道没有一份是我的么？&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;没有。&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt; &lt;div&gt;某些印弟安人的土地可能比公有制更公有一些。我们听说有些印弟安人认为：当&lt;/div&gt;&lt;div&gt;你把一块兽皮盖在一块土地上，如果你是第一个这样做的人，那么这块地就是你&lt;/div&gt;&lt;div&gt;的了。但是，且慢。这有一个前提，这块&amp;quot;你的&amp;quot;土地是不能用于赠予、继承，换&lt;/div&gt;&lt;div&gt;句话说，不能用于独占。&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;这是我说你对于社会公共资源没有权利的原因--你没有独占的权利。因此，你也&lt;/div&gt; &lt;div&gt;没有破坏的权利。你只能破坏属于你自己的东西。同理，老婆是不能打的，因为&lt;/div&gt;&lt;div&gt;她不是&amp;quot;你的&amp;quot;。同理，你也不能在赌博中把她输给别人。&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;那么，我们还可以推得非常简单的一个结论：你不能把不属于你自己的东西送给&lt;/div&gt;&lt;div&gt;别人。孩子的妈妈没有权利允许（授权）她的孩子破坏不属于自己的东西。&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;无论我有多爱你，我都不能把不属于我的东西拿来给你。&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;这是简单的原则，也是硬的原因。就如同，无论我有多爱你，我也不能把星星摘&lt;/div&gt;&lt;div&gt;下来给你。自然法则与这一法则的共通之处在于，它们都不可逾越。&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;刚刚的两个故事里，后面那一个稍微复杂一些，道理却是相通的。我们不细讨论&lt;/div&gt;&lt;div&gt;了。&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;项目经理有没有权利要求员工加班。没有。因为法律规定加班需要员工自愿，且&lt;/div&gt; &lt;div&gt;有加班费。项目经理不能以自己受到老板的压迫而不得不这样做，正如同孩子的&lt;/div&gt;&lt;div&gt;妈妈不能以孩子太任性了为由，而任由孩子破坏公共财物。&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;当你享有项目经理的权利的时候，你同时也承担着公民的职责。如果像我一样看&lt;/div&gt;&lt;div&gt;着那孩子撕胶条，我们可以类比为你放任不管别的项目经理压迫员工，但是你因&lt;/div&gt;&lt;div&gt;此而获利或者参与其中，事情的性质立即发生变化。&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;这世界上太多的权利没有说清楚。最后一个故事。&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;昨天讨论一个项目。李记者请喝的茶那是非常的苦。更苦的是，有些事情只能小&lt;/div&gt;&lt;div&gt;范围而不能在更大的范围说清楚。&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;我们谈到，做个软件，授权给某个公司使用。我们进而提到，不能给源代码。两&lt;/div&gt;&lt;div&gt;位李同学都认为这不可行，分别编了由子。一个说这软件是我们买的，没源代&lt;/div&gt; &lt;div&gt;码，一个说……跟这个也差不多。&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;我说：我们就是不想给，那不行么？我们具有这样的权利。如果他们觉得只是使&lt;/div&gt;&lt;div&gt;用还贵的话，我们就不做这笔生意呗。&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;答复是这是不行滴。不过好在，他们不用跟我讲更多的道理，因为根据分工，我&lt;/div&gt;&lt;div&gt;不没有权利过问此事。所以，我只要说 不行，至于为什么不行--因为利益，或者&lt;/div&gt; &lt;div&gt;说因为这是我们的权利，但是这些理由是不会公开的--会有人讲清楚的，用别的&lt;/div&gt;&lt;div&gt;理由。&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;有一天，我想我会对孩子说，我不能带给你月亮的原因，是我不能；我不能任由&lt;/div&gt;&lt;div&gt;你做一些事情的原因，是因为那是不应该的。能做，但是却由于人类的法则--与&lt;/div&gt;&lt;div&gt;自然法则一样无法破坏的--而不能实施。&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;我们可以一起哭，一起伤心得不得了。我们却没有法子。&lt;/div&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;因为，那些不是我们的。只要我们染指一点点，哪怕只有一点点，我们晚上就睡&lt;/div&gt;&lt;div&gt;不好觉了。&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;好吧，有些同学。我会指给你破坏规则的那条道路。不过，如果我这一次不能跟&lt;/div&gt;&lt;div&gt;你一起做坏事，请别强迫我。&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;否则，在那一瞬间，不再是我不给你面子，而是你试图攻击我的原则。&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-3049916651523514440?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/3049916651523514440/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=3049916651523514440' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/3049916651523514440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/3049916651523514440'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/10/blog-post_07.html' title='对于这个世界，我们拥有什么样的权利？'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-627783789008626525</id><published>2011-10-07T15:18:00.001+08:00</published><updated>2011-10-07T15:18:34.678+08:00</updated><title type='text'>pics</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/-50a6Dsk122E/To6ny8jRosI/AAAAAAAAL8g/bGAhKHMNmSI/s1600/IMG_1363-714679.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/-50a6Dsk122E/To6ny8jRosI/AAAAAAAAL8g/bGAhKHMNmSI/s320/IMG_1363-714679.JPG"  border="0" alt="" id="BLOGGER_PHOTO_ID_5660646275340673730" /&gt;&lt;/a&gt;&lt;/p&gt;. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-627783789008626525?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/627783789008626525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=627783789008626525' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/627783789008626525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/627783789008626525'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/10/pics_07.html' title='pics'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-50a6Dsk122E/To6ny8jRosI/AAAAAAAAL8g/bGAhKHMNmSI/s72-c/IMG_1363-714679.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-6337800656763937960</id><published>2011-10-06T23:43:00.001+08:00</published><updated>2011-10-06T23:43:24.142+08:00</updated><title type='text'>Frederick Brooks: 计算机科学家的使命是制造工具 II, 翻译全文版</title><content type='html'>Frederick Brooks: 计算机科学家的使命是制造工具 II&lt;p&gt;The Computer Scientist as Toolsmith II&lt;p&gt;翻译 杨贵福&lt;p&gt;[杨注：Brooks先生著有《人月神话》和《设计原本》，领导过IBM OS/360系统的&lt;br&gt;设计。只是为Brooks先生的睿智所倾倒，我不自量力地把这篇演说翻译为中文。&lt;br&gt;绝非谦虚，很多地方我也没有读懂，更遑论先生文笔精彩而又幽默诙谐、随手用&lt;br&gt;典。希望看到翻译有误的同学，回贴也好，开骂也好，能够让读到本文的同学们&lt;br&gt;不致被我误导。]&lt;p&gt;Fred Brooks是ACM Allen Newell奖的首位获得者。ACM Allen Newell奖每年度授&lt;br&gt;予致力沟通计算机科学与其他学科的个人。Brooks的获奖原因是他在计算机科学&lt;br&gt;与工程学科内的广泛研究，及他对生物化学的可视化方法的跨学科贡献。在这&lt;br&gt;里，我们发表他在SIGGRAPH 94会议获奖时的演讲。&lt;p&gt;Frederick Brooks: 计算机科学家是工具制造者 II&lt;p&gt;接受以Allen Newell冠名的奖项是一项殊荣。Allen是&amp;quot;计算机之父&amp;quot;之一。他作为&lt;br&gt;一位前瞻者和引路人，在把人工智能发展为一个学科分支中具有重要地位，他清&lt;br&gt;晰地阐明了人工智能的远景。&lt;p&gt;一个人的品性比他的专业工作更加重要，因此，Allen的谦虚、高贵、无私的品德&lt;br&gt;对于获奖者而言是双重的奖励。我深深地感谢评奖委员会。我不想讨论某个特别&lt;br&gt;的研究领域，而是想遵循Newell Awardr的精神，分享那些我在计算机事业中进行&lt;br&gt;了一生的谨慎思考，那些我对于这个宇宙的信念。&lt;p&gt;我第一次谈到本次演讲的标题和一些公开过的小节，是在1977年一次演讲上。让&lt;br&gt;我重申一下那些要点，既然你们中很多人那时候刚刚出生。在某段时间，计算机&lt;br&gt;图形学还是个后娘养的孩子，还有点另类。从某个角度上讲，计算机科学是致力&lt;br&gt;于解决问题的系统的学科，而在这个角度上，计算机图形学非常接近学科的核心。&lt;p&gt;- 错误命名的学科&lt;p&gt;当我们的学科初生的时候，按常例，在命名上有点混乱。在教堂山[杨注：估计指&lt;br&gt;北卡罗莱纳大学教堂山分校]，我们遵从，我相信，遵从了Allen Newell 和&lt;br&gt;Herb Simon的命名方法，称我们的系为计算机科学系。现在，得益于过了三十&lt;br&gt;年，我可以放一个马后炮，我相信我们把名字起错了。如果我们了解原理，那么&lt;br&gt;我们就可以更好地理解工艺。那么，什么是科学？&lt;p&gt;Webster词典里，科学的定义是&amp;quot;涉及观察事实和对事实分类的分支，尤其是通过&lt;br&gt;建立可检验的通用规律和量化公式的手段。&amp;quot;这非常清楚--科学是与对事实和规律&lt;br&gt;的观察有关的。一条学术专业的民间谚语说，&amp;quot;凡是称自己为科学的，都不是科学。&lt;br&gt;&amp;quot;按这一标准，物理学、化学、地质学、天文，可能都是科学；政治科学、军事科&lt;br&gt;学、社会科学，还有计算机科学，都不是科学。可能最恰当的区别是在科学与工&lt;br&gt;程学科之间。这一区别不在于参与者的活动，而在于他们的目的。高能物理学家&lt;br&gt;可能会花大部分时间建造设备；空间飞行器工程师可能要花费大部分时间研究真&lt;br&gt;空中的材料的特性。然后，科学家是为了研究而建造，工程师是为了建造而研究。&lt;p&gt;我们的学科是什么？&lt;p&gt;我提议，根据合理的标准，我们称之为计算机科学的这一学科，事实上不是科&lt;br&gt;学，而是人造的[杨注：synthetic]工程类学科。我们从事制造东西--这些东西&lt;br&gt;是计算机、算法、或者软件系统。&lt;p&gt;与其他工程学科不同，我们多数的产品都是无形的：算法、程序、软件系统。&lt;br&gt;Heinz Zemanek恰当地定义了计算机学科，&amp;quot;抽象对象的工程&amp;quot;。甚至当我们造计算&lt;br&gt;机的时候，计算机科学家们设计的也只是抽象的特性--架构和实施方案。电子工程&lt;br&gt;师，机械工程师，致冷工程师设计那些真实的实现。&lt;p&gt;与那些制造房屋、汽车、药品、服装的工程师正相反，他们是为了人类的需求和&lt;br&gt;愉悦，而我们制造的东西本身并不直接满足人们的需求，而是由他人使用这些东&lt;br&gt;西来制造出满足人们生活的东西。一句话，计算机科学家是工具制造者--即不多&lt;br&gt;也不少。这是一个光荣的称呼。&lt;p&gt;如果我们正确地认识我们的角色，那么我们可以更清晰地认识到成功的标准：工&lt;br&gt;具制造者的成功在于，也只在于，工具的用户在他的帮助下成功。不管刀刃多么&lt;br&gt;亮，刀柄有多少宝石，重量掂起来多么完美，只有切割才是真正地检验一把刀的&lt;br&gt;依据。刀匠的成功，就是他的客户死于衰老。&lt;p&gt;- 命名如何误导我们？&lt;p&gt;如果我们的学科命令错误，会怎么样呢？显然，叫做计算机科学，有一种无害的&lt;br&gt;自豪感。名字当中隐含着什么？很多。我们自己错误的命名导致了许多不好的趋&lt;br&gt;势。&lt;p&gt;首先，这暗示着我们接受这样一种地位序列，更多尊重自然科学家，而更少尊重&lt;br&gt;工程师，因此我们据此为自己谋求更高的地位。这是一种怎么的看法，因此也是&lt;br&gt;可疑的。而且，这也是一种有风险的看法；在一些自命不凡的社会&amp;quot;科学&amp;quot;的案例&lt;br&gt;中，科学这个名字恰恰是滑稽的，而且使得参与者看起来很愚蠢。更进一步的，&lt;br&gt;这一看法也并无实在用处--我们应该因技术而获得尊重，而不是头衔。&lt;p&gt;其次，科学以对事实和法律的发现作为其自身合理的终级目的。科学的成果就在&lt;br&gt;于新的事实、新的法律，正是这些值得发表。如果我们把自己同科学家混淆，我&lt;br&gt;们就会把发明（并发表）无穷无尽不同的计算机、算法、语言作为最终目的。但&lt;br&gt;是在设计工作中，与科学正相反，创新并非成果。而如果我们把我们的成果视为&lt;br&gt;工具的话，那么，我们就会以它们的实用性和代价，而不是新颖，来检验它们。&lt;p&gt;再次，我们倾向于忘记用户和他们真正的问题，只顾爬进我们的象牙塔，剖析从&lt;br&gt;那些问题中抽象出来的东西，这些抽象对我们来说更易于驾驭，而可能把真正的&lt;br&gt;问题的本质部分抛在脑后。&lt;p&gt;我们用越来越深奥的术语交谈和写作，直到连本学科的人也看不懂我们的期刊，&lt;br&gt;出版费用一再提高，而且由作者付版面费，而不是由读者花钱订阅。在经济上，&lt;br&gt;我们的写作就跟垃圾一样，生产垃圾的人要付钱，收集垃圾的人收钱。&lt;p&gt;这一该死的趋势已经诅咒了美国的数学界，它的阴影正悬在计算机科学的头上。&lt;br&gt;我们正向一种教师的职业病屈服，2000年前耶稣基督对它做过如下诊断：&amp;quot;你们&lt;br&gt;互相受荣耀[约翰福音 5:44]&amp;quot;[杨注：圣经原文的全句是，&amp;quot;你们互相受荣耀，却&lt;br&gt;不求从独一之神来的荣耀，怎能信我呢？&amp;quot;本文中此句原意是，你们渴望彼此的赞&lt;br&gt;美。]&lt;p&gt;最后，当我们对数学和抽象赞誉更多，对我们学科中的&amp;quot;科学&amp;quot;的部分赞誉更多，&lt;br&gt;而实践性的部分赞誉较少时，我们正错误地把那些年轻的杰出的思想从富于挑战&lt;br&gt;精神的躯体中引领移走，还有那些问题，那些问题正是我们独特的领域，我们正&lt;br&gt;错失本应给予这些问题有力攻击的时机。&lt;p&gt;- 学科命名中&amp;quot;计算机&amp;quot;的部分是完全正确的&lt;p&gt;有人希望我们的学科，我们的专业团体，不以一种机器命名。我认为Newell和&lt;br&gt;Simon在这一点上是完全正确的。计算机使得软件能够操控复杂性的世界，这突破&lt;br&gt;了以前的手工技术的限制。复杂性这一新世界，正是我们特有的领域。对于我们&lt;br&gt;特别生要的是，任意复杂度正是系统设计问题的特性。典型的复杂例子，有操作&lt;br&gt;系统、知识网络、计算机网络。任意性是固有的特征--这是具有独立思想的主机&lt;br&gt;所需要的，正是它包含着具有独立思想主机的活力。&lt;p&gt;这些问题从两种不同的角度使那些数学和自然科学背景的人震惊和气馁。数学家&lt;br&gt;们感到震惊的原因是，他们喜欢那些可以被简单地公式化并已经抽象好的问题，&lt;br&gt;而解这些问题非常困困难。四色问题就是个非常好的例子。&lt;p&gt;另一方面，物理学家和生物学家，因任意性而震惊。复杂性对于他们根本不陌生。&lt;br&gt;物理学家们挖得越深，他们发现的&amp;quot;基本&amp;quot;粒子的结构就越微妙和复杂。但是他们&lt;br&gt;不断挖，满怀信心地相信自然世界不是任意的，相信必然存在统一和一致的根本&lt;br&gt;规律，只要他们能发现它。&lt;p&gt;计算机科学家则不能用这种确信来安慰自己。任意复杂性是我们的命运，而且恰&lt;br&gt;是此处而并非他处，是本学科所需的最佳思想，它造就对这些问题更强有力的进&lt;br&gt;攻。现在变更已经建立的名字已经太晚了。&lt;p&gt;因此，我们目的并非提议改名，而是提出对潜意识态度的理智反抗。这些反抗中&lt;br&gt;最重要的，是持续关注我们的用户，是以用户的成功为依据的持续演进过程。&lt;p&gt;- 创造的天赋[杨注：创造，原文是Subcreation，我实在不知道如何翻译。作者&lt;br&gt;  的大意，上帝是创造者，他创造了人类，而人类的创造是subcreation.]&lt;p&gt;制造东西是光荣而愉悦的，并且这种感觉与数学家和科学家的感觉不同。让我们&lt;br&gt;谨慎地用根本的方式来考虑这一问题。&lt;p&gt;创世纪1-2中涉及的创造不可思议地丰富和微妙，这可以从许多层次解读。我本人&lt;br&gt;并非相信上帝七天创造世界的原教旨主义者，但是我非常重视对创世纪的解读。&lt;br&gt;它指出，造物主给予人类七种非常杰出的生具来的天赋。默想这七种天赋，我们&lt;br&gt;发现那正是我们最深的渴望和最大愉悦的条款。（参见图1。）这里，我想集中讨&lt;br&gt;论最后一点，工作的天赋，即具有才能，或者说制造东西的天赋。&lt;p&gt;图1 创世纪中人类给予人类的七种与生具来的天赋&lt;p&gt;1.生命，和死亡；2.造物主相伴；3.友谊，尤其是婚姻；4.孩子；5.自然，尤其&lt;br&gt;是动物；6.自由；7.创造性工作&lt;p&gt;J.R.R. Tolkien（托尔金），史诗指环王三部曲的作者，花费毕生创造了丰富的&lt;br&gt;奇幻世界，这一世界具有它自己的法则、种族、语言、地理.他称这一创造为&lt;br&gt;subscreation的天赋，他用一首与graphicists[杨注：画师？]的作品特别相关&lt;br&gt;的一首诗阐释了这一天赋。&lt;p&gt;[杨注：下面这首诗，是本着瞎翻译比直接抄英文略强的原则翻译的，请视为占&lt;br&gt;位符。]&lt;p&gt;尽管流放已久，&lt;br&gt;他仍未完全迷失或完全改变，&lt;br&gt;他可能不再优雅，但尚未废黜，&lt;br&gt;仍保留着曾拥有的统治的碎片：&lt;br&gt;人类，具有创造力的造物，折射的光线&lt;br&gt;通过他由单纯的白光分裂为&lt;br&gt;诸多色彩，并且无尽地组合成为&lt;br&gt;从一个头脑到另一个头脑的鲜活的形状。&lt;p&gt;尽管在我们在世界的缝隙中我们填充了&lt;br&gt;精灵和地精，尽管我们敢于建造&lt;br&gt;神和他们的房舍，从黑暗与光明中，&lt;br&gt;并且播洒了龙的种子--那是我们的权利，&lt;br&gt;(使用的或滥用的)。那权利仍未腐朽；&lt;br&gt;我们创造，仍然依据着创造我们的法则。&lt;p&gt;Tolkien仅在奇幻故事的创作和奇幻世界中应用了这一思想。我赞同英国作家&lt;br&gt;Dorothy Sayers的观点，人类所有的创造都适用这一思想。一个谨慎的小小的思&lt;br&gt;考提示我们，制造东西的能力，这种模仿造物主的能力，是一种为了我们，而不&lt;br&gt;是造物主而给予的能力。正如他轻蔑地提醒以色列人，他并不需要我们的创造能&lt;br&gt;力:&amp;quot;一千座山上的牛群都是我们；如果我饥饿，我会求助于你们吗？&amp;quot;[诗篇 50:12]&lt;p&gt;因此我们必定能得出结论，这种能力，被称为创造的能力，给予我们的原因是丰&lt;br&gt;富我们的生活，并使我们可以使彼此丰富。&lt;p&gt;- 人工智能（AI）的健康发展&lt;p&gt;自创建以来，AI领域已经有了健康的发展，现在是观察和称颂这些进步的时候了。&lt;br&gt;在最初，实践仍然非常原始，但是本领域的言辞就回荡着巴别塔建造者的声音：&amp;quot;我&lt;br&gt;们要建造会思考的机器；我们要建造巨大的脑。&amp;quot;只要给予充足的钱和努力，我迎&lt;br&gt;来的，将是不可思议的机器，它们能够识别视觉的模式，能够讲话，能够计划复&lt;br&gt;杂的行动，能够回答复杂的问题，能够具备大多数专家全部的专业技能。&lt;p&gt;在超过三十年中，我们投入了惊人的国家投资。是的，我认为，相比其他可能可&lt;br&gt;能获得成果的领域，在计算机科学研究中的公共投资中，我们对人工智能领域投&lt;br&gt;资过多。与投入的金钱相相比更严重的是，一代最杰出的计算机科学家的头脑，&lt;br&gt;和最杰出的从事学术研究的实验室的努力。&lt;p&gt;这些研究成果的副产品令人印象深刻：新的数据结构、新的知识表达的方法、新&lt;br&gt;的程序设计语言、新的计算机家族。但是，至于说到我们的主要目标，令人震惊&lt;br&gt;地，相对于花费的时间和投次，本领域的成果几乎没有。我们只要看看在当前的语&lt;br&gt;音识别和笔迹识别方面我们走了有多远，尽管我们在此做了多少工作。&lt;p&gt;曾经，至少专家系统领域将要奏响凯歌，尽管很多其他的目标都不值一提。然后&lt;br&gt;令人猛醒的消息来了：在2500至3000条规则领域的某处，当世界改变的时候，规&lt;br&gt;则库变得令人崩溃地难以维护。识别新的或者变化的规则与剩余的库的一致性变&lt;br&gt;得非常困难，困难到我们要为可用的规则库大小设置一个有效的上限。因此现&lt;br&gt;在，我们就拥有了专家系统技术，有几百个专家系统例子，但并非最初梦想的那&lt;br&gt;种可无限扩展的工具。&lt;p&gt;这些年来，我们给予人工智能研究者对人类智能力量的深切尊重。人工智能系统&lt;br&gt;的研究路线已经一点一点改变了，现在，我们听说研究者们提出了&amp;quot;飞行员助手&lt;br&gt;&amp;quot;，&amp;quot;训练建议者&amp;quot;，或者&amp;quot;计划工具&amp;quot;。&lt;p&gt;当真正的成果开始增加的时候，本领域的言论也变得适度了。这一演进过程完全&lt;br&gt;健康了。这也对应了一个基本的真理，可能Walt Kelly，comic strip Pogo的作&lt;br&gt;者，对它剖析得最清楚了Albert Alligator贬低过Ole熊那的确非常有限的智力。&lt;br&gt;Ole熊的反应令人难忘：&lt;p&gt;&amp;quot;你木有跑到我的头盖骨下面去。内里有非常想像力撒。&amp;quot;&lt;p&gt;[杨注：据wikipedia，Walt Kelly以画一种漫画--称为comicstrip的，分格的幽&lt;br&gt;默或叙事作品，在人物的脑袋上面的气球状圈里写上对白--著称，他的代表作是&lt;br&gt;Pogo；Albert Alligator是Pogo系列里的常驻角色，Ole bear没查到，可能也&lt;br&gt;是。从原文引用Ole Bear的话的语法上看，他的智力可能确实有限。]&lt;p&gt;是时候承认了，人工智能的最初目标不单纯是非常的困难，这些目标很迷人，也&lt;br&gt;很令人鼓舞，但是它们把我们这个学科引导到了错误的方向。&lt;p&gt;如果我们的目标确实是建立计算机系统，以解决非常富有挑战性的问题的话，我&lt;br&gt;的观点是：&lt;p&gt;IA &amp;gt; AI [杨注：intelligence amplifying，IA；人工智能，AI]&lt;p&gt;也就是说，智力放大系统IA能够，在有效系统技术的任何级别，击败人工智能AI。&lt;br&gt;也就是说，机器和头脑能够击败模仿头脑并单独工作的机器。&lt;p&gt;有一天，计算机会击败国际象棋世界冠军。当那一天到来的时候，我希望看到这&lt;br&gt;位世界冠军装备上强有力且适宜的IA象棋工具，然后和那个AI系统再比一次。我&lt;br&gt;打赌IA队会赢。&lt;p&gt;现在所有问题的重点是，不同的长跑目标会把我们的研究引导向不同的方向。当&lt;br&gt;我们不再继续梦想计算机会取代人脑，而是决定准备驾驭在 脑-机系统 中的头&lt;br&gt;脑的头脑的力量，我们应该研究如何以宽带的信道把头脑和机器连接在一起，这&lt;br&gt;是一个对SIGGRAPH而言珍贵的研究领域，对于这一领域的注意力仍不及对AI研究&lt;br&gt;的一小点。这些问题是富有挑战性而艰难的，正如图2的广告中所描绘的。&lt;p&gt;图2 沟通问题 一个戴眼镜的男人头部的俯视图，面朝纸的正上方。他的眼前写着&lt;br&gt;&amp;quot;沟通&amp;quot;，脑后写着&amp;quot;最难的部分是最后四英寸&amp;quot;。4英寸合10.16厘米。&lt;p&gt;不深入任何细节，我想指出从机器中取出信息给头脑是计算机图形学的核心任&lt;br&gt;务，这占用了我们最宽带的信道。然而，我们其他的每个信道也都具有独特的特&lt;br&gt;性，我们一定不能忽略对头脑中的潜意识部分有影响的声音和触觉。同样的，从&lt;br&gt;头脑中取出信息放回机器中，能够肯定的是，字符串通常并非自然的和正确的机&lt;br&gt;制。我们希望像与其他头脑沟通那样与机器沟通，通过陈述命令，通过说话，指&lt;br&gt;点，或者通过移通来表明 &amp;quot;什么&amp;quot;、&amp;quot;在哪里&amp;quot;、&amp;quot;有多远&amp;quot;。&lt;p&gt;- 工具制造者是协作者&lt;p&gt;如果计算机科学家是工具制造者，又如果我们乐于制造强有力的工具和头脑放大&lt;br&gt;器，我们就必须和那些将使用我们的工具的人们一起工作，和我们希望放大他们&lt;br&gt;智力的那些人一起工作。请让我和你们分享一些过去超过30年我们在教堂山跨学&lt;br&gt;科协作的经验。这些经验很令人兴奋，我把它作为一种工作方式推荐给你们。它&lt;br&gt;也有一些固有的代价，我们得决定是不是打算承受，还有一些固有的陷阱。&lt;p&gt;- 问题驱动的研究途径&lt;p&gt;让我们从一个矛盾的观点开始：&lt;p&gt;让我们的研究搭别人研究问题的便车，在他们的术语的基础上解决那些问题，这&lt;br&gt;会引导我们丰富计算机科学的研究。&lt;p&gt;这是一个&amp;quot;下面在上面&amp;quot;的悖论，它支持了生活中太多的事情，从婚姻生活到职业&lt;br&gt;发展。&lt;p&gt;&lt;br&gt;怎么会是这样呢？在其他学科的问题上工作，以增进协作者为目的，怎么会帮助&lt;br&gt;作为计算机科学家的我们呢？因为许多原因：&lt;p&gt;* 这让我们瞄准相关问题，而不是仅做练习或玩具级别的小问题；&lt;p&gt;* 这使我们对成功或失败保持诚实的态度，这样我们欺骗自己时就不那么容易了；&lt;p&gt;* 这使我们面对整个问题，而不仅是容易的或者数学的部分。比如在计算几何&lt;br&gt;中，我们就无法绕过三重共线点[杨注：?]，或者四重共面点[杨注：?]。我们&lt;br&gt;无法假设病态条件的情况是不存在的。&lt;p&gt;* 面对整个问题反过来也迫使我们学习和发展新的计算机科学，这些新思想如果&lt;br&gt;  不是在面对整个问题中暴露出来，我们可能根本不会涉及；&lt;p&gt;* 除了以上这些，在别人旁边看着发现蛋白质如何工作，或者看设计潜水艇，或&lt;br&gt;  者看纳米尺度的装配，这本身也是件非常有意思的事。&lt;p&gt;在我们的教堂山实验室，我们的虚拟现实小组已经与许多方向的研究人员合作&lt;br&gt;过，这些方向列在了表1中。你可能问一个合理的问题，计算机科学家在合作中&lt;br&gt;得到了什么，你们学到了东西么？&lt;p&gt;表2给出了仅从分子结构化学家合作时，计算机科学家得到的一些结果。一个非&lt;br&gt;常好的副作用，是针对分子表面开发的多边形简化算法，也适用于潜水艇零件35&lt;br&gt;万个多边形的模型的实时可视化。&lt;p&gt;图3是从最近实验的视频中采集到的，物理学研究生Michael Falvo正使用原子力&lt;br&gt;显微镜把一个黄金的小球置入电路的目标缝隙之中。图4给出了视频中的几帧，&lt;br&gt;显示的是对于用原子力显微镜置入探针对烟草花叶病病毒重组。&lt;p&gt;图2的画面是这样的：一位男士背对我们，手持一个从天花板上悬挂下来的装置，他&lt;br&gt;面前的桌子上，有几条弯曲的线条，不怎么像电路，看着倒是有点像蛋白质。这&lt;br&gt;些线条的背景是像月球环形山一样的平面。题注中指出他的整个视野范围是1纳&lt;br&gt;米。这个视野范围在图上看，应该在1平方米以上。[杨注：以上是杨用文字对图&lt;br&gt;画作的描述，不是题注本身。这几张图都是。]&lt;p&gt;图3的画面是这样的：有几张图，每一张里都有两个或三个杆菌一样的东西，它们&lt;br&gt;的位置在变化。题注说明：场景的大小是1纳米。&lt;p&gt;表1 虚拟现实驱动问题&lt;p&gt;* 医学图像和重建&lt;p&gt;* 放射治疗计划&lt;p&gt;* 分子结构&lt;p&gt;* 扫描探针显微镜的控制&lt;p&gt;* 建筑设计和潜水艇空间&lt;p&gt;* 战斗机飞行员战术练习的训示&lt;p&gt;表2 一些来自分子图像驱动问题的计算机科学结果&lt;p&gt;* 不要赋予手动设备多种功能&lt;p&gt;* 强制显示可以使分子以快至两倍的速度停靠&lt;p&gt;* 新的线性时间并行alpha-hull算法&lt;p&gt;* 新的多边形简化算法&lt;p&gt;- 协作的代价&lt;p&gt;与专业领域合作确实有一些代价，跨学科合作的代价还有独特性。我发现我们的&lt;br&gt;小组花费大约四分之一的时间从事支持我们的合作者的日常工作，而没有在这些&lt;br&gt;时间里推进我们的联合研究，更没有进行计算机科学部分的研究。某个化学家需&lt;br&gt;要一张特别的适合于某种尺寸的纸张或者课本封面的插图。某个潜水艇设计师需&lt;br&gt;要一个特别的技术演示，给他的项目基金负责人或者主管看。这些我们都非常高&lt;br&gt;兴完成。这是有来有往的。我们的化学家合作者要花上几个小时培训我们的研究&lt;br&gt;生关于蛋白质结构的元素，通过手把手摆弄黄铜的或者塑料模型的实验指导他们。&lt;p&gt;所有的合作都需要安排时间让资深科学家做计划和沟通。这些工作是不能交给别&lt;br&gt;人做的--只有两边的老板才行。&lt;p&gt;最后，我们的职员和学生必须花时间学习蛋白质化学、表面物理、放射学，或者&lt;br&gt;建筑设计。我们的博士生经常要上合作学科的导论课程，他们总是阅读合作者方&lt;br&gt;面的课程，用来准备他们的毕业论文。当然，他不必成为合作者领域的专家，但&lt;br&gt;是他必须得学习基础课程、术语、还有合作者的研究目标。&lt;p&gt;- 合作的条款&lt;p&gt;每对合作者都是不同的，不过在美好的意愿下，许多不同的安排也都能达成合作&lt;br&gt;成功。我们发现了一些简单的规则，它们能够帮助明智的跨学科合作。最有帮助&lt;br&gt;的一条是，任何一方不应成为另一方的承包商--应该是每一方都提供他们的支持。&lt;br&gt;这确保，在一方发现不再值得投资时，合作中不存在人为的羁绊。合作只有在每&lt;br&gt;个人都赢的时候才能有效果。&lt;p&gt;对于一个工具，我们有两条准则：&lt;p&gt;* 它必须足够容易使用，容易到全职教授能够使用；&lt;p&gt;* 它必须有足够效率，有效率到全职教授乐于使用。&lt;p&gt;只要能对他们的论文有点好处，博士生们乐意使用任何糟烂的工具。只有在与我&lt;br&gt;们合作的资深科学家在他们自己的工作中使用我们的工作，我们才视工具制造这&lt;br&gt;一合作是成功的。制造工具能够满足这两条强制性准则，就要求与合作者紧密地&lt;br&gt;一起工作，对什么是有用的进行不断迭代的定义。&lt;p&gt;荣誉分配呢？在获得冠军的队伍里，每个人都能得到指环。在成功的合作中，有&lt;br&gt;足够的成果供大家作为荣誉。在成功的合作中，我从来不知道荣誉会是个问题。&lt;p&gt;- 对娱乐的质疑&lt;p&gt;现在让我们转回来讨论计算机图形学和SIGGRAPH会议。计算机科学中再没有比这&lt;br&gt;一块更精彩和有趣的了。&lt;p&gt;我们的会议是对稳定的成功和进步的欢乐的庆典，无论是在硬件、软件、使用的&lt;br&gt;概念上。我们有太多的东西要庆祝了。&lt;p&gt;然而，我愿望我我们大家面前提出一个质疑。在最近一次面谈中，Dan&lt;br&gt;Goldin，NASA的主任，他说，&amp;quot;我并不担心宇宙的问题，我担心的是美国。我们&lt;br&gt;的国度已经成了消费的国度。娱乐和消遣是为未来准备的最重要的事。愿上帝帮&lt;br&gt;助我们！&amp;quot;&lt;p&gt;我赞同Goldin的观点。当罗马人变得只对面包和马戏感兴趣的时候，罗马就是从&lt;br&gt;那时开始由内部开始腐烂。让我们只要考虑一下美国娱乐和消遣的一个方面，而&lt;br&gt;这正是与SIGGRAPH会议特别相关的--电视。&lt;p&gt;在一次最近的大学毕业典礼上，Teresa修女获得了荣誉学位，人群礼貌地鼓掌。&lt;br&gt;后来，最后的领奖人，来的才是人们来这里想看的--Meryl Streep[杨注：你猜对&lt;br&gt;了，她是美国著名女演员。获过16项奥斯卡提名，获过一次最佳女主角，一次最&lt;br&gt;佳女配角。猎鹿人，走出非洲，穿普拉达的女王，廊桥遗梦。]Streep小姐在她的&lt;br&gt;领域非常杰出，但是我们看重的是什么？我们实验室的成果出现在国家电视台上&lt;br&gt;时受到不温不火的祝贺，我一直对此惊讶，好象这次曝光能够增强或者检验我们&lt;br&gt;的工作似的。O. J. Simposon审判案向我们展示了名声如何获利。传媒教授Neil&lt;br&gt;Postman，在他写的书《娱乐至死》中写出了这些细节，&amp;quot;我们的政治、新闻、宗&lt;br&gt;教、教育，都已经成为娱乐业的附属。&amp;quot;&lt;p&gt;作为消遣的传媒，电视具有我们可以预见到的空前的力量--它是&amp;quot;可视的&amp;quot;。但是&lt;br&gt;这一传媒固有的特性是&amp;quot;被动的&amp;quot;，这一缺点导致我们在座的许多人从事交互媒体。&lt;br&gt;电视固有的是&amp;quot;非社会&amp;quot;的，我们清楚与人互动的价值。而且，正如在美国的实践&lt;br&gt;表明，电视是疯狂的--令人兴奋，但并不令人提神。[杨注：后面还有半句完全不&lt;br&gt;明白，&amp;quot;with the average cut lasting 3-1/2 seconds &amp;quot;，后面注了参考文献，&lt;br&gt;就是《娱乐至死》。]&lt;p&gt;Minow曾经这样给出美国电视的特性，&amp;quot;广阔的荒漠&amp;quot;。现在，这块荒漠更广阔了，有&lt;br&gt;更多的频道，还有更多将要出现的频道。它也更加荒无人烟。我担心我们很少停&lt;br&gt;下来沉思一下这该有多么糟糕。&lt;p&gt;古希腊人这样要求生活的每个方面：它是真的吗？它是美的吗？它是善的吗？&lt;p&gt;电视也并非真相的集散地。由于电视的存在，我们现在不得不教会幼童一件事&lt;br&gt;情，这是我们以前要在晚得多的时候才接触到的--人们会说谎，尤其是当他们出&lt;br&gt;售东西的时候。更严重的是，节目的内容教给对生活错误的暗示--节目回避了悲&lt;br&gt;伤、失落，与死亡同来的空虚，与成熟同来的快乐，抚养孩子的喜悦。电视在美&lt;br&gt;的方面也不尽人意。尽管电影艺术通常非常巧妙，但是总体的效果是丑陋的--荒&lt;br&gt;凉的贫民窟、丑陋的暴力，还有没完没了的汽车追逐。&lt;p&gt;电视只有偶而的情况下才是善的。对物质的强烈贪婪只具有中等程度的戏剧性。&lt;br&gt;电视中的角色鲜有那种我们希望他们是我们的朋友的人，都是非常不希望作朋友&lt;br&gt;的，比如在Neville Shute小说中的人物。只有极偶然的情况下，我们才会希望&lt;br&gt;我们的孩子把电视角色作为他们的偶像。&lt;p&gt;Lee DeForest的后半生因发明真空管而享有盛誉，他谈论真空管如何使广播成为&lt;br&gt;可能的时候，悲哀地说:&amp;quot;这是我DeForest的主要罪恶。&amp;quot;现在，我们有一个新的&lt;br&gt;候选项目了。&lt;p&gt;&amp;quot;在没有电视的时候，人们都做些什么？&amp;quot;我们如何放松消遣？&lt;p&gt;* 人们彼此拜访。&lt;p&gt;* 人们做被褥，从事发明，演奏音乐，做游戏。&lt;p&gt;* 人们阅读，用他们的想像力填满图画。&lt;p&gt;* 人们从事运动，而不是主要地观看别人从事运动。&lt;p&gt;* 人们观察大自然，而不是观察大自然的照片。&lt;p&gt;好吧，所有这些与SIGGRAPH会议有什么关系呢？关系非常多；SIGGRAPH会议也崇&lt;br&gt;拜电视及电视的名声。没有比电子剧场更明显的例子了。年复一年，我们越来越&lt;br&gt;按电视文化的标准选择应该尊敬什么样的成果。这里越来越像个电子剧场，而不&lt;br&gt;是计算机图形学的展示会。我们看到展出的是闪闪发光的舞蹈演员、虚假的唇同&lt;br&gt;步音乐[杨注：假唱?]，还有真实世界的廉价变形的二维影像。&lt;p&gt;每年都有一些精彩的例外，从Luxo, Jr.[杨注：皮克斯公司那个一跳一跳的小台&lt;br&gt;灯的动画片]到Devil&amp;#39;s Mine Ride[杨注：也是动画片，没看过，可能跟矿井里的&lt;br&gt;小车有关]。但是我只能对完成了的东西而感到惊异，而没有同样感到它们内在的&lt;br&gt;喜悦。同样的问题在文艺演出中也存在：&lt;p&gt;* 纯粹的美在哪里？那难道不是艺术所具有的么？&lt;p&gt;* 我们可以与艺术家分享的喜悦在哪里？&lt;p&gt;* 我们已经放弃了艺术是丰富彼此的再创造，放弃了艺术是自我净化，是原始的&lt;br&gt;  呼唤么？[杨注：非常不确定这一段作者的态度，不知道翻译得对不对，可能&lt;br&gt;  正好反了。]&lt;p&gt;- 计算机图形学研究者可以做些什么?&lt;p&gt;图形学的魔力，在计算机每秒百万次运算力量的支持下，确实带给我们一种全新&lt;br&gt;的富有创造力的媒体。我们能够创造出在它们自己的规则下运行的世界；我们可&lt;br&gt;以沉浸在这样的世界中，真实得有时甚至欺骗了我们的头脑。这些世界能够向我&lt;br&gt;们显示我们真实世界的新的真相，这些真相以科学建模和可视化的方式呈现给我&lt;br&gt;们。这些世界展示给我们新的卓越，新的美丽，那些直接从我们的想像中产生出&lt;br&gt;来的。&lt;p&gt;从人类的想像中而来的，可能极其美丽，也可能极尽丑陋，可能深刻的真实，也&lt;br&gt;可能极端的虚假，至善或者极恶。正如耶稣所说，产生出来的东西依赖于心灵本&lt;br&gt;身的情况[马太福音 15:18]。如果我们希望我们的创造物是真、美、善的，那么&lt;br&gt;我们务必关注我们的心灵。正如使徒保罗在[腓力比书 4:8]中所说，&amp;quot;在你的头脑&lt;br&gt;中充满那些善的和值得称颂的；那些真实的，可敬的，公义的，清洁的，可爱&lt;br&gt;的，有美名的事物。&amp;quot;&lt;p&gt;&lt;br&gt;- 致谢&lt;p&gt;Newell Award奖给终生的成就，尤其是跨学科的工作。因此，这也隐含地承认了&lt;br&gt;我们许多合作者的工作。我要明晰地向这几十年来与我合作的人们表达特别的谢&lt;br&gt;意。&lt;p&gt;* 感谢你全部所做的 - Nancy Greenwood Brooks&lt;p&gt;* 计算机架构 - Gerrit Blaauw, Richard Case, John Cocke, John&lt;br&gt;Fairclough&lt;p&gt;* 图形学 - William Wright, Henry Fuchs, Michael Pique, David and Jane&lt;br&gt;Richardson&lt;p&gt;* 建立计算机科学系 - Peter Calingaert, Henry Fuchs, Stephen Pizer,&lt;br&gt;Donald Stanat, Stephen Weiss. C&lt;p&gt;参考文献 略&lt;p&gt;关于作者 略&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-6337800656763937960?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/6337800656763937960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=6337800656763937960' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/6337800656763937960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/6337800656763937960'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/10/frederick-brooks-ii.html' title='Frederick Brooks: 计算机科学家的使命是制造工具 II, 翻译全文版'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-7714945858962440303</id><published>2011-10-06T23:33:00.001+08:00</published><updated>2011-10-06T23:33:13.717+08:00</updated><title type='text'>Frederick Brooks: 计算机科学家的使命是制造工具 II, 翻译连载第5部分，也是最后一部分</title><content type='html'>Frederick Brooks: 计算机科学家的使命是制造工具 II, 翻译连载第5部分，也是最后一部分&lt;p&gt;翻译的第5部分，也是最后一部分&lt;p&gt;电视也并非真相的集散地。由于电视的存在，我们现在不得不教会幼童一件事&lt;br&gt;情，这是我们以前要在晚得多的时候才接触到的--人们会说谎，尤其是当他们出&lt;br&gt;售东西的时候。更严重的是，节目的内容教给对生活错误的暗示--节目回避了悲&lt;br&gt;伤、失落，与死亡同来的空虚，与成熟同来的快乐，抚养孩子的喜悦。电视在美&lt;br&gt;的方面也不尽人意。尽管电影艺术通常非常巧妙，但是总体的效果是丑陋的--荒&lt;br&gt;凉的贫民窟、丑陋的暴力，还有没完没了的汽车追逐。&lt;p&gt;电视只有偶而的情况下才是善的。对物质的强烈贪婪只具有中等程度的戏剧性。&lt;br&gt;电视中的角色鲜有那种我们希望他们是我们的朋友的人，都是非常不希望作朋友&lt;br&gt;的，比如在Neville Shute小说中的人物。只有极偶然的情况下，我们才会希望&lt;br&gt;我们的孩子把电视角色作为他们的偶像。&lt;p&gt;Lee DeForest的后半生因发明真空管而享有盛誉，他谈论真空管如何使广播成为&lt;br&gt;可能的时候，悲哀地说:&amp;quot;这是我DeForest的主要罪恶。&amp;quot;现在，我们有一个新的&lt;br&gt;候选项目了。&lt;p&gt;&amp;quot;在没有电视的时候，人们都做些什么？&amp;quot;我们如何放松消遣？&lt;p&gt;* 人们彼此拜访。&lt;p&gt;* 人们做被褥，从事发明，演奏音乐，做游戏。&lt;p&gt;* 人们阅读，用他们的想像力填满图画。&lt;p&gt;* 人们从事运动，而不是主要地观看别人从事运动。&lt;p&gt;* 人们观察大自然，而不是观察大自然的照片。&lt;p&gt;好吧，所有这些与SIGGRAPH会议有什么关系呢？关系非常多；SIGGRAPH会议也崇&lt;br&gt;拜电视及电视的名声。没有比电子剧场更明显的例子了。年复一年，我们越来越&lt;br&gt;按电视文化的标准选择应该尊敬什么样的成果。这里越来越像个电子剧场，而不&lt;br&gt;是计算机图形学的展示会。我们看到展出的是闪闪发光的舞蹈演员、虚假的唇同&lt;br&gt;步音乐[杨注：假唱?]，还有真实世界的廉价变形的二维影像。&lt;p&gt;每年都有一些精彩的例外，从Luxo, Jr.[杨注：皮克斯公司那个一跳一跳的小台&lt;br&gt;灯的动画片]到Devil&amp;#39;s Mine Ride[杨注：也是动画片，没看过，可能跟矿井里的&lt;br&gt;小车有关]。但是我只能对完成了的东西而感到惊异，而没有同样感到它们内在的&lt;br&gt;喜悦。同样的问题在文艺演出中也存在：&lt;p&gt;* 纯粹的美在哪里？那难道不是艺术所具有的么？&lt;p&gt;* 我们可以与艺术家分享的喜悦在哪里？&lt;p&gt;* 我们已经放弃了艺术是丰富彼此的再创造，放弃了艺术是自我净化，是原始的&lt;br&gt;  呼唤么？[杨注：非常不确定这一段作者的态度，不知道翻译得对不对，可能&lt;br&gt;  正好反了。]&lt;p&gt;- 计算机图形学研究者可以做些什么?&lt;p&gt;图形学的魔力，在计算机每秒百万次运算力量的支持下，确实带给我们一种全新&lt;br&gt;的富有创造力的媒体。我们能够创造出在它们自己的规则下运行的世界；我们可&lt;br&gt;以沉浸在这样的世界中，真实得有时甚至欺骗了我们的头脑。这些世界能够向我&lt;br&gt;们显示我们真实世界的新的真相，这些真相以科学建模和可视化的方式呈现给我&lt;br&gt;们。这些世界展示给我们新的卓越，新的美丽，那些直接从我们的想像中产生出&lt;br&gt;来的。&lt;p&gt;从人类的想像中而来的，可能极其美丽，也可能极尽丑陋，可能深刻的真实，也&lt;br&gt;可能极端的虚假，至善或者极恶。正如耶稣所说，产生出来的东西依赖于心灵本&lt;br&gt;身的情况[马太福音 15:18]。如果我们希望我们的创造物是真、美、善的，那么&lt;br&gt;我们务必关注我们的心灵。正如使徒保罗在[腓力比书 4:8]中所说，&amp;quot;在你的头脑&lt;br&gt;中充满那些善的和值得称颂的；那些真实的，可敬的，公义的，清洁的，可爱&lt;br&gt;的，有美名的事物。&amp;quot;&lt;p&gt;&lt;br&gt;- 致谢&lt;p&gt;Newell Award奖给终生的成就，尤其是跨学科的工作。因此，这也隐含地承认了&lt;br&gt;我们许多合作者的工作。我要明晰地向这几十年来与我合作的人们表达特别的谢&lt;br&gt;意。&lt;p&gt;* 感谢你全部所做的 - Nancy Greenwood Brooks&lt;p&gt;* 计算机架构 - Gerrit Blaauw, Richard Case, John Cocke, John&lt;br&gt;Fairclough&lt;p&gt;* 图形学 - William Wright, Henry Fuchs, Michael Pique, David and Jane&lt;br&gt;Richardson&lt;p&gt;* 建立计算机科学系 - Peter Calingaert, Henry Fuchs, Stephen Pizer,&lt;br&gt;Donald Stanat, Stephen Weiss. C&lt;p&gt;参考文献 略&lt;p&gt;关于作者 略&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-7714945858962440303?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/7714945858962440303/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=7714945858962440303' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/7714945858962440303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/7714945858962440303'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/10/frederick-brooks-ii-5.html' title='Frederick Brooks: 计算机科学家的使命是制造工具 II, 翻译连载第5部分，也是最后一部分'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-4085783814750773150</id><published>2011-10-06T14:17:00.001+08:00</published><updated>2011-10-06T14:17:41.626+08:00</updated><title type='text'>Frederick Brooks: 计算机科学家的使命是制造工具 II, 翻译连载第4部分</title><content type='html'>翻译的第4部分&lt;p&gt;* 这让我们瞄准相关问题，而不是仅做练习或玩具级别的小问题；&lt;p&gt;* 这使我们对成功或失败保持诚实的态度，这样我们欺骗自己时就不那么容易了；&lt;p&gt;* 这使我们面对整个问题，而不仅是容易的或者数学的部分。比如在计算几何&lt;br&gt;中，我们就无法绕过三重共线点[杨注：?]，或者四重共面点[杨注：?]。我们&lt;br&gt;无法假设病态条件的情况是不存在的。&lt;p&gt;* 面对整个问题反过来也迫使我们学习和发展新的计算机科学，这些新思想如果&lt;br&gt;  不是在面对整个问题中暴露出来，我们可能根本不会涉及；&lt;p&gt;* 除了以上这些，在别人旁边看着发现蛋白质如何工作，或者看设计潜水艇，或&lt;br&gt;  者看纳米尺度的装配，这本身也是件非常有意思的事。&lt;p&gt;在我们的教堂山实验室，我们的虚拟现实小组已经与许多方向的研究人员合作&lt;br&gt;过，这些方向列在了表1中。你可能问一个合理的问题，计算机科学家在合作中&lt;br&gt;得到了什么，你们学到了东西么？&lt;p&gt;表2给出了仅从分子结构化学家合作时，计算机科学家得到的一些结果。一个非&lt;br&gt;常好的副作用，是针对分子表面开发的多边形简化算法，也适用于潜水艇零件35&lt;br&gt;万个多边形的模型的实时可视化。&lt;p&gt;图3是从最近实验的视频中采集到的，物理学研究生Michael Falvo正使用原子力&lt;br&gt;显微镜把一个黄金的小球置入电路的目标缝隙之中。图4给出了视频中的几帧，&lt;br&gt;显示的是对于用原子力显微镜置入探针对烟草花叶病病毒重组。&lt;p&gt;图2的画面是这样的：一位男士背对我们，手持一个从天花板上悬挂下来的装置，他&lt;br&gt;面前的桌子上，有几条弯曲的线条，不怎么像电路，看着倒是有点像蛋白质。这&lt;br&gt;些线条的背景是像月球环形山一样的平面。题注中指出他的整个视野范围是1纳&lt;br&gt;米。这个视野范围在图上看，应该在1平方米以上。[杨注：以上是杨用文字对图&lt;br&gt;画作的描述，不是题注本身。这几张图都是。]&lt;p&gt;图3的画面是这样的：有几张图，每一张里都有两个或三个杆菌一样的东西，它们&lt;br&gt;的位置在变化。题注说明：场景的大小是1纳米。&lt;p&gt;表1 虚拟现实驱动问题&lt;p&gt;* 医学图像和重建&lt;p&gt;* 放射治疗计划&lt;p&gt;* 分子结构&lt;p&gt;* 扫描探针显微镜的控制&lt;p&gt;* 建筑设计和潜水艇空间&lt;p&gt;* 战斗机飞行员战术练习的训示&lt;p&gt;表2 一些来自分子图像驱动问题的计算机科学结果&lt;p&gt;* 不要赋予手动设备多种功能&lt;p&gt;* 强制显示可以使分子以快至两倍的速度停靠&lt;p&gt;* 新的线性时间并行alpha-hull算法&lt;p&gt;* 新的多边形简化算法&lt;p&gt;- 协作的代价&lt;p&gt;与专业领域合作确实有一些代价，跨学科合作的代价还有独特性。我发现我们的&lt;br&gt;小组花费大约四分之一的时间从事支持我们的合作者的日常工作，而没有在这些&lt;br&gt;时间里推进我们的联合研究，更没有进行计算机科学部分的研究。某个化学家需&lt;br&gt;要一张特别的适合于某种尺寸的纸张或者课本封面的插图。某个潜水艇设计师需&lt;br&gt;要一个特别的技术演示，给他的项目基金负责人或者主管看。这些我们都非常高&lt;br&gt;兴完成。这是有来有往的。我们的化学家合作者要花上几个小时培训我们的研究&lt;br&gt;生关于蛋白质结构的元素，通过手把手摆弄黄铜的或者塑料模型的实验指导他们。&lt;p&gt;所有的合作都需要安排时间让资深科学家做计划和沟通。这些工作是不能交给别&lt;br&gt;人做的--只有两边的老板才行。&lt;p&gt;最后，我们的职员和学生必须花时间学习蛋白质化学、表面物理、放射学，或者&lt;br&gt;建筑设计。我们的博士生经常要上合作学科的导论课程，他们总是阅读合作者方&lt;br&gt;面的课程，用来准备他们的毕业论文。当然，他不必成为合作者领域的专家，但&lt;br&gt;是他必须得学习基础课程、术语、还有合作者的研究目标。&lt;p&gt;- 合作的条款&lt;p&gt;每对合作者都是不同的，不过在美好的意愿下，许多不同的安排也都能达成合作&lt;br&gt;成功。我们发现了一些简单的规则，它们能够帮助明智的跨学科合作。最有帮助&lt;br&gt;的一条是，任何一方不应成为另一方的承包商--应该是每一方都提供他们的支持。&lt;br&gt;这确保，在一方发现不再值得投资时，合作中不存在人为的羁绊。合作只有在每&lt;br&gt;个人都赢的时候才能有效果。&lt;p&gt;对于一个工具，我们有两条准则：&lt;p&gt;* 它必须足够容易使用，容易到全职教授能够使用；&lt;p&gt;* 它必须有足够效率，有效率到全职教授乐于使用。&lt;p&gt;只要能对他们的论文有点好处，博士生们乐意使用任何糟烂的工具。只有在与我&lt;br&gt;们合作的资深科学家在他们自己的工作中使用我们的工作，我们才视工具制造这&lt;br&gt;一合作是成功的。制造工具能够满足这两条强制性准则，就要求与合作者紧密地&lt;br&gt;一起工作，对什么是有用的进行不断迭代的定义。&lt;p&gt;荣誉分配呢？在获得冠军的队伍里，每个人都能得到指环。在成功的合作中，有&lt;br&gt;足够的成果供大家作为荣誉。在成功的合作中，我从来不知道荣誉会是个问题。&lt;p&gt;- 对娱乐的质疑&lt;p&gt;现在让我们转回来讨论计算机图形学和SIGGRAPH会议。计算机科学中再没有比这&lt;br&gt;一块更精彩和有趣的了。&lt;p&gt;我们的会议是对稳定的成功和进步的欢乐的庆典，无论是在硬件、软件、使用的&lt;br&gt;概念上。我们有太多的东西要庆祝了。&lt;p&gt;然而，我愿望我我们大家面前提出一个质疑。在最近一次面谈中，Dan&lt;br&gt;Goldin，NASA的主任，他说，&amp;quot;我并不担心宇宙的问题，我担心的是美国。我们&lt;br&gt;的国度已经成了消费的国度。娱乐和消遣是为未来准备的最重要的事。愿上帝帮&lt;br&gt;助我们！&amp;quot;&lt;p&gt;我赞同Goldin的观点。当罗马人变得只对面包和马戏感兴趣的时候，罗马就是从&lt;br&gt;那时开始由内部开始腐烂。让我们只要考虑一下美国娱乐和消遣的一个方面，而&lt;br&gt;这正是与SIGGRAPH会议特别相关的--电视。&lt;p&gt;在一次最近的大学毕业典礼上，Teresa修女获得了荣誉学位，人群礼貌地鼓掌。&lt;br&gt;后来，最后的领奖人，来的才是人们来这里想看的--Meryl Streep[杨注：你猜对&lt;br&gt;了，她是美国著名女演员。获过16项奥斯卡提名，获过一次最佳女主角，一次最&lt;br&gt;佳女配角。猎鹿人，走出非洲，穿普拉达的女王，廊桥遗梦。]Streep小姐在她的&lt;br&gt;领域非常杰出，但是我们看重的是什么？我们实验室的成果出现在国家电视台上&lt;br&gt;时受到不温不火的祝贺，我一直对此惊讶，好象这次曝光能够增强或者检验我们&lt;br&gt;的工作似的。O. J. Simposon审判案向我们展示了名声如何获利。传媒教授Neil&lt;br&gt;Postman，在他写的书《娱乐至死》中写出了这些细节，&amp;quot;我们的政治、新闻、宗&lt;br&gt;教、教育，都已经成为娱乐业的附属。&amp;quot;&lt;p&gt;作为消遣的传媒，电视具有我们可以预见到的空前的力量--它是&amp;quot;可视的&amp;quot;。但是&lt;br&gt;这一传媒固有的特性是&amp;quot;被动的&amp;quot;，这一缺点导致我们在座的许多人从事交互媒体。&lt;br&gt;电视固有的是&amp;quot;非社会&amp;quot;的，我们清楚与人互动的价值。而且，正如在美国的实践&lt;br&gt;表明，电视是疯狂的--令人兴奋，但并不令人提神。[杨注：后面还有半句完全不&lt;br&gt;明白，&amp;quot;with the average cut lasting 3-1/2 seconds &amp;quot;，后面注了参考文献，&lt;br&gt;就是《娱乐至死》。]&lt;p&gt;Minow曾经这样给出美国电视的特性，&amp;quot;广阔的荒漠&amp;quot;。现在，这块荒漠更广阔了，有&lt;br&gt;更多的频道，还有更多将要出现的频道。它也更加荒无人烟。我担心我们很少停&lt;br&gt;下来沉思一下这该有多么糟糕。&lt;p&gt;古希腊人这样要求生活的每个方面：它是真的吗？它是美的吗？它是善的吗？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-4085783814750773150?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/4085783814750773150/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=4085783814750773150' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/4085783814750773150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/4085783814750773150'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/10/frederick-brooks-ii-4.html' title='Frederick Brooks: 计算机科学家的使命是制造工具 II, 翻译连载第4部分'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-7812972378004947929</id><published>2011-10-05T17:22:00.001+08:00</published><updated>2011-10-05T17:22:11.647+08:00</updated><title type='text'>Frederick Brooks: 计算机科学家的使命是制造工具 II, 翻译连载第3部分</title><content type='html'>Frederick Brooks: 计算机科学家的使命是制造工具 II, 翻译连载第3部分&lt;p&gt;翻译的第3部分&lt;p&gt;- 人工智能（AI）的健康发展&lt;p&gt;自创建以来，AI领域已经有了健康的发展，现在是观察和称颂这些进步的时候了。&lt;br&gt;在最初，实践仍然非常原始，但是本领域的言辞就回荡着巴别塔建造者的声音：&amp;quot;我&lt;br&gt;们要建造会思考的机器；我们要建造巨大的脑。&amp;quot;只要给予充足的钱和努力，我迎&lt;br&gt;来的，将是不可思议的机器，它们能够识别视觉的模式，能够讲话，能够计划复&lt;br&gt;杂的行动，能够回答复杂的问题，能够具备大多数专家全部的专业技能。&lt;p&gt;在超过三十年中，我们投入了惊人的国家投资。是的，我认为，相比其他可能可&lt;br&gt;能获得成果的领域，在计算机科学研究中的公共投资中，我们对人工智能领域投&lt;br&gt;资过多。与投入的金钱相相比更严重的是，一代最杰出的计算机科学家的头脑，&lt;br&gt;和最杰出的从事学术研究的实验室的努力。&lt;p&gt;这些研究成果的副产品令人印象深刻：新的数据结构、新的知识表达的方法、新&lt;br&gt;的程序设计语言、新的计算机家族。但是，至于说到我们的主要目标，令人震惊&lt;br&gt;地，相对于花费的时间和投次，本领域的成果几乎没有。我们只要看看在当前的语&lt;br&gt;音识别和笔迹识别方面我们走了有多远，尽管我们在此做了多少工作。&lt;p&gt;曾经，至少专家系统领域将要奏响凯歌，尽管很多其他的目标都不值一提。然后&lt;br&gt;令人猛醒的消息来了：在2500至3000条规则领域的某处，当世界改变的时候，规&lt;br&gt;则库变得令人崩溃地难以维护。识别新的或者变化的规则与剩余的库的一致性变&lt;br&gt;得非常困难，困难到我们要为可用的规则库大小设置一个有效的上限。因此现&lt;br&gt;在，我们就拥有了专家系统技术，有几百个专家系统例子，但并非最初梦想的那&lt;br&gt;种可无限扩展的工具。&lt;p&gt;这些年来，我们给予人工智能研究者对人类智能力量的深切尊重。人工智能系统&lt;br&gt;的研究路线已经一点一点改变了，现在，我们听说研究者们提出了&amp;quot;飞行员助手&lt;br&gt;&amp;quot;，&amp;quot;训练建议者&amp;quot;，或者&amp;quot;计划工具&amp;quot;。&lt;p&gt;当真正的成果开始增加的时候，本领域的言论也变得适度了。这一演进过程完全&lt;br&gt;健康了。这也对应了一个基本的真理，可能Walt Kelly，comic strip Pogo的作&lt;br&gt;者，对它剖析得最清楚了Albert Alligator贬低过Ole熊那的确非常有限的智力。&lt;br&gt;Ole熊的反应令人难忘：&lt;p&gt;&amp;quot;你木有跑到我的头盖骨下面去。内里有非常想像力撒。&amp;quot;&lt;p&gt;[杨注：据wikipedia，Walt Kelly以画一种漫画--称为comicstrip的，分格的幽&lt;br&gt;默或叙事作品，在人物的脑袋上面的气球状圈里写上对白--著称，他的代表作是&lt;br&gt;Pogo；Albert Alligator是Pogo系列里的常驻角色，Ole bear没查到，可能也&lt;br&gt;是。从原文引用Ole Bear的话的语法上看，他的智力可能确实有限。]&lt;p&gt;是时候承认了，人工智能的最初目标不单纯是非常的困难，这些目标很迷人，也&lt;br&gt;很令人鼓舞，但是它们把我们这个学科引导到了错误的方向。&lt;p&gt;如果我们的目标确实是建立计算机系统，以解决非常富有挑战性的问题的话，我&lt;br&gt;的观点是：&lt;p&gt;IA &amp;gt; AI [杨注：intelligence amplifying，IA；人工智能，AI]&lt;p&gt;也就是说，智力放大系统IA能够，在有效系统技术的任何级别，击败人工智能AI。&lt;br&gt;也就是说，机器和头脑能够击败模仿头脑并单独工作的机器。&lt;p&gt;有一天，计算机会击败国际象棋世界冠军。当那一天到来的时候，我希望看到这&lt;br&gt;位世界冠军装备上强有力且适宜的IA象棋工具，然后和那个AI系统再比一次。我&lt;br&gt;打赌IA队会赢。&lt;p&gt;现在所有问题的重点是，不同的长跑目标会把我们的研究引导向不同的方向。当&lt;br&gt;我们不再继续梦想计算机会取代人脑，而是决定准备驾驭在 脑-机系统 中的头&lt;br&gt;脑的头脑的力量，我们应该研究如何以宽带的信道把头脑和机器连接在一起，这&lt;br&gt;是一个对SIGGRAPH而言珍贵的研究领域，对于这一领域的注意力仍不及对AI研究&lt;br&gt;的一小点。这些问题是富有挑战性而艰难的，正如图2的广告中所描绘的。&lt;p&gt;图2 沟通问题 一个戴眼镜的男人头部的俯视图，面朝纸的正上方。他的眼前写着&lt;br&gt;&amp;quot;沟通&amp;quot;，脑后写着&amp;quot;最难的部分是最后四英寸&amp;quot;。4英寸合10.16厘米。&lt;p&gt;不深入任何细节，我想指出从机器中取出信息给头脑是计算机图形学的核心任&lt;br&gt;务，这占用了我们最宽带的信道。然而，我们其他的每个信道也都具有独特的特&lt;br&gt;性，我们一定不能忽略对头脑中的潜意识部分有影响的声音和触觉。同样的，从&lt;br&gt;头脑中取出信息放回机器中，能够肯定的是，字符串通常并非自然的和正确的机&lt;br&gt;制。我们希望像与其他头脑沟通那样与机器沟通，通过陈述命令，通过说话，指&lt;br&gt;点，或者通过移通来表明 &amp;quot;什么&amp;quot;、&amp;quot;在哪里&amp;quot;、&amp;quot;有多远&amp;quot;。&lt;p&gt;- 工具制造者是协作者&lt;p&gt;如果计算机科学家是工具制造者，又如果我们乐于制造强有力的工具和头脑放大&lt;br&gt;器，我们就必须和那些将使用我们的工具的人们一起工作，和我们希望放大他们&lt;br&gt;智力的那些人一起工作。请让我和你们分享一些过去超过30年我们在教堂山跨学&lt;br&gt;科协作的经验。这些经验很令人兴奋，我把它作为一种工作方式推荐给你们。它&lt;br&gt;也有一些固有的代价，我们得决定是不是打算承受，还有一些固有的陷阱。&lt;p&gt;- 问题驱动的研究途径&lt;p&gt;让我们从一个矛盾的观点开始：&lt;p&gt;让我们的研究搭别人研究问题的便车，在他们的术语的基础上解决那些问题，这&lt;br&gt;会引导我们丰富计算机科学的研究。&lt;p&gt;这是一个&amp;quot;下面在上面&amp;quot;的悖论，它支持了生活中太多的事情，从婚姻生活到职业&lt;br&gt;发展。&lt;p&gt;&lt;br&gt;怎么会是这样呢？在其他学科的问题上工作，以增进协作者为目的，怎么会帮助&lt;br&gt;作为计算机科学家的我们呢？因为许多原因：&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/862949426938573101-7812972378004947929?l=giftdotyoung.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://giftdotyoung.blogspot.com/feeds/7812972378004947929/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=862949426938573101&amp;postID=7812972378004947929' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/7812972378004947929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/862949426938573101/posts/default/7812972378004947929'/><link rel='alternate' type='text/html' href='http://giftdotyoung.blogspot.com/2011/10/frederick-brooks-ii-3.html' title='Frederick Brooks: 计算机科学家的使命是制造工具 II, 翻译连载第3部分'/><author><name>杨贵福</name><uri>http://www.blogger.com/profile/11571072696414581207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-862949426938573101.post-3847594423473761422</id><published>2011-10-04T20:26:00.001+08:00</published><updated>2011-10-04T20:26:19.536+08:00</updated><title type='text'>Frederick Brooks: 计算机科学家的使命是制造工具 II, 翻译连载第2部分</title><content type='html'>Frederick Brooks: 计算机科学家的使命是制造工具 II, 翻译连载第2部分&lt;p&gt;翻译的第2部分&lt;p&gt;- 学科命名中&amp;quot;计算机&amp;quot;的部分是完全正确的&lt;p&gt;有人希望我们的学科，我们的专业团体，不以一种机器命名。我认为Newell和&lt;br&gt;Simon在这一点上是完全正确的。计算机使得软件能够操控复杂性的世界，这突破&lt;br&gt;了以前的手工技术的限制。复杂性这一新世界，正是我们特有的领域。对于我们&lt;br&gt;特别生要的是，任意复杂度正是系统设计问题的特性。典型的复杂例子，有操作&lt;br&gt;系统、知识网络、计算机网络。任意性是固有的特征--这是具有独立思想的主机&lt;br&gt;所需要的，正是它包含着具有独立思想主机的活力。&lt;p&gt;这些问题从两种不同的角度使那些数学和自然科学背景的人震惊和气馁。数学家&lt;br&gt;们感到震惊的原因是，他们喜欢那些可以被简单地公式化并已经抽象好的问题，&lt;br&gt;而解这些问题非常困困难。四色问题就是个非常好的例子。&lt;p&gt;另一方面，物理学家和生物学家，因任意性而震惊。复杂性对于他们根本不陌生。&lt;br&gt;物理学家们挖得越深，他们发现的&amp;quot;基本&amp;quot;粒子的结构就越微妙和复杂。但是他们&lt;br&gt;不断挖，满怀信心地相信自然世界不是任意的，相信必然存在统一和一致的根本&lt;br&gt;规律，只要他们能发现它。&lt;p&gt;计算机科学家则不能用这种确信来安慰自己。任意复杂性是我们的命运，而且恰&lt;br&gt;是此处而并非他处，是本学科所需的最佳思想，它造就对这些问题更强有力的进&lt;br&gt;攻。现在变更已经建立的名字已经太晚了。&lt;p&gt;因此，我们目的并非提议改名，而是提出对潜意识态度的理智反抗。这些反抗中&lt;br&gt;最重要的，是持续关注我们的用户，是以用户的成功为依据的持续演进过程。&lt;p&gt;- 创造的天赋[杨注：创造，原文是Subcreation，我实在不知道如何翻译。作者&lt;br&gt;的大意，上帝是
