当前位置: 首页 > news >正文

软件设计模式的意义

软件设计模式的意义

所有开发人员都应该接触过软件设计模式这个概念,看过《设计模式-可复用的对象软件的基础》这本书,在面试中都被问过: 你用过哪些设计模式这种问题。但很大可能也就仅此而已了。

为什么好像只能从框架中找到设计模式的应用示例,而实施项目中很少看到?

是项目太简单了,用不着;是技术人员水平太差了,不会写;以业务价值最优先,先实现功能,设计不重要;设计做的费时费力也看不到,没有绩效,没意义。

上面这些理由都是现实项目中实实在在的理由,并不仅仅是面对询问时的借口,而是很多开发人员的真是想法。无需列举各种各样的数据,以及一条条的格言来证明设计模式是多么多么的重要,能带来多么多么好的效果。即使引经据典写了很多,最终的结果可能就是屏幕上的一划而过。甚至对设计模式是否有必要学习都持怀疑太多,认为这些都是八股文,看了也就是为了面试。

下面是对软件设计模式的意义的一些个人看法,有不同看法的恳请交流和指教。

设计模式的底层思维

设计模式的是建立在面向对象的思维基础上的。面向对象设计中最重要的就是抽象和封装。设计模式的目的为了在满足需求的前提下,做到不破坏或则提供更好的封装性的同时提供扩展性,也就是常说的对修改封闭对扩展开放的开闭原则。

《系统架构:复杂产品的设计与开发》中提到系统设计的第一要点: 识别并隔离系统的稳定点和变化点,比如Linux的内核层和用户层。 很多软件设计模式的核心目的也是分隔稳定点和变化点,提供一种灵活实现变化点带来的扩展性以及不破坏稳定部分代码(不破话封装)的带来的可靠性。也就是常常说的解耦

设计模式讲述的是特定需求场景下的某种模式,源自对系统设计的思考。 只有有了系统设计的思维,真正的去思考系统的稳定点和变化点时,才有设计模式存在的意义。如果有了这个想法,那么恭喜你,开始从纯粹的开发人员转变为系统设计师角色了。

       要理解设计模式的意义,首先思维上要从开发人员转变为设计人员。

设计师和资深施工人员的争论

有一个调侃词: 反人类的设计。 指的是那些偏离了实际的实施环境的设计。如下图: 一个不透明的带刻度的杯子。

软件设计模式的意义

所有开发人员都应该接触过软件设计模式这个概念,看过《设计模式-可复用的对象软件的基础》这本书,在面试中都被问过: 你用过哪些设计模式这种问题。但很大可能也就仅此而已了。

为什么好像只能从框架中找到设计模式的应用示例,而实施项目中很少看到?

是项目太简单了,用不着;是技术人员水平太差了,不会写;以业务价值最优先,先实现功能,设计不重要;设计做的费时费力也看不到,没有绩效,没意义。

上面这些理由都是现实项目中实实在在的理由,并不仅仅是面对询问时的借口,而是很多开发人员的真是想法。无需列举各种各样的数据,以及一条条的格言来证明设计模式是多么多么的重要,能带来多么多么好的效果。即使引经据典写了很多,最终的结果可能就是屏幕上的一划而过。甚至对设计模式是否有必要学习都持怀疑太多,认为这些都是八股文,看了也就是为了面试。

下面是对软件设计模式的意义的一些个人看法,有不同看法的恳请交流和指教。

设计模式的底层思维

设计模式的是建立在面向对象的思维基础上的。面向对象设计中最重要的就是抽象和封装。设计模式的目的为了在满足需求的前提下,做到不破坏或则提供更好的封装性的同时提供扩展性,也就是常说的对修改封闭对扩展开放的开闭原则。

《系统架构:复杂产品的设计与开发》中提到系统设计的第一要点: 识别并隔离系统的稳定点和变化点,比如Linux的内核层和用户层。 很多软件设计模式的核心目的也是分隔稳定点和变化点,提供一种灵活实现变化点带来的扩展性以及不破坏稳定部分代码(不破话封装)的带来的可靠性。也就是常常说的解耦

