仅此一点就减轻了开发人员的巨大负担。如果我阐述的不够充分,那请你记住,这些职责的实现工作是很难的,如果每次你想使用的时候都必须这样实现一遍的话,那会让人沮丧和筋疲力尽的。实际上,让我换个说法:要是我必须实现框架的这些职责的话,那一定是令人沮丧和筋疲力尽的。这就是为什么当我在2005年第一次遇到Rails框架时,感觉它是如此的神圣。框架给社区带来的好处清晰的抽象和通信系统允许人们共享模块、插件或任何你想称之为框架扩展的东西,从而创建一个充满活力的可重用组件生态系统。如果你接受我关于操作系统是框架的断言,那么你可以将通过操作系统的通信系统(套接字、文件模型等)进行通信的任何程序视为框架的扩展。比如说,Postgres是一个关系型数据库管理系统(RDBMS)资源的框架扩展。而StatsD是一个监控资源的扩展。同样地,Rails框架使开发人员能够识别专门的资源并扩展框架以方便地支持它们。其中一个最受欢迎和最强大的是Devise,它负责协调Rails资源以引入新的用户认证资源。正如人们倾向于使用Postgres,而不是手动操作自己的数据一样,人们也倾向于使用Devise,而不是手动来管理自己的认证系统。是否有可能为Clojure语言创建一个Devise呢?我不认为有这个可行性。Devise被设计成数据库无关的,但是由于Clojure语言没有一个真正的值得信赖的框架来指定或引入值得信赖的数据库抽象,因此没有人能够以这样一种方式编写与Devise等效的东西,使得它可以很容易地支持任何RDBMS数据库。没有这样的一个框架,就不可能有人能够编写一个你可以重用的功能齐全的认证解决方案;即使你编写了一个,其他人也不太可能看到你共享它的好处。Clojure语言正在和这些生态系统的好处擦肩而过,我认为这对Clojure来说太糟糕了。另一个框架带来的不很明显的好处是,它们为开发人员如何使用你的语言构建应用程序提供了一个连贯的故事,这使你的语言更具吸引力。构建应用程序意味着为目标环境(桌面、移动、SPA等)协调资源。如果你的语言没有针对目标环境的框架,那么学习或使用该语言的风险更大。构建产品有一个更高的障碍:开发人员不仅必须学习语言的语法和范例,他们还必须弄清楚如何使用语言的范例来执行抽象和协调资源的复杂任务。如果你的目标是创建一个大众市场产品,那么选择一种没有目标环境框架的语言是一个危险的选择。最后,框架成为你可以为其创建工具的基层。文件系统的引入使得人们可以编写易于创建和操作文件的工具。Rails框架的抽象使得生成用于创建新的数据库表,以及用于与之交互的整个堆栈(model, view, controller)的代码变得更加轻松。框架使开发变得有乐趣如果你仍然认为框架是多余的或者麻烦大过它们的价值的话,相信我,我理解你。当我从Rails框架切换到Clojure时,我非常喜欢它的“使用库,不用框架”的方式。我感觉使用框架是没有必要的,因为所有的部分都是如此简单,以至于我把它们粘在一起时不费吹灰之力。而且,我觉得解决一个我熟悉的问题对我来说是纯粹的乐趣,因为它帮助我学习了这门语言。好吧,就当我放了一个无聊的千年臭屁吧。因为我现在不再认为这工作有趣了。我想要构建产品,而不是构建用于构建产品的基础架构。我想要一个插件,它可以帮我处理重置密码的过程。我想要一个管理面板,五分钟内我就要它能够工作。框架能够处理那种理想情况下只需要完成一次的工作。我不想每次想做点什么的时候都要一遍又一遍地做同样的工作。对我来说,编程是一项创造性的工作。我喜欢做些傻事,并且把它们摆在人们面前看看会发生什么。Rails框架帮助我构建了像phobiatopia.com(现在已经失效)这样的网站,在那里用户可以分享他们害怕的东西。这个网站会使用用户的IP地址来得到用户的地理坐标,并且使用谷歌地图来显示全球恐惧地图。它显示很多人害怕熊。框架让你专注于构建应用程序的有趣部分。框架可以让你更快地实现一个想法,无论这个想法有多么愚蠢。框架帮助初学者框架可以帮助初学者构建真实的,并且能真正运行的应用程序,他们可以自豪地向朋友们展示这些应用程序,甚至可以用它们来赚钱,而不必完全理解,甚至不需要知道他们使用的所有技术。能够变魔术般地召唤出一个完整的创造物,不管它有多小或者多么粗糙,it is the very breath of wonder and delight。(我不知道这句英文什么意思,但我喜欢它的发音!)有一种看法认为:框架是不好的,因为它们允许初学者构建东西,而不必知道它们是如何工作的。ActiveRecord正在腐蚀年轻人,因为它允许他们构建应用程序,甚至在他们不知道如何正确发音SQL的情况下。也有另一种看法认为:让初学者更容易构建出东西是不对的。人们必须为了学习而努力或经受磨难,否则就不合乎道德。忘掉上面这些愚蠢的,无聊的废话。我认为快乐胜过每一次的痛苦。让你的学习更加快乐,让更多的人从你创造的任何工具或产品中获益。我是个摄影师。我有一台专业相机,我知道怎么用。我的一些照片需要大量的技术知识和专业设备(如下图):上面这张照片不是你能用手机创造出来的东西,不知道为什么,我能享受我自己的技术和艺术创作,但是我也不讨厌“傻瓜”相机的存在,我也不抱怨人们喜欢它们。新手从专家指导中受益匪浅。我不认为你能用手机拍照而成为一名大师级的摄影师,但是有了手机的“指引”,你可以拍一些非常好的照片并为它们感到骄傲。而如果你真想成为一名摄影大师,这种积极的反馈和成就感会激励你坚持下去,学习一些困难的东西,而获得更多的进步。框架通过在“流沙”和“陷阱”周围创建一条安全的路径来提供这一“指引”,来帮助你在创建应用程序时规避这些陷阱。框架帮助初学者,这是它的一个好处,而不是一个Bug。 我的Clojure框架 框架用来管理协调资源的复杂性。看到了吗?“Managing Complexity”(管理复杂性)是Clojure英文全称Clojure Managing Complexity McCarthy-Lisp的中间部分。就我个人而言,我想要一个单页应用程序(SPA)框架,Clojure语言的设计和理念有很多方面,让我认为创建一个真正了不起的框架是非常可能的。下面我只举几个例子。首先,考虑一下像sed和awk这样的Linux工具如何实现文本导向的。开发人员可以通过将文本格式化为JSON或YAML向文本添加附加结构,而这些文本处理工具仍然可以处理结构化的文本。同样,Clojure语言强调简单数据结构,这意味着我们可以创建专门的结构来表示表单和Ajax请求,以及处理这些结构的工具。但是,如果我们用地图和向量来定义这些结构,我们仍然可以使用一个庞大的功能生态系统来处理那些简单的结构。换句话说,创建专门的结构并不妨碍我们使用为更简单的结构而构建的工具,对于许多其他语言来说,情况并非如此。第二,Clojure语言基于协议(protocol)和多方法(multimethod)的抽象机制非常灵活,这让我们在新资源可用时能够方便地实现它们的抽象。第三,你可以在前端和后端使用相同的语言!!!!不仅如此,Transit还允许两者轻松地通信。这就消除了其他语言框架必须解决的一整类的协调问题。在我看来,Clojure粉丝们认为框架的麻烦超过它的价值的立场完全是一种倒退:Clojure语言给我们打好了创建一个真正了不起的框架的基础!它就是那么简单易行。这不是做梦,这是事实!我的目标是建立一个SPA框架,帮助目前和未来的Clojure开发人员,使我们的想法能够快速地投入生产。我希望我们能够花更多的时间在困难的事情上和有趣的事情上。我希望我们在发布新产品时能够更加轻松和自信。我正在构建的框架是建立在一些真正令人惊叹的库之上的,这些库主要包括Integrant, re-frame,和Liberator。Integrant引入组件抽象,并负责处理应用程序的启动/停止生命周期。re-frame为前端提供了一个文件系统和通信代理。Liberator引入了一个处理HTTP请求的标准模型。如果我的框架最终有用的话,那是因为这些工具的创建者已经完成了所有繁重的工作。我的框架引入了更多特定于创建单页应用程序的资源和抽象。例如,它创建了一个用于包装Ajax请求的抽象,以便在请求处于活动状态时轻松地显示活动指示器。它也创建了一个表单抽象,用于处理输入更改和表单提交发送,以及整个表单生命周期(包括fresh,dirty,submitted,invalid,succeeded等等)的所有管道。它同时为组织数据制定了一些约定。正如我所提到的,这个框架还没有完全准备好供公众使用,因为在实现我的想法的时候,我仍然对有些地方举棋不定,而且现在基本上没有任何文档。但是希望在不久的将来我能够将它发布出来。但是,如果你现在就想看到一个使用这个框架的生产应用程序的话,我邀请你去看看Grateful Place(感恩之地)这个网站。这是一个社区网站,为那些希望通过实践同情心、感恩、慷慨和其他积极价值观来支持彼此的人提供恢复力、平静和快乐。通过加入这个社区,你不仅仅是帮助自己,你还通过让别人知道你支持他们并分享他们的价值观来帮助他们。你可以到处点击看看那些漂亮时髦的动画加载。如果你被它感动了,请一定加入!我喜欢在相互支持共同价值观的背景下与人互动。除了Clojure,我唯一关心的事情就是帮助人们开发工具来引导他们在这个疯癫的世界里航行。同时,我将继续努力使这个框架为公众使用做好准备。期待另一篇博客文章分享Grateful Place(感恩之地)网站如何实现的一些细节。最后,期待框架本身的发布声明:)如果你不耐烦等我的新框架,那就看看已经存在的一些神奇的Clojure工具(如下):