查看原文
其他

生物专业学生如何逆袭为大厂程序员?| 程序员有话说

程序人生 2020-10-29

The following article is from 业余码农 Author Amazing10

作者 | Amazing10

来源 | 业余码农

这回,考虑到近期关注了许多新朋友,并且大多都是学生党,可能对我还不是特别熟悉。因此我决定重新把我从非科班如何通过自学(狗屎运)进入大厂的经历分享出来,希望能够给予一些将要面临秋招,或者将要准备进入互联网行业的同学一丢丢的帮助。
早期关注我的读者可能都约莫着记得,我是在华科读的本硕,专业是生物医学工程。虽说专业的的确确是带了生物二字,但是我老实交代,实际上并不是纯粹的生物技术方向上的专业。简单科普一下:
生物医学工程是属于交叉程度非常高,主要面向生物医学领域的工程学科。我们在学校的主要课程包含硬件设计、软件设计、生化基础以及仪器科学等。
所以呢,原谅本文的些许标题党。但是说实话,由于学科高度交叉,我们实际上所习得的技能也就是一团浆糊。在计算机科学方面的系统知识积累,与纯生物专业相比,也不过是五十步笑百步。

启智阶段


虽说大学期间学的都不是计算机,但是我对计算机的兴趣萌芽却是十分的早。那估计都得有二十年前了,嗯夸张了点。不过应该是在小学时候了。
我是在老家乡下上的小学,你们可能想象不到,那个时候的乡下小学竟然都有电脑课。不过那时候不叫电脑课,叫做「微机课」。
微机课是干嘛的呢?就是一群小朋友排排队,脱鞋进到一个干净的房间里,然后几个人围着一台那种屁股又大又方的电脑,玩纸牌。没错,就是 Windows 上流行多年的纸牌游戏。
怎么说呢。我玩纸牌贼溜。大概天生对这一类东西的接受能力比较强,所以上手很快,并且除了纸牌,还有蜘蛛纸牌,空当接龙,扫雷,3D弹球等。这么说可能有点暴露年龄了。
最早 Windows 系统普及的这一批游戏真的让我对「微机」这么个东西产生了懵懂的概念和持续的向往。

本科阶段


之后的成长道路中,一直对计算机耍的挺溜。但是有点尴尬的是,没人领进门。所以一直都是在娱乐界晃悠,并没有真正意义上接触到计算机内部或者代码编程的专业世界。

1、初识代码

所以在上大学之前,基本上对编程一无所知,但是却有一种强烈的对计算机的热爱。不过那时对于计算机的理解仅限于「装系统」,「装软件」和「拆洗主机风扇」。不要问我为什么本科没有去学计算机,要怪就只能怪高考时坐在我旁边的那位抖腿狂魔。气!
一不小心,还进了生科院。但是缘分这种东西,真的妙不可言。这一切的开始源于一场面试。
所在的大学是一所以工科著称的高校,其中创业气氛十分浓厚。学校因此有许多小有名气的科创团队,基本上是由老师主导,各专业学生组成的小团体。可不要小看这些小团队,世界级程序设计大赛的奖牌获得者经常就出于此类团队。刚上大学的我们单纯稚嫩,自然会被被这些团队的大幅宣传报和满目的奖牌称号所吸引膜拜。我也不例外。
当时我便怀着澎湃的心情申请了一家曾多次在微软创新杯夺得金奖的团队。一个从乡下来的小伙,第一次参加面试,第一次单独和码农小姐姐夜晚座谈,第一次参加所谓的通宵测试。
也就是在那一个晚上,开启了我新世界的大门。
那天晚上给我一群编程小白的任务,是模仿百度首页,实现整个网页的设计、布局和基本链接。提前给出的提示是w3c的教程网址。
从来没有接触过编程的我在此之前,连编程的流程都不清楚,更不必说编译环境、编译语言甚至是源代码阅读(当然这个任务也涉及不到这些)。
但是也就是那一个晚上,让我真正意义上的接触了敲代码这个事儿。
没错,我的编程起点是 HTML+CSS。可惜的是,我并没有通过那个团队最终的面试。不过从那以后,我就开始了网站开发的自学之路。
个人自学的坚持很大程度上基于兴趣,源于在室友面前一顿装逼后的成就感。但这就是一个生科院的学生在课后的最大乐趣所在。

2、小试牛刀

