Similar Product面试专题移动开发技术前沿

小密圈大咖问答之算法重不重要

2017-03-12  本文已影响2573人  没故事的卓同学

问题:算法是不是很重要,不算是计算机专业的,算法没学过,但是面试基本上都有,需要深入研究吗?

这个问题我请了滴滴的技术专家 @Crespoxiao 来回答。

答:
这算是2个问题了,第一个问题:算法是不是很重要?第二个问题:xxxx,需要深入研究算法吗?

首先回答第一个问题,算法是不是很重要,请看下面几个比较流行的公式,再自行判断。
程序 = 算法 + 数据结构
软件 = 程序 + 软件工程
软件公司 = 软件 + 商业模式

那么算法到底是什么呢?
通俗而言,算法是一个定义明确的计算过程,可以一些值或一组值作为输入并产生一些值或一组值作为输出。因此算法就是将输入转为输出的一系列计算步骤。
—Thomas H. Cormen,Chales E. Leiserson,算法入门第三版

算法可以说是搜索公司的核心技术了,当初 facebook 起步也是靠着合伙人的几个数学公式。有些企业的查询引擎几十几百毫秒内就返回了数据,有的则几秒甚至更长,sql 语句和表的设计体现出了差距,深层次的原因其实还是算法。

如果是初级程序员或者想进入这个行业的人来问这个问题,当你在考虑值不值得学的时候,我觉得不妨先学学。写代码就像打仗,如果不懂算法的人来写就像用人海战术,可能就真的会是下面这样:



基础的算法如排序,作为常识,我认为程序员都应该掌握,面试官也特别喜欢问算法题,因为基础知识大家理解的差不多,那么企业怎么挑选优秀的人才呢,那就是通过算法题。学好算法和数据结构,可以避免写出性能低下甚至是不可用的程序。程序员写代码,尤其是前端程序员,除了算法和数据结构,剩下的不就是画界面么,这跟美工有什么区别,拿高薪想都不要想,培训3个月的人可能都会冒泡排序。

关于算法的重要性,李开复发表过一篇文章,奉上链接:算法的力量,李开复聊算法的重要性
还有一篇文章,统治世界的十大算法

顺便提提算法的价值,那些媒体报道的我就不说了,就说说我身边的例子吧。我07年本科毕业参加工作当是还没移动开发呢(iOS安卓),进入了一家从事自动光学检测设备研发的以色列的公司担任 R&D Engineer,当时一套设备卖10多万美金,我觉得不可思议,特么的就这一堆破铜烂铁顶多成本20-30万,也就工业级摄像头值点钱,销售的同事跟我讲利润起码200%才算正常,97年的时候一台设备卖970万人民币呢。那么硬件不值钱,值钱的是什么呢,算法,这些算法具体做的就是对线路板拍照然后跟设计图做对比,找出几十微米宽线路上的缺陷,比如大于30%的缺口,凸起等等。这些算法难到什么程度呢,香港的大股东安排了几个国外名牌大学毕业的博士进公司,终究没能偷师成功,至今市面上都没有国产的这种设备,至少我没听过,还是以色列那3家公司占据着绝大部分市场份额。

还有一个案例跟算法不是特别有关联,不过可以拿来讲一讲。我做的第一款移动端产品是视频监控相关的,在2011年,因为客户端是通过 tcp socket 接收音视频流的,这就涉及到几个问题,音视频播放,流畅度控制和同步问题(后面2个问题涉及到算法相关),因为市面上没有免费的解决方案,我靠自己研究解决了,负责开发pc 端产品的同事因为有可借鉴的所以遇到的难度不大,后面发项目奖的时候他500,我1万。

第二的问题:xxxx,需要深入研究算法吗?
看场景,大部分程序员不会用上特别高深的算法,甚至可以说对于程序员来说,毫无用处。高深的算法什么样的人在使用呢,比如参加 ACM 比赛的人,搞学术研究的人,或是马特达蒙的电影《火星救援》里面算飞行轨迹的哥们。说实话,算法导论那本书我买来就没怎么看当是装逼用了,跟实际工作内容没啥关联,也可能是因为我做的工作内容比较 low 吧,我现在是做移动端开发的。

那么一般的程序员要研究哪些算法?这要分层次:
对于未毕业的或者没什么经验的程序员,去面试的话,我觉得看看十大排序算法就挺好了,最多再看看字符串查找,替换之类的简单算法。微软面试100题也可以去看看,不过据说很多答案有问题。github 上有本书有将近1万个 star,有兴趣可以去看看:
《编程之法:面试和算法心得》
对于经验丰富的程序员,服务端这块我没有接触,客户端的话其实我觉得考察纯算法的场景比较少了,因为单纯的算法题并不能考察一个程序员的综合素质,能解算法题并不意味着这个人就有能力就能在工作中解决问题。
至于想去国外求职的小伙伴,我本人并无国外工作经验,倒是有一些在 google,amazon,facebook,apple 工作的朋友,听得最多的就是 leetcode,topcoder,hankerrank 和 codeforces。

最后留一道简单的问题,看看有没有兴趣去改良一下下图提供的算法。
客户端从后端接口获取的数据是一个数组,数组里面每一个 item 是一个设备的名字和定位信息,如果经纬度之差在0.001之内就用同一个地方,用同一个定位点表示并同时显示红色的badge,点击定位点展示的calloutview就是所有设备的名字,下图中的算法有什么问题吗,你能改进吗?

如果想加入

如果有兴趣可以加入我的小密圈,“24小时自习室”,一起分享交流 iOS 成长所得。欢迎有缘人加入

24小时自习室
上一篇 下一篇

猜你喜欢

热点阅读