HOME/Articles/

我的实习经历总结

Article Outline

马上我的本科实习生涯就将结束,回看这四年,我在实习岗位上的学习时间,应该是要多于我在学校的学习时间的。原因有两个,一是我在课堂上学东西的效率低的令人发指,二是受到知乎的影响,在很长一段时间里,我都觉得本科就是用于试错的。

如果算上在中科院的实验室经历(毕竟它也有给我发工资),我这四年一共在5个不同的雇主处实习过,按组来算,那就是在6个不同的组实习过。非常幸运的是,我遇到的这6个组都非常棒,我没有在任何一处受过委屈。这样说不代表我的实习历程一帆风顺,因为一个好的雇主不等于一个适合你的雇主,我也从实习中收获了很多教训。

我不会在这篇文章中详述我的每一段实习经历,一是有的经历已经记不太清细节,二是可能会不小心涉及到一些敏感信息。我也不擅长吹彩虹屁,就主要总结一下实习过程中的一些反思。

简要经历

第一段实习是大一上在一家创业公司,在我模糊的记忆里,这家公司做的是一个面向商业用户的大数据处理平台,类似于一站式的BI平台。我当时去实习时双方都错误判断了我的工程水平,再加上这家公司没有全职员工能来带我,所以我在里面只做了一些现在看起来连杂活的算不上的活,没过几个月我自己提了离职。几乎是白领了几个月的工资(相对国内主要大厂还挺高的),现在想来还是非常惭愧。

大二上的时候周围已经有一些人陆陆续续进到实验室里,然后当时的我也有尝试一下科研的打算,我就开始着手找实验室。因为大一的时候做程设实验班的最大团大作业看了一篇论文觉得还挺有意思,有一天偶然在BBS上看到这篇文章的一作现在是中科院软件所的研究员,并且正好在招本科实习生,就给他发了邮件。

这个实验室的研究方向是用启发式算法解决组合问题,我进去之后是在做图染色的方向。实验室的工作时间要求非常宽松,我基本上每周只在上面花一天的时间(可能?)。陆陆续续在看了几篇综述和十来篇论文之后,我基本可以判断我对这个方向的兴趣只是一时兴起,同时在了解了科研的大致流程之后,我也觉得科研这种模式并不适合我。所以我一直在划水,主要工作只是复现了几篇论文,做了一些实验。后来就去接着找业界的实习去了。

说起来我还是非常赞赏那个实验室的,导师和大师兄水平都非常高,所以虽然我自己跑路了,也还是把自己的一个朋友推荐了过去,也算弥补一下划水的惭愧之情吧。

大二下进了Hulu实习,一开始在Cloud Infrastructure做容器调度平台的事情。最主要的工作是给上文链接中的调度系统调研和开发新的调度算法。当时看了几篇SOSP和FAST的论文,然后和组里的人讨论哪一种比较适合我们的需求,最后也是我自己把讨论出来的算法在系统上进行实现。做完调度算法之后又做了一些杂活,大约是10月的时候我离开了这个组。我对这一段实习自我评价还是非常满意的,也非常喜欢这个方向,本来以为要一直在这个组干下去 。最后离开的原因一是我的mentor离职了,二是隔壁组缺人,三是之前提到的,我觉得本科应该多试错嘛!

后来去了Bigdata Infrastructure组,做的事情主要是为一个OLAP计算引擎调研缓存算法。这个问题我没有在公开社区找到合适的解法,能找到的论文也是很久远的适用于小型数据库的方案,所以只能自己摸索。最后的工作虽然是能work,效果也算得上还行,但现在反思起来这段经历自己暴露出了很多问题,下文详说。

大三暑假去了Google上海实习。也是在Data Infra相关的组,但做的事情就比较SQL Boy。Google内部有一套通用的SQL语法,功能非常强大,我的工作主要是去用SQL实现一个海量数据转储的工具。这个项目的主要挑战是利用Google的SQL提供的各种语法花式组合起来去完成复杂的操作,同时尽量使得由SQL翻译出来的执行计划尽可能优。这段实习中我的mentor(Google称为host)非常厉害,我感觉哪怕是一头猪也能被他带着把这个项目做了。

Google的SWE Intern只能是三个月,在Google实习结束后,我又来到了一家创业公司实习,做一些全栈的活。这一次我明显感觉我作为一颗螺丝钉的能力变强了。前两周给了我几个bug让我修,同样在没人带,代码没注释,文档几乎没有的情况下,我已经可以通过读代码和熟练使用DuckDuckGo来解决一些问题。

然后现在是在做一个独立的项目,需求是做一个专用于KNN Query的平台,使得开发者可以很轻松为不同数据定义一种KNN Query,然后平台自动在公有云上部署这种Query的服务,用户则可以通过一个统一的前台进行不同KNN Query的查询。

反思

第一段实习,我最大的收获就是认识到了自己工程水平的不足,需要去有人带的地方。而在软件所的经历则是让我浅尝了一下科研的滋味,也明白了自己大概不适合科研。

