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. **基础编程知识**:面试通常会从基础编程概念开始,如数据类型、变量、...
软件开发者面试百问百答.doc
"软件开发面试百问"这一主题涵盖了面试中可能遇到的各类问题,旨在帮助求职者准备充分,展示出扎实的技术功底。以下是一些可能涉及的重要知识点: 1. **编程基础**:面试通常会从基础的编程概念开始,如变量、数据...
【C#开发者面试简历】 作为一位C#开发者,面试简历是展示个人技能和经验的关键工具。一份优秀的简历应该清晰地突出C#编程语言的专业技能,同时也应包含与软件开发相关的其他技术能力。以下是一些核心知识点,对于C#...
Java开发者和大数据开发者的面试知识点涵盖了许多领域,包括但不限于编程基础、Java核心技术、大数据处理框架、并发编程、数据库管理以及项目经验等。以下是对这些关键领域的详细解释: 1. **编程基础**:这是所有...
以下是一些关键的知识点,涵盖了应届毕业生和有经验的开发者可能遇到的面试挑战: 1. **自我介绍**: - 介绍自己时,不仅要提及教育背景,还要突出个人技能、项目经验以及与应聘职位相关的实践经验。 - 优点应与...
【全国软件公司面试题集锦】是一份涵盖了广泛IT领域知识的面试题库,旨在帮助求职者准备在软件公司的面试过程中可能遇到的问题。这份资源包含了各种技术层面的问题,包括但不限于编程语言、数据结构、算法、操作系统...
本资料包“嵌入式软件笔试面试题目大汇总.zip”包含了丰富的面试和笔试资源,旨在帮助求职者更好地准备相关面试。 首先,我们要关注的是“进程与线程”的概念。进程是操作系统中运行程序的实例,而线程则是进程中...
在这一背景下,逻辑思维能力的培养显得尤为关键,它已成为软件开发者在面试中脱颖而出以及在工作中提高效能的重要工具。 逻辑思维,简单来说,是指个体运用逻辑规则和方法对事物进行分析、推理、判断的思维活动。...
本压缩包文件"【软件测试面试题】软件测试面试常考题.zip"包含了一份PDF文档,很可能为准备软件测试职位面试的求职者提供了丰富的参考资料。以下是对软件测试面试常见知识点的详细阐述: 1. **测试基础概念**: - ...
### 重要知识点解析 #### 1. 兼容性测试及其侧重方面 - **兼容性测试**是指在...以上内容涵盖了软件测试领域的多个核心知识点,从兼容性测试到具体的测试工具使用方法,为面试准备提供了丰富的理论基础和实践经验。