编程能力主要是算法吗?

首先算法很重要这是毋庸置疑的。但是我的疑问是,现在好多程序设计比赛或是编程能力测试主要的都是考得不同难度的算法,所以编程能力等于算法能力么?
关注者
686
被浏览
87,275
问题相关:本科玩过ACM竞赛,毕业之后做了开发,见过很厉害的开发也见过很厉害的算法,算是有一点点眼界,厚着脸皮来达下这个问题。

以下回答纯属个人理解,不喜勿喷,说答主是菜鸡也没关系。

我讲下我自己的故事吧,我尽量说生动一点,希望能够帮到你。

我从大一开始就一直玩ACM,由于分心比较多,训练也不算最刻苦的,所以在学校里实力也就还行。因为一直没放弃,多少有点积累,也算是拿了一点小奖。

凭着曾经ACM拿过的奖和一点点的运气,在15年的时候拿到了阿里算法岗的实习。直到我拿到实习offer之后,我才发现,原来算法岗的实习要求和我理解的会的并不一样。做过的人都知道,ACM比赛涉及到的其实是性能算法。在规定的时限和空间内计算出要求的结果。并且这个结果是固定的。

而现在市面上大多数的算法岗位,所涉及到的都是智能算法。也即是所谓的大数据算法,这个词逼格比较高,所以大家都爱用。这类算法的特点呢,是基于海量的数据进行统计或者预测。就我个人的理解而言,更偏向于统计。这类问题一般来说没有最优解,只有近似解,通过优化模型和方法,可以获得更好的效果。

以上这些是我进了阿里之后,发现自己什么也不会慢慢学习领悟到的。在我实习期间我做的事情,基本上都基于阿里的odps大数据平台。利用平台本身的高并行性计算能力,对于淘系内海量的数据进行筛选和处理。说得low一点,其实就是写类SQL语句,嵌套Python写的机器学习算法脚本进行数据处理。最后根据结果,修正参数,达到更好的效果。

原本我感觉实习期间的表现都还不错,虽然机器学习方面的领悟还不够,但是自己学得还是挺快的,而且搞过ACM,脑子好使,以后慢慢总能上道的。然而,不知道是我运气好还是运气差,我遇到了十年一遇的“拥抱变化”。我成了两千多人中另寻下家的实习生中的一员,为了不至于饿死,在我投简历的时候我遇到了一个问题。

究竟是做开发还是做算法?

比较逗的是,当时自己心智还不全,这种二选一的问题实在是纠结。在阿里待得久了,写完SQL跑很久的日子真的是有些倦了。感觉对这样的日子不太喜欢,太浪费时间。但是机器学习也学了,而且说实话开发那些除了Java会一点之外几乎一窍不通。最后犹豫了很久,决定两者都试一下,拿到哪个offer就干哪个。当时觉得自己实在是太机智了。

