iOS九面真经0x00总纲

139
原文链接: www.jianshu.com
至高武学九阴真经

前言

在程序猿的世界,有一句江湖传言“面试造火箭,入职拧螺丝”。相信广大同胞都深有同感,那么各个大厂小厂的"螺丝"真的需要“火箭技术”来进行安装吗?

显然不是。那么又是什么原因造成了这种局面?

程序猿的通货膨胀

经济学上有个词叫“通货膨胀”,货币供给大于实际需求,进而导致货币贬值,物价上涨。其实,这个词用于程序猿的世界同样普遍适用。而且,当下互联网的火速发展正使程序猿进入了一个“通货膨胀”的状态,这里的"通货"便是程序猿本猿无疑了。

想想互联网初期,一个程序员只要会基本的编程技能,企业就愿意接收你。那是因为编程从业人员少,有基础就好,其他的企业也愿意给你时间去学习和积淀。

随着互联网火速崛起,程序猿行业高薪高福利的吸引,越来越多的人开始报考计算机相关专业,同时也有相当一部分外行人急于进入这个行业。于是,许多编程的培训机构就应运而生,从这里流水般的向社会输送了一批又一批速成的开发人员。

这个时候,编程从业人员就发生了膨胀。进而导致程序猿身价贬值,企业要求大大提高。因为企业发现,会基本技能的程序猿遍地开花,以前的评判标准显然就已经不足以来选拔人才。于是,面试官将考核从基础技能逐渐向底层原理延展。

稍大一点的厂面试的深度和广度便会加大,招一个Java你不看点JVM源码,不懂Spring框架怎么行?招一个iOS你不懂Runtime,Runloop,不会玩黑魔法怎么行?

当然,考核的延展不止是这些与专业强相关的领域。因为这也还不足以过滤掉太多的人,所以数据结构和算法的考核应运而生。什么现场手撕个立方根都不是难的,现场手撕红黑树才是变态至极的考核。

在这种场景下leetcode就诞生了,它把各个大厂面试过或可能面试的算法收集起来让面试者练习。但是,考核者也知道有了算法题库,面试前大家都在刷题。于是,就有可能继续想出更加变态的考核。如此,就导致这个循环一直这样恶性地发展下去。

不可否认,算法练习对程序猿的编程思维有一定的裨益。但是,广大程序猿刷题的初心并不是为了扩展思维,而是单纯地应付面试。而且,对于大多数程序猿,这些在入职后的业务里有90%的可能用不到。

破局

黑暗中的光明

环境已然如此,我们不能像计划生育似得控制程序猿的数量,宪法赋予每个人成为程序猿的权利。既然不能改变环境,我们只能改变自身。

在应对通货膨胀的措施中有一条是:储备黄金。黄金作为一种不可再生的稀缺资源,在通货膨胀时期,显然比普通货币更具有经济话语权。而在某些特殊时期,有了经济话语权就相应地有了政治话语权。

所以,既然不可避免同类数量的快速增长,那么就尽可能将自己锤炼成一块黄金。毕竟企业在茫茫程序猿的世界,肯定会倾向于那些黄金程序猿。

在这方面,我也还只是一个青铜段位的小开发,所以不敢妄议。只是简单分享一下自己的看法,可以看作是一种还未经证实的方法论。

内外兼修的武功

首先,有程序猿的地方就有江湖,有江湖就不免会有各种实力排名,各种内家功夫外家功夫。别的门派我也不清楚,只能谈谈我自己所在的门派。我派自乔帮主以开天辟地之产品内功创派以来,不断吸引了广大以技术修炼为目的的江湖人士加入。技术方面,门派已有两大镇派功法:OC宝典和Swift真经,功法之下又有外功内功。

入我Apple门,方知Apple大法好
前有至圣乾坤OC功,后有斯威夫特天罡决
外可搭UI支框架,内可提性能少奔溃
上能述原理引技术,下能分任务导开发
如此修为,成就不世之App,名扬三方之框架,不久矣
......
ps:哈哈先让超哥意淫一把...

所谓外功,包括作为iOS开发的基本技能和进阶技能。

  • 基本技能:基本语法,基本设计模式,基本的UI搭建,基本业务逻辑, 复制粘贴上下其手
  • 进阶技能:复杂UI处理,复杂业务逻辑处理,处理的原理

基本技能,显然入行半年就基本能做到。对于进阶技能,首先需要一个复杂业务的环境,就比如你公司正在做的项目有这些需求。其次,需要对某些原理性的东西有一个初步的认识。再其次,如果能有少许内功加持就会更加如鱼得水了。

