友好连接

2008年9月27日星期六

彻底解决局域网ARP攻击

一般ARP攻击的对治方法
  现在最常用的基本对治方法是“ARP双向绑定”。
  由于ARP攻击往往不是病毒造成的,而是合法运行的程序(外挂、网页)造成的,所杀毒软件多数时候束手无策。
  所谓“双向绑定”,就是再路由器上绑定ARP表的同时,在每台电脑上也绑定一些常用的ARP表项。
  “ARP双向绑定”能够防御轻微的、手段不高明的ARP攻击。ARP攻击程序如果没有试图去更改绑定的ARP表项,那么ARP攻击就不会成功;如果攻击手段不剧烈,也欺骗不了路由器,这样我们就能够防住50%ARP攻击。
  但是现在ARP攻击的程序往往都是合法运行的,所以能够合法的更改电脑的ARP表项。在现在ARP双向绑定流行起来之后,攻击程序的作者也提高了攻击手段,攻击的方法更综合,另外攻击非常频密,仅仅进行双向绑定已经不能够应付凶狠的ARP攻击了,仍然很容易出现掉线。
  于是我们在路由器中加入了“ARP攻击主动防御”的功能。这个功能是在路由器ARP绑定的基础上实现的,原理是:当网内受到错误的ARP广播包攻击时,路由器立即广播正确的ARP包去修正和消除攻击包的影响。这样我们就解决了掉线的问题,但是在最凶悍的ARP攻击发生时,仍然发生了问题----当ARP攻击很频密的时候,就需要路由器发送更频密的正确包去消除影响。虽然不掉线了,但是却出现了上网“卡”的问题。
  所以,我们认为,依靠路由器实现“ARP攻击主动防御”,也只能够解决80%的问题。
  为了彻底消除ARP攻击,我们在此基础上有增加了“ARP攻击源攻击跟踪”的功能。对于剩下的强悍的ARP攻击,我采用“日志”功能,提供信息方便用户跟踪攻击源,这样用户通过临时切断攻击电脑或者封杀发出攻击的程序,能够解决问题。
  彻底解决ARP攻击
  事实上,由于路由器是整个局域网的出口,而ARP攻击是以整个局域网为目标,当ARP攻击包已经达到路由器的时候,影响已经照成。所以由路由器来承担防御ARP攻击的任务只是权宜之计,并不能很好的解决问题。
  我们要真正消除ARP攻击的隐患,安枕无忧,必须转而对“局域网核心”――交换机下手。由于任何ARP包,都必须经由交换机转发,才能达到被攻击目标,只要交换机据收非法的ARP包,哪么ARP攻击就不能造成任何影响。
  我们提出一个真正严密的防止ARP攻击的方案,就是在每台接入交换机上面实现ARP绑定,并且过滤掉所有非法的ARP包。这样可以让ARP攻击足不能出户,在局域网内完全消除了ARP攻击。
  因为需要每台交换机都具有ARP绑定和相关的安全功能,这样的方案无疑价格是昂贵的,所以我们提供了一个折衷方案。
  经济方案
  我们只是中心采用能够大量绑定ARP和进行ARP攻击防御的交换机――Netcore 7324NSW,这款交换机能够做到ARP绑定条目可以达到1000条,因此基本上可以对整网的ARP进行绑定,同时能杜绝任何非法ARP包在主交换机进行传播。
  这样如果在强力的ARP攻击下,我们观察到的现象是:ARP攻击只能影响到同一个分支交换机上的电脑,这样可能被攻击到的范围就大大缩小了。当攻击发生时,不可能造成整个网络的问题。
  在此基础上,我们再补充“日志”功能和“ARP主动防御”功能,ARP攻击也可以被完美的解决。
  ARP攻击最新动态
  最近一段时间,各网吧发现的ARP攻击已经升级,又一波ARP攻击的高潮来临。
  这次ARP攻击发现的特征有:
  1、 速度快、效率高,大概在10-20秒的时间内,能够造成300台规模的电脑掉线。
  2、 不易发现。在攻击完成后,立即停止攻击并更正ARP信息。如果网内没有日志功能,再去通过ARP命令观察,已经很难发现攻击痕迹。
  3、 能够破解最新的XP和2000的ARP补丁,微软提供的补丁很明显在这次攻击很脆弱,没有作用。
  4、 介质变化,这次攻击的来源来自私服程序本身(不是外挂)和P2P程序。

2008年9月24日星期三

英语学习的误区和方法(2):造成“哑巴英语”的最主要原因

系列文章目录索引:《英语学习的误区和方法
 造成“哑巴英语”的最主要原因
  什么叫做“哑巴英语”?零英语基础的人不叫哑巴英语。哑巴英语是特指学习了几年以上的英语,有一定的阅读能力,但听说能力很差或根本不会的情况。特别是已经过了四六级的同学。大家已经学英语十年以上,每周6小时左右,总共达3000小时的英语学习,还是不会起码的交流。(不过应该声明:其实“一定的阅读能力”也并不高。比如随便拿起一本英文小说,大家会发现不靠其他工具连一页都看不下去。)
  那“哑巴英语”是如何造成的呢?大家想当然的答案是五花八门的。比如一般都会说是“应试教育”造成的。我会考试,所以听不懂,不会说。这显然没抓对因果关系。有人就会说了:是单词量小或单词不会应用,所以要多背单词;还有语法不好,组织句子不熟练,而且CHINGLISH就是语法问题嘛。所以要多研究学习英文语法知识;当然最主要罪魁还是没机会用英文交流,如果有英文环境和交流机会就好了,于是努力寻找,很多人在大街上拦住外国人聊天。这些基本都是对学外语的误解。什么道理?
  我们先来做个实验。我说一句外语大家仔细听。准备好了呵:“SIX FIVE SENVEN THREE SIX EIGHT NINE FOUR”。大家听到了什么?
  答:六个数字,可能是个电话号。
  是几啊?
  “六五七。。。什么什么四。”这是一般同学的答案。
  为什么没听懂?是单词量的问题?不是。是语法问题?不是。是发音问题?不是。那是什么?
  有同学答:您说得太快了。
  可我用的是正常速度呀?外国人不就这速度告诉别人电话号码吗?哪用一个一个慢慢蹦呀?正常速度为什么你听不懂?
  有人答:是不熟练。
  十年前就会了,还说不熟。再说就算你非说不熟,那到底是哪个字听不明白呀?
  答:都好象明白,可怎么感觉反应不过来呢?老师我反应慢。
  快别这么说,你是个正常人,反应挺正常的。不过我倒要问了:你在那里反应什么呢?
  这时总算有人醒悟:我刚才在那里反应中文呢。我刚听英文时,坐在那里在脑子里把它们飞快地转换成中文,才转一半您就说完了。
  原因找到了。大家原来都在那里默默地翻译呢。可在座的没一个翻过来的,是何故?
  正常说话速度是每分钟120到180个字左右,英文中文差不多,一般一句话两秒种就结束了,说话是一句连着一句的。两秒长的一句话,就算所有单词都会,发音语法都没问题,但需要把所有英文字都翻译成中文才明白(还别提分析语法),那需要多长时间?至少四、五秒。这时大家第二句话没听见,第三句都到一半了。听不到,谈何听得懂?障碍已经产生了。短句子(四个单词以下)还好凑合,比如HOW ARE YOU?WHERE ARE YOU FROM?什么的,再快也没问题。一超过四个单词就跟不上了。科学家做过实验:如果听到外语需要必须在大脑中翻译的话,正常速度的语言一般人只能翻译到第三个字就跟不上了,个别人能翻出四个,几乎没有人能超过四个。可大量的句子都是超过四个单词的呀。所以我们很多同学总在那里重复简单英语而提不高。那我练得特熟,翻得特快,行吗?答案是:永远也不行。
  可大家为什么非在脑子里翻译不可呢?因为大家听到英文时实际上脑子里空空没概念,但都学过每个英文字的中文解释,想一下中文解释就明白了。所以都在那里努力“转换”而做不到。那能不能不想中文,听到英文直接就理解?这是一种什么状态?答案很简单:要能用英文思维就行,说白了就是会用英文想事儿了。这个概念十年前还新鲜,现在知道的人越来越多:“会用任何语言流利交流的前提是必须能用这种语言思考,做不到的就永远不能正常交流。”这是结论,没有英文思维,永远也听不懂正常速度的英文,永远也听不了长句子。关于英语思维是英语正常交流的前提这一结论因为已经比较清楚和为人们接受,证据也比较多,所以不用在此辩论。但为什么我们学了十几年的英语都没有英语思维呢?大家看,如果学每个单词时都是通过背它的中文解释学会,就有问题了吧。另外还有个原因:大家可能都曾试图说几句英语。我们想一下说英文的过程是怎样的?大家都是在说之前先想一句中文:我要说这一句了。(停!大家说中文都不可以这样做。我们在说中文时,一句话都说一半了,脑子里都不能预先清楚知道后半句的所有字,继续说才知道。所以到这儿已经不对了。)然后把这一句的所有英文单词找到对应的英文。现在能说了吗?照说还不行,还得组织一下句子,想一下语法吧!用什么时态?过去时?完成时?现在时?进行时?将来时?单数复数?要加S吗?男他女她?等想完这些,20秒已过,对方早走了。于是我们发现,甚至外语学院毕业的同学,在说外语时都采用同一战术:“不想语法了。好不容易找到几个单词,赶紧往外蹦。”于是出来就是中式英语。难道是他们不熟悉语法知识吗?非也。因为根本来不急。大量的实验告诉我们,语法知识的多少和交流的流利程度甚至正确度是没有丝毫关系的。语法书倒背如,还是不能交流,还是出语法错。原因很简单,从说话的思维机制上讲,人在说话时,大脑是禁止思考语法规则的。一旦想规则,人就不能说话了。想一下我们中文都说得这么流利,能去想语法规则吗?主语用这个,谓语用那个,状语放在这里。。。根本不可以!那英语也一样嘛。所以语法知识不但不帮助形成英语思维,反而在捣乱。
  所以大家已经发现,“翻译”和“语法”不但不帮助提高交流能力,反而阻碍英文思维。但大家看到翻译、语法几个字非常熟悉,原因是我们这么多年,就是这么学英语的。大家十几年来,不管是上课还是自学,用的方法叫做“语法-翻译法”,英文叫TRANSLATION-GRAMMAR METHOD 。这种方法是英国人几百年前用来学习希腊语和拉丁语时建立的系统的外语学习方法,通过研究目标语言的语法结构,和单词在自己语言中的翻译去学习这种语言。比如大家当时学这句时:
  THIS IS A CAT。
  这 是 一(只) 猫。
  主语 谓语 数量 宾语
  代词 系动词 不定冠词 名词
  这句话是一般现在时
  陈述句
  第三人称单数
  系表结构
  。。。。语态
  (我已晕菜。小时候想我妈可不是这样教我说中文的呀,外国孩子真可怜。后来才发现外国孩子说英文也不这样学,是中国孩子学英文才这样,是我们可怜。)
  后来知道,全世界都曾普遍使用这种方法学外语,结果都类似:可掌握一定外语知识,都不会交流,时间一久大家就把以前学得知识都仍了。知道其他国家的阶级兄弟也身受其害,感觉好了点。
  所以“语法-翻译法”是明显很有问题的,很多国家早已放弃。但还有一些国家,主要是中国和英国,仍存在一些“语法-翻译法”的捍卫者。本人在以后的章节会根据其他科学依据分析它深层问题,现在就要拍板儿砖的先请。
  至于有人认为是因为自己学的英语过时了这种观点,不用辩论了。课本上的英文没过时,而且无论哪国语,几十年的变化都至于影响到听不懂的地步,个别词而已

英语学习的误区和方法(1):外语学习的主要误区

