算法教练谈谈码工面试

算法教练谈谈码工面试

序言

又是一年中充满彷徨、未知的9月,有人说求职是一场殊死搏斗的求生战役,也有人说求职就像是谈恋爱,知己知彼百战不殆。其实求职是我们人生中又一次总结自己的契机,在一次次的期待和灰心丧气中,我们逐渐了解自己的需求,明白招聘企业的用人逻辑,这将是我们在求职中得到的成长。今天,我们就来聊聊大热的“码工”求职中的那些事儿。

在北美从事工程相关的朋友中流传着这么一句话。“你是从事什么工作的啊?”回答简洁明了,硅工码工或者矿工硅工指的是从事半导体相关行业的,比如计算机硬件,芯片设计等。码工指的是从事计算机软件相关工作,日常需要编写不少程序,称之为程序猿,或者程序媛
矿工则指的是金融领域相关的工程师,比如设计并实现金融的数学模型(主要采用计算机编程)。这三个工种,听上去有些自嘲,但都是就业市场的香饽饽,都可以在美国高薪职业排行榜上占据一席之地。其三个领域的顶尖公司也都是大家耳熟能详,甚至被很多人列为心中的dream company。其中码工和矿工更是以广大的市场,高额的薪金福利吸引着众多还未毕业就已经为之奋斗的莘莘学子。

解构码工面试密码

码工,顾名思义,写代码的,也就是常说的软件工程师。这是学计算机专业的同学们最门当户对的职业,也是很多希望转行的朋友们的第一选择。软件开发是件有趣而枯燥的事情。有趣是因为只有你想不到,没有你做不到的。50年前没有人能预测计算机即将进入快速发展时期;40年前Bill Gates,Steve Jobs仍然默默无闻;

30年前,windows开始慢慢进入普通人家;20年前也没人能想到互联网的到来会改变企业采购,销售,库存,人力资源等方方面面;10年前你能想象在没有手机,没有网络的世界会是什么样子吗?今天,大数据又以迅雷不及掩耳盗铃之势影响着我们的生活。枯燥是因为你需要用自己的努力一行一行的码代码,要经历requirements,design,implementation,unit test,integration test,maintenance等一系列软件开发流程。

兴趣是成为优秀码工的基本素质有句话说的好,Programming is a labor of love。
其实做任何事情都是一样,唯有真正的热情,才能完成真正的伟大事情。还有一些人认为编写代码是机械的,就像自嘲里说的那样,码工码农,我们用青春来码墙。也有人说印度的软件行业之所以发达,是因为他们高中生都会写代码,因为计算机门槛低,什么人都能学。

事实上,编程是一件极具创造性的工作,也可称之为是一门艺术

最优秀的软件工程师则是工匠,他们能把自己独具慧眼的创造力融入到每一行代码中。他们追求代码的精致,甚至雕琢至完美;他们把大型系统像拼图一样组装到一块,严丝合缝。热爱编程的工程师从构建软件中获得满足,就好比一位作曲家在完成一部交响乐后而欣喜若狂。正是兴奋感和成就感,才造就了喜爱编程的明星工程师。

软件工程师,那自然需要对一门或者多门计算机语言比较精通,了解语言特性,熟悉常用的library或者package,对流行的framework或者开发环境有一定的认识和了解。但这些远远不能作为优秀程序员的标准,甚至都没有达到很多公司入职的门槛。

那我们来说些干货,什么样的人适合这个行业如何迈入FLAG(Linkedin如今将要成为Microsoft旗下的品牌)和极具发展潜力的unicorn这些顶尖科技公司的大门如何成为一名优秀的码工

就像之前所说,你热爱编程,喜欢挑战,对新鲜事物永远向往。因为这个行业发展迅速,新的技术层出不穷。如果你愿意站在科技的最前沿,是一个对编程感兴趣,对技术敏感,逻辑思维能力强严谨细心勇于挑战难题,以解决一个程序设计难题为乐的人,那就去大展拳脚吧。

当然你要耐得住寂寞禁得起熬夜、愿与电脑长相厮守

数据结构和算法,数据结构和算法,数据结构和算法

重要的事情说三遍。一个刚从象牙塔走出来的学生,也许简历稍显简单,项目经验也略显不足,那面试官如何从众多竞争者中选人呢?自然是面试,那众多科技公司都以数据结构和算法作为基础和核心考察科目。别怪我没提醒你,FLAG这类公司在面试fresh或者junior level的职位时,70%(也许更高)的面试都是这一类。Leetcode,lintcode,carrercup等这些网站提供了极其丰富的资源,大家不妨去刷刷题,熟悉下面试可能会被问到的题目类型。

相反的,在面试这类公司,或者说一些general hiring的面试,对于计算机语言反倒没有什么太多限制,你可以选择你最熟悉的语言。面试官所看重的是你的思路,是观察你在遇到困难挑战时如何去面对,是考察你能否用计算机程序清晰的把你的思路编写出来,是否有周全的考虑到每一个可能出现的情况。顺便说一句,你的编程习惯、风格,如何和人交流,表达自己的想法,面试官都看在眼里。

系统设计也是会被经常问到的一种题目类型,考察的是面试者是否能全局的去思考问题。这类题目听上去很简单,而往往是个很开放性的问题。在和面试官交流的过程中,他会给你一些提示,把你往正确的方向引导。

面试官们想要看的是在45分钟到1个小时之内,你考虑了多少种情况解决掉多少问题。他们追求的不是一个答案,而是在整个面试过程中,考察你思考论述的过程

很多同学也许没有丰富的项目经验,那如何去准备呢?多参与一些项目,现在的open source的项目非常多,可以多去看看别人的代码,甚至是参与其中,在实际的系统中去实践。

 

课堂中可能也会有系统设计的题目,比如设计一个数据库,或者是操作系统课上的多线程项目。不再再把它仅仅当成一个简单的project,不要为了交作业而去做,而是把它当成实际问题,思考系统设计过程中的架构和博弈。多和有经验的工程师去交流,当然你也可以从面试的过程中学到很多东西。

除了general hiring的面试以外,也有一些针对某一些技能的面试,比如前端工程师,网络安全工程师,数据科学家。那对于这一类的面试,数据结构和算法的比例和难度或许会降低一些(只是或许哦!)但对某些领域的知识就要求深入一些,对于有过research经验的同学也可以试试对症下药,找一些和自己研究领域相关的职位。