❝本文转自 LEE 的博客,原文:https://juejin.cn/post/7215151665929912380,版权归原作者所有。欢迎投稿,投稿请添加微信好友:cloud-native-yang
事件背景
Hi Everybody!! 这次老李不讲技术了,而是讲“玄学”。最近看了很多 GPT 的资料,尤其如何调教 GPT 的教程以后,感受良多。也看到不少小伙伴写的优秀文章,内心很是触动。原本不想提笔写这篇文章,但是在边上吴老师的怂恿下,最后还是决定写一篇关于编程模型和思路的“玄学”文章,希望能够帮助小伙伴们,在开发起点上就选对方向,减少不必要的心智负担。
前置知识
一说到编程模型或者开发模式,大家应该第一反应是23 种开发模型:单例、工厂、发布订阅... 吧啦吧啦。实际我也是,但是这次想说的不是他们,而是声明式编程(declarative programming)范式和陈述式编程(imperative programming)范式这两个兄弟。
这两种开发范式有些历史,上世纪就已经出现了。小伙伴日常开发都在使用,甚至在不知不觉中混合使用。而我想借着学习了一些 GPT Prompt 以后,把我自己的心得整理下,分享给大家 (欢迎大家来拍砖,但是麻烦轻轻的哈,年纪大了一不小心就会被拍死!!)。
我们先说说声明式编程(declarative programming)范式和陈述式编程(imperative programming)范式是个啥?
声明式编程: 其中程序员描述所需的结果,而不是指定如何实现该结果的特定步骤。声明式编程通常使用函数式编程或逻辑编程语言,并依赖于表达式、公式和规则来解决问题。
陈述式编程: 其中程序员通过指定执行任务所需的详细步骤来实现所需的结果。陈述式编程通常使用命令式编程语言,例如 C++或 Java,并且它们使用循环、条件语句和变量来控制程序的行为。
总之,声明式编程更关注于做什么,而陈述式编程更关注于怎么做。
两种编程范式代表语言
声明式编程: SQL、DSL、MapReduce 等等(底层轻代码逻辑,只需要关注输入输出处理,执行细节不关注)
陈述式编程: C/C++、JAVA、Go 等等 (底层重代码逻辑,不但关注输入输出处理,而且还需要关注到执行的每一步或者每一行细节)
两种编程范式流程图
通过下面两张图我们可以看出,声明式编程(declarative programming)范式和陈述式编程(imperative programming)范式 区别在每一次数据或者事件处理完毕后,状态返回目标对象不同,而且对返回的状态处理人也不相同。
声明式编程
陈述式编程
两种编程范式的优缺点
声明式编程的优点:
更加抽象和模块化,减少了代码重复和错误。
更容易阅读和维护,减少了对程序员的要求,因为代码更加自解释。
由于不需要考虑执行顺序,从而使并行化更加容易。
声明式编程的缺点:
可能会导致性能问题,特别是在大规模数据处理时,需要深入了解底层实现才能优化代码。
声明式语言可能没有命令式语言灵活,很难进行动态调整。
陈述式编程的优点:
更直观,逻辑更清晰,便于理解和调试。
更好地控制计算机硬件,可以优化程序的性能。
具有更广泛的应用范围,可以在各种类型的编程任务中使用。
陈述式编程的缺点:
更冗长,通常需要编写更多的代码。
更难以维护,因为代码可能难以理解或有副作用。
不容易并行化,因为它们通常需要共享状态和修改状态,这些都需要同步。
声明式编程
声明式的编程项目越来越多,甚至已经悄悄的在改变我们的日常开发工作。我想不管哪位研发小伙伴,应该都对陈述式编程非常熟悉,而且日常工作绝大多数时间都在做,而声明式的编程可能是近几年才出来明确的定义。我问了一圈熟悉的研发小伙伴,大多数都没有办法详细和准确的说清楚声明式编程是个啥。也难怪,平常都在忙,只要功能实现,哪里管那么多概念。
当然从我的角度来看,概念准确能够帮助自己正确使用开发模型和开发方法,有利于提高开发效率和减少 Bug 产生,同时提高代码的质量。
声明式编程范式产生的原因
声明式编程产生的原因是为了简化软件开发的过程和提高代码的可读性和可维护性。在传统的命令式编程模型中,程序员需要详细地描述计算机执行任务的每个步骤和操作,这使得代码难以理解和调试,并且容易出现错误。声明式编程则更关注于“做什么”,而不是“怎么做”,程序员只需描述所需的结果,而不是实现具体的过程,从而降低了代码的复杂性。
声明式编程通常使用函数式编程或逻辑编程语言,例如 Haskell、Prolog 等,这些语言具有更高的抽象级别,可以大大简化程序员的工作。同时声明式编程也更加适合处理大规模数据和并行计算,因为它们不需要考虑程序的执行顺序,从而更容易进行优化和并行化。
声明式编程会替代陈述式编程吗
声明式编程和陈述式编程都有其优点和缺点,因此没有一种编程范式可以完全替代另一种。实际上,在许多情况下,声明式编程和陈述式编程被结合使用,以充分利用它们各自的优势。
例如,在 Web 开发中,声明式编程的方式通常用于用户界面设计和交互,而命令式编程则用于控制后端数据处理和服务调用。另外,一些领域特定语言(DSL)也可能在其中一种或两种范式的基础上进行构建,以满足特定领域的需求。
综上所述,声明式编程不会完全替代命令式编程,而是作为一种补充和选择来使用,根据具体情况进行选择。
声明式编程主要的应用场景
声明式编程最常见的应用场景包括:
用户界面设计:声明式编程非常适合描述用户界面,例如 HTML、CSS 和 React 等库和框架。
数据查询和转换:声明式编程在处理数据时也非常有用,特别是在大规模数据处理和分析中,例如 SQL 和 MapReduce 等技术。
人工智能和机器学习:声明式编程是实现推理和自动化决策的一种有效方式,例如 Prolog 和 Lisp 等语言。
并行计算:声明式编程不需要考虑程序执行顺序,因此可以更容易进行并行化,例如 Hadoop 和 Spark 等技术。
领域特定语言(DSL):声明式编程通常用于构建领域特定语言(DSL),以便解决特定领域的问题,例如 LaTeX 和 SQL 等。
总之,声明式编程在各种应用场景中都具有广泛的用途,可以显著提高软件开发的效率和代码质量
Kubernetes 对象管理
Kubernetes 的 API Server 遵循声明式编程(declarative programming)范式而设计,侧重于构建程序程序逻辑而无须用户描述其实现流程,用户只需要设定期望的状态,系统即能自行确定需要执行的操作以确保达到用户期望的状态。例如,期望某 Deployment 控制器管理三个 Pod 资源对象时,而系统观察到的当前数量却是两个,于是系统就会直到需要创建一个新的 Pod 资源来满足此期望。Kubernetes 的自愈、自洽的功能都依赖于其声明式机制。
官方文档:kubernetes.io/zh-cn/docs/…[1]
Kubernetes 系统的大部分 API 对象都有着 spec 和 status 两个字段,其中,spec 用于让用户定义所期望的状态,系统从中读出相关的定义;而 status 则是系统观察并负责写入的当前状态,用户可以从中获取相关的信息。Kubernetes 系统通过控制器监视着系统对象,由其负责让系统当前的状态无线接近用户所期望的状态。
Kubernetes 对象管理模型
声明式对象配置并不直接指明要进行的对象管理操作,而是提供配置清单文件给 Kubernetes 系统,并委托系统跟踪活动对象的状态变动。资源对象的创建、删除及修改操作全部通过唯一的命令 apply 来完成,并且每次操作时,提供给命令的配置信息都将保存与对象的注解信息 (kubectl.kubernetes.io/last-applied-configuration) 中,并通过对比检查活动对象的当前状态、注解中的配置信息及资源清单中的配置信息三方进行变更合并,从而实现仅修改变动字段的高级补丁机制。
GPT Prompt
所谓 ChatGPT 的基本功核心是学会设置 Prompt , Prompt 你可以理解成「提示语」,他的目的是让 ChatGPT 进入某种对话模式。
而 Prompt 也是遵守声明式编程(declarative programming)范式的方式,来完成 Chain Of Through,一步一步的调教你的机器人,告诉你期望的状态与输入的数据之间的关系。
在 ChatGPT 中,Prompt 通常指的是一个输入的文本段落或短语,作为生成模型输出的起点或引导。Prompt 可以是一个问题、一段文字描述、一段对话或任何形式的文本输入,模型会基于 Prompt 所提供的上下文和语义信息,生成相应的输出文本。
Prompt 是什么
Prompt 也可以看作是一种声明式编程。Prompt 是一种用于生成自然语言文本的语言模型,它的输入是一个提供的文本提示(prompt),输出是一段符合自然语言语法的文本。在 Prompt 中,用户只需要提供提示,而不需要指定具体的实现步骤,Prompt 会自动根据预训练的语言模型生成相应的文本。
与其他声明式编程范式类似,Prompt 将注意力从具体的实现过程中解脱出来,使用户更加关注所需的结果和目标。因此,Prompt 非常适合自然语言生成、问答系统、聊天机器人等任务,特别是在需要处理大量文本数据时,Prompt 能够快速生成符合语法和上下文的文本,并且可以很容易地进行调整和优化。
为了更好地理解 Prompt 方法,我们可以以文本分类任务为例。在传统的文本分类任务中,我们通常将文本输入模型中,并期望模型自动从文本中提取相关特征以实现分类。但是,在 Prompt 方法中,我们可以向模型中输入一个问题或提示,以帮助模型更好地理解文本并进行分类。例如,对于一个二分类任务,我们可以向模型中输入一个类似于“这个文本是正面的吗?”的提示,帮助模型更好地理解文本,并更准确地进行分类。
大白话:我期望状态是***,AI 通过结算输出给我一个状态,然后我再根据这个状态调整 Prompt,然后重新给 AI 输出一个状态,一直循环到某一个输出的状态是我满意的。
Prompt 的应用场景
以下是 Prompt 中声明式编程的一些示例:
生成邮件正文:用户提供一些关键词和指令,例如“给客户 A 发送一封感谢邮件”,Prompt 会根据这些信息自动生成一封符合邮件格式和语法的- 电子邮件正文。
问答系统:用户提出问题,例如“哪个国家是世界上最大的油生产国?”,Prompt 通过预设的规则和语言模型分析问题,从数据库或互联网上检- 索相关信息,并生成符合语法和上下文的答案。
聊天机器人:用户输入一些对话内容,Prompt 可以根据所提供的提示和上下文生成适当的回复,使聊天机器人能够更好地理解和回应用户的需求。
Prompt 的截图
从上面的图中可以看出:我提出期望状态 --> AI 返回状态 --> 我继续提出期望状态 --> AI 返回状态 --> 我满意 AI 返回的状态 --> 循环退出。
写在最后
随着计算机越来越强大,编程越来越简便。我个人觉得长期声明式编程和陈述式编程会长期并存,但是声明式编程在项目中的比重会越来越高,甚至以后基本不需要我们再手写代码,而是只要提交“想法”,然后 AI 完成最后的工作。如果大家觉不太可能,可以看看 ChatGPT + Midjourney 如何帮助视觉设计师大幅度的提升工作效率。甚至都不需要你有画画的基础,只要有想法,善于使用 Prompt,然后在成批的图片中选择最符合你的要求的图片。
说到这里,如何告诉 AI 去完成工作,也许就是短期内能够看到的未来。这个也就是声明式编程的意思,也是我这次成文的主要原因。
引用链接
[1]
kubernetes.io/zh-cn/docs/…: https://kubernetes.io/zh-cn/docs/concepts/overview/working-with-objects/object-management/
你可能还喜欢
点击下方图片即可阅读
念一句咒语 AI 就帮我写一个应用,我人麻了…
2023-03-31
Laf v1.0 发布:函数计算只有两种,30s 放弃的和 30s 上线的
2023-03-28
快速开发一个 ChatGPT 应用的保姆级教程
2023-03-27
云原生是一种信仰 🤘
关注公众号
后台回复◉sealos◉获取以 kubernetes 为内核的云操作系统发行版,在云桌面中管理 Kubernetes 集群生命周期,运行分布式应用程序!
点击 "阅读原文" 获取更好的阅读体验!
发现朋友圈变“安静”了吗?