news 2026/9/24 19:46:28

软件工程师量子开发入门:从量子比特到混合编程实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
软件工程师量子开发入门:从量子比特到混合编程实战

这两年聊量子开发的人明显多了,但大部分软件工程师的第一反应是:“这玩意儿是不是又一轮概念炒作?跟我有什么关系?”我一开始也是这么想的,直到自己在量子云平台上跑通第一个带测量的量子电路,才意识到事情没那么玄乎。量子开发并不是让每个程序员立刻去造量子计算机,而是先掌握一套新的编程思维:从比特到量子比特、从逻辑门到量子门、从确定性程序到概率性采样。这套思维和现有工程体系并不冲突,反而能补齐一块非常关键的短板。

这篇文章想聊的就是软件工程师进入量子开发最快的那条路径。我把它拆成三个入门技能:量子比特与量子电路设计、量子编程框架的工程化使用、量子与经典混合编程思维。这三个技能都不要求你先成为物理学家,线性代数和 Python 用得熟就够了,甚至很多做嵌入式软件工程师的朋友也可以直接平移过来。无论你只是想了解量子计算到底在干嘛,还是想试试把量子算法跑在云平台上,这篇文章提供的步骤和代码,你照着抄就能跑通。

1. 量子开发到底是什么:先把它从“玄学”拉回“工程”

1.1 量子计算解决什么问题

量子计算最常被提起的价值,集中在几个方向上:组合优化、量子化学模拟、大规模无序搜索、以及特定数论问题的加速。举例来说,传统计算机模拟一个分子或材料的基态能量,需要处理的电子波函数自由度会随体系增大呈指数膨胀,经典算力很难撑;而量子比特天然就处在叠加态中,理论上可以用多项式规模的量子资源去编码这种指数级的信息结构。另一个典型场景是组合优化,比如物流路径规划、金融组合配置、芯片布线,这类问题本质上是搜索离散解空间中的最优解,传统算法在规模变大后就会崩,而量子近似优化类算法提供了另一种思路。

不过,现在距离“量子计算机全面取代经典计算机”还差得很远。当前主流叫法是 NISQ(含噪声中等规模量子)时代,芯片上的量子比特数量达到几十到几百个,但依然存在较明显的噪声和退相干问题。所以这类硬件做不了特别深的电路。软件工程师真正能发挥作用的,恰恰是在这个阶段:把量子计算的能力嵌到现有经典系统里,做成一套可运行的工程方案,而不是等量子硬件完全成熟再动手。

1.2 软件工程师为什么现在要关注

原因很简单:门槛已经降到“会写 Python 就能上手”的级别。IBM、Google、Amazon 等厂商都提供了量子云服务,你在本地装一个开源框架,写的量子电路可以直接发到云端的真机或高质量模拟器上执行。不需要自己维护量子硬件,不需要理解复杂的物理机制,框架会帮你完成底层的脉冲调度、噪声模型、误差纠正的大部分工作。这个状态,和早年我们写代码还要自己管寄存器分配完全不一样。

这种趋势会直接影响岗位需求。量子计算相关岗位并不只是招物理博士,很多团队在招量子应用工程师、量子算法工程师、量子软件工程师,绝大多数 JD 里都要求熟悉至少一种量子框架,并具备扎实的经典编程能力。更值得说的是,量子控制系统本身也是一个大工程,里面涉及 FPGA、实时控制、信号采集、嵌入式软件、分布式系统,这些恰恰是传统软件工程师和嵌入式软件工程师擅长的事。换句话说,懂嵌入式又懂一点量子电路的复合背景,在面试里会显得非常稀缺。

2. 入门技能一:量子比特模型与量子电路设计

2.1 三个核心概念:叠加、纠缠、测量

量子开发和经典开发最大的差异,在于数据的表示方式。经典比特只有 0 和 1 两个确定状态,而量子比特(qubit)可以处在 0 和 1 的叠加态。用数学语言说,量子比特的状态是二维复向量空间里的一个单位向量:|ψ> = α|0> + β|1>,其中 α 和 β 是复数,并且满足 |α|² + |β|² = 1。

可以这样理解:经典比特像一个开关,不是开就是关;量子比特则像一个旋转中的硬币,在它落地之前,你无法说它大概率是正面还是反面,而旋转状态本身是真实存在的一种物理状态。|α|² 和 |β|² 分别代表测量后得到 0 和 1 的概率,但你只能测出其中一个结果,测量行为会让叠加态坍缩。这一点和经典程序完全不同,写代码时不能默认变量同时具有所有可能值,而要意识到“输出的结果带随机性”。