系列文章目录索引:《英语学习的误区和方法
   前 言
   著名语言学家Greg Thomson说的:“外语学习的原理是如此之复杂,以至于没有人能说清楚;但掌握语言的过程又是如此之简单,以至于不需要说清楚。”讨论语言学习的原理,是件非常复杂的事,在下当然也没把握能描述得很清楚。而且因为外语学习就连学术界都存在很多尖锐的争论,本人也不敢说自己有把握能把争论化解。但还是决定先从简单入手,做些抛砖引玉的工作吧,探讨一下外语学习的真谛,特别是对大家在外语学习上普遍存在的误解进行分析和澄清,希望能对外语学习者有所帮助,对外语教学工作着有所启发,就知足了。
  本人多年来一直在给各高校,企业和其他英语学习者做英语学习方法讲座。讲时从不煽情,从不靠表演噱头,也不搞励志,每次必将严肃的科学依据送给大家。近五年来听众过万,还比较受欢迎,其中有相当部分的人能够非常理解和赞同并提出了很多尖锐问题和改进意见,在此表示深深感谢。曾有很多人奉劝在下以此演讲能力,把风格改为煽情鼓动式,定能红遍全国和累积财富。本人对名无兴趣,否则早就这么做了。也不愿胡说八道而误人子弟。至于财富吗,不是不喜欢,而是已经有够多的了。所以本人很幸运,现在可以摆脱金钱的烦恼,静下心来读书和思考了。现在把以前演讲的部分内容整理一下发在这里,希望和大家探讨。
  对外语学习的主要误区:
  我们普遍对学外语学习方法的认识是:
  1.要有语言环境, 多跟外国人交流,最好是能出国,不久自然就能会说了。
  2.学习外语要多记多背,也就是说是用记忆学语言。
  3.想纠正发音,一定要专听和模仿纯正的发音,比如BBC或VOA那种。
  4.要学习外语语法,如果语法熟练,说句子就正确了。
  5.要有词一定词汇量,要大量背单词。但背英语单词很难。
  6.以前学的是书面语或过时的英语,和现在口语是不一样的,所以我口语不好。
  7.学外语必须非常刻苦,长时间反复练习。
  “全错!而且不但错,事实正好相反!”
  您没看错,我说的正是:“以上这些结论不但是错误的,而且基本上与事实是正好相反的。” 大家对外语学习的误解之深,范围之广,达到了另人惊叹的程度。尽管科技发展到了今天,人们对语言获得过程的误解仍相当普遍,尤其是咱们中国人。中国人对语言学习的误解深来源于中国有着深厚的文化传统以及单一民族和单一语言。我帮大家逐一进行分析和提供分析依据,大家可以自己得出正确结论。
  “怎么会错呢?难道学外语不是在语言环境下最好吗?难道想纠正口音不是要听标准的发音吗?这不是理所当然的事吗?”
  咳,天下有多少事都是看似理所当然,而事实正好相反呢。我们先找一个最简单的分析。就先说第3条,“纠正发音”吧。
  大家一定都认为,要想学好发音,或纠正自己不标准的发音,当然要去听纯正的,标准的发音啦,最好是地道的英国音或美国音了,这还能错?不幸的是,刚好错了,而且正好相反。语音专家发现,成年人要想纠正自己的发音,不能只听标准发音,而是要听大量的 “非标准发音”,也就是说,带口音的发音。比如德国口音的英语,法国口音,意大利口音,印度口音,中国口音等,而且种类越多越好。这是怎么回事?这个结论的来源,要从当年哈佛大学的语音专家们,在做口音研究时,用日本人做试验讲起。
  各位知道为什么做语音实验会用日本人吗?大家普遍会答是因为日本人发音说英语很难听。接着问,那为什么日本人发音难听?每次问到这里,听众中总有些笑声,很多人答曰日本人舌头硬。其实日本人跟大家一样,舌头并不特殊,发音不准的原因是因为他们的日语造成的。大家都知道英语有大约44个发音(元音加辅音),而日语只有大约30个。不是听说日语有50音图吗?很遗憾,日语的五十音图很多是重复的。比如第一行元音:“啊依呜唉喔”,确实是不同,但第二行“喀七库开阔”(近似的汉语表示啊,大家别太较真),却是只多了一个辅音K,其他是借第一行元音拼出来的(Ka, Ki, Ku, Kai, Ko),所以并没有50个音。于是日本人在说英文时,很多音是发不出来的。比如“日 r”的音,日语中不存在(没有ra,yi ru,rai ro),所以不会说。很常用的read and write,日本人只能说成 lead and light,用“l”代替“r”,是个很典型的例子。于是当时哈佛大学就找了在美国的成年后才到美的日本人做实验。首先问这些被实验者,read 和lead两个音,大家听得明白吗?大家一致答听的出区别。再问那为什么会说错,这些日本人有的说“我们的口腔结构不同。”有的说“我们发音部位很你们不同,我们的靠前,你们靠后。”也有人说“我们舌头硬,老美舌头软。”接下做了实验,让这些日本人听许多“r”或“l”打头的词(不给看拼写),二选一的答案,做完了测试,发现大家的正确率是50%。各位已经发现问题了,二选一能答对一半,实际就是根本不会,纯粹瞎懵,命中率当然是一半。当看到这一结果时,测者和被测者全傻了。因为要是全对了,那分析和调整一下舌头位置或口型就可以解决;如果全错也不要紧,掉个个儿就成了。但对一半就美救了。大家想,根本听不出两个音的差别,怎么可能区分清楚发音和正确发音。但结论已经出来了:发音不准的主要原因不是嘴的问题,而是耳朵的问题.
  其实发音不准主要是因为耳朵听不准这件事,大家是有实际观察经验的。比如有人唱歌走调,是什么原因呀?是不是嗓子不好?不是,主要是耳朵听不准,所以唱歌走调的人唱完了觉得自己唱得挺对的,你们怎么都说我走调呢?原因是他们的耳朵听不准音,自己听不出走调了。(如果您唱歌不走调,自己堵上耳朵唱一个试试,别人保证说您走调了)。那么这些被做实验的日本人都在美国生活了一段了,天天听标准音,为什么改不了口音?原因是:成年人的耳朵听音不准,分辨能力低,听不准一个不在自己母语语音范围内的新标准发音,也听不出自己和标准音的区别(可能自己觉得有些区别,但具体也说不明白),以为自己已经发到标准了,其实还有差距。日本人母语缺音太多,所以最吃亏。(大家在网上可以找到日本人用来测试“r- l”分辨率还剩多少的测试网站,大家可以试试,很好玩儿。中国北方大部分地区的同学或普通话标准的同学会得分很高的)
  科学实验告诉我们,只有小孩子的耳朵对各种语言有高分辨率,才可以听准任何语言的发音而模仿到位,成年人不行了。具体说,大多数人到十二岁以上就不行了,这个能力失去了。这就导致了成年人为了纠正外语发音时或提高发音准确度,单纯听和模仿标准外语发音不行,因为做不到,所以如何纠正成年人的发音的最重要环节就是提高成年人的听音准确度。而实践经验证明,多听各种非标准音,有助于成年人提高听力敏感度和分辨力,从而达到定准和自然纠正自己发音的效果。(什么是各种非标准音?比如英文 “very interesting”, 法国口音是 “vehi intehisting”,日本口音是 “veli indelisding”,中国口音是“外瑞-因踹斯停”)。当经过一段时间仔细听和分辨各种口音的适应训练后(当然不是仅听非标准音,要和该句的标准音以及自己的模仿发音进行对同时比训练),听者的听音敏感度提高了,甚至能准确分辨带口音的人来自哪个国家,发音就自然进步了。这是成年人纠正发音的科学方法,跟大家想当然的结论正好相反。
  讲到这里,大家不应该会此结论还存有疑问吧?其实中国同学最容易理解这个结论。因为中国话的口音变化很大,比英语明显,英国音与美国音之间的区别,还赶不上普通话与天津话的区别(离北京才120公里)。所以中国同学对口音比较敏感。有意思的是,中国有个标准音叫做“普通话”,而英语国家没有。在美国并不以任何城市的口音做标准,英国也如此,伦敦话并非标准,而且其他英国人有时觉得很怪。(大家知道伦敦人常省略“h” 和“t”音吗?比如 “head” 被说成 “ed”, “better”说成“be-r”)所以在这些英语国家,并没有严格的绝对标准。而中国人都应该说准普通话。但同样道理,如果小时候(十二岁以前)没有说准,成年后就会有口音,尤其南方同学最吃亏,因为缺音。那应该如何纠正发音呢?如果按理所当然的推论,大家天天听标准音就行,那大家天天看新闻联播和听广播就能纠正发音吗?结果不行。到北京住几年口音就改好了吗?结果还不行(还是小孩子行。)那找个说标准普通话的人一起生活还帮助纠正行吗?大家就笑了。很多人帮父母纠正了多少年的口音了,也没见有效呀。那怎么办?原理是一样的:多听各地人的口音,并进行比对训练,耳朵敏感度越来越高,口音就越来越小。这是成年人科学的纠正发音的方法。(在有些电影学院在纠正成年外地演员时会采用类似方法。)跟大家当初想的正好相反吧,但现在大家都明白了。遗憾的是,很多英语老师也不明白这一点,所以总建议大家听一个标准音或追一个某国人交流。现在这一误区应该纠正了

英语学习的误区和方法

系列文章目录:英语学习的误区和方法(1):外语学习的主要误区英语学习的误区和方法(2):造成“哑巴英语”的最主要原因英语学习的误区和方法(3):英语环境的问题英语学习的误区和方法(4):特殊群体英语学习的误区和方法(5):语言条件反射
英语学习的误区和方法(6):关于记忆力英语学习的误区和方法(7):中国“英”雄 英语学习的误区和方法(8):二律背反?英语学习的误区和方法(9):世纪之战英语学习的误区和方法(10):“学得”-“获得”之辩
   前 言
   著名语言学家Greg Thomson说的:“外语学习的原理是如此之复杂,以至于没有人能说清楚;但掌握语言的过程又是如此之简单,以至于不需要说清楚。”讨论语言学习的原理,是件非常复杂的事,在下当然也没把握能描述得很清楚。而且因为外语学习就连学术界都存在很多尖锐的争论,本人也不敢说自己有把握能把争论化解。但还是决定先从简单入手,做些抛砖引玉的工作吧,探讨一下外语学习的真谛,特别是对大家在外语学习上普遍存在的误解进行分析和澄清,希望能对外语学习者有所帮助,对外语教学工作着有所启发,就知足了。
  本人多年来一直在给各高校,企业和其他英语学习者做英语学习方法讲座。讲时从不煽情,从不靠表演噱头,也不搞励志,每次必将严肃的科学依据送给大家。近五年来听众过万,还比较受欢迎,其中有相当部分的人能够非常理解和赞同并提出了很多尖锐问题和改进意见,在此表示深深感谢。曾有很多人奉劝在下以此演讲能力,把风格改为煽情鼓动式,定能红遍全国和累积财富。本人对名无兴趣,否则早就这么做了。也不愿胡说八道而误人子弟。至于财富吗,不是不喜欢,而是已经有够多的了。所以本人很幸运,现在可以摆脱金钱的烦恼,静下心来读书和思考了。现在把以前演讲的部分内容整理一下发在这里,希望和大家探讨。

2006年百度之星程序设计大赛复赛题目4:彩球游戏

彩球游戏
X博士是一个研究儿童智力开发方法的科学家,他为幼儿教育领域做出了许多贡献。最近,X博士正在研究一种适合儿童的游戏,用以辅助发展儿童的观察力、注意力和思维能力。经过连日的构思,X博士终于设计出了一种游戏:彩球游戏。
彩球游戏是一种单人参与的游戏,游戏首先给出一串由许多不同颜色的小球组成的小球序列,以及一个整数参数M(M≥2)。一段连续的具有相同颜色的小球序列称为连续同色序列。小孩,即游戏参与者,每次可以向任意一段连续同色序列插入一个同色小球,使该序列的长度加一。当一段连续同色序列在插入一个同色小球后其长度达到M时,该序列就会爆炸消失,然后原序列两边的其余小球会重新连成一串,如果两段相同颜色的连续同色序列在此时连接在一起,它们就会合并形成一段新的连续同色序列。如果新形成的连续同色序列长度达到M,这段序列也会爆炸消失,然后重复上述过程,直到没有新的长度达到M的连续同色序列出现为止。游戏的目标很简单,就是插入尽量少的小球,使得所有小球都爆炸消失掉。
通过长时间的游戏和不断提高游戏水平,这个游戏可以很好地开发儿童的观察力、注意力和思维能力。但是X博士仍然面临着一个困难的问题,他还需要设计出一个游戏演示AI程序,可以以最优的方式(即插入的小球数量最小)进行游戏,用于游戏教学,或者在游戏中对小孩给出提示。X博士并不擅长此类程序,因而他无法完成这个任务,你可以帮助他吗?
输入格式:
输入文件包含多组测试数据。每组测试数据第一行为整数M(2≤M≤20),第二行为一条非空的字符串,由大写字母组成且长度不超过200,表示初始的一串小球,不同的字母表示不同的小球颜色。初始时可能会存在一些长度达到M的连续同色序列,但这些序列不会马上爆炸消失。
输出格式:
每组测试数据输出一行,表示至少需要插入多少次小球才能使所有小球爆炸消失掉。
输入样例:
3
AAABAAA
3
ABBABBA
输出样例:
2
2
说明:
共有5个测试数据集,每个测试数据集为一个输入文件,包含多组测试数据。每个测试数据集从易到难分别为5、10、15、30和40分,对每个测试数据集分别执行一次程序,每次必须在运行时限30秒内结束程序并输出正确的答案才能得分。
所有数据均从标准输入设备(stdin/cin)读入,并写出到标准输出设备 (stdout/cout)中。
五个测试数据集中输入初始小球队列的长度分别不大于10、20、50、100和200,各有不超过5000组测试数据。
来自:http://hi.baidu.com/astar/blog/item/fe22ab18c3c54b0635fa4192.html

2006年百度之星程序设计大赛复赛题目3:星球大战

星球大战

公元4999年,人类科学高度发达,绝大部分人都已经移居至浩瀚的宇宙,在上千颗可居住星球上留下了人类的印记。然而,此时人类却分裂成了两个联盟:正义联盟和邪恶联盟。两个联盟之间仇恨难解,时有战争。
现在,正义联盟计划要破坏邪恶联盟的贸易网络,从而影响邪恶联盟的经济状况,为下一次战争作好准备。邪恶联盟由数百颗星球组成,贸易通过星球间的运输航道来完成。一条运输航道是双向的且仅连接两个星球,但两个星球之间可以有多条航道,也可能没有。两个星球之间只要有运输航道直接或间接的相连,它们就可以进行贸易。正义联盟计划破坏邪恶联盟中的一些运输航道,使得邪恶联盟的星球分成两部分,任一部分的星球都不能与另一部分的星球进行贸易。但是为了节省破坏行动所需的开支,正义联盟希望破坏尽量少的运输航道来达成目标。请问正义联盟最少需要破坏多少条运输航道呢?
输入格式:
输入文件包含多组测试数据。每组测试数据第一行为两个整数N和M(2≤N≤500,0≤M≤N(N-1)/2),N为邪恶联盟中星球的数量。接下来M行,每行三个整数A、B和C(0≤A,B0),表示星球A和星球B之间有C条运输航道。运输航道的总数量不超过108。
输出格式:
每组测试数据输出一行,包含一个整数,表示需要破坏的运输航道的数量。
如果输入的贸易网络本来就是不连通的,则输出0。
输入样例:
3 3
0 1 1
1 2 1
2 0 1
4 3
0 1 1
1 2 1
2 3 1
8 14
0 1 1
0 2 1
0 3 1
1 2 1
1 3 1
2 3 1
4 5 1
4 6 1
4 7 1
5 6 1
5 7 1
6 7 1
4 0 1
7 3 1
输出样例:
2
1
2
说明:
共有5个测试数据集,每个测试数据集为一个输入文件,包含多组测试数据。每个测试数据集从易到难分别为5、10、15、30和40分,对每个测试数据集分别执行一次程序,每次必须在运行时限10秒内结束程序并输出正确的答案才能得分。
所有数据均从标准输入设备(stdin/cin)读入,并写出到标准输出设备 (stdout/cout)中。
五个测试数据集中输入N分别不大于20、50、100、200和500,各有9组测试数据。

来自:http://hi.baidu.com/astar/blog/item/8a18d21b461984d4ad6e7591.html

2006年百度之星程序设计大赛复赛题目2:空中飞猴

空中飞猴

马戏团里新来了一只很特别的小猴子皮皮——不仅长得漂亮,还很聪明。自从它来到马戏团之后,“空中飞猴”成了马戏团里保留节目,慕名观看的人络绎不绝。“空中飞猴”表演开始时,空中架着两根长长的钢丝。皮皮在其中一根上,它的目标是到达另一个根钢丝上。皮皮必须在爬行一定距离后纵身一跃,直接跳到另一根钢丝的某个位置。由于皮皮的速度非常快,它的运动轨迹可以近似的看成一条直线段。为了不让自己太危险,皮皮希望自己的跳跃距离尽量短,而为了不让观众等得太不耐烦,它在钢丝上的爬行距离不能超过d。在爬行距离不超过d的情况下,皮皮的跳跃距离最短是多少?
输入格式:
输入文件包含多组测试数据。每组测试数据包含16个实数x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4,xp,yp,zp,d,表示两根钢丝分别为线段(x1,y1,z1)-(x2,y2,z2)和(x3,y3,z3)-(x4,y4,z4),皮皮的坐标为(xp, yp, zp),最大爬行距离为d。皮皮保证在第一条钢丝上,保证每条钢丝长度大于零。但两条钢丝有可能相交甚至重叠。
输出格式:
每组测试数据输出一行,仅包含一个非负实数,四舍五入保留三位小数,即最短跳跃距离。
输入样例:
0.0 0.0 0.0 4.0 4.0 0.0 4.0 0.0 1.0 0.0 4.0 1.0 2.0 2.0 0.0 10.0
输出样例:
1.000
说明:
共有3个测试数据集,每个测试数据集为一个输入文件,包含多组测试数据。每个测试数据集从易到难分别为30、30和40分,对每个测试数据集分别执行一次程序,每次必须在运行时限3秒内结束程序并输出正确的答案才能得分。
所有数据均从标准输入设备(stdin/cin)读入,并写出到标准输出设备 (stdout/cout)中。
三个测试数据集各有10000组测试数据。
来自:http://hi.baidu.com/astar/blog/item/69570fb354cddda6d9335a95.html

