【转】真正的Acmer

时间:2022-11-18 06:33:37

上海交大 戴文渊 大牛写的东西,建议大家看看 yiyiyi4321 2007-07-10 13:49:30.0 
http://dwyak.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&_c=BlogPart&partqs=cat%3d%25e7%25ab%259e%25e8%25b5%259b 
up yiyiyi4321 2007-08-27 18:46:01.0

TEAM对我意味着什么 ceshi 2008-04-16 22:25:16.0

这个世界是假的,而TEAM是真的。
什么是“假”?活在这个世界上,要说很多违心的话,做很多违心的事。为了自己或者小集体的利益,有的时候要说谎,有的时候要装傻,甚至要恭敬地面对一些无耻小人。长久下去,你会忘记什么才是真的,会认为一些不道德的事是理所当然的,因为它们普遍地存在于这个世界上。
TEAM是一个避风港。更确切说,是交大ACM队这样一个最优秀的TEAM。只有这样的TEAM,才能提供一个“真”的环境。

我没有足够的博爱精神,不可能真诚地对待所有人。让我真诚面对那些我讨厌的人,Mission Impossible。但是,把范围缩小一下,变成一个三五人或者十来人的TEAM,我还是能够做到真诚的,只要这个TEAM足够优秀。
在队里,并不意味着我一句谎话都不说。不过,我做任何一件事,不管方式是好是坏,出发点总是好的,最终都是为了让这个队变得更强。
记得hehe曾经说过,队友对你的好,也许只有你的男朋友可以做到。的确,如果不是同在一个TEAM中,你不可能什么事都设身处地的为别人着想;不可能为别人做这么多事;更不可能花费很大的代价,最终只是为了别人的提高。
一个优秀的TEAM,可以给人一种回家的感觉。虽然你在队里可能要做很多对自己没有太多实际利益的事情,但是这个队可以给你极大的心灵慰藉。她时刻告诉你,什么才是对的,什么才是美好的。这是一种心理的需求。

可是,交大ACM队不是长久的地方,我的下一个TEAM在哪里呢? 
用脑子比赛 ceshi 2008-04-16 22:25:49.0 
可能有人会说ICPC是一个脑力的竞赛,当然是用脑子去比的。其实不然,绝大多数的队伍都不懂得用脑子去比赛。果真是这样的吗?恩,至少我是这么认为的。

谈起这个话题,不禁让我回忆起自己大一时的事情。
2002年10月29日,那时我所在的队伍刚刚在北京赛区失利,紧接着又要去韩国赛区。29日是我们走之前的一天晚上,lincx把我们叫到徐汇校区,和我们一起总结北京赛区的比赛。
北京赛区是一场难以形容的比赛。表面上看起来,我们队几乎没有犯任何错误,但结果是我们输掉了比赛。
我记得,总结的时候,lincx并不直接指出我们队哪里有问题,而是从自己的角度向我们介绍,如果他们队来做这套题,会怎么做。
在lincx这支队里,队友读了题,都必须告诉他——lincx总是知道所有已经读出来的题目,从而很清楚地了解场上的情况。lincx形容自己要做的事,就是对所有已知的题目不断地“排序”,取出最简单的题目去做。
我想,“排序”这个词可能未必非常恰当,但是很形象。它描述了一个队长在场上需要做的事情:队长就是要时刻了解场上的最新情况,通过思考,作出正确的判断,决定本队的走势。“排序”是一种最简单的分题策略,也就是先做简单题,后做难题。当然,对高水平的队伍来说,分题的顺序是很有讲究的,并不仅仅是“排序”这么简单。

至此,我终于明白一支队应该如何去比赛了。
队长就是一支队伍的大脑。队长的脑子必须运转起来。如果队长在场上不冷静,不能够审时度势,作出正确的判断,那么这支队伍就不可能用脑子去比赛。
同时,我也明白了,我们在北京赛区不是没犯错,而是步步皆错。对一支没有章法的队来说,决策本身已经错了,即便执行得还可以,也不能改变错误的本质。

我想,正是这个时候,我开始真正懂ICPC了,也开始具备了当一个队长的基本素质。因为,我知道了队长在队中的作用。

插句题外话,那天晚上lincx对我说的另外一句话,影响了后来我对Comars的使用。他说,他觉得我在机器上的时候非常令他放心,但是一旦坐在机器下面,他就不知道我在干什么了。而北京赛区的比赛,我在开赛45分钟左右对了第二题以后,就一直做在机器下面……
所谓资源优化配置,就是用人要用其长,避其短。如果像lincx所说的,我坐在机器上敲代码比较令人放心,那么就应该尽可能多地让我去敲代码。队里最怕的是:1. 大家抢着敲,以为谁敲得多,谁就是英雄;2. 搞平均主义,每人敲三道。
我发现,我作的很多决策都是受了别人的影响。lincx自然是最多的,yini也不少,还有hehe(以后有机会可以再说一些 :D)。优秀的队长身上总是有很多东西可以借鉴。

