乐于分享
好东西不私藏

跟着AI了解软件开发

跟着AI了解软件开发

今天早会,教授谈到一个软件开发问题,但没有细致讲授其中的内容,我便向Deepseek请教学习,问题如下:公共变量的内涵,外延,作用,风险,及使用方法是什么?
同理,函数,接口,服务,容器,容器镜像,架构,部署,安装,环境及界面的内涵,外延,作用,风险,及使用方法,以及相互之间的关系,我是对于计算机软件编程一窍不通,但每天听同事们讨论这些专有名词,内心非常羡慕这群聪明绝顶的小伙子们,那么,如何才能从菜鸟的角度理解软件开发呢?
Deepseek给我的答复如下,我看过之后,甚觉恍然大悟,原来软件开发的原理是这样的逻辑啊,非常有意思!感兴趣的朋友一起来享受现代科技带来的乐趣!

第一步:先理解核心灵魂——【公共变量】

把它想象成餐厅前台的黑板(或广播)

  • 内涵(它是什么): 就是一块所有人都能看见和修改的黑板。比如上面写着“今日例汤:排骨汤”。

  • 外延(它能影响谁): 所有进出的员工(后厨、服务员、收银员)都能看到并改动它。

  • 作用(好处): 方便!如果汤变了,服务员不用挨个通知,只要在黑板上改一下就行。

  • 风险(坏处): 灾难!如果收银员心情不好,随手把“排骨汤”改成“泔水”,后厨真按这个做,端给客人,餐厅就完了。

  • 使用方法(怎么用好): 规矩要严!必须规定“只有店长(主程序)有权改黑板,其他人只能看”。或者,谁要改,必须登记签名。


第二步:再看餐厅的“工具”和“部件”

理解了黑板,其他概念就全是围绕它运转的工具了。

术语
餐厅比喻
通俗解释
函数 食谱/菜谱
就是“做番茄炒蛋”的一套固定步骤。你喊一声“函数-炒番茄”,后厨就按这个固定流程给你出一盘菜。作用: 避免重复发明轮子,随时调用。
接口 服务员点单机
你不需要知道后厨怎么炒菜,你只需要在点单机上按“下单”,菜就来了。作用: 隔离复杂性。你只关心“输入(点单)”和“输出(上菜)”,中间怎么做的你不用管。
服务 专门的档口(凉菜间/面点间)
整个餐厅太大,干脆分成独立的小档口。一个只管做凉菜,一个只管煮面。作用: 独立运转,凉菜间着火不影响面点间出餐。
容器 一次性打包盒
把你做的菜(软件)连同它的调料(运行环境)一起打包进这个盒子。作用: 在任何地方(另一家餐厅厨房)都能直接打开加热就能吃,环境一致。
容器镜像 打包盒的“模具”
不是真的打包盒,而是“如何制作这个打包盒”的蓝图。根据蓝图,能瞬间复制出成千上万个一模一样的打包盒(容器)。
架构 餐厅的图纸设计(动线)
决定厨房在左、大堂在右、厕所离门远不远。作用: 好的架构让传菜员少走路,上菜快;烂架构让所有人撞来撞去。
部署 把厨具搬进新店并通水电气
你把写好的代码(厨具)安装到服务器(新厨房)里,让它真正能开始干活。
安装 固定灶台、接通水管
部署的具体一步,就是把软件实实在在地放到机器里,让它能用。
环境 厨房的温度、湿度、电压
你的软件运行需要特定的电脑系统版本、数据库等。风险: 你在常温(Win系统)测试正常,一放到高原(Linux系统)就爆了。
界面 给客人看的菜单牌
你作为食客,看到的按钮、颜色、图片。作用: 界面要好看好点,后厨代码再烂,只要界面好看,客人就觉得好吃。

第三步:他们之间的“父子”关系(如何串起来)

咱们倒着理一遍:

  1. 你(用户)看到的是界面(漂亮的菜单)。

  2. 你点菜,是通过接口(下单)下单。

  3. 接口调动后厨,执行函数(菜谱)做菜。

  4. 为了做大生意,餐厅分了多个服务(凉菜/热菜)。

  5. 这些服务被塞进容器(打包盒),并根据容器镜像复制。

  6. 整个餐厅的动线叫架构

  7. 装修搬东西叫部署安装

  8. 所有这些都必须在合适环境(电压稳定)下运行。

  9. 而那块写着“今日例汤”的公共变量,是贯穿所有环节的通告,大家都得看它。


第四步:给菜鸟的“偷懒”学习法

您不用去学写代码。要理解教授的问题,您只需要记住三句话:

  1. 公共变量是“魔鬼”:问教授:“咱们项目里的公共变量,有设置写保护吗?防止误改?” 这一句话就能让教授觉得您懂行。

  2. 接口比实现重要:你不需要知道内部怎么算的,只需要知道“给什么输入,得到什么输出”。

  3. 环境不一致是最大坑:本地跑得好好的,一上线就崩——99%是“环境”差异。

