μ: Never Stop TUNet

今天,3月20日,TUNet清华自动连网助手的Android和iOS新版正式发布[1]。这也是我[2]今天收到的最好的生日礼物之一。请允许我特别感谢在过去几个月为了新版本日夜奋战的小伙伴们:张阳坤胡皓宇韦毅龙孙景昶陈光陆逸文张浩然;每一次和你们一起并肩奋斗,都能给我带来思维碰撞的快乐和解决问题的成就感。

TUNet Wall
Fig 1. 放置在清华学堂路两侧的展板 :D

TUNet自动连网助手是清华校园网工具应用,帮助师生在Android和iOS设备上自动登录校园网,以及管理和保护校园网账号。TUNet是我们Lab μ校园极客社在清华最受欢迎的产品,从第一版在2013年10月29日正式发布以来,已经有超过24000位清华师生安装使用过。近日翻看多年来的相关邮件、Github、设计资源、海报展板、宣传资料、公众号文章,发现TUNet的历史充满了各种乐趣,故特此撰文一篇[3]

让我们从TUNet的诞生,及其功能变迁历史开始讲起。

TUNet: 一部历史

TL;DR: 如果你对TUNet的历史不感兴趣,可以直接跳到较为简短的下一章——TUNet: 沉思随笔——来了解我在TUNet的历程中所学到的一些经验。

12年到13年我们团队正处于转型的关键进程中[4]。2013年春季学期伊始,我们仍然在维持旧项目(maTHμ计算机代数系统的内核组以及符号积分组)并探索新方向(Caμs校园开放/数据挖掘平台的Web组)。

TUNet就在我们逐渐放弃高冷的计算机代数系统开发,转而更多探索“用技术改变身边校园生活”的过程中诞生了。伴随着TUNet的诞生,团队的Android和iOS技术组也应运而生;团队的市场组和设计组也在TUNet参与同学的不断努力中逐渐突显出来。

诞生史

2013年3到5月之间,宋浩[5]师兄找我初步交流了做移动端清华校园WiFi接入工具的想法:那时我们部室还是C楼405那个几平米的小房间,在大家才完成了一次晚间讨论后,宋浩走到我身边,坐下,开始有条理地阐述想法。很快我的双眼就闪起了兴奋的光芒(事后脑补)——以前一代联网客户端MyTunet为代表的桌面时代,被轰轰烈烈的无线网络和智能手机浪潮所淹没;同时清华刚完成了部分公共区域的WiFi部署和校园网改革,手机登录WiFi走web portal过程也是个尚无人关注的痛点……在进一步调研之后,我和宋浩开始大力推进此项目的开发。

决定让团队集中精力做TUNet,可以说是Lab μ、也是我自己最重要的抉择之一;而当时我并没有意识到所做决定对未来的影响。我不知道这个项目会伴随我这么多年的时光,也不知道会历经如此多的坎坷,和能拥有如此多的用户……也许这就是人类历史的有趣之处,我们常以为历史是必然的,而很多时候,连接现在和过去的,只是一个个偶然。《人类简史》和《未来简史》的作者Yuval Noah Harari在他2013年公开课A Brief History of Humankind[6]结课时发给学生的结课信也表达了这个思想,并很好地阐述了我在Lab μ团队所践行的准则,以及写这一系列回忆录的原因,在此再次分享给大家:

Dear 周梦宇,

Our common journey through the history of humankind is coming to an end. I hope that you have enjoyed the course as much as I did, and that you leave the course with a better understanding of history, of the human species, and perhaps even of yourself personally.

People often ask, what is the purpose of studying history? They sometimes imagine that we study history in order to predict the future, or in order to learn from past mistakes. In my view, we should study history not in order to learn from the past, but in order to be free of it.

Each of us is born into a particular world, governed by a particular system of norms and values, and a particular economic and political order. Since we are born into it, we take the surrounding reality to be natural and inevitable, and we tend to think that the way people today live their lives is the only possible way. We seldom realize that the world we know is the accidental outcome of chance historical events, which condition not only our technology, politics and economics but even the way we think and dream. This is how the past grips us by the back of the head, and turn our eyes towards a single possible future. We have felt the grip of the past from the moment we were born, so we don’t even notice it. The study of history aims to loosen this grip, and to enable us to turn our head around more freely, to think in new ways, and to see many more possible futures.