在接触到网站开发之后,从最初的HTML+CSS 到后来的 HTML5+CSS3+JS+ASP,从静态页面的布局到动态网页的请求。
虽然感觉技术的成长也就是从博客的复制粘贴走向了文档的复制粘贴。但是终于迎来了小试牛刀的机会。
学校某大型学校组织需要做一个展示网站,朋友拉上了我和几个人承担了这个事情。这算是第一次真正意义上的项目开发,不过整个网站的功能不多,主要还是展示为主,后台也直接通过学校网络平台整合就行了。所以整体下来做的事情并不多。

3、迷茫困惑

一直以来,都是自己通过博客自学,东拼西凑的建立起知识架构。但是其实技术基础十分不牢固,不懂计算机基础、计算机网络,更别说编译原理、操作系统等基本的知识。因此在很长一段时间内,觉得好像也没有会什么,一直对自己的能力保持怀疑。
在这段时间内,有过跑去搞嵌入式,硬件开发,甚至是产品设计、界面设计,视频制作。但都不一而终。
一段迷茫,一段颓废。一不小心就成为校园里的学长,于是开始紧紧茫茫的寻找实验室。

4、新的方向

好在我们专业与生科院其它专业相比,还是带有工科气质的。医学影像学本身就是这个专业最为重要的一个方向。因此怀着对编程的兴趣,加入了一个专门做医学影像的实验室。
进入实验室,不再是之前的漫无目的,随处拾荒,但却也并不会接触到前沿新兴的技术。毕竟在实验室里,工程技术更多的只是工具。
不过值得一提的是,在实验室里,我接触到了算法思想。医学图像本来就是图像处理领域的一大分支,因此图像处理算法的了解同样也是至关重要。
从这个时候开始,我已经不再搞网站开发那一套东西,专心使用 C++ 写我的算法。那时候深度学习还没那么热门,大多数的图像处理方式还是基于传统的算法进行。虽然算法能力薄弱,但是倒也是我所求。
同时,为了获得数据,还接触到 Linux 系统以及一些脚本,在做研究的过程中也大大增加自己的技术面。
与此同时,为了巩固自己的一些技术基础,也为了督促自己的学习,我报考了计算机等级考试和国家软考。可能对于计算机专业的学生来说,没有什么含金量,轻而易举。但是对于一个非科班的学生而言,这样的考试可以很大程度上帮助自己去重新组织零碎的知识。毕竟不是所有人都有足够的精力去跟着计算机系的人上课
本科阶段的经历让我知道自己与计算机系的差距,虽然接触了许多东西,但是也都不够精,甚至没有底气去独立承担一个小的开发任务。
因此最终选择了读研。希望让自己的技术都够在某一个点上精进,能够独立的做出点东西来。当然最终的结果可能并不是自己当初所想,但是说到底还是得感谢在研究生期间所做出的努力。

硕士阶段


我研究生的生活是从大四就开始的。因为是本校保研生,所以在大三下确定好实验室后,基本就直接开始搬砖的苦逼生活了。当舍友和同学在为毕业而庆祝欢快的时候,我就开始在实验室早出晚归。

1、读研的开始

进入实验室之后,刚开始一段时间也是没有人带。这能靠自己去多多实验室专业方向的文章,然后学一点基本技能。更重要的其实是为了在实验室混个脸熟。
实验室的研究方向主要是核医学成像系统,整个系统的搭建涉及到核科学研究、物理数学模型的建立、电子信息的数据获取、自动化控制设计、机械结构设计、软件和算法处理以及医学实验验证等一系列的过程。
但对我们个人来说,主要是做某一个方向即可。当时我还是自认有一些编程基础,于是计划去做软件开发或者数据处理的方向。但是最初期是没有人带的,所以就花三天时间自学了 Python3 ,把廖雪峰的 Python 教程从头到尾走了一遍。
可惜的是,学完之后也并没有派上用场。
之后实验室新项目确立,我被导师安排到了一个新项目组里。在项目组中,主要负责的是图像重建的部分。图像重建是医学影像领域非常重要的一个研究方向,目的是将影像系统采集到的多维多尺度的信息根据成像原理,依照不同算法还原成二维或三维的断层图像。所以本质上来说,图像重建的重点也是在于算法设计和优化。

2、方向的多变

