#计算机基础
42 篇文章,按发布时间排列。
1.1 shell,终端(Terminal),CLI
在电脑上验证这些概念,可以试试以下操作(以 Mac 为例): 输入 ps -p $$ -o comm=。$$ 是当前 Shell 的进程号。
1.2 计算机之间的通信:网络
计算机网络的核心目标很朴素:让不同设备上的程序能够交换数据。 两台电脑用一根线直接相连,是网络;家里的手机、电脑和路由器组成的是局域网;大量局域网再通过运营商和骨干网络互联,就形成了互联网(Internet)。
1.3 操作系统
操作系统(Operating System,OS)位于应用程序与硬件之间。它有两个核心角色: 应用程序想读取 SSD 上的一段数据,并不需要知道 SSD 控制器如何发出电信号。它只需请求“打开这个路径下的文件并读取 4 KB”。操作系统
1.4 程序是怎样运行的
同一程序可以同时启动多个进程,每个进程拥有独立状态。修改磁盘上的程序文件,也不会自动改变已经加载到内存中的旧进程。 不同语言采用不同组合,没有“编译型语言”和“解释型语言”永远不变的二分法。
1.5 编程的基本模型
程序可以看成:接收输入,在一组规则约束下改变状态,产生输出或副作用。 一个订单程序的输入可以是商品与用户,状态包括库存和订单记录,输出可以是响应页面,副作用则包括写数据库和发送消息。
2.1 前端是什么
前端是直接运行在用户设备上、负责呈现信息并接收交互的应用部分。 在 Web 开发中,它通常指运行在浏览器里的 HTML、CSS、JavaScript 及其资源。 前端不只是“美工”或“写页面”,它还要处理:
2.10 TypeScript:类型系统解决了什么
TypeScript 在 JavaScript 之上加入静态类型系统和相关语法。工具在运行前检查代码,再生成 JavaScript: TypeScript 的主要价值:
2.11 浏览器存储、缓存与安全边界
把缓存当唯一数据源,会在浏览器清理空间后丢失用户成果;把所有服务器数据永久复制到客户端,又会制造过期、隐私和一致性问题。 设计前先回答:哪一份是权威来源?数据丢失是否可接受?何时过期?是否含敏感信息?
2.2 前端模块化
小页面可以把所有代码放在一个 <script 里。项目变大后,这种方式会迅速遇到问题: 模块化是把系统拆成边界清晰、职责聚焦、通过明确接口协作的单元。 它的目标不是“让文件变多”,而是管理复杂度。
2.3 前端构建
开发时写的是源码(source code),最终部署的是构建产物(build artifacts)。把前者转换为后者的一组自动化处理,就叫构建。 简单的 HTML、CSS、JavaScript 可以不经过构建直接在浏览器运行。但现代项目
2.4 什么是框架?前端框架有哪些?为什么react不是框架?
开发软件时,我们不会从像素绘制、网络报文和数据结构全部手写。别人封装好的代码大致可以分成几种层次: 边界并非数学定理。同一个项目可以既自称框架,又允许像库一样渐进使用。比标签更重要的是知道:它替你决定了哪些事,你还必须自己选择哪些事。
2.5 把网页部署到公网上
localhost 或 127.0.0.1 指当前这台设备自身。开发服务器监听在这里时,请求不会离开你的电脑,互联网上的其他人自然无法访问。 让网站公开可用,至少要解决:
2.6 HTML:内容、结构与语义
HTML(HyperText Markup Language)用元素给内容增加结构和含义: 这里不是在告诉浏览器“第一行用 32 像素粗体”,而是在声明:这是一篇文章、一个一级标题和一个段落。视觉外观主要由 CSS 决定。
2.7 CSS:布局、响应式与渲染
CSS(Cascading Style Sheets)描述元素在不同设备、内容和状态下如何呈现。浏览器综合: 好的 CSS 通常描述关系,例如“卡片至少 16rem,能放几个就放几个”,而不是给每个元素写死屏幕坐标。
2.8 JavaScript:语言核心
JavaScript 是 ECMAScript 标准定义的编程语言。浏览器提供 DOM、Fetch、定时器、Storage 等 Web API;Node.js 则提供文件、进程和服务端网络 API。 Array.prototype.ma
2.9 异步、事件循环与 Promise
网络、磁盘和用户输入的速度远慢于 CPU。如果程序发出请求后原地占住主线程等待,页面会无法点击、滚动或绘制。 异步的核心是:发起一个暂时不能立即完成的操作,把继续执行所需的信息保存下来;操作完成后,再安排后续代码运行。
3.0 什么是 API?后端是为了什么?
API 是 Application Programming Interface(应用程序编程接口)。它规定一段软件如何请求另一段软件的能力,以及对方会如何回应。 API 的关键不是“联网”,而是接口契约:
3.1 HTTP
HTTP(Hypertext Transfer Protocol)是 Web 的应用层协议。它规定客户端和服务器如何组织、发送和解释一条条消息。 客户端不一定是浏览器,也可以是手机应用、命令行工具或另一台服务器。服务器也不一定是一台物理
3.2 后端框架做了哪些事?
假设我们只拿到操作系统提供的网络 socket。为了做一个可用的 Web API,至少需要自己处理: 这些工作并非每个项目的独特价值。后端框架把反复出现的基础设施问题整理成统一生命周期、扩展点和默认约定,让开发者聚焦业务规则。
3.4 身份认证与权限控制
登录成功只是建立身份上下文,授权仍要在每次受保护操作中判断。 授权策略不应只有 isAdmin 一个布尔值。真实规则可能与组织、租户、资源所有者、成员关系、数据敏感级别、时间和审批状态有关。
3.5 Cookie、Session、JWT 与 OAuth
Cookie 可以携带 Session ID,也可以携带其他偏好;Session ID 是 token,但不必是 JWT;JWT 可以放 Cookie,也可以放 Authorization 头;OAuth access token 也不
3.6 Web 安全基础
工程安全的目标是:在明确成本和场景下,降低攻击成功概率、限制影响范围、尽快发现问题并能够恢复。 安全措施也可能冲突:详细日志有助调查,却可能泄露隐私;更严格验证提高安全,却可能让账户恢复困难。需要明确取舍,而不是堆叠口号。
3.7 WebSocket、SSE 与实时通信
“实时”不是毫秒越小越好,而是业务能接受的最大延迟: 长连接会增加服务器连接数、状态、部署和恢复复杂度。如果每分钟更新一次,5~15 秒轮询可能比维护 WebSocket 更可靠、更便宜。
4.1 SQL 与关系模型
关系模型把数据表示为一组关系(relation)。在工程中,关系通常表现为表: enrollments 表表达“用户参加课程”这段关系。它让用户和课程可以各自独立存在,又能建立多对多联系。
4.3 索引为什么能加速查询
假设 orders 表有一亿行: 如果没有可用索引,数据库可能只能从头到尾检查数据页,这叫顺序扫描(sequential scan)或全表扫描。复杂度直觉接近 O(n):数据翻倍,需要检查的内容也大致翻倍。
4.4 事务、并发与隔离级别
如果第一步成功后服务崩溃,钱就凭空少了。事务让这两步组成一个整体: 若中途发现错误,可以 ROLLBACK。不过还要检查第一条更新实际影响了一行,否则余额不足时也可能继续给对方加钱。
4.5 Redis、缓存与数据一致性
Redis 把常用数据放在内存中,并通过网络提供一组针对数据结构的原子操作。它的价值不只是 key - value,还在于服务端理解值的结构: 例如排行榜不必每次把所有分数取回应用排序:
4.6 NoSQL 什么时候有价值
NoSQL 更接近“Not Only SQL”:它泛指不以传统关系模型作为唯一核心的数据系统。这个标签下面的产品差异极大: 因此,真正有意义的问题不是“SQL 还是 NoSQL”,而是:
5.0 测试的层次
软件几乎不可能通过有限测试证明“绝对没有错误”。测试真正提供的是证据: 测试也是一种可执行的行为说明。例如“库存为 0 时不能下单”比“下单函数应该正确”更具体,也更能指导实现。
5.2 日志、指标与链路追踪
服务器进程仍在运行,不代表用户可以完成支付;CPU 正常,也不代表查询结果正确。 监控(monitoring)通常针对已知问题收集数据并设置告警,例如“5xx 比例超过 2%”。
6.0 Docker 与容器化
容器不是一台缩小版实体电脑。它本质上仍是宿主机上的进程,只是操作系统给它提供了隔离视图和资源边界: Linux 容器共享宿主机内核,所以启动快、额外开销较小。共享内核也意味着它的隔离边界通常不同于完整虚拟机。
6.1 CI/CD 与可靠发布
软件事故常不是因为系统从未工作,而是因为一次变更破坏了原有行为。CI/CD 把构建、检查、发布和验证变成可重复流程,缩短从修改到反馈的距离。 开发者频繁把小变更合入共享主线,每次自动构建和测试,尽早发现冲突。
OpenCode 源码解析:常见概念
这篇不是词典,而是一张“源码阅读翻译表”:先弄清这些词在一般软件工程中的含义,再看它们在 OpenCode 里具体对应什么。 运行时是程序真正执行时所依赖的环境,负责调度代码、管理内存、提供文件和网络能力,并处理异步任务。