I hope that by introducing you to the history of humankind, this course has helped loosen the grip of the past.

yours,
Dr. Yuval Noah Harari

回到正题,稍后的2013年5月24日,我向当时团队的相关核心成员(宋浩陈光夏雨、裘捷中、汪至诚、王东岳、周而进、邵成徐晔嘉许欣然)发了封邮件。25日我们在部室进行了第一版的讨论和分工(如Fig 2.所示)。当天,我和宋浩讨论决定Android版就叫TUNet,iOS版本叫做iTUNet,我俩开始折腾苹果开发者账号的注册购买。我也去在自己的Github账号zmy下建立了两个代码仓库[7]。从此,TUNet的故事正式开场了。

TUNet Discussion Whiteboard
Fig 2. 2013年5月25日的讨论白板,大部分应该是宋浩绘制。大家可以在上面看这次讨论分工涉及到的一些TUNet早期的参与者名字:周而进、我(周梦宇)、汪至诚、夏雨。v1.0的交互方式和界面也基本可以看出端倪了。

版本历史

下面将TUNet Android、iOS和Desktop版本在Github上记录的版本发布通过时间轴可视化[8],附送上了各种黑历史,请读者自行探索其中的彩蛋🥚。

其中有几个版本的历程给我留下了深刻的印象,下面将她们的故事一一道来:

创业之维艰:Android v1.0


Make it happen. 如果你也曾过亲手将一个个产品一件件事,从幻想变成现实,相信你定然对三个词深有同感。从TUNet的想法出现,到第一个正式版发布,我们花了近半年的时间。而这一切,离不开当时团队10多位同学的协同和付出:

高能预警!!! 我们从13年5月确定TUNet方向,到10月发布v1.0正式版,中间有一个漫长的暑假。不过我们几位开发者当时年轻气盛,期末考试结束之后,就开始了疯狂的开发。TUNet的界面一开始完全就是按钮和文字的拼凑,毫无美感——我们在校园网登录协议、各种参数的黑箱测试、学习Android开发等一系列探索中度过了几个月。直到8月,程序已经功能上基本可用,团队当时的设计师赵延恺加入了TUNet设计,在和我、宋浩多次来回沟通之后,给出了TUNet v1.0的设计稿。8月24日,TUNet的feature list已经冻结了很长一段时间以稳定质量,我们自己的使用也比较满意了,于是整个Lab μ团队开始四处邀请老师同学加入内测[9]。好了,辣眼睛的图来了:

TUNet RC1 Screenshot
Fig 3. TUNet v1.0 rc1 的截图,当时我们用形象的“表情”来代表连接状态,图中展示的是设备正常在线的“正弦波”表情。截屏于我当时的Galaxy S2手机。

9月百团大战的招新有很多位同学加入了我们[10],包括刚才列出的10多位同学中的几位。在经过了充足的测试之后,2013年10月29日,TUNet v1.0正式版终于发布了。此前我们制作了一系列的海报和易拉宝为TUNet公测版宣传造势:

TUNet Poster
Fig 4. 经典的Maslow's Pyramid改版,以及校训调侃。
TUNet Poster
Fig 5. 好多个瑟瑟寒风的冬日中,我们就站在这个易拉宝旁,口干舌燥地安利用户。

让我十分难以忘记的,是和宋浩在紫荆以及桃李食堂门口,在近一周的就餐时间中,守着Fig 5.中的易拉宝推广产品。记得好几次在寒冷的冬夜,我们俩轮流站在食堂门口,用手机照明灯照着易拉宝上的“停”字,为好奇留步的同学们讲解功能,帮忙安装。现在回想,这些撸起袖子狂干的苦日子,才是最美好的回忆之一。至于宣传效果?请看图:

Number of TUNet Users
Fig 6. 2013年8月1日至11月30日,TUNet Android版本新增用户数。

到2013年结束时,TUNet的用户数超过了1800,日活跃用户超过了600。同学们纷纷要求我们开发iOS版本,各种建议接踵而至。Lab μ第一个用户破千的产品就这么诞生了。

孤独的旅程:Android v2.0

一个人学会与自己独自相处后,漫长的时间也就变得短暂了。

2014年初,宋浩师兄面临毕业,和大家一起又发布了几个TUNet版本之后,功成身退慢慢开始淡出团队。而我则面临着读博士的迷惘期——两年的自由探究尚没有任何发表的成果和明确的方向,每天过着悠哉又忙碌的生活。

5月底,我请了个长假,一个人踏上了周游美国的旅途[11]。在一个月的行程中,我畅游了东西海岸的很多城市和景点,并和从小学到大学的各种同学聚会。6月后,又到了一年暑假,我回到家才知道当时母亲得了重病,而同时我被清华派去四川绵阳的长虹公司暑期实践,提供技术指导,7月长虹的同事带我们参观了2008年汶川大地震的遗址,我再一次感受了心灵的震撼。

暑假之后,8月回到清华时,我之前的抑郁和无病呻吟早已飘散,也变得更加成熟了。充满动力、更加懂得何为担当的我开始主导起了TUNet的下一波开发。

TUNet Screenshot
Fig 7. 在2014年6月时,我Nexus 5手机上TUNet的截图。诸位大侠可以和Fig 3.对比。

到了10月,TUNet的版本号已经慢慢升到了v1.3.1,更多的新加入团队有一段时间的同学(比如岳大禹张阳坤何钦尧、唐磊等人)也逐渐开始参与项目开发。但是TUNet的核心代码,也即后台的自动智能服务,基本只有我一个人在维护——因为之前的代码实在是太紊乱了,缺少注释文档,充斥着临时的hack,以及(在对代码品味提升之后)难以容忍的OO设计。

同时,随着手机屏幕像素密度不断增大,以及交互设计潮流的不断改变,v1.0 UI交互的不当之处[12],以及设计的陈旧低效逐渐凸现出来。14年,Google发布了其新的设计理念Material Design,我当时如获珍宝,花了非常多时间学习其资料,并下载了基本所有Google官方的Material Design新Apps来疯狂研究常见设计和交互模式。

TUNet UX Draft
Fig 8. 2014年10月26日拍摄的,我画在405墙纸上的一稿设计。

在和当时团队的主力设计师孙悦慧多次讨论中,我脑海中的TUNet界面不断发生变动。慢慢地时间来到了12月,此时临近期末,TUNet的重构任务最终都落在了我的身上。那段时间我基本上每天早出晚归,一个人宅在实验室,对着一个电脑屏幕、一个手机屏幕、一堆充斥着界面和代码结构的草稿纸,不断地调整、推翻、新添、再来。

最终,在修改了基本所有从界面到后台的代码,揉碎了原本的各种设计之后,长时间的思索和努力,在2014年圣诞到2015年元旦之间,豁然开朗。整个界面焕然一新,程序后台的接口得到了充分的精简、改进和抽象,TUNet的2015元旦版本顺利发布了[13]

TUNet v2 Screenshot
Fig 9. TUNet v2 屏幕截图,从此之后直到现在的v3.4,TUNet的界面交互设计都遵循着这一版的底子。

2014年底这段孤独奋斗和求索的时光——亲自完成大部分TUNet界面的交互设计,以及对TUNet Android代码的全面重构——让我真正成为了一个有自信的全栈工程师。当之后在Lab μ和科研中面对复杂的问题时,我都能勇敢地于去面对和解决。也许每一个人,都需要这样的逆境来重塑和定义自我吧。

那天的朝霞:iOS v1.0 & Android v3.0

宇宙终会归于死寂,人所创造的一切也是,包括每个人。
也许写过的代码终将化作春泥,也许辉煌的产品总归无人问津;
但最难以忘记的,是并肩时的百感,历程中的千味;
那天的月光,永远的朝霞。

TUNet初版发布之后,要求推出TUNet iOS版本的群众呼声一直很高。到了14年中,对iOS开发感兴趣的张阳坤和我,开始将Android版本的部分实现思路,转移到iOS上来[14]。整个14年底到15年4月,基本都是张阳坤一个人在各种探索iOS的坑,付出了大量的精力。到了15年5月,我参与到iTUNet v1.0最后的改进中和张阳坤并肩作战。

Do not go gentle into that good morning.[15]

在5月30日到6月2日三个通宵的奋战中,iTUNet终于完成了打包,提交了上线审核申请。而这次审核花了将近两周,让我们再一次体会到了作为Apple开发者的痛苦——基本上每天都要跪着喊苹果爸爸(我们为iTUNet申请管理iOS系统WiFi连接的权限,也是个痛苦的过程;同时还要每年进贡99刀,为我们的开发者账号续命)。

