毕业后一直在火烈鸟上班,上班节奏还是很空闲的,就有时间去学东西看书。但是根据学生时代的经验,光学不考试的话,很难对自己的不足有认知,不知道自己的不足就难进步。加上最近,因为经济上的压力,也想谋求更好地发展,开始了面试。
7月8号是我近年来第一次面试,到现在8月28号,被面试了十几轮了,面试了斗鱼(三面),金山(珠海三面,广州一面,另一个部门两面),腾讯(四面),YY(一面),主要还是哪个hr找了我,我就去面面试试看,从一开始还挺紧张,到现在也享受被面试的感觉了。
然后开始回想自己的成长经历,感觉慢慢走到现在,也该写一篇文章总结一下了。
真正开始自己的程序员之路,是大二大三那会,在师兄的小工作室实习,做一些外包的功能,自己看了一个暑假的黑马程序员,学的是java,spring那套,学会对数据库的增删查改,能写接口了,当时觉得这些才是真正的编程,大学课程里面的网络编程啊,操作系统都是什么玩意,上课就在做那些外包项目,搬砖搬得不亦乐乎,一开始就走了弯路,不过还好,培养了编程的兴趣,这股编程的成就感也是我热爱它的原因。
之后就是大三暑假准备找实习那会了,真的是到处碰壁,想去面试大厂,笔试面试都是偏向底层,注重算法,但是自己大学的时候不注意,一问三不知,怎么办啊,就去看那些算法题,但是也没有系统的学习,差不多的知识点换个方式去问我就迷糊了,面试的结果可想而知。印象深刻的是面试虎牙的时候,因为去得早,面试官不在,技术总监也刚好得空,就那个技术总监面试的我。他问我看过什么书,我一下想不出来,随便说了一个“Java编程思想”(当时面试的java开发岗),他问"还记得上面的哪个章节吗?",我脸都红了,然后他就问我还有什么问题想问他的吗?这是我最短的一次面试了,之后我问了一些golang相关的东西(当时我已经在火烈鸟先实习了一会了,用的golang),他都很有耐心地回答了。那时候隐约觉得基础很重要,但是负责的业务又只用增删查改就能满足,不知道为何重要。
之后就安心在火烈鸟实习了,毕业之后也留在火烈鸟工作。接下来讲的也主要和我毕业之后的成长内容。
代码好不好看
当时真正接触的第一个项目,要将一个短信发送的php业务做成通用的微服务,自己就看着php的老代码去翻译,写出来的代码扩展性差,设计奇怪,很多奇奇怪怪的东西混杂在里面,主要有这几点:
- 当时用的golang,golang有个痛点就是error比较多(虽然我觉得这是个优点,把err都处理了有种安心感),当时在代码应用层面对err的处理和判断真是恶心到我自己,在函数里面返回了自己设计的err再在调用方去判断自己设计的err去写返回的错误码。。
- 各个短信渠道方的发送代码方式,都是硬写在业务代码里面,不存在抽象,只存在从头写到尾。
- 明明是微服务,有统一的校验了,自己还设计了另外一套安全校验,弄得调我接口的同学都来找我怎么校验。。。
- 到处都在打日志。
唉。之后大概一年前就把它重构了,抽象发送接口,优化代码架构,用传递外层指针来减少多处错误判断,用github.com/pkg/errors的with相关的函数去处理错误,达到日志统一位置打印,增加监控,增加统计等等。
在代码美观和设计方面,差不多是这样的节奏,开始写出来东西还觉得挺满意的,后面回头一看,妈呀,写的什么垃圾玩意,趁现在没人注意感觉重构了,反复重复这个过程,就确切知道我确实成长起来了,在编程方面。
代码优雅程度的学习方向还是集中在博客和同事的代码上面,看一下别人的代码有什么好的写法啊,有什么蹩脚的设计要避免啊,写出来的代码越来越好看,自己看着也不恼火。
看算法学算法到底有什么用
很多同学刷LeetCode感觉就是为了面试,因为说真的,我一开始的目的也是这个,因为刷这些东西,在业务代码里面又没有用到,感觉对工作也没有帮助,就刷着玩呗。
后面我自己发现刷这些东西是真的很有用,主要有下面几点:
- 最重要的,在刷算法题的时候,你的注意力往往是更少的内存,更快的速度,更好的实现,慢慢的,你就会你以前写业务的时候可能只是为了完成任务,但是你有写算法题的习惯的时候,你会把你写算法的习惯用到写业务上。
- 有时候可能借助一些常用的算法能更好地完成需求,比如我遇到过的一个需求,屏蔽敏感词,要是两年前的我,可能不带想的直接用for(敏感词库)+strings.contains去匹配敏感词,但是敏感词要是很多会怎么样。用字典数去实现了一个屏蔽算法,效率比contains快了几百倍。虽然后面没有用字典数了,用一些大厂的公共服务比自己维护敏感词库好多了。
- 成就感,就像高中做题一样,解决难题带来的成就感可以帮助你走得更远。
有疑问加站长微信联系(非本文作者)