Zhuang's Diary

言之有物,持之以恒

在《基于DORA指标体系的项目管理.md》学习之后,继续学习针对software engineering的管理和评估指标。

1. 代码数量

用于规模估算。

  1. Lines of Code(代码行数): 所有物理代码行的总数(包括空行和注释)。这是一个最基础的规模指标。
  2. Lines(行数): 文件中的总行数,包括所有代码行、注释行和空行。这个数字通常比“Lines of Code”大,因为它包含了非代码行。其中的差的行数是注释和空行。
  3. Statements(语句数): 代码中可执行语句的数量。在不同的编程语言中,语句的定义不同(例如,在Java/C#中,一个分号通常代表一个语句的结束)。这个指标比代码行数更能准确反映程序的逻辑复杂度。一个代码行可能包含多个可执行语句。
  4. Functions(函数数): 代码中定义的函数(或方法)的总数。反映了代码被分解成的模块数量。函数数量过多或过少都可能意味着设计问题(如函数粒度过细或过粗)。
  5. Classes(类数): 代码中定义的类(或结构体、接口等)的总数(主要面向对象语言)。反映了面向对象设计的抽象层次和模块数量。
  6. Files(文件数): 被扫描的源代码文件总数(如 .java, .py, .js文件)。项目物理结构的基本单位数量。
  7. Comment Lines(注释行数): 专门用于注释的行数。注释有助于理解代码意图。
  8. Comments(%): 注释行数占总行数(Lines)的比例。Comments(%) = Comment Lines / (Lines of Code + Comment Lines) 注释密度:这个比例没有绝对的好坏标准,通常认为在 10%-30% 之间是比较健康的,但更重要的是注释的质量(解释为什么这么做,而不是重复代码在做什么)。

1.1. Number of Coder vs Non-Coder 编码人数对比非编码人数

它反映了团队的结构、效率、成熟度以及公司的文化导向。编码者是直接从事设计和编写代码工作的工程师。非编码者为编码者提供支持、确保项目成功交付所必需的其他角色。通常包括:项目经理、产品经理、UI/UX设计师、QA/测试工程师、运维/SRE工程师、技术文档工程师、团队领导(如果其编码量很少)等。

1.1.1. 团队成熟度与产品阶段视角

  • 早期/创业阶段:比例通常很高。编码者是绝对主力,一人多职。非编码职能可能由创始人或编码者兼任。目标是快速验证想法,推出MVP。
  • 成长/扩张阶段:比例开始下降。公司会陆续引入产品经理、专职测试、运维等,以建立流程、保障质量和规模扩张。此时比例变化是健康的标志。
  • 成熟/稳定阶段:比例会稳定在一个相对较低的平衡点。团队结构完整,各司其职,专注于优化和稳健创新。

1.1.2. 文化与管理导向视角

  • 工程师驱动文化:公司极度信任技术团队,倾向于给工程师更多自主权。可能会维持较高的coder比例,鼓励工程师参与产品讨论和决策。
  • 流程与管控驱动文化:公司强调可预测性、风险控制和规范流程。可能会配备更多的项目经理、QA等角色,导致比例较低。

2. 代码质量

当前开放的所有 Issues = 当前开放的Vulnerability + 当前开放的Bug + 当前开放的Code Smell。

2.1. Security(安全性)

  • 衡量代码中存在的安全漏洞​的数量和严重性。由所有类型为 Vulnerability(漏洞)的 Issues 聚合计算得出的。这些漏洞可能被恶意攻击者利用,导致数据泄露、服务中断、未授权访问等安全问题。SonarQube 会根据通用漏洞评分系统(如 CVSS)将漏洞分为严重、高危、中危、低危等级别。
  • 这个指标是“通过”状态,意味着在本次扫描中,代码库没有发现任何“阻断”或“严重”级别的安全漏洞,或者发现的漏洞数量在质量门禁允许的阈值之内。这是最重要的指标之一。

2.2. Reliability(可靠性)

  • 衡量代码中存在的Bug(错误)的数量和严重性。它是由所有类型为 Bug(错误)的 Issues 聚合计算得出的。这些Bug不一定能被外部攻击者利用,但会导致程序运行结果不正确、性能下降或直接崩溃(例如,空指针异常、资源泄漏、逻辑错误)。
  • 这个指标是“通过”状态,意味着代码中没有“阻断”或“严重”级别的Bug,或者Bug数量在可接受范围内。高可靠性是软件稳定运行的基石。

2.3. Maintainability(可维护性)

  • 衡量代码的技术债​和可维护性。由所有类型为 Code Smell(代码坏味道)的 Issues 聚合计算得出的。它主要关注“代码坏味道”——这些不是错误,而是设计或实现上的缺陷,会导致代码难以理解、修改和扩展(例如,过长的函数、过大的类、重复代码、复杂的条件判断)。技术债以“修复所需时间”来量化(例如,5天3小时)。
  • 这个指标是“通过”状态,意味着代码的“坏味道”总量或技术债在预设的门禁之内。高可维护性意味着未来添加新功能或修复问题会更容易,成本更低。

2.4. 测试覆盖度(Coverage)

  • Coverage(综合覆盖率)
    这是行覆盖率和条件覆盖率的加权综合值。通常,Coverage(综合覆盖率)80%以上的覆盖率就被认为是良好的水平
  • Lines to Cover(可覆盖代码行数)
    可被测试覆盖的可执行代码行的总数。
  • Uncovered Lines(未覆盖行数)
    在“可覆盖代码行”中,没有被任何测试用例执行到的行数。这是测试的“漏洞”。
  • Line Coverage(行覆盖率)
    被测试覆盖到的代码行所占的百分比。计算公式:(Lines to Cover - Uncovered Lines) / Lines to Cover
  • Conditions to Cover(可覆盖条件数)
    在代码中,所有的条件判断分支的总数。例如,一个 if语句有 2 个分支(真和假),一个 switch语句有 N 个分支(case 数量)。
  • Uncovered Conditions(未覆盖条件数)
    在“可覆盖条件”中,没有被任何测试用例走过的分支路径数。有 2 个条件分支(例如,某个 ifelse分支,或某个 case语句)在测试中从未被触发。这是比“未覆盖行”更隐蔽的风险,因为它可能意味着某些边缘情况或错误处理逻辑没有被测试到。
  • Condition Coverage(条件覆盖率/分支覆盖率)
    被测试覆盖到的条件分支所占的百分比。计算公式:(Conditions to Cover - Uncovered Conditions) / Conditions to Cover
    测试用例可能覆盖了代码的“主干道”,但可能遗漏了一些“小路”(如错误情况、边界条件)。

    行动建议

  • 首要任务:审查那 2 个未被覆盖的条件分支。这些是代码中最危险的部分。
    • 找到对应的代码,看看是什么逻辑(很可能是错误处理或边界条件)。
    • 为这些分支补充针对性的测试用例,确保它们也能被测试执行到。
  • 次要任务:检查那 3 行未被覆盖的代码。它们很可能与未覆盖的分支相关联。补齐分支的测试后,这些行很可能自然就被覆盖了。

2.5. 重复度(Duplications)

  • 指在代码库中重复出现的代码行的比例。SonarQube 会检测完全一致或结构相似的代码块。
  • 高重复度是代码的“坏味道”之一,意味着“复制粘贴”编程。这会导致维护困难,因为一处逻辑修改需要在多个地方进行。理想情况下,这个值应该很低。也可能是工程师为了冲高代码行数而复制出的多余代码。

2.6. 复杂度(Complexity)

  • Cyclomatic Complexity(圈复杂度):衡量的是代码的结构性复杂度,即“测试这段代码有多难”。
  • Cognitive Complexity(认知复杂度):衡量的是代码的可理解性复杂度,即“理解这段代码有多难”。

    假设某一页代码的 Cyclomatic Complexity(圈复杂度)- 68

    圈复杂度由托马斯·J·麦凯布在1976年提出。它通过计算程序线性独立路径的数量来量化代码的结构复杂度。
    基本规则:代码中每出现一个条件分支(如 if, else, case, while, for, catch, &&, ||等),复杂度就 +1。它本质上反映了程序的控制流复杂度。起始值为 1。每遇到一个条件判断分支,值就 +1。
    好的,这两个复杂度指标是 SonarQube 中非常核心的代码质量度量项。它们从不同角度衡量代码的复杂程度,而高复杂度是滋生 Bug 和降低可维护性的主要温床。
    圈复杂度为 68 是一个非常高的数值,是一个强烈的危险信号。
  • 可测试性极差:理论上,你需要设计至少 68 个测试用例才能覆盖这个函数(或类)的所有可能路径。这在实际中几乎不可能完成,意味着代码的测试覆盖率必然很低。
  • 维护难度极高:一个拥有 68 条路径的函数,其逻辑必然盘根错节,任何修改都可能产生意想不到的副作用,就像推倒一块多米诺骨牌。
  • Bug 高发区:如此复杂的逻辑,很容易在某个罕见的分支条件下出现错误,且难以被发现和修复。
    行业通用标准建议:
  • 1-10:简单、可靠、易于测试的代码。
  • 11-20:有点复杂,需要关注。
  • 21-50:非常复杂,高风险,急需重构。
  • >50:极度复杂,无法测试,是潜在的灾难。你的数值 68 就属于这一级别。

示例

1
2
3
4
5
6
7
8
9
10
// 示例函数:圈复杂度计算
public void evaluate(int a, int b) {
if (a > 10) { // +1
// ...
}
for (int i = 0; i < 5; i++) { // +1
// ...
}
}
// 这个函数的圈复杂度 = 1 (起点) + 1 (if) + 1 (for) = 3

假设某一页代码的Cognitive Complexity(认知复杂度)- 64

SonarSource 公司提出了认知复杂度,旨在更准确地衡量人类程序员理解代码的难度
圈复杂度的主要问题是:它平等地对待所有分支。但一个嵌套很深的 if语句比几个平级的 if语句更难理解,而圈复杂度计算结果可能是一样的。
认知复杂度的增量规则更智能:

  • 鼓励扁平结构:平级的条件分支,增量较小。
  • 惩罚嵌套结构:每当出现嵌套的条件分支时,复杂度会显著增加。因为这正是让代码难以理解的主要原因。
  • 忽略简写结构:对不影响理解性的结构(如简单的 else)不加分。

如何解读这个值 - 64

和圈复杂度一样,64 也是一个非常高的数值,证实了代码确实极其复杂,并且这种复杂性主要体现在深层嵌套和糟糕的结构上,导致可读性非常差。

  • 可读性极差:新成员需要花费很长时间才能理解这段代码的意图。即使是原作者,几周后回来看也可能看不懂。
  • 修改成本极高:因为难以理解,所以修改时充满风险,容易引入新的错误。

示例(对比圈复杂度)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 示例A:平级结构 - 易于理解
public void processA(int a) {
if (a > 10) { // 认知复杂度 +1
// ...
}
if (a < 0) { // 认知复杂度 +1 (平级,不加倍)
// ...
}
}
// 圈复杂度 = 3 (1+1+1)
// 认知复杂度 = 2 (1+1)

// 示例B:嵌套结构 - 难以理解
public void processB(int a) {
if (a > 10) { // 认知复杂度 +1
if (a < 20) { // 认知复杂度 +2 (因为嵌套了一层)
for (int i = 0; i < 10; i++) { // 认知复杂度 +3 (因为嵌套了两层)
// ...
}
}
}
}
// 圈复杂度 = 4 (1+1+1+1)
// 认知复杂度 = 1 + 2 + 3 = 6

从例子可以看出,尽管两个例子的圈复杂度接近,但示例B的认知复杂度远高于示例A,这更准确地反映了我们阅读代码时的真实感受:嵌套深的代码难懂得多。

总结与建议

你的代码中 圈复杂度 68​ 和 认知复杂度 64​ 这两个数值表明:

  1. 存在“上帝函数/类”:你的项目中极有可能存在一个或多个非常庞大的函数或类,它试图处理所有事情,违反了“单一职责原则”。
  2. 代码质量高风险:这是代码库中最需要关注的“坏味道”之一,是 Bug 的温床和维护的噩梦。

重构建议:

  • 首要任务:分解。找到那个复杂度最高的函数或类,作为重构的首要目标。
  • 提取方法:将大块代码根据逻辑功能提取成多个小函数。给这些新函数起一个清晰易懂的名字。
  • 替换算法:有时复杂的条件逻辑可以通过使用设计模式(如策略模式、状态模式)或更优雅的算法来简化。
  • 减少嵌套:尽早返回(Early Return)是减少嵌套的利器。将深度嵌套的代码“拉平”。
  • 使用多态:如果复杂的分支判断是基于类型,考虑用多态来替代。
    解决高复杂度问题是降低技术债、提升代码可维护性最有效的手段之一。

3. 综合的代码质量指数

代码质量综合指数设计方案

3.1. 设计原则

多维度加权:不同指标的重要性不同,需要合理分配权重
归一化处理:将不同量纲的指标标准化到统一尺度
可操作性:指数应能指导具体的改进行动
可视化展示:便于团队理解和跟踪趋势

3.2. 指标体系构建

1
2
3
代码质量综合指数 (CQ Index) = 
安全性(25%) + 可靠性(25%) + 可维护性(20%) +
测试覆盖度(15%) + 复杂度(10%) + 重复度(5%)

3.3. 各维度评分规则

3.3.1 安全性评分 (25%)

1
2
3
4
5
6
7
8
9
# 基于漏洞密度和加权的评分
# 当`total_lines`很小(如<1000行)时,分母`<1`,惩罚会过度放大;反之,超大规模项目(百万行代码)可能稀释严重漏洞的影响。使用对数缩放,解决该问题
import math
def security_score(vulns, total_lines):
weight = {'blocker': 10, 'critical': 5, 'high': 3, 'medium': 1}
# 对数缩放:1万行≈4,10万行≈5,防止规模稀释
denominator = math.log(max(total_lines, 1000) / 1000, 10) + 1
score = 100 * (1 - sum(vulns[level] * weight[level] for level in vulns) / denominator)
return max(0, min(100, score))

3.3.2 可靠性评分 (25%)

1
2
3
4
5
6
7
8
9
def reliability_score(bugs):
if bugs.critical == 0 and bugs.blocker == 0:
return 100
elif bugs.critical <= 3:
return 80
elif bugs.critical <= 8:
return 60
else:
return 40

3.3.3 可维护性评分 (20%)

基于技术债比率:

1
2
3
4
5
def maintainability_score(code_smells, total_lines):
smells_per_kloc = (code_smells / total_lines) * 1000
if smells_per_kloc < 5: return 100
elif smells_per_kloc < 20: return 80
# ...

3.3.4 测试覆盖度评分 (15%)

1
2
3
4
5
def coverage_score(overall_coverage, branch_coverage):
# 综合考虑整体覆盖率和分支覆盖率
base_score = min(overall_coverage, 100) # 整体覆盖率
penalty = max(0, 85 - branch_coverage) * 0.5 # 分支覆盖率不足惩罚
return max(0, base_score - penalty)

3.3.5 复杂度评分 (10%)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
def complexity_score(avg_cyclomatic, avg_cognitive):
# 基于平均复杂度评分
if avg_cyclomatic <= 10 and avg_cognitive <= 10:
return 100
elif avg_cyclomatic <= 15 and avg_cognitive <= 15:
return 80
elif avg_cyclomatic <= 25 and avg_cognitive <= 25:
return 60
else:
return 40

# 也可以考虑替换为:加权密度模型
def complexity_score(func_complexities, total_funcs):
"""
func_complexities: [{'cyclomatic': 68, 'cognitive': 64}, ...] # 各函数复杂度列表
total_funcs: 函数总数
"""
if total_funcs == 0: return 100
# 计算高复杂度函数占比(圈复杂度>25或认知复杂度>25为高危)
high_risk_funcs = sum(1 for fc in func_complexities if fc['cyclomatic'] > 25 or fc['cognitive'] > 25)
risk_ratio = high_risk_funcs / total_funcs
# 计算平均复杂度(相对团队基线)
avg_cyclomatic = sum(fc['cyclomatic'] for fc in func_complexities) / total_funcs
avg_cognitive = sum(fc['cognitive'] for fc in func_complexities) / total_funcs
# 分数 = 基础分 - 高危函数惩罚 - 平均复杂度惩罚
base_score = 100
risk_penalty = risk_ratio * 40 # 高危函数最多扣40分
avg_penalty = max(0, avg_cyclomatic - 10) * 2 + max(0, avg_cognitive - 10) * 2 # 超阈值每点扣2分
return max(0, base_score - risk_penalty - avg_penalty)

3.3.6 重复度评分 (5%)

1
2
3
4
5
6
7
8
9
def duplication_score(duplication_percentage):
if duplication_percentage <= 3: # 3%以内
return 100
elif duplication_percentage <= 5: # 5%以内
return 80
elif duplication_percentage <= 8: # 8%以内
return 60
else:
return 40

3.4. 权重配置示例

不同项目类型应使用不同权重模板:

项目类型 安全性 可靠性 可维护性 测试覆盖度 复杂度 重复度 说明
(金融)核心系统 40% 30% 15% 10% 5% 0% 安全合规优先,重复度可忽略
数据管道项目 15% 40% 20% 15% 10% 0% 数据准确性比安全更重要
MVP验证项目 10% 20% 30% 25% 10% 5% 快速迭代,可维护性为重
标准Web应用 25% 25% 20% 15% 10% 5% 默认平衡模板

基于”标准Web应用”模板(权重见上表)和以下项目数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 输入数据
vulnerabilities = {'blocker': 0, 'critical': 0, 'high': 0, 'medium': 2}
bugs = {'blocker': 0, 'critical': 0, 'high': 1, 'medium': 5}
code_smells = 45
total_lines = 15000
overall_coverage = 88.9
branch_coverage = 75
avg_cyclomatic = 12.5
avg_cognitive = 11.2
duplication_percentage = 5.0
# 计算过程
security = security_score(vulnerabilities, total_lines) # 100 * 25% = 25.0
reliability = reliability_score(bugs) # 100 * 25% = 25.0
maintainability = maintainability_score(code_smells, total_lines) # 60 * 20% = 12.0
coverage = coverage_score(overall_coverage, branch_coverage) # 89 * 15% = 13.4
complexity = complexity_score(avg_cyclomatic, avg_cognitive) # 40 * 10% = 4.0
duplication = duplication_score(duplication_percentage) # 60 * 5% = 3.0
# 最终结果
综合代码质量指数 = 25.0 + 25.0 + 12.0 + 13.4 + 4.0 + 3.0 = 82.4
质量等级:B级(良好)

3.5. 质量等级划分

1
2
3
4
5
A级 (90-100): 优秀 - 代码质量极高,维护成本低
B级 (80-89): 良好 - 质量较好,有改进空间
C级 (70-79): 一般 - 需要关注技术债
D级 (60-69): 警告 - 存在明显质量问题
E级 (<60): 危险 - 急需重构和优化

您的项目得分 82.4​ 属于 B级(良好)

3.6. 可视化仪表板设计

建议创建代码质量仪表板,包含:

  • 雷达图:展示6个维度的得分情况
  • 趋势图:显示指数随时间的变化
  • 改进建议:基于最低分维度提供具体行动项
  • 反对团队对比:原DORA团队成员明确反对跨团队对比,因团队业务域、技术栈、历史债务差异巨大,对比会催生”指标博弈”(如刻意不修复低优先级Bug以保分数)。

4. 如何使用

  • 原则1: 这些指标应作为团队过程健康度的观测器,用于识别问题区域(如高复杂度模块、重复代码热点),而非考核个人,禁止用于绩效考核、晋升
  • 原则2: 指标异常时,管理层应提供资源支持(如排期重构),而非问责
  • 原则3: 关注”重复度从8%降到5%”而非”本月得分82.4”
  • 原则4: 门禁分级与响应SLA:
门禁类型 触发条件 自动动作 人工响应SLA 升级路径
强制门禁 Security / Reliability 的Blocker级问题 禁止合并PR 无法绕过 自动阻塞
警告门禁 圈复杂度 >50 或 重复度 >10% 添加 Warning 标签 24小时内 Review TL评估是否放行
观察指标 注释密度 <5% 仅记录,不阻塞 周会讨论 EM决定是否调整规范
  • 安全密集型项目提高安全权重,快速验证型MVP可适当放宽
  • 代码质量必须结合部署频率、变更前置时间、失败率等结合DORA指标一起看。代码质量再好,若变更失败率高、交付周期长,仍需反思流程
  • 引入热点分析(Hotspot Analysis),结合变更频率复杂度共同决策重构顺序。

参考链接:

事件核心人物与实体

人物/实体名称 国籍/背景 在事件中的角色与已公开行为
陈志(Chen Zhi)​ 柬埔寨 资产所有者/控制者。​ 美国司法部起诉书指明的关键人物,被指控控制着太子集团,并是LuBian矿池被盗的127,272枚比特币的实际所有者。拥有英国和柬埔寨双重国籍。
太子集团(Prince Holding Group) 柬埔寨 陈志控制的母公司。​ 美国司法部文件指出,LuBian矿池是该集团庞大业务网络中的一部分,该集团在柬埔寨从事房地产、娱乐和赌博等业务。
LuBian矿池​ 未知(隶属于太子集团) 操作实体。​ 一个曾经短暂达到全球算力排名第五的比特币矿池,因私钥生成机制中存在“伪随机数漏洞”,导致巨额比特币被盗。
美国司法部​ 美国 司法调查与执法主体。​ 经过长期调查,于2025年10月正式起诉陈志,并没收了与LuBian矿池被盗案直接相关的12.7万枚比特币。
中国国家计算机病毒应急处理中心​ 中国 技术分析机构。​ 于2024年12月发布公开报告,首次从技术层面详细分析了LuBian矿池被攻击的根本原因,揭示了“伪随机数漏洞”的技术细节。
  1. 2017年底 - 2018年:偶然诞生与快速崛起
  • 核心事件:据早期媒体报道(如链闻2020年的报道),LuBian矿池的创立极具偶然性。几位来自物流、投资等传统行业的合伙人(报道中使用了“刘萍”、“王强”等化名),因一批矿机滞留港口,为减少损失而决定自行挖矿,并创建了矿池。
  • 技术背景:报道提及,其中负责技术的合伙人毕业于香港大学,后在杭州创办了一家大数据科技公司。这是其技术能力的来源,但该合伙人及其公司的具体名称未在报道中公开。
  • 商业模式:矿池以“路边”为名,凭借低手续费等策略,迅速吸引算力,在短期内跻身全球矿池算力排名前列。
  1. 2020年初:高光时刻与漏洞潜伏
  • 核心事件:根据BTC.com等矿池数据网站的历史快照,2020年初,LuBian矿池的实时算力排名一度达到全球第五,这是其最辉煌的时刻。
  • 漏洞潜伏:此时,导致日后灾难的“伪随机数漏洞”已潜伏在其自研的钱包系统中。这个由技术团队引入的致命弱点,使得矿池的“金库”看似坚固,实则不堪一击。
  1. 2020年4月:漏洞爆发,资产被盗
  • 核心事件:根据中国国家计算机病毒应急处理中心于2024年底发布的《报告》,2020年4月,攻击者利用伪随机数漏洞,成功盗取了矿池钱包中的127,272枚比特币。在比特币被盗后,陈志及其太子集团曾多次通过区块链的OP_RETURN功能向黑客公开喊话,LuBian矿池通过比特币网络发送了超过1500条消息,请求归还资产并愿意支付赎金。这种行为本身就强烈暗示了他们承认自己是这批资产的实际所有者。一个无关的第三方不可能,也没有理由去为别人的损失支付赎金。
  • 关键信息:这是加密货币史上金额最大的盗窃案之一,根本原因是自研系统未采用密码学安全的随机数生成器。
  1. 2020年 - 2024年:资产沉寂与幕后追踪
  • 核心事件:被盗资产在链上沉寂。美国司法部启动秘密调查。资产控制方(陈志方面)曾通过区块链向黑客喊话。
  • 关键信息:这表明损失是真实的,控制方自身也是受害者,降低了“监守自盗”的嫌疑。
  1. 2024年底 - 2025年10月:技术披露与司法没收
  • 2025年10月:美国司法部对陈志提起刑事指控,并宣布没收其12.7万枚比特币。其起诉书中列出的25个比特币钱包地址,经过区块链分析公司(如Elliptic和Arkham Intelligence)的追踪,证实正是2020年从LuBian矿池被盗走的比特币最终流入的地址。这表明,在法律层面,美国司法部也将这批从LuBian矿池流出的资产直接认定为由陈志控制。12.7万枚比特币(价值150亿美元)已转入政府托管钱包。陈志及多名关联方(包括 3 名新加坡公民)因涉嫌通过加密货币为网络投资诈骗所得的数十亿美元洗钱,遭到美国当局制裁。

私钥的本质:比特币私钥本质上是一个极其庞大的随机数。标准比特币私钥是一个256位的二进制数。这个数字的空间有多大呢?是2的256次方,约等于10的77次方。
LuBian矿池的私钥生成机制在上述两个核心要点上出现了严重失误。使用了一种名为 Mersenne Twister (MT19937-32)​ 的伪随机数生成器(PRNG),并且仅以32位的种子进行初始化。这意味着,尽管生成的私钥在形式上可能仍然是256位,但其背后真正的随机性来源只有32位。根据报告中的计算,假设攻击脚本每秒可以测试100万个密钥,那么理论上遍历所有可能种子只需要大约1.17小时。

最后,LuBian矿池使用的有缺陷的随机数生成器(Mersenne Twister, MT19937-32)和低熵(32位)问题,与加密货币领域已知的多个重大漏洞(如Libbitcoin的“MilkSad”漏洞、Trust Wallet的历史漏洞)高度相似。这种“重复前人重大错误”的模式,更符合一种缺乏安全审计和经验导致的疏忽。这可能是一个故意留下的后门,比如一个只有设计者知道的“主密钥”。但LuBian矿池的这种低熵漏洞,一旦被外界知晓,相当于把金库的钥匙放在了一个能被很多人猜到的地方。这对于后门设置者本身来说风险也极高。
如果LuBian矿池严格使用比特币核心(Bitcoin Core)或其他成熟的开源钱包软件来生成和管理私钥,那么几乎可以100%避免这个导致灾难性后果的“伪随机数漏洞”。

参考链接:
https://finance.sina.com.cn/chanjing/gsnews/2025-11-13/doc-infxhqmu3714863.shtml
https://zh.wikipedia.org/zh-hant/%E9%99%B3%E5%BF%97_(%E5%95%86%E4%BA%BA)

Best Practice Framework: Idea → Requirements → Design → Tasks → Implementation

1. Idea Phase

  • Articulate the core concept - What problem are you solving?
  • Define the value proposition - Why does this matter?
  • Identify the target outcome - What success looks like
  • Consider alternatives - Are there simpler approaches?

2. Requirements Phase

  • Functional requirements - What must the system do?
  • Non-functional requirements - Performance, security, scalability
  • Constraints - Time, resources, existing tech stack
  • Acceptance criteria - How do we know it’s done?

3. Design Phase

  • Architecture decisions - High-level structure
  • Technology choices - Frameworks, libraries, patterns
  • Data flow - How information moves through the system
  • Interface contracts - APIs, function signatures, data schemas

4. Tasks Phase

  • Break down into atomic units - Each task should be independently completable
  • Sequence dependencies - What must happen before what
  • Identify risks - Where might things go wrong?
  • Plan validation - How to test each task

5. Implementation Phase

  • Execute in planned order - Follow the task sequence
  • Minimal viable code - Only what’s needed for the requirement
  • Validate incrementally - Test each piece as you build
  • Refactor if needed - Clean up after core functionality works

Why This Prevents Amazon Q Hanging/Inefficiency

The Problem with Skipping Idea Phase:

1
2
3
4
5
"Build me a user system"
→ Amazon Q guesses at requirements
→ Implements generic solution
→ Doesn't match your actual vision
→ Multiple revision cycles

The Power of Starting with Idea:

1
2
3
4
5
"I want users to collaborate on documents in real-time, like Google Docs"
→ Clear idea and vision
→ Specific requirements emerge naturally
→ Design choices become obvious
→ Implementation is focused and efficient

Practical Application Examples

Example 1: E-commerce Feature

Idea: “Customers abandon carts because checkout is too complex”
Requirements: One-click checkout for returning customers
Design: Store payment methods, streamlined UI flow
Tasks: Payment storage, UI simplification, security validation
Implementation: Minimal code for core flow

Example 2: API Optimization

Idea: “Our API is slow because we’re making too many database calls”
Requirements: Reduce response time by 50% without changing API contract
Design: Implement caching layer and query optimization
Tasks: Add Redis, optimize queries, implement cache invalidation
Implementation: Focused changes to bottleneck areas only

Amazon Q Interaction Best Practices

Communicate the Full Journey

1
2
3
4
"IDEA: I want to add real-time notifications to keep users engaged
REQUIREMENTS: Push notifications for comments, mentions, and updates
DESIGN: WebSocket connection with fallback to polling
CONTEXT: @workspace (existing Express.js app with Socket.io already installed)"

Use Progressive Disclosure

  1. Start with the idea and get alignment
  2. Drill into requirements together
  3. Explore design options
  4. Plan tasks collaboratively
  5. Execute implementation efficiently

Leverage Context Effectively

@workspacefor understanding the bigger picture
@folder for architectural context
@file for implementation details
Share your idea first, then provide relevant context

Red Flags That Indicate Skipped Phases

  • Vague requests - “Make it better” (missing idea)
  • Feature creep - Requirements keep expanding (unclear idea)
  • Over-engineering - Complex solutions for simple problems (poor design)
  • Rework cycles - Constant revisions (inadequate planning)

The Compound Benefits

Each phase informs and improves the next:

  • Clear idea → More precise requirements
  • Precise requirements → Better design choices
  • Better design → Cleaner task breakdown
  • Clean tasks → Efficient implementation
  • Efficient implementation → Less debugging and rework

This approach works for any agentic coding tool, not just Amazon Q. The key is treating the AI as a collaborative partner in the entire creative process, not just a code generator.

Example

requirements.md

Design.md

Task.md

Reference Link ==> https://catalog.workshops.aws/qadvanced/en-US/00-introduction

在大型国际银行的转型中,Core Banking system系统稳定但僵化,移动网银渠道却要求毫秒级响应与全天候在线。

架构设计 - 数据服务层

核心思想​:将散落在各个“烟囱式”系统(银行卡/信用卡支付、风控、保险等)的数据通过技术手段(CDC、日志解析)实时汇聚起来,构建统一、标准的数据模型,并通过 API 的方式透明地提供给前台应用。核心系统停机时,该数据层能提供​“Stand-In”应急服务——支持只读,甚至有限度的暂存式写入。

  • 读写分离:读操作快速由数据服务层响应,写操作依赖主系统保障强一致性;
  • 容灾能力提升:主系统故障时自动切换至 Stand-In 模式,关键服务仍可继续执行;
  • 真正渐进替代:业务逻辑可逐步迁移至服务层,最终实现核心现代化,不需一蹴而就。

主要机制说明:

  • 正常模式:
    • 所有读操作由数据服务层提供低延迟响应;
    • 写操作严格通过 Connector 等连接器进入Core Banking system系统,确保主记录一致性;
    • Core Banking system 通过 CDC(如 Debezium)捕获变更并发布至 Kafka,数据服务层实时消费、更新缓存/数据库,最终一致性得以保障。
  • 容灾模式:
    • Core Banking system不可用时,API 网关自动切换路由;
    • 写操作由轻量 Stand-In 服务代为接收,校验后写入本地“待处理交易”队列,并立即反馈客户“处理中”状态;
    • 主系统恢复后,后台任务自动逐笔回放交易,完成结算和Core Banking system同步处理。

治理、风险与项目管控:核心现代化控制塔

借鉴 OliverWyman 建议的 Core Modernization Control Tower,可为该架构增设治理层,关键职责包括  :

  • 跨职能治理机制:聚焦业务、运营、技术多方 alignment,确保宏观战略与技术路径一致;
  • 风险管理监督:对迁移过程中的操作风险、合规风险、系统风险进行持续审视;
  • 迁移节奏策略:统筹“hollow-out”业务削减主机依赖的节奏与业务模块迁移优先级;
  • 变更可视化与沟通机制:提供实时反馈与透明度,保障项目顺滑执行。

技术选型与数据架构策略

1. 流式同步与事件驱动

  • Debezium + Kafka:主流国际银行采用 Debezium 捕获 DB2 或主机日志,实时推送事件至 Kafka;这已是金融业标准方案  。

    2. 存储平台设计

  • Redis 集群:用于缓存极热数据,支撑毫秒级读性能;
  • TiDB / OceanBase:支持强一致性的分布式关系型存储;适用全量账户与交易数据场景。

    3. 数据架构策略

  • 结合 Data Mesh / Lakehouse 架构思路提升分析与共享能力;
  • 服务层接口应遵循 BIAN / Information Framework 等银行业标准,实现语义统一与模块化服务边界;增强系统的互操作性与标准合规性。

我们得到了什么?

  • 弹性与连续性的革命​:Stand-In模式将核心停机从“灾难”变为“可管理的服务降级”,极大提升了业务连续性。
  • 解耦开发能力:产品团队可绕开主机耦合,直接基于数据服务层构建灾备能力,实时风控等功能,交付加快;
  • 开放 API 驱动:支持开放银行、第三方金融机构接入,实现更灵活生态协同及合作创新,符合当前数字银行趋势。

Modern Core Banking and Wealth Platforms: Who’s Leading with Real Contracts (2019–2025)

Vendor (HQ) Best practice case (2019 → present) Advantage domain Example large banks / clients
Avaloq (Switzerland) Security Bank (Philippines) selected Avaloq RM Workplace to digitalize wealth management (Feb 2024). Avaloq also has multi-jurisdictional BPaaS / SaaS contracts and a notable Deutsche Bank wealth extension (contract extended to 2028). End-to-end wealth & private-banking BPaaS / SaaS; strong in front-office RM tooling and outsourced operations. Security Bank, Deutsche Bank (wealth units)
Temenos (Switzerland) Regions Bank (US) selected Temenos Banking Cloud to modernize customer records & deposits (announced 2023). ABN AMRO extended its Temenos Banking Cloud subscription in 2022. Large-scale, proven core-and-cloud SaaS platform for retail & corporate core modernization; strong partner ecosystem. Regions Bank (US), ABN AMRO (Netherlands), many global banks.
FNZ (UK) Aviva extended a long-term platform partnership with FNZ (15-year extension announced Jan 2024) and continues to roll out adviser and analytics capabilities. Wealth platform PaaS at scale — product distribution, adviser tooling, large AUM migrations and automation. Aviva (UK), UBS/Vanguard/large wealth managers via FNZ ecosystem.
Charles River / State Street (USA) T. Rowe Price expanded use of Charles River IMS (cloud) for portfolio management, trading and compliance (announced Apr 2024). Front & middle-office solution for asset managers: portfolio mgmt, trading, compliance, data integration (State Street Alpha). T. Rowe Price, Banorte (examples of regional rollouts).
nCino (USA / Salesforce) Large enterprise deployments (e.g., Bendigo & Adelaide Bank selected nCino 2023; U.S. Bank expanded nCino use in 2024) — strong traction in commercial lending, onboarding and CRM-adjacent functions. Lending & credit workflow automation, origination/onboarding, Salesforce-native deployments for enterprise banks. Bendigo & Adelaide Bank, U.S. Bank, many regional & enterprise banks.
Backbase (Netherlands) Backbase delivered enterprise digital banking platforms (MyState 2024) and launched AI-powered platform capabilities (2024–25 product announcements). Engagement / digital front-end platform with AI and composability for retail & wealth customer journeys. MyState, multiple retail banks modernizing digital channels.
Oracle FLEXCUBE (Oracle) FlexCube continues to be deployed for sizable banks and credit unions (examples include TISA / regional banks go-lives 2024–25); widely used at scale globally. Large universal-banking core with comprehensive modules, strong enterprise scale and OCI integration. Various large banks and credit unions worldwide (Oracle customer listings).
Feedzai (Portugal / USA) Centrale partnership with Banco BPI (Portugal, Aug 2025) using Digital Trust for real-time behavioral biometrics and transaction monitoring; also a hybrid deployment at a major North American retail bank that saved ~$30M over 3 years. AI-native financial crime prevention platform: real-time fraud & AML detection, behavioral biometrics, anomaly detection and RiskOps orchestration. Banco BPI (Portugal); an unnamed major North American retail bank (hybrid implementation)