48

我厌倦了不得不每隔一天学习另一个 Java Web 框架。
JSP、Struts、Wicket、JSF、JBoss Seam、Spring MVC 等等——所有这些无数的框架都试图解决同样的问题。然而,它们都没有真正解决根本问题——这就是为什么总是会出现越来越多的新问题。

大多数在第一印象中看起来非常明亮和闪亮,因为它们简化了简单的事情。
但是,一旦涉及到现实世界用例的实施,就会遇到问题。
框架通常不提供任何帮助,而是通过强制根据框架自己的逻辑和环境来实现事物来阻碍和限制选项。

简而言之,我在使用框架时看到了以下缺点:

  1. 大多数情况下学习曲线很陡峭,您首先需要了解有时相当学术的概念,并知道一堆配置文件的含义和位置,然后才能开始。
  2. 文档通常或多或少很糟糕,要么缺少可公开访问的在线参考,要么已经过时,要么混淆了不同的不兼容版本,要么将所有这些混为一谈,而且通常没有提供任何有用的示例。
  3. 该框架由数以万计的类组成,这使得仅通过浏览源代码几乎不可能理解其预期用途。
  4. 因此,您需要购买一些“XYZ in action for dummy in 21 days”之类的书籍,它们的用户界面很糟糕,因为它们缺少全文搜索并且携带很重。
  5. 要真正使用其中一个框架,您需要牢记如何按照框架要求的方式完成工作,方法是记住足够的类和方法名称,直到您的脑海中充满愚蠢和无用的信息,您无法将其用于其他任何事情.
  6. 开销很大,会减慢应用程序的性能,并在尝试了解真正发生的事情时让您的大脑感到麻木。
  7. 在现实世界中,由于工作效率的压力,通常没有时间熟悉新事物。由于这种边做边学的方法,人们总是只寻找完成下一项任务的最快方法,而不是真正了解新工具及其可能性。
  8. 在我看来,遵循标准将使刚接触项目的人能够快速开始的论点是无效的,因为即使在同一家公司内,每个项目都使用不同的框架(至少在我的情况下)。

在我看来,阿尔伯特爱因斯坦的以下引用非常适合这里:

“我们无法通过使用我们在创建问题时使用的相同思维来解决问题。”

回到我过去的 PHP 编码时代,那时编码仍然很有趣且富有成效,我曾经为大多数事情编写自己的框架,然后只是复制粘贴并将它们从一个项目应用到下一个项目。
这种方法效果很好,导致快速开发,完全没有开销,而且框架实际上比大多数 Java 框架更强大,但单个文件中只有几百行代码加上一些简单的 mod_rewrite 规则。
这当然不能解决 Web 开发的所有问题,但它简单、快速且直截了当。
虽然完美地适应了当前项目的要求,但它也易于扩展,并且由于零开销而具有非常高的性能。

那么,为什么使用这个框架会遇到这么多麻烦,为什么不把它们全部扔掉并回到根源呢?
当我们明天再次开始下一个带有新框架的项目时,我应该对我的老板说什么?
还是有可能真正有所作为的框架?
还是我忽略的一些隐藏优势?

4

12 回答 12

35

回到我过去的 PHP 编码时代,那时编码仍然很有趣且富有成效,我曾经为大多数事情编写自己的框架,然后只是复制粘贴并将它们从一个项目应用到下一个项目。这种方法效果很好,可以实现快速开发,完全没有开销,而且框架实际上比大多数 Java 框架更强大

原谅我一秒钟都不相信。

但在一个文件中只有几百行代码加上一些简单的 mod_rewrite 规则。这当然不能解决 Web 开发的所有问题,但它简单、快速且直截了当。

所以基本上你在几个月或几年的时间里开发了自己的框架,根据你自己的需求量身定制,并且可以很快地使用它,因为你非常了解它。

然而你无法理解为什么其他人也这样做,然后试图将结果变成每个人都可以使用的东西?

你开发的这个伟大的框架在哪里?如果它如此强大且易于使用,那么使用它开发的专用社区、成千上万的用户和数百个网站在哪里?

即使在同一家公司内,每个项目都使用不同的框架(至少在我的情况下)

嗯,这就是你的问题。为什么你会在每个项目之后丢弃从每个框架获得的专业知识?

