為什麼重新發明輪子有用?

為什麼重新發明輪子有用?

有一天,我正在面試一位正在申請高級職位的 JavaScript 開發人員。 一位也在場的同事要求應聘者編寫一個函數,該函數將發出 HTTP 請求,並在失敗的情況下重試多次。

他直接在板上寫了代碼,所以描述一些大概的東西就足夠了。 如果他只是表明他很清楚事情的本質是什麼,我們就很滿意了。 但遺憾的是,他並沒有找到好的解決辦法。 然後,我們因為興奮而把它記下來,決定讓任務變得更容易一些,並要求他創建一個基於來自帶有回調的函數的承諾的函數。

可惜。 是的,很明顯他以前見過類似的代碼。 他大致了解那裡的一切是如何運作的。 解決方案的草圖對我們來說就足夠了,這將展示對這個概念的理解。 然而,這位候選人在白板上寫的代碼完全是一派胡言。 他對 JavaScript 中的 Promise 的概念非常模糊,無法真正解釋為什麼需要它們。 對於晚輩來說,這還算可以原諒,但是前輩的位置已經不再抽籤了。 該開發人員如何設法修復複雜承諾鏈中的錯誤並向其他人解釋他到底做了什麼?

開發人員認為完成的代碼是不言而喻的

在開發過程中,我們不斷遇到可複制的材料。 我們移動代碼片段,這樣我們就不必每次都重寫它們。 因此,通過將我們所有的注意力集中在關鍵部分上,我們將我們使用的最終代碼視為不言而喻的東西 - 我們只是假設其中的所有內容都會按其應有的方式工作。

它通常確實有效,但當事情變得棘手時,了解其機制會帶來更大的回報。

例如,我們的高級開發人員候選人認為承諾是不言而喻的。 他可能想像著當它們出現在別人代碼中的某個地方時如何處理,但他不明白一般原理,並且無法在面試時自己重複。 也許他記住了這個片段——這並不難:

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

我也做過——是的,我們可能都在某個時候做過。 他們只是簡單地記住一段代碼,以便以後可以在工作中使用它,而只是籠統地想像那裡的一切是如何工作的。 但是,如果開發人員真正理解了這個概念,他就不必記住任何東西 - 他只需要知道它是如何完成的,並且可以輕鬆地重現代碼中所需的所有內容。

觸及根源

2012年,在前端框架稱霸之前,jQuery統治的世界,我正在看一本書 JavaScript 忍者的秘密作者:John Resig,jQuery 的創建者。

這本書教讀者如何從頭開始創建自己的 jQuery,並提供了一個獨特的機會來參與導致該庫創建的思路。 近年來,jQuery 已經失寵,但我仍然強烈推薦這本書。 她最讓我印象深刻的是她堅持認為我可以自己想到這一切。 作者描述的步驟看起來如此合乎邏輯、如此清晰,以至於我真的開始覺得,如果我開始做正事,我就可以輕鬆創建 jQuery。

當然,事實上,我不會掌握這樣的東西——我會認為這是難以忍受的困難。 我自己的解決方案對我來說似乎過於簡單和天真,無法實現,我會放棄。 我將 jQuery 歸類為不言而喻的東西,其正確操作只需要盲目相信即可。 隨後,我幾乎不會花時間深入研究這個庫的機制,而只是將其用作一種黑匣子。

但讀這本書讓我變了一個人。 我開始閱讀源碼,發現很多解決方案的實現其實是非常透明的,甚至是顯而易見的。 不,當然,你自己想到這樣的事情已經是來自另一部歌劇了。 但正是對別人代碼的研究和現有解決方案的複制幫助我們提出了自己的東西。

你獲得的靈感和你開始注意到的模式將改變你作為一名開發人員。 你會發現,你一直在使用的、被認為是神器的奇妙庫,對魔法根本不起作用,而只是簡潔、機智地解決了問題。

有時您必須仔細研究代碼,一步一步地將其拆開,但這就是如何通過連續的小步驟,重複作者的解決方案路徑。 這將使您能夠更深入地了解編寫代碼的過程,並讓您更有信心找到自己的解決方案。

當我第一次開始使用 Promise 時,我認為這純粹是魔法。 然後我發現它們基於相同的回調,我的編程世界發生了翻天覆地的變化。 也就是說,該模式的目的是讓我們免受回調的影響,而它本身就是使用回調實現的?!

這幫助我用不同的眼光看待問題,並認識到在我面前的並不是一些我一生都無法理解的深奧代碼、超驗的複雜性。 這些只是通過適當的好奇心和深度沉浸可以輕鬆理解的模式。 這就是人們學習編碼和成長為開發人員的方式。

重新發明這個輪子

因此,請隨意重新發明輪子:編寫自己的數據綁定代碼、創建自己的 Promise,甚至製作自己的狀態管理解決方案。
沒有人會使用這一切並不重要 - 但現在您知道如何使用。 如果您有機會隨後在自己的項目中使用此類開發,那麼這通常很棒。 您可以開發它們並學習其他東西。

這裡的重點不是將代碼發送到生產環境,而是學習新的東西。 編寫自己的現有解決方案的實現是向最好的程序員學習並磨練技能的好方法。

來源: www.habr.com

添加評論