给您的建议:下次教授再提这些,您就盯着“公共变量”问:“这块黑板谁有权限擦?”以及“接口”问:“我调这个接口,返回给我的是什么数据?”只要能搞清这两个,您就抓住了软件开发最核心的“钥匙”。

然后我再追问Deepseek:公共变量的学术定义是什么呢?

一、学术定义

公共变量(在编程术语中通常称为全局变量 Global Variable 或公共字段 Public Field),其学术定义为:

在程序的所有作用域(Scope)中均可直接访问和修改的变量。它不属于任何一个特定的函数、类或局部代码块,而是归属于整个程序或整个命名空间(Namespace)。

拆解这个定义中的关键术语:

术语
学术解释
通俗对照(餐厅黑板)
作用域(Scope)
变量在代码中能被访问到的范围。局部变量只在花括号 {} 内有效,而公共变量在程序任何位置都有效。
黑板挂在餐厅大堂,所有包间、后厨、前台的人都能看到。
生命周期
公共变量在程序启动时创建,在程序结束时才销毁,贯穿整个运行过程。
黑板从早上开业挂到晚上打烊,全天都在。
全局命名空间
所有公共变量都存放在一个公共的“名字池”里,不同函数都能按名字找到它。
大家都知道“黑板”叫什么,想找直接去大堂看就行。

二、学术文献中的相关概念

在软件工程和编程语言理论中,围绕“公共变量”还有几个相关的学术术语:

  1. 全局状态(Global State)公共变量是全局状态的一种具体实现形式。学术上认为,全局状态是导致程序复杂性的主要来源之一,因为它使得程序的各个部分之间产生了隐式耦合(Implicit Coupling)——即你改一个地方,可能影响完全不相干的另一个地方,而这种影响在代码表面看不出来。

  2. 共享可变性(Shared Mutability)这是学术上对公共变量风险的精确描述。意思是:多个模块共享同一个变量,且该变量可以被修改(Mutable)。这种组合是并发编程中竞态条件(Race Condition) 和数据不一致的根本原因。

  3. 可见性(Visibility)在面向对象编程中,用 public 修饰符声明的字段或属性,意味着它具有最高的可见性级别(相对于 private 私有的、protected 受保护的)。学术上将可见性视为一种访问控制机制,而 public 意味着放弃了这种控制。

三、学术角度的“三性”分析

维度
                             学术表述
      核心要点
内涵
程序级别的共享存储单元,具有全局作用域和全生命周期。
所有人都能用、全程都活着。
外延
涵盖所有被声明为 publicglobal 或在顶层作用域中定义的变量,包括全局常量、全局配置参数、单例对象中的公共属性等。
只要不封装在局部,就算。
风险
违反信息隐藏(Information Hiding) 原则,破坏模块化(Modularity),导致强耦合(High Coupling) 和低内聚(Low Cohesion)
学术上把它视为一种“设计坏味道(Design Smell)”。

四、学术界的主流共识(规范)

在计算机科学经典著作(如《代码大全》《设计模式》《重构》)中,对公共变量使用的学术共识是:

“除非绝对必要,否则应避免使用公共变量。优先使用局部变量、参数传递或封装后的访问方法(Getter/Setter)来代替。”

具体规范:

  • 如果必须使用,应将其声明为只读(Readonly) 或常量(Const),禁止外部修改。

  • 在并发环境下,必须通过同步机制(如锁、原子操作) 保证线程安全。

  • 在架构设计上,建议将公共变量集中存放在一个专门的配置模块中,而不是散落在各处。

五、一句话学术总结

公共变量是拥有全局可见性和全生命周期的共享存储单元,它破坏了模块之间的信息隐藏,是导致程序耦合度升高和维护成本增加的主要结构因素。在工程实践中应严格控制其使用,并通过封装、只读化或参数传递等模式来规避其风险。

我再追问了:从学术观点来看,什么函数的内涵,外延,作用,风险以及使用方法呢?

一、学术定义(内涵)

函数(在纯学术领域常称子程序 Subroutine 或方法 Method),其标准定义为:

函数是一段被命名的、可重复调用的代码块,它接收零个或多个输入参数(Input),执行特定的计算或操作,并返回一个输出结果(Output)。其核心特征是“单一职责”和“黑盒封装”。

拆解这个定义中的四个学术灵魂:

特征
学术解释
通俗对照(餐厅菜谱)
命名(Name)
每个函数必须有唯一标识符,通过名字来调用它。
“西红柿炒鸡蛋”就是这道菜(函数)的名字。
输入(参数)
函数可以接收外部传入的数据,使同一个函数处理不同数据。
菜谱写着“西红柿2个、鸡蛋3个”,这就是原材料输入。
处理(逻辑)
函数内部封装的算法或操作步骤。
“切块、打蛋、热油、翻炒”的具体流程。
输出(返回值)
函数执行完毕后返回给调用方的结果。
端出来的一盘成品菜。