2006年百度之星程序设计大赛复赛题目1:另类杀人游戏

另类杀人游戏
周末的晚上,百度的员工们总喜欢聚集在公司的会议室玩杀人游戏。从1警1匪到n警n匪,他们尝试了几乎所有流行的杀人游戏规则。终于有一天,连最热衷杀人游戏,“杀人”不眨眼的Austin也开始对无休止的辩论感到厌烦。于是,他决定改变他的一贯作风,他开始变成了一个“杀人不睁眼”的杀手。
如何做到杀人不睁眼呢?Austin早已构思好他的杀人计划:
1. N个人(包括Austin)坐成一圈玩杀人游戏,按顺时针编号1,2,3,4。。。。。
2. Austin从1号开始顺时针开始数到第m号就杀掉第一个人。被杀掉的人要退出游戏。
3. 如果第m个人恰好是Austin自己,他就杀掉他顺时针方向的下一个人。
4. Austin从被杀的人的下一个顺时针数m个人,把第m个杀掉。
5. 重复2-4,直至杀掉所有人。
Austin把这个杀人计谋告诉了法官小k,他便可以闭起眼睛杀人啦。作为一个正直善良的法官,小k当然不能让残忍的Austin得逞,于是,她偷偷把Austin的杀人计划告诉了作为警察的你,聪明的百度之星。现在,你的任务是活到最后,与Austin单挑。
输入:
第一个行包含一个整数T,表示有T组测试数据。
对于每组测试数据:
三个整数
N,M,T,(3<=N<=10000,1<=M,T<=10000) 分别表示参与游戏的人数,Austin每隔M个人会杀掉一人,Austin初始位置的标号。
输出:
每个测数数据输出一个整数。
你需要选择的初始位置的序号,以确保最后剩下的两个人是你与Austin。
输入例子:
2
7 4 1
7 4 1
输出例子
5
5
例子说明:杀人顺序为4 2 7 6 3 5 , 所以5 是你要选择的位置。
来自:http://hi.baidu.com/astar/blog/item/1e56352a12b98f395343c18a.html

2008年9月23日星期二

网管和黑客的糗事

被自己人杀宕的服务器:
有个网管把系统管理员密码设置很长很乱,乱到自己都不记得,只好记小本上,然后装了个木马病毒,直接用木马病毒远程登陆和操作服务器。公司来了新网管,他给新网管一个木马管理端让新网管去维护服务器,新网管按以前工作习惯,上手第一件事就是先给服务器杀毒,然后……后来服务器宕了,想重启时,新网管发现手里的管理端失灵了,惊问咋回事,老网管问明新网管做过的操作,心中大恨,密码本当天居然随换洗衣服忘家了,赶紧打车回家去密码本,也不敢说杀掉的病毒里其实有他装的用来当远程管理的木马病毒啊。不过后来到底还是找理由把新网管给踢出公司了。
  体力超级好的黑客
有个黑客看某小网站不爽,于是,找了和小网站同类性质的几家规模大点的网站,从alexa上查了这几家网站访问量大的频道,然后写了个0乘0表格,里面嵌入小网站首页,黑客黑进那几家规模大点的网站,把嵌有小网站首页的表格嵌进这几家大网站流量较大频道的模板,这样,当用户访问那些页面时,被攻击网站首页会被调用一次(0乘0表格,页面上不会显示出来)。嗯,经过一晚上的努力,成功黑完几家网站。被攻击的小网站也如他所愿服务启不起来,一起来就又挂掉,但这事,只持续了几个小时,几家被黑的网站迅速发现了模板里的问题,于是,那家小网站遭到大家一致的鄙视,当然,是在心里,谁也不好意思说自己网站被黑了的。
  没客户端咋拷贝文件:
novell时代,服务器磁盘空间满了,需要备份出来转移到大硬盘,和外包的计算机服务公司说好以后,就让服务公司的人把服务器拉走了,一会儿,服务公司的经理电话过来问没带客户端过去怎么拷贝文件出来?让网管羞死了……
  白获得帐号密码了:
有个黑客在工作日上班时间开着工具跑一台服务器的密码,然后自己就洗澡喝茶去了,回来的时候,看到屏幕上提示跑出来一个帐号和密码,很高兴地就试,但怎么也登陆不了,人家网站还好好的能显示,说明服务器开着呢,可是,为什么登陆不了呢?后来晚上网管在群里说下午有黑客攻击他的服务器,而且登陆成功了,幸好当时他在另一个帐号上登陆着,及时发现,赶紧把那个已经被黑客拿到的帐号删除,网管还奇怪黑客登陆之后为什么什么都没干呢?

黑客是怎样炼成的——无厘头版

大家喝的是啤酒。这时你入座了。
  你给自己倒了杯可乐,这叫低配置。
  你给自已倒了杯啤酒,这叫标准配置。
  你给自己倒了杯茶水,这茶的颜色还跟啤酒一样,这叫木马。
  你给自己倒了杯可乐,还滴了几滴醋,不仅颜色跟啤酒一样,而且不冒热气还有泡泡,这叫超级木马。
  你的同事给你倒了杯白酒,这叫推荐配置。
  Boss的台面上有一只XO,这叫梦幻配置。
  人到齐了,酒席开始了。
  你先一个人喝了一小口,这叫单元测试。
  你跟旁边的人说哥们咱们随意,这叫交叉测试。
  但是他说不行,这杯要干了,这叫压力测试。
  于是你说那就大家一起来吧,这叫内部测试。
  这个时候boss向全场举杯了,这叫公开测试。
  菜过三巡,你就不跟他们客气了。
  你向对面的人敬酒,这叫p2p.
  你向对面的人敬酒,他回敬你,你又再敬他……,这叫tcp.
  你向一桌人挨个敬酒,这叫令牌环。
  你说只要是兄弟就干了这杯,这叫广播。
  可是你的上司jj听了不高兴了,只有兄弟么,罚酒三杯。这叫炸弹。
  可是你的下级mm听了不高兴了,我喝一口,你喝一杯,这叫恶意攻击。
  有一个人过来向这桌敬酒,你说不行你先过了我这关,这叫防火墙。
  你的小弟们过来敬你酒,这叫一对多。
  你是boss,所有人过来敬你酒,这叫服务器。
  酒是一样的,可是喝法是不同的。
  你喝了一杯,boss喝了一口,这叫c#。
  你喝了一杯,mm喝了一口,这叫vb。
  你喝了一杯,你大哥喝了半杯,这叫c++。
  你喝了半杯,你小弟喝了一杯,这叫汇编。
  你喝了一杯,你的搭档也喝了一杯,这叫c。
  酒是一样的,可是喝酒的人是不同的。
  你越喝脸越红,这叫频繁分配释放资源。
  你越喝脸越白,这叫资源不释放。
  你已经醉了,却说我还能喝,叫做资源额度不足。
  你明明能喝,却说我已经醉了,叫做资源保留。
  你喝一段时间就上厕所,这叫cache。
  酒过三巡,你也该活动活动了。
  你一桌一桌的走,这叫轮巡。
  你突然看到某一桌的漂亮mm,走了过去,这叫优先级。
  你去了坐下来就不打算走了,这叫死循环。
  你的老大举杯邀你过去,你只好过去,这叫激活事件。
  你向一桌敬酒,他们说不行不行我们都喝白的,于是你也喝白的,这叫本地化。
  你向boss敬酒,可是boss被围了起来,你只能站在外圈,这叫排队。
  你终于到了内圈,小心翼翼的向前一步,这叫访问临界区。
  你拍着boss的肩膀说哥们咱们喝一杯,这叫越界。
  你不知喝了几圈了,只会说两个字,干了,这叫udp。
  可是还有人拿着酒瓶跑过来说,刚才都没跟你喝,这叫丢包。
  喝酒喝到最后的结果都一样
  你突然跑向厕所,这叫捕获异常。
  你在厕所吐了,反而觉得状态不错,这叫清空内存。
  你在台面上吐了,觉得很惭愧,这叫程序异常。
  你在boss面前吐了,觉得很害怕,这叫系统崩溃。
  你吐到了boss身上,只能索性晕倒了,这叫硬件休克。
  boss当然很没有面子。
  boss炒你的鱿鱼了,这叫Bug。
  你失业下岗了,这叫暂停服务。
  你老婆把家务活全推给你这个住家男人了,这叫拒绝服务。
  你整天东游西荡打发时间,这叫资源空闲。
  你对boss解雇你心怀愤恨,跟踪他的去处,这叫IP地址。
  你不知道应该从哪扇窗户才能爬进boss二奶的别墅,这叫端口扫描。
  你把boss的二奶照片给偷出来了,这叫数据包拦截。
  你拿二奶的照片向boss勒索,这叫病毒发作。
  你为了以防万一,冲印了很多照片,这叫自我复制。
  你要挟boss不成,就在公众场合大肆发布照片,这叫蠕虫。
  你给警察抓住了,黑漆漆的号子里又进了一个新来的客人,这叫黑客。
  你向预审员供述犯罪事实,这叫——
  ◎#%……※()
  你不要叫了,
  大家叫,才是真的叫!
  让我们一起叫——
  黑客是怎样炼成的。

世界杯最小的黑客

儿子:“爸,有一个网站在丑化您踢球的形象,我不客气地把它的网页给黑了!”
  父亲:“儿子,你才四岁呀!竟然能把人家的网站给黑了。那个站长也太笨了吧?

你用的什么黑客软件啊?”

  儿子:“什么是软件?我把黑色油漆在电脑屏幕上一刷!就黑了。”

  父亲:“……”

假如我死了 QQ号怎么办

QQ使用如此广泛,有人甚至开始考虑一个很长远而且很重要的问题,那就是:再过几十年,我死了以后,我的QQ号怎么办呢?于是有人给出了这些意见:
  1.留给我的网友MM,她那时才二十出头,这也算我对她的一点补偿……

  2.作为遗产留给我儿子。

  3.三个月未登录被系统回收,难道就这么个下场?

  4.带到“那边”继续使用!

  5.让我儿子帮我24小时开机不下,挂个骷髅图标,就OK了!

  6.叫活着的朋友每天把QQ挂在线上,打开自动回复:“我真的死了!”

  7.签名:此人已葬于终南山,有事请到坟前烧纸。

  8.QQ死得肯定比我早……

  9.制成QQ木乃伊,为后世考古事业做出贡献……

不愧是程序员:打电话也能死循环

自从宿舍里装上电话,我们就变成了“君子”——君子动口不动手,当然更懒得动腿,有什么事宁可花点电话费,也不愿出门走动。

我们屋有个小伙儿叫李雷,暑假找了份工作,在一家网站做程序员。昨天他上班去了,有人打电话找他,我接的。我说李雷不在,对方问他回老家了吗?我说没有,对方说:“那你告诉他,我是他同学,你让他回来给我打个电话吧,电话号码是××××。”我拿笔记了下来(后来我才知道,其实那是斜对面宿舍的电话,跟我们不太熟)。

 晚上李雷回来,我跟他说了电话的事,他说大概是高中同学打来的吧,于是就按那个电话回了过去。李雷是陕西人,电话一通他就问:“请问你们这儿有陕西的吗?”接电话的人说:“我们这儿没有,我们对门倒是有一个,你等会儿啊,我给你喊。”

马上,就听到楼道里大喊:“李雷,过来接电话,你老乡!”李雷愣了一下,跟我们屋老三说:“我过去接个电话,这儿你帮我盯着,如果通了,就说我一会儿就回来。”李雷过去了,老三拿起电话。没过几秒钟,里面就传出“喂,喂”的声音,老三马上说:“他出去了,你等一下啊!”然后推开门就喊:“李雷,这个电话通了,赶快回来。”李雷在那边等了会儿,见没反应就挂了,回屋从老三手里接过电话,只能听到挂断后的“嘟嘟”声。“奇怪!”他郁闷地说:“怎么都没人接呢?”然后他拿起记号码的纸条,再次拨通那个号码:“你们这儿有陕西的吗?”

……
(注:“死循环”指程序反复执行某段代码不能自行停止。)

电脑白痴和黑客的对话

