2019年/10月/28日

首页回退

冒号课堂读书笔记

极佳的国产作品,听说还被台湾翻译为了繁体版本,我觉得都有必要翻译为英文给老外看看,本书采用对话体,借不同背景,不同水平,不同性格人物之口,多层次,多维度,多角度地展现知识的内涵和活性

开班导言

学会不如会学,会学不如会用,会用不如被用 如果知识是水,我们要挖掘最先涌动的泉眼 如果知识是火,我们要捕捉期初点燃的火花 越是喧嚣的世界,越是需要宁静的思考,让躁动的心灵得以平息,让蕴藏的灵性得以释放 知识之上是思想,思想之上是精神

编程没有速成大法,只有思考,实践,再思考,再实践 敬畏老师不如敬畏真理 真正的老师是你自己 没有激情做氧气,灵感的火花注定转瞬即灭 好的语言就是适合编程者和解决对象的语言

言者所以在意,得意而忘言 得形而忘意,无异于舍本逐末,得意而忘形,分能游刃有余 编程之时,你便进入自己创造的世界之中,只有注入你的想象力,创造力和激情,它才有勃勃生机

如果说每个编程者都是在创造虚拟世界,那么编程范式就是他们置身其中自觉不自觉采用的世界观和方法论

如果把一门编程语言比作兵器,他的语法,工具和技巧等是招法,它采用的编程范式则是心法

设计模式是软件的战术思想,架构是软件的战略决策

一个架构可能包含多个框架,而一个框架可能包含多个设计模式 培养编程语言的语感至关重要,需要充分的重视和长期的积累,方能悟其精髓

编程范式

命令式编程是冯诺依曼机运行机制的抽象 结构化编程是过程式编程的一种原则

声明式编程是人脑思维方式的抽象,即利用数理逻辑或既定规范对已知条件进行推理和运算

函数式编程类似代数中的表达式变换和计算 逻辑式编程则类似数理逻辑推理

编程是寻求一种机制,将指定的输入转化为指定的输出

命令式:自动机机制,通过设计指令完成从初始态到最终态的转变 函数式:数学变换机制,通过设计函数完成从自变量到因变量的计算 逻辑式:逻辑证明机制,通过逻辑推理完成题设到结论的证明

函数是被动的实体 对象是主动的实体

过程式是君主制 OO是民主制

封住使得公民拥有个体身份 集成使得公民拥有家庭身份 多态使得公民拥有社会身份

OO是以数据为中心组织逻辑 命令式,函数式和逻辑式互相平行,而OOP与他们正交

软件设计最重要的并不是编程语言,甚至也不是编程范式,而是抽象思维

你们可以怀疑我的观点,但绝不放弃自己的思考 并发式:以进程为模块的生产体系,模块之间互相竞争与合作

常用范式

泛型范式,抽象你的算法 泛型编程不仅能泛化概念,还能泛化行为 外行人常以为数学定理最重要,其实数学思想才是数学的精髓 STL出自一个学数学的人之手 超级范式:元编程 元程序将程序作为数据来对待,能自我发现,自我赋权和自我升级 抽象是前提,分解是方式,模块化是结果 如果一个程序是一个管道系统,AOP就是在管道上钻一些孔,在每个孔中注入新的代码流 如果真想成为优秀的程序员,一定要尽可能地读原文的书籍,文章,文档 程序员牺牲了对应用程序流程的主导权,换来的是更简洁的代码和更高的生产效率 独立是异步的前提,耗时是异步的理由

重温范式

学会适度的容忍无知 武功练至化境,一定是博采众长 针对不同的问题领域使用不同的编程风格,编写的代码才会和谐自然,富于美感 有别于过程式和函数式,逻辑式没有明显的输入和输出之分 编程范式为神,编程语言为形,以神导形,以形传神 每种编程范式都能在生活中找到它的应用,他们本来就是人类思维方式的投影

语言小谈

在具体知识和抽象理论之间进行折返式学习 一个合格程序员不应只局限某一层应用开发 Duck类型的哲学是:名义不重要,重要的是能力 非继承性多态为软件重用开启了新的窗口 理想的架构师应当如文学大师,既有恢弘大气的构思,又有细腻深刻的笔法,应当如统军大帅,既有运筹帷幄的韬略,又有冲锋陷阵的武功 每种语言都有天然设计上的不同 破除语言的宗教情节,保持自我批判的勇气和精神