真正让我从菜鸟走向入门的是在Hulu的实习。Hulu在国内算是一个比较特殊的公司,它的体量并不大,所以里面的人员架构很扁平,但又由于它是外企,他的工作流程相对先进且规范。我的第一个收获就是体验了这种规范化的团队工作流程,这算是对我在团队沟通和项目管理的启蒙。在技术上的收获不用多说,组里的人给了我非常多的帮助,我在这里学到了很多在学校里学不到的知识,工程水平的提升也很快。另一个巨大的收获是,我在进Hulu之前,对于阅读英文材料非常排斥,在进入Hulu之后,我才逐渐开始使用全英文的资料进行计算机技术的学习,这对我的影响可以用无价来形容。

上文提到我在Bigdata Infra组的实习过程中暴露出许多问题,主要是因为我的新mentor后来也是这个组的leader相对比较忙,对我的指导并没有那么细致,在工作流程(如Code Review上)也比较宽松。所以在大部分时间里,我都需要自己对自己进行项目管理。但在初期的时候,我并没有项目管理的意识,不会对项目进行解耦,不会为设置milestone,不会整理思路。导致我很多时候分不清轻重缓急,有的时候做着做着会觉得很迷茫。项目管理做的不好的另一个副作用是,我经常因为mentor出差被block住,也就是说,我无法做到,在我mentor不忙的时候,尽量把block住我的问题解决掉,而我这人很闷,一被block住就开始划水,导致我的效率也很低下。

我在Google的实习最大的收获就是体验了巨型公司运作的模式、更规范的工作流程和它堪称伟大的基础设施。另外,每周一次和美国的组会和转正面试时的英文面,虽然我英语说得还是很烂,但好歹是开口了。

平心而论,有了Hulu的实习作为铺垫,Google这段实习让我工程综合能力上的提升并不算大,在技术上的收获只能算是广度的拓展,当然,这也有Google的实习项目设计得对新人友好的原因。这三段实习我做的都是一个复杂系统中相对来说独立的一部分,这有好有坏。好处不赘述,坏处是长期做这样的事情使我一直聚焦于一个很小的部分,难以对整体架构建立起一个高屋建瓴的overview,这也是导致我项目管理做的不好的一个原因。另一个坏处是我很少需要与mentor之外的人进行沟通,而沟通能力得不到提升在这样的中大型公司简直是噩梦。我现在会觉得,如果能给我分配多一些运维或是修bug的杂活,会有更大的帮助。

在新的创业公司,我又一次在没人带的情境下开始工作。吸取在Bigdata Infra组的教训,我有意识地开始管理自己的工作内容。但由于第一次做独立的项目,我又遇到了新的挑战。最大的问题是,之前我做事的方向全都是交给我的mentor去考虑,我只需要埋头搬砖就好。所以我仍然习惯于这种螺丝钉的工作模式,在做这个项目之前欠缺对全局的深入考虑,认为直接吭哧吭哧写代码,遇到问题再去解决就好,这给我带来很多麻烦。其次是我需要对用户体验进行考虑,但我目前确实不擅长这个。关于对工作内容的管理,也在摸索中前行,但依然时常发觉自己分不清轻重缓急。

不过边碰壁边反思,也让我自我感觉提升了不少。其次,第一次做一个独立的项目,虽说大部分都是对前人的借鉴,但我确实在技术上也学到了很多。

在这几段实习中,我明显感觉在Cloud Infrastructure和新的创业公司的时候,我的mentor对我的水平有相当程度的高估......虽然我确实是一个需要被push的人,这两段实习也是我成长最快的实习。但由于我在沟通能力上的欠缺,我很难管理我mentor对我的预期,被提要求只能唯唯诺诺地应下,这让我时常很不开心。

说到沟通能力,我觉得沟通能力是我目前最大的问题之一。主要有两个毛病,一是我很怂,只有当别人向我主动表示善意后,我才能开始与他自然地沟通,所幸我之前遇到的都是很nice的人。二是我很怕麻烦别人,经常找别人一下子能说通的问题,因为总是怕打扰到对方,只有万不得已的时候我才会去找他。经常就是自己闷声读代码或是查文档。能感觉随着工作时间变长,这一项有所改善,但还远远不够。

另一个就是自我管理能力。有两个方面,一个是时间和日程的管理,我很不自律,很难在没有监督的情况下管理好自己的时间,尝试过calendar和一些todo list也因为操作复杂而浅尝辄止。其二就是我上文多次提到的项目管理能力,这一项我还是觉得我多做多想应该是能做好的。说起来,我以前都是用Trello和Asana这种软件尝试辅助自我管理,但我最近意识到这些其实都是适用于团队,里面很多对于个人是冗余的功能反而增加了复杂性。所以我现在正在尝试用outlook + onenote + Microsoft To Do,目前来说体验还行,希望能有效果。

最后,虽然我实习经历相来说比较丰富,但每段实习的工作内容几乎正交,导致我在任何一个领域上的积累都很难说在大街上找一个高中生来学三个月不会比我强。虽然这也符合我最初“本科就是用来试错”的想法。但说实话,看到那些已经在某条路上走得很远的同学,我很羡慕,近乎嫉妒。