该文章首发于极客时间。正好最近因为频繁招聘,对面试和工作表现差异的感受比较强烈,所以想聊聊框架这个话题。想结合我自身学习、面试的经验,给你分享一下如何更好地学一门框架、如何不让自己成为框架的附庸,不至于在框架更新换代时落伍,失去了竞争力。

误于面试

前年我离开了工作十年的老东家金蝶随手记,来到一家不算太大,但是很有朝气、提倡创新的新公司十方教育集团,负责整个产品研发的工作。

新的岗位对我来说是有很大挑战的,不管是团队的搭建、流程的建立,还是规范的梳理,都需要投入大精力去做。

这其中最具有挑战的就是团队的扩充以及梯队的搭建。因为公司业务发展,产品研发团队要大量扩充,所以我去年3、4月份的工作大部分都是招聘、面试。

在面试的过程中我发现,不少面试者讲起来基础还是可以的,问一些基本原理也都能讲明白,一些常用的框架也都用的比较熟。但是,如果你问他以前做的项目,会发现很一般,也很少用到他所说的这些面试知识。当你给他出个题目,想看看他的实战经验,也看不到3年、5年经验应有的实战能力

比如很多面试者都可以使用Gin框架快速开发一个API、写一个中间件,但是如果要问Gin如何快速匹配到一个路由的?为什么可以这么快?中间件是如何拦截请求的?转交给下一个中间件是如何做到的?能答上来的就很少了,更不用说再细问一步,中间件是使用的哪个设计模式?自己如何实现一个?

这种虽然能回答一些原理,但深入再问,能答上来的寥寥无几的经典面试情况,就是因为很多人的原理,是从面经上看的、背下来的,没有自己动手去验证过。加上市面上有很多现成的框架帮助他们完成日常工作,止步于会用就行,导致了解的知识都是皮毛,经不起考验。

为了面试而学并不是太新鲜的事情,十多年前也有,但是没有现在那么厉害,最近几年因为就业压力导致刷题盛行,我们只能被逼着去学,不然面试第一关都过不了。

但是面试不只一关,所经历的公司也不止这一家,止步面试的学习也会明显跟不上技术的迭代。因为就算你面试过了,还有试用期,进入工作后,自己的不足就会暴露出来,甚至出现更严重的问题,影响你的转正。

止于工具

现在技术更新是日新月异的,框架更是如此,隔一段时间换一个,不同的公司很大可能采用不同的框架,所以你换新工作之后,一般都得重新学习一门新框架,这会让你以前的经验打折扣,如果新公司用的框架你不会,自己的竞争力会大大降低,谈薪水都没底气。

但是你会发现,有的人能迅速上手新框架,但是有的人接受速度很慢,逐渐就被淘汰了。

出现这种情况有四层原因:

  1. 进取心不足,没有学习其他框架。
  2. 有进取心,但是太相信自己在用的框架,投入太多,甚至把它当成自己的砝码,没有精力学习其他的,也不想学习。
  3. 有关于框架发展的想法,但是关注度不够,没有跟上趋势。
  4. 有关注也跟上趋势了,但是基础不牢,没有真正理解框架的底层原理,进而学习其他框架比较慢。
    表面看是四层原因,其实深究都是被框架给“拖累”了,没有把主动权抓在自己的手里。

框架只是一个工具而已,是我们实现自己价值的多种工具中的一种。不止框架是工具,我们的编程语言也可以是工具。所以框架可以一个个的换,编程语言也可以,现在很多服务已经使用Go语言替代Java、Python了。

就像每一种编程语言都有它的使用场景,每一种框架都有它的优势。如果旧框架被替代,那么说明新框架有旧框架无法满足的优势,我们要做的就是根据需求,选择更适合的框架,最大程度提升自己的核心竞争力

所以,请把框架当工具,不要让它成为你的负担,框架被淘汰,我们不能跟着一起被淘汰。

既然为面试而学只能解决一时问题,进入公司后无法更快适应公司技术栈,更快地做出成绩,那么日常怎样学习才能更好地提升自己,让自己越来越具备竞争力,甚至被各大公司抢着要呢?

始于基础

基础得学牢固这一点我是有切身体会的。这里说的基础指的是,编程语言本身的功能、概念、语法、模式等,它是编程的地基,不会随着框架的改变而改变

大学时,在学会使用SSH(10年前的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. 现在很多技术网站都有问答,你可以去这个频道去回答别人的问题,通过这种输出倒逼自己输入的方式,也能提升自己的实战经验。
    其实方法有很多,也不限于以上四种。你只要自己动手去做就对了。

总结

框架是减少重复代码、提升开发效率的工具,我们可以通过它打开学习框架的大门,研究它背后的原理,理解它的架构设计,进而提升我们自身的能力,但是记住,永远不要被它所束缚。


以上分享如果对你有所帮助,就给四哥点个赞,分享给身边学习的朋友叭,这样四哥也有更新下去的动力,跪谢各位父老乡亲嘞!