9

炸裂!手摸手教你如何吃透一个 Java 项目,yyds

 3 years ago
source link: https://blog.csdn.net/qing_gee/article/details/117803706
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

炸裂!手摸手教你如何吃透一个 Java 项目,yyds

沉默王二 2021-06-11 08:48:09 6466

先说一下大多数新手的情况:就是对着视频敲 Java 项目,其中遇到的 BUG 还能解决,但就是每次敲完一个项目,就感觉很空虚,项目里面的知识点感觉懂了但又好像没懂,应该怎样才能掌握一个项目所用的知识点呢?

先分享一位好朋友丁威的经验吧,他是《RocketMQ技术内幕》一书的作者。他在尝试学习 RocketMQ 之前未曾接触过消息中间件,但硬是通过自己提炼的学习方法,最终成为 RocketMQ 社区的优秀布道师。这让他有了一个非常亮眼的标签,极大提高了职场竞争力。

他的总结有以下四点:

  • 了解这个项目的使用场景、以及架构设计中将承担的责任。
  • 寻找官方文档,从整体上把握这个项目的设计理念。
  • 搭建自己的开发调试环境,运行官方提供 Demo 示例,为后续深入研究打下基础。
  • 先主干流程再分支流程,注意切割,逐个击破。

我认为是非常有道理的。记得我一开始参加工作的时候,拿到领导安排的项目后,非常懵逼,完全不知道该如何下手,不知道自己该干嘛。去问领导,领导说没时间,要我自己先研究研究,研究什么呢?

一开始当然毫无头绪,后面就慢慢琢磨出来了一点小心得。

先从项目的需求文档下手,先了解这个项目是干嘛的,了解个大概,就不慌了。然后把这个项目的源码在本地跑起来,“跑起来”,说着简单,真正做的时候还是挺难的,我记得我当时跑第一个项目差不多用了一周多的时间,因为我的开发环境和项目要求的有一些不一样,就导致出了很多问题。

我印象很深刻的问题有两个,第一个就是乱码了,类似下图这种。

第二个就是编译出错,原因很简单,JDK 的版本不一样。

这两个问题虽然简单,但特别常见,真的,新手基本上都会遇到。一开始遇到的时候是很慌的,因为源码肯定不会有问题,有问题的肯定是自己的开发环境。

折腾了一周多的时间,项目终于跑起来了。

我让自己体验了一把测试的角色,就是把能操作的按钮全点一遍,体验一下项目哪些已经开发完成了,哪些还没有。没用多久,我就测出来了两三个新 bug,基本上都是一些非常规操作引起的,虽然我没能解决,但报告给领导后,领导还是很惊讶的,他看我的小眼神,多少有点看吴下阿蒙的感觉,“小伙子,有长进啊!”

然后,我并没有着急去开发领导安排给我的任务,而是去看同事已经完成的代码,当然是带着问题去看的,为什么他会这么写?这么写的好处是什么?如果换做是我,我会怎么实现?这其中的差别是我自己考虑不周吗?

当然了,我不会看太细致,因为有些内容超出了我的技术范围,我看不懂的,只能是“走马观花”,大致看明白是什么意思就“得过且过”了。

这里提醒大家一点的是,千万不要陷入技术细节,尤其是一开始做项目的时候,因为自己不了解业务,再加上技术水平可能达不到,研究技术细节很容易就阵亡了。

另外一点就是,基本功一定要扎实,不要连整体的代码脉络都看不懂,那样就很吃力了。我这里有一份 GitHub 上星标 115k+ 的 Java 教程,里面涵盖了 Java 所有的知识点,包括 Java 语法、Java 集合框架、Java IO、Java 并发编程和 Java 虚拟机,内容不多,只讲重点

GitHub 星标 115k+的 Java 教程,超级硬核!

尽量花一点时间巩固一下基础,不要让自己太被动。遇到自己生疏的知识点,就主动去查一下。

看源码的时候,自己加一些日志啊,加一些断点啊,去跑一跑。有时候,不加断点,只是去看源码很可能会忽略掉一些关键的技术细节,因为 Java 是多态的,有些地方看源码只能看到类和类之间的层次关系,却看不到子类是怎么重写父类方法的,或者实现类是怎么实现接口的,通过调试就可以看的很明白。

还有一些分支语句啊,如果只是看源码可能不明白进入这个分支的条件是什么。还有一些比较关键的技术细节啊,只看源码可能懵懵懂懂的,跟着断点一步步地深入可能就全明白了。

举个例子,拿 StringBuilder 的 append() 方法来说吧。StringBuilder 的内部是通过字符数组(Java 8)实现的, 如果新添加的字符串长度超出了数组的长度,是要进行扩容的。加了断点后,遇到需要扩容的情况就能看到 JDK 的内部是怎么来进行扩容的啦,如下图所示。

一般来说,项目都是比较庞大的,代码会比较多,这时候最好只关注一个模块,就是自己通过需求文档,或者阅读源码了解最多的模块,尽量把这个模块的整体逻辑给吃透了,如果领导恰好安排你做的这个模块的业务代码,那你的上手难度就大大降低了!