语言简评

通禅悟道者拈花不语,坐井观天者蛙鸣鼓噪 不要给别人的偏执买单 能力越大,责任越大,风险越大 得道者化腐朽为神奇 语言发展的趋势一定是动静结合,刚柔并济 编程就是在人脑和电脑之间寻找最佳平衡点的过程

抽象封装

抽象就是做减法和除法 抽象是人类认识和描绘世界的首要工具 过程抽象 数据抽象 类型层级和多态抽象 迭代抽象 数据抽象是OOP的起源 抽象有角度和程度之分 接口是纲,实现是目 优雅的外形,丰富的内涵,鲜明的个性 从宏观上看,知识是延伸相通,大道合一的,从微观上看,知识又是至精至微,各具奥妙的

抽象接口

软件之软,体现在适应变化的能力 能保证代码永远不变的软件有更好的归宿,要么退化为硬件,要么进化为人件 编程难:

  1. 逻辑的复杂性
  2. 需求的变化性

过度设计会带来不必要的复杂和效率损失 软件应该能在模块的基础上进行扩展而不是修改 任何一门技艺到了高级阶段,都是度的学问

为所欲为 尽善而为 有所为有所不为 无为而无不为

一个类只提供一套服务,但要完善

继承机制

接口继承不是为了代码重用,而是为了代码被重用 概念抽象只是手段,规范抽象才是依据 类是实现,类型是接口 实现继承消费可重用的旧代码,接口继承生产可重用的新代码 程序中逻辑错误来自两方面的配合:

  1. 误用了语法
  2. 误解了语义

如果说合成是不透明的黑盒重用,那么实现继承是半透明的灰盒重用 你对编程保持敬畏,代码臭虫才会对你保持敬畏

软件设计的4字要诀:外静内动 继承是一种静态,显性的关系 脆弱的基类问题 非抽象类不适宜作基类

多态机制

对于静态类型语言来说,继承是多态的基础,多态是继承的目的 具体类型是创建对象的模板,抽象类型是创建类型的模块 抽象数据类型的核心是数据抽象,抽象类型的核心是多态抽象

入门者众,入室这寡 相比软件设计师,硬件设计师往往能更好地贯彻OOP的理念 虚伪:用封装来掩盖内心,用多态来掩盖外表,提成继承责任,不提倡继承财富

值与引用

值重在价值,引用重在使用价值 多掌握一门语言,便多一扇领悟之门,多一条贯通之道 语法只是手段,语义才是目的 值语义对象没有标识的概念 值语义对象不尽具有空间无关性,还通常具有时间无关性 合成是基于值与语义的包含,聚合是基于引用语义的包含 从语法到语义,从设计到实现,处处都贯穿着值与引用这对体用之分的阴阳两级

设计原则

任何计算机问题均可通过增加一个间接层来解决 间接层离不开抽象 间接,分离,抽象,规范,软件设计之本 度的把握是最微妙的学问,属于一种无法传授的隐形知识 一个适当的中间层,在形式上表现为间接层,在实质上体现为抽象层 过程式演化为对象式是一个权力去中心化的过程 抽象与规范是根本,间接与分离是手段,依赖和控制是关键,接口和服务是核心 少一分责任就多一份专注,少一份权力则多一份自由 让代码的物理紧密度与逻辑紧密度保持一致 最小可重用和最小可维护

耦合:

  1. 内容耦合
  2. 公共耦合
  3. 外部耦合
  4. 控制耦合
  5. 印记耦合
  6. 数据耦合
  7. 消息耦合
  8. 无耦合

内聚: 偶然内聚 逻辑内聚 时间内聚 过程内聚 通信内聚 顺序内聚 信息内聚 功能内聚

一味追求高层代码具有高可重用性,不仅是不必要的,更是不现实的

设计模式

在软件世界中,无知是一种美德 一个系统设计是否合理,很大程度上取决于层级的设计 程序设计的关键是控制软件的复杂性 抽象,分解和层级是对付软件复杂性的基本工具 许多设计模式都是为了克服编程语言的一些缺陷或局限

编程=》编程范式=》可维护性=》设计原则 广度影响深度,若不见多识广,何来融会贯通 设计原则高于设计模式 抽象的设计和具体的算法同等重要,千万不可偏废 不怕变化就怕不能控制变化