第一章:软件设计架构
1.1 概述
C/S 架构(Client/Server,客户端/服务器)描述的是一种分布式软件结构:客户端向服务器发起请求,服务器集中提供数据或服务,双方通过网络进行通信。
重要
- ① 日常讨论中,通常把“使用浏览器的 B/S 架构”和“需要安装专用客户端的狭义 C/S 架构”放在一起比较。
- ② 二者的核心区别是 客户端的形态和部署方式,而不是是否存在客户端或服务器。
B/S 架构(Browser/Server,浏览器/服务器)并不是与 C/S 完全并列的另一套原理,而是 C/S 架构的一种常见实现形式:它使用通用浏览器充当客户端。
重要
- ① 日常讨论中,通常把“使用浏览器的 B/S 架构”和“需要安装专用客户端的狭义 C/S 架构”放在一起比较。
- ② 二者的核心区别是 客户端的形态和部署方式,而不是是否存在客户端或服务器。
1.2 B/S 架构
- B/S 架构使用 Chrome、Edge 等通用浏览器作为客户端。用户通常无需为每个系统安装专用客户端,只需通过 URL 即可访问应用。

- 浏览器与 Web 服务器一般通过 HTTP/HTTPS 通信。浏览器负责页面展示、用户交互以及一部分业务逻辑;服务器负责身份认证、核心业务处理、数据访问等。复杂系统的服务器端还可能包含网关、应用服务器、缓存和数据库等多个组件。
txt
用户操作 → 浏览器 → HTTP/HTTPS 请求 → Web/应用服务器 → 数据库等资源
用户界面 ← 浏览器 ← HTTP/HTTPS 响应 ← Web/应用服务器 ← 处理结果1
2
2
- 典型应用:电商网站、在线办公系统、搜索引擎、企业管理系统等。
1.3 C/S 架构
- 狭义的 C/S 架构使用为特定业务开发的专用客户端。客户端负责用户界面,还可以承担数据校验、本地计算、缓存或部分业务逻辑;服务器负责共享数据、核心规则、权限控制等服务。
点我查看 具体细节
- ① 并非所有桌面软件或手机 App 都属于 C/S 架构。
- ② 只有当软件中的客户端需要与服务器协作时,才能称为 C/S 架构;完全在本地运行的单机软件没有 Server,不属于 C/S 架构。