我们的想法是选择一个框架并在多个项目中坚持使用它,以便您精通它。您必须花一些时间来学习该框架,然后通过允许您在更高级别上工作来节省您的时间。

于 2009-04-23T11:18:51.340 回答
20

提出自己的框架的问题在于,您将犯所有已建立的框架已经偶然发现并解决的所有相同错误。在安全方面尤其如此。

只需询问 Jeff 和他们在堆栈溢出中实施 WMD 时必须考虑的事项。我宁愿使用他们在项目中产生的东西,也不愿从头开始实施。这只是一个例子。

于 2009-04-23T11:23:32.263 回答
12

这是Kev的引言,您最有争议的编程观点是什么?非常适合这里:

我认为整个“企业”框架都是雾里看花。J2EE、.NET、大多数 Apache 框架和管理此类事物的大多数抽象都产生了远比它们解决的复杂性。

采用任何常规的 Java 或 .NET OMR,或任何所谓的现代 MVC 框架,它们都可以“神奇”地解决繁琐、简单的任务。您最终会编写大量难以验证和快速编写的难看的 XML 样板。您拥有大量 API,其中一半只是为了集成其他 API 的工作、无法回收的接口以及仅用于克服 Java 和 C# 的不灵活的抽象类。我们根本不需要大部分。

所有不同的应用程序服务器都有自己的描述符语法,过于复杂的数据库和群件产品呢?

重点不是复杂性==坏,而是不必要的复杂性==坏。我曾在大型企业安装中工作过,其中一些是必要的,但即使在大多数情况下,解决大多数用例也只需要一些本地脚本和一个简单的 Web 前端。

我会尝试用简单的 Web 框架、开源数据库和琐碎的编程结构来替换所有这些企业级应用程序。

于 2009-04-24T09:17:16.103 回答
11

问题当然不仅仅在于 Java 框架。我已经数不清有多少 C++ MFC 项目陷入困境,试图将他们的要求硬塞到文档/视图模型中(这实际上只适用于文本和图形编辑器 - 数据库应用程序特别难以硬塞) .

成功使用框架的秘诀是改变你的应用程序以匹配框架,而不是相反。如果你不能做到这一点,甚至不要考虑使用框架——它最终会比你在一些好的、可靠的和有据可查的实用程序库的帮助下从头开始编写应用程序更多的工作。

于 2009-04-23T11:24:28.113 回答
9

所以你是说我们每次想要构建一个 Web 应用程序时都应该处理套接字和 HTTP!

servlet 容器本身可以被认为是一个框架,因为它处理所有这些混乱的细节,并让您编写更简单的 Servlets/Filters/Listeners(即:特定于您的应用程序的框架的“扩展”)。

任何框架都试图做的就是将平凡的、可重复的、容易出错的、跑腿的代码与有趣的特定于应用程序的代码分开。

但是,对于小型应用程序,您可以简单地使用仅使用 JSP 和 Servlet 的Model 2 MVC方法。

例子:

class MyController extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ... {
        MyBean model = // do something
        request.setAttribute("model", model);
        request.getRequestDispatcher("/view.jsp").forward(request, response);
    }
}

然后随着您的应用程序变得更加复杂,您可以考虑使用 Spring MVC 来提供控制器、视图解析器等的更松散耦合(因此更灵活)。

于 2009-04-23T12:18:15.253 回答
7

当遇到另一个不能解决问题的框架时,我和你一样痛苦。

在经历了十年的 jsp、struts、EJB、EJB2、struts2、jsf 以及最近所有新的 Web 服务框架、xslt 的恐怖和 wsdl-first 的噩梦之后,我绝对受够了。

框架存在许多问题。它们泄漏了,所以你必须学习更多——而不是更少,内部框架有巨大的成本,使用外部框架的成本也很高(但要少得多),因为它们很少交付,然后你最终编写了大量的 xml 配置并花费数天时间进行纠正您在最喜欢的内容帮助代码编辑器中立即看到的大小写和拼写错误。

也许答案是找到不那么浮夸的工具包,试图解决问题但不重新定义世界,但这也很难,因为基本的应用程序模型(html over http)很尴尬 - 充其量是。

再加上周围似乎有很多复杂因素,人们似乎痴迷于将无聊的简单问题转换为复杂(但很难)有趣的问题(可能是上面提到的 Eric Sink 的软件开发公理的变体。)

