我的开发哲学:
关于新项目与 C++ 开发实践
新项目肯定不使用 C++ 起了。但是如果要用 C++ 的话,即使是跨平台开发,也要使用 VS2022 创建 vcxproj、sln,微调 Debug、Release 的各种参数,确保 Debug 好使,Release 优化全开,一定要开启 /LTCG
。然后再手写 makefile 提供对 gcc 的支持。确保使用 VS2022 能正常编译 EXE,然后用 WSL 能用 make 命令生成 ELF。严格坚持 hpp
提供接口,cpp
提供实现,并且自定义自己的异常类型。所有函数文档明确描述我会抛出什么样的异常。
clang?垃圾玩意儿,它的优化功能都是表演型优化,它检测 main()
的符号,对 main()
里面的裸的代码有强烈的优化,但是对正常的开发,它生成的代码质量真的没眼看,拿反编译工具一看,连四个浮点数构成的结构体要用向量化指令集去优化都不会。
针对 ARM 的 NEON 的向量化优化,clang 同样被 gcc 吊打。
坚决抵制 CMAKE 这反人类的垃圾玩意儿。你知道如何设置 CMAKE 针对 Windows MSVC 的优化命令,可是普遍的开源库的伪人贡献者都不知道。CMAKE 生成的 vcxproj
还要按 x86、x64、ARM 三个平台分别生成,而且所有的参数写死,完全不使用工程宏。大脑停留在了 2010 年。
团队开发
团队开发坚决划清界限,我提供我的 API 和文档,你只能用我提供的 API,不能把我的代码的内部私有部分拿来用。坚决按照版本号管理 API 的变动。
团队开发的项目要合理使用 Rust 的防伪人功能。但是 Rustaceans 也是伪人多多。所以正确的做法是拉一个水平靠谱的非 Rust 人,教他用 Rust,然后让他参与开发。
如何使用 Rust
新项目如果使用 Rust,不要去浪费那个脑筋去想着一遍写出能编译的代码。Rust 的设计者就是在把开发者当作不带脑子的潦草伪人,用语法规则去约束伪人的行为。那我也干脆就不带脑子了,写一句就编译一下看看。但是底线依然要有,坚持正经的版本管理和 API 管理,坚持正确的需求:该跨平台跨平台,该平台绑定就平台绑定。该 unsafe 就 unsafe,该提供 unsafe API 就提供 unsafe API,要不然作者提供 unsafe 是干什么吃的。
Rust clippy 不过是一层遮羞布。
如何使用 C井
仅使用代码生成器去写 C#,不亲自下海写 C#。除非被逼的,否则不碰 C#。主要是这个语言没有明显让我觉得用起来方便的地方,方便程度不如 Python,但是编译成的 EXE 又是要用 JIT 跑的伪指令,整个一坨就像 Java。在跨平台方面基本上只保留了「语言」本身。WinForm 的界面编辑器又不是那么好使,手动改一下界面初始化的代码,它就罢工。性能上不是很突出,但是又有 GC 保底又弥补了这一点,不怕碎片化的内存,GC 会把内存整理成一坨。然后也有 Marshal 用于处理池外代码和数据的交互。虽然也是用 VS2022 开发,但是个人感觉写起来显然没有 C++ 舒服,限制太多。
主要是 C# 的开发者里也会有伪人非要在池子里固定一个对象不准挪动。这就很伪人了。
STM32 嵌入式的开发
STM32CubeMX 生成的 HAL 库和 C 代码,再屎也要吃下去,不要负隅顽抗。
编译器效果检查
任何编译成 Native CPU 指令的编程语言,编译后必须使用反编译引擎过一遍,检查编译器是否正确生成了代码或者正确实现了优化。
对汇编语言的使用
针对 CISC 指令集,一定要把徒手写出能正常运行、符合常规调用约定的汇编指令的技能树点亮,要能看懂汇编代码。但是并不意味着就一定要手写汇编,绝大多数情况下避免任何的手写汇编。
对 SIMD 的使用
自己写 SIMD 的时候一定要测实际的性能,其实正常是不需要亲自写 SIMD 的,除非需要进行一个表演型优化。
对 GPU 的使用
对于 GPU 方面,OpenGL 性能和逻辑都足够,DirectX 能不碰就不碰,毕竟 COM 屎山。Vulkan 只对集成显卡有明显帮助,对独立显卡是一种负优化。用好 OpenGL 的 MultiDrawIndirect 功能,针对显存的数据只做增量更新。
Vulkan 感觉就像是要 CPU 去远程操作 GPU 上的外设、内存、总线,就像开发单片机固件一样,却缺乏 ISR,只能用 fence。
对 Web 前端以及微信小程序的开发
前端开发是苦力活,需要安装一万个各种各样的浏览器,阅读一万个各种各样的浏览器规范,写一万个 CSS。不如临时雇佣 20 岁的廉价年轻人劳动力干这个活。但是自己必须要审阅年轻人拉的屎。
如果要写 WASM 的屎,必须要经过我的审查。
对高强度体力活后端服务器的开发
Java 程序员是甲骨文公司一手培训起来的廉价劳动力,写 Java 的人甚至连他们的开发环境都要被甲骨文公司剥削一笔。如果有大体力活需求,那就雇佣一万个廉价的 Java 程序员。
切记数据库的设计得充分考虑数据库的索引方式和对于业务变动的留坑。这些搞 Java 的一般不太懂这些,因此要自己亲自设计数据库,提供文档,别让他们瞎整。但是如果有人能提出优化意见,那这个人可以晋级了呀,下次带他干一些更有挑战性的工作,多给点工资。
对开发者的原则性问题的判定
开除所有的使用生成式 AI 的程序员。不晓得查阅官方规范文档,API 文档的人,不配进行开发。
对实际的物理硬件的认知
FPGA 是必须点亮的一条科技树。了解外设 IP 是怎么做的,通讯是怎么通的,高频是怎么高的,外置 SRAM 是如何时序的,片内 cache 是如何利用的,这些东西是最基础的知识,只有了解了这些东西,才能了解到 CPU 是怎么做到进程间隔离,内核与用户态隔离,怎样做到高效率的计算,了解真正的物理瓶颈。