黑客:我控制了你的电脑
  小白:怎么控制的?
  黑客:用木马
  小白:。。。。。。在哪里?我没看不见
  黑客:打开你的任务管理器
  小白:。。。。。。。任务管理器在哪?
  黑客:。。。。。你的电脑下面!!
  小白:“我的电脑”里面没有啊
  黑客:算了,当我什么也没做过
  
  黑客:我已经控制了你的电脑
  小白:哦
  黑客:害怕了吧?!嘿嘿
  小白:来的正好,帮我杀杀毒吧,最近我的机子毛病很多耶
  黑客:。。。。。。
  
  
  小白:你怎么总是在我电脑里随便进进出出
  黑客:你可以装防火墙
  小白:装防火墙,你就不能进入了吗?
  黑客:不啊,我只是想增加点趣味性,这样控制你的电脑让我觉得很白痴耶
  
  
  小白:听说你会制造“病毒”?!
  黑客:嗯
  小白:你可以控制别人的电脑?!
  黑客:一般是的
  小白:那你可以黑掉那些网站吗?
  黑客:当然,没听到人家叫我“黑客”吗?
  小白:。。。。哦~~~`我还以为那是因为你长得很黑。。。。。
  “咣~~”
  
  
  黑客:我又来了!!
  小白:你天天进来,不觉得很烦吗?
  黑客:是很烦,你的机子是我见过的最烂的一台了
  小白:不是吧,这可是名牌
  黑客:我是说你的机子里除了弱智游戏就只有病毒了
  小白:哦~~那你看到我的“连连看”了吗,不记得装在哪,找了好久了耶
  黑客:。。。。。再见
  
  
  黑客:嗨~~~我来了!
  小白:好几天不见你,被我的防火墙挡住啦?
  黑客:哈哈,笑话,上你的机子比我自己的还容易,不是想我了吧
  小白:我是想请你帮一个忙
  黑客:什么事?
  小白:你能不能进入电力系统修改一点数据
  黑客:。。。。。。你想干嘛!!
  小白:求求你,帮我把我家这个月的电费消了吧。。。。。。
  黑客:去死!!
  
  
  
  黑客:你死哪去了?!!!
  小白:。。。。出去玩了几天啊,找我干嘛
  黑客:我要找点东西
  小白:在我这儿找什么东西?
  黑客:病毒,找一条前几年的老病毒,只有你的机子上病毒保存的最全啦
  
  
  黑客:我来了!!
  。。。。。。
  黑客:怎么不说话?
  小白:心情不好
  黑客:谁欺负你了?
  小白:我的一个Q号搞丢了,里面有我的网上初恋
  黑客:这个简单,我帮你拿回来
  小白:拿不回来了
  黑客:不可能,告诉我,多少号?
  小白:呜~~~~就是不记得了
  
  
  小白:你给我出来!!!!
  黑客:怎么啦?!
  小白:你是不是用我的ID去论坛玩了?!!
  黑客:。。。。不好意思,忘了告诉你了,不过,我没干坏事,就瞎编了个贴子,我保证下次再也不玩了
  小白:那不行!!!
  黑客:你还要怎么样?
  小白:你发的贴子得红脸了耶,我第一次得红脸,好开心哦,你必须再给我编一个
  黑客:倒!
  
  
  黑客:嘿嘿,刚才我做了一件很有趣的事
  小白:什么事
  黑客:我到论坛上去顶贴了
  小白:这很平常啊
  黑客:我见贴就顶,尽情的骂楼主是猪,好解气
  小白:哇塞,太过瘾了,我可从来不敢,会被封杀的!
  黑客:没错,已经被封杀了。
  小白:这还有趣?!
  黑客:是啊,因为我用的是你的ID
  
  小白:你是高手吗?
  黑客:可以说是吧。
  小白:高到什么程度?
  黑客:嗯,我无聊的时候就自己黑自己
  小白:哈,这个我也会!
  黑客:#¥%!你也可以?!
  小白:是啊,一关机它就黑了。。。。。
  黑客:滚!
  
  该黑客目前正住在海淀医院,经确认已呈现出精神病前兆!

电脑白痴和黑客的对话

黑客:我控制了你的电脑
  小白:怎么控制的?
  黑客:用木马
  小白:。。。。。。在哪里?我没看不见
  黑客:打开你的任务管理器
  小白:。。。。。。。任务管理器在哪?
  黑客:。。。。。你的电脑下面!!
  小白:“我的电脑”里面没有啊
  黑客:算了,当我什么也没做过
  
  黑客:我已经控制了你的电脑
  小白:哦
  黑客:害怕了吧?!嘿嘿
  小白:来的正好,帮我杀杀毒吧,最近我的机子毛病很多耶
  黑客:。。。。。。
  
  
  小白:你怎么总是在我电脑里随便进进出出
  黑客:你可以装防火墙
  小白:装防火墙,你就不能进入了吗?
  黑客:不啊,我只是想增加点趣味性,这样控制你的电脑让我觉得很白痴耶
  
  
  小白:听说你会制造“病毒”?!
  黑客:嗯
  小白:你可以控制别人的电脑?!
  黑客:一般是的
  小白:那你可以黑掉那些网站吗?
  黑客:当然,没听到人家叫我“黑客”吗?
  小白:。。。。哦~~~`我还以为那是因为你长得很黑。。。。。
  “咣~~”
  
  
  黑客:我又来了!!
  小白:你天天进来,不觉得很烦吗?
  黑客:是很烦,你的机子是我见过的最烂的一台了
  小白:不是吧,这可是名牌
  黑客:我是说你的机子里除了弱智游戏就只有病毒了
  小白:哦~~那你看到我的“连连看”了吗,不记得装在哪,找了好久了耶
  黑客:。。。。。再见
  
  
  黑客:嗨~~~我来了!
  小白:好几天不见你,被我的防火墙挡住啦?
  黑客:哈哈,笑话,上你的机子比我自己的还容易,不是想我了吧
  小白:我是想请你帮一个忙
  黑客:什么事?
  小白:你能不能进入电力系统修改一点数据
  黑客:。。。。。。你想干嘛!!
  小白:求求你,帮我把我家这个月的电费消了吧。。。。。。
  黑客:去死!!
  
  
  
  黑客:你死哪去了?!!!
  小白:。。。。出去玩了几天啊,找我干嘛
  黑客:我要找点东西
  小白:在我这儿找什么东西?
  黑客:病毒,找一条前几年的老病毒,只有你的机子上病毒保存的最全啦
  
  
  黑客:我来了!!
  。。。。。。
  黑客:怎么不说话?
  小白:心情不好
  黑客:谁欺负你了?
  小白:我的一个Q号搞丢了,里面有我的网上初恋
  黑客:这个简单,我帮你拿回来
  小白:拿不回来了
  黑客:不可能,告诉我,多少号?
  小白:呜~~~~就是不记得了
  
  
  小白:你给我出来!!!!
  黑客:怎么啦?!
  小白:你是不是用我的ID去论坛玩了?!!
  黑客:。。。。不好意思,忘了告诉你了,不过,我没干坏事,就瞎编了个贴子,我保证下次再也不玩了
  小白:那不行!!!
  黑客:你还要怎么样?
  小白:你发的贴子得红脸了耶,我第一次得红脸,好开心哦,你必须再给我编一个
  黑客:倒!
  
  
  黑客:嘿嘿,刚才我做了一件很有趣的事
  小白:什么事
  黑客:我到论坛上去顶贴了
  小白:这很平常啊
  黑客:我见贴就顶,尽情的骂楼主是猪,好解气
  小白:哇塞,太过瘾了,我可从来不敢,会被封杀的!
  黑客:没错,已经被封杀了。
  小白:这还有趣?!
  黑客:是啊,因为我用的是你的ID
  
  小白:你是高手吗?
  黑客:可以说是吧。
  小白:高到什么程度?
  黑客:嗯,我无聊的时候就自己黑自己
  小白:哈,这个我也会!
  黑客:#¥%!你也可以?!
  小白:是啊,一关机它就黑了。。。。。
  黑客:滚!
  
  该黑客目前正住在海淀医院,经确认已呈现出精神病前兆!

帮MM修电脑的三个步骤-此文绝对实用

表演篇 1、一定要打预防针! 在修之前,向MM反复声明,这电脑故障是有硬件和软件之分的,如果是硬件故障,例如显卡风扇不转了,显示器连线老化,显示器分辨率超出显示器指标,等等都会导致黑屏啊,这个我不回家用专门的工具是修不好的!

这样一旦真的没修好,就立刻耸肩膀作无奈装:真的是硬件问题,还是送去保修吧。而MM当作硬件问题去保修,JS大人即使发现是软件问题,也会毫不犹豫作为硬件问题处理,所以决计不会有败露的麻烦

2、重装是万能药方!

不管发生什么,只要MM同意,一律重装系统!这是最简单的方法,虽然很菜。但是如果要感动MM,这也是最好的方法,因为MM会在漫长的等待中觉得你真是很有耐心和爱心的好男人!哈哈哈哈,太阴险了,所以给恐龙修电脑,一般还是对症下药,速战速决,不要绿我,确实当恐龙看上你的时候,你就知道这不是RPWT,而是生命问题!

3、关心要无所不在!

如果选择重装,一定要反复问MM:真的可以吗?MM第一遍一般就说可以,这时候要问:没有重要的照片、文档吗?MM会犹豫,但是还是会说不要好了;这时候接着问:QQ聊天记录也会丢掉的!MM会说不要了;记着这时要作思考状,然后问:有没有重要的邮件啊,邮件也会丢掉的。一般啊,很多MM这个时候会反悔,她们就会觉得你是超级贴心人了。

如果选择打开机箱,一定要作惊讶状!怎么这么多灰尘啊!!!(我只见过一个MM的机箱里没有灰尘的,她是实在太爱干净了)这时候MM一般都会不知道怎么回答,你立刻要作出为电脑难过的样子:这么好的电脑,灰尘太多怎么跑得快啊,散热也会受影响的,当然容易出问题了。哈哈哈哈,MM内疚的同时就会觉得你这个人特别懂得爱惜珍惜疼惜是新好男人。

技术篇:

1、MM电脑出的通常都是弱智问题

所以不要用特别专业的眼光去分析,一般都是系统设置没设置好,例如曾经一个MM,帮她新配的电脑,说音箱左边的不响,过去检查,果然不响,怎么调都只有电流声,心想坏了,买到坏的了,结果不死心一看,音量控制里她全搁到右声道了,昏死!

对于显示屏黑屏这种事情,要多看看显示器开关有没有开,显示器有没有插上电源,显示器线有没有连到主机等等问题!

稍微高级一点,看看BIOS设定,显示器分辨率设定,对比度设定等等再高级一点,看看是不是显卡风扇停转了在有别的电脑的情况下,和别的电脑对调一下显示器看看,容易分辨是不是显示器的问题,但是要注意,要是女生寝室的话,慎用!!!因为女生寝室一般好像关系都不好,就是好也不愿意为别人的电脑奉献自己的电脑,这一点和男生寝室不一样,要鄙视一下!要想帅,带上可以外接显示器的本本去,要轻薄的,2.3kg以上就不要驮过去丢脸了

2、要想酷、拆机箱

不管是不是硬件问题,如果你想MM崇拜到要嫁给你的地步,记住一定要带上一根较大的十字起子,推荐电脑城装机的那种,很长很长的,超帅!我一般带上两根,一个十字头,一个一字头,一个红色有机玻璃柄,一个绿色玻璃柄,就像两把短剑,有了这两柄利器,感觉立马不一样!MM立刻觉得你就是专业的,如果MM看到后觉得害怕,别忘趁势解释一句:修的多了,随身带着方便,你的问题不一定那么大,或许用不上。MM这个时候只会希望自己的电脑坏的彻底一点,好见识你挥动长剑的潇洒身姿!哈哈哈哈,这句是丫丫而已。

3、熟练掌握BIOS设定的窍门是看说明书!

其实很多时候问题和解决问题的方法都在BIOS设定上,例如老肯必须掌握的光驱启动,就在BIOS设定里面,这个时候万一忘记了怎么办,求助于说明书吧!!!其实在说明书中,一般都有详尽的说明,甚至包括常见问题的解决方法,只是MM们比较娇嫩,不适宜阅读这么生硬的文字罢了你的责任就是阅读它们!!!

不要觉得临时看说明书很丢脸!如果说拆机箱可以展现你武的一面,那么你专注阅读的神情正是你展现自己文的一面最好机会!!!能文能武才是你获取MM芳心的致胜法宝,只知道挥着袖子与主板上的灰尘大战的土匪只会让MM觉得这些喜欢硬件的GG都是脏兮兮的疯子。

而你要求获得主板、显卡及其他相关说明书最好的方法,要么就是一开始索要,一 进门就让她把她放这些东西的盒子搬出来放好;要么就是拆开机箱以后,惊讶一句:啊!这不是公版设计,我要看一下出厂时的说明书!!!甭管是什么设计,你这一句话出去,MM只会觉得你暴有水准,一眼就能看出是什么设计,其实她们也不知道什么叫公版设计母版设计的。

感情篇

1、MM的电脑永远都是最好的

MM一般最要面子(当然GG也要,例如老肯),但是找你修电脑总是电脑出了问题,所以你这个时候一定不能在伤口上散盐,切忌在修电脑的时候说:啊这种配置啊,该升级了。或者:这种杂牌的显卡最好不要用。或者:AOC的显示器最烂了。表以为这样可以显示你对硬件市场品牌的了解和个人的品位,这只会让MM恨死你!早期我就犯过类似口不遮拦的错误,结果有一段时间MM们电脑坏了也不敢来找我,唉,前车之鉴啊!

对于MM的电脑,如果牌子好,哪怕是集成主板,也要说这个牌子我最喜欢了,稳定性超好,这次多半是软件问题,D版毛病就是多!(甭管她机子装的系统是不是正版,用的软件总有盗版吧)如果牌子不好,立刻说,这个牌子性价比一直就是最好的,你真会过日子!不要忘记说“你真会过日子”的时候,一定要注视MM面带百分百诚恳的微笑!!!如果真的什么都不行,就是完全该被淘汰的机子,尽量就不要说话了!!!说什么只会让场面更难堪!!!

把电脑当作MM的脸,你就知道该怎么做了!

2、准确把握时间 营造相遇空间

一般MM让你修电脑,如果答谢的话,一般都是请你吃饭,如果她请你吃饭的规格远远超过正常修电脑的花费,不妨检查一下电脑是否有人为破坏的因素对于不同的MM,土匪当然是有的求之不得,有的避之不及因而准确控制维修过程的时间就很重要。这里教初学者一些计算时间的方法:

用GHOST装一个XP系统,一般是25分钟左右(如果你很熟练,20分钟内就够了)用自动方式装一个XP系统,大约是1个小时(具体没算过,如果是烂威盛主板,装 好驱动还不止)装一个OFFICE,大约还是要半个小时(这个可以在自定义里中选择,想拖延时间就全选,大概可以多争取半小时)时间还不到吃饭时间,或者时间到了吃饭时间但是你不想去,都可以通过装软件来慢慢消耗,实在不行,就卸载了多装几遍!

当你长年累月修电脑产生厌烦心理时,推荐使用市面上的高度集成版的XP的GHOST版,一次把乱七八糟的软件都给装上了,整个时间和装一个XP干净系统也差不多,装完就走人,又快又省事如果老肯可以到这个境界的话,应该已经结婚了

3、修理MM电脑的过程也是检查MM人品的过程

实际上利用修电脑这一机会来泡MM的土匪,一般平时都是花了较多时间陪着自己的电脑和网友,没有太多时间和固定场所(例如大学自修室、英语角或者公共社交场所)接触真实MM的人。很多这方面的高手也都是成功地在修好电脑的同时弥补了自己姻缘的缺憾,顺利找到另一半!但是并不是所有的相遇都是美满的结局,这除了土匪个人的RPWT,主要还在于他们在修理电脑的时候没有注意MM们的RPWT。给出一些个人建议:

如果MM只会站在一边看着你修,连杯水都不给你倒,除非她年纪太小太不懂事,不然这样的MM基本不懂关心照顾别人,也不懂尊重别人的劳动和付出。这样的MM若不是超级大美女,还是算了!

如果MM会一直问这问那,特别是如果主要问你为什么要这样修的原因,这种MM不够重视分工,喜欢主导一切,不能够尊重权威和相信理性,娶回家只会让你多一个唠唠叨叨的监工。如果你不喜欢被人呼来唤去,没有自疟倾向,这种MM还是算了!

如果MM一直问你要不要喝水,要不要歇一会儿,还问一些和修电脑无关的情况,例如问你这么好的技术都怎么学来的啊,如果殷勤到一反常态的地步,恭喜你!这个MM想泡你!!!如果这个MM一贯对人热情,那么这种MM属于擅长公关,有很强的管理和组织能力,这种MM也会成为未来家中的主管,但是好在是一种以人为本的管理,你不至于太痛苦这样的MM,只要平时不是那种过分往上爬巴结领导的类型,实际上还算不错的选择

如果MM话并不多,默默地给你倒杯水,然后再一旁看着,不时跑过来帮你递东西,这种是贤妻良母型,是那种甘愿在背后默默支持你的类型,你要是事业主导型的土匪,毫不犹豫泡这个MM吧!!!极品赞不绝口。(就是恐龙也不妨考虑一下)

如果MM给你东西吃,证明对你不见外;从来没见过的MM话,证明对你很有好感!小子,你赚了!

MM站着看你修电脑,有座位不坐,离得近的是关心电脑!离得远的还站着,如果不是眼睛超好的那种,这种MM有同甘共苦的意识,一般富有同情心,比较爱国(自己到时候对照一下)

MM坐着看你修电脑,正常;MM坐着但是不看你,眼光会游移到别的地方或者做自己的小动作,死了心吧!她已经有意中人了!

MM躺着看你修电脑(还真的有!)遇到的都是和我太熟悉的才这样!第一次就这样没遇到过,真有的话,就是RPWT!!!

MM在你修电脑的时候去洗澡了(遇到一次!)这个MM如果不是三天没洗澡,那就是把你当成家人看待了,我觉得关系很熟这样的话就不算什么;如果第一次就这样,建议逃走或者躺下!!!

