Flex的起步推动新语言学习
近来,对于很多新兴创业型公司来说,选用RIA技术来实现他们的创意和服务已经不是什么新鲜的事情了。正处于起步阶段的基于Adobe Flex技术的Babbel就是其中一个例子。为了让读者能够对如何设计和实现一个应用Flex技术的新起步应用的构架有一个深刻的了解,InfoQ就此采访了Babbel背后运营公司Lesson Nine GmbH的CTO-Thomas Holl。
Holl首先这样描述Babbel:
Babbel是一个基于社区的在线语言学习工具。Babbel.com提供德语、英语、法语、意大利语及西班牙语课程,将社交网络的乐趣融入到有趣并有效的词汇扩充和句型构造的工具中。
而后,他回答了创建Babbel的初衷:
2006年年末时,我们曾试图寻找一个现代的在线语言学习工具,让我们感到惊讶的是,当时还没有一个像Babbel这样的工具。现在的形势看上去已经在慢慢开始转变。但那个时候,能找到的词汇练习都极为基础,界面也不是非常友好。另外,你能买到的CD-ROM或DVD上的多媒体应用不仅昂贵,而且无论是在技术还是内容上都很陈旧。通过控制台进行的教学游戏是Babbel概念的角色模型-这些简单的应用使用起来很有趣并且获得了大众的喜爱。
在Flex与AJAX的比较上,他解释说:
从一开始就很明显,我们的站点应该使用流行的多媒体选项,比如播放音频、动画以及在后台缓存数据使得之对请求的回应更快。去年在我们着手开发的时候,除了Flex框架以外,再没有什么技术更能符合我们对Babbel定下的愿景了。我们也许可以通过AJAX来做很多事情,但那样就不得不处理繁多的JavaScript库,另外,用户体验也还是无法匹及Flash应用。
在众所关注的Babble开发所使用的技术上,Holl和大家分享道:
我们有4个开发人员参与了Babbel的开发,其中2个关注Flex客户端,另外2个则开发了运行在Amazon EC2实例上的基于Ruby On Rails的后端。2007年5月,我们一切从零开始,直到2008年1月发布第一个版本,整个开发历时8个月。 服务器端的实现包括了12000的Ruby代码,Flex客户端的实现大概有50000行代码(包括7000行自动生成的集成代码)。 我们一直遵循一个循环的开发流程,并发现以一周为循环周期对我们来说最适用。除此以外,我们还使用了最实用的工具和流程,例如,使用Subversion来管理版本;采用Trac来跟踪事件(defect tracking)、文档编制(documentation)及交互(communication);通过Ant/Capistrano自动构建/部署(automated builds/deployment )等等。
Holl也谈到了在Babbel的开发过程中所遇到的挑战:
为了实现从客户端对后端服务的访问,我们开始采用简单的定义语言(考虑过WSDL,但基于JSON来的更为简单)来描述这些服务,然后,我们的生成器(generator)将这些定义转化为ActionScript方法,这样一来,客户端可以通过静态类型值对象(类也是自动生成的)来访问从服务器返回的数据(通过HTTP协议以JSON类型返回)。然而,对于某些功能(比如“people search”)将数据以这样的方式封送处理似乎不是很合适,通过编写代码来动态的创建GUI元素纯粹是浪费。我们想充分利用Rails的力量来生成HTML代码,但由于Flex所支持的HTML元素和风格有限,在Flex上显示HTML受到了严重的束缚,而现在,我们通过Rails来生成MXML然后在客户端显示。通过这个方法,服务器同样可以在客户端激发一些动作(比如,收到新信息的时候,需要在客户端显示一个提示)。
关于RIA相关技术和构架,Holl回想道:
另外一个时不时就冒出来的问题是客户究竟可以并且应该拥有多少个不同的状态。这个问题的提出,促使我们进行了几轮优化和测试来寻找对于Babbel来说最好的平衡点。客户在服务器端的相关变化,服务器会在回应下一个客户请求的时候通知客户(这就不再需要push构架),客户收到通知以后再由其本身决定是否要与客户端同步。
什么技术可以推动Bebbel将来的发展?
我们会将我们的语言教学工具努力推向类似游戏的用户体验。下一个大的目标之一是集成语音和视频聊天功能,通过Adobe系列技术,这个功能是极有可能实现的,我们目前正在对其进行评估。之后,我们想在网络和社团特性方面添加大量的功能。另外,团队对于网站内容的管理、以及用户对网站的贡献的可能都需要得到巨大的扩展。我们还想将Babbel带入移动世界,这也意味着会涉及到J2ME、Symbian或iPhone的开发。
- 简约的JAVA版本MapReduce和日常No.25
- 根据职位说明使用机器学习来检索相关简历
- 微信小游戏初体验
- 一行Spark代码的诞生记(深度剖析Spark架构)
- Ray:AI的分布式系统
- Spring Boot 中使用 MongoDB 增删改查
- 来人啊给我炸了那个Java虚拟机No.46
- 机器学习虾扯淡之Logistic回归No.44
- 大数据计数原理1+0=1这你都不会算(一)No.47
- 机器学习虾扯蛋之SVD奇异值分解No.48
- 提高Spark姿势水平 No.73
- 好好玩的螺旋算法No.69
- linux学习第四十篇:访问日志不记录静态文件,访问日志切割,静态元素过期时间
- linux学习第四十一篇:配置防盗链,访问控制Directory,访问控制FilesMatch
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法