看过了简历中Project的写法,可能很多人会感叹我知道Project怎么写了,但是没有Project怎么办。这里聊一聊怎样从零开始完成以一个新的Project以及如何提高自己现有的Project。
起因:简历中的Project为什么重要?
简历中最重要的部分是Projects:无论你是否转专业,无论你是否名校毕业,Projects几乎决定了你是否可以进入面试。虽然刷题是准备面试过程中不可避免的一个部分,但是刷题没有办法写进简历。结果就是,即使你刷题无数,Leetcode倒背如流,没有好的Projects任然无法进入面试。
如果简历submit之后几乎没有面试或者进入面试比例很低,那唯一的解释就是你的简历不行Project太弱,所以竞争不过别的candidates。这个时候再反复刷题也是没有用的:你进入不了面试就没有做题的机会。这对于旁观者来说是一个再清楚不过的结论,但是当局者往往会有“也许下周就电面了呢还是再刷一遍题吧”的幻觉。世界就是这么不公平,旱的旱死涝的涝死,如果你觉得自己不像是会“涝死”的那个,那你肯定是“旱死”的那个。
在论坛上能看到很多人,吐槽自己做题全对仍然没有进入下一轮面试。这里可能的原因其实有很多,比如公司政策变化,或者面试官喜好等等。但是这些原因中也有一种可能:面试官觉得你project太low,只是擅长刷题而已。其实刷题真的有用吗?真的能代表你的编程能力吗?至少在我这里是有问号的。个人感觉刷题这个步骤有点像高考:不能检验能力,但是又是一个没办法替代的步骤。面试官对此也是心知肚明,所以在面试官的心目中,刷题的结果也未必有你想象的那么重要。实际上,面试中因为聊简历聊的太High结果没时间做题或者做题没做完但仍然进入下一轮面试的例子有很多很多。
问题:现有的Project比较弱怎么办?
很多人都问过,哎呀学校的project很水怎么办,哎呀新技术不会怎么办。我还能怎么回答,要么去学,要么去死呗。选择去学的话,下一个问题就是怎么学。大部分同学的思维方式还停留在找tutorial的阶段,希望找到一个无比详细的tutorial能够手把手带你做出一个完整的Project然后直接放在简历里就好了。但是如果事情只是这么简单的话,你现在就不用心怀焦虑来看这篇帖子了。
不是说tutorial不好,而是说,一个tutorial不够支撑一个project。优质的tutorial有很多,但是通常只会以教学为目的,针对一个具体的技术,力求完备且在细节上解释清楚。但是对于简历中的project描述来说,首先只有一个技术是不够的,其次特别琐碎的细节写在简历上是没有意义的。举个例子,Django的tutorial会详细介绍某个function如何调用和参数是啥。但是你简历里的Project显然不能只用到Django,也不能把参数这种琐碎细节写上去。
在准备project的过程中,一个更合理的办法是,你需要把多个技术攒成一个大型复杂的系统。我们先看一个例子,假设我们决定做一个股票分析系统作为project,那这个project应该怎么攒呢?大致可以有这么几个模块:
- 可以有一个类似Scrapy这种crawler来解决数据输入
- 如果想做big data,可以用hadoop之类的技术做大数据处理
- 如果想做machine learning,可以在股票信价格上用TensorFlow或者Sklearn做相关的数据分析
- 如果想做NLP,可以用python NLTK分析一下股票相关的news或者tweets
- 如果想做web,可以把股票相关的信息用一个类似Flask或者SpringMVC或者VueJS这种Web架构展示出来
- 如果想做visualization,可以用javascript(d3.js之类的)画一些复杂的graph作为展示
- 如果想展现一下对architecture的了解,可以做一些microservice上的设计,比如load balancer或者web cache等等。
这里列出了7个item,实际上你只要从中选择2个以上就已经可以成为一个相对复杂的Project了。有些Item可以合并,比如big data和machine learning就可以用Spark和Spark MLlib来完成;同样Visualization也可以作为Web frontent的一部分。合并还是分开,取决于你是否有单独的细节需要强调。
既然说到细节,那其实“现有的project比较弱”往往也是因为缺少细节。这里我再聊一下Project要有哪些细节。我觉得一个合格的project,要包括三个方面的细节:
- 开发环境,尤其是开发语言
- 相关Framework
- Framework的plugin或者module
大部分Project容易有Framework,比如做ML的用TensorFlow,做mobile app的用Android SDK之类的。最容易缺少的反而是第一条,开发环境和开发语言。一个原因是,很多人以为写个Framework就自带了语言,但是实际上Hadoop,Kafka, ElasticSearch这种framework可以用多种语言做二次开发,你不说别人只能猜。还有很多人只写我做了什么,比如我做了web cache,我做了database,连个名字都不给,谁又能猜到你是怎么做的。
重点解释一下为什么要写Framework的plugin或者module,这个是对Project的加分部分,但是大部分人做的都不好。先说一下为什么Framework本身不够:大部分的Framework即使再复杂,入门都并不困难,甚至其本身往往就以容易入门作为设计标准。以ReactJS为例,follow一个官方的tutorial只要1个小时都不到。结果就是如果project只写一个react,那面试官更容易认为你只是follow一下教程简单调用了一下,并没有多少深入的了解。这显然不是作为candidate的你希望看到的结果。为了避免这种情况出现,你要在简历中同时提及Framework的plugin,比如基于react的redux,redux-form,redux-thunk等等。有些Framework可能也不像react或者Django这种有大量的开源插件,通常这样的framework本身已经有比较完备的功能,我们可以提及其内部的模块或者相关工具,比如Spark内部的Spark MLlib。有这些细节支持,才可以证明你不只是简单调用了一个Framework,而是对该framework有深入的了解。
基于上面的描述,我们可以把一个project总结成一个表格,横向代表project的广度,纵向代表project的深度;每个cell是一些可以选择的各种技术。下面的表格中给出了一些例子。
前面说了这么多,其实总结一下也很简单:用Framework去证明你对编程语言的掌握程度,用plugin/module去证明你对Framework的掌握程度。看到这里,你是不是应该把自己简历中没写清楚的language或者framework或者plugin先补上?
解决办法:
策略一:现有Project增加feature
其实大部分人的Project都来自作业,大学里的作业什么样大家也心知肚明。很多人当初对待课程Project的态度就是挣个成绩,所以其实也没有太过认真对待。其实大部分的学校Project会利用一些Framework来完成一些简单的入门,比如很多big data相关的project都会利用spark或者hadoop做一些简单的分析。简单的入门对于找工作当然不够,但是你可以基于这个主框架增加更多的feature,完善更多的实现细节。比如如果学校的project有提供现成的数据,那你就可以想一想自己应该如何收集数据;学校要求的分析只是简单的统计结果,你就可以想象怎么做visualization。对比上面的表格,你肯定总能找到可以增加的column。总之,你可以在已有project的内容上,添加更多的feature,在证明自己的编程能力的同时也能有效的把自己和其他同班同学区分出来。
策略二:增加新Project
如果对自己的project实在是不满意,那除了准备新的project也并没有别的办法。上面的表格已经做为例子给出你可以做的各种project,问题就变成了你怎样从中选择,比如你主推哪个语言或者哪个Framework。一个选择的思路是,根据自己心仪公司的职位描述,选择适合该职位的技术。另一个选择的思路是,找出若干公司和职位的技术交集进行准备。其实具体怎么选也未必特别重要,因为无论你准备怎样的project,入职之后要都学新的东西做新的项目。对面试官来说,重要的是,你要有拿得出手的project来证明自己有足够的开发经验和能力;这样面试官才能相信招你进组之后你能胜任之后的工作。
策略三:Resume as ToDo List
其实大部分人的问题并不是要不要准备新的project或者feature,比如你投出去的简历全部石沉大海,那答案还不够明显么。大部分人的问题是,应该怎样在非常有限的时间里准备新的Project。其实我和很多人都说过,我对一个朋友很多年前的一句话印象深刻:“我达到我简历上的水平还需要3个月的准备时间”。这句话的背后的意思就是,你可以先把自己的简历当成一个todo list来写,简历投出去之后再恶补简历上的内容。前提当然是你要保证简历上写的东西是可以实现的。如果你需要学习新的技术,我个人认为一个比较快的办法是先看youtube,理解概念了就可以先写简历了,简历投出去之后再去动手implement。很多人看到这里会问,那如果面试被问住怎么办。面试被问住的前提是首先你要有面试。好比下周就期末考试了,你问我现在临时抱佛脚会不会考试不及格。我能说啥。你先抱了再说嘛,考不及格然后重修,还是直接重修,你自己挑呗。
策略四:至少一个核心project
你未必会有时间增强所有的project,但是你要从现有的project中挑选至少一个作为主推的核心project。这个核心project要大型,要复杂,要最能代表你的开发能力。你在面试开始的自我介绍里要主动介绍这个project,你在被问到behavior question的时候要以用这个project举例回答。你要知道这个project在你所有的project之中最有价值。牛人之所以牛就是因为有这种核心project还不止一个。有FLAG或者BAT实习经验的人,核心project理所当然的是你的实习经历。如果没有实习,那你就要自己找到,或者准备,这样的核心project作为简历的卖点。个人的感觉是,找工作的过程其实是一个反木桶原理:增强最长板远比弥补最短板有效有用的多。
写在最后
周星驰版鹿鼎记里,韦小宝问陈近南有没有武功秘籍可以防身,陈近南给了韦小宝一个很薄的小册子。韦小宝正开心说内容这么少,陈近南解释说这本只是武功秘籍的目录,那边一墙的书才是武功秘籍本尊。本文也类似,最多只能起到一个todo list的作用,一家之言,效果的好坏也取决于你对于这个todo list的完成程度。其实找工作也是一个学习的过程,你需要有悟性,有调整,有计划,有实现。可能会有更高效的办法,但肯定不会有捷径。这里悟性和调整可能是最重要的,因为很多擅长考试的人刚开始找工作会发现很多事情和想象中完全不一样:往往到了这个时候时间都会紧迫,问题就变成了,你要怎么去调整,你的调整会不会有效果。这里写的都是个人的经验总结,能对你起到多大的作用,就看你怎样做出选择啦。
===
这里不能留言,如果有任何疑问,欢迎在我的个人网站(cvmentors.com)上讨论: