知乎问题:北京,2017,多少k的java web程序员应该懂多线程和jvm优化?

知乎问题:https://www.zhihu.com/question/59725713/answer/168294369

谢邀,看你问的诚恳,我也好好回答一番。

先说一下我心目的互联网程序员分级:

  • 初级—初阶
    掌握java基础,熟悉常用类库。理解javaweb中的servlet,jsp,并了解常用的框架对java web的封装原理,能够借助框架完成增删改查功能。理解数据库在web开发中的地位。

  • 初级—中阶
    理解java中较为高级的特性,如反射,动态代理,JVM,内存模型,多线程等等。熟练使用框架,对框架中遇到的bug,能够借助日志和搜索引擎分析出问题的原因。在团队中,能够独立完成普通后台业务功能的开发。了解数据库的高级特性,如索引,存储引擎等等。

  • 初级—高阶
    理解java分布式架构,微服务架构,了解其与集中式架构的区别,并能保证分布式代码质量。熟练使用各个中间件如redis,mq,zookeeper等等,并了解其工作原理和使用场景。能够在中级或高级程序员的带领之下,完成非核心功能的研发。能够关注开源,并且具有阅读源码的能力。

  • 中级
    初级高阶已经很厉害了,但是往往缺乏的是一些项目经验,所以在我这里还是初级。脱离初级程序员不仅仅需要技术方面的支撑,还需要具备一定的项目开发经验(3年之上一线互联网产品研发经验),拥有线上bug的处理能力,JVM调优能力,以及完成核心业务功能的开发。并且带领团队的新人,能够按能力分配任务。

  • 高级
    团队的核心人物,把控整个项目的质量,包括代码漏洞和规范问题。具有5年以上项目开发经验,2年以上架构搭建的经验,能够根据业务选择不同的架构类型;根据团队组成,分配不同的任务。具有将自己的知识分享出去的能力,带领初级程序员走向中级,中级程序员走向高级的能力。
    下面针对你问的问题一一给出我的看法

你问: java web中线程不是由tomcat这类web容器负责的吗?为什么还要我去控制多线程?

答:从一个例子开始给你讲起,现在有一个任务,从http接口获取商品信息,完成一些业务逻辑的处理对数据进行修饰,插入到数据库,数据量大概是10w级别。这个需求在你看来很简单吧,开发并不难完成。初级程序员是怎么做的,每次获取一个商品,然后保存到数据库,同步进行。整个编码不超过30分钟即可完成。然后实际操作,发现由于网络io,数据库io大数据量的问题导致了你等待了一天,完成了同步数据的操作。

有经验的程序员如何分析这个需求呢?上述初级程序员最直接的想法导致了数据库io发生了10w次,http请求发生了10w次(因为有10w个商品信息),优化点有三:一,查看是否有批量获取商品信息的接口,一次如果能获得100个商品,那么网络io会减少到1000次;二,存储到数据库可以使用批处理,一次保存500条,这样数据库io减少到200次;三,就是你提到的多线程了,因为每个操作是互相独立的,并且需求中提到了会进行数据的处理,而cpu密集型操作,就能体现多线程的优势,上一个商品的信息不会影响到下一个商品,所以我们可以很简单的使用一个线程池,多线程批量获取数据,批量插入数据库。于是,最终只需要等待不到1个小时,就完成了数据同步操作。在这个过程中,可能初级程序员开发+同步数据花了一天,有经验的程序员开发+同步数据也花了一天,但是一旦需求一改,数据要重新同步,前者还是需要花费一天,后者则只需要一小时,保证了项目了进度。

讲了上面这个我编出来的非常啰嗦的例子,是想告诉你,初级程序员不使用多线程,可能也能完成需求,但是一定不是最优的,叫做仅仅完成了任务。而项目中其他一定需要使用多线程的地方,可能就懵逼了,你是否知道多线程安全的问题,理解内存模型,以及happens-before原则?

你问:什么样的web应用业务场景需要用到多线程通信,线程阻塞,线程锁?

先说线程锁,不得不说到同步问题,篇幅太长了,我贴一篇我的博客:

浅析项目中的并发 - 常大皮卡丘的专栏 - 博客频道 - CSDN.NET
其次你提到了多线程通信,线程阻塞,这两个我觉得是需要你理解概念,知道工作原理,而并非有很多的实践了,共享内存模型的多线程通信方式,还是使用wait/notify,或者是使用juc中的一些工具,都是需要自己去找文章看的。阻塞这个概念又要理解操作系统的工作模型,不然你写出的代码只是知其然而不知其所以然。

你问: jvm优化是什么,什么样的业务场景又需要优化jvm。到底该如何优化,是优化代码,注意代码的的写法,还是有什么配置文件?

这个能力我规划到了初级的高阶即以上,这是一个初级程序员向中高级程序员进步的必备知识。所以这么多知识当中,这也的确是最难的一点。jvm优化有很多方面,其一便是你说的修改一些参数,扩展tomcat栈内存,配置tomcat的并发线程数…;要搞懂服务器的cpu和内存,与java的什么操作相对应;选择合适的垃圾收集器应对线上的情况等等。另一方面是,线上的服务出了错,莫名其妙的宕机,这可不像本地debug一样方便,需要定位问题,找出原因。这就必须要能dump出线程信息,找到是什么原因导致的内存泄漏,服务器崩溃。各种jvm工具如 Jconsole,jProfile,VisualVM ,都有各自对应的使用场景,我也将他们归类到优化jvm。至于一类专门写java虚拟机代码的人而言(就像R大),jvm又是另外一番理解了,不过一般的程序员没必要关心就是了。题主要还是对JVM疑惑,可以买一本《深入理解java虚拟机》解惑。

你说: 正常情况下一年半的java程序员多少工资合适啊,我也挺努力的,上班不偷懒,好好工作,地铁上看视频学习,回家也经常写代码,但是我没去认真学过多线程和jvm高并发,因为认为自己工作中用不到,所以就没学。

回:工资不是我想跟你讨论的,虽然是必须关心的,因为这是衡量一个程序员价值比较直观的一个因素,自然是和能力相关,工作经验相关。很多人工作了十年,落下十个一年工作经验。北京具体情况我不知道,但是我心里面应届生的待遇如下:初级初阶5k-7k,初级中阶8-10k,初级高阶11k到15k,中阶15-18k,高阶在20k之上,上不封顶。互联网公司,名企,初创公司由于公司性质工作强度问题薪资会有所提升,北上广深由于地域性质薪资会有所提升,工作年限也是如此上述的具体标准都是针对应届生,一张白纸,一年的涨幅算是2k。这么一算,你刚出来1年半,给你加个3k,自己看着自己的水平对号入座吧,不过我并不对我的这个分类负责,这是给你当个参考。后面你提到工作和学习,要想在互联网技术日新月异的如今保持自己的竞争力,就必须如此,如果你是兴趣驱动,那可真是万幸了。

你说:平常学的,java系列框架,前端系列框架,linux,数据库,h5开发app,python,python系列web和爬虫框架

回:不建议如此,从你的情况来看,深度还不够,不如多去研究一下其中的个别东西,如:java系列框架,linux,数据库,因为你真的没有那么多精力。求职java工程师,写上python爬虫经验,不觉得奇怪吗

最后要说的一点:多关注一些微信公众号,多参加一些程序员的线下沙龙,多跑跑步,不建议你每天敲代码,多关注开源,多和其他程序员交流,眼界会变的开放,怕就怕你努力都没有方向

你可能感兴趣的:(一些文章)