天天看点

非计算机转后台开发并入职字节跳动(三)--跳槽止损,拥抱AI和开源技术

前面讲了毕业之后做PHP后台的经历,因为业务和技术栈都非常简单,一年下来没多少成长,也没什么干货可分享的,干了一年之后仍然比不上计算机毕业的本科生。

下面介绍下在AI创业公司的经历,虽然公司规模更小,管理更不规范,但确实是打开了技术大门,拥抱了开源,在技能上有了很大提升,并且空余时间也多,可以更好的提升自己。

AI创业公司岗位

人工智能即AI是在2016年AlphaGo出现之后才大火的,机器战胜了人类,非常有想象力的一个场景。这几年机器学习、深度学习、TensorFlow满天飞,各种概念让外行人摸不清头脑。同时也冒出了一大批创业公司,比较知名的有商汤、依图、旷世等,大部分都是做计算机视觉的,即图像处理或视频处理,以算法和软件为主。后面也开始做硬件产品,如人脸门禁,人脸签到。

无论是人工智能还是大数据,在工作当中都是解决问题,一开始不需要关注这么多概念,而应该多关注问题本身,去弄懂问题是什么,有哪些解决方式,以前是怎么解决的,现在是怎么解决的,是不是彻底解决了,未来的发展方向是什么。就比如人工智能这个概念太泛太抽象了,那可以先关注计算机视觉,计算机视觉里范围还是太大,可以只关注图像分类和检测。就拿图像分类来说,就要弄懂什么是图像分类,为什么要做图像分类,怎么做图像分类。多问几个为什么,就能把一些复杂的概念弄懂。

我去的公司是一家知名度更小的,是以做AI摄像头为主的公司,另外也有人脸搜索系统,给公安用的,对于辅助抓捕yifan确实有很大帮助。然后公司借着深度学习这波浪潮准备扩张,找投资,大量招人,做新的业务,比如智慧零售等,所以急缺人。虽然我不懂机器学习、深度学习,后台开发能力也一般,但是正好撞上公司扩招,然后学历还凑合,所以入职了。

那么当时拿到offer后对于入职后要做什么,其实并不清楚,只是说做机器学习平台,做分布式训练,具体是干嘛的,根本不知道。但只要听到分布式、机器学习就兴奋。所以想着肯定前途一片光明,过来好好干,以后去大厂绝对没问题。

入职初期过程

小公司入职很简单,上午报道,签合同,拿电脑,下午就开始熟悉环境。对于码农,最重要的就是电脑,有了电脑在哪都一样,只是环境好坏的问题。不过工位环境确实一般,大家都是面对面排排坐的那种,即使老板也是这样的工位。现在比较流行这种工位,头条、阿里也这样,对个人验其实很不好,太小了活动不开,午睡也只能趴着,但方便沟通。

到了项目组之后认识了一圈同事,发现都是年轻人,看起来都比较忙。虽然介绍了一圈,但一个也没记住,对于项目组有多少成员,怎么分工的,也没搞清楚。不过leader也没着急分配任务或介绍业务,而是说先配置下自己的电脑,装下对应的软件。

装软件,配置开发环境那不用说。这边用的是python开发,虽然python不熟,但好歹pycharm还是用过的。在windows下面装好了,然后看下旁边的人。看到同事的电脑颜色跟windows的不是一个,都是那个紫色的背景,原来大部分都是用的Ubuntu。虽然自己也会Linux命令,也用过Linux服务器,但直接在PC上装Ubuntu作为开发和办公用,确实有疑惑。Ubuntu这系统好用吗,支持装那么多软件吗。

没有那么多时间考虑,既然周围的人都这么用,那多少也得统一,借了个系统盘,开始装。虽然之前也装过Ubuntu,但过程都忘了。只能硬着头皮上。结果不幸的是给的联想的笔记本兼容性不是很好,装的过程中出现了很多奇怪的问题。搞的自己很着急,想着就装个破系统也能搞一天,有点对不起程序员这个称号。但没办法,最终确实就是第一天装系统就搞到九点多。

