跳到文章正文
教程 编辑推荐

断网也能写 Python:一个 2.2 万人用的编程平台,把运行时塞进了低端安卓浏览器

先讲一个不太好听的数字:一位创办编程培训机构的作者,招了 80 个学生,最后只有 6 个人毕业。…

先讲一个不太好听的数字:一位创办编程培训机构的作者,招了 80 个学生,最后只有 6 个人毕业。原因不是课程太难,也不是学生不努力——他们会在直播课上到一半突然掉线,然后就再也没回来。网络撑不到一节课结束,这是很多教育产品默认不存在的问题。

一分钟速览

  • Efiwe 是一个面向弱网、低端设备的编程学习平台,目前覆盖 160 个国家、2.2 万多名学习者。
  • 选择 PWA 而非原生应用:避开几十 MB 的安装包流量,靠 Service Worker 静默更新。
  • SQL 用 sql.js(SQLite 编译成 WebAssembly),Python 用 Pyodide(CPython 编译成 WebAssembly)。
  • 硬规则:运行时不在主线程初始化,也不在真正需要之前初始化,首屏渲染绝不等待运行时。
  • 每条执行链路都把“学生代码报错”当作正常数据,而不是系统异常。
  • SQL 判题比较结果结构与内容,允许别名、列顺序不同,只要求查询正确。
  • 真正的工程难点不是模型质量,而是存储配额、冷启动和失败路径的容错设计。

四个被默认成立的前提

大多数编程教育平台都建立在一组假设上:学习者有笔记本电脑、有宽带、能顺畅读英文、付得起订阅费,或者所在机构替他们付了。这四条在发达市场几乎不证自明,但在很多地方同时不成立。Efiwe 的出发点,就是把这四个前提逐条拆掉:直接跑在手机浏览器里,只需一次初始设置,之后可以离线使用;学生提交的代码也在本地执行,首次加载完成后不再消耗移动数据。

目前它已经被 160 个国家的 2.2 万多名学习者使用,并在尼日利亚拉各斯州、奥贡州以及印度北阿坎德邦的学校开展了有组织的试点。这些地方的共同点是:设备内存小、处理器弱、网络时断时续、流量按兆计算。

为什么不做原生 App

开发一个原生安卓应用看起来是最自然的选择,团队否掉它有三个理由。第一是安装门槛:即使还没下载任何课程内容,装一个 APK 往往也要几十 MB 流量,而学生正在精打细算地用流量套餐;PWA 点开就能学,缓存可以后台逐步完成,流量被分摊到学习过程中。第二是更新频率:产品持续迭代,Service Worker 让新版本在下次访问时生效,而应用商店的更新在惜流量的市场里经常被无限推迟,用户可能还在跑几个月前就修过的旧代码。第三是运行时:WebAssembly 让 Python、SQL、JavaScript、HTML 的代码执行可以一次实现、处处运行,不依赖服务器。

他们也考虑过用原生外壳包一层 WebView,但那样仍然要先下载 APK 才能开始学习,这对一个以降低门槛为使命的产品来说已经足够致命。选择 Web 的代价也很明确——必须接受浏览器的存储配额机制,而生产环境里的大部分麻烦恰恰来自这里。

把运行时关进 Worker

通常,判一道编程题要把代码发到服务器,在沙箱里跑,再返回结果。这意味着每次尝试都有一次网络往返。而在网络不稳的教室里,学生往往要试十到十二次才能解出一道题,这种模式根本行不通。

所以代码改成在设备本地执行。SQL 用 sql.js,Python 用 Pyodide,两者体积都不小,初始化也慢,处理不当会直接阻塞主线程,让页面卡死。团队最后定了一条规则:任何运行时都不能在主线程初始化,也不能在真正需要之前初始化。学生选课之后,才按需启动 Worker;挑战页面的首次渲染绝不能等待运行时就绪。

实现上还有几个容易被忽略的细节:初始化要有 45 秒超时,避免弱设备上无限等待;Worker 内部要防止重复初始化;模块文件优先从缓存加载,这样设备离线一周后再次打开,运行时仍然能启动。最关键的一条是错误处理——学生写的代码抛异常,是学习过程中预期会发生的事,绝不能因此终止 Worker,而应当把它当作一条正常结果返回。

判题不是字符串比较

SQL 题的判定方式也值得一说。直接比较输出字符串太脆弱:学生用了不同的列别名、换了列顺序、加了格式化,明明查询是对的,也会被判错。Efiwe 的做法是比较结果的结构和内容——列名统一转小写、按需排序、行数据规范化之后再比对,只有在题目明确要求顺序时才检查顺序。这个改动看起来琐碎,却直接决定了初学者会不会因为格式问题被劝退。

真正的瓶颈不是模型

文章里有一句话值得所有做端侧 AI 产品的人抄下来:在这个领域,真正棘手的问题不在模型质量,而在存储、配额、冷启动和失败路径的设计。这些问题也不只存在于教育产品——只要你的用户设备性能有限、网络时断时续,就会撞上同一堵墙。

浏览器给的存储配额不是无限的,缓存策略一旦设计得激进,用户可能在某次更新后突然发现课程打不开;设计得保守,离线体验又会打折。冷启动同理:运行时初始化慢,用户会在白屏前离开;提前初始化,首屏又会被拖垮。这些都是在真实设备、真实网络里一遍遍称出来的重量,没有漂亮的基准分数可以替代。

趋势洞察

端侧 AI 的讨论常常集中在“能不能在手机上跑一个模型”,但真正的产品化难点在别处:一次初始化的几十秒、一个几十 MB 的安装包、一次没有兜底的异常,都足以让用户流失。Efiwe 给出的启示是,把 WebAssembly 运行时、PWA 缓存和离线优先架构组合起来,可以在很低端的设备上做出可用的交互式学习体验。这条路不只属于教育,也属于所有想服务“下十亿用户”的产品。

本文地址:https://www.163264.com/18721