分享下前 Google 工程师「王争」对于这个话题的思考。

我置信,很多程序员都曾经意识到基础知识的重要性,感觉要夯实根底,能力走得更远,但同时对于如何将基础知识转化成开发“生产力”依然有些纳闷。所以,你可能看了很多根底的书籍,比方操作系统、组成原理、编译原理等,但还是感觉很迷茫,感觉在开发中用不上,起码在平时的CRUD业务开发中用不上。实际上,这些根底的常识的确很难间接转化成开发“生产力”。然而,它能耳濡目染地、间接地进步你对技术的了解。

不过,我感觉,设计模式和操作系统、组成原理、编译原理等这些基础学科是不一样的。它尽管也算是一门基础知识,然而它和数据结构、算法更像是一道儿的,相比那些更加根底的学科,设计模式能更间接地进步你的开发能力。我在开篇词里也说了,如果说数据结构和算法是教你如何写出高效代码,那设计模式讲的是如何写出可扩大、可读、可保护的高质量代码,所以,它们跟平时的编码会有间接的关系,也会间接影响到你的开发能力。

不过,你可能还是会感觉设计模式是把屠龙刀,看起来很厉害,但平时的开发基本用不上。基于这种观点,接下来,咱们就具体地聊一聊,咱们为什么要学习设计模式?

1. 应答面试中的设计模式相干问题

学习设计模式和算法一样,最功利、最间接的目标,可能就是应答面试了。

不论你是前端工程师、后端工程师,还是全栈工程师,在求职面试中,设计模式问题是被问得频率比拟高的一类问题。特地是一些像BAT、TMD这样的大公司,比拟器重候选人的基本功,常常会拿算法、设计模式之类的问题来考查候选人。

所以,我在求职面试的时候,都会提前准备、复习一遍设计模式。只管并不是每次面试都会被问到,但一旦被问到,如果答复得不好,就是一个败笔,这场面试基本上也就凉凉了。所以,为了保障十拿九稳,解脱一旦被问到答不进去的困境,对于设计模式这种大概率被问到的问题,我都会防患未然,提前准备一下。

当然,我并不是长期抱佛脚。我平时就比拟器重设计模式相干常识的积攒,所以底子比拟好,只须要在每次面试前花很短的工夫,从新复习一下,便能够自信满满地去面试,而不是心里老是放心被问到,影响失常的面试施展。

所以,如果你也不想让设计模式相干问题成为你面试中的短板,那跟着我把专栏中的知识点都搞清楚,当前面试再遇到设计模式相干的问题,就不会害怕了,甚至还会成为你面试中的亮点。

2. 辞别写被人吐槽的烂代码

咱们常常说,“Talk is cheap,show me the code。”实际上,代码能力是一个程序员最根底的能力,是基本功,是展现一个程序员根底素养的最间接的衡量标准。你写的代码,实际上就是你名片。

只管我曾经工作近十年,但我始终没有脱离编码一线,当初每天也都在保持写代码、review领导共事写代码、重构遗留零碎的烂代码。这些年的工作经验中,我见过太多的烂代码,比方命名不标准、类设计不合理、分层不清晰、没有模块化概念、代码构造凌乱、高度耦合等等。这样的代码保护起来十分吃力,增加或者批改一个性能,经常会牵一发而动全身,让你无从下手,巴不得将全副的代码删掉重写!

当然,在这些年的工作经验中,我也看到过很多让我眼前一亮的代码。每当我看到这样的好代码,都会立即对作者产生无比的好感和认可。且不论这个人处在公司的何种级别,从代码就能看出,他是一个根底扎实的高潜员工,值得造就,前途无量!因而,代码写得好,能让你在团队中怀才不遇。

所以,我的专栏,不仅仅只是解说设计模式,更加重要的是,我会通过实战例子,手把手教你如何防止刚刚提到的代码问题,辞别被人诟病的烂代码,写出令人称道的好代码,成为团队中的代码标杆!而且,写出一份丑陋的代码,你本人也会很有成就感。

3. 进步简单代码的设计和开发能力

大部分工程师比拟相熟的都是编程语言、工具、框架这些货色,因为每天的工作就是在框架里依据业务需要,填充代码。实际上,我刚工作的时候,也是做这类事件。相对来说,这样的工作并不需要你具备很强的代码设计能力,只有单纯地能了解业务,翻译成代码就能够了。

然而,有一天,我的leader让我开发一个跟业务无关的比拟通用的功能模块,面对这样略微简单的代码设计和开发,我就发现我有点力不从心,不知从何下手了。因为我晓得只是实现性能、代码能用,可能并不简单,然而要想写出易扩大、易用、易保护的代码,并不容易。

如何分层、分模块?应该怎么划分类?每个类应该具备哪些属性、办法?怎么设计类之间的交互?该用继承还是组合?该应用接口还是抽象类?怎么做到解耦、高内聚低耦合?该用单例模式还是静态方法?用工厂模式创建对象还是间接new进去?如何防止引入设计模式进步扩展性的同时带来的升高可读性问题?……各种问题,一下子挤到了我背后。

而我过后并没有对设计模式相干的常识(包含设计模式、设计准则、面向对象设计思维等)有太多的理解和积攒,所以一时间搞得我不知所措。好在因而我意识到了这方面常识的重要性,所以在之后很多年的开发中,我都始终刻意锤炼、积攒这方面的能力。面对简单代码、性能、零碎的设计和开发,我也越来越得心应手,熟能生巧。写出高质量代码曾经成为了我的习惯,不经意间写进去的代码,都能作为共事学习、临摹的范例,这也成为了我职场中最引以为豪的亮点之一。

