不要仅仅是复制粘贴代码

想要搞砸一些代码?那么你这么做:在弄懂它究竟是做什么之前快点修改它

如果是这样的话,你现在就是在练习一种叫cargo cult的编程----一种忽略一段代码如何工作和与其他相关代码的联系的方式

cargo cult很可能出现在这种场景:一个没有经验的程序员遇到问题时只会从其他地方复制一些代码过来,他只是知道一点或者完全不懂这段代码在做什么和放到其他地方后需要修改什么 ----引自wiki

 

当一个程序员复制一段他根本不懂的代码并希望将它用于解决问题的时候,他就是在联系cargo cult编程,这会增加不可预测的副作用的风险

 

当一个程序员阅读一段他不懂的代码并胡乱的修改它企图用于解决一些问题的时候,他也是在联系cargo cult编程


但在下面这种情况下,我们就不能说程序员只是单纯的复制代码了:复制一段代码,理解它,学习它,使用它,并只会有较低风险的副作用


cargo cult在某方面被人误解成一个从别人的代码那学习的基本验证步骤


下面有一些最有效的学习方法

    1.阅读一段代码

    2.知道这段代码使用的语言的所有特点

    3.知道这段代码使用的函数库或框架的所有特点

    4.学习那些函数库和框架的基本知识

    5.在这段代码范围内,明白每行代码在做什么和函数库和框架的目的


当一个人用一门新语言开始工作的时候,往往是很难的,因为有大量的信息需要人们去记住,还要高效的理解每一段代码的含义,这是很困难的,以至于很多时候马上就忘记了。不过,我们能做的就是利用大脑学习东西的方式--有意识的和无意识的(已经被证实)


“Blocked Practice”   这基本上就是说你学习的东西是通过一遍一遍的完成一个单一的技能,将它重复成你大脑里的一个键这样习得的

然而,这并不是最好的学习方式,事实证明,当你交叉对比同一项技能的不同变化的时候(原文:when you learn through interleaving different variations of the same skill),你能有效的学习到更多。




作为一个程序员,当我们在敲代码的时候,我们可以利用反复练习和交叉对比来练习编程能力,而不仅仅是复制粘贴


当我们复制粘贴一段代码的时候,我们只是看了一些而已(是否有时甚至都懒得看),根据上面那张图我们可以知道,我们可能只是消化了一些部分东西而已,因为它太抽象了。


相比而言,你手动的将这块代码敲进去能学习到更多,这会强迫你的大脑去思考这类代码模式的不同点,学习将会更高效。


命名是编程最难的方面之一,当我们没有理解的复制代码,我们运行时将是一个隐患,这个隐患是因为重写了变量名和函数名或类名而导致了破坏了一些东西的完整性。


如果我们能先理解代码,然后再将它写入我们自己的代码中,我们就能将它重新命名,让它适合用于我们的应用并且不会有命名冲突,尽管最后的结果可能和我们直接将代码粘上去的基本相同


另一方面,如果我们将从其他地方复制进来的代码复制到另一个地方,这将会是有可能发生的:复制了一些不必要的标记,或者忘了修改需要修改的标记


例如下面这个HTML的例子



当重复这段代码去创建一个新的输入的时候,我们很可能会忘了修改标签元素的属性,这将会破坏我们想创建一个新输入的动作




这个例子很有趣,因为它属于那种很难去测试的功能,(even with visual regression这句不会翻....),这非常依赖静态测试(就像代码检查,确保写的代码能达到预期的效果)


类似的事经常发生在测试中,当我们复制了一段已经通过测试了的代码,而不是重新写一份,我们运行的时候将会有因为没有修改必要的标记而导致测试失败的风险


不要仅仅是复制粘贴别人的代码,我们要学习别人的代码并且最大限度的实践它,这对学习你感兴趣的领域非常有帮助


总的来说,对于程序员来说,最有价值的是大脑,而不是手指。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值