开始所在的项目组内,主要的工作还是基于软件编程和算法开发,涉及到的技术栈主要还是以 C++ 为主,然后加上一些图型库,如 Qt ,openGL ,VTK 等等。不过都是处于调用函数调包的阶段,也没有很深入的研究算法原理和实现机制。实话说其实个人提升不大。
过了一段时间后,实验室师兄拉我去帮他做事。师兄本身能力非常出众,科研水平不容置疑,所以当时就过去了。之后在他手下做的事就很多变了,不只是软件开发,还涉及到数字电路编程,PCB制板,系统仿真等。
那个时候还来实验室没多久,没有仔细的想过自己之后的就业方向,只想着能够在研究生期间多做些成果,多发文章。因此,跟着师兄搬砖的时候也没有过多考虑对之后的求职是否有帮助,只是想把事情做好,做出有意义的成果。
不过幸运的是,在大四暑假前,也就是研究生入学之前。根据师兄的指导,将一个软件开发的工作给扩充,投了一篇领域内的顶会。虽然觉得所作的工作没什么特别的,但是最终文章被录还是非常开心的。也正因为这个事,之后更想着能够多发文章多出成果。同时,师兄也比较会熬鸡汤,各种说辞让我放佛感觉到即将成为科研巨人,登上学校官网,走上人生巅峰。

3、综合能力锻炼

在实验室,除了完成自己的科研任务,还有很重要的一部分,就是写本子。也就是申请项目基金等等文字工作。
我估计有参与过的项目申请或结题工作不下十余项,每次都会涉及到大量文字的整理、表达、排版等工作。一般的学生对于这样的工作都是极度排斥的,觉得很烦又没什么用。当然我也是这样觉得的。
只不过在写了大量的本子后会发现,其实这也是综合能力的锻炼。我们导师常说,博士生一定要会写项目,硕士生的话尽量写。说明他把这也是当作一种能力的培养。在师兄手下,我也经常性的写本子,甚至于超过了敲的代码。那时候也没有很明确的技术培养规划,所以倒也觉得还行。

4、独自前行

只不过好景不长。带我的师兄由于过于优秀,将要离开实验室去其它高校就职。这对当时的我来说,处境有些许尴尬。因为我的研究方向是与师兄的工作有交叉的,同时一些设备和材料也需要师兄的支持。
实验室本身的氛围是以博士带头,硕士辅助进行项目开展的,而我的研究方向是我自己独立出来的一个题目。说白了就是实验室就我一个人在搞这个,但是这个方向不是导师关注的方向。
因此,在这之后,我又回归到了一个人做事的阶段。大概是研一下开始,我就只能自己一个人去想自己的研究课题,偶尔会跟老师讨论,但是也没有很确定的工作路线。具体的工作内容也只能靠自己去思索。
在这段期间,我写过 verilog,调过 FPGA,画过板子,画过工程图,当然也写过软件做过算法。一个人做事的话,可以说是很自由,没有老师管,也没有报告的压力。只是很多时候发现有一些想法没办法实现,也无法对前沿领域有很深的洞察。空有一腔发文章报效实验室的热血,却发现像是站在水中的浮木上,摇摇欲坠。当然这其中,个人的问题占有很大比重。

5、摸鱼的日子

不敢说自己的有多么自律,多么出色。可能世上大多人都是芸芸众生,我也不过一个普通人。在自己做研究的同时,每次到临近顶会收集文章摘要之时,我都会很积极的熬个一两个月,将自己的想法和结果写成一到两篇的会议文章。我自己也大概知道其实工作没有太大的突破点,但也是希望能够赌一把。
只不过两年来,一共整理出数篇会议摘要,都没有被同意投稿。每一次还是会有些灰心,也有些不服。会时刻回想起导师的反馈,而后想到一堆反驳的理由。只不过都没用。
每一次之后,都会有一段时间的消沉。不太想去实验室,不太想看论文,在实验室可能也就是摸摸鱼罢了。很多时候觉得斗志满满,又会瞬间像泄了气的皮球,没有精力去完成任何事。

6、职业方向

到如今,算是大四的时光,在实验室已经呆了快四年。平心而论,没有做过什么突出的成果,也没有练就什么出色的技术。研究生活高开低走,一度以为自己是什么科研巨星,后来仅剩的一丝热情也在导师的「也没看出你有什么天分」中黯然消逝。不过还好,在这之前,我找到了自己的职业方向。
我本身就是一个比较后知后觉的人,一方面是懒,另一方面又对自己有一种迷之自信。我真正意义上开始准备校招还是在去年六月底七月初的时候,也就是研二下学期快结束的时候吧。我们实验室的硕士生出去基本就是两个方向,软件或者硬件。搞电路的基本都选择去做硬件开发,其它的大部分都会选择做软件。我也没啥可想的,虽然做过硬件,但是技术水平根本不敢出手。所以求职的方向直接就定在了软件开发相关。
当时还不知道应聘互联网还要刷题,还要复习,以为上去介绍下自己,讲讲自己做的跟互联网没有半毛钱关系的项目就可以显得很有想法的样子。后来真正开始准备的时候才发现,自己原来还差得有点远。
老实说在研究生期间,主要使用 C++ 和 Matlab,主要的项目就是用 Qt 写了一个客户端,里面有网络通信的模块可以对数据做一些处理,并且能够显示图谱。用 Matlab 主要就是做了一些比较基础的图像处理和机器学习的算法。光这项目再加上非科班带「生物」二字的专业,的确让不清楚的人会十动然拒。
不过其实也没得选择。生医专业对口的公司都是做医疗器械,比如联影、迈瑞等。但是其实去这些公司也是做软件开发工程师。相对来说,互联网公司技术好,待遇好,发展好,自然就成为大部分的选择去向。
说是跨行,但是其实也没有别的更好的选择。我们老师常说希望我们学生以后能够在我们这个领域发光发热。这倒是真的,国家的发展还是离不开这些能够在某个领域深耕的人,而不是为了一昧追求热点和高薪而忘记了初心。