MM修电脑的时候把父母介绍给你(到她家修电脑)或者给你看她存在电脑上家人的照片,她很希望成为你重要的朋友。

MM修电脑的时候把MM介绍给你,电脑其实没问题,这个MM觉得你人不错,肥水不流外人田,便宜自己的姐妹先;或者她姐妹最近刚失恋,需要找个凯子过渡一下

2008年9月22日星期一

数独游戏的一种解法

最近在北京青年报偶然看到了一个数独游戏的题,具体来说就是按规矩进行填书。自己想了想,觉得还是有点费脑子的。于是就编写了一个程序,可以搜索数独游戏的所有答案。算法很简单,就是使用了回溯+剪枝,效率可能不是很高。不过对于9*9规模不是很大的问题,也应该足够了,不知道大家有什么好的算法,千万别忘了留言告诉我啊,哈哈

数独游戏:






  版权所有



  数独的游戏规则:1.在9×9的大九宫格内,已给定若干数字,其他宫位留白,玩家需要自己按照逻辑推敲出剩下的空格里是什么数字。2.每一行与每一列都有1到9的数字,每个小九宫格里也有1到9的数字,并且一个数字在每行、每列及每个小九宫格里只能出现一次。3.每个数独游戏都可根据给定的数字为线索,推算解答出来。








  短信参与说明:题中有一个待填数字用“★”标示,请将此数字作为答案按要求发送


更多请参见:http://bjyouth.ynet.com/article.jsp?oid=


// shuduyouxi.cpp : Defines the entry point for the console application.

//



#include
"stdafx.h"



#include
<string.h>

//#include <vfw.h>

//#include <mmsystem.h>

#include <windows.h>

int a[9][9] ;

int b[9] ;

int total ;



void print()

{

printf(
"\n");

for(int i = 0;i < 9;i++)

{

for(int j = 0;j < 9;j++)

{

printf(
"%d ",a[i][j]);

}

printf(
"\n");

}

printf(
"\n");

}



//判断x,y所在的小九宫是否已经出现了数字n

bool IsInRect(int x,int y,int n)

{

int k,j;

bool retval = false;

for(k = x;k<x+3;k++)

{

for(j = y;j<y+3;j++)

{

if(a[k][j] == n)

{

return true;

}

}

}

return retval;

}







bool satisfy(int x,int y,int n)

{

bool retval = true;



int j;



//行列判断

for(j = 0;j <9;j++)

{

if(a[j][y] == n a[x][j] == n)

{

retval
= false;

break;

}

}

//如果行列满足,判断小九宫是否满足

if(retval)

{

if(x <3)

x
= 0;

else if(x < 6)

x
= 3;

else if(x < 9)

x
= 6;

if( y < 3)

y
= 0;

else if(y < 6)

y
= 3;

else if(y < 9)

y
= 6;

if(IsInRect(x,y,n))

retval
= false;

}

return retval;

}

void solve(int row,int count)

{

//都已经填满,打印统计

if( row == 8 && count == 0)

{

print();

total
++;

return;

}

if(count == 0)

{

row
+= 1;

count
= b[row];

}



for(int i = 0;i <9 ;i++)

{

if(a[row][i] == 0)

{

for(int j = 1;j <= 9;j++)

{

if(satisfy(row,i,j))

{

a[row][i]
= j;

solve(row,count
-1);

a[row][i]
= 0;

}

}

if(a[row][i] == 0)

return;

}

}





}



bool Usage()

{

bool retval = true;

int select = 0;

printf(
"1 继续\n");

printf(
"2 退出\n");



scanf(
"%d",&select);

if(select == 2)

retval
= false;

return retval;

}



int main(int argc, char* argv[])

{



while(1)

{

if(!Usage())

break;

printf(
"清输入数独矩阵\n");

total
=0;

memset(a,
0,sizeof(a));

memset(b,
0,sizeof(b));



for(int i = 0;i < 9;i++)

{

for(int j = 0;j < 9;j++)

{

scanf(
"%d",&a[i][j]);

if(a[i][j] == 0)

b[i]
++;

}

}



solve(
0,b[0]);



printf(
"共有%d种答案\n",total);

}

return 0;

}





43294235

2008年9月21日星期日

Software Development Lessons Learned from Poker

Posted by Jay Fields on Apr 26, 2008 07:36 AM
Community Architecture, Agile Topics Technology, Collaboration, Artifacts & Tools
Tags Best Practices, Patterns, ThoughtWorks, Checklists and Guides
I wasn't always a software developer. The two years before I joined ThoughtWorks I lived primarily off playing poker. Of course, if you've ever asked me about the tattoo on my forearm, you've already heard the story. If you haven't, feel free to ask me next time we get a drink together.
Jazz is IBM Rational's new technology platform for collaborative software delivery, designed to transform how people work together.
I've never regretted spending so much time playing poker. I believe it taught me quite a few lessons that apply widely to other topics. In fact the more I develop software the more I'm convinced that the two jobs are incredibly similar.
Learning
I approached learning poker the same way I approached learning software development: read as many books as possible. Over the course of 2 years I read every book on poker I could find. I stopped counting at 39. Of course, the same can be true for programming. I have 5 books in front of me right now that are queued up to read next, and I have a large collection of books that I've burned through in the past 3 years with ThoughtWorks.
I consider reading books, blogs, and magazines to be essential for both programming and playing poker, but in both professions reading books isn't good enough. You may be able to keep all the knowledge in your head, but knowing when to apply which rules is the mark of a true professional.
Reading material is great for learning, but it's almost always the context that determines when to apply a certain technique. Since books cannot be specific enough to provide all possible contexts, only experience can give you the ability to be able to make a quick decision that could end up costing you or your employer thousands or even millions of dollars.
There truly is no replacement for experience.
Art at the highest level
You can design a computer program to beat an average poker player. By following basic rules you are guaranteed victory. However, to this day there are no programs that can beat the best poker players. This is because at it's highest levels poker is an art. Of course, the same is true for software development. To become an average developer all you need is a catalog of best practices. If you follow the cookbook you are almost guaranteed to create an average application. Truthfully, that's better than the most common alternative. So many projects fail that, I believe, most managers would gladly pay for an average application.
Of course, some managers have higher standards. At banks, start ups, medical systems, etc the stakes are much higher. Average isn't good enough. These managers are willing to pay for the best and they expect a much higher level of skill. The problem is, expert developers have a different skill set than average developers. Average developers know how to do something, experts know why to do something. Average developers follow patterns books like they are cookbooks, expert developers understand that innovation applied to patterns can lead to exponential performance gains.
Expert developers have such a different view of the world, it can be hard for average developers to interview experts. Being an art critic is easy, being a good art critic is very hard.
Judging skills
One thing is absolutely true about both poker and programming: almost no one is as good as they think they are. Knowing that you aren't as good as you think you are is a good first step, but it's hard to know how much better the experts are. Programmers are rarely exposed to enough experts to fairly judge their own skill level. At the poker table everyone gets together for tournaments, but I'm always very surprised by how highly most people rate their abilities.
The same is true of programmers, but most of them have even less information to work with. The technical leader who never attends a conference has only his team members to compare himself to. Of course, he's the tech lead, so chances are he's already the best. But where does he stand compared to the talent level of the rest of the industry? If he believes he is already on the top of his game, what happens when he meets someone with different opinions? Some are excited about the prospect of learning, but most dismiss contradictory ideas to their own as silly.
Teamwork
To the casual observer poker appears to be a game where it's everyone against everyone. In fact that's rarely the case. Even at the low stakes tables there are generally at least a few people who know each other. These acquaintances don't make deals to take on the rest of the table, they don't have to. It's understood that you don't make money playing poker against people who are good, you make it by playing with them to take the it from those who are not. Professional poker players work even more as a team. Several of them own percentages of each other, thus if any of them win, all of them win. They don't stop by knowing only each other, they know everyone. The floor manager can call them when a good game is going on. The waitress can make strong drinks for their opponents. The dealers can make "mistakes" to upset certain players (rarely do people play well when they are upset). Everyone works together to ensure that everyone gets paid.
Programming is interestingly similar. Many programmers sit in cubes, tackling problems all on their own. These programmers often work with a strong code ownership model. I've seen these developers deliver applications, but integration is almost always a pain point. Unfortunately, integration pain is often the smallest problem. Consider an IT department that locks the business to a 500 page requirement specification. If the business needs to change direction there's often a very painful change request system put in place. Millions are wasted as programmers build features that the business no longer needs, but IT departments haven't found a better way to work with their businesses.
Of course, it doesn't have to be this way. Experts collaborate. Experts collaborate with other expert developers, but also with their managers, customers, business, analysts, quality assurance, and any individual who can contribute to their success. Experts understand the bigger picture: working together ensures everyone gets paid.
Metrics
Aspiring poker players often talk about how many hands they won or lost. Mostly, they talk about hands that they should have won but lost. Sometimes people make mistakes and lose, but they don't usually remember those hands. Conversely, they seem to remember every single detail of each hand they've ever lost where they were simply unlucky. The stories often contain the percentage chance that their opponent had to win. Poker players know how many hands they've lost, and what their chances were to lose. Poker players know metrics. However, professional poker players know to focus on the metrics that matter. It doesn't matter how many hands you win or lose, it matters how much money you win or lose. Furthermore, worrying about your bad beats actually translates to worrying about the poor performance of your opponents. Since you profit from your opponents mistakes, you are essentially complaining about your opponents giving you their money.
Having metrics is good, but professionals know which metrics are important, which are simply noise, and which fall somewhere in between.
Software development also contains many metrics, and many of them receive much more attention than they should. For example, it's very hard to get much value from knowing the number of lines of code. Complex applications require a fair amount of code, but what's fair? It depends on the language, tools, and any number of other factors.
The number of bugs fixed is another less than interesting metric. Why does it matter how many bugs have been fixed? The number of bugs might be valuable, but knowing how many are fixed doesn't really tell us much.
My personal favorite is feature complete percentage. Unless features are estimated for level of effort then knowing how many features have been completed doesn't really tell you much of anything. And, if you already measured level of effort, then why not measure effort of things done with things that aren't done to show progress. It's tough for me to see any value in the feature complete percentage.
Code coverage is a metric that reminds me of keeping track of your bad beats. There's value in the metric, but most people miss the point. Having a low code coverage number means you probably do have a problem, but having a high code coverage number means nothing more than you have a high code coverage number. High code coverage cannot ensure high quality.
People, not Logic
If you've seen any movie with poker in it, you've likely heard: You don't play the cards, you play the person. This is very true. Poker is in incredibly psychological. Sure, you needs cards some of the time, but getting good cards is only part of making money. Once you have good cards, you need to know what to do with them. Should you raise, check-raise, or simply check or call. This choice depends on many factors, but the central factor is knowing the people you are playing against. When you get good cards, your number one goal is to make as much money as you can off of them and the only way to know how to get more money is to know what actions will make your opponents give you more money. Logic helps you win hands, knowing people helps you win money.
People are equally as important in delivering software. If software were simply about making things work, it would be much easier to automate. But, software is about so much more than groups of features. It's about software packages sold over a game of golf. It's about contracts signed during a complimentary trip for the family to Disneyland. It's about fulfilling contracts for software that's no longer needed, to avoid yet another lawsuit. It's about business that needs to change at a rate faster than their competition.
Software development is about every variable related to every person in every organization that uses, developers, maintains, or relies in some way on that one piece of software. There are simply too many variables to apply simple formulas and produce quality software. Instead, the expert software developer needs to take into account all the known and unknown variables that each person introduces and make their best guess. It's helpful to know what you should do, but it's priceless to know what you must do. Logic helps you deliver applications, knowing people helps you deliver value.
Working with Incomplete Information
Beginner poker players have it very easy. Play good hands, always bet, never bluff. That's it, you really shouldn't do anything else while you are first getting started, unless of course you have a bunch of money you want to give away. It's moving up from the beginner level that really is hard. There's so much information coming at you all at once. You need to pay attention to the attitudes of everyone at the table, how they are interacting with each other, what your history is with each individual opponent, what kind of hands they like to play, who's winning, who's losing, and a million other variables. Also, you can't know for sure what the other players are holding and what the next cards are going to be. You have more information than you can handle, and still not all of it.
Programming is no different. Domain experts hold all the knowledge, but it's inefficient for them to try to give you all that domain knowledge up front. Furthermore, you may not need all that domain knowledge. You also need to know your team well, but there are things about your teammates that you will never know or fully understand. Yet, expert programmers can digest necessary domain knowledge, understand their team's dynamics, and consistently provide technical vision. Expert programmers understand that they will never have the entire picture, and they also understand which things are worth considering, and which things need to be disregarded. Despite overwhelming and incomplete information, expert programmers consistently make correct decisions.
Immediate Feedback
Average poker players are better off in poker games that provide less feedback. This is because poker players win money based on information. In a 5 card stud game there is only one round of betting. Only one round for someone to exploit information you've given them and only one round for you to make a mistake. Expert poker players prefer poker games with many rounds. The more rounds there are in a poker game, the more times an expert has an opportunity to exploit a less skilled opponent. Expert poker players appreciate immediate feedback and the ability to vary their play based on that feedback. Poker games with several rounds give you feedback in each round, at which time expert poker players alter their play to fit the current situation.
Expert software developers also value immediate feedback. Immediate feedback from the business can save you from building the wrong domain concept into an application. Immediate feedback from another programmer can point out a bug before software moves to production. Feedback by way of a Continuous Integration server can provide immediate integration feedback, thus easing integration pain. If you prefer Agile, you'll immediately point to Iterations as an obviously beneficial practice of giving both programmers and the business immediate feedback. However, even if you don't agree with Agile, an expert programmer recognizes the value of immediate feedback. Even if you work in a non-Agile environment, an expert programmer seeks as much feedback as possible to avoid wasted time and effort. Immediate feedback lets you know if you are headed in the right direction, and every expert appreciates that information.
Context is King
With poker and programming there are few right and wrong answers. Should you fold Kings before the flop? Maybe. It depends on if you in a tournament or cash game, is it limit or no limit, what seat are you in, has it folded to you already or is it already capped, is the game wild or is it full of rocks, and on and on. One thing I learned about poker is that all those factors and many more must me considered before giving your answer.
The more I program the more I realize the exact same lesson applies to programming. In some situations Java is a good choice, but not all. Of course, the same can be said of almost any programming language. This is true of tools also. Hibernate is great, until it isn't, then maybe IBatis is great, until it isn't and then a new solution needs to be found or crafted. Almost no solution is simply a good thing, instead it's a good thing given the right situation. Given the wrong situation it's a horrible idea.
So, before you dismiss or evangelize your next language or tool, please remember: It depends...

从玩扑克到软件开发

