应用于软件开发的孙子兵法
已发表: 2022-03-11如果您在软件行业工作,您可能听说过分而治之的设计范式,它基本上包括将一个问题递归地拆分为两个或多个子问题( divide ),直到这些变得简单到可以直接解决(征服)。
您可能不知道的是,这种范式源自一种古老的政治策略(该名称源自拉丁语中的divide et impera ),该策略表明可以通过鼓励下属或臣民之间的异议来维持对他们的控制。
这种策略在历史上被无数的政治家和军事领导人使用过,例如朱利叶斯·凯撒(他在高卢战争期间使用它来击败军事强大的高卢人)和拿破仑(法国炮兵专家会分裂敌军,因此没有哪个部分更强大比他自己的部队,然后破坏他们的通讯,阻碍敌人协调和执行攻击的努力)。
战争的艺术:应用于发展的古老原则
然而,分而治之的规则并不是唯一可以应用于软件开发的政治策略。 虽然政治和战争与软件开发关系不大,但就像政治家和将军一样,开发人员必须领导下属,协调团队之间的努力,找到解决问题的最佳策略,并管理资源。
《孙子兵法》是公元前五世纪的古代军事论着,出自中国古代军事家孙子之手,其理论对东西方哲学产生了深远的影响。
尽管年代久远,但它仍然被列入东亚许多军事学校的教学大纲,并被西方一些军事院校列为推荐读物。 本书分为 13 章,每一章专门讨论战争的不同方面。
然而,除了战争之外,孙子的原则和教义在政治、商业、体育以及软件开发(信不信由你)中也有实际应用。 事实上,你可能只是在日常生活中应用其中一些原则,甚至不知道它们的起源。
下面详细介绍,您将找到《孙子兵法》中解释的基本战术和技巧的简要列表。 它们可能适用于您在软件行业或许多其他行业中的工作。
时间在任何活动中都至关重要
第二章第 2 款
实战时,若胜利遥遥无期,则人的兵器迟钝,热情消退。
这个原则可以应用于软件开发,作为描述开发周期长度与开发人员士气之间关系的规则。
如果一组开发人员在同一个项目上工作了几个月,没有明确的目标或结束,他们可能会感到沮丧,他们的生产力可能会下降。
软件开发是一项智力活动,因此动机是生产力的主要燃料。 每天工作而没有意识到你的工作正在产生真正的结果可能会非常令人沮丧。
正如一些敏捷方法论所指出的,开发路线图应该分为几个目标和里程碑,团队可能能够在短时间内实现这些目标和里程碑,它们会给他们一种进步和成就感。
第二章第 18 段
那么,在战争中,让你的伟大目标是胜利,而不是漫长的战役。
这句话可以用两种方式解释:
首先,它可以被视为 UNIX 哲学的先驱:编写只做一件事并做好的程序。 开发软件时,必须始终牢记程序的主要目标、程序提供的关键功能或解决的最大问题,并确保正确实施。
有时您可能会受到启发并想到要添加一个非常酷的功能,但不要忘记具有许多不常用功能的应用程序有一个贬义的名称:膨胀软件。
其次,该声明也可以被视为精益软件开发原则之一的先驱:尽可能快地交付。
您越早交付没有重大缺陷的软件,您就越早从客户那里获得反馈,并且您将能够将更改合并到下一次迭代中。
另一方面,如果您交付的软件无法正常工作,您将错过宝贵的反馈,因为客户将没有机会对其进行正确测试。 在您的下一次迭代取决于客户反馈的情况下,这将使下一阶段的开发更加困难或不可能。
没有领导,没有结果
第三章第 11 段
现在将军是国家的堡垒; 壁垒全,国强; 如果堡垒有缺陷,国家就会软弱。
这句话描述了经理在开发团队中的重要性:一个项目的成功取决于所有相关人员的力量,而经理是项目的堡垒。 责任从高层开始。
尽管开发人员经常单独工作(每个人都坐在电脑后面,与同事的交流有限),但这并不意味着他们不需要良好的领导力。 项目经理负责使团队保持正常运转,确保有效的沟通和争议解决,而领导者显然会定义项目的优先级(以及其他任务),因此不应低估他们的作用。 如果出现问题,他们也不应承担责任。 想象一下,如果一个军事领导人的部队未能在战场上履行职责,会发生什么?
一个团队即使在开发职位上有几个坏苹果,也可以生产出出色的软件,但如果项目经理是坏苹果,无论团队有多少摇滚明星开发人员,这都不太可能发生。
第六章第 28 段
不要重复使你获得一次胜利的策略,而要让你的方法受制于无限多变的情况。
有时,在开始一个项目时,很想使用我们在以前成功的项目中使用的相同技术集(相同的编程语言、相同的库、相同的服务器等)。 但是,除非新项目的要求与以前的要求完全相同,否则这可能是错误的方法。
在编程中,就像在大多数领域一样,灵丹妙药(一种能够治愈所有疾病的假设疗法)并不存在。 没有一种单一的技术组合可以用来解决所有问题。 每种技术都有其优点和缺点。
当然,学习一门新的编程语言或使用未知的 API 一开始可能会很昂贵,但从长远来看,软件的质量会更好,你会成为更好的开发人员。
第十三章第 27 段
因此,只有开明的君主和明智的将军才会利用军队的最高智慧进行间谍活动,从而取得巨大的成就。 间谍是战争中最重要的元素,因为他们取决于军队的行动能力。
这句话可以解释为在维护阶段使用监控工具和日志库的重要性。
尽管有时客户可能不这么认为,但当您获得稳定且经过全面测试的版本时,开发并没有结束。 软件总是在不断发展,无论是通过修复错误、添加新功能还是提高效率。
没有比让间谍在生产环境中监视软件、检查哪些功能使用最多、最常见的错误和最长的操作更能了解要进行哪些更改的信息来源了。