确实感到了一些压力,不过也有些兴奋,想着直接用Ubuntu开发,那这边水平应该高一些。用Ubuntu确实是一个正确的选择,当你没有mac pro时,开发人员一定得考虑Ubuntu或Debian,会方便很多,对于水平提高很有帮助。

开发环境好了之后就开始熟悉业务,准备干活。这个时候小公司的混乱就体现了,发现没有文档,工作节奏、项目内容是咋样的过了一两个星期才搞清楚,因为leader太忙了,人员分工也不是很明确。基本是哪里需要了就派个人过去做一下。

另外在熟悉业务的过程中发现自己真的是太水了,git都用不熟,虽然有看过廖雪峰讲git原理,但是这东西不用真的就无法掌握。入职初期又是在信心受挫的过程度过,又开始怀疑为啥要做后台开发,为啥要写代码,自己是否适合沿着这条路走下去。 想归想,工作还是得做。

项目介绍

真实的项目情况是这样的:leader也是入职没到半年,作为业务负责人,负责了好几个方向的业务。我所要参与的确实是机器学习平台,因为机器学习这几年需求非常大,那么自然就有对平台的需求,可以降低机器学习门槛,提高算法工程师的开发效率。这种平台大厂也都在做了,比如阿里的PAI平台,腾讯的TIONE,但是没有开源的,但小厂又是有需求的,所以我们得做个这样一个平台。做好了可以卖出去,也可以自己用。后面也有类似的平台kubeflow开源了。

leader的技术视野当然更开阔,对国外先进的技术都有了解。知道做这一样一个平台用docker+k8s+分布式存储(ceph)是可以搞定并且是最合适的方案。于是leader也自己动手写了个demo。但是还不完善,还要接着做,并且到我入职的时候也没什么文档,没有文档写明需求、写明技术方案,对于新来的同事就很不友好。对于我这种啥都不会的,反正就是懵逼的感觉。不要说k8s没听过,就连docker是啥都不知道,虽然面试的时候为了装逼说docker是轻量级的虚拟化技术,但说真的,我没用过,也就是docker是做什么的,怎么用,为什么用docker根本不理解。

这里要提的是之前在的小厂虽然技术不咋的,但是管理还是规范的,该出文档的出文档,而且必须得先有文档。因为必须得想清楚了才开始写代码,文档就是你是否想清楚的证明。并且文档方便团队成员熟悉业务进行开发。

leader虽然技术很强,但是项目管理和人员管理上经验好像一般。当时组内还有其他人,当我问其他人对这个项目的理解、这个平台要做成什么样,他们也不清楚。

所以初期就是在知识恶补的过程中度过的,包括git使用、Ubuntu的使用、docker使用、k8s安装与使用、k8s的原理。虽然这段时间是痛苦的,但不得不说确实学习了很多。接触的都是最新的开源技术,现在k8s基本上成了服务上云的标配了,很感谢有这样一段经历去安装使用k8s,了解k8s应用场景和原理。这也体现了周围环境对个人影响的重要性,有时人就是被周围的环境推着走的。周围的人都很优秀,都在不断学习新的技术,你自然就会跟着去学,自然就会提升。而如果周围的环境就是上个世纪的技术,你就根本不知道要学什么,因为你不知道这个世界上还有什么。 这就有点像小平同志推动改革开放一样,因为小平同志去过法国,见识过经济发达的地方社会和人民生活是什么样的,就知道要怎么改,哪里要先改。

另外发现没,**其实码农的很多工作都是学习xx的使用,安装和使用是学习的第一步,首先得知道这个东西长什么样,然后才去了解原理。**而在学校的时候根本没意识到,只知道看书,只知道刷题,所以效率低。在工作中却会被项目推着走,安装使用之后再了解原理,会学得更快。

工作日常和技术栈

