MING / AXELBUILDER / EXPLORER

Dev Fundamentals

2026-07-29 软件开发基础概念笔记

今天系统性梳理了「一个项目到底由哪些部分组成」以及「终端到底是什么」,作为后续自己动手开发项目的地基。


一、一个软件 / App / 网站由哪些部分组成?

这是最核心的问题。无论写网站、做 App 还是开发工具,大致都可以拆成以下几层:

部分 作用 通俗理解 例子
前端 (Frontend) 用户看到的界面、交互、样式 门面、装修 网页页面、App 的按钮和布局、React / Vue 组件
后端 (Backend) 处理业务逻辑、权限、计算、接口 后台办公室 登录验证、数据处理、API 接口
数据库 (Database) 真正存储数据的地方 仓库 / 档案室 用户信息、订单、文章内容(MySQL、PostgreSQL、MongoDB 等)
依赖库 (Dependencies) 别人已经写好的现成功能代码 工具箱、零件 React、Express、Lodash、Axios 等
配置文件 告诉程序如何运行、连接什么服务 说明书 .env、package.json、tsconfig.json
测试代码 检查功能是否正常 质检员 单元测试、集成测试
构建与部署相关 把代码变成可以上线运行的版本 打包、发货 build 脚本、Docker、CI/CD

简单理解整个流程

  1. 用户在前端点击按钮
  2. 前端把请求发给后端
  3. 后端处理逻辑,必要时去数据库读写数据
  4. 后端把结果返回给前端
  5. 前端把结果展示给用户

中间用到的各种现成功能,都来自依赖库。


二、终端(Terminal)到底是什么?

1. 定义

终端 = 电脑的文字控制台。

平时我们用鼠标点图标、拖文件,那是图形界面(GUI)。
终端是用打字的方式直接给电脑下指令的界面。

  • Windows 常见:CMD、PowerShell、Windows Terminal
  • Mac / Linux:Terminal

可以把它理解成:

  • 图形界面 = 通过服务员点菜
  • 终端 = 直接走进厨房跟厨师说话

2. 为什么终端这么好用?

优点 说明
效率高 敲一行命令就能完成很多操作
可重复、可自动化 命令可以写成脚本,一键执行
精准控制 能精确指定参数
服务器必备 真正的服务器通常只有命令行
工具生态强 大量开发工具本身就是命令行工具
可组合 多个命令可以串联使用

3. 终端能做什么?

基本上可以访问和管理电脑上的绝大多数文件和程序:

  • 查看、复制、移动、删除文件
  • 启动程序
  • 安装 / 卸载软件
  • 修改配置
  • 查看进程、网络、硬件状态

但有两个重要限制:

  1. 权限限制:普通用户权限下,无法随意修改系统核心文件(需要管理员权限或 sudo)
  2. 设计限制:有些程序本身没有提供命令行接口,或强依赖图形界面,终端只能启动它,无法完整操作所有功能

三、CLI 是什么?

CLI = Command Line Interface(命令行界面)

CLI 工具就是专门设计成在终端里使用的程序。

常见例子:

  • git
  • pnpm / npm / yarn
  • python
  • ffmpeg
  • curl

关系梳理:

  • 终端(Terminal):那个可以打字的窗口
  • Shell:终端里真正解释和执行命令的程序(bash、zsh、PowerShell 等)
  • CLI 工具:在终端里运行的各种命令程序

四、常用命令到底在干什么?

以 JavaScript / TypeScript 项目最常见的包管理器为例:

命令 实际作用
pnpm install / npm install 安装依赖。读取 package.json,把项目需要的第三方库全部下载到本地
pnpm dev / npm run dev 启动开发服务器,让你可以在本地预览网站
pnpm build 打包构建,把代码优化成可以上线的版本
pnpm test 运行测试
pnpm lint 代码检查,找不规范的写法和潜在问题

重点解释:xxx install 是什么意思?

项目会用到很多别人写好的库(依赖)。这些库不会直接写在你的代码里,而是记录在清单文件中(比如 package.json)。

执行 pnpm install 时,电脑会:

  1. 读取清单文件
  2. 从网上把需要的库下载下来
  3. 放到项目的 node_modules 文件夹中

没有执行 install,项目通常跑不起来,因为缺少必要的「零件」。


五、什么是「安装环境」?

