一道 Google 面试题告诉你如何破局而出,快速成长为优秀工程师。git
关注微信公众号:BaronTalk,更多精彩好文等着你!github
我相信每一个工程师都曾怀揣一个成为技术大牛的梦想,但是真正走向技术大牛这条路的少之又少。工做中咱们经常会发现,有些同窗工做没几年但成长迅速;很快就能走向团队核心岗位,成为一名优秀的工程师;而有些同窗工做几年后却在公司里默默无闻,能力和职位上都没有太大提高,得过且过最终沦为一名普普统统的码农。因此我经常会有感慨,太多人(包括我本身)真的只不过是用一两年的经验在职场上混了五年十年甚至更久。面试
那么普通工程师和优秀工程师到底差距在哪儿?那些优秀工程师是怎么一步一步成长起来了的呢?如下就我本身的观察和思考来谈一谈,看看能不能一探究竟,了解通向优秀工程师的法门;而后与你们共勉,一块儿朝着优秀工程师的方向去努力。算法
咱们拿吴军老师在获得专栏中讲解的一道 Google 面试题来展开聊一聊,看看面对一样的问题,普通工程师和优秀工程师是如何思考解决问题的。服务器
问题以下:如何设计一个地图功能,找到离当前最近的加油站?微信
在最近公司的招聘面试过程当中,我也拿相似的问题去问过部分候选人,大部分候选人都把问题想的太简单。一般普通工程师给出的解决方案是:根据经纬度算出全部加油站到当前位置的距离,而后对这些加油站按照距离的远近进行排序,选择距离最近的几个加油站。markdown
可问题是,在路面上行驶,从 A 点通往 B 点,每每不是直线距离。由于不管是驾车仍是步行,咱们都不可能穿过建筑直达目的地,A 点到 B 点的距离是不少距离片断的组合,这可能会有上千种组合,那么如何从这上千种组合的路线中选择距离最近的一条路线呢?使用动态规划算法可以很好的解决这个问题,在上千种组合中只需几十个步骤就能计算出最短路线。这对部分工程师已是个门槛了。数据结构
接下来就须要按照距离排序,找到最近的几个加油站。框架
绝大部分工程师面对这样的问题都会想到排序,排序固然可以解决问题,但并非最优方案。就算使用效率最高的快速排序,也须要 N 乘 LogN 的计算量。假设城市里有 1000 个加油站,那么 LogN 约等于 10,也就是说计算的复杂度差很少是 1000,固然 1000 的计算量对于计算机算不上什么,可是考虑到一个城市的路面上可能有上百万辆行驶的汽车,这个计算量的消耗就很可观了。工具
假设咱们只须要最近的 5 个加油站,若是对全部的加油站排序那显然作了不少无用功。数据结构中有一种叫二叉树的数据结构,在二叉树中有一种更细的分类:“堆”,经过堆排序咱们能够只用排出前几名,而不用管后面的名次。经过堆排序排出第一名的时间复杂度是N,排出第二名、第三名、第四名、第五名的时间复杂度都 LogN,比对 1000 个加油站排序要快的多。对于咱们的需求:选出最近的 5 个加油站,差很少只须要 1000 的计算量,比快速排序快了近 10 倍。
到这里你是否是以为问题已经解决的很完美了?
咱们在解决问题的时候情不自禁的作了一个假设,就是整个算法的优化过程是围绕一个使用者的某一次使用来进行的。可是在现实生活中,一个城市里有不少人会同时在不一样的地方寻找加油站。相似的,同一我的在不一样的时间不一样的地点开车时也须要寻找加油站。考虑到这个现实场景,时时刻刻都有不少人在不停的寻找附近的加油站,那么不少计算实际上是能够预先算好的,等到提供服务的时候直接把结果调出来就行了,避免重复计算。
好比咱们能够把上海市全部路口点到点的距离事先计算好,当一我的要找加油站的时候,距离的计算就再也不须要实时地采用动态规划来计算了,只须要计算从当前位置出发到附近几个路口的距离,再计算下某个加油站到它所在地附近路口的距离,因为各个路口点到点的距离是事先计算好的,所以作几回简单的加法便可,这样计算距离的时间就能省几十倍。这就是对上面的问题进行了全局优化的好处。
其实面对这样的问题,优秀的工程师并不会遇到问题就直接着手去解决,而是会更全面的去考虑问题。好比会考虑到目前的行车方向,好比在解决问题中其实距离要求并不须要太精准,由于对于开车的人来讲 2.5 千米和 2.3 千米其实并无什么差异,再考虑到道路拥堵的状况,200 米的距离更加能够忽略不计了。但若是是行人要寻找附近的便利店,200 米的距离就不得不考虑了。
那么从上述这个问题的解决上咱们能看出普通工程师和优秀工程师的差距在哪儿呢?
1. 优秀的工程师必然有着扎实的计算机基础知识,很好的掌握了如数据结构、算法这些工具,可以在工做中借助这些工具帮助本身解决问题;
2. 优秀的工程师会尽可能避免作无用功
3. 优秀的工程师不会只知足于完成任务,他们会不断的去思考探索最佳的解决方案;
4. 优秀的工程师不会被思惟所局限,考虑问题更加全面,懂得从全局角度优化解决方案。
从这个例子咱们也能看出来,一个优秀工程师解决问题的性能多是普通工程师的几百上千倍,一个优秀的解决方案甚至能帮助公司节省几百万的服务器费用。
所以,在软件工程领域一百个臭皮匠也顶不了一个诸葛亮!
学好数据结构、算法、操做系统原理、计算机体系结构等基本功,打好基础。
若是你是天才,面对像上面这样的问题,即便你没有学过计算机理论知识,即便你不知道动态规划、二叉树、堆排序,可能也能依靠智力上的优点解决。但遗憾的是绝大多数人都不是天才,所以在解决问题的时候就须要借助各类工具以便事半功倍。对于开发人员来讲,数据结构、算法以及各类数学知识就是咱们手上的工具。
要成为优秀的工程师须要咱们静下来,沉下去,老老实实的吃透你所作的项目。作好简单的事,才有机会去作更有挑战的工做。
不少工程师会抱怨本身一直在作业务,没什么挑战,感受不到成长。可事实真的是这样吗?每每咱们的业务需求就像这道面试题,看似简单其实想要作好,背后须要下很大功夫。就算平时作的业务真的很简单,咱们是否是还能够想一想,个人代码实现是否有更好的方式?面对相似的业务个人效率是否能够提高?线上出 Bug 了是否能够采集到线上 Log 快速定位并解决问题?你对本身开发的项目中用到的各类框架是否真的理解其原理,是否真的去翻过代码学习过这些优秀框架的实现?就拿 Android 开发来讲,各类开源框架如 RxJava、Retrofit、OKHttp、ORM框架、热修复框架、插件化框架等等,若是你真的去认真学习过一遍,我相信已经远超行业里 90% 的工程师了。
同时在工做中要有不怕吃亏的心态,主动去承担更多的职责;作的更多每每也意味着接受了更多的挑战,得到了更多的锻炼机会。
利用碎片时间系统化学习
不少人反对碎片化学习,但我并不彻底认同这种见解。碎片化的时间既能够用来碎片化的学习,也能够用来作系统化的学习。不少人都期望可以有一天,有一大片的时间,好好的、系统化的把计算机知识恶补一遍。因此买了算法导论、深刻理解计算机系统等等经典书籍放在家里,等着有一天可以有一大片时间,沐浴更衣、正襟危坐来好好学习。可是学了不久很快又被其它事打断了,结果下一次又从新再来。最后每每只是把一本书的前几十页反复看了好多遍,其实这种才是真正的碎片化学习。
而所谓的利用碎片化时间系统化的学习是指制定好完善的学习计划,利用好每个碎片时间,好比上下班的路上、等公交的时间、坐地铁的时间、排队的时间,甚至是蹲马桶的时间来按计划的、体系化的学习提升。
持续学习,坚持阅读,保持输出
技术更新迭代太快,而计算机科学之复杂也远不是在学校的几年学习就能彻底学透的,这就要求咱们保持持续学习。但每每不少人走出校门后就再也没有正儿八经的学习过、冲过电,这也是为何咱们毕业后会被那些优秀的工程师越甩越远的缘由。而我认为最好的持续学习的方式就是坚持阅读了。大家看!优秀的工程师就算是挂着盐水也要坚持阅读的!!!🤣🤣🤣
另外学过的知识只有输出出来了,才是真正的学到肚子了。向别人讲述知识、写做等都是很好的知识输出方式。
锻炼本身的综合能力
要成为一名优秀的工程师,光有过硬的技术是不够的。出色的完成一项工做每每考研的是一我的的综合能力。良好的表达能力、出色的会议组织能力、事情的推进能力、我的的成熟度等等都是须要咱们在工做中去刻意的培养和锻炼的。拿表达能力来讲,若是以为本身表达上有所欠缺,就能够经过写做、主动在团队内作技术分享等等方式来锻炼本身。有时候,不逼本身一把你都不知道本身到底有多棒!
做为一个技术上的菜鸟,写这样的文章实在是有点惭愧。且算是给本身定个基调,与你们共勉好了,这样也能督促本身不断进步。
哦,对了!还有一点!!!优秀的工程师是不会抱着手机抖音一刷一夜的。🤣🤣🤣
若是喜欢个人文章,就关注下个人公众号 BaronTalk 、 知乎专栏 或者 GitHub 吧!
- 微信公众号:BaronTalk
- 知乎专栏:zhuanlan.zhihu.com/baron
- GitHub:github.com/BaronZ88