显示标签为“Programming”的博文。显示所有博文
显示标签为“Programming”的博文。显示所有博文

星期二, 十月 17, 2006

Web 开发,我推荐 RoR

最近一个朋友在学Java和JSP,想做Web编程,我极力劝他学RoR,虽然我还没用这个东西。

时间是很宝贵的东西,如果一个刚上大一的同学问我学Java还有前途吗,我会告诉他坚持学1-2年Java看看。毕竟1-2年时间够他看个几本大部头的Java书籍了。如果大3-4了,还刚想起来学Java(看到招聘信息很多招Java的),那么我只能劝他们放弃吧,时间宝贵,学一点更有用的东西。

有人说我最近怎么离Java越来越远了,的确,我已经好几个月没写Java代码了,但我自己也不用 RoR 进行开发,但我在用一些受RoR启发的框架,譬如CakePHP。学习一门新的技术也是一种投资,你学Java的时间就没法用来学习RoR,这就是所谓的机会成本。用RoR开发Web速度比Java快这是个不争的事实,学习RoR的难度也比Java小,既然可以用更少的时间学习更实用的技术来满足自己的需要,你所花的机会成本就越少,何乐而不为呢?

星期三, 十月 11, 2006

JSR 223: Scripting for the Java Platform

最近由于 RoR 的盛行,SUN 收编了 JRuby 的两名作者,决心在脚本语言方面做点文章了,于是 Java 6 中间加入了 JSR-223 的支持。看了一下 JSR-223 的相关内容,发觉这东西不就是把 BSF (Bean Script Framework) 规范化了吗......,不同的是 BSF 是 IBM Alphaworks 贡献给 Apache 的,而 JSR-223 是一个规范。

这个 JSR-223 其实就是定义了一些接口,用来衔接使用 Java 实现的脚本语言和 Java 本身通讯,是 Java 与 Scritps 互操作的一个桥梁。主要职责差不多是让 Java 执行动态语言脚本,访问动态语言执行中产生的变量、函数等,同时让动态语言能够在它的范围内访问到 Java 空间里面的指定变量,达到互操作的目的。

JSR-223 除了一个标准的给用户使用的接口之外应该还有一部分给 Scripts Provider 让他们将自己的实现符合这个规范,达到一致的目的。

BSF 自 2003 年就已经 release 2 了,翻了翻以前老外讨论 BSF 的邮件列表,发现他们主要的问题集中在性能,觉得在 JVM 上面用 Java 再来解释一种脚本语言效率实在不行。不过近年来随着 RoR 的出现,似乎让大家的重点更多的转移到了速度上来,毕竟不是所有场合都那么追求高性能,能够提供更高的开发效率才是大家所需的。

星期一, 十月 09, 2006

由 CakePHP 想到的......

做了一段时间的 CakePHP 开发,一个类似 RoR 的 PHP 框架,让我对 Web 编程又开始感兴趣了,之前用 Java 开发 Web 程序着实让人失望。静下心来总结一下,其实 Java 开发 Web 应用也可以模仿 RoR 的,虽然类似的框架已经有一些了,但是我还是觉得应该尽可能的简单......

采用一个非 JSP 的模版引擎。大家喜欢使用 JSP 当模版,当然了,默认就是这样的。不过 JSP 第一次编译着实让人很烦燥,我觉得 Web 开发的速度优势不明显了。开发 ASP/PHP,边写程序边刷新页面是挺实用的方法,页面有太多的布局、UI元素,需要频繁的刷新来进行调整,这点 JSP 让人调的很麻烦。所以选择一个好的模版引擎可以省不少事情,我最喜欢 FreeMarker,当然还有 Velocity 可以用,还有一个有意思的东西,Antlr 配套的 Stringtemplate 也可以拿来用,非常不错。

使用动态语言编写 Controller。Controller 的职责出要是处理一些控制逻辑,数据库的操作它不需要来负责,所以 Controller 随着 View 的不同改动太大了,但也都是微调。因为经常需要改变,所以每次都编译一边实在恶心。当然了,各种框架几乎都提供了容器外测试的环境,我个人觉得后期可以将稳定的 Controller 写回静态类以提高性能并进行详细功能测试,但一般来说大可不必。采用一种好的动态语言可以省不少事情,譬如 Java 提供了统一的 BSF 可以选用很多动态语言,譬如 JavaScript,Jython,Groovy, BeanShell,JRuby 等等。初期效率不是最关键的因素,再说 Web 应用的性能瓶颈往往在数据库,Web 框架没必要太复杂。


业务、数据层可以脱离容器开发。这一层是 Java 的强项,完全可以脱离容器开发,进行单元测试,这对于 Java 开发人员往往是最得心应手的工作。

