编程架构世界:青苗训练营第一天日报

今天的项目主要有3个:

1.极速60秒
2.海难逃生
3.电影《地球上的星星》

极速60秒

规则: 有30张图片,他们对应1到30的数字,在60秒内,按顺序把他们分别找出来交给教练。

总结: 理清需求之后,我对这个问题进行了抽象,这其实是一个集合(图片)到另一个集合的映射的过程(数字),输入是30个无序的图片,输出是按照对应数字的升序排好的30个图片。

编程架构世界:青苗训练营第一天日报_第1张图片

我们开始讨论了两种算法(方案)。

  • 一种是 记的过程和猜的过程分开,在60秒内只记图片,回来后把每个人记住的图片取并集,之后再猜(寻找映射关系)。
  • 另一种是按顺序一个一个的记 + 猜,找到一个再进行下一个。

理论上两种方案都是可以完成需求的。 具体执行的时候发现第一种方案,记这个过程很难,因为没有一种标准的语言来描述图片内容,没法完成记的过程,自然这种方案就不可行了。

最终我们队采用的是第二种方案,别的队也是同样的方案。

我们的成绩是第二名,复盘的时候发现获胜的一队除了上述方案外还有两个优化策略,一个是每个人划分一个区域来指,另一个我忘记了。

在方案相同的情况下,一队的两个优化策略使得一队更快完成了挑战,剩下我们两个队比拼因为方案和优化策略都一样,更多的是人的比拼。

这里的优化策略带来的性能提升,让我想起了react vdom的diff 算法也是因为加了3条优化策略而使得算法复杂度从o(n^3)降到了o(n),实现了性能的质的提升。

当然除了这些抽象层次的区别之外,具体到这个问题,团队的分工协作沟通等都会涉及到。

海难逃生

规则: 4米高的甲板,通过协作让所有人都过去。

总结: 针对这个需求,设计的方案是0~2层人梯 + 上面人拉 的方式,结合蹬 + 拉的力量。确定好了方案之后,具体分工的时候,会把第一层和第二层人梯交给男生做,女生和重量大的优先上。当到了最后一个人的时候,没有人梯可蹬,只能靠拉的力量,这时候会通过一个人倒挂下来拉的方式,来把最后一个人拉上去。

整体逻辑用代码描述如下:

function escapeAll(people) {
  const  PEOPLE_TATAL_COUNT = people.length;
  function escape() {
      if (people.length === PEOPLE_TOTAL_COUNT) {
            通过人梯上去(people.pop());
            escape(people, ++num);
      } else if (num === 1) {
           通过倒挂拉上去(people.pop());
      } else {
           通过人梯和拉上去(people.pop());
      }
   }
   return escape();
}

const people = ['翟旭光', '沈东', '王四光'];// 共35人
escapeAll(people);

电影《地球上的星星》

规则: 看一部电影,看完之后画出逻辑主线。
总结: 分析之后的逻辑如下。

     const 尹夏 = {
           status: '不会读写',
           做考试题() {
                 this.status.......
            }
            画画() {
                 this.status.......
            }
     }
     尹夏.做考试题()
      尹夏.画画();
      尼可.影响学生(尹夏, '会读写')
      尹夏.做考试题()
      尹夏.画画();
     

受尼可老师影响,解决了自己的问题,充分发挥自己的天分,变化巨大。

复盘与提升

总结上面的经验和教训,主要由以下几条:

  1. 抽象:编程是对现实世界的抽象,现实世界的问题都能通过抽象和建模来映射到代码的世界,然后使用编程相关的理论来解释。抽象成编程问题或者数学问题之后,很多理论和优化方式都可以直接的套用。人的因素降到最小。

  2. 拆分与组合:完成一个功能需要组合很多的东西,需要划分每一部分的职责,就像公司部门和岗位的职责划分一样,需要每个人的配合才能运转,有的岗位职责更重要一些,就像人梯的那两层。但是无论职责的重要程度怎样都应该是可替换的,不能强耦合。不然一个人出了问题,整体都没法往下进行。

3.通信:为了整体结构的松散,会做很多的拆分,包括部门、岗位等,拆分之后就会涉及到通信,通信就有成本的问题,就像极速60秒里需要把所有的信息汇总到一个人那里来集中处理,就像海难逃生需要一个指挥来统筹全局,和公司架构同理,分层次的管理,沟通的方向更多的是上下级,这样信息流动会清晰高效很多。

  1. 追求全局最优:追求全局最优而不是局部最优,海难逃生的时候,确定了人梯 + 拉 的策略之后,安排逃生的顺序也很重要,不能简单的先让所有女生过去,也不能简单的让体重大的先过去,要结合人梯的人选以及上面拉的人选等,全局的综合考虑,类似一个动态规划求全局最优解的过程。正如有个老师分享的“通盘无妙手”,我们应该从整体上去做优化调整,去追求全局最优,而不是局部的最优。

5.状态:编程于我,就像画画之于尹夏,他改变了我的状态,已经深深潜入我的思想和潜意识,影响着我对世界的看法,紧紧耦合,不可分离。

你可能感兴趣的:(编程架构世界:青苗训练营第一天日报)