高级软件工程师的新面试问题

[原文发表地址] New Interview Questions for Senior Software Engineers

[原文发表时间] 11-02-17 11:27

 

我在帮一位失业的朋友汇总一些面试练习问题。亲爱的读者,我想如果能从你们那里收集一些问题的话会比较有用。

 

这些问题应该更多注重软件设计,而不太像我之前的两个面试问题列表那样关注技术细节。

 

伟大的.NET开发人员应该知道些什么(更多面试问题)

ASP.NET面试问题(你能相信吗?7年以前发表的)

 

更新: 我想我们都赞同假如你明天要去面试,看着桌子对面的面试官简单地将这份列表打印出来照着念,那么你就应该找个借口马上跑开。这既不是一个“如何面试的指南”,对我来说也不是一份“针对工程师的最佳实践”列表。 它仅仅是在软件开发行业为了薪水工作了差不多十年左右的人头脑里面应该比较熟悉的一些知识的集合。当然,假设面试官能够对BS明察。 这不是,也不应该是一个小型测试。如果你要去求职(或在雇人),归根结底更重要的还是明白对方是能解决问题的亦或是头脑僵化的。朋友们,请记住持保留态度吧,毕竟你们是在网上找到的。 - @ shanselman

 

下面是我目前所知道的。

 

在你作为一个开发人员的职业生涯中,什么是你所做过的能帮助你进步的实质性的东西?

你会称自己为软件开发者吗?那个词对你意味着什么?

在纸|白板|记事本上用<某种语言>实现一个<基本的数据结构>

什么是SOLID?

“单一职责原则”为什么重要?

什么是控制反转?那和依赖注入有什么关系?

三层应用程序和两层应用程序有什么区别?

接口为什么重要?

什么是存储库模式?工厂模式?模式为什么重要?

反模式的示例?设计模式的四人组包括哪些人?你为什么需要关心这个?

MVP、MVC、MVVM模式之间有什么关系?它们什么时候适用?

解释关注点分离的概念及其利弊

说出面向对象模式的三个主要属性。描述他们的含义并解释其为何重要。

叙述一个非工厂模式的模式?它是如何使用的?适用于什么时候?

你刚被授权管理一个有维护问题的遗留代码项目。 你会做些什么改进的事情来使项目的基础稳固?

给我展示你曾经做过的所有应用程序,并告诉我你在他们的设计中做了些什么。

除了关系数据库,有些什么别的替代方法来存储数据?为什么要那样做,你是怎样权衡利弊的?

解释惯例优先原则的概念,给出你在实际工作中见过的惯例优先原则的实例。

解释无状态系统(stateless system)和有状态(stateful systems)系统之间的差异,以及对并行状态的影响。

讨论Mocks和Stubs/Fakes之间的区别,以及你什么时候可能用到它们(在这里答案并不是那么重要,重要的仅仅是它所带来的讨论)。

讨论YAGNI的概念,解释最近你做过的和这个实践相关的事情。

解释沙盒(sandbox)的含义,以及你为什么要使用,并给出在实际工作中的例子。

并发

l 锁定和无锁(乐观和悲观)并发模型的区别是什么?

l 用锁定模型你会遇到些什么问题? 用无锁模型呢?

l 你需要为资源争夺做些什么权衡?

l 基于任务的模型和线程模型的区别是什么?

l 异步与并发的区别是什么?

你仍然在写代码吗?喜欢吗?你刚刚被分配到一个会用到新技术的项目,你会怎么开始呢?

面向服务的增补是如何改变系统的? 适合在什么时候使用?

你怎么与最新的技术和工具保持同步?

“集合”逻辑和“过程”逻辑的区别是什么? 你会在什么时候用到其中一个?为什么?

你用的是什么源代码控制系统?

什么是持续集成? 你用过吗?它为什么重要?

描述你曾经管理过的一种软件开发生命周期

对批评你的代码/文档的人你是什么反应?

你会关注谁的博客或播客?

你也发布自己的博客或播客吗?

告诉我一些你业余时间写的兴趣项目。

你最近看的编程书是什么?

尽可能详细地、深入地形容在浏览器里输入“cnn.com”点击“转至”之后会发生的事情。

形容一下设计文档的结构和内容,或针对多层Web应用程序的一系列设计文档。

<当代超酷的Web技术 >凭什么那么酷?

怎么防止数据库管理员窃走用户密码列表?

被一个解决不了的问题卡住了的时候你会做什么?

如果你的数据库性能很差,你会首先考虑做那几件事情来使它加速?

什么是SQL注入?

单元测试和集成测试的区别是什么?

告诉我你三次失败的经历。

什么是重构?你用过它吗?它重要吗?说出三种常见重构。

你有两台电脑,希望从一台往另一台获取数据。你会怎么做?

只有你自己的设备,你会创建什么?

有时间、成本、客户满意度和最佳实践,你会怎么在你开发的项目中区分它们的优先次序?

解释原因。

Web server、web farm和web garden的区别是什么?针对其中任何一个,你的web应用程序需要做些什么改动?

对项目来说,每日一个版本、自动化测试和同级评审的价值是什么?有什么缺点?面向对象设计的什么要素是最容易被滥用的?你怎么解决那个问题?

你知道什么时候你的代码为生产做好了准备?

什么是YAGNI(You Aren't Going to Need It)? 这个问题清单是例子吗?

形容一下你最近读过或使用过过的一些不好的代码。

 

你的想法呢? 我会每天从评论中挑选一些好的问题添加进来。