加上开发人员的狂妄自大,他们知道这一切,并毫不犹豫地编写一个新框架来为您解决所有难题,只是他们做不到,剩下 10%,只是现在更难修复。

我没有 .NET 经验,但 .NET 世界似乎不太挤满理论家和复杂化者,也许 VB 挥之不去的臭味吓跑了他们,但每次我听到有人告诉我他们已经在他们的 maven 上花费了 1500小时config(你好?),我正在认真考虑从我的简历中删除“java”。

……又是什么问题?是否有任何框架有所作为?

编辑 - 添加了 Stripes 和 QueryDSL。

我会尝试使用带有 QueryDSL + Hibernate 或 OpenJPA(带有注释)的 Stripes 或 GWT,只是因为您实际上是用 Java 开发的,并尝试限制使用 wsdl-first web 服务、以 xml 为中心的框架、EJB 和 ESB(不是啤酒)尽可能。

于 2009-04-23T14:24:25.807 回答
3

我曾经做过一个项目,试图在 JSF 中实现它。这是一场噩梦。

大部分工作时间都花在了编译上。不少于一半的编译内容不起作用的事实是另一回事。几乎没有教程。文档基本上是一个没有人工注释的自动源代码导出。怎么能指望这样工作呢?

在我们见过的几个框架中,只有 Sun 能够创建一个完全可编译的新项目!另一个只能生产一堆需要很多天才能进入可编译状态的东西。

网络几乎是静悄悄的。对于任何搜索我们不超过 20 页的搜索结果,有用的前 1-3。在发现的相关内容中,一半的人在呼救,另一半声称他们在呼救,没有人来,他们失去了时间和兴趣,放弃了这项技术。

所以我们花了很多时间,只做了一些简单的事情,比如用 ASP.NET 可以在几周内完成。

然后我们查看了替代的 JSF 框架。令我们惊讶的是,我们发现它们都非常不相容。

毫不奇怪,我们也加入了放弃 JSF 的行列。

于 2009-04-23T11:33:30.650 回答
3

考虑反点。我现在在一家不使用任何超出 JSP 标准的框架的商店工作。每个人都有不同的做事方式,我们对解耦等概念和验证等安全问题非常松懈。

虽然我不认为使用框架会自动使您成为更好的编码员,但我确实认为通过使用大多数框架实现的标准设计模式并轻松访问验证等实用功能,我认为您很有可能成为被迫编码达到一定的标准。

在 Web 应用程序设计中,您并非每次都在发明轮子,因此您最终要么为常见任务推出自己的解决方案,要么使用框架。我假设通过使用常用框架而不是自行开发,您将获得经过良好测试且灵活的底层代码。

将自己的解决方案作为一种学术追求并没有错,但我承认有些人会花更多的时间在一个强大的解决方案上,然后我可能会花更多的时间。以 log4j 为例,很容易滚动您的记录器,但是 log4j 经过良好的测试和维护,他们花时间将灵活性和性能提高到大多数滚动您自己的记录器无法触及的程度。最终结果是一个健壮但足够简单的框架,即使在最基本的应用程序中也可以使用。

于 2009-04-23T15:47:18.547 回答
2