我以前不是做软件开发的。在加入ThoughtWorks两年之前,我主要靠玩扑克为生。当然,如果你曾跟我打听过我前臂上的纹身,那你肯定已然听过我的故事了。要是还没有,等下次我们一起喝一杯时,我可以讲给你听。
我从未因为花这么长时间玩牌而感到过遗憾,从中我学到了一些放之四海而皆准的知识。开发软件的时间愈久,我就愈加确信这二者之间具有令人难以置信的相似性。
学习
我学习打扑克和学习软件开发的方式是一样的:尽可能多读书。我用两年的时间,读完了所能找到的每一本有关扑克的书。最后竟至39本之多。编程亦如是。此刻,我面前仍然摆着接下来要读的5本书;而在过去三年ThoughtWorks的工作中,我放火烧掉的书亦不在少数。
我认为,无论编程还是玩牌,阅读书籍、博客与杂志都是要想有所成就的必备条件;而若要以二者为谋生之业,仅靠读书却是远远不够的。也许你可以把书本上的一切知识都装入脑中,但知道在何时应用何种规则,这才是真正高手的标志。
诚然,开卷有益。但总要走过万里路,方能对应用特定技术的具体环境烂熟于心。书本不可能把所有情况都囊括一空,只有通过亲身体会得来的经验,才能让你在某些状况下为自己或是雇主做出快速而正确的决策,而这些决策可能价值几千乃至数百万美元。
经验之宝贵,世间无物可代。
艺术的巅峰
你可以设计出击败普通扑克玩家的计算机程序。遵守一些基本规则,自然就可获胜。但迄今为止,还没有任何程序可以击败最好的扑克玩家。因为扑克技能达到巅峰时,也就成了一门艺术。软件开发亦如是。要想成为一个还不错的开发者,只要遵循一系列最佳实践即可。如果按照经典参考指南一类的书籍行事,开发出还不错的应用程序应该不成问题,而且效果会胜过其他最常见的做法。有了这么多失败的项目作为前车之鉴,我相信,还不错的应用就足以令大多数管理层甘心掏腰包了。
当然,有些经理有更高的标准。在银行、创业公司、医疗系统等领域,标准则更为严苛。“还不错”自是远远不够。那些经理会很乐意为最佳选择买单,他们期待的是远超常人的技能。但问题在于,专家级程序员的技能与普通程序员不同。普通程序员知道做事的方式;专家知道做事的目的。普通程序员会僵化跟随模式书籍中的指示,就如遵守参考指南一般;专家则明白对模式的创新可能会带来指数级的性能改善。
他们看到的绝非同一个世界,所以普通程序员很难跟专家对面交流。做艺术评论家易,做优秀的艺术评论家难。
决策技能
在扑克和编程中有一条绝对真理:几乎没人能像他自我感觉的那么良好。有自知之明是不错的开始,但人们依然很难知道自己与专家之间的差距。程序员接触专家的机会并不多,也就无法公正评判自己的技能。在牌桌上,每个人都是为了锦标而来,可大多数人都会过高评价自己的牌技,这总是让我惊讶不已。
程序员之间亦是如此,而且大多数人可以获得的信息更少得可怜。一个从不参加任何大会的技术领导人,只能跟自己的团队成员一比高下。当然,他可能已经很优秀了,否则也不会成为技术领导。但如果与整个行业中最出类拔萃的人相比,他又处于什么位置?如果觉得在自己的圈子里已经一览众山小了,那碰到不同意见时,他又会作何反应?有些人会视之为学习的契机并为此感到兴奋,但绝大多数都会对不同意见嗤之以鼻。
团队协作
乍看上去,扑克是一种彼此对抗的游戏。但事实很少如是。即使在赌注最小的牌桌上,通常也至少会有几个人常打交道。他们不会达成条件一致对付牌桌上的其他人——他们也不必如此。大家都明白一条道理:你不是要去跟牌玩得好的人对着干,赢他们的钱,而是要从水平低的人身上赚钱。专业牌手甚至会像一个团队一样协同工作。有些人彼此利益相关,故而一人得利则众人均有收益。他们不仅互相了解,而且认识很多人。如果出现一局精彩牌局,楼层经理会跟他们打招呼;侍者会为他们的对手调制酒精度高的饮品;荷官会故意“犯错”以影响某人心情(很少有人在心情不好的时候能够打好牌)。每个人都在协同工作,确保大家都能挣到钱。
颇为有趣的是,程序员的情况也与之相似。很多人都坐在格子里,完全依赖自己解决问题。他们往往工作在代码个人独有制模式之下。我曾亲眼目睹,在这种程序员交付的应用中,集成问题一直都是大家的心病。而更为不幸的是,集成之痛还只是最小的问题。假设IT部门把业务需求锁定为500页的需求文档。如果公司决定改变业务方向,随之而来的系统变更需求将令人痛不欲生。数以百万计的金钱付诸东流,因为程序员开发的特性已不再具备业务价值,而IT部门还没有找到更好的方式来应对业务变化。
当然,情况并非总是如此。专家懂得协作。他们会跟其他专家协作,但也不排斥与经理、客户、业务部门、分析师、质保人员,以及所有可以为成功贡献力量的人协作。他们胸怀大局:只有协作,才能让每个人有所收获。
度量
雄心勃勃的牌手常常讨论他们赢了多少手牌,又输了多少手。他们讨论最多的还是本该赢但却输掉的那几手牌。有时人们会犯错误输钱,但他们一般都不会记得这几手是怎么输掉的。相反的是,如果有些牌局只是因为手气不好而输掉,他们就会记得那一局中的每一处细节,他们还会在故事中透露对手必然获胜的几率,来证明自己根本没有胜出的机会。真正的牌手知道他们输掉过多少手牌,以及失败的大概几率。他们懂得度量。而且专业牌手会专注于重要的度量标准。你赢了多少手,输了多少手,这无关紧要;重要的是你赢了多少钱,输了多少钱。而且,为你的狗屎运(译者注:bad beat,即开局时输家比赢家牌好,赢的几率更大,但关键时刻赢家却来了更好的牌。碰到狗屎运——take a bad beat——用来形容输家,来了狗屎运——lay a bad beat——用来形容赢家)苦恼实际上等于替你对手的牌运犯愁。既然你的收入来自于对手的错误,那你就是在抱怨为什么对手把钱给了你。
有度量标准是好事,不过专业人士懂得哪些标准重要,哪些只会分散注意力,哪些介于二者之间。
软件开发也有很多度量标准,而且有很多标准身上的光环已经远远超出了它们所应有的范围。例如,知道代码行数几乎不能带来任何价值。复杂应用需要相当多的代码,但这个“相当”到底是多少?它得依赖于语言、工具及其他因素。
修复的bug数量也是个很有趣的话题,只是略逊于前一个。为什么人们会在乎修复了多少个bug?Bug数量也许有其价值,但是修复的bug数目并不能为我们带来多少有用信息。
特性完成率是我自己最喜欢把玩的一个标准。除非我们使用特性来评估工作量,否则知道完成了多少特性又有何用?而且,如果已经对工作量做出了评估,那为什么不把剩余工作与已完成工作相比较,从而得到工作进度呢?我很难从特性完成率中看到价值所在。
代码覆盖率让我想起了记录狗屎运。这项度量是有意义的,但很多人都没抓住重点。代码覆盖率低意味着可能有问题存在,但是代码覆盖率高只能表示你有一个很大的代码覆盖率数值。高代码覆盖率与高质量之间没有必然联系。
注意人,而不是逻辑
如果看过有玩牌镜头出现的电影,你大概听过这样一句话:你不是在与扑克玩,而是与人玩。此言极是。牌手无疑都是心理学家。有时你确实需要某些牌,但拿一手好牌只是赚钱的一部分而已。一旦有了好牌,你就需要知道怎样利用好它们。你是应该加注,还是先让牌然后加注,还是彻底让牌,还是跟进?这些做法依赖于很多因素,但关键还是要了解牌桌上的对手。当你得到一手好牌,首要目标就是尽可能多地从对手那里赢钱,而达到这种目的的唯一方式则是想办法让对手给你更多的钱。了解逻辑可以帮助你赢得几手牌,了解人则可以帮助你赢钱。
在交付软件时,人处于同样重要的地位。如果软件只是让一切工作起来,那只要把它变成自动化的工作,事情就容易得多了。但软件却远非功能组合这么简单。在一场高尔夫球比赛中,人们会卖出软件包;在全家到迪斯尼免费旅游时,人们会签下软件服务合同;为了避免法律纠纷,人们会履行合同去构建已经毫无用处的软件;为了超越竞争对手,人们会使用软件来加快业务响应速度。
人们使用软件、开发软件、维护软件,或是在某种程度上依赖软件。软件开发与这个世界有着千丝万缕的联系,要把洋洋洒洒的变量组合成简单方程,生产出高质量的软件,又与登天何异?但是,软件开发高手需要考虑每个人引入的所有已知与未知的变量,做出他们力所能及的推测。知道应该做什么会让你受益,而知道必须做什么所带来的价值却是难以衡量。了解逻辑可以帮助你交付应用,了解人则可以帮助你交付价值。
在残缺的信息下工作
有关这点,刚开始打牌的人处理的非常好:打好每一手牌,老老实实押注,从不虚张声势。这便是了,新手就应该只做该做的事情,除非你的钱多得没地方花了。难点在于如何从初学者的水平提升。大量信息霎那间纷至沓来,你需要注意牌桌上每个人的每一处细节:他们怎样交流,你从前跟他们每个人打过什么交道,他们所钟爱的玩牌方式,谁在赢,谁在输,凡此种种不一而足。而且,你也不可能知道对手手里的牌是什么,下一张牌又是什么。你所拥有的信息已超出所能处理的极限,而且这远非全部。
编程亦如是。领域专家无所不知,但把一切都向你倾囊相授却毫无意义。何况,你也不一定需要所有的领域知识。你需要熟悉团队,但同事总有些事情是你永远无法知晓,或者不能完全理解的。不过,编程高手能够把必要的领域知识融会贯通,掌握团队的动态,并始终提供技术上的真知灼见。他们知道他们永远无法成为百晓生,他们知道什么事情值得思考,哪些应该置之不理。纵使面前汹涌澎湃的信息仍是残缺不全,他们也总能做出正确的决定。
即时反馈
普通牌手在反馈信息少的游戏中表现最好。因为牌手是根据信息而赢钱的。在5张牌梭哈中只有一轮押注的机会。各位玩家只有一次机会来分析你给出的信息,而你也只有一次机会犯错。专家级牌手更喜欢多轮的游戏。游戏中的回合数越多,他们就有越多机会从低水平的对手身上捞到好处。他们喜欢即时反馈,并根据反馈做出调整。在有多个回合的游戏中,每一个回合都可以得到反馈,专业玩家就会根据当前局势调整打法。
编程高手同样喜欢即时反馈。从业务人员即时反馈回来的信息,可以避免你在构建业务应用时走上弯路。从另一个程序员即时反馈回来的信息,可以在软件产品化之前发现bug。持续集成服务器可以提供即时的集成反馈,从而避免集成之痛。喜欢敏捷的人能马上说出迭代是一个有着显著成效的实践,因为它可以让程序员和业务人员得到即时反馈。不过,作为一个编程高手,纵使他不喜欢敏捷,他也能够意识到即时反馈的价值;即使在非敏捷的环境中,他也会争取得到更多的反馈,从而避免浪费时间精力。即时反馈可以让你了解前行的方向正确与否,每一个专家都会珍视这些信息。
上下文为王
无论扑克还是编程,没有绝对正确或是绝对错误的选择。如果你有一对K,那么在翻牌之前你该不跟么?也许吧。这要看你是在打比赛还是赌钱、有上限还是没上限、你坐在哪个位置上、你是否已经不跟过一次还是已经封顶了等等。我在扑克中学到了一点,那就是在给出答案之前,一定要综合考虑所有的因素。
在编程中沉浸的时间愈久,同样的体会在我心里就愈加深刻。Java在有些时候是不错的选择,但它并非万能。所有的编程语言均如此。工具亦如是。Hibernate很不错,但它不适用的地方还有IBatis,当IBatis也不适用的地方还会出现或自己创造新的解决方案。几乎没有一款解决方案能够绝对有效,它只有在恰当的形势下才会发挥应有的作用。在错误的环境中,它也许会成为毒药。
所以,面对一门新的语言或者工具,无论是你是打算弃若敝履,或是爱不释手推而广之,不妨先想想它的适用环境,尽量做到对症下药,量体裁衣。
查看英文原文:Software Development Lessons Learned from Poker来自:http://www.infoq.com/cn/articles/fields-it-depends

深度探讨:真正技术高手是如何炼成的?