第二个重要概念是纠缠。两个量子比特之间可以形成一种非经典的关联,测量其中一个比特会瞬间影响另一个比特的统计结果,哪怕它们在物理上相距很远。纠缠不是简单的“有关联”,而是关联强度超出了经典概率模型能够解释的范围。量子纠缠是很多量子算法实现指数加速的核心资源之一。作为初学者,你不一定需要深挖物理机制,但一定要习惯在电路里看到 CNOT 这类纠缠门时,能理解它对最终概率分布的影响。

第三个概念是测量。量子计算过程结束后,你需要把量子态转化为经典比特,这一步就叫测量。测量把叠加态投影到计算基矢态上,得到的是一串 0/1 的采样结果。同一个量子电路重复执行很多次,每次可能得到不同的结果,所以量子程序的输出通常不是一个确定值,而是一个概率分布。这个特性会在你第一次跑代码时带来强烈的“违和感”,但它是理解后续所有算法的基础。

2.2 量子门就是量子版的“位运算”

经典计算机用与门、或门、非门组合出复杂逻辑,量子计算机也有对应的基础操作,叫量子门。量子门作用在量子比特上,本质上是线性变换,所以用矩阵来表示。单比特量子门可以看成作用在二维复向量上的矩阵,最常见的几个如下:

  • X 门(类似经典非门):把 |0> 变成 |1>,把 |1> 变成 |0>。
  • H 门(Hadamard门):把 |0> 变成叠加态 (|0> + |1>)/√2。它不改变信息量,而是把确定状态铺开到叠加状态。
  • Z 门:把 |1> 的相位反转,对概率没有影响,但会影响后续干涉结果。
  • CNOT 门(受控非门):经典 XOR 的量子版本,有两个输入,控制比特为 1 时翻转目标比特。

量子门的操作方式和经典逻辑门最大的不同在于,量子门必须是可逆的,而且对量子态的影响是“线性+概率幅”层面的,不直接体现在 0/1 结果上。你写代码时,H 门之后跟着一个 CNOT,就能做出一个纠缠态:最终测量结果是 00 和 11 各一半,永远不会出现 01 或 10。这个结果用经典逻辑很难直观推导,但电路图看起来非常简洁。

2.3 实操:5分钟用 Qiskit 跑通一个 Bell 态电路

我建议新手用 Qiskit 跑第一个实验,因为它的资料最多,社区活跃度高,问题也最好查。安装时直接用 pip 拉一套基础环境即可。

pip install qiskit qiskit-aer

然后写一个最简单的两比特电路:第一个比特过 H 门,再对两个比特做 CNOT,最后测量。这个电路会生成 Bell 态,也就是 (|00> + |11>)/√2。

from qiskit import QuantumCircuit, transpile from qiskit_aer import AerSimulator # 创建包含2个量子比特、2个经典比特的电路 qc = QuantumCircuit(2, 2) # 第一个量子比特施加H门,创造叠加态 qc.h(0) # CNOT门:第一个比特作为控制位,第二个比特作为目标位 qc.cx(0, 1) # 测量 qc.measure([0, 1], [0, 1]) # 用模拟器执行1024次采样 simulator = AerSimulator() circ = transpile(qc, simulator) result = simulator.run(circ, shots=1024).result() counts = result.get_counts() print(counts)

第一次跑通这个代码你可能会愣一下:为什么结果只有 00 和 11?原因就在 CNOT 门:当第一比特处于叠加态时,CNOT 会把第二比特“变成”与第一比特一致,于是整个系统形成了纠缠。测量时,两个比特要么同时为 0,要么同时为 1。这就是量子纠缠最直观的工程化表现。建议你把 1024 改成 100 再跑一次,会发现比例大约是 50/50 但波动变大;改成 100000 后,比例会非常接近 50/50。这个采样过程是理解量子程序随机性的最好起点。

3. 入门技能二:量子编程框架的工程化使用

3.1 主流量子框架怎么选

现在市面上主流的量子编程框架各有特点,我整理了一张简表,方便你按场景判断:

框架开发方语言特点适用场景
QiskitIBMPython社区最大,资料最多,支持IBM云量子后端通用入门、算法原型、企业项目
CirqGooglePython更强调电路时序和硬件控制,适合NISQ设备与Google硬件结合、量子纠错研究
Q#Microsoft类C#与Visual Studio集成好,自带模拟器企业开发者、基于.NET的团队
PennylaneXanaduPython对量子机器学习、可微编程支持很友好变分量子算法、量子机器学习

我的建议是:如果只是想快速入门,或者想用中文资料排查问题,选 Qiskit 就好;如果你已经有很强的 .NET 背景,选 Q# 也能顺利过渡;如果目标非常明确是量子机器学习方向,可以再上手 Pennylane。不要贪多,先啃透一个框架,之后迁移到另一个框架会很容易,因为电路表达的底层逻辑都一样。

3.2 一个量子程序的完整工程结构

很多新手学量子计算时,拿到的示例都是三四行代码,容易误以为量子开发就是“画电路然后跑一下”。实际工程化项目里,量子代码通常有以下几层结构:

  • 问题定义层:把实际问题抽象成哈密顿量、目标函数或约束条件,这一步通常是用经典代码完成的。
  • 电路设计层:根据算法思想构造参数化量子电路,这里会涉及到量子门的选择、参数初始化、电路深度控制。
  • 编译与优化层:把逻辑电路映射到目标硬件的拓扑结构上,插入必要的换行门或噪声缓解指令,并做能标优化。这一步在本地模拟器里不明显,但在真实量子芯片上很关键。
  • 执行层:将电路提交到模拟器或真实后端,设置 shots(采样次数)、噪声模型、权限等参数。
  • 后处理层:把采样结果转换为算法的输出,可能涉及纠错、概率重建、与经典优化器交互。

在实际工程里,量子电路只占整个项目的一小部分,真正花时间的是数据准备、结果分析和异常处理。这一点和传统软件开发很像。所以我不建议把“会画电路”等同于“会量子开发”,你还需要具备工程化的迁回能力——比如量子后端偶尔会排队或断连,你的程序得能重试和容错,这些可都是软件工程师的老本行。

3.3 实操:带测量、可视化与后端切换的完整脚本

下面这个脚本比上一个更接近工程化:它包含参数化电路、多种测量方式、结果可视化和后端切换逻辑。你可以用AerSimulator跑本地模拟,也可以改成 IBM 云后端,只需要把backend换成service.backend("ibm_brisbane")之类即可。

import numpy as np from qiskit import QuantumCircuit, transpile from qiskit_aer import AerSimulator from qiskit.visualization import plot_histogram from qiskit_ibm_runtime import QiskitRuntimeService def build_circuit(theta: float): qc = QuantumCircuit(2, 2) qc.ry(theta, 0) qc.cx(0, 1) qc.measure([0, 1], [0, 1]) return qc def run_local(theta, shots=4096): qc = build_circuit(theta) simulator = AerSimulator() circ = transpile(qc, simulator) result = simulator.run(circ, shots=shots).result() counts = result.get_counts() return counts # 本地模拟 theta = np.pi / 4 counts = run_local(theta) print(counts) plot_histogram(counts) # 如果要跑真实硬件,需要先在IBM Quantum上创建API Token # service = QiskitRuntimeService(channel="ibm_quantum", token="你的token") # backend = service.backend("ibm_brisbane") # circ = transpile(build_circuit(theta), backend) # job = backend.run(circ, shots=4096) # print(job.result().get_counts())

我实测下来,本地模拟器跑这种小电路非常快,切换不同 theta 观察结果分布变化,是理解振幅叠加和概率干涉的最好方式。写这个脚本时要注意:不同版本的 Qiskit API 有些差异,1.x 版本之后Aer被拆分成了独立的qiskit-aer包,QiskitRuntimeService也需要单独安装。建议建一个干净的虚拟环境,避免和旧项目发生依赖冲突。

4. 入门技能三:量子-经典混合编程与算法思维

4.1 为什么现阶段离不开经典计算机

量子计算机目前并不是一个完全独立的计算平台,更像是一个“协处理器”。你仍然需要经典的 CPU 来处理数据输入、参数更新、结果判断和最终输出。很多被寄予厚望的量子算法,本质上都是混合算法:用量子电路估计某个目标函数的期望值或采样分布,再用经典优化器更新电路中的参数,循环迭代直到收敛。这个范式就是变分量子算法,其中最典型的是 VQE(变分量子特征求解器)和 QAOA(量子近似优化算法)。

