① 第 4 周写了前端的 Vue.js 代码,感觉挺简单的,加起来不到 200 行。第 5 周周一(7.12)下午给组长做 demo,然而开始之前半小时出了个大 bug,结果有点尴尬,我当时应该推迟 demo 的时间的,哎。7.14 重新 demo,mentor 和组长给我的 UI、功能和速度又提了些小建议。当然,我个人感觉是,这么个内部工具,要求 UI 好看之类的是不是有点没必要…
② 有新建议时(比如改 dropdown 里每个 item 的名称),经常是看上去只需要加一点代码,但实际上我很多部分都得重写,还好现在我的代码规模本来也不大,所以没关系。7.15,为了加快加载图片的速度,我又搞了个从二进制格式的数据直接在前端显示 jpg(而不是加载 jpg 文件)的小功能。
③ 7.16 周五,Camera View 这个小项目初步完成,就等我 mentor 发布了。我在 git 上出了点操作失误,因为涉及 rebase 等高级的操作,我并不熟悉 orz…之后看了些高级 git 教程、了解了 CI、CD 的概念,好深奥,为啥学校里没有专门的课教 git??组会上大家讨论了发 IPO bonus 的事(没听懂)。
④ 之后 mentor 看了我的代码,做了点 refactor,提了点建议,主要是各个部件之间传数据要用 dict,不要把所有乱七八糟数据都堆在一个 array 里,还有教我利用好 Vue.js 的 computed property。
⑤ 直到第 5 周结束,实习节奏都挺慢的,时间线都是自己控制,感觉波澜不惊;我关于实习的日记只有 2500 字左右,相比之下,我的 RAship 做满 200 小时的时候,我已经写了比这多 3 倍还多的日记。往好了看,是工作轻松、没什么可吐槽的地方;往坏了看,是实习没啥挑战。
⑥ TuSimple 实习群里也没啥人说话,倒是 Amazon 微信群里很活跃,群聊让我大开眼界。大家讨论了 AWS 人员大量跑去 GCP、有用的内部工具、亚麻员工购物折扣、有公司 July 4th 放一周假、最好的线上团建游戏、能否带人进公司、新加的 2 条 LP、亚麻内部各种神奇的 community、亚麻全职入职后立即可以转组,等等。
⑦ 话说 7.8 和 868 聊的时候,他提到 TuSimple 是个留得住人的公司,所言极是,在这工作的员工都没见怎么跳槽过,比如我 mentor。但是 7.16,000 提供了另一种观点,说这可能是因为员工们想留到上市以后捞一笔,之后还说不定会不会留着呢。他说,一家公司上市之后,目标就可能发生转变,管理层可能套现之后会选择离开,资本也会期望先前的投资得到回报。
⑧ 我这个 Map Editor 一直是和卡车跑出来的数据打交道,564 则是为卡车开始跑之前的准备工作搭平台,包括路线规划等。我没有说动 564 和我一起去 SD 办公室看一圈,还是挺可惜的…我想和组里的同事面对面吃个饭聊聊天,有些我好奇的问题,感觉只能在 casual 的场景下当面交流(比如他们对公司的看法之类)。
⑨ 7.19,mentor 和我聊了下一步的计划。短期看还是些全栈的任务:根据用户的反馈,mentor 想给 Map Editor 加 / 改几个 feature,包括可以在地图里创建 comments、展示每个 layer 的更多信息等。长期来看,他们想把数据库移到 AWS 上,因为公司内部服务器资源有限。
⑩ 7.23 的组会是和 Mapping 大组的 VP 一起开的,VP 现在已经快 60 岁了,LinkedIn 上写了 12 条经历,在他近 40 年的写码生涯里一共“写了一百万行代码”。他见证了 AI 行业早期的发展,在 SWE 其他很多领域也积累了经验,真是骨灰级程序员啊。
⑪ 话说 7.21,753 提醒了我工签的重要性(D5P402),于是我打探了一下截止去年,TuSimple 的工签政策:目前了解的情况是,未入职前不给抽 H1B(等于少 1 次抽签机会),且似乎入职后也不 100% 保证给抽。这个信息十分关键,也更坚定了我秋招跑路的决心。7.26 首次在 Stanford 的图书馆学习。
⑫ 回到我的实习任务。第 6 周开始(7.19 起)我做的项目叫 Layer View,也是 Map Editor 里的一个窗口,这个窗口里是一个列表,列出了所有的“图层”。这个和 Photoshop 里的图层编辑器很相似,我们也借鉴了它的设计思路。每个图层有各种属性要显示,也有很多按钮提供各种编辑它的方式。
⑬ Layer View 这个部件的代码设计得并不好,可扩展性不高;具体来说,图层分为两类,两种类型公用一个 Vue template;不仅如此,图层还分为“ root node ”和“ leaf nodes ”,root 管理所有图层,leaf 则是单个图层,这些仍然公用这个 template。两种图层类型的区分、root 和 leaf 的区分,都是用一堆 if-else 完成的。
⑭ 这样的设计本来目的是提高 code reusability,这没问题,但 reuse 过度的结果就是各部件之间没有独立性。所以在需要修改、添加一些新功能的情况下,mentor 提出了让我干脆整个重写一遍 Layer View。于是第 7 周我试着把那个 template 拆开,但改来改去,越改越不对,到后来都不知道自己在干啥了…
⑮ 我思考了一会,感觉不应该这样改代码,于是决定换一种思路:自己先从头写一遍前端,再把所有功能依次挂载上去。这时我对代码已经比较熟悉,于是重写起来快了不少,心理上也比第 7 周瞎改旧代码时更享受,用不到 20 小时搞好,第 8 周的周四(8.5)提交。这个过程中,我又学了不少 Vue.js、CSS、JavaScript 知识。
⑯ 重写原先的代码以后,不可避免地引入了新的问题。8.6,mentor 说界面变卡了很多,后来他发现是因为我 data() 里让 Vue.js 追踪了所有 layer objects,这些 layers 很多都是三维物体,占内存很大。
⑰ 于是我改了 data(),只追踪每个 layer 的 id,发生变化时借助 EventBus 更新,结果总是出奇怪的 bug。正在我琢磨其他办法时,8.6 下午 mentor 帮我修了一会,最后只改了 2 个字(EventBus.$on 的第 2 个参数 this.updateIds(),去掉了括号),就修好啦。
⑱ 总的来说,我的实习是按部就班的,明确了前后端的需求以后,我就大概知道要怎样用代码实现了。相比之下,729、770、762、749 的实习都是 ML 方面,都有一些科研性质,就困难得多,主要问题是很难知道 model 会不会 work。