本内容来自极客时间《面试现场》专栏,作者白海飞

引入

对于程序员职位的面试,技术问题所占比重非常大。技术问题回答的质量,就决定了面试的成败。除了面试以外,还有很多讲技术的场景,比如和同事讨论技术问题,选择技术方案,都是在讲技术。

你可能会疑惑,把技术讲明白有什么难的,只要我懂就能讲明白。但事实并非如此,如果你给孩子辅导过作业,你就能体会那种对题目本身再明白 也无法解决问题的“抓狂”了。例子虽有点极端,但强调的是:给面试官讲明白技术,你不仅要懂技术,还要懂面试官。这一讲就从这两个方面出发,看看如何让面试官听到满意的答案,提高面试成功率

面试的水有多深?

我们先说说技术可以从哪些方面来讲,看看技术的水有多深。

技术是为了解决问题而产生的,本质上,技术就是解决问题的方法。问题的规模越大,难度越复杂,就要引入多种技术。这些技术组合搭配起来,构成该解决方案的一棵“技术树”。事实上,每一个分支和叶子都有多种可选的技术,随着更多的创新出现,这些分支和叶子也在演变,使得整体的方案在空间上和时间上,能更高效更节省地解决问题。我们对这些分支和叶子技术点的了解和运用,甚至对他们演变的推动,都体现了我们的经验和技能。

那么,针对一个技术领域。我们需要阐述哪些层面?作者认为可以分为两个维度,一个是技术的设计维度,另一个是技术的应用维度,图示如下

以Java中的多线程为例,分别认识下这两个维度。

1. 应用维度

应用维度主要从问题、技术规范、最佳实践和市场应用趋势这四个方面进行解释:

问题:从技术的应用维度看,首先考虑的是要解决什么问题,这是技术产生的原因。Java多线程之所以产生,就是因为要开打,并发使得程序的多种功能响应更快,用户体验更好。问题这一层,用来回答“干什么用”。

技术规范:接下来,技术被研发出来,人们怎么使用才能解决问题呢?这就需要遵循技术规范,可以理解为阅读技术使用说明书。在Java中,你可以实现Runnable接口、拓展Thread类来实现代码开发;同时,Java提供synchronized关键字,以及各种锁。来帮助你控制并发中的代码行为和衍生问题。这需要了解接口和关键字的使用规则和潜在影响,以及各功能的细微差别。比如, sleep() 和 wait() 的区别是什么, 为什么 wait() 需要在同步代码块内使用,而 sleep() 不需要。技术规范,回答的是“怎么用”的问题,反映了对该技术使用方法的理解深度

最佳实践:当我们把该技术运用到多种不同场景中,会发现同样的使用方法,会有不同的效果,这是因为问题的上下文发生了改变,该技术有不同的适应面。从而可能踩了很多坑,知道了该技术的“脾性”,从而总结出最佳实践。这缘于在不同应用场景中,对技术表现差异的比较和把握。最佳实践,回答的是“怎样能用好”的问题,反映了实践经验的丰富程度。一个最佳实践的总结可以是下面这样:

在多线程场景下实现锁来确保线程的同步,但是加锁、释放锁是个非常消耗资源的操作,没有获得锁的线程还需要进入阻塞状态,等待被唤醒。 如果多个线程的竞争并不激烈,可以考虑使用 CAS 的方式实现无锁的线程同步,线程可以一直运行,不用阻塞。但是使用 CAS 还需要考虑使用时间戳等方式来解决 ABA 问题。

市场应用趋势:随着技术生态的发展,应用问题的变迁,技术的应用场景和流行趋势会受到影响。对于Java而言,从低并发逐渐发展到高并发,如何充分利用系统的能力并减少响应时间变得非常重要。这一层回答的是“谁在用,用在哪”的问题,反映了我们对技术应用领域的认知宽度。

2. 设计维度

应用维度是从外部看技术的应用,那么从内部我们能看到技术的哪些层次?

目标:为了解决用户的问题,技术本身要达成的目标。比如JAva多线程要在优先级调度、锁、信息同步等方面达到怎样的目标,才能更好地实现并发。这一层定义了“做到什么”

实现原理:为了叨叨设计目标,该技术采用了什么原理和机制。Java多线程的实现原理包括内核线程、使用用户态线程、使用用户态线程加轻量级进程混合等部分,还包括硬件指令集、Test and Set、各种锁等等。实现原理层,定义了“怎么做到”的问题。把实现原理弄懂并讲清楚,是技术人员的基本功。

优劣局限:每种技术实现,都有其局限性,在某些条件下能最大化发挥效能,缺少了某些条件则暴露出其缺陷。在Java多线程编程中,采用共享内存的方式,锁的开销较大,程序员的编程难度较大,就容易出错,难以调试。这一层回答的是“做的怎么样”的问题。对技术优劣莒县的把握,更有利于应用时总结最佳实践,是分析各种“坑”的基础。

演进趋势:技术是在迭代改进和不断淘汰的。了解技术的前生后世,分清技术不变的本质,和变化的脉络,以及与其他技术的共生关系,能体现你对技术发展趋势的关注和思考。这层体现的是“未来如何”。比如:

Java5 提供 jcu 包,实现了多种锁结构,简化开发;Java 7 加入 Future 来获取线程返回值;Go 语言中“协程”的概念,也被第三方引入,扩展了 Java 的多线程功能,比线程切换更快,性能得到了很大的提升。

总体来说,从技术内部(也就是设计维度)上看,包括目标、实现原理、优劣局限、技术演进趋势。而从技术外部看,也就是市场应用维度上看,包括问题、技术规范、最佳实践、市场应用趋势。它们是逐层递进的关系,代表了你对技术把握的深度

