完美爬犁

0d7f48d66fb93ada29ad6cd84209b568_b
爬犁,南方遇到飘小雪花就会尖叫的同学可能没见过,我先解释一下。深刻了解爬犁工作原理的同学,请跳过下一段。

爬犁,小学的地理还是语文课本提到,我们的祖国地大物博,北方已经白雪飘飘,南方还如何如何。北方白雪之上,据说人们用爬犁作为交通工具,用马拉或狗拉, 哈尔滨的太阳岛上据说还有风帆驱动的,我全没见过。我从小见过的爬犁都是家长用木头做的,下面绑铁丝减小摩擦力,有的前面有头,据说转向更灵活,虽然我切 身体会并没有用。从大坡之上,或坐或卧,呼啸而下。然后再拉到山上去,如此反复,如西绪弗斯而乐此不疲。

以上是爬犁简介,如果你跳过了没啥影响,我只是为南方同学勾勒了北方冬天的美好生活,美好的那部分。下面故事正式开始。

我去年为二猫做了个爬犁,耗时大概4个小时。她乐颠颠地参与画图纸、提问题、装饰,并命名为红绳号。拉去河边,我跟她从堤坝上风驰电掣般滑下去,然后发朋友圈显摆。
e5a49aa7c81b6d0ec1645f6056412be3_b
朋友们回应很积极,大多是改进意见。归纳大体如下:

1. 下面连铁丝都没绑,能滑起来么。

2. 我从小就做这个,个个都比你这个好多了,改天教你。

3. 太小了吧,能坐下吗,屁股都得掉下去吧。

4. 都没有头,怎么转弯。

5. 有钎子么,在平地上怎么滑。

6. 头上的绳子太细了吧,拉着孩子走的时候绳子会断吧。

7. 现在有的是塑料的爬犁,比这个精致多了。

8. 你那也算爬犁么。

我统一答复: 你行你上。大家交互甚欢,哈哈一片。一年过去了,我和二猫又翻出了红绳号,从河堤上滑下去,跟去年一样风驰电掣的,然后拖着爬犁连滚带爬再杀上去。那些开着善意玩笑的指导者们,仍然没有做出他们自己的完美爬犁来。他们没有享受到这么糟糕的爬犁带来的快乐。

完美爬犁这个故事告诉我们,行乐要及时,不要等到某个特别的时刻或事件,或者必须使用优雅的代码、完美的模型。

往极端了说,如果没有木板,没有钉子,没有绳子,神人也做不出爬犁的情况下,也不应该等待,而是穿得厚厚的扎上护腰和护膝,用楚留滑的方式从河堤上冲下去。要么放弃,要么开始,绝不等待。

项目一旦启动,选定框架、选定语言、选定人员和时间地点,就应该立即启动。简而言之,一旦启动就立即启动。更好的语言,更好的模型,更好的抽象,都留到下一个项目或者下一轮迭代再发挥威力。择善而从,从一而终,有犹豫的时间,蜀之鄙的贫者就到南海又回来了。

当年我带学生做”项目管理”课程,小班授课,选定内容是做俄罗斯方块。我提问,大家有没有想到,小块一边往下掉,同时还要响应用户的指令旋转移动,这应该 怎么实现呢。一位林同学说,那一定是用 多线程。我继续问,那么帝国时代里面有好几十战士来回跑和对砍,如果用多线程如何实现呢,用好几十个线程么?

当年有一种游戏机叫做红白机,国产版好的是小霸王,用电视作为显示器,用手柄控制。那种游戏机里就有俄罗斯方块,甚至手柄大小的掌上游戏机里也有俄罗斯方块。那些机器里连操作系统都没有,也没有多线程,是怎么实现同时满足多个动作这一要求的呢?

工程师自我办法。办法就是: 只用你手头现有的知识,一样能实现各种效果。所以,这个故事不是告诉我们应该如何掌握新的更好的技巧、方法、知识的,像有些同学以为的那样,而是 如何应用你现在已经掌握的技术。

所以,我对每一个希望跟我一起做项目的同学说,如果你期待能在我这里学到任何知识,那么这个希望都会落空,你什么知识也学不到。有些技能,只有做,你才能 掌握,比如”如何应用你现在已经掌握的技术”。汉字就那些,你也认识我也认识,为什么有些人能写出文章;API一共就那些,你也读过我也读过,为什么有些 人能编出程序。不是因为会写的人读了某本你没有读过的书,而是他把你也读过的书里的知识 实践了 很多次,然后就会了。

邹欣老师在《构建之法》中说,教室如同健身房,教师如同教练,学生如同学员。如果你不真操实干地抬起哑铃,教练喊破喉咙,他的肌肉也跑不到你的身上。

秘诀是什么?就是没有秘诀。去做,然后你自然明白。。

当年的工程师怎么实现多线程的效果呢?看看windwos api程序设计的demo,无他,就是轮询。在每次循环里 get/peek message,然后 translate message,然后dispatch message。然后有一个个消息响应函数,被调用以后就干什么什么事,要求,这些函数占用CPU时间都不能太长。为什么,因为要回到循环去。 windows的消息循环,或者说,windows程序带有GUI的有菜单按钮能画图的,不过就是死循环,而且要求程序员不要在循环中执行太多指令。

借用类似这样的机制,我们就能猜到,在俄罗斯方块中,我们需要这样一种机制,能够获取用户输入并且不阻塞程序继续执行。我们需要找到这样的异步读取机制。多线程并非必需,并非唯一。

当年有个游戏叫做 Doom II,红遍全球。Doom眩晕就是用它命名的。这是个第一人称视角游戏 (不是第一个,第一个是同一公司 id soft的刺杀希特勒),屏幕下面有一双手持枪射击。这双手在没有三维建模,没有三维重建,没有光晕渲染的时候是如何画出来的呢?

