paulwong

面试软件设计人员的方法,附面试题(转)

前段时间招聘。因为我一直在我的部门推行一些有效却被绝大多数中国公司忽视的开发理念,比如平级人事结构、测试驱动开发、制度化绩效、设计先行、迭代开发等等,所以招软件设计师非常困难。最终问题还算解决了吧。以下是我的面试总结。 



  一般来说,作为迎接面试的人,我会借着询问路况、接引进会议室或者索要简历,来表达出自己的礼貌,让对方有一定紧张感。这样我认为有利于对方表现出自然状态的思路。 

  然后我会根据简历,大概咨询下对方工作中所做过的设计工作。因为我在招软件设计师,所以只问设计,看看他对设计的理解是什么样子。通过这种询问,可以考察对方的简历是否作假,如果作假那么无法明确讲述其过往工作。还需要看对方的表达能力,即主动展现自己思路的能力。按照我这一批面试的人看,大多数人会讲述其项目经历的业务或者架构。只有一个人能够把软件设计和架构设计、软件开发分离出来。 

  然后就会开始做面试题了。面试题附在下边。我会先让其看第一大题,设计能力,请ta选择一道题目作答。看题之后,对方一般会陷入思考沉默。那么根据对方眼神不再在题目间扫动,表示对方已经针对某一个题目思考。当然,如果是沟通能力好的人,这这之前会主动告诉我,ta准备作答哪道题目。此时需要打断沉默,对对方说,希望对方谈一谈想法,任何一点想法都可以说出来。这个时候如果对方能够针对题目问一些具体没表示明白的细节,或者自行设定细节,都表明此人沟通能力极好,否则应该认为其沟通能力打折扣。
 

  当对方陆陆续续讲述自己的设计时,作为面试的人,需要指出其没有思考到的地方,或者赞扬对方想的很合理。一般来说,面试的人在经历了之前的客套和紧张之后,不太容易沉下心来仔细思考。凡是这时候依然能保持有序高效的思考能力,说明这个人抗压能力极强,至少是心理调节能力极好。通过这时的回答,就可以看出此人对设计是否了解,设计能力怎么样。
 

  以 1.1 为例,我随便说几个要点。比如说,我们应该抽象出牌局状态这么一个类,作为传输给每一个玩家的内容。比如说,我们可以抽象出一张牌这么一类,作为出牌的玩家上报的内容。比如说,此场景应该有一个短连接请求处理类,还应该有一个房间控制类;房间控制类里边维护一个个开通的房间;当每一个进入房间的请求来临时,都应该通过房间控制类,将连接转移到这个对应的房间编号;那么房间编号可以由客户端通过参数传递上来。比如说,每一个房间能够维护一组长连接,这可以开一个线程来处理;线程由一个单例的线程维护器对象来启动。比如说,房间在新线程中执行的代码,应该是轮询每个长连接看谁发来了“牌”,然后调用数据计算模块,通过牌和原有牌局(保存在房间对象里),得到新牌局,发送给每一个连接。当然了,如果能对断链识别什么的做出设计就更好了。不过控制此题时间不要超过 10 分钟,所以一般不可能讲述出太多内容。
 

  接下来,要根据刚才设计方面的能力,中转到 2 或者 3 。如果设计能力不错,则应该转移到 3 ;如果设计能力不好,则应该转移到 2 。这个设计能力的好不好,是根据面试者觉得达标不达标,够用不够用来说的。
 

  先来说说转到 2 编程能力测试的情况。首先,应让其在 2.1 和 2.2 中选一道作答。2.1 的要点,是建立合适的数据结构。最佳的是 money 与 id 双排序的基础对象构建的 TreeSet ,通过 NavigableSet 提供的子树功能,以 size() 获取名次。自己前后几位可通过正反向迭代器取得。当然,也可以使用链表和散列集合的二重结构。这要慢不少,但是也还算在可接受范围内能实现功能。 

  此题非常多的面试者会联想到 SQL 的 order by 子句。问题是这些人应该设计不出合适的二维表结构,配合 SQL 实现想要的功能。如果面试者能够实现,那也至少算能够做出来一种实现,不应苛求。 

  2.2 我认为用二维表传统关系型数据库很合适。应该有二个表,一个是历史表,一个是实际操作记录表。每次受影响玩家登录,都会激活从实际操作记录表到历史记录表的总结过程;这是一种最小型的数据挖掘。受试者能够正确写出总结过程,能够正确写出读取历史表的合并过程,则是满分。
 

  编程过程测试,可以随时提供设计思路指导。旨在督促受试者利用短暂的面试时间,认真思考,发挥出最强的思维能力,以检测其通过自己思考解决问题的水平。如果能在不断的设计方案提示下,指出语句写法,则应该认为设计能力为零,但编程基本功很扎实。如果算法也需要提示,则认为编写程序的技能本身不好,但语言知识尚可。
 

  做完 2.1 和 2.2 其中一题,应准备查资料的条件,也就是连接互联网的浏览器,让其做第 3 题。如果其对 Java5.0 多线程类库非常了解,则认为此人关注技术新闻,有很强的技术敏感性和学习能力。否则则应通过观察其查资料选用关键词的方式、查看内容的耐心敏感度,来判断此人的学习能力和心性。至此,您应该对面试的人有了较全面的认识。推荐记录下来,以便比较不同的面试者,谁综合看来更适用。
 

  我们再来说说直接从 1 题转移到 3 题的情况。同样是 3.1 和 3.2 选做一题,来测试受试者的架构能力。以和设计能力测评同样的节奏进入互动,然后探寻受试者思路。架构的核心,在于指派分布,即指派哪些逻辑运行在什么地方,以及这些“地方”的布局方式。非常多的受试者无法分清软件设计和架构设计的区别。每当这个时候,面试官就应该主动给受试者讲述架构的含义,同时记录受试者不具备可用的架构工作经验,但应根据接下来的思路表现,来判断其架构见识、思路以及资质。 

  3.1 的要点在于网络存档应该与应用服务分离。应用服务做负载均衡的话,应制作单独的数据服务以支持网络存档。这样可以保证无论是运营后台还是玩家都能够看到全部的数据。如果受试者无法摆脱分区的概念,则应指出,运营后台页面,能够选择分区,每次选择,程序能够连接到不同区的数据服务。 

  3.2 首先这种全球性质或者打地理范围的系统,肯定要使用地域分流的域名服务(DNS)负载均衡。那么也需要建立专门的用户数据传输机制,以保证用户大范围移动物理位置之时,能够在对应区域取得自己的数据。为此,也就需要设置统一的数据中心,以登记不同区域的位置关系以及服务器地址。考虑到系统不可能一次性完成,使用能够自动加载的云基础结构,应该会是一个最合理的选择。
 

  通过架构测评,如果受试者能够展现出关于自由软件的很多知识,则说明此人在技术进步上有较高追求。架构这边如果用时很短,也就是受试者表示出了对架构的恐惧和放弃,应该认为受试者面对困难问题的解决决心坚韧程度打折扣。这时应将其引导至 2.3 题,以考察其通过查资料解决问题的水平和心性。面试完毕之后,您应该记录面试情况,以便比较不同的面试者,谁综合看来更适用。
 

  最后我想说一句。很多面试官都相信自己对受试者的感觉。其实面试流程的目的,就是通过流程,让受试者更多地表现自己,以丰富面试官的感觉,以防以偏概全、认识不足等情况发生。 