在由CSDN和《程序员》杂志联合举办的第三届中国软件技术英雄会(上海站)上,由主持人CSDN首席分析师孟岩,上海群硕大中华区软件开发总监邵荣,阿里软件技术总监叶伟,盛大游戏首席技术官朱继盛, 趋势科技(中国)有限公司技术总监蔡昇钦,巨人网络集团首席技术官CTO宋仕良,淘宝网首席架构师王文彬共同参与的CTO论坛上,就有关CTO是否必须为技术高手,从程序员到技术高手成长之路,知名互联网公司如何招聘人才等问题与参会者进行了深入的交流。精彩观点:我觉得CTO并不必须是技术大拿,大家今天可以看到,从CTO的定义来看,CTO的角色是用技术服务公司的商业模式。从这个定义,只要你对技术有相当性的掌握,其实你可以不必从底层做起。——王文彬CTO很重要的目标是在于它能够整合公司的商业能力,成为一个CTO的重点,是你对公司核心技术的了解度跟掌握度,还有公司主要的核心业务的掌握度。——蔡昇钦技术高手和CTO这两个角色,打个比方,像一个乐队里面,技术高手像小提琴演奏者,或者是一个钢琴演奏者,但是CTO相当于一个乐队的总指挥,乐队的指挥需要有对音乐的整体感觉,这方面肯定更拿手。——朱继盛CTO还是应该是一个内功高手,还是要有点内功,这说明什么,你在技术方面,应该有技术的洞察力,要看到商业和技术的结合。——叶伟跟技术团队,尤其跟程序员,跟工程师,你要有共同语言,我觉得如果说没有一定技术深度的话,其实很难能够融进整个的团队。——邵荣如果作为一家创业型的公司,特别是互联网,特别是软件行业,CTO必须是一个技术高手,因为你是一家创业公司,技术平台应该是公司的核心业务,如果CTO不是技术高手,这个公司很难在商业上有大的作为。——宋仕良程序员或高手容易犯的错误是什么,或者我觉得做得不够的地方,是程序员容易觉得我做的这个东西很好,很牛,我这个东西别人应该喜欢用,由我来推演别人。——邵荣要成为高手,就像练功一样,你必须能耐得住寂寞,要关在研究室里面,像大家一样,晚上写代码,有时候这种东西不是平常人可以做到的,假如你可以呆过这段期间的话,我相信你练到功成了以后,这些东西你就可以发挥出来了,我想这是成为高手很重要的因素。——王文彬我建议大家去尝试做产品经理或者系统分析师,架构师很多人误解为纯技术的,其实许多的架构师对商业的分析是非常擅长,对于系统分析师,因为系统分析师是非常清晰地要描绘出商业的目标在什么地方,分解成什么东西,跟技术有关联。——叶伟首先在于留住人才,我们让工程师知道,工程师他不是低于管理者的,也就是说,你一个经理,他所拿到的整个薪资,不一定要大于他所管理的工程师。——蔡昇钦以下为论坛实录:主持人:在正式开始之前想先做一个小调查,我想请问一下,在座的六位CTO都是技术管理者,都是技术大拿,你们谁认为成为一个技术管理的高手,或者CTO,成为技术高手是必经之路,想成为一个CTO必须先成为一个技术高手吗?淘宝网首席架构师王文彬:先说明一下,我是假CTO,我的职位其实是做技术,在淘宝做品牌架构,说实在的,我有一个技术背景,但我觉得CTO并不必须是技术大拿,大家今天可以看到,从CTO的定义来看,CTO的角色是用技术服务公司的商业模式。从这个定义,只要你对技术有相当性的掌握,其实你可以不必从底层做起,我们今天讲的是CTO是不是一定要从底层的技术人员干起,假如从这个角度,我觉得做CTO不一定经过必须这个角色,当然现在业界很多CTO,我想在座很多CTO是从技术出身,这是现实,但是理论上我不觉得是一定的事实。趋势科技技术总监蔡昇钦:我认为CTO有很重要的目标是在于它能够整合公司的商业能力,成为一个CTO的重点,是你对公司核心技术的了解度跟掌握度,还有公司主要的核心业务的掌握度,所以不一定说非要从底层干起,当然CTO也可以是掌握技术最高的那个人,但是这不是一个唯一的一个对应关系。盛大游戏首席技术官朱继盛:技术高手和CTO这两个角色,打个比方,像一个乐队里面,技术高手像小提琴演奏者,或者是一个钢琴演奏者,但是CTO相当于一个乐队的总指挥,乐队的指挥需要有对音乐的整体感觉,这方面肯定更拿手,但是你说他,说到他必须是一个小提琴高手,或者必须是一个钢琴高手,这不一定,也说明作为一个CTO的话,不一定是从一个技术高手成长过来的,作为一个CTO,他最主要的职能在于整体的协调,对于音乐整体的把握,或者技术整体的把握上。阿里软件技术总监叶伟:这个问题很难回答,是不是一定要成为一个高手,我曾经发现自己技术上好像也有点高,但是很快发现自己不高了,因为高手太多,刚才盛大的朱总也谈到了,你不可能样样都精通,我本来想打这个比喻也差不多,不过总的感觉,还是应该是一个内功高手,还是要有点内功,这说明什么,你在技术方面,应该有技术的洞察力,要看到商业和技术的结合。我还得补充一点,我们就从CTO的词上来说,最后一个词是officer,officer什么意思,实际上是个管理者,你真正的本事是把一个团队凝聚在一起,并且服务于商业,如果你没有那方面的能力,你今天编程越厉害,或者某个方面精通的,根本不能把你放到CTO这个位置上面,越放到上面越危害,你带着一帮人不知道往哪方面奔,你纯粹只是兴趣,无法为给公司带来商业价值,大家都知道公司其实是要产生这个价值。群硕大中华区软件开发总监邵荣:我更倾向于必须成为技术高手才能成为CTO。刚刚几位的观点我是认同的,但是还有一些不同的想法。第一个就是自己大言不惭来讲,我自己是走技术这条路过来的,然后在这个过程里面,我自我感觉,就是说你跟技术团队,尤其跟程序员,跟工程师,你要有共同语言,我觉得如果说没有一定技术深度的话,其实很难能够融进整个的团队,尤其,当这个团队,比如说从很小规模,你很可能在前面做很高指点的话,能够落地,给他们一些帮助,所以说在整个我觉得成为一个技术主管的过程当中,如果说有相关的比较深的这样一个经验的话,我想应该会有一定的帮助,整个到后面真正成为CTO,或者成为技术的主管的时候,那个时候是不是技术还是跟原来一样重要,不是,它只是属于在整个的过程当中,其中一环吧。巨人网络集团首席技术官宋仕良:刚才几位的观点我是同意的,我之所以更倾向于必须成为技术高手才能成为CTO,其实我自己也是一个从技术的底层干起来,我也是写程序的,我为什么觉得这个问题可能要分两个部分来看,如果作为一家创业型的公司,特别是互联网,特别是软件行业,CTO必须是一个技术高手,因为你是一家创业公司,你的公司要创业,技术平台应该是公司的核心业务,如果CTO不是技术高手,我觉得这个公司可能是很难在商业上有大的作为,如果像一些传统的公司,或者做金融那些公司,它来有一个做IT的部门,就不一定是一个技术高手,更重要的是偏重管理,或者是对业务流程的熟练,并不一定是对技术要专注。主持人:不管怎么说,台上的六位都是我们心目中公认的技术高手,我想问其中几位,台下有很多人,有的人已经是高手了,有的人还在成为高手的路上,我想你们跟大家分享一下,如何才能成为一名技术高手,成为一个技术高手一个最重要的经验是什么,我想邵荣首先与大家分享一下你的观点。邵荣:先简单说说我自己的一个成长经历,其实我在95年、96年左右的时候,我在操作系统上玩java,我的导师要求我在一个月之内掌握当时的内容,其实就在那个时间开始做很多事,凭着狂热,后面我在DOS里面写自己的Windows的驱动,去驱动整个的鼠标、键盘,再到后面,帮那个研究所做过一个,大家不知道南极星,我自己做了一个,帮香港的一个公司做了一个斯托尼方。我那个时候真的有点不知天高地厚,就想走出苏州,我以前在苏州大学里面,自己也做了老师,还教软件工程,教C++,当时我走出苏州的时候,我讲了一句话,在整个苏州可能没有人在C++上超过我,最多只能跟我沟通交流,过了多少年才知道自己错得多厉害,当时自己的自信心很膨胀,我那时候基本上把白天黑夜倒过来干,基本上是每天吃完早饭回去睡觉,然后别人吃中饭,我吃早饭,连续很多年,大概是最起码4、5年时间一直这么来干活和工作的。但事实上随着时间推移,号称自己觉得还可以,慢慢开始有不同的理解,当中有一个关于互联网,我不知道有多少人知道“白云黄鹤”这个BBS,这是在教育网里面仅次于清华的,我当过两年版主,通过在里面解决问题,带来很多思索,之后我又开始疯狂看软件工程,后面又开始看管理,在市面上的管理方面的书我都看过,事实上一步一步走过来,到今天我思索很多东西,很多时候在里面思索一些商业模式,思考整个团队的建设,思考很多东西三年之后会发生什么事情,客户那边是什么东西,那这么多年里面,我觉得有一个词,就是我影响很深刻的,可能对大家有些启发,叫EMPATHY,这个词的中文含义叫移神,那么我把它去更形象化来讲,就是将心比心,我觉得这么多年过来了,从技术高手转到现在为止,可能很多时间是负责技术的方向,甚至于是整个业务方向,从原来的执行者变到现在的一个布局者,我觉得很多很多时候,EMPATHY这个词给我自己很大的一个促进或启迪吧,程序员或高手容易犯的错误是什么,或者我觉得做得不够的地方,我做的这个东西很好,很牛,我这个东西别人应该喜欢用,由我来推演别人,EMPATHY这个东西,我做这个东西首先站到别人的角度看,我想要带团队,我会站到团队角度看这个问题,你必须在很早的时候预估到很多部分,我觉得很多程序员应该了解,但是最后没有做的事情是尝试性的一些东西,所以随着时间推移,我觉得做真正的技术高手,或者想成为技术高手,我觉得应该往一些更软性的东西想,讲句实话,我往管理方向做的时候,看了很多哲学和心理学的书,这些东西对拟人生有非常多的促进,不要走太多刚硬的路。主持人:邵总很性急,一下把我后面要问的问题全都回答了。我们接着往下问问叶总,我知道您的技术非常好,思路也很活跃,所以您走上技术这条路,但是我有一个问题是,您后来为什么没有走上创业的路线,您觉得怎么评价一个技术人员的价值,跟着人干也算成功,还是我非要自己创业呢?叶伟:这个问题相信很多人都面临着,不管你曾经或者将来,你最终选择了什么,你有可能选择了去创业,也可能这时候没有想创业,我个人认为呢,有几个方面,一个是来自于客观上,比如说跟人的性格有关系,有些人可能性格上并不善于冒风险,大家都知道创业是非常冒风险的。第二个,你的知识结构能力方面可能有局限性,你创业,所有的责任都是你在承担,你要考虑是否能得到成功,你会考察你的特长在什么地方,从性格方面说,可能有的人说我希望去宁为鸡头,不为牛尾。我另外有一个观点,这也是我自己的,可能我没有去创业的很重要的想法,我真正想创造社会价值,这个价值要摆在舞台上,这个舞台如果适合你发展,而且它也很大,而且我们大家都知道互联网可以把全世界都联合起来,你有没有智慧,你跟着英明的道路走,这是你可以考虑的。说实在的,我自己的经历,我开始的时候,没有进外企,为什么呢,我读书的时候去打工,所以我在民营企业,很快做大了,那时候我做CTO,管理几十个人,后来我觉得这个行业比较小,我做ERP,我也不再做CTO了,ERP大家知道会影响很多的企业,OK,我去做这个东西,我进了金蝶,在行业里比较大,然后后来我进了互联网行业,阿里巴巴,因为我们要去做电子商务,电子商务它将影响更大范围的人,所以我觉得这个能够创造更大的社会价值。主持人:我昨天去巨人访问的时候,巨人的同事向我们说,宋总其实是一个不善于言词的人,但是我想问的问题是,您这样典型的技术人员的个性,怎么样管理一个团队呢。 宋仕良:确实我平时在工作中是不善言词的,因为我应该说比较喜欢做技术工作,我在学校里面天天钻研技术,工作之后也遇到一些朋友,然后朋友都是一些技术高手,因为我工作的时候去一家公司,那家公司的同事也是技术高手,在清华BBS上被评为中国十大黑客之一,那不是贬义的,是软件高手或者技术高手,是做输入法的一个作者,我从他的身上看到一个真正的技术高手,是一个什么样的人,就是说平时不去太追逐一些功名这些东西,回到刚才说的话题,我一个不善言词的人如何把100多人的团队带下来,主要还是靠朋友,可能我会跟我的另一个搭档,他的沟通能力比较强,然后他在从事人际交往,在管理当中会比较擅长一点,我专注于做技术这块,相当于一个黄金组合了。主持人:王文彬先生是我们淘宝网的首席架构师,我知道您在淘宝网上扮演两种角色,一种是带领团队的角色,另外一种是掌管整个淘宝的架构。您觉得这两种角色,CTO带团队的角色和做架构师是什么关系?您是如何协调好这两者的关系的?王文彬:的确有点挑战,我老板每次跟我说你架构为什么没有做好,我说我一个人扮演两个角色(笑),但是这个角色里面是有相关的,比如我下面的同仁,其实大家都关注架构,所以其实我今天在带领淘宝团队做架构的时候,会依赖他们实行部分的架构设计,因为淘宝这么大的网站不是一个人就可以做得出来的,这也需要大家通力合作。这样自然就有一个团队,我想我只是起带头作用,带这个团队成本比较小,这也是为什么我两方面能够兼顾的原因吧。其实我再补充一点,刚刚主持人问怎么去变成技术高手,需要什么调整,我也一直在思考,其实我同意邵总的讲法,今天你做程序,技术上的东西最需要的是热情,这个热情也需要你具备一定的条件,我总结我自己的经验来看,当然我也有一点运气,加入了一流的团队,我想这会刺激一个人潜力的发挥,假如我今天没有遇到这群人,我不觉得我今天的看法能够到这种程度,但是另外一点,我觉得你今天要走技术这条路,有一点,要成为高手,就像练功一样,你必须能耐得住寂寞,要关在研究室里面,像大家一样,晚上写代码,有时候这种东西不是平常人可以做到的,假如你可以呆过这段期间的话,我相信你练到功成了以后,这些东西你就可以发挥出来了,我想这是成为高手很重要的因素。现在在中国,很多公司都在征才,其实大家对技术高手的需求是非常大的,只要把握这几点,相信大家有机会成为一个技术高手。主持人:叶总好像有什么想补充的?叶伟:是的,我想补充的是说,管理这个东西,它是你的工具,你的手段,对一个CTO来说,或者对负责技术研发的总监来说,实现这个目标,这是你的责任,管理是你的手段之一,你搭好架构,也是你的手段之一,这些东西你都要去管,没有一项可以落下来。另外一方面,这些责任不见得是跑在最顶上的人才有责任,其实我们的一个技术主管,经理他都会有责任,你说他当经理不要管团队,也要,只是CTO更专注在商业和技术架构之间形成桥梁,他需要把商业的东西分解成技术解决方案,反过来又要用我们的技术驱动创新,形成商业上的一些想法,所以我觉得是说,管理它是一个工具,帮助我们,你不要去忽略它,然后我想补充一下,刚才邵总前面谈的问题,怎么样成为一个CTO,一个是说你要以终为始,你看CTO核心的能力点在什么地方,我们刚才谈到是说,它是在跨越商业和技术,所以你要有这个技术,第二个你要组得起团队来搞攻坚战,这两方面都要,你要练很多东西,我今天讲不完,我提两个主要的,你可以同时去尝试,可能你距离CTO就近一些,第一个是做项目经理,没有丰富的项目经理,你根本就不知道怎么样跟人家合作,怎么样取舍,怎么样排列优先顺序,怎么样控制你的资源,前面我说CTO是个officer,第二个方面,他更多要有站得高看得远的角色,所以我建议大家去尝试做产品经理或者系统分析师,我谈架构师,因为谈架构师很多人误解为纯技术的,许多的架构师对商业的分析是非常擅长,所以我还是谈一谈系统分析师,因为系统分析师是非常清晰地要描绘出商业的目标在什么地方,分解成什么东西,跟技术有关联,我建立大家在这两个角色方面尝试一下。主持人:谢谢叶总,我们还有一位没发言。我知道趋势科技有一个特别优良的传统,你们在培养人才,以及留住人才这件事情上很有功力,我想了解一下,您怎么在您的技术团队里面培养人才,留住人才,这是一个大家现在很关心的话题。蔡昇钦:培养人才在趋势科技的做法,就是你给他舞台,然后他就是自己的编剧,他就是自己的导演,用这样的方式来做,我们在培养技术高手的层面上,在公司的框架当中,我们是把人才分成两个方面来看,在技术这条路上走的话,首先在于留住人才,我们让工程师知道,工程师他不是低于管理者的,也就是说在趋势,你一个经理,他所拿到的整个薪资,不一定要大于他所管理的工程师,因为我们必须让公司的团队知道,你喜欢钻研技术,那是因为你的兴趣所在,你喜欢管理团队,你喜欢跟人打交道,那是你的兴趣所在,从一个公司角度看,我们鼓励人基于自己的兴趣做好他的发展,所以从这样的情况了解员工后段的需求,然后安排他去他有可能的位置,很自然而然员工就会跟公司走得很近。像我通常会跟我的团队的人员讲,不管是资深的还是资浅的,我每年会问他们一个问题,你有没有想过你5年后干嘛,我会记得他们2006年跟我讲什么,2007年跟我讲什么,2008年跟我讲什么,他有没有改变他人生的五年规划,三年规划,我们尽可能在公司的范畴满足员工的需要,我想这样子,员工就会成长,就会跟公司走在一起。主持人:人才的问题其实是现在大家都很关心的,我在主持这个会之前,有人特意给我发消息,建议我多问在座的CTO一些关于怎样招募团队,保留团队的问题,由于我们现在人才培养存在一些问题,导致我们市场上优秀人才的数量有限,就带来保留人才和争夺人才之间的矛盾,我想问一下宋总,我昨天去巨人的时候,听说你们团队相当稳定,你觉得除了巨人的收入高以外,这个当然是很重要的因素,你还有什么诀窍吗?宋仕良:应该还是说公司重视技术人员,首先你重视人才,你应该是要尊重人才,一个技术人员,他有他自己的想法,而且每个人的想法都是不一样的,你要重视他的想法。 主持人:这种想法跟公司的目标不一致怎么办。宋仕良:目标不一致的话,那应该是给他做工作,就找他谈心,这个肯定要统一目标的,如果目标不一致,大家肯定走不到一起来,首先你在组建这个团队的时候,在选人方面,应该是物以类聚,我觉得至少应该选大家有兴趣,或者有共同拼搏方向的,或者是大家奋斗的方向是一致的,至少奋斗的目标一致的话,才能够很好地沟通,不会说我提出一个观点,另外一个人会有很大的反驳,首先你在组建团队的时候,每个人虽然达不到完全一致,但是大家的目标是一致,中间团队在磨合的过程中,肯定会出现这样那样的问题,这些问题我想都是可以解决的,因为公司或者通过一些协调,或者是互相的理解,互相的支持。主持人:朱总您觉得盛大在保持人员不流失方面如何。朱继盛:我觉得核心的思想只有一点,给相应的人自己的舞台,施展他自己的东西。可以举一些例子,比如说我们盛大集团的副总裁是80后的,他能作为一个上市公司的总裁。再举一个例子,去年盛大有很优秀的员工离职了,这个离职并没有任何人劝他,他自己有这个意愿,要自己创业,盛大有机制,让他自己编一个游戏,他在盛大的周围去工作,这样的例子,实际上在盛大有非常多这样的例子。主持人:谢谢台上的嘉宾和底下的观众。嘉宾:谢谢大家

