渐构学习的理论如何应用在编程类知识上?

佳闻哥,这位就是在闲聊群里自己分身左右互搏的那位抽象大师 :rofl: 他这回答也一股子AI味儿,scratch这种少儿编程的玩意儿都拿出来说,只能说对编程基本没啥经验 :rofl:

1 个赞

虽然说你的这个具体例子跟我讲的编程不在一个抽象级别,但我还是要讲一下我当初是怎么学的python字典概念的。
先说一下我当时的基础,和学习python的目的。那时我已经掌握了C++编程的基本要素,可以用VC++实现万行左右的GUI程序。对于面向对象编程思想有初步的理解,并在程序中使用接口类建立了应用、协议、驱动的三层次程序架构,并通过虚函数实现同层不同类对象的多态行为。学python是因为当时我在用的是MFC库,ms早就不维护了,功能非常有限,而且架构不是面向对象的,很多都是对win API的封装,非常难以扩展。我需要换一套技术栈来做功能实现。当时同步考虑的有python和c++ 的Qt库。学python时还是2和3交界的时候,3的环境很不成熟,所以学的是2。以上是背景。
学习材料是看官方文档和同事买的一本python书(名字忘了,封面上是一只蜥蜴)。学的过程挺痛苦的,因为文本编码和缩进的问题对python代码影响很大,所以当时花了很久的时间折腾编辑器。由于有c++的实践基础,顺序语句、分支语句和循环语句基本不用费事,只是语法差别,强化练习一下就解决了。整形、字符串、浮点数、boolean等基础类型也不怎么花时间。最费劲的python內建对象(我尽量不使用课程里的概念,而专注于编程领域的意义)是字符串及其编码序列化,因为当时还在和qt比较技术栈,而qt对中文的支持又不怎么友好,再加上早期的vs默认GBK编码,编码问题着实费了一番心思。这些问题都解决之后,才开始研究內建的容器类型。
对于python的字典,根据面向对象分析法(OOA)首先追溯其抽象概念,即编程语言的字典。这是一种容器,一种用来存储不定数量信息的结构。字典的形式通常是一系列"键值对",值是要存储的信息,键则是这个信息对应的标签。因为字典的概念之前就有,所以脑子里是能将其形象化的,比如贴着标签的一堆散乱排放的抽屉,每个抽屉里有一些纸条,我可以从根据标签取出对应的纸条,可以删掉某个标签的整个抽屉,可以替换某标签抽屉里的纸条,可以将另外形式的对应关系的信息转换成字典。尽管抽屉和字典并不是一种概念,也不是一种对象,但因“我”和“这堆抽屉”的交互刚好满足字典的对外行为关系,抽屉的“标签”和里面的“纸条”刚好满足字典存储信息的关系,这堆抽屉就可以等效于字典,“我”就可等效于一个外部调用者。这种等效关系就是OO中的里氏代换原则的一种应用。至此,只是完成了既有知识的迁移,下面还要做python容器和字典的特殊处理。
python的迭代器与c++的太不一样了,一个yield让我蒙圈了很久,各种生成式、zip()**kwarg参数等应用看的是眼花缭乱,迟迟无法将其和之前的抽屉模型进行融合。本来想跳过这部分,只使用基本的增删改查,但看各种实现代码和文档时发现不把这些弄懂根本就串不起来。后来改变了策略,将含义和用法分别建模,不再关注具体实现原理,才解决问题。至于如何使用材料,我都是在意义世界(课程概念)中直接刻画抽象物的方式来解构文字材料,我会抽象的描述一下,因为具体例子都太私人了,没有我现在的意义世界里的状态不好理解。方法类似在脑子里画实体关系图,关注点是概念和关系,属性只是附属。当有一定的属性和关系时,可以在自己的概念世界中去匹配类似的内容,大致匹配上了就给这个抽象物贴上匹配到的概念标签,然后判断一下有没有问题(这步的原理挺神奇,想正向描述一个概念很困难,但如果有问题一下子就能发现不对劲,类似一种逻辑直觉了)。不合适的话,就把标签丢掉,直到找出一组差不多的概念来。然后就能以熟悉的概念组合来和当前的概念进行比较(类比法),通过微调旧概念组合来形成新的概念。基本的建模原则是先整体后局部,先抽象后具体。具体就是:先解决what问题,通过属性和关系塑造一个抽象的形象;再解决第一个how问题,这个抽象物如何与其他抽象物互动;第三解决why问题,这个抽象为为什么有这样的特性(此步可跳过);最后解决第二个how问题,就是自己能如何与之互动,这步的关键是根据已知的属性和关系来开发出不一样的应用方式。这种建模方式我用了很多年,包括现在搞数字孪生也是先用这套方法建立概念模型,再定量分析相关参数。
模型的具体使用和建模过程一样,只是将建模对象由抽象概念改为一个具体的事物,直接对事物进行属性和关系的分析,在分析过程中匹配概念组,最后用匹配上的概念组的已知的各种how来处理问题。
我理解的渐构法单开楼进行回复。