设计模式讲述的是特定需求场景下的某种模式,源自对系统设计的思考。 只有有了系统设计的思维,真正的去思考系统的稳定点和变化点时,才有设计模式存在的意义。如果有了这个想法,那么恭喜你,开始从纯粹的开发人员转变为系统设计师角色了。

       要理解设计模式的意义,首先思维上要从开发人员转变为设计人员。

设计师和资深施工人员的争论

有一个调侃词: 反人类的设计。 指的是那些偏离了实际的实施环境的设计。如下图: 一个不透明的带刻度的杯子。

制造业中已经形成了高度的分工,设计和实施通常是分开的, 而在软件实施中, 产品研发很多情况下还是同一个团队完成设计和编码,采购软件产品或服务时,也通常是由供应商全部完成软件的设计和实施。再加上系统功能测试,最终用户看到的交付版本看起来都是满足用户需求的设计和实现。 Everything is OK!

那软件产品里面都有设计吗?答案是不一定。

很多小工坊模式的实体产品生产并不需要设计,或根据经验,或所谓的山寨就可以生产出各式各样的产品。 软件开发也一样。很多时候是由经验丰富的软件开发人员根据自身经验独自完成整个项目或功能的构建,本应该出现的设计评审往往由于项目规模和定位,甚至是由于对敏捷开发的误会,追求最快的产品迭代等各种原因而省略了(当然项目交付汇报时依然是要有设计阶段的哈)。

这里有常见争议点:在有限的复杂度下,既然程序员都能够自行完成项目,还有必要增加设计人员或者说设计流程吗?设计人员的产出有资深程序员的经验更优秀吗?

答案见仁见智的。个人认为还是必要的,软件产品尤其是企业信息化软件和实体产品的有一个本质区别:企业信息化软件是永远处于变化中的。实体产品生产出来后就没法改变了, 如果需要修改则需要重新设计, 开模。 而开模的费用是昂贵的,而且已经生产的产品也只能丢弃了,人们能看得到设计不完善带来的代价,因此通常都会有明确的设计环节,即使是再小的零件都有图纸,由车间工人按照图纸进行加工。企业信息化软件伴随着企业规模,流程以及业务的调整需要持续的变更,也因此带来了IT、软件二开等相关的工作(感恩珍贵的工作岗位)。从需求用户的角度,软件天生就应该可以持续修改的,运维和二开的开始阶段往往是可以很快满足变更需求的,也更加深了软件可以轻易修改的假象。

系统软件开发是减少混乱度的过程,所以它本身是处于亚稳定状态的。软件维护是提高混乱度的过程,即使是最熟练的软件维护工作,也只是放换了系统退化到非稳态的进程。--《人月神话》

直到有一天,维护人员发现整个产品都变成了一个“大泥球”,即使是一个看起来很简单的需求变更实施的代价都是巨大甚至是不可完成的。因此在各方决策人员的讨论下做出了下面的结论:“当前软件架构上落后了,无法满足我们的业务需求了,我们需要重新实施新的项目来满足企业运营需求”。 于是如同轮回一般开始了新的技术产品选型、供应商选择、实施、成功上线。但似乎很难回答上个产品的架构是哪里不能满足需求了。

回到上面没有看到软件设计模式的前面2个理由:

  1. 是项目太简单了,用不着: 这个理由当然是不成立的,但是这里强调的是作为开发人员自身思想上必须正视这种错误的观念。从开发管理和软件工程的角度,这个理由从来没有存在过。
  2. 是技术人员水平太差了,不会写: 这个理由是真实的,尤其是企业信息化软件人力外包的场景下,真实的编码人员往往连项目经验都无法保障,更别说能形成设计思维了。这个问题的解决不在于这些开发人员,需要有专门的leader或资深员工从编码工作中解放出来负责设计,这些角色也应该真正正式软件设计的重要性,而不仅是开发管理。如果都是一肩挑那那就寄希望于开发人员能够有设计的思维,认识到设计工作的客观存在性了。

总结

软件设计很重要,因此软件设计模式很重要,开发人员如果不知从何开始设计,可以通过先思考确定系统功能(业务)的稳定点和变化点,在结合了解的设计模式去选择最佳实践开始。

软件设计模式对开发人员实在的好处

