Rails 中的扩展

最近公司一个项目,需要将新网站接入美国总部的 ERP 系统,同时对流程做一部分的扩展。在这之中碰到的最大的问题,就是没有旧系统的设计并不符合 ERP 的需求,而因为要保证整个过程的无缝链接以及敏感数据的安全,对于数据库的改动限制非常大。

同事 Daniel 负责这次的更新,我们对这个问题也讨论过好多次,在 Rails 如何实现这样的功能呢。最后选出了一种不破坏旧系统的结构,也不需要数据导入的方式。只在需要进行 ERP 扩展的对象上增加相应的字段,然后使用 Order 对象的子类 ERPOrder 进行封装,将这个类传递到 ERP 系统代替原来的 order 对象。这样下来,几乎整个 ERP 的交互过程不需要做太大的改动,流程控制也变得简单且清晰,状态判断以及异常处理也变得非常合理,代码精简不少。

对 ERPOrder 类的编码中,深刻体会到 Ruby 语言的动态性带来的便利。为了避免这次的情况,能为以后更新版本的系统提供兼容,我们将很多业务逻辑抽取出来,作为 module mix in 到 erp 对象中。以后即使系统再次升级,也不用担心是否会影响到 order 对象本身的业务逻辑以及数据验证。

不过对于 Ruby 中的  module,mixin,include 机制还不是了解得很透彻,以后要多学习了。

rails 与 i18n

最近因为有做多语言版本的需要,多了解了一些 Rails 与 i18n 的内容。

Rails 项目要实现多语言版本,也就是我们常说的 i18n,有好多种实现方式。不过最普遍使用的,就是 GetText 。虽然网上有许多利用 GetText 实现国际化的例子与示例代码,但是照抄那些代码并不能给自己带来实质性的提高,还是需要总结一下的。

GetText 的工作原理,是将所有需要国际化的字符串,以类似于 Java 的资源的形式引用,例如 _('COMPANY_NAME') 实际上就是把 COMPANY_NAME 作为资源键,通过方法 _() 就能得到所需语言的字符串。

建立这个字符串资源需要使用到 poEdit 。这是一个基于 GNU 的开源项目,与 GetText 配合可以达到非常好的效果。

具体的操作流程,随便搜索就有很多,大致的概括如下:

  • 将原项目中需要国际化的内容,替换成对应的键
  • 建立 po 目录,使用 rake updatepo 命令,将项目中所有的键取出,得到一个 .pot 文件
  • 在 po 目录中建立相应的语言目录,比如 en_US,zh_CN 等
  • 使用 poEdit,从 .pot 文件导入目录,保存得到一个 .po 文件
  • 将 .po 文件复制到所有语言版本目录下,并使用 poedit 翻译成相应的语言
  • 使用 'rake makemo` 命令,自动在 locale 下创建对应的语言版本以及 .mo 文件,翻译工作完成
  • 在项目中,使用 set_locale 方法设置需要的语言版本

整个过程并不复杂,需要注意一点就是各国语言文字的表现可能不尽相同,需要多考虑一下页面的布局与美观,不能因为字符问题就把原有的设计破坏掉。

易游,OpenID 与 Ruby on Rails

5.1 去了北京一趟,易游的 OpenID 的开发暂停了一段时间,回来以后如期完成。虽然这次在北京有很多收获,都是对个人的,但是回来以后要处理的事情太多了,没有时间来 blog 记录下来。5月16号,易游 OpenID 通行证 终于上线了。

OpenID 这东西,虽然 2 年以前就推出了,不过一直没有进行推广。最近不知道由于什么契机,进入了全世界的视线。简单的描述 OpenID 的作用,就是使用一个全球唯一的 URI 地址,比如 hozaka.inu.cc ,作为你在所有支持 OpenID站点的 ID,以此免去了记录不同的用户名、不同的密码,以及繁琐的注册操作。这其中的便利只有真正了解或者使用过以后才有体会。

在国外,AOL 与 Microsoft 先后宣布支持 OpenID 协议;而在国内,还没有一家成熟的 OpenID Provider 服务商,易游可以说是第一个吃螃蟹的商业站点。另一方面,国内 IT 行业对于 OpenID 还处于一个非常初步的阶段,这一点在目前 OpenID 的讨论、资料、资源以及支持者的稀缺得以表现。到今天为止,我也只了解到 Yupoo.comLooPo.cn 两个站点对 OpenID 提供了良好的支持,也缺乏一个实体组织进行相关的推广。营造这样一个氛围需要每一个站长的努力与付出,这一点,我们易游带头了,也希望国内知名站点能为这样一种方便所有用户的技术提供支持与推广。