对于一项流行的技术,大部分可以讲清楚袁立鹤技术规范,也就是说能够搞懂它的工作原理和使用方法,这是技术人员的基本功。更上层的技术局限和最佳实践,只有经过深入的实践,甚至读源码,以及多场景的实践之后,才能讲出深刻的认识。对于最上层的趋势层,需要具有相当程度的“T”型技术体系,对相关技术有横向和总想的对比之后,才能总结出来,非常考验应聘者的知识面和洞见。

但是,如果有人恰好读过几篇有深度的技术文章,上面的某些层他也可能照本宣科地讲出来。那么让他和他区分开来的“杀手锏”就是技术实战:如果你在“最佳实践”部分中,能结合自己的项目经历,找到该技术的一个应用例子,特别是棘手的问题,讲清你是如何调优或者解决的,不仅会彰显你真实的技术水平,而且最有说服力,也是面试官最看重的。

讲到这,你可能要问:难道面试中每个技术问题,都要按照上面的两个维度八个方面去解释吗?不是的,你还需要弄懂面试官想听什么,能听什么,然后再按需呈现。下面就来谈一下如何弄懂面试官的需求。

你有多懂面试官?

只听懂面试官说得字面意思,不一定能给出面试官满意的答案。很多时候,应聘者并不能准确理解面试官想听的点。下面是几种情况及其解决方法:

  1. 问答双方角色不同(比如项目经历面试架构师的情况),思考角度不同,导致对同一个技术话题,展开的方向不同,自然理解上会发生分歧。工程思维的人想的是如何得到结果,可以着重讲技术内部维度的内容,而用户思维的人想的是那个结果可以用来什么,就要侧重到应用维度上了。
  2. 问答双方的知识结构和知识水平不一样,理解深度和宽度不同。可能你觉得小儿科的知识,对方却完全听不懂。这就需要了解对方的技术水平,采用适当的技术语言或业务语言来表达。不要满嘴都是你用专用的术语或缩写,谁知道你说的“FID” “CPS”代表什么呢?
  3. 上下文理解不同,面试官的问题意图不能够被应聘者所理解。面试官的问题之间或多或少是有联系的,你需要根据问题的上下文,结合前面回答中面试官的语言或者肢体反馈,分析他的意图,搞清楚他是在问“为什么”,还是“是什么”,或者“怎么用”,从而调整要表达的内容。
  4. 面试官没有问清楚。比如,“请你解释一下HTTPS”,这样的提问就不够具体,原因可能是面试官怕问到你能力临界点之外,但也可能是他本身就没把问题想清楚。

因此,遇到问题不清楚的时候,你需要从面试官的语言和关注点之上,推测他的角色、知识结构、沟通风格,会议最近几个问题的关系,来推测问题的意图。如果推测不出来,就直接问他。通过问题,来确定要讲的内容。这里的要点是 “充分沟通”,否则可能讲半天,对方还是不明白。自顾自地讲高深的内容,效果不一定好。

注意表达方法

回答提问时还应注意选用的表达方法,展示你的表达能力。这里。我们看一些专栏作者的建议

  1. 结构化表达,帮助面试官数理信息逻辑,可以用列表或结构化的语言需要“第一……第二……”,这一方面,读一读《金字塔原理》可能会有所帮助。
  2. 可视化,用画图或演示的方法,直观形象地表达复杂的技术问题。
  3. 举例子和做类比。举常见的例子,类比成常见的事物,把高深的技术原理说简单,不仅能让对方听懂,还会让他赞赏你的表达能力。
    把内容说简短很不容易。马克 · 吐温曾给读者回信说:我没有时间给您写封短信,所以就写了封长信。把内容陈列出来容易,但是长话短说很难。需要你深刻理解本质,区分每块内容的重要等级,再梳理逻辑和分析取舍。
  4. 对比。把不同的技术进行对比,突出自己采用技术的专业性和独特性。电影《无双》中郭富城讲作画的工艺时讲两种油墨的对比就是一个例子。
  5. 讲故事。如果能找到一段相关的经历,讲述该技术的应用或学习细节,展示学以致用的能力,效果会很好。你可以说“这个技术,我上个月刚好在某某项目上用过,当时的情况是……”

灵活运用上述方法,可以让表达效果事半功倍。以上这些表达方法,不仅适用于技术,在其他专业问题上,也同样见效。但请注意,回答时还是要留意详略,如果在某一问题上纠缠太久,会影响后面知识点的考查。你需要边讲边注意面试官的反应,如果有看表、看简历等厌倦或着急的情绪信号,就要赶紧调整到下一点。

总结

总结一下本讲的内容,作者提到了讲技术问题讲明白的两个重点:把握技术的维度和如何更懂面试官。使他更满意你的回答。

  • 在听到技术问题时,第一步先快速在脑子里整理一下“两个维度八个方面”的内容,即:外部应用维度,包括问题、技术规范、最佳实践、市场应用趋势;内部设计维度,包括目标、实现原理、优劣局限、技术演进趋势。
  • 第二步确认面试官想听什么内容,这需要通过对他的角色、知识结构、问题上下文,以及问题意图来领会,或者一个简单的方法是直接询问。
  • 第三步选用合适的表达方法,将面试官感兴趣的部分讲出来。讲的过程中,要注意和他积极交互,根据反馈调整自己的详略和表达方式。这里,结合自己的详历(见“12 经历没有价值可讲?你需要做份详历”),讲技术的应用细节和最佳实践,更容易满足面试官的期待。

总之,把一个复杂的技术问题,深入浅出地讲明白,非常考验你对技术的理解深度,以及表达能力。我们需要通过平时对技术的积累,和表达能力的锻炼来不断提高。

思考

回想最近项目中遇到的一些技术问题,选一个技术点,用上文提到的

results matching ""

    No results matching ""