你好! 我是麻省理工学院大三学生Linda Liu。 过去三个月,我在 edX 担任移动团队的软件工程实习生,在此期间,我有机会从事从服务器端到 iOS 和 Android 开发的一系列工作。 我想谈谈两个项目——第一个,重新设计 edX 访问控制框架,第二个,探索 React 框架及其对 edX 的潜力。
访问控制框架
该项目实际上是作为移动应用程序课程开始日期的错误修复开始的。 如果课程作者未指定课程的开始日期,则默认为 1 年 2030 月 2030 日。在 Web 平台上,会执行检查,以便用户看到“未安排”而不是明显错误的日期。 但是,该移动应用程序没有执行等效检查,因此学生们看到的课程是在 XNUMX 年开始的。
想到的第一个潜在修复是在移动 API 的课程注册端点中执行服务器端检查,以查看开始日期是否为默认日期,并让 API 发送 没有这种情况下的价值。 这个修复很好,因为它不需要客户端更改。 但是,我发现这些应用程序期望来自移动 API 的时间戳,并在该期望被打破时崩溃。 因此,纯粹的服务器端更改是行不通的。
谈论潜在的修复演变为关于如何在平台中完成开始日期检查的讨论。 该平台有 一个叫做的大函数 有访问权限 以此目的。 它接收用户、操作和对象,并检查用户是否具有对对象执行操作的适当权限。 例如,此功能的用途是检查学生是否具有注册课程的权限。 当时,这个函数只返回一个布尔值—— 真 如果授予访问权限, 假 如果访问被拒绝。 鉴于访问被拒绝的原因有很多,并且不同的原因可能想要触发不同的行为,似乎 有访问权限 可以从包含更多详细信息的返回类型中受益。 移动 API 然后可以发送结果 有访问权限 检查客户端,然后客户端可以使用该信息显示适当的消息。
下一步是设计新的返回类型。 新对象被称为 访问响应. 它是一个 Python 对象,其中包含与原始值等效的布尔值 有访问权限 将返回一个字符串错误代码以及用户和开发人员消息。 它的子类代表我们当前要处理的错误,即 开始日期错误 (如果课程尚未开始为用户), 可见性错误 (如果用户没有所需的访问权限),以及 里程碑错误 (如果用户有未完成的里程碑)。 我在四个单独的拉取请求中实现了更改:每个请求一个 “有访问权限”, 移动 API, 安卓客户端和 iOS 客户端. 虽然超出了错误修复的原始范围,但此更改允许开始日期检查从客户端移动到服务器端。 作为副作用,此更改使在移动应用程序中实现未来功能(例如里程碑)变得更加容易。 通过这项工作,我接触了很多非常酷的 edX 代码库!
适用于 iOS 和 React.js 的 React Native
我的下一个项目本质上更具探索性,具体目标更少。 在 edX,许多功能需要开发三次——一次用于 Web,一次用于 iOS,一次用于 Android。 有各种各样的跨平台移动开发工具,以“一次编写,随处使用”为口号来解决这个问题,但他们试图将开发标准化太多——应用程序不能使用原生平台组件,所以他们出来了感觉就像美化的移动网页。 Facebook 为这个问题开发了一个解决方案: 一个名为 React Native 的框架 它使开发人员能够使用 React(Web 的 UI 框架)构建本机应用程序。
React Native 背后的驱动理念是“一次学习,随处编写”。 这意味着平台具有不同的结构和风格,因此开发人员应该为每个平台编写不同的应用程序,但是使用 React Native 可以使用相同的底层技术编写这些应用程序。 它承诺两全其美 - 跨平台高效且相似的开发,但仍然具有良好的原生感觉。 最近,Facebook 开源了 iOS 框架的版本。 希望 React Native(一旦它也为 Android 开源)和 React.js 将允许开发人员重用代码,从而减少为所有三个平台开发所需的工作。
XBlocks 是这个项目的一个很好的候选者,因为它们是小的模块化部件,并且移动应用程序目前没有它们的本地实现。 具体来说,我用 拖放 XBlock,因为它使用的交互(特别是拖动动作)将受益于 React 承诺的平滑渲染。 我开始做一个简单的拖放评估 一个独立的 iOS 应用程序, 来感受一下使用 React Native 进行开发。 React 兑现了它的承诺——渲染非常流畅,组件和信息以一种真正有意义的方式组织。
这个最初的实验产生了两个后续问题:将代码移植到浏览器的 React.js 拖放评估中有多容易? 其次,拖放评估与 XBlock 框架集成的容易程度如何,以便评估能够以正确的方式与服务器通信?
过去几周我一直在努力回答这两个问题。 我制作了我的 iOS 应用程序的 Web 版本,虽然没有直接将代码转换为 iOS 到 Web(React Native-to-React.js),但信息以相同的方式传递和存储,并且这意味着可以重用很多功能。 例如,所有处理拖动的功能只需要一些小的调整。 这是有希望的,因为这意味着我们可以开发为不同平台量身定制的 XBlock,但仍然能够重用代码背后的结构。
我还致力于将评估与 XBlock 工作台集成,因为这将是让它与平台一起工作的重要部分。 这涉及修改拖放 XBlock 本身以及从 React 组件实现正确的 AJAX 调用,以便服务器知道学生何时打开或尝试问题。 React 使进行所需的调用变得容易,现在我们有了这个 XBlock 的 React Native 和 React.js 版本! 我希望 edX 将来能让 React 组件成为平台的永久组成部分。


React Native 拖放 XBlock 的屏幕截图
左: 用户对问题的初步看法。 右:通过 iOS 警报提供反馈。
结语
我喜欢今年夏天我在我使用的技术和与我一起工作的人方面从事的各种项目。 我学到了很多具体的东西,也获得了软技能,比如如何在软件工程团队中有效地沟通。 这是一个了不起的机会,感谢所有做到这一点的人! 我要特别感谢我的导师 Chris Lee、Akiva Leffert 和 Nimisha Asthagiri、移动团队的其他成员和其他实习生。
![]()