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 |
简单理解整个流程
- 用户在前端点击按钮
- 前端把请求发给后端
- 后端处理逻辑,必要时去数据库读写数据
- 后端把结果返回给前端
- 前端把结果展示给用户
中间用到的各种现成功能,都来自依赖库。
二、终端(Terminal)到底是什么?
1. 定义
终端 = 电脑的文字控制台。
平时我们用鼠标点图标、拖文件,那是图形界面(GUI)。
终端是用打字的方式直接给电脑下指令的界面。
- Windows 常见:CMD、PowerShell、Windows Terminal
- Mac / Linux:Terminal
可以把它理解成:
- 图形界面 = 通过服务员点菜
- 终端 = 直接走进厨房跟厨师说话
2. 为什么终端这么好用?
| 优点 | 说明 |
|---|---|
| 效率高 | 敲一行命令就能完成很多操作 |
| 可重复、可自动化 | 命令可以写成脚本,一键执行 |
| 精准控制 | 能精确指定参数 |
| 服务器必备 | 真正的服务器通常只有命令行 |
| 工具生态强 | 大量开发工具本身就是命令行工具 |
| 可组合 | 多个命令可以串联使用 |
3. 终端能做什么?
基本上可以访问和管理电脑上的绝大多数文件和程序:
- 查看、复制、移动、删除文件
- 启动程序
- 安装 / 卸载软件
- 修改配置
- 查看进程、网络、硬件状态
但有两个重要限制:
- 权限限制:普通用户权限下,无法随意修改系统核心文件(需要管理员权限或
sudo) - 设计限制:有些程序本身没有提供命令行接口,或强依赖图形界面,终端只能启动它,无法完整操作所有功能
三、CLI 是什么?
CLI = Command Line Interface(命令行界面)
CLI 工具就是专门设计成在终端里使用的程序。
常见例子:
gitpnpm/npm/yarnpythonffmpegcurl
关系梳理:
- 终端(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 时,电脑会:
- 读取清单文件
- 从网上把需要的库下载下来
- 放到项目的
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 编程工具,几乎都会把终端直接嵌进去。
九、今天最重要的认知总结
- 一个项目 = 前端 + 后端 + 数据库 + 依赖 + 配置 + 测试 + 构建
- 终端是用文字直接指挥操作系统的窗口,比图形界面更底层、更高效
- CLI 工具是专门跑在终端里的程序
xxx install的本质是下载项目所需的依赖零件- 安装环境 = 准备好代码运行所需的一切
- JSON 是程序之间传递数据的通用格式
- 图形界面很多时候只是对底层能力的友好包装
后续可以继续深入的方向
- 环境变量到底是什么
- 虚拟环境(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 启动
---
### 一句话总结
- **环境变量**:程序运行时读取的配置信息(密钥、地址、模式等)。
- **虚拟环境**:为单个项目隔离出来的独立运行空间,避免不同项目的语言版本和依赖互相打架。