面试实战.docx
《面试实战.docx》由会员分享,可在线阅读,更多相关《面试实战.docx(28页珍藏版)》请在冰点文库上搜索。
面试实战
面试过程:
10:
00到公司,前台MM给了张面试人员登记表,10分钟搞定表格。
10:
30由于公司BOSS正在面试其他人,因此,又等了几分钟。
10:
40在BOSS办公室与BOSS斗智斗勇,聊了有接近1个小时。
疯狂的笔试+面试记录(前方内容“高能”:
funk:
,请准备高度精神集中前行):
1.笔试
由于BOSS正在打造公司新业务,刚刚开始组建公司技术团队,公司没有人懂IT技术,故本次面试
没有笔试题,额。
。
。
2.面试过程问答精选:
旁白:
进入办公室后,我淡定等待,约莫几分钟后,一位35岁左右,看起来非常老道的BOSS走了进
来。
几句寒暄之后,问了我一些关于我的学校、专业、工作经验、接触的Android项目等普通流水线式
的没有营养问题,轻松搞定!
接着,BOSS终于切入到了重点:
BOSS问:
其实我们想做一个快递业务的APP,类似于滴滴打车。
用户如果想要寄快递,只需要打开
APP,查找附近都有哪些快递员,然后直接跟附近的快递员联系。
如此,既能方便用户,又能提高快递
员的收入。
我()答:
我有一个问题想要问一下,咱们公司(注意,一定要说“咱们”,让别人感觉你已经融
入他们的公司团队了)不像顺丰,不是典型的物流公司,为什么我们要做快递类的APP呢(主动沟通
交流,有问题就问,这样面试官才能跟你聊起来!
)?
BOSS答:
你知道的那些物流公司现在都是各自为政。
例如,你用顺丰快递,你可以下载个顺丰的APP。
但是,你以后可能还要用中通、申通、圆通等等这些物流公司,难道你要下载十几个APP吗?
而我们
要做通用的快递类APP!
BOSS问:
你知道一个APP重要的是什么吗?
答:
用户体验!
BOSS说:
不对,是流量,也就是用户数量(好吧,作为技术屌丝,关注多的就是APP用户体验,
所以,不敢去反驳他,先顺着他的意思来)。
BOSS问:
如果让你去做一个类似于滴滴打车的APP,你认为自己做的出来吗?
我()答:
像滴滴打车这样的APP,不仅仅只是客户端的问题。
它不是由几个简单的客户端程序员
就能做出来的,实际上,它应该是由一个技术团队完成的大型项目。
您目前能够看得见的仅仅是用户客
户端,看不见的是庞大的后台系统。
说详细点就是:
滴滴打车这样的项目应该分3部分:
服务器端,用
户客户端,出租车司机客户端。
服务部端考虑的是数据的存储,业务的调度处理,以及与各个客户端的
数据交互。
而用户客户端我个人理解主要是一个UI的显示和与用户数据交互的功能。
比如,用户将自
己的当前坐标发送到服务器端(当前坐标可以通过XX地图、高德地图获取),服务器根据用户的坐标
查找附近的所有空闲状态的出租车,然后将用户的用车需求推送到出租车司机客户端端。
出租车司机接
收到信息后,如果愿意接这笔单子,就向服务器发送同意信息。
服务器就是作为一个中介将用户与出租
车司机联系起来。
大概逻辑就是这样一个过程,中间的技术细节比较多。
总之,一个人做滴滴打车是不
太现实的(大家可以看出来,这一段,是傻瓜式教学,没有说的太复杂,好让BOSS能够听明白。
不然,技术说的太深,BOSS就不知道说什么了,还怎么聊的开心。
面试的最终目的就是让对方觉得看
你很顺眼,这是关键!
)。
(顺便啰嗦一下,的Android课程中有部分JavaWEB课程。
我们做为APP开发人员,不管是服
务器端还是移动端都应该有所了解。
如果仅仅会移动端开发技术而不懂服务端知识,长久看来,确实会
很影响Android程序员向更高层次发展。
)
BOSS问:
那么,如果我让你负责客户端的开发呢?
我()答:
客户端Android开发并不难,比如支付宝是一个很强大的金融系统。
但是,你让我做它
的Android端开发,我感觉我没问题。
毕竟,Android客户端重点是信息的展示和与用户的交互。
所
以一个人做客户端是没有问题的。
但是,目前市场上的企业很少有一个人做一个客户端项目的。
市场竞
争如此激烈,一个人做耗时太长,可能你还没有做出来,产品已经被淘汰了。
因此,应该多招几个Android
程序员,这样团队就算有人员流失也不会影响整个公司的发展(展示自己对于项目组人数把控的个人看
法)。
旁白:
几轮PK下来,BOSS基本上对我已经很信服了。
BOSS说:
其实,在面试你之前,我已经招聘到了两个移动开发的程序员,一个是Android程序员(6K),
一个是iOS程序员(8K),你可以看一下他们两个的面试登记信息和他们的简历。
我()问:
根据这两份简历可以看出来,这两个人的技术有些一般(不是装逼,他们的简历写的确
实有点LOW)。
BOSS问:
是的,我看的出来,你的经验要比他们丰富地多。
所以,我准备让你出任我们公司的技术总
监,带着他们两个做客户端开发,你认为你有信心做好吗?
我()答:
这个职位我以前没有做过,所以心里没有多大的底(认为这样的问题确实比较考验
人,你直接回答“可以,没问题”,就会显得你浮夸、不谨慎、办事不牢靠。
如果你直接回答“不能”,
又显得你不敢担当,没有上进和挑战的精神。
因此回答这样的问题必须两者兼顾,既要谦虚谨慎又要表
现出富有挑战精神)。
BOSS说:
我知道你没有做过,但是,一个人挑战任何一样新工作之前都是没有做过的。
你有没有想过
一旦你能够胜任我们的公司的技术总监,你以后的身价将和现在完全不同,所以,对自己要有一些信心
(BOSS故意画大饼,就说明你有戏了!
)。
当然,这是一个管理岗位,需要什么样的技术人员你可以
招。
我()说:
好吧,其实我希望挑战一下,但是我不一定能够达到您对我那么高的期望(始终保持谦
虚的态度很重要!
你的态度决定别人对待你的态度!
)。
BOSS问:
你尽力就好,请问你的期望月薪是多少?
我()答:
15k(第一次面试,我心里也不太清楚上海的市场,15k一般是班里的大神级同学
要的薪资,所以,试水一下)。
BOSS说:
好的,没问题(竟然没有砍价:
L,额,土豪公司)。
旁白:
随后,又和BOSS聊了一些其他内容,由于BOSS马上要开会,就告诉如果你同接受我
们的邀请,那么我希望我们明天下午可以好好聊聊。
。
。
。
之后,一堆寒暄,不列出来了。
虽然,第一
家面试就这样结束了,没有技术上太多的PK。
但是,却使在精神上却得到了巨大的鼓励,面试第
二家上海公司有了更大的信心!
面试吐槽:
的上海处女面就这样丢掉了!
遗憾的是BOSS不太懂技术,没有碰撞出技术的火花。
但是,
让人幸运的是他提供给我了一个技术总监的岗位。
整个过程可以看到,面试的时候,面试官一方面会明
中考察我们的技术。
另一方面,在暗中实际上也在考察我们的沟通能力、思维逻辑能力、管理能力等这
些软实力。
所以,的每一位达人,在拼命码代码的同事,别忘了多和你的小伙伴分享技术,不
要忘记中午的时候抓住每一次的公开演讲机会。
有时候,一个人综合实力远大于单纯的技术竞争力!
加
油吧,骚年们!
面试过程:
14:
00到公司,前台MM给了一张面试登记表和一张Android笔试试题,然后一位和蔼的大叔(技术
大拿)将我带公司接待处,让我开始笔试。
14:
20笔试完成,笔试很简单,做完后把试题交给前台,前台帮我联系面试官。
14:
25跟一个年龄大概在25~30岁之间的年轻技术官进行了接近1个小时的面试(通过交谈感觉
面试官应该是项目经理或者开发组组长)。
15:
20人事面试,人事面试后提前跟我说CTO会对我进行一个电话复试。
第二天晚上大概19:
00,公司CTO对我进行了技术复试,总共持续了31分钟。
电话复试题要比初试难
的多了,姜还是老的辣。
我把复试的对话录音保存下来了,作为以后上海就业指导课程的案例讲解
(内容何止“高能”,简直就是高达!
)。
疯狂的笔试+面试记录(前方内容“残酷”:
funk:
,请准备受虐心态前行):
1.笔试
笔试时出现了一个小插曲,和大家分享一下。
笔试所在的接待区是一个半开放式的区域,共有
3张桌子,每张桌子上都有一支签字笔。
我先用第一张桌子,发现笔是坏的(郁闷),然后换到第二张
桌子,发现笔还是坏的(心想:
尼玛,这么霉,顺便汗一下),最后只能换到第三张桌子,你猜怎么滴,
对,笔还是坏的(想要骂娘了,FUCK!
)。
没辙了,翻遍我的背包,自己也没带笔。
难道企业是用这
种方式考察一个应聘者的吗?
这怎么办?
我想去前台借吧,前台肯定有(不要去人事那里借,前台毕竟只是前台,不会管你太多的细节,人
事可就不一样了,他们会认为一个面试者来比试不带笔是极不严肃的表现)。
热心的前台MM很乐意
地把自己的笔借给了我(心里一阵暖啊!
这家必须拿下!
)。
为了方便大家更清晰的看到笔试题目,手录笔试题和答案,看你能做对多少?
!
Q:
Android的四大组件有哪些?
A:
Activity、Service、ContentProvider、BroadcastReceiver。
Q:
请描述下Activity的生命周期?
A:
onCreate、onStart、onResume、onPause、onStop、onDestroy、onRestart。
Q:
如何将一个Activity设置成窗口模式?
A:
将Activity的样式设置成:
android:
theme="@android:
style/Theme.Dialog
Q:
如何退出Activity?
如何安全退出已调用多个Activity的Application?
A:
调用Activity的finish方法可以退出当前Activity。
可以自定义一个Application,在Application
中声明一个成员变量ArrayList用于存放打开的Activity,当退出时遍历ArrayList,依次调用Activity
的finish方法。
Q:
请介绍下Android的五种布局。
A:
LinearLayout、RelativeLayout、FrameLayout、RelativeLayout、TableLagout
Q:
请介绍下Android的数据存储方式。
A:
SharedPreference、XML、SQLite、文件系统
Q:
DDMS和TraceView的区别。
A:
DDMS的全称是DalvikDebugMonitorService,是Android开发环境中的Dalvik虚拟机调试
监控服务。
TraceView是程序性能分析器
Q:
说说Activity、Intent、Service以及他们之间的关系。
A:
Activity负责界面的显示和用户的交互,Intent封装了数据,可以实现Activity之间以及Activity
和Service之间数据的传递。
Service运行在后台进程,一般我们会让给其运行一些后台任务,Activity
通过StartService(Intent)或者BindService(Intent)可以启动Service。
Q:
请介绍一下ContentProvider是如何实现数据共享的。
A:
我们可以定义一个类继承ContentProvider,然后覆写该类的insert、delete、update等方法,在
这些方法里访问数据库等资源。
同时将我们ContentProvider注册在AndroidManifest文件中,其他
应用需要使用的时候只需获取ContentResolver,然后通过ContentResolver访问即可。
2.ROUND1:
PK项目经理技术面试问答精选
项目经理问:
Activity都有哪些生命周期?
我()答:
这个问题其实在笔试题中我已经给出答案了(此时,表示非常疑惑~)。
项目经理说:
我知道,你再说一遍。
旁白:
当时我真没搞明白,为何笔试上的题目他还是问我一遍,而且笔试上的好几道题他都重复问
了一遍。
现在想想应该是他怀疑我笔试的时候作弊了,比如我可以XX什么的。
好吧,我不就是笔试的
时候出去跟前台妹子借了一支笔,然后又把笔试题给拍了个照片而已嘛。
而且,我那3G的联通定制机
安装的移动4G的卡,只能享受2G的网速,我打开个XX都得几分钟。
算了,不能和面试官较劲!
我
忍!
我()答:
Activity有以下生命周期回调方法,比如常用的有onCreate、onStart、onResume、
onPause、onStop、onDestroy、onRestart。
默认情况下,如果我们不给Activity设置横竖屏配置信
息的话,在横竖屏切换时会将一个Activity销毁掉然后重新创建。
项目经理问:
Fragment你用过吗?
我()答:
这个当然用过呀。
现在的应用中基本都有Fragment的应用,Fragment比较小巧灵活。
项目经理问:
那Fragment跟Activity之间是如何实现值传递的?
旁白:
其实项目经理在问我会不会Fragment的时候,我已经预料到接下来会问我Fragment跟Activity
直接的值传递问题。
对于前面的问题,如果我说不会,就不会有下面的问题,但是如果说不会的话,那
么项目经理很可能因为这一个问题而把我PASS掉,因为Fragment是Android中一个非常重要的知
识,这个是必须会的(的Android基础课程中有一天就是讲Fragment的)。
如果连这个都不会,
那么再好的面试技巧也挽救不了同学们的!
我()答:
Activity可以先获取FragmentSupportManager或者FragmentManager,前者是
v4包下的,向下兼容因此用的比较多。
然后这些Manager通过Fragment的tag或者id调用
findFragmentByTag("tag"),findFragmentById("id")找到我们需要的Fragment对象,然后通过调
用Fragment对象的方法来进行值的传递。
项目经理问:
Android中都有哪些组件需要在清单文件中注册?
旁白:
四大组件是学习Android的必会知识点,也是Android基础中的重点内容,因此这个问题
同学们其实应该是很好回答的!
我()答:
一般来说四大组件都需要在AndroidManifest.xml中进行注册,不过其中Activity、
Service、ContentResolver是必须注册的,而BroadCastReceiver可以在清单文件中注册,也可以不
注册,这也分别叫做静态注册和动态注册。
旁白:
在Android中一般通过XML文件注册的组件,我们叫静态注册,而通过代码注册或者创建的组
件我们叫做动态注册。
动态注册和静态注册这两个名称听起来很高大山,其实理解起来soeasy滴!
项目经理问:
你自己有做过自定义控件吗?
我()答:
自定义控件做过,比如我们项目中的SlideMenu,LazyViewPager,Pull2RefreshListView,
VerticalSeekbar,RandomLayout等都是自定义控件。
项目经理问:
那你说说View的绘制过程?
我()答:
View绘制是从根节点(Activity是DecorView)开始,他是一个自上而下的过程。
View
的绘制经历三个过程:
Measure、Layout、Draw。
旁白:
的老版本课程体系中有2天的自定义控件,在这两天课程中同学们能够学会SlideMenu,
Pull2RefreshListView,优酷菜单等自定义控件,目前的课程又对自定义控制进行了加强,添加了
多种QQ5.0新特性内容,当然难度其实也不小。
项目经理问:
ListView你们应该有用过吧?
我()答:
这个在我们的项目中应用的很多,其实在如今所有流行的App中,ListView都有一个
大量的应用,说ListView是一个使用率高的控件都不为过。
项目经理问:
ListView的优化你们是怎么做的?
我()答:
ListView的优化有多种多样的策略。
在我们的项目中主要做了如下优化。
1、重用
ConvertView,2、给ConvertView绑定ViewHolder,3、分页加载数据,4、使用缓存。
前两个是通
用的解决方案,后两个是针对我们业务的个性化解决方案。
我们的数据来自服务端,如果服务端有1000
条数据的话,我们客户端不可能傻瓜式的一次性用ListView把这些数据全部加载进来,因此我们就用
分页加载数据,每次加载20页,当用户请求更多的时候再获取更多数据,网络的访问就算网速再快也
多多少少会有一定的延迟,因此我们的网络请求是异步处理的,同时从网络加载来的数据使用了2级缓
存来处理,第一级是内存级别的缓存,第二级是本地文件的缓存。
当ListView加载数据的时候首先从
内存中找,如果找不到再去本地文件中找,只有都找不到的情况下才去请求网络。
旁白:
ListView的优化是课程一个重要的知识点,因此大家上课的时候这个必须得学会,不然在以
后的面试中肯定会栽跟头的。
第二轮PKCTO(非人类)技术面试问答精选
旁白:
第二轮技术复试是在第二天晚上7点时开始的,当时,我刚从外面面试完回到家中。
跟我聊
的是他们公司的CTO,通过聊天也能感受到他的技术非同寻常,前几个问题问我时感觉多方有种咄咄逼
人的气势(貌似面试的人太多了,对于被面试人员都是不屑的口气)。
不过几轮技术PK后,发现原来
CTO对人类也可以这么温柔和气的(尼玛,技术好才能被人看得起啊!
心底话!
)。
CTO问:
说说你对泛型的了解?
我()答:
泛型是jdk5.0版本出来的新特性,他的引入主要有两个好处,一是提高了数据类型的安
全性,可以将运行时异常提高到编译时期,比如ArrayList类就是一个支持泛型的类,这样我们给
ArrayList声明成什么泛型,那么他只能添加什么类型的数据。
第二,也是我个人认为意义远远大于第
一个的就是他实现了我们代码的抽取,大大简化了代码的抽取,提高了开发效率。
比如我们对数据的操
作,如果我们有Person、Department、Device三个实体,每个实体都对应数据库中的一张表,每个
实体都有增删改查方法,这些方法基本都是通用的,因此我们可以抽取出一个BaseDao,里面提
供CRUD方法,这样我们操作谁只需要将我之前提到的三个类作为泛型值传递进去就OK了。
而数据的安全性,其实程序员本身通过主观意识是完全可以避免的,何况某些情况下,我们还真的想在ArrayList
中既添加String类型的数据又添加Integer类型的数据。
CTO问:
你知道Java的继承机制吗?
我()答:
知道呀,这个问题很简单呀!
java是单继承多实现呀。
CTO问:
那你知道java为何这样设计吗?
旁白:
从上面的问题也可以看出越是资历老的程序猿越喜欢刨根问底,因此如果同学们面试的时候遇到
一个年龄稍微大点的程序员,那么一定要提前做好思想准备了,他可能先问你一个看似很简单的问题,
然后再追问一个很深的思想或者原理。
我()答:
为何Java这样设计,其实这也是我一直的一个小疑惑。
不过我是这样理解的。
我只能
用反证法,如果一个类继承了类A和类B,A和B都有一个C方法,那么当我们用这个子类对象调用C
方法的时候,jvm就晕了,因为他不能确定你到底是调用A类的C方法还是调用了B类的C方法。
而
多实现就不会出现这样的问题,假设A和B都是接口,都有C方法,那么问题就能解决了,因为接口
里的方法仅仅是个方法的声明,并没有实现,子类实现了A和B接口只需要实现一个C方法就OK了,
这样调用子类的C方法时,Java不至于神志不清。
从另外一个方面考虑的话应该就是Java是严格的面
向对象思想的语言,一个孩子只能有一个亲爸爸。
CTO问:
Java的异常体系你知道吗?
我()答:
知道呀,顶层是Throwable接口,往下分了两大类,一个RunntimeException另一个
是普通的Exception。
CTO问:
那你知道这两类异常的区别吗?
我()答:
当然知道,java的命名是见名知意的。
从名字上我们也知道RunntimeException就是
运行时异常,在运行的时候才能被jvm发现导致程序的终止,而普通Exception必须进行try、catch
处理,或者在方法上用throws声明。
CTO问:
那你的期望薪资是多少?
我()答:
我期望的薪资已经给贵公司人事说过了,是17k。
CTO问:
你这么年轻,就想要到17k呀!
我()问:
对的,我是还年轻,高中同样是学习3年,有的考上了重点大学,有的却只考上了个大
专院校,甚至落榜,不同的人学习能力是完全不一样的,甚至可以用天壤之别来形容,因此如果只简单
的用时间来衡量一个人的价值显然就是不太合理的,比尔盖茨跟我这样大年龄的时候已经是亿万富翁
了,而我还在找17、18k薪水的工作(前面的问题已经回答的这么漂亮了,谈薪水的时候一定要表现
出绝对的自信!
)。
CTO问:
你说的对,不过我还得问你几个问题,你说你们项目中有用到图片吗?
我()答:
这个当然有呀,我们新闻客户端基本上每条新闻都有图片,只有图文并茂的新闻才会有
人看。
CTO问:
那你说你们遇到OOM异常吗?
我()说:
这个前期的时候我们的APP确实遇到过这样的问题,不过现在新的版本早就吧这些问
题给解决了。
CTO问:
那你们是怎么解决的?
我()答:
OOM异常是Android中经常遇到的一个问题,程序员稍微不注意可能就导致其产生。
因为Android的每一个应用都是一个Davlik虚拟机,该虚拟机的默认堆内存只有16M,远远无法跟我
们的PC机比较,因此和容易导致OOM(OutOfMemory)异常的产生。
导致这样的异常主要有以下
原因:
1、加载大图片或数量过多的图片,因为图片是超级耗内存的,2、操作数据库的时候Cursor忘
记关闭,3、资源未释放,比如io流,file等,4、内存泄露。
我们用用的OOM主要是加载图片导致的。
因为后面的三种原因都是可以通过约束程序员的编码规范来进行预防,或者使用性能分析工具来检查。
CTO问:
好的,那你们的图片是怎么处理的?
旁白:
随后这就是CTO面试应聘者的一个习惯,他会追着一个知识点往死里问,直到问到系统的底层,
或者他能理解的底。
我()答:
图片的处理主要用两种方式。
我们的应用中有两处用到了图片,一个是ListView中展
示的图片缩略图,这种情况的特点是数量大,但是单个图片内存小,只有几kb,另外一种是大图片,
就是用户通过手机拍摄的图片,然后通过http的post提交的方式提交到服务器上。
然后在客户端将这
个大图片也展示出来。
对于第一种情形,我们是通过三种技术手段来解决问题的,一是图片的缓存策略,
二是ListView的优化,其实在上面我已经讲过,三是WeakRefrence(弱引用)的使用。
对于第二种情形,
我们主要是首先通过BitmapFactory.Options参数获取图片的宽和高,然后再根据我们ImageView的
宽高对图片进行一个很大比例压缩。
CTO问:
那你说说弱引用是怎么使用的?
我()答:
WeakRefrence是一个类,在ArrayList中我们把这个类作为对象传递进去,把我们的
图片放在WeakRefrence里面,这样当davlik虚拟机内存不够用的时候,就会把WeakRefrence对象
回收掉,这样我们在WeakRefrence里面保存的数据也被回收了。
面试吐槽:
在上海的第二面终于遇到懂技术的人,把笔试、技术一面、人事、技术二面一气呵成的通了
个关,不拖泥带水,最终人事给了基本薪资17k+1k多补助的offer,这种感觉也许只有你经历过了才
能体会吧!
相信学子经过四个月的刻苦磨练也能远远超过我的水平。
加油吧,骚年们!
面试结果:
顺利拿下Android工程师,15Koffer+1k住房补贴