渐构法学习python的字典,我想应该是这样的:
明确学习任务:

  1. 学习字典概念
  2. 学习字典初始化概念
  3. 学习字典的增删改查概念
  4. 学习字典的遍历关系
  5. 学习字典与迭代器的关系
  6. 学习字典的生成式关系
  7. 学习字典与其他容器类型的转换关系
  8. 学习字典与函数参数的关系
  9. 学习字典与object对象的关系
    10…
    针对每个任务,明确要渐构的模型,概念要建构判别模型,关系要建构联结模型。
    以字典概念为例,判别模型为
    输入:任意变量
    输出:是否为字典类型
    判别关系:变量初始化时是否有键值对结构,变量定义时是否有dict(),变量是否为对objecr的__dict__引用,type()返回class dict等等
    然后找点正反例材料去学习。

联结模型我是真不会描述,尽管这些关系我早就弄懂了,也会用了。
于博如果有空的话,举例一下python.dict和迭代器的联结模型怎么描述,生成式和遍历又是怎样描述。

你这俩回答就没回答任何问题,明明你不知道渐构课程说的是什么,说了半天就一个判别模型,输入输出还找的不对,却一直评论渐构,“我懂了会用但用不出来”,这都什么诺言诺语啊,禁止你乱用渐构名字出去给别人当教师爷,我们还要到处解释这不是渐构理论,快别摸黑我们了

2 个赞

所以,你理解的正确的渐构分析法下,字典的判别模型该如何描述?

哎,你自己都说你不知道怎么描述,那既然都不知道,又是怎么去评价【渐构能做到什么,不能做到什么】的呢?又是过于泛化,又是不同于学识音的,我昨天看完莫名其妙的。

你继续说吧,然后我统一回答。你继续举一个具体的【你所说的抽象级别的任务】用渐构怎么学

1 个赞

这是一段渐构网生成的关于python字典生成式的联结模型的描述:

推测任务 从「键值对生成规则」到「生成的字典内容」的推测
知识名称 Python字典生成式
输入空间 维度1:「键的生成规则」(基于列表/基于表达式)。
维度2:「值的生成规则」(固定值/基于键计算)。
输出空间 维度1:「生成字典的键集合」(与输入规则一致/基于计算结果)。
维度2:「生成字典的值集合」(固定值/基于键计算的结果)。
映射规律 1:当「键的生成规则」为「基于列表」,且「值的生成规则」为「固定值」时,「生成字典的键集合」为列表中的元素,「生成字典的值集合」为固定的值。
2:当「键的生成规则」为「基于表达式」,且「值的生成规则」为「基于键计算」时,「生成字典的键集合」为表达式计算结果,「生成字典的值集合」为基于键的计算结果。

实际上推测任务是{x:x+2 for x in [1,2,3]},生成的字典为{1:3, 2:4, 3:5}。这种任务其实很简单,但要把过程用形式化自然语言符号表达成输入输出范围精确的、无二义性的联结模型,我是做不到的。生成式的语法就设计成读着读着就能明白输出结果的方式,渐构法却要求必须有精确的语言描述才能开始渐构,多了一道从任意知识到联结模型的精确语言描述的转换过程。在我的认知里,如果要做到这一点,需要对任意知识做概念图,明确知识涉及的所有概念,然后再把相关概念关系套到渐构模型的“输入”、“输出”、“关系”上。按照我的思路,概念图做完了模型也就建好了,没必要再带入到一个过程中。

这是我的疑问

  1. 我有模型,能判别,能联结,可以推测未见。根据课程的定义,我学会了python字典的相关知识。但我无法用输入、输出和映射/判别规则的方式用自然语言准确表示判别和联结模型,我在开始学习时也不知道什么样的材料和方法是对我最适的,那么我可以自主进行严格意义下的渐构吗?
  2. 在无法完全按照渐构分析法的第四第五步执行的前提下,我依然是逐步掌握了判别和联结的能力,从结果上看这算渐构吗?

这就是我不理解你的地方。你既然不知道渐构怎么处理的,那为什么会先断定一个自己不知道的东西能做什么,不能做什么。

这就好比,我不知道泛函分析是怎么分析的,但我却说“泛函分析有xx优点,但却有xx不足”。

