说来惭愧,作为一名已经工作了四年的程序员,我并没有做过多少编程题目:在 2014 年准备面试的过程中,在 LeetCode 做了 100 多道题目,笔试 Google 在 CodeJam 上做过个位数的题目,工作期间偶尔为面试准备几道题目。究其原因,一方面是自己懒惰,工作上的事情常常是焦头烂额,忙不过来,偶尔休息,就想放松一下,做点远离电脑屏幕的事情;另一方面,编程题目总是给我一种在健身房锻炼的感觉,偶尔锻炼可以保持头脑清醒,健康地工作生活,而天天健身,把大把时间奉献给健身,把健身作为一个事业来追求,至少是现阶段,这并不是我所想要的。
尽管做得不多,通过练习这些题目,我学到了很多在书本上浅尝则止的知识,锻炼了自己把想法转化为代码的能力。没有这些题目的训练和相关数据结构的学习,我大概也不会这么自信地觉得,很多软件的功能我自己也能实现,只是一个时间问题。认识和实践,知道一件事情和可以从无到有实现一个算法,是完全不同的两件事情。认识往往是笼统和粗浅的,而实践则是细致和完整的,细节缺一不可。譬如说,我知道音乐编曲就是拖拖拽拽几个轨道,调调这个参数,改改那个参数,但是你让我去做,我又什么都不知道。又譬如,我知道画画就是用笔和颜料,但是你让我真去画人,我又什么都不知道,不知道人的骨骼是什么样子,不知道人的肌肉在某个运动状态会是什么样子。回到编程题目上来,我很佩服和羡慕有体力和脑力实践大量题目的人,他们一定在这过程之中总结出了很多解题的规律,掌握了很多宝贵的方法。这些方法尽管不大可能立刻就能应用,但是保不齐哪天,那个关键时刻,就能派上用场。即便是不能用来解决完全一样的问题,很多方法都是相通的,一旦遇到实际问题,也提高了举一反三,触类旁通的可能。
软件实践就像是砍柴,练习编程题目就像是磨刀。砍柴归砍柴,刀钝了还是要磨,正所谓砍柴不误磨刀工。此外,脑子里有一些一时想不出的题目,也是对自己的一个提醒:小子,你别太嚣张,这种题目你都想不出,你怕不是太菜,你不知道的事情还多得很,万万不可坐井观天。
PS:
编程题目网站:
- Project Euler
- LeetCode
- Google’s Coding Competitions
- 一些国内高校的 Online Judege 网站就不在这里一一列举了
- EOF -