前言
已经记不清有多少读者问过:
博主,你是怎么学习的?像我这样的情况有啥好的建议嘛?
也不知道啥时候我居然成人生导师了。当然我不排斥这些问题,和大家交流都是学习的过程。
因此也许诺会准备一篇关于学习方面的文章;所以本文其实准备了很久,篇幅较长,大家耐心看完希望能有收获。
以下内容仅代表我从业以来所积累的相关经验,我会从硬技能、软实力这些方面尽量阐述我所认为的 “不那么差的程序员” 应当做到哪些技能。欢迎大家加入架构华山论剑:836442475 本群提供免费的学习指导 架构资料 以及免费的解答 不懂得问题都可以在本群提出来 之后还会有职业生涯规划以及面试指导 进群修改群备注:开发年限-地区-经验 方便架构师解答问题
技能树
作为一名码代码的技术工人,怎么说干的还是技术活。
既然是技术活那专业实力就得过硬,下面我会按照相关类别谈谈我们应该掌握哪些。
计算机基础
一名和电脑打交道的工种,计算机是我们赖以生存的工具。所以一些基础技能是我们应该和必须掌握的。
比如网络相关的知识。
其中就包含了 TCP 协议,它和 UDP 的差异。需要理解 TCP 三次握手的含义,拆、粘包等问题。
当然上层最常见的 HTTP 也需要了解,甚至是熟悉。
由于工作后你写的大部分代码都是运行在 Linux 服务器上,所以对于这个看它脸色行事主你也得熟悉才行。
比如进程、线程、内存等概念;服务器常见的命令使用,这个没啥窍门就是得平时多敲敲多总结。
我也是之前兼职了半年运维才算是对这一块比较熟悉。
当作为一个初学者学习这些东西时肯定会觉得枯燥乏味,大学一般在讲专业课之前都会有这些基础学科。我相信大部分同学应该都没怎么仔细听讲,因为确实这些东西就算是学会了记熟了也没有太多直接的激励。
但当你工作几年之后会发现,只要你还在做计算机相关的工作,这些都是绕不开的,当哪天这些知识不经意的帮助到你时你会庆幸当初正确的选择。
数据结构与算法
接下来会谈到另一门枯燥的课程:数据结构。
这块当初在大学时也是最不受待见的一门课程,也是我唯一挂过的科目。
记得当时每次上课老师就让大家用 C 语言练习书上的习题,看着一个个拆开都认识的字母组合在一起就六亲不认我果断选择了放弃。
这也造成现在的我每隔一段时间就要看二叉树、红黑树、栈、队列等知识,加深印象。
算法这个东西我确实没有啥发言权,之前坚持刷了部分 LeetCode 的题目也大多停留在初中级。
但像基本的查找、排序算法我觉得还是要会的,不一定要手写出来但要理解其思路。
所以强烈建议还在大学同学们积极参与一些 ACM 比赛,绝对是今后的加分利器。
这一块内容可能会在应届生校招时发挥较大作用,在工作中如果你的本职工作是 Java Web 开发的话,这一块涉猎的几率还是比较低。
不过一旦你接触到了模型设计、中间件、高效存储、查询等内容这些也是绕不过的坎。
这块内容和上面的计算机基础差不多,对于我们 Java 开发来说我觉得平时除了多刷刷 LeetCode 加深印象之外,在日常开发中每选择一个容器存放数据时想想为什么选它?有没有更好的存储方式?写入、查询效率如何?
同样的坚持下去,今后肯定收货颇丰。
Java 基础
这里大部分的读者都是 Java 相关,所以这个强相关的技能非常重要。
Java 基础则是走向 Java 高级的必经之路。
这里抛开基本语法不谈,重点讨论实际工作中高频次的东西。
基本容器,如:HashMap、ArrayList、HashSet、LinkedList 等,不但要会用还得了解其中的原理。这样才能在不同的场景选择最优的设计。
IO、NIO 也是需要掌握。日常开发中大部分是在和磁盘、网络(写日志、数据库、Redis)打交道,这些都是 IO 的过程。
常见的设计模式如:代理、工厂、回调、构建者模式,这对开发灵活、扩展性强的应用有很大帮助。
Java 多线程是非常重要的特性,日常开发很多。能理解线程模型、多线程优缺点、以及如何避免。
良好的单测习惯,很多人觉得写单测浪费时间没有意义。但正是有了单测可以提前暴露出许多问题,减少测试返工几率,提高代码质量。
多线程应用
有了扎实的基础之后来谈谈多线程、并发相关的内容。
想让自己的 title 里加上“高级”两字肯定得经过并发的洗礼。
这里谈论的并发主要是指单应用里的场景,多应用的可以看后文的分布式内容。
多线程的出现主要是为了提高 CPU 的利用率、任务的执行效率。但并不是用了多线程就一定能达到这样的效果,因为它同时也带来了一些问题:
上下文切换
共享资源
可见性、原子性、有序性等。
一旦使用了多线程那肯定会比单线程的程序要变得复杂和不可控,甚至使用不当还会比单线程慢。所以要考虑清楚是否真的需要多线程。
会用了之后也要考虑为啥多线程会出现那样的问题,这时就需要理解内存模型、可见性之类的知识点。
同样的解决方式又有哪些?各自的优缺点也需要掌握。
谈到多线程就不得不提并发包下面的内容 java.util.concurrent。
最常用及需要掌握的有:
原子类:用于并发场景的原子操作。
队列。常用于解耦,需要了解其实现原理。
并发工具,如 ConcurrentHashMap、CountDownLatch 之类的工具使用以及原理。
线程池使用,以及相关原理。
锁相关内容:synchronized、ReentrantLock 的使用及原理。
这一块的内容可以然我们知道写 JDK 大牛处理并发的思路,对我们自己编写高质量的多线程程序也有很多帮助。
推荐《Java 并发编程的艺术》很好的并发入门书籍。
JVM 虚拟机
想要深入 Java ,JVM 是不可或缺的。对于大部分工作 1~3 年的开发者来说直接接触这一些内容是比较少的。
到了 3~5 年这个阶段就必须得了解了,以下内容我觉得是必须要掌握的:
JVM 内存划分,知道哪块内存存放哪些内容;线程安全与否;内存不够怎么处理等。
不同情况的内存溢出、栈溢出,以及定位解决方案。
一个类的加载、创建对象、垃圾回收、类卸载的整个过程。
掌握这些内容真的对实际分析问题起到巨大帮助。
数据库
做 WEB 应用开发的同学肯定要和数据库打不少交道,而且通常来说一个系统最先出现瓶颈往往都是数据库,说数据库是压到系统的最后一根稻草一点也不为过。
所以对数据库的掌握也是非常有必要。拿互联网用的较多的 MySQL 数据库为例,一些必须掌握的知识点:
索引的数据结构及原理、哪些字段应当创建索引。
针对于一个慢 SQL 的优化思路。
数据库水平垂直拆分的方案,需要了解业界常用的 MyCAT、sharding-sphere 等中间件。
分布式技术
随着互联网的发展,传统的单体应用越来越不适合现有场景。
因此分布式技术出现了,这块涵盖的内容太多了,经验有限只能列举我日常使用到的一些内容:
首先是一些基础理论如:CAP 定理,知道分布式系统会带来的一些问题以及各个应用权衡的方式。
了解近些年大热的微服务相关定义、来源以及对比,有条件的可以阅读 martin fowler 的原文 Microservices,或者也可以搜索相关的国内翻译。
对 Dubbo、SpringCloud 等分布式框架的使用,最好是要了解原理。
接着要对分布式带来的问题提出解决方案。如分布式锁、分布式限流、分布式事务、分布式缓存、分布式 ID、消息中间件等。
也要了解一些分布式中的负载算法:权重、Hash、一致性 Hash、故障转移、LRU 等。
懂点架构
相信大家都有一个架构师的梦想。
架构师给人的感觉就是画画图纸,搭好架子,下面的人员来添砖加瓦最终产出。
但其实需要的内功也要非常深厚,就上面列举的样样需要掌握,底层到操作系统、算法;上层到应用、框架都需要非常精通。(PPT 架构师除外)
我自身参与架构经验也不多,所以只能提供有限的建议。
首先分布式肯定得掌握,毕竟现在大部分的架构都是基于分布式的。
这其中就得根据 CAP 理论结合项目情况来选择一致性还是可用性,同时如何做好适合现有团队的技术选型。
如何学习
谈完了技能树,现在来聊聊如何学习,这也是被问的最多的一个话题。
而关于学习讨论的最多的也是看视频还是看书?
视频
不得不承认视频是获取知识最便捷的来源,毕竟包含了图、文、声。
大学几年时间其实我也没好好上专业课,我记得真正入门 Java 还是一个暑假花了两个月的时间天天在家里看 ”马士兵“ 老师的视频教程,当时的资源也很老了,记得好像是 07 年出的视频(用的还是 Google )。
那段时间早起晚睡,每天学到东西之后马上实践,心里也很有成就感。后来开学之后一度成为同学们眼中的”学霸“人物。
现在打开我 12 年的电脑,硬盘里还躺着好几十 G 的教学视频。
看书
工作后时间真的很宝贵,完全没有了学生生涯的想学就学的自由。所以现在我主要知识来源还是书籍。
这些是我最近看的书:
看书又会涉及到电子书和纸质书的区别,我个人比较喜欢纸质书。毕竟我可以方便的记笔记以及可以随时切换章节。最主要的还是从小养成的闻书香的习惯。
网友评论