Skip to content

已经会了 Python,重新再学 Java 是一种什么体验?

最近接手了一个 Java 微服务的项目,被迫需要把 Java 只是都过一遍。本文记录一下在掌握了 Python flask web 全栈开发 的情况下,重新学习 Java web 的经历。

契子

在面试之前,说好的可以用自己的脚手架重写项目。但是入职办理完了,后续沟通中突然说必须用 Java 实现。 正常情况下我是想直接跑路的,但是从衡阳跑到长沙,并且公司规模尚可、经营状况良好、大小休、不加班、节假日正常放,犹豫了一下就答应了。

虽然我不想学习一门新的语言,但是只是维护旧项目,做做增删改查,对于我来说应该说并不难。很久之前就知道精通一门语言之后,学习一门新的语言并不难, 所以自己也想试一下这个时间究竟是多久。

第一步:建立对语言的系统认知

学习一门语言,不是立马开始学,而是先对语言、需要做的东西建立一个系统的认知。

在不清楚项目是什么样子之前,就先补充一下对应的基础知识。先是搜到了一个非常棒的关于 Python 与 Java 对比的系列文章:给Python程序员的Java教程 。 大学期间自学过 C、Java,但是已经六七年没有用过了,因为对 Python 的熟练度很高(后面会介绍),对比学习起来还是非常快。

得知项目是使用 pigx 的微服务实现的,于是开始补充 spring 相关知识。先是找来了某马的系列视频,把 spring 的视频以 3-4 倍速刷了一遍,大概花了两三天,过完了Java web、spring 框架的相关知识。内容主要为 spring、spring mvc、 mybatis、Tomcat、Maven、spring boot、mybatis-plus、spring cloud 及其相关的知识。

因为刷视频的速度很快,学习过程出现信息过载、疲倦等症状,导致学完一遍之后好像把所有知识点都忘记了,但是也清楚了 Java web 的构成。 以及我接手的项目需要那些技术。

第二步:补充基础知识

我的 Java 几乎忘光了,之前主要是做 python web 开发的,虽然直接上手 spring web 不是不行,但是效率过低,所以还是准备补充一下对应的基础知识。

因为找的资料里面包含 markdown 课件、源码,所以花了一天时间把基础部分的课件看完、源码跑了一遍,熟悉了一下。然后又花了 3-4 天把 spring 相关的课件、源码给熟悉了一下。这时候在回过头来看 pigx 项目的源码,就变得轻松了许多。

因为上个开发人员是自己购买的 pigx 商业版,我拿不到对应的文档,所以后面就只能看源码学习,不然速度还会更快。

第三步:熟悉项目

对于 pigx 的源码,因为交接文档有问题,跑了一天没有启动起来。断点调试定位到异常出现的位置,调用 user mapper 返回的值为空导致了异常,然而数据库中存在数据。 项目采用的是微服务架构,在浏览器发送请求,先是打到网关, 网关转发到 admin,admin 远程调用对应接口,接口处理请求。微服务架构虽然好,但是该项目连 C10 K 的问题都不需要考虑,有点杀鸡用牛刀了。

第二天找我朋友排查了一下,结果定位到是数据库出了问题,后面发现测试用户背限制登录了,同时没有赋予用户角色权限。整个排查过程也就五六分钟,解决了我花了老半天没有解决的问题。

后面代码梳理就变得很简单了,nacos、admin、auth、getaway、功能业务代码一个个梳理过去。

Java Web VS Python Web

在没有学习 spring 之前,也有 B 站粉丝给我推荐 spring 框架的好用,说开发效率很高。经过我一番体验之后,spring boot 开发效率确实快, 同时 spring 的生态非常强大,各种解决方案都有现成的。但是 spring 并不适合初学者进行学习,虽然 spring boot 注解很好用,但是 spring 文件配置写起来异常麻烦。

如果从 servlet 开始学,然后是 spring、spring MVC、配置文件、ioc/di、注解、lombok,最终学习并且使用 spring boot。 整个过程经历下来,给我的感觉就是让静态的 Java 增添动态的能力,完整体的 spring boot 给我的感觉与 flask 开发及其相似。

spring bootflask
开发方式xml 配置文件 + 注解(装饰器模式)py 配置文件 + 装饰器
路由系统注解实现路由系统,编写接口类、编写实现类。主要是对类进行注解,然后在方法中实现路由的处理。flask 直接使用装饰器实现路由系统,支持集中式注册或者是分离式注册。Python 想要实现类似 spring boot 的扫描注册,需要使用语言的动态能力。
请求与响应的处理提供很多的注解方法,可以分别处理查询参数、请求体、响应体、请求体之类的信息。flask 主要提供请求体、响应体两个对象,以及 cookie、session 对象
AOP提供 AOP 编程能力,可以特点切面进行处理。flask 提供请求钩子实现 AOP 编程,使用起来更为简洁。
ORM使用 mybatis-plus 提供不错的动态能力,并且预设了很多常用查询,稍加封装就可以使用。flask 一般是采用 sqlalchemy 作为 ORM 工具,配合 migrate 迁移工具,可以非常轻松实现代码与数据表的同步。并且 Python 的动态能力极强,但是想要实现 mybatis-plus 的预设功能,需要稍加封装。但是 Python 的代码简洁、面向对象使用起来更加简洁明了。

spring 整个体验下来,spring 只提供基本的框架、spring MVC 配置繁琐、spring boot 注解开发简单,但是需要较长的学习时间。 而 flask 装饰器开发,感觉与 spring boot 的开发模式十分相似,但是学习门槛、上手门槛低了不止一个档次。

AOP 的使用,感觉二者的能力都很强。不过 flask 常用装饰器打到对应的函数之上,用起来很方便。

ORM 工具,mybatis-plus 使用起来很方便,但是各种配置相较 sqlalchemy 来说要麻烦许多,在做一些封装的时候也要繁琐许多。

整个开发体验来说,我觉得 flask 要强 spring boot 很多。但 spring boot 的类型检测也很好用,尤其是在做 IOC/DI 时,配合 Autowired 自动引入很方便。

spring 已经发展了很多年,有 spring mvc、spring boot、spring cloud 等解决方案,一系列的生态也非常完善。 而 flask 则相当于刚刚诞生的 spring boot,有一个非常好的核心,但是生态参差不齐,如果某天也能诞生类似 spring 的各种解决方案,我觉得是非常值得期待的。

Java VS Python

整个体验下来,虽说 Java 是一门面向对象语言,但是相较 Python 的面向对象能力来说,我更觉得是面向过程。 Python 的动态能力虽强,但是没有静态类型的约束,对于新手来说非常容易出现问题。 所以现在我也能够理解为什么 Python 近些年不断底有新的框架支持 typing 检测了。未来我也会计划学习相关的内容。

如果新手学习,是为了做大型工程化的项目,可以从 Java 开始上手。Java 出现的比较早、设计的严谨,学习的难度会更大一些,在学习支出就会让你记住很多的编程概念。

从 Python 上手,入门及其简单。Python 虽然出现的较早,但是经历了 Python3 的浴火重生,入门是很多概念都变得通俗易懂,很多变成概念都是放在提升的时候让你进行补充。

殊途同归,不管是 Java、Python,还是其他的编程语言,学到最后都是差不多的。唯一的差距就是语法糖、写法不一样,大部分概念都是类似的。

最后

如果想要知道 Java 与 Python 在某一些方面的对比,可以在视频下方留言,我看到了就会回。如果觉得视频对你有帮助,不妨长按点赞进行三连,支持我更快地更新。