【技术经验帖2️⃣】1年,2年,3年,5年,10年初,中,高级Java开发一般需要懂哪些内容。

初中级 Java 程序员必须掌握的知识。

 熟练掌握数据结构、算法、操作系统、计算机网络等基础知识

 熟练掌握Java编程、熟悉Java高并发开发手段、对JVM 虚拟机(Java内存区域、虚拟机垃圾算法、虚拟垃圾收集器、JVM内存管理)有一定研究

 熟练掌握SOA分布式系统开发,具有优化系统性能、

 提高系统并发量以及系统可用性的实际经验

 熟练掌握Struts2SpringHibernateMybatis 等框架的使用,熟悉 Spring 原理

 熟练掌握DubboZookeeper、常见的消息队列(比如ActiveMq)的使用

 熟悉Linux 系统的使用,在Linux系统下具有实际的开发经验

 熟悉MySQL数据库的使用、常见SQL语句的书写以及常见的优化手段

 掌握 Spring Boot +Spring Cloud +Docker

 了解Hadoop 生态相关技术中的 HDFSStormMapReduceHiveHbase

招聘的一般都是2年工作经验,3年工作,5年工作乃至更高工作经验的人.我们可以得出一个结论,

工作经验丰富的人,需求量是很大的,缺口很大!

但是只会基础皮毛,只会增删改查简单使用框架的人,这个就比较麻烦了。

后期要学习的也很多了,比如高性能及分布式、高性能、深入浅出。性能调优、SpringMyBatisNetty源码分析 。

一个项目开发流程基本都熟悉,改进需求与维护也比较精通,就这些吧,

初级程序员可能只能做做测试,或者写写简单的代码。

中级的话应该是可以熟练地写代码适当的加一点自己的代码进去,

高级的就是能够加一些自己的想法的代码进去。再厉害的就是能用给自己的想法写代码,

架构师就是进行需求分析指引方向。

建议你研究Tomcat/Resin/Jetty的源代码,会有收获的。高性能/高并发的服务器需要下列几个方面的知识:

1. Socket编程

2. 多线程的知识

3. I/O库和异步I/O

4. TCP/IP 协议

不过,以上四个方面的知识,并不是专指Java相关的,多看看操作系统相关的书籍。

关于你问到的高并发,高性能的Java服务器的知识,这是一个系统性问题,不是说专门有某一种高并发、高性能的技术,我可以把我的经验跟你分享一下,希望能给你一些帮助。

 扩展性

分为垂直扩展和横向扩展,垂直扩展就是增加单台服务器的处理能力,需要你熟悉硬件、操作系统、中间件的知识;横向扩展一般就是指集群式部署,这都有行业解决方案,你需要做的只是将你的系统设计的具有可扩展性,说白了就是系统可以多份部署,但对外表现为单一应用。

 分布式

单台服务器处理能力有他的极限,但是我们可以将某一个业务拆分成多个子业务,分别部署在不同的服务器上,说白了就是在设计的时候要注意业务的拆分,比如某一个交易平台,你把他拆分成几个子系统,做一个订单处理的应用,再做一个支付的应用等等,做成分布式应用。

 技术类——数据读写分离

数据库资源宝贵,扩展性较差,一般读多写少,读操作尽量可以通过缓存技术去读取缓存,使用自动进程定期将数据库中的数据写入缓存(EHCACHE/MEMCAHCE/REDIS等)中,这样可以大大降低交易数据库的连接压力,提高系统的并发能力。

 技术类——连接池、队列、数据压缩等技术

通过连接池、队伍等实现方式来减少系统的开销,通过数据压缩技术减少带宽压力。

 业务类

可能某些时候我们改变一下业务处理方式和业务流程,就可以大大降低系统开销,比如把某些耗时较长的同步处理转为异步处理。

以上是高并发、高性能系统建设中最常见的几种做法或者思路。

哈利法塔和民房使用的材料都是混凝土和钢筋,前者需要系统的知识面、科学的方法论、良好的设计、灵活的工具使用,后者只需要把材料往上堆、往上糊就可以了,这就是民工与工程师的区别。

实际一点,做软件成长最快的方式当然是不断的写,不断的做项目,不断的学习,熟能生巧,不断的总结形成自己科学的方法论和知识库,这样才能游刃有余。如果接触不到更多项目,可以到GitHub上开开视野,利用好StackOverflowGoogle为你解疑答惑。