- 专用客户端可以通过 HTTP/HTTPS、WebSocket、TCP 等协议与服务器通信,具体协议由业务需求决定。
txt
用户操作 → 专用客户端 → 网络请求 → 应用服务器 → 数据库等资源
用户界面 ← 专用客户端 ← 网络响应 ← 应用服务器 ← 处理结果1
2
2
- 典型应用:即时通信客户端、网络游戏客户端、数据库管理工具以及需要访问摄像头、GPU 等本地硬件的应用。
1.4 B/S 架构 VS C/S 架构
- 这里的 C/S 指需要安装专用客户端的狭义 C/S,二者的典型差异,如下所示:
点我查看 具体细节
- ① 下表描述的是典型情况,而不是绝对规律。
- ② 现代浏览器已经具备较强的计算和硬件访问能力,专用客户端也可能只是网页的封装;应用的实际性能与安全性仍取决于具体实现。
| 对比维度 | B/S 架构 | 狭义 C/S 架构 |
|---|---|---|
| 客户端 | 通用浏览器 | 专用客户端 |
| 使用方式 | 通常打开 URL 即可使用 | 通常需要下载、安装和登录 |
| 更新部署 | 前端资源部署到服务器后,用户刷新页面即可获得新版本 | 需要发布客户端新版本,并处理升级与版本兼容问题 |
| 跨平台 | 浏览器屏蔽了较多平台差异,但仍需处理浏览器兼容性 | 通常需要为 Windows、macOS、Android、iOS 等平台分别适配 |
| 本地能力 | 运行在浏览器沙箱中,访问文件、硬件和系统 API 时限制较多 | 可以更充分地访问操作系统 API、本地文件和硬件设备 |
| 性能体验 | 足以满足大多数信息系统,也可利用 WebAssembly、缓存等技术优化 | 更适合重度图形计算、低延迟交互和深度硬件集成,但并不天然更快 |
| 离线能力 | 通常依赖网络;使用 PWA、本地缓存等技术也可支持部分离线功能 | 可将资源和数据保存在本地,更容易提供完整的离线功能 |
| 开发维护 | 一套 Web 前端通常可覆盖多个平台,集中发布较方便 | 多平台客户端的开发、测试、发布和维护成本通常更高 |
| 安全边界 | 浏览器沙箱能限制网页权限,但仍需防范 XSS、CSRF 等 Web 安全问题 | 能力与权限更大,需要防范客户端篡改、逆向分析及本地数据泄露等问题 |
1.5 如何选择 B/S 架构和 C/S 架构?
- 架构选择的建议,如下所示:
点我查看 具体细节
- ① B/S 与 C/S 没有绝对的优劣。
- ② 选型时应综合考虑用户规模、使用场景、本地能力、性能要求、网络条件、发布频率、安全要求以及开发维护成本。
| 架构方案 | 适用场景 | 主要特点 |
|---|---|---|
| B/S 架构 | 面向大量或不固定的用户;业务以信息展示、表单处理和数据管理为主 | 通过链接快速访问,客户端免安装,适合频繁发布更新 |
| 狭义 C/S 架构 | 需要复杂图形处理、极低延迟、强离线能力,或者需要深度访问本地文件、操作系统及硬件设备 | 使用专用客户端,本地能力更强,但需要安装、升级和多平台适配 |
| 混合架构 | 同一系统需要同时覆盖网页端、桌面端和移动端 | 多种客户端复用同一套服务端接口,例如聊天软件同时提供网页版、桌面版和手机版 |
第二章:软件行业中的各种职业方向
2.1 概述
- 软件行业岗位可以大致分为
技术类岗位和非技术类岗位,如下所示“:
| 岗位类别 | 职责 |
|---|---|
| 技术类 | 技术类岗位直接参与软件的设计、开发、测试和运行。 |
| 非技术类 | 非技术类岗位主要负责产品规划、运营、销售及客户支持。 |
- 岗位名称并没有统一标准。同一岗位在不同公司中的职责可能不同,一个人也可能同时承担多个方向的工作。
点我查看 具体细节
- ① 编程语言和岗位并不是一一对应的,例如:C++ 既可用于客户端、服务端、游戏引擎和数据库研发,也可用于嵌入式开发。
- ② 岗位名称描述的是工作职责,编程语言只是完成工作的工具。
| 岗位类别 | 主要方向 |
|---|---|
| 技术类 | 客户端开发、服务端开发、测试、算法、运维、大数据与人工智能、游戏、数据库、嵌入式、安全。 |
| 非技术类 | 产品经理、产品运营、产品销售、技术支持。 |
2.2 技术类岗位
2.2.1 客户端开发
- 客户端开发负责用户直接操作的软件,包括界面展示、交互逻辑、本地数据和设备能力调用等。
点我查看 具体细节
- ① 从软件架构的角度看,Web 前端是 B/S 架构中的浏览器客户端。
- ② 桌面、移动和游戏客户端则通常是狭义 C/S 架构中的专用客户端。
| 方向 | 常见岗位 | 常用技术 |
|---|---|---|
| 桌面客户端 | Windows C++ 客户端开发工程师、Windows C# 客户端开发工程师 | C++、Qt、C#、.NET、WinUI |
| Web 客户端 | Web 前端工程师 | HTML、CSS、JavaScript/TypeScript、Vue、React |
| 移动客户端 | Android 开发工程师、iOS 开发工程师 | Kotlin、Java、Swift |
| 小程序 | 微信小程序工程师 | JavaScript/TypeScript、小程序框架 |
2.2.2 服务端开发
- 服务端开发也称为后端开发,负责处理客户端请求,实现业务规则、身份认证、数据访问、第三方服务集成以及系统之间的通信。
点我查看 具体细节
- ① 服务端岗位不应只按编程语言理解。
- ② 开发者还需要掌握网络、数据库、缓存、消息队列、并发处理、操作系统以及分布式系统等知识。
- 常见岗位包括 C++ 后台开发工程师、Java 后台开发工程师、Python 开发工程师、PHP 开发工程师等。实际工作还常使用 Go、C#、JavaScript/TypeScript 等语言。
2.2.3 测试
- 测试岗位负责验证软件是否符合需求,并通过测试尽早发现功能、性能、安全性和兼容性问题。
| 常见岗位 | 主要工作 |
|---|---|
| 测试工程师 | 设计测试方案和测试用例,执行功能、兼容性、性能等测试 |
| 测试开发工程师 | 开发自动化测试框架、测试平台和质量工具,提高测试效率 |
2.2.4 算法
- 算法岗位利用数学模型和计算方法解决搜索、推荐、排序、规划、优化等问题,常见岗位包括算法工程师和数据挖掘工程师。
- 该方向通常需要数据结构与算法、概率统计、线性代数和机器学习等基础,常用 Python、C++ 等语言。
2.2.5 运维与系统
- 运维岗位保障软件系统稳定、安全、高效地运行,负责部署、监控、故障处理、容量规划和自动化运维。
| 常见岗位 | 主要工作 |
|---|---|
| 运维工程师 | 系统部署、监控告警、故障响应、备份恢复 |
| 运维开发工程师 / SRE | 开发自动化平台和工程工具,通过软件手段提高可靠性 |
| 系统开发工程师 | 开发操作系统、基础设施、中间件、编译器或其他系统软件 |
2.2.6 大数据与人工智能
- 大数据方向关注海量数据的采集、存储、计算和分析;人工智能方向利用数据训练模型,使系统具备识别、预测、生成或决策能力。
| 常见岗位 | 主要工作 |
|---|---|
| 大数据开发工程师 | 建设数据采集、批处理、流处理和数据仓库系统 |
| 数据挖掘工程师 | 从数据中发现规律,完成用户画像、推荐和预测等任务 |
| 人工智能算法工程师 | 训练、评估、优化并部署机器学习或深度学习模型 |
| 自然语言处理工程师 | 处理文本、语音和大语言模型等自然语言任务 |
| 语音 / 图像识别工程师 | 处理语音识别、计算机视觉和多模态任务 |
| 智能驾驶系统工程师 | 开发感知、定位、规划、控制及相关工程系统 |
2.2.7 游戏开发
- 游戏开发涉及客户端表现、服务器逻辑、游戏引擎以及美术资源工具链等多个方向。
| 常见岗位 | 主要工作与常用技术 |
|---|---|
| C++ 游戏客户端开发工程师 | 开发游戏客户端逻辑、界面、网络和性能模块 |
| Unity 3D 研发工程师 | 使用 Unity 和 C# 开发游戏玩法与跨平台客户端 |
| C++ 游戏引擎研发工程师 | 开发渲染、物理、动画、资源和编辑器等底层能力 |
| C++ 游戏服务器研发工程师 | 开发房间、战斗、匹配、状态同步等服务器系统 |
2.2.8 数据库
- 数据库方向负责数据存储系统的研发或管理。
| 常见岗位 | 主要工作 |
|---|---|
| 数据库研发工程师 | 研发数据库内核、查询引擎、存储引擎、复制和分布式能力 |
| DBA(数据库管理员) | 负责数据库部署、权限、监控、调优、备份和容灾 |
2.2.9 嵌入式
- 嵌入式开发面向集成在设备内部的专用计算机系统,常见岗位包括嵌入式 C 开发工程师和驱动开发工程师。
- 常用技术包括 C/C++、单片机、ARM、RTOS、嵌入式 Linux、设备驱动和 UART、I2C、SPI、CAN 等通信协议。
- 典型应用包括消费电子、汽车电子、工业控制、医疗设备、网络设备、航空航天和智能家居。
2.2.10 安全
- 安全岗位负责发现、预防和处置软件、系统及网络中的安全风险。图片中的网络安全工程师只是安全岗位的一种。
- 常见方向包括网络安全、Web 安全、移动安全、安全开发、渗透测试、漏洞研究、应急响应和数据安全。
2.3 非技术类岗位
- “非技术类”表示岗位的核心职责不是研发软件,并不代表完全不需要技术知识,如下所示:
点我查看 具体细节
企业软件的产品经理、售前工程师和技术支持通常仍需理解产品架构、业务流程和基础技术概念。
| 常见岗位 | 主要工作 |
|---|---|
| 产品经理 | 调研用户需求,定义产品目标、功能和优先级,协调研发、设计和业务团队 |
| 产品运营 | 通过内容、活动和用户运营促进产品使用、留存和增长 |
| 产品销售 | 了解客户需求,介绍解决方案,推进售前沟通、商务合作和签约 |
| 技术支持 | 帮助客户部署和使用产品,排查问题,并将客户反馈传递给研发团队 |
2.4 岗位之间如何协作?
- 技术岗和非技术岗之间如何协作,如下所示:
点我查看 具体细节

