Archive ← Prev Next →

D5P404-210731

2021 TuSimple 实习日记(中)

第 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。

(上篇:D5P398;下篇:D5P405