软件设计模式是一门沟通工具,能够给开发人员带来的下面真真切切的好处:

  1. 模式项目协作沟通工具。开发人员的沟通语言就是模式,可以通过设计模式的去和业务、BA沟通编码的设计,当面对不够详细的需求文档时,不如使用软件设计模式来和BA讲解自己的设计思路,明确真正的需求。
  2. 设计模式是技术人员之间的沟通工具。设计模式对阅读开源框架源码、理解第三方产品有莫大的好处。比如:你看到了xxxxBuilder的类, 通常是构造器模式,也就明白了这个类的目的就是构造特定对象, 其他类似典型的xxxFactory, xxxVisitor, xxxAdaptor, xxxEventListener等。同理,我们自己开发的代码是如果能使用模式,遵照模式去定义类,也能够极大的提升自身代码的质量和可阅读性。
  3. 设计模式是汇报的工具。模式也是表达开发产出的最佳方式:契合业务需求的设计模式通常是最佳实践,能在满足需求的情况下提供更好的扩展性和灵活性,是最能表达开发产出和开发人员能力的工具。当然也能很好的向领导汇报工作。

制造业中已经形成了高度的分工,设计和实施通常是分开的, 而在软件实施中, 产品研发很多情况下还是同一个团队完成设计和编码,采购软件产品或服务时,也通常是由供应商全部完成软件的设计和实施。再加上系统功能测试,最终用户看到的交付版本看起来都是满足用户需求的设计和实现。 Everything is OK!

那软件产品里面都有设计吗?答案是不一定。

很多小工坊模式的实体产品生产并不需要设计,或根据经验,或所谓的山寨就可以生产出各式各样的产品。 软件开发也一样。很多时候是由经验丰富的软件开发人员根据自身经验独自完成整个项目或功能的构建,本应该出现的设计评审往往由于项目规模和定位,甚至是由于对敏捷开发的误会,追求最快的产品迭代等各种原因而省略了(当然项目交付汇报时依然是要有设计阶段的哈)。

这里有常见争议点:在有限的复杂度下,既然程序员都能够自行完成项目,还有必要增加设计人员或者说设计流程吗?设计人员的产出有资深程序员的经验更优秀吗?

答案见仁见智的。个人认为还是必要的,软件产品尤其是企业信息化软件和实体产品的有一个本质区别:企业信息化软件是永远处于变化中的。实体产品生产出来后就没法改变了, 如果需要修改则需要重新设计, 开模。 而开模的费用是昂贵的,而且已经生产的产品也只能丢弃了,人们能看得到设计不完善带来的代价,因此通常都会有明确的设计环节,即使是再小的零件都有图纸,由车间工人按照图纸进行加工。企业信息化软件伴随着企业规模,流程以及业务的调整需要持续的变更,也因此带来了IT、软件二开等相关的工作(感恩珍贵的工作岗位)。从需求用户的角度,软件天生就应该可以持续修改的,运维和二开的开始阶段往往是可以很快满足变更需求的,也更加深了软件可以轻易修改的假象。

系统软件开发是减少混乱度的过程,所以它本身是处于亚稳定状态的。软件维护是提高混乱度的过程,即使是最熟练的软件维护工作,也只是放换了系统退化到非稳态的进程。--《人月神话》

直到有一天,维护人员发现整个产品都变成了一个“大泥球”,即使是一个看起来很简单的需求变更实施的代价都是巨大甚至是不可完成的。因此在各方决策人员的讨论下做出了下面的结论:“当前软件架构上落后了,无法满足我们的业务需求了,我们需要重新实施新的项目来满足企业运营需求”。 于是如同轮回一般开始了新的技术产品选型、供应商选择、实施、成功上线。但似乎很难回答上个产品的架构是哪里不能满足需求了。

回到上面没有看到软件设计模式的前面2个理由:

  1. 是项目太简单了,用不着: 这个理由当然是不成立的,但是这里强调的是作为开发人员自身思想上必须正视这种错误的观念。从开发管理和软件工程的角度,这个理由从来没有存在过。
  2. 是技术人员水平太差了,不会写: 这个理由是真实的,尤其是企业信息化软件人力外包的场景下,真实的编码人员往往连项目经验都无法保障,更别说能形成设计思维了。这个问题的解决不在于这些开发人员,需要有专门的leader或资深员工从编码工作中解放出来负责设计,这些角色也应该真正正式软件设计的重要性,而不仅是开发管理。如果都是一肩挑那那就寄希望于开发人员能够有设计的思维,认识到设计工作的客观存在性了。

