我和 YunLoad 的故事——YunLoad 开发上线 5 个月以来的所见所闻所想
本来想的是在 YunLoad 成功处理了 1K 次提交的时候写一篇文章来对 YunLoad 的诞生和发展进行一个回顾,但是那段时间现实生活中遇到了诸多不愉快的麻烦事,便一直拖着,直到最近稍微空闲一点才得以有空可以写点 YunLoad 的故事。
YunLoad 从 2017 年 12 月开始构建,第一个版本发布于 2018 年 2 月 18 日。作为一个统一的作业提交平台,旨在将作业的提交过程便捷化,减少教师和同学在专有平台提交作业时不得不面对的繁琐步骤,缓解文件庞杂错乱等问题。网站地址:https://yunload.org
YunLoad 想法并不是空穴来风,或者像某些对校申报的创新项目那样无病呻吟,而是一个在我所处的学校的一个十分现实的任务——作业提交和管理。到了大学以后才发现我们的大把时间可以被用于完成各类实验报告和作业,而这么大量的实验报告在我校并没有一个可用的提交 / 管理平台来处理,大量的文件在各式各样的通讯媒介(包括但不限于:U 盘,QQ,邮箱等)中传递,其中 U 盘用起来麻烦最大,抄袭概率高, 运气好的话还能附带一个病毒 ,QQ 传输混乱,邮箱对于收取作业的教师而言无论是在统计上抑或是快速收取上都非常麻烦。
Pre-YunLoad Era
在 YunLoad 之前我曾经写过一个简陋但是实用的小工具被称为 AreaLoad,AreaLoad 是我自学 PHP 之后的第一个应用,大概也是我写的用到了传统动态网页开发栈(SQLite,PHP,BootStrap)的第一个应用,AreaLoad 的想法来源是一位老师的 NodeJS 作业提交接口,在一个偶然的机会发现这个潜在的需求后便萌生了写一个稍微更加好用点的框架的想法,在和 Allen Lau 分工合作 2 周后,一个看上去可以用的 AreaLoad 出来了,虽然当时的 AreaLoad 非常简陋且扩展性几乎为 0,但是在实际的应用场景中起到了实际性的作用,把一些本来可能需要一个下午统计 / 整理的工作缩短为 5 分钟的部署和 20 分钟的统计 / 收取,且不说起到了较大的成效吧,至少 It works.
We need more power
在 AreaLoad 的使用过程中有老师提出我们应该加入用户验证 / 登录和统一的统计系统,而不是每次收取完成后直接重置整个提交项目等,考虑到 AreaLoad 的高不可拓展性,我便萌生了重构 AreaLoad 的想法,由于有了部分 PHP 的经验,我选择了 Laravel 框架一边学一边尝试写一个更加能用的作业提交框架。
YunLoad Story
YunLoad 的想法开始于 17 年 12 月的时候,应该是快到寒假的时候,利用闲暇时间开始了 YunLoad 的搭建(此处应有最初的截图的… 找不到了).
其实本来我是想过找几个伙伴一起来完成 YunLoad 的,但是从最初的平淡地不做指望(周边朋友做的方向不一样),到中间找到的潜在合作伙伴时的兴奋和期望到最后发现其实完全不靠谱的失望,以至于 YunLoad 项目的几乎所有工作(架构 / 编码 / 测试 / 部署 /“售后”)基本都落在了我自己的头上,YunLoad 记录了我对于 “合作伙伴” 的定义的改变,稍微归纳如下:
- 在 ** 完全确认对方能力前 ** 不要直接认为对方是你的合作伙伴,并继续把项目当个人项目做下去,如果寄予对方希望过大,或者把核心功能交给对方设计,只会换来自己不想要的设计,或者失望。
- 有的人看上去表现出想和你合作,其实对方可能并不对你的项目感兴趣,而是仅仅是利用你的项目达成对方的目的,但是如果真的是这样也挺好,毕竟这个是一个双赢的情况,但是若遇到了仅仅想着利用你的项目达成个人目的而不愿意出自己的一份力的话,这类人还是尽早远离为好,不要把大量的时间浪费在尝试改变对方上,有时间吵一架和对方撕破脸还不如多想想怎么设计自己的东西,毕竟自己的项目只有自己负责。
Origin of name
从 YunLoad 诞生到现在将近 6 个月来有许多人问过我为什么这个项目的名称由拼音和英文拼凑在一起,不符合常规命名逻辑,由于涉及到的事情较为复杂,之前一直没想好如何合理表述,所以一直没有给出过一个来自创造者的表述,现尝试描述如下:这个问题分两部分,后缀 Load
,这个是在当时设计 AreaLoad
时定下的主基调,之后的衍生项目均会以 Load
结尾。关于前面的 Yun
,当时想到这个名字的时候有点双关的意思,一是传统的 ** 云(服务商)** 的概念,而另一个则是 ** 芸 **——一个同学(同专业,以下简称 “YunYun”)名字的最后一个字,YunYun 的优雅和漂亮吸引了我,而当时的 AreaLoad 正是因为设计的极其简陋和笨拙才有的设计新的优雅的平台的想法,便将这个项目以她的名字命名,第一个发布日定为她的生日(截至本文发布时,我还没有收到相关名称侵权律师函 2333).
不过可能令读者们失望 (或者高兴?) 的是,即便如此(这个短句不要理解成:为了她而开发的这个平台。仅仅是命名),我和她的故事并没有后续,在几次合作的不愉快后渐感人与人之间的想法差异太大,现在也联系的少了。
Dev & Ops
从 YunLoad 具体的开发角度来看,有的时候直接重构一个 “产品” 远远比在原有结构混乱的代码上进行修改要来的更加容易,基于 Laravel 的 YunLoad 完全按照 RESTful 的模式设计路由,用了 MVC 的设计理念使得前后端可以稍微分离一些(现在回顾当时的 AreaLoad,页面逻辑代码和样式全部混在一起,非常有意思),在开发过程中学到的设计模式可能甚至比实际开发出来的成果对于个人的提升而言更加有帮助。 期间也随着自己的想法和老师建议参加过一些项目 / 比赛,只不过结果不怎么好罢了,无意评判他人,也许真的是我自己做(吹)的不够吧…
相比较开发而言,可能 YunLoad 遇到的最大的挑战在于维护,YunLoad 目前有多个后端应用服务器,这没问题,但是出于数据安全考虑这些后端服务器全部位于欧洲国家,这样对于主要访问者(自己学校内学生)直接访问后端服务器而言就十分不友好,动辄 400+ms 的延迟让许多用户反馈访问速度太慢,而且最初使用的 DNS 轮询负载均衡的方式也使得任一后端掉线都对运维是一个挑战。 为了加快大陆的访问速度,YunLoad 被配置了 GCP 台湾服务器的反向代理,延迟瞬间降至 50~70ms 内,这一开始也没问题,但是随着各种事情的发生,GCP 在大陆的丢包率可以达到可笑的 80%,这样的丢包率对于用户而言便是 “YunLoad 又打不开了”…
目前使用 GCP 在美国的服务器作为反向代理,稍微兼顾了一下网络稳定性和访问速度,暂时还没出现过大的问题,日后可能会考虑将服务迁移至国内以应对各种 “网络异常波动”,毕竟用户还是最重要的。
说到用户,我十分感谢 YunLoad 最初投入试运行时第一个同意使用这个平台的的王老师,由于 YunLoad 面向的就是教师和学生之间的作业提交问题,老师的加入意味着我就直接获得了所有的学生用户,首先是我们专业的 4 个班,慢慢地,另一位王老师加入又给平台带来了其他学院 3 个班,随后同专业低一年级的两个班也在班长的带动下加入了进来,看到注册用户的慢慢攀升和平台处理提交数的提升,除了对于缓存服务器的担心以外,这个应该是整个项目中最让我欣慰的一部分了——自己写的东西可以被投入运行,可以实际落地给这个学校、这个世界带来一点微小的贡献,一本满足!
Post-YunLoad
尽管 YunLoad 目前已经是一个比较高可扩展的框架,但是可以预料到的是 YunLoad 如果仅仅保持现在的功能和设定的话,除了在自己的学校以外是没有任何落地能力的(更别提竞争能力了),但是一旦 YunLoad 可以变为一个全功能的平台的话(到那个时候一定会是开源的),我想,高校内文件传输和管理的格局会有一个大的变化(应该不会是个 Flag).
当然,仅仅靠我一个人继续这样维持下去的话,恐怕前者发生的概率较大,YunLoad 目前还是需要一些开发者对其进行改进和功能升级,如果你熟悉 YunLoad 的技术栈(Laravel-Python-MySQL-Redis)且希望能见证一个开源的全功能平台的兴起的话,我非常欢迎你的加入!
Credit
YunLoad 的开发历程中,十分感谢以下同学 / 老师给予我的指导和支持(排名不分先后,优先使用网名,若没有则使用拼音,名前姓后):
- Yong Wang 老师 - 最初的想法来源,YunLoad 开发和资金支持
- JohnNiang 同学 - 提供了许多开发上的宝贵建议
- GuiPing Wang 老师 - 测试阶段直接同意使用 YunLoad 平台的老师
- BlackGlory - 设计指导和建议
- Ren Li 老师 - 给出了一些设计上的建议
- Nolan,DADDI,Qiao 三位同学 - 完成了非常出色的文案和宣传相关工作
- Allen Lau 同学 - 设计了 YunLoad 的 JS 部分和动画