即使是临近年末,我依然选择了裸辞,冒着可能会失业的风险。
我之前是在深圳工作的,因为自己是江苏人,也不想在深圳长期发展,所以先辞了职,回到上海这边好让自己更方便的参加面试。
这是我第二次裸辞了,有了上一次的裸辞经验,我这一次在心理准备方面,明显更加的游刃有余。
花了一周多一点的时间,在上海参加了十几家公司的面试,也包括美团、字节跳动等大厂,可是因为能力不够或技术栈不匹配被刷了。最终有三四家想要要我,我也拿到了一份较为满意的offer。
面试是一个非常消耗心力的过程,我很难想象,若不是我比较侥幸,拿到了几个还满意的offer,我很难想象在此时凄风苦雨的寒冷的上海,孑然一身的我,会面临怎样的崩溃与绝望。
所以,我衷心希望,我能够把自己的一些面试经验分享出来,去帮助到一些正在找工作的朋友,让他们的求职之路更顺利一些,少一点像我这样的折腾。
我工作三年,主要编程语言是python,找的是后端开发或运维开发的岗位,想结合自己的实际面试经历,来谈一谈python社招的一些经验,欢迎大家交流讨论~
面试之前
市场环境
先说一下大环境,中国的互联网环境已经渐趋稳定成熟了,但初中级别的程序员依然很泛滥,高级程序员很缺失。所以想要在众多应聘者中脱颖而出,实力才是王道。
另外,通常的招聘季是金三银四或者金九银十,像我这个11月份去找工作的毕竟是很少了,但我觉得上海毕竟是大城市,要说市场上没有岗位是不可能的,另外在淡季,和我竞争的人也很少了。所以,基于以上的判断以及自己的勇气,我毅然觉得辞职,从深圳来到了上海。
个人定位
我觉得,每一个招聘者都要对自己在市场上的位置做一个合理的评估,这样才能准确的知道自己想要找什么类型的公司,是大公司大平台呢,还是中小型企业呢,还是创业公司呢?评估的依据,取决于自己的实力,职业道路的方向,以及对市场的认识。
不过如果不清楚也没有关系,投递公司的时候可以各类公司都投一投,大中小公司都去面一面,总之,不要把鸡蛋放在一个篮子里,多给自己制造一些机会。面试是一个很好的去接触外界,了解自己能力水平的过程,可以帮助你对市场环境有一个更清晰的认识。面试结束后通常有反问问题的环节,也可以把握住机会,多去问一问对方公司在做的东西,使用的技术栈等等。
对于我自己来说,我就把面试当成一个很好的检验自己的机会,同时让我有机会去和别的公司交流技术。所以说,平时在工作过程中,也可以隔三差五的出去面试一下,看看自己的能力水平几何,避免自己和市场脱节太久,以及温水煮青蛙的情况。
简历
接下来就是制作一份简历,关于如何制作一份简历,网络上的教程也很多了。我觉得技术简历的关键就是要把自己的做的比较出彩的项目,以及个人技术栈讲清楚,这些都是面试中问的比较频繁的几个点。另外因为自己痴迷于markdown,第一次尝试了markdown风格的简历,效果还不错,蛮清晰的。
渠道
对于招聘渠道的选择,如果有小伙伴的内推那是最好的,另外建议多注册几个app,多管齐下的去寻找面试机会,比如拉勾、boss直聘、猎聘等等。一些想去的公司的官网的招聘页,也是一个不错的信息来源。
面试准备
作为技术面试,该如何去复习准备面试呢,我觉得可以从以下几点去考虑。
数据结构与算法
为什么把这一块放在第一个讲,因为这是技术面试里非常重要,但是平时工作中又最容易忽视的一块。都说「面试造航母,工作拧螺丝」,如果不是算法岗,程序员在日常工作中算法使用场景非常有限,但这就是面试考察的一个重点。
我大概面了十几家公司,基本每家公司都会考一些算法题,或者让你说一下思路,或者直接手写程序,如果没有事先准备过,会特别的不适应,尤其是白板算法那块。
所以,我的准备建议是,面试前至少前一周,就要花时间去练习算法题,保持手感了。
首先强推leetcode网站,中文站是https://leetcode-cn.com/。leetcode是非常有名的刷题网站,里面汇聚了各大企业的经典算法题,而且可以在线提交代码,自定义测试用例,查看其他人的题解等等。如果你觉得中文站上面的题解没有自己想要的,也可以看一下外文站https://leetcode.com/
,他们的题目顺序都是一样的,只是中文站在本土化这方面更强一点。
如果因为时间紧迫,我建议你针对以下数据结构和算法的知识点进行重点复习:
各种排序算法,冒泡排序,堆排序,快速排序等,时间复杂度空间复杂度分析,能做到手写。
常用数据结构。链表、二叉树、堆、栈等等。
经典算法题。(待整理)
基础知识
任何一门技术面试,基础知识一定是重中之重。对于python程序员面试来说,我觉得下面三块内容比较重要,考察的频率也非常高。
语言基础
可变对象、不可变对象、装饰器、迭代器和生成器、线程和进程、魔术方法、动态解释性、元类等。
web基础
http请求、状态码、网络安全、django处理请求的顺序、cookie和session
数据库
mysql的事务、索引、锁、性能调优,nosql数据库中redis考察的比较多。
项目经验
一般对应届生来说,基础知识很重要。对于社招来说,项目经验是非常重要的一块内容。
我建议可以从下面几个角度去准备自己的项目:
项目介绍
推荐STAR模型。
S——situation,项目是什么背景下产生的
T——task,你的任务是什么
A——action,你怎么做的
R——result,结果如何
项目中的难点、闪光点
我相信每一个真实做过自己的项目的人,肯定会对自己的项目有所思考。总结一下自己在这个项目里最难的地方,以及最精彩的地方,也可以使用上面的STAR模型。
项目框架
有的面试官会要求你在白纸上把项目的框架图或者设计图画出来,这个也可以提前准备下,做到条理清晰,临场画的话很容易乱。
总结
面试是一场艰难的战役,我发现在那种紧张对弈的交锋氛围中,我从来没有体会过所谓超常发挥的感觉,准备了100分,能把60分发挥出来就已经非常不错了。所以,建议每一个面试者都要提前把一些必问的东西(个人介绍、项目经验等等)提前准备好,并且模拟表达一下,以防临场紧张而忘词。
面试真题
因为自己大厂和创业公司都会去面,给我的感觉是,大厂的考察深度会更深一点,比如问你怎么用python定位一些内存满、CPU满的问题,怎么做mysql性能优化等等。而小公司问的更多是一些基础问题,以及看你之前经验的一个匹配度。
我这里从我亲身的面试经历,精选出了30道面试常考题,涉及到了python面试的方方面面,大家可以自行测试。
python基础
python是什么样的语言,和其他语言的区别。
python中的线程和进程,以及使用场景,你知道协程吗?
GIL是什么,为什么会有GIL,去掉会怎样,有了GIL为什么还要给程序加锁?
迭代器、可迭代对象、生成器分别是什么?生成器的作用和使用场景?
python中的装饰器是什么?如何实现?使用场景?
python中的元类是什么?
python中的可变对象和不可变对象之间的区别。
python的魔术方法你知道哪些,new,init,call的区别是什么
django的中间件是什么
celery的原理,如何配置worker的权重
如何定位内存过高或CPU过高的问题
画一下你的项目的结构
项目中你遇到的最大的困难是什么,是如何解决的?
项目中你最有成就感的地方是什么?
你业余是怎么学习编程的?看哪些书?有自己做过什么项目?
web
HTTP/GET/POST/PUT/PATCH之间的区别
状态码的含义以及出现场景,301,302,404,500,502,504等
cookie和session的区别和联系
从url请求到返回,中间经历了什么
HTTP和HTTPS的区别,HTTPS如何进行加密的
数据库
mysql的索引是什么,如何建立索引,B+树的结构
mysql中的事务是什么,隔离等级是什么
如何优化sql语句
mysql的性能优化等
操作系统
堆和栈的区别
什么是io多路复用
nginx的配置
找到整数列表的最大k个数,时间复杂度
输入一维数组array和n,找出和值为n的任意两个元素
常见的排序算法,时间复杂度分析
生成一个旋转矩阵
职业发展
作为一个代码打工仔,对于我来说,想要成为牛逼的程序员的路还很长,一刻都不能懈怠。
我无法从HR角度,或者技术leader的角度来臆测哪种状态的面试更能获取面试官青睐。但通过我积攒的大量的面试经验,我多少可以推断一些成为有竞争力的程序员的一些必要条件。
1. 技术是王道
这一点毋庸置疑。我是一个非科班出身的程序员,在技术成长方面更多的是在工作中学,但这还远远不够,每一位想要成为大牛的程序员,都必须深入底层原理去学习,比如操作系统、网络、数据结构和算法等,也许这些东西在你工作中看起来没用,却是提高你的技术深度,扩大技术视野的非常重要的一环。
我是一个比较容易自卑的人,在面试的时候,遇到答不上来的问题还是非常容易挫败的,觉得自己好弱。术业有专攻是一方面,但很多基础的东西是一个程序员的基本素养,在这上面丢分还是很容易给面试官造成一个不好的印象的。另外,面试所覆盖的点也不一定完全击中你所准备的东西,我觉得面试者可以在面试过程中主动「推销」自己,哪怕一个问题没答上来,也要尽可能的展现一下自己在这一块内容里做过哪些研究,避免面试官错误预估你的水平。
除了基础知识和底层原理,技术的另一块内容就是你在工作中的实践了。我在工作中常常见到一类人,他们只满足于被分配的任务,抱着多一事不如少一事的观念,不去把一个问题深入的去弄明白,害怕技术挑战,包括我自己曾经也是这一类人。
其实这样对职业发展的道路是非常不好的,如果不去走出舒适区,你永远只是一个CURD的程序员,完全没有市场竞争力。在面试中最能展现自己的,就是你在面对技术难题的时候,是如何研究,如何思考,如何解决的。所以,工作中遇到技术难题,一定要把它当做技术上的试金石,成长的宝贵的机会,而不要当做拦路虎而逃避。
2. 工作经历
面试官常会问的一个问题是,你未来的职业规划是什么。我不知道其他人有没有清晰的规划,对我自己来讲,更多的还是走一步看一步,并没有想的特别远,这其实是很不好的。
曾经有一个面试官对我讲,5年是一个关键节点,如果你工作5年,依然没有华丽的工作履历,或者工作能力仍旧处于小白水平的话,是非常危险的,市场对你的能力是由怀疑的。
我想,如果作为一个5年开发经验的人,他差不多也换了两三份工作了吧,从每一个公司的情况每一个工作岗位的内容,多少可以看出点他的职业发展路径有没有一条清晰的路线。如果一个人的目标很明确,他的每次跳槽一定有自己的内在逻辑在里面,他的技术成长也不会太差。而如果每次跳槽都很盲目,技术成长没有延续性,很可能你虽然工作很多年,但是根本没有核心的技术竞争力,这是要警惕的。
对未来的规划这块内容,我自己也非常欠缺,因为我总是抱着要「活出自我」的想法,对一些世俗理论天然排斥,其实是走了很多弯路的,不过既然我意识到了这一点,亡羊补牢为时未晚吧,未来,会多接触一些技术大牛,参加一些技术论坛,不会囿于自己的舒适区,早点找到一条快速的职业发展路径。
薛兆丰老师曾经讲过一句话,「每个人都在为自己的简历打工」,我在这里感同身受,卖方只是提供工作岗位的,竞争永远是买方和买方之间的竞争。所以,想要出人头地,一定要比其他员工多下功夫,少壮不努力,老大徒伤悲。
3. 格局
这个词是我从一个猎头朋友那儿听到的,他说在职场中,男生最重要的是格局。
我是这么理解的,只有你愿意到达什么样的高度,你才有可能成为什么样的高度的人。比如,如果你只甘心做一个工程师,那就活该当一个底层码农了,而如果你能够站在更高的维度去做一些事情,我相信你能收获很多宝贵的东西。
比如,在实际开发中,多去把一些业内的新技术引用进来,而不是仅仅满足于已经成熟的开发框架;不再仅仅去完成领导分配的任务,多站在公司或者团队的视角去看问题,多一些全局的视野;遇到问题时,不要简简单单的解决了就完事了,要学会深入底层,以及触类旁通,把这一类问题都解决,形成自己的思考问题的逻辑框架……
这些东西也是我在此前的工作中缺失的,我希望我自己能够在新的工作中,多思考,多沉淀,形成自己的技术格局。 毕竟也不是初入职场的小白了,我理当给自己提出更高的要求,这也是为了在下一次的招聘过程中,能更顺利一些。
每次拿到offer之后,总会长舒一口气,觉得自己可以休息一下了。但随之而来的是,后面的入职、适应新的工作、新的工作团队,搬家找房,一个又一个的挑战接踵而至。
还不能懈怠啊,希望自己在二十一世纪一十年代能安稳下来,以最好的姿态去迎接2020年!也祝所有在找工作的朋友们早日拿到满意的offer。
最后,我建了一个github的项目,上面会持续更新我的python学习心得和面试指导,欢迎star~