高并发,高性能的Java服务器的知识

最近接触到NETTY,封装NIO的框架,对这方面的提升可能有用。

你们这些程序员,一天就想研究个大技术,什么并发,什么集群,什么分布式,什么jvm

动不动张嘴就是高性能,高扩展 blah blah,咱能先从 写出人能看懂的代码开始么?

首先基础,Java核心技术卷一,

工作一年到两年的时间,你需要了解设计模式和jvm虚拟机,设计模式需要有一定的工作经验后才能了解,然后是代码重构,Java编程思想,三年左右的经验就是并发编程以及他们说的那些,当然,我这说的是知识点,Java用来做企业应用开发多点,也就意味着业务多,So.... 哦,还有,工作前一两年大部分时间是做业务和curd,服务器方面接触很少的,上头基本不会给你什么权限,先把基础搞好,这需要自我提升。 【毕业1-2年内,大部分都是业务和CRUD

java程序员该看《Linux内核》吗?那可是面向系统的,操作系统相关,更涉及底层,而且是面向过程

如果你不是做内核开发方面的工作,看linux源代码对应用程序开发帮助不是很大,投入产出比不高,尤其是对java程序员。如果一定要了解底层,java程序员建议看看 深入理解计算机系统

从中级开发人员到高级开发人员可能会相当困难。有些开发人员在整个职业生涯中,始终处于中级水平。

高级开发人员知道什么可以走捷径,什么永远不可以走捷径。这些都是从过去所犯的错误中汲取的教训。

如果你想要成为高级开发人员,就必须准备好接受没有人知道如何解决的任务。但你应该知道的不仅仅是如何完成工作。

作为高级开发人员,你的工作还包括帮助经验较少的开发人员。当他们不知道如何做某些事情时,你就是他们的后备力量。

高级开发人员掌握了他们的技术栈,这可能不会让你感到惊讶。记着,成为高级开发人员可不仅仅是编程技能,还要了解你所在公司中使用的所有工具和应用程序。

结论

初级、中级和高级开发人员之间的区别并不全在于有多少年的经验。当然,可以肯定地说,高级开发人员比初级、中级开发人员更熟练,但知识并不是最重要的因素。

与初级开发人员相比,高级开发人员编写的代码更简单,并且思维模式也不同。但这不仅仅是编程技能。知道要问什么问题,以及如何跟进这些问题是至关重要的。只有那些拥有丰富经验的高级开发人员,才知道在如何在任何情况下做到这一点。

作为一个初级开发人员,你应该专注于如何编写简单的代码,并经历多个开发周期。要从中级开发人员晋升到高级开发人员,你应该专注于学习,而不仅仅是解决常规任务。你应该愿意承担最艰巨的任务,成为技术栈的大师。高级开发人员的另一个职责是为经验不足的开发人员提供后援力量。

我将引用 Martin Fowler 的一句话作为结束语:任何傻瓜都可以写出计算机能理解的代码,而优秀程序员可以写出人能读懂的代码。Any fool can write code that a computer can understand. Good programmers write code that humans can understand.

熟悉分布式系统常用的技术,如缓存(memcacheredis)、消息中间件(rabbitmqkafka),zookeeperspring cloud,dubbonetty、等等;

-----------------------------------------------------------------------------------------------------------------------------------------------

1 初级程序员的技能瓶颈与收入瓶颈

哪怕是非相关专业,从培训班出来的程序员,要找个工作也不难,

更何况是计算机相关专业出身的学生。

在一般的公司里,对初级程序员的要求大多也是会增删改查,

熟悉基本的业务,而且不少公司不会让他们干更高级的活。

所以我在面试过程中,不少3年以内的初级程序员的水平和

一些有5年经验的人差不多,这就进入了初级程序员的收入瓶颈。

比如Java方面,他们仅仅会用技能,比如集合,多线程,数据库等,

也会在Spring框架下干活,SQL方面,仅会写基本的SQL语句,

或许还会使用简单的索引等技能。

但如果我问及底层代码,他们知道得很少,

问及Spring等框架知识,他们只会告诉我如何配置,

如何在现有框架里干活。

