一个想法产生的背后是不断打脸

导语

  • 下面的内容是在学习编程思想的过程中产生的感想
  • “编程”其实和做很多事情一样,掌握了步骤和方法后,会变得不那么难
  • 略去了具体的编程内容和案例,只保留了概念(不多,只有几个)
  • 感觉逻辑挺严谨的,希望没有漏洞
  • 下一步目标是不断回顾、运用和验证这些思考。

一种开发方法

  • 封装(Encapsulation)
  • 泛化(Generalization)
  • 接口设计(Interface design)
  • 重构(Refactoring)

这是一种开发方法,它有缺点,但如果在开始编程时不清楚如何将程序分成合适的函数时(问题分解),这个方法会有效。

封装:把一段代码用函数包裹起来,成为封装。

泛化:给函数添加参数的过程。也就是把前面封装的函数内的常数给参数化

  • 接口设计:设置参数、返回值,注释函数作用。这个步骤算是包含在泛化、重构之内,是一个很具体的方法。

重构:重新组织程序,以改善接口,提高代码复用。

这个开发方法的具体步骤是”封装-泛化“循环

  • 最开始用一些常数写一些小程序,而不需要定义函数
  • 一旦程序运行成功,识别出其中一段完整的部分,把它封装成一个函数
  • 泛化这个函数,添加合适的形式参数
  • 循环上面3个步骤,直到得到一组可行的函数
  • 寻找可以使用重构来改善程序的机会。例如,发现程序中几处相似的地方,可以考虑将他们抽取出来做成一个通用的函数

问题求解:“封装-泛化”循环的原因、背后的原理

问题求解(Problem Solving):

界定问题
创造性地思考解决方案
清晰准确地表达解决方案的能力

(formulate problems)
(think creatively about solutions)
(express a solution clearly and accurately)

这样写出来其实很容易误导人,会让人觉得这三个步骤都是小步骤,很容易完成。但如果真的带着这样的认识来处理问题的话,很可能是碰一鼻子灰。而真实的情况是:每一步都有单独的值得注意的方法,并且这三个大步骤也是紧密联系着的

上一节提到的编程概念”封装-泛化“的循环重复,这一过程就是在整个”问题求解“中产生的。也就是说”问题求解“是更抽象的思考层面,而”封装-泛化“的循环重复就是具象化的操作层面。

可是………………

但是………………

到这里我发现了问题。不得不打脸承认我犯了一个错误:强行归因,强行找联系

“问题求解”的步骤和“封装-泛化-重构”的步骤其实并不是一一对应了。可是我急于找出“成果”,急于获得“正面反馈”的心态让我在看到一些貌似是关联的现象中,在还没有证实之前,不假思索地就确认了。

这虽然是题外话,跟笔记的主题无关,但又确实很值得记录下来,因为这确确实实是我们经常犯的逻辑错误。我们的”系统一”(情感、直觉大脑)和“系统二”(理性、逻辑大脑)交互时产生的BUG。(详情参考《思考,快与慢》《超越智商》等书籍)

回到发现的这个错误中来。这两种循环很可能并不是一一对应的。

先说界定问题

我首先想到的就是《金字塔原理》一书中介绍的界定问题的方法。不过现在想来,有可能是作者芭芭拉·明托在了解了科学家们的思考方法后借鉴领悟的也说不定……谁知道呢,因为作者在介绍界定问题的方法“连续分析”时,在“连续分析”这个名称后加了括号备注:

连续分析(统计学上称为序列分析)

其实现在想来,整个《金字塔原理》都是在学习科学家们的思考方法——理性、逻辑。书里面在很多地方也提及了相关的东西,比如附录1等。

关于界定问题,《金字塔原理》说了很多,花了很多篇幅,还加了附录。但是之所以花这么多篇幅,除了有凑字数的嫌疑之外,还有就是大量的介绍了各种具体的情况,都说具体问题具体分析,从这个角度看,作者还是很严谨负责的……

那么界定问题的核心方法一张图就能展示完:

连续分析

首先,面对一个问题的时候,先看看这个问题是具体的眼睛能看见的东西,还是看不见的通过想象的东西。

  • 肉眼能看见的:观察这个东西,抓住每一个细节,然后分解这个东西,分解成自己熟悉的模块(chunks)。

  • 看不见的:思考问题的上下文(context)是什么,也就是背景。

然后,明确我想要达到的目标(R2)是什么,再审视现状(R1),R2与R1的差距就是现在的问题、困扰。这个步骤就是俗话说的“不忘初心”……仔细想想平时我们很容易迷失方向,迷茫,不知所措,究其原因很可能就是把“初心”(最初的目标)给忘了。

