越来越“简单”的Java
Java,20岁了。从我写下第一行Java代码,迄今已有十余年了,眼见Java——这个当年刚刚找到自己成长方向的懵懂少年,成长为如今当之无愧的业界王者。它已拥有世界上最庞大的开发者社区,以及无可匹敌的生态系统。这也意味着,选用Java做任何应用,都有着强有力的业界支撑,而无需担心自己孤独前行。
崩坍的“标准”
我刚成为Java程序员时,还是一个蛮荒年代,什么东西都鼓励自己动手丰衣足食,虽然开源的苗头已有星火,但大多数企业的态度是,非我族类,其心必异。我依然记得自己的第一个正式Java程序是实现一个SMTP服务器。
我从SocketAPI一路写了上来,先是实现了粗略的SMTP协议,然后,再实现我们的应用协议。虽然这种做法对于个人从下到上理解知识体系是有好处的,但每个人都从头造轮子,对于工程开发而言,只是在浪费时间。
那也是Java企业级开发大行其道的年代。背靠着Sun这棵大树生长起来,这几乎也意味着最初的Java就是Sun销售服务器的附赠品。而有能力为这些服务器买单的几乎都是些不差钱的大企业。Sun也瞅准了这些金主,大力地推动着“复杂”的企业级标准,著名的J2EE。在那个年代,写Java程序不写EJB,不谈几句分布式事务,你都不好意思说自己是做Java程序的。几乎主流的声音都在大谈企业开发的复杂度,不断拓展着想象的边界,似乎每个Java程序员面对的都是世界上最复杂的问题。即便应用只是一个简单的管理系统,或是仅仅做消息转发,我们需要的也一定是一个价格昂贵的应用服务器,编写只有部署到上面才能运行的EJB,因为这是官方推荐的做法,只有这么做才正宗,只有这么干,才叫企业级。
有一次出差在外,临近下班,我发现了程序的一个Bug。实际上,我们的程序就是一个按照官方推荐做法编写的EJB,只有部署到应用服务器才能运行。我的调试方案就是加上一些打印语句,然后部署到应用服务器上,看输出的结果,再加上另外一些语句,再部署,如此往复。那时我们用的是Sun的应用服务器,只有用它的发布工具将应用打包,然后把几百兆的程序上传到服务器上,每一次上传都要至少十几分钟。最终,我定位到了问题,只修改了一行代码,问题解决,但时间已经晚上九点多,三个多小时的时间多半都在等待部署中浪费。
我不认为我所喜欢的软件开发应该是无意义的消耗,一定是哪里出了错。周边的人给不了我答案,我只有到网上搜寻,于是,我知道了敏捷、知道了开源、知道了软件设计,也知道了世界上有一堆Java程序员对官方说法的不满。那段时间,我疯狂补习着各种各样的软件开发知识,我越发觉得“简单”开发才应该是软件开发的本来面目。
那段时间恰逢软件开发理念变革的年代,SpringFramework、Hibernate等如今还在影响Java程序员的框架刚刚发轫,企业级开发“WithoutEJB”理念初出茅庐。倍受J2EE开发模式折磨的程序员大量地讨论着各种方法的优劣。那时,我也开始带队做项目,于是,我便笨拙地践行着这些新理念。我用的第一个SpringFramework的版本是0.8,我开始用设计去隔离数据库访问,尝试把EJB踢出我的项目,努力在本地完成所有的开发测试,尽量少用应用服务器。如今想来,还真要感谢我当年的项目经理,那么信任我,让我放手折腾。
幸运的是,没过多长时间,大多数Java程序员跟上了先行者的步伐,于是,我们看到更多的人拥抱开源理念,探索敏捷,SSH(Spring、Struts和Hibernate)成了业界的主流。所谓官方标准已经失去了公信力,加之像JBoss、Tomcat这样的开源服务器的兴起,那些靠卖应用服务器当年大赚的厂商开始凋零,拥有WebLogic的BEA早早投靠了Oracle,IBM的WebSphere已成明日黄花,最可惜的是最官方的Sun,生了Java,却挣不到Java的钱,现在也成了Oracle的一部分。
“简单”的前行
一段大戏尘埃落定,历史车轮却不曾停下。今天的Java之所以是今天的模样,因为更多的新思潮仍在不断冲击。
随着互联网的兴起,Web开发成了业界开发的主流。原本Java程序员的日子是相当不错的,开发标准的逐渐建立,各种开发框架也日渐完善,各种工具也逐渐丰富。但这时候,一个Rails的框架横空出世,所有人都见识了如何在十五分钟内编写一个Blog。而十五分钟都不够Java程序员写好XML配置文件。新思潮的到来,让Java程序员开始重新认识Java开发。我们确实已经从J2EE的笨重走了出来。但有了新的对比目标,Java开发依然是前路漫漫。Java程序员们继续不断努力探索,研究如何用好Java5带给我们的语法转变,研究怎样用Java实现一些动态语言的效果,研究提升Java程序的表达性。今天,我们有了更多的选择,甚至在很多方面已经彻底与XML说再见了。选择一个程序库,功能的实现只是其中一部分原因,而表达性也成了重要的参考因素。
当开发Web的人越来越多,有人突然站出来说,你们做得不对,这个人就是HTTP协议的设计者之一RoyFielding。后来的事,我们都知道了,RESTful架构开始兴起。与之相随的是,当年那个叫Ajax的技术被越来越多的人实现网页的动态效果。人们发现,Ajax和RESTful服务简直是天作之合。后台提供服务,前台提供展现,一个新兴职业随之兴起,它叫前端程序员。对那些Java程序员来说,这也是美事一桩,我们再也不必用Freemarker、Velocity或是JSP编写那些四不像的HTML了,大家都可以集中精力做好自己最擅长的事情了。这种结合的另外一个妙处是,开发人员越来越多地使用JSON作为前后端通信协议的承载,而被抛在历史故纸堆的方式叫做WebService,又是一个大公司推进的以XML做基础的东西。要知道发送Ajax请求的基础对象可是叫做“XMLHttpRequest”,影响之大可见一斑。
多核的兴起让程序员们纷纷探索起怎么编写并行代码,研究来研究去,大家发现许多好的编程理念都来自一个叫函数式编程的编程范式。这个曾被务实的程序员束之高阁的东西又被人重拾起来。越研究,就越觉得函数式编程是个好东西,可惜Java没有提供函数式编程的原生支持。于是,人们一边喊着在Java语言里添加支持,一边自己动手模拟函数式编程,借鉴函数式编程理念。这两件事后来都有了结果,我们今天有了Java8的Lambda,对于使用之前版本的Java的人来说,Guava也可以让人部分享受函数式编程的乐趣。虽然不是完整的函数式编程支持,但对于大多数习惯使用传统Java的人来说,这些支持已经可以让Java比从前优雅一些了。
当年采访C++之父BjarneStroustrup,如何看待Java的简洁,他的回答是,时间不够长。大师之见果然长远。与我初涉Java时相比,今天的Java可以说已经有了天翻地覆的变化,而且,我相信,这样的变化还将继续下去,Java8的威力尚未完全发挥,Java9已经在路上了。令人欣慰的是,这种变化是让开发越来越简单,Java程序员的生活越来越轻松。
作者简介:郑晔十多年工作经验的程序员,Duke选择奖获奖作品Moco的创始人,前ThoughtWorks首席咨询师,创业大潮新鲜人,目前投身于智能硬件领域,致力于简化智能硬件的开发方式。他多次在各种媒体上发表文章,在各种技术大会上做过演讲,分享自己对于软件开发的理解,特别愿意吸收新的知识,也愿意与人畅聊软件开发。
来源:CSDN
作者:郑晔
直接链接:https://www.linuxidc.com/Linux/2015-07/119563.htm
越来越“简单”的Java的更多相关文章
- 最简单的 Java内存模型 讲解
前言 在网上看了很多文章,也看了好几本书中关于JMM的介绍,我发现JMM确实是Java中比较难以理解的概念.网上很多文章中关于JMM的介绍要么是照搬了一些书上的内容,要么就干脆介绍的就是错的.本文试着 ...
- java基础学习02(简单的java程序)
简单的java程序 一.完成的目标 1. 理解java程序的基本组成 2. 如何对程序代码进行注释 3. java标识符的命名规则 4. 了解java中的关键字 5. 使用java定义变量或声明变量 ...
- Linux环境下部署完JDK后运行一个简单的Java程序
前言 前一篇文章详细讲解了如何在Windows环境下安装虚拟机+Linux系统,并且成功部署了JDK. 不过部署完JDK之后,我们判断部署是否成功的依据是看"java -version&qu ...
- 一个简单的Java web服务器实现
前言 一个简单的Java web服务器实现,比较简单,基于java.net.Socket和java.net.ServerSocket实现: 程序执行步骤 创建一个ServerSocket对象: 调用S ...
- 三、使用Maven构建简单的java项目
前边,我刚搭建了Maven环境,还有给大家推荐了学习资源,这个小节,我们来就来,,简单的玩玩maven. 1.所需工具: 1.Eclipse 2.apache-maven-3.3.9 3. ...
- JNI_最简单的Java调用C/C++代码
JNI_最简单的Java调用C/C++代码 JNI.是Java Native Interface的简称,中文是"Java本地调用".通过这种技术能够做到下面两点: Java程序中的 ...
- 最简单的Java框架
框架framework的目的是定义骨架式方案,处理各种相同的底层细节:而开发人员使用框架时,能够依照自己的需求实现自己的功能--仅仅须要填入自己的东西/flesh. 最简单的框架,类似于JUnit,它 ...
- 简单的java Hadoop MapReduce程序(计算平均成绩)从打包到提交及运行
[TOC] 简单的java Hadoop MapReduce程序(计算平均成绩)从打包到提交及运行 程序源码 import java.io.IOException; import java.util. ...
- Java学习笔记 11/15:一个简单的JAVA例子
首先来看一个简单的 Java 程序. 来看下面这个程序,试试看是否看得出它是在做哪些事情! 范例:TestJava.java // TestJava.java,java 的简单范例 public ...
随机推荐
- 怎样从外网访问内网Django?
本地安装了一个Django,只能在局域网内访问,怎样从外网也能访问到本地的Django呢?本文将介绍具体的实现步骤. 准备工作 安装并启动Django 默认安装的Django端口是8000. 实现步骤 ...
- java内存泄漏与内存溢出
https://www.cnblogs.com/panxuejun/p/5883044.html 内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out o ...
- Hbuilder安装
---恢复内容开始--- ---恢复内容结束---
- linux下启动多个php,分别监听不同的端口。
在工作中,我们可能会遇到,服务器集群的搭建. 这个时候,我们不可能,每一台服务器都是lnmp的环境,我们会把nmp分别放在不同的服务器上,不同的服务器负责不同的功能.比如我们下面要说的php 加入ng ...
- Jira客户端
github地址 https://github.com/rcarz/jira-client 使用 1)私服 <!-- https://mvnrepository.com/artifact/net ...
- Spring Boot 整合Mybatis非starter时,mapper一直无法注入解决
本来呢,直接使用mybatis-spring-boot-starter还是挺好的,但是我们系统比较复杂,有多个数据源,其中一个平台自己的数据源,另外一些是动态配置出来的,两者完全没有关系.所以直接使用 ...
- socket之 select模型
前段时间一直想学习网络编程的select模型,看了<windows网络编程>的介绍,参考了别人的博客. 这里的资料主要来自http://www.cnblogs.com/RascallySn ...
- Codeforces 375C Circling Round Treasures - 最短路 - 射线法 - 位运算
You have a map as a rectangle table. Each cell of the table is either an obstacle, or a treasure wit ...
- Android编译系统中的Android.bp【转】
本文转载自: 转自:http://note.qidong.name/2017/08/android-blueprint/ Android编译系统中的Android.bp.Blueprint与Soong ...
- SCU 4445 Right turn(dfs)题解
思路:离散化之后,直接模拟就行,标记vis开三维 代码: #include<iostream> #include<algorithm> #include<cstdio&g ...