Java程序员---技能树

计算机基础:java

好比网络相关的知识。git

        其中就包含了 TCP 协议,它和 UDP 的差别。须要理解 TCP 三次握手的含义,拆、粘包等问题。 程序员

        固然上层最多见的 HTTP 也须要了解,甚至是熟悉。github

        这块推荐《图解 HTTP》一书。算法

接着是操做系统相关知识。数据库

因为工做后你写的大部分代码都是运行在 Linux 服务器上,因此对于这个看它脸色行事主你也得熟悉才行。编程

好比进程、线程、内存等概念;服务器常见的命令使用,这个没啥窍门就是得平时多敲敲多总结。设计模式

我也是以前兼职了半年运维才算是对这一块比较熟悉。缓存

Linux 这个天然是推荐业界很是出名的《鸟哥的 Linux 私房菜》。安全

看成为一个初学者学习这些东西时确定会以为枯燥乏味,大学通常在讲专业课以前都会有这些基础学科。我相信大部分同窗应该都没怎么仔细听讲,由于确实这些东西就算是学会了记熟了也没有太多直接的激励。

但当你工做几年以后会发现,只要你还在作计算机相关的工做,这些都是绕不开的,当哪天这些知识不经意的帮助到你时你会庆幸当初正确的选择。

数据结构与算法

接下来会谈到另外一门枯燥的课程:数据结构。

这块当初在大学时也是最不受待见的一门课程,也是我惟一挂过的科目。

记得当时每次上课老师就让你们用 C 语言练习书上的习题,看着一个个拆开都认识的字母组合在一块儿就六亲不认我果断选择了放弃。

这也形成如今的我每隔一段时间就要看二叉树、红黑树、栈、队列等知识,加深印象。

算法这个东西我确实没有啥发言权,以前坚持刷了部分 LeetCode 的题目也大多停留在初中级。

但像基本的查找、排序算法我以为仍是要会的,不必定要手写出来但要理解其思路。

因此强烈建议还在大学同窗们积极参与一些 ACM 比赛,绝对是从此的加分利器。

这一块内容可能会在应届生校招时发挥较大做用,在工做中若是你的本职工做是 Java Web 开发的话,这一块涉猎的概率仍是比较低。

不过一旦你接触到了模型设计、中间件、高效存储、查询等内容这些也是绕不过的坎。

这块内容和上面的计算机基础差很少,对于咱们 Java 开发来讲我以为平时除了多刷刷 LeetCode 加深印象以外,在平常开发中每选择一个容器存放数据时想一想为何选它?有没有更好的存储方式?写入、查询效率如何?

一样的坚持下去,从此确定收货颇丰。

同时推荐《算法(第4版)》

Java 基础

这里大部分的读者都是 Java 相关,因此这个强相关的技能很是重要。

Java 基础则是走向 Java 高级的必经之路。

这里抛开基本语法不谈,重点讨论实际工做中高频次的东西。

  • 基本容器,如:HashMap、ArrayList、HashSet、LinkedList 等,不但要会用还得了解其中的原理。这样才能在不一样的场景选择最优的设计。
  • IO、NIO 也是须要掌握。平常开发中大部分是在和磁盘、网络(写日志、数据库、Redis)打交道,这些都是 IO 的过程。
  • 常见的设计模式如:代理、工厂、回调、构建者模式,这对开发灵活、扩展性强的应用有很大帮助。
  • Java 多线程是很是重要的特性,平常开发不少。能理解线程模型、多线程优缺点、以及如何避免。
  • 良好的单测习惯,不少人以为写单测浪费时间没有意义。但正是有了单测能够提早暴露出许多问题,减小测试返工概率,提升代码质量。
  • 良好的编程规范,这个能够参考《阿里巴巴 Java 开发手册》以及在它基础上优化的《惟品会 Java 手册》

《Java核心技术·卷 I》值得推荐。

多线程应用

有了扎实的基础以后来谈谈多线程、并发相关的内容。

想让本身的 title 里加上“高级”两字确定得通过并发的洗礼。

这里谈论的并发主要是指单应用里的场景,多应用的能够看后文的分布式内容。

多线程的出现主要是为了提升 CPU 的利用率、任务的执行效率。但并非用了多线程就必定能达到这样的效果,由于它同时也带来了一些问题:

  • 上下文切换
  • 共享资源
  • 可见性、原子性、有序性等。

一旦使用了多线程那确定会比单线程的程序要变得复杂和不可控,甚至使用不当还会比单线程慢。因此要考虑清楚是否真的须要多线程。

会用了以后也要考虑为啥多线程会出现那样的问题,这时就须要理解内存模型、可见性之类的知识点。

一样的解决方式又有哪些?各自的优缺点也须要掌握。

谈到多线程就不得不提并发包下面的内容 java.util.concurrent。

最经常使用及须要掌握的有:

  • 原子类:用于并发场景的原子操做。
  • 队列。经常使用于解耦,须要了解其实现原理。
  • 并发工具,如 ConcurrentHashMap、CountDownLatch 之类的工具使用以及原理。
  • 线程池使用,以及相关原理。
  • 锁相关内容:synchronized、ReentrantLock 的使用及原理。

这一块的内容能够然咱们知道写 JDK 大牛处理并发的思路,对咱们本身编写高质量的多线程程序也有不少帮助。

推荐《Java 并发编程的艺术》很好的并发入门书籍。

JVM 虚拟机

想要深刻 Java ,JVM 是不可或缺的。对于大部分工做 1~3 年的开发者来讲直接接触这一些内容是比较少的。

到了 3~5 年这个阶段就必须得了解了,如下内容我以为是必需要掌握的:

  • JVM 内存划分,知道哪块内存存放哪些内容;线程安全与否;内存不够怎么处理等。
  • 不一样状况的内存溢出、栈溢出,以及定位解决方案。
  • 分代的垃圾回收策略。
  • 线上问题定位及相关解决方案。
  • 一个类的加载、建立对象、垃圾回收、类卸载的整个过程。

掌握这些内容真的对实际分析问题起到巨大帮助。

对此强力推荐《深刻理解Java虚拟机》,这本书反反复复看过好几遍,每一个阶段阅读都有不一样的收获。

数据库

作 WEB 应用开发的同窗确定要和数据库打很多交道,并且一般来讲一个系统最早出现瓶颈每每都是数据库,说数据库是压到系统的最后一根稻草一点也不为过。

因此对数据库的掌握也是很是有必要。拿互联网用的较多的 MySQL 数据库为例,一些必须掌握的知识点:

  • 索引的数据结构及原理、哪些字段应当建立索引。
  • 针对于一个慢 SQL 的优化思路。
  • 数据库水平垂直拆分的方案,须要了解业界经常使用的 MyCAT、sharding-sphere 等中间件。

常规使用能够参考《阿里巴巴 Java 开发手册》中的数据库章节,想要深刻了解 MySQL 那确定得推荐经典的《高性能 MySQL》一书了。

分布式技术

随着互联网的发展,传统的单体应用愈来愈不适合现有场景。

所以分布式技术出现了,这块涵盖的内容太多了,经验有限只能列举我平常使用到的一些内容:

  • 首先是一些基础理论如:CAP 定理,知道分布式系统会带来的一些问题以及各个应用权衡的方式。
  • 了解近些年大热的微服务相关定义、来源以及对比,有条件的能够阅读 martin fowler 的原文 Microservices,或者也能够搜索相关的国内翻译。
  • 对 Dubbo、SpringCloud 等分布式框架的使用,最好是要了解原理。
  • 接着要对分布式带来的问题提出解决方案。如分布式锁、分布式限流、分布式事务、分布式缓存、分布式 ID、消息中间件等。
  • 也要了解一些分布式中的负载算法:权重、Hash、一致性 Hash、故障转移、LRU 等。
  • 最好能作一个实践如:秒杀架构实践

以前有开源一个分布式相关解决组件:

github.com/crossoverJi…

同时推荐一本入门科普《大型网站技术架构》,出版时间有点早,从中能够学习一些思路。

懂点架构

相信你们都有一个架构师的梦想。

架构师给人的感受就是画画图纸,搭好架子,下面的人员来添砖加瓦最终产出。

但其实须要的内功也要很是深厚,就上面列举的样样须要掌握,底层到操做系统、算法;上层到应用、框架都须要很是精通。(PPT 架构师除外)

我自身参与架构经验也很少,因此只能提供有限的建议。

首先分布式确定得掌握,毕竟如今大部分的架构都是基于分布式的。

这其中就得根据 CAP 理论结合项目状况来选择一致性仍是可用性,同时如何作好适合现有团队的技术选型。

这里推荐下开涛老师的《亿级流量网站架构核心技术》,列举了不少架构实例,不过网上褒贬不一,但对于刚入门架构的能科普很多知识。

如何学习

谈完了技能树,如今来聊聊如何学习,这也是被问的最多的一个话题。

而关于学习讨论的最多的也是看视频仍是看书?

视频

不得不认可视频是获取知识最便捷的来源,毕竟包含了图、文、声。

大学几年时间其实我也没好好上专业课,我记得真正入门 Java 仍是一个暑假花了两个月的时间每天在家里看 ”马士兵“ 老师的视频教程,当时的资源也很老了,记得好像是 07 年出的视频(用的仍是 Google )。

那段时间早起晚睡,天天学到东西以后立刻实践,内心也颇有成就感。后来开学以后一度成为同窗们眼中的”学霸“人物。

如今打开我 12 年的电脑,硬盘里还躺着好几十 G 的教学视频。

看书

工做后时间真的很宝贵,彻底没有了学生生涯的想学就学的自由。因此如今我主要知识来源仍是书籍。

这些是我最近看的书:

如何成为一位「不那么差」的程序员

 

看书又会涉及到电子书和纸质书的区别,我我的比较喜欢纸质书。毕竟我能够方便的记笔记以及能够随时切换章节。最主要的仍是从小养成的闻书香的习惯。

知识付费

近几年知识付费愈来愈流行,许多大佬也加入了这个行列,人们也逐渐在习惯为知识去付费。

