美文网首页Stories in CS
[转]改行CS导论 第二章

[转]改行CS导论 第二章

作者: greatseniorsde | 来源:发表于2018-05-30 13:44 被阅读21次

    2-1 第二章前言

    又好几天没写,忙。因为时间原因,可能后面基本不回私信了,不是因为傲慢,实在是没有时间。因为私信给我的朋友问题大多数都相对特别一点,有些我也不好回答。我觉得更有效率的方式是直接留言吧,我回复然后大家都能看到,也可以听听别人的想法。从工程师的思维角度,只要是不确定的东西,我一般肯定不乱说,职业习惯。

    如果大家还想听哪些话题,也可以留言中提出,如果我知道我会写。

    第二章的主题是改行早期,即从下定决心改行,到找到第一份工作。这一章我认为是实用而关键的一章:要知道万事开头难,一般来说找到第一份工作,后面就开始正反馈循环了。因为我的经历正好这部分走得最痛苦最低效,所以了解新手入门的痛苦。

    第二章主要涉及到的内容大概是选校、选课、学习、刷题、简历、面试、以及英语等。和第一章类似,我想展示的并不是说“这么做效率高”,而是更多地表达我的思维方式和探索过程。每个人都不应该盲目听从书籍或是某种学习方式,而是要积极主动地寻找最适合自己的方法,可以尝试多种学习方式,再做决定。从这种意义上来说,别人的失败和错误更值得每个人借鉴。

    来知乎有2、3个月了,感觉CS方面的牛人很多,所以兼听则明,多逛逛各种论坛学习其他改行者的经验也是个好办法。但是也有很多低质量的拿程序员开涮的帖子,也很烦人。这里建议因为背景是美国,所以尽量看在美国的人写的,更了解实际情况。国内的很多思路还是不同的。

    我不太同意的是那种“程序员高中毕业就能做、没技术含量”的理论。实际上,我个人觉得程序员对个人的素质要求是非常高的,比绝大部分工作都高。兢兢业业做好一件事已经足以在美国扎根立足,过上中上产的生活,说明这份工作本质上就是很重要的。

    即使改行成功,也分各种层次,一年几万的小程序员,和一年几十万的大公司程序员,甚至发了横财从此财务自由的startup投机型程序员,过得日子也是完全不一样的。所以我自己最大的失误之一,就是早期改行时还有一种偷懒心理,跟差不多先生一样,对技术并没有认真对待,总想着混日子、看热闹,几年后才后悔莫及。

    所以我的想法是,改行是人生的重要转折机会,不仅仅是专业上,更是人思维方式上和做事方式上可以提高自己的一个机会。因为在新的环境里,走出Comfort Zone的时候,年轻人往往能爆发出巨大的潜力,提升自己的境界和层次。

    因此,我也不同意改行者就要妄自菲薄:我这样改行的基础差,能找到个工作办H1B就行了!说不定,您是下一个贝索斯、马云呢?从我自己的经历来看,改行者如果持续追赶,并不难达到CS科班一般人的水平,当然不是刚毕业时,而是要毕业工作几年。

    我知道这会累。越是学习好、资质不差的中国学生,经历过了越多的磨炼和苦痛。想想大学四年辛苦学习的东西一朝随流水,今夜又重新走进风雨,那种对人的多年的持续打击,是很累。

    可是,把自己看成精英吧。以精英的标准要求自己。如果能坚持找到工作,再坚持完善自己虚弱的技术体系几年,想必最差最差也是二流大公司的待遇和机遇,并且是很有机会达到一流的。

    回报也是丰厚的。当你发现刚过30岁自己就拥有很多东西的时候,你也会越发地感激自己的努力。人们爱听传奇的故事,反转的故事,但是其实平凡和不出意料的故事才最真实。

    我跟很多人一样,胆子不够大,心思不够活络,心态也没那么好。但社会也并没有抛弃我们,因为我们还可以选择稳妥地走这条路,虽然累和苦,但是路途和目的地一直很明确。

    2-2 愿景

    从此文后,我假设你选择了改行这条路。

    首先,我恭喜你做出了正确的选择。多年以后你一定会记得我这句话。

    在开始一切细节之前,先闭上眼睛,想一想做出这个重大决定后的几年内,愿景是怎样的呢?

    ……

    ……

    20多岁的年龄,你来到这个国度,这片新大陆。你很喜欢这里——尽管适应需要时间,你却看到了这片土地巨大的潜力和机遇——以及更重要的:较好的起点和舒适的生活。

    可是你手上的资源不多,除了聪明的头脑和勤劳的双手,以及父母的祝福。你也知道,这条路上挤满了跟你一样的人。英语、生活、学业、身份、赚钱,每件事都不那么容易,任何社会,白手起家都不是一件容易的事情,时代的顺风车是可遇而不可求的。

    还好,你至少有聪明的头脑和勤劳的双手,以及最重要最核心的资本:年轻。

    于是你开始研究本专业的出路,以及其他行业。你发现道路其实没几条,大部分技术移民都走着庸俗、重复、竞争残酷而激烈的科研技术路线,CS是其中的最宽阔的道路,收获也很多很多。

    你开始激动和不安了:看着本专业无奈的前景,你隐隐约约觉得不妙;但另一方面,轻易地舍弃已经在读的学位、大学四年的投入,又是一个重大的损失。

    你开始不断打听,线上线下地。结果是沮丧的:有人告诉你,努力就会成功,人生的高度在于自己的积累而不在于行业,本专业也有无数大牛吃香喝辣;有人告诉你,这条路已经挤满了人,不缺你一个了,现在上车已经晚了;有人告诉你,经济危机很快就要来了,到时候满大街都是找不到工作的失业CS学生;甚至还有人告诉你,职业移民的大门就快关闭了,川普准备下刀了。

    你也许沮丧,但是直觉中,还是有种不安。总觉得哪里不对。

    可是你发现当你回到本专业时,已经提不起兴趣。你头脑混乱,各种想法纷繁来去,最后也许你会追本溯源用最简单的思维下决心:无论行业和人生有多少变数,统计规律永远不会错,任何与概率与统计做对的人,都最终没有了然后。

    于是你决定壮士断腕,舍弃过去,从Comfort Zone走出来,接受这个挑战。

    你隐隐约约感觉到:无论愿意与不愿意,你都将选择了一条艰难的道路。你也许会像老电影里那样感慨:“为什么我老爸,不是李嘉诚呢!”

    你也想像一些同龄人那样,读书期间去巴哈马或是夏威夷度假,去拉斯维加斯玩,去买豪车夜夜笙歌,去尽情挥霍和享受青春。可是你知道,你没有这个资本,至少暂时没有,无论时间还是金钱。你知道这样克制会累,会辛苦,会焦虑,会紧张,但是你也相信,这些付出终将有回报。

    因为你聪明,因为你年轻,因为你勤劳,因为你虽然没什么混社会的本事,但是会像傻子一样啃书本。也因为,你暂时没有更好的选择了:能走通的道路虽然很多,但你输不起,赌不起,耗不起。

    于是,成败在此一举。你扔出骰子,赌上了自己的未来。其实,不仅仅你自己,你的亲人,你周围的人,或多或少地,都因此而改变。也许你觉得这太夸大了,但是人生有些关键的步骤确实影响很大。

    20多岁了,你开始明白了这样一个道理:在这个社会,你最怕的不是竞争,而是你连上台竞争的机会和资格都没有。你全部的希望,就在于能上台竞争。

    于是,你开始行动:制定计划、申请学校、筹集金钱、走出Comfort Zone、走进风雨。你不知道该怎么办,你什么都不会,除了你内心中最焦虑的“专业前途”被缓和外。

    你开始focus,开始读书,开始上课,开始讨论,开始做作业,开始照着傻瓜教程一点一点的学习积累。你惊恐地发现,学期很快就过了一个,1/4的路程已经就混过去了,即使成绩还不错,你还是什么都不会。你心情沉重地看到科班出身的同学已经拿到大厂的intern贵宾一样来到硅谷,而你连一道算法题都不会,简历都没有准备,看到Job Description上的一大堆技术名词你惊恐的发现基本上都不认识。

    你开始怀疑,时间是不是不够了?我真的选对了吗?可是你也明白,骰子已经掷出,没有回头的路了。你像克里斯托弗·哥伦布船上的卡斯提尔水手,即使相信大海的尽头是悬崖会摔得粉身碎骨,却依然跟着他战战兢兢地航行。

    你开始慢慢知道,要刷题,要准备project充实简历,要上课,要忙碌,学校教你的那点课程最多能骗过外行。你放弃了很多:吃喝玩乐,活动,社交,因为你发现时间是你最缺乏的东西。你在与时间疯狂地赛跑。你开始慢慢发现CS更重视操作和实践,你也开始刷题,尽管连LeetCode的Easy好多都完全不会只能笨笨地去读答案。

    时间,就这样流逝着,不会因为你的努力和不努力而有丝毫你停留。

    快毕业了,你的头脑依然混乱,却开始能断断续续地说自己做过了哪些project,哪怕很简单的东西;你开始会写白版,尽管碰到会的题还是可能做错,或是紧张时连最简单的语法都忘记了;你好歹有个东拼西凑的简历,不至于是一张白纸了。科班出身的牛人已经大摇大摆拿到Google或是Facebook的offer准备毕业旅行然后爽一爽了,你只能继续忙碌。

    你对毕业典礼没什么感觉。因为真正的毕业是拿到第一份工作的工资。你投出的简历大多数石沉大海,少数的面试也被弄得一塌糊涂然后没有了下文。你开始有种恐惧感。搬家到硅谷,继续改简历,继续求内推,继续刷题。生活简单而重复,单调而无趣。

    终于慢慢的,你开始拿到面试,开始onsite,甚至有一天,你拿到了一家小公司的offer。你欣喜若狂——你觉得即使只有7万美元一年,也足够了啊!你仿佛看见了辉煌的明天。当拿到第一份工资,压抑许久的你觉得自己是世界上最富有的人。

    你受不了单调的刷题和面试,你渴望上班,接受了offer。开始上班族的生活。你觉得自己转CS吃了这么多苦,压抑了这好几年,算是出头了。尽管,真正的故事,其实才刚刚开始。

    上班了你发现眼界大开,工作中学习的效率更高,慢慢开始接触各种技术和产品,慢慢开始懂了软工的运作和组织。然而最多半年,你就发现——钱实在是不够用,公司不给办绿卡,勉强混个温饱而已,房子想都不用想。你不得不重新审视自己。

    好在,你也不是那刚毕业的糊涂蛋了,开始有工作经验了。冷静地刷题,开始向二线三线大公司冲击,目标简单:办绿卡、再多给点。依然不那么轻松,带着数年的疲劳,你勉强拿到了微软、亚马逊、EBay、Cisco之类的二线公司,高高兴兴地去上班了。

    2-3 目标(重要)

    前文算是心灵鸡汤,本文回归现实。

    现实对改行者是很不利的。如果我说,你随便转个行就能比科班的人强,那我一定是骗子,或者是培训机构。我不愿意骗你们,我可以说,改行者的现实是很不利、很残酷的。

    我深有体会的是以前看过一个CS科班出身写的一段话,大概意思是:科班出身(本科学CS的,下同)看似没有什么优势、在本科也浪费了很多时间、最后找到的工作跟改行者可能也差不多;但哪怕即使是水平一般的科班,其基础和积淀也不是优秀的改行者所能媲美的。

    这段话怎么理解?我不觉得是歧视,说出了一些事实。

    就我自己而言,我到今天,已经毕业多年,也一直感觉基础是自己最弱的一环(当然,这里是跟同级别、身边的程序员比,对二线三线大公司的普通程序员应该还是碾压的)。无论是刷题准备面试,还是工作中。 当然,现实工作中并没有受太大影响倒是真的。毕竟工业界和学术还是有距离的,简单的来说,有时候阅读能力、学习能力远比基础重要:不会不要紧,现学现卖么。

    其中的道理其实超级简单:人多学了4年,而且还是在好学、精力集中、年轻时的本科阶段。想靠两年硕士学习就打败4年本科+2年硕士出身的科班,其实根本不现实:说到底,就算你牛,人CS科班也是牛人很多对吧?你努力,人CS科班的难道在睡觉?而且,必须承认本科CS出身有很大的先发优势,改行者其实追赶得非常累,比如CS科班就容易找到实习,改行的就很难,所以两者的距离是进一步放大的。

    所以我反对两个极端:(1)学习CS需要循序渐进,不能一蹴而就;(2)CS不需要基础,培训培训编程高中生就能上手。

    反对(1),是因为改行者来不及,除非从本科学起,实效性差,时间和金钱资源消耗太大;

    反对(2),是因为类似饮鸩止渴,短期有一定效果,长期来看发展受阻;

    我个人认为的折中道路是:早期重视面试和实用技术,快速找到第一份工作,快速解决最基本的金钱和生存问题;找到工作后的中期反而注重基础和进阶的知识,同时刷题、系统设计等慢慢跟上;到后期时因为基础、工作、面试方面都不弱,综合起来可以开始冲击一线大公司或是创业公司,此时的实力才赶上科班出身。

    整个过程应该至少给5-7年的时间,更多也不奇怪。有人限于资质和努力,但主要是个人追求不同,一生可能就停留在早期或是中期,也是很正常的。

    早期大概是0-2.5年,主要是读书期间,以找到第一份“正经”工作为结束标志

    中期大概是2.5年-5年甚至8年,主要是工作早期,H1B时期,兼排绿卡,加强基础的时期;

    后期就很灵活了,每个人都有自己的玩法,不提;

    天资高或是机遇好的人很可能极大地缩短这个过程,比如名校改行的毕业就进一线大公司很正常,相当于是早中后期一起同时完成了,不在讨论范围内。

    有人肯定会说有没有捷径或是其他路线。当然是有的,可惜我不知道、不清楚、没试过。知之为知之,不知为不知。我之所以建议这样,也是因为当前(2018)形势下,这条路应该说最中规中矩,并且按投入产出来说,回报的数学期望很高。

    那么我试着定一下最基本的明确目标:(Primary是必须完成的,Secondary是可选(optional)的目标)

    *早期:(我自己处在早期)

    (1) (Primary)找到一份Developer的工作;

    (2) (Primary)该工作支持H1B抽签;

    (3)(Primary)该工作是永久性(FTE)工作,非contractor;

    (4) (Secondary)该工作年收入大于80K(湾区标准,其他地方自己调整,下同);

    解释:(1)中对developer的要求是为了职业前景,暂时不考虑Support,DevOps,QA,Tester等情况,后面具体讨论;(2)是为了不浪费OPT,尽可能地最大化H1B概率,移民的重要步骤之一;(3)是为了保证工作稳定性;

    早期阶段的整体难度:很高。

    中期:

    (1)(Primary)找到一份支持办绿卡的Developer/Engineer工作;

    (2)(Primary)年收入大于120K;

    (3)(Secondary)该工作是至少2、3流大公司;

    (4)(Secondary)该工作技术是主流;

    解释:(1)是关键,移民的重要步骤之二;(2)不解释;(3)2、3流大公司有助于build resume;(4)技术主流很重要,对后面自身的市场价值有利、跳槽有利等,是长期投资;

    中期阶段的整体难度:一般。

    后期:

    (1)(Secondary)找到一流大公司,热门startup或是舒服的大公司;

    (2)(Secondary)年收入大于240K;

    (3)(Secondary)技术先进;

    (4)(Secondary)Work/Life Balance好;

    解释:后期没什么可说的了,基本上都是optional的目标。

    后期阶段的整体难度:无,因为没有必须完成的。如果实现全部Secondary,很高。

    所以整体来说,最困难的是早期:早期看似时间多,有全职找工作的2.5年甚至可以拖得更长,但也是难度最大的,因为基础和经验都是从0开始的。学习相对低效,很多东西都不会,连听都没听说过,更别说建立成熟、有效、适合自己的学习方式了。

    同时,这一阶段往往也是刚到美国后生活、语言等方面的转变时期,所以要花费很多额外时间。

    这个阶段还因为资金有限,经济上的压力也很大,必须规划好财务(假设钱很有限的情况下),防止在找到工作前生活费烧干的困窘情况。有人可能说可以打工啊。的确如此,但是个人不推荐,除非万不得已。毕竟打工消耗了大量时间和体力,短期解决资金,长期看则消耗了大量机会。

    很多心智不够坚毅的人在早期的压力也是最大的。无论是适应一个新领域,还是面对自身以及周围的压力都是很有挑战性的。

    一旦找到第一份工作,一切就会好很多。因为一旦有工作经验,就开始了正反馈过程:经验带来了更多的机会,更高效的学习,更优越的环境和更好的起点。后面的难点可能来自于需要花费大量的下班时间加强自身。CS是一个终身学习的行业,这个恐怕是共识。那些技能简单陈旧、“简单而且能干到老”的职业很可能在接下来30年中面临失业的挑战,被自动化和AI所取代。

    心灵鸡汤

    知乎上年轻人多。其实20多岁的年纪,腻烦或是喜欢心灵鸡汤都是正常的。腻烦,是因为逆反心理、年轻有活力、够反叛;喜欢,是因为年轻,还有梦想,喝鸡汤当汽油烧。

    很多知乎大神也都炖得一手好鸡汤。我不善于这个,但想借机说说:的确,尤其是改行早期,因为比较痛苦和煎熬,是需要一定心灵鸡汤的,换句话说,执着的态度和坚持。

    人的精神是可以调整的。为什么这么多改行者生存下来并且活得很好?虽然很多不利,但是这些人大多能坚持、善鼓舞自己,逐渐就柳暗花明了。

    喝鸡汤差不多是最廉价的兴奋剂了,还没副作用,为什么不喝呢?到我这个年纪,鸡汤基本上就无效了。在早期学会激励自己,是蛮重要的技能。

    2-4 工作与求职初步(1)

    正常情况,新进入一个领域,当然是要从读书、学习开始。然而在一切之前,我想先谈的是工作和求职。

    这不是本末倒置,我个人认为,这恰恰是新手最需要的big picture。

    要知道,我想写的文章不是培训资料,一点一点教什么是array,什么是linked list,什么是几种sorting。过去15年间,这类资料在网络上已经极其完善了,更别说还有经典教科书。即使是新手,也是可以仅仅通过搜索引擎就开始自学的——如果你完全做不到,我则建议慎重考虑改行。

    如果读网页慢、没动力,你也可以立刻找免费的教学视频,开始看开始学。但你一定也有这个问题问自己:我学这个有用吗?我先学这个对吗?

    所以新手最缺乏的其实是:如何学习知识、如何判断哪些知识有用、缺乏大局观。正常情况,这些大局观都是在漫长的学习中慢慢体会和积累出来的。

    上文已经陈述过、我这里再引申和强调一下:改行者最需要的思想是:不是把所有东西都学好,而是把CS的知识体系按重要性排序,从上到下,先学最重要的,然后逐渐掌握整个体系。

    我相信很多科班出身的人不同意我的想法。的确,我的想法基本上是旁门左道和异类,但是我个人认为更适应速成、早期严苛的生存环境,毕竟你只有2.5年的时间(根据前文)。

    举个例子,比如汇编语言(Assembly Language)。汇编语言我在读研究生时也学习过,其实很有利于理解计算机底层,几乎是CS本科的必修课。但是,对改行者来说,我个人认为意义很小,因为面试中基本上没机会碰到,职位又非常少,即使招人恐怕也不会考虑改行者。

    那么在我看来,这门课就是“没用”的。之所以打引号,是因为“没用有用”的判断是基于早期的现实,而不是整个知识体系。改行更像是个投资游戏:如何把有限的时间,投资到最有用、最有收获的知识上,达到最大的收益。当你拿到offer、开始工作、开始有富余时间时,回头多看看汇编语言补充基础是非常好的选择,但不是现在。

    再举个例子,可能更有争议:C++的Virtual Table的实现,其实也算是很常见的知识了。我不敢说有用没用,但假设改行者干脆说自己不会C++,面试中可以说基本上不会考到这个问题;当然,不会C++也会导致一些职位不被考虑。

    C++中的内存管理也很有用和复杂,但如果改行者基于Java甚至python等语言,虽然牺牲了部分对内存管理的理解,但却提高了学习速度。

    这里必须提前介绍封装思想(Encapsulation),因为我觉得Encapsulation不是CS独有的思想,而是通用思想。

    什么是封装呢?假设你有一个手电筒,你唯一知道的是打开按钮就会发光,关上按钮就会灭掉。你是否知道这个手电筒内部是怎样的呢?比如灯泡是什么,灯泡里面是什么,电池怎么连接的呢?不需要。我们可以认为手电筒的实现(Implementation)被封装了起来。

    封装的伟大在于,把一个复杂的体系使用简单的接口(interfaces)来表达其功能,然后这个体系可以作为一个整体,仅仅用自己简单的接口去参与组成更复杂的东西。富士康上流水线的工人知道Iphone的组成原理么?不知道,但他们依然能制造Iphone;同理,微信、FB、Google的产品都异常复杂,但单个程序员并不需要知道全部,只是注重于自己的部分即可。

    这些定义都是废话。但对学习的启示是:为了高效率地学习,你需要知道哪些细节和知识是封装的、不需要你去了解的,哪些细节和知识是你必须拆开详细看的。

    工作中其实原理也类似:公司招人不是培养全才、通才,而是要完成任务;完成任务则需要使用已经有的很多工具,这些工具都是封装好了的,拿去用即可。

    用封装的思想回到C++的内存管理话题:如果学的是Java,直接可以认为Java的内存管理是可以封装的,只需要知道最基本的一些概念(比如新的Object存在Stack还是Heap等)即可,而没必要去过于纠结底层细节。

    事实上,Python等语言的火热,正是证明了人们越来越喜欢封装型的编程语言:简单、容易上手、易于理解。改行者也需要从Java、Python等语言入手,主要是以较低的难度入手,封装了绝大多数烦人的细节,先去熟悉环境和最基本的编程,当能力逐渐增长后,就会对各种知识开始有自己的判断力。

    然而,封装绝不是最终目的。程序员和工程师要学会破坏封装,就是说同样的手电筒例子,正常人只要会开关即可,程序员和工程师要逐渐学会如何打开盖子,换电池、换灯泡,甚至后面可以自己完全拆开、拆碎、组装回来。

    那么,谁是上边这些问题的裁判和权威回答者呢?

    从大的角度:市场,市场就是经济社会的神;

    从小的角度:公司和求职;

    下文会具体说公司与面试。

    2-5 工作与求职初步(2)

    承接上文的主题。

    在大公司工作的感觉是怎样的?(知乎有类似问题、答案,不展开了)

    年轻人可能想象的是:西装革履、窗明几净、俊男美女、精神抖擞,每一个project都影响千万人级别的用户……

    实际上未必不是,但至少我看到的是:穿着普通的码工,皱巴巴的衣服,还有不少印度风格的拖鞋,好多人打着哈欠双眼无神;工作环境类似网吧,吵吵嚷嚷人声鼎沸,还有不少中国人直接用中文叫喊。以前在某公司,独立办公室,还有人写程序到一半,忽然一看表,毯子一铺,跪在地下冲着某方向就开始磕头,路过的人吓个半死。

    某国是个多民族、多人种国家。公司只看能力和产出,不太在意这些不相干的。评价一个员工,也只看是否功力深厚、贡献杰出,不看背景和表面、改行与否、出身如何。这也是某国最有魅力的一点,乱糟糟中自有一种天然的秩序。

    在大公司工作的实际内容是怎样的?

    这里有一个误解:并不是公司越大越著名,工作难度越高。IT不是Rocket Science(其实Rocket Science的工程师赚得也不多,据说SpaceX很多人不过9万年薪),更多的是每个人只负责很小的一块——所以整体的结构是极其复杂的,但是到每个人头上并不如何困难。原理上文讲过了:封装。大公司的绝大多数产品和架构已经相当成熟,有很多工具(Tools)和文档可供使用和参考。

    有人时常说从头做一个东西多么多么困难。这话对,也不对。对在于,从头设计一个产品,相当于创业,的确非常非常困难而且涉及到很多技术细节,更别提一款盈利的成功产品需要程序之外的很多东西——市场、设计、沟通、运营;不对在于,如果只是在大公司工作,是不需要那么多的“从头做起”、“理解全部东西”的,更多地只是对当前系统修修改改然后进化。后工业时代,绝大多数人都是超级流水线上的螺丝钉。

    尤其是新人进了公司,大部分从修bug、较为简单的活开始做起,逐步了解一个组的产品。类似之前比喻,假设这个组是做手电筒的,一个人刚进去可能只是给手电筒的按钮涂个别的颜色,慢慢地学会了换电池、拆手电筒、换灯泡。

    但这不代表IT是个简单的工作。越是对技术不太懂的,越不尊重IT技术人员,以为谁来做都一样。要知道,我讲的这些只是初级、中级程序员的工作,高级以及架构以及产品等部分,是相当复杂的,人可以说是决定性因素。并且,哪怕初级的程序员,做事效率差上几倍也毫不稀奇。

    那么大公司看重的是什么样的人呢?

    (1)能写程序的人。这是废话,但是其实这条很关键必须说,是刷题的理论基础。刷题后面会讲,是找工作最重要的一部分。基础再好,人再好,说一千道一万,不会写程序,也就告别了程序员;要知道,IT企业最核心的生产力,就是那些boring的一行行的code,或许还有data,可是data终究来源于code。

    (2)聪明的人、善于学习的人。有基础、能写程序,但是还要熟悉产品熟悉业务熟悉code base,所以学习能力很重要,聪明的人更是容易抓住重点。这里要强调,“聪明”不是IQ高,而是“对方认为你聪明”。努力是给聪明加分的,所以智商一般的人能不能当个好码工?我认为也是可以的,用其他技能和时间、方法弥补。

    (3)好相处的人、积极的人。大公司做人,小公司做事,这句名言其实在美国也是对的。当然美国人用一些词汇什么Leadership之类的来掩饰。好多年轻人问:为什么我题都做出来了,没拿到offer,这方面没有做好有可能是一个原因。我们中国人在这方面相对弱。

    大公司是如何招人的呢?

    要知道,大公司面试很像高考之类的标准化考试,但是目的不同:标准化考试的目的是客观,尽可能地在最大范围内达到客观、公平,给出可比较的分数;大公司面试只有一个目的:用最小的代价,挑选他们最想要的人。

    因此,不要用“公平”或是“合理”来评价面试内容和方式,那是高考遗毒。面试结果只有True和False两个值,至少新人没找到工作前,可以这么认为。

    我个人也曾很抗拒这种面试方式,但是工作几年后,我发现,的确没有更好的办法。不要低估资本家和市场的智商,如果你认为他们傻,很可能是社会经验不足,或是没有统计概念。

    具体步骤也简单,无非两步:(1)简历; (2)电话面试+onsite;都过了就offer了。

    但却需要人数年的努力。所谓台上3分钟,台下10年功。

    第一关:简历。要知道,公司的人是很忙的,简历由HR先审核。很多国内的小朋友不知道,HR在美国只是个中转作用,权力不大,工资不高,人也不懂技术。那么她们一般怎么筛选呢?

    (1) 最关键的,看背景。比如这人简历有大公司工作经历,那么面试其他公司就很容易拿到了;没有工作经验的人,则看是否有学历,以及学校牌子如何;

    (2)看project和过去的经验;

    (3)看关键字,比如Java、C++、Hive这些技术名词,其实她们也未必了解多少;

    其实这个过程很随机:想想可以理解,看一份简历感觉挺有趣,看100份就想呕吐,天天看则完全麻木。要从HR的角度去想求职的过程,很多问题不要总想:“这样对我不公平啊”之类的。说不定HR今天感冒了,拿过你的简历就擦了鼻涕,或者说心情不好,今天看到的全拒了。

    好在,公司很多,一流大公司就有5-10家,不用说二流、三流甚至不入流了的。

    第二关,面试。

    面试是最重要的一部分。有人把CS找工作概括为刷题,不见得完全对,但算是颇为有概括性了。面试的种类繁多,难以一言概括,但是无非是要求:

    (1)这人的简历是真实的,不是瞎吹牛;

    (2)这人有能力、有技能、进来后能干活;

    (3)这人的情商和合作能力不太差,进入公司后可以合作;

    (4)这人的技术和能力的深度与广度;

    这里面大小公司是不太一样的:大公司不在乎面试人的具体技术和技能,因为进去后可以培训或是自己学,所以更在乎面试者的个人素质和基础;小公司则相对更重视技术和技能对口,因为小公司生存是第一位的,没时间培训、最好来了就开始产出。

    当然,求职是双向选择,公司也会根据自身的水平和薪资去调整要求。要知道这是个充分竞争的行业,所以公司招到满意的人不难,但是人来不来、来了能待多久,可就是另一个问题了。

    为什么我先讲这些?
    这些都是老生常谈。随便搜一个帖子或是资料,大概都有以上信息,我为什么要重复一遍?

    是因为我想拿这些作为例子,来教改行者如何判断——重要的不是这些信息,而是你判断问题的思路。

    比如好多人问,要不要读个master,还是直接刷题?其实这就是简历关的问题:有个CS Master会大大提高简历被选中的概率。但有的人可能有PhD学位,所以Google等大公司也会给面试机会,那么CS Master似乎又不是非常必要的了;比如最近ICC“被迫”招大量绿卡和公民,那么假设有身份先进ICC,以此为跳板再跳,也是一条路。

    所以我觉得,分析问题时当牢记简历、面试这两关,很多问题就迎刃而解、无师自通了。

    比如有人又问,要不要做些side projects(课后、非正式、自学性质的project)?对于改行者来说,如果有机会,要,因为这为简历增色不少。改行者简历关是很挑战的。

    再问:要不要学ML、DL这些,我的想法是不要,难以深入,而且面试时不会考到太多。

    再问:要不要毕业后搬到湾区?我的想法是要,因为公司都倾向于面试本地candidate。

    所以,我之所以写这些拾人牙慧的东西,是为了说明:一切以简历、面试为纲。

    这么做会不会太功利了?我知道肯定有少年这么问我。

    没办法,不这样,没法集中起所有的资源。改行者的初始情况就很糟糕,必须弯道超车,这也是我在前几篇文章中一直强调的。

    所以,先说说我自己认为的要点:

    (1)大多数年轻的改行者,还是需要一个CS Master作为敲门砖和过渡;

    (2)自学、选课、projects、tech stack、语言……一切细节都以简历和面试为纲为目标为轴心;

    (3)改行者需要抬头看路,规划好,不断根据目标和现状调整自身状态和方法,需要较高的主动性;

    (4)除了具体知识,改行者需要把简历、面试当做一门学问来研究,长期关注;

    我知道很累,很烦,很无聊。可是,别无选择。

    相关文章

      网友评论

        本文标题:[转]改行CS导论 第二章

        本文链接:https://www.haomeiwen.com/subject/qibtsftx.html