错误报告、日志条目和使用数据是检测错误、识别瓶颈和其他问题的基础,因为在受控测试环境中并不总是能够重现相同的条件。
团队合作和动机
第十章第 24 段
进而不求名,退而不避罪,以保民侍君为目的,人为国宝。
基本上,这就是中国古代版的“团队中没有我” 。 与他人合作比追求个人利益更重要。
软件开发是一项复杂的活动,需要开发人员作为一个团队有效地工作。 一个好的开发人员不是修复最多的错误、实现最多的功能或提前完成任务的人; 优秀的开发人员是帮助团队实现目标的人。
为你所做的一切声称功劳,不承认自己的错误或责备他人,或者称自己为代码忍者,可能会愚弄一些没有经验的经理,甚至可能会加薪,但你会成为团队中适得其反的成员。
第七章第 21 段
在你采取行动之前要深思熟虑。
这句话表明了团队开发会议的重要性,例如敏捷方法提出的那些会议。
在团队中工作时,重要的是在实施之前讨论任何重大变化。 无论您是团队负责人,还是对该主题最有经验的人,您都应该始终与团队的其他成员交谈,或者至少通知他们。
请记住,其他开发人员可以让您深入了解软件的不熟悉部分。 这意味着他们可以比预期更快地开始实施更改,因为他们可以完全了解所述更改的影响。
第十章第 25 段
视你的士兵为你的孩子,他们会跟随你进入最深的山谷; 视他们为自己心爱的儿子,他们会站在你身边直到死。
这句话表明了激励的重要性,这是管理者和团队领导有时会忘记的管理原则。 有动力的开发人员会编写更好的代码、更快地工作、更少的错误并更愿意投入额外的时间。
管理者必须通过对下属真正感兴趣、倾听他们的意见、关心他们的工作与生活平衡、建立积极的工作环境和关心他们的职业道路来产生动力。
此外,您不应将动机与报酬混淆。 最近的研究表明,金钱并不能激励大多数工人,金钱主要有助于吸引和留住员工,但不能让他们对工作感到满意。 因此,加薪和晋升不应被视为激励工具。
外箱思考
第五章第 7、8 和 9 段
音符不超过五个,但这五个音符的组合产生的旋律比以往任何时候都多。
原色不超过五种,但它们结合起来产生的色调比以往任何时候都多。
基本口味不超过五种,但它们的组合产生的味道比以往任何时候都多。
编程的好处之一是可能性是无穷无尽的。 您基本上可以在任何您想要的地方进行开发(至少,只要不是 NP 完全问题)。
移动应用程序、网站、游戏、桌面应用程序……如果您了解编程,所有这些都触手可及。
第三章第 1 款
在实际的兵法中,最好的办法是把敌人的国家完整而完整; 粉碎和摧毁它并不是那么好。 所以,俘虏整支军队也比摧毁它好,俘获一个团、一个支队或一个连,总比摧毁它们好。
在处理具有大型代码库的项目时,通常会发现使用不良做法或使用已弃用的库实现的模块或代码部分。 尽管擦除(或销毁)此代码可能很诱人,但出于以下几个原因,它可能不是最好的主意:
遗留代码不一定是坏的,有时它是在考虑其他方法和技术时编写的好代码。 但是,仅仅因为它是旧的并不意味着它不起作用。
您可能会浪费时间修复仍然有效的代码,而不是专注于修复其他更关键的代码部分。
除非您真的确定自己在做什么,否则替换一段有效的代码意味着您有引入新错误或错误的风险。
这并不意味着“如果它没有坏,就不要修复它”这句话是一个好策略,而是每个项目都有优先级、目标和时间限制。 因此,如果您发现可以改进的代码,请与团队其他成员或项目经理讨论,以确定何时进行优化。
第八章第 3 段
有路不可走,军队不可攻,城不可围,阵地不可争,君命不可听。
即使它没有直接说出来,我们也可以将此原则解释为避免反模式的警告。
尽管使用反模式可能会解决短期问题,但您应该记住,从长远来看,它会适得其反。 因此,无论您节省了多少时间,修复了多少错误或对您来说有多方便,都不要使用它们。
尽管如此,有时您可能会想使用反模式来解决紧急任务,向自己保证当您有更多时间时会实施适当的修复,但请记住墨菲定律之一:所有快速修复都会成为永久性更改。
结论
虽然开发软件不同于指挥士兵打仗或领导一个国家,但他们必须解决的问题需要团队合作、良好的领导能力、效率和长期的解决方案。
然而,《孙子兵法》并不是唯一一本包含可应用于软件开发的原则的书。 尼科洛·马基雅维利的《王子》就是一个例子。
事实上,这里列出了仍然相关的马基雅维利的名言。 尝试猜测软件开发领域的相应原则。
- 狮子不能保护自己免受陷阱,狐狸不能保护自己免受狼的伤害。 因此,一个人必须是识别陷阱的狐狸,以及吓唬狼的狮子。
- 永远不要试图用武力来赢得欺骗可以赢得的东西。
- 从来没有任何伟大的成就没有危险。
- 渴望不断成功的人必须与时俱进地改变自己的行为。
- 一般来说,男人更多地从外表而不是现实来判断。 人皆有眼,唯独少有洞察力。
- 想要被服从的人必须知道如何指挥。
- 智慧包括知道如何区分麻烦的性质,以及选择较小的邪恶。
- 没有避免战争; 它只能推迟到你的敌人的优势。
- 大自然造就了少数勇敢的人; 工业和培训使许多。