《python设计模式》读书笔记
第一章 前述(本文)
文章目录
前言
本文为第一章 前述 的读书笔记,需要学习python设计模式的小伙伴,可以先看原著。
一、为什么选择设计模式?
笔者的话:
没有设计模式,我们就不能工作了吗?显然不是这样,没有设计模式,抛弃了那些条条框框,我们的开发速度反而可能更快。
那么设计模式是否放之四海而皆准,显然也不是,在一个现有的项目上开发时,需要遵循当前项目的开发习惯,盲目使用设计模式,只会令效率低下,同事反感,上司不满。
至少,就笔者的经验来说,设计模式就像波波派一样屁用没有,只会投降。
既然如此,为何还要选择设计模式?
首先,选择正确的设计模式,可以让开发变的更简单,特别是,降低后续的维护成本。
其次,明显的结构,便于后续开发者反复利用以前的代码。
最后,通过选择正确的设计模式,有可能提升代码运行的效率。
但这一切对于笔者来说都不重要,因为我只是一个半瓶水,它在工作中几乎用不到,但用到的时候必须得会,所以就像数据结构与算法一样,它是一个面试时必然会问的东西,这条理由,就足够了。
而如果你有志于成为一名优秀的程序员,那么研究设计模式,与研究如何部署一个项目,没有本质上的区别,都是在利用前人的成果,让我们的工作更加轻松。
二、成为更优秀的程序员
这个标题非常有营销号的味道,但这的确是原文的标题,笔者不是一个优秀的程序员,但笔者觉得这个很有营销号味道的章节,说的很有道理,也具备可操作性。所以,即便本书的作者是到处撒毒鸡汤的“穿山甲”,笔者也决定干了这碗鸡汤,并把操作方法记录下来,便于复习。
《成为更优秀的程序员》总纲:
- 处理已有代码时,处理完成后应当比处理前更好。
- 每天完成一个快速解决问题的挑战。
- 寻求与编程技术比自己好的程序员共事的机会(开源项目是最好的机会)。
- 专注于刻意训练。
- 练习系统化的思考。
- 收集和分析思维模型。
- 熟练掌握工具,并理解何处适用,何处不适用。
1. 刻意训练
笔者也不知道,为什么小节和总纲的顺序不一致,原书(译本)就是这么排序的。
- 每一次训练环节都具备单一关注点
- 尝试和反馈之间的时间要尽可能短
- 着手处理自身不能应对的事情
- 遵循前人的脚本
2. 单一关注点
把所有注意力都集中在需要提升的元素上。
在设计模式的学习中,就是
- 每次只针对单个设计模式学习,
- 确实的理解,这个设计模式是怎么发挥作用的,
- 为什么适合于这个问题,
- 能否适用于其它问题,为什么?
走到这里,就完成了知其然,知其所以然的地步。
- 然后,尝试使用研究的模式,来处理一些实际问题。
- 最终,形成一种"思维工具箱",遇到问题时,随时取出合适的工具。
个人理解:就和训练神经网络模型一样,来训练自己的神经。
3. 快速反馈
反馈越快,连接性越强,学习到经验就越容易。
训练方法:
- 预测代码输出
- 如果结果不正确,分析原因
- 用另一段代码来验证原因
- 对这另一段代码进行测试
- 进行总结:实现难度,是否合适,代码复审,着手处理项目,与他人探讨解决方案。
个人理解:1~4就是写bug和改bug的过程,5则是对改bug过程的一个深思,总结经验教训,便于下次使用或防止下次出错。
4. 自我拓展
简而言之:学习那些令自己不适的内容。
这些东西,或许是学习过程中忽视的内容,或许是始终难以学会的东西,或许是令人烦躁的配环境,只有反复的练习,不停的自我否定,才能深入理解这些令自己烦躁的内容。
5. 跟随大师
听一听大师在说什么,理解他们处理问题的方式,记录他们的解决方案,并和自己的对比,看看有什么不同,评判其中的优劣。
学会对处理问题的过程充满激情,而不是沉迷于结果。
6. 模仿
模仿是入手的正确方式。
在熟练之后,再去思考为什么优秀,能否更好,才是有可能的。
个人理解:先背诵诗歌,再说理解诗歌的优美,最后评判优劣,才是正常人的学习方法。对于语言类的天才,可以是“方仲永”,而对于学习程序来说,天才也得低头模仿前人,才有可能高屋建瓴。
7. 保持路线正确的能力
学会何时掉头或者转向,从来都是一件困难的事情,回头,是需要莫大勇气的。
如果意识到自己的解决方案出现了错误,还要继续往前,那就很可能南辕北辙。
三、系统化思考
所有的设计模式,都是在应对这三个基础问题:
- 要素是什么,它们是如何创建的?
- 要素之间的连接是什么,或者说其结构看起来是什么样子的?
- 这些要素如何交互,或者说其行为看起来是什么样子的?
四、思维模型
问题的定义或者描述越好,也就是越完整,则越能得到与可行的解决方案有关的更多线索,因此,针对一个问题,需要提出一些看似无关紧要的问题,直到得出一个比较清晰且简单的问题描述。
设计模式有助于我们从问题描述,直接跳到解决方案,而无需中间过程,因而可以避免许多错误开端。
个人理解:通过思维模型,往往能看出程序员的工作年限,刚入职的程序员,往往是什么都不敢问,或者乱问一气,不论业务问题还是技术问题,都想找人解决,或者都想自己解决;而入职较长时间的程序员,会针对业务细节死缠烂打,技术问题却从来不问,除非现有技术无法解决该问题,或者整个业务团队都不具备该技术。
程序员针对业务“死缠烂打”的原因无非一点,程序不能抢了产品经理的工作,如果程序员自行决定业务细节,那么实际产品出来后,几乎一定会返工。
五、适用工具
学习感兴趣的包,学习其基础,然后开始使用已经涉及的框架来尝试应用它。
六、设计模式的概念
1. 是什么造就了设计模式
设计模式的要素:
- 模式名称
- 意图/目的
- 别名
- 动机/背景
- 问题
- 解决方案
- 结构
- 参与方
- 协作
- 影响/约束
- 实现
- 示例代码
- 已知用途
- 相关模式
2. 分类
设计模式主要分为三类:
- 创建性:指导如何创建类和对象
- 结构化:指导类和对象的构成方式
- 行为性:指导对象之间的交互
七、选择python3
选择VirtualEnv(一个虚拟的python解释器),以便于把不同项目需要的环境,分割开来,有利于项目的开发。
总结
个人理解:
“如何成为优秀的程序员”,这并不是《如何成为亿万富翁》,不需要太多的运气,也不鸡汤,反而令人泄气,成为一个优秀程序员的方式,总的来说,和成为一个优秀“卖油翁”并没有太大的区别,“唯手熟尔”。