iOS开发工程师-面试之道

iOS开发工程师面试策略(4)-代码考察和系统设计准备

2019-10-28  本文已影响0人  iOS大蝠

1.如何准备代码考查

很多面试的能力都不是突击可以获得的。项目经历不是,代码能力也不是。如果说项目经历的获取还需要环境支持的话,代码能力的提高基本只需要自己投入就可以了。

在网上有很多练习编程的网站,特别是像面向求职者的 LeetCode 一类的网站,提供了各大公司的代码考察题目,并且大部分题目还有标准解答和示意代码。你可以在上面一遍一遍地练习,以提高自己的代码转换能力和逻辑思维能力。我建议大家至少做 100 道 LeetCode 里面 Facebook、Apple 这些大公司的代码题目,很多题目都设计得非常好,既是很好的练习题,又可能在实际工作中用到。Google 的面试题通常还要更难一些,对自己要求更高的同学也可以挑战一下。

除此之外,在纸或白板上写代码的能力也需要好好练习。纸上写代码麻烦的地方在于不方便及时涂改,所以需要思考得比较清楚再动手写。准备一些 A4 纸,然后拿 LeetCode 题目多练习几次,慢慢就会有感觉。

我最后总结出来在纸上写代码的要诀是:一定要先把整体逻辑框架梳理清楚,然后再填充细节。所以你可以用文字、流程图或任何你喜欢的方式先把代码整体逻辑描述在纸上,然后检查没有边界问题后,再在纸上细化成具体的代码。

2.写代码之外的沟通

即使是做代码题目,必要的沟通交流也是必须的。我见过很多候选人听完题目就埋头写代码,完全不和面试官交流,这其实是非常错误得做法。如果写代码完全不需要交流,那么为什么不当做笔试题,而要耽误面试官的时间坐在你旁边?难道就只是为了监督吗?

其实,解决一道代码题目的思考过程是非常有价值的,面试官问你一道代码题目,其实是希望和你一起沟通交流,了解你的思路,帮助你找到最好的解法,最后才是把代码完成的事情。

所以,当面试官给你一道题目,你首先要做的是和面试官足够地交流。你可以首先确保你完整地理解了题意,这可以通过询问题目的一些细节来达到,比如问输入的数据范围,输出的具体要求,一些异常的情况是否要考虑等等。

等你完全理解题意之后,下一步就是将你的想法说出来。你完全不必担心没有一下子说出最好、最完美的解法,大部分好的代码题目都可以一题多解,你可以先说一个最简单直接的方法,然后说出这种方法的时间复杂度、空间复杂度。一般面试官都会问你有没有更好的做法,或者你也可以直接说想思考有没有更好的做法。接着你可以试试看能不能想出一些办法,即使一些办法没有完全想清楚所有细节,也可以说出来。好的面试官如果发现你的方法完全方向不对,还可以及时干预。

你如果在思路上有卡住,你甚至可以请求面试官给你一些 “提示”。虽然这可能使得你面试表现稍微减分,但是比起完全没有写出代码来说也要好很多。

除了写代码之前和面试官交流、确认解法,写完代码之后,你也需要和面试官讨论你的代码细节问题。通常代码中多多少少会出现一些问题,面试官会给你一些引导,帮助你发现并且修改有问题的代码。

3.如何准备系统设计

如果你是一个应届生,通常考查的系统设计题都不太难,你只需要有一些系统设计的基础,都不至于完全答不上来。在准备资料上,可以看看《设计模式》相关的书。如果有机会实习,可以多尝试一些不同的职位,如果你同时尝试过客户端和服务器端开发,在系统设计上就可以更加综合考虑设计方案在多端的实现难度,以便做出权衡。

另外,你可以通过学习分析一些开源项目的代码,来学习架构设计。在网上,你通常也可以搜索到一些常见的系统设计题目,在本书的上一节中,我也提供了好多系统设计题。把这些系统设计题目仔细研究,尝试自己实现一下,通过实践并且和同学讨论,相信你也会有不错的成长。

虽然没有标准的答案,但是系统设计还是有一些解题套路,下面我就给大家介绍一下。

首先系统设计题都非常考查一个人知识的全面性。所以大家应该平时多了解一些 iOS 之外的技术,比如适度了解一下 Android 端、Web 端以及服务器端的各种技术方案背后的原理。你可以不写别的平台的代码,但是一定要理解它们在技术上能做到什么,不能做到什么。你也不必过于担心,面试官在考查的时候,还是会重点考查 iOS 相关的部分。

在知识足够宽泛的情况下,你需要首先和面试官明确问题的各种细节,比如假如题目是“设计一个类似微博的信息流应用”,你需要了解清楚这个信息流应用更多的技术要求,比如:

信息流的内容是否包括图片,文字,语音。

平均每个用户每天有多少的信息流更新量。

是否需要做图文混排。

是否需要做图片的缓存,历史信息的缓存。

断网情况下是否需要显示离线内容。

发送失败情况下是否需要暂存内容。

系统对核心功能的性能(例如发送,刷新)的要求是多少。

有一些技术细节可能是面试官想考查的,你问的时候他就会要求多一些;有一些技术方案明显很复杂的,你提出来,他即使不考查你,也会觉得你的考虑是足够周全的。

在确定技术细节要求后,你就可以开始讲你的系统架构设计了,这个时候讲的要诀是先框架,再细节。你需要先把各个模块的层次画出来,比如刚刚那道题目,你先介绍一下整体 App 是怎么和服务器通讯的,服务器端的信息流大概是如何存储的,然后你就需要详细介绍 App 的部分。

在介绍 App 的框架时,先画出 Model 层,Controller 层,View 层。然后再进一步细化,比如把 Model 层细化到本地存储,图片缓存,网络请求等模块。View 层如何处理图文混排,Controller 层如何与其它层通讯。

当框架介绍得差不多的时候,你需要把后续的选择交给面试官。面试官可能会选其中某一个模块,让你做更细一步的设计。比如让你设计网络通讯的 RESTful 接口,细化缓存相关的 API 名字。面试官甚至可能选一两个具体的函数,让你写写。面试官也可能进一步挑战你的一些设计细节,这个过程中,你可能需要修正自己的设计,也可能需要解释你的设计。

系统设计题的架构


5.复盘

复盘是一个人持续提高和进步的源泉。也许你觉得你的面试表现很好,但是为什么面试没有通过呢?当你被拒的时候,与其抱怨面试官或者面试流程不公正,倒不如静下心来想一想,看看是不是自己忽视了某些细节或者关键点。如下图所示:

复盘流程

除了复盘算法和系统设计题,也需要复盘一下自己整体的面试流程是否表现正常。例如:

(1)我的自我介绍是否流利?

(2)我的项目沟通是否介绍清楚了?

(3)面试官有没有完全理解我介绍的项目挑战?

(4)我的时间控制是否到位?

(5)我有没有迟到,中途接电话,或者任何被认为不礼貌的行为?

(6)我做得不好的地方,有没有短期可以改善的?

(7)我做得不好的地方,短期不能改善的,我能不能用别的方式适当弥补?比如面试中强调自己的强项。

每次面试后,做一个小结,可以使得自己每次都会有一点点进步,几十场面试下来,相信大家都会有不小的成长。

上一篇下一篇

猜你喜欢

热点阅读