软件工程
文章平均质量分 86
软件工程
Yashar Qian
你好,我是Yashar Qian,一个写了十年代码的“老”程序员。
我的技术地图有点广:以 .NET 为根据地,也曾远征 Java、C++、Python 的江湖,并用 Vue、SQL 和 iOS 开发过不少应用。这些经历让我明白,技术之道,万变不离其宗。
而现在,我选择了一条“向下扎根”的道路——嵌入式开发。我着迷于代码如何直接驱动硬件,享受在资源受限的环境下创造价值的乐趣。这对我而言,是一个全新的起点。
在这里,我将以一个“资深新手”的视角,记录并分享从传统软件到嵌入式世界的转型之路。我的文章会力求通俗易懂,既有硬核的代码分析,也有踩坑填坑的实战记录。期待能与志同道合的你一起学习,共同成长!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
YAML 详解
YAML是一种易读的数据序列化语言,主要用于配置和数据交换。它采用缩进表示层次结构,支持标量、序列、映射等数据类型,具有多行文本、引用等高级特性。相比JSON和XML,YAML更简洁直观,广泛应用于Docker、Kubernetes、CI/CD等场景。使用时需注意缩进一致、避免复杂嵌套等最佳实践,同时警惕安全风险如代码执行漏洞。主流编程语言都提供YAML支持,并配有验证、转换等工具链。原创 2026-02-10 20:14:10 · 463 阅读 · 0 评论 -
OAuth是什么?
OAuth 2.0是一个开放的授权框架,允许第三方应用在无需获取用户密码的情况下,安全访问用户在服务提供商上的特定资源。它通过授权码、隐式、密码和客户端凭证四种模式实现不同场景下的授权,其中授权码模式最为安全常用。OAuth专注于授权而非认证,常与OpenID Connect结合实现单点登录功能。关键角色包括资源所有者、客户端、资源服务器和授权服务器,通过访问令牌和刷新令牌机制确保安全。最佳实践包括使用HTTPS、安全存储令牌、最小权限原则等,使其成为现代互联网授权的事实标准。原创 2026-02-08 22:46:38 · 813 阅读 · 0 评论 -
多租户(Multi-tenancy)在电商平台、ERP系统、钉钉(协同办公平台)上的运用
多租户架构在不同业务系统中的差异化应用:电商平台(淘宝/Shopify)通过shop_id实现商家数据隔离,共享核心服务;ERP系统采用元数据驱动设计支持企业业务流程定制,按需选择隔离级别;钉钉构建双重租户模型,既隔离企业数据又为ISV应用提供多租户运行环境。三种系统分别体现了多租户在数据隔离、流程定制和平台生态方面的灵活应用,核心都是平衡共享与隔离的需求。原创 2026-02-06 08:00:00 · 1531 阅读 · 0 评论 -
多租户(Multi-tenancy)是什么?
多租户是一种软件架构模式,允许单个系统实例同时服务多个独立客户(租户)。核心特征是资源共享(计算资源、应用程序等)与数据隔离(每个租户的数据和配置严格分隔)。相比单租户架构,多租户成本更低、运维更高效,但定制性较弱。常见于SaaS产品如Salesforce、Office 365等。数据隔离级别从共享数据库到独立实例不等,各有利弊。优势包括降低成本、统一升级,挑战在于安全设计、性能管理和定制限制。多租户是SaaS服务的基石,通过资源共享实现规模效益。原创 2026-02-05 21:04:39 · 635 阅读 · 0 评论 -
文件断点续传(Resumable Download/Upload)的实现原理解析
文件断点续传技术通过将大文件分块传输,记录传输进度,实现中断后继续传输未完成部分。核心原理包括文件分块、进度记录和校验机制,利用HTTP协议的Range头部支持字节范围请求。实现时需处理分块上传、进度存储、完整性校验等关键环节,并可通过并发上传优化传输效率。该技术广泛应用于云存储、版本控制和P2P下载等场景,显著提升大文件传输的可靠性和效率。原创 2025-12-26 08:00:00 · 1047 阅读 · 0 评论 -
雪花ID(Snowflake ID)是什么?
雪花ID是Twitter开源的分布式唯一ID生成算法,采用64位结构(1位符号+41位时间戳+10位机器ID+12位序列号),兼具全局唯一性和时间有序性,适合高并发分布式场景。其核心优势包括本地高效生成(每秒百万级)、对数据库索引友好,但需注意时钟回拨风险及机器ID动态管理问题。相比UUID的无序性和数据库自增ID的中心化依赖,雪花ID在电商、支付等需有序唯一标识的业务中表现更优,但需处理前端长整型精度限制。原创 2025-12-14 22:37:22 · 392 阅读 · 0 评论 -
GUID为什么不会重复?
GUID几乎不会重复,主要由于128位的庞大组合空间(约3.4×10³⁸种可能)和精心设计的生成算法。不同版本融合了时间戳、MAC地址、命名空间散列或高质量随机数等唯一性因素。现代系统使用密码学安全随机数生成器,使重复概率低至可忽略不计(约2.71×10¹⁸次生成才有50%碰撞几率)。工程实践中从未发现非故意的重复案例,其唯一性已成为分布式系统的基石。虽然数学上可能重复,但实际风险远低于硬件故障等极端事件。原创 2025-12-14 22:22:23 · 784 阅读 · 0 评论 -
软件工程中的Dump是什么?
摘要: Dump(转储)是软件工程中记录程序崩溃时内存状态的文件,类似于飞机的"黑匣子"。主要分为完整Dump(全部内存信息)、核心Dump(关键错误数据)和堆Dump(内存分析专用)。Dump在开发中用于调试难以复现的Bug,分析崩溃原因和死锁问题;在运维中用于诊断线上故障、保留现场和排查内存泄漏。典型工作流程包括自动生成Dump、收集分析、定位问题和修复代码。常用工具有ProcDump、Visual Studio(Windows)、GDB(Linux)和Eclipse MAT(Jav原创 2025-11-30 14:00:11 · 1197 阅读 · 0 评论 -
有限状态机 FSM(Finite State Machine)是什么?
有限状态机(FSM)是一种对系统行为建模的数学模型,包含有限的状态集合和状态间的转移规则。系统在任何时刻处于一个确定状态,通过事件触发状态转移。FSM分为摩尔机(输出仅依赖当前状态)和米利机(输出依赖状态和输入)。它广泛应用于编译器、硬件设计、游戏AI、网络协议等领域,因其逻辑清晰、易于实现和维护而成为系统设计的核心工具。典型例子如旋转门的状态变化(锁定→未锁定→推动中),通过投币、推动等事件触发转移。原创 2025-11-24 21:07:47 · 688 阅读 · 0 评论 -
【多线程】无锁数据结构(Lock-Free Data Structures)是什么?
无锁数据结构是一种通过原子操作(如CAS)实现线程安全访问的并发编程技术,避免了传统锁机制带来的阻塞、死锁和性能瓶颈问题。其核心思想是让线程通过重试机制而非互斥锁来协调共享数据的访问。虽然无锁结构能提供更高的并发性和可扩展性,但也面临实现复杂、可能出现ABA问题等挑战。这种技术适用于对性能要求极高的场景,如操作系统内核和高并发系统,但需要谨慎使用。原创 2025-10-04 16:01:18 · 1155 阅读 · 0 评论 -
数据库事务(Transaction)的概念及其底层实现原理
数据库事务是DBMS中保证数据操作可靠性的核心机制,具有ACID特性(原子性、一致性、隔离性、持久性)。其底层实现依赖日志系统(Redo Log确保持久性,Undo Log实现原子性)和并发控制技术(锁机制和MVCC)。Redo Log记录物理修改用于崩溃恢复,Undo Log保存数据旧版本支持回滚和MVCC。隔离性通过锁(悲观控制)和MVCC(乐观控制)实现,后者利用事务ID和Read View提供一致性读视图。这些机制协同工作,确保事务的可靠执行和数据一致性。原创 2025-09-28 22:24:58 · 1412 阅读 · 4 评论 -
【多线程】监视器(Monitor)是什么?
监视器(Monitor)是一种高级同步机制,将共享数据及操作方法封装为独立模块,通过内置互斥锁确保单线程访问,并利用条件变量实现线程间协作。其核心特性包括:1)自动互斥,任一时刻仅允许一个线程执行监视器内方法;2)提供wait()/notify()机制管理线程等待与唤醒。典型实现如Java的synchronized块,通过隐式锁管理简化并发编程,避免显式锁操作的复杂性。相比底层互斥锁+条件变量的组合,监视器通过语言级封装显著提升开发安全性与易用性,适用于生产者-消费者等经典同步问题。本质上是互斥与原创 2025-09-27 16:56:47 · 899 阅读 · 0 评论 -
【多线程】临界区(Critical Section)是什么?
临界区(Critical Section)是多线程编程中访问共享资源的代码段,必须确保同一时间仅有一个线程执行,以防止数据竞争和错误。通过互斥锁等同步机制保护临界区,可避免多个线程同时操作共享资源导致的不一致问题。临界区应尽可能短小,并使用RAII技术自动管理锁,以提高程序安全性和性能。理解临界区是多线程编程确保数据一致性的关键。原创 2025-09-26 09:30:00 · 1484 阅读 · 0 评论 -
【多线程】条件变量(Condition Variable)是什么?
条件变量是解决线程同步中"忙等待"问题的核心工具,通过与互斥锁配合使用,允许线程在条件不满足时主动阻塞并释放锁,待条件满足时被其他线程唤醒。文章通过外卖等待的生动比喻解释了其工作原理,并详细介绍了等待(wait)、通知(signal)和广播(broadcast)三个核心操作。重点强调了必须使用while循环检查条件以防止虚假唤醒,并提供了生产者-消费者模型的代码示例。条件变量能有效消除忙等待,实现线程间高效协作,是解决生产者-消费者等经典同步问题的基础。原创 2025-09-26 09:00:00 · 852 阅读 · 0 评论 -
【多线程】计算机领域中的各种锁
本文系统梳理了计算机领域常见的锁类型,从实现层面、设计思想、状态策略等维度进行分类比较。表格详细列举了互斥锁、读写锁、自旋锁等12种锁的核心特征和典型应用,特别分析了Java中synchronized的锁升级优化机制。文章建议根据具体场景选择锁类型:高并发读场景适合读写锁,短临界区可用自旋锁,线程协作推荐条件变量,并指出JVM会智能进行锁升级和锁粗化来优化性能。原创 2025-09-25 21:20:53 · 715 阅读 · 0 评论 -
【多线程】互斥锁(Mutex)是什么?
互斥锁(Mutex)是多线程编程中的关键同步工具,用于实现线程间的互斥访问。它通过加锁(Lock)和解锁(Unlock)操作保护临界区,确保同一时间只有一个线程能访问共享资源,防止数据竞争。互斥锁具有所有权特性,必须由加锁线程解锁,与信号量不同。典型应用场景如银行账户操作,多个线程同时取款时,互斥锁能保证余额计算的正确性。互斥锁简单直观,是构建线程安全程序的基础机制。原创 2025-09-24 22:38:55 · 1107 阅读 · 0 评论 -
应用程序映像(Application Image)是什么?
应用程序映像是包含应用及其所有依赖的单个文件,类似于标准化集装箱。它确保跨环境一致性,提供隔离性、便携性和高效性(秒级启动),常见于Docker等容器技术。相比虚拟机,容器仅虚拟化操作系统部分,体积更小、性能更高。应用程序映像是现代云计算和微服务的关键技术,通过标准化打包简化了开发部署流程。原创 2025-09-24 22:32:19 · 841 阅读 · 0 评论 -
【多线程】信号量(Semaphore)常见的应用场景
信号量是一种重要的同步机制,主要用于多线程环境下的资源访问控制。其核心应用场景包括:1)互斥访问,通过二进制信号量保护临界区;2)线程同步,协调执行顺序,如生产者-消费者模型;3)资源池管理,控制有限资源的分配;4)并发限制,防止系统过载。信号量分为二进制和计数两种类型,初始值根据场景设置。现代编程中互斥锁更适合简单互斥场景,而信号量在复杂同步和并发控制方面具有独特优势。原创 2025-09-23 20:18:22 · 837 阅读 · 0 评论 -
【多线程】信号量(Semaphore)是什么?
信号量是一种用于控制多线程/多进程访问共享资源的同步机制,通过计数器协调资源访问。核心包括P操作(申请资源时计数器减1,若为0则阻塞)和V操作(释放资源时计数器加1并唤醒等待线程)。分为二进制信号量(类似互斥锁,值0或1)和计数信号量(管理多个资源)。与互斥锁不同,信号量无所有者概念,任何线程都可释放资源。它既能实现互斥访问,也能用于资源计数和线程同步,是解决生产者-消费者等并发问题的有效工具。原创 2025-09-23 10:52:45 · 911 阅读 · 0 评论 -
webhook(Web 钩子)是什么?
Webhook(Web钩子)是一种基于事件的反向API机制,采用"订阅-通知"模式实现高效跨应用通信。与传统API需要主动轮询不同,Webhook由服务方在事件触发时主动向预设URL推送数据,具有实时性强、资源消耗低的优势。其典型应用包括GitHub代码提交通知、支付状态更新等场景。开发Webhook接收端需注意快速响应、来源验证、幂等处理等关键点。这种"事件驱动"的通信方式已成为现代网络开发中服务集成的核心解决方案。原创 2025-09-07 16:05:10 · 1451 阅读 · 0 评论 -
“企业版维基百科”Confluence
Confluence是Atlassian开发的企业级团队协作与知识管理平台,相当于"企业版维基百科"。它通过创建页面、组织空间、提供模板等功能,帮助团队集中管理文档、项目需求和知识资产。核心优势包括强大的协作功能(评论、@提及)、版本控制、精细权限管理,以及与Jira等工具的深度集成。主要服务于研发、产品、HR等部门,提供云版和自托管部署方案,是企业实现知识沉淀、打破信息孤岛的高效工具。原创 2025-09-03 22:31:51 · 587 阅读 · 0 评论 -
一个api什么时候该被定义成Get,什么时候该被定义成Post?
GET和POST是HTTP核心方法,分别用于获取数据和创建/提交数据。GET具有幂等性、数据通过URL传递,适合查询、分页等读操作;POST非幂等、数据通过请求体传输,适合创建资源、提交表单等写操作。选择依据是语义和安全性:读操作用GET(可缓存、安全),写操作用POST(容量大、更安全)。遵循RESTful原则,避免用GET执行写操作(如删除),确保API直观且高效。原创 2025-08-29 17:30:00 · 719 阅读 · 0 评论 -
.Net Core Web 架构(管道机制)的底层实现
.NET Core Web程序的底层实现基于一个请求处理管道架构。HTTP请求首先由Kestrel服务器接收并转换为HttpContext对象,然后流经中间件管道(包括路由、认证等处理)。路由匹配后执行对应的终结点(如MVC控制器动作),结果通过管道返回为HTTP响应。整个流程由Program.cs配置,依赖通用主机管理服务注入、配置和生命周期。这种中间件管道设计提供了高度灵活性和性能,是ASP.NET Core的核心特征。原创 2025-08-28 18:30:00 · 935 阅读 · 0 评论 -
淘宝pc端首页做了哪些性能优化?
淘宝PC端首页性能优化体系全面深入,涵盖静态资源、渲染、协议网络及数据接口等多层面。核心策略是优先展示内容再完整加载,通过服务端渲染(SSR)提升首屏速度,采用强缓存/CDN加速资源加载,运用懒加载/预加载优化资源调度,并借助HTTP/2/QUIC协议提升网络效率。该体系从加载时机、渲染方式、连接效率到个性化适配持续演进,确保海量内容下仍保持极致用户体验,成为中国电商性能优化的标杆实践。原创 2025-08-24 12:42:57 · 1150 阅读 · 0 评论 -
Doxygen是什么?
Doxygen是一款开源跨平台的文档生成工具,能够从代码注释直接生成结构化文档。它通过解析特殊格式的注释(如/**...*/)和代码结构,自动生成HTML、PDF等格式的文档,支持类继承图、函数调用关系等可视化图表。支持多种编程语言,可与主流IDE集成,适合开发团队和个人维护标准化API文档。Doxygen极大提升了代码文档的质量和可维护性,是软件开发中的文档自动化利器。原创 2025-08-23 22:27:47 · 638 阅读 · 0 评论 -
在 .NET Core 5.0 中启用 Gzip 压缩 Response
摘要:本文介绍了在.NET Core 5.0中启用Gzip压缩的方法。通过安装Microsoft.AspNetCore.ResponseCompression包,在Startup.cs中配置响应压缩服务,可设置压缩级别、MIME类型等参数。中间件需放在管道较前位置。还提供了验证方法、排除特定路径配置及自定义压缩提供程序等高级功能。注意不要压缩已压缩内容,HTTPS需显式启用,并考虑CPU消耗和客户端支持情况。Gzip压缩能有效减少响应大小,提升网络传输效率。原创 2025-08-11 14:42:32 · 499 阅读 · 0 评论 -
解决 .NET Core 6.0 + PostgreSQL 网站首次连接缓慢问题
摘要:本文针对.NET Core 6.0+PostgreSQL网站首次连接缓慢问题,提出6种解决方案:1)配置Npgsql连接池保持活动;2)应用启动时预热连接;3)后台服务定期执行查询保持连接活跃;4)优化PostgreSQL服务器配置;5)前端添加加载状态处理;6)优化连接字符串参数。这些方法可单独或组合使用,有效解决因连接池过期导致的首次连接延迟问题。原创 2025-08-10 13:15:47 · 364 阅读 · 0 评论 -
如何解决网站长期不连接数据库后首次连接缓慢的问题?
网站长时间不连接数据库后首次连接缓慢,通常由连接池超时或数据库初始化机制导致。解决方案包括:优化连接池配置(保持最小连接数、定期验证)、调整数据库服务器参数(如MySQL的wait_timeout)、应用层预热和定时心跳机制、使用连接中间件等。组合使用连接池优化和定时心跳是常见有效的方法,同时应监控连接性能以持续调优。具体方案需根据技术栈和架构选择。原创 2025-08-10 13:03:25 · 378 阅读 · 0 评论 -
一个网页的加载过程详解
网页加载过程从用户输入URL开始,经过DNS解析获取IP地址,通过TCP三次握手建立连接。HTTPS还需TLS握手加密通信。浏览器发送HTTP请求,服务器处理并返回响应数据。浏览器解析HTML构建DOM树,解析CSS生成CSSOM树,合并为渲染树后进行布局和绘制,同时执行JavaScript。最后加载图片等子资源,触发DOMContentLoaded和load事件完成页面渲染。优化手段包括减少DNS查询、合并资源、使用CDN和缓存策略等。整个流程涉及网络通信、资源解析和渲染等多个环节的协同工作。原创 2025-08-03 19:00:00 · 955 阅读 · 0 评论
分享