开发我投的是现在的公司,算法岗是当时的HRG内推的创业公司。(我当时的HRG还是挺好的,阿里的hr也不像知乎里说得这么夸张。虽然我不记得她的花名了,不过还是很感谢她当时愿意帮我

然而,不幸的是,这两家我都拿到了offer……

经过了仔细思量和权衡,最终选择了蘑菇街,具体的心路历程在我的另一篇答案里有写。蘑菇街,网易,阿里校招offer选择? - 小狼MOUT 的回答 - 知乎

其实还是有点小后悔,自己本科搞了四年的算法说放弃就放弃了,选了一条之前不太喜欢也不太擅长的路。

在我实习的时候,这种情绪来得尤为厉害。为什么呢?因为感觉做的事情和我预期的完全不一样。身边的都是一群不懂算法的人,写的也是之前不太喜欢的Java语言。我不知道怎么样形容,也不是说觉得同事low,只是有一点点落空。

特别是当时带我的师兄打开了debugger,单步跟踪查错的时候。我用诧异的眼神看了他一眼,因为在ACM玩家眼里,debug应该都是用肉眼完成的。之前因为受到一些学长的引导,觉得开发要简单很多,应该很快就能胜任,加上acmer的手速都比较快,所以当时的心态是比较激进的。

当然,没过多久,我也用上了debugger。开发和算法不同,程序崩溃的原因实在是太多了,代码有问题只是其中很小的一部分。很多错不用debug根本无法排查。

然而当我毕业完了之后再次回到公司,现实立刻给了我一个下马威。师兄太忙了,被调去了其他事情,之前巨大的项目丢给了我。我不仅要负责所有的需求,并且所有的问题也要一并承担,从排查到修复,只能我一个人搞定。

SSM框架、公司的各种框架、网络架构、tomcat、maven这些我都几乎一无所知,甚至连git也不是那么熟练,更别说JVM那些比较高端的了。我感觉我之前搞ACM积累下来的代码能力完全成了空白,当时一度是比较低落甚至是有些悲观的。

然后呢,然后我是怎么克制的呢?
不得不说,我遇到了一个很好的leader。他会给我们分享很多很多的技能,从他擅长的排查故障到JVM、多线程和一些框架等等。他分享完会让我们做些总结,我比较听话,每次都会总结。

到了这个时候,我才发现,其实开发要学的东西并不比算法少。原本这就是两个领域,架构、设计模式、面向容器或者是环境的调优等等,深挖起来可以挖的东西实在是太多。很多技术实力很深的人并不懂什么算法,甚至连排序都写不出来,但这并不意味着可以否定他的编程技能。

举个简单的例子,这例子是我主管跟我讲的。比如同一个需求,他实现和我实现同样都是实现。然后会有什么不同呢?我来实现,虽然都实现了,但是所有的东西都是写死的。以后有类似的需求进来,还需要另外搞一套。如果是他写,虽然花的时间差不多,但是就会做成可配置的,以后只需要改改配置,就能在其他的地方复用。这些还只是一个方面,还有稳定性、代码复用率等等讲究。

言归正传,继续讲故事。当时受到主管的影响吧,自己遇到问题的时候也会多思考,这种问题出现的原因是什么,解决的原理和方法是什么,而不是简单地把问题干掉。其实开发的套路相对比较固定,问题的种类也就大概那么一些。多踩个几次坑,也就慢慢有经验了。

在我努力学习技术的这段时间我发现了一个事情,就是同样的东西我理解起来总要比别人快上一些。就比如我们公司无线端框架的源码,没有人给我讲过里面的构造,就通过文档和啃代码,我能理出其中的设计模式。再比如业务需要用到状态机,我大概在网上看个概念,就结合自己的业务进行实现。

不仅仅是后端这些,在我学前端ES和react甚至iOS开发的时候,也经常会有这种感觉。就有一种这东西原理好像在哪里见过,一点就透的感觉。

为了这件事情我还奇怪了很久,直到后来和朋友的一次谈话提醒了我。有过一个算法岗的朋友,机器学习很牛的人。一直声称自己不会写代码,以前我完全不信,能把机器学习玩这么溜跟我说不会写代码?不是搞笑么?

直到后来我自己学了机器学习之后有一次帮一个线上猎头公司面了几个算法岗的实习生,看着他们简历里少得可怜的开发项目,以及随便问几个简单的思维问题都想不出一个很好的答案。不就像我当时实习的时候,面对一大堆开发问题一筹莫展的样子么?

恍然大悟,原来朋友所言非虚。这才发现之前陷入了一个误区,之前一直有一招先吃遍天的想法,认为算法厉害到一定程度,编程肯定也厉害。

那时才一下子明白过来:算法能力从来就不等于编程能力,编程能力是一个比较空泛的概念,里面涵盖的东西太多,和方方面面都有交集。甚至有些研究统计和数学的教授虽然不懂代码也可以看做是半个程序猿,毕竟他们对程序需要的逻辑和所需的技能掌握到了非常高深的地步。翻下语法书就能上手写代码,你能说他们没有编程能力么?

所以问题编程能力的主要是不是算法本身就是一个伪命题,单单什么是编程能力就可以说上半天,都不一定有人能够说得清楚。而且一个集合大到了一定程度,很难分清到底什么是主什么是次。

那么你可能又要问了,为什么算法不是编程能力的主要部分,各个公司还那么看重呢?
这个问题就要简单很多了,原因也比较多。

首先,开发能力不是很好衡量。单单从面试问几个问题,或者看一看你做过的项目并不能很快并且精准地衡量出一个人的开发水平。我可能之前在的项目组接的项目比较水,但是我的架构写得特别清晰,代码质量很高。但是你只看简历说不定就会觉得这个项目没啥技术含量。但是算法就不同了,一些复杂的算法理解起来就很有难度。你能理解并且掌握,本身就已经说明了实力。更不用说ACM之类的算法还能拿来比赛,你什么实力,和其他人比一比就知道了。(微软、谷歌等公司都是这么干的,而且都有自己举办的比赛)

其次,虽然不能说算法是编程能力的主体,但是它真的对人锻炼作用比较大。有点像是武侠小说里的内功,同样的三年时间,你学三年剑法就可以当街杀人。我练三年内功啥也不是,但是,假如再给三年时间,我们再练三年,结果说不定就完全不一样了。例子可能不是特别恰当,但是大概这么个意思。

一些算法对于解决业务和架构问题非常有借鉴意义,学过算法的人上手什么的都要比没有学过的人快很多,这也就是为什么我感觉当时学那些都比较快。

对于企业来说,算法比较容易通过比赛等途径衡量,并且也客观反映了一个人在编程上的潜力。而且做过ACM的人一般都在程序的性能上比较有追求,比如尽可能地减少内存开销降低复杂度等等。像是谷歌这样的公司将算法当做敲门砖,可能也有看重这些的原因吧。