至于一些高级技能,比如分布式组件,

或者LInux下的部署和日志排查,

他们大多就不知道了。

对于项目管理的工具,比如Jenkinssonar等,

他们可能都没听说过。

如果面试时仅表现为会干活,不会调优,不会分析和解决问题,

那么能力上也就是初级开发。

这样的话,在上海,按当前行情,估计最高也就12k了,

同时,如果干了5年还是这样的话,

那么竞争力会大大降低。那么如何提升到高级开发呢?

1 在平时得熟悉调试代码,并且,一旦组里出了问题,

得尽量参与,刚开始可能分析和解决问题的能力不行,但慢慢就行了。

2 多看些优化方面的技能,以及比较热门的技术,

比如数据库方面,别单纯看JDBC的增删改查,

可以看些NoSQL甚至redis缓存,然后看下SQL调优技能。

3 多关注些项目开发和管理的技能,比如敏捷开发,

站会,单元测试,集成部署,通过Sonar看代码质量等。

4 这点比较关键,得多和别人交流,比如多和需求方沟通需求,

多和测试方沟通问题重现步骤,多和组员领导沟通问题的实现方式。

其实初级开发升级到高级开发还是相对容易的,

只要主观上态度上端正,别固步自封,

然后到处看些资料多和人交流即可。

如果进互联网公司,在大压力环境下,身边大牛再多些,升级过程会更加顺利。

2 高级程序员的技能瓶颈在于分布式组件

高级开发论技术,有一定的调优经验,也有一定分析日志解决问题的能力,也能debug。论解决问题的能力,也能和别人沟通,从而接简单的需求,并能分析和解决一些问题。论团队合作,也能带3,4个人一起开发。

其实这类能力,对工作个3年的程序员来说,不难达到,

如果在节奏比较快的互联网公司里,甚至2年即可。

论工资水平,当前在上海,高级开发拿个15k都算低,

如果进个大公司,外带5年左右开发经验,估计能到20k

如果在互联网公司甚至能更高,但瓶颈估计在25k左右。

我面试高级开发,他们一般基础知识比较扎实,比如Java集合内部的实现代码,

高并发的诸多类,或者Spring框架的一些关键底层代码,都能说得上来。

一般给我的高级开发的面试标准是,所需初级开发的技能,

并在此基础上具有一定的调优能力,通过日志定位问题,

设计解决方案和解决实际问题的能力,而且linux上也能部署代码。

只要能说得上来,一般能给到高级开发的工资,就多少的问题。

但我面试时,感受非常深的是,和架构师相比,

高级开发对于分布式组件或基于云组件(比如k8s)或其它高并发分布式组件,

有些人可能用过,但仅限于会用其中的API,让他们搭建一个集群,

他们可能就力所不能及了,

如果再问他们分布式组件在项目开发时经历过的坑,他们大多也说不上来。

比如我问,Dubbo里通讯协议有哪些?高级开发一般能说得上来,因为这有现成资料,但我再问,根据你们的业务实际情况,你们用的是长连接还是短连接方式?为什么要用这种协议?他们估计就很难回答。如果我再问,如果要处理高并发的请求,需要在Dubbo里做哪些配置?如何同其它组件搭建成集群以达到容错效果?高级开发就更难回答了。

同初级开发升级到高级开发相比,高级开发升级到架构师更难,

因为在一般的工作环境里,高级开发很难有相应的实践机会。

不过话说回来,如果程序员有8年经验后还是高级开发,

那么竞争力会逐步下降,一方面很难再要到更高的工资,

另一方面很难通过面试争取到架构师的工作机会。

那么高级开发如何升级到架构师呢?这个时候光靠态度就不行了。

1 理论知识不可少,还需要在自己电脑上,可以搭建个脚手架项目,

比如自己装个虚拟机,搭建个dubbo集群等,这样能熟悉基本的配置和用法。

2 最好找个互联网公司实践下,哪怕在互联网公司干的是高级开发的活,

一定也有机会接触分布式组件,这样就有相关经验了。

我在一家外企自学了1年多架构师的技能,然后到一家互联网公司,

发现3个月的实践抵得上1年多的自己探索。

3 比如高级开发,架构师更得了解集群,而不是单机版的代码,

