人工智能那么火,为什么我们还要白板面试?

一周前,我面试了一个来自W Labs的Lead Big Data Engineer,问了他一个问题:在一维数组里找满足条件的最长子数组,很不幸,这个Lead Engineer在45分钟内连暴力解法都没有写出来,于是在结束面试前五分钟,我打住了他。

他和我说:现在大家都在处理大数据,在Hadoop,Spark上跑程序,我们在这做算法题,优化程序的目的是什么?

我当时着急结束面试,草草回答他说:我只是测试你的编程基础。

的确,从我13年开始工作到17年这四年,从内存里读1MB数据时间从15us降到6us;机器学习算法从跑在64核CPU变成了$8000的NVIDIA Tesla P100;Amazon服务器带宽从50MB提升到了1GB。

硬件提升如此迅猛,而我们还要在面试的时候进行白板测试,优化算法,提升程序性能做什么?

程序的价值是什么?
10012610_ctfB.gif

有一天我和Uber的工程师?王聊代码,他开篇就说,我加入Uber前没见过那么屎的代码,但就是这个代码撑起了60B的共享经济帝国。

由此可见,程序的优美性只是写代码要考虑的一个小问题,最重要的是代码自身的价值。

很多时候优化程序性能并不重要。如果你是一个Uber工程师,负责结账功能的系统设计,因为每秒需要处理的请求并不多,所以要解决的问题的难度比微信红包,支付宝要简单不止一个数量级,在这种时候,考虑程序的性能可能是多此一举。

著名的Pareto’s Law,应用到程序里面就是“20%的代码占用了80%的运行时间”。这个现象在互联网公司可能会更加极端-1%的代码占据了99%的运行时间。

说到这,我们可以得出这样一个结论:大部分的代码都是不需要考虑性能优化或者存储优化的。

但是!

对于剩下的那么一小部分代码来说,优化是非常重要的,好的工程师能看到优化带去的经济价值,而不是仅仅停留在优化代码的层面上。

好的优化是可以量化的
10012611_sNSs.gif

人们认识问题最直接的方式就是列数据,分析经济价值。

从正面来看性能优化是很值钱的,Apple网站上15寸的MacBook Pro有两种型号,2.6G CPU要$2399,2.7G CPU要$2799。除去不到$150的硬盘差价,你需要花10%更多的价格来得到字面上不到4%的性能提升,而且这4%的性能还不一定能从日常使用中体现出来。

从反证的角度来看,如果程序性能不重要,我们用更快的电脑更短时间运行完程序并没有额外价值。那么一个拥有16核的服务器应该和一个拥有8核的服务器一样贵,但实际上Amazon的c4.4x价格刚好是c4.2x价格的两倍。

现在大家都在使用云服务,每个月的收费是根据你的存储空间使用和CPU消耗使用计算的,你的每一个优化都可以被转化成美金计算出来。Buffer就发表过一篇工程师文章《How We Saved $132k a Year With an IT Infrastructure Audit》谈优化节约了多少经费。

另一种衡量方法就是去看用户多喜欢你的产品。长久以来Microsoft的IE浏览器一直是市场霸主,但最近已经被Google的Chrome浏览器后来居上了。在众多人们喜欢用Chrome的原因里,排名第一的就是Chrome的启动速度,网页加载速度远胜于其他浏览器。

著名的独角兽公司Pinterest也发过一篇Blog,谈一系列hack的方法是如何将手机网页加载效率提升了60%,与此同时带来了40%手机网页端用户转化率增长。

所以说,天下算法唯快不破。

加机器并不是优化性能的良药
10012612_T7Jn.jpg

考虑这么两种实际情况,一种是在单机上运行并行程序,最初我们可以从1 core变成3 core,将程序的性能提升一倍,但是如果你还想再提升一倍,那可能要16 core,因为程序不得不面对多核带来的额外开销,兼容性和调试的困难性。

另一种情况是常见的搜索引擎,当我们使用5台计算机来进行搜索时,整个集群的P95耗时由单机的P99耗时决定,当我们采用10台计算机来搜索时,虽然每台计算机处理的文档减半了,但整个集群的P95耗时变成了单机的P99.5耗时,说不定latency就从100ms变成了200ms。

这样看来,将单线程的代码性能提高一倍在某些情况下意味着更大的经济价值,增加更多的硬件并不是提升性能的魔法,好的工程?才是。

那高级语言的性能怎么样?
10012612_pRPr.jpg

有人说,今天最流行的编程语言就是Python和JavaScript了,但是他们的运行效率都比老牌语言C/C++差,这难道不是一个程序效率不重要的表现么?

我想要说,在你用着高级语言快速开发的时候,无数的程序员都在想着帮你优化他们的运行效率。对于Python,有人研究Cython,有人研究Pypy,从底层优化Python的程序效率;对于JavaScript,越来越多的公司都在通过优化它来优化网页速度,优化用户转化率,很多新的框架都在强调效率提升。

