为什么重新发明轮子有用?

为什么重新发明轮子有用?

有一天,我采访了一位正在申请高级职位的 JavaScript 开发人员。 一位也在场的同事要求应聘者编写一个函数,该函数可以发出 HTTP 请求,如果不成功,则重试几次。

他直接把代码写在板上,画个大概的东西就够了。 如果他只是表明他很了解问题所在,我们就会感到非常满意。 但不幸的是,他未能找到成功的解决方案。 然后,我们将其归结为兴奋,决定让任务变得更容易一些,并要求他将带有回调的函数转换为基于 Promise 的函数。

可惜。 是的,很明显他以前遇到过这样的代码。 他大致了解那里的一切是如何运作的。 我们所需要的只是一个解决方案的草图,以展示对这个概念的理解。 然而,候选人在黑板上写的代码完全是无稽之谈。 他对 JavaScript 中的 Promise 的概念非常模糊,无法真正解释为什么需要它们。 对于晚辈来说,这还可以原谅,但他已经不适合担任前辈的位置了。 该开发人员如何能够修复复杂的承诺链中的错误并向其他人解释他到底做了什么?

开发人员认为现成的代码是不言而喻的

在开发过程中,我们不断遇到可复制的材料。 我们传输代码片段,这样我们就不必每次都重新编写它们。 因此,通过将我们所有的注意力集中在关键部分上,我们将我们使用的最终代码视为不言而喻的东西 - 我们只是假设一切都会按其应有的方式工作。

通常它确实有效,但当事情变得棘手时,了解其机制会带来更大的回报。

因此,我们的高级开发人员职位候选人认为 Promise 对象是不言而喻的。 当它们出现在别人代码中的某个地方时,他可能知道如何处理它们,但他不明白一般原理,并且在面试时无法自己重复。 也许他已经记住了这个片段——这并不难:

return new Promise((resolve, reject) => {
  functionWithCallback((err, result) => {
   return err ? reject(err) : resolve(result);
  });
});

我也这么做过——而且我们可能都曾在某个时候这么做过。 他们只是简单地记住了一段代码,以便以后可以在工作中使用它,同时只对那里的一切如何工作有一个大概的了解。 但如果开发人员真正理解了这个概念,他就不需要记住任何东西——他只需要知道如何去做,并且可以轻松地在代码中重现他需要的一切。

回到根源

2012年,前端框架的统治地位尚未建立的时候,jQuery一统天下,我读了这本书 JavaScript 忍者的秘密,由 jQuery 的创建者 John Resig 创作。

这本书教读者如何从头开始创建自己的 jQuery,并提供了对创建该库的思维过程的独特见解。 近年来,jQuery 已经失去了以前的受欢迎程度,但我仍然强烈推荐这本书。 她给我印象最深的是,她始终坚信这一切都是我自己能想到的。 作者描述的步骤看起来如此合乎逻辑、如此清晰,以至于我开始认真地认为,如果我认真去做,我可以轻松创建 jQuery。

当然,实际上我不可能做这样的事情——我会认为这是难以忍受的困难。 我自己的解决方案似乎太简单、太幼稚,无法实现,我会放弃。 我将 jQuery 归类为不言而喻的东西,在其正确操作中你只需要盲目相信即可。 随后,我几乎不会浪费时间深入研究这个库的机制,而只是将其用作一种黑匣子。

但读这本书让我变了一个人。 我开始阅读源代码,发现很多解决方案的实现其实是非常透明的,甚至是显而易见的。 不,当然,你自己想到这样的事情是另一回事。 但研究其他人的代码并复制现有的解决方案可以帮助我们提出自己的解决方案。

你获得的灵感和你开始注意到的模式将改变你作为一名开发人员。 你会发现你经常使用的那个美妙的库,你习惯于将其视为神奇的神器,它根本不适用于魔法,而只是简单而机智地解决问题。

有时你必须仔细研究代码,一步一步地分析它,但这就是如何,通过小而一致的步骤,你可以重复作者的解决方案路径。 这将使您能够更深入地了解编码过程,并让您更有信心提出自己的解决方案。

当我第一次开始使用 Promise 时,对我来说这就像纯粹的魔法。 然后我发现它们基于相同的回调,我的编程世界发生了翻天覆地的变化。 那么这个模式,其目的是让我们免于回调,它本身就是使用回调实现的?!

这帮助我用不同的眼光看待这个问题,并意识到这并不是我面前的一段深奥的代码,其复杂性是我一生中永远无法理解的。 这些只是只要有足够的好奇心和深度沉浸就可以毫无问题地理解的模式。 这就是人们学习编码和成长为开发人员的方式。

重新发明这个轮子

因此,继续重新发明轮子:编写您自己的数据绑定代码,创建自己的承诺,甚至制作您自己的状态管理解决方案。
没有人会使用这一切并不重要 - 但现在你知道如何去做。 如果您随后有机会在自己的项目中使用此类开发,那么通常就很好了。 您将能够发展它们并学习其他东西。

这里的重点不是将代码发送到生产环境,而是学习新的东西。 编写您自己的现有解决方案的实现是向最好的程序员学习并磨练您的技能的好方法。

来源: habr.com

添加评论