Early Morning
Fig 10. 2015年6月2日早上5点28,我走出C楼学生活动中心,对着升起的朝阳,咔擦发出了朋友圈:“Do not go gentle into that good morning.”

与iTUNet v1.0同时,我们还在大力推进TUNet v3.0的开发。从12年的Caμs校园开放平台开始,团队的同学们就一直在思考如何将网络学堂和信息门户等处的冗杂内容,更加有效地展示给用户。在2015年4月的清华创意大赛上[16],我们将2013年清华创意大赛中Caμs校园开放平台(当时获得三等奖[17])在网页上重新展示校园信息的想法,转移到了手机上的TUNet的插件中,获得了一等奖和最佳人气奖。6月9日,我们将学堂助手、GPA计算器、课程表这些插件想法,成功搬进了TUNet,发布了v3.0。

Github Record
Fig 11. 到了2015年6月9日,我已经连续狂写代码25天了(Github记录)……

当时张艺莹主力维护的团队公众号,连续两天发布文章:《打开WiFi起来嗨,TUNet 3.0等你来》,《谁说大新闻一次只能搞一个,iTUNet正式发布啦》。朋友圈的好友们纷纷响应,iPhone用户们也难得地抱怨没有Android用户的福利。当做产品踌躇和疲惫之时,用户反馈的正能量,能顶三管鸡血。

2015年6月27日的春季总结会上,我任命了张阳坤、岳大禹、何钦尧、张艺莹担任副会长,对他们在团队的积极活跃做出了肯定。同时我在plan presentation中,将TUNet v3.0插件的想法进一步扩展,讲述了Tsinghua Now即刻清华的明确目标,以及CaμsKit的初步想法。而这些,又是另几篇回忆录的故事了。

探索与智能:Android v3.2

什么是智能?哪里是人工智能的边界?一个登陆WiFi的应用,是智能的么?

伴随着TUNet的普及,知晓我们的同学越来越多。其中,来自计算机系的博士生隋楷心,就在14年底和我联系,交流讨论校园WiFi网络优化的研究。由于她和学校的网络中心合作,分析整个学校WLAN的SNMP数据,而我带领的Lab μ,拥有大量的TUNet用户,我们一拍即合,很快就开始了各种思维的碰撞。在一连串的讨论中,我们产生了用大量数据和机器学习,来改进企业级WiFi网络的性能及客户端WiFi体验的初步想法。

最终经过将近一年的积淀,我们合作的论文 Characterizing and Improving WiFi Latency in Large-Scale Operational Networks 被MobiSys'16录取,论文中我们提出了WifiSeer系统,其基于企业级无线网络收集的大量数据搭建,来刻画和改进WiFi网络延迟:

WifiSeer Framework
Fig 12. WifiSeer系统架构,其提供了三个应用:1. 帮助理解各种无线因素对延迟的影响;2. 诊断无线网络高延迟的根因; 3. 帮助客户端选择低延迟的接入点。

手机接入WiFi的过程中,一个经常被大家忽视的问题是:信号强度最强的WiFi接入点,并不一定体验最好的——无线信道作为共享的媒介,信号冲突反而比信号较弱更容易造成问题。在清华拥挤的教学楼上过课的同学,大都有过连上满格信号却卡得要命的WiFi体验。当我们再进一步,考虑影响WiFi体验的各种各样因素——从时间地点,信道环境,到设备型号——对WiFi客户端来说,做出较优的选择是件非常困难的事情。

AGE Framework
Fig 13. AGE (Associating to Good Enterprise APs) 应用框架。

于是WifiSeer的AGE应用(Associating to Good Enterprise APs)应运而生,其中TUNet发挥了重要的作用。我们在TUNet v3.2中,附加实现了WiFi接入点智能选择功能:当TUNet设备接入到校园网时,会定期将四周的接入点列表发送到WifiSeer服务器,通过实时的测量数据,用机器学习模型来预测哪些接入点可以提供较低的延迟(因为客户端尚没有连接上,所以只能预测而无法测量延迟),并指导TUNet设备切换接入点。最后我们邀请了上千位同学,体验了近3个月的接入点智能选择服务。效果?拔群:

  • 92%的指导切换实际降低了延迟
  • 50%的切换将延迟减少了超过7.5ms
  • 72%的情况下延迟减少了一半

