Skip to content

开篇词设计模式:程序员的基本功,你离及格还差多少?

你好,我是黄靖锋,毕业于成都电子科技大学计算机专业,先后在华为、京东工作,深入研究算法与编程近十年。作为前京东资深系统架构师,我从事过工具&算法平台、运营平台、AI 智能客服、性能优化等相关系统的研发工作;现在一家互联网公司任资深系统架构师,负责公司核心业务的架构设计和开发工作。

解决真实问题很重要

先给你讲个我自己的故事。多年前我刚参加工作时,刚转正不久就被派到客户现场解决一个紧急问题,对于一个刚入职场的新人小白来说,内心其实是非常惊慌无措的。

刚开始还算顺利,前辈同事们已经大致定位到了问题原因,也做了一些补救措施,貌似已经没有问题了。但不久后的一天凌晨,在同步数据的过程中,系统突然就失灵了,重启之后,问题仍然出现。此时,部分数据丢失,而且客户开始越来越没有耐心。

而后,我和另一位架构师一起开始排查问题。合作时,我发现他熟练地通过各种 Linux 命令在线上环境查看性能指标,dump 出日志文件,查看源码,然后分析原因,定位问题,制订解决方案。其中,还特别针对丢失的数据如何进行正确地恢复做了非常详细的操作说明,我作为一个新手小白,按照这个操作手册就能完成数据的恢复。

那是我第一次深刻感受到解决真实问题的重要性。

后来的这些年里,我又陆续参与电商、AI 系统、各种平台、各种工具的研发与设计,这些项目都存在一个共性,就是经常有"618"和 "双十一"等大促类活动。

活动期间,系统不仅要保证业务的正确性,还要历经短时间内高并发的考验。也是在这期间我渐渐明白,编程是一个不断积累的过程,只有将理论与实践不断结合,才能够提升我们解决实际问题的能力。

你该练好程序设计的基本功

这些年在生产环境中遇到的事故越多,越能深切体会一句话:代码质量既是设计出来的,也是迭代优化出来的。换句话说,无论是前期的产品需求分析、架构设计,还是后期的详细代码设计与编码,都离不开良好的设计。

程序设计是每个程序员的基本功。但是,大多数人都只是对新技术充满热情,却很少有人愿意沉下心来,花几个月甚至一两年的时间来重温基础知识,修炼基本功。在面对所谓"新技术"的浪潮下,他们一直看不透背后隐藏的朴实规律,只是东一榔头西一棒槌地在原地踏步。

工作近十年间,我遇见过各种各样才华横溢又异常努力的程序员,他们能力都很强,可是不知为什么,却总是在无意识地走入一个循环:不断寻找捷径,却又在重复地走老路。

那到底有没有快速修炼基本功的捷径呢?有!学习设计模式其实就是一条捷径

过去,在重新学习设计模式之前,我也固执地认为,程序设计不过是空中楼阁,只是架构师们诓骗大家的谎言,但当我真正亲身参与到编码实践和设计中后,才猛然发现设计模式的诸多优势,比如,提升源码阅读效率,快速解决短期项目中的问题,降低维护成本等。

而在不断学习与实践设计模式的过程中,我收获了很多实打实的经验,包括编程的技巧、架构设计的启发、面试技巧等,我希望能将这些经验分享给更多的人,我们一起学习、交流和探讨。这也是我开设这门课的重要原因之一。

"主动学习+刻意练习"更有效

有了学习设计模式的目标之后,你还得找对学习设计模式的正确方法。

在学习设计模式的过程中,估计你曾经做过各种尝试,但不幸又遇到了新的难题。

  • 买了很多相关的经典设计模式书籍来自学,却因为知识实在是太枯燥,看完前几章就再也不想看下去了;

  • 在工作中虽然接触了很多开源框架,也知道它们运用了设计模式,但是看不懂也读不透,于是慢慢也就放弃了源码阅读,浪费了大好的学习设计模式的机会;

  • 设计模式列举的各种场景太抽象,想要应用到自己的实际场景中,可发现知识点很分散,始终难以落地;

  • 看各种"设计模式新解"文章,被各种冲突的观点搞得晕头转向,不知道孰对孰错,并且还找不到知识的源头和问题的场景,所以更加疑惑。

相信我,你并不孤单。

实际上,学习设计模式最有效的办法就是:主动学习+刻意练习

在实际工作中,很少有人告诉你一个程序该如何设计,他们只会要求有一个结果------做出一个好的程序并能运行起来。

面对这样的要求,你常常只能处于被动学习状态:任务里需要什么你才学习什么,东一榔头,西一棒槌。这样短期虽然有效,但是长期下来,你的知识积累速度其实很慢。所以,要想学好设计模式,你就得放弃这种被动学习的方式,要有目标、有系统地去主动学习:找寻好的资料,分析理解,开放思维。

有了主动学习的意愿后,你还得刻意练习。那怎么去刻意练习呢?最好的方法就是借助工作中的项目实践。因为实践过程中一定会遇见很多问题,就像升级打怪一样,这个不断解决问题、反复思考的过程才是发挥设计模式的最佳途径。

所以,我尝试做一个能让你真正受用的 Java 设计模式课程,希望能帮你找到一个简洁而高效的学习路径,让你能快速掌握各个核心知识点,并在实际场景中真正学以致用,妥妥提升你的代码实力

我怎样设计课程内容

