为什么你写不好一个快速排序? 谈程序员的职业发展

快速排序的算法我很熟悉,就一句话:"随机选一个元素,用它把输入集分成两半,对这两半继续递归,然后将递归得到(已排好序)的结果合并"。但几个月前看算法书的时候自己尝试写了一下快速排序,发现远远是另外一回事。虽然我对这个算法很清楚,但是用C++实现的时候充满了疑惑,写出来的代码BUG很多,调了很久才调对。相反,如果拿这个做面试题去面应届生,我相信对北大清华的学生通过率应该很高,至少过半。那么我比他们多了6-7年的工作经验,这些经验又是什么呢?

工作经验是人生最容易积攒的财富,只增不减。钱和不动资产,差不多也是如此。所以要想向年轻人炫耀成功项目,牛B的经历,是很容易的事情。在一个很好的平台上,与聪明的人共事,顺水推舟,再加上运气不是太差的话,工作3-5年后,必然会有一个值得吹嘘的项目。

但是呢,对一个程序员来说,最核心的价值是什么?是快速的把想法,变成无bug的正确代码的能力。像前面提到的快速排序,如果需求已经很明确,怎么实现已经很清楚,语言你自己选,工具你随便挑。20分钟内代码写不出来,写不对,那就自己的问题,水平差。

我之前走了一条弯路,听信软件工程的人说,不要重复造轮子。于是就忽视了这些基础训练。"不要重复造轮子"这句话在公司里是对的,但是在下班后,或是在学校,在自己写代码练手的时候,就绝对是错的。重写那些经典的算法,是绝佳的思维练习。写二分查找的时候,需要根据区间的长度是奇数还是偶数,判断结果是大于还是小于,分成2x2=4种情况考虑,然后再想怎么缩减重复代码。写快速排序的时候,除了实现基本功能外,若是能考虑下比较时发生的相等的情况如何处理,又能把执行效率提升不少。

看你想要什么。若是想挣更多的钱,谋求更高的职位(无论技术岗还是管理岗),那么这些都和上述无关。在我现在的公司,每个程序员唯一的出路就是当架构师。这和你能不能写好快速排序没有关系,能看懂牛人写的代码,偶尔做做bug fix或者加个小模块就wonderful了!这就是我牢骚的关键点,随着地位、荣誉、薪水的提升,却逐渐忘却了作为一个程序员,最最基本、最最重要的技能是什么。医生可不像我们这样。即便那医生已经50-60岁了,即便已经是科主任了,依然要做手术主刀。一个手术一不留神做败了,半生积攒的声誉尽毁。

于是我最近常在反复问自己,通过6年全职工作,我的编码能力有了多少提升?除了更喜欢用大括号把local variable局限在block level,除了更喜欢一心编码时被别人或自己打断,有什么显著、可量化的提升吗?若没有,为什么没有?

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