什么是智能?也许能让用户省时省心,是AI算法的道德底线吧。

最后的遗产:Android v3.4 & iOS v2.1.2

2016年5月底,我主动卸任担当了6年的会长职务,以给小伙伴们留下更多的发展机会,并期望毕业前最后一年中能培养起继任者的领导能力和主要项目的接班人。2016年的下半年,我各种忙碌于科研、参会、作报告、找工作之中,只抽出来时间和张浩然[18]一起,完成了当时所有产品线中唯一没有发布的Tsinghua Now即刻清华iOS版本。

17年2月初,新学期伊始,看着半年多没有更新的TUNet,我再一次挑起了重担,将中断的重构继续,带着TUNet的新老骨干们,从头到尾经历了一次产品新版的发布。这一次,我仿佛在自己身上看到了3年前宋浩师兄的背影,而这些和我一起默默并肩做事的同学中,多年后定会有很多比我活得更加精彩。或许还可以庆幸的是,TUNet这次新版发布,正好赶上了我的生日;之后回忆今朝,一起奋斗过的小伙伴们定还会从记忆中浮现,让人缅怀象牙塔中青春的热血澎湃。

Legacy of the Void”,虚空之遗[19],这是我卸任会长时,给大家的keynote主题。亲手带着一个产品从无到有,亲眼看着用户数量一次次翻升,最后再亲自把她交给成长起来的团队后人们。整个过程的感受,就像从虚空之中创造了物质,合成了生命,最后把这一切辉煌留下,转身离开。每一位父母,都会目送着自己的儿女,长大离开,迈向远方。

TUNet: 沉思随笔

之前的一章,更多是感性地回忆。这一章我将尝试从TUNet几年的项目管理和各个环节的经验中,提炼出一些我觉得最有价值的insights。由于篇幅限制,很多关于整个Lab μ团队的更多思考,将在我之后的回忆录中再写出。

人与猿

除了timing之外,创业[20]最重要的因素,是人。

1. 合伙人

Without someone dedicated to finding a solution to all problems, no matter how difficult, eventually a large problem will come along and kill you while you’re still weak. Founding teams need a Chief Optimist to rally everyone to press on despite the difficulties, and it’s always hard on that person because they can’t really lean on anyone else in the hardest times.

理想的创业合伙人长啥样?Sam Altman在他的一篇博客给出了答案:他的 OpenAI 公司的合伙人 Greg Brockman——极快的速度写代码、不断拉入牛人、听得进意见、愿做技术之外的脏活累活。在Lab μ团队的发展历程中,这样的人凤毛菱角。

长期地专注和坚持,也是做一件事情成功所必备的精神。TUNet的成功,就离不开一年又一年的持续改进和自我革新。项目、创业、工作、人生,马拉松的跑法和100m的跑法是完全不同的。

2. 程序猿

不同类型的项目,对团队成员的技能配置要求非常不同。而Lab μ校园极客社的项目中,工程师占据了非常重要的角色。我自己也算是一位有着超过15年编程经验的猿类。故而对TUNet团队中工程师们的组织和协作分工有些有趣的分享。

Commits of TUNet Code
Fig 14. TUNet Android, iOS, Desktop所有代码提交者的commit数量统计。

如Fig 14.所示,TUNet项目的前5个人(28位代码贡献者的17.9%),贡献了80.9%的代码提交。很眼熟对吧?这就是人们常常挂在嘴边的“二八定律”,又名80/20定律、Pareto法则(定律)、最省力的法则、不平衡原则、长尾理论等。在社会学、网络科学等领域的研究中,也常常将这种分布称为power law distribution(幂律分布),也即数量指数衰减的分布。比如社交网络中,所有人好友数的分布,也遵从power law,而这所引出的scale-free network的概念,也在我们身边随处可见。

知道了power law分布有什么用呢?首先,我们要理解,人类的认知,对于指数变化的数量非常不敏感。比如对于项目的贡献,在没看到Fig 14.之前,很多人会潜意识地用线性回归来拟合所有人投入的精力——比如若不实际计算,我也很难相信TUNet的代码提交,我和张阳坤两个人就占据了超过一半。其次,关注这种不均衡的分布,能让你更好地分配资源和精力。如Fig 15.所示[21],大部分团队平均来说,都是只有不到20%的人积极地参与到团队活动中,剩下的大部分则是不主动的,甚至还有不少脱离/破坏团队的人[22]