在熟悉了业务和环境之后,基本上节奏就开始稳定了。这边因为没有专职项目经理,所以没有晨会,感觉瞬间轻松了很多,但还是会有周会,偶尔也在jira上写写周报。管理上比较松懈,因为leader没这么多精力,全靠大家的自觉。前期招过来的人都比较靠谱,都很自觉的加班学习赶进度。后面新进的部分人水平和态度都不咋的,带坏了团队的风气,摸鱼现象特别严重。

因为要做的平台是没有开源的可以参考的,所以需求不明确,只知道部分需求。也没有专职架构师做方案设计,所以架构水平很一般。然后自己靠着之前学习的开发规范,逐步出文档,写代码,做demo。这种开发模式和没大神带的情况下,最终出来的大概率是demo级别的。

后台开发是用的python,flask框架。好在这个项目的业务逻辑不是很多,又用的python,所以除了用python之外,也花了很多时间去熟悉python多线程、多进程、GIL锁、协程gevent等,算是真正的熟悉了python。

因为没人催干活,也没有测试,用到的很多技术也比较新,所以工作日常确实会有很多的时间是在调研和学习。前期工作节奏确实比较舒服,但不可持久,因为公司是有运营压力的,是要考虑投入产出比的。越到后面项目交付的压力就越大。

项目中期项目组又开始了推cicd,也就是用docker+jekins+dockerhub+k8s+rancher这一套做自动化发布流程。代码开发之后就是上线,怎么减少上线的时间,提升开发效率就是devops要做的,不得不说这套技术颠覆了自己的认知。码农的创造力确实是巨大的,凡是能提高效率的地方都有码农的机会。

除了做平台之外,也参与了其他几个项目,从而接触了redis,kafka,es,grafana,prometheus,spark这些互联网广泛使用的组件。但在这里还只是了解这些东西,有些甚至都还没用过。如果在项目中能用到这些组件,并能自己安装一遍,并深入其原理,尤其redis和kafka,相信下一次跳槽找工作是非常容易的。

有幸成为面试官,面试经验上飞速成长

因为去的早,团队也还没完全建立好,还在持续招人。所以工作了几个月之后leader开始让自己面试。这是个很好的机会,想到可以面试别人有点小兴奋。一是可以看别人的简历,学习别人的经验,二是想享受下面试别人的快感。初期面试是很爽的,但到了后面有一种厌倦的情绪,因为投小厂的人简历质量真的一般,问多了就感觉没有新意。但这段做面试官的体验对自己的提升很大。

具体的提升就是:

(1)怎么准备简历:

当去看一个候选人的时候,面试官最好奇的就是你是哪里毕业的,你在哪里工作过。如果是名校毕业大厂工作,面试官对你肯定有兴趣。不管你水平怎么样,至少想了解下,尤其我这种资历浅的人,更想学习下。然后就是项目经验,项目经验得写清楚项目是做什么的,你自己又做的哪一块,突出关键技术。

写关键技术的目的就是给面试官问问题的点。比如你写了redis、kafka,那么面试官肯定会问,因为这是比较常用的,可以问很多知识点,也比较容易区分你到底会不会。如果你简历上通篇没写可以让面试官问的, 那么很遗憾,面试官真的没有什么问的欲望。然后只能上来就问数据结构和算法,起步一般是排序。

别认为排序简单就我的面试经历来看,快排能筛掉70%的候选者,这还仅仅是口头交流,没有让手写快排。 对于投小厂的人,让手写快排基本也能筛掉90%。要么是没准备,要么就是水平是真的差。所以为啥流行手写代码,对于面试官来说真的很容易筛选。手写代码也是当时leader提的唯一的一个硬性标准。

在做面试官初期的时候,我也写不出快排,对于快排中常问的点也没考虑过,比如边界条件、时间复杂度。后面经历多了,发现快排是个好东西,每次面试必问,那么自己当然得搞清楚了,手推了好几遍。不得不说,面试官想的都是一样的,在面腾讯的时候腾讯的面试官也问了,然后答的非常顺利。

(2)面试官的心态:

