为什么说每个程序员都要尽早地学习并掌握设计模式相关知识?_为什么说每个程序员都要尽早地学习并掌握设计模式相关知识?-程序员宅基地

技术标签: 前端  设计模式  


我相信,很多程序员都已经意识到基础知识的重要性,觉得要夯实基础,才能走的更远,但同时对于如何将基础知识转化成开发“生产力”仍然有些疑惑。所以,你可能看了很多基础的书籍,比如操作系统、组成原理、编译原理等,但还是觉得很迷茫,觉得在开发中用不上,起码在平时的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. 在你过往的项目开发中,有没有用过某种设计模式?是在什么场景下应用的?解决了什么问题?
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41595212/article/details/103200532

智能推荐

dubboreference注解_dubbo注解式配置-程序员宅基地

文章浏览阅读6.3k次。1、pom依赖:com.alibaba.bootdubbo-spring-boot-starter0.2.0com.101teczkclient0.10org.apache.zookeeperzookeeper3.4.11pom复制代码2、配置文件配置#=======================================Dubbo=============================..._dubboreference注解

js拼接html onchange,js触发select onchange事件的小技巧-程序员宅基地

文章浏览阅读409次。select 或text的onchange事件需要手动(通过键盘输入)改变select或text的值才能触发,如果在js中给select或text赋值,则无法触发onchang事件,例如,在页面加载完成以后,需要触发一个onChange事件,在js中用document.getElementById("province").value="湖北";直接给select或text赋值是不行的,要想实现手动..._onchange可以直接跟js语句吗

PDB文件详解_avogadro pdb 文件内容-程序员宅基地

文章浏览阅读5.2k次。PDB格式文件对大部分做模拟和计算的人来说都很熟悉,但其中各个参数的意义很多人并不是很了解。从网上搜集了一些文章,结合自己的知识来对PDB文件中各个参数的意义做个解释:REMARK 该记录用来记述结构优化的方法和相关统计数据。如用Refmac进行结构优化,该记录将自动插入输出的PDB。CRYST1 (NMR除外)该记录用来记述晶胞结构参数 (a, b, c, α, β, γ, 空间_avogadro pdb 文件内容

施耐德m340设置ip后忘记ip,怎么恢复ip_m340初始ip-程序员宅基地

文章浏览阅读9.2k次。这件事要从那一天说起,同事的M340一个月之前设置的ip,等在想使用地址的时候忘了,后来问我,大部分的反应就是使用编程线连接并且把施耐德M340上的程序上载下来,然后更改ip在下载进去,当然那是保留程序的方法,不保存程序就直接使用编程线下载空程序改个ip就可以,但当时没有编程线并且没有时间买,你又很着急那怎么办?下面就是本章重点内容,使用拨码方式恢复ip地址1、把网卡模块拆下下来,在下方又..._m340初始ip

建设银行房贷没扣成功会补扣吗?_建设银行房贷扣款失败会再次扣款吗-程序员宅基地

文章浏览阅读391次。建设银行房贷没扣成功,系统会再次发起补扣,用户需要在补扣之前,将还款的金额存入银行卡中,等待系统完成补扣。另外,用户只要在还款日当天完成扣款,系统就会视为用户按时还款,用户按时还款有利于维护个人信用。房贷如果逾期,那么逾期记录会上传都征信中,逾期情况较为严重时,建设银行可能会拍卖房产用于还款。..._建设银行房贷扣款失败会再次扣款吗

ROS学习笔记(五)ROS 键盘按键读取模块_ros获取键盘输入-程序员宅基地

文章浏览阅读2.2k次,点赞2次,收藏14次。#ifndef KEY_H#define KEY_H#include <stdio.h>#include <termios.h>#include <unistd.h>#include <iostream>class Keyboard_ctrl { struct termios initial_settings, new_settings; int peek_character = -1; public: Keyboard_ctr._ros获取键盘输入

随便推点

vue {{}} 数据渲染出现 undefined问题_vue{{}}undefind-程序员宅基地

文章浏览阅读4.4k次。这应该就是数据异步请求导致的问题吧~例如user:{"id":1,"name":"yrm","des":{"sex":"girl" "age":"19"}}{{user.des.sex}} //报错undefined{{user.des ? use..._vue{{}}undefind

python魔法方法学不懂_Python--魔法方法学习-程序员宅基地

文章浏览阅读436次。1、什么叫魔法方法?魔法方法:Python解释器自动给出默认的,是可以给你的类增加魔力的特殊方法。如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用(不重载则会使用默认的)。你可以根据需求,重写这些方法去定义自己想要的行为,而这一切都是自动发生的。魔法方法经常是两个下划线包围来命名的(比如__init__,__del__)函数与方法的区别:魔法方法..._python中typeerror:missing 33 required positional arguments

太棒啦!PyCharm与Jupyter完美融合,Jupytext来啦!-程序员宅基地

文章浏览阅读561次。文末送书!项目作者/Marc Wouts转自/机器之心Jupyter Notebook 真的是让人又爱又失望,在有的场景下它极其便利,但是在很多大模型或复杂项目上,它又无能为力。在 Jup..._pyzmq与jupyter兼容

《python数据分析》第四章numpy-思维导图笔记_python第四章思维导图-程序员宅基地

文章浏览阅读752次。 最近买了原文版的《利用python进行数据分析》第二版,参考着kindle上的中文版。此书可以是我的学习宝典了。_python第四章思维导图

icode编程图形化|一级训练场|基本操作_icode 图形化高级数组-程序员宅基地

文章浏览阅读1.6k次,点赞2次,收藏2次。icode国际青少年编程竞赛学习与竞赛分享_icode 图形化高级数组

SAP-MM常用的事务代码+透明表(持续更新中...)_sap:透明表-程序员宅基地

文章浏览阅读244次。MM业务类的事务代码+透明表(持续更新中)_sap:透明表