题外话:掘金的编辑器意外好用(感觉比GitHub的好用)。
第一章是随笔,大家可以跳过,后面才是干货
过去的结束,现在的开始
2017年5月,初夏,一个阴冷若雨风瑟瑟的早上,我与其他1000多名学生一起,参加了2017届的毕业典礼。学生们排着队进入布置好椅子的草坪,一一就坐。等几个领导和嘉宾演讲结束,教务主任和校长开始给同学们颁发学位。一位工作人员按字母顺序练出名字,听到的人就走上台与校长握手,接过学位。学生走上台时,台下会有一定的欢呼。由此可以判断你在学校的结交广泛程度。当然有很拉风的学生,也有不知名的学生。中国留学生毕竟少,也只有我们自己给自己欢呼。
我走了上去,全场寂静,我大学四年并不认识几个人,所以也是意料之中。不过,即使这样,我仍然无法忽视气氛的尴尬。强颜微笑,和校长握手,接过学位,再与教学主任击掌。我就在这寂静的“你没有朋友”的酷刑中完成了毕业的仪式。走下台,我回到了座位上。
我的大学结束了,没有欢呼,没有青春无悔的疯狂,也没有轰轰烈烈的爱情。这是没有青春没有歌,没有旅行没有酒,没有佳人没有梦的大学生涯。我的大学除了迷茫一无所有,除了知识一无所获,除了年岁一无所长。我高兴,因为终于可以脱离这桎梏我的囚笼。我暗自神伤,因为我没有留下回忆,也看不到确定的未来。无人问津的安静对我来说是最好的结束,也是最焦急的重新开始。
如果这些心理上的东西,或者情怀,并不重要。那么,务实的读者,我会告诉你,毕业之际,我没有工作。不管梦在哪里,现实总是要面对。没有面包的空腹容不下万卷诗书,没有铁鞋的赤足登不上高山雄峰。
所以,毕业之后我就开始了为期两个月的苦逼找工作生活。因为自己的租房到期了,还是寄宿在朋友的出租屋。(我实在编不下去文绉绉的小学作文了)
找工作
我其实从2016年的1、2月份就开始找工作了,5月分投了谷歌,11月份还去Onsite面试了。虽然没过。现在想起来,我觉得是那人问了一个很简单的问题,但是我想多了,把自己坑了。但是,2016年一整年就只有谷歌一家面试,所以还是有些压力。2017年知道5月毕业之前,我几乎没有任何面试,有几个HR和我联系过,但是都没面试。
可能是我找工作比较挑,我认为价值不大的工作就没几乎没投。
什么样的工作有价值?(针对码农)
- 顶尖公司:无论如何都可以学到很多
- 成长型公司:正是用人之际,新人也可以发挥作用
- 职位顺应业界趋势:这样你学到的技能在未来5年才有翻倍价值
- 公司的业务引领业界动向,或者解决重要问题
至少要有一个沾边,才是我眼中极具价值的工作。
刷算法题有用吗?
我个人是拒绝的。我大学四年每周编程40小时左右,按照1万小时大师的原则,4年都有8000个小时了。
拿LeetCode为例,简单的算法题看一眼就知道答案,完全是浪费我的时间。难的算法题是脑筋急转弯似的谜题,只能作为娱乐项目。虽然我90%的时候都做不出难题,但是我明白,我有更重要的东西可以学。
但是,对于大学没有怎么认真学习的CS同胞,我还是建议他们去刷题。因为几个月也来不及他们去巩固知识。
找工作途中的插曲
所以,在其他人刷题的时候,我自学了机器学习,还做了一个TensorFlow小教程放到GitHub上。如奇遇一般,居然在数个月之内得到了1000多个星。这是我第一次裸体式地感受到分享的力量。所以我内心非常感谢那些浏览我教程项目的开发者朋友们。如果没有他们随手点的星,也许我真的无法坚持过投简历被拒的这18个月。这是对我最好的鼓励。
时来运转,正因为我GitHub上千星,我陆续接到了一些HR、猎头之类联系,面试机会也多了些。甚至有被误认为是资深开发者的情况。小小地填补了一下我虚荣的心吧哈哈。
不仅仅是机器学习,我也利用拒绝刷题的时间,将我的Python能力提高了一个境界,同时从实现的角度学习了HTTP/2,还写了个基于HTTP/2的Web框架出来。我用不到2个月的时间,从对后端编程一知半解,到了有系统性的知识体系的程度。这就是重新造轮子的力量。
终于得到 Offer
经过了18个月的找工作碰壁的考验,我终于在硅谷一家教育公司找到了一份后端工程师的工作。得到Offer时,我几乎高兴不起来,只是松了一口气。
干货:新生入职两个半月的心得
我很幸运,刚上班就被委以重任,由我来维护和开发一个重要代码库。经过大概一个月的熟悉,我几乎可以独当一面,成为该代码库的主要负责人之一。因为不能说的秘密(暴露年龄),这个代码库有诸多明显的坑,所以我也被委以优化、重构、重写之重任。
组里的老工程师没有因为我是应届生就对我要求降低或者分配无关紧要的活。这让我感受到信任和责任。
工作状态
50%时间写新功能,30%时间Debug,20%时间优化重构。
软性环节心得
功能第一:我一开始过于纠结与设计的完整性和正确性,所以使得新功能的开发变慢。后来我意识到,没有将功能开发成功,一些设计或者优化都是空谈。所以,我在调整我的心态。
抱怨要伴随解决方案:我总是抱怨代码这里有问题,那里有问题,之前的工程师XXX之类的。但是,如果我没有同时提出更好的方案,就只会显得很烦而已。
说服自己和别人的最好方法是展示结果:仅仅是提出一个方案是远远不够的。有时别人不同意,有时自己也拿不准。与其等待老工程解决完手头的工作来支援你,不如马上自己动手实现解决方案,再与队友讨论。没有实际代码的工程师讨论容易陷入空谈。
要主动:老司机说追妹子也适用。主动分两点,第一是主动寻求帮助。大家都很忙,不会一直来关心你的进展。所以,一旦遇到问题,主动求助,积极沟通。过多的求助会显得麻烦和无能,所以三思而后行。Read The Fucking Doc!第二是主动写出更好的代码。不以仅仅是刚好完成任务的心态来做事,思考任务背后的原因。在完成任务的同时,主动顺便把代码优化了。
技术心得
从架构的角度看问题: 软件系统的性能不仅仅在于某个局部的函数或者类怎么写。多从整体架构的角度思考问题。仅仅会用某个框架写route的回调是远远不够的。云端服务是分布式的,微服务式的。所以,架构能力是后端开发者必要能力之一。
测试代码也是代码:测试也要按照基本法!不要认为测试代码就可以随便写。因为测试代码的特殊性,你多半不会写测试的测试。所以,一定要小心维护你的测试代码。
不会Docker是傻X:作为后端开发者,容器技术可以节省你很多时间。后端开发者会比前端更多地接触开发运维DevOps。我作为傻X进入公司,目前终于会Docker基本的使用了。
将数据库和语言绑定是傻X:虽然大多数语言的Web框架都有对应ORM,但是不应该将所有的数据库相关代码都用ORM来实现。作为微服务架构来讲,数据库应该是独立的,不应该被某个应用的技术体系绑架。直接写SQL没有任何错。我的原则是,动态代码使用ORM。静态的,用来管理和迁移数据库的代码可以使用SQL。原则也适用于NoSQL。
好好用Git:都是泪。
直白写应用,语言魔法写类库:在写应用级代码时,最好不要使用太多语言的特殊技巧。因为你的代码会被其他语言的开发者看。直白的代码降低学习成本。而且,大多数问题都不需要奇技淫巧。如果你确实有特殊的问题需要处理,写成一个库。在写库的时候,因为API优先于实现,所以尽情使用语言的魔法吧。,
文档也是CI的一部分:我使用了一个工具将代码注释编译成了HTML文档。生成的HTML是静态网站,可以直接部署到服务器。这样一来,文档和Git Branch挂钩,成为了CI的一部分。每个语言都有类似工具,所以,如果你的文档不是自动部署,You Are Doing It Wrong!
重新造轮子不见得是坏事:在使用开源的工具之前,先想清楚你的问题有多大。有时你是用的工具虽然会解决你现在的问题,但是却限制了软件的潜力。在使用一个库之前,最好看看那个库的源代码。因为其很有可能有很多垃圾代码。别人开源出来的东西不一定就好。要对自己有信心。有时自己造的轮子比别人的轮子更圆(反之亦然)。
结语
这差不多就是我全部可以分享的了。技术心得的每一个点都可以单独写一篇文章。以后有时间再说吧。