程序员如何写简历

程序员如何写简历 笔者工作多年后面试了很多公司,例如 2018 年年初横扫各大互联网公司,也作为面试官面试了很多人,看过不少的简历。现在疫情快过去了,很多小伙伴开始准备简历看新机会了,但是不少小伙伴遇到以下两种情况: 投了很多公司,邀请面试的寥寥无几; 面试的时候被面试官问的哑口无言。 造成以上原因很大一部分是因为简历的问题,本文将结合自身的面试和被面试的经历和大家聊一聊简历怎么写。我们先来分析一些简历素材。 简历一 这是一位毕业生的简历,大家看下这个简历存在什么问题? 分析: 简历中写了自己做的一个项目,项目描述中将该项目描述成 RPC、分布式网络框架,试问从项目描述来看,哪里体现出该项目使用了 RPC 框架和分布式?且不说没用到,就算用了,一般按大多数应届生的经验水平是很难在面试时经得住面试官在分布式等问题上的追问的,这非常容易给自己面试挖坑,一般校招或者对应届生的项目要求并不会太高,但是自己在简历中写上这些“分布式”、“RPC”等高大上的术语,如果实际并未掌握,只能是给自己埋雷。 另外,求职者的项目是一个网络通信库,但是通信协议不是自己的(Protobuf),网络库也是别人的(Muduo),那这个项目有自己的东西吗?一般作为面试官对应届生没有多少项目经验是可以理解的,但是如果把别人的东西拿来自己加个壳,并写在简历中,这就没多大意义了。如果该同学尝试自己设计了一种通信协议,哪怕最终实现的不是很好,面试官也可能非常喜欢,因为融入了自己的创作和思考;退一步说,用 protobuf 也是可以的,如果面试时能说得清楚 protobuf 的序列化和反序列化的原理和该库的结构,也是 OK 的。 面试结果: 该同学在面试时因这个项目被面试官死怼,铩羽而归。 简历二 分析: 这个简历我第一眼看到之后,我猜想应该很少有 HR 或者猎头联系该同学面试吧,后来和当事人确认下,果不其然。该简历的问题有以下几点: 简历中列举的技术栈非常多,如 Linux 、Shell、Python、C++、Golang、Django、Flask、Bootstrap、JQuery……面试者真的掌握了这么多技术吗?另外,求职目标写的是“后端开发”,虽然 HR 可能不知道 Bootstrap、vue 等是前端技术,但技术面试官不知道吗?你一个求职后端职位的,你写许多前端技术干嘛?体现自己全栈吗?按作者的年龄和工作经历,很多技术只是了解或者使用过,并不一定掌握,且不说面试容易被问到而答不出来,最主要的是这份简历让人一看就觉得求职者没有自己专精的领域。说白了,啥可能都知道,但啥都没掌握好。所以大多数公司看到这样一份简历直接就 pass 掉了。 求职目标写的是“后端开发”,位置不够显眼,其次求职目标后端开发一词描述太泛,这位同学本意是求职 C++ 后台开发,但是这样一写,php、Java、golang、python 等不算后端开发吗?所以建议把求职的职位稍微缩小点范围。 面试结果: 基本无面试邀请。 简历三 分析 同学醒醒,你已经毕业工作三年了,还把毕业的硕士论文贴到简历中。。。。。。问题是,你这个毕业论文中还有 “ demo” 字样,可能你的毕业论文获过奖,但是大多数 HR 和 面试官都看不懂里面的行业术语,但是一定能看懂 “demo” 这个词,demo 给大家的感觉好像高大上不起来吧。。。。。。 这位同学作为一个非科班(动物科学)转计算机行业的人,已经成功入行三年了,为啥还要把自己本科的专业放在这么明显的位置,是强调自己转行不易、很努力吗?- -! 如果你不是科班出身,或者不是名牌大学(清华、北大、复旦、武大等)毕业,尤其是毕业几年了,就不要把学历和毕业院校放在这么显眼的位置吧,可以放在“兴趣爱好”之前。 求职意向也是一样的问题; 技术专长描述的也不好,一般我们看用人单位的招聘信息,也都是先写通用技术后写专业领域的技术,所以通用技术指的是算法数据结构、操作系统原理、网络编程等等;专业的技术,指的是 C++、Java、golang、python 等语言、各种框架、开源软件等。 另外,如果长得不是特别帅的话,就不建议放自己的照片了。。。。。。 简历四 分析 这个简历看完我是真的醉了。 大哥,我知道你没有拿得出手的项目经历和技术,可是你求职的是开发岗位,你也不至于把饲养猪的经历写进简历吧,虽然有些大厂自己给员工养猪吃,但是程序开发和养猪毕竟是两码事吧。。。。。。 简历五 分析 这份简历的项目描述也得太详细了,尤其是业务部分,感觉像项目招标书或者项目售前方案。。如果你求职的是技术开发类岗位,且你求职的下家公司与你简历中的项目不是同一个类型,那就把项目业务内容写得简略点,描述项目经历时多写一些技术内容。。。。。。说实话这份简历适合去应聘项目经理,尤其是公路局的项目经理。。。。。。 简历六 分析 这是一位大哥的简历,大哥已经工作十三年了,请读者看看这个项目经历描述是否有 13 年的水平?这项目描述实在太细了,首先可能把之前公司的商业技术机密全部泄露了。。。。。其次,和上面的简历六一样,多写点技术内容少写点业务内容不行吗,简历六可以应聘项目经理,这份简历可以应聘产品经理。。。。。。需求写的太细了,你确定是要找后端开发吗。。。。。。 简历七 分析 人常说,一份文案的整洁程度可以反映一个人的细致程度。这份简历存在两个问题: 个人技能这一块分类很混乱,例如“掌握 C++ 应用,理解底层原理,部分 c11 特性”中底层原理和 C++ 应用有什么关系,完全可以分开写嘛,另外 C++11已经目前已经被广泛使用,如果你不熟悉就不要写,写熟悉部分是熟悉多少?是告诉面试官自己这方面掌握的不好吗?原本面试时面试官可能不会问,看到这个可能说不定忍不住问几个 C++11 的东西;“多线程,同步,ipc通信等”中的“同步”难道不是针对多线程讲的吗?“熟悉设计模式、策略模式、单例模式、工厂模式”中策略模式、单例模式、工厂模式难道不是设计模式的一种吗?为何和设计模式一起用顿号并列起来? 简历中标点符号一会儿中文的逗号,一会儿英文的逗号,像 C++、Linux 这样的专用名词一会儿首字母大写,一会儿小写,导致整个排版脏乱不堪。 总结 成功的方法都差不多,错误的情形千奇百怪。因文章篇幅,就不贴更多的简历了,看完上面七份简历,你是否也有类似的情形呢?下面给大家总结一下投递简历注意事项和如何写技术简历。 **一、**投递简历时,如果投递到企业或者 HR 的邮箱,一定要在邮件主题中写清楚来意,一般是【XXX 求职或者应聘 XXX 职位】,例如【张小方应聘后端 C++ 开发岗位】,不然邮件很容易被忽略或者被邮件垃圾过滤系统所过滤,简历根本到不了 HR 或者面试官手里;简历附件的文件名尽量写清楚附件的内容,如 【XXX 求职 XXX 岗位】....

