想雇到搞软件开发的聪明人可不容易 。万一一不小心,就会搞到一堆低能大狒狒。我去年就碰到这种事了。你肯定不想这样吧。听我的,没错。在树上开站立会议门都没有。
问点有难度的问题 能帮你把聪明人跟狒狒们分开。我决定把我自己整理出来的软件开发者面试百问 发出来,希望能帮到你们的忙。
这个列表涵盖了软件开发知识体系 中定义的大多数知识域。当然,如果你只想找出类拔萃的程序员,便只需涉及结构、算法、数据结构、测试这几个话题。如果想雇架构师,也可以只考虑需求、功能设计、技术设计这些地方。
不过不管你怎么做,都要牢记一点:
这里大多数问题的答案都没有对错之分!
你可以把我的这些问题作为引子,展开讨论。 例如下面有个问题是使用静态方法或是单例的缘由。如果那个面试的就此展开长篇大论,那他很有可能是个聪明能干的家伙!如果他一脸茫然的看着你,发出这种声音 ,很明显这就是只狒狒了。同样,想知道一个数是不是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,这三者之间有哪些区别?
- 如果客户想要的东西太多,你在范围和时间上怎样跟他达成一致呢?
译文来自: http://www.infoq.com/cn/articles/programmer-interview
译者 李剑 作者 Jurgen Appelo
阅读英文原文 :100 Interview Questions for Software Developers 。
Hiring smart software developers is not easy. If you're not careful you might end up hiring a bunch of moronic mandrills, like I did last year. And you don't want that. Trust me. Stand-up meetings are very hard to do in a tree.
The key is to ask challenging questions that enable you to distinguish the smart software developers from the moronic mandrills. And to help you with that, I decided to publish my private list of 100 interview questions for software developers .
This list covers most of the knowledge areas as defined by the Software Engineering Body of Knowledge . Of course, if you're just looking for brilliant programmers, you may want to limit the topics to Construction , Algorithms , Data Structures and Testing . And if you're looking for architects, you can just consider the questions under the headings Requirements , Functional Design and Technical Design .
But whatever you do, keep this in mind:
For most of the questions in this list there are no right and wrong answers !
My questions are simply starting points for interesting discussions . For example: there is a question about reasons to use static methods vs. singletons . If this triggers your candidate to start a tirade againt both static methods and singletons, there's a good chance you're dealing with a smart software developer! But if the candidate can produce nothing more than a blank stare and this sound , then he might very well be a moronic mandrill. Likewise, there are many correct ways to find out whether a number is a power of 2. But if the candidate suggests using the mod operator, well... you know what I mean. (And if you don't, no problem. Fancy a banana?)
Requirements
- Can you name a number of non-functional (or quality) requirements?
- What is your advice when a customer wants high performance, high usability and high security?
- Can you name a number of different techniques for specifying requirements? What works best in which case?
- What is requirements tracing? What is backward tracing vs. forward tracing?
- Which tools do you like to use for keeping track of requirements?
- How do you treat changing requirements? Are they good or bad? Why?
- How do you search and find requirements? What are possible sources?
- How do you prioritize requirements? Do you know different techniques?
- Can you name the responsibilities of the user, the customer and the developer in the requirements process?
- What do you do with requirements that are incomplete or incomprehensible?
Functional Design
- What are metaphors used for in functional design? Can you name some successful examples?
- How can you reduce the user's perception of waiting when some functions take a lot of time?
- Which controls would you use when a user must select multiple items from a big list, in a minimal amount of space?
- Can you name different measures to guarantee correctness of data entry?
- Can you name different techniques for prototyping an application?
- Can you name examples of how an application can anticipate user behavior?
- Can you name different ways of designing access to a large and complex list of features?
- How would you design editing twenty fields for a list of 10 items? And editing 3 fields for a list of 1000 items?
- What is the problem of using different colors when highlighting pieces of a text?
- Can you name some limitations of a web environment vs. a Windows environment?
Technical Design
- What do low coupling and high cohesion mean? What does the principle of encapsulation mean?
- How do you manage conflicts in a web application when different people are editing the same data?
- Do you know about design patterns? Which design patterns have you used, and in what situations?
- Do you know what a stateless business layer is? Where do long-running transactions fit into that picture?
- What kinds of diagrams have you used in designing parts of an architecture, or a technical design?
- Can you name the different tiers and responsibilities in an N-tier architecture?
- Can you name different measures to guarantee correctness and robustness of data in an architecture?
- Can you name any differences between object-oriented design and component-based design?
- How would you model user authorization, user profiles and permissions in a database?
- How would you model the animal kingdom (with species and their behavior) as a class system?
Construction
- How do you make sure that your code can handle different kinds of error situations?
- Can you explain what Test-Driven Development is? Can you name some principles of Extreme Programming?
- What do you care about most when reviewing somebody else's code?
- When do you use an abstract class and when do you use an interface?
- Apart from the IDE, which other favorite tools do you use that you think are essential to you?
- How do you make sure that your code is both safe and fast?
- When do you use polymorphism and when do you use delegates?
- When would you use a class with static members and when would you use a Singleton class?
- Can you name examples of anticipating changing requirements in your code?
- Can you describe the process you use for writing a piece of code, from requirements to delivery?
Algorithms
- How do you find out if a number is a power of 2? And how do you know if it is an odd number?
- How do you find the middle item in a linked list?
- How would you change the format of all the phone numbers in 10,000 static html web pages?
- Can you name an example of a recursive solution that you created?
- Which is faster: finding an item in a hashtable or in a sorted list?
- What is the last thing you learned about algorithms from a book, magazine or web site?
- How would you write a function to reverse a string? And can you do that without a temporary string?
- What type of language do you prefer for writing complex algorithms?
- In an array with integers between 1 and 1,000,000 one value is in the array twice. How do you determine which one?
- Do you know about the Traveling Salesman Problem?
Data Structures
- How would you implement the structure of the London underground in a computer's memory?
- How would you store the value of a color in a database, as efficiently as possible?
- What is the difference between a queue and a stack?
- What is the difference between storing data on the heap vs. on the stack?
- How would you store a vector in N dimensions in a datatable?
- What type of language do you prefer for writing complex data structures?
- What is the number 21 in binary format? And in hex?
- What is the last thing you learned about data structures from a book, magazine or web site?
- How would you store the results of a soccer/football competition (with teams and scores) in an XML document?
- Can you name some different text file formats for storing unicode characters?
Testing
- Do you know what a regression test is? How do you verify that new changes have not broken existing features?
- How can you implement unit testing when there are dependencies between a business layer and a data layer?
- Which tools are essential to you for testing the quality of your code?
- What types of problems have you encountered most often in your products after deployment?
- Do you know what code coverage is? What types of code coverage are there?
- Do you know the difference between functional testing and exploratory testing? How would you test a web site?
- What is the difference between a test suite, a test case and a test plan? How would you organize testing?
- What kind of tests would you include for a smoke test of an ecommerce web site?
- What can you do reduce the chance that a customer finds things that he doesn't like during acceptance testing?
- Can you tell me something that you have learned about testing and quality assurance in the last year?
Maintenance
- What kind of tools are important to you for monitoring a product during maintenance?
- What is important when updating a product that is in production and is being used?
- How do you find an error in a large file with code that you cannot step through?
- How can you make sure that changes in code will not affect any other parts of the product?
- How do you create technical documentation for your products?
- What measures have you taken to make your software products more easily maintainable?
- How can you debug a system in a production environment, while it is being used?
- Do you know what load balancing is? Can you name different types of load balancing?
- Can you name reasons why maintenance of software is the biggest/most expensive part of an application's life cycle?
- What is the difference between re-engineering and reverse engineering?
Configuration Management
- Do you know what a baseline is in configuration management? How do you freeze an important moment in a project?
- Which items do you normally place under version control?
- How can you make sure that team members know who changed what in a software project?
- Do you know the differences between tags and branches? When do you use which?
- How would you manage changes to technical documentation, like the architecture of a product?
- Which tools do you need to manage the state of all digital information in a project? Which tools do you like best?
- How do you deal with changes that a customer wants in a released product?
- Are there differences in managing versions and releases?
- What is the difference between managing changes in text files vs. managing changes in binary files?
- How would you treat simultaneous development of multiple RfC's or increments and maintenance issues?
Project Management
- How many of the three variables scope, time and cost can be fixed by the customer?
- Who should make estimates for the effort of a project? Who is allowed to set the deadline?
- Do you prefer minimization of the number of releases or minimization of the amount of work-in-progress?
- Which kind of diagrams do you use to track progress in a project?
- What is the difference between an iteration and an increment?
- Can you explain the practice of risk management? How should risks be managed?
- Do you prefer a work breakdown structure or a rolling wave planning?
- What do you need to be able to determine if a project is on time and within budget?
- Can you name some differences between DSDM, Prince2 and Scrum?
- How do you agree on scope and time with the customer, when the customer wants too much?