所以更得关注一些技术以外的技能,比如负载均衡,容错处理,

通讯协议和流程等。积累着方面的经验别无他法,

只能多动手排查和解决实际问题。

4 虽然说光靠态度不行,但没态度也不行,在升级过程中,可能因定位问题不及时不准确,或者提出的方案有瑕疵,从而受到别人挑战,相反如果回到高级开发的舒适区也能稳定地过日子。我自己也有体会,我幸亏遇到了好师傅,而且我师傅的师傅是大牛,也为我指明了不少进阶方向。否则的话,这条升级路能坚持下来,还能难说。

3 架构师的瓶颈在于项目实践经验

目前在上海,架构师的月薪普遍在30k以上,如果稍微资深点的话,35k也不是问题,如果是一个公司的主心骨的话,那工资就更没上限了。

虽然不多,但我好歹也面试过Java方面的架构师,我在面试过程中发现,一些资深的架构师,相关实践经验相当丰富,更有部署上线和在线排查问题方面的经验。

比如MyCAT分库分表方面,高级开发会使用,一般的架构师会搭建集群,也会排查产线问题,而资深架构第一能知道该如何上线,上线时如何采用分组发布确保数据兼容性,上线后又该如何清洗数据,如果上线过程中出现问题又该如何回退。再比如针对NettyOOM问题,资深架构的脑海里会出现若干个优先排查点,在这些范围内找到问题的概率很大,不行再具体看日志分析。

如果说,架构师还有人可以问的话,资深架构则没人可问,

有问题得靠自己之前踩坑获得的经验,或者自己找资料。

从这个意义上来讲,在架构师级别,如果技术上再要提升,

那么只能多靠解决实际问题时积累的经验,而且更得结合业务,

把负载均衡,容错处理等处理高并发的理念用分布式组件实现。

这方面,我们可以参照下BAT或知名互联网公司的架构知识体系。

4 在任何时候,态度都是限制发展的瓶颈

不管是面试初级程序员还是高级开发或者是架构师,我发现一些表现好的,都是比较积极向上的。

比如回答问题时声音洪亮,沟通时也有尽量向表达清楚的愿望,哪怕某个方面回答不正确,但也能看出平时在不断积累知识,当被追问比较深时,也能比较耐心地一一解答,总之通过交流,给人的印象是比较踏实靠谱。有些人甚至平时会写博客,或者出过书,或者想尽一切办法来积累和提升自己。这类人大多能过,哪怕个别过不了,但努力的大方向没问题,完成进级也仅仅是时间问题,未来潜力也是非常可观的。

但相反,有些回答不好的候选人,总会给人些得过且过敷衍的感觉,比如回答问题比较简单,或者总是想套面试官的话,或者总想用些模棱两可的回答来蒙混过关。

我和其它的面试官沟通以后,对此感受很深,总是先自己要了,然后再肯上进,再自发地归纳出好的学习方法,并能有效地进行时间和工作任务管理。

我见到过不少反面的案例,这些人论资质不错,但或者光有决心没行动,或者干脆陷入在舒适区不可自拔,这些人很难有技术上的突破。相比之下,初级程序员在有决心有行动后,升级所需的时间不会超过1年,有些半年就够了,高级开发升级到架构师可能有些难度,但一般不会超过2年。

所以说,要升级,首先态度要端正,人要上进,这话说起来太容易,但能做到的并且能坚持下来的人数并不多,所以态度也是升级的瓶颈,这话虽然通俗,但不无道理。

5 总结,技术可以暂时落后,但任何时候都要有上进的信念

本文提到的各级别程序员的瓶颈和突破建议,都是我和其它多位面试官在面试过程中总结而来,希望能对大家有所帮助。

再者,除去因升级而带来的收入提升外,在任何技术前提下,都有对应的挣钱手段。比如我在博客园等地,看到不少大学生朋友靠写文章挣钱,而开专栏也并不是要多高深的技术积累。同时,当程序员升级到高级开发后,就能通过写书或者录制视频等方式挣钱。此外,如果是接项目,在各技术层面都有对应的项目。不过话说回来,对我们程序员来说,在任何公司任何职位任何场景,都有机会进入到舒适区享福

有道是技术穷但志不能短,我在博客园里就见识过不少靠努力翻身的例子,在我身边的同事朋友里,也经常看到半年后技术大变样的例子,这些榜样能激励我不断上进。所以本文在给出突破瓶颈建议的同时,更希望大家要有不断上进的信念。

---------------------------------------------------------------------------------------------------------------------------------------------

技术不同,简单的可以理解为:初级中级的只关注代码,编程。高级的就要考虑系统的架构,整体框架。

具体区别如下:

一、初级工程师

1、首先要学习java的基础知识。不要被新技术迷惑,所谓万变不离其宗,新技术都是基于java的基础之上,如果基础不扎实,对于这些新技术的理解也是一知半解,学不到根源。

2、做一个java项目在学习完java的基础知识之后,做一个java项目来巩固一下,在项目中会发现很多问题,通过解决问题,加深基础知识的掌握。

3、学习数据库的基础知识和开发应用软件开发离不了数据库,掌握几种流行的数据库:OracleSQLserverMySQL等。

4JEE基础在这里首先要学习网站基础,包括HTMLDHTMLJavaScript;接着要学习XMLXML JAXP;然后学习JEE基础,包括JEE开发环境,RMI/IIOPJNDI;最后学习JDBC数据库的应用开发。

5web开发全面的JEEweb开发知识:Servlet JSP javaBean TagLib,到这里做一个完整的web应用项目开发。

6EJB开发包含全面的EJB知识:1EJB入门和无状态会话Bean2)有状态会话Bean3BMPCMP是实体Bean4jmsMessageDrivenBean5)事物和安全(JTAJTSJAAS);6WebService的开发和应用。

7、开源框架的学习学习几种现在流行的开源框架:StrutsSpringHibernianWebwork等。完整的学习这些框架的开发和应用。如果有兴趣还可以学习Ibati框架、AJAX技术和DWR框架的开发和应用。

8JEE项目综合应用JEE的知识来开发一个完整的应用。

9、面向对象分析与设计java是一种面向对象的语言,所以要深入学习面向对象的分析与设计,另外还要学习UML统一建模语言。

10、接下来就是系统设计与架构这里要学习的是Java设计模式、EJB设计模式、JEE核心设计模式、JEE应用程序框架设计。

11、软件工程软件工程基本理论知识的学习,还有Rup和极限编程。

12、技术研究学习搜索引擎技术:如Lucene等、工作流技术:包含SharkJBPM等、SOA架构和应用。

13、综合项目实战实现一个企业级的应用。每个阶段在做项目的基础上牢固的掌握应用到的知识,只有在实际的应用中发现问题,加深所学的知识。

二、中级工程师

1、对于Java基础技术体系(包括JVM、类装载机制、多线程并发、IO、网络)有一定的掌握和应用经验。

掌握JVM内存分配、JVM垃圾回收;类装载机制; 性能优化; 反射机制;多线程;IO/NIO 网络编程;常用数据结构和相关算法。

2、对面向对象的软件开发思想有清晰的认识、熟悉掌握常用的设计模式;设计模式;单例模式;工厂模式;代理模式;模板方法模式;责任链模式等。

3、熟练掌握目前流行开源框架(spring/springmvc/ibatis),并且对其核心思想、实现原理有一定认知;开源框架:springhibernate

4、熟悉OracleMySQL等数据库开发与设计以及缓存系统RedisMemcached的设计和研发;关系数据库:oraclePostgreSQL  缓存系统:RedisNosql)缓存系统:Memcached

5、熟悉底层中间件、分布式技术(包括缓存、消息系统、热部署、JMX等)、底层中间件:应用服务器:Jetty(Tomcat) 消息中间件:ActiveMQRabbitMQ、事务处理中间件:数据访问中间件:ODBC、工作流中间件:JBPM,分布式技术:缓存系统、消息系统、Restful、热部署、JMX

6、至少一种Java 应用服务器如tomcatJetty

7、精通shell编程,熟练应用awksedgrepstracetcudumpgdb等常用命令。

8、有大型分布式、高并发、高负载(大数据量)、高可用性系统设计开发经验,分布式:(多节点部署)、高并发、高负载(大数据量)、高稳定、高可用。

9、对配置管理和敏捷研发模式有所了解,配置管理工具:SVNGithub

10、业务能力:系统升级、双机、部署、容灾、备份恢复、DFX

