写在前面
自从上篇 成功入职字节跳动的小姐姐告诉你,Android面试吃透这一篇就没有拿不到的offer! 火了之后(脸红!谢谢大家喜欢~)很多小伙伴都留言或单独私信我,让我出一个面试中项目如何说的经验分享。
好,这就安排上了!
其实,我在准备项目面之前,也在各处搜刮项目面试通用经验。最终遗憾发现大多都是空话。根本无法将具体项目代入,看完之后也不知道自己该做什么。
本文完全颠覆普遍大而空的面试方法论,本着"不说废话,直接上干货"的原则,以具体项目为,给大家提供一个从准备到面试整个过程的指路灯。
在整篇文章开始前,我们需要明确一件事:面试官通过项目面想要了解什么?
你可能会回答我:当然是牛逼哄哄的技术和少说也得三四五个项目的雄厚经验吧?
错!
首先,你要知道,你参加的是校招。你技术再刚,经验再多。最多也只是做了一个千级万级dau的项目和2~3年左右的经验。技术和经验并不是企业选择校招生的核心标准。
他们看中的是:解决问题的思维方式,简言之,便是你在项目开发过程中处理各种问题的能力。
所以,与其花时间去积累项目或用各种方式让你项目显得很厉害。不如抓住一到两个项目,深入理解,思考如何通过项目向面试官展现自己。
那么,一次成功的项目面应该是什么样的?
我认为,一次成功的项目面更像是一场博弈。针对项目所暴露的问题不断讨论。唇枪舌战,谁与争锋。往往结局便是双方摸索出一个达成共识的方案,能够对原项目产生质的提升与突破。
你可能惊了,这哪是面试?这更像是一次技术交流。没错!这就是一次技术切磋,头脑风暴,思维火花的基情碰撞!
看到这里,你是否有很多问号:这简直颠覆了我的三观!你这么搞,真的能成吗?
懒得废话,一恩姐姐立刻带你时光穿梭,
直接重返战场!
现在是北京时间11月4日下午14点,阳光明媚,万里无云。远程视频中面试小哥哥的笑容无比慈祥。
小哥哥:我看你简历中写着你曾经做过车辆监控管理系统,能和我简单介绍一下吗?
我:好的。我在读研期间负责车辆实时监控系统的开发。本项目是……采用了ReactNative框架进行开发。我的主要工作包括以下几个部分:分别是……
小哥哥:能具体说一下ReactNative框架是如何与原生进行交互的吗?
我:ReactNative与原生是通过webView进行交互的,通过postMessage将数据传送给原生巴拉巴拉……(回答完问题,立刻画风一转)这样实现可以完成功能,但有一定弊端,比如……。因此我对这一弊端做了进一步的优化,即……。
小哥哥:在项目中你还遇到了哪些问题吗,是怎么解决的?
我:有的,因为我的项目是车辆实时监控系统。重难点便是实时性和地图两方面。这里实时性是通过websocket长连接实现的,我在做项目中遇到过2个
难点,分别是……,我的解决方法包括:……;关于地图也有需要注意的地方,比如会造成电量和网络大量消耗,因此在开发过程中做了性能上进一步优化。小哥哥:能跟我说说你都做了哪些性能上的优化吗?
我:主要包括2个方面,分别是网络优化和电量优化,网络优化包括监听流量……,电量优化我则从以下三个方面做的,即数据传输过程对数据的压缩,资源的及时释放……
小哥哥:关于你刚刚说的websocket,我想多问一句,你是什么时候会停止长连接呢?
我:(糟糕,这题没准备!)我目前的做法是只有打开地图页面才开启长连接,因为避免在不需要的场景传送无用的数据导致资源消耗。不过这样做仍存在一些问题,因为……。
小哥哥:不过,我认为长连接可以一直存在,因为在不传输数据时长连接消耗基本不存在,倒是反复开关长连接会造成不必要的消耗。而且监控类项目可能会涉及全局报警,就算没有打开地图也需要获得长连接推送过来的消息。同时我提个建议,可以通过心跳检测进行监听,在心跳包没传送时加上重试可以对不稳定的长连接有一定改善。
我:嗯好,确实对长连接非常有好处。但仍有缺陷,我这里也想到一个新的方案……
整场面试我们讨论了足足两个多小时,从项目本身到新技术的前瞻,最后因时间超额不得不结束。现在想想仍然觉得惊险刺激,意犹未尽,大脑跟着火了一样熊熊燃烧……只想仰天长啸一声:爽!
痛心疾首的是,小哥哥的微信没要到啊!
说了这么多,大家现在应该对一场成功的项目面心里多少有点数了吧?如果你也想和小哥哥来一次基(?)情四射的技术交流,那么请你继续看下去!
这次,咱们不开车。教你如何一步步抓住面试官的心~
1. 二面的过程是什么样的?
首先,先得明白。二面/项目面的整个流程及应对的思路。
这里针对项目面的四个重要节点提供了主要思路。下面会详述这四个节点,大家需要将自己的项目代入这四个问题,问问自己是否能通过考验。
2.如何选择/找到项目?
(1)如何找到/选出合适的项目?
每个人的项目经验起点不同,有人两袖清风,想着法子无中生有;也有人左拥右抱,却也无从下手。
我认为,寻找/选择项目需要遵循以下两个原则:
- 必须包含一到两个 可扩展性 知识点
- 最好解决了明确的 需求
首先,什么是可扩展性知识点?是指一个知识点,作为一个根结点,它的延伸分支可以深入到很远。举个栗子。ListView,来大家跟我一起背,用于显示列表,需要一个adapter来对数组进行包装,通过RecycleBin进行缓存。……这就没了?不可以!请跟我继续:ListView如何对convertView复用?ListView中图片过多引起OOM如何解决?上下左右滑动冲突怎么做?ListView中可以包含大量图片,布局复杂导致卡顿怎么办?ListView如何实现下拉刷新上拉加载?用RecylerView代替ListView解决了什么问题?……
我想你大概明白什么叫可扩展性了。为什么需要这个东西?因为他能够 控场 !
因为这些延伸分支就是你的套路呀!提前准备好一两条分支上的基础知识、重难点、优化点,并在描述项目时做一些诱导,就可以非常心机地让面试官按照你早已精心准备的套路问问题~
你看,我并没有说出你们想要的答案:首选很难很剽悍的项目。因为再难再复杂的项目面试官都见过,你的难对于他们而言只是大巫见小巫,并不足以吸引他们。
当然,如果你足够自信,认为能把握住两大基本原则的同时激进发挥,把一个前无古人后无来者的项目说的精彩绝伦。那你是大佬,小女子瑟瑟发抖,甘拜下风。
对于没有项目的同学,可以在黑马、腾讯课程上跟着做一个简单的项目。在准备过程中需要融入自己的思考,化为己用。
可扩展知识点对于项目的倔强青铜和荣耀黄金都适用,千万不要停留在项目表面,请去挖,把他的祖坟十八代挖个透彻!下面以一个实例来说明如何延伸:
有一个小伙伴私聊我,说自己项目平淡无奇,不知如何去画知识树,扩展分支。我去看了一下他的简历,发现他有介绍自己使用了ViewPager。就帮他进行了一次分析
(2)如何简单介绍项目?
不多说,拿干货。直接上模版。
- 介绍一下项目和你的主要工作。
- 主要工作是如何实现的:
- (1)用了什么框架,如何使用
- (2)描述一下核心代码
这往往是项目面的第一问,注意,不要废话,言简意赅,为面试官跳入套路做好前戏
一恩案例
我在读研期间负责车辆监控系统的开发。本项目是对危险品车辆进行全国范围内的监控与管理,主要功能包括对危险品车辆进行实时定位、轨迹回放、违章查询和报警等功能。采用React-Native框架进行开发。我的主要工作包括以下几个部分:
第一是:地图的集成和封装。
由于RN的地图插件功能有限无法满足项目的需求,因此打算使用原生的地图SDK进行功能的实现,但考虑到需要同时完成android和ios两套业务逻辑的实现,浪费开发成本。最终考虑采用H5封装地图完成业务逻辑的实现。封装功能支持地图显示、车辆实时定位、轨迹回放等功能,得到了项目组的肯定并沿用至今。
第二是:人脸采集与注册识别。 通过Android和IOS端进行原生开发,通过原生代码实现人脸采集与注册识别,并反馈给RN端实现数据的重用。
3. 项目中可能涉及的基础知识都背熟了吗?
看到这里我相信你已经选好了自己的真命项目。现在到了激动人心的环节,咱们来扒他/她老底!
对于一个项目他的知识体系是非常庞大的,你所负责的那部分工作所牵扯到的知识点就是面试官提问的地方。因此需要总结与细化知识体系。(也就是上一步中可扩展性知识点的延伸分支进行细化~)
我认为这里需要做的工作包括但不限于:
- 知识点基础知识
- (请看上一篇博文:成功入职字节跳动的小姐姐告诉你,Android面试吃透这一篇就没有拿不到的offer!)
- 知识点与项目如何融合?
- 核心代码如何实现?
至于具体工作如何去做大家可以参考我这篇博文:下文链接有爆照福利!为了让你们点进去我都爆照了!
一恩的面试项目介绍(求你们了,一定定定要看!思路都在里面了!)
当然,我又双叒叕打印出来了,每天背一背,生活养乐多~
我认为大家也需要和我一样,用同样的方式对自己的项目进行总结,包括需求设计、技术点、项目实现。
4. 哪些场景是我可以Hold住的?
我相信,经过这样一番介绍。面试官已经对你的项目有了基本了解并且对你的工作内容深信不疑了。
(copy项目的,请收起你们邪恶的笑容!)
现在他们要正式开始向你发起攻击,这怎么能忍?先发制人!不要让敌人有可乘之机!
不过我们先缓一步,回想一下,面试官想要了解什么?对解决问题的思想。好,现在我们一起控场!
(1)直接提出问题
针对你的工作内容/代码提出不足之处,直接跟面试官暴露。关于不足之处,大家可以从以下几个方面来思考:
- 代码优雅性:如何对代码进行重构?
- 良好的设计思想:如何运用设计模式?
- 性能优化:内存、电量、布局等等优化
- 技术缺陷:技术方案、选型的不合理性、漏洞等
- 产品思想:人人都是产品经理,从需求下手,提出更好的设计思想
(2)解决问题与提出TODO
解决的问题应具体问题具体分析,上面提到的5个角度都是非常重要的。尤其是性能方面,性能优化意识是高级工程师的基本素质。对于问题如果已经有解决方案则应详细说自己如何解决,如果没有解决可以告诉面试官自己的目前的思路,与后续TODO。
一恩案例
我的项目是车辆实时监控系统。重难点便是实时性和地图两方面。
【技术缺陷】这里实时性是通过websocket实现的,我在做项目中遇到过2个难点,分别是当传输的数据量过大会造成网络的负担,这里我采用数据分帧的方式分片传输数据;第二个问题是长连接的不稳定性,可能会随时断链,如果不得当处理会造成资源不必要的浪费,更有甚者会导致崩溃,这里我采用了心跳检测的方式监听长连接,如果没收到心跳包则在重试一定次数后断开连接;
【性能优化】关于地图也有需要注意的地方,比如会造成电量和网络大量消耗,因此在开发过程中做了性能上进一步优化。主要是在网络数据传输时将数据进行压缩,以及当应用处于后台时及时关闭部分资源。
【代码优雅性】同时,目前的实现方式仅仅能完成功能,但仍有很多不足。比如对WebView的访问很多地方都复用,因此可以将这个方法单独抽出来进行重用。而且当传递数据后会经历访问webView,数据解析,处理等操作,这些步骤对于业务方是完全不需要知道的,因此可以封装到一个组件里进行屏蔽,实现隔离。
5.Hold不住怎么和面试官刚?
如果上一个场景你成功Hold住了,面试官此时此刻已经按捺不住想要你的心情了。不过对于一些傲娇的面试官,可能会在最后放个大招,来一两道送命题。
这道题你可能完全没有准备过,也不知道答案。此时此刻,不用慌。因为这是你的项目,你的主场。你要做的,就是重拾主权,"刚"回去!
这里的刚,不是胡搅蛮缠,强词夺理。而是以理服人。
那么,理从哪里来?
还记得套路满满的可扩展知识树吗?咱们回到根结点,重新套路!
下面用一恩亲身案例来讲
小哥哥:关于你刚刚说的websocket,我想多问一句,你是什么时候会停止长连接呢?
我:(脸色一变,这道题我没背过!但立刻恢复神色,我可以扯~)因为长连接是用于传输实时数据的,所以只需要当地图打开的时候开始长连接,地图关闭时关闭长连接。(看到小哥哥微微皱眉,我立刻改口)不过这么做有一些弊端,比如反复打开长连接会造成不必要的三次握手,浪费资源;但一直将长连接置于后台也会有耗电等弊端(和小哥哥一起思考了一会儿)因此这里应该根据产品的性质,如果是一个对长连接非常必要的系统,应该保持长连接始终连着直到他停止,而对于一个不常用此功能的系统,可以结束使用时停止长连接。
小哥哥:我认为长连接可以一直处于后台,因为在不传输数据时长连接消耗基本不存在,倒是反复开关长连接会造成不必要的消耗。而且监控类项目可能会涉及全局报警,就算没有打开地图也需要获得长连接推送过来的消息。(我连连点头)同时我提个建议,可以通过心跳检测进行监听,在心跳包没传送时加上重试可以对不稳定的长连接有一定改善。
我:嗯好,确实对长连接非常有好处。我这里也想到一个新的方案……
其实,与面试官"刚"是非常受面试官欢迎的。因为你们可能以后就是同事,在团队中讨论与辩论方案是常有的事情,大家对“互刚”非常喜闻乐见。所以不懂就问,坦诚清晰,大胆地说出你的想法,如果你能有理有据并成功说服了面试官,恭喜你,你已经成功成为面试官心中的白月光、朱砂痣了~
写在最后
很多小伙伴对项目面都有一点恐惧,其实可以理解。因为项目面的不确定性较多,对知识考察也比基础面要深入细致,难度也会更大。
但读完此文你是不是觉得项目面也有自己的套路,而且把应用好后面试官会被你玩的死死的~
所以呢,不要怕。把你的项目重新雕琢,好好准备,二面是你的个人Show!穿的好看点,画个美美的妆,用你满满的套路和思维的风暴的牢牢锁住面试官的心吧!
It’s Show Time!
无论哪轮面试,最重要的还是基础知识沉淀。所以,请不要松懈继续巩固基础知识。
每天都要背!疯狂背,背到头秃!背到口吐白沫!
转自CSDN,作者:李一恩