解决不了问题,可以继续思考,可以讨论,可以提问,但绝对不可以蒙。

打印 被阅读次数

上次课教练布置的课后作业:HW: finish the 5x7 grid

阿贤没费太多功夫就亮出亮作品。精美的网格,将来可以扩展成五子棋的棋盘。

教练:“Perfect!”

阿贤接着附上了源代码。

教练:“The code looks clean and elegant. Good job.”

课开始了。

教练:“试试把网格往右边推过去一些。”

阿贤想了一想,动手把originX的值从20改成50了。

let originX: CGFloat = 50

教练:“写成20加上一个数更能表达咱们往右移的意图,而且用个奇怪点的数更好,比如13 。”

let originX: CGFloat = 20 + 13

阿贤执行了一下程序,网格是往右边平移了13个点位。却出现了一个奇怪的问题,即每根竖线的底部都向下长长了一小节。

教练:“成爬虫了。看看问题出在哪里。”

阿贤看着这满屏的代码,一时无从入手。

教练:“阿贤现在就是个侦探了,如何破案?是不是要缩小范围?假如要捉拿罪犯,范围从城市缩小到区,区到小区,再到楼。是不是范围越小越好?”

阿贤:“是的。”

教练:“好,我先帮你缩小范围。你觉得是横线出问题了,还是竖线出问题了?”

阿贤:“竖线。”

教练:“七根竖线好像都是类似的问题。如果能发现第一根竖线的问题,会不会对解决所有竖线的问题有帮助?”

阿贤:“会。”

教练:“那你能不能找到画第一根竖线的代码?这样范围就小到一个线了。找到后咱们可以把代码注释掉,验证一下是不是第一根竖线。”

阿贤奋力地找着。两三分钟过去了。阿贤对代码对敏感性不强,可以理解。

教练:“我有个笨办法。代码的上半部分是横线,一根一根数下来,就到竖线了。”

教练话音未落,阿贤:“我就是这样数的。”

阿贤把相应的两行代码注释掉,结果是第二根竖线消失了。

教练:“说明是前一根,对不?”

阿贤做了调整,第一根竖线消失了。找到要聚焦的两行代码了。

教练:“咱们继续缩小范围好吗?就像确定罪犯在楼里的某个单元里了,最好再知道是哪个房间。你觉得是上面的点的坐标有问题,还是下面的点的坐标有问题?”

阿贤:“我觉得是下面的。”

教练:“好。我已经帮你一步一步把范围缩得非常小了。还有最后一次缩小范围的机会,你来吧。”

阿贤没有辜负教练的期待:“我觉得第二个点的x坐标没问题。应该是y坐标有问题。”

教练:“太棒了!那你说y是太大了还是太小了呢?”

阿贤:“太大了。”

教练加亮了这部分有问题的代码:

originX + (CGFloat(cols-2) * cellSide)

教练一眼就看出来了应该是originY却写成了originX,所以随着originX增加了13长脚了。

但阿贤看了半天还看不出所以然,还试图用 -13 来对付过去:

originX + (CGFloat(cols-2) * cellSide) - 13

教练气不过,举了个例子说明严重性,并让阿贤引以为戒。

教练:“实在看不出问题,就试着重新计算,重新写呗。”

阿贤忙着整理思绪,用具体数字,而不是变量名,列出了基本正确的算式。这时候教练突然发现,表达式 “originX + (CGFloat(cols-2) * cellSide)”中居然藏着三处错误。

originX 应该是 originY

cols 应该是 rows

-2 应该是 -1

完全不着边际,it doesn't make any sense! 阿贤的作业竖线部分是蒙对的,是凑出来的。

教练:“啊?!我居然完全被美丽的结果蒙蔽了。三处地方完全不合理,你却能整出似乎完美的网格。你的骗术好高明啊。”

阿贤乐出声来了:“哈哈哈,咯咯咯”。

下课时间到了。教练给阿贤发了如下信息:

解决问题时,不问为什么,不想清楚逻辑联系,而是拼凑出“答案”,这个要狠狠批评。重重地打一下自己的屁股。

解决不了问题,可以继续思考,可以讨论,可以提问,但绝对不可以蒙。

登录后才可评论.