Find your own way in SUSTech
HaggittLee 攬雀尾 2020-05-28 原文
作者:张思宇
谨以此文献给曾经给予过我指导和启发的前辈学长学姐、同期小伙伴以及学弟(对... 我并不认识任何一个学妹)们。
很久之前兆旭大佬就找我约稿,希望我能写写CV方向的就业、介绍一下我自己的学习历程。这个事儿一直拖了很久,一方面因为科研和毕业任务比较重,另一方也是因为我自己并不算成功:整个申请/招聘季我没有投出一份简历、参加一次正式的面试就拿到了offer,纯属是运气型选手,还是不太适合提供就业方面的经验。倒是最近看到了一些同学分享的经验,觉着自己的经验尽管带有很大的偏见,但也许也能给予一些同学鼓励和启发。
在开始之前提醒一下,这是一篇带有强烈个人色彩的分享,里面有很多我个人的观点,不见得适合所有人。另外现在的情况已经和我那个时候有了许多的不同,切勿按图索骥。另外,我本人是CS方向的,如果方向和我差得较远可能参考意义也会比较小。
南科,南科
首先,大家需要弄明白的事情是南科大的优势到底在哪里,你为什么要来到南科大。崭新的设施一定水准的师资当然是一方面,但我认为最大的优势在于制度优势和相对充裕(尽管不见得优质)的资源带来的低廉的试错成本——你可以自由选择一个专业,自由参加一个交流项目,自由加入实验室搬一块砖... 或者好多好多块砖。整个大一和大二的期间,唯一重要的事情就是在尝试和探索中找到自己的专业和方向,而不是想着什么趁早做项目发paper年少有为。
我非常不鼓励大家在一进学校就很笃定的觉得自己一定要选择某一个专业或者方向,然后给自己打满鸡血早早钻进实验室开始“干出一番事业”。 以我自己的经历来讲,对于任何一个专业,只有当你真正开始学习这个专业的课程或者进实验室接触到这个专业核心技术相关的项目,才能更加客观的看待自己适不适合这个专业。从我对身边同学的观察来看,大一的时候我认识的已经非常确定自己要学什么专业、做什么方向的同学(>=12)里面,只有两位同学没有转过专业。就我的观察而言,大一就找到了自己的方向、相比于到了在不断尝试中等到大三才逐渐确定自己的方向而言,不见得会有什么优势;而一开始确定了一个错的方向,对后面带来的detrimental effects可就深远的多了。所以我得出了这个具有强烈统计学偏差的结论:别这么做,it's not going to work ...
有同学可能会有疑惑:如果大一就确定方向开始做东西了,相比于大三才开始,不是一定会有更多成果吗?这里其实有两个误区:
1)早开始就能早出成果 :众所周知,大一、大二的课程是非常繁重的,并没有足够多的时间进行科研项目。我看到的很多人大一大二投入很多时间做的东西,其实更多的还是在培养自己的基本能力,不会有什么决定性的产出。
2)在没找到方向之前就不会有任何成果:实际上在尝试和探索的过程中已经会产生一定的成果和积累。这些成果和积累可能并不产生在你最终选择的方向,但这样的积累依然不会白费。尤其是在实践的过程中掌握的:快速和学习并应用于实践过程的meta knowledge,更是能对后面的工作产生不可估量的帮助。
所以最后的差距不敢说完全没有,但不见得有你想象中的大。从另一个角度说,绝大多数人大一大二的程度做出来的东西都是小打小闹,在你最终做的方向小打小闹和在另一个方向小打小闹其实没有啥区别;后者没准还能给你对于不同学科更好的视野,前者等你后面严肃地学习这个领域之后真的就迭代掉了。
如何找到自己的专业和方向
上面讲的东西都比较鸡汤,但绝对是出自我自己的经历以及我很多人聊过以及观察他们的经历得出的结论。这一部分我试着提出一个自己亲身实践过的可执行方法。这个思路我认为不适用的同学是:
- 只想简简单单找份工作,并不太介意学的专业方向是否感兴趣 —— 建议直接去金融、通信或者计算机,别搞啥科研,有机会就多实习。
- 因为大学以前的经历,有一些很独到的个人兴趣和方向。每一级最后都有一些选择了南科大不开设的方向的同学。这些同学我是很敬佩的,但我的思路对这些同学可能不适用。
- 即使在严肃且认真努力地尝试过之后,依然觉得对什么提不起兴趣,或者对什么都特别感兴趣的人 —— 这部分有点超越我的理解,可能我的经历不太有参考价值。
首先,我想介绍一下我自己探索的经历:
- 因为学过很多年的绘画,刚进南科大的时候我想学机械、做机械设计方面的内容。但上了一节工图课之后,就发现机械设计是非常严谨的,需要一板一眼,这跟我想象中的、可以自由发挥创作的艺术完全是两回事儿,也就放弃了这个想法。
- 当时恰好赶上机械系建系,实验室开始吸纳本科生,当时并不了解机器人是做什么的,机加工又觉得太过底层,于是选择了智能制造这个看上去偏“系统设计”的方向。当时去听了几次组会,又非常幸运得到融老师赏识,给了我一个机会跟随清华的一个研究团队做暑期实践。在那边,我做了一些对机加工过程进行信号采集、然后进行数值建模和算法优化的工作。
- 在这一段学习的过程中,我接触到了一些信号处理算法的知识,并且我基础编程课几乎没费什么力气就学得很不错,所以大致觉得我的兴趣应该是在这样一个能把数学和编程结合起来的方向。但当时偏向电子的信号处理方向和通信方向,以及偏计算机的网络方向、分布式方向、机器人方向我都很感兴趣,思考过后我最后决定先从最感兴趣的电子信号处理方向开始尝试。同一时间我参加了Artinx机器人社,想借助RM比赛学习一些机器人相关的知识。
- 大二上学期选我自己的专业意向从机械改成了信息工程,开始修读电子系的课程,包括模拟电路和信号与系统。在这个过程中,我发现自己对电子电路这种偏硬件的方向不太对付,推算电路和实验课连导线对于我而言几乎到了一种无法忍受的程度。所以大二上学期结束之后,我就决定要转去不需要做过多硬件实验的计算机系。
- 大二下学期,我在机器人社团的学长们的指导下开始学习一些传统计算机视觉的算法。我觉得非常有趣,而且当时深度学习正大热,于是我便加入了一个电子系的课题组开始做深度学习方面的工作,但很遗憾最后没有做出什么来,自己也做得比较郁闷,于是暗暗发誓再不碰计算机视觉和深度学习相关的东西了。
- 然而在这个过程中我却学习了很多机器人方面的知识,慢慢又开始觉得自己的兴趣领域应该是在这一个方向里。这个大方向里的具体的小方向依然非常多,包括控制、规划、感知等等,我也确定不了学哪个。一转眼到了大二结束的时候,我再次靠着融老师的帮助去了一家机器人的创业公司为一个即将上市的扫地机器人的感知模块做一些算法评测和优化的工作。当时我其实是不太看得上做产品、做工程的,去实习也只是希望能了解一下在机器人感知方面,真正公司里的人是怎么做这件事情的。
- 在这一段工作的时间里,我和公司的前辈聊了很多,觉得面向产品去做机器人系统会是一件很有趣的事情。于是觉得自己想要做的方向应该会是机器人整套软件系统或者算法框架方面的工作。大三回到学校之后,我继续学习计算机系的课程。同时抱着想了解不同种类的机器人系统的心态,进入了机械系的一个课题组做机械臂系统标定方面的工作。后来逐渐了解到,机器人软件系统并不是一个独立的方向,更像是多个方向的结合,因此不太适合作为职业发展方向。即便如此,到了在这个时候,我已经比较确定自己的兴趣是在机器人感知系统相关的算法方向。
- 大三大概上了一半的时候,一位学长给我提供了一个去某AI领域独角兽实习的机会。在当时的我看来,能去这种公司的一定都是大佬中的大佬,在那里我一定能够更好的了解到最牛逼的一帮人是怎么做计算机视觉和深度学习的。于是靠着之前的实习经历和学习过的课程、读过的论文(更主要是学长的推荐),我比较轻松的就通过了面试加入公司开始工作。在这一段工作的期间逐渐接触到了一个每年稳定产出顶级工作的课题组是怎么work的,也读了很多paper,做了很多项目。最后就决定自己要做计算机视觉和深度学习相结合这个领域。
在每一次做出选择的时候,我都是非常迷茫的;而在每一次经历中,我也一直是抱着一种了解和尝试的心态去参与,在这样的尝试过程中,逐渐建立的对一部分事物的了解、学习到了很多不同方向的知识、也积累了一些值得一说的小项目。最后逐渐缩小自己的选择范围,收敛到一个点上。
具体来说我觉得寻找适合自己的专业和方向,一个比较可行的思路可能是:
-
首先需要大致筛选出一个你想要尝试的专业和方向的***列表,***并且通过搜集资料、找一门相关的网课听听,找这个方向的学长、学姐聊聊他们具体做的是什么,包括去到实验室里面听听组会,对这些方向有一些大概的了解。
-
- 在这个阶段,不要想着做出任何成果,最重要的还是要抱着一种好奇心去了解和思考,同时也多问问自己是否感兴趣。我个人觉得,最好还是能将想要尝试的专业和方向限制在一个相近、相关的大方向里——这样一个最大的好处是你在A方向上的学习和积累到的知识到了B方向不会完全没用,并且A方向和B方向一些必修课和选修课的交叉也可以减缓你的毕业压力。
- 就我自己当时而言,我刚上大二的时候对电子系、计算机系都有一定的兴趣。尽管开始是想选电子系,但也搭配了一些在电子系能认定选修学分的计算机系的必修课一起上(事后证明是一个非常机智的决定)。
-
然后,可以为这个列表排一个优先顺序,从你最感兴趣的开始逐个往下尝试。这个过程中,有两个比较关键的点:1)怎么排优先顺序 2)什么时候应该开始尝试下一个。
-
- 这里先不讨论这两个问题的答案,而是想解释一下最终选择一个方向的原因是什么。通常大家会觉得兴趣是最重要的,但我觉得不是。决定你能不能坚持下去的不是你有多感兴趣,而是你能不能在一个合适的发育环境里面不断获得正反馈(这部分观点借鉴自欧泽斌学长)。通常来讲,你去尝试一个方向的时候有两种情况:1)没有人能给予你合适的指导,你自己也琢磨不出来,日渐自闭,最后放弃治疗;2)有合适的指导,也能看到产出,自己越做越高兴前最后决定选择这个方向。更多时候,是两者的结合。最初的兴趣其实只是一个基础的反馈值——如果你特别感兴趣,一开始会更有动力去做;反之一开始会没那么有动力。一个方向,只要不是你觉得完全不感兴趣、或者有些不可能忍受,否则都可能会是你最后的选择。
- 所以排优先顺序的时候,兴趣当然应该是一个考虑因素,更重要的是你觉得自己擅长做什么,以及哪个方向有更好的机会。譬如一个方向本校就有教授在做、或者至少是做一些相关的事情,而另一个方向在你所认识的人里完全没有人做,那毫无疑问应该先尝试前者。当然,我也不认为如果本校没有教授做你就一定不能做,但这个时候去尝试这个方向的成本会更高,也需要更加谨慎一些,不适合绝大多数人。
- 什么时候应该开始尝试下一个:个人觉得是你认识到这个方向有一些你无法忍受的因素;或者你觉得无法获得任何正反馈和收获的时候。**但在此之前,你还是需要认真的努力做一下 ,因为只有努力之后,你才有资格去评价自己是不是真的不喜欢。**以我自己的经历来说,我大二最后没有继续做智能制造的原因是因为当时觉得没有人带。但后来发现,无论做什么,最核心的都得靠自己学;在哪儿都很难有人手把手的带你。回想起来觉得当时主要的问题还是自己的心态不太好,没有认识到这件事情的本质性。需要努力认真做的另一个原因,是为了不要让这一段经历白费。我大二做深度学习的时候,虽然最后决定放弃、也没做出任何值得一提的成果,但至少我学到了深度学习的基本知识和框架的基本用法,做成了一个相对完整的项目(尽管实际上非常挫)。这些也是我退出之前给自己设定的底线——既然花了这么多时间做一件事情,还是要有所收获。放弃的时间点是很重要的,一般我还是建议在决定放弃之前把自己做过的东西warm up一下、总结成一个值得一提的小成果或者小经历,不见得有多好,但能让简历上有点东西写。
- 这里一个很大的经验教训是,不需要急功近利的想着要搞大新闻。进入一个课题组去尝试一个方向的时候,跟着一位高年级学长打打下手可能会是比自己独立做一个项目更机智的决定。因为此时,至少有一位有hands-on经验的人能给你一些指导,产出成果的概率也更大。在做项目的过程中,最重要的是你能在这个过程中学到一些基础知识,学到这个领域正确的做事情的方式,有一个比较完整的、值得一提的项目(尽管不见得能用来发paper,也不见得是完全由你领导的)。
以上是我自己经历和实践出来的一些经验,如同开头所说,带有强烈的统计学偏差,请大家理性看待。
做科研还是不做科研,这是一个问题
在南科大读书,这恐怕是困扰最多学生的一个问题了。我的建议是:如果你不确定自己要不要做科研,那就先假设自己以后不做科研。尤其是在低年级的时候,进入实验室之后不要盲目开脑洞、决定自己要做一个项目发一篇好文章,而是应该以积累基础知识和学习了解为主。
南科大的这种氛围很大程度上是因为是每年选十佳误导所致的——因为每一位十佳毕业生看上去都有一份很好的科研履历,甚至是一篇顶级会议的论文。这件事情其实是有不少可以商榷的地方的。我自己也在顶级会议上发表过论文(尽管不是一作),有过不少(>=5)的投稿经历,也在一个能稳定产出顶级会议的环境里工作学习过,和周围的小伙伴们有过很多交流,所以自认为属于看过猪跑也吃过猪肉型选手,能有资格稍微评价一下这件事儿:
- 首先,不同领域的顶级会议发表难度差别非常之大,更别说是非顶级会议的论文或者是一些没有发表论文的科研工作。所以有科研经历、发表了一些论文,当然一定程度上能说明能力,但绝对不代表比起去就业或者做其他事情的同学有什么高人一等之处。
- 其次,在绝大多数领域,能发顶级会的论文仅仅只是代表这个工作大概率“及格”了(尤其在CV领域,顶会论文不及格的概率可能大于及格的概率),这和做了一个能得到业内认可的、漂亮的、经得住检验的工作没有半毛钱关系。无论是对于申请博士还是找工作而言,有论文和科研经历都只是一个敲门砖,更重要的是你真正的能力:对于CS的工作而言——有很强的coding能力;对于research而言,读过很多paper,对于整个领域有广泛的认识、对某一个或者几个具体的研究方向有深刻的见解。
- 最后,虽然可能有点得罪人:在简历上同样都是写“曾经研究过xxxx,做过xxx项目”,但实际上有可能已经是顶会oral级别了、只是因为一些运气没能发表(至少在CV领域有挺多引用破百的文章,至今没能正式发表);也可能只是有一些非常粗浅的了解,做了一些非常naive、非常trivial的东西。去竞选任何奖,都需要大量包装,在这个过程中很多内在深刻的特质被忽略,而表面肤浅的名号被放大,很多十佳候选人也可能无奈这一点,但因为在这个位置上,所以必须按照这个规则来。
说这些其实想make the point是:参与科研项目只是一种经历和选择。你看到的很多十佳毕业生,他们的科研经历也没有你想象的那么厉害,他们能成为他们也不是因为他们早早的进了课题组开始努力做科研,更多的是因为他们自身的努力、选择加上一些(或者很大一部分的)运气。
我本科还是见过太多踌躇满志,早早进组想要做出一番事业,最后自闭而终的同学;也见过很多只是踏实的把基本东西学好,在大三才开始逐渐找到方向,毕业之前成功发表顶会论文的同学。当然,我是很鼓励早点进实验室的。在实验室你能看到这个专业、这个方向的人在做些什么,能够很早的参与进去。我也觉得本科低年级的同学不应该给自己设各种各样的限制,觉得我xxx课都还没学,去了也不知道做什么。恰恰相反,先接触一些更高深的知识,再回来学基础课,很多时候能起一个指导作用,让你对这些基础课程有更深刻的理解。我所反对的是一上来就急功近利地想要尽快独立领导项目,尽快的做出成果的这种行为和想法。真的进了实验室之后,我认为还是应该多抱着学习和了解的心态,不要太过在意能做出什么不能做出什么。对于CS的同学来说,去了解这个方向的基础知识,学习做这个任务基本的框架,锻炼编程水平,多读paper,而不是一上来就git clone,然后对着别人写好的代码拼命魔改;对于一些实验学科而言,可能就是去学学一些仪器操作和实验流程,同时大概也是看paper(这部分不太有发言权)。
以我自己的经历来说,大一暑假跟着清华的课题组学习的时候,我就已经参与了一个最后被发表成论文的项目,也挂名了作者。这其实是一件不太幸运的事——让我误以为做科研就是A+B这样拼拼凑凑,怼上去能跑,然后包装一下就完了。当时这个课题组里面的学长主要都是机械背景的,没有人能在我做的算法部分给我很多的指导,后面自闭而终;后面去到电子系的一个组继续做。但前面形成的错误观点,一个学期的时间里我几乎一直是各种魔改网上clone下来的代码,想着能跑起来、包装一下就能发论文了,然后又自闭而终,这也让我在很长一段时间内觉得深度学习就是玄学,决定不再碰深度学习。这一段经历中我犯了几个很典型的错误:
- 首先,科研本身并不是一件什么非常高大上、一定要读到什么年级才能做的事情。但科研确实很需要对一个领域和方向基础知识的了解和积累。对于CV来说(其他领域没做过,不太有发言权),最基本的需要把传统视觉方法、几何视觉和深度学习的基本知识全部都了解了,然后再读大概100-200篇论文,你才有可能会对这个领域有一个基本sense。而不是你拿着别人的代码连连电路,拼凑拼凑,开开脑洞就叫科研的。
- 其次,在科研过程中,教授或者其他负责指导你的人都没有义务什么都手把手教你做。交给你负责的部分suppose你就是需要自己去查文献弄明白的。寄希望于有人能帮你解决所有的问题本身就是一个错误的看法。
- 最后,在足够努力、足够serious地学习和了解一个领域之前还是不应该对一个领域妄下判断。如果真的感兴趣,还是应该想办法去到一个更强的组里。虽然有点得罪人,但对于CV而言,一个无法每年稳定产出顶会的组,我觉得不是很值得去,你也应该不太有机会在里面学到怎么做科研。
总结
总结而言,我觉着大学期间还是应该抱着尝试的心态,在这个过程中尝试弄懂事情是怎么work的,也尝试想明白自己究竟想要什么。随大流,去追求其实自己并不想要的东西其实是很多南科大学子的错误想法,我自己曾经也深受其害(好在大一GPA太差,直接就放弃治疗了,所以才有了后面这么多折腾的经历)。当然大家都会对成果和出路感到焦虑,我自己也经历过这么一个阶段。对于这个问题我也没有一个很好的答案,只能说我认为急功近利的去做一件事情,比起抱着开放的心态认真的解决遇到的问题不见得会更有可能带来成果。很多时候当你想明白了自己要什么,找到一条出路就是顺其自然的了。
最后大家有什么问题欢迎点击文底阅读原文链接,进入我的POPI箱来提问,有时间我都会回复大家。