我发现一个非常奇怪的问题,用中文搜索一个确定描述的问题时,很多结果都是一模一样的答案。有时候一个答案的质量确实高,但是如果翻遍整个搜索结果,所有的网站都是复制粘贴,连一丁点自己的思考都没有,那这样做的意义是什么呢?
敲代码也好几年了,自己的水平是个什么层次,自己最清楚了。自从决定以后要走这条路,就不时的陷入一种焦虑之中。这个题目的知乎回答也看过好几遍,有所启发,但始终无法让自己满意。
搞算法和搞项目,这两者矛盾吗?在一个算法交流群里经常看到有人认为做项目是很简单的事情,只要把比赛打好,以后公司抢着发offer。作为一个谷粉,我也看到在校生如果要去Google做技术工作,首先要过的关就是kickstart,也是算法比赛。听到的见到的,也大多是拿了几块金牌然后去了FLAG。
编程说到底是在考察解决问题的能力。我认为,算法确实是本质而且核心的东西,但是他就像数学一样,是很多东西的基础。而解决实际问题是一个工程,要面对各种各样的要求和限制,只凭理想下的算法是远远不够的。拿推荐系统来说,我获取了用户浏览商品的数据,它们包含价格,各种分类标签,相关性,查看的顺序,停留的时间等等,现在设计一套算法,让它能从海量商品数据中选择出最符合客户心理预期的商品列表,然后推送给客户。从算法的角度讲,我们要考虑时间和空间上的复杂度,也仅仅需要考虑这个最核心的东西。但是如果是从头开始做一个APP,就要涉及到很多工程性的问题。这些数据用什么组件来展示,加载大量数据的时候如何放置卡顿,各种多媒体的缓存和播放......简而言之,要考虑一个产品如何打磨到让用户满意。
要解决的问题越深,服务的人群越多,两个方面都必须单独去深入考虑。最简单直接的例子,比如Android下一个IM应用,有一个发送语音的功能。这个东西说起来很简单,录制声音,压缩,发给服务器,服务器再发送给另一个客户端,然后解码,播放。是不是一晚上就能干完的事情?实际上,如果只是拿去参加个比赛,有大量的第三方SDK供你使用,很多功能几行就能写好。但如果是商业级别的产品呢,如果要给几十万人几百万人同时使用呢?好吧这里就说微信,它的语音流量耗费是同类产品中最低的,清晰程度又是最高的,为啥,因为有算法工程师专门研究了过滤杂音和压缩声音的算法,而且还申请了专利来保护。为啥使用起来那么流畅呢,因为有开发工程师不断地通过各种方式来提高用户体验,整个体验是由客户端,服务器等方面的工程师共同实现的解决方案。
以前有个笑话,说有些人创业,动不动就是我有个好点子,现在就差一个程序员了。在他们眼里做一个APP是非常简单的事情。知乎上见过一个极为通俗易懂的类比:请人吃饭。请几个人吃饭当然简单,几十个人也不过是得事先多准备一下。那么同时请几千个,几万个人吃饭呢?这种量级之下,就必须对每一个细节都要精益求精。有些人捣乱怎么办,菜不够了怎么办,大家的口味不一样怎么办,路上的安全谁负责......可千万别觉得这个描述夸张了。就是这样的,一个Demo和上线迭代了好几轮的产品也许看起来相差无几,但是背后的付出和价值却远远不同。
显然,越往上走 ,职位的细分就越严重。这时候就不能说做算法的一定比做前端的牛逼了,毕竟大家都需要在专精的领域沉淀很多东西,才能走到很高的地方。然而越往下走,很多时候就需要一个程序员肩负好几个职责。这也是很现实的问题,比如创业初期,哪有能力和成本组建那么齐全的团队?况且开始的时候也不需要对产品有那么高的要求。也有全栈工程师,各个领域都有积累,可以像自由人一样哪里需要走哪里。
为啥大厂找人都要考算法呢?我觉得吧,说到底,这更像是一种内功的考察。有些活是培训几个月谁都能干的,有些算法却是决定核心竞争力的东西。要看你能力怎么样,除了看你写过的代码,做过的项目之外,就是看你对用程序解决问题的这种思维如何,对计算机的本质理解如何。原则里面有一句话,你越接近事物的本质,就越容易成功。这一点对于程序员肯定是适用的。公司需要的是能力,而考察算法只是考察能力的一种方式。更多的时候,是因为这种方法效果更好吧。
什么才是真正的编程能力?以我的理解,设计的开源库在github上有几千个star,负责了核心功能的项目能支撑十万级的用户量,或者干脆在某个细分领域出了书开始做相关的技术培训.....哪一种都可以算作这种能力的证明。只要沉淀的足够,就不愁无法展现出来。而真正懂的人,也不会在乎你到底以什么方式来展现。真正的编程能力应该还是解决问题的能力,至于是哪方面的问题,什么程度的解决,就需要具体场景下去具体评价了。