自己的不聪明是很早就认识到了的。高中无论怎么学三年里任何一次数学考试从来没上过130,而且一不小心就会在及格线边缘徘徊,理综满分300印象里就没突破过220,最后高考180来分,进了个二本。我就是那种牛逼中学里典型的垫底学生,不聪明,学习一般认真,但就算认真怎么也学不上去的那种。
小时候对电脑感兴趣,高考虽然分数低,走了狗屎运报了现在大热的计算机专业。进去之后就被网上和学校里的大佬教导要熟读各种经典名著。
C++ Primer这个书看了两百多页还写不了什么像样的程序,最重要的是因为细节太多,读了后面忘了前面,读了快四百页后放弃了,带着习题集还在家里的书架上吃灰。
有本书叫计算机程序的构造和解释,英文缩写SICP,当时看书评觉得这书可牛逼了,MIT EECS的一年级教材。我虽然读的是二本,但看看人家牛逼学校的教材还是可以的吧。结果是前两章翻完就开始怀疑自己智商了,到了第三章连最简单的习题都不会做,放弃了。
学Java,学到多线程那块就感觉很吃力,网上常见的多线程面试题都不会写。后来我学了Python,Python这种语言的性能太差,以至于用这种语言的人一般也不会关心多线程和高并发相关的问题,无论是语言本身和面试难度,都太适合我这种笨人了。我后来就再也没写过Java了。
学算法,听说有本书叫算法导论,也是MIT的教材,买来之后翻阅总时间不超过两小时,放弃了,因为真的看不懂。
刷算法题,看网上都说刷leetcode刷几百题方能斩杀面试中的算法题,刷题要会举一反三。我自己花两个月才做了大几十题,没见过的题基本还是想不出思路,哪怕告诉你这题需要用什么套路都想不出来。再简单的动态规划,只要是没见过的题,状态方程就绝对写不出来。
做MIT的分布式系统课程6.824,有四个lab(大作业),我用了正常MIT学生几倍的时间,还得参考了其他人的解答,才能做到lab 4,写了一个多月还是解不了最后的bug,放弃了。
就这样在学校混了几年,招聘时发现即便是我这种水平的菜逼也拿了几家大厂offer,最后挑了一个名气最大的走了。后来总结了一下原因,自己能进来的最重要原因是看了很多书,虽然没看懂,但见的多了吹牛总是会的,隐隐约约感觉自己这方面可能有特长。现在一家Java为主的公司里却基本不会Java,只能偶尔写写脚本和小工具。幸好现在的主业已经不是写程序了,写写方案,推人干活,牵线搭桥,吹吹牛逼这类事干的还不错,所以绩效也可以。
写了这么些话是想说,其实不是每个技术人都适合写程序,也不是每个技术人在互联网公司里只能干写代码的活。如果发现自己的特长不是写代码,给自己换一种方向,也许未来就有另一种可能。
好像很多人对怎么吹牛感兴趣。那我来说说怎么吹牛吧,能吹牛的前提是听话的对象不太懂你说的东西,所以什么都不会是很难吹出来的,还是得有点货,只不过你对这些东西不需要是真正懂的。
我写过网络编程框架,写过带分片和健康检查/降级的Redis连接池,方法是基本照抄网上的玩具项目代码,顺便可以把一致性哈希这类东西自己写一遍。这类玩具的特点是没有经过真实生产环境考验,test case也没有,单机跑跑就算是能用了,但能让你对一些东西有基本的概念。
做6.824的时候写过Raft库,写过基于主从的分布式KV数据库。其实我到lab 2就基本不会自己写了,放在MIT那种学校我就肯定要挂科了,所以只能参考网上的现成代码,再结合自己的理解写,写了很久直到最后一个lab,过不了大部分的test case,钻研了一个月还是解决不了,放弃了。做过6.828情况类似吧,做不了多久就写不下去了,也是参考别人的代码,最后乱折腾,还是弄了一个过不了很多test case的OS出来。
所以最后到面试的时候,我就是一个写过网络编程框架,写过Redis连接池,对分片和一致性哈希有自己的理解,写过Raft,写过分布式数据库,写过操作系统的人。虽然这些项目很多是照抄网上的,没有一个经历过生产环境考验,大部分都有很严重的bug,过不了很多的test case,我要是在MIT那样的学校我100%挂科,但这些东西校招面试的时候吹牛是绰绰有余了,只要投的岗位不是什么中间件之类的就行。