还是回到正题。
这个赛季,作为教练,我经常有机会看各队队长的总结。其实,我最喜欢在总结里看到这样的话,“n小时的时候,我们对了x道题,并且有y道题可以做。场上的局势是……我们准备……”我自己写总结的时候也比较喜欢写这样的句式。如果一个队长能够说出这样的话,那说明这个队长在动脑子——判断场上的局势,根据自己的情况,制定下一步的计划。特别是对于那些要敲题的队长,更需要做这样的事。因为队长敲题意味着暂时放弃对局面的控制,所以必须在上机之前做好总结工作,安排好后面至少半小时的计划。

人们可能会比较自然地去关注一些出彩的地方,比如说某人一场比赛做了七八道题,或者最后几分钟对了一道题(特别是又拿到冠军的),并称之为英雄。我觉得,光做到这点,充其量叫做野人(比常人力气大一点)。要成为英雄,还必须用脑子。我认为,英雄善于以用自己的智慧和实力。面对实力弱于自己的对手时,要将对手玩弄于股掌之间,不给别人任何机会;面对实力相当或高于自己的对手时,要懂得迂回前进,争取最大的取胜希望。或者,借用yini的话,就是do more with less。
所以,当主持人说出,全场的队伍都受到某人的误导时,我深为不能赞同。因为,这不是应该强调的地方。如果这都值得强调的话,那么只能说明这支队不是一支用脑子去比赛的队。而一支不动脑子的队,在面对真正的强队时,一定是不堪一击的。 
原则 ceshi 2008-04-16 22:28:10.0 
做人有做人的原则,做事有做事的原则。同样的道理,作为一支队,也应该有它的原则。

什么才是一支队的原则呢?举个例子吧,在Spirit队中,有一条原则是,Comars是核心。任何与这条原则相背的事必须让路。比方说,我和Tiaral抢Comars的题就是不允许,因为与原则相背。我和Tiaral必须想尽一切办法让Comars能够集中精力做更多的题。
也许有人会觉得这条原则似乎不那么有道理。的确,我也不能证明它一定最有道理的。但是,这是根据我对Comars的了解,经过长时间思考作出的决定。我觉得,它在绝大多数情况下还是正确的,并且也征得了队友的同意。

一支队有了原则以后,会带来什么样的变化呢?有原则的队,有很强的凝聚力。因为,一旦意见出现分歧,就可以搬出原则来,与原则相背的一律否决;与原则不相背的,一定不会很重要,大家都不会太在意。这样的队,可以做到意见高度统一,从而使战斗力得到充分发挥。

那么,是否有可能因为制定了原则而否定一些更好的决策呢?是有可能的。但是,我一直相信,比决策优劣影响更大的是意见的统一。一个决策,哪怕不是那么优秀,如果大家齐心合力去做,同样能有很强的战斗力。反之,决策很好,但是大家不齐心,只可能是一盘散沙。

在队里,我非常喜欢去树立一个核心,因为核心是最好的原则。 
Cappuccino ceshi 2008-04-16 22:28:46.0 
最近我一直在想,这四年来究竟有哪些队是可以作为借鉴的。想来想去,大概有三支吧——Team W、Cappuccino和Princeps。
为什么是这三支队呢?他们不能算作真正的强队,他们的战术思路与交大传统的强队模式也不太一样。但是,作为一支队来讲,他们做得同样相当出色。
今天就先谈谈Cappuccino吧。Team W和Princeps我想放到以后一起讲(写到一半写不下去了,就先存在草稿箱里吧 :D)。

Cappuccino是2004年北京赛区的冠军。但是,他们的价值,却一直到了去年北京赛区结束,我才真正意识到。实际上,2005年的Eccentric和2004年的Cappuccino相比,唯一区别就是用Azazel换掉了Ivan。按理说,Azazel的技术实力远高于Ivan。但是,真正到了比赛场上,我们发现,没有Ivan就是不行。

Ivan,借用abcsea的一句话来说,他思考过很多问题,人际交往能力爆强。我至今还记得他参加面试时说的一句话。他说,他来参加这个比赛,是“把交大的ACM当作一项伟大的事业去支持”。我觉得,就这句话,决定了他一定是个优秀的队长。
我也面试过别人。一个晚上,十几个人,每个人都是千篇一律的“对自我的提高”,会让你听得昏昏欲睡。Ivan,他能看出比别人更本质的问题,说出比别人更本质的话。(说到这里,也就可以解释,为什么Ivan人际交往能力爆强了)
正因为Ivan能看到更本质的东西,作为一个队长, 他比别人更能看清他们队需要什么,从而做出更准确的决策。另外,超强的人际交往能力,也有利于他使用好他的两个队友。

