37DATA

孙子兵法与编程开发

  • 自序

  • 一、先胜后战

  • 二、总有些事不可强求

  • 三、先避害后趋利

  • 四、集中优势兵力打歼灭战

  • 五、99%的准备都是白准备

  • 六、走弯路也是走路的一部分

  • 七、凡事都有代价

  • 后记

自序

近期重温了一下孙子兵法,又有了一些新的收获。有句话我觉得说的很对,“人在不同时期,看同一本书会有不同的感悟”。

这一篇分享,核心并不是对于某一项技术的深入研究,而是把孙子兵法的阅后感,结合工作中的开发场景,分享一些我的思考。若有不对之处,万望指正。

一、先胜后战

《孙子兵法》开篇就是讲“计”,但是这里的“计”并非计谋,而是计算。很多人会把《孙子兵法》与《三十六计》并列,实际上前者的“计”讲的是计算,后者讲的是“奇谋巧计”。因此可以理解为,《孙子兵法》强调的是基本面,是讲实力决胜。

在编程开发中,“先胜后战”是通过对任务的拆解、分析,与自身能力计算比较,可以知道有没有“胜算”;有“胜算”了就可以开始行动,没“胜算”则需要积累条件。

难道自身能力不能满足当前开发任务的需要,就可以不做?

实际情况并非如此,积累条件,可以是自身技术能力的匹配,也可以借用外力,例如:

1、内部成员的协助;

2、业内成熟的解决方案;

3、外部采购回来的符合需求的产品。

作为一名开发人员,在真正动手去开发和完成一项任务的时候,不要马上动手,要先把任务计算清楚,算清楚了再做,算不清楚先别动手。

二、总有些事不可强求

孙子曰,“胜可知,而不可为。”这句话的意思是,先规划自己,然后知道什么时机可以克敌制胜,时机不到不可强求。

我们可能会碰到无法通过现有方案解决的技术难题,甚至在业内也找不到成熟的解决方案的情况。这也就是“不可胜”的情况,这时候既不可胜,也不可强求,那能怎么办?

1、不办。不办并不是不作为,而是客观条件不满足,那就要回归到需求本身,这样的需求是否合理?

2、等待。先前听过公司一名大咖导师的分享,他说“只要能活到明天,今天的问题可能就不再是问题”。作为一名开发人员,同样是感同身受的,想想之前的Clickhouse对于大批量更新操作就能把数据库搞崩,咬咬牙控制更新节奏,以降低实时性来迁就这个技术瓶颈;现如今Hologres逐步在替代Clickhouse,不正是最好的印证吗?

三、先避害后趋利

孙子曰,“故不能尽知用兵之害者,则不能尽知用兵之利也。”这里强调的是一个先后顺序,要先知害,才能知利。

作为一名开发人员,大至开发一个项目,小至开发一个需求,如何尽知其中利害是极其重要的事情。

李嘉诚说过“做任何事先考虑失败”,先考虑失败,要把所有失败的可能性罗列出来。

 有时候我们会有侥幸心理,觉得不用考虑那么细,有一些地方是比较熟悉的模块了,发布的时候这一块不需要检查。最终问题往往就出在那个地方。

“这个项目绝对没有BUG。”应该没有哪个程序员能够拍着胸脯说出这句话。

雷军在2022年度演讲,对于他个人经历的总结,其中有一句话使我印象颇深。

“软件工程没有银子弹,可能出错的地方,一定会出错。”

 雷军也是技术出身,我相信这句话背后是无数的损失和代价。啊多么痛的领悟。

四、集中优势兵力打歼灭战

《孙子兵法》当中,对于分兵作战做过专门的阐述:

“十则围之,五则攻之,倍则分之。”简单理解这句话的意思就是,十倍于敌人的兵力可以围困使其投降或全歼敌军,五倍于敌人的兵力可以强攻,两倍于敌人的兵力可以逼对方分兵然后进行歼灭。

我们处理一个大项目,或者处理海量数据的时候,就如同面对一个一口吃不下的敌人。这时候,可以将其切分,再切分,直到可以逐一解决为止。

当然,做项目和处理数据本质上还是不同,这里只是类比分兵策略,核心思想是如何集中我们自身的优势兵力,把一个庞然大物分解成一个一个能够单独处理的单元,进而逐渐蚕食,达成最终目标。

五、99%的准备都是白准备

孙子曰,“以虞待不虞者胜。”这里的“虞”是预料、防备、准备的意思,简单理解为做了充足准备的应对没有做好准备的,自然能够胜利。

春秋时吴楚交战,两军对峙,雨下了十天十夜,楚军左史倚相对大将子期说:“这么恶劣的天气,吴军肯定认为我们没有防备,一定会来偷袭,不如备之。”于是列好阵势等着,果然吴军来了,眼看占不到便宜,转头便撤退了。

这个历史案例当中,吴军可能来也可能不来,这个“以防万一”的做法,如果不做,那么下场可能就是毫无准备之下被一击而溃了。

由此可见,我们在开发当中,要把能做的防范于未然的准备,尽可能都准备好。

例如在发布代码的时候,可以先把回滚方案的执行流程代码先写好,顺利则皆大欢喜,出错则快速回滚;

例如在执行修改sql语句的时候,先备份后修改,把还原的sql也先准备好了,有备无患;

例如在制定方案的时候,拿出至少两个解决方案,尽可能覆盖所有可能性,更利于项目最终选型到时候能锚在最合理的解决方案上。

宁愿白准备,也不要毫无准备败得一塌糊涂。

六、走弯路也是走路的一部分

孙子曰,“以迂为直。”在战争当中,表面上需要迂回的弯路,实际上是最便利的直路,因为直路上有地形、敌形,走直线过不去。

技术的成长之路,本来就是弯弯曲曲,进进退退,没有一帆风顺的。我们要摆正心态,在进行新技术探索时,总会走一些弯路,弯路也是路,有时候不走弯路就无路可走,重要的是能够从中汲取到哪些经验,使自己成长。

放之于组织,同样也是如此,组织势必要通过不断地改革以适应最新的潮流,这个过程总是要走弯路、试错,最终找到抵达阶段目标的“直路”。

七、凡事都有代价

孙子曰,“地有所不争。”这句话的意思是,有些地方虽可争而不争。那是因为争了,得到的可能还没损失的多。

汉武帝,演绎了主骄民疲的一生,“犯我强汉者,虽远必诛。”从政府到民间,全部破产,差点亡国。

晚年下轮台罪已昭,批评自己“朕即位以来,所为狂悖,使天下愁苦,不可追悔。”

万事都有代价,所以我们在做一个事情的时候,要能够评估所得所失,再行决策。

放之开发工作,修改一个脚本、更改一条数据、改变一个ip白名单等等,不管事情看起来多小,它都有代价,如果我们不能在行动之前评估代价有多大,那么我们所做的决策就是不科学的,最终带来的结果只能是自己承担。

这也就是为什么,成熟的开发者有时候调侃“能运行的就不用轻易动它”,并不是说以他的能力无法进行重构,而是重构的代价是否能够承受?

当然,我并不是说所有正在平稳运行的脚本和功能都尽量不要重构,只是强调要明晰其代价,方能从容地进行重构与否罢了。

后记

孙子曰,“善战者,无智名,无勇功。”

真正的战略,真正的胜战,看上去往往平淡无奇,是没有什么故事的。因为先胜后战,以强胜弱,没有噱头。

希望大家能从《孙子兵法》当中得到收获,进而提升自己和组织的战斗力,成为“平平无奇”的常胜将军。