这里有一个需要注意的细节。因为R2、R1之间的差距,我们发现了问题,但这个问题能迅速找到对应的解决方案吗?这就是关键。换句话说,解决方案是否已经存在?如果没有现成的解决方案,则要花时间去寻找。

假定解决方案已存在,或者说,在我们不断界定问题的过程中(R1到R2、R3到R4、R5到R6),经历了问题、困惑被不断分解的过程后,在最后一步找到了解决方案,然后就逆推回去。这也是一个逆反演绎推理的过程:从结论逆推回到-小前提-大前提。

再说思考解决方案

到了这一步,我突然发现:

  • 其实在“界定问题”这个过程里,“思考解决方案”是嵌在其中的。也就是说,这个过程产生了一个“问题-解决方案”的重复循环。

这和“封装-泛化”循环是一样的!这验证了我之前“脑袋一热”产生的联想:

前面说到”封装-泛化“的循环重复,这一过程就是在整个”问题求解“中产生的。也就是说”问题求解“是更抽象的思考层面,而”封装-泛化“的循环重复就是具象化的操作层面。

当然还是有细节上的差异的,因为包含的信息量不一样,”封装-泛化“循环更偏向于”解决方案“这一边。换句话说,”问题-解决方案“循环包含了”封装-泛化“循环。不过他们很接近,从整体上可以看作是一样的。

通过展开思考分析,这里我又推翻了之前自己”冷静下来”后的否定,重新验证了之前的假设,再次打脸……不过,这个过程也实实在在地是对“假设-验证”方法的一次运用。详情参考:科学实验方法

关于“思考解决方案”这一个步骤还有3个需要讨论的点:

  • 相关领域内概念的扩充
  • 不断地重复练习
  • 记录下来,形成书面文档,以便复用

在界定好问题后,开始找解决方案,那解决方案又怎么找呢?这就需要我们掌握足够多的概念,以及由这些概念组成的套路。学习的意义、看书的意义、请教老师的意义也就在此——为了掌握概念套路

但是,只是知道了“概念”和“套路”还不够,那就只能当解说员,都知道但就是做不到(当然,以解说作为职业赚钱就是另一种性质了)。而知道做到的关键点就在于:不断地重复练习。这也是一个很朴素的道理,很多人都知道,但毫不意外的就是做不到。原因很简单,这么做太枯燥,且大多数都没有即时反馈,也就是不能马上看到成果。这种现实是我们的”系统一”(情感、直觉大脑)所不能忍受的!再加上现在这个声色犬马的时代,有太多分心的东西……如果想要知道做到,除了下决心远离”娱乐“的东西外,还有就是持续跟进自己的练习,这样能尽可能的获得即时反馈,满足”系统一”(情感、直觉大脑)的需求。

“持续跟进”的一个重要方法就是“记录”。看书要做笔记,练习后要复盘都是这样。最好是能把这些都形成书面的文档,以便复用。由此也需要我们勤于“写写写”。毕竟这是一种人类文明突进以来最重要的传承方式之一,因为确实很有用……

最后说说表达解决方案的能力

这一点我们马上就会想到上面讨论的“记录”。确实这是很重要的一种表达方式,但还有更重要的,隐藏在“表达”背后的东西:重构(refactoring)。因为有了“重构”,解决方案可以得到更精炼、准确地表达。

“重构”的具体含义是:在不断地进行“封装-泛化”的循环后,我们从产生的众多解决方案里归纳出重复出现的,提取出这些通用的、重复的点,再次封装他们,使解决方案更有效率,更简洁。这个方法其实和《金字塔原理》中表达的逻辑是一样的:都是使用归纳法找出性质一样的东西作为一类,这样提炼出几个要点,表达时就说这几个要点,有需要时再详细展开其中一个要点即可(在“重构”中就是再次定制这个通用点,以满足特定需求)。

函数

这篇笔记本来是为了记录一些概念的,没想到在记录之中突然冒出很多感想。所以把函数这个本来在前面的笔记放在了最后。

本来是想偷懒把函数的笔记略过的,因为觉得函数的笔记没多少,挺简单的。但仔细想了一下,发现有两个函数的概念很重要,殊不知开发中很多很多方面都要涉及到,并且在Python里,很多很方便的功能都是已经封装好的函数。

  • 实参和形参:
    要理解函数的运用,就先得理解两个概念:实际参数和形式参数(argument and parameter),以及它们之间的关系。

实参是在函数里真正要使用的那个“值”,而形参是在函数还没被调用时,为了完整呈现函数,而设置的”样例“。所以,在调用函数并输入了实际参数后,这个实际参数会相应地取代形式参数所在的地方,然后把自己代入这个位置。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容