我负责了易游 OpenID 通行证的部署与开发,对我的提高是非常大的,甚至自己能清晰的看到,自己从开发易游第一版的不成熟,到现在代码的精简、高效,以及对于 Ruby,对于 RoR 的理解,对于架构的把握,都提高到了另一个层面。只是国内相关的资源实在寥寥无几,也没有办法就某个问题讨论与研究,估计 Ruby on Rails 在国内,还是需要一年左右的时间,才能发展到一个相对成熟的阶段,作为一个 Web 开发者我很期待。

这次的 Blog 有点杂乱,随便写写了~~

Ajax 优化,用户体验优化

最近一段时间一直都在看网站优化的内容,我关注的不外乎两点:速度的优化与用户体验的优化。

JavaScript

一直泡在 IBM 开发社区里,多多少少还是有点收获的,至少在以前的基础上有了不小的提高,其中 Ajax 和 XML: 五种 Ajax 反模式 直接了当指出了五种最容易陷入的 Ajax 陷阱。虽然说这几点内容都是很简单的,但是往往实际开发中就是这类失误容易被忽略,为整站的速度埋下不稳定因素。

总结出来以下几点:

  • 过多的,或者不合理的使用定时器 window.setInterval,将导致客户端资源枯竭,同时大量浪费服务器资源;
  • 对于用户行为触发的行为,应当考虑在适当的时间点调用相应的处理机,而不是一触发就运行。最普遍的例子就是 tab 选项卡。用鼠标点击代替鼠标滑过切换选项卡,能得到更好的用户体验,避免不同内容闪动的错觉。
  • 准确判断服务器返回状态,对于不同的状态应当有不同的处理,当然,要包括错误处理、异常处理。相信没有一个用户会知道点了某个按钮没有反应到底是怎么回事,他们也不会注意到浏览器状态栏里 "Script Error" 的字样。
  • 使用适当的方式来描述数据。这一点在大量应用 Ajax 技术的站点尤为重要,返回 XML,HTML,JavaScript 片段,还是 JSON 数据,都需要根据实际需求来判断。这一点改进能够在很大程度上提升站点的响应速度,还能减少服务器资源的消耗。
  • 应用正确的、合理的 html 结构。单纯的 JavaScript 应用对于一个网站来说只能是点缀,结合适当的 DOM 模型才能产生出多种多样的效果,给用户带来更好、更便捷的体验。合理的结构对搜索引擎来说更为友好。

User Experience

用户体验永远是一个成功的站点关注的焦点,无论是设计师,还是开发者,都应该有深入的了解。我的切身体验告诉我,一个了解用户心理的开发人员,在架构的设计、细节的处理、功能的定位上,都能够和设计师很好的交流,从而得出一个非常好的解决方案。我个人认为,国内的很多站点就是因为缺乏这种意识,使得用户更喜欢国外的设计优秀的站点,尤其是对互联网了解比较深入的人群。

这当中,我最欣赏的是 一叶千鸟的 blog,他对于细节的关注,每一点都一针见血。同样对这类问题研究了这么久,自己对这些细节都没有在意,惭愧啊~~~

用户体验的话题,我觉得很难总结,靠的是一种直觉和经验。多把自己放在用户的位置,再放在普通用户的位置,考虑这个问题,就比较容易得出一个好的解决方案来。

关于最近

最近这段时间发生的事情太多了……

首先是公司里,团队里的人陆陆续续在这个月里都外出培训,自然而然的,开发的重担压在了我一个人的身上,还要带领两个成员开始 Rails 的开发,希望这两棵苗苗能在不久的以后帮我分担一些开发上的压力,呵呵~~

Ellison 和我谈了很多次,关于自己的定位问题。我想,经过这么长时间,我的目标越来越明确了,我希望做的,是一个管理者,而不是一个开发者。虽然,对代码的执着、对完美的追求,我喜欢写代码的感觉,头脑里各种思路激烈的碰撞。但是目前,对于团队,我想我成为一个规划者更加合适,程序的架构、工作的分配,用我的经验给团队带来更高的效率,这方面的能力我还欠缺,这样也是一个磨练自己的机会。

谈谈最近的开发进度吧,因为基于团队发展的考虑,取消了一个项目,时间一下子松了许多 ,我也有更多的时间可以关注最近一段时间以来这块领域的动向,可以看一些积攒了很久的技术文档。初步决定这一个月是由我们来讨论易游下一个版本的规划的,不过由于培训的关系,人一直都不齐,所以安排研究 OpenID 的协议了。

看了一个星期的文档,对 OpenID 有了一定的了解,同时因为 OpenIDEnabled.com 本身需要使用 OpenID 登录,也可以说切身体验到了 OpenID 的便利,确实很有前途啊,值得研究。

最后,这个月底,我要去北京,陪陪我的小猪~呵呵,就当是这段时间以来的休息,在那之前,还需要把我不在的那段时间的工作安排好,这也是一个规划者、管理者的责任。不能辜负 Ellison、Season、Gary 他们对我的期望,A-Za-A-Za Fighting!