作者 l 程序员小跃
来源 l 程序员小跃(ID:runningdimple)
以下内容中的“小跃”,并非指小生本人,而是原作者
大家好,我是程序员小跃,一名在职场已经写了6年程序的老程序员,从一开始的菊厂 Android 开发到现在某游戏公司的Java后端架构,对Java还是相对了解的挺多。
大概是半年前吧,在知乎上有个知友私信给我,问我关于零基础如何学习Java,以及在学习过程中会存在一定的迷茫,如何应对等等。
我想着何不把以前的内容重新整合下分享出来给大家呢,于是就有了今天的这次分享。
在过去的一年多时间里,跃哥通过这份清晰的路线图,已经帮助 20+同学做好定位,快速认清了自己当前的现状,并做好相应的应对措施,甚至有同学通过调整,已经拿到了心仪的 offer。
那么马上进入主题,该篇内容主要涉及到以下主题,其中第一部分学习路线,在总结完每个路线的时候,跃哥还会有完成路线的成就感是什么,以及一些实用的书籍推荐噢。(每个模块都有思维导图总结以及 PPT,如需获取完整版导图,后台回复「学习路线」即可)
Java从入门到进阶学习路线
主导三个项目,让我独当一面
能力提升你要怎么学
全篇总结
Java 现在主要是作为后端应用在发展,尤其是他的微服务领域。根据编程语言排行来看,Java 常年占据榜单的 Top 3,学习和使用 Java 的伙伴实在是太多了。甚至有大V认为,在微服务领域 Java 目前是王者。
全球有 1200 万以上 Java 程序员以及海量的设备,还有无所不能的 Java 生态圈。诸如阿里巴巴、京东、百度、腾讯、美团、去哪儿等互联网公司,基本都是以 Java 为首选编程语言的。即使在最新的云计算领域,Java 仍然是 AWS、Google App Engine 等平台上,使用最多的编程语言。
所以,我们学习 Java 的更进一步目标就是把自己培养成微服务高手,找工作的目标要么就是去大厂写 Java,要么在小厂成为独当一面的主程。当然目前 Android 开发虽然说使用了Kotlin,使用 Java 的还是大有人在,跃哥就是从Android开发内部转到Java开发,也算是没有付出很高的代价。
Java从入门到进阶学习路线
了解 Java 语言
Java 的前世今生
Java 如何编译
Java 环境配置
Java 编译器
很多同学很喜欢一上来就想着写代码,恨不得一拿到书本的第一页就是教你如何如何写代码,其实不是这样的。
我们了解一门语言,一开始还是需要了解Java 的前世今生,Java 是怎么来的,如何发展,以及如何规划的。知道 Java 怎么来,应用在哪,我们才能去挖掘更多属于 Java 的价值,对不对?所以请问下大家,目前大家在用哪个版本呢?最新的版本是多少?最新的长更新版本又是多少?
所以很多教科书第一部分基本会聊一聊 Java 的历史,以及如何编译 Java,而不是一上来就让大家用编译器开始玩转。
跃哥一开始写 Java 还是敲的命令行,用记事本写过 Java 代码,语法错误都是靠编译一步步调整过来的,虽然很累,但是很受用。
不过我们最终是需要创造生产力的,而且来我们这里学习的同学肯定都是有功底的,所以其实这个第一部分是我的废话。比如 Java 如何编译,环如何安装,选择合适的编译器(目前基本就是 IDEA 和 Eclipse 两强割据时代)
Java 是一门纯粹的面向对象的编程语言,所以必须得弄懂它的 OOP 特性:封装、继承、多态。
关于基本知识学习
基础知识包括(这部分主要参考《Java核心技术卷》):
基本程序结构:基本变量类型、运算符、字符串、流程控制、数组
类与对象:类的定义和使用、静态属性和方法、继承、包管理、枚举、反射
接口和抽象类:接口的定义及实现、抽象类的定义及实现
泛型:泛型类、泛型方法
集合:Set、List、Map、树、排序和查找
异常与调试:内置异常、声明异常、自定义异常、捕获异常、日志
多线程:多线程概念、使用线程、同步
Java 8 之后的新特性:Lambda表达式、Stream(map、filter、reduce、集合)
Java 网络编程:TCP、UDP
Java I/O、NIO
算法与数据结构
学习基本知识,就是让你对Java语言有一个初步的了解。话又说回来,基础知识是学习一门编程语言的必备条件,而且大部分语言的基础知识都是大同小异,包含基本的数据类型、程序结构等等。如果是Java这类面向对象的,那么还得掌握面向对象的知识,面向对象是重中之重,面向对象是重中之重,面向对象是重中之重,重要的事情说三遍。只有掌握面向对象的知识,在后续的开发中才会有更好的成长。
这部分我加了算法和数据结构,其实我也在犹豫到底要把他分在哪个模块里,因为学校里学的时候,会教你基本的算法;但是工作,面试的时候,考的算法会综合起来,并不是生掰硬套就可以的。
现在校招算法是必备的模块了,所以我还是归结在基本知识里。比如我以前面试候选人的时候,冒泡这种是常常出现的。
成就感:学习了 Java 的前世今生,以及基本知识,就表示你可以愉快开始愉快的玩耍了。
学习完上面的 1-6 条那就可以在编译器上新建一个工程,开始初步掌握 Java 的基本操作,学完 7-11 可以尝试完成一个简单的聊天系统,写一个服务端,一个客户端,就可以进行聊天通信,那时候你的成就感会很足的噢。
推荐书单:
学习过程跃哥是按照《Java 核心技术卷 1》、《Java 核心技术卷 2》来的
跃哥刚开始学习的时候,是看了李刚老师的《疯狂 Java 讲义》,在实验室潜心学习半个多月啃出来的书
并发方面,可以看看《Java 并发编程实战》
Java 新特性,可以查阅《Java 实战》,跃哥最近也在回忆巩固,内容很干
算法的话,入门就推荐下去年很火的程序员小灰的《漫画算法》,以及最近很火的东哥写的 《labuladong的算法小抄》
关于 Spring 学习(Web 框架)
下面是掌握 Spring 相关,需要掌握的知识(可能不止,也可能有遗漏,后续可以再补充)
Maven:Maven与包管理、POM文件、生命周期等
单元测试:单元测试的概念,Junit
Spring Core:依赖注入与控制反转、Spring概述、xml 装配 bean、Spring容器与生命周期、自动装配、注解装配、切面编程(AOP)
HTTP协议:基本概念、方法(GET/POST)、HttpClist 库
JSON知识:JSON 概念、JSON 与 HTTP、JSON封装的库(FastJson、jaskson 库)
Servlet概念:Servlet 概念、Servlet 生命周期、Filter 和 Listener、Tomcat 与 Servlet 容器
Spring MVC概念:配置Spring MVC、路径映射、参数传递、实现REST、权限控制等
有了第一部分的基本知识,那我们第二步就是直奔主题。在领域里,Spring就是需要学习的利器。我大学是学习客户端的,所以那时候对后端的认知就是 Spring、Struts2、Hibernate三驾马车,结果后等自己写后端的时候,发现时代已经变了,现在更多的是掌握 Spring、Spring MVC、Mybatis,尤其是 Spring 框架。
这部分涉及的点也比较多,但是学习起来,基本都是连贯的。从你新建一个Spring项目开始,就一步步循序渐进,只要你开始写代码,这些知识都会涉及到,不用害怕自己没接触,学不会。
这里的书单推荐在后面,请稍等。
关于应用服务的学习
主要包括但不限于
MySQL:关系型数据库概念,数据库的CRUD操作、JDBC API、数据库特性,数据库连接池
MyBatis:OR映射概念,配置,映射,基本Java库,和Spring集成
缓存:缓存概念、Redis的使用、缓存雪崩、缓存穿透、缓存击穿
NoSQL:NoSQL概念,Mongodb的使用
队列:队列概念,RabbitMQ、Kafka
搜索引擎:Elasticsearch
反向代理:反向代理概念,Nginx的配置和使用
应用服务这一块,涵盖了很多领域,包括持久化、缓存、队列、反向代理等,这些是完善一个程序的重中之重。前面的那几个知识属于基础框架,那么中间件就是给框架里填充一些增强的部分,让程序健壮稳定。想必大家平时练手之类的遇到频率很高的项目就是电商类的项目,比如电商类中的秒杀就用了redis缓存知识。
这部分内容我觉得很有意思,一个功能完成了,仅仅是第一步,要完善他还需要多种配合。比如我们的数据存储,用到了SQL相关的知识,那就去掌握起来,现在互联网上基本都用MySQL再使用;然后你需要支持秒杀这类,就得用到Redis相关;库存更新是门技术活,你可能需要用到消息队列;历史订单查询,可以选择用mongodb,Elasticsearch;访问压力太大,你可能需要流量分发,甚至是熔断,那就需要Nginx的使用。
你看,这些应用就这样无形之中被应用起来,来提升应用的健壮性。我刚提到的这些,如果仅仅是小的项目使用或者是自己练手,存储上SQL就足够了,不需要用缓存等其他的,但是应用大了,就不得不考虑各种情况,那么这些神器就慢慢的使用上了。
你看,编程其实就是这么神奇,都是循序渐进的过程。
书单推荐:这里提到的很多,已经有很多优秀的书籍,跃哥就简单推荐几本,供大家参考。
《高性能 MySQL》(豆瓣评分 9.3,0.4K+人评价):mysql 领域的经典之作,拥有广泛的影响力。不但适合数据库管理员(dba)阅读,也适合开发人员参考学习。不管是数据库新手还是专家,相信都能从本书有所收获。
《Redis 实战》:如果你想了解 Redis 的一些概念性知识的话,这本书真的非常不错。
《Redis 设计与实现》(豆瓣评分 8.5):跃哥学习 Redis 的时候,除了看官网,捧在手里的就是这本书啦。
《RabbitMQ实战 : 高效部署分布式消息队列》也是 《RabbitMQ in Action : Distributed Messaging for Everyone》的中文版。最近在学习的时候,也看到老师推荐书单,有位老师就说,《xx in Action》这种书籍是经典书籍,很适合大家看,哈哈,这个不假,后面我还要推荐几本 xx in Action。
《Kafka权威指南》
《深入理解Nginx(第2版) : 模块开发与架构解析》
Web 框架进阶
SpringBoot
SpringCloud
服务发现(Eureka)
服务网关(Zuul)
负载均衡(Ribbon)
断路器(Hystrix)
配置管理(Config)
阿里的 Dubbo
到这里,很多同学应该都了解了 SSM 框架,然后你会觉得框架也不过这么回事,这里跃哥简单描述下一个轻量级 Web 框架主要具备以下功能:
可读取用户自定义配置文件,并以此来初始化框架;
具备 Bean 容器,管理项目的类的对象生命周期;
具备依赖注入,降低类之间的耦合性;
具备 AOP 功能,使项目可进行横向编程,可不改变原有代码的情况增加业务逻辑;
具备 MVC 框架模式。
SSM 是我认识的第一个Web框架,其实Web框架百花齐放,Spring 全家桶又是这些中的明星,尤其是他们家族中的 SpringBoot 和 SpringCloud 框架。
SpringBoot 弥补了Spring 配置上的缺点,再也不用为繁杂的 xml 耗费更多的精力,一接触SpringBoot的时候,仿佛打开了我的世界,颠覆了我之前的认知。如果你的项目刚开始,还在积累用户的阶段,那么SpringBoot 是一个好的选择,包括自己练手学习的项目,从SpringBoot 着手再合适不过了。
SpringCloud 是一个微服务架构,能够将项目按照业务分成一个个微服务,每个微服务都可独立部署,服务之间互相协调。当一个项目越来越大时,随之而来的是越来越难以维护,此时将项目拆分成若干个微服务、单独维护、单独部署,也可以降低项目不同业务间的耦合度。
这里还得提一个阿里的Dubbo,开源分布式服务框架,并被广泛应用于中国各互联网公司;只需要通过 Spring 配置的方式即可完成服务化,对于应用无入侵,设计的目的还是服务于自身的业务为主。Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
虽然中间Dubbo一度停止更新,但是阿里在2017年重新开始维护,他和Spring Cloud 都是实现微服务有效的工具。不过两者也有侧重点,这个大家可以搜索下,用一部分小伙伴通过台式电脑的比喻来说就是:Dubbo 是品牌机,Spring Cloud 是组装机。
我提供一个描述区别和联系的资料:https://www.cnblogs.com/aspirant/p/9089146.html
估计这时候,一些小伙伴开始懵逼了,Spring、SpringBoot、SpringCloud 这三个到底是啥关系,什么和什么呢?
跃哥这里参考了廖雪峰官网上的简单描述:
Spring 是 JavaEE 的一个轻量级开发框架,主营 IoC 和 AOP,集成JDBC、ORM、MVC等功能便于开发。
Spring Boot是基于Spring,提供开箱即用的积木式组件,目的是提升开发效率。
那么Spring Cloud是啥?
Spring Cloud顾名思义是跟云相关的,云程序实际上就是指分布式应用程序,所以Spring Cloud就是为了让分布式应用程序编写更方便,更容易而提供的一组基础设施,它的核心是Spring框架,利用Spring Boot的自动配置,力图实现最简化的分布式应用程序开发。
Spring Cloud包含了一大堆技术组件,既有开源社区开发的组件,也有商业公司开发的组件,既有持续更新迭代的组件,也有即将退役不再维护的组件。
成就感:从基本知识的路上,越走越远,完成了web 框架的学习,以及应用服务类的学习,那么恭喜你,这时候已经掌握了一个应用的基本构成。
你已经会很好地构建项目了,也会通过多线程并发实现提升效率的工作;还能通过缓存来完成一定的压力缓解,甚至是秒杀这类功能;还有消息中间件的使用,也是提升程序响应性能、提高用户体验的方式;如果你有机会接触微服务领域,那就能了解限流,分发,负载均衡等等,一般的应用功能肯定就难不到你啦。
你可以尝试自己去构建一个电商类项目,或者一个 OA 类的项目,去巩固自己的知识。
书单推荐:讲完了这几个联系和区别,我这里就隆重推出一套写给Java开发者的经典教程。
图书源自Manning公司经典“小人书”系列,被称为“Spring开发三剑客”,是Java开发者全面掌握Spring框架以及微服务开发的经典书籍。
《Spring实战 第5版》介绍了Spring 5的核心特性。书很厚,跃哥前段时间刚送了一本给读者。这里我们逐步构建出一个安全的、以数据库作为支撑的Web应用。在这个过程中,你还将会探索反应式编程、微服务、服务发现、RESTful API、部署并掌握专家级的较佳实践,真的是 666 了。
《Spring boot实战》以自动配置、起步依赖、命令行界面和Actuator这四个核心特性为基础,深入介绍Spring Boot的用法,可以构建出满足你生产需要的工程。
《Spring微服务实战》顾名思义就是教读者如何使用Java和Spring平台构建基于微服务的应用程序。在构建和部署第一个Spring Cloud应用程序时,将学习如何进行微服务设计。而且这本书里还精心挑选了几个真实案例展示了基于微服务的各种模式,很赞。
《深入理解Apache Dubbo与实战》关于 Dubbo,就推荐一本豆瓣评分7.0 的书给大家,这也是目前跃哥项目里在用的技术,很欢迎和大家一起交流哦。
优化进阶类
深入理解JVM虚拟机
Java 并发
Java 性能优化
设计模式:创建型(工厂、抽象工厂、生成器、原型、单例),结构型(适配器、桥接、组合、装饰器、外观、享元、代理),行为型(责任链、命令、解释器、迭代器、中介、备忘录、观察者、状态、策略、模板方法、访问者)
设计原则:SOLID
源码分析
前面描述的这么多,都是让你成为合格的Java程序员需要成长的地方,学会了那些,此时就可以独立完成一个Demo,独立完成项目组分配给你的开发任务。对的,这仅仅是完成开发任务,不过在我们程序员里,有一个和写作差不多的道理就是:先完成后完善。
一个需求扔给你,经过你的一番分析,你要做的就是写出来,完成功能。有时候仅仅完成是远远不够的,举个简单的例子,我们学习多线程的时候,都会以银行存取钱的例子来举例,确保在多线程的情况下,银行系统能稳定。那么问题来了,多线程换一个角度,融合到你的需求里,你是不是能很好的掌握运用起来呢?这就涉及到Java并发的掌握。
还有,如果你的项目使用的人多了,忽然发现用户量使用的高峰期,CPU 过载了;或者是一条请求很慢才返回,甚至出现了请求超时;又或者是你的Java运用看起来运行正常,但是GC日志里发现一堆GC在里面,日志越来越大,有一天程序挂了。。。
当出现这些问题的时候,仅仅是完成代码就不能解决你的困惑了,需要做的就是提升自己进阶方面的知识。比如多线程的合理运用,同步问题,CAP问题;如果出现频繁的读写数据库,甚至是查询慢的情况,还得掌握适当的数据库进阶,比如索引的配置,缓存的使用;针对一些代码上的优化,看看是不是可以合理的运用设计模式参与,天天CRUD,也能玩出花来。
总结起来就是,作为一名有追求的工程师,要学会用白盒的视角看待技术,平时在工作中也要多问几个为什么。正所谓,“知其然知其所以然”。你要努力逐步成为团队的核心成员,核心成员意味着能扛事。团队核心往往要能够 Hold 住不同技术领域、切换不同角色,比如架构设计、核心代码开发、紧急线上问题攻关等(这段话引用自极客时间)。
我在极客时间学习了很多Java相关的课程,很多老师都说强调一句话:源码之下无秘密。所以,当我们技术能力成长到一定程度的时候,就需要去学习下源码,非必须,但你想更进一步,这就是要多死磕了。
成就感:都已经到这部分了,之前的那些成就感对你来说都是毛毛雨啦。之前的那些,我们能很好地完成领导分配的需求任务,不拖项目的后腿。
这部分学完,那就厉害了。会性能优化,表示你可以解决项目组遇到的难题(前段时间跃哥就帮助一名小伙伴完成双休日CPU 负载 100%降到50%的过程,自己经历过了,成就感可能不仅仅是翻倍,真的)。
会阅读源码,那你能做的事情就更多,能解决的问题也更多,举个简单的例子,List个种类很多,有 ArrayList、LinkList、Vector什么时候使用哪个,你肯定能分析出来。
设计模式就更不用说了,很多人说学了也用不上,一直在 CURD、你要是能灵活使用设计模式,代码重构不是挺简单的事情?对吧。
这时候,你可以挑战自己,去慢慢地重构自己之前写的项目,或者是参与项目组更高端的任务中去,让自己的价值更大的发挥出来。
书单推荐:到了这部分,推荐的书单其实范围就不多了,估计大家都耳熟能详。
《Java 并发编程实战》,是一本完美的 Java 并发参考手册。这样解释简单明了吧,哈哈
《Java 性能权威指南》了解如何编写出并发的程序,你还需要了解一下如何优化 Java 的性能,这本书比较合适。通过学习,你可以比较大程度地提升性能测试的效果。其中包括:使用 JDK 中自带的工具收集 Java 应用的性能数据,理解 JIT 编译器的优缺点,调优 JVM 垃圾收集器以减少对程序的影响,学习管理堆内存和 JVM 原生内存的方法,了解如何最大程度地优化 Java 线程及同步的性能,等等(这段摘抄耗子叔的《左耳听风》专栏)。
看完上面那本书,如果还有余力,那么继续深入,《深入理解Java虚拟机(第3版) : JVM高级特性与最佳实践》这本书是周志明老师写的,已经到第三版了,跃哥学习过第二版,学完就飘了,看懂的话,得翻阅好几次。
设计模式就不解释了,学 Java 你一定要学面向对象的设计模式,经典中的经典自然就是《设计模式》。如果你觉得有点儿难度了,那么可以看一下《Head First 设计模式》。
如果你想学好 Java,再去啃一啃《Java 编程思想》也无妨。真是一本透着编程思想的书。上面的书让你从微观角度了解 Java,而这本书则可以让你从一个宏观角度了解 Java。
架构技能
架构基础:高性能、高可用、可扩展性、低成本、安全、规模
高性能架构模式:数据库集群(读写分离、分库分表);高性能 NoSQL、缓存架构;单服务器高性能模式(RPC);高性能负载均衡
高可用架构:CAP 理论、细节;集群和分期;异地多活保障
可扩展架构:目前主要是微服务架构
针对领域深究(比如音视频领域、即时通信领域)
如何做详细设计
到了架构技能这里,其实就是逐步的让自己从成为被直接喂养功能的一方,变成接收需求并分析,甚至是分配功能的一方。这时候要对软件工程的执行结果负责,这包括:按时按质进行软件的迭代和发布、敏捷地响应需求变更、防范软件质量风险、降低迭代维护成本。如果我们机遇好,那可以涉及到一个新系统的诞生;也许我们没有机遇从0到1设计一个新系统,但是我们也可以是将架构从1.0重构到2.0。
初级架构师就是做这类事情的,基于完善的架构设计方法论的指导来进行架构设计,技术专家更多的是基于经验进行架构设计。这两类都可以,参与的点不一样,但是实现的目标就是如此。
要完成复杂系统的架构设计,包含高性能、高可用、可扩展、海量存储等复杂系统,例如跃哥等会儿说到的第二个项目,就是和老大从零开始基于Netty重新开发了公司应用的聊天服务器系统,从能用到好用,蜕变成长超级快。
成长为高级架构师需要 10 年以上时间,其典型特征是“创造新的架构模式”,例如:高级架构师与中级架构师相比,典型区别在于“创造性”,高级架构师能够创造新的架构模式,开创新的技术潮流。(这部分跃哥目前还在努力中)
书单推荐:这部分跃哥也还在探索中,如果推荐的不好,大家多多见谅
《从零开始学架构 : 照着做,你也能成为架构师》这本书是我看的第一本架构书,针对业务系统的架构设计,贴近日常工作,有自己的一套方法论,还是比较实用的
《企业IT架构转型之道:阿里巴巴中台战略思想与架构实战 : 阿里巴巴中台战略思想与架构实战》
《软件架构设计 : 大型网站技术架构与业务架构融合之道》
《架构整洁之道》
其他补充
开发工具:IDEA、Eclipse、VS Code
版本控制工具:Git、SVN
Docker、K8s
命令行工具:iterm2(MacOS)
网络测试工具: PostMan、PostWoman
网络抓包工具
持续集成:Jenkins
Linux:远程连接Linux,Linux的常用命令(非必备)
这部分和非技术相关,但是在往后的项目使用中,是肯定需要用到的,属于神兵利器吧。比如一开头跃哥说的,初学者不要一开始就是用编译器,但是工作需要,肯定是要选择适合自己的编译器。在我刚开始学习Android的时候,用的还是Eclipse,搭建环境简直了,繁琐的很,后来Google 推出了 Android Studio,大大减少了环境安装的繁琐,让初学者一上来就可以快速使用,提升了效率。
Android Studio 就是基于IDEA 搞出来的,然后我才了解到 IDEA,现在在我的工作中也是离不开了,IDEA 主要有几个方面深深地吸引了我,让我的效率提升很大。很多同学可能还是适应Eclipse,这个就看自己的选择和习惯啦,反正对于写代码来说,是差不多的。
编译器只是一方面,版本控制是团队协作的利器,除非你的工作是一个人单打独斗,不然这块还是必须要掌握的。作为一名后端,跃哥的习惯就是自己先测试完,再提供给前端调试,那需要一定程度上保证自己代码的健壮性,必要的单元测试,甚至是流程测试都是必须的。
如果你的公司有运维部,去服务器上操作这种事情肯定不需要你插手了,这有利有弊吧。其实,在测试环境里自己可以自己上手,为什么呢?因为可以快速的去Linux上抓日志,查看问题,解决完之后,还能快速更新版本,省去和运维沟通的成本。运维有空的时候还好,如果他很忙,那你剩下的就是等待,这就得不偿失了。出包发版本,还可以利用自动化工具,比如Jenkins,效率杠杠滴,用过都说香。
书单推荐:这里推荐这些工具实用类,使用好了,开发效率提升好几个台阶呢。
《Git学习指南》 Git 现在是开发的必备技能,无论你是单兵作战还是团队协作,都需要版本控制来协助,不然就会有最后一版,最最最后一版这种类似于毕业设计的效果出来,哈哈。
《鸟哥的Linux私房菜 基础学习篇》鸟哥属于 Linux 的神人,谈到 Linux,没人不知道鸟哥的吧?
《DevOps实践指南》要提升自己运维和持续集成的能力,就看着吧
《第一本Docker书》
《Kubernetes权威指南 : 从Docker到Kubernetes实践全接触(第2版)》Docker 和 K8S 现在是越来越广泛了,很好地利用起来,运维的工作也能轻松很多
其他书单推荐:内容里我没有涉及到面试个的部分,学好了上面这些,巩固了知识,面试基本是 OK 的,但是有时候为了能快速掌握,还得突击一下,这里就加点面试相关的吧。
还有软件编程其他方面的提升,比如代码规范,重构等等。
image-20210110132603950《剑指Offer:名企面试官精讲典型编程题(第2版)》跃哥周围很多小伙伴,就是看了这本书的知识巩固,成了 offer 收割机
《代码整洁之道:程序员的职业素养》这本书在我大学的时候老师就不停地开始推荐,工作之后也是一直被推荐,不得不看
《重构 : 改善既有代码的设计》旧版新版都很 OK,重构是门技术活噢
《阿里巴巴Java开发手册(第2版)》一出来的时候就风靡了,还顺带出了编译器的插件,你安装了吗?
《码出高效:Java开发手册》这本书源于影响了全球250万名开发工程师的《阿里巴巴Java开发手册》,作者静心沉淀,对Java规约的来龙去脉进行了全面而彻底的内容梳理,配合着看妥妥的
软技能
沟通能力
软技能这里,我单独拎出来说。
主要是平时程序员在很多人心中就是沉闷,不善于沟通,甚至还被调侃成没有女朋友。但是,我们不能被这些影响,甚至需要努力去打破这种怪圈。
跃哥确实也见过一些小伙伴沉默寡言,除了默默地写代码,平时很少和别人沟通,除了自己部门的人,其他部门的小伙伴认识的不多,也不会打成一片,这样对自己成长还是会有局限性。
跃哥是个活泼开朗的人,也算是部门里和别的部门沟通最频繁的那个人了,无论是工作还是闲聊。这么做的好处是什么?如果你是大公司,一整套系统下来需要涉及到多个部门,你不了解你隔壁部门是做什么的,就会很被动,甚至不停地让领导去协调,领导也很忙的;如果是小公司,和其他部门的人沟通无非就是走几步的事情,再说了程序员群体里女生不多,其他部门女孩子多,万一就成了呢(这个跃哥这里可是见过例子的);甚至你和别的部门打通了,可以了解他们是做什么的,他们的优势在哪,他们的困难在哪,有没有你需要借鉴或者引以为戒的事,等等。
跃哥经历了几家公司,一直都是设备管理员,这个小小的职位,让我打通了很多边界,基本上和公司的人都能打成一片,至于有什么收获?除了老婆是已经找好了,其他的很多东西自己还是可以去接触,去学习,去获取的。比如我的数据库能力,除了平时写代码,就是烦着我们的DBA,我把他掏空。
适当的前端学习
Html、CSS、JavaScript
前端框架:Vue、React
这部分其实没啥好聊的,我们这里主要是Java后段路线的学习,前端就是稍稍带过一下。
学好前端的好处,就是前面说的,你用工具去测试你的代码;那么有了前端,自己写一个测试的Demo,前端请求下,比你用postman这类工具效率来的高,可以走一整套流程;跃哥会Android,一开始前后端写作,都是我自己写Android Demo完成的,提升了自己的效率不说,也让App开发省了不少事,很多代码,我都帮他们搭好框架了。
SpringBoot + Vue 的组合学习起来,平时自己练练手,写一个网站玩玩,技术人的开心,莫过于此吧。
推荐书单:这部分的书单推荐就有点超纲啦,哈哈。
《JavaScript高级程序设计(第3版)》要学好前端,JavaScript 是必须的
《疯狂HTML 5+CSS 3+JavaScript讲义(第2版)》跃哥学习的就是和本书,学会了基础才能走的更远嘛,对吧
《Spring Boot+Vue全栈开发实战》这本书是王松老哥写的,我向他取了好几次经,Vue 框架也是现在前端很流行的框架了,作者还是我们国人尤雨溪,骄傲吧
React.js 也是经典的框架,这里属于我的盲区,就不推荐书单了
主导三个项目,让我独当一面
这一个模块是在 1024 程序员节的时候,我有感而发,仔细回忆了我这么多年经历的最重要的三个项目,通过项目的方式和大家聊聊我是如何成长起来的!
在极客时间的《设计模式之美》课程里,作者小争哥说过一句话:对人一生有很大影响的四样东西:机遇、方向、能力、努力,我觉得它们一起决定了你是否能“成事”。我把我的经历总结起来,很应景,就是我遇上了机遇,继而有了能力上的提升,方向上的把控,以及持续努力的行动。
回忆目前为止我主要经历了三个项目,仔细归类的话,这三个竟然还都有所不同。
我参与的第一个项目(Android 客户端开发)
第一个项目,是我刚毕业半年之后进到项目组的一个Android App 项目。之前 App 项目的主要业务逻辑是通过 JavaScript 编写的,Android 端调用 WebView 展现即可,所以很多流程都是依赖于 JavaScript 的同学去完成。
第一个技术就来了,当时的领导们觉得有必要全部原生化,就让我赶上了重构的时代,说是重构,其实就是对之前在 JavaScript 上的业务迁移到 Android 原生上。
庆幸的是,原有项目一开始做的就比较好,文档之类的相对来说也齐全,做主流业务的同事一直在项目组里,哪怕文档里没有的业务,自己把问题总结起来抽时间麻烦他,也能得到想要的答案,基于业务文档的编码还是相对轻松。
也许老天是注定需要给我一次锻炼的机会,在重构伊始,我的师傅当时的 Android 端负责人因为身体原因休息了一个多月,就让我这个徒弟去接手了当时复杂的,核心的业务,得到了一次快速成长的机会。
抓住第一波机会的我,就这样坑次坑次完成了人生中第一个商业化项目的重构。因为项目很庞大,经历了几个月的加班加点,上架的时候狂松了一口气。几个月的努力终于看到了回报,因为前期准备的材料都很充分,对于业务上的阻碍轻松扫除,这次重构对初入职场的我是很大的能力提升。
试想一下,一个只在学校里自学 Android 的科班生,第一次接手项目,不是反复的修改Bug,而是参与重大的版本改革,是多么的幸运;锻炼的成长不言而喻,你能相信一开始入行的时候,我连面向对象都一知半解吗?项目的洗礼,可比学校里参考书籍写Demo挑战大多了。
随之而来的第二个项目(独立完成聊天服务器系统)
第二个项目,是我去新公司之后的项目,做一个即时通信的项目。
我来公司之前,有一个即时通信的在用,是基于 Flash 编写的,从响应速度和稳定性来说都没有让领导和用户满意,当时项目组里没有 Java 的同事(新招一个毕业生之前也没怎么接触过 Java),领导想内部发掘 Java 的员工。我做了一个方向上的选择,所以,我的第二次机遇就在这个时候蹦出来。
我到公司的时候是 Android 开发,因为当时项目组有3个 Android,没有 Java,领导在征求大家的建议,问有没有想转的,我分析了自己的情况之后,主动要求转 Java,和老大一起去做这个即时通信框架。
我们选择 Netty 框架来进行,用 WebSocket 通信,又一次加班加点的拼命时刻。(加班并不可怕,有意义的加班都不会考虑下班这件事,只会考虑能给自己带来多少收益,多少收获。)这次没有文档,只有代码,也还是有幸运的部分,之前框架的负责人一直在项目组里。
难点就是,我需要看懂 Flash 的代码,然后一步步迁移过去。此次从零开始,也有一点遗憾,整个框架是老大搭建好的,我的核心任务是在计划时间之内,完全迁移即时通信的功能,尽快把项目跑通,调试上线完成。
完美的人生总是不存在的,所以尽管那么点遗憾,搭建框架的时候我没参与,但不妨碍我对 Netty 的理解,为此我还在掘金上付费购买了 Netty 学习的一个专栏,加深我对 Netty 的理解。
从客户端转到后端,给我最大的感触就是我看项目看的范围更大了,之前客户端只是很片面的看到自己所负责的功能,后端能把整个项目都看透,尤其是业务方面的知识点。
当然,因为初次参与后端,第一次上线,给我当头一棒,现实着实把我教育了一番。后端编码和客户端还是存在不同,因为我的不熟练,在项目上线的第一个晚上,因为扛不住峰值的压力,把网站给瘫痪了,业务宕机了一个小时,幸亏老大帮我解决。
这么严重的线上事故,给我当头一棒,后端完成代码只是第一步,线上安全运行才刚刚开始挑战。这也是让我坚定,在做业务的同时,需要持续的精进自己的技术,比如数据库的频繁读写,缓存的使用,缓存雪崩、击穿的处理等等。
正在进行中的项目
这就是我的1.0项目,我花了两周的时间写了35+的接口,从开发到测试,加班加点完成,把我累的。我之前也说了,天天CURD 也能玩出花来,这次这么紧急的情况下,我先完成了第一个版本,从一定程度上没有拖项目的后腿,而且从写代码的时候,记录了一些需要优化的点,以及需要改善的点。因为是别人手里接手的,也是一个纯外包的项目,和后期的规划差了很多,就这样,阴差阳错,我们开始搞了第二个版本的迭代,也就是最近在做的 1.0 到 2.0 的升级。
这次升级,把一个前后端结合在一起的臃肿的程序,拆分成了轻量级的架构;把一些冗余的数据库进行了改进,删除优化了很多表结构信息,做了一些查询的索引;最最最大的改变就是使用了微服务来完成重构。
这一整个过程,除了业务代码是现成的,人都是从零开始,又是一次重大的机遇摆在我面前,不抓住那是傻子。很多群里的同学,想参与项目还没机会呢,我总是时不时地能碰到好的机会,来提升我的能力,或者这就是我的运气吧。
经历过这次,我就不怕那种丢给你一堆代码,甚至需求文档都没有的情况下,如何在保证项目正常运转的情况下,更好的做持续重构。在项目重构中熟悉业务,在重构中巩固Java编程技能,那么在艰难的外部环境下,至少你是项目组那位不可或缺的人,想裁你的时候,还得考虑考虑呢,是吧。
项目经历结语
正如我开头说的,总结我简短的几个项目经历(其实还有几个琐碎的项目,这里就省略了),就是我遇上了机遇。当每次机会来临的时候,放到你的面前,就看你怎么抓住了。一开始我是霸王硬上弓,但是到了后面就是不断地通过自己的学习,自己的努力,把能力提升上来;然后等待下一波机会的到来,或者是根据你的选择,去创造另一个机会。
这三次的经历,从我抓住机遇开始,后面又做了一次选择,当然加上自己平时的努力(平时多看书、多学习、多实践还是必要的)。不过跃哥的性格上目前有点刚,甚至有时候觉得自己做得很好,同事都没我强,我有天下无敌的感觉,导致我蒙蔽了双眼,还在努力尝试改进中。
能力提升你要怎么学
还没开始实践就有一堆烦恼
Java开发也好,C语言也罢,还是其他的语言学习,都是需要实践的;这个你就把自己当成一名技术工人,泥瓦工也是经过千锤百炼才能造房子;包装工也是经历过千万次的包装才能做到得心应手;语言组织也是如此,作文就是一字一句积累起来的。
编程是一门技术活,不是靠单纯的体力活动能胜任的,所以想提升能力方面这个无他,唯有熟能生巧。写代码这个要求太低了,还远远不够,我们还是想让自己更加优秀,那就需要做更多的努力
我经常和群友说,编程到最后并不是写代码,写代码是最最容易的事情。在写代码之前,还有需求分析,技术选型(选数据库,选中间件等),架构设计,流程设计,算法选择,这些都完成了,那你把这些转换成代码就是水到渠成。
这里只是给出一个最终的目标,针对初学者,一开始不能好高骛远,也不能被困难所吓倒。我上面给了学习路线,你看明白了吗?所以,你现在心里有数,有没有被吓到,如果没有,那么请你仔细阅读《Java核心技术卷1》,把上面的基础知识都先掌握,出现的代码都在编译器上实践,一行一行编写,理解他。如果已经被打倒,那后面就没有什么事了,好好选择一个更好的出路即可。
等基础知识都慢慢地学会,然后再去找一些小Demo,比如说实现一个计算器,就能检验你的学习成果。写代码是一个循序渐进的过程,基础先学会,逐渐就有成就感,那后面的困难就迎刃而解,否则等到后面学习算法,项目时间,困难重重。
主动学习和被动学习
-- 以下部分参考极客时间《左耳听风》专栏
人的学习分为「被动学习」和「主动学习」两个层次
被动学习:如听讲、阅读、视听、演示,学习内容的平均留存率为 5%、10%、20% 和 30%。
主动学习:如通过讨论、实践、教授给他人,会将原来被动学习的内容留存率从 5% 提升到 50%、75% 和 90%。
这里可以理解出来,你听别人讲,或是自己看书,或是让别人演示给你,这些都不能让你真正获得学习能力,因为你是在被别人灌输,在听别人说,在看别人的成果。
只有你开始自己思考,开始自己总结和归纳,开始找人交流讨论,开始践行,并开始对外输出,你才会掌握到真正的学习能力。
学习不仅仅是为了知道,而更是为了思考和理解。在学习的过程中,我们不是为了知道某个事的表面是什么,而是要通过表象去探索其内在的本质和原理。真正的学习,从来都不是很轻松的,而是那种你知道得越多,你的问题就会越多,你的问题越多,你就会思考得越多,你思考得越多,你就会越觉得自己知道得少,于是你就会想要了解更多。如此循环,是这么一种螺旋上升上下求索的状态。
在学习的过程中,我们要不断地问自己,这个技术出现的初衷是什么?是要解决什么样的问题?为什么那个问题要用这种方法解?为什么不能用别的方法解?为什么不能简单一些?……
这些问题都会驱使你像一个侦探一样去探索背后的事实和真相,并在不断的思考中一点一点地理解整个事情的内在本质、逻辑和原理。一旦理解和掌握了这些本质的东西,你就会发现,整个复杂多变的世界在变得越来越简单。你就好像找到了所有问题的最终答案似的,一通百通了。
学习是为了改变自己的思考方式,改变自己的思维方式,改变自己与生俱来的那些垃圾和低效的算法。总之,学习让我们改变自己,行动和践行,反思和改善,从而获得成长。
全篇总结
总算和大家分享完了,这里我简单的总结一下。
首先,就是都关心的问题,我选择了Java,那么我以后能做什么。其实Java能做的很多,只是在现阶段,我们通过编程语言排行榜也能看到,Java是稳居前三,说明他有庞大的用户群体,那么就代表着网络上有海量的 Java 学习资料,良好的社区环境,优秀的解决方案,以及超级多的框架学习,你丝毫不用担心自己找不到问题的解决方案,找不到学习的路径,是在找不到,咱们还有星球呢。
其次就是如何学习,我列举的 Java 学习路线也是根据后端的学习路线来,后面经过补充,进阶部分也写了。
第三,就是学习方法,怎么学。说实话,编码一直都是取决于个人的学习情况以及自律能力。很多人在学校里努力,在校招的时候就能有一个好的offer,有些在学校里没能坚持下来,可能毕业之后就放弃这条路了;还有些是一开始觉得很感兴趣,后来发现自己不适合,要么学校里选择转专业,要么出来之后转产品,转实施等也算是改行。那么,就是两个结果,用篮球季后赛的术语就是 Win or Go Home。
判断自己是否有毅力学习下来,可以参考下我在上面的建议,当然,如果小伙伴们有更好的建议,给我留言,让大家一起交流交流。
千万不要什么都没去实践,但是一直在担心担心,担心自己不能写代码。如果你不开始实践,怎么知道自己是不是适合,是不是喜欢,是不是会走这条路呢,对吧。其实我刚读大一,接触 C 语言的时候,尤其是到了指针,链表,想过放弃,但是最后我断了这个念头,我要是不写代码,我大学不是白考了,转专业?现实点,能转专业的,都是班里的女生,死磕学习成绩,名额都抢光了。那么你还能怎么办,硬着头皮继续吧。
就这样,一直到毕业,我在实验室里看着书,敲着代码,大家的暑假有两个月,我的暑假就只给自己一个月,另外一个月都在学校里渡过,就是为了让自己能不辜负父母的付出。后来,反正就是不断的努力,成长,以及一定的机遇抓住就好。
极客时间左耳听风、设计模式、Java专题、架构专题等专栏
廖雪峰 Java 教程:https://www.liaoxuefeng.com/wiki/1252599548343744/1305158055100449
知乎关于Java的部分资料
全栈级别梳理-Android系统启动流程
2020 最好的 10 大学习编程网站!
如果你有写博客的好习惯
欢迎投稿