在你使用高级语言,写着更简单,更安全的代码时,你可能没有看到,在最近的十五年来,JavaScript在浏览器里的运行速度提升了两个数量级,在Benchmarks Game的网站上,Node.js处理正则表达式之比C++慢3倍而已。

我们是不是也可以认为这些年来JavaScript变得越来越流行,一部分也是因为他的运行效率在不断地提升。如果JavaScript还和以前一样慢,那估计现在没有什么人会继续使用了。

说到这里,我想向所有奋战在internal tools的同事致敬,他们虽然很少实现面向用户的功能,但是他们实现的功能帮助其他工程?节约了很多时间。

贪婪的程序员要求越来越高
10012612_nDcm.gif

还有一个让人们忽视程序运行效率的因素就是著名的Moore定律,处理器和存储读写会越来越快,谁还在意现在的程序效率呢?我们只需要用对的算法写干净的代码就可以了。

在1990年的时候,人们想让程序下国际象棋,那时候这是一个很困难的问题。你可能要在C++的代码里加入一些汇编代码进行优化,才能帮助计算机在短时间内做出决策。但是今天,你可以直接用Python写一个搜索程序来下国际象棋,并且战胜大部分人。

电脑一天一天的在变快,人们的需求也在一天天的变大,十几年前我们想让计算机下国际象棋,下中国象棋,并且说下围棋是很难解决的问题,因为围棋的搜索空间太大。但是如今我们已经可以用复杂的神经网络配上庞大的集群,打败每一个围棋大师。

同样的道理也可以用在手机上,手机性能每一年都在提高,我们对手机的使用需求也随着性能增加。读初中,高中的时候我只在手机上玩黑白的贪吃蛇游戏,如今我们则玩着3d的战略游戏,发送着语音命令…

可以想象,在不远的将来我们可能还会在手表上运行一些机器学习程序,帮助你做出一些决策,如果我们不优化我们代码的耗能,手机还能坚持12小时么?

优化是让处理器闲下来
10012613_BJeI.gif

最后一种说法,我们的处理器大部分时间处于空闲状态,即使程序慢,我们也可以让CPU运行更长时间来弥补。

回击这种想法只要打一个不恰当的比方,你会觉得买一个高级跑车但是长时间只放在车库里很傻么?

在计划你的网站需要多么大的集群支持时,都会为他准备很多备用的计算资源,要是不这样设计,运行程序就变成了去拥挤的超市里买菜,大家都在排着队,从停车场到收银台,排一整天。

我们也都经历过电脑CPU占用率达到100%的状态,机器变热而且任何程序都不响应,你只能无奈的等着。

如果搜索引擎的处理器在100%的状态下运行着,那么新来的请求就会被放在队列里,导致更多处理器切换造成了额外的消耗,最终服务器会彻底奔溃。

所以从设计的角度来看,我们需要我们的处理器处于空闲状态,有足够多余的计算能力。

对程序的优化就是让处理器闲下来,更好的代码帮助用户更快的得到结果,并且消耗更少的资源。

结语

开了这么久脑洞,回到最初的面试。

我们有很多方法去衡量一个人,他是否对产品有准确的理解,他是否有创造力,他是否理解用户最需要的是什么。但如果单纯衡量程序员,我们可以由简单的两点看起,他的程序是否运行正确,他的程序是否高效。

好的程序员能够生产正确并且高效的代码,这个定义看起来很简单,但其实也是最难的。因为一旦你可以牺牲程序的正确性或者程序的效率,那很多问题都会变得更简单,就好像CAP理论里一旦放弃一个要求,就有很好的实现方案。

所以,在下次面试的时候不要放弃优化你的代码。

在这里着重推荐一个我喜欢的blog,Daniel Lemire教授的《Does Software Performance Still Matter》,这是这篇文章整个骨干和灵感来源,我只是在里面加入了更多个人感受。


阅读材料:

http://lemire.me/blog/2017/03/20/does-software-performance-still-matter/

https://benchmarksgame.alioth.debian.org/u64q/compare.php?lang=node&lang2=gpp

https://overflow.buffer.com/2016/03/31/how-we-saved-132k-a-year-by-spring-cleaning-our-back-end/

https://medium.com/@Pinterest_Engineering/driving-user-growth-with-performance-improvements-cfc50dafadd7


来源:
https://medium.com/@yaoyaowd/%E7%99%BD%E6%9D%BF%E9%9D%A2%E8%AF%95%E5%92%8C%E7%A8%8B%E5%BA%8F%E4%BC%98%E5%8C%96%E8%BF%99%E4%B9%88%E7%81%AB-%E5%88%B0%E5%BA%95%E4%B8%BA%E4%BB%80%E4%B9%88-2c77971c3fc8

转载于:https://my.oschina.net/u/3579120/blog/1533487

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值