2020 年算是彻底结束了,像往常一样,我又打开了自己的博客,开始写下这篇我从本科开始就 坚持年更类型的文章。这一年里看似发生了许多,以至于在一年的最后一天我还在办公室里加班。 要说这一年里最大的收获是什么,可能会总结为两个字:转变。
到了博士阶段,也就不能像是本科、研究生那样只扩宽自己技能的广度,需要更多的专注在如何将自身 的能力做深度的培养(尽管学习的时候是系统性的学习,但如果没有长期实践这些知识的话,也只能作为谈资, 毕竟整个社会对专业技能的评价是取决于做过什么贡献,而非学习过什么)。
本科阶段的思维很活跃,对事物总是过目不忘,从大脑里存取知识几乎没有延迟, 但随着年龄的增长(说得好像我已经很老了一样),越发的感到这个存取的延迟在增加。 这可能是几方面原因导致的:
- 大脑内知识的存取和计算机硬盘的工作原理依然很相似,在脑子里存放的东西越来越多。 曾经在学习的时候整理有序的知识体系,也随着时间的推移躺在硬盘里甚至都不记得曾经把这些知识放进过脑子里;
- 所接触的领域知识越来越深入,真正能非常系统的理解所在领域的人非常少,也就很很难就同一领域的话题进行讨论, 进而得到的反馈与沟通也相对较少,也就不那么容易形成比较深刻的记忆;
回想一下自己从一个完全没有接触过计算机编程的本科新生到现在,也不过七年的时间,而这些时间里 可能只有三年的时间是真正全神贯注的扑在计算机领域的。 今年做了非常多的系统性的总结,将自己曾经的部分积累,最终以教学演讲幻灯片的形式进行输出, 毕竟这些工作算在今年整体工作的占比较大,就从教学工作的回顾谈起吧。
为人师,德以配天地
很多人以为读博士就是读书写论文,跟研究生区别不够显著。但实际上攻读博士学位只是 平时工作中的一部分。我在高校里主要承担的很大一部分工作其实包含了跟业界伙伴的项目合作、 在高校的教职等等,取得博士学位从某种意义上算是一个附带的产物。
除了科研本身(写论文)、做项目这些暂时还不能敞开聊的内容之外, 要说这 2020 一年里所发生的与我联系最紧密的事情,可能得从 2019 年的 10 月份说起。 从那个时候起,我开始作为一名 Teaching Assistant 正式在一所德国的公立大学里承担教职工作, 包括给本科生和研究生上课、指导本科生和研究生的毕业论文等等。这也是我一年中花费精力最多的部分。
妥协与折中
我在大学里教授的第一门课便是我曾经最喜欢的几门课之一的 「Online Multimedia」, 这门面向研究生的课程涵盖的面非常广,从最基本的 Web 前端多媒体技术谈起,介绍了数字版权 甚至于多媒体技术兴起对社会来带的影响和变革。这门课在当时(2016 年)看来内容非常 的新颖,但在 2020 年前后看来从某种程度上已经不再那么的兴奋了。
在这门课开课之前(19 年 10 月份),这门课的教授 Huassmann 找到我,希望我作为他的 第二助教来承担一些教学工作。当然跟以前一样,我对承担这类责任比较大的工作时首先表现出来的 自然是不自信,所以最初给教授的回复是,毕竟比我入职更早的同事有很多, 我个人对 Web 技术的实践也不过来自我曾经实习期间做过的一些项目 (话虽这么说,但内心其实想的是:天道轮回,终于轮到我来给这门课做一些变革了)。
所以在学期开始之前,教授、另一位助教同事 Florian 和我在第一次 Kick-off 会议的时候 我就毫不忌讳的提出了这门课的些许内容需要进行一些升级,比如说 Web 前端技术里的 Angular 已经不再是这个领域首选、早些年服务端编程中大热的 Node.js 早已被时代给「抛弃」、课程 应该更多的覆盖这些年里 Cloud Native 中发展出来的各种 Web 基础设施。我甚至直接建议 将这门 Full Stack JavaScript 为设计蓝本的课整个用 Go 「重写」,我非常有热情来做这件事情。
当然,开始的时候教授就表达了极大的兴趣,并没有对我的提案表达出任何异议,整个会议 在一片祥和的氛围中结束了。不过事与愿违,真正到课程进行到一半, 也就是我认为需要进行改变的时候,无论是教授还是另一名同事都没有任何行动。 直到后来眼瞅着只有一周时间就要到我提议说需要改变的课程内容时,我实在是耐不住了就写了 邮件再次询问,才得知他们的真实想法:想法很好,但工作量很大,做出这种改变很危险, 我对这些新兴的领域还不够熟悉,不利于教学。
于是我只能妥协并无奈的将早早准备的将整门课从 JavaScript 切换 到 Go 的入门课件顺利抛弃掉了 (https://changkun.de/s/golang-intro)。
当然这并不是终点,既然不能摆脱掉 JavaScript 的命运,仍然可以用 JS 来涵盖那些希望 覆盖的主题。作为折中,我只重新设计了前端的部分(从 Angular 切换到 React):
并将后端主题与流媒体技术进一步结合,将这门面向研究生、但后端技术仅停留在 CURD 的课 进一步扩展增加了一些关于系统设计的主题,并介绍了 Docker/K8s 这些概念:
- https://changkun.de/s/media-streaming
- https://changkun.de/s/web-infra
- https://changkun.de/s/media-outlook
跟教学不仅仅只有课件,还包括习题等,这些内容都存放在这个 Git 仓库 里了。
虽然得知教授表面上同意但内心上并没有打算要做这件事情时非常沮丧甚至有些气愤,但事后回忆起来, 毕竟教授作为整个计算机学院的几个领头人之一,每日除了教学工作之外,还有数不清的教务工作, 也能对这些事情表示理解。至于另一个同事,可能只是单纯的对教学类的工作不够感兴趣罢了, 这个无伤大雅。
失望大于期望
时间来到了 2020 年的 3 月,这个时候疫情在全球爆发,欧洲是重灾区。 但教学任务不能耽搁,大学的教学工作还是得继续,学生依然得上课。好在 3 至 4 月是德国 大学教学年历中的寒假,也就留出了足够多的空隙给整个学校的教学计划做调整。
进入博士第二年的我,毫不意外的开始负责一些与我专业领域强相关基础课的教学: 计算机图形学。 这也就成为了我在今年 4 - 6 月期间全身心投入的一个教学工作。和第一门课一样, 我对这门课进行了大量的重新设计,增加了大量现代图形学中不应该回避的主题: 手动实现光栅化管线的算法细节、全局光照技术的实现细节等等。 重新设计并制作这些课件、设计前后互相关联的习题,成为了我非常 Enjoy 的一部分工作:
- https://changkun.de/s/cg-1-math
- https://changkun.de/s/cg-2-transform
- https://changkun.de/s/cg-3-geometry
- https://changkun.de/s/cg-4-camera
- https://changkun.de/s/cg-5-raster
- https://changkun.de/s/cg-6-material
- https://changkun.de/s/cg-7-illumination
- https://changkun.de/s/cg-8-review
- https://changkun.de/s/cg101
- https://github.com/mimuc/cg1-ss20
- …等等几乎一整套完整的从零开始学习图形学核心知识的路径
当然,图形学里的主题并不是那么的简单,除了对知识有足够深入的理解,在编码能力上还有很高 的要求,比如在实现光线追踪的时候,理解下图中的公示可能很简单,但真正将这段公式转换为代码 还是需要非常多的前期准备工作的(以至于这门课都没有选择使用 C++ 和 OpenGL 作为编码工具, 相反而是使用了比较容易上手,可以绕开很多与理解图形学中核心主题无关的纯技术细节的工具 Node.js 和 three.js):
虽然我在课程涵盖的内容设计上已经避开了很多算法和主题(比如光线和三角形求交这类非常基础的算法、 近些年来研究领域非常关注的动画相关的主题), 但这仍然导致了这门课的作业提交数量呈指数级下降(意料之中)。
可能是由于疫情的影响,几乎每个人都还沉浸在在家办公、学习带来的极度不适应的氛围中。 我本着能够让学生学习到更多有用的知识而重新设计的整个课程(至少我认为这是在做正确的事情) 原以为至少能够培养一些可以和我一起做研究的本科生时,反而没有收获足够的感激, 倒是从第二堂课就开始不断的有学生向教授抱怨和攻击我:
- 习题的数量太大没有时间做
- 习题的难度太大完全没办法理解
- 习题和课程讲授的内容不匹配
- 课程讲授的内容对考试毫无帮助
- …
当然,我并没有对这件事情非常的在意,毕竟这些抱怨不仅没有逻辑可言也很难站住脚跟,比如: 每道编程的习题工作量不超过 50 行,而且这些作业完全是自愿的而非强制的,既没有评分也没有奖励。 如果学生觉得难度太高,完全可以不做,等着下一节课讲完习题答案之后再自己深入学习;至于 抱怨课程讲授的内容对考试毫无帮助,据我所知,完完全全只是是因为前一年的考试题目被泄漏过, 而学生发现新加入的内容没有出现在去年的考题中而已。
最终,这些怨念不断的累计,终于在期末的考试前后集中爆发。在六月的时候,教授召集我和另外一名 同事一起讨论考试的形式(因为疫情的影响,线下考试已经是不可能了)。我作为助教的第一负责人, 以往届的传统,考试题目的设计、考卷的批改最终都会落到我的头上,既然线下考试不再是可选项, 线上考试需要避免学生的作弊行为,我也就主动提议采取线上编程的形式进行考试,为期一个月的时间, 一共涉及三个编程项目。当然这期间还有很多来回的争辩,比如说教授认为全部用编程进行考试可能 太过片面,还是需要进行一些书面性问答类的考试,所以最终的考试形式确定为: 两个图形学的编程项目(一个是 7 天内实现太阳系、一个是 14 天内完整实现光栅化管线,工具限制为使用 Node.js), 和一套与传统线下考试形式几乎一样的文字问答类的考卷(为期 5 天)。
经历了为期一个月(7 月)的考试,最终的考试很不如人意,在德国的评分体系中, 5.0 表示挂科,4.0 表示刚刚及格,而 1.0 表示满分。从最终考试结果的统计来看,通过率只有 66.1%:
这个结果其实跟往年图形学的考试结果非常类似,比如 2018、2019 年考试的通过率也只有 65%, 从某种意义上来说,这一年的考试反而比往年线下考试表现得稍微好那么一些。 但在整个考试进行结束的一周内,不断的有学生来信抱怨:题目看不懂、题目出得很差、 课件上找不到答案等等;有些学生甚至抱怨说:我连 Google 都找不到答案?怎么考?
所有的这一切,在八月份我和同事完成考题批改后成绩公布时,被一群气愤填膺的学生给「告」到 了学生理事会(其中有一个很有代表性的学生,这个学生去年考试低分飘过,今年来刷分,结果却考挂了), 这也成为了我这一年中非常独特的经历。他们的论据包括但不限于:
- 习题太难,不适合学习(我的观点:大学不是服务行业,你们有什么资格来对教师的工作品头论足?)
- 课堂讲过的内容跟考试无关、考试题目没有在课堂中涉及(我的观点:你们连课都不来上,作业也没认真做过,有什么资格说这些内容没有在课堂涉及?)
- 考试结果跟往年比难度大幅增加,最终的结果「肯定」比往年差很多(我的观点:不实的论据,所以后来查证通过率显示最终的考试结果比往年要好)
- …
经过学生理事会的调节工作,为了平息这群学生心中的怒火,我又只能做出妥协,最终提出了一个将成绩 进行伽马变换的方案,将最终的通过率提高到了 89.8%,在这里可以看到成绩变换的具体方案。
从 11 月以来我又开始主导另一门更加深入的课程《几何处理》,要说之前的课还有教授负责讲座的部分, 而这门课完完全全有我来主导,我一人统揽了上课、习题、指导等 99% 的工作:
- https://changkun.de/s/gp-0-org
- https://changkun.de/s/gp-1-intro
- https://changkun.de/s/gp-2-ddg
- https://changkun.de/s/gp-3-smooth
- https://changkun.de/s/gp-4-param
- https://github.com/mimuc/gp-ws2021
不过随着这门课的难度逐步深入,参加课程的人数也从最初的 50 多人,到现在的课程过半,只剩两人了。 虽然只剩两名学生,但至少证明还是有愿意学习这个领域的学生的,希望他们能够坚持到课程的最后 :)
当不再心怀感激
从种种的斗争、质疑和负反馈中挣脱出来,这一年里我总是不断的问自己:
- 为什么这里的每个人都非常不愿意做出改变?是我的问题还是他们的问题?
- 为什么这里的学生这么的怨声载道?遇到一点点的困难就退缩?是我的做法有问题还是他们本身有问题?
- …
这些经历我与身边的人分享过,我本以为能够听到一些观点,却从一些人的口中得到了这样的反问: 你为什么要做这些事情?你做这些有人感激你吗?你能从中收获什么呢?那你还在刁难学生吗?…
从这些人的口中,我似乎看到了我变成了曾经本科阶段那个被大部分人唾弃,以经常让学生挂科而闻名, 但却是我自己非常欣赏的一位在教学上认真负责的老师,我在计算机领域的很多「启蒙」知识, 都是受这位老师的指引。今年的这些经历,似乎让我仿佛成为了那个他。
我做这些工作都是为了什么?是为了刁难学生吗?是为了让他们都挂科吗?为什么我的好心好意 得不到这些人的认同?从我开始承担各种教职工作开始,开始不断的从人的口中听到「欧老师」这个称呼。 这个称呼其实是暗示人生迈向下一个阶段的标志,如今的我已经彻底的从他人口中 轻易获取正反馈的学生阶段中脱离开来,完成了角色的转变,自然也就不那么容易获得正向的反馈。
我仍然记得曾经在《礼记》中有过学到过这样的一段: 为人师者,必先正其身,方能教书育人,此乃师德之本也。 对那些认为我在「刁难」学生的人,我只是在心里默默回应:道不同不相为谋。
领域之外
To Go or Not to Go
2019 年的时侯我的大部分在业余时间都用在撰写《Go 语言原本》, 也是因为编写这本书的的原因,结实了国内 Go 语言圈内的许多大佬。
《原本》这本书在今年二月份的时候其实已经基本完成一本书前半部分运行时部分的写作大纲。 是的,大纲,实际的内容还需要非常多的重写和润色。 毕竟最初(2018 年)写作的目的并不是给其他人看的,因为我希望深入了解的这些知识 在当时的环境下并没有太多相关资料,所以我自己对研究源码的一个总结罢了, 只不过随着关注的人数越来越多,而在成书的过程中因为希望让内容更加长久 而有价值的保留下来时,逐渐演变成了一本希望介绍 Go 语言设计哲学和理念的书。
就在我差不多开始着手准备手规划有关编译器部分的内容,并把它定为我的年度计划之一时, 我偶然间发现了另一本无论从内容规划还是写作目的都出奇一致的同类作品 《Go 语言的设计与实现》,这个在我开始撰写《原本》 之前是没有的。在扫读了大部分内容之后,我毅然决然的决定了停止维护《原本》,并且还写了一篇 博客文章 来表达当时的心情。 现在事后看来,博客文章里面提到的一些想法还是有些过头了,因为我们可能只是单纯的在相同的时间点 想要做相同的事情,而彼此没有发现对方罢了。
所以《原本》最初的创作价值观其实与回形针在他们的年度回顾视频中 提到的价值观是存在一定共鸣的:「我们希望为中文互联网创造一些可以留下来的东西,一些在多年后仍然会有价值 的内容,一些我们不做就不会有人做的东西,我们要做的就是填补空白」。 既然有人愿意并希望把这件事情做的更好,那我也就认为《原本》也没有必要再进一步维护和更新了。
现在回顾看来,这个决定是对的,我腾出了更多的时间专注在我的专业领域的精进、与业界伙伴的合作项目上(即加班)。 这么久之后再重新点开《设计与实现》这本书时,内容上似乎也没有再做过多太多的更新, 很多我停更《原本》前还没来来得及研究的内容,本来期待这位作者能够涵盖,却也都没有再进一步增加,虽然不知道是什么原因, 但也是比较可惜的事情。
停更《原本》的几个月之后,在杨文 的撮合(大力赞助)下,注册了一个 新的域名 golang.design,并创建了一个新的项目 golang.design/history, 将我自己为了撰写《原本》而积累的与 Go 相关的资源进行了重新整理,并开放了出来,也算是对停更《原本》 的一种延续。
在 11 月的时候,重启了 2019 年年底就计划做,但坑了近一年的播客节目 talkgo.fm, 还在第二期节目就非常幸运的邀请到了 技术理念上同样有着很多共鸣的蒙卓(这期节目是我剪的,参见节目末尾的彩蛋 :)
回顾这一年,除了年初的在 Go 夜读做过的分享:
与几个用 Go 写成的(小打小闹的)开源项目之外(虽然还有些工作上用 Go 写的、但没有开源的商业项目):
- https://changkun.de/s/midgard
- https://changkun.de/s/redir
- https://changkun.de/s/bench
- https://changkun.de/s/ssaplayground
- https://changkun.de/s/code2img
- https://changkun.de/s/tli
- https://changkun.de/s/upbot
- https://changkun.de/s/rmtrash
- https://changkun.de/s/lockfree
- https://changkun.de/s/go2generics
- …
似乎很难说服自己为什么要跟 Go 产生联系。 毕竟计算机图形学,由于很多历史原因是 C/C++ 在统治(题外话:我本科时期写的一本有关 C++ 的书 已经突破 12k 的 star 了)。 To Go or Not to Go? It’s a tough question. 我为什么要使用 Go?可能只是存粹被这门语言设计哲学所吸引吧。
疫情
疫情呢?似乎 2020 这一年里最重要的事情都没有提及?对我的生活产生了什么影响? 确实,年初的时候我专程请假回国陪父母过年,本以为能够过个比较舒适的新年,却恰好那个时候 疫情在国内爆发,年后我顶着疫情肆虐的风口顺利返回德国,有预感却没想到不到一个月时间 疫情就开始在欧洲肆虐,直到现在都没有结束。
要说疫情对我生活造成最多的影响,要数我这一年里原本计划的行程都取消了, 原本五月份 CHI2020 夏威夷参会行程和造访硅谷的完美计划也惨遭取消, 甚至机票钱至今仍有一部分没有追回;每年年末圣诞节的保留项目滑雪, 也因为疫情的原因边境和雪场双双关闭无法出行,好在年初刚回到德国的时候有因为 研究组举办的 Winter School 在上课之余还有滑雪的保留项目,某种意义上算是补全了一年一次活动:
10 月上旬的时候在教授的大力要求下,原本因为疫情应该取消的 Internal Doctor Colloquium 如期举行, 去到了心想念想的威尼斯,虽然是工作目的需要去做一个演讲, 但也是这一年中唯一一次比较满意的旅程。
美中不足可能要数从威尼斯回来之后竟然病倒住院两周(不是新冠),也是非常特别的人生经历了。
尾声
记得是 7 月份的时候,我跟一位即将博士毕业准备回国实习一段时间朋友聊到博士之后想要要进业界 还是进一步在学术圈里打拼,无论选择哪一方,在欧洲这个体系下都将是未来很难再选择另一方的抉择, 所以讨论的核心围绕着 What’s Next 进行。 无独有偶,在今年去威尼斯的旅程跟教授、以及昨天的播客节目录制中的嘉宾又或多或少的 聊到了这个话题。现在的我似乎逐渐形成了这样的看法:在职业生涯的初期其实需要很多的敲门砖(例如学历), 同时需要经历很多的选拔(例如面试)来不断的证明自己的能力,但进入到职业发展的中后期, 这条道路其实理应变得更加的顺畅,否则的话我更倾向于整个人在职业生涯发展的格局上的提升还不够高, 甚至还只是原地踏步,因为人生本该就是将道路越走越宽越走越畅的过程。
许多人追求工作上的稳定而勤勤恳恳的工作而不被淘汰, 但换个角度来思考,究竟是费尽千辛万苦从众人中脱引而出,几年后又绞尽脑汁思考下一份工作应该去哪儿来得稳定; 还是发展一个或多个稳定的关系,总是有那么一个人,在你希望更换工作时毫不犹豫的愿意以双方都乐意的条件 雇佣或者资助你来得稳定呢?目前的我可能更倾向于后者。
在 Acquired 播客的一期关于 Indie Hacker 的 节目 中有一个非常触动我的观点: 「Being an Indie Hacker is really about the idea that you can achieve your own freedom. Whatever that means to you. Maybe that’s financial freedom, maybe that’s creative freedom so you can work on whatever you want, maybe that’s time freedom so you can work whatever hours and schedule you want. Being an Indie Hacker is really this confidence in yourself. You can create something that’ll make your life better, make other people’s lives better in the process, and give you that freedom. Maybe that looks like raising a ton of money in the future.」 是啊,实现自我的自由,无论这个自由对自己意味着什么。这不就是当初我硕士毕业,没有选择业界 Offer 而是选择读博士的原动力吗?
2020 年无疑是「挫折」连连的一年,这些「挫折」似乎要比以往来的都要多。 总结归根结底还是因为人生阶段完成了彻底的转变,也许这就是成年后的常态。 希望这张摄于威尼斯准备启程返回慕尼黑略显疲态的瞬间, 能够成为激励我在 2021 年进一步搜寻更能令我满意的答案的动力吧。
欧长坤
2021 年 1 月 3 日 于慕尼黑
进一步阅读的参考
致谢
感谢这一年里身边真诚相伴的朋友们。