01 | 为什么说每个程序员都要尽早地学习并掌握设计模式相关知识?¶
程序员的专业能力现状¶
Quote
当熟练掌握各种编写高质量代码的技巧、方法和理论后,会发现,实际上,写烂代码和好代码花费的时间是差不多的。当你把写高质量代码培养成一种开发习惯之后,在你在编写代码的时候,自然就有一种代码质量意识,自然而然就可以写出不错的代码。
很多工程师,甚至一些 BAT 的员工,代码都写得惨不忍睹。
- 一方面,在目前这种快糙猛的开发环境下,很多工程师并没有太多时间去思考如何写高质量代码;
- 另一方面,在烂代码的熏陶下,在没有人指导的环境里,很多工程师也搞不大清楚高质量代码到底长什么样。
专业书籍重理论、轻实践¶
一些比较上进的工程师,会去找设计模式、编码规范、重构等类型的书籍去看,学习如何编写高质量的代码。不过,这些书籍都有一个特点,那就是比较偏重理论讲解,喜欢拿猫、狗之类生活中的例子来举例。当然,这样的例子也有优点,那就是能在简短的时间和篇幅内,很好地帮你理解原理。但同时也存在一个严重的问题,那就是过于脱离真实的软件开发。而且例子本身没有难度,你一看就觉得懂了,但是看完之后,可能还是不清楚如何将理论落地到实际的项目编码中。
只通过读书理解不一、成长慢¶
一个人自己闷头看书,在很多时候效果并不好。
一方面,每个人的理解能力是不一样的。对于同一本书,不同理解能力的人看完之后收获也是不一样的。跟着有经验的老师学比闷头自己看书要更高效、收获更多、成长更快。
另一方面,编码本身就是一门实践课,光闷头看书本理论肯定是不够的,更重要的是在实践中学习如何应用这些理论。
一对一手把手指导才最有效¶
Tips
最有效、最快速提高编码能力的方法就是,找一个比你资深的工程师,一对一、手把手地指导你写代码。你提交代码,他来指出你的问题,你再优化,这样一来一往,要不了多久,你就会发现,自己的代码能力突飞猛进。
专栏设计¶
100 多篇文章、50 万字、2 万多行代码、Java 语言实现
实际上,一方面,专栏内容的讲解并不与具体的编程语言挂勾;另一方面,只用了最基本、最简单的 Java 语法,只要你有一些编程基础,不管熟悉的是C++、C#、PHP、Python、Go、Ruby、JavaScript 等其他哪种编程语言,都可以看懂代码,理解代码背后的设计思想。
实际上,大部分设计原则、设计思想、设计模式理解起来都不难,难的是如何将这些理论灵活恰当地应用到实际的开发中,而不是教条主义和盲目滥用。而要想正确、得当地应用理论知识,光看书是不够的,我们要在实战中去亲身感受、体会这些理论该如何应用。但是,我们平时的开发更多的是基于已有的框架,照着别人的流程,扩展新的功能模块。所以,在工作中就可能没有那么多足够复杂、足够有难度的开发场景,让我们有机会去实践这些理论。
结合坐着过去工作中积累的项目经验,整个专栏精心设计了 200 多个真实的项目实战代码案例。几乎每节课、每个知识点都会结合一个完整的开发案例来讲解。类比一下,这 200 多个开发案例足以称得上是一个锻炼编写高质量代码的“LeetCode”了。
8 个月、240 天一对一手把手编程指导
整个专栏有 100 多篇文章,一周 3 篇的进度,需要持续学习 8 个多月、240 多天。
Tips
“数据结构与算法之美”和“设计模式之美”是两门跟我们每天的编程开发,直接关系非常大的课程,是两门奠定一个工程师最基本的代码能力的课程。它们一个教你如何写高效代码,一个教你如何写高质量代码。
Tips
基础的知识很难直接转化成开发“生产力”。但是,它能潜移默化地、间接地提高你对技术的理解。
基础知识大致有:操作系统、组成原理、编译原理、数据结构与算法、设计模式等。
1. 应对面试中的设计模式相关问题¶
学习设计模式和算法一样,最功利、最直接的目的,可能就是应对面试了。
在求职面试中,设计模式问题是被问得频率比较高的一类问题。特别是一些像 BAT、TMD 这样的大公司,比较重视候选人的基本功,经常会拿算法、设计模式之类的问题来考察候选人。
2. 告别写被人吐槽的烂代码¶
Note
代码能力是一个程序员最 基础的能力,是基本功,是展示一个程序员基础素养的最直接的衡量标准。
Tips
每当看到好代码,都会立刻对作者产生无比的好感和认可。不管这个人处在公司的何种级别,从代码就能看出,他是一个基础扎实的高潜员工,值得培养,前途无量!因此,代码写得好,能让你在团队中脱颖而出。
3. 提高复杂代码的设计和开发能力¶
大部分工程师比较熟悉的都是编程语言、工具、框架这些东西,因为每天的工作就是在框架里根据业务需求,填充代码。
相对来说,这样的工作并不需要你具备很强的代码设计能力,只要单纯地能理解业务,翻译成代码就可以了。
面对稍微复杂的代码设计和开发,只是完成功能、代码能用,可能并不复杂,但是要想写出易扩展、易用、易维护的代码,并不容易。
- 如何分层、分模块?
- 应该怎么划分类?
- 每个类应该具有哪些属性、方法?
- 怎么设计类之间的交互?
- 该用继承还是组合?
- 该使用接口还是抽象类?
- 怎样做到解耦、高内聚低耦合?
- 该用单例模式还是静态方法?
- 用工厂模式创建对象还是直接 new 出来?
- 如何避免引入设计模式提高扩展性的同时带来的降低可读性问题?
- ......
4. 让读源码、学框架事半功倍¶
Tips
对于一个有追求的程序员来说,对技术的积累,既要有广度,也要有深度。
优秀的开源项目、框架、中间件,代码量、类的个数都会比较多,类结构、类之间的关系极其复杂,常常调用来调用去。所以,为了保证代码的扩展性、灵活性、可维护性等,代码中会使用到很多设计模式、设计原则或者设计思想。
如果不懂这些设计模式、原则、思想,在看代码的时候,你可能就会琢磨不透作者的设计思路,对于一些很明显的设计思路,你可能要花费很多时间才能参悟。
相反,如果你对设计模式、原则、思想非常了解,一眼就能参透作者的设计思路、设计初衷,很快就可以把脑容量释放出来,重点思考其他问题,代码读起来就会变得轻松了。
5. 为你的职场发展做铺垫¶
在技术这条职场道路上,当成长到一定阶段之后,势必要承担一些指导培养初级员工、新人,以及 code review 的工作。这个时候,如果你自己都对“什么是好的代码?如 何写出好的代码?”不了解,那又该如何指导别人,如何让人家信服呢?
如果你是一个技术 leader,负责一个项目整体的开发工作,你就需要为开发进度、 开发效率和项目质量负责。你也不希望团队堆砌垃圾代码,让整个项目无法维护,添加、修改一个功能都要费老大劲,最终拉低整个团队的开发效率吧?
重点回顾¶
设计模式相关的知识,主要有五点:
- 应对面试中的设计模式相关问题;
- 告别写被人吐槽的烂代码;
- 提高复杂代码的设计和开发能力;
- 让读源码、学框架事半功倍;
- 为你的职场发展做铺垫。
Tips
投资要趁早,这样我们才能尽早享受复利。同样,有些能力,要早点锻炼;有些东西,要早点知道;有些书,要早点读。这样在你后面的生活、工作、学习中,才能一直都发挥作用。不要等到好多年后,看到了,才恍然大悟,后悔没有早点去学、去看。