January 11, 2021

程序员必知必会的网络命令

程序员必知必会的网络命令 利用telnet命令发电子邮件 做Java或者C++开发都应该知道的lsof命令 Linux网络故障排查的瑞士军刀nc命令 Linux tcpdump使用详解 从抓包的角度分析connect函数的连接过程 服务器开发中网络数据分析与故障排查经验漫谈

January 11, 2021

程序员的烦心事

程序员的烦心事 拒绝了一家公司的offer后,他们的副总和hr总监同时打电话来询问拒绝原因并极力要求加入,我该不该去? 我是一名程序员,结婚时女友要求我用两年的工资作为彩礼,我该不该答应?

January 11, 2021

程序员的薪资与年终奖那些事儿

程序员的薪资与年终奖那些事儿 技术面试与HR谈薪资技巧 聊一聊程序员如何增加收入 谈一谈年终奖

January 11, 2021

程序员面试题精讲

程序员面试题精讲 腾讯后台开发实习生技能要求 聊聊如何拿大厂的 offer 网络通信题目集锦 我面试后端开发经理的经历 Linux C/C++后端开发面试问哪些问题

January 11, 2021

网络编程

网络编程 bind 函数重难点解析 connect 函数在阻塞和非阻塞模式下的行为 select 函数重难点解析 Linux epoll 模型(含LT 模式和 ET 模式详解) socket 的阻塞模式和非阻塞模式 非阻塞模式下 send 和 recv 函数的返回值 服务器开发通信协议设计介绍 TCP 协议如何解决粘包、半包问题 网络通信中收发数据的正确姿势 服务器端发数据时,如果对端一直不收,怎么办?