软件工程师最应该抓住的点是:参数化量子电路本身就是一个可微分的“概率程序”,你完全可以用经典深度学习里常用的优化思路去训练它。比如用梯度下降、Adam、BFGS 去更新电路里的参数,只是这里的“网络”变成量子电路,损失函数变成量子态上的期望值。你可以把量子电路理解成一种特殊的函数逼近器,它的前向计算在量子处理器上完成,反向传播和参数更新在经典处理器上完成。

4.2 VQE和QAOA是怎么工作的

VQE 解决的核心问题是:给定一个哈密顿量 H(可以理解为一个矩阵),找一个量子态 |ψ(θ)>,让期望值 <ψ(θ)|H|ψ(θ)> 尽可能小。它的工作流程分四步:

  • 构造参数化的试探波函数(ansatz)电路,参数用 θ 表示。
  • 在量子后端制备这个量子态,并测量它在 H 各分项下的期望值。
  • 把所有期望值加权求和,得到当前参数下的目标函数值。
  • 在经典优化器里更新参数,继续迭代,直到收敛到最小值。

QAOA 的思路类似,只不过它针对组合优化问题,把目标函数映射成一个 Ising 模型,再通过交替施加问题哈密顿量和混合哈密顿量来逐步逼近最优解。对初学者而言,VQE 更直观,因为你可以拿一个小矩阵做实验,眼睁睁看着优化器把电路参数调到最优。

4.3 实操:参数化电路 + 经典优化器的最小闭环

我写了一个极简的教学版 VQE,目标是找到单个量子比特在 Z 方向能量期望值的最小值。这个例子虽然简单,但包含了完整的混合编程闭环,你跑通后再迁移到多量子比特体系会轻松很多。

import numpy as np from scipy.optimize import minimize from qiskit import QuantumCircuit from qiskit.quantum_info import Statevector def build_state(theta): # 参数化电路:|psi(theta)> = RY(theta)|0> qc = QuantumCircuit(1) qc.ry(theta[0], 0) return Statevector(qc) def expectation_z(theta): state = build_state(theta) # 单比特态向量为 [amplitude_0, amplitude_1] # <Z> = |a0|^2 - |a1|^2 a0, a1 = state[0], state[1] return abs(a0)**2 - abs(a1)**2 # 初始参数给一个随机角度 x0 = np.array([0.8]) # 经典优化器负责调整量子电路参数 res = minimize(expectation_z, x0, method="Nelder-Mead") print("最优参数:", res.x) print("最小期望值:", expectation_z(res.x))

运行这个脚本你会发现,初始参数不同,最终收敛到的最优参数基本都是让期望值趋近于 -1 的某个角度。因为当 |ψ> = |1> 时,Z 方向期望值就是 -1,这是单比特体系下能取到的最小值。这个闭环展示了混合编程的精髓:即使你完全不懂量子力学公式,只要你会写目标函数和优化器,一样能操作量子电路完成“训练”。真实 VQE 会复杂很多,比如需要把多比特哈密顿量拆成多个 Pauli 算符项,但骨架长这样。

5. 学习路径与常见坑

5.1 从入门到上手的学习路线建议

很多人一上来就想读 Nielsen 的《Quantum Computation and Quantum Information》,书是好书,但对软件工程师来说太劝退了。我更推荐一条“倒着学”的路径:先跑代码,再补理论。我的建议周期如下:

  • 第 1 周:用 Qiskit 跑通本文里的 Bell 态电路和 VQE 最小闭环,建立起“量子电路 = 概率程序”的第一印象。
  • 第 2 周:补线性代数基础,重点掌握矩阵乘法、Hermitian 矩阵、特征值分解、张量积。不需要读数学系教材,看 3Blue1Brown 的线性代数系列就够。
  • 第 3 周:系统过一遍量子门电路模型,理解单比特门、CNOT、SWAP、测量基变换。保证看到电路图能说出它实现了什么效果。
  • 第 4 周以后:选一个具体算法做小项目,我建议从 VQE 开始,因为可复现、有优化过程、也方便可视化。跑完后再挑战 QAOA 或者 Grover 搜索。
  • 并行:看量子云平台上的官方教程和 Jupyter Notebook,尤其建议做几次“本地模拟器结果 vs 真实硬件结果”的对比,感受噪声带来的差异。

