越来越“简单”的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 ...
随机推荐
- Cannot convert value of type [java.lang.String] to required type [javax.sql.DataSource] for property 'dataSource': no matching editors or conversion strategy found
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFa ...
- centos误删mysql root用户找回办法
一天,我进入mysql后,查看所有用户 select host,user from mysql.user; 发现好多用户名, 太乱了,删除..... delete from user where us ...
- oracle 12c多租户下的日常操作变化
Oracle 12c创建用户时出现“ORA-65096: invalid common user or role name”的错误 在oracle中,引入了多租户概念,以前是一个instance对应一 ...
- Java版 家政服务 社区服务 家装服务平台 源码 有案例 可定制
产品说明: 家装服务平台.社区服务平台.服务类型的平台--公司成熟产品 包括工匠注册.资质认证.发布服务产品.会员注册.预约服务.工匠定价.执行服务.服务完毕填写工作日志上传现场照片.会员确认服务.返 ...
- ldap集成nginx
nginx版本:1.10.2 nginx安装: wget http://nginx.org/download/nginx-1.10.2.tar.gz tar zxvf nginx-1.10.2.tar ...
- 如何将你的github仓库部署到github pages(转)
原文地址:http://www.cnblogs.com/yuanzm/p/3945814.html#commentform 很多时候我都在思考一个问题,我们每天遇到各种各样的问题,然后我们需要不断go ...
- Overture 5入门之如何设置延音线
延音线作为五线谱标记符合之一,是大家使用Overture时需要常用的一个基本标记符号.延音线是一条向上或向下弯曲的弧线,它的作用是将两个或两个以上的具有相同高音的音符来进行相连. 延音线作为再编曲演唱 ...
- 【Python55--爬虫:代理】
一.反爬虫之隐藏 1.网站检查访问的是正常用户还是程序,关键在于User-Agent 1).第一种方法:采用header --修改header(两种方法): --> 在Request之前通过h ...
- 网络 --- 1 c/s (b/s)架构 ip 初始socket
一.c/s b/s c/s架构:客户端(client)/服务器(server) 软件cs架构:微信,陌陌,qq等 硬件cs架构:打印机 b/s架构:浏览器(browser)/服务器(server) ...
- extjs的使用笔记2
系统的大部分资源(安装程序的除bin, lib, conf等之外的东西)都是放在 /usr/share/目录中的 在用户自己定义的, 一些关于系统资源的东西, 则放在目录 ~/.local/share ...