作者:张浩斌
链接:https://www.zhihu.com/question/45552115/answer/99388265
来源:知乎
著作权归作者张浩斌和知乎所有。
 
--------------------------------------------
 
这个问题其实是只可意会不可言传,然而从看到这个邀请,就有跟知友卖弄的冲动。
 
首先,我是从qbasic开始编程,经历了qb到vb,vb到asp(不带.net),asp到jsp,jsp到php,再回头学习j2ee。这个过程可能导致我的观点可能跟主流观点不同,希望各位理解。
 
j2ee并不等于spring struts hibernate,还有各种其他的选择,ssh不是唯一甚至不是最好的选择,这里按下不表。
 
先问一个问题,什么是jsp/servlet不能做,而ssh能做的?没有ssh之前,就没有web应用了么?
 
有人会觉得servlet傻,可是你看看struts的核心入口Dispatcher,不就是一个Servlet么。你觉得jdbc难用,hibernate的功能最后还是用jdbc实现的,而且不少批量处理的情况,还是原生sql好用,以至于hibernate不得不提供原生sql接口,mybatis正是从这里挖走不少用户。
 
在很多情况下,ssh做的,只不过是把java/jsp/servlet/jdbc本来就具有的功能,封装成不一样的API,把原先用Java编写的代码变成用XML编写,然后在用java写的解释器在jvm里面去运行这些XML。所以,我觉得ssh其实就是面向web开发这个领域创造出来的一组DSL(领域特定语言)。而这套语言以XML开始,现在转移到java的注解annotation,慢慢的又回归java语言本身。
 
不太全面的说,struts就是给不熟悉html/css/js的web程序员摆脱它们写业务逻辑用的,hibernate就是给不熟悉SQL的程序员摆脱SQL写数据库程序用的,spring就是给不熟悉java的接口、反射的程序员摆脱接口反射写AOP用的。而上面被代替的这些,恰恰是相关领域的原生DSL,这里面多少有一点讽刺的意味,对么?
 
如果struts的开发者没有在jsp混杂java片段的各种<%="'"+xx.yy()+"'"%>嵌套括号引号海里面摸爬滚打过来,你觉得他们会想到要做struts么?
如果hibernate的开发者没有在SQL的join链中绕晕过,他们会搞hibernate?
如果spring的开发者没有对java反射的异常数量吐过槽,会有spring?
 
如果你只想做一个平庸的码农,去学ssh能让你找到一份不错的入门工作。
如果你希望能深入的理解系统、语言、框架,去学习语言本身提供的功能,去学习servlet、jdbc、java,去看看如何用他们构造通用的复杂的系统,也许未来5-10年,人们再提起j2ee,说的就是你创造的框架的名字,而不再是什么spring struts hibernate。
 
我们总是希望高内聚低耦合,但两者通常是矛盾的;如果你愿意放弃其中的一个,就可以在另一个上面走的更远。(这里写的观点有偏差,正解请看 评论里春雷的说法)
 
为了防止有人跟帖说U can U up.
 
 
 