再总结一下:

  • 拿到项目后,不要着急动手,先看文档,尤其是需求文档。
  • 把项目的源码在本地跑起来。
  • 做一些测试,看能不能测出一些边界的 bug。
  • 关注一个模块,去研究一下源码,但不要过于深究技术细节。

我再给大家推荐两个优秀的 Java 开源项目吧,如果你还没有参加工作,可以拿这两个项目作为练手项目。

  • SpringBoot 完整电商系统 Mall:包括前台商城系统及后台管理系统,基于 SpringBoot+MyBatis 实现。
  • vhr:微人事是一个前后端分离的人力资源管理系统,项目采用 SpringBoot+Vue 开发。

我之前做的一个电商项目还用了 mall 作为基层的架构!mall 的学习教程非常全面,作者直接做了一个在线的网站,基本上用的技术都讲述得特别明白!

vhr 目前在 GitHub 上已经有 20.8k 的 star,属于很强的那种了。

后端技术栈

  • Spring Boot
  • Spring Security
  • MyBatis
  • MySQL
  • Redis
  • RabbitMQ
  • Spring Cache
  • WebSocket

前端技术栈

  • ElementUI
  • axios
  • vue-router
  • WebSocket
  • vue-cli4

基本上主流的前后端技术都用到了。作者为初学者特意录了项目的部署视频教程,很贴心~

文档写得特别全,我简单列举下。

  • 权限数据库设计
  • 服务端环境搭建
  • 动态处理角色和资源的关系
  • 密码加密并加盐
  • 服务端异常的统一处理
  • axios 请求封装,请求异常统一处理
  • 将请求方法挂到Vue上
  • 登录状态的保存
  • 登录成功后动态加载组件
  • 角色资源关系管理
  • 用户角色关系管理

基本上每个知识点都有对应的文档,文档齐全的话,对吃透项目是极好的帮助。

嗯,最后强调一点,大家在做练手项目的时候,一定记得写注释。我在很多地方看到这样一个观点,“请停止写注释,因为只有烂的代码才需要注释。”这个观点非常巧妙,它让我想起了孟子的一句话,“杨氏为我,是无君也;墨氏兼爱,是无父也。无父无君,是禽兽也。”

Java 源码的作者绝对是这个世界上最优秀的程序员,连他们都写注释,那些声称“请停止写注释”的号召者是不是要啪啪啪地打脸,直到打肿为止。

拿 String 来说吧,要了解这个类,直接看类的注释就足够了,写得非常详细。

一个优秀的 Java 项目也应该是这样的,注释必须到位,不然别人怎么吃透,吃不透的。只能说一句,Java 源码的作者,yyds(阴阳大师,hhh)。

我是二哥呀,赞一个可好?


Recommend

  • 84
    • 微信 mp.weixin.qq.com 6 years ago
    • Cache

    手摸手教你写 Kubernetes 的 golang 服务

  • 40

    前言: VuePress是尤大为了支持 Vue 及其子项目的文档需求而写的一个项目,VuePress界面十分简洁,并且非常容易上手,一个小时就可以将项目架构搭好。现在已经有很多这种类型的文档,如果你有写技术文档的项目的话,VuePress绝对可以成为你的备选项

  • 57

    前言 在本篇文章之前,WebSocket很多人听说过,没见过,没用过,以为是个很高大上的技术,实际上这个技术并不神秘,可以说是个很容易就能掌握的技术,希望在看完本文之后,马上把文中的栗子拿出来自己试一试,实践出真知。 游泳、健身了解一下:博客、前端积累文档...

  • 35
    • 微信 mp.weixin.qq.com 5 years ago
    • Cache

    手摸手教你封装跨项目复用的 Vue 组件库

  • 58

    在前端项目的开发中,往往会根据业务需求,沉淀出一些项目内的UI组件/功能模块(以下通称组件) 等;这些组件初期只在同一个项目中被维护,并被该项目中的不同页面或模块复用,此时的组件逐步被完善,是一个只聚焦于功能和健壮性的成长期。 随着业务的发展,原来的...

  • 24

    项目选型与环境搭建 项目选型 三大框架里选哪个? react 个人爱好。 react-router 定义路由。 react context 状态管理。 re...

  • 21

    这篇文章目的是介绍如何创建一个ESLint插件和创建一个 ESLint rule ,用以帮助我们更深入的理解ESL...

  • 20

    这篇文章目的是介绍如何创建一个ESLint插件和创建一个ESLint rule,用以帮助我们更深入的理解ESLint的运行原理,并且在有必要时可以根据需求创建出一个完美满足自己需求的Lint规则。 插件目标 禁止项目中setTimeout的第二个参数是数字。

  • 35

    前言: 首先,我的心路历程如下: 然后就成了。目前使用正常,还差个外置驱动,就可以实现蓝牙+隔空投送功能。 而这样一部3A大作通吃,27寸 4k屏的生产力黑苹果主机,我仅花了三千块组装。 接下来将从选择配件,到驱动双系统通通给你们讲明白。 1. 前置准备

  • 4

    Eason最近遇到一个需求,需要去展示分段式的进度条,为了给这个进度条想要的外观和感觉,在构建用户界面 (UI) 时,大家通常会依赖 SDK 提供的可用工具并尝试通过调整SDK来适配当前这个UI需求;但悲伤的是,大多数情况下它基本不符合我们的预期。所以Eason决定自...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK