1
1
+++
2
2
title = " 那些年,我从微信支付学到的东西"
3
3
date = 2023-04-06T18:31:00-07:00
4
- lastmod = 2023-05-20T08:36:01-07 :00
4
+ lastmod = 2024-12-30T20:44:04-08 :00
5
5
tags = [" summary" ]
6
6
categories = [" summary" ]
7
7
draft = false
8
8
toc = true
9
9
ShowToc = true
10
+ highlighted = true
10
11
+++
11
12
12
13
## <span class =" section-num " >1</span > 前言 {#前言}
@@ -19,7 +20,8 @@ ShowToc = true
19
20
20
21
如果沉下心思考,就会发现,这些资产价值并不大,对于工程师而言,也没有领导想象中的那么重要,除非我们试图将代码放在黑市售卖。
21
22
22
- 对于业务开发而言,也可能是同样的道理。业务开发每天对着业务需求做CRUD,可能会羡慕开发底层组件的工程师,可以学习并提升技术水平,而自己技术水平还是在原地打转,能学习到的东西随着时间的推移,越来越少。
23
+ 对于业务开发而言,也可能是同样的道理。
24
+ 业务开发每天对着业务需求做CRUD,可能会羡慕开发底层组件的工程师,可以学习并提升技术水平,而自己技术水平还是在原地打转,能学习到的东西随着时间的推移,越来越少。
23
25
24
26
王安石的《游褒禅山记》有这样的感叹:
25
27
@@ -32,13 +34,16 @@ ShowToc = true
32
34
33
35
### <span class =" section-num " >1.1</span > 鱼与渔 {#鱼与渔}
34
36
35
- 文档,代码,设计都是针对特定问题的解决方案,如果离职到新公司之后,我们遇到的问题肯定不会完全一样,或者手头可用的工具不一样,那么这些资产的价值就会打折扣。
37
+ 文档,代码,设计都是针对特定问题的解决方案,
38
+ 如果离职到新公司之后,我们遇到的问题肯定不会完全一样,或者手头可用的工具不一样,那么这些资产的价值就会打折扣。
36
39
37
- 更何况这些资产都是「一次性的」,用完即止;是属于「授人以鱼不如授人以渔」中的「鱼」;是「生产线」上的「成品」,而我对能生产「成品」的「生产线」更感兴趣。
40
+ 更何况这些资产都是「一次性的」,用完即止;
41
+ 是属于「授人以鱼不如授人以渔」中的「鱼」;是「生产线」上的「成品」,而我对能生产「成品」的「生产线」更感兴趣。
38
42
39
43
二战结束以后,美国把1600多名德国科学家、工程师、技术人员带到美国,包括沃纳.冯.布劳恩和他的V-2火箭研究团队;
40
44
41
- 而苏联凭借地理位置靠近德国占领了一些重要的工厂,比如著名的德国光学巨头卡尔蔡司公司,苏联几乎搬空了该公司的设备,把1万多台设备中的9000多台都搬到了苏联。
45
+ 而苏联凭借地理位置靠近德国占领了一些重要的工厂,
46
+ 比如著名的德国光学巨头卡尔蔡司公司,苏联几乎搬空了该公司的设备,把1万多台设备中的9000多台都搬到了苏联。
42
47
43
48
有人对现成的「鱼」感兴趣,也有人对未来的「渔」感兴趣,我属于后者。
44
49
@@ -51,15 +56,17 @@ ShowToc = true
51
56
52
57
> 见贤思齐焉,见不贤而内自省也
53
58
54
- 见到那些优秀的实践和思路,就学下来;对于有弊端的实践,就要分析弊端形成的原因,再想办法避免和改进,别人掉进去的坑,我们就不要进去凑热闹了。
59
+ 见到那些优秀的实践和思路,就学下来;
60
+ 对于有弊端的实践,就要分析弊端形成的原因,再想办法避免和改进,别人掉进去的坑,我们就不要进去凑热闹了。
55
61
56
62
57
63
## <span class =" section-num " >3</span > 贤 {#贤}
58
64
59
65
60
66
### <span class =" section-num " >3.1</span > 模式化 {#模式化}
61
67
62
- 1994年,4个博士合著了一本书,书中对常见的设计问题进行了分类,归纳与总结,并且针对每一类问题,给出可重用的解决方案。他们将这些可以复用的解决方案,称之为设计模式(design pattern)。
68
+ 1994年,4个博士合著了一本书,书中对常见的设计问题进行了分类,归纳与总结,并且针对每一类问题,给出可重用的解决方案。
69
+ 他们将这些可以复用的解决方案,称之为设计模式(design pattern)。
63
70
64
71
这本书也成为软件工程和面向对象设计经久不衰的经典。
65
72
@@ -78,32 +85,39 @@ Elements of Reusable Object-Oriented Software),这四位博士也被称为Gang
78
85
79
86
针对此类重复问题,直接复制代码来解决,是下下策。
80
87
81
- 对代码进行抽象,复用代码来解决重复问题,也是下策。因为使用公共库会导致代码之间无法隔离,并且把逻辑隐藏在公共库,会导致无法分析代码的调用关系。
88
+ 对代码进行抽象,复用代码来解决重复问题,也是下策。
89
+ 因为使用公共库会导致代码之间无法隔离,并且把逻辑隐藏在公共库,会导致无法分析代码的调用关系。
82
90
83
- 微信支付研发理念推崇的上策是对问题进行抽象,归纳出这类问题的通用解法,即模式;更进一步的是,为模式定义对应的代码模板,直接生成代码。
91
+ 微信支付研发理念推崇的上策是对问题进行抽象,归纳出这类问题的通用解法,即模式;
92
+ 更进一步的是,为模式定义对应的代码模板,直接生成代码。
84
93
85
94
即使不生成代码,也可以将模式实现成对应的组件或库,方便直接调用。
86
95
87
96
具体例子如:
88
97
89
- 微信支付就总结常见的分布式事务场景,设计和开发了分布式事务编排中间件。通过在画板编排事务资源,即可生成对应的代码模板,开发者只需要在指定的地方编写个性化代码即可。
98
+ 微信支付就总结常见的分布式事务场景,设计和开发了分布式事务编排中间件。
99
+ 通过在画板编排事务资源,即可生成对应的代码模板,开发者只需要在指定的地方编写个性化代码即可。
90
100
91
- 针对常见的领域服务,抽象了基于状态机和事件驱动的模型,设计了领域服务的代码生成组件。可通过绘制状态机UML图,直接生成接口代码,由开发者填充实现。
101
+ 针对常见的领域服务,抽象了基于状态机和事件驱动的模型,设计了领域服务的代码生成组件。
102
+ 可通过绘制状态机UML图,直接生成接口代码,由开发者填充实现。
92
103
93
104
以上算是技术组件的模式化,对业务开发而言,还有对业务的模式化。
94
105
95
106
比如对扣款模式进行抽象,扣款时开启事务,进行风控校验,创建(或不创建)业务单,查询支付方式,轮询支付方式进行扣款,异常关单等。
96
107
97
- 当时组里的大神龙哥,就是对已有的扣款模式进行了抽象,基于面向对象,设计成同步扣款框架,定义了以上的接口,由业务进行继承和扩展。再使用同步扣款框架对已有的3个类似但不完全一致的代扣扣款业务进行了重构,把扣款模式都统一了。
108
+ 当时组里的大神龙哥,就是对已有的扣款模式进行了抽象,基于面向对象,设计成同步扣款框架,定义了以上的接口,由业务进行继承和扩展。
109
+ 再使用同步扣款框架对已有的3个类似但不完全一致的代扣扣款业务进行了重构,把扣款模式都统一了。
98
110
99
111
100
112
### <span class =" section-num " >3.2</span > 复盘 {#复盘}
101
113
102
- 没有人能保证自己写的代码绝对不会出错,当错误与问题不期而至的时候,我们能做的就是将「错误」的效益最大化,即从「错误」中吸引教训,做到「不二过」。
114
+ 没有人能保证自己写的代码绝对不会出错,当错误与问题不期而至的时候,我们能做的就是将「错误」的效益最大化,
115
+ 即从「错误」中吸引教训,做到「不二过」。
103
116
104
117
复盘,就是在「错误」中吸引教训,做到「不二过」的手段。Amazon 也有类似的概念与机制,称为 Correctness Of Error(COE)
105
118
106
- 我们一直说「失败是成功之母」,但根据生物学常识,只有「成功才是成功之母」,或者说「小步的成功才是大步成功之母」,别人踩过的坑,我们就不要进去了。
119
+ 我们一直说「失败是成功之母」,
120
+ 但根据生物学常识,只有「成功才是成功之母」,或者说「小步的成功才是大步成功之母」,别人踩过的坑,我们就不要进去了。
107
121
108
122
复盘的一般步骤:
109
123
@@ -123,7 +137,8 @@ Elements of Reusable Object-Oriented Software),这四位博士也被称为Gang
123
137
124
138
微信支付一直在推广全栈工程师,认为只从自己做的事情来思考问题,容易导致盲维和短板,看待问题的眼光容易受限。
125
139
126
- 此外,根据《人月神话》的理念,工程师之间的沟通成本,会随着人数的增加,呈指数水平上涨。而成为全栈工程师,可以一个人处理完需求,沟通成本就下降到0,极大地提交工作效率。
140
+ 此外,根据《人月神话》的理念,工程师之间的沟通成本,会随着人数的增加,呈指数水平上涨。
141
+ 而成为全栈工程师,可以一个人处理完需求,沟通成本就下降到0,极大地提交工作效率。
127
142
128
143
微信支付的全栈工程师定义是前端工程师 + 服务端工程师 + 数据开发工程师。
129
144
@@ -183,7 +198,7 @@ Elements of Reusable Object-Oriented Software),这四位博士也被称为Gang
183
198
提问题是为了帮助组织发现问题,如果不能吐槽的话,很多问题也不会被发现,自然也得不到解决,毕竟也没有人喜欢帮别人的问题提解决方案。
184
199
185
200
---
186
- <span class =" timestamp-wrapper " ><span class =" timestamp " >< ; 2023-05-20 六 > ; </span ></span >
201
+ <span class =" timestamp-wrapper " ><span class =" timestamp " >< ; 2023-05-20 Sat > ; </span ></span >
187
202
188
203
针对如何高效交流,我写了一篇自己的心得文章:[ 软件工程师的软技能指北(三):高效交流篇] ( https://ramsayleung.github.io/zh/post/2023/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B%E5%B8%88%E7%9A%84%E8%BD%AF%E6%8A%80%E8%83%BD%E6%8C%87%E5%8C%97_%E9%AB%98%E6%95%88%E4%BA%A4%E6%B5%81%E7%AF%873/ )
189
204
@@ -192,7 +207,8 @@ Elements of Reusable Object-Oriented Software),这四位博士也被称为Gang
192
207
193
208
领导总说,软件工程的本质就是管理和控制复杂度,而一致性就是减少复杂度的有力工具。所谓的一致性,可以理解成统一的流程,统一的组件等等
194
209
195
- 在这种理念的驱动下,微信支付内部使用统一的编程语言,统一的工具库,统一的存储组件(使用别的存储需要特殊审批和说明),统一的数据访问组件,使用统一的研发流程。
210
+ 在这种理念的驱动下,微信支付内部使用统一的编程语言,统一的工具库,
211
+ 统一的存储组件(使用别的存储需要特殊审批和说明),统一的数据访问组件,使用统一的研发流程。
196
212
197
213
保证每个研发工程师,即使调到微信支付的其他团队,也是使用同样的工具,即插即用,和车床生产的螺丝一样。
198
214
0 commit comments