总结

软件设计很重要,因此软件设计模式很重要,开发人员如果不知从何开始设计,可以通过先思考确定系统功能(业务)的稳定点和变化点,在结合了解的设计模式去选择最佳实践开始。

软件设计模式对开发人员实在的好处

软件设计模式是一门沟通工具,能够给开发人员带来的下面真真切切的好处:

  1. 模式项目协作沟通工具。开发人员的沟通语言就是模式,可以通过设计模式的去和业务、BA沟通编码的设计,当面对不够详细的需求文档时,不如使用软件设计模式来和BA讲解自己的设计思路,明确真正的需求。
  2. 设计模式是技术人员之间的沟通工具。设计模式对阅读开源框架源码、理解第三方产品有莫大的好处。比如:你看到了xxxxBuilder的类, 通常是构造器模式,也就明白了这个类的目的就是构造特定对象, 其他类似典型的xxxFactory, xxxVisitor, xxxAdaptor, xxxEventListener等。同理,我们自己开发的代码是如果能使用模式,遵照模式去定义类,也能够极大的提升自身代码的质量和可阅读性。
  3. 设计模式是汇报的工具。模式也是表达开发产出的最佳方式:契合业务需求的设计模式通常是最佳实践,能在满足需求的情况下提供更好的扩展性和灵活性,是最能表达开发产出和开发人员能力的工具。当然也能很好的向领导汇报工作。

相关文章:

软件设计模式的意义

软件设计模式的意义 所有开发人员都应该接触过软件设计模式这个概念,看过《设计模式-可复用的对象软件的基础》这本书,在面试中都被问过: 你用过哪些设计模式这种问题。但很大可能也就仅此而已了。 为什么好像只能从框架中找到设计模式的应用…...

vue基础知识十八:说说你对keep-alive的理解是什么?

一、Keep-alive 是什么 keep-alive是vue中的内置组件,能在组件切换过程中将状态保留在内存中,防止重复渲染DOM keep-alive 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们 keep-alive可以设置以下props属性&#xff1a…...

Linux CentOS配置阿里云yum源

一:先备份文件,在配置失败时可以恢复 cd /etc/yum.repos.d mkdir back mv *.repo back 二:下载阿里云yum源 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo wget -O /etc/yum.repos.d/epel…...

ESP32网络开发实例-Web服务器以仪表形式显示传感器计数

Web服务器以仪表形式显示传感器计数 文章目录 Web服务器以仪表形式显示传感器计数1、应用介绍2、软件准备3、硬件准备4、代码实现4.1 Web页面文件4.2 Web服务器代码实现在本文中,我们将介绍使用服务器发送事件 (SSE) 构建 ESP32 仪表 Web 服务器。服务器将自动向所有连接的网络…...

@Bean有哪些属性

直接看原文 原文链接:Spring中bean标签的作用和属性的详解-CSDN博客 -------------------------------------------------------------------------------------------------------------------------------- Bean的配置一般都在XML文件进行配置Bean相关包为:or…...

【Qt之绘制兔纸】