Team Member Engagement
Fig 15. 一个团队中,绝大部分人都是被动或者脱离的。

近段时间读到一篇文章,其中提到的maker vs. mender的两种不同开发者类型也都在Lab μ团队中见到过。

有的开发者喜欢从头创建项目,这是maker;但也有人喜欢不断改进一个项目,这是mender。团队中最好两种人都要有,让maker去做实验做原型,让mender去把已有项目提升更高的高度。

3. Stakeholders

和stakeholders的交流沟通,是很多团队容易忽略掉的事情。而TUNet的成功,离不开清华交叉信息研究院、信息化技术中心(包括网络中心)、计算机系多位老师(如裴丹、李贺武等)及他们的实验室的支持。大家可能会很困惑,前面的创业之维艰一节,为何要专门列出宋浩和我的“沟通”角色?我们当时花了大量的时间做下面的事情:

  • 和信息化技术中心的马云龙、付小龙等老师沟通交流,了解校园网建设详情,索要协议实现代码,邀请老师们加入测试和给出反馈。
  • 和AtTsinghua团队讨论合作,了解他们的产品情况,探讨连网体验改进的方式。
  • 和交叉信息研究院的讲席教授Thomas Moscibroda沟通,向姚期智介绍我们的工作,请叉院为我们的TUNet产品背书。
  • ……

这些和TUNet紧密相关的老师同学,也是其成功不可或缺的一环。

移动应用沉思

为什么开发Mobile app如此之难?《This is why most mobile development projects fail》一文吐槽了移动app开发之艰难,认为网站开发容易多人分工(前端、后台、运维),而app的开发者都得独当一面,因为app的前端代码(UI)与所谓“后台”(业务逻辑)高度耦合。

In a web app, you’re either the frontend or backend developer.
In a mobile app, you’re the app developer.
Mobile development = frontend development + backend development + dev-op.

也许正如文中所说,由于移动开发的高度耦合,最终程序出现的任何问题,都会很容易被一股脑丢锅给开发者。而这一切,需要更好的沟通、更好的设计指导,以及更强的开发技能同时发展。

If anything happens:

  • If the app doesn’t install on the client’s device, it’s your fault.
  • If the app fails to match the design pixel perfectly, it’s your fault.
  • If the app crashes, it’s your fault.
  • If the app is slow, it’s your fault.
  • If the app generates unexpected results because of an unforeseen edge case, it’s your fault.

在移动应用的开发中,权衡和选择是开发者们永远的难题:要酷炫的UI,还是稳定省事的实现?要原生的Android & iOS代码,还是只写一份Xamarin/React代码?要用新潮的库和框架,还是保持稳定更重要?哪些功能要自己开发,哪些要用第三方的服务?…… 这些问题常超出技术范畴,就像面对同事写的垃圾代码,怎么做不只是个技术问题一样。

更多思考

关于团队的组织架构、内部沟通、项目管理、自动化、质量控制、用户沟通、市场宣传等等,TUNet的历程中我也学到了很多,会在之后的文章与大家分享。

TUNet: 永无止境

TUNet清华自动连网助手赶上了WiFi和移动应用的浪潮,下一波浪潮来了么,在哪里?新的小伙伴们都逐渐成长了起来,TUNet项目的延续也走上了正轨。希望团队的同学们,能像当年的我们,一次次赶上浪潮,向巅峰冲刺。

TUNet的应用图标是希腊字母μ,也是我们Lab μ校园极客社的代表字母。由于处在所有24个希腊字母的正中(第12个),故而寓意也十分美好——永无止境,永远前行。

