English Version: My Summer Internship at Ancestry
在我拿到offer之后不久,COVID在美国开始爆发,一时间很多公司开始取消offer或改为远程工作。然而由于Ancestry受到Nexus Tax的限制,我们不被允许在外州(除UT和CA之外的州)远程工作。最后公司决定让我们飞到犹他,然后在公寓里remote onboard。
6月初我从雪城出发,经芝加哥中转到达盐湖城。出乎我意料的是Lehi这个城市虽小,但是还挺繁华的,路边有不少科技公司的建筑,有Cisco,Adobe这样的大厂,还有好多没听说过名字的小公司和Startup。Uber司机告诉我近几年有很多公司从加州搬过来,而且Facebook也准备在这附近建新的数据中心。
Virtual Onboarding第一天是一整天的Zoom Meetings,主要在讲一些公司历史,使命,各种手续,如何使用一些公司的内部系统等等。我在之前一直以为Ancestry是一家生物公司(之前朋友跟我聊天都问我“听说你去了一家生物公司”),但实际上是一家数据公司。Ancestry的主要业务一直是家谱,其中最珍贵的就是家谱数据。家谱数据的来源非常广泛,包括记载出生,死亡,婚姻,移民,服役的文件,有些甚至是用古英语写成的。DNA和Health反而是最近几年才成立的新业务。
第一周主要是熟悉环境,配置电脑等等。同时也得知了我们要做的project。我们组是Performance Engineering组,广义上属于Quality Assurance,负责协助其他组发现和优化产品中的性能问题,其中也包括开发各种性能相关的内部工具。我们的project是一个全新的内部工具,由我和另一个base旧金山的实习生一起完成。项目本身规模不大,但是需要我们从零开始,收集需求、设计、实现、测试和部署这个项目。
其实项目本身并不复杂,但是企业项目需要考虑的东西很多,比如性能,可用性,预算等问题。另外由于这是一个全新的项目,所以组里给了我们很大的灵活度,语言,框架等等都由我们来选,只要是AWS里面有的都可以用。
公司使用的敏捷开发模型是Scrum,刚接触的时候真的是一脸懵逼,用了一段时间也就习惯了。不过我们用的这个Rally系统是真的难用。
配置环境的工作量并不大,基本半天就搞定了。之后的几周时间基本上都用来开会讨论需求,研究AWS里的各种技术,研究这些东西能否适应项目需求,然后写成文档,由大家讨论。
我们一开始在设计的时候经常overdesign,结果manager经常跟我们强调要keep it simple。我们最后选用了AWS Lambda和SQS来实现,这样可以大大降低成本并获得很好的scalability。从技术角度来说Lambda确实不够酷,如果这是一个课程项目的话,我们大可以用各种框架,加上重量级的消息中间件,最后写好扔到Kubernetes上。然而对于公司来说,技术上的炫酷并不等于实用,使用最低的成本来解决实际问题,并且secure delivery是首要的任务。技术选型完成后我们花了大概三周时间写了设计文档出来,给全组review。
设计敲定了之后实现就很简单了,没有遇到太大的困难,唯一的问题是我们把三个Lambda塞在一个项目里,结果包结构很混乱,导致了各种花式import出错,不过好在最后也解决了。还有一个Behavior Question中经常会遇到的情形,我做完一个feature之后mentor不同意我的设计,并且他的意见和现有设计是冲突的,要按照mentor的想法就得大改。最后我搞出了A,B,C三种方案去和mentor讨论,最后选定了比较折中的一个。
除了实现之外还需要做测试,测试的重要性已经是老生常谈了,不过说实话这是我第一次认真写测试(逃。除了单元测试之外还需要用SonarQube来做静态检查,所以code style还是需要注意的,不然SonarQube的报告会很难看。
我一直坚信Python是最好的语言,但是这次实习过程中也确实体会到了Python的一些劣势。Duck typing确实是一把双刃剑,在跟队友协作的时候,如果不看文档就完全不知道传进来的是什么东西,而且代码越灵活,静态检查能发现的问题就越少,很多问题只有在runtime才会显现出来。
到第7周的时候项目基本warp up,我花了三天时间和各种权限问题做斗争,最后终于部署到了production上。公司有专门的一个Jenkins负责Infrastructure Provisioning,只需要把写好的terraform script扔上去即可,非常简单。唯一比较麻烦的是权限问题,AWS的权限系统实在太复杂了,我自己用AWS的时候都是直接根用户一把梭,但在公司里就不能这么乱搞了。而且很多时候我们使用的权限会依赖组里其他工具的权限,比如组里的Jenkins,这时候就需要发PR去改组里Jenkins的权限。
复盘整个开发过程,其实算下来可能也就50%的时间在写代码,剩下的时间在讨论需求,讨论设计,沟通接口,等Jenkins跑pipeline,以及等着别人unblock…那句话说的没错,工作中最难/最累的并不是工作本身,而是与人沟通,即使是天天和机器打交道的SDE工作。
公司的WLB很不错,即使在WFH的情况下大部分人也是到点就下线。我队友是个肝帝,有一段时间经常半夜push代码或者发PR,我有时候也会死磕一个bug到很晚。后来mentor发现了之后还跟我们说不要加班,如果活干不完就告诉他。
不过第一次实习就是远程实习还是很有挑战的。首先开会就是个大问题,公司给我们订的酒店网很差,结果Zoom通话质量超级差,给我本来就不怎么样的英语水平雪上加霜,不过过了一周左右就差不多适应了。
WFH带来的最大问题还是沟通上的问题,如果是在办公室工作,遇到需要别人改个什么东西或是问问题,直接去工位上说就好了,但WFH的时候,一切都只能通过Slack和Zoom解决,通过share screen来debug的体验也并不怎么好。另外吐槽一下Conluence的搜索简直就是摆设,我遇到问题试图自己找文档解决的时候却发现Confluence上根本搜索不出有帮助的东西,最后只能去找mentor要。
之前看了@MF的 EA 游戏公司实习记 – Manfong’s Blog ,里面提到了公司举办的各种各样的活动,非常羡慕。我司在往年的8月第一周会有为期3-5天的Intern Days,旧金山office的intern也会飞到Lehi,参加各种活动。可惜的是今年因为COVID,整个Intern Day被削减到只剩下Executive Intern Presentation和Feedback Session。不过我们的项目有幸被选中去做presentation,相当于也是得到了认可。
虽说是远程工作,但是所有Base Lehi的实习生都住在同一地方,所以周末还可以一起烧烤,或者出去玩。大家第一次见面的时候还非常注意Social Distancing,然而过几次之后就放弃治疗了…
酒店大厅里有个小柜子,里面全是桌游(?)
虽然因为COVID,整个实习的过程非常坎坷,不过总体来说还是一次很棒的经历。感谢Ancestry让我认识了很多新朋友,得到了知识水平的提升以及短暂的财务自由(狗头
发表回复/Leave a Reply