这双手是两位主力开发者之一的手的照片,改了色调和分辨率什么的以后,贴图在屏幕上的。

简单粗暴,非常有效。更多的特征,更深刻和更精致的原理都留到以后,现在只要足够好,不要更好。

关同学告诉我,她在化学学院见到某位同学,为了做量子化学计算,居然写了个40重循环的程序。你读了这么多年书,见过40重循环的程序么,能想像40重循环缩进多远么。当然,也许这么同学的循环根本没有缩进。

当然了,使用更高深的学问,比如jump-table啦,比如尾递归啦,比如啥啥啦,我们当然可以避免40重循环以及可能带来的潜在问题和开发难度,但是 你导师要求你下个月就交报告,你怎么办。现学来不及,一个月写40重循环足够。当然,如果你想到是QQ求同学解决,不在讨论范围内,我们只谈你自己如何完 成任务,变身代理商的不算。

有同学会有这样的体会,我写了,就是糙快猛的路子,程序跑起来了,但是老师又说”用某某方法会更好”,是不是白干了。

当然不是。老师又说”用某某方法会更好”,是在你用现有知识整出来的情况下,才能学到的优秀指导建议。如果你没有用现有知识实现,导师连这句貌似有否定意味的评论都不会有,他会放弃你。

一旦工程开启是,此刻,就用你现在掌握的技能干,不学习任何新知识。所有新知识另开线程学习。没有人会为你拥有知识而付钱,只会为你(运用知识)解决问题 而付钱。你猜什么方法能行白扯,必须亲自操刀上阵干出来;或者你成为技术领导,要求别人干,那是很多年以后的事了,而且你得能活到那时候。

所以,先干起来,然后才有谋求批评指正的可能,然后才有进步。如果没有第一步,后面的就都没有。世界上最激烈的反对不是表达反对意见,而是淡漠。如果你不表现出弱点,老师就连纠正的机会都没有。

先糙快猛做出来,如果你真的有更优秀的模型,那么用新的模型重做一次。不要期待第一次就使用最优秀最完美的模型。

《囚徒健身》告诉我们,要打好前面的基础步骤,不要过早觊觎后面的大招;而且,前面的基础训练,即使没有更快地让你达成后面的目标,也是有帮助的;最关键的是,后面的不是目标,过程本身才是。学习 如何应用现有的知识 也是一样,过程才是最重要的。

看看下面的问题。

1. 打印10行怎么做,我还没有学会循环。我还没有学好循环/我想用递归/我想既不用递归也不用循环。

答案是: printf (“a\n”);printf (“a\n”);printf (“a\n”);printf (“a\n”);printf (“a\n”);printf (“a\n”);printf (“a\n”);printf (“a\n”);printf (“a\n”);printf (“a\n”);

2. 保存四则运算的式子,据说逆波兰最好了,但是我的编译原理学得一团糟怎么办啊。

答案是:不用逆波兰。比如保存字符串。

3. 四则运算的式子求值,老师说用二叉树求值最适合了,我不会,怎么办。答案是:不用二叉树。即使带有括号,三个数做四则运算一共几种可能,这是高中时的排列组合问题(数字电路或离散数学对求解总的可能性有帮助,不必须) 。穷举所有可能,switch-case。

时间,是工程目标中最重要的元素之一。我们考虑 成本 (人力、资源,时间) 、时间 (截止日期) 、范围、质量。截止日期在英文中是 dead line,原意是监狱外面不可跨越的边界,囚犯只要跨越就会被不问而击毙。要有这样的觉悟,只要越越截止日期,就会死。如果这样想,就会用各种脏的丑的代 码先解决了问题,然后再优雅。

过早优化,是万恶之源。只有被调用了三次的 (真正地被调用了,甚至不是预计),再考虑以重用为目的抽象。只有实现了以后 (或者真的很牛了以后) ,再用大招解决。

勇猛精进,不要犹豫。时间至关重要。不少人遗憾荆柯同学当年要是等那位高人而不是带秦舞阳一起动手就好了,但是,等到那位高手就能成功么,是不是那个时候秦军都已经攻克燕国了呢?

有的同学会问,那如果简单方法失败了呢?那就是命中该死,因为项目需要的必备的知识你以前没学会。排除现学现用这种可能吧。

有的同学会追问,那老师要进度要结果怎么办?

有一部电影,韩国的《刺客》,里面一位女士讲到他们这些以朝鲜独立为目标的人在满洲抗日,说了两段话。她说,在满洲房子坏了我们也不修,因为胜利了我们就 要回朝鲜了,为什么要修呢。事实上,从1910年日本占领朝鲜到1945年朝鲜光复,他们等待了35年,年青人变成垂垂老矣这么长的时间。她说,我们并不 知道什么时候能够胜利,我们甚至不确认能够胜利,我们斗争,不是为了得到胜利,而是告诉人们,我们没有屈服。

如果老师要结果,就用你以简单方法所写的失败的代码还有消耗的大量时间 (不包括焦虑,只包括思考和键入) 交给他。由于你的努力、由于你的态度,你不见得会得到成绩,但是你会得到过程中的收获,还有未来。

这样,你就掌握了应用 现有知识 的能力。
2f027119545834d5aa83b9e80e6af528_b
————————————————————

博客会手工同步到以下地址:

[http://zhuanlan.zhihu.com/younggift]

[http://blog.csdn.net/younggift]

[http://giftdotyoung.blogspot.com] 我本人也访问不到了,blogspot暂停更新。

Leave a Reply