ZZ送给参加ACM同学的忠告 (很喜欢最后一段文字)


发信人: Toney (时间,我需要时间), 信区: ACM_ICPC 
标 题: 送给参加ACM同学的忠告 
发信站: 北邮真情流露 (Fri Mar 17 16:19:47 2006), 站内 


送给参加ACM同学的忠告 

最近一两年内,北邮的ACM已经发展了很多了,确实有不少同学为此做了很大贡献,比如建立起了JudgeOnline,写解题报告等等,相当赞。也有相当一部分同学正在努力学习来提高自己的水平。 
ACM是一种考验你思维能力的竞赛,在学习算法的同时,可以扩大你面对问题时的考虑角度,确实是一种不错的思维训练。但是我下面要说的是,ACM对你的编 程能力到底有哪些负面影响,这篇文章确切的讲应该不叫“忠告”而叫“警告”。而这些都是我曾经经历过和现在体验到的,希望能对大家有所帮助。 

1。ACM让你养成一种不喜欢测试的习惯。自己好容易写好了一道题,输入了SAMPLE,结果正确,于是就很兴奋,马上将代码提交,其他的测试就让机器去 做吧,反正JUDGE会告诉我答案是否正确的。这种思维方式对于ACM竞赛来说很重要,因为时间很宝贵,没有那么多时间去测试,也许侥幸通过了不是更好? 但是公司里的代码是不允许这样的,长时间养成的习惯会让你对枯燥的测试产生烦感。千万不要认为测试是测试部门的工作,你自己同样要做测试;如果你的代码被 测试组发现了BUG而被打回,是要影响考核成绩的,可不是罚分那么简单。 

2。ACM让你不习惯写注释。同样的道理,迫于时间紧张,ACM的代码中是基本没有注释的。但到了工作中,这些代码是要有其他人看,其他人来维护的,注释很少的代码不能算是好代码。 

3。ACM让你习惯写简洁的代码。过于简洁或者注重效率的代码在工作中不是那么受欢迎的,例如: 
while(cin>>num && num!=0) 
如果你多读关于C++的书籍,会发现里面有更加规范的写法。代码的风格是很重要的,不要总认为自己的代码风格很好,进了公司以后要习惯“入乡随俗”,尽量和别人的风格保持一致。 

4。ACM让你习惯于忽略错误处理。ACM的题目往往对数据条件限制的很严格,不会出现超出范围的数据;但如果你是作一个软件,就不得不考虑所有情况的错 误,否则就会有BUG,存在大量BUG的程序无论算法有多么精妙也只能被评为垃圾代码。我不得不承认,对所有可能出现的错误进行处理(throw Exception)是一件异常无聊的事情,它比你实现一个算法要枯燥多了,但这就是你要做的事情,真正开发软件时,算法只占极其少的部分。 

5。ACM让你忘记C++语言的基本用法。但凡参加ACM的同学,必然会使用语言中自己最擅长的部分进行编码,这样对学习新语法很不利。但你又已经使用C ++写过上百个程序,于是你自然认为自己已经精通C++了。但实际上呢?你对模板的了解有多少?你对类的构造和继承的特性又了解多少? 
提个简单的问题吧,析构函数能否为虚函数?你是否经常看到 vitual ~myClass(); 这样的代码?如果连构造函数和析构函数都不了解,你能说自己精通C++么? 
如果你真的想提高自己的C++水平,去网上找找BOOST代码吧(我不推荐看SDK,因为目前最流行的是BOOST),看看里面的C++代码都是怎么写的。你会发现ACM的代码和BOOST怎么看都不像近亲,虽然语法没区别但模样相去甚远。 


其实在上面提出的所有质问,都是我自己问过自己的,因为我发现这些问题确实值得思考。 
我一直在强调,ACM不是编程,只不过是算法而已。参加ACM的同学不要对ACM过于崇拜,等到工作了以后你们才会明白,真正牛的是那些注重软件工程、软 件管理,以及能写出高质量代码的人;而这些恰恰和ACM的初衷相反,所以等你们以后走上社会,发现自己并不能被老板看好时,多做些思考而不是埋怨。 
我写这些并没有他意,不想打击对ACM感兴趣的同学。只是希望你们不要浮躁,不要认为自己参加了ACM就成了牛人,多认识自己的不足之处。其实我进入公司之后才发现,真正让你成为牛人的不是你的智商,而是认真严谨的工作态度。

你可能感兴趣的:(『ACM』)