C++程序员学习Java初感

看了一个多月的 Java 了,涉及的书籍有:《On Java 8》、《深入理解 Java 虚拟机》、《Java 并发编程的艺术》、《Manning Spring in Action 5-th Edition》以及极客时间上的《Java 并发编程实战》、《设计模式之美》两门课程,同时,也正在看《Effective Java》。

从当前获取的信息来看,真的是体会到什么叫生态,什么叫 Java 的类库特别多,什么叫 Java 程序员只需关注上层业务,也有点了解了很多程序员说的只会 CRUD 的自嘲。

对 Java 并不陌生,刚毕业那么其实学过一段时间,但是没有深入。语法层面和 C++ 很像,学习语法很容易,涉及的概念也都是相通的,如果有 C++ 的经验,转 Java 确实很方便。

JDK 本身提供了很多类库,这极大方便了开发工作。对于并发编程,有各种线程安全的队列、各种线程池、各种锁、系统无关的各种同步机制。当然,这些通过 C++ 也能实现,但是,在 C++11 之前,运行时库并没有提供这些。譬如锁,你得自己根据不同的平台进行封装:你得了解 Windows 平台的同步机制,也得了解 Linux 平台的同步机制,这样才能封装出跨平台的锁。没有一定的经验,确实干不了这个活。

在 C++11 之前,如果想提高开发效率,对于很多通用功能,比较好的方式是用开源库,Boost 是其中的佼佼者(C++11 标准的功能备选池)。但是,你把 Boost 引入自己的工程,没个半天一天,还真不一定能搞的定。以 Windows 平台而言,你得根据你的编译器版本编译不同的库(静态库、动态库)以及对应的版本(MT、MD、MTd、MDd),同时需要把相关头文件引入自己的工程。编译这块,可能就会出不少问题,更不论让不少对 Visual Studio 工程配置不熟悉的人配置工程了。引入 Boost 可能就极大了挫败了自信心了,在使用的时候,也不一定能很好的使用。

反观 Java,由于 JDK 提供了上述功能,你只需 import 相应包就可以了,剩下的就是使用了,遇到问题,网络上搜索也是一收一大把。这一点上,相比于 C++,Java 程序员节省了大量的时间和精力,能把更多精力放在业务上。

最让我大开眼界的是 Spring,一个神奇的生态。通过简单的导入相关包、加上相应的 Annotation,即可实现很复杂的功能。譬如和数据库的交互、 Web 开发、消息队列、鉴权、过滤器、网关、配置中心、注册中心、服务发现、限流、熔断、健康检查、服务监测等等。我之前真的不知道,原来那么复杂的功能,可以通过引入这么简单的依赖即可实现,真的是让人匪夷所思。简单添加几行依赖,即可把底层的框架搭建好,只需要加上自己的业务代码,这更一步加深了我对 Java 开发效率高的理解。因为他们不用花很多时间解决配置问题,也不需在引入成熟框架时要用九牛二虎之力。成熟的框架,把能做的都做了,使用者只需关注如何处理自己的业务。而自己的业务融入到框架中,一般都很容易,并不会花费多少时间和精力(这可能是我的片面之词)。

对于 Web 开发,Spring 也提供了简单易用的框架。通过简单的Annotation即可把URI和业务代码关联起来。我不了解 Web 开发这部分的情况,也不清楚主要的框架,写到这里,我特意没有去查。只是为了说明一个问题,Spring 提供的功能真的是太傻瓜了,如果没有主动探索的心,Java 开发者真的太容易陷入框架中了,也只会用框架了。

如果用 C++ 开发 Web 后端,那么首先得处理网络通信这部分。网络通信涉及到套接字收发机制,涉及到不同平台的网络编程:Windows 下的 IOCP、Linux 下的 select、poll、epoll、kqueue 等;收到数据后,还得对 HTTP 报文进行拼包,以形成完整的报文,然后才能回调给上层。上层根据收到的报文,进行解析,根据不同的 URI,调用不同的处理函数。完整的流程走下来,涉及的东西真的是太多了,没有相应的水平,真的 Hold 不住。从这点看,Java 的开发效率,吊打 C++,一点都不为过。

使用 C++ 的这几年,总是会以较底层的方式去看待问题。譬如对于 HTTP 请求,会用上面的思路去想整个流程的具体实现,会学习 TCP 的相关知识,也会好奇 HTTP 协议是如何将一个个分片的报文组装成完整的报文的。毕竟,HTTP 作为上层协议,并没有很显示的告知如何组包。但是组包过程肯定少不了,因此会去查询 HTTP 协议的组包原理及实现,也买了《HTTP 权威指南》作为深入学习的资料。

对于开头说的线程安全的各种队列、线程池、消息队列以及锁等,对于C++ 而言,多是自己实现,这很锻炼能力。虽然开发效率上比不上 JDK,但是对于练内功却是很有帮助。有 C++ 的基础,在学习 Java 时,这部分的内容学的很快。很多东西都是相通的,譬如 Java 中的流式编程,和 C++ 中的模板元编程很像。这是好的编程思想,在不同的语言中的体现。

对于分布式架构,由于业务的关系,使用 C++ 的我,并没有机会接触。经常听到各种文章谈分布式,有些人张口闭口分布式,好像不懂分布式就很 Low 一样。在极客时间的课程《左耳听风》中,对于分布式的各种概念有了基本的认知,在《RPC 实战和核心原理》这门课中,对于一些概念又有了更多的理解。在学习 Spring 时,有了具体实践这些内容的方式,理论有了实践的验证。这些知识对我的冲击不可谓不大,这就像在黑暗中行进,突然推开了一道门,然后被耀眼的光刺的睁不开眼。这种感觉就像是发现了一个新大陆,看到了一篇全新的天地。

我这里不是说 C++ 不好、Java 好。每种语言都有其使用场景,都有其优势也有缺点。譬如 C++ 的运行高效率,Java 的开发高效率;C++ 让程序员基本功更扎实,Java 让程序员关注业务等等。我前面说的 Java 对我的震惊,其实 C++ 也都能实现,只不过是没看到好的开源库罢了。

以前,真的是很狭隘,把自己限制在 C++ 的刀耕火种阶段。C++11 中的新特性,工作中很少用到,虽然学过,自己写一些程序时也会用,但是由于不常用,慢慢的也就生疏了。当睁眼看世界,了解其他语言时,发现之前没有机会接触的东西,突然都能接触了,虽然当前也只是皮毛,但至少让我认识到,编程领域的丰富多彩。

我们都知道,闭关锁国没出路,睁眼看世界才能强大。对于个人,这也同样有效,保持一颗开放的心,接触新事物,不断充实自己。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章