有时拒绝变化:用香农恶魔理解软件产品策略
古老的交易所为每位坐在橡木办公桌前的商人提供了两种投资选择:
- 一个用来装硬币的保险箱。
- 掷硬币者,给定一定数量的硬币,要么回馈两倍或一半。
每天,每位交易者都可以选择投资。
普鲁登斯无视了掷硬币的动作。整天坐在办公桌前看报纸,谨慎减轻压力,却代价浪费机会。
鲁莽无视了保险箱。下注并观看(有时)回报,让交易变得值得。鲁莽的硬币堆像悠悠球一样上下波动(尽管悠悠球还没发明)。
SD(香农的恶魔)坐在中间,异常忙碌。每次抛币后,他们都会重新平衡硬币——一半放进保险箱,一半放进翻转器。
过了一会儿,发生了一件奇怪的事。普鲁登斯的硬币堆积完全没变。鲁莽的堆积金币时而增长又缩小,一半时间上涨,一半时间下降。但SD的筹码随着时间增长。
同样的投资。结果不同。到底发生了什么?
什么?
在讨论长期波动率软件开发时,到目前为止,我说的好像我们总是想保持长期波动率(“拥抱变化”,有人愿意吗?)敏锐的读者兼好友Kunal Bhalla指出了例外情况,即何时以及如何做空波动率。
他还向我介绍了一个关于围绕波动率构建直觉的有力隐喻——Shannon的恶魔。(我喜欢这种直觉锐化器——另见多臂强盗.)
我的第一个目标是建立对SD战略如何运作以创造价值的直观理解。然后我们将将其应用于软件产品开发。
想象一个连续两天的连续比赛,一胜一负。Reckless最终会回到起点。而SD则会上涨。赢后SD会“存入”部分奖金,使第二天的损失比Reckless的更小。
如果Reckless下注100枚硬币,他们最终会得到100枚硬币——(100 * 2 / 2)。SD在第一天后会得到50 + (50 * 2) = 150,然后是75(再平衡)+ (75 / 2) = 112.5。
换天,输了再赢。鲁莽的数字完全相同,(100 / 2 * 2)。SD的50 + (50 / 2) = 75,然后是37.5 + (37.5 * 2) = 112.5。
以下是所有四条路径。
鲁莽最终会有大胜和大败,但通常收场平稳。SD放弃上升空间,避免下跌,通常赢。鲁莽希望翻转器运行热。SD希望翻转器继续翻转。
3X:提取
处理这种抛硬币(双倍或半)的默认策略是不断重新平衡。提取是软件产品开发中最像这样的部分。你做出改变,也许能获得一些客户或收入,也可能失去一些。
在这样的环境下,SD产品战略最为合理。保护收入流。投资一些增长。降低成本。尽可能保持变更可逆性。
3X:探索
如果我们把翻转器改成赢了三倍,输了只输三分之一呢?
“鲁莽”的标准比你赢什么输什么更复杂。以结果对——赢了然后输,输了再赢。在之前的回报方案中,这没有利润。而在不那么平衡的翻转器中,我们通过全押在翻转器上看到更好的回报。
只有当我们连续输钱时,结果才会更差,谁在乎呢?
- 我们继续考虑下一个想法。
- 而且,潜在的提升空间太大,我们会转向另一款游戏。
+300%/-33%的翻转看起来像是探索收益(实际数字由你自行选择)。所以在探索中,我们全力投入翻转。鲁莽可能是鲁莽,但它们并非不理性。
注意我们并不是在做基于投资回报率的决策。我们应该玩这个翻转器/保险箱组合吗?它能提供正期望值吗?这不是有趣的问题。有趣的问题是怎么会这样我们应该玩。
3X:扩展
扩展模式需要让模型更丰富。在扩展模式中,每个“回合”有3个结果:
- 成功克服下一个增长瓶颈。(胜利的结果。)
- 死去。失去一切。(失败的结果。它真的这会让你付出代价,因为它抹去了所有可能的未来收益。)
- 切换到提取模式。(这个是新的。)
Explore纯粹是Reckless,Extract是纯粹的Shannon's Demon,而Expand则提供了一种创造价值的新策略:工程和运营投资以降低死亡概率。
可能是性能调优、保障未来资源,甚至是改进备份和恢复程序。通过以下方式创造价值:
- 降低死亡风险,或者
- 这增加了跨越下一个增长障碍的机会。
在扩展期间,需求正在吸引客户/使用量/收入。推动会增加风险。减少摩擦能让增长更持久。而这一切都发生在一个只能模糊看见和理解的系统里。
总有一天,旋钮和杠杆会变得清晰。那时你可以让香农的恶魔掌权。
附录:模拟器
我是程序员。我理解世界,这样我才能编程。我编程是为了理解世界。这里一个小模拟器我创作并玩弄这些作品,帮助自己直觉理解香农恶魔的主题。
再次感谢Kunal Bhalla提供推荐。我职业生涯中的一个幸运是,非常聪明的人愿意和我交流。
玩吧,朋友们!这是一种理解的方式。
const trade = (strategy) => {
let coins = 100;
for (let day = 0; day < 100; day++)
coins = strategy(coins, Math.random() < 0.5 ? 2 : 0.5);
return coins;
};
const prudence = (coins, flip) => coins; // all in the box
const reckless = (coins, flip) => coins * flip; // all in the flipper
const demon = (coins, flip) => coins/2 + coins/2*flip; // half & half, re-split daily
const median = (strategy) => {
const results = Array.from({length: 1000}, () => trade(strategy)).sort((a, b) => a - b);
return results[500];
};
console.log(`Prudence ${median(prudence).toFixed(0)}`);
console.log(`Reckless ${median(reckless).toFixed(0)}`);
console.log(`Demon ${median(demon).toFixed(0)}`);大多数球队没有策略问题。他们有适应性的问题。
你的计划根本无法经得起现实的考验。问题是,当你的组织没有弯曲时,它会不会弯曲或崩溃。
我帮助团队弯曲。适应以茁壮成长。
预订几张定制谈判以及咨询活动现在。我采访你们的团队,衡量你们的真实软件流,然后告诉你们真相以及该怎么做。
好奇它合不合适?跟我说说你的团队吧。