说实话写一好篇文章出一份视频都很是不容易,能有正向的激励,做者才能持续输出更好的内容。

这块我以为国内作的比较好我也为之付费的有极客时间、大佬的知识星球等。

这三点没有绝对的好坏之分,其实能够看出我刚入门的时候看视频,工做以后看书及知识付费内容。

视频的好处是能够跟着里面老师的思路一步一步往下走,比较有音视频代入感强,就像学校老师讲课同样。

但因为内容较长使读者无法知晓其中的重点,甚至都不敢快进生怕错过了哪一个重要知识,如今因为 IT 愈来愈火,网上的视频也不少致使质量良莠不齐也不成体系。

而看书能够选择性的浏览本身感兴趣的章节,费解的内容也方便反复阅读

因此建议刚入门的同窗能够看看视频跟着学,参与工做一段时间后能够尝试多看看书。

固然这不是绝对的,找到适合本身的学习方式就好。但无论是视频仍是看书都要多作多实践。

打造我的品牌

我的品牌看似很程序员这个职业不怎么沾边,但在现今的互联网时代对于每一个人来讲都很重要。

以往咱们在写简历或是评估他人简历的时候每每不会想到去网络搜索他的我的信息,但在这个信息爆炸的时代你在网上留下的一点印记都能被发现。

博客

所以咱们须要维护好本身的名片,好比先搭建本身的我的博客。

博客的好处我也谈过几回了,前期关注人少不要紧,重要的是坚持,当你写到 50、100篇文章后你会发现本身在这过程当中必定是的到了提升。

GitHub

第二点就和技术人比较相关了:参与维护好本身的 GitHub。

因为 GitHub 的特殊属性,维护好后能够更好的打造我的品牌。

Talk is cheap. Show me the code 可不是随便说说的。

想要维护好能够从几个方面着手:

  • 参与他人的项目,无论是代码库仍是知识库均可以,先融入进社区。
  • 发起本身的开源项目,无论是平时开发过程当中的小痛点,仍是精心整理的知识点均可以。

但这过程当中有几点仍是要注意:

  • 咱们须要遵照 GitHub 的社交礼仪。能用英文尽可能就用英文,特别是在国外厂库中。
  • 尽可能少 push 一些与代码工做无关的内容,我认为这并不能提升本身的品牌。
  • 别去刷 star。这也是近期才流行起来,不知道为何总有一些人会钻这种空子,刷起来的热度对本身并无任何提升。

这里有一篇国外大佬写的 How to build your personal brand as a new developer :

medium.freecodecamp.org/building-yo…

English 挺重要

再来谈谈英语的重要性,我记得刚上大学时老师以及一些培训机构都会说:

别怕本身英语差就学不了编程,真正经常使用的就那些词语。

这句话虽没错,但英语在对 IT 这行来讲仍是有着极大的加分能力。

拿常见的 JDK 里的源码注释也是纯英文的,若是英语还不错的话,一些 Spring 的东西彻底能够自学,直接去 Spring 官网就能够查看,甚至后面出的 SpringCloud,官方资料就是最好的教程。

再有就是平时查资料时,有条件的能够尝试用 Google + 英文 搜索,你会发现新的世界。

否则也不会有面向 Google/Stack Overflow 编程。

对于英语好的同窗天然不怕,那不怎么好的咋办呢?

好比我,但我在坚持如下几点:

  • 全部的手机、电脑系通通统换成英语语言,养成习惯(不过也有尴尬的连菜单都找不到的状况)。
  • 订阅一些英语周刊,好比 ”湾区日报“。
  • 按期去相似于 medium.com/ 这样具备影响力的国外社区阅读文章。

虽然如今我也谈不上多好,但目前我也在努力,但愿你们也一块儿坚持。

推荐一本近期在看的书《程序员的英语》。

保持竞争力

技术这个行业发展迅速、变化太快,每一年也都有无数相关行业毕业生加入竞争,稍不留神就会被遇上甚至超越。

因此咱们无时无刻都得保持竞争力。

多的谈不上,我只能谈下目前我在作的事情:

  • 打好基础。不是学了以后就忘了,须要不停的去看,巩固,基础是万变不离其宗的。
  • 多看源码,了解原理,不要停留在调参侠的境界。
  • 关注行业发展、新技术、新动态至少不能落伍了。
  • 争取每周产出一篇技术相关文章。
  • 积极参与开源项目。

思惟导图

如何成为一位「不那么差」的程序员

 

结合上文产出了一个思惟导图更直观些。

总结

本文结合了自身的一些经验列举了一些方法,不必定对每位都有效须要自行判断。

也反反复复写了差很少一周的时间,但愿对在这条路上和正在路上的朋友们起到一些做用。

大部分都只是谈了个思路,其实每一项单聊都能写不少。每一个点都有推荐一本书籍,有更好建议欢迎留言讨论。

上文大部分的知识点都有维护在 GitHub 上,感兴趣的朋友能够自行查阅:

如何成为一位「不那么差」的程序员

 

相关文章
相关标签/搜索