从转开发到ATM暑期实习offer
01 背景介绍
本科是双非的电气专业,计算机相关课程只学过C语言,考研专业课也只考了C语言。
研究生考的是中国海洋大学,在计算机视觉实验室做6D Pose估计方向的研究,入学前学了点python和深度学习内容,在2019.7 ~ 2019.11,参加了一个自助收获机的项目,做算法移植边缘设备,然后2019.11 ~ 2020.2,参加了一个Kaggle比赛,靠着抄baseline和调参拿了个前15%,但是没奖牌没什么意义。
02 转开发的原因
之后在2020.2 ~ 2020.4期间,依旧过着“看论文 -- 做实验 -- 实验效果不好 -- 焦虑 -- 看论文 -- 做实验”这样循环的日子,当时是有一个比较烂的idea,就是把三篇论文的方法融合在一起,做了下实验,超过SOTA 1% ~ 2%,问了下导师,说是创新性不够,效果还行,可以发个B类,还是高兴了一阵,就开始更细化得去做实验,直到有一天,我觉得现在的状态不太对,我开始思考三个问题:我在做什么?我想做什么?我要做什么?
我在做什么
我在做科研,想要发一篇论文,然后找到一个中厂的算法岗的工作,过加班少的日子,涉足这个领域也半年了,也很了解就业形势有多严峻,又是神仙打架,又是诸神黄昏,已经不妄想进大厂了。
我想做什么
我想进大公司,到更高的平台接触更优秀的人,一起做更有意义的事情。但是这好像是我研究生入学之前的想法,我现在变成了上面所说的想法,那么到底哪个想法才是我真实的想法?答案应该是第二个,进大厂。那么为什么中途的想法发生了波动?我被环境影响了,周围的人都是这种心态,然后跟他们接触的多了,就会有相似的想法,而且他们觉得开发低算法一等,是本科生该干的事,而我是跨专业进来的,不太懂什么是开发,所以就跟风了,这是我的问题,不该被别人带跑。
我要做什么
现在明确了想做的事情,就要去想,如何达成目的,据我之前的了解,985硕士想进大厂的开发岗,认真学一年是没有什么问题的,而非C9硕士或科研强校,想进大厂的算法岗概率机会为零。所以我现在要做什么就很明确了,转开发!
现在想明白了,但是心里还是有点不舒服,毕竟已经全身心投入到深度学习上半年了,那就借此机会再想一下吧,这个算法的沉没成本,是不是成本?如果我是因为实在找不到算法岗工作,我没得选,那就不是成本;如果我是觉得开发更好,我主观选择了开发,那就是成本。所以,就要从自身的角度出发分析一下,倒是算法好,还是开发好?刚入学的时候信息不足,无法得出结论,现在,我有一个自己的见解,开发于我,优于算法,理由如下:
-
从个人感受上面,我不喜欢算法的工作模式。算法的工作模式大概是:看论文,开脑洞,做实验,实验效果好,就想办法解释为什么好,实验效果不好,就继续看论文,开脑洞,做实验。我很不喜欢这种不确定性的因素,我喜欢有迹可循,而算法的迹太玄幻,我把握不住啊!做实验靠猜,定位问题靠猜,精度上升原因靠猜,我猜不出来啊!开发的工作模式我就很喜欢,学原理,用框架,定位问题看日志,或者深入源码分析,这个过程就很爽啊,学到了就是学到了,每一次的学习都会有正向反馈,整个人的情绪都比之前好多了。
-
算法岗的需求量少,而且是越大的公司越需要,越小的公司越不需要。真要是在一线干累了,回二线城市,那开发岗的选择是优于算法。再就是感觉算法有点赢者通吃的感觉,头部几个优秀人在前面冲冲冲,论文发不停,后面的人基本没啥汤喝,而开发不太一样,再优秀也不能一天写一百个接口吧,活要大家一点一点干。
-
算法岗的岗位特色,依托于大数据。大数据从哪里来?大厂或中厂,还需要对数据作处理、人工标注等,那脱离了公司,算***不会成为屠龙之技?开发就没有这方面的限制,自己想做些什么,还是很容易的,这方面就不展开说了,懂得都懂。
以上的理由只是针对于我个人而言,并不是说实际上就是这样,现在来看,当时的选择是对的,在商汤也见识到了一些从事算法工作的人,个人对他们的工作内容没什么兴趣,而且我做开发也做的很开心。
03 学习开发技能
决定了要做开发,那下一步就是知道做开发要掌握哪些技能,首先选的是Java语言,这是从入门门槛、需求量等角度考虑作出的决定,学习方法就是一边学一边看面经,看看面经上哪些知识点经常被问到,就去针对性地学习,因为时间不允许大而全地去了解各种计算机知识了,下面是一些过程的记录,因为使用的笔记工具有记录创建日期和最后修改日期,所以日期基本都比较精确:
-
2020.05.01 ~ 2020.05.18:学习B站的黑马教程视频,讲JavaSE的。
-
2020.05.18 ~ 2020.05.30:学习《大话数据结构》,全部过了一遍,同时把算法用Java都实现了一遍。
-
2020.05.30 ~ 2020.12.02:不定期刷leetcode,到最后也就刷了229个,不过有的题不是只刷了一遍,还可以看看labuladong的算法小抄,感觉也很好。
-
2020.06.04 ~ 2020.06.28:学习《大话设计模式》,全部过了一遍,但是现在看来感觉没啥用,看的太多结果全都没记住,重点看常用的几个就行,比如单例、工厂、策略、模板等。
-
2020.07.22 ~ 2020.08.10:看B站狂神的Java框架视频,Spring、SpringMVC、Mybatis、SpringBoot,只是了解了简单的用法,没有了解源码。
-
2020.08.09 ~ 2020.08.12:学习github上的一个简单的SpringBoot的项目,叫VBlog,基本也就鉴权+CRUD,用来往简历上写,结果太简单了,基本没啥人问,但总比没有强。
-
2020.08.12 ~ 2020.08.24:学习计算网络的知识,看了《图解TCP/IP》的第四章(IP协议)的IPv4/6首部部分、第六章(TCP与UDP),《图解HTTP》的第二章(简单的HTTP协议)、第三章(HTTP报文内的HTTP信息)、第四章(返回结果的HTTP状态码)、第六章(HTTP首部)、第七章(HTTPS)。
-
2020.08.23 ~ 2020.10.05:学习《剑指offer》,刷了两三遍。
-
2020.08.24 ~ 2020.08.31:学习《深入理解Java虚拟机》,看了第二章(Java内存区域和内存溢出)、第三章(垃圾收集器与内存分类策略)、第六章(类文件结构)、第七章(虚拟机类加载机制)、第八章(虚拟机字节码执行引擎)。
-
2020.08.29 ~ 2020.09.13:学习《Java并发编程的艺术》,基本上是都看了。
-
2020.09.13 ~ 2020.09.22:学习《MySQL技术内幕》的第五章(索引与算法)、第六章(锁)。
-
2020.09.22 ~ 2020.10.04:学习《Redis深度历险》,除了拓展部分全都看了,拓展部分只看了分布式锁和过期策略章节。
-
2020.10.04 ~ 2020.12.02:对照牛客面经查漏补缺,同时复习之前学过的内容,一边投简历面试,一边进行。
中间的四个月左右,时间是比较赶的,一般是6.30左右起,7点前到实验室,中午休息15分钟,然后晚上10.20多开始往回走,算是补上了一些基础。
比较有代表性的笔记
04 面试
11月初,感觉准备的差不多了,就开始投简历,当时也是不知道天高地厚,上来直接投了波抖音,简历关就没过得去,给挂了,然后投了字节的广告,第三面拉了垮了,生产者消费者模型没写出来,问题也答的不好,然后面试官问我接不接受无法转正、实习六个月的offer,我当时也挺不服的,就没答应,后来加了一面,还是没通过,不过这次也给了我信心,让我觉得我还不算太差,起码走到四面了。
之后就不太顺利了,不同的公司又面了好几场,都是一面挂,有嫌弃没实习经历、能实习时间短的,还有嫌弃非科班的。我那会还比较实诚,问我实习时间我就老老实实说的三个月,后来我才知道,一般都是直接说六个月,去了以后就算到不了六个月,直接走也ok。
挂了几个一面后,开始慌了,怕真找不到实习了,就开始海投了,投了百度、网易、小米、京东、字节、腾讯、快手、商汤、滴滴、小红书,每个公司还投了好几个部门,最后百度、网易、小米、腾讯、滴滴、小红书,都没有给我发起过面试。
到了2020.12.01,接到了商汤HR的电话,约了第二天的面试,其实当时还是不想去的,因为毕竟是算法公司,开发去了感觉也没啥意思,但是当时已经没有其他公司的面试邀请了,又害怕后面都不会再有了,就面了,2020.12.02 连着两面,这次我就直接说能实习六个月,当晚HR就通知我过了,问我接不接offer。当时正好后面快手又约面了,数据中台,不太喜欢,再加上这一个月的面试经历也让我有点受到打击,就联系快手取消面试了,想着去商汤积累积累,春招再战吧。
十一月份面试记录
05 商汤实习与春招
第一段实习经历,会的东西确实不多,幸好节奏也不***谢mentor,给我安排的活都很不错,然后没要紧活的时候,也不给我安排杂活,那个时候我就可以带薪看书、刷题。
刚去是熟悉代码,看了项目的两三个模块,感觉都是CRUD,然后就开始要活干,第四天好像,开始一起处理简单的bug,那会git还不太会用,经常遇到搞不定了的时候,就重新clone一个项目。
然后是写一个python工具,当时说用java和python都行,mentor已经把python写的差不多了,当时也怕用java会拖太久,再加上python比较熟,就用python写了,写完了自己打包成镜像,部署到k8s上。这里说一下商汤的基建,感觉几乎就是没有,全都用的开源的东西,不过这也给我带来了一些成长,很多东西都摸了一遍,对于初期来讲还是不错的,在这个过程中,熟悉了docker的操作、镜像仓库上传镜像、k8s的部署等,算是有些收获了。
之后就有了一段空档期,组里是真的没活干,就带薪刷题、看书了,能有半个来月吧,就一直在做自己的事情,感觉实习做的事情有点少,怕影响春招,就找了个项目做,是一个github上的自制RPC项目,是JavaGuide写的,牛客上声哥也做了一遍,我还挺感兴趣的,第一次接触RPC,然后项目也有一定的难度,就去clone下来,逐行debug,逐行写注释,过年的时候给看完了,感觉用了五六天吧,差不多了,就自己对照着写了一遍,并且加了一些秒杀功能进去,能成功调用。当时还想着多写点秒杀案例,但是时间不够了,因为后面公司来活了。
新活是一个微服务,从零开始,还蛮高兴的,用到了Kafka、Redis,然后就去做,这段时间的收获是很大的,但是吧,毕竟第一次正儿八经从头写线上代码,不是修修补补那种,所以还是写的很乱的,MVC结构都没写好,代码复用性也不行,也没有javaDoc,还写的长方法,还有全局变量可能导致并发问题等等,虽然这边没有正式的code review,但是提交上去leader还是会看,然后把我叫过去,告诉我要怎么改。
项目代码写完后,leader让我自己上线到联调环境,当时是下午四点跟我说的,说晚上就要ok,给我紧张了一下,因为我之前上线的是个离线功能,没有端口也没有交互啥的,而这个没那么简单。接到活后就开始看其他项目的k8s配置,找相同点,然后去问测试、运维的同事,再结合之前的一些理解和百度搜索,总算在九点半磕磕绊绊上线了,还是蛮有成就感的。
这个项目做完了,再就没啥活分到我这了,我就负责测测我自己的部分,然后联调的时候处理问题,debug能力也得到了锻炼。在这之后,就开始看书,自己找事干,看了下《深入理解Kafka》,还有一本写Netty和Zookeeper的书,算是了解了不少这个三个中间件的原理。
到了三月份,准备好简历,就开始面暑期实习了,投了腾讯、字节、美团、阿里。腾讯面了TEG、CDG、CSIG,最后拿了CSIG的offer,还是捞的我去年的简历;美团和阿里都是一志愿,分别是优选和新零售,当时投的时候是专门找的新业务,感觉新人机会会比较多,业务支撑好,容易拿绩效做晋升;字节是面了抖音和广告,算法题都没做好,挂了。
曾在状态不错的情况下,一天把剑指offer重刷了一遍
商汤实习做过的需求
06 总结与展望
从开始学开发到商汤实习结束,小一年的时间吧,基本上是没有休息过,现在算是赶上一些科班出身的人了,也有了一些选择的权力,可以更好地去追求自己想要的生活与工作状态了,而且做好一件事也很有成就感,这段时间的努力收获的不止是offer,还有把事情做好的方法与态度、选择与思考的能力,后面再记录一下美团和阿里实习的体验,希望在最后签三方的时候,能做出让自己满意的选择。
#学习路径##书籍推荐#