如果有时间到想用 Java 做一个这样的东西玩玩,似乎还漏了最重要的一点,Convention over Configuration,有了这个 Magic,效率才可能有魔术般的提升!

天下大势,合久必分,分久必合

永远无休止的 Web 框架之战,几乎主流的编程语言都涉及了 Web 开发,从 ASP/PHP/JSP 的兴起,从 Model1 到 Model2 的转变,几年间大家从简单的 ASP + ADO + XXX 到使用各种框架,框架优劣的讨论几乎成了争论的焦点。

我也是从 ASP 时代过来的,记得高中用 ASP 写了第一个留言板程序之后发现编程原来竟可以这么简单,随之接触了 Linux,接触了 PHP,接触了诸多开源的东西,至少那几年来写 Web 程序从来没有涉及过框架一说。直到用起了 Java,接触了 JSP,才逐步从 Model1 向 Model2 转变。JSP 一点都不比 ASP/PHP 简单,甚至开发速度也很慢,从一开始接触 Struts 就没发觉那点好,也从来没用 Struts 正经做过什么东西。从 Struts 诞生到现在5年多了吧,其间大大小小的框架层出不穷,似乎代码的 copy-paste 开发散发出不好的味道,大家纷纷追求更高层次的代码重用,掌握各种各样的框架成了求职的必备技能。不知不觉我们在走向一个极端,Java 各式的框架是在太多了,光是 Web 框架就够让人看花眼的了。

并不是所有时候框架都能带给开发者方便,当我在用 Java 开发 Web 的时候总是第一感觉想到我熟悉的 Spring-MVC,想到 Spring + Hibernate,自己动手搭建这么一个环境大概20分钟就过去了。就算能够开始写东西了也无法快速的看到原型,层次太清晰了,以至于不得不一层一层写,一层一层测试,写到 Web 层的时候发现自己写的一大半代码都是重复的。在这点上,脚本语言要方便得多,写 PHP 的 ShiningRay 写一个相同功能的程序甚至只需要 Java 版本的 50% 代码行数还不到,而且速度可以快上1倍,这还是保守估计。

于是太多的 Java Developer 投奔 RoR 的怀抱了,虽然我没有亲自试过 RoR,但是用过类 RoR 的框架 CakePHP,开发效率的确很高,框架的作用被很好的隐藏起来了。Convertion over Configuration,着实 Pragmatic。想当年大家都在写 Model1 的 Web 程序,Model2 的出现促生了无数 Web 框架诞生,各种各样的新鲜想法诞生了,出现了一批优秀的 Web 框架,但都自成体系。时间长了,大家都累了,学一个框架已经远远不够了,至少也要了解另外几个才行。RoR 推行的概念很好,抛开其他因素,按照约定俗成的规范来写程序。可能在 DHH 之前已经有很多人这么做过了,只是没有能够像 RoR 宣传的这么好罢了。从合到分,从分到合,技术总是在不断变换中前进,大方向是好的,都是为了提高生产力,关于语言、平台方面的争论就少一点吧,与其无休止的口水战还不如踏踏实实的写好程序。

星期五, 九月 22, 2006

我们需要动态语言因为它足够灵活

写了一段时间 JavaScript,感觉比写 Java 思维更开阔。虽然 JavaScript 提供了非常有限的 API,但是灵活的语法可以让人有更多的自由空间。

Java 的语法的确很死板,因为需要编译,并且是强类型的语言,所以类型问题经常能够困扰人。虽然也提供了 Hashtable/Map 之类的数据类型,但是严格的语法限制了人们发挥想象。

很多时候我们希望能够动态创建一些对象,因为对象的属性是未知的,这时候用 JavaScript 可以绝对的方便,当然我们还可以为这个对象添加额外的函数。

函数式编程可以有效的缩短代码长度,虽然 Java 也可以通过匿名类的形式模拟内嵌函数,但是对类型的依赖使得语法绝对不够灵活。

不需要明确声明类型有时候的确比较困扰人,但在很多场景中确是非常灵活的。JavaScript 灵活的类型使得整个编程模型异常简单,很多时候,我们只不过就是在几张变量符号表中操作操作而已,一切就是这么简单。

灵活的代价是缺乏规范,没有类型,没有接口,就需要良好的代码结构和文档来进行多人开发,这也是脚本语言开发的一个弊端。下面的一种方式我觉得很不错,从dojo里面看来得。
function swap(/* string */a, /* string */b) { .. }
或许有时候注释一下类型会让代码变得稍微清晰一点,当然了,多积累点单词,把函数、变量命名的易读一点才是正确的方法。