卓群's profile我还年轻,我渴望上路。。。PhotosBlogListsMore ![]() | Help |
|
10/3/2009 同样的阅兵,不一样的效果9/30/2009 转载一篇[ZZ]
前言 ------------------------------- 古人云
十步之泽,必有香草;十室之邑,必有忠士 很多人感觉自己被中国的语文教育给耽误了,我就来深入浅出的解释一下吧
这句话告诉我们一个什么道理呢?随便找一个村子,就能选拔出治国的能臣。
也就是说其实人才到处都有,所谓的人才,不过是遇到了好的机遇而已。
-------------------------------
一,选拔机制 ------------------------------- 既然我们前面谈到了人才其实遍地都是,但是,客观上,整个社会又是一个金字塔
那么如何决定哪些人能够在上层,哪些人被统治呢? 必然存在一个选拔机智。
古代有家族,有科举; 现代有高考,中考,奥数。
这些选拔机制所做的事情就是一样: 首先, 把候选人的圈子划小; 其次,从里面选出人才来进行统治。
所以,凭借家族,或者科举,或者高考,或者奥数, 都是一个敲门砖,是进入“上层阶级”的门票。
但是进入上层了,就必然享受好的生活拉么? 不!
所有进入上层的人都是人才么? 不! 所有的行为,仅仅是一个缩小候选人范围的操作而已。
所以,不论你是出生在大家族;还是在科举,高考,中胜出,都不能说明你应该有一个好的结果。
----------------------------
二,天才 ---------------------------- 上面我们所说的是人才,但是有一种人远远优等与人才,那就是天才。 比如古代,所谓“八股害人”,中举的都读书读傻了。
为什么朝堂上站着的那些人没有一个傻的呢?一个比一个厚黑,一个比一个狠毒。 这些人就是天才,天才干什么都干得好。
比如说,高考只考数学,选出来的是一批人A; 如果只考修自行车,选出来的是一批人B;
如果考PRESENTATION,选出来的是一批人C。。。。 什么是天才? 天才就是A,B,C的交集。不论规则如何改变,他们都是胜出者。
而高考的目的,或者说整个社会选拔的目的,是为了选出天才, 让他们进行统治;
那些通过了选拔,而不是天才的人们, 也就是现在这些叫嚣“我学过XXX,当年学得也很好,但是一点用都没有阿”的人 -----------------------
三,正确面对天才和其他人才 ----------------------- 很多人在选拔赛中胜出了,就想当然的认为自己是天才, 应该位居统治阶级,应该优与绝大多数人
这种想法对么?当然不对,
首先有很多天才,由于种种原因没有参加选拔,但是他们是天才
他们去要饭,他们就是丐帮的帮主; 他们去卖肉,就是肉霸; 他们干什么都能出人头地。 另外还有很多人才,他们所擅长的方向,或许不是考试的项目, 但是他们在其他的方面有过人之处。
比如祖冲之可能不会写诗; 再比如那些赚大钱的温州老板 其实来美国的这些人,很多是天才, 但是更多的人,只是选拔机制里面的残次品而已
很多人很惆怅的说“我现在的工作,其实根本用不了那10多年学习的知识” 可是说这话的同时,你们想过么? 你们现在所做的很多东西,随便找个天资一般的人,训练个半年就够了 但是,想过没有,这个位子为什么是你? 因为你一路通过了这么多的选拔,虽然你不是天才, 但是社会必须给你提供一个好的归宿,这才是保障社会将来能运行的前提; 也保证以后的日子里,尽可能多的人都会加入到这个选拔当中来。 所以,虽然你客观上被淘汰了, 但是,你仍然是这个机制的受益者。
-------------------------
四,认清楚阶级的作用 ------------------------- 毛主席教导我们 我们生活在阶级的社会当中,每个人无不被打上深深的阶级烙印。 正如前面所说
对于天才,不论在哪个行当都能出头。比如丐帮帮主。。。 但是随便一个资智平平,甚至很差的太子党,都活得比丐帮帮主好 这就是阶级的作用。 阶级客观存在,我们无法克服,只能适应
唯一的办法,就是凭借自己的努力,爬到更高的阶级上去。 很多人在子女的教育上,过多强调国内阶级的存在,以及副作用。
其实天底下都是一样的, 美国的阶级也无处不在 举个例,我认识一个 破死刀
国内给了一个很好的工作机会,不回去, 要为了孩子留这边,说将努力攒钱, 来送他孩子去私立学校。 我实在没好意思说穿,
但是大家来想一想,为什么美国的精英大部分都出自私立学校? 不是因为教育好, 而是因为私立学校本身就是一个圈子, 在里面结交的人才是未来成功的资本。 (这个类似与中国古代的门阀) 试想,一个 破死刀 的孩子,进入了私立学校 人家家长都是医生,律师,这孩子能融入那个圈子么? 如果失去了那个圈子,去私立又有什么意义呢? 更不要说下课的时候,人家孩子父母的林肯车来接送的时候
他爸爸开着一辆10年旧的凯美瑞停在学校门口,给孩子多大的心理压力。 有些人要抬杠了,说“我从小注意培养,我儿子能融入的” 我要告诉你,很遗憾,如果你儿子是天才,他在哪里都能出头 如果你儿子不是,你把他塞进了另外一个和身份不符的阶级里 两代人都没有好结果。 7/23/2009 日全食(一)
我对这次日全食特别不敏感,报纸上提前好几天就叫上了,我却一副不屑的样子“没见过日全食啊?!”加上杭州这阵子太热,等下雨,主观上盼望阴天。综上吧,21号那天思量了再三,没给我数码相机的电池充电。
22号早上出门,天上多云,心想正好省事了,随着时间慢慢推移到八点多,还是跟着周围的情绪坐立不安了,赶紧跑到窗前,别说,这会老天还真给面子,虽然也有云,但太阳露脸了,心想相机没充电可真遗憾。
邻座的同事准备的很充分,电池新充的电,拿出来一阵拍,而我与其他n个人一起,轮流借仅有的两个观测眼镜,戴上,看两眼,传给下一个人。我这个邻座的同事照了一会,发现端得不稳,回办公室拿来三角架,架在窗台上,上相机,调角度,引来四周小女生的尖叫不绝于耳“哇,董哥,太专业了啊~~~”,肉麻的,而我只是那个把观测眼镜放在镜头前,配合的那个打下手的。。。。
所谓机会只留给有准备的人,这句话里两层意思。一,要对机会敏感,要宁可错杀一百不能放过一个。这次日全食,我却迟钝成这样,自己也很无语(“五百年一次的,你还想咋样啊?”)。二,说到准备,不得不说我同事那个三角架,放办公室里一年多了,之前就从来没用到过(他的相机也是三两个月不开一次工的),这次突然拿出来就突然大放异彩,惹得一帮妞崇拜的眼光,他自己也说“多亏这三角架一直忘在办公室里了”。
这次的收获,很深刻。
中午就去超市买了个三角架。
(二)
五百年,这个数字+单位,让我想起了《大话西游》,没赶上拿相机照相,只是遗憾之一,更遗憾的是这个日全食没有人和我一起看。
五百年之后,地球毁灭了吧?
(三)
日全食很好看,尤其全黑的时候,黑黑的很神秘,然后开始放光的那一刻也很神奇,感叹大自然的伟大,语言描述不出来,上图吧。 7/2/2009 TIC tic是三个单词的缩写。
a股在3k点后立刻一个放量大涨,不管港股的下跌,不管欧美的消费不振,股市反复,不管周边国家股市的战战兢兢,自己闷头上涨。
问一个简单的问题:“6-9个月后企业的盈利能反映今天的股价吗?”
外部游资这次还是比较克制的,再加上中国的资本管制,没有大量进来,没想到国内的散户+机构就把股指抗上来了。看着中国股市,只有无语的份啊。
THIS IS CHINA. 6/29/2009 2008-2009年报基金名称:紫丁香基金
基金经理:Marklittle
创建时间:20080715
披露日期:20090630
持仓情况
(20090629收盘价为准)
证券代码 证券名称 比例 盈利率 600048 保利地产 69.79 99.33
601398 工商银行 28.73 40.73
601988 中国银行 1.48 20.35
总盈利率 83.95
未经审计,能有个位的误差。
资金量就不说了,实在太没劲,基本上,一边拿了工资,另一边就扔进了股市。
总的来说,跑过指数还是比较难的,我的成绩勉强跟上指数了吧。后市不看好,我认为企业的盈利不会那么快恢复,本轮上涨主要还是流动性驱动,基本面上,以新的泡沫来救旧的泡沫是一个不可持续的过程,现在还没有牛市到来的背景和条件。
6/26/2009 mj,走好 这个世界有两个mj,一个换上短裤还能打球,另一个只能在人们的回忆里劲舞了。
最初知道杰克逊的时候,很不感冒,满地都是他的fans,太没意思了,不就是舞跳的酷么;后来发现歌曲很好,尤其节奏舒缓的几首大大出乎我预期,那个拯救世界还是去非洲赈灾做的,难得啊;再后来,发现他的动感的歌曲好爽啊;再再后来,迷上了他的舞步。。。。。。。现在,在打饭排队的时候,在等车的时候,在其他需要站立的时候,我这个干啥事都慢两拍的家伙,呵呵,脚下下意识的走着moon walk。
20世纪最伟大艺人,他应得这个荣誉! 4/29/2009 下半年的走势 2月小涨3月大涨,这轮反弹有两个解释:1,前面的1k6调整非常过度;2,过年了,大家把年终奖啊,打麻将赢得钱啊,划了划了都买股票了,银行不也慷慨的发了几万亿的贷款么。盈利方面,这几个月的报表开始难看了,虽然官方说正在触底,可底哪能那么快就过去,政府的调控半年能出眉目就不错了。
股市怎么走,我的答案是--涨,原因就一条,流动性,说白了闲钱还是得往中国股市里扔。国内信贷泛滥,入股市是肯定存在的;国外,基准利率已经为0了,所以外部游资会排着队入场的。光看国内货币供应的话,抗上3k5,5成的可能性吧,如果算上外资,8成的可能性年内能到3k5,最高点到4k也有可能。现在入场的话,亏能亏2成,大盘到2k,赚能赚一倍!
总得来说,股民很健忘,历史会重演。3k5之后,就要小心了,小心潮水退后裸死在沙滩上。 4/8/2009 那个23号我可以接受失败,但无法接受放弃 --- 迈克尔乔丹
“我并不觉得高兴,我不希望自己站在这里,被介绍入选名人堂,你应该能明白这意味着什么———你的篮球生涯彻底结束了。我一直都这么看待这件事。所以,我真的希望二十多年以后这一天才会到来,或者等到我死后,等一切结束以后。”“你本来可以一直这样认为,只要换上短裤,你就能随时回到场上打球。可是,现在你进入了名人堂,你还能这么做吗?”“看看吧,”乔丹继续说道,“这是一项伟大的荣誉。这是对每一位球员最崇高的敬意。但是,对我来说,我心里却总是希望你们能一直认为,认为我还能回来,回到球场,继续打球。我真的希望你们能一直这么想,然后总是得不到一个确切的答案,我希望你们总也不会知道我到底还能不能做到(复出)。”“我还能做到吗?”乔丹有些哽咽。 “不,”他随即斩钉截铁地回答道,“但是,我真的希望你们能一直那么认为。” 2/25/2009 Music and Lyrics 引进时翻译成k歌情人。认识这部电影的顺序是这样的:先是在电视上看到了节选,发现这个主题歌很好听,然后down了歌曲,听了一遍就喜欢了,最后看的电影,很不错。剧情很好莱坞的,女一号巴里摩尔,pp的,不过有些地方演绎的有点假,当然也不能怪她,情节本身就太童话了;休格兰特,好多地方让我笑的忘乎所以了。这是部很适合两个人看的电影,sigh~
主题曲way back into love,觉得歌词写得很好,旋律也好听。歌名我翻译为重返爱情,字幕给出的是重拾旧爱,不如我翻译的好,嗯。 1/30/2009 写在牛年伊始 把这些话写下来,作为新年里对自己的期望,给自己的生活找个方向:
经常阅读让生活更美好、工作更有效、为人更随和的书籍,热爱生活、热爱工作、热爱学习、热爱朋友、热爱篮球、热爱艺术、热爱摄影,有一个愿望:想感受世界顶尖企业的工作气氛;有一只拉布拉多;时刻不忘为去欧洲旅行而努力;坚信最艰难的时期已经过去,明天一定比今天好!身体健健康康,帅气阳光^^ 11/21/2008 The legend of one MVP 借这次篮球赛的光,终于可以更新blog了。
公司这次篮球赛一共四支队:一部,老员工里有几个打球的但新员工打球的不多;外部资源,好多东北人的,原以为会比较难打;二部,打篮球的新员工好多去了二部,实力很强,一副冠军志在必得的样子;我们测试部,之前公司篮球队的五个主力有四个在测试部,实力也很强。本来是小组单循环再打决赛的,结果二部和我们都是两战全胜,小组赛最后一场也就升级为总决赛。
第一场打一部,现在看来最轻松的,实力的差距放在那里。一次背后换手的上篮没进,一次背后传球的助攻被浪费,太不完美太不处女座了啊~~~
第二场打外部资源,他们队员里好多辽宁的。这场比赛我们的拉拉队,除了球队名单上的队员以外,只有一个部门的二把手。这场比赛真是痛苦的经历,因为二部从上到下视我们为对手,为外源加油,外部资源本身又有好多mm!每次进一个球,场上一点声都没有,每次被灌了一个球,场边“哇~~~~~”,贼响啊。整的我每次都以为反超了呢,结果一直不能放松,最后赢了16分。有两个空中接力进的球蛮不赖的。
今晚的决赛,测试部对二部。部门一把手邮件动员拉拉队,确实来了不少人,女生来的真不少,我在场上感觉好受多了。而且部门的女生喊起来不用喇叭的,赞一个。开局被打成7:2,二部一上场的气势很盛的,一上来这比分确实很不爽,哦,都忘了当时怎么挺过来的了,进了一个三分之后,我们气势上就平手了吧。第二节你来我往,比分没拉开,半场结束时领先三分。二部之前两场比赛从没落后过,再加上对冠军志在必得的架势,其实他们心理上更难受。
第三节又是绞肉机。其实打半场和打全场是两码事,打着玩和打比赛是两码事。心理素质很关键,嘿嘿,第四节吧,我又进了个三分,一共是三投两中,这命中率,哈哈,蒙人没问题的。最后几分钟最多领先八分,终场赢六分,37:31。
真的感谢部门的拉拉队,总算是来了,而且表现的很棒,那叫声一般人听到绝对立刻脑袋嗡嗡的。打完了颁奖,冠军还整个奖杯,呵呵。我在场下等着换衣服呢,听见喇叭里喊我的名字,原来最后一个奖是MVP,我晕,颠颠颠跑过去了,拿个红信封,咔嚓了两张照片,一帮人问我信封里面多少米。。。。。
回到公司拿衣服,偷偷摸摸的做贼似的打开信封,里面一张红纸,看了半天觉得是不是那个数字少写个零啊。后来一想,这太不豁达了,想拿钱打nba啊。
出点名是在所难免了,我能做的,还是低调吧。 ps:好像部门最pp那妞没看比赛,晕! 9/14/2008 彼得林奇的观点和最后的结论 彼得林奇相信一条古老的交易准则:如果你因预期发生某件事而购买了一只股票,而这件事又没有发生,那么你最好还是趁早卖掉它。对于这一思想,华尔街有一种带有讽刺意味的表达方式:“投机不成功才会变成投资”。你买股票是基于某种预期,而你的预期并没有实现,这意味着你当初不该买这只股票。因此你现在实在没有理由继续持有这只股票,而应该尽快全部卖掉它。林奇说他经常过早抛售股票。“不过,你没有持有的股票的上涨不会对你造成伤害。只有你持有的股票才能让你破产。”
林奇极其蔑视许多--如果不是大多数--被当作股市成功捷径兜售的法则或共识。他从来不看那些被信托公司视如至宝的经济“评论”或行业分析报告,也不理会权威专家对经济形式和市场的分析预测。他也不相信所谓的“现代投资组合理论”,这套故弄玄虚的理论实质上是说你不用理解你要投资的公司,不过你应该将它们分类并在这鞋大类之中选择投资目标。
把握住趋势反转的时机。在上市公司命运转好之前先进行少量投资,然后等股价反转时再逐步追加投资。
一种可怕的错误投资策略是,仅仅因为一只股票下跌而买进它,这种做法又被称为抄底。你要对股票的真正价值有一个清晰的概念,并只在股价偏离这个价值时再入市,而不是一看到股价处于阶段性低点就盲目抄底。
“但是你必须知道你何时是错的,然后将股票卖掉。我大多数股票都买错了。”
最后的结论
损失最重的投资者通常都是那些做得过火以至于弄巧成拙的人。而且这样做实在没必要:即使是一个很小的增长率,长期保持下去也可以让你变得极其富有。
财富目标定得过高,就是说超出你所需要的--实际上是不理性的。为了达到目的,你不得不放弃许多东西,而且即使你最终能如愿以偿,也不一定能过得比以前幸福。莎士比亚说过,你的本性会被他所做的工作改变,就像印染工的手。而在追求巨额财富的过程中你会变成一个惟利是图的人。
事实上,上帝造人就是为了让我们在你争我夺的喧嚣中体验快乐和艰辛,而巨额财富就在和我们玩捉迷藏的游戏。
一个理性的方法是,过一种有意义的生活,只将财富当做生活的“副产品”。幸福属于那些能够兼顾家庭、工作以及公民义务并知足常乐的人。
8/26/2008 约翰内夫的观点 判断“好”公司的标准:1,良好的资产负债表;2,令人满意的现金流;3,净资产收益率高于平均水平;4,能干的管理层;5,有持续增长的潜力;6,有一种极具吸引力的产品或服务;7,产品或服务的市场空间很大。
卖出股票时,一开始先大量抛售,然后再将剩下的股票在估价继续上涨的过程中逐批卖掉。如果股价下跌,那么就停止卖出;如果股价跌得厉害,考虑重新买进。
应该在一直股票完全达到增值潜力之前将其卖掉,你必须留给下一个买家足够的激励来接手你脱手的商品。
8/21/2008 索罗斯的观点 1 开始先建立小的头寸。如果市场走势如预期的那样,那么可以建立一个更大的头寸。他认为,在浮动利率时代,当趋势延续时,走势的短期波动一般较小。
2 市场是不会说话的,不要奢望无所不知。“投资者是以有限的资金和智慧在操作:他们不必知道每一件事。只要他们对某方面的了解胜过其他人,他们就有优势。”
3 一个投机者从一开始就必须确定他愿意承担的风险水平。这也是最难的事情之一。
4 股票市场行为的理论主要有三种:基本面分析,技术分析,“有效市场”理论。“相信有效市场理论的人越多,市场就越没有效率”;技术分析缺乏一个坚实的理论基础,而且许多内容都自相冲突;基本分析认为价值--由公司的盈利能力、资产等指标来衡量--决定股票价格,股票价格最终还是要由价值决定。
5 投资的正反馈现象。投资者的预期会使市场的表现按预期发展,市场的表现又会强化投资者的预期,于是,最重要的是拐点的把握。
6 每位成功交易员,最重要的品质之一就是愿意立即改变操作策略,当意识到犯了错误时。
7 “我的方法之所以有用,不是因为它能让我作出正确的预测,而是因为它允许我改正错误。”
8/20/2008 菲利普·卡雷特的12条格言 1 持有10只以上的股票,而且这些股票必须能覆盖5个不同行业。
2 每6个月对所持有的每种证券至少做一次重估。
3 必须保证占总资产一半以上的证券出现盈利。
4 在分析任何股票时都要将收益作为最后才考虑的因素。
5 处理亏损的头寸果断,但不要急于平仓有盈利的头寸。
6 不要把多于25%的资金投入到你还了解的不够详细的证券上。
7 像躲避瘟疫一样躲避“内部信息”。
8 寻找事实,而不是别人的意见。
9 做证券估价时不要过分依赖那些呆板的公式。
10 当股市高位运行、利率上涨、经济繁荣时,至少应把一半资金投在短期债券上。
11 尽量少借钱或只在股市低迷、利率很低或正在下跌、经济不景气时借钱。
12 要用适当比例的资金购买前景十分乐观的公司的长期股票看涨期权。 8/3/2008 杭漂一个月纪念 从科大出来的时候很匆忙,像逃荒一样,呵呵。3号晚上的火车,正好一个月了。
那些天科大里到处都是离别的气氛,让人难受的。不让自己去多想,仅仅简单的跟自己说,是时候离开了,去收拾东西吧。
关于科大,关于在科大的这七年,有很多话想说,很多文字想写下来的,简单的用一两句话就对这七年做评价是不负责任的。不过现在不是总结的时候,等几个月之后,或者一两年之后,心情平静了,往事沉淀了,我会好好总结这七年的得失,以及对我人生的影响。
然后我来到了这个被称作“人间天堂”的城市,刚开始觉得一点也不天堂,热的我浑身是热痱子,而且这里的蚊子很猛,感觉比哈尔滨的蚊子大两号似的。慢慢的,观察这个城市,发现这个城市不错,很有她自己的一套特色:
这个城市很干净,比如建筑工地里的大卡车,开出工地之前会有人拿水枪把四个车轮冲一遍,不让泥巴带进马路上。
这个城市很人性化,有那种免费的自行车,有为等信号灯的骑车人架起的遮阳棚,公交卡的优惠政策有两种,公交站有电子的显示下辆车还距离多远的牌子。
这个城市的人很精明,刚接触的时候会有一种“大开眼界”的感觉。以前觉得自己简简单单的风格挺好,现在还是取长补短吧。
这个城市有自己的logo,让人看了既羡慕又眼馋。
这个城市的妞,呵呵,江南女子,和哈尔滨的完全两种风格啦,觉得她们说普通话很有意思。至于pp不pp么,来之前很多人向我灌输美女如云什么的,我才不信呢,所以期望一直不是很高,来了也没感觉多失望,呵呵,其实pp妞哪都有的啦,问题是跟我没啥关系。
这里确实是个适合生活的地方,就是夏天太热。
除了来租房时去西湖坐了一中午,我哪也没去玩,这里山山水水的太多了,多到觉得反正地方那么多,以后慢慢去逛吧。
生过一场病,差点格屁,其实就是感冒,烧到39度2,然后在医院打点滴的时候还晕倒了,现在想想还后怕,出来混,生病是件很烦人很烦人的事情啊。
我已经正式决定以后自己做饭了,先从土豆丝开始祭刀!上周第一次切土豆丝,整得跟薯条似的;昨晚是第二次做,好多了,吃的时候大受欢迎,我的土豆丝在五盘菜里是最先见底的,娃哈哈哈~~
我知道有些事情不是我自己说了算的,那就祝我在这里有个好运气吧! 7/11/2008 212期《财经》上的一段话zz47页《汶川大地震遇难者》 《财经》全体同仁 文
我们命定了的生存方式,便是不得不在物欲世界里活下去却仍有拯救自己心灵的冲动。事情往往是这样的,随着我们物欲的开发,随着我们在世的成熟,我们不断地加重着心灵的遮蔽,将我们的童真遗忘。于是,我们在沉沦中继续要求着沉沦,在遗忘中追赶更深重的遗忘……然而,依旧有真挚的瞬间涌现出来,当飞机突然从1。3万米高空跌落,当列车相撞,当火山喷发,当大地震动的时候,美酒和豪宅,股票和职称,婆媳争吵和办公室政治……所有这些在那一瞬间变得毫不相干。真挚涌现,让我们落泪,让我们思念,让我们反省生活与死亡,让我们窥见永恒。 7/7/2008 从Vista到XP Vista在我的电脑上存活了不到12小时,我连了解这个新OS的欲望都没有就迫不及待的格了,安装XP发现有问题,按网上的教程,在装了二十多个驱动和无数次重启之后,简洁的XP终于回来了。。。。。。 6/26/2008 什么是契约——Eiffel的观点zz 假设你现在正在面试,主考不紧不慢地给出下一道题目:“请用C语言写一个类似strcpy的函数。要考虑可能发生的异常情况。”
你会怎么做呢?很明显,对方不是在考察你的编程能力,因为复制字符串实在太容易了。对方是在考察你的编程风格(习惯),或者说,要看看你编码的质量。 下面是多种可能的做法: void string_copy1(char* dest, const char* source) { assert(dest != NULL); /* 使用断言 */ assert(source != NULL); while (*source != '\0') { *dest = *source; ++dest; ++source; } *dest = '\0'; } void string_copy2(char* dest, const char* source) { if (dest != NULL && source != NULL) { /* 对错误消极静默 */ while (*source != '\0') { *dest = *source; ++dest; ++source; } *dest = '\0'; } } int string_copy3(char* dest, const char* source) { if (dest != NULL && source != NULL) { while (*source != '\0') { *dest = *source; ++dest; ++source; } *dest = '\0'; return SUCCESS; /* 返回表示正确的值 */ } else { errno = E_INVALIDARG; /* 设定错误号 */ return FAILED; /* 返回表示错误的值 */ } } // C++ void string_copy4(char* dest, const char* source) { if (dest == NULL || source == NULL) throw Invalid_Argument_Error(); /* 抛出异常 */ while (*source != '\0') { *dest = *source; ++dest; ++source; } *dest = '\0'; } 如果你是主考,不知道面对这样四份答卷,你的评分如何?当然,你可以心里揣着一个“标准答案”,“顺我者昌,逆我者亡”。但是如果以认真的态度面对这四份答卷,我想很多人都会难以抉择。 因为这里涉及到了软件开发中的一个带有本质性的难题——错误处理。 历来错误处理一直是软件开发者所面临的最大困难之一。Bjarne Stroustrup在谈到其原因时说道,能够探察错误的一方不知道如何处理错误,知道如何处理错误的一方没有能力探察错误,而直接采用防御性代码来解 决,会使得程序的正常结构被打乱,从而带来更多的错误。这种困境是非常难以应对的——费心耗力而未必有回报。因此,更多的人采用鸵鸟战术,对可能发生的错 误视而不见,任其自然。 C++、Java和其他语言对错误处理问题的回答是异常机制。这种机制在正常的程序执行流之外开辟了专门的信道, 专门用来在不同程序模块之间报告错误,解决上述错误探察与处理策略分散的矛盾。然而,有了异常处理机制后,开发者开始有一种倾向,就是使用异常来处理所有 的错误。我曾经就这个问题在comp.lang.c++.moderated上展开讨论,结果是发现有相当多的人,包括Boost开发组里的很多专家,都 认为异常是错误处理的通用解决方案。 对此我不能赞同。并且我认为滥用异常比不用异常的危害更大。 The Pragmatic Programmer是一本在国外程序员中间颇为流行的书,其中在讲到错误处理时,有一句箴言: “只在真正异常的状况下使用异常。” 书中举了一个例子,如果你需要当前目录下的一个名叫“app.dat”的文件,而这个文件不存在,那么这不叫异常状况,这是你应该预料到的、并且显式处理 的情况。而如果你要到Windows目录下寻找user.dat文件,却没找到,那才叫做异常状况——因为每一个正常运行的Windows系统都应该有这 个文件。 我非常赞成书中的那句忠告,可是究竟什么是“真正异常”的状况?书中的这个例子显然只是一个颇具感性的、寓言似的故事,具有所有寓言的共同特点——读起来觉得豁然开朗,收获很大,实际上帮不了你什么忙。这种例子对于我们的实际开发,仍然提供不了真正的帮助。 究竟应该如何看待错误?怎样才能最好地错误处理? 说实话,在这两个问题上,我们所见到的大部分语言都没有给出很好的回答。C秉承一贯风格,把所有的东西推给开发者考虑;Ada发明了异常,但是又为异常所 累(知道阿里亚纳5火箭的处女航为什么失败吗?);C++企图将Ada的异常机制融合进自己的体系中,结果异常成了C++中最难以处理的东西;Java和 C#显然都没有耐心重新考虑错误处理这桩事,而只是简单的将C++的异常机制完善化了事。 与上述这些语言不同,Eiffel从一开始就把 错误处理放在核心的位置上予以考虑,并以“契约”思想为核心,建立了整个的错误处理思想体系。在我了解的语言里,Eiffel是对这个问题思考最为深刻一 个,因此,Eiffel历来享有“高质量系统开发语言”的声誉。(事实上,Bertrand Meyer很不喜欢别人称Eiffel为“编程语言”,他反复强调,Eiffel是一个Software Development Framework。不过本文只涉及语言特性,所以姑且称Eiffel语言。) Eiffel把软件错误产生的本质归结与“契约”的破坏。 Eiffel认为,一个软件能够正常运作,正确完成任务,是需要一系列条件的。这些条件包括客观运行环境良好,操作者操作正确,软件内部功能正确等等。因 此,软件的正确运行,是环境、操作者与软件本身三方面合作的结果。相应的,系统的错误,也是由于三者中有一方没有正确履行自己的职责而导致的。细化到软件 内部,每个软件都是由若干不同的模块组成的,软件的错误,是由于某些模块没有正确履行自己的职责。要彻底杜绝软件错误,只有分清各自模块的责任,并且建立 机制,敦促各模块正确履行自己的责任,然后才有可能做到Bug-free。(鉴于系统中错综复杂的关系,以及开发者认识能力的局限,我认为真正无错误的系 统是不可能的。但是当前一般软件系统中的质量问题远远比应有的严重。) 如何保证各方恪守职责呢?Eiffel引入了契约(Contract)这个概念。这里的契约与我们通常所说的商业契约很相似,有以下几个特点: 1. 契约关系的双方是平等的,对整个bussiness的顺利进行负有共同责任,没有哪一方可以只享有权利而不承担义务。 2. 契约关系经常是相互的,权利和义务之间往往是互相捆绑在一起的; 3. 执行契约的义务在我,而核查契约的权力在人; 4. 我的义务保障的是你的利益,而你的义务保障的是我的利益; 将契约关系引入到软件开发领域,尤其是面向对象领域之后,在观念上给我们带来了几大冲击: 1. 一般的观点,在软件体系中,程序库和组件库被类比为server,而使用程序库、组件库的程序被视为client。根据这种C/S关系,我们往往对库程序 和组件的质量提出很严苛的要求,强迫它们承担本不应该由它们来承担的责任,而过分纵容client一方,甚至要求库程序去处理明显由于client错误造 成的困境。客观上导致程序库和组件库的设计和编写异常困难,而且质量隐患反而更多;同时client一方代码大多松散随意,质量低劣。这种情形,就好像在 一个权责不清的企业里,必然会养一批尸位素餐的混混,苦一批任劳任怨,不计得失的老黄牛。引入契约观念之后,这种C/S关系被打破,大家都是平等的,你需 要我正确提供服务,那么你必须满足我提出的条件,否则我没有义务“排除万难”地保证完成任务。 2. 一般认为在模块中检查错误状况并且上报,是模块本身的义务。而在契约体制下,对于契约的检查并非义务,实际上是在履行权利。一个义务,一个权利,差别极大。例如上面的代码: if (dest == NULL) { ... } 这就是义务,其要点在于,一旦条件不满足,我方(义务方)必须负责以合适手法处理这尴尬局面,或者返回错误值,或者抛出异常。而: assert(dest != NULL); 这是检查契约,履行权利。如果条件不满足,那么错误在对方而不在我,我可以立刻“撕毁合同”,罢工了事,无需做任何多余动作。这无疑可以大大简化程序库和组件库的开发。 3. 契约所核查的,是“为保证正确性所必须满足的条件”,因此,当契约被破坏时,只表明一件事:软件系统中有bug。其意义是说,某些条件在到达我这里时,必 须已经确保为“真”。谁来确保?应该是系统中的其他模块在先期确保。如果在我这里发现契约没有被遵守,那么表明系统中其他模块没有正确履行自己的义务。就 拿上面提到的“打开文件”的例子来说,如果有一个模块需要一个FILE*,而在契约检查中发现该指针为NULL,则意味着有一个模块没有履行其义务,即 “检查文件是否存在,确保文件以正确模式打开,并且保证指针的正确性”。因此,当契约检查失败时,我们首先要知道这意味着程序员错误,而且要做的不是纠正 契约核查方,而是纠正契约提供方。换句话说,当你发现: assert(dest != NULL); 报错时,你要做的不是去修改你的string_copy函数,而是要让任何代码在调用string_copy时确保dest指针不为空。 4. 我们以往对待“过程”或“函数”的理解是:完成某个计算任务的过程,这一看法只强调了其目标,没有强调其条件。在这种理解下,我们对于exception 的理解非常模糊和宽泛:只要是无法完成这个计算过程,均可被视为异常,也不管是我自己的原因,还是其他人的原因(典型的权责不清)。正是因为这种模糊和宽 泛,“究竟什么时候应该抛出异常”成为没有人能回答的问题。而引入契约之后,“过程”和“函数”被定义为:完成契约的过程。基于契约的相互性,如果这个契 约的失败是因为其他模块未能履行契约,本过程只需报告,无需以任何其他方式做出反应。而真正的异常状况是“对方完全满足了契约,而我依然未能如约完成任 务”的情形。这样以来,我们就给“异常”下了一个清晰、可行的定义。 5. 一般来说,在面向对象技术中,我们认为“接口”是唯一重要的东西,接口定义了组件,接口确定了系统,接口是面向对象中我们唯一需要关心的东西,接口不仅是 必要的,而且是充分的。然而,契约观念提醒我们,仅仅有接口还不充分,仅仅通过接口还不足以传达足够的信息,为了正确使用接口,必须考虑契约。只有考虑契 约,才可能实现面向对象的目标:可靠性、可扩展性和可复用性。反过来,“没有契约的复用根本就是瞎胡闹。(Bertrand Meyer语)”。 由上述观点可以看出,虽然Eiffel所倡导的Design By Contract在表象上不过是系统化的断言(assertion)机制,然而在背后,确实是完全的思想革新。正如Ivar Jacoboson访华时对《程序员》杂志所说:“我认为Bertrand Meyer的方向——Design by Contract——是正确的方向,我们都会沿着他的足迹前进。我相信,大型厂商(微软、IBM,当然还有Rational)都不会对Bertrand Meyer的成就坐视不理。所有这些厂商都会在这个方向上有所行动。” 作者简介: 孟岩:国内著名的软件工程与面向对象专家。多部软件工程与面向对象技术书籍的译者。翻译和审校了《C++标准库》《C++沉思录》《敏捷软件开发》《Design by Contract原则与实践》等多部著作。 EiffelEiffel是由Eiffiel公司(现在被称为ISE—Interactive Software Engineering)在1985年设计的。最初ISE在项目开发中,需要一种能体现现代软件工程学思想、现代的、面向对象的开发环境,但ISE认为当 时没有这样的工具。因此,ISE开发了Eiffel作为开发产品的内部工具。Eiffel的名字来自工程师Gastave Eiffel,他为1889年世界博览会设计了著名的艾菲尔铁塔,并在计划的工期和预算内完成了这个工程。ISE希望用Eiffel所构建的软件工程项目 也能达到这样的目标。 1986年10月,Eiffel 1在OOPSLA(Object-Oriented Programming Systems Language and Applications)大会上一举成名,由此踏上了商业化之路。随后几年中,Eiffel在美国、加拿大、欧洲和远东地区迅速传播,实施了一系列成功 的工程项目。同时,学术界也认为Eiffel是教授各种软件概念的理想途径,世界上很多大学都已经采用Eiffel作为主要的教学语言。 1988年,Bertrand Meryer出版了《Object-Oriented Software Construction》,书中介绍了对象技术的概念和Design By Contract™,并用Eiffel作为描述语言进行了讲解。这本经典著作被称为“面向对象软件开发圣经”,极大地促进了人们对Eiffel的认可。 |
|
|