最近一两个月,作为公司的iOS面试官,面试了几十个人,其中不乏优秀的面试者,但大部分还是相对平庸,这些人通常都工作了两三年,有一定的经验,但存在几个关键性的问题:
1. 研究不深入。
最普遍的问题就是只知道调用sdk或者第三方库,却不知道里面怎么写的。这种面试者一般在小公司工作了两三年,能使用sdk去解决一般性的问题,但也仅仅只是停留在使用层面上,却从来不钻进源码里面去研究原理,对于iOS系统较为底层的技术也是一知半解,或者压根没听过。这种面试者我基本上都pass了,如果是招普通的工程师,也勉强说得过去,但我们招的是高级工程师,对系统底层是一定要有些了解的,否则很多关键性问题就解决不了。
2. 缺乏程序设计方面的思考。
程序设计是区分一个开发者是普通还是高级的一个门槛,一般来说程序设计包括两个方面:组件设计和架构设计。组件设计是针对单个模块的,相对比较简单,架构设计是针对整体的,比较复杂。但总的来说,都是要解决在版本不断迭代,业务不断变化的过程中,模块的耦合性和可扩展性始终保持在一个合理的范围内。很多人平时开发的时候只关注自己做的那个模块,对整个应用程序缺乏一个宏观的思考,架构设计的不合理。举个例子来说,很多人喜欢把什么网络请求、手势处理、页面布局和各种业务逻辑都往VC里面写,导致其无比臃肿,不仅别的人看不懂,自己维护起来也麻烦。还有单例模式的滥用,单例确实有时候挺好的,用来传值、发网络请求都可以用单例,但是滥用单例会破坏模块的独立性,且增加不必要的内存开销。还有些人喜欢增加一个新的功能就继承一下原来的类,这样在版本的迭代中,继承关系越来过多,当有一个新的模块,要把某个功能从继承关系中抽出来的时候,就发现抽不出来了,因为已经耦合的太深。如果你想做高级工程师或者架构师,这方面的技术是一定要修炼的,而且越早越好。
3. 基础不扎实。
这里说的基础主要是在大学里面学的基础课程知识,比如数据结构、算法、操作系统什么的。一般来讲,重点大学毕业的基础知识会比普通大学毕业的要好,可能是因为在学校的时候要求比较严吧,反正考到这方面的时候,差别就很明显。可能有些人会说,算法这些在实际工作中能用到的太少了,考察这些没有意义。确实,平时开发中直接使用算法的很少,因为我们都是直接调用系统或者第三方的sdk,这些人家都帮我们封装好啦。但正是因为如此,才让我们少了去深入研究底层的一个机会。殊不知,越到底层,越是讲究性能和效率,这时候如果你算法、数据结构这些掌握的不扎实,就彻底完蛋了。现在的iOS开发说实在的,真的没有什么特别难的,难也就是难在几个方面:图像渲染、动画、音视频、socket、runtime(这些都是属于Cocoa底层框架),除此之外基本都是属于业务层面的或者是应用架构的问题。当你把Cocoa底层框架都研究透以后,你会发现自己已经到了一个技术瓶颈,而这时你想要再提高自己水平的话,就只能往系统底层去研究了。
4. 对网络和后台知识的了解匮乏。
虽然我们招的是iOS工程师,是做客户端的,但我觉得如果只掌握客户端的技术,而对网络和后台知识一无所知的话,也是不合格的。因为实际的工作环境中,避免不了要与后台联调接口,如果出了问题不知道从哪里着手,只知道依赖后端工程师的话,那工作效率肯定很低,这在一个创业型的公司里面是非常严重的问题。所以一个合格的iOS工程师或者说前端工程师,是应该要了解网络和后台知识的。
5. 对待工作的主动性不够。
这种情况在工作了两到三年的开发者中最为明显。初入职场还不到一年的,一般还会主动去承担工作任务,因为他们想要提升自己的能力,得到领导的重视。而工作了两三年以后,很多人已经是“老油条”了,业务方面已经很熟练,一般的编程问题似乎也没什么解决不了的,然后就会渐渐变得懒惰起来,不愿意承担额外的工作,一下班就走人。这种人其实很危险,在团队中会起到一个不好的影响,会让整个团队的士气下降。 如果公司招了更优秀的人才,那么他被解雇的可能性就会很大。
以上几点只是我个人的看法,作为一个工作了6、7年的程序员,我也曾经经历过这么一段时期,也犯过一些错误,所幸那时候iOS的竞争还没那么激烈,找工作没那么困难。但是随着这一行从业的人越来越多,要想出类拔萃,就必须在自己的工作能力和工作态度上面下功夫。最后,希望大家都能找到好工作!