环境 = 让代码能够正常运行所需要的一切软件、工具和配置的集合。

通常包括:

  • 编程语言本身(Node.js、Python、Java 等)
  • 包管理器(pnpm、pip 等)
  • 项目依赖库
  • 开发工具(Git、编辑器等)
  • 相关配置

**「安装环境」**就是把这些东西都装好并配置正确。

没有装好环境,代码写得再好也跑不起来。就像做饭之前必须先准备好锅、米、油和调料。

常见说法对应的实际意思:

  • 「安装 Node 环境」→ 安装 Node.js + npm/pnpm
  • 「安装项目环境 / 安装依赖」→ 进入项目目录执行 pnpm install
  • 「配置开发环境」→ 把语言、编辑器、Git、必要工具都准备好

六、JSON 是什么?

JSON(JavaScript Object Notation)是一种轻量的数据格式,用来在程序之间传递结构化信息。

示例:

{
  "name": "小明",
  "age": 21,
  "skills": ["Python", "JavaScript"],
  "isStudent": true
}

特点:

  • 用 {} 表示对象
  • 用 [] 表示列表
  • 键值对用冒号连接
  • 人类勉强能看懂,程序非常容易解析

为什么到处都用它?

  • 前端和后端交换数据几乎都用 JSON
  • 很多配置文件(如 package.json)就是 JSON
  • 几乎所有编程语言都能轻松读写

七、终端与我们平时看到的 App 是什么关系?

不是所有代码都能直接在终端里「跑给人用」。

代码类型 能否直接在终端使用 说明
命令行程序(CLI) 能 专门为终端设计
网站后端 能(启动服务) 终端启动后,用浏览器访问
普通桌面软件 / App 一般不能直接替代界面 终端只能启动它
手机 App 不能 必须在手机系统上运行

我们平时看到的 App,很多是把底层能力(终端也能调用的那些)包装成了更友好的图形界面。

可以这样理解:

  • 终端:直接、精确、适合开发和自动化
  • 图形界面 / App:把同样的能力翻译成普通人能点的按钮

很多时候,图形界面只是「壳」,真正干活的逻辑和终端用的是同一套底层能力。


八、为什么几乎所有编程软件都内置终端?

因为开发过程中大量操作必须用命令:

  • 安装依赖
  • 启动项目
  • 跑测试
  • 使用 Git
  • 查看日志、调试

用纯图形界面点来点去效率低,而且和真实服务器环境也不一致。

所以 VS Code、Cursor、JetBrains 系列、以及各种 AI 编程工具,几乎都会把终端直接嵌进去。


九、今天最重要的认知总结

  1. 一个项目 = 前端 + 后端 + 数据库 + 依赖 + 配置 + 测试 + 构建
  2. 终端是用文字直接指挥操作系统的窗口,比图形界面更底层、更高效
  3. CLI 工具是专门跑在终端里的程序
  4. xxx install 的本质是下载项目所需的依赖零件
  5. 安装环境 = 准备好代码运行所需的一切
  6. JSON 是程序之间传递数据的通用格式
  7. 图形界面很多时候只是对底层能力的友好包装

后续可以继续深入的方向

  • 环境变量到底是什么
  • 虚拟环境(venv / nvm 等)为什么重要

一、环境变量(Environment Variables)是什么?

环境变量 = 操作系统(或当前终端会话)里存的「键值对配置」。

程序在运行时可以读取这些值,用来知道:

  • 我该连哪个数据库?
  • API 密钥是什么?
  • 现在是开发模式还是生产模式?
  • 某个工具装在哪里?

它就像给程序准备的「全局便签」,程序启动时会自动去看。

常见形式


名字 = 值

PATH=/usr/local/bin:/usr/bin NODE_ENV=development DATABASE_URL=postgres://user:pass@localhost:5432/mydb OPENAI_API_KEY=sk-xxxxxxxx


### 实际例子

| 环境变量 | 作用 | 如果不设置会怎样 |
|----------|------|------------------|
| `PATH` | 告诉系统去哪里找可执行文件(比如 `node`、`python`) | 敲命令会提示「找不到命令」 |
| `NODE_ENV` | 告诉 Node.js 现在是开发还是生产环境 | 框架可能用默认行为,或报警告 |
| `DATABASE_URL` | 数据库连接地址 | 程序连不上数据库 |
| `API_KEY` / `SECRET` | 各种密钥 | 调用第三方服务失败 |