DSL 或者说是抽象 或者说是沉淀 ,我看到的不错的一篇文章的更多相关文章

  1. 利用抽象、多态实现无反射的绿色环保ORM框架

    最近一直在忙新公司的基础库建设,对系统架构.开发框架及快速开发平台的设计实施都积累了一定的实践经验. 一般的中小型的软件开发公司,如果按照技术储备来衡量软件项目的技术含量的评定依据是可行的.但如果光是 ...

  2. Gradle 教程:第一部分,安装【翻译】

    原文地址:http://rominirani.com/2014/07/28/gradle-tutorial-part-1-installation-setup/ 在这篇教程里,我们将主要讲解如何在我们 ...

  3. Gradle 教程:第一部分,安装【翻译】(转)

    原文地址:http://rominirani.com/2014/07/28/gradle-tutorial-part-1-installation-setup/ 在这篇教程里,我们将主要讲解如何在我们 ...

  4. angularjs springMVC 交互

    AngularJS中的$resource使用与Restful资源交互 1.AngularJS中的 $resource 这个服务可以创建一个资源对象,我们可以用它非常方便地同支持RESTful的服务端数 ...

  5. 黄聪:AngularJS中的$resource使用与Restful资源交互(转)

    原文:http://blog.csdn.net/he90227/article/details/50525836 1.AngularJS中的 $resource 这个服务可以创建一个资源对象,我们可以 ...

  6. 可软件定义的存储逻辑——Efficient and agile storage management in software defined environments

            note:写这个或许算是翻译,又或算是对这个论文[1]的理解,又或者仅仅是我的看法.         这篇论文和IOFlow相比較,更加注重软件定义存储的框架(利用已有的框架来创建新的 ...

  7. Gradle 梳理:安装、入门使用方法

    Gradle 教程:第一部分,安装[翻译]   原文地址:http://rominirani.com/2014/07/28/gradle-tutorial-part-1-installation-se ...

  8. 「译」Graal JIT编译器是如何工作的

    原文Understanding How Graal Works - a Java JIT Compiler Written in Java,讲了jvmci和ideal graph的基本概念以及一些优化 ...

  9. 面向对象编程(C++篇4)——RAII

    目录 1. 概述 2. 详论 2.1. 堆.栈.静态区 2.2. 手动管理资源的弊端 2.3. 间接使用 2.4. 自下而上的抽象 3. 总结 4. 参考 1. 概述 在前面两篇文章<面向对象编 ...

随机推荐

  1. 4412开发板升级4.2之后改了logo开机后屏幕闪解决办法

    荣品4412开发板升级到4.2请注意增加虚拟机内存. 问:荣品4412开发板升级到Android4.2之后,改了logo.4412板子开机后,过一会屏幕就一闪一闪,是什么原因? Android4.2编 ...

  2. 解析txt文本,dom4j工具输出为xml文档

    有如下一个ttl.txt文本文档,每一行用空格隔开的三段分别代表主谓宾, 要将它们输出为xml格式文档 工具:dom4j,jar包导入MyEclipse的Java Project工程 代码如下: pa ...

  3. Bootstrap<基础二十七> 多媒体对象(Media Object)

    Bootstrap 中的多媒体对象(Media Object).这些抽象的对象样式用于创建各种类型的组件(比如:博客评论),我们可以在组件中使用图文混排,图像可以左对齐或者右对齐.媒体对象可以用更少的 ...

  4. 面试复习(C++)之希尔排序

    #include<iostream> using namespace std; void Shellsort(int *a,int len) { int gap; ;gap>;gap ...

  5. 核心动画与UIView的区别

    核心动画与UIView的区别 1.核心动画只作用于layer,使用核心动画之前,必须有layer 2.核心动画只是假象,并没有移动实际位置 什么时候使用核心动画,什么时候使用UIView动画 1.当不 ...

  6. C++小项目:directx11图形程序(六):cameraclass

    cameraclass是一个相机类,它的作用是生成非常重要的观察矩阵.本小节涉及到一点数学知识,相对前面需要只是填充,调用,算是比较有趣的吧. cameraclass.h #pragma once # ...

  7. Tomcat内存优化参数

    set JAVA_OPTS=-Xms512m -Xmx512m -XX:PermSize=128M -XX:MaxNewSize=128m -XX:MaxPermSize=128m 在catalina ...

  8. HDU 2669

    题目大意: 已知线性方程ax+by=1; 输入a, b的值, 要求输出整数解x, y的值(输出x, y的最小整数解), 若没有解, 输出"sorry".   分析: 求线性方程的解 ...

  9. SharePoint Calculated Columns 分类: Sharepoint 2015-07-09 01:49 8人阅读 评论(0) 收藏

    SharePoint Calculated Columns are powerful tools when creating out-of-the-box solutions. With these ...

  10. ReactJS实现的通用分页组件

    大家多少都自己写过各种版本的分页工具条吧,像纯服务版的,纯jsWeb板的,Angular版的,因为这个基础得不能再基础的功能太多地方都会用到,下面我给出以个用ReactJS实现的版本,首先上图看下效果 ...