Java 设计模式的一个特点就是入门相对容易,但是真正掌握并精通是非常困难的,原因有以下几个。

  • 涉及的知识面比较广。 Java 语言涉及各种比较难的知识点,比如,多线程编程、异步和同步编程模型、内存池、HTTP 协议、面向对象设计思想、UML 等,如果对这些基础知识掌握得不扎实,是很难真正学好设计模式的。

  • 效果检验比较困难。 因为这是一个见仁见智的经验,有人觉得拿来用就好,又有人觉得应该理解原理再实践应用,但由于缺乏数据支持,很难说哪种模式更好。

  • 被面向对象(OO)实现所误导。 由于设计模式被面向对象编程语言使用得最多,也给人造成了一种错觉:只能是面向对象编程语言才能用。因而,让人很容易忽略设计模式更重要的作用:一种为了解决特定设计问题的经验总结。

  • 资料比较零散,缺乏相关的实践案例。 网上各种 Java 设计模式的资料非常多,但是多以理论讲解为主,与企业内真实的应用还相差很远,并且很多人对设计模式的解读又存在很多误区,再加上一手的案例实践资料很少,又缺乏系统性的实践总结,就让落地变得更加困难。

正是基于以上学习难点,在这门课程中我会帮你缩小知识面差异,省去搜集各种学习资料的时间,提炼更为实用的编程技巧。从设计思维出发,为你建立一条正确且高效的学习路径,结合实际问题场景,拆解每个模式背后的实现原理,让你在入门的同时也能夯实基础,为日后提升编程实力"保驾护航"。

所以,我把课程分成以下三个递进的模块

模块一:编程思维

在这一模块我会从设计模式思维开始,沿着解耦这条最核心的编程思维,为你梳理编程中最重要的思维模型。

比如,学习思维可以帮你认识学习设计模式常见的思维误区,掌握正确的学习方法;Unix 哲学传递出的组合思维,可以让你真正做到随意组合以应对多变的需求;经典的分层思维,更能帮助你看透现代架构设计对编程影响的本质;工程思维带你有目的、有计划、有步骤地解决开发问题,高效率交付可靠的软件产品;对象思维让你的代码更加可读,提高代码质量,敏捷开发。

总之,通过这一模块,我希望能为你建立一条思考与学习的基本脉络,建立真正的编程思维方式,打牢编程基础,做到真正的高效编程。

模块二:编程原则

我精心为你挑选了 10 个核心的程序设计原则(基于篇幅和效率的考虑,主要选取那些最重要、最基础、也是最容易让人误解的原则),围绕面向对象编程,和你一起深入编程世界。从这些设计原则中,你能够进一步得到启发,为最终拆解设计模式做准备。

比如,面向对象设计原则(SOLID)本身增加了设计与实现的复杂性,但我们却希望通过保持最终简单性来提升产品的体验,这如何做权衡和取舍呢?再比如,惯例原则(CoC),编程时遵循的很多约定习俗其实很重要,那如何真正发挥它的作用?等等。

对于每个知识点,我都会通过实例由浅入深进行讲解,并适时总结一些核心应用技巧,让你在重新认识编程原则的同时,还能够在实际使用中做到真正的"开箱即用"。

模块三:编程模式

这一模块是我们本课程中知识点比较密集的部分,也是你学习的重点

我会按照设计模式的基本顺序------创建型模式、结构型模式和行为型模式------详细分析那 23 种 Java 设计模式如何在实践中去应用,因此会重点讲解一些和实际场景相关的案例问题,剖析模式出现背后的缘由和解决思路,让你有一个更加直观的感受,能知其然也知其所以然,深入体会该如何在实际工作中应用所学的知识技能。

讲师寄语

在正式开始学习这门课程之前,我要如实告诉你:学习设计模式会非常枯燥和难受,但是只要你能坚持下来,收获会远远超出你的想象。

  • 在每一天开始学习时,你得斗争着不打开手机玩王者荣耀,而是复习相关知识;

  • 在每一次编程工作中,你得有意识地提醒自己不要滥用设计模式,而是寻找合适的设计;

  • 在每一次失败的挫折里,你得鼓起勇气给自己打气,在下一次的实践中争取成功。

想想都觉得很难,做的时候会更难。但是,当你的产品里有你精心设计的功能时,你会发现原来在每一个漆黑的夜晚里,你的每一次艰难的抉择、每一次坚持与付出,给你带来这么多真正的无法言喻的喜悦。而这样的成功还会不断积累更多的成功

  • 一年结束时,当你身边的人还在沉浸着多刷了几部剧、多升了几次游戏角色等级时,你却已经能够熟练运用设计模式解决更多更复杂的问题,你的团队更信任你,你有了参加升职答辩的机会;

  • 一年结束时,当你身边的人还在临时学习各种面试技巧时,你却已经能够触类旁通发现编程本质,面试时你更能直击问题本质,你不再焦虑反而更加自信;

  • ......

你期待这样的结果吗?我估计答案不言而喻。

实际上,对技术"内功"的修炼,恰恰是现在这个浮躁的时代所缺乏的。现在,设计模式各种经典书籍早已存在,各种经典论文早已论述,而你只是缺乏有效的学习方法和路径,去重新认识一遍这些重要的知识,让这些知识发挥作用罢了。

我希望通过这个课程,不仅能帮你跨过设计模式这个坎,还能帮你掌握一种构建系统化编程的能力!

欢迎加入,一起加油,新的一年,一起见证你的成长!