所谓内功,就是可能在你的APP中不能一眼立马看出的东西。要么,它需要时间的积淀(比如长时间的稳定性,奔溃率什么的);要么,需要直接去看你写的代码也能看出少许端倪。其实,内功就是对外功强有力的加持。就像我们都会降龙十八掌,但是内功深厚的人打出来总会那么不同凡响。

  • 内功入门:底层实现原理,知道并会用;框架设计原理,为什么这么设计
  • 内功中期:如果是自己怎么实现和设计,应该考量什么;尝试造轮子
  • 内功辅助期:操作系统相关原理/网络原理/计算机原理/移动设备基础/
  • 内功大成:熟练相关库原理(自己也能实现),能对项目作出整体框架规划,技术选型,难点攻克,任务分配等

只会外功的程序猿就在青铜段位,内功入门就可以是白银称号了,中期是黄金小成,大成阶段就是黄金大成段位了:真正的黄金程序猿!当然到了这个段位其实已经很少写代码了。。。

走过几个程序猿的工位,依稀可以看到他们的座右铭:

  • 青铜程序猿:天下代码一般抄,就看你会抄不会抄!
  • 白银程序猿:千程万序之中吾取Bug首级,如探囊取物!
  • 黄金程序猿:市场一片低迷,我自风情万种!

路漫漫其修远兮

最近,甲骨文中国区全量裁员的消息在程序猿的圈子可谓是炸了锅。“N+6”的赔偿让不少人觉得甲骨文良心还在,可是依然也有大部分员工拉横幅抗议。这些人大部分是有家有娃的30+开发者,有人说他们年龄大了已经错过开发者最佳时期,也有人说他们在外企安逸长期划水技术退化所以担心被裁很难找到工作。这个,我很难评判孰对孰错。当然,我对像这样的因为政治原因而“殃及池鱼”的国际事件深表遗憾,同时也希望他们都能找到新的归宿!

现在,我们跳出这个事件本身并不去评判他。想象如果是30+的我们遭遇了这样的事情,我们到底该怎么办?

技术真的是30+开发者的瓶颈吗?可是,人外国开发者的黄金年龄都在30+。当然,这个也与国内的就业环境息息相关。首先,如果继续在互联网行业继续干下去无外乎两条路:转管理和技术总监。首先,我个人并不擅长管理,所以暂且将之抛出今天的讨论范围之外。

这就又回到了,怎么修炼外功内功成为黄金程序猿的问题上。首先,作为一名从事四年开发的程序猿,我特别理解当先程序猿的辛苦,尽管有些公司不是996但也难免有加班行为。但是,我对一句话也是深信不疑:时间就像海绵里的水,挤一挤总会有的(鲁迅先生请为我站位打call)。

工作上很多时候会是一个多业务的代码拼凑,处理的大多是业务逻辑,其次才是技术深度,当然也不排除有些时候也是能学到新技术的。所以呢,如果只局限于工作,那我们就大概率地只能靠经验和跳槽去提高身价。

因此,我觉的我们有必要在工作之余去总结一些工作中的经验,同时还要不断扩大自己的视野,尽力去汲取其他相关的技术。适当减少打游戏的时间,转而去提升自己。毕竟50岁的你还能继续打王者荣耀,尽管可能反应有所迟钝,但就算如此本质上对你并没有任何损失。但是,当你50岁的时候才想着去提升自己的技术能力,不是不可以,但是学习速度一定不能和20几岁的你相提并论。

就是最近一段长期的失业空窗期,让我发现开发中的很多点我都是知其然而不知其所以然。而且当我重新去审视这些技术点,重新去复习了一些操作系统,网络相关原理的时候,我回过头来恍然发现:在以往的项目中,其实我还有至少40%的优化空间,尽管在我当时开发的时候已经足够小心翼翼和一丝不苟!

过去的大半年里(2018),我都在关注和学习区块链相关的技术。这使得我本职的iOS开发仅仅局限于工作之内,所以当我作为一名专职的iOS开发去重新审视2018的开发历程的时候,我发现自己其实并没有太大的进步,一直是个青铜程序猿。但我依旧感谢这一段“没有进步”的历程,它让我对另一个货币的自治世界有了很大的理解。只是,我不应该过度地投入到这个世界。

总而言之,就是承着大好年华不断提升自我软硬实力,向着黄金程序猿进发。他日就算甲骨文事件发生在我们身上,也依旧能笑对江湖:此处不留爷,自有留爷处!

我的面试历程

其实,这篇文章本来要作为之后的iOS面经的一个开篇题记。不料写开之后竟然一发不可收拾,写了这么多。接下来分享几个面试的经历吧。

首先,我面试了也有几家公司了。个人感觉好的公司有以下两点:

  • 1.首先接待你的人热情礼貌,会引你到面试点,然后给你倒一杯水让你稍候(这个细节也许不重要,但体现了公司对人才引进的一个重视程度)
  • 2.不会不管三七二十一上来就让你填一张表格,血型星座家庭成员啥都都有。八字都没一撇就写这个,不浪费纸吗。。。
  • 3.面试会有层次感。技术面试,至少两次。循序见见,每次的侧重点不同。