学编程与炒番茄蛋

今天晚上,要给我们软08级的新生做一个交流会,要我去做专业学习方面的,自己最多也算是勉强刚刚入门,我面对的是没有任何基础的学弟学妹,想来想去就那这个番茄鸡蛋作比喻了,希望大伙给点意见!
怎么学习编程
分析:这个应该是大家最关心的问题,也是我觉得最不好讲的问题。编程就相当于做菜,老师课堂讲的语法知识相当于菜谱,至于你能炒出什么样的菜,就看你自己在下面的练习和体会了。
如何炒好一盘番茄鸡蛋?
第一步,确定一个菜系
中国有八大菜系,鲁菜 、 川菜 、 苏菜、 粤菜 、 闽菜 、 浙菜 、 湘菜 、 徽菜 ,也就是说同样的番茄鸡蛋至少会有八种不同的风味,你要选择那种作为学习的起点呢。其实,不同的编程语言就相当于不同的菜系,区别在于实现同样的功能(番茄鸡蛋)采用了各自不同的处理机制(风味不同)。 对于一个从没做过菜的人,学习那个菜系的番茄鸡蛋是不是一样的,选择菜系的意义在于通过该菜系去了解番茄鸡蛋的入门级的基本方法,同样选择一们编程语言的目的在于选择你是从哪个门去进入编程这个领域的,对于什么都不同的新手而言,最开始学哪一门都是一样的。
第二步,记菜谱。
选好了菜系,那么就要记菜谱了,菜谱告诉了我们:1.不能番茄鸡蛋里没有番茄,也不能番茄鸡蛋里没有鸡蛋。2.以怎样的方式使用番茄鸡蛋,比如放多少盐,什么时候放。菜谱告诉你炒番茄鸡蛋一些规则和方法,也就是说我们在学习编程的时候,书本上的语法知识仅仅是告诉了我们一些编程的必须遵循的规则和方法,这个是所有编程开发的基础。
第三步,炒出能吃的番茄鸡蛋。
菜谱记的再熟不见的你能炒出好吃的番茄炒鸡蛋。课本上的语法记得再熟不见得你能写出漂亮的程序。厨师要把菜谱告诉的信息变成现实中的番茄鸡蛋才有意义,我们要把课堂学到的变成实际存在的代码才能体会到编程的意义。这个转化的过程中目的在于学习,只要你炒出来的东西能吃就行了,只要你能实现老师布置的作业或者书上的练习题就好。
第四步,炒出好吃的番茄鸡蛋。
我们的要求不能这么低吧,肯定不能满足于能吃而已,那我们尝试做一盘好吃的番茄鸡蛋。重复的背菜谱能提高番茄鸡蛋水平吗,不能!多炒几盘才是硬道理。那么重复的记忆书上的语法规程能提高编程水平吗,不能!多写几遍才是王道。从能吃到好吃这个过程是经验的积累,从实现功能到熟练的编程这个过程也是经验的积累。
第五步,炒出创意的番茄鸡蛋
已经能中规中距的炒出一盘好吃的番茄鸡蛋了,还不满足,那就在创意点吧。比如,我们能不能变化番茄鸡蛋的存在形式,菜谱上一定是最好的吗。把鸡蛋换成煮好的茶鸡蛋怎么样,换成鸭蛋呢。换到编程上来,同样的功能,我们是不是可以用另外的方法实现,老师讲的就一定是最好的方案吗?我们完全可以去尝试使用自己的方法实现同样的功能。从好吃到创意是个思维延展的过程,从熟练到怀疑的态度也是个是思维延展的过程,但这个过程有一点很重要,不论的你的思维怎么延展,一定要把你想的编程现实,能用了才是对的。就相当于光更改菜谱没有用,创意版本的番茄鸡蛋能不能吃,还要炒出来尝尝看。
第六步,炒出人性化的番茄鸡蛋
经过前面的训练,我们现在已经可以炒出来相当有水准的番茄鸡蛋了,但是我们忽略了点,我们炒番茄鸡蛋的目的是什么,也就是说我们编程的目的是什么。 除了自炒自吃,更多的时候是炒出来的番茄鸡蛋给顾客吃的,而这个顾客又是厨师所不能控制的,顾客的爱好有很多,稍咸一点儿、清淡一点、要辣椒、不要辣椒等等,这个时候你要根据不同的顾客去炒出不同的番茄鸡蛋了,才能让顾客满意。那么编程呢,除了自娱自乐,编程或者说软件开发最重要的是服务于客户,你不能去要求客户什么,那么就需要我们自己根据不同的应用环境来变通了。从创意到人性化这个是认识挺高的过程,不要把自己的思维局限于技术本身,某种程度上可以说是客户的需求决定你要选择的一切。当然类似于番茄鸡蛋不要鸡蛋,这个没事找抽的可以不予理会。
第七步,炒出其他菜系的番茄鸡蛋
经历以上六步,修炼成一个番茄炒鸡蛋的高手是没有问题的了。这时候你肯定会发现各个菜系的番茄鸡蛋从菜谱到手法上其实差不多的,区别仅仅是一些调料的或者其他方面的小差距。对于编程而言,你会发现其实很多语言在设计上同样有很多相同的地方,但是由于一些具体细节的实现机制不同会有一些细微的差别。对于番茄鸡蛋而言,炒菜所需的方法是固定的,具体实现上会有些小差别,对于编程而言,编程的思想是固定的,具体到实现方式上会有一些不同。
当然番茄鸡蛋比较简单,编程又是个比较复杂的东西,这个我体会的方法希望会对大家有所帮助。经常炒才炒出好吃的菜,经常练才能写出漂亮的程序。 菜谱记得再熟,饭店不会要这样的厨师。决定厨师水平的就烧菜的能力怎么样,也就是菜烧得好不好吃。 语法记得再熟,公司不会要这样的程序员,决定程序员水平的是编程的能力怎么样,也就是程序写得好不好。
重要的不是菜谱,而是使用菜谱的能力。对于学习编程而言,重要的不是语言本身,而是驾驭语言的能力。
补充一点:学会在不同天气下做番茄鸡蛋。在实际工作中,面临种种外界压力,保持心中不慌。就像奥运会中韩国人在暴雨天气中都能射出十环的箭一样。
本文来自:http://www.cnblogs.com/flychaochao/archive/2008/09/18/1293178.html

我的丑震惊了党

鲁迅说,世上本没有丑,帅的人多了便有了丑,我来了,就又没了丑。笛卡儿说,我思故我在,笛卡儿见过我后就改口了:我帅故我在。语气十分强硬。 我是在丑人族学校长大的,先在奇丑无比班读书,几天内使所有同学患上了自恋症,于是为我特设了一个班,叫丑的n次方班。 初恋当然是网恋。见面那天,距我五十米时他就疯了,家长报案,法院认为长的丑的确不是我的错,但约出来吓人就是我的不对了,判我整容3年,整的丑上加丑。 我朋友都是丑人,都单身,也都单的心服口服,除了一位,这位发誓要结婚。那天她在街上拦住一绝色帅哥,递上一相片,是她与我的合影,帅哥看了后,一句话也没说,默默的回家准备婚礼,当天就取了她。  晚上才敢出门,出门必戴墨镜口罩牙套耳帽,溜墙根钻桥洞,却依然是万人围观,交警报110,110报军委,军委拉来大部队有组织有纪律地围观。 全球500丑大会,我的确参加了,但一见到我真人,他们就把我打出来,并换了会场横幅:“全球499帅哥大会” 有人投了猪胎,泼了硫酸,专程跑梅园找我比丑,刚从门镜打了个照面,他就跑了,飞快,我依稀听清了他留在风里的怒吼“太~他~妈~的~丑~了!” 英俄日法德美意奥,无论哪本字典,“丑”字的解释一律是:横刀立墙。地球人都认识也都认可这四个方块字。 红十字会正在讨论一项目,要给全球人民接种一种疫苗,据说该疫苗能使别人看见我时,自动产生马赛克效果。 抗洪形势严峻那阵,某大领导骑自行车驮我去帮忙,请了三次后,我去了。酒饱饭足,我对江面说了无耻至极的3个字“我不丑”,立马长江倒流,国泰民安。 我出生了两次。 第一次,一个医生从娘胎里把我拽出来,突然晕倒,一个护士闭上眼摸索着,把我塞了回去……
第二次我出生以后,医院所有的人都躲在太平间哭泣,院长自己抽自己的嘴巴子,怪自己有眼无珠,不该贪财接了我这个生意…… 母爱是伟大的,她不嫌弃我,把我养大成人,不过他在我脸上贴了一张骷髅照片,以减轻心理压力,面具伴随我到十岁。 十一岁那年,我上三年级,全班同学都是好奇心最重的时候,都拼命的想看看面具后的我到底什么样子,有个外号叫李大胆的同学趁我小便的时候一把扯下了我的面具,从此后,李大胆同学患上一种怪病,不会说话,目光呆滞,一天到晚什么也不干,对着一个人的头骨打死不眨眼,一闭上眼,就流泪不止…… 校长上报了教育局,教育局派人来了,因为全校的同学都转学了,校长每天早上只能吃半碗稀饭,老师的工资已经两月没着落…… 教育局的人见到我后,局长立刻辞职下海不干了,连锁反应,全国的教育机构解散…… 我走在街上,路边的人全在狂哭不止,一群猪从后边冲到我这里,忙不迭的给我戴红花,发奖杯,还给了我一个证书,上写:猪的救星。 隔壁刘麻子的媳妇要跟他吹,说他的一脸麻子太恶心了,绝对要离!!!正巧我走到他们窗前,刘麻子老婆一见我,
不说话了,拿出钱,到保险公司给刘麻子的麻子保了险,一个麻子一万…… 又惊动了联合国(?为什么要说又呢),安南无计可施,要求强迫我整容,可是没有成功,所有的整容医生见到我以后全部大哭不止,将近半数的医生进了精神病院,症状全部一样,什么也不会说,只有一句:“太~他~妈~的~丑~了!” 阿拉法特派专机来接我,要求我站在总统府门口,以抵抗以军的包围,我去站了一分钟,以军全军撤退,沙龙被迫辞职,巴勒斯坦举国欢腾,但当阿拉法特要介 绍我这个民族英雄的时候,巴勒斯坦全国人民打着灯笼也找不到了…… 一个作家找我,声泪俱下:我长这么大,最大的梦想就是得一次诺贝尔文学奖,可是现在的高手太厉害了……我有个绝招,只要我能在你面前写一部书,我一定能得奖!!! 我不信,于是他跟我待了一星期,写出一部长达五百万字的小说《地狱七日》,结果,连诺贝尔医学奖也被他拿了…… 诺贝尔总部宣布,世界上要是能找出形容我面貌文字,就能得文学奖,结果,全部的作家都改行卖猪肉了,诺贝尔文学奖从此消失…… 国家足协特招我进队,想借此真正冲出亚洲,在世界杯上,中国队一球未失,每一场都是一个比分12:0,一人一个球,踢完了就在草坪上开野餐会,我一个人在球门前bbq,对方球员包括守门员全部哭晕在地,裁判连红牌都掏不出来了 当然我们的队员也经过了循序渐进式的魔鬼训练,先看我的照片,然后看着我照片吃饭,然后再踢球…… 大力神杯从此永久的留在了中国,国外媒体评论我是魔鬼化身。 世界撒谎大赛开赛,各色人种的参赛选手开天辟地的狂吹乱侃,我走上台,只说了三个字就得了冠军,并且永久
保留冠军头衔,我说:我不丑…….

菜鸟VS老鸟

《1》OICQ
一日,菜鸟问老鸟:“老鸟,我有个问题想问你?”
老鸟爽快的说:“你问就是了”
菜鸟有点儿含糊的说:“先说,我问了这个问题你可不能笑我哦”
老鸟还是爽快的说:“放心好咯,我一点不会笑你”
菜鸟问:“真的?”
老鸟拍着胸口说“我对天发誓,绝对不笑!”
菜鸟问:“请问OICQ的意思是不是就是‘我爱重庆’的意思啊?”
“考!我可不可以收回我刚才的誓言啊!”老鸟喷饭中……
《2》ctrl+alt+del
一日,菜鸟遇见了老鸟,搔头道:“上次你给我介绍的那种启动方式是不是错咯。怎么就不行啊?”
老鸟奇问:“怎么不行啊?是不是那种热启动,同时按下ctrl+alt+del的方法啊?”
菜鸟带着有点儿抱怨的口气说:“就是!”
老鸟更讶:“怎么不行啊?”
菜鸟迷惑的说:“我用了五根手指头分别按下了c,r,a,d,e,可是……用什么样的办法才能同时安下两次t和三次i呢?”
“倒~”老鸟无言以对。
《3》cs搞笑篇
一日,沙丘二的小巷中,土匪聚在一起摆谈……
文化贼说:“我那天运气奇差,我那天刚冲出A门,就被一群CT的手雷给挂了!”
花裤贼说:“你这算什么,我那天阴到了一个CT,刚要阴的时候,却不小心给摔死了!”
男人贼说:“哎呀,我的苦才是一言难尽啊.那天我刚出来,就被CT的狙击给爆了头!”
新来的贼说:“我那天看大家匆匆离去,但是谁掉了一个闪着红光的小盒子,我等没了人的时候就去拣……”