求职经历

讲讲我的秋招经历吧。我的秋招虽然准备的晚,但是其实还是挺顺利的。从19年8月开始接到面试,2个月内就拿到了15+的offer,基本平均薪资都在30w+,包括抖音美团华为小米等等。那段时间真的是状态上来了,就是佛挡杀佛,神挡杀神。
不过刚开始的时候,由于实验室的原因,没有办法出去实习。甚至由于一些原因,一直拖到暑期前才开始准备复习。
那时已经快七月初了。急匆匆的登上各种学习网站,发现这也太多要看了的吧,还得刷题。关键一看面经,这都啥呀。还要手撕代码的吗?
这一看当时不要紧,关键晚上就焦虑的快睡不着了。每天都在想应该怎样复习,怎么写简历,没有项目该怎么办。
刚开始的时候连简历都不敢投,因为老觉得简历一过去就会安排面试。后来发现这完全就是多虑了。大概从七月初我就开始投简历,因为七八月是一些公司提前批招聘的阶段。
许多非科班的学生,在投递简历的时候才能发现自己的无助。我在简历投递初期,基本没有任何反馈。提前批阶段,许多公司都会去争夺更优秀的简历候选者,这对于生物专业的学生真的没有什么优势。
但是没有关系,既然选择了这条路,那么就要坚持下去。投一家无人应答,那么就投十家,投五十家。我在整个秋招阶段,总共投递过近一百家公司。许多在提前批没有给予反馈的公司,后期大部分都有电话联系重新开启面试流程。所以,就算认为自己的简历再不够出色,也要相信总会有瞎了眼的 HR(误)。
当时一直在坚持投简历,只要看到的招聘信息都会去投递。还记得第一次做测评题的时候都非常紧张,以为这就是笔试题。非常认真的拿纸笔在计算,慌的不行。
后来直到八月初才收到第一份面试邀请,多益网络。当时约了面试之后简直怕死了,虽然说复习了一个月大部分的 C++ 基础知识都看得差不多了,但是肯定是不够的。
面试的时候面试小哥全程就低头照着题库念,也不看我。我这边的音频信号也不太行,他那边说话都听不清楚。两个人就在无数次的重复和确认。关键是面试完之后我自我感觉还非常良好。
最终结果还是挂了,说实话打击挺大的,感觉因此对面试产生了恐惧。不过后来试着自己跟自己讲解,慢慢的也习惯了面试的感觉。
随后在八月底的时候,终于收获了第一家 ihandy 的 offer。并且在进行总管面的时候,跟面试官进行了深入的交谈。面完之后让我有一种都不好意思拒绝这家公司的念头。这也是第一次感受到了面试官的认可。
随后,便一发不可收拾。这个时候,已经准备了大概两个月,基本的技术知识我都看完了,剑指 offer 上的66题以及 leetcode 上基本的题也大概刷了两次。同时获得了一个 offer 之后,对自己的认可度非常高,使得面试的状态非常好。
后来给了面试机会的公司基本都拿到了 offer。像字节跳动、美团、虎牙等等公司,面完的感觉就是基本稳了。不过可惜的是阿里简历面后,内推人开始说通过了,后来不知道什么情况流程就拖到结束了。
腾讯也一直没有捞过我面试。感觉如果在状态顶峰的情况下能有面试机会的话,还是很有希望的。不过也说明简历依然不够出色,非科班没有实习经历,项目也比较水,导致 AT 大厂连面试机会都没给。这也是秋招比较遗憾的地方。
另外,记住面试过程,跟投递简历一样,一定要多面多总结
如果你的表达能力不好,没有别的好的办法,只能多练。自己在面试前问自己问题,然后用自己的话陈述出来。甚至是录音自己听,感觉一下面试官听到你的回答是做何感想。
心态要好。面试官也是人,不可能所有人都能够绝对公平的跟你面试,所以遇到人品不好的面试官,做好自己就行了。
要善于总结。每一次的面试都可以做好记录,录音或者笔记都可以。面试完之后需要多回顾,发现自己的错误,感受面试官对你的引导,然后下次面试注意。我一般喜欢用印象笔记记录东西,每一次的面试记录我都记录在印象笔记上。电脑手机都可以看,即使是出门现场面试也不怕。
最后就是一定要坚持下去。金九银十,金三银四。把握好机会,要善于规划自己的成功。