说了这么多Ivan,有点冷落Ivan的两位队友dysentery和cobra了。其实,Ivan能成功地组建起Cappuccino这样一支队,与dysentery和cobra出色的能力是分不开的。
dysentery最大的特点就是有很强的责任心。举个例子吧,在队里的两年时间里,大半的饮用水都是他搬的(当然,和他长得比较高大也有关系)。一个做事认真负责的人应该怎样去使用呢?我想,对Ivan来说,小事一桩啦。
cobra是个有思想的人,悟性很高。lincx每次和大家聊天,别人都被lincx一个又一个生动的故事吸引。只有cobra,全神贯注地听,他要听的是lincx说这个故事的意图。善于思考的人,往往善于控制自己;善于控制自己的人,往往有比较好的心理素质。cobra就是一个心理素质极好的人。前年的北京赛区,最后10分钟,顶着巨大压力改出Cappuccino第5道题、从而奠定胜局的人正是cobra。我想,换一个人,在当时的场景下,很可能早就奔溃了。

Cappuccino和Eccentric这两支队,无法让我不去比较,因为这两支队相差的只有一个人。从技术角度来看,不消说,Eccentric远高于Cappuccino。不用说Azazel强于Ivan了,就是dysentery和cobra,经过一年的训练,也比他们第一年比赛时强了许多。但是,为什么给人的感觉却是Cappuccino更好呢?
我喜欢将实力分为技术实力和非技术实力。Azazel强于Ivan的,是技术实力。而Ivan给队里带来的更多是非技术实力。
参加过比赛的人一定会有这样的体会,有的时候你觉得可以做六七道题的比赛,最终可能只做出三四道。也就是说,你的技术实力只发挥出了一半。非技术实力(包括思考问题的深度、准确度,关键时刻的冷静程度等)就是用来发挥另一半技术实力的。
Ivan的眼神、动作,他说出的话,更重要的是他作出的决策,为Cappuccino营造了一个良好的氛围。所以,有Ivan在,Cappuccino队员的能力总是能够得到充分的发挥,从而变相提高了技术实力。

Cappuccino的成功告诉我们一个道理:在你贪婪地提高着技术实力的同时,千万不要忽视了非技术实力的培养。

后记:写活着人真的很难。特别是Ivan,更难写,因为猜不透。写得不对的地方还请批评指正 ^_^ 
代码能力 ceshi 2008-04-16 22:32:29.0 
在ICPC比赛中,个人能力方面,如果粗略地分的话,大致可以分为算法能力、代码能力和查错能力。那些大学才开始参加比赛的选手,写代码的基本功一般会比较扎实,主要瓶颈应该是算法能力。而对于OI转ICPC的选手来说,代码能力往往是最大的缺陷。随着OI转ICPC的选手逐渐增多,代码能力的问题愈发暴露了出来。

一、如何定义代码能力

Comars曾经给代码能力作过一个比较准确的定义。2004年暑假时,Comars曾经说过:他认为150行以内的题目,他的1Y率非常高,并且保持稳定;而当代码长度超过150行以后,1Y率就开始急速下降了。如果我们画出一条1Y率的曲线的话,150行就是一个转折点。我们不妨认为,150行就是Comars当时的代码能力。一年以后,经过努力,Comars把代码能力提高到了250行。不过,这已经是后话了。

二、如何提高代码能力

我一直觉得写程序和写文章是一个对很好的类比。

写文章需要先从宏观入手,构思文章的结构。写程序同样需要。一个好的结构,就是一个好的开始。一个好的开始,是成功的一半。
一篇好的文章需要各种句式和词藻的合理组合。体现到写程序上来,就是一些单句以及三五行的小结构的熟练使用。这些都是需要平时总结和积累的。

但凡文章写得好的人,一定看过很多别人写的文章。同样的道理,多看别人的程序,用心地去看,也可以提高自己的代码能力。
我鼓励队员去看别人写的程序,特别是像Comars这样的选手写的程序。从优秀的程序中,我们可以体会别人良好的程序结构,同时也可以学到很多写程序的技巧——三五行的小技巧。在和Comars做队友的两年时间里,我通过看Comars的程序,学会了很多小技巧。逐渐地,我觉得我写的某些程序已经和Comars有点相像了。
那么,如果身边没有Comars这样优秀的选手可以借鉴,该怎么办呢?其实没关系。任何一个程序都是可以看的。一个程序,就算写得再差,总还会有一两个闪光点,要想办法把它们找出来。另外,程序里写得不好的地方,也要一一找出来。
读程序,从某种角度来看,就像读史。好的历史是用来借鉴的;不好的历史则应该引以为戒。读程序也是一样,择其善者而从之,其不善者而改之。