### 怎么查看和设置(以终端为例)

```bash
查看某个变量

echo $PATH # Mac / Linux echo %PATH% # Windows CMD

临时设置(只对当前终端窗口有效)

export NODE_ENV=development # Mac / Linux set NODE_ENV=development # Windows CMD

项目里更常见的做法:写在 .env 文件里
然后用 dotenv 这类库自动加载

**重点**:  
环境变量本身不是「安装」出来的东西,而是**配置信息**。  
真正装软件的是包管理器,环境变量只是告诉程序「用什么配置去跑」。

---

## 二、虚拟环境(Virtual Environment)是什么?

**虚拟环境 = 给某个项目单独隔离出来的一套「独立运行环境」**。

目的是:**不同项目互不干扰**。

### 为什么需要它?

假设你有两个项目:

- 项目 A 需要 Python 3.10 + 某库的 1.0 版本
- 项目 B 需要 Python 3.12 + 同一库的 2.0 版本

如果都装在系统全局,就会互相冲突。  
虚拟环境就是给每个项目造一个「独立小房间」,里面的 Python、Node、依赖库都是这个项目私有的。

### 常见虚拟环境工具

| 工具 | 主要解决什么 | 典型命令 |
|------|--------------|----------|
| **venv / virtualenv** | Python 项目隔离 | `python -m venv .venv` |
| **conda** | Python + 科学计算包 | `conda create -n myenv python=3.11` |
| **nvm** | 多个 Node.js 版本切换 | `nvm install 20` / `nvm use 20` |
| **fnm / n** | 和 nvm 类似,管理 Node 版本 | 类似 nvm |
| **pyenv** | 管理多个 Python 版本 | `pyenv install 3.12` |

### 具体例子

#### 1. Python 的 venv(最常见)

```bash
1. 创建虚拟环境(会生成一个 .venv 文件夹)

python -m venv .venv

2. 激活它(进入这个独立环境)

source .venv/bin/activate # Mac / Linux .venv\Scripts\activate # Windows

激活后,终端前面通常会显示 (.venv)
这时再装的包,都只装在这个项目里
3. 安装依赖

pip install requests flask

4. 用完后退出

deactivate


#### 2. Node.js 的 nvm(管理不同 Node 版本)

```bash
安装某个 Node 版本

nvm install 20

切换到这个版本

nvm use 20

查看当前用的是哪个

node -v


nvm 解决的是「不同项目需要不同 Node 版本」的问题;  
而每个 Node 项目自己的依赖,则靠 `node_modules` + `package.json` 来隔离(这个本身已经算一种轻量虚拟环境)。

---

## 三、两者的关系(容易混淆的地方)

| 概念 | 本质 | 解决的问题 |
|------|------|------------|
| **环境变量** | 配置信息(键值对) | 程序运行时需要知道的参数(密钥、地址、模式等) |
| **虚拟环境** | 隔离的运行空间 | 不同项目的语言版本、依赖库互不冲突 |

可以这样记:

- **虚拟环境** = 给项目准备的独立房间(里面有自己的 Python/Node 和库)
- **环境变量** = 贴在房间墙上的便签(告诉程序数据库地址、密钥是什么)

两者经常配合使用:  
你在某个虚拟环境里运行项目时,同时通过环境变量把配置传给它。

---

## 四、实际开发中的典型流程(结合例子)

以一个 Python 项目为例:

```bash
1. 进入项目目录

cd my-project

2. 创建并激活虚拟环境

python -m venv .venv source .venv/bin/activate

3. 安装依赖

pip install -r requirements.txt

4. 设置环境变量(或写在 .env 文件里)

export DATABASE_URL=postgres://localhost/mydb export SECRET_KEY=my-secret

5. 运行项目

python app.py


Node 项目类似:

```bash
用 nvm 切到需要的 Node 版本

nvm use 20

安装项目依赖(隔离在 node_modules 里)

pnpm install

环境变量通常放在 .env 文件
然后用 next dev / pnpm dev 启动

---

### 一句话总结

- **环境变量**:程序运行时读取的配置信息(密钥、地址、模式等)。
- **虚拟环境**:为单个项目隔离出来的独立运行空间,避免不同项目的语言版本和依赖互相打架。
Source:我在做:/ai-dev/学习/开发基础概念.md