首先是一家互联网二线偏三线的公司,公司做漫画的,行业内Top几。面试是有笔试题的,题量大概一小时。基础40%,原理框架40%,算法题20%。很快一个小时差不多做完了,接着技术一面。前半段围绕笔试题展开,后半段聊其他OC的一些原理性东西,category/runtime/runloop等都有涉及到。很轻松的通过了技术一面,这里一面的东西基本是外功和基础内功。只要修炼过,一般的基础修为也是可以渡劫成功的。

我谈这家面试的重点是二面,因为二面涉及到大都内功范围。我二面没过,但是呢我分析不太是我修为不够的原因。可能是因为刚好岗位和技术内功不是很对口,因为他们目前的需求是会做大的代码重构与UI优化。而我最近两年是做SDK开发的,涉及到的UI操作很少。这回内功修为倒是够了,反倒是外功不匹配。。。

我想表达的一点是,招聘是一个双方协调的中庸。有些时候,你面试失败并不是因为你的内功修为不够。只是,刚刚好不是最需要的而已。就好比他们项目目前最需要的是武当登云梯能飞二丈高的需求,这个需要很深的内力加持。刚好你内力深厚,但是你会的是凌波微步。一个是垂直的高质量需求,一个是水平上的高能力。所以,刚好不匹配而已。

所以,很多时候面试失败不要暗自菲薄。也许真的是不合适的,最合适的还在后面。只要你时刻准备好。

接着再分享一家互联网创业公司,二线偏上吧,发展甚是迅速。技术一面大概就用了两小时,其中从基础到原理到项目再到算法都是有所涉猎的。其中比较难的就是手撕了一个缓存框架,要求写出核心代码。像这种公司,它一般一面就会要求外功与内功并重。不然,你没有这么多积淀是肯定聊不了这么久的。一面不是我要说的重点。

二面呢也大概有一小时四十分钟,这回主要聊项目和框架。因为我之前做过SDK开发,所以聊设计和SDK注意事项比较多一些。其次,面试官还出了一些情景题让我思考怎么设计解决方案。如果一时想不出,面试官会提示一步步指导你,看你能思考到哪一步。这一次是我至今遇到过最战战兢兢的面试了。但是,二面我也顺利过了。

我想说的一点是,很多时候我们通过面试并不是依靠我们真正的价值,而是我们给面试官传达的自身价值!就是有些问题你可能不会,但一定不能说不会下一个吧。一定要表达出自己的观点和思考,哪怕不对。或者说,有些时候可以兵行险着出奇制胜。拿我这次来说,其中有一个问题我就回答得比较偏差。但是我当时大胆地说出了自己的想法,而且也成功地吸引了面试官的注意(我答完后他记录了下然后三面技术官又问我这个的启发思路怎么来的)。而且,就此展开,我甚至跟他详谈了具体的实现什么的(妈的感觉自己在天马行空也不知道对不对)。但是,后来面试结束后,到家我马上查资料发现最开始的那个点就是错的,根本实现不了我说的。但是这个点后面推理与设计都是对的,只要对这个方案最开始稍作调整即可,我写Demo一一得到了印证。而且,我也觉得他也以为我可能整个都是对的。

当时我就觉得后怕,不知道怎么敢乱说。但是回过头来细想还是利大于弊的,尽管开头有点小错误但是整体方案瑕不掩瑜。而且退一万步来讲,就算都说错了,我也向面试官传达了我的思考,起码面对这个问题我不是束手无策也有自己的思考和方案,如果是实践,也许试错之后还会有新的思路。

后续的三面交叉面应该,而且不是iOS开发。聊框架和设计思路,大约半小时。四面HR四十分钟,没什么可说的,常规的谈话。现在还在等消息中……说是一周内给结果。期待和煎熬中……

关门见山

唠叨这么多,现在终于算进入正题了。所谓"九面真经",并不是说我面试了九次啥的。就是觉得"九阴真经",“九阳真经”,“玄天九幽神功”…这些大凡厉害的武林秘籍都有九,所以也给自己后续要写的面经取名“ 九面真经”。

其实,更多的是一个知识点的回顾,短期速成复习的方式。内功的修炼还是要循序渐进,平时多看官档,看大牛们的博客,慢慢地修炼!

--------------------------------------------------------------20190512 21.59

九面真经修炼者

九面真经总纲
他强由他强 清风拂山岗
他横由他横 明月照大江
他自狠来他自恶
我自一口真气足
手敲代码心眼明
丹田气起Bug诛
乾坤乃我code建
日月是我编译生
----------------------------- 九面真经撰经人 chaors