后端开发面试题
这篇文章翻译自一位外国友人的关于面试后端程序员的文章,我比较喜爱这篇文章。一是因为它极大的拓宽了我的视角,另一方面是其中的一些问题非常具有启发性。不仅对于面试者,对于面试官来说也是个不错的参考。于是迫不及待的翻译了一下,给各位看官做个参考。
这篇文章中,许多问题我并没有完全理解,所以翻译可能存在不准确的地方。如果有读者发现有一些翻译有误或者不好的地方,请不吝赐教。
原文参见 @arialdomartini 的: Back-End Developer Interview Questions
以下是原文翻译。
后端开发面试题
在面试的时候,我并不特别喜欢问一些技术性的问题。我更喜欢的方式是这样的: 和面试者坐在一起,看一些实际的代码,解决一些实际的问题。并且用一整天的时间,让团队所有成员轮流和面试者进行结对编程。虽然如此,但是一些技术问题仍然可以用来很好地启动一段有深度的谈话,能够让面试者和面试官相互都有更加深入的了解。
这个仓库包含了可以用来考核面试者的一系列后端面试题。但绝不是说,面试官必须用每个面试题来考核面试者(这样可能要耗费好几个小时)。根据你期望面试者拥有的技能,从这个列表中有选择的挑一些题目,可以帮助你在特定技能上考核面试者。
应当承认的是,这个项目的灵感来自于 @darcyclarke 的文章 Front-end Job Interview Questions
注意: 请记住,这些面试题中有许多问题是开放式的,能引导讨论一些有趣的问题。相比那些有直接答案的问题来说,这种问题能够让你对面试者的能力有更多的了解。再一次强调,我认为仅仅是问问题是不够的。要通过与面试者较长时间的结对编程来完成面试: 这是你们相互了解对方的风格和方法、让面试者了解未来工作的最佳手段之一。
通用问题: [↑]
开放式问题: [↑]
(注: 重复造轮子: Reinventing the wheel; 非我发明症:Not Invented Here Syndrome; 吃自己做出来的狗粮: Eating Your Own Dog Food)
设计模式相关问题: [↑]
(注: 迪米特法则:the Law of Demeter, 最少知识原则: the Principle of Least Knowledge)
译者注: "发送时要保守,接收时要开发"的原文是: "Be conservative in what you send, be liberal in what you accept",有点类似于“严于律己,宽于待人”的意味。
代码设计相关问题: [↑]
语言相关问题: [↑]
Cat
是一个
Animal
, 那么
TaskCare<Cat>
是一个
TakeCare<Animal>
吗?
web相关问题: [↑]
数据库相关问题: [↑]
SELECT * FROM table WHERE field = null
不能匹配空的字段?
非关系型数据库相关问题: [↑]
代码版本管理相关问题: [↑]
(注:集中式版本控制系统: Centralized Version Control Systems;分散式版本控制系统: Distributed Version Control Systems)
并发问题: [↑]
分布式系统相关问题: [↑]
软件生命周期和团队管理相关问题: [↑]
什么是敏捷(Agility)?
你是如何处理遗留代码(Legacy Code)的?
假设我是你们公司的CEO,请向我解释什么是看板,并且说服我在它上面投资。
敏捷(Agility)和瀑布(Waterfall)之间的最大区别是什么?
作为团队管理者,你对会议太多这个问题是如何处理的?
你会如何处理延期很长时间了的项目?
" 个体与交互重于过程和工具 "和" 客户协作重于合同谈判 "占了敏捷宣言(Agile Manifesto)的一半,谈论一下这两个观念。
如果你是你们公司的CTO,你会采取什么样的决策?
你觉得项目经理有用吗?
如果要你组织一个弹性工作制的开发团队(即没有强制工作时间的要求),并且假期制度是"按需休假",你会如何做?
你会如何管理一个人员流动非常高的团队?如何在不加薪的条件下说服团队成员不要离开?
除了代码之外,你最关注你的同事的哪3项素质?
关于代码,你最希望非技术人员能知道的的三件事是什么?
逻辑和算法相关问题: [↑]
rnd()
函数
软件架构相关问题: [↑]
面向服务架构(SOA)和微服务(Microservice)相关问题: [↑]
安全相关问题: [↑]
比尔盖茨式问题: [↑]
代码示例问题: [↑]
function hookupevents() {
for (var i = 0; i < 3; i++) {
document.getElementById("button" + i)
.addEventListener("click", function() {
alert(i);
});
ArrayList<Integer> li = new ArrayList<Integer>();
ArrayList<Float> lf = new ArrayList<Float>();
if (li.getClass() == lf.getClass()) // evaluates to true
System.out.println("Equal");
public class Stack {
private Object[] elements;
private int size = 0;
private static final int DEFAULT_INITIAL_CAPACITY = 16;
public Stack() {
elements = new Object[DEFAULT_INITIAL_CAPACITY];
public void push(Object e) {
ensureCapacity();
elements[size++] = e;
public Object pop() {
if (size == 0)
throw new EmptyStackException();
return elements[--size];
* Ensure space for at least one more element, roughly
* doubling the capacity each time the array needs to grow.
private void ensureCapacity() {
if (elements.length == size)
elements = Arrays.copyOf(elements, 2 * size + 1);
if
语句,或者更加通用点,条件表达式通常是过程式编程/命令式编程的形式。你能去掉这段代码中的switch
语句,用面向对象的方式来修改这段代码吗?public class Formatter {
private Service service;
public Formatter(Service service) {
this.service = service;
public String doTheJob(String theInput) {
String response = service.askForPermission();
switch (response) {
case "FAIL":
return "error";
case "OK":
return String.format("%s%s", theInput, theInput);
default:
return null;
if
语句,将它改成更加面向对象吗?public class TheService {
private final FileHandler fileHandler;
private final FooRepository fooRepository;
public TheService(FileHandler fileHandler, FooRepository fooRepository) {
this.fileHandler = fileHandler;
this.fooRepository = fooRepository;
public String Execute(final String file) {
final String rewrittenUrl = fileHandler.getXmlFileFromFileName(file);
final String executionId = fileHandler.getExecutionIdFromFileName(file);
if ((executionId == "") || (rewrittenUrl == "")) {
return "";
Foo knownFoo = fooRepository.getFooByXmlFileName(rewrittenUrl);
if (knownFoo == null) {
return "";
return knownFoo.DoThat(file);
function()
HRESULT error = S_OK;
if(SUCCEEDED(Operation1()))
if(SUCCEEDED(Operation2()))
if(SUCCEEDED(Operation3()))
if(SUCCEEDED(Operation4()))
error = OPERATION4FAILED;
error = OPERATION3FAILED;
error = OPERATION2FAILED;
error = OPERATION1FAILED;
return error;