这条路线的核心原则是:不要试图一次学完所有物理原理,先建立工程意义上的“电路-概率-优化”三连击,再接理论和细节。

5.2 新手最常见的4个“报错现场”

我见过不少同事和学员在入门阶段反复踩坑,下面这几个尤其典型,我整理成了速查表:

报错或异常常见原因我的排查方法
ModuleNotFoundError: No module named 'qiskit_aer'Qiskit 1.x 之后 Aer 拆成独立包执行 pip install qiskit-aer,旧代码里 from qiskit import Aer 改成 from qiskit_aer import AerSimulator
电路编译时提示连接错误电路需要逻辑比特到物理比特的映射,真机拓扑不完全连通用 transpile(circ, backend) 做编译,必要时允许插入额外的 SWAP 门
结果全是 00 没有 11忘记 CNOT 或测量比特位置不对,也可能是 H 门没生效先画电路图(qc.draw()),逐层检查门作用在哪个量子比特上
模拟器跑大电路很慢或内存爆掉量子态向量维度随比特数指数增长,30 个比特就需要 2^30 复数槽位减少比特数,或使用支持张量网络模拟的模拟器后端,比如 AerSimulator 的 matrix_product_state 方法

从我的经验看,大部分问题不是物理概念不够熟,而是“像写经典程序一样写量子程序”留下来的旧习惯。量子程序必须明确区分量子比特和经典比特,必须理解采样结果不是确定值,必须接受后端有噪声和排队。这几条想通之后,排查错误的速度会快很多。

6. 量子开发对软件工程师的附加价值:嵌入式方向与面试

6.1 嵌入式软件工程师为什么也适合关注量子开发

写到这里,我想专门把嵌入式软件工程师拉出来聊聊。量子计算硬件远不是一台“冷柜里的超导芯片”那么简单,它需要一整套精密的控制与测量系统:微波脉冲生成、模数转换、实时反馈、延迟校准、低频和高频信号同步、往往还要用 FPGA 做低延迟控制。这套系统跑的基本上就是嵌入式软件和实时逻辑。一个既懂 FPGA/嵌入式开发,又懂量子电路基本概念的工程师,在量子硬件团队里会非常吃香。

我一个在量子实验室工作的朋友跟我说,他们团队现在最缺的不是纯物理研究员,而是能把控制代码写到微秒级别、能处理仪器间同步、能对采集数据做清洗的老练工程师。这些能力和通用软件工程、嵌入式领域高度重合。量子开发对嵌入式工程师来说不是转行,更像是把原有技能对接到一个更有想象力的新场景。

6.2 面试里怎么讲量子技能才不会“踩雷”

结合“嵌入式软件工程师面试”这个热度较高的方向,我给几条实操建议。

第一,不要把量子项目包装成“我发明了新算法”,而是讲清楚自己在项目里承担了哪一部分工程实现:是数据预处理、接口封装、还是结果可视化?量子项目本身可能很小,但工程化表达会让你和其他候选人拉开差距。

第二,突出调试能力和对随机结果的处理。你可以聊一聊,你是怎么把一个量子电路的输出从“概率分布”转化成业务可读的结论,这个过程会充分展示你的严谨性。比如在 VQE 项目里,你会遇到初始参数敏感、噪声影响大等问题,你是如何调整 shots、采用 error mitigation 或多次重复实验的?这些都是面试官最想听到的“实战细节”。

第三,如果目标是量子相关岗位,把“量子计算原理”和“工程落地能力”两条线都讲。你可以先讲懂 Bell 态、叠加、纠缠的概念,再补一句“我在仿真环境里验证了噪声对结果的影响,并用经典后处理做了一次校正”,这句话的价值会超过你背下十个算法的名字。如果目标是传统软件或嵌入式岗位,也不用回避量子项目经历,它反而证明了你的学习能力,以及对前沿技术的敏感度。

6.3 再从工程角度看量子开发的学习节奏

学量子开发的过程中,我最大的感悟是:不要试图成为“什么都知道的量子理论家”,要成为“能动手解决问题的人”。量子计算的知识体系非常大,从量子纠错到容错逻辑门,从低温电子学到实时控制系统,任何一个方向都够深挖很多年。但入门阶段,你只需要建立三条基础链路:比特与量子门、电路与测量、经典优化与量子计算协同。这三条链路打通后,其他知识都可以按需补充。

