写点什么

论程序员的为码之“道”

  • 2023-04-13
    广东
  • 本文字数:2274 字

    阅读完需:约 7 分钟

引子

我比较喜欢看历史剧,尤其是历史权谋剧。在《大明王朝 1566》这部剧的第一集,冯保因抢报祥瑞得罪秉笔太监们跪在雪地里差点冻死,大太监吕方在处理他时给犯了众怒的干儿子冯保,讲了文官们常说的一句话,做官要三思,“思危,思退,思变”。这位差点就夭折了的明星太监,可以说因为这 6 个字,再加上自身的聪明努力,最终成为大明太监的一把手,并与张居正密切配合促成了万历年间的张居正改革,在历史上大名鼎鼎。

作为一名程序员,或者叫“码农”,其实也是一个高危高压职业,一不小心说不定就要被杀了祭天(开个玩笑),尤其是在从事金融行业的程序员,一个不小心分分钟就能搞出天文数字的金融大事件。那常在河边走,怎么能保护自己,让自己的职业道路常青,立于不败之地呢?我觉得,为码之道,也是这六个字:“思危,思退,思变”。

思危

进入程序员这个行业,很多程序员都没有认真思考过这个工作的危险性;接到一个项目,很多程序员都没有认真思考这个项目是个什么样的项目,有什么坑,有什么故事;接到一个编码任务,不先思考这个程序如果有问题会产生多大的影响和后果;看到一个新技术,看了几个视频,写了几个 Demo,然后就大胆用起来。然后就是撸起袖子埋头干,给我一个键盘,我要征服世界,反正干就是了。

这是一种非常危险的做法,作为这个行业的从业者,要明白随着整个世界的数字化,计算机系统的失误所导致的后果会无限放大,而不会管错误是多么低级或者仅仅是一个不小心;你承接了一个项目,要先明白这个项目失败会有什么样的后果,也许你的老板、你的部门会因为这个项目失败而离开和解散,你的团队可能因为这个项目失败而不再存在;你负责了一个编码任务,需要先思考这个程序在整个系统中是什么样的位置,这段程序每天会处理多少的交易,这段程序如果有问题会产生多大的影响,这段程序可能有哪些严重的 bug 场景,结果是不是可以承受;你选择了一个新技术,有没有想过这个技术是不是自己 hold 住的,搞不定会怎样,有没有预案和备用手段。

我第一次大学毕业进入银行做 IT 开发的时候,其实特别紧张,一直在思考如果我的程序有问题导致银行的钱损失了会不会要我赔,会不会搞得我倾家荡产?现在看起来当然很幼稚,但是正是这种战战兢兢如履薄冰如临深渊的态度,让自己的职业生涯走得无限稳健,在我的手上没有发生过引发重大后果的问题。

思退

知道了危险就要避开危险。码农的世界充满陷阱,但是活还得干,不可能原地不动。那怎么个退法呢?

在这里引用部分行业大佬的讲法,我觉得有几个非常好的工作思想:

1、“防御性编码”

可以参考阿里大佬的文章《如何做好“防御性编码”?》https://developer.aliyun.com/article/909987?spm=a2c6h.14164896.0.0.199a43a7iDgsLy。类似于“防御性驾驶”对驾驶安全的重要性,防御性编码目的概括起来就一条:将代码质量问题消灭于萌芽。要做到“防御性编码”,就要求我们充分认识到代码质量的严肃性,也就是“一旦你觉得这个地方可能出问题,那基本它就会(在某个时刻)出问题”,相信墨菲定律。比在编码阶段找到缺陷更好的是在一开始就防止它们。防止缺陷应该是开发人员最优先考虑的。

2、向死而生,未思胜先思败,未思进先思退

未思胜先思败,才可以远祸;未思进先思退,才可以长久。一切事情仅有搞好两全的准备,才不会掉入进退两难的境地。一个优秀的架构师通常都是一个悲观主义者,除了设计好能够支撑业务持续发展的优雅架构,另一个容易被忽略的重要能力在于充分考虑失败场景。可以认真拜读字节跳动大佬王伟强的文章《向死而生:面向失败设计之道、术、技》https://mp.weixin.qq.com/s/a-RA9hP400qUjcdsXxjSbg。还有面向失败的设计-概述 https://developer.aliyun.com/article/726333

3、简单设计原则

世界的本质是简单,复杂包含了太多的错误。简洁到如同公式才能接近真理。Kent Beck 在《解析极限编程——拥抱变化》中为简单系统制定了 4 个评价标准,依次为(最重要的排在最前面):

— 通过所有测试;

— 体现所有意图;

— 避免重复;

— 类或者方法数量最少。

原理复杂,说易行难。知道这些标准并不等于说我们已经遵循了这些标准。开发人员并不是喜欢故弄玄虚的空谈家,实干家的精神使得他们视复杂为猛虎,却同时明白追求简单往往意味着设计力度上的百倍付出。

我们应当选择恰如其分的技术,能够清晰表达设计和揭示意图,用最少的元素实现易于理解、易于解释的设计和实现。避免过度设计,不为未来编程。

思变

日新月异,生生不息才是万事万物的本源。世间唯一不变的就是变化。

业务需求永远是越来越复杂多变,软件系统的设计不仅要考虑软件的功能,还要考虑软件的性能、可扩展性,模块间的耦合关系,系统的稳定、部署和更新,版本的管理,系统的安全,界面的友好程度。想要利于不败之地,就要给自己多准备几把刷子,升级自己的武器。

IT 技术日新月异飞速发展,本质上都是系统封闭复杂度,提升效率,如新的编程语言、新的框架、云原生、新的中间件等等。认真选择解决方案,不断提升自身技能,手上有金刚钻,才能揽瓷器活。

不断升级自己手上的辅助工具,成熟的代码库、成熟的检查工具、流程化自动化的平台和质量保障体系。兵马未动,粮草先行,这些就像后勤保障体系,让你少犯错误,少走弯路。

除了技能、工具,还有思想。领域驱动设计,软件核心复杂性应对之道。从思想上充分理解软件系统的本质,能让你在工作中面对问题真正实现降维打击,运筹帷幄,决胜千里之外。

结语

常怀敬畏之心,敬畏代码,敬畏生产。码生不易,且行且珍惜。

发布于: 刚刚阅读数: 5
用户头像

还未添加个人签名 2018-03-14 加入

技术爱好者

评论

发布
暂无评论
论程序员的为码之“道”_酱紫的小白兔_InfoQ写作社区