(转)为什么你写不好一个快速排序? 谈程序员的职业发展
原文链接 https://lingxiankong.github.io/2014-09-22-programmer-career.html
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。
本文转载自:http://blogread.cn/it/article/6367?f=wb
我常常在想,当初我若不离开完美,现在肯定也是总监级的title了,收入比现在高一倍不止。但是另一方面,在编码能力上我甚至不如某些刚毕业的本科生。比如,快速排序的算法我很熟悉,就一句话:“随机选一个元素,用它把输入集分成两半,对这两半继续递归,然后将递归得到(已排好序)的结果合并”。但几个月前看算法书的时候自己尝试写了一下快速排序,发现远远是另外一回事。虽然我对这个算法很清楚,但是用C++实现的时候充满了疑惑,写出来的代码BUG很多,调了很久才调对。相反,如果拿这个做面试题去面应届生,我相信对北大清华的学生通过率应该很高,至少过半。那么我比他们多了6-7年的工作经验,这些经验又是什么呢?
工作经验是人生最容易积攒的财富,只增不减。钱和不动资产,差不多也是如此。所以要想向年轻人炫耀成功项目,牛B的经历,是很容易的事情。在一个很好的平台上,与聪明的人共事,顺水推舟,再加上运气不是太差的话,工作3-5年后,必然会有一个值得吹嘘的项目。比如我就老喜欢说我第一次做游戏就带着人做了梦诛,在线多少万多少万,等等。
但是呢,对一个程序员来说,最核心的价值是什么?是快速的把想法,变成无bug的正确代码的能力。像前面提到的快速排序,如果需求已经很明确,怎么实现已经很清楚,语言你自己选,工具你随便挑。20分钟内代码写不出来,写不对,那就是自己的问题,水平差。
我之前走了一条弯路,听信软件工程的人说,不要重复造轮子。于是就忽视了这些基础训练。“不要重复造轮子“这句话在公司里是对的,但是在下班后,或是在学校,在自己写代码练手的时候,就绝对是错的。重写那些经典的算法,是绝佳的思维练习。写二分查找的时候,需要根据区间的长度是奇数还是偶数,判断结果是大于还是小于,分成2x2=4种情况考虑,然后再想怎么缩减重复代码。写快速排序的时候,除了实现基本功能外,若是能考虑下比较时发生的相等的情况如何处理,又能把执行效率提升不少。
看你想要什么。若是想挣更多的钱,谋求更高的职位(无论技术岗还是管理岗),那么这些都和上述无关。在我现在的公司,每个程序员唯一的出路就是当架构师。这和你能不能写好快速排序没有关系,能看懂牛人写的代码,偶尔做做bug fix或者加个小模块就wonderful了!这就是我牢骚的关键点,随着地位、荣誉、薪水的提升,却逐渐忘却了作为一个程序员,最最基本、最最重要的技能是什么。医生可不像我们这样。即便那医生已经50-60岁了,即便已经是科主任了,依然要做手术主刀。一个手术一不留神做败了,半生积攒的声誉尽毁。
于是我最近常在反复问自己,通过6年全职工作,我的编码能力有了多少提升?除了更喜欢用大括号把local variable局限在block level,除了更喜欢一心编码时被别人或自己打断,有什么显著、可量化的提升吗?若没有,为什么没有?
我的职业梦想是,当我说自己是一个程序员的时候,熟悉我的人愿用excellent这个词来形容我。我在傲剑上班时,老板总喜欢说,你们要用自己的实际能力,去赢得同行的尊重。所以我要是下班后多花点时间去coding,总会达成我的愿望吧!