对我有用的是:你不应该只学习你听说过的任何 Web 框架,看看它,看看它是否能让你轻松编写代码,在 stackoverflow 或论坛上询问它的优缺点,然后学习它并学习它很好,坚持下去,直到你觉得它坏了或完全过时了。你写的任何网络框架本身都很好,如果你“真的”知道它的作用,那么使用它会很有趣。如果你不这样做,你只是在没有指南针的沙漠中徘徊!我还发现 21 天书是您不掌握框架或技术的可靠方法。在采用 af/w 时,Docs 肯定是要考虑的事情,如果您自己查看代码,它也会有所帮助(实际上,当我遇到一些我觉得奇怪的行为时,这对我有最大的帮助。

1-那么为什么使用这个框架会很麻烦,为什么不把它们全部扔掉并回到根源呢?

如果你回到根源,你会一次又一次地重写做同样事情的代码 + 这些 f/ws 中的大多数都是开源的,这意味着它们在维护方面可能比你单独对自己的 f/w 做的更好。

2-明天我们又要开始下一个带有新框架的项目时,我应该对我的老板说什么?

这是我第一次使用这个 f/w 我不明白为什么要使用这个 f/w 我已经知道 X 并且我真的很擅长它。记住我学习这个 f/w 的成本,由于我对这种 f/w 的无知而必须完成的返工成本。我认为我们最好使用 X,如果这是一个特定的要求,我们应该争取它,并且只有在我们真的必须说明以前的注释时才这样做。

还是有可能真正有所作为的框架?

只有那些以您的思维方式而不是您编写代码的方式来解决问题的人(想想在其黄金时代执行 MVC 模式的 struts)。

还是我忽略的一些隐藏优势?

想不出任何tbh。

于 2009-04-23T11:15:27.527 回答
1

你在 PHP 中也有同样的问题:框架比你指望的要多,每个都是最好的和最伟大的(尽管你有一些提示:纯 PHP5 设计与 PHP4 兼容性,Rails 哲学(不灵活的文件夹层次结构,自动生成代码)与库方法...)并且您花费更多时间搜索和探索可能性而不是编写代码!
但在 PHP 中,它允许预先解决常见问题,如 I18N 支持、插件集成、会话和身份验证管理、数据库抽象、模板、Ajax 支持等。避免在每个项目上重新发明轮子,避免失败新手常见的陷阱。

当然,Java 框架也有一些提示:大还是小?有据可查吗?广泛使用还是保密?是否适合 XML 粉丝?等等
。我想大多数框架都针对大型项目,学习时间不是一个大问题,可扩展性和易于部署很重要,等等。它们对于小型项目来说可能是矫枉过正的。

在此类框架中还有一种趋势,即旨在做一组一致的松散耦合库,而不是一个单一的框架。在 PHP 世界中,Zend 框架就是这种情况(有些人甚至否认使用“框架”一词......)。
因此,它解决了“解决常见问题”的问题,而不会妨碍您。

于 2009-04-23T11:18:25.787 回答
0

然而,我不同意你提到的一些观点,但我同意你关于无聊工作的看法。

是的,所有 Web 应用程序都是关于页面显示表单、收集数据、进行验证、发送数据以存储在数据库中、通过搜索表单过滤存储的数据并在表格中显示结果并选择一个或多个记录进行操作(CRUD 或所有关于更改数据库状态的业务操作)。

但是我只工作了 4 年,当然还有我 4 年的学术研究。我觉得这种类型的开发很无聊,因为你没有发明算法,当然当你发现新框架时你会很开心,如果你将其中一个 AI 引擎集成到你的应用程序中会更开心,但最后我觉得这项工作是虚拟工作,或者说机器工作,所以为什么我们不自动化所有这些东西。

是的另一个框架;) MDA 模型驱动架构,简而言之,是关于从 PIM(平台独立模型)到 PSM(平台特定模型)的转换,例如从 UML 到代码。

这可能会解决您的学习曲线和技术变化问题,因为您只需要擅长建模,因为有一些框架可以实现 MDA 规范,例如AndroMDA,因为它具有采用类图、用例、序列的墨盒图表和活动图表并生成数据库创建脚本、POJO、休眠映射、Spring/EJB、JSF/Struts、.NET 代码。

当然,这样的框架不会生成 100% 的代码,但会生成很大比例的代码,当然你会问这个框架将在哪里解决复杂和棘手的需求场景?今天我会说不,明天是。

那么为什么你和我不投资开发这个伟大的框架。

于 2009-04-23T11:22:23.953 回答
0

所以你认为如果我们在每个项目中都发明轮子会更好吗?

您可能会将过多的框架视为一个问题,这确实使选择自己的框架变得更加困难。但另一方面,您不必逐个尝试;即使你这样做了,你最终也会更喜欢其中的一些。您将拥有一个最喜欢的 ORM 框架,另一个用于 Web 开发、IoC 等。

在一些论坛上阅读以了解哪些是最受欢迎的确实有帮助;它们之所以受欢迎,一定是有原因的,即使这不是正确的原因(比如技术出类拔萃,也许它只是在经理中流行,因为流行语超载等等),了解上述框架会很有帮助,因为你将能够参与多个使用它的项目。

另外,使用框架而不是编写自己的框架将为您节省很多问题。作者并不总是发现并解决错误;这通常由框架的用户完成。您说您最终在 PHP 中拥有了自己的私有框架;我敢打赌它不是没有错误的,但也许你不知道它,因为你是唯一的用户和唯一的编码器。

于 2009-04-23T14:53:38.063 回答