今天的项目主要有3个:
1.极速60秒
2.海难逃生
3.电影《地球上的星星》
极速60秒
规则: 有30张图片,他们对应1到30的数字,在60秒内,按顺序把他们分别找出来交给教练。
总结: 理清需求之后,我对这个问题进行了抽象,这其实是一个集合(图片)到另一个集合的映射的过程(数字),输入是30个无序的图片,输出是按照对应数字的升序排好的30个图片。
我们开始讨论了两种算法(方案)。
- 一种是 记的过程和猜的过程分开,在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.......
}
}
尹夏.做考试题()
尹夏.画画();
尼可.影响学生(尹夏, '会读写')
尹夏.做考试题()
尹夏.画画();
受尼可老师影响,解决了自己的问题,充分发挥自己的天分,变化巨大。
复盘与提升
总结上面的经验和教训,主要由以下几条:
抽象:编程是对现实世界的抽象,现实世界的问题都能通过抽象和建模来映射到代码的世界,然后使用编程相关的理论来解释。抽象成编程问题或者数学问题之后,很多理论和优化方式都可以直接的套用。人的因素降到最小。
拆分与组合:完成一个功能需要组合很多的东西,需要划分每一部分的职责,就像公司部门和岗位的职责划分一样,需要每个人的配合才能运转,有的岗位职责更重要一些,就像人梯的那两层。但是无论职责的重要程度怎样都应该是可替换的,不能强耦合。不然一个人出了问题,整体都没法往下进行。
3.通信:为了整体结构的松散,会做很多的拆分,包括部门、岗位等,拆分之后就会涉及到通信,通信就有成本的问题,就像极速60秒里需要把所有的信息汇总到一个人那里来集中处理,就像海难逃生需要一个指挥来统筹全局,和公司架构同理,分层次的管理,沟通的方向更多的是上下级,这样信息流动会清晰高效很多。
- 追求全局最优:追求全局最优而不是局部最优,海难逃生的时候,确定了人梯 + 拉 的策略之后,安排逃生的顺序也很重要,不能简单的先让所有女生过去,也不能简单的让体重大的先过去,要结合人梯的人选以及上面拉的人选等,全局的综合考虑,类似一个动态规划求全局最优解的过程。正如有个老师分享的“通盘无妙手”,我们应该从整体上去做优化调整,去追求全局最优,而不是局部的最优。
5.状态:编程于我,就像画画之于尹夏,他改变了我的状态,已经深深潜入我的思想和潜意识,影响着我对世界的看法,紧紧耦合,不可分离。