面试官一般都是开发人员,日常工作本身就比较繁忙,每次面试除了那种水平相当的想多交流下,其他的都是能快就快,尽量节省点自己的时间。当然一般公司为了给面试者一个好的体验可能要求面试时长不少于20分钟。但自己真正面试的时候,一两分钟就发现对方太水了就根本不想了解,为啥要再浪费彼此的时间了。

所以面试官问的时候都会挑重点,要么挑你会的,如果你简历上啥都不会就会挑面试官自己会的。并且问的时候自己心里也有了答案,你答的时候不用扯太多,会就是会,不会就是不会。

如果面试官一问你就知道他想了解什么,说明你的水平已经上来了,这样双方沟通起来会比较顺畅。但如果你不知道他想了解什么,说明这是你的知识盲点,也不用着急,就大概的说你了解的,然后尽快结束这个问题,节省双方的时间,面试官反而会觉得你很实诚,比较好沟通。面试时好的沟通就是不浪费彼此的时间。

比如redis的过期机制,面试官问你了不了解。 如果你知道,那么就要答过期机制怎么实现的,并且还要说为什么这样做而不那样做。如果不会,你也可以说下如果你自己去设计,你会怎么做。要实在想不出就直接说不会。

工作的时候一定争取机会去面试别人,在校生也可以想象下自己是面试官会问哪些。面试别人对个人的成长比你反复出去被别人面试成长会更快,这种逆向思维在很多场景都适用。

面试别人的同时也被别人面试

其实在这家小厂呆的很舒服,虽然后面项目面临的压力是有点大,但工作节奏、加班程度和工作氛围都还能接受。不过工资不涨也是个问题。

于是开始去冲击大厂,这次工作经历确实还算是加分的,简历投出去基本都能过,也都有面试机会,但为了慢慢准备,一开始投的是vivo。vivo的面试中规中矩,跟自己面试别人差不多,只不过问的知识点不一样。在vivo这里的面试发现了自己的一个盲区,就是redis。虽然项目中有用过redis,但自己没深入了解,比如redis的数据类型、单线程模型、过期处理、集群方案等。于是一面之后赶紧找资料补了补,有本讲redis原理的书挺好,看了之后确实很有帮助,后面再问redis的问题基本都能回答。并且后面也看了redis源码,确实很值得读一读。当然vivo也有手写代码,要求不高,最后到了hr的环节,但没给offer,应该是钱的问题。

offer没拿到没关系,信心足了很多**。然后开始了针对性的准备,也去网上找了点面经看,这个时候结合自己的工作和面试经历再看面经就知道哪些是常问的,并且为什么这么问。**那么针对性的准备了socket网络编程,要熟悉正常的通信过程以及异常情况下的数据处理过程;然后把unix网络编程也看了几遍,重点看多线程多进程,因为自己不找c++后台开发,所以具体的api没怎么看,但腾讯可能会问,IO多路复用的select/poll/epoll重点理解。然后重点练习刷题,重点练习了《剑指offer》的题。这个时候因为有了一定的代码量,对python也是熟悉了,再来刷题就觉得简单了。并且结合工作中解决问题的过程:先考虑正常情况,再考虑异常情况,然后在考虑性能,一些简单的题基本还是有思路的,有些题就还是靠记忆。

刷题这里还是看运气,可以重点刷下数组、二叉树和动归的题,图相关的题比较少见。具体会问到什么题实际跟面试官个人有关,如果这个面试官是打过ACM比赛的,那么只能说你运气差,可能什么题都会问。如果像我这种,因为我自己会的就不多,那么我只能问一些常见的并且难度不大的题。并且面试官自己都会有题库,只会从那么几个题里面出,准备太多的题对面试官也是一个负担。

经历个把月左右的准备后再投的腾讯和头条,然后无论是项目、redis/kafka中间件、算法题基本都能过关,最终入职字节跳动,到了字节跳动,技术视野又上了一个台阶。。。头条的工作体验请看下篇(四)

继续阅读