复习准备


想进互联网的技术岗,基本都是要提前准备的。当然某些大佬及大大佬除外。无论是校招还是社招,都需要针对自己的求职岗位进行必要的理论知识复习、项目经历反思和算法能力训练。只不过校招会偏向于基础和算法能力,社招可能都会重点考察。
除项目经历外,复习的阶段主要分为语言基础、数据结构和算法、计算机网络、操作系统、数据库以及算法刷题。这里我就简单讲一下复习的方向:
1、语言基础:
以 C++ 为主。我不喜欢看又厚又重的语言书,因此复习全程是以博客、开发文档和实践相结合的方式进行技术点复习。C++ 的技术点相对于其它语言来说,不算多,也不算难。技术重点的筛选可以从面经中提取而来。当然每一届都差不多,所以找找别人总结好的资料看就行。(想要我复习资料的,可关注公众号后台回复秋招领取)
2、数据结构和算法:
这应该是编程的基础,重要需要了解的数据结构不出10种。花点时间弄清楚它们的原理、结构和使用方法,常用的操作也需要掌握。最难不过红黑树。
这里的算法指的是常用的算法,比如排序、遍历,与数据结构相结合的数据操作方式。需要保证手写才行。
3、计算机网络:
网络部分的内容其实可以算是最重要的,无论是前端后端都需要掌握网络通信过程中的操作和机制。技术点可参考网络服务器的请求和响应过程。将其中所有涉及到的协议、机制了解清楚,就可以掌握大部分了。
4、操作系统:
如果有 Linux 使用经历和脚本编程基础在面试中会很加分。对于操作系统的理解建议按照 Linux 和 Windows 系统的区分进行。
5、数据库:
SQL 基本操作必须要掌握,还包括一些关系型数据库的基本原理和机制,内容不多,多看看就可以掌握。
Redis 同样也是加分项,有能力的可去研究下源码。
6、算法刷题
这一部分不多说,普通人只能勤能补拙。无论是剑指 offer 66题还是 leetcode 都可以,剑指刷两遍,leetcode 两百题,基本没有问题了。刷题时不要死刷,可以根据类型刷,比如链表操作、二叉树操作、动态规划等。相同类型重复做,能够更好的培养算法思想。

感想体会


说起求职的过程,其实真要我来评价的话,估计运气是占了一大部分,连我这样都行,你们也可以的。不过最终能够获得一些互联网公司认可的原因,我认为主要有以下几点原因吧:
  • 本科阶段接触互联网行业比较早,对于这个行业有自己的见解。

  • 本科阶段有考过一些计算机水平的证书,大概系统的学了一下计算机相关的基础知识。

  • 用C++比较多,对语言基础的理解比较好。

  • 面试状态比较好,比较会表达自己的想法。

  • 学习能力还行,能够在面试官的引导下找到他想问的技术点。

  • 准备过程比较有规划,能够快速的掌握面试的重点。

  • 人长得老实,比较容易获得信任感。(这个你们可能学不了^_^,毕竟关注我的人都比较帅~)

  • 比较幸运。

前天刚硕士答辩完,这两天也把学位申请的各种材料提交上去了。一不小心,七年的大学校园时光真的要结束了,兜兜转转感觉好像依旧是一无是处,一事无成。但是依旧希望以后能够:
二龙腾飞、三羊开泰、四季平安、 五福临门、六六大顺、七星高照、八方来财、九九同心、十全十美、百事亨通、千事吉祥、万事如意。
人生无常,活在当下,且行且珍惜!

更多精彩推荐

谷歌 Chrome 将弃用“黑名单”,“Master/Slave”主从模式也要换名?

简单明了的 Python 多线程来了 | 原力计划

微信、支付宝否认提供「锁定 35 万人」数据;苹果押宝中国 5G 市场;TiDB 4.0.1 发布 | 极客头条

如何成为一名黑客?

发送0.55 ETH花费近260万美元!这笔神秘交易引发大猜想

京东姚霆:推理能力,正是多模态技术未来亟需突破的瓶颈!

你点的每个“在看”,我都认真当成了喜欢

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存