二、函数的外延(包含哪些具体形式)

在学术和工程实践中,函数的外延非常广泛:

  • 纯函数(Pure Function):输入相同则输出必然相同,且无任何副作用(不修改外部状态)。这是函数式编程的基石。

  • 递归函数(Recursive Function):在函数体内部调用自身的函数,用于解决分治类问题(如遍历树形结构)。

  • 匿名函数(Lambda/闭包):没有函数名的函数,常作为参数传递给其他函数。

  • 回调函数(Callback):作为参数传入,并在某个事件发生后被“叫回来”执行的函数。

  • 构造函数(Constructor):面向对象编程中用于创建和初始化对象的特殊函数。

  • API函数(接口函数):对外开放的、供其他系统调用的函数。

三、函数的作用(为什么它是伟大的发明)

作用
学术术语
通俗解释
代码复用
避免重复代码(DRY原则)
不用每次炒菜都重新发明菜谱,拿出来直接用。
模块化分解
分而治之(Divide and Conquer)
把一个大餐厅拆成凉菜间、热菜间,各管一摊。
信息隐藏
封装(Encapsulation)
吃菜的人不需要知道后厨怎么切怎么炒,只管吃。
可测试性
单元测试(Unit Test)
可以单独测试“西红柿炒鸡蛋”这个函数好不好吃,不用等整桌菜做好。
抽象层次
提高代码可读性
看函数名就知道在干什么,不用看内部几百行细节。

四、函数的风险(即使这么好的东西也有坑)

风险
学术术语
翻车场景(餐厅版)
副作用(Side Effect)
函数内部修改了外部公共变量、文件、数据库等
炒菜过程中偷偷把黑板上“今日例汤”改了,导致别的档口出乱子。
过长的参数列表
参数过多导致难以使用和维护
一个菜谱要输入20种调料,厨师一看就头大,容易放错。
高耦合(High Coupling)
函数之间相互依赖太深,牵一发而动全身
改了一下“切西红柿”的步骤,结果“炖牛腩”那个函数也崩了。
过度嵌套
函数调用层次过深,导致栈溢出或逻辑混乱
后厨喊“A帮B”,B喊“C帮D”,D又喊“A帮”,最后谁也找不到谁。
性能损耗
函数调用有栈帧创建和销毁的开销
每炒一个菜都要把厨具全部洗一遍再重新拿,浪费时间。

五、函数的学术使用方法(最佳实践规范)

根据软件工程经典著作(《代码大全》《重构》《Clean Code》),函数使用的学术共识如下:

规范
学术原则
具体做法
单一职责
一个函数只做一件事
如果函数名里包含“并且(And)”,就说明它该拆了。
短小精悍
函数长度尽量控制在20-30行以内
超过一屏(约50行)就应该考虑拆分。
避免副作用
优先使用纯函数
如果必须修改外部状态,明确在函数名中标明(如 updateUser())。
参数数量
参数控制在3个以内
超过3个用对象/结构体封装成一个参数传入。
命名规范
使用动词+名词
getUserInfo()

calculateTotal(),一看就懂。
防御性编程
对输入参数进行有效性校验
不能传个负数进去让函数算平方根,必须提前检查。
单一出口
尽量只有一个 return 语句
便于调试和阅读,避免多个出口导致逻辑混乱。

六、一句话学术总结

函数是软件工程中实现“分而治之”的核心工具,它通过封装逻辑、隐藏信息、提供可复用的抽象接口,极大地降低了系统的复杂度。良好的函数设计遵循“高内聚、低耦合、无副作用”三大原则。函数设计的好坏,直接决定了软件的可维护性和可扩展性。

七、给您的“菜鸟”实战锦囊

下次教授再聊函数,您就盯着这三个问题问,一听就是懂行的:

  1. “这个函数有副作用吗?它会不会偷偷改公共变量?” —— 这是函数设计最关键的问题。

  2. “这个函数能单独做单元测试吗?” —— 不能独立测试的函数就是坏函数。

  3. “参数能不能封装成一个对象传入?” —— 参数超过3个,说明设计偷懒了。

你学会了吗?
我没学会,不过不要紧,慢慢学,每天学一点,开开心就好。
今天就写到这里了,最近连续半个月都在下雨,也就是说我半个月没有运动了,以前担心跑步太多长的太廋,于是大口吞食物,管他好吃不好吃;休息了半个月,又担心明天天气好了跑不动了,哈哈哈,明天是端午节,希望好好享受一个没有下雨的清晨!
各位朋友晚安!
往期精彩阅读
即使身在青楼也不放弃寻找学习成长的机会,最后还成功创办了锦江饭店
她一生无名无分,养育一门三院士,九子皆才俊
才子郁达夫与倾国倾城的王映霞的爱恨情仇
一代才女赵罗蕤:清华曾经最亮的光,历尽摧折,仍然把灵魂译成光
冰心为何遭人嫌弃?张爱玲不待见她,林徽因讨厌她
民国狂人刘文典