愿我介绍的TUNet历史,能让你从过去松绑,获得更多的自由和动力,继续前行。


  1. 包括TUNet清华校园网自动连网助手 Android v3.4 和 iOS v2.1.2。请前往http://tunet.lab.mu下载安装。 ↩︎

  2. 我是周梦宇,Lab μ的创始人、顾问、前任会长(10年~16年)。读者可以访问我的个人主页http://zmy.io或回忆录序章 Lab μ: A Memoir From Α to Ω 了解我。 ↩︎

  3. 此文属于《 Lab μ: A Memoir From Α to Ω 》回忆录系列。 ↩︎

  4. 我们做了多年的maTHμ计算机代数系统由于已不再是热点、门槛过高、产品无人问津等缘故,到了13年已难以为续。而我们在之前就开始的各种尝试(譬如Caμs校园开放平台获得校园创意大赛三等奖,清华吃货应用界面和激励策略机制的设计),展示出团队同学们有极强的coding实力和脑洞。当时我们觉得,若能用我们的工程能力,解决校园学习生活的切实问题,不妨是一条更容易、也更受欢迎的道路。于是2013年3月,我将团队名称改为了“Lab μ 哞!实验室”(之前团队正式名称是“清华大学学生maTHμ研究协会”,成立于2009年,团队的简史请参见 Lab μ: A Memoir From Α to Ω ,而团队名称的变动历史和缘故,将在另一篇回忆录中阐述)。 ↩︎

  5. 宋浩是当时团队技术顾问,之前一直是maTHμ计算机代数系统的开发主力,给予了我非常多的帮助和支持。宋浩2014年从交叉信息研究院博士毕业之后一直在Facebook工作。 ↩︎

  6. 这门公开课现在Coursera已经不再提供,Yuval在教授这门课程时,《人类简史》尚未出版。在Coursera的工作人员14年来北京,邀请北京学习课程最多的几位同学参与活动时,问我们最喜欢的课程是什么,我毫不犹豫地说是A Brief History of Humankind这门课程。从去年开始,Yuval终于因为他的著作火起来了,现在回顾起来,好的思想终究会被大家所传播。 ↩︎

  7. 欢迎follow我!另外请允许我吐槽一下,当年Github还没有什么education优惠,所以一开始作为学生每个月都要交费,后来我去注册了Lab μ的Github organization,又开始了另一波缴费,全是血泪史啊… ↩︎

  8. 使用工具:TimelineJS↩︎

  9. 感兴趣的同学可以去我们当年人人网的公共页面查看这次内测邀请↩︎

  10. 当时我们团队还没有正式的面试,而我则会和每一位加入的同学一起吃一顿饭,阐明我们的vision——包括TUNet。 ↩︎

  11. 当时我们Lab μ和学校一起在和edX合作,本来要安排我去美国接受培训,但最后因为小伙伴check而没成行。于是我便在父母的建议之下,拿着现成的VISA出发了。 ↩︎

  12. 比如TUNet用户和我们面聊时表达出的各种困惑:那个“自动服务”开关有什么作用,通知栏里的“保持断网”状态是个什么东西… 我们观察用户访问各个Activity的统计数据,发现原本设想同等重要的3个Fragments访问比率差别很大,重要的信息被稀疏地放在了不同的页面… ↩︎

  13. 当时我们的微信公众号“清华大学Labmu”才建立没多久,由张艺莹同学积极地运营,我们元旦更新玩了一发EVA的2015年使徒入侵梗,欢迎前去温故→传送门 ↩︎

  14. 其实TUNet的iOS版本,比Android版本更早发出alpha版。最早宋浩师兄用的是iPhone,所以为了满足自己的需求,他直接实现了一个只有最基本上下线操作的版本。 ↩︎

  15. "Do not go gentle into that good night"是Dylan Thomas出名的诗篇。 ↩︎

  16. 主要是何钦尧做的presentation,岳大禹配合展示,据现场同学说非常给力。这次创意大赛上iCenter的老师对我们团队产生了兴趣,也为我们之后再李兆基科技大楼的新部室埋下了伏笔。 ↩︎

  17. 当时我、张帆、夏雨,在各种刷夜之后,做出了精彩的展示,最后决战前3名,两次投票因为支持我们的信息化技术中心老师有事离开,连续以1票失落,可惜错过第1名。 ↩︎

  18. 张浩然是张阳坤之后的iOS组组长,清华计算机系本科生。 ↩︎

  19. 是的,我是一位StarCraft星际争霸爱好者。 ↩︎

  20. 我的回忆录中,“创业”使用的是其较为宽泛的含义。 ↩︎

  21. 图片来自公开课Inspiring and Motivating Individuals。 ↩︎

  22. 如何让更多的人engage到团队中,这是个能讲上一周的话题。 ↩︎