1. 写在最前面
如果不熟悉某种开发语言,千万不要盲目自信的给出工期,否则你可能要为自己的乐观估计付出代价。
注:现在复盘开发中的问题,这种自己摸索的方式还是太低下了,还是应该更早的去请教同事们。
笔者付出的代价就是中午不吃饭 + 晚上加班排查。自己预估的工期,自己含泪也得完成不是......
2. 踩坑说明
笔者接到的需求是补充监控上报的指标,需要使用 proto 协议上报,在评估的时候,我是觉得这不应该很简单,生成 & 上报一下就可以。然而事实就是,被坑了两次。
2.1 TypeError: bad argument type for built-in operation
因为异常的时候只打印这个 「bad argument type for built-in operation」 报错,导致笔者分析了很长时间。但如果想打印出更多异常信息可以选择,增加打印,比如:
bash
print(e) # 打印错误信息
print(type(e)) # 打印错误类型
print(e.args) # 打印错误参数
print(e.with_traceback()) # 打印错误堆栈
2.2 论正确使用 proto
2.2.1 protobuf
python 生成的 proto 对应的文件是会动态依赖 protobuf 库,且库的版本必须要跟 proto 的文件的版本对应。笔者使用的基础组件,在遇到这种依赖高版本的 protobuf 但本地又不存在的情况时,代码会直接崩溃。
注:苍天呐,它就崩溃在一个八百年都没有人动过的地方。时间紧任务重的压迫感瞬间袭来。
举例说明:
- 生成的 protobuf 使用的 5.28.3
- 本地的 protobuf 是 5.28.2
- 然后,我连代码还没开发的时候,就在这个地方被这个崩溃卡主了......
2.2.2 protoc
上一个因为自己不懂的坑,终于被填完了,下一个又来。使用旧版本的 protoc
配合新版本的 protobuf
库可能会导致一些问题,具体取决于版本之间的变化。
产生这种不兼容的原因:
-
API 不兼容
- 新特性缺失 : 新版本的
protobuf
库可能引入了新特性或方法,而旧版本的protoc
生成的代码无法使用这些新特性。这可能导致运行时错误,特别是在尝试调用不存在的方法时。 - 方法签名变化 : 如果新版本的
protobuf
库中对某些方法的签名进行了更改,旧版本的生成代码可能无法正确调用这些方法,导致运行时异常。
- 新特性缺失 : 新版本的
注:论服务 & 协议能够前向兼容的重要性
-
序列化和反序列化问题
- 数据结构变化 : 如果新版本的
protobuf
库对数据结构进行了更改(例如,添加、删除或重命名字段),旧版本的protoc
生成的代码可能无法正确序列化或反序列化数据。这可能导致数据丢失或解析错误。 - 默认值变化 : 在某些情况下,新版本的
protobuf
库可能会改变默认值的处理方式,这可能影响数据的序列化和反序列化。
- 数据结构变化 : 如果新版本的
-
运行时错误
- 运行时异常 : 如果旧版本的
protoc
生成的代码与新版本的protobuf
库不兼容,可能会导致运行时错误,如AttributeError
或TypeError
。
- 运行时异常 : 如果旧版本的
-
兼容性问题
- 跨版本兼容性 : 如果你在项目中使用了多个不同版本的
protobuf
库,可能会导致兼容性问题。特别是在大型项目中,多个库可能依赖于不同版本的protobuf
,这可能导致冲突。
- 跨版本兼容性 : 如果你在项目中使用了多个不同版本的
3. 碎碎念
时隔多年,笔者又一次的进入了封闭开发的项目,真的是头大,不过好处是学东西的速度,简直飞快:
- 天下钱粮皆有定数,不支于国库,不取于内帑,那么从何而来?只能从黄草驿、岭南荔园榨取,从沿途附户身上征派。取之于民,用之于上,又谈何不劳一文?
- 不要为了适应世界而扭曲了自己。