gitbook/手把手带你写一个Web框架/docs/443349.md

100 lines
11 KiB
Markdown
Raw Normal View History

2022-09-03 22:05:03 +08:00
# 大咖助阵|飞雪无情:十年面试经验忠告,不要被框架所束缚
你好我是飞雪无情在IT互联网行业已经工作十多年了目前是公司的产品研发负责人带领100多人的团队。
作为一位Go语言的布道者我在自己的博客里写过[《Go语言实战笔记》](https://www.flysnow.org/2017/07/19/go-in-action-postscript.html)系列共计30篇15万字也写过[《Golang Gin实战》](https://www.flysnow.org/2019/12/10/golang-gin-quick-start.html)系列共14篇十多万字也是公众号飞雪无情的主理人写过不少关于Go和Web框架的文章积累了小几万粉丝。
写了这么多,但当我收到极客时间的约稿,是不太敢接的,因为实在不知道写什么你的收获更大。
如果写框架本身吧,不管是这个专栏,还是我自己的公众号都已经写了很多了,再写就是老生常谈了,你也不一定会感兴趣。如果写管理吧,虽然是个好的话题,结合我的从业经验也能分享一些心得,但是和专栏的主题有点格格不入。
我仔细思考了很久,正好最近因为频繁招聘,对面试和工作表现差异的感受比较强烈,最终选定了今天这个话题,想结合我自身学习、面试的经验,给你分享一下如何更好地学一门框架、如何不让自己成为框架的附庸,不至于在框架更新换代时落伍,失去了竞争力。
## 误于面试
去年我离开了工作十年的老东家金蝶随手记,来到一家不算太大,但是很有朝气、提倡创新的新公司十方教育集团,负责整个产品研发的工作。新的岗位对我来说是有很大挑战的,不管是团队的搭建、流程的建立,还是规范的梳理,都需要投入大精力去做。
这其中最具有挑战的就是团队的扩充以及梯队的搭建。因为公司业务发展产品研发团队要大量扩充所以我今年3、4月份的工作大部分都是招聘、面试。
在面试的过程中我发现,不少面试者讲起来基础还是可以的,问一些基本原理也都能讲明白,一些常用的框架也都用的比较熟。但是,**如果你问他以前做的项目,就会发现很一般,也很少用到他所说的这些面试知识**。当你给他出个题目,想看看他的实战经验,**也看不到3年、5年经验应有的实战能力**。
比如很多面试者都可以使用Gin框架快速开发一个API、写一个中间件但是如果要问Gin如何快速匹配到一个路由的为什么可以这么快中间件是如何拦截请求的转交给下一个中间件是如何做到的能答上来的就很少了更不用说再细问一步中间件是使用的哪个设计模式自己如何实现一个
这种虽然能回答一些原理,但深入再问,能答上来的寥寥无几的经典面试情况,就是因为**很多人的原理,是从面经上看的、背下来的,没有自己动手去验证过**。加上市面上有很多现成的框架帮助他们完成日常工作,止步于会用就行,导致了解的知识都是皮毛,经不起考验。
为了面试而学并不是太新鲜的事情,十多年前也有,但是没有现在那么厉害,最近几年因为就业压力导致刷题盛行,我们只能被逼着去学,不然面试第一关都过不了。
但是面试不只一关,所经历的公司也不止这一家,止步面试的学习也会明显跟不上技术的迭代。因为就算你面试过了,还有试用期,进入工作后,自己的不足就会暴露出来,甚至出现更严重的问题,影响你的转正。
## 止于工具
现在技术更新是日新月异的,框架更是如此,隔一段时间换一个,不同的公司很大可能采用不同的框架,所以你换新工作之后,一般都得重新学习一门新框架,这会让你以前的经验打折扣,如果新公司用的框架你不会,自己的竞争力会大大降低,谈薪水都没底气。
但是你会发现,有的人能迅速上手新框架,但是有的人接受速度很慢,逐渐就被淘汰了。
出现这种情况有四层原因:
1. 进取心不足,没有学习其他框架。
2. 有进取心,但是太相信自己在用的框架,投入太多,甚至把它当成自己的砝码,没有精力学习其他的,也不想学习。
3. 有关于框架发展的想法,但是关注度不够,没有跟上趋势。
4. 有关注也跟上趋势了,但是基础不牢,没有真正理解框架的底层原理,进而学习其他框架比较慢。
表面看是四层原因,其实深究都是被框架给“拖累”了,没有把主动权抓在自己的手里。
框架只是一个工具而已是我们实现自己价值的多种工具中的一种。不止框架是工具我们的编程语言也可以是工具。所以框架可以一个个的换编程语言也可以现在很多服务已经使用Go语言替代Java、Python了。
就像每一种编程语言都有它的使用场景,每一种框架都有它的优势。如果旧框架被替代,那么说明新框架有旧框架无法满足的优势,**我们要做的就是根据需求,选择更适合的框架,最大程度提升自己的核心竞争力**。
所以,请把框架当工具,不要让它成为你的负担,框架被淘汰,我们不能跟着一起被淘汰。
既然为面试而学只能解决一时问题,进入公司后无法更快适应公司技术栈,更快地做出成绩,那么日常怎样学习才能更好地提升自己,让自己越来越具备竞争力,甚至被各大公司抢着要呢?
## 始于基础
基础得学牢固这一点我是有切身体会的。这里说的基础指的是,**编程语言本身的功能、概念、语法、模式等,它是编程的地基,不会随着框架的改变而改变**。
大学时在学会使用SSH10年前的J2EE三大经典框架Spring、Hibernate、Struts框架写出来一个管理系统那会我感觉自己很牛其他同学都不会就我会。后来认识了一位已经工作的学长他和我说好好把语言基础打牢这些框架自然就会了。当时真的是很不理解这句话。
毕业后因为工作需要用的框架换来换去我才深刻理解到这句话的价值。大学我学的是Struts1毕业后就升级到了Struts2语法完全不一样相当于得重新开始学一遍再过一段时间又被SpringMVC后来居上了又再学一遍。现在的新同学估计都没有听过这几个框架。
几次三番换框架就算我有进取心想紧跟趋势也多少有点忙不过来了。又得回头重新巩固对Java基础的理解。
后来我换到Go语言也一样比如Go Web框架有Martini、Beego、Iris、Echo还有现在流行的Gin以及新兴的Fiber也是轮转多换但是对于我们开发者来说不变的是基础。
比如Go语言本身的基础学会了这个想学其他语言很容易再比如Go语言 HTTP处理、路由的基础这是一切Go语言Web框架的前提研究透了它们不管你用什么Web框架都可以庖丁解牛搞得清清楚楚。
框架会经常变,但是不变的是这些基础。
## 精于原理
基础掌握好了,在学习具体框架的过程中,我们也容易走入另一个误区,那就是止步在使用上,没有把原理搞清楚,面试讲不出内部的实现逻辑、为什么这么实现,工作中面对新框架,也无法快速地熟悉使用,甚至二次开发。
所以当我们学习一门框架的时候,不仅要熟练地使用它,还要研究它里面的**功能是如何实现的、为什么这么做、如果自己来做,有没有更好的办法**?这样才能更好地使用。同时,在同类新框架出现的时候,也可以很快跟上,因为同一类框架,底层原理都是差不多的,就是一些实现方式、用户体验(开发者是用户)、周边生态等不太一样。
比如刚才说的那几个Go语言的Web框架基本上都是基于Go HTTP的封装让我们开发者可以更好地使用但是在具体的实现上有所不同而已。如果你基于一个Web框架把原理搞清楚那再学习其他Web框架就会非常快甚至自己撸一个Web框架都没问题。
对于一个框架的深入学习,**除了内部的实现原理,还要掌握一些模式的应用**。比如MVC模式、设计模式、算法等比较基础的能力这些是构建一个可扩展、易用、高性能框架的基础再比如常见的工厂模式、责任链模式等会被大量用到框架的架构设计中。所以我们也要掌握这些。
## 用于实战
实践是检验真理的唯一标准,这句话说的真好,对于我们来说也一样。你说自己掌握了基础、精通了原理,那怎么衡量呢?就是靠实战。这是对结果的衡量,也是能体现自身价值、升职加薪的唯一方式。
在面试的时候,除了以前做的项目之外,我还比较喜欢问一个问题:**作为5年工作经验的你为什么认为自己比其他3年工作经验的面试者要强**
这个问题考察的点比较多,比如学习能力、总结能力、协调能力、经验等等,但是最终考察的其实是面试者解决问题的能力。能解决问题,才能证明你学的基础、说的原理、把框架当工具的认知有价值了,而不是纸上谈兵,更通俗点就是有用了。
所以实战,才是我们“始于基础”、“精于原理”的最终目的,靠实战去实现自我的价值。那么怎样才可以提升自己的实战经验呢?这里我给出一些方法供你参考:
1. 积极参与公司项目,不要只为了完成任务,还要搞懂为什么这么做,背后的技术是什么;遇到问题时,也一定要查到根本原因,这些都可以提升你的实战经验。
2. 跟着高手学,比如一个项目立项、一个需求评审,都会有资深的开发甚至架构师牵头设计方案,要多跟着他们学,不懂的要多问,尝试自己去设计,来锻炼自己的实战能力。
3. 如果工作中没有以上机会怎么办呢?自己去找开源项目,先熟悉它、使用它,然后参与贡献代码,这也是个好方法。
4. 现在很多技术网站都有问答,你可以去这个频道去回答别人的问题,通过这种输出倒逼自己输入的方式,也能提升自己的实战经验。
其实方法有很多,也不限于以上四种。你只要自己动手去做就对了。
## 总结
框架是减少重复代码、提升开发效率的工具,我们可以通过它打开学习框架的大门,研究它背后的原理,理解它的架构设计,进而提升我们自身的能力,但是记住,永远不要被它所束缚。
欢迎在留言区分享你的思考。如果你觉得有收获,也欢迎把今天的内容分享给你身边的朋友。我们下节课见。