1月13日,著名博客作者Jurgen Appelo写了一篇博文:“软件开发者面试百问”。该文甚受读者欢迎,15日便登上了delicious,Popurls.com,Reddit的首页。InfoQ中文站在得到作者许可之后,将其全文翻译为中文,希望可以对国内读者有所助益。
以下为文章全文
想雇到搞软件开发的聪明人可不容易。万一一不小心,就会搞到一堆低能大狒狒。我去年就碰到这种事了。你肯定不想这样吧。听我的,没错。在树上开站立会议门都没有。
问点有难度的问题能帮你把聪明人跟狒狒们分开。我决定把我自己整理出来的软件开发者面试百问发出来,希望能帮到你们的忙。
这个列表涵盖了软件工程知识体系中定义的大多数知识域。当然,如果你只想找出类拔萃的程序员,便只需涉及结构、算法、数据结构、测试这几个话题。如果想雇架构师,也可以只考虑需求、功能设计、技术设计这些地方。
不过不管你怎么做,都要牢记一点:
这里大多数问题的答案都没有对错之分!
你可以把我的这些问题作为引子,展开讨论。例如下面有个问题是使用静态方法或是单例的缘由。如果那个面试的就此展开长篇大论,那他很有可能是个聪明能干的家伙!如果他一脸茫然的看着你,发出这种声音,很明显这就是只狒狒了。同样,想知道一个数是不是2的乘方也有很多方法,不过要是面试的人想用mod运算符,嗯……你知道我的意思吧。(你不知道也没关系,来根香蕉?)
需求
- 你能给出一些非功能性(或者质量)需求的例子么?
- 如果客户需要高性能、使用极其方便而又高度安全,你会给他什么建议?
- 你能给出一些用来描述需求的不同技术么?它们各自适用于什么场景?
- 需求跟踪是什么意思?什么是向前追溯,什么是向后追溯?
- 你喜欢用什么工具跟踪需求?
- 你怎么看待需求变化?它是好是坏?给出你的理由。
- 你怎样研究需求,发现需求?有哪些资源可以用到?
- 你怎么给需求制定优先级?有哪些技术?
- 在需求过程中,用户、客户、开发人员各自的职责是什么?
- 你怎么对待不完整或是令人费解的需求?
功能设计
- 在功能设计中有哪些隐喻?给出几个成功的例子。
- 如果有些功能的执行时间很长,怎么能让用户感觉不到太长的等待?
- 如果用户必须要在一个很小的区域内,从一个常常的列表中选择多个条目,你会用什么控件?
- 有哪些方法可以保证数据项的完整?
- 建立系统原型有哪些技术?
- 应用程序怎样建立对用户行为的预期?给出一些例子。
- 如何入手设计一组数量庞大而又复杂的特性,你能举出一些设计思路吗?
- 有一个列表,其中有10个元素,每个元素都有20个字段可以编辑,你怎样设计这种情况?如果是1000个元素,每个元素有3个字段呢?
- 用不同的颜色对一段文本中的文字标记高亮,这种做法有什么问题?
- Web环境和Windows环境各有些什么限制?
技术设计
- 什么是低耦合和高聚合?封装原则又是什么意思?
- 在Web应用中,你怎样避免几个人编辑同一段数据所造成的冲突?
- 你知道设计模式吗?你用过哪些设计模式?在什么场合下用的?
- 是否了解什么是无状态的业务层?长事务如何与之相适应?
- 在搭建一个架构,或是技术设计时,你用过几种图?
- 在N层架构中都有哪些层?它们各自的职责是什么?
- 有哪些方法可以确保架构中数据的正确和健壮?
- 面向对象设计和面向组件设计有哪些不同之处?
- 怎样在数据库中对用户授权、用户配置、权限管理这几项功能建模?
- 怎样按照等级制度给动物王国(包括各种物种和各自的行为)建模?
程序设计
- 你怎样保证你的代码可以处理各种错误事件?
- 解释一下什么是测试驱动开发,举出极限编程中的一些原则。
- 看别人代码的时候,你最关心什么地方?
- 什么时候使用抽象类,什么时候使用接口?
- 除了IDE以外,你还喜欢哪些必不可少的工具?
- 你怎么保证代码执行速度快,而又不出问题?
- 什么时候用多态,什么时候用委派?
- 什么时候使用带有静态成员的类,什么时候使用单例?
- 你在代码里面怎么提前处理需求的变化?给一些例子。
- 描述一下实现一段代码的过程,从需求到最终交付。
算法
- 怎样知道一个数字是不是2的乘方?怎样判断一个数是不是奇数?
- 怎样找出链表中间的元素?
- 怎样改变10,000个静态HTML页面中所有电话号码的格式?
- 举出一个你所用过的递归的例子。
- 在散列表和排序后的列表中找一个元素,哪个查找速度最快?
- 不管是书、杂志还是网络,你从中所学到的最后一点算法知识是什么?
- 怎样把字符串反转?你能不用临时的字符串么?
- 你愿意用什么类型的语言来编写复杂的算法?
- 有一个数组,里面是从1到1,000,000的整数,其中有一个数字出现了两次,你怎么找出那个重复的数字?
- 你知道“旅行商问题(Traveling Salesman Problem)”么?
数据结构
- 怎样在内存中实现伦敦地铁的结构?
- 怎样以最有效的方式在数据库中存储颜色值?
- 队列和堆栈区别是什么?
- 用堆或者栈存储数据的区别是什么?
- 怎样在数据库中存储N维向量?
- 你倾向于用哪种类型的语言编写复杂的数据结构?
- 21的二进制值是什么?十六制值呢?
- 不管是书、杂志还是网络,你从中所学到的最后一点数据结构的知识是什么?
- 怎样在XML文档中存储足球比赛结果(包括队伍和比分)?
- 有哪些文本格式可以保存Unicode字符?
测试
- 什么是回归测试?怎样知道新引入的变化没有给现有的功能造成破坏?
- 如果业务层和数据层之间有依赖关系,你该怎么写单元测试?
- 你用哪些工具测试代码质量?
- 在产品部署之后,你最常碰到的是什么类型的问题?
- 什么是代码覆盖率?有多少种代码覆盖率?
- 功能测试和探索性测试的区别是什么?你怎么对网站进行测试?
- 测试套件、测试用例、测试计划,这三者之间的区别是什么?你怎么组织测试?
- 要对电子商务网站做冒烟测试,你会做哪些类型的测试?
- 客户在验收测试中会发现不满意的东西,怎样减少这种情况的发生?
- 你去年在测试和质量保证方面学到了哪些东西?
维护
- 你用哪些工具在维护阶段对产品进行监控?
- 要想对一个正在产品环境中被使用的产品进行升级,该注意哪些重要事项?
- 如果在一个庞大的文件中有错误,而代码又无法逐步跟踪,你怎么找出错误?
- 你怎样保证代码中的变化不会影响产品的其他部分?
- 你怎样为产品编写技术文档?
- 你用过哪些方式保证软件产品容易维护?
- 怎样在产品运行的环境中进行系统调试?
- 什么是负载均衡?负载均衡的方式有哪些种?
- 为什么在应用程序的生命周期中,软件维护费用所占的份额最高?
- 再造工程(re-engineering)和逆向工程(reverse engineering)的区别是什么?
配置管理
- 你知道配置管理中基线的含义么?怎样把项目中某个重要的时刻冻结?
- 你一般会把哪些东西纳入版本控制?
- 怎样可以保证团队中每个人都知道谁改变了哪些东西?
- Tag和Branch的区别是什么?在什么情况下该使用tag,什么时候用branch?
- 怎样管理技术文档——如产品架构文档——的变化?
- 你用什么侗剧管理项目中所有数字信息的状态?你最喜欢哪种工具?
- 如果客户想要对一款已经发布的产品做出变动,你怎么处理?
- 版本管理和发布管理有什么差异?
- 对文本文件的变化和二进制文件的变化进行管理,这二者有什么不同?
- 同时处理多个变更请求,或是同时进行增量开发和维护,这种事情你怎么看待?
项目管理
- 范围、时间、成本,这三项中哪些是可以由客户控制的?
- 谁该对项目中所要付出的一切做出估算?谁有权设置最后期限?
- 减少交付的次数,或是减少每个每个交付中的工作量,你喜欢哪种做法?
- 你喜欢用哪种图来跟踪项目进度?
- 迭代和增量的区别在哪里?
- 试着解释一下风险管理中用到的实践。风险该如何管理?
- 你喜欢任务分解还是滚动式计划?
- 你需要哪些东西帮助你判断项目是否符合时间要求,在预算范围内运作?
- DSDM、Prince2、Scrum,这三者之间有哪些区别?
- 如果客户想要的东西太多,你在范围和时间上怎样跟他达成一致呢?
相关推荐
"软件开发者面试百问.pdf" 软件开发者面试百问是一篇关于软件开发面试的文章,作者Jurgen Appelo总结了软件开发领域中的多个知识点,涵盖软件工程的多个方面,涉及需求、功能设计、技术设计、程序设计、算法、数据...
《软件开发者面试百问》是一份旨在帮助招聘者筛选优秀软件开发人才的面试问题集锦。这份资料覆盖了软件开发的多个重要方面,包括需求分析、功能设计、技术设计以及程序设计等。以下是对其中一些关键知识点的详细解读...
软件开发者面试百问 想雇到搞软件开发的聪明人可不容易。万一一不小心,就会搞到一堆低能大狒狒。我去年就碰到这种事了。你肯定不想这样吧。听我的,没错。在树上开站立会议门都没有。
【软件开发者面试百问】是一份旨在帮助招聘者筛选优秀软件开发者的面试问题集锦,覆盖了软件工程的多个知识领域。以下是对标题和描述中所述知识点的详细说明: 1. **需求分析**: - 非功能性需求:如性能、可用性...
《软件开发者面试百问》是针对软件工程领域面试的一个综合指南,旨在帮助招聘者筛选出优秀的程序员和架构师。这份清单覆盖了软件工程知识体系的多个关键领域,如需求分析、功能设计、技术设计和程序设计,同时也包含...
【标题】:“软件开发者面试一百问” 【描述】:这篇内容是关于软件开发者面试的一百个问题,旨在覆盖软件工程的各个知识领域,帮助招聘者筛选出具备专业技能的聪明人才,而非仅满足基础要求的应聘者。文章强调了...
以下是从“软件开发者面试百问.html”这个压缩包文件中可以提炼出的一些重要知识点,这些内容对于准备面试的开发者来说是非常有价值的。 1. **基础编程知识**:面试通常会从基础编程概念开始,如数据类型、变量、...
软件开发者面试中,经常会遇到各种技术与管理层面的问题,这些问题是评估候选人能力的重要标准。以下是对部分问题的详细解答: 1. 判断项目是否符合时间要求和预算,需要考虑的因素包括: - 业务复杂度:理解项目...
"软件开发面试百问"这一主题涵盖了面试中可能遇到的各类问题,旨在帮助求职者准备充分,展示出扎实的技术功底。以下是一些可能涉及的重要知识点: 1. **编程基础**:面试通常会从基础的编程概念开始,如变量、数据...
【C#开发者面试简历】 作为一位C#开发者,面试简历是展示个人技能和经验的关键工具。一份优秀的简历应该清晰地突出C#编程语言的专业技能,同时也应包含与软件开发相关的其他技术能力。以下是一些核心知识点,对于C#...
Java开发者和大数据开发者的面试知识点涵盖了许多领域,包括但不限于编程基础、Java核心技术、大数据处理框架、并发编程、数据库管理以及项目经验等。以下是对这些关键领域的详细解释: 1. **编程基础**:这是所有...
以下是一些关键的知识点,涵盖了应届毕业生和有经验的开发者可能遇到的面试挑战: 1. **自我介绍**: - 介绍自己时,不仅要提及教育背景,还要突出个人技能、项目经验以及与应聘职位相关的实践经验。 - 优点应与...
【全国软件公司面试题集锦】是一份涵盖了广泛IT领域知识的面试题库,旨在帮助求职者准备在软件公司的面试过程中可能遇到的问题。这份资源包含了各种技术层面的问题,包括但不限于编程语言、数据结构、算法、操作系统...
本资料包“嵌入式软件笔试面试题目大汇总.zip”包含了丰富的面试和笔试资源,旨在帮助求职者更好地准备相关面试。 首先,我们要关注的是“进程与线程”的概念。进程是操作系统中运行程序的实例,而线程则是进程中...
本压缩包文件"【软件测试面试题】软件测试面试常考题.zip"包含了一份PDF文档,很可能为准备软件测试职位面试的求职者提供了丰富的参考资料。以下是对软件测试面试常见知识点的详细阐述: 1. **测试基础概念**: - ...
### 重要知识点解析 #### 1. 兼容性测试及其侧重方面 - **兼容性测试**是指在...以上内容涵盖了软件测试领域的多个核心知识点,从兼容性测试到具体的测试工具使用方法,为面试准备提供了丰富的理论基础和实践经验。
软件测试面试问答大全 本文总结了软件测试面试中常见的问题,并对每个问题进行了详细的解释。涵盖了软件测试的基本概念、测试类型、测试方法、测试用例设计、测试过程等方面的知识点。 一、为什么要在一个团队中...