三、谨慎地对待STL和SCL

STL - Standard Template Library。在ICPC的选手中,STL是相当受欢迎的。的确,如果STL用得好,程序可以精简很多。既提高了编程的速度,也提高了编程的准确性。
SCL - Standard Code Library,就是标准程序库。对很多选手来说,SCL可是命根子啊 :)

我觉得STL和SCL都不是坏东西,但是需要谨慎地使用。

我向来不主张队员一进队就开始用STL(虽然这种现象普遍存在 :()。我认为,STL的作用是锦上添花,而不是雪中送炭。比方说,一个heap写得很熟练的队员,我觉得他可以偷偷懒,用一下STL。但是,那些不太会写heap的队员,就不应该用STL里的heap。因为,他们真正应该做的是掌握写heap的能力——这才是最本质的代码能力。
学会用STL是件很爽的事情。但是须知有所得必有所失。如果过早地接触STL,会让你失去很多锻炼代码能力的机会。

至于SCL,我的主张是尽量不用。
不可否认,队里确实有一些人SCL用得很好。但是,我至今仍然没有见过一个SCL用得很好,同时有拥有很强的代码能力的人。同样是有所得必有所失,你平时习惯了去抄程序,必然少了很多自己构思程序的机会,从而影响代码能力的提高。
当然,我也不是完全反对去使用SCL,偶尔用一下也是可以的,例如在比赛中。但是,需要注意的是,一定要用自己整理的SCL。我见过有人拿着一本别人整理的SCL,虽然内容很齐整,但是我没见他用对过。因为这本SCL不是他整理的,他自己都不知道每个程序在使用的时候应该注意些什么,于是一用就错。

后记:其实代码能力这个话题让Comars来讲可能更适合一点,因为他更有心得。不过他现在忙于杀鸡 :) 
FAQ ceshi 2008-04-16 22:33:17.0 
整理了13个以前遇到的问题,如果想起什么新的问题的话,再慢慢更新。
(注: 这其中有很多问题和回答都是从别人那里记下来,或者根本就是别人整理的)

1. 就快要比赛了,我们队还存在很多问题,怎么办?

正视你们的优势和劣势,承认它们的存在。
借用yini的话,比赛就是一个“do more with less”的过程。你要清楚自己的more和less。无论自己是more还是less,我们就是要去do more。

2. 比赛前应该想什么?

有人说,比赛前应该完全不想比赛的事情,放松自己的心情。我觉得这并不是很妥当。
在我看来,比赛前就应该去想比赛本身,把全部精力放在比赛上。可是,这难道不会影响心态吗?我认为不会。所有影响比赛心态的事都不属于比赛本身,例如排名、胜负,都是比赛以外的事。

3. 比赛中,领先了怎么办?落后了怎么办?和对手咬得很紧怎么办?出现问题怎么办?

比赛中有很多种状态,领先、落后、平分秋色、稳定、混乱……但是,归根结底,这都是一些状态。
对于自己所处的状态,我们要以局外人的眼光来看待,这样才能作出理性的判断。
作为局内人,我们需要知道,已经发生的事不可改变,我们可以做的就是在剩下的时间中do more。
注意,do more不等于“拼命”,还是要理性地去分析自己究竟还能做多好。

4. 自己或者队友实力太弱,怎么办?

很多人都会钦佩实力强的人,鄙视实力弱的人。但是,最起码在一支队里,这样的事情不应该发生。
我们要清楚每个队员的强弱,用纯理性的眼光去看待这些问题。你可以为一个队员的不足而着急,但是决不可以为此而埋怨他/她(或许完全做到这一点是不可能的)。
实际上,无论是谁,放在队里一定是有用的。再不济,读题的事情总可以做,还可以模拟sample、出一些测试数据……不要认为这些事情是低级的。它们和想算法、敲题一样,都是对队里的贡献。你可以想想,有谁可以跳过读题,直接去想算法、敲程序的?

5. 如何面对自己的队友?

如果可以把一支队看成一个整体的话,那么为什么不把它比作一个人呢?这样一来,每个队员就相当于身体的一部分。似乎没有哪个人的左右手是会分彼此的。如果这样去想(注意,是要这样去想,而不是仅仅懂得这个道理),我觉得你已经不需要再讨论这个问题了。

6. 对手太强了,怎么办?

如果你完全不是他们的对手,那为什么又要称他们为“对手”呢?
前面也提到了,比赛就是一个“do more with less”的过程。即便你们是全场最差的队,即便你们根本没有实力去争取哪怕是一个倒数第二的名次,你们同样可以do more。
可能你99%会输掉这场比赛,但是请你正视这个概率,勇敢地去面对可能到来的失败。