- 数据库、安全、系统开发等岗位会贯穿多个环节,为业务研发提供基础能力和保障。
- 大型公司通常分工较细;小型团队则可能由同一个人承担全栈开发、测试、部署等多项职责。
第三章:学习建议
3.1 明确学习目标
- 学习编程语言的直接目标,是能够阅读、编写、调试和维护程序;更长远的目标,是掌握解决问题的方法,并理解程序如何在计算机中运行。
- 不同目标需要不同的学习深度,如:入门阶段应先掌握核心语法和基本工具;准备考试时应覆盖考试大纲;面向工作时则应结合目标岗位补充工程实践和相关基础知识。
点我查看 具体细节
- ① 编程语言是解决问题的工具,但熟练使用工具仍然需要系统学习和反复练习。
- ② 不要只背语法,也不要在缺少实践时一味追究底层细节。
| 学习目标 | 学习重点 |
|---|---|
| 编程入门 | 基本语法、程序结构、输入输出、调试方法 |
| 课程或考试 | 课程大纲、典型题型、概念辨析、阶段复习 |
| 项目开发 | 需求分析、模块设计、版本控制、测试和文档 |
| 求职准备 | 目标岗位要求、计算机基础、项目经验和面试表达 |
3.2 建立学习闭环
- 编程同时包含知识和技能:阅读可以帮助理解概念,动手编写和调试代码才能形成实际能力。
- 一个完整的学习过程可以概括为:
点我查看 具体细节
学习概念 → 阅读示例 → 独立编写 → 编译运行 → 定位错误 → 修改总结 → 间隔复习
| 阶段 | 建议做法 |
|---|---|
| 学习概念 | 先理解它解决什么问题,再记忆语法和规则 |
| 阅读示例 | 逐行解释代码,并尝试预测程序的运行结果 |
| 独立编写 | 合上资料重新实现,避免只复制示例代码 |
| 编译运行 | 开启编译警告,使用不同输入验证程序行为 |
| 定位错误 | 阅读错误信息,通过日志或调试器缩小问题范围 |
| 修改总结 | 记录错误原因、修复方法以及可以复用的经验 |
| 间隔复习 | 隔一段时间重新实现关键示例,及时补足遗忘内容 |
- 暂时无法完全理解某个知识点时,可以记录问题并继续学习相关内容。后续知识常常会提供新的理解角度,但应在阶段复习时重新检查,而不是永久跳过。
3.3 学会检索和排查问题
- 遇到问题时,先确认预期结果、实际结果、运行环境以及可以稳定复现问题的最小步骤。
- 搜索时优先使用准确的错误信息、工具名称和版本号作为关键词。英文资料通常更多,但高质量中文资料同样可以使用,关键是判断来源是否可靠。
| 资料来源 | 适合解决的问题 | 使用建议 |
|---|---|---|
| 官方文档与语言标准 | API、语法规则、版本差异 | 作为事实依据,优先查阅 |
| 经典教材与课程 | 建立完整知识体系 | 选择与当前水平和目标匹配的资料 |
| 技术社区与博客 | 具体错误、实践经验 | 注意发布日期、版本和适用条件,并交叉验证 |
| 项目源码与测试 | 理解真实实现和边界行为 | 结合文档阅读,不要只看孤立代码片段 |
- 排查程序问题时,可以按照以下顺序进行:
txt
复现问题 → 阅读完整报错 → 缩小代码范围 → 检查输入和边界 → 使用调试工具 → 验证修复1
3.4 正确使用 AI 工具
- AI 可以用于解释概念、补充示例、分析报错、生成测试思路和比较不同方案,但生成结果可能包含事实错误、过时代码或不安全的实现。
点我查看 具体细节
- ① AI 可以辅助思考,但不能替代编译器、运行结果、测试以及权威资料。
- ② 涉及安全、隐私和重要决策时,应进行额外审查。
| 推荐做法 | 应避免的做法 |
|---|---|
| 提供语言版本、运行环境、完整报错和最小示例 | 只说“代码不能运行”,缺少必要上下文 |
| 要求解释原因、适用条件和方案差异 | 不理解代码就直接复制到项目中 |
| 使用编译器、测试和官方文档验证答案 | 把 AI 的表述直接当作权威结论 |
| 保留自己的分析过程和调试记录 | 将密码、密钥、隐私数据或未公开代码随意提交 |
3.5 通过项目和算法练习提升能力
- 语法练习用于熟悉语言,算法练习用于训练数据组织和问题分解,项目练习则用于培养需求分析、模块设计、调试和维护能力,三者不能互相替代。
点我查看 具体细节
初学者可以从小而完整的程序开始,例如:计算器、通讯录、文本统计工具或简单的命令行游戏,再逐步增加文件存储、错误处理、测试和模块拆分。
| 练习类型 | 主要作用 | 注意事项 |
|---|---|---|
| 语法练习 | 熟悉变量、分支、循环、函数等基本结构 | 理解运行过程,不要只记答案 |
| 数据结构与算法 | 训练抽象、复杂度分析和问题求解能力 | 先掌握基础结构,再根据目标决定练习深度 |
| 完整项目 | 练习设计、协作、测试、构建和维护 | 控制项目规模,优先完成可运行版本 |
| 阅读源码 | 学习真实项目的组织方式和工程习惯 | 从小型模块入手,结合调试和修改理解代码 |
3.6 保持有效的学习习惯
- 制定规模合理、可以检查的阶段目标。
提醒
“本周独立完成三个指针练习”,而不是“尽快学会 C 语言”。
- 保持专注学习和充分休息。
提醒
长时间低效率投入通常不如短时间、高质量的练习。
- 使用笔记记录经过验证的知识、错误案例和自己的理解。
提醒
定期整理,而不是无限收集资料。
- 主动向老师、同学或社区提问。
提醒
提问时说明目标、环境、尝试过的方法和实际结果,也要独立验证得到的建议。
- 遗忘是正常现象。
提醒
通过间隔复习、重复实现和实际使用巩固知识,比追求“一次全部记住”更有效。