4. 让读源码、学框架事倍功半

对于一个有谋求的程序员来说,对技术的积攒,既要有广度,也要有深度。很多技术人早早就意识到了这一点,所以在学习框架、中间件的时候,都会抽空去钻研钻研原理,读一读源码,心愿能在深度上有所积攒,而不只是略知皮毛,会用而已。

从我的教训和共事的反馈来看,有些人看源码的时候,常常会遇到看不懂、看不下去的问题。不晓得你有没有遇到过这种状况?实际上,这个问题的起因很简略,那就是你积攒的基本功还不够,你的能力还不足以看懂这些代码。为什么我会这么说呢?

优良的开源我的项目、框架、中间件,代码量、类的个数都会比拟多,类构造、类之间的关系极其简单,经常调用来调用去。所以,为了保障代码的扩展性、灵活性、可维护性等,代码中会应用到很多设计模式、设计准则或者设计思维。如果你不懂这些设计模式、准则、思维,在看代码的时候,你可能就会琢磨不透作者的设计思路,对于一些很显著的设计思路,你可能要花费很多工夫能力参悟。相同,如果你对设计模式、准则、思维十分理解,一眼就能参透作者的设计思路、设计初衷,很快就能够把脑容量释放出来,重点思考其余问题,代码读起来就会变得轻松了。

实际上,除了看不懂、看不下去的问题,还有一个暗藏的问题,你可能本人都发现不了,那就是你本人感觉看懂了,实际上,外面的精华你并没有get到多少!因为优良的开源我的项目、框架、中间件,就像一个集各种高精尖技术在一起的战斗机。如果你想分析它的原理、学习它的技术,而你没有积攒深厚的基本功,就算把这台战斗机摆在你背后,你也不能齐全参透它的精华,只是理解个皮毛,看个冷落而已。

因而,学好设计模式相干的常识,不仅能让你更轻松地读懂开源我的项目,还能更深刻地参透外面的技术精华,做到事倍功半。

5. 为你的职场倒退做铺垫

一般的、低级别的开发工程师,只须要把框架、开发工具、编程语言用纯熟,再做几个我的项目练练手,基本上就能应酬平时的开发工作了。然而,如果你不想一辈子做一个低级的码农,想成长为技术专家、大牛、技术leader,心愿退职场有更高的成就、更好的倒退,那就要器重基本功的训练、基础知识的积攒。

你去看大牛写的代码,或者优良的开源我的项目,代码写得都十分的柔美,品质都很高。如果你只是框架用得很溜,架构聊得有条有理,但写进去的代码很烂,让人一眼就能看出很多不合理的、能够改良的中央,那你永远都成不了他人心目中的“技术大牛”。

再者,在技术这条职场路线上,当成长到肯定阶段之后,你势必要承当一些领导造就高级员工、新人,以及code review的工作。这个时候,如果你本人都对“什么是好的代码?如何写出好的代码?”不理解,那又该如何领导他人,如何让人家服气呢?

还有,如果你是一个技术leader,负责一个我的项目整体的开发工作,你就须要为开发进度、开发效率和我的项目品质负责。你也不心愿团队堆砌垃圾代码,让整个我的项目无奈保护,增加、批改一个性能都要费老大劲,最终拉低整个团队的开发效率吧?

除此之外,代码品质低还会导致线上bug频发,排查艰难。整个团队都陷在成天批改无意义的低级bug、在烂代码中添补丁的事件中。而一个设计良好、易保护的零碎,能够解放咱们的工夫,让咱们做些更加有意义、更能进步本人和团队能力的事件。

最初,当你成为leader、或者团队中的资深工程师、技术专家之后,你势必要负责一部分团队的招聘工作。这个时候,如果你要考查候选人的设计能力、代码能力,那设计模式相干的问题便是一个很好的考察点。

不过,我也理解到,很多面试官实际上对设计模式也并不是很理解,只能拿一些简略的单例模式、工厂模式来考查候选人,而且所出的题目往往都脱离实际,比方,如何设计一个餐厅零碎、停车场零碎、售票零碎等。这些题目都是网上万年不变的老题目,简直考查不出候选人的能力。在我的专栏中,有200多个实在我的项目开发中的设计模式相干问题,你跟着看下来,足以让你成为设计模式方面的大牛,再来面试候选人的时候,就不必因为题目老套、脱离实际而难堪了!

重点回顾

明天,咱们讲了为什么要学习设计模式相干的常识,总结一下的话,次要有这样五点:应答面试中的设计模式相干问题;辞别写被人吐槽的烂代码;进步简单代码的设计和开发能力;让读源码、学框架事倍功半;为你的职场倒退做铺垫。

投资要趁早,这样咱们能力尽早享受复利。同样,有些能力,要早点锤炼;有些货色,要早点晓得;有些书,要早点读。这样在你前面的生存、工作、学习中,能力始终都发挥作用。不要等到好多年后,看到了,才豁然开朗,悔恨没有早点去学、去看。

设计模式作为一门与编码、开发有着间接关系的基础知识,是你当初就要开始学习的。早点去学习,当前的我的项目就都能够拿来锤炼,每写一行代码都是对内功的利用和加深,是能够受害一整个职业生涯的事件。

话题探讨

明天探讨的话题有两个:

  1. 聊一聊你对设计模式相干常识的重要性的认识;
  2. 在你过往的我的项目开发中,有没有用过某种设计模式?是在什么场景下利用的?解决了什么问题?

欢送在留言区发表你的观点,我会与你探讨。