January 11, 2021

网络通信中收发数据的正确姿势

网络通信中收发数据的正确姿势 在网络通信中,我们可能既要通过 socket 去发送数据也要通过 socket 来收取数据。那么一般的网络通信框架是如何收发数据的呢?注意,这里讨论的范围是基于各种 IO 复用函数(select、poll、epoll 等)来判断 socket 读写来收发数据,其他情形比较简单,这里就不提了。 我们这里以服务器端为例。服务器端接受客户端连接后,产生一个与客户端连接对应的 socket(Linux 下也叫 fd,为了叙述方便,以后称之为 clientfd),我们可以通过这个 clientfd 收取从客户端发来的数据,也可以通过这个 clientfd 将数据发往客户端。但是收与发在操作流程上是有明显的区别的。 收数据的正确姿势 对于收数据,当接受连接成功得到 clientfd 后,我们会将该 clientfd 绑定到相应的 IO 复用函数上并监听其可读事件。不同的 IO 复用函数可读事件标志不一样,例如对于 poll 模型,可读标志是 POLLIN,对于 epoll 模型,可读事件标志是 EPOLLIN。当可读事件触发后,我们调用 recv 函数从 clientfd 上收取数据(这里不考虑出错的情况),根据不同的网络模式我们可能会收取部分,或一次性收完。收取到的数据我们会放入接收缓冲区内,然后做解包操作。这就是收数据的全部“姿势”。对于使用 epoll 的 LT 模式(水平触发模式),我们每次可以只收取部分数据;但是对于 ET 模式(边缘触发模式),我们必须将本次收到的数据全部收完。 ET 模式收完的标志是 recv 或者 read 函数的返回值是 -1,错误码是 EWOULDBLOCK,针对 Windows 和 Linux 下区别,前面章节已经详细地说过了。 这就是读数据的全部姿势。流程图如下: 发数据的正确姿势 对于发数据,除了 epoll 模型的 ET 模式外,epoll 的 LT 模式或者其他 IO 复用函数,我们通常都不会去注册监听该 clientfd 的可写事件。这是因为,只要对端正常收数据,一般不会出现 TCP 窗口太小导致 send 或 write 函数无法写的问题。因此大多数情况下,clientfd 都是可写的,如果注册了可写事件,会导致一直触发可写事件,而此时不一定有数据需要发送。故而,如果有数据要发送一般都是调用 send 或者 write 函数直接发送,如果发送过程中, send 函数返回 -1,并且错误码是 EWOULDBLOCK 表明由于 TCP 窗口太小数据已经无法写入时,而仍然还剩下部分数据未发送,此时我们才注册监听可写事件,并将剩余的服务存入自定义的发送缓冲区中,等可写事件触发后再接着将发送缓冲区中剩余的数据发送出去,如果仍然有部分数据不能发出去,继续注册可写事件,当已经无数据需要发送时应该立即移除对可写事件的监听。这是目前主流网络库的做法。 流程图如下: 上述逻辑示例如下: 直接尝试发送消息处理逻辑: /** *@param data 待发送的数据 *@param len 待发送数据长度 */ void TcpConnection::sendMessage(const void* data, size_t len) { int32_t nwrote = 0; size_t remaining = len; bool faultError = false; if (state_ == kDisconnected) { LOGW("disconnected, give up writing"); return; } // 当前未监听可写事件,且发送缓冲区中没有遗留数据 if (!...

January 11, 2021

网络通信面试题集锦

网络通信面试题集锦 TCP/IP协议栈层次结构 TCP三次握手需要知道的细节点 TCP四次挥手需要知道的细节点(CLOSE_WAIT、TIME_WAIT、MSL) TCP与UDP的区别与适用场景 linux常见网络模型详解(select、poll与epoll) epoll_event结构中的epoll_data_t的fd与ptr的使用场景 Windows常见的网络模型详解(select、WSAEventSelect、WSAAsyncSelect) Windows上的完成端口模型(IOCP) 异步的connect函数如何编写 select函数可以检测网络异常吗? epoll的水平模式和边缘模式 如何将socket设置成非阻塞的(创建时设置与创建完成后设置),非阻塞socket与阻塞的socket在收发数据上的区别 send/recv(read/write)返回值大于0、等于0、小于0的区别 如何编写正确的收数据代码与发数据代码 发送数据缓冲区与接收数据缓冲区如何设计 socket选项SO_SNDTIMEO和SO_RCVTIMEO socket选项TCP_NODELAY socket选项SO_REUSEADDR和SO_REUSEPORT(Windows平台与linux平台的区别) socket选项SO_LINGER shutdown与优雅关闭 socket选项SO_KEEPALIVE 关于错误码EINTR 如何解决tcp粘包问题 信号SIGPIPE与EPIPE错误码 gethostbyname阻塞与错误码获取问题 心跳包的设计技巧(保活心跳包与业务心跳包) 断线重连机制如何设计 如何检测对端已经关闭 如何清除无效的死链(端与端之间的线路故障) 定时器的不同实现及优缺点 http协议的具体格式 http head、get与post方法的细节 http代理、socks4代理与socks5代理如何编码实现 ping telnet 关于以上问题的答案,有兴趣可以参考我的知乎live:https://www.zhihu.com/lives/922110858308485120 或者如果你有任何不明白的地方,可以加我微信 easy_coder 交流。

January 11, 2021

聊一聊程序员如何增加收入

聊一聊程序员如何增加收入 亲爱的读者朋友,你好。我是高性能服务器开发公众号的作者,范蠡。一些老的读者应该知道,我有个同名 QQ 群叫高性能服务器开发(研究)群,目前两个群加在一起,也快五千人了吧。很多群友不止一次的想了解我的收入情况,粗略的算了一下,今年一年到目前为止,大概有一百万。然而,这种程度的收入在上海这样的城市,依旧是买不起房,解决不了生活的大问题,比上不足比下有余吧。 咱公众号的大多数读者应该都是从事程序开发或者相关的,你或许在北京上海深圳,或许在南京武汉广州,或许在郑州合肥,或许在其他一些二线三线城市。大多数程序员其实是单纯而又朴实的,晚上可能在骂老板抠门、产品经理SB,但明天早上依然会早起去挤地铁,认真写每一行代码,因为高堂明镜悲白发,朝如青丝暮成雪,一天天老去的父母,需要我们赡养;“笑看妻子愁何在,漫卷诗书喜欲狂”,一天天长大的孩子,需要我们去养育。哪个程序员曾经不是不为五斗米而折腰的男子,如今却不得过着李白洗尿布一样的生活?所以,尽管有时候我们有千万种不愿意,但还是不得说这言不由衷的话,做着自己不想做的事情——因为我们缺钱。 今天,我们就和大家讨论一下程序员如何提高收入,当然,由于个人经历经验有限,难免是一家之言,文中内容仅供参考,欢迎温和地提出意见和建议。 程序员们的主要收入来源 这个标题其实不言自明的,程序员们,当然对于大多数上班族,工作是收入的主要来源。看到群里很多学生讨论 offer 薪资的时候,动辄就月薪 30 k 甚至如 45 k以及更高的,虽然不排除确实存在这一类的 SP 或者 SSP offer。但是大多数人会是这类高收入者或者幸运儿吗?月薪 30 k 意味着什么?意味着在一个小城市两口之家半年多的生活费,意味着在中国广大农村一家两三年的生活成本。老板都不是傻子,你能干多少活才会给你多少钱,那么 30 k 需要干多少活呢?其他的城市我不熟悉,以我所在的上海为例吧,对于一般学校毕业的应届毕业生月薪 5 k 起步,硕士会稍微高上 3~5 k,工作两年月薪在 12k~16k 之间,工作四五年月薪在 20 k ~26 k 之间,达到 30 k 及以上,一般需要工作七八年以上。如果较短工作年限,需要达到较高收入水平的,都是技术非常好或者能力特别强的。我工作三多年时,在一家做公司做音视频实时通讯技术,月薪 26 k。但是工作内容和工作量就很大,当时负责 pc 、安卓、iOS、mac 四个端的 C++ sdk 开发和维护,同时负责这几个端的 Java sdk 开发,每天需要处理多家客户使用这些 sdk 报的各种问题。每天晚上九点下班,被项目经理看到,她会说,你今天下班真早啊。我印象深刻的是,那一年春节,从年二十五到正月初六每天早上九点,我需要准时参加公司的项目会议,汇报项目状况和进度,每天二十四小时要随时响应。 我们大多人毕业学校一般、学历也一般,而且也不是特别努力,本身存在"先天不足”。高中或者大学不努力,毕业后本来起点就比名校或者努力的同学差上一截,这一截可能不是 0.1 到 0.11 的距离,可能是 0.1 到 10 的距离。哈佛大学有句校训是这样写的:今天不走,明天要跑。这句话是很有道理的,你从前不努力的阿喀琉斯之踵,可能在短期内对你没多少影响,但是有一天生活的压力,会逼着你补救之,补救的日子里你会觉得异常辛苦。例如人到中年,上有老小,加班加点为了那点微薄的薪资,在行业或者公司不景气时,被公司无情的降薪或者裁员。然后偷偷地抹掉眼泪,整理简历,为下一份微不足道的薪水继续努力。 中国有句老话叫,失之东隅,收之桑榆。意思是说,如果你失去了早上的朝阳,那么你一定要及时抓住晚上的夕阳,它是你最后弥补的机会。既然工资是主要收入来源,那么提高职场竞争力是加薪升职的唯一途径。而对于程序员来说就是提高技术能力和开阔视野。不管你是什么原因入了此行,既然选择了这一行,凑合或者破罐子破摔在这一行是行不通的,互联网行业的特点就是变化迅速,你需要不断学习去适应新的变化。你可能并不喜欢这份职业,这就如同一场婚姻一样,你可能对你的对象不满意,但是大多数人都没有推倒重来(离婚)的勇气和资本。如果你不尝试去与你这个不满意的爱人去培养感情,你的心情只会更加恶心,生活只会更糟。所以,从现在努力,好好培养对技术的热情还来得及,这就是所谓的先结婚再恋爱。不要盲目相信网上所谓程序员 35 岁危机,真正的技术大神是不会有啥危机的。我个人的经历告诉我,30 岁之前的每个月工资多几千块少几千块,对后来的生活真的没多大影响。对于开发人员来说,影响你后期收入却是人到中年的技术实力。我自做公众号以来,因为我的号(高性能服务器开发)是以技术为主,也认识了许许多多的技术号主,但是很多号的号主其实并不是做技术的,因为我本人是个技术痴迷者,所以我对那些技术实力一般的号主都不怎么感冒,反之我会主动约一些技术实力非常好的号主线下见面。在我的了解中,这些坚持做好技术的号主,工资收入都不低,年薪基本都在 50 W+,甚至有到 150 W。当然,技术实力好的,还有许多其他的优势,例如不用担心被裁员、不用担心找不到好工作,而且可能利用自己的技术去轻松地赚一些钱(下文会详细介绍)。 说了这么多,我建议亲爱的读者,你,如果是从事开发的,那么一定要热爱技术,并努力把它学好,因为它是你吃饭的家伙。吃饭的家伙都不重视,那还能指望你有多大的提高?虽然一些人从技术成功转型了,也赚了不少钱,但是这些都是个例,不具有普适性,你觉得你会成为那个幸运的个例吗? 有读者可能会问,那如何学好技术呢?我个人觉得是肯对自己投资。很多人会愿意为自己一趟旅游、一顿大餐花许多钱,却为自己买本书、买个课程、报个学习班的几十或几百块钱而纠结半天。消费行为分为投资型消费和纯消费型消费,工作的早些年,你一定要肯为自己多一些投资型消费。例如,我月薪不过万的时候,我会为见一个技术前辈一面,从上海跑到北京,转好几次车;会在得到 App 上花 1500 块钱约某个技术大神去咖啡店聊上两个小时。很多高人或行业前辈,我们在现实生活中可能永远都没机会与他们接触,但是现在的知识付费平台,给我们提供了很多机会。或许高人前辈的一句话,一个建议或者思路就能让你受益无穷。这样的例子自古有之,我这里就不举例了。 **要对自己负责,学习和提高是自己的事情。**我发现现在很多的人,出了社会之后还是学生时代被老师教的思维。学校里面老师教你是因为你交了并不便宜的学费给学校,学校给老师发工资和补助。但是到了社会上,大家都很忙,别人凭什么要给你无偿提供帮助或者解决问题;别人提供了一份学习资料,你自己没保存,过几天别人删掉了,你又腆着脸让别人再分享一次;别人给你解决问题,你却说你不方便,让别人等一会儿。或者是你觉得工作太忙、孩子吵得太凶没时间学习等等。这些都是理由和借口,都没把自己的学习和提高当自己的事情。 提高技术,先解决思想上的问题,再解决行动上的问题,这样就容易的多了。其实现实生活中大多数人都不努力,或者貌似很努力,所以你只要稍微真努力一点,你就能超过 90% 的人了。不信你可以试一试。两年前加入高性能服务器开发群的,并认真听我的建议付诸行动的群友,现在年薪都 50 W 了吧。 程序员的副业 程序员有哪些副业?很多人说去接外包,但是我并不建议你去接各种外包,尤其是那些需求不是很明确或者金额达到上千的外包项目。由于外包项目一般很难有明确的需求,尤其是和非技术出身的甲方人员对接时,很多功能的界限和定义都是不明确的,例如为一个即时通讯软件做一个"发送消息功能”,这个"发送消息功能"可多可少,可轻可重。发文字发表情比较简单,发图片就不容易做了,而发语音视频尤其是发实时的语音和视频的工作的量是需要一个专门的专业团队至少花上好几个月的。需求不明确的结果就导致容易出现反复沟通和返工,这会耗费你大量的时间和精力,必然会影响你正常的工作和生活,尤其是对于本职工作本来就忙碌的程序员们来说。而最后可能因为甲方的不满意,必然导致不会按期按量付款。当然,现在很多外包平台正在改善这一状况,如码云、开源中国社区、程序员客栈,不过还是存在不少问题。 除了外包,我们再来聊一聊知识付费,知识付费主要是程序员给各大知识付费站点或平台录制或者写作技术教程。文字系列的知识付费课程,国内做的比较好的有极客时间、GitChat 和 掘金社区。由于商业的运作,很多课程的标题和内容比较容易吸引用户购买,当然内容质量也是有保证的。如果你在某些技术方面有积累或者独到之处,可以尝试在这些平台上写一些专栏课程。但是,很多人看到别人的专栏动辄几千甚至上万的购买量,加上定价都在两位数,觉得作者一定通过课程赚到一笔不少的收入。其实也未必,一般的课程在开售前都有一定的基础数量,比如某个课程可能还没开始出售,就有 100 的购买量,这类纯粹是为了吸引用户去购买的。另外,很多课程都会被平台拿去做一些商业活动,如打折优惠、会员免费学习等等,通过这个形式购买的收入,平台会拿去不少一部分,分到每个作者的并不多。最后,剩下的的终于结算给作者了,平台又会为作者缴纳不少的个人所得税(纳税光荣!纳税光荣!纳税光荣!),最后到作者这里就剩下十之三四了。 视频型的知识付费平台,以慕课网和网易云课堂为例,当然由于平台对你录制的课程有一定的质量要求,你需要花费不少时间和精力去撰写课程教案和 PPT,提前练习,保证录制的视频讲解流畅、技术娴熟、知识专业。这类对一般的程序员属于比较重量级的副业了,有一定的难度。 再来说语音型的知识付费平台,例如得到、知乎 live。这里以知乎 live 为例,在知乎举办一场 live,为了保证质量,平台需要你进行资格认证,例如你说你在某某大公司任职,那需要你提交在该公司的工牌、身份证件或者劳动合同;你说你是某方面的专家,你需要有那一方面的相关证书,另外需要缴纳 500 块钱的保证金,这个用途是,如果你不能按期按质举办你的 live,那么这个保证金将不会退还给你。知乎 live 是我比较喜欢的一种形式,主要是比较省事,举办一次,每个月都会一点收入(同样需要缴税),我在知乎上举办过三场开发方面的 live,一年多时间,所有收入加起来大概有一万块钱左右。如果你在大城市生活和工作,可能觉得这没多少钱(我就是),但是如果你在像郑州、合肥这样的二三线城市做 IT,由于这类城市程序员的收入本身就不高,一万块钱绝对至少抵得上一两个月的收入,可以让生活负担小一点。所以建议在这类城市工作的读者可以尝试一下。...

January 11, 2021

聊聊如何拿大厂的 offer

聊聊如何拿大厂的 offer 为什么要进大厂 许多读者,尤其是一些学生朋友在找我聊职业规划和职场困惑时,我给的建议就是,如果你是应届生或者工作年限较短(五年以下),那一定要找个机会去大厂工作几年。 无论是出于所谓的“镀镀金”的心理,还是想去大厂挑战大业务量、接触高并发、提高技术、开阔视野,都是非常值得的。 虽然很多大厂都加班,但是作为工薪阶层的一员,哪里不加班呢?再者大厂的各项规章制度和福利待遇都比较完善,你可以见识到很多成熟的系统和优秀的做法和理念。 就福利待遇来说,大厂给的薪资待遇比一般的小公司给的要高上一截。就算你从大厂离职,你也可以很容易的涨薪去另外一家大厂。这些都是小公司的没有的优势(我这里并不是说小公司不好)。 由于刚毕业的时候,没有能够进大厂,导致起点和平台都比同时间进大厂的同学低许多。虽然最终通过自己的努力,从刚毕业时的月薪 5 千到现在的年薪 50 W+。 这期间我走了很多弯路和吃了很多苦头。以工资收入来说,未进大厂的,可能在社会上摸爬滚打好多年才勉强达到月薪 2~3 万,而进大厂可能工作一两年就够了,甚至有些大厂开出的 SSP 直接就有三五十万。 因此,如果你一毕业就进入了大厂,那么你的第一份工作的收入、起点和视野就会比同龄人高很多。这也是我苦口婆心地劝毕业生们在毕业前夕的那段日子里面咬咬牙,努力去拿个大厂的 Offer 的原因。 进入大厂的难点在哪里 虽然大厂很好,但是进大厂对个人资质、个人素养和技术水平都有一定的要求,并不是每个人都有机会的。这里说的个人资质,如学历和毕业院校的层次。 一般大厂都只接收本科及本科以上的学历,对于本科以下的学历的应届生一般都不会考虑。而且会优先选择学校层次还不错的毕业生。 也就是说对于应届生,学校和学历成了硬性要求。即使你的能力再强,HR 筛选简历时就已经把你给 pass 掉了,你根本没有面试的机会。 高考已经没考好了,这个已经成为既成事实了。那对于学历和学校不好的人,还有机会补救吗? 有的,通过社招。 也就是说,你可以先工作几年,再尝试去大厂面试。因为社招更多的是看重的是你的技术水平、工作经验等,对学历要求没那么高了。 如何进入大厂 无论是应届生还是工作几年的人,一般都需要通过技术面试才能进入大厂。 那么大厂技术面试一般会哪些问题呢?除了少部分相关的技术外,重头戏都是算法与数据结构。 说到算法和数据结构这门学科,很多人尤其是已经工作了几年的社会人士,用范玮琪的一句歌词来形容,那真是“那一些是非题,总让人伤透脑筋”。 大家常学常忘,但为了面试,尤其是大厂面试,所以不得不学。 很多人对算法和数据结构这门课,甚至存在这样一个误解:实际工作中根本用不到算法,只有面试才会用到。产生这种错觉的原理,莫外乎此人技术不够资深、水平不够好,无缘参与核心开发而已。 学好算法和数据结构,无论对从技术水平长远的发展来说,还是对个人逻辑思维锻炼都是大有裨益的。 国内的大厂面试,基本上大多数问题都是各种算法和数据结构题,而国外的大厂,像 Google、Facebook、微软等等,基本上百分之百是算法和数据结构题目。 很多应届毕业生横扫各大大厂 Offer,很大一部分原因是因为算法和数据结构掌握的好,当然薪资也非常可观。社会人士虽然在面试大厂时对相关的项目有一定的工作经验,没有像应届生要求那么高,但是最基础最常用的算法和数据结构还是要熟悉的。 说了这么多,那么大厂面试到底要求哪些算法和数据结构知识?我根据我面试的经验,给大家整理了一个清单: **排序(常考的排序按频率排序为:**快速排序 > 冒泡排序 > 归并排序 > 桶排序) 一般对于对算法基础有要求的公司,如果你是应届生或者工作经验在一至三年内,以上算法如果写不出来,给面试官的印象会非常不好,甚至直接被 pass 掉。 对于工作三年以上的社会人士,如果写不出来,但是能分析出其算法平均、最好和最坏的情况下的复杂度,说出算法大致原理,在多数面试官面前也可以过的。注意,如果你是学生,写不出来或者写的不对,基本上面试就过不了。 二分查找 二分查找的算法尽量要求写出来。当然,大多数面试官并不会直接问你二分查找,而是结合具体的场景,例如如何求一个数的平方根,这个时候你要能想到是二分查找。 我在 2017 年年底,面试 agora 时,面试官问了一个问题:如何从所有很多的 ip 地址中快速找个某个 ip 地址。 链表 无论是应届生还是工作年限不长的社会人士,琏表常见的操作一定要熟练写出来,如链表的查找、定位、反转、连接等等。还有一些经典的问题也经常被问到,如两个链表如何判断有环(我在 2017 年面试饿了么二面、上海黄金交易所一面被问过)。 链表的问题一般不难,但是链表的问题存在非常多的“坑”,如很多人不注意边界检查、空链表、返回一个链表的函数应该返回链表的头指针等等。 队列与栈 对于应届生来说一般这一类问的比较少,但是对于社会人士尤其是中高级岗位开发,会结合相关的问题问的比较多,例如让面试者利用队列写一个多线程下的生产者和消费者程序,全面考察的多线程的资源同步与竞态问题(下文介绍多线程面试题时详细地介绍)。 栈一般对于基础要求高的面试,会结合函数调用实现来问。即函数如何实现的,包括函数的调用的几种常见调用方式、参数的入栈顺序、内存栈在地址从高向低扩展、栈帧指针和栈顶指针的位置、函数内局部变量在栈中的内存分布、函数调用结束后,调用者和被调用者谁和如何清理栈等等 某年面试京东一基础部门,面试官让写从 0 加到 100 这样一个求和算法,然后写其汇编代码。 哈希表 哈希表是考察最多的数据结构之一。常见的问题有哈希冲突的检测、让面试者写一个哈希插入函数等等。基本上一场面试下来不考察红黑树基本上就会问哈希表,而且问题可浅可深。 我印象比较深刻的是,当年面试百度广告推荐部门时,二面问的一些关于哈希表的问题。 当时面试官时先问的链表,接着问的哈希冲突的解决方案,后来让写一个哈希插入算法,这里需要注意的是,你的算法中插入的元素一定要是通用元素,所以对于 C++ 或者 Java 语言,一定要使用模板这一类参数作为哈希插入算法的对象。 然后,就是哈希表中多个元素冲突时,某个位置的元素使用链表往后穿成一串的方案。 最终考察 Linux 下 malloc(下面的 ptmalloc) 函数在频繁调用造成的内存碎片问题,以及开源方案解决方案 tcmalloc 和 jemalloc。 总体下来,面试官是一步步引导你深入。(有兴趣的读者可以自行搜索,网上有很多相关资料) 树 面试高频的树是红黑树,也有一部分是 B 树(B+ 树)。...

January 11, 2021