文档章节

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

AllenOR灵感
 AllenOR灵感
发布于 2017/09/10 01:24
字数 2860
阅读 4
收藏 0

一周前,我面试了一个来自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。

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

程序的价值是什么?


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

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

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

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

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

但是!

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

好的优化是可以量化的


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

从正面来看性能优化是很值钱的,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%手机网页端用户转化率增长。

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

加机器并不是优化性能的良药


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

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

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

那高级语言的性能怎么样?


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

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

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

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

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

贪婪的程序员要求越来越高


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

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

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

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

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

优化是让处理器闲下来


最后一种说法,我们的处理器大部分时间处于空闲状态,即使程序慢,我们也可以让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

本文转载自:http://www.jianshu.com/p/87c60a2a14e7

共有 人打赏支持
AllenOR灵感
粉丝 10
博文 2635
码字总数 83001
作品 0
程序员
私信 提问
想去Google做AI?先看完这套面试指南(附面试题)

 作者 | 阿司匹林 出品 | 人工智能头条(公众号ID:AI_Thinker) 凭借强大的技术实力和良好的工作氛围,Google 对求职者一直有着强大吸引力。 虽然 Google 在几年前就已经退出了中国大陆...

dqcfkyqdxym3f8rb0
04/18
0
0
直播 3.0 时代,在线教育行业的裂变和重构

在 9 月 20 日下午举办的云栖大会分论坛七牛云专场中,七牛云教育行业总监徐晶为我们带来了题为《直播 3.0 时代,在线教育行业的裂变和重构》的内容分享。以下是演讲内容的实录整理。 大家好...

七牛云
10/08
0
0
七牛云徐晶:基于 WebRTC 架构的直播课堂实践

8 月 18 日下午,在七牛云架构师实践日第三十期,七牛云教育行业产品研发总监徐晶进行了《基于 WebRTC 架构的直播课堂实践》为题的实战分享。 本文是对演讲内容的实录整理。 作者简介: 七牛...

七牛云
08/23
0
0
想去谷歌 AI 工作?请收下这20道面试题

雷锋网按:Google AI Interview Questions— Acing the AI Interview 本文为雷锋字幕组编译的技术博客,原标题,作者为Vimarsh Karbhari。 翻译 | 郑前 整理 | 凡江 谷歌拥有世界上最聪明的A...

雷锋字幕组
04/18
0
0
为什么有面试官喜欢让面试者用纸笔写代码?

此前Max Howell面试时因没有通过白板测试而被Google拒绝,引发了一阵关于白板测试的争议。事情是酱婶儿的: Homebrew是苹果OSX下面的软件包管理工具,Max Howell是Homebrew的作者(由于国外大...

慕课网官方_运营中心
05/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

小白创建一个spring boot项目

进入 https://start.spring.io/

lilugirl
24分钟前
0
0
Alibaba Java诊断利器Arthas实践--使用redefine排查应用奇怪的日志来源

背景 随着应用越来越复杂,依赖越来越多,日志系统越来越混乱,有时会出现一些奇怪的日志,比如: [] [] [] No credential found 那么怎样排查这些奇怪的日志从哪里打印出来的呢?因为搞不清...

hengyunabc
今天
1
0
home hosts

home hosts lwk@qwfys:~$ cat /etc/hosts127.0.0.1 localhost127.0.1.1 qwfys192.168.56.101vm600.qwfys.com39.108.212.91alpha1.ppy.com39.108.117.122alpha2.p......

qwfys
今天
1
0
大数据教程(6.1)hadoop生态圈介绍及就业前景

1. HADOOP背景介绍 1.1、什么是HADOOP 1.HADOOP是apache旗下的一套开源软件平台 2.HADOOP提供的功能:利用服务器集群,根据用户的自定义业务逻辑,对海量数据进行分布式处理 3.HADOOP的核心组...

em_aaron
今天
4
0
hadoop垃圾回收站

在生产生,hdfs回收站必须是开启的,一般设置为7天。 fs.trash.interval 为垃圾回收站保留时间,如果为0则禁用回收站功能。 fs.trash.checkpoint.interval 回收站检查点时间,一般设置为小于...

hnairdb
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部