第一阶段:三年我觉得三年是程序员的第一道门槛。这个阶段会淘汰一批不适合写代码的人。这个阶段,我们走出校园,走入社会,成为一名程序员,正式从书本上的内容走向真正的企业级开发。我们知道如何团队合作,如何使用项目管理工具,如何控制项目版本,如何测试和运行我们编写的代码等等,积累了一定的开发经验,有一定的in-对代码的深入理解。纯编码器阶段。第二阶段:五年五年是区分程序员的第二个门槛。有的人,这三年除了完成工作,闲暇时间也不会去研究别的东西。这些人永远是Coder,年纪大的必然会被年轻人取代;除了代码,我也热衷于研究各种技术实现细节,阅读很多好书,写一些博客,在Github上分享技术。这些人必须有能力在技术上独立,知道自己五年后的未来。发展方向,从Coder到系统分析师或架构师,成为项目组中不可或缺的人物。第三阶段:十年十年又是一个门槛,转行或者继续做程序员都在这个节点。如果你在过去的几年里下定决心不转行并为之努力,那么在十年的这个节点上,有些人必然会成长为一个对行业有深刻理解的人,对行业有深刻理解的人。的技术,并且可以从头开始。分析一个产品的程序员,这种人基本都担任着公司最关键的职位,比如CTO、技术专家、首席架构师等等,我绝对不会亏待你的。总结第一部分,我觉得随着你工作年限的增长,对生活理解的加深,你应该不断思考三个问题:1、我适合做程序员吗?2.我应该一辈子做程序员吗?3、我对编程抱什么样的态度?是否足以使用或继续研究?最后,明确自己的职业规划,对自己的规划负责并为之努力。关于项目经验,经常在网上看到一些其他朋友问项目经验的问题。根据我的面试感受,面试主要看几个点:项目经验+基础技术+个人潜力(即是否值得培养)。关于项目经历,我觉得方腾飞老师的话很好:在介绍产品的时候,面试官会考验应聘者的沟通和思考能力。大多数情况下,我们是在做产品的一个功能或者一个模块,但是即使这样,你有没有把整个系统架构或者产品搞清楚,你能说清楚你为什么做这个系统吗?这个系统的价值是什么?这个系统有什么功能?有什么优点和缺点?如果让你重新设计这个系统,你会如何设计?我认为这足以概括它。也许你只工作了一年,也许你在做项目中无足轻重的模块,当然这些肯定是你的劣势,无法改变,但如何弥补这个劣势呢?由此,我总结几点:1、明确自己的项目是做什么的,有什么功能。2.明确你项目的整体结构。面试的时候可以清晰的画给面试官看,明确指出从哪里调用,用什么方法调用。3.明确你的模块在整个项目中的位置和作用。4.清楚你的模块中使用了哪些技术,更好的是,整个项目中使用了哪些技术。在不能改变工作年限和不太有说服力的项目经历的情况下(这个必须扣项),可以通过这种方式一定程度上弥补,提高面试官对你的好感度.灵敏度。写完专业技能项目,写一个3年工作经验的Java程序员应该具备的技能。这可能是Java程序员比较关心的。在这里要说明一下,下面列出的内容不是每个人都会知道的——但是如果你掌握的越多,最终能拿到的评价和薪水必然会更高。1.基本语法这包括static、final、transient等关键字的作用,foreach循环的原理等。在今天的采访中,我问了大家static关键字的作用是什么。如果你回答静态修改变量和修改方法,我就认为你合格。如果你回答静态块,我会认为你很好。如果你回答静态内部类,我会觉得你很好。,如果你回答静态导入包,我会很满意你,因为可以看出你非常热衷于研究技术。最深入的一次,记得面试官直接问我Volatile关键字的底层实现原理(顺便说一句,面试和面试本身是相对的,面试官可以问这个问题也让面试官感觉面试官也是一个喜欢研究技术的人增加面试官对公司的好感度,最后还是选择了问这个问题的公司),不要觉得这个太挑剔了——越简单的问题越喜欢能看出一个人的水平,别人对你技术的考量大多是先深度,后广度,切记。2.收藏很重要,一定要问。基本上,它是List、Map和Set。问的是各种实现类的底层实现原理,以及实现类的优缺点。Collection需要掌握ArrayList、LinkedList、Hashtable、HashMap、ConcurrentHashMap、HashSet的实现原理,能够流利的答题。当然,如果能掌握CopyOnWrite容器和Queue就更好了。另外,ConcurrentHashMap的问题在面试中被问的比较多,可能是因为这个类可以出很多题。关于ConcurrentHashMap,我给网友们提供三个答案或者研究方向:(1)ConcurrentHashMap锁切分技术。(2)ConcurrentHashMap的读取是否需要加锁,为什么。(3)ConcurrentHashMap的迭代器是强一致迭代器还是弱一致迭代器。3.设计模式本来以为是很重要的一个内容,结果在阿里巴巴B2B事业部面试的时候只问了一次。当时的问题是关于装饰者模式的。当然,我们不能这么功利。学习面试,设计模式在工作中还是非常重要和有用的。在23种设计模式中,关注常用的十几种就足够了。面试中关于设计模式的问答主要是三种。两个方向:(1)你的项目中使用了哪些设计模式,如何使用。(2)了解常用设计模式的优缺点。(3)能够绘制常用设计模式的UML图。4.多线程这也是必问的。因为三年的工作经验,基本不会问你多线程是怎么实现的。Thread和Runnable的区别和联系,线程多次启动会发生什么,线程有哪些状态等更深入的问题我会问。当然,这只是最基本的。没想到几个面试几乎同时问了一个问题,而且问的方式不一样。总结一下就是这样的意思:如果有Thread1、Thread2、ThreadD3、Thread4四个线程,分别统计C、D、E、F盘的大小,所有线程都统计完交给Thread5总结一下,应该如何实施?聪明的网友对这个问题有答案吗?不难,java.util.concurrent下有现成的类。另外,线程池也是一个经常被问到的问题。常用的线程池有几种?这几种线程池有什么区别和联系?线程池的实现原理是什么?为了更实际,我给你一些具体的场景,请你回答这种场景用什么样的线程池比较合适。最后,虽然这次面试题目不多,但是多线程同步和锁也是重点。synchronized和ReentrantLock的区别,synchronized锁的普通方法和锁的静态方法,死锁的原理和排查方法等。5.JDK源码想拿高薪,一定要看JDK源码代码。以上内容也可能与具体场景有关。JDK源码就是看你平时喜不喜欢研究。在我的面试中,我被问了很多关于JDK源代码的问题,其中一个最棘手的问题是问我String的hashCode()方法是如何实现的。好在我平时看了很多String源码,所以给出了一个大概的答案。JDK源码其实没什么好总结的。纯属个人,总结一下比较重要的源码:(1)List、Map、Set实现类的源码(2)ReentrantLock和AQS的源码(3)AtomicInteger的实现原理,主要可以清楚讲解CAS机制以及??如何使用CAS机制实现AtomicInteger(4)线程池的实现原理(5)Object类中的方法以及每个方法的功能其实要求还是挺高的。我基本上把JDK中重要类的源码都研究了个遍,真是费时费力。当然,回过头来看,还是值得的——不仅仅是为了面试。6.框架是老生常谈,面试必须要问的东西。一般来说,我会问你项目中使用的框架,然后给你一些场景,问你如何使用框架。比如在Spring初始化bean的时候想做什么,bean销毁的时候怎么办?有些东西是怎么做的,MyBatis中$和#的区别等等,这些比较实用。好好积累,多了解框架的细节,自然不是问题。如果以上问题回答得好,面试官往往会深入询问框架的实现原理。问得最多的就是SpringAOP的实现原理了。当然,这个很简单,两句话就可以搞定,即使你不知道如何准备。我遇到的最变态的事情就是让我画一张Spring的Bean工厂实现的UML图。这么深的问题我当然回答不了/(ㄒoㄒ)/~~7.数据库数据库十有八九也会问。union和unionall的区别,leftjoin,几个索引以及它们的区别等基本的东西就不说了。更重要的是数据库性能的优化。面试前花一两天准备SQL基础和SQL优化的内容。但是,无需担心数据库。一个公司往往有很多部门。如果你对数据库不熟悉,基础技术好,90%的人都会问你。估计你会被安排在一个对数据库使用要求不是很高的部门。锻炼一下。8.数据结构与算法分析数据结构与算法分析,对于一个程序员来说,总比没有好,在工作中肯定能派上用场。数组和链表是基础。栈和队列稍微深一点,但不难。树木非常重要。比较重要的树是AVL树和红黑树。你不需要了解它们的具体实现,但你必须知道什么是二叉搜索树,平衡树、AVL树和红黑树有什么区别。记得有一次面试,面试官和我聊到数据库的索引,他问我:你知道索引用的是哪种数据结构实现吗?我回答了Hashtableused,但是我答错了。他又问,你知道为什么要用树吗?我回答是因为Hash表的冲突可能比较多,面对几千万甚至上亿的数据,查找的时间复杂度会大大增加。树比较稳定,基本保证最多20、30次能找到想要的数据。对方说的也不完全对。最后,我们交换了这个问题。我也理解为什么我们使用树。我不会在这里谈论它。网友朋友们为什么觉得索引要用树来实现呢?至于算法分析,不学或者不想学也没关系。记得有一次面试,对方问我Collections.sort方法用的是哪种排序方式。好吧,我吐了三升血。当然为了显示自己的博学,我对算法分析也有一定的研究(⊙﹏⊙)b,我还是硬着头皮说可能是冒泡排序。当然,答案肯定不是。有兴趣的网友可以看看Collections.sort方法的源码,里面使用了一种叫做TimSort的排序方法,这是一种增强的归并排序方法。9、Java虚拟机出乎我的意料。Java虚拟机应该是非常重要的一块内容。结果在这些公司被问到的概率几乎为0。要知道,我去年花了很多时间研究Java虚拟机。周志明老师的《深入理解Java虚拟机:JVM高级特性与最佳实践》我看了不下五遍。言归正传,Java虚拟机虽然没问过,但我觉得还是很有必要研究一下的。我就简单的做一个提纲,说说Java虚拟机中比较重要的内容:(1)Java虚拟机的内存布局(2)GC算法和几种垃圾收集器(3)类加载机制,即双亲委派模型(四)Java内存模型(五)happens-before规则(六)volatile关键字使用规则也许面试没用,但在以后牛的路上,肯定不行。10、Web方面的一些问题Java主要是面向Web端的,所以Web方面的一些问题也是要问的。我遇到最多的两个问题是:说说分布式Session的几种实现。四个常用的答案,自然能让面试官非常满意。还有一个常见问题是:说说Session和Cookie的区别和联系,以及Session的实现原理。除了这两个问题,web.xml中的内容才是重点,Filter、Servlet、Listener,不说它们的实现原理,至少知道它们的使用基础。另外,get/post、forward/redirection的区别、HTTPS的实现原理等一些细节也可能会被考察。最后,如果你有兴趣,有时间,建议学习学习SOA和RPC。面向服务的系统是大规模分布式架构所必需的。原文链接:http://www.cnblogs.com/xrq730/p/5260294.html