11、加分技术:脚本语言:Python,远程调用,精通Internet基本协议(如TCP/IPHTTP等)内容及相关应用。有一定安全意识并了解常见的安全问题解决方案。熟悉常见的一些解决方案及其原理:单点登录、分布式缓存、SOA、全文检索、消息中间件,负载均衡、连接池、nosql、流计算等。

三、高级工程师

1JAVA。要想成为JAVA(高级)工程师肯定要学习JAVA。一般的程序员或许只需知道一些JAVA的语法结构就可以应付了。但要成为JAVA(高级)工程师,您要对JAVA做比较深入的研究。您应该多研究一下JDBCIO包、Util包、Text包、JMSEJBRMI、线程。如果可能,希望您对JAVA的所有包都浏览一下,知道大概的API,这样您就发现其实您想实现的很多功能,通过JAVAAPI都可以实现了,就不必自己费太多的脑经了。

2、设计模式。其实写代码是很容易的事情,我相信您也有同感。但如何写得好就比较难了。这个字包括代码可重用性,可维护性,可扩展性等。如何写出好的代码往往要借助一些设计模式。当然长期的代码经验积累,只要您用心,会使您形成自己代码风格。相信您的代码也比较符合代码的可重用性,可维护性,可扩展性。但既然前人已经给我们总结出了经验,我们何不踩着前人的肩膀前进?3XML。现在的系统中不使用XML几乎是不可能的。XML的功能非常强大,它可以做数据转换、做系统的配置、甚至可保存您的系统业务数据。因此您必须了解XML,包括它的语法,结构。您还需要比较熟练的使用解析XML的一些API,比如JDOMSAX等,因为在我们一般的项目中,XML往往担当系统配置信息的作用,您需要用这些API解析这些配置信息,开发完美的项目。4、精通使用一种或两种框架。框架都会有许多可重用的代码,良好的层次关系和业务控制逻辑,基于框架的开发使你可以省出很多的开发成本。但我这里希望您能精通,更多的是希望您能通过框架的使用了解框架的思想。这样您在开发一个项目时思路会开阔一些,比如您会想到把SQL语句与您的JAVA代码分开,再比如您会考虑把您的业务逻辑配置到XML或者数据库中,这样整个项目就很容易扩张了。

5、熟悉主流数据库。其实真正比较大的项目都是有人专门做数据库的,但往往很多项目要求作为(高级)工程师的您也参与数据库的设计以及SQL的编写。所以为了更好的为国家做贡献,建议您还是多了解一些主流数据库,比如SQLSERVERORACLE,多连接SQL和存储过程以及触发器。如果您不是科班出身,您还需要补充一些数据库原理方面的知识。

6、精通一种或两种WEBServer。我还是要强调您要精通一种或两种。因为作为JAVA工程师,特别时想成为高级JAVA工程师的您,您不可避免地要部署您的项目到WebServer上,而且只有当您精通一种WebServer,您才可能最大限度地使用它的资源,这往往可以节省很多时间和精力。

7UML。我知道您肯定想成为高级工程师,因此您有必要了解或熟练或精通UML,这取决于您有多大决心想成为高级工程师和项目经理。在比较正规的开发团队中,UML是讨论项目的交流工具,您要想做一个软件工程师,您至少要能看懂,您要想做高级工程师,您要能通过它来描述您对项目的理解,尽管这不是必须,但却很重要。

8、站在高度分析问题:这不是一个知识点,也不是通过书本就能学得到的。只所以提到这一点,是因为我比您还着急,我希望您更快的成为一个高级的软件工程师,而不是一个一般的软件工程师。希望您在工作中多向您的系统分析员、需求分析员、系统设计员学习,多站在他们角度上去看您在开发的项目。在最好在项目之初先在您的脑海里对项目有个大致的分析、设计,然后和他们进行比较,找找差别,想想缺点。

9、工具。您在这个阶段可能接触到不同的工具了,尽管您还需要使用JB或者IDEA,但能可能对ROSETogether要多了解一些,因为您要画UML了。不要再对DreamweaverHTML编辑器情有独钟了,那些JSP页面让初级程序员去写吧。

 -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

猜你喜欢

转载自www.cnblogs.com/Koaler/p/12723804.html