效果 代码 class drawRabbit: public QWidget { public:drawRabbit(QWidget *parent nullptr) : QWidget(parent) {}private:void paintEvent(QPaintEvent *event) {QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing, true);// 绘制兔子的耳朵painter.s…...

JS+CSS随机点名详细介绍复制可用(可自己添加人名)

想必大家也想拥有一个可以随机点名的网页&#xff0c;接下来我为大家介绍一下随机点名&#xff0c;可用于抽人&#xff0c;哈哈 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>* {margin: 0;…...

西瓜书笔记

周志华老师亲讲-西瓜书全网最详尽讲解-1080p高清原版《机器学习初步》 周志华机器学习&#xff08;西瓜书&#xff09;学习笔记&#xff08;持续更新&#xff09; 周志华《Machine Learning》学习笔记 绪论 基本术语 数据集&#xff08;data set&#xff09;&#xff1a;一堆…...

学算法常用刷题网站

学算法常用刷题网站 AcWing : 北大报送生&#xff0c;NOI金牌得主—yxc创办 CodeForces: 简称CF&#xff0c;俄罗斯的网站 hduoj: 杭州电子科技大学的在线评测系统 vjudge&#xff1a;用户可以自己举办比赛 POJ: 北京大学的在线评测系统 洛谷&#xff1a;很火的刷题网站 计蒜客…...

hdlbits系列verilog解答(always块条件语句)-37

文章目录 一、问题描述二、verilog源码三、仿真结果一、问题描述 Verilog 有一个三元条件运算符 ( ? : ) 很像 C语言: (condition ? if_true : if_false) 这可用于根据一行上的条件(多路复用器!)选择两个值之一,而无需在组合 always 块中使用 if-then。 举例: (0…...

智能井盖生产商家,万宾科技井盖传感器产品详情

市政府管理水平决定城市人民幸福程度&#xff0c;所以在智慧城市推进过程中&#xff0c;市政府也在加快城市信息基础设施建设&#xff0c;希望提高公共服务水平&#xff0c;以此来满足城市居民的需求&#xff0c;进一步推进城市信息化智能化发展。作为城市生命线的一个组成部分…...

开启AWS的ubuntu服务器的root用户登录权限

设置root用户密码 输入以下命令修改root用户密码 sudo passwd root输入以下命令切换到root用户 su root仅允许root用户用密码登录 输入以下命令编辑ssh配置文件 vi /etc/ssh/sshd_config新增以下配置允许root用户登录 PermitRootLogin yes把PasswordAuthentication修改为…...

ES6模块介绍—module的语法import、export简单介绍及用法

ES6模块语法 模块功能主要由两个命令构成&#xff1a;export和import。export命令用于规定模块的对外接口&#xff0c;import命令用于输入其他模块提供的功能。 一个模块就是一个独立的文件。该文件内部的所有变量&#xff0c;外部无法获取。如果你希望外部能够读取模块内部的…...

【设计模式】工厂模式总结

工厂模式 定义一个创建对象的接口&#xff0c;让子类决定实例化哪个类&#xff0c;而对象的创建统一交由工厂去生产。 工厂模式大致可以分为三类&#xff1a;简单工厂模式、工厂方法模式、抽象工厂模式。 简单工厂模式 简单工厂模式提供一个工厂类&#xff0c;根据传入的参…...

网络安全管理员高级工理论题库(持续更新中)

一. 单选题&#xff08;共16题&#xff09; 1.【单选题】职业是由于社会分工和生产内部的&#xff08;&#xff09;而形成的具有特定专业和专门职责的工作。 A、劳动分工 B、智力分工 C、生产分工 D、社会分工 正确答案&#xff1a;A 2.【单选题】职业是在人类社会出现分工之后…...

RestTemplate配置和使用

在项目中&#xff0c;如果要调用第三方的http服务&#xff0c;就需要发起http请求&#xff0c;常用的请求方式&#xff1a;第一种&#xff0c;使用java原生发起http请求&#xff0c;这种方式不需要引入第三方库&#xff0c;但是连接不可复用&#xff0c;如果要实现连接复用&…...

【Hadoop】YARN容量调度器详解

&#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,Java基础学习,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; &#x1fa81;&#x1f341;&am…...

20个Python实用小技巧!来自十年老程序员的推荐~

文章目录 1.用itertools排列2.单行条件表达式3. 反转字符串4. 使用 Assert 处理异常5. 对多个输入使用拆分6. 用 zip() 转置矩阵7. 资源上下文管理器8. 下划线作为分隔符9. 尝试 f 字符串格式10.用这个技巧交换整数11. 使用 lambda 代替函数12.多次打印无循环13. 将字符串解包为…...

jenkins原理篇——成员权限管理

大家好&#xff0c;我是蓝胖子&#xff0c;前面几节我讲述了jenkins的语法以及我是如何使用jenkins对测试和正式环境进行发布的。但正式环境使用jenkins还有一点很重要&#xff0c;那就是权限管理。正式环境的权限往往不能对所有人开放&#xff0c;以及要做到每次发布都是谁在操…...

13.求面积[有问题]

#include<stdio.h> #include<math.h> #include<bits/stdc.h> using namespace std;void fun(double a,b,c) {double p,c;p (abc)/2;c sqrt(p*(p-a)*(p-b)*(p-c));printf("面积是&#xff1a;%lf",c); }int main(){double a,b,c;scanf("%lf,%…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...