程序员职业规划(⼀篇来⾃阿⾥Java⼯程师对⼯作3年左右程序员的职业建议和应该掌握的职业技能)
程序员的三个阶段(转载)
第⼀阶段:三年
我认为三年对于程序员来说是第⼀个门槛,这个阶段将会淘汰掉⼀批不适合写代码的⼈。
这⼀阶段,我们⾛出校园,迈⼊社会,成为⼀名程序员,正式从书本上的内容迈向真正的企业级开发。
我们知道如何团队协作、如何使⽤项⽬管理⼯具、项⽬版本如何控制、我们写的代码如何测试如何在线上运⾏等等,积累了⼀定的开发经验,也对代码有了⼀定深⼊的认识,是⼀个⽐较纯粹的Coder的阶段。
第⼆阶段:五年
五年⼜是区分程序员的第⼆个门槛。有些⼈在三年⾥,除了完成⼯作,在空余时间基本不会研究别的东西,热衷于研究各种技术实现细节、看了N多好书、写⼀些博客、在Github上分享技术。
这些⼈在五年后必然具备在技术上独当⼀⾯的能⼒并且清楚⾃⼰未来的发展⽅向,从⼀个Coder逐步⾛向系统分析师或是架构师,成为项⽬组中不可或缺的⼈物。
第三阶段:⼗年
⼗年⼜是另⼀个门槛了,转⾏或是继续做⼀名程序员就在这个节点上。
如果在前⼏年就抱定不转⾏的思路并且为之努⼒的话,那么在⼗年的这个节点上,有些⼈必然成长为⼀名对⾏业有着深⼊认识、对技术有着深⼊认识、能从零开始对⼀个产品进⾏分析的程序员。
这样的⼈在公司基本担任的都是CTO、技术专家、⾸席架构师等最关键的职位,这对于⾃⼰绝对是⼀件荣耀的事,当然⽼板在经济上也绝不会亏待你。
总结⼀下,随着⼯作年限的增长、对⽣活对⽣命认识的深⼊,应当不断思考三个问题:
我到底适不适合当⼀名程序员?
我到底应不应该⼀辈⼦以程序员为职业?
我对编程到底持有的是⼀种什么样的态度
是够⽤就好呢还是不断研究?
最终,明确⾃⼰的职业规划,对⾃⼰的规划负责并为之努⼒。
关于专业技能
⼀名3年⼯作经验的Java程序员应该具备的什么技能呢?阿⾥Java⼯程师给我们讲了他的经验。⼤雄带⼩伙伴们⼀起了解⼀下。
这⾥要说明⼀下,以下列举的内容不是都要会的东西----但是如果你掌握得越多,最终能得到的评价、拿到的薪⽔势必也越⾼。
1、基本语法
基本语法包括static、final、transient等关键字的作⽤,foreach循环的原理等等。
如果我⾯试你,问static关键字有哪些作⽤?
如果你答出static修饰变量、修饰⽅法我会认为你合格。答出静态块,我会认为你不错。答出静态内部类我会认为你很好,答出静态导包我会对你很满意,因为能看出你⾮常热衷研究技术。
越简单的问题越能看出⼀个⼈的⽔平,别⼈对你技术的考量绝⼤多数都是以深度优先、⼴度次之为标准的,切记。
2、集合
集合是⾮常重要,也是必问的内容。基本上就是List、Map、Set,问的是各种实现类的底层实现原理,实现类的优缺点。
集合要掌握的是ArrayList、LinkedList、Hashtable、HashMap、ConcurrentHashMap、HashSet的实现原理,能流利作答,当然能掌握CopyOnWrite容器和Queue是再好不过的了。
3、设计模式
本来以为设计模式是⾯试中重要的⼀块内容,结果只在阿⾥巴巴B2B事业部⾯试的时候被问了⼀次,当时问的是装饰器模式。
当然我们不能这么功利,为了⾯试才学习,设计模式在⼯作中还是⾮常重要、⾮常有⽤的,23种设计模式中重点研究常⽤的⼗来种就可以了。
⾯试中关于设计模式的问答主要是三个⽅向:你的项⽬中⽤到了哪些设计模式,如何使⽤;知道常⽤设计模式的优缺点;能画出常⽤设计模式的UML图
4、多线程
多线程也是⾯试必问的⼀块了。因为三年⼯作经验,所以基本上不会再问你怎么实现多线程了,会问得深⼊⼀些⽐如说Thread和Runnable 的区别和联系、多次start⼀个线程会怎么样、线程有哪些状态。
当然这只是最基本的,出乎意料地,⼏次⾯试⼏乎都被同时问到了⼀个问题,问法不尽相同,总结起来是这么⼀个意思:
假如有Thread1、Thread2、Thread3、Thread4四条线程分别统计C、D、E、F四个盘的⼤⼩,所有线程都统计完毕交给Thread5线程去做汇总,应当如何实现?
你对这个问题是否有答案呢?不难,urrent下就有现成的类可以使⽤。
另外,线程池也是⽐较常问的⼀块,常⽤的线程池有⼏种?这⼏种线程池之间有什么区别和联系?线程池的实现原理是怎么样的?实际⼀些的,会给你⼀些具体的场景,让你回答这种场景该使⽤什么样的线程池⽐较合适
5、IO
IO分为File IO和Socket IO,File IO基本上是不会问的,问也问不出什么来,平时会⽤就好了,另外记得File IO都是阻塞IO。
Socket IO是⽐较重要的⼀块,要搞懂的是阻塞/⾮阻塞的区别、同步/异步的区别,借此理解阻塞IO、⾮阻塞IO、多路复⽤IO、异步IO这四种IO模型,Socket IO如何和这四种模型相关联。
这是基本⼀些的,深⼊⼀些的话,就会问NIO的原理、NIO属于哪种IO模型、NIO的三⼤组成等等,这有些难,当时我也是研究了很久才搞懂NIO。
提⼀句,NIO并不是严格意义上的⾮阻塞IO⽽应该属于多路复⽤IO,⾯试回答的时候要注意这个细节,讲到NIO会阻塞在Selector的select⽅法上会增加⾯试官对你的好感。
如果⽤过Netty,可能会问⼀些Netty的东西,毕竟这个框架基本属于当前最好的NIO框架了(Mina其实也不错,不过总体来说还是⽐不上Netty的),⼤多数互联⽹公司也都在⽤Netty。
6、JDK源码
要想拿⾼⼯资,JDK源码不可不读。上⾯的内容可能还和具体场景联系起来,JDK源码就是实打实地看你平时是不是爱钻研了。
我⾯试过程中被问了不少JDK源码的问题,其中最刁钻的⼀个问题——String的hashCode()⽅法是怎么实现的,幸好我平时String源代码看得多,答了个⼤概。
我去年⼀整年基本把JDK中重要类的源代码研究了个遍,真的花费时间、花费精⼒,当然回头看,是值得的----不仅仅是为了应付⾯试。
7、框架
⽼⽣常谈,⾯试必问的东西。⼀般来说会问⼀下你们项⽬中使⽤的框架,然后给你⼀些场景问⽤框架怎么做,⽐如我想要在spring初始化bean的时候做⼀些事情该怎么做、想要在bean销毁的时候做⼀些事情该怎么做、MyBatis中$和#的区别等等。
这些都⽐较实际了,平时积累得好、有多学习框架的使⽤细节⾃然都不成问题。
如果上⾯你的问题答得好,⾯试官往往会深⼊地问⼀些框架的实现原理。问得最多的就是Spring AOP的实现原理,当然这个很简单啦,两句话就搞定的的事⼉,即使你不会准备⼀下就好了。
我遇到的最变态的是让我画⼀下Spring的Bean⼯⼚实现的UML图,当然⾯对这样⼀个有深度的问题,我是绝对答不出来的......
8、数据库
数据库⼗有⼋九也都会问到。⼀些基本的像union和union all的区别、left join、⼏种索引及其区别就不谈了,⽐较重要的就是数据库性能的优化,如果对于数据库的性能优化⼀窍不通。
java零基础该怎么学建议⼩伙伴们在⾯试前花⼀两天专门把SQL基础和SQL优化的内容准备⼀下。
不过数据库倒是不⽤担⼼,⼀家公司往往有很多部门,如果对数据库不熟悉⽽基本技术⼜⾮常好,九成都是会要你的,估计会先把你放到对数据库使⽤不是要求⾮常⾼的部门锻炼⼀下。
9、数据结构和算法分析
数据结构和算法分析,对于⼀名程序员来说,会⽐不会好,在⼯作中绝对能派上⽤场。
数组、链表是基础,栈和队列深⼊⼀些但也不难,树挺重要的,⽐较重要的树AVL树、红⿊树,可以不了解它们的具体实现,但是要知道什么是⼆叉查树、什么是平衡树,AVL树和红⿊树的区别。
⾄于算法分析,不会、不想研究就算了。记得某次⾯试对⽅问我,Collections.sort⽅法使⽤的是哪种排序⽅法,额,吐⾎三升。
当然为了显⽰我的博学,对算法分析也有⼀定的研究,我还是硬着头⽪说了⼀句可能是冒泡排序吧。
当然答案肯定不是,有兴趣的朋友可以去看⼀下Collections.sort⽅法的源代码,⽤的是⼀种叫做TimSort的排序法,也就是增强型的归并排序法。
10、Java虚拟机
Java虚拟机应该是很重要的⼀块内容,结果在这⼏家公司中被问到的概率⼏乎为0。
我去年花了⼤量的时间去研究Java虚拟机的,光周志明⽼师的《深⼊理解Java虚拟机:JVM⾼级特性与最佳实践》,就读了不下五遍。
⾔归正传,虽然Java虚拟机没问到,但我觉得还是有必要研究的,也许⾯试⽆⽤,但在⾛向⼤⽜的路上,不可不会。
11、Web⽅⾯的⼀些问题
Java主要⾯向Web端,因此Web的⼀些问题也是必问的。我碰到过问得最多的两个问题是:
1.谈谈分布式Session的⼏种实现⽅式
2.讲⼀下Session和Cookie的区别和联系以及Session的实现原理
这两个问题之外,l⾥⾯的内容是重点,Filter、Servlet、Listener,不说对它们的实现原理⼀清⼆楚吧,⾄少能对它们的使⽤知根知底。
另外,⼀些细节的⽅⾯⽐如get/post的区别、forward/重定向的区别、HTTPS的实现原理也都可能会被考察到。
最后,如果有兴趣有时间,建议学习、研究⼀下SOA和RPC,⾯向服务体系,⼤型分布式架构必备,救命良⽅、包治百病、屡试不爽。
在Java的初始学习中最重要的就是学习资源,⼤雄在这给⼩伙伴们推荐⼀本Java的学习书《Head First Java(中⽂版)》
这本书是⾮常经典的Java参考书,是Java不可多得的⼊门书籍,完全适合零基础和刚⼊门的⼩伙伴使⽤,结合⽼九学堂的《零基础学编程系列之Java⼊门》,理论加实践,能够为⼩伙伴们学习Java提供⾮常⼤的帮助。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论