面试时,面试时应该问哪些问题题能试出一个 Android 应用开发者真正的水平

其实成为初级android工程师,并不困难,但是目前初级android工程师已趋于饱和,这与前两年客户端培训火爆密不可分,所以呢,这可能会让一些正在走这条路或者想要走这条路的人感到困难。但是想要脱颖而出也不是很难的。&br&今年参加校招,也拿到bat之一等一线互联网公司offer. 想说说我的看法,虽然客户端现在的市场趋于饱和,但是我想说的是:想进入一线互联网公司并不是没有可能,可以分享一下我的自学之路。&br&背景:本人科班,也不是很好学校,决定走客户端方向是因为自己的兴趣,学校内教的东西太浅显了,很多东西都是自学,就连基本课程也觉得老师并没有讲什么。(可能是我没听)&br&1.基础,基础最重要。想进入一线互联网公司,这一项必不可少,这也就是你比外面培训班所在的优势了。&br&算法分析和数据结构:查找,排序,DP,图论,数论,栈,堆,二叉树等,一本《算法导论》,再来一本数据结构的书基本够了。最重要的是刷题,让你更加理解。同时有些公司笔试也这样。&br&操作系统:进程线程,中断机制等,推荐书《深入理解计算机系统》&br&计算机网络:五层架构,各种协议等等,推荐书《计算机网络:自顶向下方法》&br&编译原理:它可以让你更好的理解语言的结构,词法分析,语法分析等,对你的掌握语言有帮助,书籍一本教材就差不多了。&br&数据库:可以去了解了解,各种范式,android开发对其要求也不高,但有必要了解,可以去买一本简单的教材看看。&br&2.java语言掌握,写android肯定要会java语言啊,所以java语言也需要良好掌握。&br&java虚拟机(jvm):到底java语言是怎么运行起来的,jvm内部又有哪些部分,需要一本周志明的《深入理解java虚拟机》&br&java基础:推荐书籍《Java编程思想》《java并发编程实战》&br&3.android基础:安卓工程师肯定android基础要熟练啦,所以呢,新手入门推荐郭大神的《第一行代码》后面可以看看《android开发艺术探索》,《android编程权威指南》可随便翻翻,当字典用。&br&4.设计模式,对于java和android熟悉后,你还需要对代码整洁度等的提升,推荐书籍《大话设计模式》《head first:java》到工作中了可以看看《重构:改善既有代码的设计》《android源码设计模式与实战》&br&总结一下书籍:&br&基础:&br&《数据结构与算法分析》,《算法导论》可尝试&br&《深入理解计算机操作系统》&br&《计算机网络:自定向下方法》&br&《编译原理》《数据库系统概论》&br&java基础:&br&《深入理解java虚拟机》《java编程思想》《java并发编程实战》&br&android基础:&br&《第一行代码》《android开发艺术探索》《android编程权威指南》&br&设计模式:&br&《大话设计模式》《head first:Java》《重构》《android源码设计与实战》&br&上面是需要看的书籍,也可以通过csdn下载电子书。也可以多去逛逛国内大神的博客,都在csdn上面,看看他们的一些思想。还可以去看视频学习,现在互联网时代,自学真的很方便的,推荐慕课网,还有网易云课堂,云课堂里面的老师都是通过筛选的,很多基础讲得也很生动。还有好好利用github,stackoverflow,这些网站,github有很多开源库,stackoverflow基本上有你遇到的90%的问题及解决方案。&br&学习方式:看书,逛博客,看视频。&br&自己写一个感兴趣的项目,把学到的知识都用到,这个就是能让你慢慢从书本上到实践的过程啦。&br&好吧,学了上面的知识,真的可以去互联网一线公司了吗?我觉得未必,还差一点。&br&还需要融会贯通,也就是说,把整个基础,java以及android都链接起来,成为你自己的知识体系。需要你去钻研,Read The Fucking Source Code,程序员必须有这份钻研的精神在,所以我们可以去找找我们喜欢的开源库,先去使用它,熟悉之后,去看看内部是如何架构的,为什么这样架构,如果是你来架构,又会用什么方法,跟他有什么不同?你可以学到些什么。这一步我觉得才是达到一个真正程序员的关键。也就是为什么你比别人厉害之处。&br&这部分我的思路:从微观到宏观,再从宏观到微观,首先从开源库的一个小功能学习起来使用,慢慢的熟悉整个开源库的功能,然后呢,我整个开源库有哪些功能我都知道了。开始试着画出开源库的类图,整体是怎么构造的,也就是从微观到宏观;后来知道整体构造,我再去有宏观到微观,细到每一行代码是怎么写的,为什么这么写。如果是我,我又会怎么写。&br&举个例子:比如你需要封装一个ImageLoader图片库,你可以想到什么?ImageLoader简单说就是加载图片,显示图片功能。安卓手机oom所以要图片压缩;因为单线程(UI线程)绘制,所以需要线程间通信,整体为一个生产者消费者模型,需要同步异步拉取;因为流量有限,所以需要缓存等等。这些都是在脑海里的框图。然后再细看,同步异步又是怎么做到的,代码如何实现。异步的本质又是什么?不就是中断机制吗,这又涉及到计算机操作系统,又可以了解中断机制。为什么要中断呢?很大程度上是进程间通信,保护现场,进程间通信又有哪些方式呢?进程又是什么?了解之后,你又会发现android为什么会用binder机制等等。&br&为什么上面我写得那么细呢?因为我觉得可能那才是我的亮点之处,也是各大互联网公司看重的吧。&br&好吧,这大概就是我的自学之路了,没有导师,我相信你们也可以的。但是这个肯定比外面培训班花的功夫更多吧,差不多一年时间。这也只是我经历今年校招的看法,希望对大家有帮助,至于社招的同学,如果要进入一线互联网公司的话,还需要更加努力。&br&祝大家好运吧~
其实成为初级android工程师,并不困难,但是目前初级android工程师已趋于饱和,这与前两年客户端培训火爆密不可分,所以呢,这可能会让一些正在走这条路或者想要走这条路的人感到困难。但是想要脱颖而出也不是很难的。 今年参加校招,也拿到bat之一等一线互…
这个长截屏功能是我做的。我来讲讲其技术实现吧。&br&&br&简单来讲,就是我让app里面的装内容的可滚动控件一边滚动,一边截屏,最后拼接起来。&br&&br&下面我来几个自问自答。&br&&br&&b&我为什么能滚动第三方app里的控件?&/b&&br&Android里有个ApplicationThread,系统对Activity的控制如resume/pause等都是通过它来做跨进程调用,我们也可以通过扩展它,实现从系统调用到app里。不过事实上由于我们自己有另外一个类似的接口,我使用的是我们自己的那个。&br&&br&&b&我怎么知道第三方app中哪个控件里面装的是用户想滚动的内容?&/b&&br&我会从顶层的View从上往下遍历,直到找到符合我设定条件的View为止。我设定的条件大概是:能向下滚动、View在屏幕内的可见大小大于半个屏幕的大小。&br&实际使用发现这个简单的规则就够了。&br&&br&&b&为什么点击“长截屏”按钮后图片就无缝的自然变长,中间也不停顿,截屏究竟是在什么时候截的呢?&/b&&br&其实真实的app内容滚动与“截屏”这个动作是发生在当前窗口背后的,由于当前窗口完全不透明,所以挡住了背后发生的事情,我们完全看不到。&br&点击“长截屏”按钮之后,大概会发生下面的事情:&br&&ol&&li&找到当前前台Activity,然后通过上面说的远程调用,调用过去。&br&&/li&&li&在前台Activity里执行的代码收到调用后,找到用户要滚动的View,并滚动一定距离。然后停止滚动并通过Broadcast通知截屏窗口,包括View的位置及滚动的距离信息。&br&&/li&&li&截屏窗口截取一张屏幕,当然,不包含自己这个窗口,只截Activity。然后根据传递过来的信息决定怎么裁剪,怎么拼接。&/li&&li&截屏窗口截屏之后告诉前台Activity已经截完屏了,可以继续滚动了。&/li&&li&注意,进行前面这些步骤的时候由于截屏app的窗口挡在上面,我们是完全看不到的。当滚动了一屏后的截屏内容得到后,那么我们已经有了不止当前屏幕的内容,还有了下一屏的内容,于是我们在界面上从原本的一张静态截屏图片,无缝的切换成由多张截屏拼接成的图片,然后开始做滚动动画(我自己感觉有种魔法般的感觉)。所以我们看到的内容滚动是滞后于真正的“截屏”动作的。&/li&&li&如此循环,直到点击了“结束”或到底。&/li&&/ol&&br&大致就是这些。还有很多细节就不展开了。&br&&br&值得一提的是,滚动的过程中,可以通过手指触摸切换成手动模式,这样我们可以精准的控制截到哪里。挺实用的。
这个长截屏功能是我做的。我来讲讲其技术实现吧。 简单来讲,就是我让app里面的装内容的可滚动控件一边滚动,一边截屏,最后拼接起来。 下面我来几个自问自答。 我为什么能滚动第三方app里的控件? Android里有个ApplicationThread,系统对Activity的控制如…
谢邀。&br&&br&很多高票答案都回答的很好了,只想说一下我自己的体会。我并不是计算机科班出身,天赋也不算高,但这几年在技术上的提高确实很快,从一个应届生到之前开始在面向数亿用户的产品中独挡一面,承担核心模块的工作时,也就2年不到的时间。总结了一下在技术学习道路上最大的助力,我认为主要有两点:环境和项目,当然还有自己较强的主动性和执行力。&br&&ul&&li&在环境上,体会最深的是公司的培训体系,导师制度和KM(内部文章分享平台). 内部培训的机会非常多,涵盖从技术到非技术方方面面,非常全,讲师的水准也都有保证(上过&a data-hash=&fe3cd8f803bf23dc962687f& href=&///people/fe3cd8f803bf23dc962687f& class=&member_mention& data-editable=&true& data-title=&@胡凯me& data-hovercard=&p$b$fe3cd8f803bf23dc962687f&&@胡凯me&/a&的课,现在见面都叫胡老师);导师制度很多公司都有,但我认为贯彻好的公司不多,我的导师Michal在我进公司之前就开始指导我学习,进公司后从椅子怎么调整到环境搭建,从零开始手把手带我,直到现在还在指导我进行音视频方面的工作;KM上的文章我在2016年看了不下几百篇,优秀文章经常会有邮件推动或者KM置顶,有不明白的地方直接RTX找作者一般也都能得到解答,看一些技术领先团队的文章,对技术提高的速度非常快。&br&&/li&&li&在项目上,大型的项目遇到的问题和挑战都不是一般DEMO能比的,对个人的要求非常高,要解决的问题非常多,项目中的同事能力也都很强,这都会倒逼你去成长。这中间的过程是非常痛苦的,但现在回过头看,却也因此受益。&a data-hash=&54a10bc8c8bdff89f7db& href=&///people/54a10bc8c8bdff89f7db& class=&member_mention& data-editable=&true& data-title=&@RxRead& data-hovercard=&p$b$54a10bc8c8bdff89f7db&&@RxRead&/a& 同学之前在某家属于国内一线的互联网公司工作时,有次聊说自己遇到了技术上的瓶颈,当时我对他说向身边的老员工学习,看看他们都在做什么,结果他说自己就是项目组里最老的员工,即使他当时毕业只有2年多。如果一直处于这样的项目中,即使个人再努力,提高也是很有限的。后来 &a data-hash=&54a10bc8c8bdff89f7db& href=&///people/54a10bc8c8bdff89f7db& class=&member_mention& data-hovercard=&p$b$54a10bc8c8bdff89f7db&&@RxRead&/a& 跳槽过来,到现在1年多,已经成为我们项目中UI方面的顶梁柱,技术上的提高飞快。&/li&&/ul&只有一个Android或者iOS开发的公司,而且开发者还在成长期,在项目上没法做很多东西,要求也不可能高,技术的提升必然很快就会遇到天花板。不要太高估自己的执行力和学习能力,每个人都是有惰性的,在一个人的环境里想保持自己的技术上的不断学习和进步非常困难。况且比起我在上面提到,处于更加高效成长环境的同学,即使开发者单人通过自己的努力在学习和成长,差距也只有可能进一步拉大。如果要给在一个Android或者iOS开发公司工作的成长期开发者建议,我认为是努力学习,保持技术上的竞争力,然后尽早跳槽。&br&最后总结一下我的观点,如果是应届生,或者成长期的开发者,建议首选大公司。你会说小公司也有可能会有很好的发展,可惜这样的机会实在太少,现在的大环境也不好,失败的概率实在太高,并且优秀的机会更多的是留给更优秀和成熟的开发者而不是成长期的。最后请再思考一下,大多数开发岗位处于1线或者1.5线城市,面对居高不下的生活成本和房价,如果选择错了,你要付出的是高昂的时间和机会成本,面对的是技术和生存的双重压力,这是你能承受的吗?
谢邀。 很多高票答案都回答的很好了,只想说一下我自己的体会。我并不是计算机科班出身,天赋也不算高,但这几年在技术上的提高确实很快,从一个应届生到之前开始在面向数亿用户的产品中独挡一面,承担核心模块的工作时,也就2年不到的时间。总结了一下在技…
先简单的分两种情况:&br&一、&b&有编程基础,或者科班出身的,直接上吧&/b&。&b&强烈推荐郭霖老师的《第一行代码-Android》&/b&&br&二、没编程基础的,先入门java,如果天天都有比较多的空闲时间的话,这个入门时间要在2周完成,如果没有的话,1个月内完成吧,&b&不要让拖延耽搁你的激情&/b&。&br&如果你准备好了进军Android:&br&
不管你什么时候开始学习Android,&b&请使用Android Studio&/b&,首现改主题,然后去网上搜一下常用的&b&20个快捷键截图放在电脑桌面上&/b&!&br&如果是&b&色彩盲,请自行收藏这个网站&/b&:&a href=&///?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Material Design Color Palette Generator&i class=&icon-external&&&/i&&/a&&br&&b&所有书上的UI部分扫一遍就行了&/b&,我相信现在还没有书按material design标准讲解。&br&&b&从一开始起就严格按照material design写&/b&,&a href=&///?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Material Design&i class=&icon-external&&&/i&&/a&我想你一开始学习的时候身边是没设计师的吧,但是按照标准,你不需要设计师:)&br&&b&不要自定义一堆padding margin&/b&,但你需要边框,边距的时候,请看看&b&?android:attr/&/b&里面有木有你需求的(由于android studio强大的补全功能,你一般只需打几个关键词就有提示了),比如你需要给一个ImageButton加点击效果,&b&不要傻不拉几的去写一个selector了&/b&,你只需要输入 item select这些关键词,自动补全就会给你提示了。&br&&b&不要定义&/b&一大堆乱七八糟的&b&字体大小&/b&了,materail design上的几种基本字体大小可以满足你!&br&再也&b&不要使用ListView了,改成RecycleView吧&/b&!&br&再也&b&不要寻找第三方下拉刷新控件了,SwipeRefreshLayout&/b&肯定符合你的要求(不信你看,知乎Android客户端都是用的这个(●ˇ?ˇ●))。&br&再也&b&不要使用第三方侧滑栏了,DrawerLayout能满足你!&/b&&br&再也&b&不要使用ViewPagerTabStripe这一类的第三方Tab控件了,请使用TabLayout!&/b&&br&再也&b&不用找圆形头像控件,圆角控件了,其他的Univeral Image Loader /Picasso也不用看了,直接上&a href=&///?target=http%3A//www.fresco-cn.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Fresco | Fresco 中文说明&i class=&icon-external&&&/i&&/a&吧,它都有!&/b&不如用省下的时间看看Fresco的源码。&br&&b&少去国内论坛瞎晃&/b&,然后各种求指点,安心写两个月,你会发现自己水平比他们都强,&b&有问题请去stackOverflow搜索&/b&,&b&国内博文除了几个大牛的都少看,都是假的!都是骗人的!很多写着是原创,但是博文内容他们自己都没试验过,鄙视这些不负责任的!&/b&&br&&b&少听一些人说的有问题要写博客记下来!&/b&把这个时间省下,学一下&b&UML图怎么画,&/b&给自己的&b&工程加一些规范的注释吧!&/b&你的这些规范的源码和规范的注释就是你以后的资料库和经验库!&br&&b&请学会使用Git,自己一个人也要用,我们先不说那些团队合作什么的高大上的,就说你这一版代码修残了,要从原来的重新修改,怎么办?用Git,回滚版本!就说你突然一天电脑出问题了,或者你范二了,没备份就重装系统了,想哭怎么办?用Git,再也不用担心代码突然丢啦!&/b&&br&&strong&----------------------------------------------------------------------------------------&/strong&&br&评论里面有些同学有疑问关于如何学习material design控件,我的建议是&strong&去GitHub搜&/strong&,有很多同行给的例子,比如&a href=&///?target=https%3A///chenyangcun/MaterialDesignExample& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&chenyangcun/MaterialDesignExample · GitHub&i class=&icon-external&&&/i&&/a&&br&这些栗子足够入门。&br&&strong&-------------------------------------------------------------------------------------------------------&/strong&&br&&b&-------------------------------------------------------------------------------------------&/b&&br&有朋友说要是动真格的话,需要NDK以及JVM等的知识,首现&b&NDK并不是神秘的东西,&/b&你跟着官方的步骤走一遍就知道什么回事了,&b&无非就是一些代码格式以及原生/JAVA内存交互,进阶一点的有原生/JAVA线程交互,线程交互确实有点蛋疼,但平常避免用就好了,再说对于初学者来说关心NDK干嘛,据鄙人以前的经历,只在音视频通信和一个嵌入式信号处理(离线)的两个项目中用过,嵌入式信号处理是JAVA-&NDK-&.SO-&MATLAB这样调用的我原来MATLAB的代码,其他的大多就用在游戏上了吧,一般的互联网公司会有人给你公司的SO包的。&/b&&br&&b&至于JVM,该掌握的那部分,相信我,你会掌握的,不该你掌握的,有那些专门研究JVM的人来做,不如省省心有空看看计算机系统,编译原理。&/b&&br&&b&一句话,平常多写多练,这是最基本的程序员的素质,尽量挤时间,读理论基础书籍,JVM不是未来30年唯一的虚拟机,JAVA也不一定再风靡未来30年工业界,其他的系统和语言也会雨后春笋冒出来,但你理论扎实会让你很快理解学会一个语言或者框架,你平常写的多会让你很快熟练的将新学的东西应用到实际中。&/b&&br&&b&初学者,一句话,多练。&/b&&br&&b&------------------------------------------------------------------------------------------------------------&br&&/b&
说说我的情况吧,第一个学过的语言是C,然后C学的很烂的情况下继续学习了C++,为什么没有先把C学好再学C++呢,因为课程设计==,我有自知之明,所以在上C++的前一个寒假就先开始看了,然后先看了一本《易学c++》,虽然那本书在现在浅显至极,但当时还是感觉有点略难,我通过这本书熟练地掌握了std::iostream!==然后基本的对象模型有了一点概念,我比较好高骛远,于是就在此时想直接通过最后一个大作业——命令行下的RPG游戏 彻底掌握C++这门最难的语言!对,你没听错,我当时想的就是这个大作业要是搞懂了,C++还不是被我各种SM,但很不幸,虽然我一行行的把这个大作业的源码比着答案敲了一遍,但还是不懂,于是就在网上找了一个据说是清华的java课件开始学习,你还别说,除了当时感觉java里面把function叫做method(方法)感觉怪怪的以外,真的在不到3天的时间完全弄懂了对象的概念以及对象的继承,然后差不多就开学了==(当年不懂事,整个寒假就看了这10多天的书),所以java大法好。&br&
好,这是我人生入坑的开始,我说的寒假就是2014年寒假!,在接下来的学校的C++课程中我当然如鱼得水,然后一发不可收拾,很快我就自己把那本98清华版的《visual c++程序设计》弄烂了,确实那本书的只是我掌握的滚瓜烂熟,然后我就深入了解MFC,什么用GDI实现AlphaBlend,MFC的设计思想,MFC中数据库的使用什么的,然而现在回首看来这些并没有什么卵用。然后我就天天晚上回到宿舍打开电脑写代码,但显然我很快从社区(知乎==)上得知MFC很烂,大家都说微软大法好!于是入了C#的坑,然后发现生活好美好===天天真是喜欢C#的不得了,不过有一天我成了软黑,winform绘图闪成狗,loadlibrary看着好蛋疼,以及用user32.dll时,蛋疼的语法,蛋疼的函数名字,API参数,然后我得知,原来罪魁祸首不是c#,是winAPI就长这样!&br&
然后就在知乎大声地教唆下,入了Qt教,入门是看的一个外国人录得视频,英文无字幕,但是他的声音好好听,于是就学了Qt,第一次发现各种Layout的自适应布局,通过掌握QGraphicsView熟悉了MVC模型,后来还用QGraphicsView到了真实的项目,发现===好多坑==,坐标系统是坑,事件系统是坑,总之,欲仙欲死,不过说实话,我至今还是认为Qt的设计挺好的,QML想学,但流产了,原因大概是没时间吧。&br&
然后解除了另外两端惨绝人寰的事情,第一个是第一次做音视频的实时网络传输的时候,资料很少,一开始甚至连Ffmpeg都不知道,后来知道了,就入了Ffmpeg的坑,好多莫名奇妙的错误,都需要右键去看源码,然后音视频的编解码以及Rtp/Rtsp协议弄的差不多,demo也出来的时候,为了广域网,又要入P2P Nat穿透的坑,但是很遗憾,没有完全成功。&br&
还有一些其他乱七八槽的事情回来补==今天先说重点。&br&
在今年4月份左右,我第一次下定决心要搞定Android,而且我真的做到了!虽然以前断断续续看过android,但都没屁用,这次是真的白天看书,晚上写代码。郭霖老师的《第一行代码——android》只看了5章,但在这五章的学习过程中,我真的入了Android的门了,然后那本书我再也没有打开过,当然,Android只会画界面是远远不够的,现在的support.design.widget组件集让Android界面开发变得很轻松了,重要的是和服务器的交互,以及嵌入式本地数字信号处理,一不小心写了这么多,第一次发现自己打字这么快,哈哈~
先简单的分两种情况: 一、有编程基础,或者科班出身的,直接上吧。强烈推荐郭霖老师的《第一行代码-Android》 二、没编程基础的,先入门java,如果天天都有比较多的空闲时间的话,这个入门时间要在2周完成,如果没有的话,1个月内完成吧,不要让拖延耽搁你…
如果你是用 AndroidStudio 进行 App 开发,那么你一定要知道 MaterialIconGenerator 这个插件的存在 &a href=&///?target=https%3A///konifar/android-material-design-icon-generator-plugin& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GitHub - konifar/android-material-design-icon-generator-plugin: This plugin help you to set material design icon to your project.&i class=&icon-external&&&/i&&/a&,利用这个插件,可以生成不少好看的 icon。&br&&br&比如我自己开发过一个叫 AppPlus 的个人项目 &a href=&///?target=https%3A///maoruibin/AppPlus& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GitHub - maoruibin/AppPlus: A open source android application,and used to manage app,export apk,watch recent processes.&i class=&icon-external&&&/i&&/a& ,其中的图标都是通过这个插件生成,完全不用美工给你出图,简直完美。顺便放一张首页截图。&br&&br&&img src=&/39afc43e3ec15_b.png& data-rawwidth=&720& data-rawheight=&1280& class=&origin_image zh-lightbox-thumb& width=&720& data-original=&/39afc43e3ec15_r.png&&&br&&br&如果这个插件没有一些合适的素材,可以利用在线工具
&br&&a href=&///?target=http%3A//romannurik.github.io/AndroidAssetStudio/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android Asset Studio&i class=&icon-external&&&/i&&/a&&br&&br&这个在线工具很强大,你甚至可以用它来生成一些简单的启动图标,我的好几个 beta 版项目的 launcher icon 都是通过它做的。&br&&br&如果还不能找到,利用在线网站&a href=&///?target=https%3A//icomoon.io/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Icon Font & SVG Icon Sets ? IcoMoon&i class=&icon-external&&&/i&&/a&进行查找&br&&br&另外还可以去&a href=&///?target=https%3A///mrzmyr/awesome-icons& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/mrzmyr/aweso&/span&&span class=&invisible&&me-icons&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&碰碰运气。
如果你是用 AndroidStudio 进行 App 开发,那么你一定要知道 MaterialIconGenerator 这个插件的存在 ,利用这个插件…
本人女,程序员一枚。讲讲我周围的it男吧。&br&&br&坐在我对面的小哥,有一阵当当做活动,满200减100什么的吧,他说他买书了。过几天,搬了一摞书回来,我一看,一本javascript权威指南,还有一套左传。我吓了一跳说你居然看左传?他特别得意的说,我也是有文化的人。然而那套左传从买来起就一直放在他桌子上吃灰…后来被他带回家了,至于最后看没看…别问我我也不知道。&br&还是这个小哥,某天早上来上班,说他前一天晚上一边看太子妃升职记一边写代码,写的可开心了……&br&&br&坐在我旁边的小哥,写了各种专题,人称专题小王子,简称小王子。年会的时候弹着吉他唱了一首斑马斑马,圈了无数少女心。我跟他安利了好几天太子妃升职记,他都不为所动,然而过了几天他说他女朋友吃了我的安利,现在每天都在念叨太子妃……他特别瘦,还总是喜欢打击我胖。每次散步路过快递点的称的时候总想怂恿我上去。&br&因为每天早上开一堆应用启环境太麻烦,所以我一般晚上不关机,他也跟着这样,然而还是每天早上一来习惯性的按开机键…于是那几天总能看到他早上来了把电脑关掉,然后再开开…&br&今年是他的本命年,他在朋友圈发了一条状态:我今年12岁了,今年是本命年哦。我评论他:大家好我是xxx的脸,他不要我了/手动再见。哈哈。&br&&br&还有坐在我对角线的小哥,拿了部门最佳新人奖,上台发言的时候说,感谢总是改来改去的需求,锻炼了我们的心理承受能力…然后掏出手机发了个大红包在群里。少年干得好!开启了我们部门获奖发红包的传统,之后每次部门颁奖之后大家都抱紧手机等着抢红包。还是这个小哥,有一次晚上9点多了,他已经收拾好书包准备回家,测试火烧眉毛的提了个bug,说是今晚要上线的,然而负责这块的开发正在开车回家的路上,他二话不说放下书包帮别人改了bug。&br&&br&&br&我们组还有一个小哥,从淘宝批发了20把雨伞,说是准备下雨天就到地铁口卖伞,有10块钱一把的和20块一把的,不知道能赚多少…有一次下雨,坐我对角线的小哥说,要是伞找不到了就去他那买好了……&br&这个小哥很会跳街舞,优酷上还有他的视频,有一次我们几个吃饭的时候找到了他的视频,发到群里,不在场的几个人评论:这人有点像xxx哎,我们偷笑:啊这是xxx他双胞胎弟弟啊。&br&&br&我们的小组长,已婚妇男,特别喜欢做媒,因为我们组单身的女生就我一个,所以我总是听他说,哎我们组那个谁谁不错啊,你们加个微信吧;哎你怎么没加他微信啊,他好伤心啦;你们有没有聊天啊,那个谁谁还是很不错的~&br&&br&还有个小哥,双十一过后唉声叹气地说,他女朋友给他买了件优衣库的羽绒服,橘黄色的。他觉得这个颜色不好看,但是他女朋友说好看,他都不想穿。结果过几天就看见他穿着新羽绒服来上班,我们夸了几句颜色很好看,他乐滋滋的穿了好久。&br&&br&坐在我右边的右边的小哥,是个沉迷于二次元的少年,他桌子上摆了一个高达模型,最爱b站,会在午休时看各种动漫,他负责开发的专题系统(我们内部用的系统)首页写的是 (≧?≦)赐予你权限~~&br&有一天他忽然在群里发了个知乎用户的链接,我们点进去一看,是个不认识的妹子,为什么说是妹子呢,因为知乎头像是一张妹子的全身照~我就问他为什么发这个啊,他说:她关注我了耶~这么一说不得了,大家全去那个妹子的主页围观了,但是只有小头像,看不清妹子的脸啊。怎么办呢,这是难不倒我们一群程序员的~开了F12找图片src,然后打开来,一看url最后缀着一个s,哈哈哈so easy,街舞小哥说,把s改成l就是大图啦,另一个说:改成b也是大图耶,还有一个说,改成hd是不是就是高清啦~&br&&br&所以,it男什么的,其实就是普通人啊,有自己的爱好和性格,每个人都不同。或许因为职业的原因单纯一些,但是没必要过分的捧或者黑他们,不是吗&br&&br&————————————————我是分割线——————————————————————&br&&br&突然多了这么多赞我真是受宠若惊,补充个小故事吧:&br&是那个穿橘黄色优衣库的小哥,有一次我和他合作开发一个专题,他在代码头部画了个佛祖,像下面这样的:&br&&img src=&/76f5f1abc732a6_b.png& data-rawwidth=&340& data-rawheight=&316& class=&content_image& width=&340&&(图片来源于网络,找不到原文件了……)&br&过几天,我突然发现他的佛祖变成这样了:&br&&img src=&/a2cc94becdfff4c81f93d7a743d7e9f5_b.png& data-rawwidth=&419& data-rawheight=&373& class=&content_image& width=&419&&急忙在群里艾特他: xxx,你的佛怎么歪了?!&br&他回答:嘘,别吵,佛祖累了,要睡一会儿~&br&&br&&br&&br&————————我也是分割线———————&br&&br&看左传的那个小哥,有一阵想买几幅画挂在客厅墙上,看中了两幅,不知道哪副好,于是开了ps把两幅画分别p到了自家客厅的照片上,很自豪地说,看这ps水平,毫无ps痕迹…&br&他最出名的事迹是在注释里写散文,深情的抒发了项目上线之后他的心路历程,然而被我们发现之后立马删掉了……&br&&br&我们的小组长,就是上面喜欢做媒的那个,秋天的时候特别开心的跟我们说他淘宝买了几棵橘子树,准备种到阳台上,等明年结果了请我们吃橘子。结果杭州上一年的冬天下了好几次雪,他在群里说,家里阳台上种的小青菜都焉了/伤心。我没敢问他你的橘子树们怎么样了……&br&&br&———————————分割线又来啦————————————&br&&br&最后来一句…我们组招人哦~坐标杭州网易教育产品部(网易云课堂就是我们组做哒),职位在&a href=&///?target=http%3A//& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&上面找,可以投简历给我们部门hr,&br&hr小哥的邮箱是 hzjili@&br&欢迎大家咨询他~&br&&br&&br&因为好多人问我招聘相关问题,但是我也不清楚具体情况,所以大家有相关问题请直接咨询hr小哥~顺便说一句,我们的hr小哥单身哦~&br&&br&——————————分割线又来啦—————&br&大半年没有更新过了,并不是我不上知乎,只是懒…&br&今天再来更新个街舞小哥的故事吧。&br&上周五部门出国旅游,街舞小哥参加了,所以周一来就没看见他。旁边座位空了,有点不习惯。结果我中午在他桌子上发现一张纸,上面龙飞凤舞的写:别太想哥,哥还会回来的!&br&&br&还有,前几天网易楼下有活动,扫码可以领崂山圣水。我和另一个小哥路过,就领了一听上来,大家每人倒了点尝。街舞小哥喝了一小口就吐了,一整个下午都蔫蔫的。然而二次元小哥一个人喝了一半,表示毫无压力。我们都怂恿二次元小哥去尝试崂山圣水配瑞典鲱鱼,等他真的尝试了我再回来更文…
本人女,程序员一枚。讲讲我周围的it男吧。 坐在我对面的小哥,有一阵当当做活动,满200减100什么的吧,他说他买书了。过几天,搬了一摞书回来,我一看,一本javascript权威指南,还有一套左传。我吓了一跳说你居然看左传?他特别得意的说,我也是有文化的…
这几个问题是我根据自己的面试经历总结的,朋友 &a data-hash=&feab7bda6d& href=&///people/feab7bda6d& class=&member_mention& data-editable=&true& data-title=&@AndWang& data-tip=&p$b$feab7bda6d& data-hovercard=&p$b$feab7bda6d&&@AndWang&/a& 帮分享出来,大家一起交流学习。&br&&br&其实不一定面试时才了解这些,并且了解绝对不是重点,而是实践,绝知此事要躬行是真理,这样的问题也似乎没有“最佳答案”,但是可以发表一下自己观点和实践结论。&br&&br&有些做法或观点一下子想不起来,需要具体做的时候再google一下,或者跟朋友沟通拓展一下,所以先做个简单的回答,请大家补充。&br&&br&&b&1. App性能如何探测,有哪些方面,什么指标,怎么保证更流畅?&/b&&br&&br&性能可以根据帧率、内存、CPU、GPU等指标的数据和表现辅助判断,可以从/proc文件夹下读取文件获取cpu、内存等信息,也可以用dumpsys命令获取帧率等信息,也可以通过android API获取相关信息。&br&&br&还有很多性能相关的分析工具很重要,辅助判断和分析,比如Heap Tool、Memory Monitor、Lint、HierarchyView、WireShark、TraceView等。&br&&br&保证流畅有很多点可以去研究,比如布局、代码、缓存、网络、数据库、异步并发等方面的优化,涉及很多的知识点,可以google下,先简单说下,有时间再细述。&br&&br&&ul&&li&&b&布局&/b&充分利用include、viewstub、merge 等标签,控制层级,避免过度渲染(绘制)。&/li&&li&&b&代码&/b&上尽量使用final、局部变量、系统函数如arraycopy等、位移操作是否可以代替乘除、for循环是否可以避免size计算和new对象等等。&/li&&li&&b&缓存&/b&方面,线程、位图、视图、网络数据是否可以被缓存,IO用缓冲流。&/li&&li&&b&网络&/b&方面,如尽量避免轮询,控制节奏和频率,IP直连,采用SPDY方案(或HTTP2.0)来实现压缩header、多路复用、双向通信等,API数据压缩,多个请求是否可以合并,数据压缩和尝试protocol buffer相关序列化方案。&/li&&li&&b&数据库&/b&方面,尝试用SQLiteStatement代替SQLiteDatabase完成操作,索引和事务的充分理解和使用,注意SQL语句语法和拼接,采用部分查询和延迟加载。&/li&&li&&b&异步并发&/b&方面,全App只有一个线程池,控制核心并发数量,控制超载时排队数量和策略,合理调度任务,优化业务逻辑。&/li&&li&最后关于&b&帧率&/b&,你看到的视觉卡顿,直接原因基本是“掉帧”。关于帧率,尽量保证主线程里做的事情,不会超过16毫秒(其实这挺难的),16毫秒大法好,具体可以去理解下CPU、GPU、屏幕三者如何配合完成渲染的,推荐老罗的博客。&/li&&/ul&&br&&b&2. 谈谈架构。大项目,逻辑多怎么办,如何应对多App和多终端?&/b&&br&&br&适当参考我在知乎的一个回答 &a href=&///?target=http%3A//zhi.hu/hfMB& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&怎样搭高质量的Android项目框架,框架的结构具体描述? - 马天宇的回答&i class=&icon-external&&&/i&&/a& ,结合模块化、组件化思想去做,多实践一下mvp、mvvm等策略。&br&&br&&b&3. android的发展大事件和主要技术发展&/b&&br&&br&额,挺多的,朋友们补充吧。&br&这个问题蛮好的 &a href=&/question/& class=&internal&&Android 开发有哪些新技术出现? - Android 应用&/a&&br&&br&&b&4. avtivity(service)启动流程简述&/b&&br&&br&可以自己阅读源代码,结合罗老师的博客,研究的非常棒:&a href=&///?target=http%3A//blog.csdn.net/luoshengyang/article/details/6689748& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android应用程序启动过程源代码分析&i class=&icon-external&&&/i&&/a&&br&&br&&b&5. 动态化的几种方案&/b&&br&&br&早期的H5方案,通过js和java互通增强h5的能力。&br&还有DexClasssLoader结合反射代理的方案。&br&还有React Native方案,手淘的Weex框架。&br&还有Lua等脚本实现动态化方案。&br&&br&&b&6. 热修复的原理&/b&&br&&br&Github上读一下AndFix这个项目的源码,还有xposed、dexposed。&br&&br&大致原理就是将java方法通过c/c++修改属性变为public native方法,上下文携带到native层,然后根据上下文指向另一个java方法,从而“偷梁换柱”,如果是支持ART的手机,那么策略不一样,将bug method的关键信息(classloader、theadid等)保留,将修复过的方法的各种信息赋给bug method,完成“移花接木”。&br&&br&另外,其实有挺多的策略改变运行时行为的,比如:&br&&ul&&li&Javasisst:字节码修改类库,依赖字节码修改和DX类库,可以完成动态替换和切面编程。&br&&/li&&li&AspectJ:依赖字节码编织器,需要按照其语法来编写,需要一点“编织”时间。&br&&/li&&li&Xposed方案,简直是一个Bug,神器般的存在,没准以后会被Android系统修复呢,不仅可以改变自己的类行为还可以hook系统的方法,root过的机器还可以hook其他App和系统进程。&br&&/li&&/ul&&br&&b&7. 网络这块怎么优化&/b&&br&&br&尽量避免轮询,控制节奏和频率。&br&&br&IP直连节省DNS解析时间。&br&&br&尝试其他数据序列化方案比如protocol buffer等。&br&&br&采用SPDY方案(或HTTP2.0)来压缩header、多路复用、双向通信等。&br&&br&服务器做优化,比如分布式、缓存之类的,减少API涉及的业务操作所需要的时间嘛。&br&&br&API接口数据精简,多个请求是否可以合并,增量请求啊、GIP压缩啊什么的,等等。&br&&br&&br&&b&8. 数据库性能怎么保证&/b&&br&&br&尝试使用SQLiteStatement取代SQLiteDatabase对象完成操作,避免直接使用SQLiteDatabase提供的update、inset等方法。&br&&br&索引和事务的充分理解和使用,批量操作使用事务极大提升速度,这个我是做过试验的,效果惊人。&br&&br&SQL语句拼接和本身的优化,仅查询部分局部数据,使用延迟加载策略。&br&&br&10万条数据插入比系统SQLiteDatabase操作快一倍,推荐我的LiteOrm数据库框架 &a href=&///?target=https%3A///litesuits/android-lite-orm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GitHub - litesuits/android-lite-orm: LiteOrm is a fast, small, powerful ORM framework for Android. LiteOrm makes you do CRUD operarions on SQLite database with a sigle line of code efficiently.&i class=&icon-external&&&/i&&/a&。&br&&br&&br&&b&9. 线程安全怎么保证,异步并发这块你怎么做的&/b&&br&&br&理解并使用ReentrantLock,Synchronized保护对象或过程,final来保护不可变对象,无状态和只读对象是安全的,合理使用一些 concurrent容器,比如ConcurrentHashmap等,重量级耗时任务考虑是否可以释放锁,多线程下实例化或延迟加载需要保护起来,保护多线程下关键数据访问的原子性,等等还有很多的。。。&br&&br&推荐研究下Doug Lea主写和设计的java concurrent包,理解CountDownLatch、CyclicBarrier、Semaphore、FutureTask等对象。&br&&br&具体开上,我使用自己写的SmartExecutor,直接继承ExecutorService,封装了一个公共线程池,全App保证只有一个线程池。源码在这个开源项目里:&a href=&///?target=https%3A///litesuits/android-lite-http& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GitHub - litesuits/android-lite-http: LiteHttp is a simple, intelligent and flexible HTTP framework for Android. With LiteHttp you can make HTTP request with only one line of code! It could convert a java model to the parameter and rander the response JSON as a java model intelligently.&i class=&icon-external&&&/i&&/a& 。&br&&br&在一个 App 中 SmartExecutor 可以有多个实例,每个实例都有独立核心和等待线程数指标,每个实例都有独立的调度和满载处理策略,但它们 &b&共享一个线程池&/b&。这种机制既满足不同木块对线程控制和任务调度的独立需求,又共享一个池资源。独立又共享,最大程度上节省资源,提升性能。&br&&br&控制核心并发数,尽量和CPU核数保持一致(或者多两个)我认为吞吐量是最佳的,线程过多则调度线程消耗CPU和时间,过少则不能充分利用多核的能力。&br&&br&控制排队策略和排队数量,是否考虑新任务先处理,过度超载丢掉最老的任务。&br&&br&还有就是业务上,合理调度任务,优化业务逻辑,不要胡搞乱搞,不作恶。&br&&br&&br&最后我想推荐一下我的个人开源项目:&a href=&///?target=http%3A//%3Ff%3Dzh_perf& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&?&/span&&span class=&invisible&&f=zh_perf&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&,欢迎关注嘛。
这几个问题是我根据自己的面试经历总结的,朋友
帮分享出来,大家一起交流学习。 其实不一定面试时才了解这些,并且了解绝对不是重点,而是实践,绝知此事要躬行是真理,这样的问题也似乎没有“最佳答案”,但是可以发表一下自己观点和实践结论。 …
首先,面试官们一定要知道,&b&每个人由于经历不同,擅长的方向是千差万别的,所以一定不要抓住自己擅长的某个方面去问的很深,觉得“如果连这个都不会还算毛程序员啊”。&/b&&br&&br&所以我问问题的时候,往往是“两步走”的循环:&br&1. 问他做过什么,如果有成品的话,我能看看更好。&br&2. &b&从他做过的东西里面,找到问题进行提问。&/b&具体的问题要看情况,可以是界面或效果的实现方式、相关bug的排除、该部分原理的分析。&br&&br&举一次面试时的对话作为例子吧:&br&我先开始:&br&“这份简历和网上投过来的那份是一样的吧?”&br&“嗯,应该是一样的。”&br&“嗯好。你在之前的团队的位置是什么?”&br&“中高级吧。”&br&“具体的工作呢?”&br&“写框架,让新人比较容易上手,能够轻松工作。”&br&“你说的框架具体包括什么呢?”&br&“一些会共用的东西,写出来可以让新人就算是刚来也能很好的完成工作。”&br&“联网是你封装的吗?”&br&“是。”&br&“你们联网用的是什么?”&br&“就是……安卓自带的……HttpClient。”&br&“直接用的?”&br&“嗯。”&br&“那你们的网络请求是怎么做的异步呢?”&br&“嗯……用Handler嘛,还有AsyncTask。”&br&“能具体一点吗?”&br&“嗯……就是……额……”&br&“例如什么情况下用Handler,什么情况下用AsyncTask,你是怎么决定的呢?”&br&“嗯……”&br&“或者说,他们有什么区别呢?谷歌为什么要造他们两个出来,而不是只造一个呢?”&br&“区别……区别……他们肯定是有区别的,不然谷歌不可能造两个。嗯……”&b&(到这里,这个问题就可以结束了。评级减一。)&/b&&br&“这样吧,你的简历上提到‘熟悉大图片的加载’,能说一下大图片加载有什么需要注意的吗?”&br&“缓存嘛。”&br&“缓存?”&br&“嗯,大图片的加载不就是ListView里面的大图片加载吗?要防止内存溢出。”&br&“ListView里面一定是大图?”&br&“嗯……”(&b&不了解的东西却说自己熟悉,评级减一。继续顺着问。&/b&)&br&“那么ListView中图片的缓存你是怎么做的呢?”&br&“三级缓存嘛。”&br&“哪三级?”&br&“如果内存里面有,就用内存里面的;如果没有就用本地的;如果本地也没有就从网络上取。三级。”&br&“网络上的也叫缓存?”&br&“啊。你可以把他看作缓存,也可以不看作缓存嘛。”(&b&这个……&/b&)(最近收到的简历看到很多说自己熟悉三级缓存的,于是我在网上搜了一下,终于找到“三级缓存”的出处了:&a href=&///?target=http%3A//blog.csdn.net/singwhatiwanna/article/details/9054001& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&android中图片的三级cache策略(内存、文件、网络) &i class=&icon-external&&&/i&&/a&原来是 &a data-hash=&13de39b981c8ada8131c0fbb212a7667& href=&///people/13de39b981c8ada8131c0fbb212a7667& class=&member_mention& data-tip=&p$b$13de39b981c8ada8131c0fbb212a7667& data-hovercard=&p$b$13de39b981c8ada8131c0fbb212a7667&&@singwhatiwanna&/a& 写的,难怪这么火。不过他在文中提到了,“其实&b&网络不算cache&/b&,这里姑且也把它划到缓存的&b&层次结构&/b&中”。)&br&“内存缓存你是怎么实现的?”&br&“用的一个HashMap。”&br&“直接用的HashMap吗?”&br&“嗯……嗯。”&br&“直接用HashMap的话,怎么防止你刚才提到的内存溢出呢?”&br&“你可以用软引用嘛。”(&b&首先答案有问题,另外当听到关键词“你可以”,多数情况下这个问题也可以结束了——八成是不会,仅仅听说过。不过出于谨慎还是继续问了&/b&)&br&“软引用就能防止内存溢出吗?”&br&“还有……还有谷歌出的一个叫LRUCache的。”(&b&回避正面回答,确认他是不会。这个问题结束。评级减一。到此就再没必要聊下去了。&/b&)&br&然后简单过渡一下,就结束了面试。&br&&br&所以你看,&b&只需要简单提问,然后接着对方的回答继续往深了问,就什么都问出来了。&/b&&br&&br&&br&&b&--------------------------------------------------------------------------------&/b&&br&&br&&br&评论中有人问到这次面试中我没有问完的问题的答案,那简单就说一下,想了解更多还请自行谷歌。&br&&br&Handler和AsyncTask:这俩类都是用来实现异步的,其中AsyncTask的集成度较高,使用简单,Handler则需要手动写Runnable或者Thread的代码;另外,由于AsyncTask内部实现了一个非常简单的线程池,实际上是只适用于轻量级的异步操作的,一般不应该用于网络操作。(感谢网友指正,AsyncTask 通过重写的方式是可以用于长耗时操作的,而我只考虑了直接使用的情况就说它不适合网络操作,是不对的。)我问他Handler和AsyncTask的区别,一方面是因为他说用AsyncTask联网,因此我认为他对AsyncTask并不熟悉;但更重要的是在我问他实现异步的具体手段的时候,他同时提到了Handler和AsyncTask——用这种“混搭”的使用方式来写联网框架,就算不考虑AsyncTask的可用性,也显得非常怪异,这听起来更像是在“列举Android实现异步操作最常用的类”,而非“讲述实现网络异步操作的具体方式”。也就是说,我听了这句话后开始怀疑他封装过联网框架这件事的真实性。但我只是怀疑,并不确定,因此接着问了我想问的。&br&&br&图片缓存:大多数情况下,内存中使用LRUCache是最合适的。如果用HashMap来实现,不是不可以,但完全没必要嘛!需要注意在合适的时候释放缓存。至于具体怎么释放,我没考虑过,但用软引用的问题在于,你很难控制缓存的大小,也就是说,只有等到你的内存快要撑爆,你的图片缓存才会被回收。是不是感觉傻傻的?(经网友指出,LRUCache 的内部实现就是用的 HashMap。由于我没有读过 LRUCache 的源码不知道这点,在评论里被大家骂惨了。)&br&&br&对于初级和中级工程师,我更倾向于考虑对方的学习能力,也就是你对于自己所做过的东西是否足够了解,而非要求你那里都强,因为就像我开头说的,&b&每个人由于经历不同,擅长的方向是千差万别的&/b&,我不喜欢挑别人的软肋问。只要你学习能力强,我就安全感满满哒!&br&至于高级工程师么……我还没面过呐!^_^
首先,面试官们一定要知道,每个人由于经历不同,擅长的方向是千差万别的,所以一定不要抓住自己擅长的某个方面去问的很深,觉得“如果连这个都不会还算毛程序员啊”。 所以我问问题的时候,往往是“两步走”的循环: 1. 问他做过什么,如果有成品的话,我…
这几年面过的各种Android开发也有三位数了,failed的不敢说,pass的基本都没有看走眼,来得晚了也想说说我的体会。&br&&br&一般面试时间短则30分钟,多则1个小时,这么点时间要全面考察一个人难度很大,需要一些技巧,这里我不局限于回答题主的问题,而是分享一下我个人关于如何做好Android技术面试的一些经验:&br&&br&&b&面试前的准备&/b&&br&&b&1. 简历调查&/b&&br&简历到你手上的时候,你要做好充分的调查分析,不仅仅是对公司负责,也是对自己与候选人时间的尊重,明显不match的简历,就不要抱着“要不喊过来试试看”的想法了,候选人也许很不错,但如果跟你的岗位不match, 也不要浪费大家时间,你要想清楚现在需要的人是有潜力可以培养的,还是亟需帮忙干活的。另外如果简历里附带了博客链接,GitHub地址,相关作品的,可以提前去看看,直接看人家多年积累的文章与代码,比这短短一小时的面试来得靠谱的多。&br&&br&&b&2. 准备问题&/b&&br&了解清楚候选人背景后,要根据简历,有针对性的准备问题,可以是他作品或做过项目里的某个技术细节的实现方式,也可以是他声称精通的某些领域的相关问题。总之不要等到面试过程中现想问题,特别是刚开始面试别人的同学,往往经验不足稍带紧张导致大脑短路,其实也是很尴尬的,把要问的问题提前写下来,准备充分。&br&&br&&b&考察哪些点?&/b&&br&&b&1. 简历是否真实&/b&&br&这其实是面试第一要务,面试的过程其实就是看简历是否属实的过程,因为能到面试环节,说明这个人是符合要求的,不满足要求的早就被剔除了,如果他真的如简历描述的那样,100%会招过来,如果人人都如此,那就不需要有面试这种过程了。&br&&br&需要注意的是这里的真实有三层含义:&br&&ul&&li&一是他如实描述了自身经历,很多人只在一些大项目里做一个很小的螺丝钉,但简历里往往夸张这段经历。&br&&/li&&li&二是不知道自己不知道,常见于简历里各种“精通”开头的描述,因为知识体系与视野的局限,明明只是了解很浅却夸口精通,很多时候他并不认为自己说的有问题,而是真的以为自己已然精通,有点井底之蛙的感觉。&br&&/li&&li&三是简历里的真实要与你的期望相匹配,一门技术了解到怎样的程度才算精通,很难有定论,所以这里的“真实”只能是候选人与面试官标准之间的契合,这种有主观运气成分,也许面试官水平不够错误判断了你,也不用感到不爽,面试何尝不是种双向选择呢。&br&&/li&&/ul&&br&&b&2. 技术的深度&/b&&br&技术的深度一向是我最看重的部分,当今任何一个技术领域都非常宽广,一个人要同时掌握那么多知识并且都深入几乎不可能,那都需要拼学习效率与工作年限了。而你曾经做过的东西,正在做的东西,是绝对可以了解得更深入的,一个对技术有好奇心,有技术热情的人,都不会仅仅停留在这个东西挺好用,而是会忍不住去探究它背后的技术原理,即便不是亲自去看源码,也会花点时间了解别人整理过的经验,所以单凭考察技术上的深度,就可以考察一个人是否对技术有热情,是否有技术好奇心等等这些很多大牛认为的所谓“优秀程序员的特征”。&br&&br&之前曾看到过一句话:“一个人对他所做的事情了解得越深,他就能做的越好”。放在这里再合适不过了。&br&&br&&b&3. 技术的广度&/b&&br&深度是有了,还需要广度吗?我个人的理解是:深度是必要条件,广度是加分项。同样的有技术好奇心的优秀程序员,也不会满足于仅仅局限于自己的一亩三分地,工作之余,也会想要尝试一些其它的领域和方向,因为投入问题也许不够深入,但很多领域知识你知道与不知道,对你个人知识体系的形成关系很大。比如你要实现一个功能,在你当前熟悉的技术领域上很困难或者效果不佳,在你就要放弃时你的同事告诉你,这用一个简单sql语句就可以实现啦,为什么要搞得那么麻烦?这个例子虽然举得很蹩脚,但是我想意思大家应该已经明白了。知识越有广度,头脑里的技术体系就越完备,同样的问题,你就可以想到N个解,思考一下就得出最优解了,如果你听都没听过一些东西,就会经常说出“这个好难搞啊”,“这根本就不可能”,其实有的时候真是知识的局限问题,所谓的从0到1难,也是这个意思。&br&&br&&b&4. 逻辑思维能力&/b&&br&这也是我比较看重的一点,这里并不是指那些臭名昭彰的脑经急转弯问题,而是通过交流观察,判断一个人表达观点逻辑是否清晰,回答问题是否有章法,这个很难描述,但如果你细心观察,你会发现很容易通过一些简单的交流,就可以看出一个人是否逻辑清晰。有时候你会觉得某个人表达沟通很不错,其实不是沟通的问题,是他说出去的话,经过了他大脑的条理清晰的整理,让你很容易就能明白。这种习惯不是一朝一夕就能养成的,所以面试过程中这点装不出来。&br&&br&另外一个人如果逻辑清晰,而且反应又敏捷,语速很快,那是大大的加分项,恭喜你,碰到一个聪明人了。&br&&br&&b&具体问哪些问题?&/b&&br&前面提到的是要重点考察的点,那么具体的Android开发,有没有一些通用的问题可以问的呢?我个人一般会从这几个角度考察候选人:&br&&br&&b&1. Android经验&/b&&br&如果不是校招,Android经验是必须的,我比较喜欢问一些基础概念与技术原理,比如Activity、View、Window的理解,各LaunchMode的使用场景,View的绘制流程,Touch事件机制,Android动画的原理,Handler, Looper的理解,Android跨进程通讯的方式,Binder的理解,Android Mashup设计的理解等等。&br&&br&&b&2. Java水平&/b&&br&基本上就是Effective Java那本书里提到的东西,如果你背完那本书里的问题,并且对答如流,没问题,就要你这样的。其实也会考察关于final用法,反射原理,注解原理,java编译过程,GC等一些常见问题。 &br&&br&&b&3. IT基础知识&/b&&br&其实就是计算机科班学生学校里学到的一些东西,在校招时这块是重点,社招会放宽,但一些基本的常识是要有的,比如不少人都不知道http的get post有啥区别,https的那个s是什么意思,讲不清进程与线程的概念,不知道二分算法是个啥东西。这些简单问题的筛选,可以过滤一些所谓野路子的程序员,是不是科班出身不重要,搞这行就得对一些基本常识有概念,不然以后怎么愉快的交流呢?&br&&br&&b&4. 代码质量的认识&/b&&br&我们需要的是一个对代码味道有感觉的人,关于这点,看下《Clean Code》就够了,面试中这点其实不好考察,可以让他聊一聊对代码质量的认识,虽然不能排除对方夸夸其谈,至少想法不多,只能提到命名风格这一点的人是不符合要求的,也可以在写Code的环节中观察。&br&&br&&b&5. 技术视野&/b&&br&比如对Android开发新技术的了解与学习,对其它流行技术领域的了解,这其实与我刚才提到的技术广度的考察有关,就我面试过程中,发现很多非互联网行业的从业人员,因为公司各种操蛋规定与公司技术氛围的原因,技术视野相当狭窄。&br&&br&我个人对这点深有体会,2011年我还在传统行业从事软件研发,当时的公司因为担心技术信息泄露,不让上网,相当封闭,我个人虽然自认为已在那个行业内做到业内专家的级别,但总感觉哪里不对,有一天我很兴奋的打算跟身边同事聊一聊Android的时候,发现他们居然都不知Android为何物?2011年啊同志们,当时的震惊无法言表,深切感觉到需要作出改变了,毅然放弃多年行业积累,转战移动互联网,直到现在。时至今日,多年前的小伙伴也有很多混出了名党,开始走向人生巅峰,我也从来没有后悔当初做出的选择。&br&&br&&b&6. 技术想象力&/b&&br&一个优秀的技术人,如果知识的深度与广度足够,知识已成体系,那么他对于一些从未接触过的领域,也是可以做出足够合理的想象与判断,面试过程中如果问到一些领域候选人没有涉猎,这时候一般不用过多纠缠,但如果你想借这个问题考察下他的技术想象力,可以深入下去,比如问他:“你觉得这个东西应该是什么原理呢?”,“这个酷炫的控件,如果要你来做,你会怎么实现?”。在这方面表现出色的同学无疑是有深厚基础与足够广度的人。&br&&br&&b&7. 技术习惯&/b&&br&好的程序员都会有好的习惯,比如各种快捷键的熟练应用,各种命令行的掌握,一些提高开发效率的工具与习惯,碰到问题是baidu还是google,有没有做一些小工具帮助减少重复工作,工作之余有没有继续学习?有没有看什么不错的书等等,这些小细节很大程度上决定了程序员的开发效率,这也是为什么很多人说一个优秀程序员抵得上100个普通程序员,这也是重要原因之一。&br&&br&&b&面试后的反馈:&/b&&br&面试一般不止一轮,你需要给出你的反馈,多轮面试结果一起考量,减少误判的风险,反馈一般怎么写呢?以下是我的建议:&br&&br&&b&1. 面试纪录&/b&&br&面试过程中的完整纪录,尽量客观评价,让其它面试官知道你问了哪些问题,回答的怎么样,也避免了重复问题的尴尬。&br&&br&&b&2. 优点与缺点&/b&&br&你的主观评价,亮点有哪些,你觉得哪些地方不够好?&br&&br&&b&3. 综合评价&/b&&br&你对候选人的综合评价,hire或者no hire的根本原因,如果有些地方感觉没考察清楚,期望其它面试官继续加强考察,也可以写上。&br&&br&&b&4. 怎样才给通过?&/b&&br&通过标准因人而异,每个人都有自己心中的bar, 但还是有些可直观考量的因素的:&br&&ul&&li&一是岗位的要求,不同的岗位标准当然不一样,校招与设招肯定也不一样。&br&&/li&&li&二是岗位的紧急程度,兄弟们天天加班忙死了,赶紧找人过来帮忙吧哈哈。&br&&/li&&li&三是候选人的年龄,大龄程序员莫怪,一把年纪了还跟刚毕业一两年的同事一个水平,说明成长太慢,做技术的潜力有限,这个大家应该能理解。&br&&/li&&li&四是前面提到的做技术的深度,这个是必须的,广度也要有一些,视野不能太窄。&br&&/li&&li&五是要有亮点,大家在面试的过程中要注意发掘亮点,有时候他问题很多但有一个足够的亮点也够了,用心观察也发现不了什么亮点的,就要注意了。&br&&/li&&/ul&&br&说了这么多,其实最重要的就是一句话,问问你自己:&b&你真的原意跟那个家伙一起并肩战斗吗?&/b&&br&&br&我最近运营了一个微信公众号AndroidTrending,主要专注Android最佳实践,经验分享等,大家有兴趣的欢迎前往关注,我会定期更新一些开发经验到上面。&br&&p&&a href=&///?target=http%3A///r/6kxxaWbEHztgrSIK9xn4& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/r/6kxxaWb&/span&&span class=&invisible&&EHztgrSIK9xn4&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a& (二维码自动识别)&/p&
这几年面过的各种Android开发也有三位数了,failed的不敢说,pass的基本都没有看走眼,来得晚了也想说说我的体会。 一般面试时间短则30分钟,多则1个小时,这么点时间要全面考察一个人难度很大,需要一些技巧,这里我不局限于回答题主的问题,而是分享一下…
已有帐号?
无法登录?
社交帐号登录
472 人关注
104 人关注
6639 条内容
3538 人关注
121 条内容
483 人关注
1236 条内容}

我要回帖

更多关于 面试时应该注意的问题 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信