最近,我们团队为了进一步提高协作效率,组织了一次趣味分享活动,希望通过游戏的方式,帮助技术部门的同事们更好地理解和实践敏捷开发的方法。
在这次活动中,“哪种行动方式更敏捷”、“为什么采用这种方法”等关乎敏捷概念理论和实践方法的思考被伙伴们提出来并公开讨论。作为开发小组的成员,我获益颇多,特将此次活动中的思考总结下来分享给大家,共同成长~
游戏规则
10个人翻30张牌,每个人要把这30张牌的每1张牌都翻一遍,计算第1个人翻完30张牌所耗费的时间和所有人翻完30张牌所耗费的时间~
假设每一个红色方块耗时x,每一个橙色方块耗时y,每一个黄色方块耗时z (x, y, z > 0)
方案1: 第n个人必须等第n-1个人翻完所有的30张牌才能开始翻牌,第1个人不用等
那么我们参考上图的结构,先计算第1~5个人的翻完30张牌的时间,然后再乘以2就是总计用时(不存在影响时间的意外情况):
T1 = ((5 + 1) * 5 / 2 * x + (4 + 1) * 4 / 2 * y + 25 * 5 * z) * 2 =30x + 20y + 250z
方案2:第n个人必须等第n-1个人翻完第5张牌才能开始翻牌,第1个人不用等;且第n个人必须等第n-1个人翻完第m张牌,才能翻第m张牌,第1个人不用等。
参考上图结构,先计算1 ~ 10个人翻完前5张牌的时间,然后再计算第10个人翻完6 ~ 25张牌的时间就是总计用时(不存在影响时间的意外情况):
T2= ((5 + 1) * 5 / 2 * x + (4 + 1) * 4 / 2 * y) * 2 + 25 * z = 30x + 20y + 25z
方案3:第n个人必须等第n-1个人翻完第m张牌,才能翻第m张牌,第1个人不用等。
参考上图结构:先计算1 ~ 10个人翻完第1张牌的时间,然后再计算第10个人翻完第2 ~ 5张牌的时间,最后再加上第10个人翻完第6 ~ 30张牌的时间就是总计用时(不存在影响时间的意外情况):T3= 10x + 4y + 25z
最终结果
下面我们用程序来验证结论的正确性。假设 x = y = z = 1s,那最终结果应该是:
T1 = 30 + 20 + 250 = 300s
T2 = 30 + 20 + 25 = 75s
T3 = 10 + 4 + 25 = 39s
实际结果:
public class AgileTest {
private static final Logger LOGGER = LoggerFactory.getLogger(AgileTest.class);
public static void main(String[] args) {
long time1 = way1();
long time2 = way2();
long time3 = way3();
LOGGER.info("time1: {} ms", time1);
LOGGER.info("time2: {} ms", time2);
LOGGER.info("time3: {} ms", time3);
}
/**
* <p>方案1</p>
* <p>第n个人必须等第n-1个人翻完所有的30张牌才能开始翻牌,第1个人不用等。</p>
* @return 耗时 ms
*/
public static long way1() {
final String way = "way1";
long startTime = System.currentTimeMillis();
// 1.10个人
for (int i = 1; i < 11; i++) {
AtomicInteger atomicI = new AtomicInteger(i);
// 2.30张牌,每个人翻完30张牌,下个人才能开始
for (int j = 1; j < 31; j++) {
node(way, atomicI, j);
}
}
long endTime = System.currentTimeMillis();
return