现在你想起来了渐构网上有联结模型的AI功能了,想看看这个AI怎么处理的了。AI解答不了你的疑惑,因为这个AI的结果取决于你如何给它描述的。

你最后给出疑问了,这才是合理的行为,也就是:你不知道渐构咋做的,你直接问我不就完事了吗?非得先去评判一下。

你先把【你所说的抽象级别的任务】举出一个具体例子,说下你理解的渐构是怎么做的,然后我统一都给你解答了。

2 个赞

我觉得有必要澄清一下关于我说“渐构理论无法解决具体问题”这句话。我的真实意思是因为课程中给出的方法论过于宏观笼统缺少必要的指导性,且对语言的形式逻辑表达提出较高要求,学员很难用这种方法来指导自己的学习。这句话在表述形式上不正确。

关于编程的更高抽象级别,指的是从用户需求分析、软件架构设计、软件详细设计等编码之前的过程。这些过程尽管可以定义输入输出,但其过程的大部分并没有定法,资源工期干系人需求等互相冲突,很多时候只能采用多次妥协的结果,执行的过程还可能多次调整。这部分过程用渐构法如何学习呢?

你自己看看 [1] 和 [2] 的差别有多大,一个正常读者会不会把两段话视为一个意思。

[1] 渐构理论无法解决具体问题

[2] 课程中给出的方法论过于宏观笼统缺少必要的指导性,且对语言的形式逻辑表达提出较高要求,学员很难用这种方法来指导自己的学习

我也不说你啥了。

刚才本想简单说下「怎么用渐构来指导自己学习“python字典生成式”」。
现在想来,干脆像课程中的「外语学习分析」那样,做成一个「编程学习分析」的案例示范,加到正课里吧。毕竟你第二段话的画外音诉求就是:“想要更多具体应用的例子”。

我也大致了解你所说的【更高抽象级别的编程知识】指的是啥了,我也加到案例展示里。
你可以说一下,你认为这个要怎么学才高效。

4 个赞

我自己目前属于小白在学习编程,推荐一本自用的学习材料《Python编程从入门到实践》美,埃里克·玛瑟斯。这本书的框架我很喜欢,分为两部分,基础知识+项目。 理论和实践的综合运用能帮助你更好的理解所学,实现活学活用。
网课有英语基础的话,推荐Coursera平台上的Google Python速成课,我自己是两个搭配使用,效果感觉很不错。
关键的点我觉得还是孔子的那句‘温故而知新“,学完知识实践完之后,你需要复盘 总结 提炼出属于你自己的Python知识+技能框架,这份编程思维和技能才真正属于你自己所有。

1 个赞

前面我给出我的解法了:不提前掌握各种推测任务,直接对概念本身建模并加以理解。使用时根据具体问题产生推测任务,然后运用概念模型解决问题。只针对反复出现的推测任务进行知识内化,或借助工具进行简化。

我没看过直播,这个是在教案里的吗?


就我以前学习的经历来说,下面的就是"差材料"

  • 没有结构化分章节的教程,那一定不是什么好材料
  • 视频教程,如果语言不够精炼的,那也不是什么好教程
  • 各章内容知识点,不写在各章标题的或者涵盖太多点的,也不好

我觉得教程不看,是不知道适不适合自己的。有可能有些已经学过了,也有可能默认学过了。所以材料最好是能让我跳着看,免得浪费太多时间


分析学习开源代码,感觉也是一个学问。在作者不讲解的情况下想知道他的设计意图,很难哇。大多数时候我都是直接拿开源代码来用的 :joy:

现在有AI, 让AI辅助讲解开源项目的设计意图.

python的迭代器跟java和c++里的太不同了,加上函数参没有类型,容器里各种类型混放,加上没有写时拷贝的容器共享技术,python完全是另外的容器体系。当时我的软件编程水平不足以理解通过迭代器解偶容器类型和函数调用的意义,各种教程也没有从设计理念的角度去解释设计决策过程,学习者很难从使用手册上看懂这层关系。
至于你说必须先学数据结构和算法才能学明白字典的使用,有点认死理了。我在那条回复里表达过why的问题是可以省略的。当我的学习目标是使用,我只需要关注what和两个how。

今天查了一下,我用的这种方法源自维特根斯坦的图式论。图式论是面向对象分析法的哲学基础。我是从学习并使用面向对象编程而掌握并泛化该方法的。

你走火入魔了,兄弟

1 个赞

直播课里面分专题讲的,我感觉更适合我 :grinning_face:

我觉得你没有掌握课程,泛化一词都是用错的。

1 个赞