我个人的习惯是每天写一小段量子代码,哪怕只是换个角度重复运行同一段电路,也能加深对概率幅的理解。遇到奇怪的结果时不要太快“修电路”,先把测量结果分布画出来,对照理论推导,很多问题一眼就能看出来。比如 Bell 态电路如果出现少量 01 或 10,可能不是逻辑问题,而是模拟器噪声或测量误差,这在真实硬件上更明显。理解“理论概率分布 vs 实际采样分布”的差异,才是量子开发和经典开发最不一样的地方。

如果你现在正准备学或正在学,一个小技巧是:找一本量子计算科普书配合官方框架的 Notebook 一起看。每天花半小时,坚持一个月,你再回头读量子算法相关的论文时,会发现那些抽象符号背后其实都是你跑过的电路,这种感觉很有意思。

最后再分享一个我自己的切身体会:把量子电路看成“神经网络前向传播的远房亲戚”特别帮助入门。它也有参数、有目标函数、有优化器,只不过参数不在权重矩阵里,而在旋转门的角度里;梯度不一定用反向传播算,而是用量子测量的期望值估计。这个类比不完美,但足以支撑你从软件工程师的舒适区,平稳走到量子开发的世界里。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/24 19:46:12

Oracle分页从ROWNUM到键集分页:写法、优化与MyBatis-Plus避坑指南

Oracle 分页这个问题&#xff0c;我在刚转过来做 Oracle 的时候被折磨得不轻。那时候从 MySQL 过来的人&#xff0c;脑子里全是LIMIT ? OFFSET ?&#xff0c;到了 Oracle 发现根本不认这套&#xff0c;官方文档翻半天也没找到一个跟 MySQL 一模一样的用法。后来我才搞清楚&am…

作者头像 李华
网站建设 2026/9/24 19:45:38

Windows上配置codex辅助JS逆向:从安装到实战的完整指南

这几天我一直在 Windows 上折腾 codex&#xff0c;拿它来辅助 JS 逆向。刚开始装的时候&#xff0c;说实话挺崩溃的&#xff0c;光一个登录认证就卡了半天&#xff0c;后面又遇到配置切换后 endpoint 连接失败的怪问题。但把所有坑填平之后&#xff0c;回头再看&#xff0c;这套…

作者头像 李华
网站建设 2026/9/24 19:45:19

macOS截图快捷键与工具全指南:从系统原生到第三方实战

很多新 Mac 用户第一天开机就会卡在同一个问题上&#xff1a;苹果电脑怎么截图&#xff1f;macOS 里没有 Windows 键盘那个 PrtSc 按键&#xff0c;鼠标划拉半天也找不到截图按钮。其实 macOS 自带的截图能力比很多人想象中完整得多&#xff0c;全屏、选区、窗口、触控栏、录屏…

作者头像 李华
网站建设 2026/9/24 19:44:38

数字平台全球化合规与内容资产并购:一场双向重构的深度解读

最近我刷到两条行业新闻&#xff0c;一条是海外某个重要市场明确要对数字平台加强治理&#xff0c;另一条是互联网巨头被曝出对好莱坞老牌制片厂的并购意向。乍一看&#xff0c;一条讲规则&#xff0c;一条讲资本&#xff0c;八竿子打不着。但把这两件事放在一起读&#xff0c;…

作者头像 李华
网站建设 2026/9/24 19:44:32

JavaWeb超市会员管理系统:JSP+Servlet+JDBC毕设实战解析

简介&#xff1a;这是一套基于Javaweb的超市会员管理系统毕业设计项目&#xff0c;面向计算机相关专业正在做毕设的学生&#xff0c;以及需要项目实战练习的Java学习者&#xff0c;也可作为课程设计或期末大作业使用。系统采用JSP、Servlet、JDBC配合MySQL数据库&#xff0c;开…

作者头像 李华
网站建设 2026/9/24 19:44:26

多因素认证与TOTP:身份认证令牌的选型、原理与落地

身份认证令牌这几年在后台系统、金融App、企业内部系统里出现得越来越频繁&#xff0c;我自己第一次真正动手接入身份认证令牌&#xff0c;是在给一个内部运维平台做登录改造的时候。当时团队正在被“密码疲劳”折磨——每个人的密码规则越来越多&#xff0c;改密周期越来越短&…

作者头像 李华