下边附面试题目 


1 设计能力(选做其一) 
---------- ---------- ---------- ---------- 
1.1 现有多人卡牌游戏,由用户根据场上情况出牌。玩家出的牌可被其它玩家看到。每一种游戏牌将会对场上局面造成某些影响。请设计本游戏服务器端关于数据传输部分;其它部分如需指明,也可以指出。 

1.2 现有某军事对战型网络游戏。架构设计安排在战斗发起之前,通过短连接方式进行信息处理。对战为一对一,对战开始之后,进行长连接,传输双方对军队控制的操作。请设计本游戏开始建立长连接以及传输操作数据部分的服务器程序。 


2 编程能力(2.1 和 2.2 选作其一) 
---------- ---------- ---------- ---------- 
2.1 数据结构 
有一种数据,结构是 

    id: 38, 
    name: "Shane", 
    money: 3010.50 

数据量大概有 100 0000 份。 
请你设计一种方式,能够支持以下要求。 

首先,需要能往已有数据集里边追加数据。如果 id 重复,则为修改。 
其次,需要得到某指定 id 对应的人,全部数据按照 money 排序,其所在的名次。此过程不能太慢。 
最后,能得到这个 id 对应的人,全部数据按照 money 排序,其名次的前、后几名的 name 。此过程不能太慢。 

2.2 逻辑 
一个社交游戏,玩家可以互相访问,并在访问时对对方进行某些操作。被访问的人在登录时统一接收上次登录到这次登录之间被访问的报告。 
获取记录通过 InteractSysRecord.INST.getRecord(int userId) 方法,获得一个 List<ActRecord> 。 
ActRecord 具有如下属性 
int fromUserId 
int toUserId 
Kind actKind 
int actEffect 
其中 Kind 是一个枚举,包括一些类型,比如“赠送礼金”、“伤害”、“偷钱”等。 

玩家获取的记录,需要按人整理。也就是说,在一个玩家登录之时,与其上次登录之间,某一另外玩家多次访问此玩家生成的多个 ActRecord ,应该合成一条。 

请编程完成记录整理。允许设计合理的 InteractSysRecord 结构。 

2.3 多线程(允许查资料,希望观点能独特、精辟、有实效) 
请简述 Java5.0 多线程框架的机制和要点 


3 架构能力(选做其一) 
---------- ---------- ---------- ---------- 
3.1 请为如下功能需求设计架构。文字或图示都行。 
现有某多客户端弱联网网络游戏,需要实现网络存档。请简述网络游戏存档的架构方案。注意,后台操作人员应该能任意查看、修改任何人的存档。要求说明设计理由。 

3.2 现有基于位置的移动网络游戏。在游戏界面中,当玩家离开自己实际位置之时,就会在游戏中受到一个吸引力,吸引游戏中的角色回到玩家现实中的位置。此吸引力随着距离增加而增加。所有的玩家在统一的世界地图上进行对战。请设计此网络游戏的架构方案。并说明设计理由。 
@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);

posted on 2012-11-07 21:50 paulwong 阅读(815) 评论(1)  编辑  收藏 所属分类: Project Management

Feedback

# re: 面试软件设计人员的方法,附面试题(转) 2012-11-09 10:48 Shane Loo LI

本文原作者,也就是我,来标明原文地址啦:

本文发表在 Shane 的技术博客
CSDN : http://blog.csdn.net/shanelooli/article/details/8155765
ITeye : http://surmounting.iteye.com/blog/1717879
开源中国: http://my.oschina.net/shane1984/blog/87480
51CTO: http://shanelooli.blog.51cto.com/5523233/1052248

另外,我最近参加了博客大赛,来给我投张票支持一下吧~
http://blog.51cto.com/contest2012/5523233  回复  更多评论   



只有注册用户登录后才能发表评论。


网站导航: