每个JavaScript工程师都要知道的10个面试题
对大部分公司来说,招聘技术人员这种事情,管理层就应该放手交给技术团队,只有他们才能够准确地判断应聘者的技术实力。如果你恰巧是应聘者,你也是迟早都要去面试的。不管你是哪边的,都让大哥来教你几招。
以人为本
在 How to Build a High Velocity Development Team 一文中,我提出了一些观点,我觉得这些观点很重要,所以在这里再重复一遍:
优秀的团队才是决定公司业绩的关键,一家公司要想于逆境之中仍能有所建树,最重要的就是得先培养出一只优秀的团队。
就像 Marcus Lemonis 说的,有三点(3 个 P)最重要:
员工(People),流程(Process),产品(Product)。在创业初期,你招来的工程师必须是能够独当一面的大神队友。他最好能够帮着招聘工程师,能指导其它工程师,还能帮初级和中级工程师解决各种问题。这样优秀的队友,无论何时都多多益善。
要想知道面试应聘者时,有哪些常见的注意事项,可以读读 Why Hiring is So Hard in Tech 这篇文章。
要评估一个应聘者的真实水准,最佳方式就是结对编程(pair programming)。和应聘者结对编程,一切都听应聘者的。多观察、多聆听,看看应聘者是个怎样的人。用微博的 API 抓取消息并显示在时间线上,就是个很好的考察应聘者的面试项目。
不过结对编程再好使,也没办法让你完全了解一个应聘者。这个时候,面试也能帮上很多忙——但是千万别浪费时间去问一些语法(syntax)或者语言上的细节(language quirks)——问些高端的问题吧,大兄弟。问问项目架构(architecture),编程范式(paradigms),这个层面上的判断(the big desicions)能够在很大程度上影响一个项目的成败。
语法和语言特性(features)这种小知识,Google 一搜一大把,谁都会。而工程师在工作中所积累的软件工程方面的经验,以及个人常用的编程范式及代码风格(idioms),这些可都是很难 Google 到的宝贵财富。
JavaScript 很独特,它在各种大型项目中都起着至关重要的作用。那是什么让 JavaScript 如此与众不同?
下面几个问题,也许能帮你一探究竟。
1. 能说出来两种对于 JavaScript 工程师很重要的编程范式么?
JavaScript 是一门多范式(multi-paradigm)的编程语言,它既支持命令式(imperative)/面向过程(procedural)编程,也支持面向对象编程(OOP,Object-Oriented Programming),还支持函数式编程(functional programming)。JavaScript 所支持的面向对象编程包括原型继承(prototypal inheritance)。
面试加分项
- 原型继承(即:原型,OLOO——链接到其它对象的对象);
- 函数式编程(即:闭包(closure),一类函数(first class functions),lambda 函数:箭头函数)。
面试减分项
- 连范式都不知道,更别提什么原型 OO(prototypal oo)或者函数式编程了。
深入了解
- The Two Pillars of JavaScript Part 1:JS 两大支柱之一:原型 OO
- The Two Pillars of JavaScript Part 2:JS 两大支柱之二:函数式编程
2. 什么是函数式编程?
函数式编程,是将数学函数组合起来,并且避免了状态共享(shared state)及可变数据(mutable data),由此而产生的编程语言。发明于 1958 年的 Lisp 就是首批支持函数式编程的语言之一,而 λ 演算(lambda calculus)则可以说是孕育了这门语言。即使在今天,Lisp 这个家族的编程语言应用范围依然很广。
函数式编程可是 JavaScript 语言中非常重要的一个概念(它可是 JavaScript 的两大支柱之一)。ES5 规范中就增加了很多常用的函数式工具。
面试加分项
- 纯函数(pure functions)/函数的纯粹性(function purity)
- 知道如何避免副作用(side-effects)
- 简单函数的组合
- 函数式编程语言:Lisp,ML,Haskell,Erlang,Clojure,Elm,F#,OCaml,等等
- 提到了 JavaScript 语言中支持函数式编程(FP)的特性:一类函数,高阶函数(higher order functions),作为参数(arguments)/值(values)的函数
面试减分项
- 没有提到纯函数,以及如何避免副作用
- 没有提供函数式编程语言的例子
- 没有说是 JavaScript 中的哪些特性使得函数式编程得以实现
深入了解
- The Two Pillars of JavaScript Part 2:JS 两大支柱之二:函数式编程
- The Dao of Immutability
- Composing Software
- The Haskell School of Music
3. 类继承和原型继承有什么区别?
类继承(Class Inheritance):实例(instances)由类继承而来(类和实例的关系,可以类比为建筑图纸和实际建筑