面试公司:百度、腾讯、阿里、今日头条、美团、京东、去哪儿、CVTE、神州数码、知道创宇、intel
面试职位:web渗透测试工程师(安全方向)、JAVA开发工程师、测试开发工程师 春招结果:百度(hr通知准备三面,结果被放鸽子)、阿里(测开offer)、今日头条(测开offer)、腾讯(现场面没去)、美团(Java开发offer)、cvte(java开发,hr面挂在城市选择,不愿意去深圳)、知道创宇(web渗透工程师offer)、神州数码(java开发offer)、intel(android内核开发)
lz最后选了美团,如下的面经按照时间顺序,每一块分为面试问题+面试准备+最后总结
知道创宇
面试岗位:web渗透测试工程师 面试时间:2017.02.28
面试形式:线程面(由于个人原因,在北京,所以现场面)
面试问题:开门见山,自我介绍(3-5min),问简历项目,由于只有读研后接触到网络安全,所以只是针对渗透方面问了很基础问题:sql注入3种类型,提权有几种方式,渗透工具会哪些,项目中承担了什么样的角色,最后结果怎么样,入侵一个网站有哪些方法等。
面试结果:答得不好,缺乏实践,但是给了offer,比较水的一次面试吧。 个人总结:没有做任何准备,其次安全方面差的太多,也就是后面面试改了自己的方向,
阿里巴巴
面试岗位:Java研发工程师(内推) 面试形式:远程电面
面试问题(一面2017.03.08):自我介绍,java数据结构,HashMap原理,自定义类型可以作为Key吗,(10分钟都在说HashMap),java内存模型,知道的排序算法,重点问了快排,快排的优化,Java多线程实现方式,Java线程与进程区别。
面试结果:问了29分钟,回答很糟糕,面试官评价中等偏上。
面试问题(二面2017.03.11):自我介绍,java线程与进程差别、JVM内存模型+垃圾回收算法、Java
HashMap实现原理、操作系统同步方式、通信方式、计算机网络三次握手四次分手以及wait_time三种差别、Http
post和get差别,http状态吗,在线写了一个判断单链表有没有环、最后问了个人兴趣爱好、终面可以来杭州吗等私人问题。
面试结果:问了2个小时,但是由于没有听清楚是蚂蚁花呗,以为是杭州别的小公司,最后很傻的挂了面试官电话(当时有点失望,以为是阿里结果不是),很可惜的没有后面了,,情商真的很重要很重要,要不然就过了。 面试总结:JVM答得很好,16年年末,看过《深入理解Java虚拟机》;内推刚开始问的问题,真的很简单,答不出来一定会被pass,但是,个人没有认真准备,只是看了网上一些很肤浅的帖子,正确做法是:去看书、去看书、去系统的看书,没有来不及。
面试岗位:测试开发工程师(网上校招) 面试形式:远程视频
面试时间:2017.05.24-2017.06.01 面试内容:一面(05.22)自我介绍+自由发挥:Java内存模型、Java类加载过程、JVM解释编译执行过程、测试方法、还聊了一些个人方面的问题;
二面(05.24)自我介绍+自由发挥,按照简历问,可能是因为测开简单吧,问的问题很简单:平时遇到的App有哪些bug,问题可能出在哪;测试与开发的差别;对测试的理解;瞎扯了一下最近发生的安全问题;看待加班;个人观念三面(05.24)Hr面,阿里hr真的好厉害,而且是个中年大姐,每一问都不知道言外之意是什么,所以回答的很小心谨慎;问题:大学当项目组长如何协调组员关系、分配任务;遇到的学习困难,技术难点怎么解决;家庭情况,家庭地址;职业规划 面试结果:06.01收到offer,比第一次简单很多。但是,如果是java开发估计也会挂,java开发缺乏太多东西,太差劲了。有时候,要及时调整方向,个人对自己开发没有信心,但是测开可以碾压所有的测试女生,lz很自信。
百度
面试岗位:测试开发工程师(内推) 面试形式:电面
面试内容:(一面2017.04.10)说好下午14:00开始,结果一直没打电话,到了晚上问了hr,才想起来给我打电话,(百度真的太不守时了,很失望),自我介绍+结合简历问的,大部分问的是web渗透测试,安全那些问题漏洞利用+sql注入,问了一个算法,剑指offer第一题,我都说了不会c,java可以很快的完成,但是面试官一直让用c做;(二面2017.04.11)时间定于14:00,结果改为16:00,还好是学姐,问了一个算法题目,把一个数再分解为因子,找到因子和最小的分解,java
NIO等,具体记不清啦。接着,,hr电话通知14号三面,让好好准备,结果没有音讯。。。 面试结果:不知道百度,怎么想的,为什么要糊弄人,真的很气人。。
腾讯
面试岗位:java开发工程师(内推) 面试形式:电面
面试内容:(一面03.17)自我介绍+建立项目内容,其余的记得不是很清楚了,唯一一个算法,当内存放不下大规模的数据,需要按照什么方法去取,,当时面试官给的答案是并发。,我以为是归并算法。
面试结果:一面以后没有任何信息,虽然面了1h,以为希望很大。 后期,在线网申,得到到现场面试机会,只是填的是qq邮箱,等看到邮件的时候已经过了日期,可惜~~
今日头条
面试岗位:Java研发工程师(内推) 面试时间:2017.03.22 面试形式:远程视频
面试内容:数据库引擎类型与差别,数据库索引类型,唯一索引和普通索引差别,在线算法,找出增序排列中一个数字第一次和最后一次出现的数组下标,数据去重,海量数据去重,找出海量数据中前10个最大的数(数据有重复)。
面试结果:赤果果的挂了,现在看来这些问题都很简单,可惜当时没有答出来,其次,海量数据这里用到了聚类的思想,这次面试含金量特别高,但是没有问道java基础,后来才知道面试官不是做java开发的,不过,面试官说的厚积薄发很中肯。
面试岗位:测试开发工程师(校招) 面试时间:2017.04.12(一下午面完) 面试形式:远程视频
面试内容:(一面)自我介绍+在线编程:单例模式、内推时的相同算法+多线程创建;java
范围关键public以及其他几个;线程与进程差别;java抽象类与接口差别(二面)给定区间[1,3],[2,5],[5,8],[12,55],[3,6],[7,8],最后给出合并后的结果[1,8],[12,15],在线编程,(三面)自我介绍+项目经历,linux查看线程,linux
vim 。
面试结果:不得不说今日头条效率高效,从开始面试到offer发放,总共3.5h,效率极其高,今日头条测试开发岗位明显简单了好多好多,和开发不是一个级别的,我同学笔试4个题accept
330%的大牛,最后都挂了。
美团大众点评
面试岗位:java开发工程师(在线网申) 面试形式:电面
面试时间:2017.05.12-2017.05.17
面试内容:(一面05.12)自我介绍+项目经历,算法:数组先升序在降序,找出最大数,jvm内存模型,java线程与进程差别(二面05.17)自我介绍+项目经历,算法:正整数数组,拼出一个最大的正数;java
NIO,java 多线程、线程池,java 网络编程解决并发量,java内存模型,数据库的隔离级别,Mysql
存储引擎以及差别。(三面05.17)很快,中午12电,二面1h后,hr电话打来,商量入职时间等。 面试结果:成功拿到offer,可能后期美团面试难度没有那么高,其次准备也比较充分了,看了很多相关的书籍吧。充分准备才是面试取胜的关键。
Intel
面试岗位:Android内核开发(内推) 面试形式:电面
面试内容:(一面03.5)自我介绍+项目,算法:一个正整数数组,给其中一个数字加1,使得所有数乘积最大,找出加1的那个数字。Linux常用命令列举10个,python常用的类库,实习时间,(二面03.13)实习时间、java内存模型、java
访问范围关键字从大到小列举以及差别,java抽象类与接口区别、java线程与进程差别、linux查看进程并杀死的命令。(三面03.15)hr小姐姐,商量入职时间以及入职薪资等问题。 面试结果:Intel是所有offer中第一个拿到的,只是专业不对口,是linux平台下的内核开发,主要用c和python开发,个人感觉,放弃java很可惜,所以不太满意这个offer。
去哪儿
面试岗位:Java开发工程师 面试形式:现场面试 面试时间:2017.04.21
面试内容:(一面)首先说一下,去哪儿是唯一一个在现场酒店面试的公司,可能是工作人员的失误,时间从14:00一直等到17:00才轮到我,看着其他的面试者一个一个都面,只有我一直在等,到最后确实是生气了,很生气。问题:自我介绍+项目经历。问题:抽象类与接口的差别,抽象类可以有实例吗?String类可以继承吗?synchronizated
和lock差别?HashMap实现原理,同步还是异步?java地址和值传递的例子,Collection集合类中只能在Iterator中删除元素的原因,Mysql
存储引擎类别以及差别。 面试结果:一面就挂了,问的很多问题一方面自己不会,另一方面,由于等待时间太长,和前台工作人员闹了不愉快,可能面试官觉得我个人有问题吧,所以pass的很快,不过也是一次经验获得,不管等多久,态度都要谦和。
京东
面试岗位:Java开发工程师 面试形式:电面 面试时间:2017.04.17
面试内容:(一面)自我介绍+项目经历,问题:Mysql索引实现原理,Mysql
ACID具体,隔离级别,隔离级别如何实现,Java多线程,线程池有哪几类,每一类的差别,synchronized
实现原理,HasnMap实现原理,扩容因子过大过小的缺点,扩容过程。 面试结果:每一问答得都很糟糕,尤其是数据库那一块,根本不熟悉,纯属胡说。项目经历回答也很糟糕,此外,面试官思路超级清晰,这么多面试中最欣赏的面试官,废话没有,条理很清晰,言简意赅。
CVTE
面试岗位:Java开发工程师 面试形式:电面+视频面试
面试时间:2017.04.07-2017.04.10
面试内容:(一面04.07)问题:Java内存模型,Java
Collection,Mysql存储引擎类别和区别,平时学习方法,最近在学习什么,实习时间(二面04.10)问题:自我介绍+项目经历,问题:在线程序二分查找,HashMap实现原理,Java
Nio,自己个人职业规划,实习城市要求,个人兴趣爱好。 面试结果:被pass,自我感觉面试答题还不错,但是最后被pass,问题出在,面试官想让我去广州,但是我一直在强调北京,所以,败在情商。
神州数码
面试职位:Java开发工程师 面试形式:电面 面试时间:2017.04.03
面试内容:(一面)大约半个小时,问题很基础,都是java基础问题,以及结合项目问了项目中的问题。 面试结果:只有一次面试,就通过了,是面试中最容易的一次,问题没有问出新花样,所以也没有在意,就当作是积累经验。
总结
积累、积累、再积累。推荐系统的去看相关书籍,不是看帖子,没有用处。推荐书籍如下《深入理解Java虚拟机》、《EffectiveJava》、《深入分析Javaweb技术内幕》、《高级数据库原理》、《剑指Offer》+牛客在线编程、《Java并发编程实战》、《Java编程思想》
注:lz还没有看完,有些没看懂,但是最起码知道面试官问的问题的深浅,以及要怎么回答;其次,情商很重要,有些话不能乱说。
一个优秀的程序员是如何炼成的?他们关注什么?问一下自己这个问题会很有意思。这能让你好好思考一下软件开发的过程。拿它来问一下同事也不错,这能引起一些关于如何一起协作的很有意思的讨论。下面是我认为成为一名优秀的程序员所必需的5个技能。
问题分解
编程讲的是如何解决问题。但在你开始写代码之前,你需要清楚如何解决问题。一个好的程序员应该得拥有这样的技能,他能将问题分解成子问题,直到每个子问题都可以很轻松地进行解决。不过要找到一个解决问题的方式可不是件简单的事。好的程序员能够很好的对问题进行建模,这样写出来的程序很容易能看懂,很容易实现及测试。
我所见识过的一些复杂的程序,它们之所以这么复杂,部分原因是由于它的实现并不适合对应的问题。这导致代码很难理解。我很同意Bernie Cosell关于问题建模方面的看法:
“很少有程序天生就是复杂的。如果你看到一段非常晦涩的代码——你无法理解它到底要做什么——这通常就意味着它的实现非常糟糕。这个时候不要撸起衣袖就开始修改代码,而是应该退一步,好好地重新思考一下 。当你把整个问题都想透了,你会发现问题其实很简单。“
场景分析
好的开发人员应当能够考虑到程序的不同场景。这不仅是指程序的逻辑,同样还有的是可能会发生的内外部的事件。要想考虑到业务逻辑的不同路径,你可能会提出这样的问题:如果这个参数为空的话会怎样?如果这些条件都不为真的话呢 ?这个方法是线程安全的吗?为了弄清楚程序到底需要解决哪类的问题,你可能会问自己:如果队列为空的话怎么办?或者这个请求没有响应?如果这个服务器重启的时候,别的服务器也在重启该怎么办?
好的程序员应该会问自己:什么情况下它会出现问题?也就是说,他们能够像测试人员一样看待问题。反过来 ,没有经验的程序员通常只考虑程序主逻辑——也就是当所有事情都如预期时的正常的控制流程。不过一旦发生了异常情况,程序必须得能够应对它。
命名
程序编写涉及到许多命名的问题:类,方法以及变量。如果做得好的话,程序应当是自文档型的,也就是说通过读源码就能很清晰地理解程序的意图。自文档型代码的一个结果就是方法通常会更短,而不是使用很长的方法,这是因为小的方法,你才可以有更多的地方来赋予一些有意义的名字。
好的名字可比想像中的要困难得多。我喜欢Phil Karlton说的这段话:”计算机科学里只有两件难事:缓存失效以及命名“。命名之所以这么难是由于你得清楚每个名字都代表着什么。有的时候事情并不会那么明朗 ,只有开发到达一定程度的时候才会清楚。也就是说,重命名和命名一样非常重要。
好的命名同样也包括你所提出的概念以及这些概念到底叫什么。如果仔细地思考过这点的话,不同名字的概念应当是始终一致的(在程序中,不管是和程序员还是非程序员讨论业务领域时都用的是相同的概念),这样写程序就会非常容易。
一致性
或许写程序里面最大的挑战就是管理的复杂性了。一致性是对抗复杂性的一种方式。它让我们看到了问题的固有模式,让我们可以推论出东西该如何命名,使用以及处理,这在一定程度上减少了复杂性。达到一致性之后, 我们不用再费精力去记住异常情况以及随机的变动。我们可以聚焦于问题的本质复杂度,而不是偶然复杂度。
一致性是非常重要的。它包括变量名及分组,方法命名,模块的划分,目录结构,GUI,错误处理,日志,文档,等等。比如说,如果有一些变量是关联的并且出现在一起,那么就应当始终按照同样的顺序来使用它们。这样的话,如果漏掉了一个或者将它们搞混了就能够很容易发现。对于某个操作而言,如果它在某个地方是叫做delete,那么就不要在另一个地方把它称为remove——要坚持使用同样的名字。 Steve McConnell在代码大全中关于准确地使用反义词有一些不错的建议。比如说,begin和end是反义词,同样的还有start和stop。不要混合不同分组的词语(比如begin和stop)。
修改程序可能会导致不一致。草率的程序员是不会注意到他们添加的代码是不是与现有的代码一致的。好的程序员会确保每一个细节都是正确的。他们知道一致性对于减少复杂性有多么重要。
学习
作为一名软件开发人员,你需要不停地学习。在增加一个新特性之前,你必须知道它是要做什么。在往一个现有的程序中增加代码之前,你通常都要学习现有的代码是做什么的,这样才能正确地实现新功能。你还得了解周边的系统 ,这样才能正确地和它们进行交互。快速的学习能力可以让你成为一名高效的开发人员。
更有甚者,由于软件工程领域的发展速度实在是太快了,会不断地涌现出许多 新的语言,工具,技术以及框架。这是把双刃剑。Fred Brooks把学习看作是一种娱乐。学习新东西,乐在其中矣。这也意味着程序员的生活永远不会枯燥。
结论
上面讲的都是一些比较通用的技能——它们并不特定于某个语言,框架或者技术。如果你具备了这些技能,你可以快速地学习一门新语言或者一个新工具,并用它们编写出优秀的软件。更重要的是,由于它们具备通用性的本质,即使多年过后也仍不会过时。
从2006年上大学到现在接触编程已经11年,可以自称自己是一个老鸟了,突然想 盘点一下自己都学过写什么,总结总结吧、、、、、、
2006年 c、sqlserver、计算机基础
2007年 java、jsp、 xml、html、 struts、 spring、 hibernate、 javascript、oracle、linux
2008年 uml、 springmvc、 dwr、 lucene、 ruby on rails、uml、mysql
2009年 struts2、blackberry 、weblogic、jboss、jbpm
2010年 xfire、axis2、poi
2011年 rapid-framework php、cms、cas、liferay、nutch
2012年 ocr, tts、httpclient、birt、discuz、dedecms
2013年 hadoop mapreduce drools android
2014年maven、jetty nexus、bootstrap、nodejs、dubbo、zookeeper、memcached、redis、loadrunner、nginx
2015年 openfire、jenkins、auicss 、logstash、elasticsearch、API-cloud、cocos2dx
2016年 docker、spring restfull、swagger2、qrcode、oauth
2017年 spring boot、spring data、 acitvemq、otter、cxf
再多的记不清楚了 ,其中肯定没写到的很多、我想正在学习编程的菜鸟们看了,放弃这个行业的不在少数。
献给所有曾经 通宵达旦、冥思苦想、废寝忘食为IT技术奉献青春的程序员们
如有什么建议和疑问,欢迎留言讨论。
欢迎大家加群技术交流:367685933
网友评论