你能够尝试着讲一遍你的项目经历。我第一次讲的时候就挺乱的,卡壳、专业词汇匮乏、逻辑混乱、用词不当、没有介绍到项目重点……android
项目经验面试在面试中占很大比重,面试官经过一些专业性的技术问题来了解你的技术水平,问题从哪来?要么来源于结构化面试题库(每一个面试者的问题都同样,多出如今校招一面),要么,就是从你的简历中项目经验来。因此对项目总体而深刻复习的重要性不言而喻。git
介绍项目时面试官会考察应聘者的沟通能力和思考能力,咱们大部分状况都是作产品的一个功能或一个模块,可是即便是这样,本身有没有把整个系统架构或产品搞清楚,并能介绍清楚,为何作这个系统?这个系统的价值是什么?这个系统有哪些功能?优缺点有哪些?若是让你从新设计这个系统你会如何设计?这些都是值得你好好思考的。github
这部分技巧对简历上的项目介绍也是通用的。面试
首先用一句话介绍这个项目作了什么,打个比方,我使用XX 框架实现了一个 XX算法
主要功能 数据库
挑亮点和创新点讲,细碎的功能点一句带过。 设计模式
而后讲基本的实现:主要运用到的技术点有XXX。 缓存
(这里面试官从你介绍的技术点切入考察,因此要好好回顾复习项目中运用到的技术点细节。)性能优化
架构服务器
(面试官还会问一问为何你选了这样的架构/方法来实现。)
我在项目中的角色
主要介绍项目中的职责和做用,是多面手 or 组长 or 技术 。这点主要凸显你的工做量和贡献率。
注:能够在简历上附上项目github地址,上传重点功能的演示 gif ,让面试官能够很直观地评估你的项目规模和难度。
知己知彼,摸清面试官心理,你才能有针对性去准备。
考察深度:深刻了解哪一个技术?
整个项目中用到了哪些开源框架?他们的实现思路是什么?你看过他们的源码吗?你不只仅是要会用开源库和第三方SDK,还须要知道实现原理和技术细节。否则一个都是第三方堆砌起来的App,问这个说不了解,用的第三方框架,问哪一个说不了解,用的SDK,你还要面试官问什么?[摊手]
考察广度
在进行技术选型的时候,你有过什么考虑,作过多少调查。详细地了解不一样的工具/框架 思想的对比。最后是什么缘由,你选定了这个技术。记住一句话:技术没有优劣,只有合不合适。功能点的实现方式有不少,每每选择的是最适合的。
同时面试官可能会考察你是否关注产品数据,是否关注合理的工做流程,是否关注先后台交互时的相关知识和流程,是否关注测试自动化、持续集成等其余方面。
作项目中怎么解决问题?
主要展现本身解决问题的思路。
触类旁通的能力
面试官会提出和项目技术相似的点,考察你是否能将新知识点联系到已学的技术,而后尝试解决它。
优化项目哪些部分
面试官意在考察你的思考力和动手能力,开源库多多少少都会有坑,你是否在应用中排查出坑而且能埋坑。
如何快速学习项目须要的技术点
首先,找资料顺序是:官网文档->权威书籍->google->StackOverflow->博客。其次,新技术的学习很是考验基础。打个比方,没学过RxJava,可是若是你知道设计模式的观察者模式,理解起来就很快。
sdk的细节了解在哪里
本身造轮子确实费时间,可是你又是否知道SDK作了哪些优化?
自定义控件优化
做品对比
本身的项目有没有和市面上的竞品比较过,客观地评价下从别人的做品中学到了什么,基于此你有没有改进本身的做品?
算法
主要是一些坑和解决思路、解决的灵感来源等,在项目中确定会涉及到数据结构,好比缓存最近100条点击记录,超出100条则移除最先缓存的记录,本身实现。可能你会想到用队列或堆实现,那能够去看看缓存算法Lru算法的原理,用的什么容器,为何这么设计?
在面试的过程当中,悄声无息进行的还有另外一项考察 —— 沟通能力。想一想本身面谈时是否能让面试官感受舒服,是否能清晰表达本身的要点,是否能清晰表达本身将来的我的发展规划。能够尝试模拟面试录下音,看是否有过多的语气词表达出的不自信。
说了这么多,搞个直观的例子谈谈。
问:
项目中推送是怎么实现的?
答:
刚开始作推送的时候,对目前主流的推送方案大体了解了一下。发现推送实现不止一种。
(展现技术选型和方案,简单谈下就ok)
(1)GCM服务
优势:Google提供的服务、原生、简单,无需实现和部署服务端。
缺点:该服务在国内不够稳定、须要用户绑定Google账号。
(2)XMPP:
优势:开放性,标准性,可扩展,跨平台,且已有开源项目。
缺点:数据冗余(基于XML),不支持二进制数据,协议虽然完整扩展性虽然好,它耗费网络流量很大,跑起来比MQTT慢不少;有高达70%的流量是耗费在XMPP自己的标签和编解码上面。
(3)MQTT
优势:协议简洁、小巧、可扩展性强、省流量、省电。
缺点:不够成熟、实现较复杂、服务端组件rsmb不开源,部署硬件成本较高。
(4)HTTP轮循
优势:实现简单、可控性强,部署硬件成本低。
缺点:实时性差。
(体现技术细节)
因此后续选型,我选择了 XMPP + MINA + AndroidPN 来实现推送。
(体现项目优化改进之处,体现本身的思考和能力,对开源项目进行改造)
可是 AndroidPN 开源项目也存在一些不足之处:
若是将消息从服务器上推送出去,就再也不管理了。
个人作法是:客户端收到推送后给服务端一个反馈,若是服务端在必定时间内没有收到反馈,则重发。
androidpn服务器收到消息后如何知道要发给哪一个用户?
因此我加了个tag维度来作用户分组
一旦服务器重启了,客户端彷佛不会自动重连,须要用户本身中断后台Service再重启应用。
完善的方法是加上心跳机制和断线重连
AndroidPN服务器不保存消息。就是说它一有消息就会发出去,即便客户端根本不在线,它也不会重发。
解决方案是让服务端保持对客户端状态的监控
再问:
怎么不用现有的极光推送?
答:
极光推送初始的版本文档不全,接入麻烦,同时我对推送的原理很感兴趣,因此想本身实践下。
最后,是面试官针对项目面试可能提出的问题汇总。
你参与的项目是独立完成的仍是团队协做完成的,在团队里是什么角色?是负责人仍是参与者?
项目执行过程当中的难题你是怎么处理的?
问一些专业性的技术问题来了解你的水平。
若是是没有明确结果的项目,你从项目里学到了什么,有什么经验教训?
看你的项目经验,还有思惟逻辑性,对项目总体的认识,包括技术的选型和架构的设计等等。
项目技术点具体的使用场景,好比多线程的控制、性能优化、数据库设计、加密混淆等等。
挑一个你最熟悉的项目讲讲吧。
讲解你是怎么从0到1对项目进行开发和改造的。
题目确立 -> 产品需求开发 -> 概要设计 -> 详细设计 -> 测试用例 -> 编码 -> 测试 -> 优化 -> 宣传视频海报的制做。
固然,存在有的面试官倾向于问一些开放性的问题。主要看重你是如何解决问题的,看你的思惟方式是怎么发散的。
好比面试官问我,你为何以为你作的产品就比别人好?你为何要对大家的产品进行性能优化,主要瓶颈在哪里?你是经过什么方式进行优化?你优化的点是怎么考虑的?你在使用第三方服务是处于什么目的,你对它的评价是什么,它们给你带来的好处是什么?让你去思考如何更好的为开发者提供服务,你以为还有什么东西是开发者须要的?你对开发工具类产品感兴趣吗?
能够从这些问题看出,面试官并不只仅看重你的技术能力,还有你对产品的认识。面试官想找的人不只仅要在技术上有亮点,还有其余方面能吸引到他们。
最重要的一点:不知道的技术点不要不懂装懂。不少时候咱们都会遇到一个状况,就是面试官的问题我不会,这时候大多数状况下不要立刻说我不会,也不要糊弄回答,要懂得牵引,转移话题往相似的你擅长的技术点方向去,否则当你抱着侥幸心理随便回答出问题后,面试官会一直沿着往下深挖,挖到挖不出来为止,这就很尴尬了。