javascript-hardest-concepts

#最難理解的JavaScript概念 昨天我在Twitter上問了個問題: “在JavaScript中,最複雜的主題是什麼?你學習它花費最多時間的是哪個?” 我收到了200多個回覆。 以下是一些經常被提到的內容: this 非同步JavaScript(promises, callbacks, async/await) 閉包 事件循環 遞歸 作用域 變數提升 原型繼承 bind(), call(), apply() reduce() 生成器 fetch() 除了生成器這個比較小眾的概念外,其餘的都是我們每天在JavaScript中都會用到的。 我在這個博客上有關於這些主題的文章,你可以使用搜索功能來找到它們,但我問這個問題的原因是我正在為11月份準備一個高質量的新課程,名為The JavaScript Course。 這個課程將從基礎知識開始,因為我不想把還不了解JavaScript的人排除在外,但我們會很快深入到真正的內容。 我想確保覆蓋到所有令人困惑的內容。 我正在組織這個新課程,這是我以前從未做過的方式,非常特別。 這個課程的形式將回顧我在2019年做過的一個課程,每天發送一封郵件,其中包含一些問題和挑戰。 這個課程將持續4週,總共20天(星期一到星期五)。每天都將解鎖一個新的課程,並且以有趣和互動的方式來完成。我們將全力投入到當天的主題中。 每天你都會收到一封郵件,推動你采取行動。穩定性很重要,一旦你註冊,我不希望你只是旁觀。我希望你能加入其中,與其他註冊課程的人一起學習。 這樣一個大型社區,為期20天,可以一起成長。 我為此建立了一個新的課程平台,希望這將是一次很棒的體驗。 當然,我們將建立一個社區,因為這是一個特殊的活動,所有特殊的活動都值得建立一個社區來互相幫助。 嗯,我上面列出的所有主題都將得到特殊對待,因為這可能是一個能讓它們一次擊中要害的課程。

不要從一個語言跳到另一個

今天我想談談在學習編程時可能遇到的一個問題。 我收到很多提到這個問題的電子郵件。 以下是一個例子。 你開始學習Python編程。過了一段時間後感到沮喪,失去動力,等等。然後你切換到JavaScript。 你開始學習JavaScript,直到遇到了一個阻礙點,事情變得比預期的困難,或者你不知道接下來應該學習什麼。 對於這個編程事情你感到疲倦,所以你放棄了。 或者你再次切換到另一種語言,希望這次能成功。 我稱之為「從一個語言跳到另一個」。 在網站開發中,從一個框架跳到另一個框架也很常見。你從Vue開始,然後切換到React,然後再切換到Svelte,然後又出現了一個新的框架。 草地並不比對岸更綠。 選擇一個事物。 堅持下去。 深入學習它。 將它了解透徹。 有一天你會意識到你真的想學習另一種語言,那很好。 但是在開始和成為一名開發者時,選擇一個語言。 每次切換語言,你都需要忘記一些東西,並學習新語言如何處理事物。 這也會讓你感到困惑。 你會開始混淆事情。 在一開始的時候,選擇哪種語言並不重要。 如果我必須建議一個,Python和JavaScript是非常好的選擇,因為它們的流行性和靈活性。

人人都可以學習編程

就像人人都可以學習數學基礎一樣。或者就像人人都可以學會開車,或學會使用智能手機一樣。 我相信每個人都可以學會編程。只要付出足夠的努力,使用好的培訓材料,並具備一定的動力,這是非常具有可行性的。 同時,我認為學習編程應該是有趣的。會計是無聊的。但是編程電腦呢?我們可以讓它們做很棒的事情,所以只是想到它是件無聊的事情就讓我笑出聲來。這是現代世界中最有趣的事情之一。 我在整個課程中都採用這種方法。讓我們一起學習編程JavaScript,並且讓它變得有趣! 我不假設任何特定的背景知識 - 每個人都可以學會編程,而且你不需要知道計算機內部的工作原理!畢竟,我們可以拍攝出精彩的視頻和照片,而不必知道相機的內部工作原理,對吧? 順便說一下,我也會解釋一點關於這方面的知識。 曾經在10年之前,我們是那些整天呆在房間裡,盯著螢幕的怪人。如今,幾乎全世界的每個人口袋裡都有一台計算機 - 我們征服了世界。 你可能會從不同的角度來學習編程。也許你正在轉行。也許你一直想成為一名網絡開發人員,但生活卻把你帶到了其他地方。也許你15歲,準備佔領世界。也許你85歲,只是想創造一些有趣的東西,不需要賺錢,只是為了樂趣和讓事情運行的滿足感。所有這些都是學習編程的很好且完全有效的理由。

介紹Arduino

對Arduino電子平台的總覽 Arduino是業餘電子生態系統中的一項突破性技術。 所謂的突破性並不是指它引入了一個強大的微處理器或任何相關的技術。 它實際上創造了整個行業,一個運動,在此之前並不存在。 我所說的是創客運動。在Arduino之前,電子學並不像今天這樣有趣且容易學習,周圍也沒有太多資源。我在技術高中和米蘭理工學院學習了多年的電子學,但那是一些非常嚴肅、理論性的東西,幾乎沒有程式編碼和樂趣。 Arduino誕生於意大利,來自Ivrea,這個城市也因為創造了1965年的第一台個人電腦的公司Olivetti而聞名。 Arduino從一開始就特別設計成一個學習設備。這一個簡單的事實影響了原始Arduino核心團隊所做的幾個設計選擇。 我不會深入探討歷史細節,但你可以在維基百科上自由查看它們。 Arduino的關鍵成功因素在於它完全是開源的,並且它是最早一批開源項目。硬體是開源的,軟體也是開源的。 例如,最新的Arduino Uno板,Arduino Uno Wifi Rev2的電路圖可以在線上找到。這很酷,因為你可以自己建立Arduino,如果你想的話。公司可以製造和銷售自己的Arduino克隆版,而且他們已經這樣做了。我第一個Arduino是從一家叫做Elegoo的公司買的,他們提供了令人驚喜而又便宜的套裝,裡面有很多元件和教程可以讓你入門。 此外,周圍有一個完整的工具、庫和教育資源生態系統,使它取得了巨大的成功。在此之前,像這樣的開發板要麼很難獲得,材料也太過專業,更適合技術人員而不是學生。Arduino改變了一切。官方網站https://www.arduino.cc/上充滿了學習材料、示例、教程,還有一個活躍的項目中心和社區論壇。此外,Arduino還建立了一個IoT雲平台,讓你可以將設備連接到網絡。 隨著時間的推移,Arduino團隊推出了幾款不同的開發板:Arduino Uno、Arduino Mega、Arduino Diecimila、Arduino Robot、Arduino Nano、Arduino Micro、Arduino Leonardo、Arduino MKR等等。 每個開發板都有自己的用例。例如,Arduino Nano和Arduino Micro非常適合物聯網、可穿戴設備和小型裝置。Arduino Mega具有比其他任何板子更多的記憶體和I/O引腳。 截至今天,Arduino Uno開發板是目前最受歡迎的學習板,它包含在許多套件中,並且被用於大量的教程中。 Arduino MKR WiFi 1010開發板在物聯網中得到了廣泛的應用,因為它具有內置的WiFi和藍牙功能。 Arduino沒有操作系統,它一次只運行一個程序。 你不必擔心任何其他事情,因為Arduino上除了你的程式之外沒有其他東西。 大多數Arduino開發板甚至沒有網絡連接,出廠時如此。有些開發版是有網絡連接的,比如Arduino Uno WiFi rev 2或Arduino MKR WiFi 1010。 程序加載之後,只要Arduino通過USB或電源端口通過交流-直流電源線或電池供電,它就會啟動。 這意味著一旦你加載了程序,你可以將Arduino放在山上,配備太陽能電池板和電池,它將在有電力的情況下一直運行。 它只能運行為Arduino平台編譯的程序,這主要是指使用Arduino語言編寫的程序,該語言是C++語言的一種帶有一些便利功能的版本,使初學者能夠輕松上手。 但你不僅僅局限於此。如果你可以忍受Arduino連接到計算機的USB端口(或者由樹莓派驅動連接),你可以使用Johnny Five項目在其中運行Node.js代碼,這相當酷。其他語言也有類似的工具,例如pyserial和Gobot。 Arduino有什麼用處? 首先,它非常適合學習電子學。 此外,當你想為Arduino編譯一個程序,連接一個電池或電源連接器並將其放置在某個地方運行,並且與傳感器和其他與現實世界接口的有趣的東西進行玩耍時,Arduino十分強大。 例如,我會使用Arduino來為我的自動澆水植物、追蹤室外溫度或控制家居自動化設備等等。 在不久的將來,我將製作很多項目,並將在這裡發布教程,以展示我如何構建這些東西。

你應該是團隊中最差的開發人員

一些關於你的技能水平與你一起工作的人的想法 我是通過一位朋友介紹程序設計的。當時他來我家,當我們在玩Linux電腦時(應該是1997年左右),他問我:“你不知道如何編程電腦嗎?” 我回答道:“不知道”,然後他很友好地給我講解了如何在Linux上編譯C代碼的教程。 那是我對真正程式編程的第一次接觸,當然不算MIRC的修改和主題,雖然它們也算是編程,但更像是腳本。 那時的我是一個菜鳥,看到這個非常有知識的人讓我意識到自己所不知道的知識有多少。我對什麼都不懂,我只是在使用電腦,而不是編程。 然後在大學裡,我是小組裡最差的學生。要知道,這是一所工程學校,而我並不是成績優秀的學生,所以我從身邊的人那裡學到了很多,也學會了如何提升自己以達到他們的水準。比起去一所要求不高且在中等水平的學生中成為最好的學生,我覺得這樣學到的東西更多。 但是當我大學畢業後開始工作時,因為我是一個自由工作者,有時會發現自己是房間裡最好的開發人員。我積極努力避免這樣的情況。 我最喜歡的工作是和團隊合作的工作,尤其是那些每個團隊成員在某些特定技能方面都比我更優秀的工作。比如技術能力方面或是成為一個出色的團隊成員。 現在的我已經不再是團隊的一部分了,已經有2年多了。獨自工作的我必須找到一群我可以向他們學習的人。 如何做到呢? 下面是我從中學習的一些人: 播客。我訂閱了將近200個播客,並定期尋找我可以學習的話題。從技術類的JavaScript編程到數碼營銷,再到聆聽其他人在互聯網上的創業者或小型企業主的冒險故事。 博客。我讀很多關於各種主題的博客。 Twitter。我在Twitter上關注一些智者和令人難以置信的人,不論是直接關注還是使用列表。 書籍。我讀了很多關於各種主題的書籍。 YouTube。我每個星期都會花幾個小時觀看很棒的YouTube視頻,從編程螢幕錄製到JavaScript會議演講。不僅如此,我也喜歡消費很多不同的內容,包括人們在森林裡散步並談論露營之類的。 這樣子很多。我沒有列出會議或活動,因為我很少去參加。但我也忘了與人面對面的接觸,當然,這是學習的最有效方法之一。 對我作為獨立工作者而言,這種比例非常適用: 1/3 學習新的東西 1/3 實踐我所學到的東西 1/3 教授我所學到的東西 有時我學到的東西只是存儲在長期存儲中,或者僅僅將其保存在腦海中以供以後使用(因為現在可能用不到它們)。 這適用於我作為獨立工作者,因為我沒有團隊成員。這同樣適用於自由工作者,或者那些在某些他們不認識的領域中努力提高的人。 我想我想要說的是,不要只滿足於成為自己所認識的特定領域中最好的人,也不要只比周圍的人更好,這是危險的。 由於互聯網的存在,你可以很容易地接觸到無數比你更優秀的人以學習你所做的事情。

公園的步道系統

步道系統是指某個區域周圍的一組步道網絡。它可以是徒步步道、雪地摩托步道等等。 就像步道系統為你提供了一張你曾經去過和將要去的地方的地圖一樣,你的企業的步道系統是其他人導航你的宇宙的地圖。 我來舉個例子,說明一下我的企業步道系統。 我有一個博客,我每天在這個博客上寫作。很多人通過谷歌和其他站點找到這個博客,這些站點上有人鏈接到我過去寫的博客文章。 所有這些都是從外部世界帶到我步道系統開始的道路。 我無法控制每天有多少人出現在步道系統的門口。 我能控制的是步道是否乾淨、整潔,是否值得一遊。它是否讓人感到親切,是否便於快速訪問。 不同種類的人出現在步道上。有些人對他們看到的東西不感興趣,他們想象的東西可能不同。也許他們的鞋子不合適,或者今天的天氣不太好。 其中很多人會轉身離開,再也不回來。 然而,其中一部分人會喜歡他們看到的,並繼續沿著步道進入公園。 他們喜歡閱讀我寫的文章。我解決了他們的問題。他們收藏了我的名字。他們記得我的名字。 他們沿著步道行走,直到他們決定我的電子書值得一觀。我過去4年寫了一系列免費電子書,即2018、2019、2020、2021年。目前總共有14本書。 這就像在步道上有14個可以過夜的小木屋。過夜是免費的,我只需求訪客提供他們的電子郵件地址。 當他們給我他們的電子郵件地址時,我們建立了第一次真正的聯繫。每天有太多人出現在步道系統的門口,但只有很少數達到通過電子郵件聯繫的程度。 那些留下他們電子郵件的人是我們的第一個朋友圈。 步道系統很廣闊,每週都有很多事情發生。我並不經常能夠與每一位朋友聊天,但我每週都會寄一張明信片和一小段註釋。 所以,即使你完成了閱讀我的書,你還會記得我和你在公園的住宿。 日子一天天過去,夏天結束,公園的樹木換上了彩色的葉子。 每天仍然有很多遊客來到,因為即使下雪的時候,公園還是美麗的。當冬天來臨時,我會為滑雪和在雪地中散步準備特別的路徑。 我偶爾會進行一些冒險,並告訴你我學到了什麼。 編程和用代碼創作始終是一個有趣的手藝,一種藝術,一個不斷發現的過程。 晚上,我在我的小木屋裡整理我所學的一切,以便讓新手很容易找到自己的道路。 有時我會組織一個大型聚會。我可能每年組織幾次。有些聚會時間較短,我稱之為大師班。那時我會邀請你進來,我們將一起深入學習一個特定的主題,比如React或JavaScript。 有些則更長,持續幾個月。那些是訓練營。那些是我作為初學者的旅程,我會確保你在未來完全配備好。為你的職業生涯做好準備。 有時我也會打開收音機,發送一些小更新,我們稱之為推特。主要只是閒聊。但當我有重要的消息時,我總是會通過電子郵件發送通知。 有時我也會做一些有趣的事情,一周後才意識到它是個壞主意。這就是公園及其步道系統的美妙之處。它始終在運動中。沒有什麼是待滯的。它始終在發展。 這就是我在公園做的事情。 如果你喜歡,我會在這裡並且我們將來會有很多的樂趣。

如何學習多種語言?

在我發送第一封電子報宣告新的SwiftUI系列時,有人問我這個問題:“你是如何學習多種語言的呢?” 好問題! 在過去,我學過Pascal、C、Java、PHP、JavaScript、Objective-C、Go、Python和Swift。我想我列出了我使用過的所有語言。 並非所有語言都是一樣的。有些比其他更“平等”(引用)。 我認為上述的所有語言非常相似。一旦你學會了其中一種,很容易學習其他語言。變數、函數、迴圈、物件。 當然,不同的語言都有一些獨特的特性,比如Go的協程或者C是非常低級的。但是底層基礎是相同的。 有些語言非常非常不同,比如Haskell、Elixir或者Lisp。我希望有一天能夠學習它們,但目前還沒有機會。 現在,我嘗試專注於受歡迎的初學者友好語言,有一個很好的原因。原因是你不會用Haskell開始你的職業生涯。當你去學它時,你已經是一個經驗豐富的程序員,我不需要教你任何東西。 不管怎樣,我稍微偏離了主題。 “你是如何學習多種語言的呢?” 我選擇一種新的語言,長時間專注學習它。 我用這種語言來建立東西。 我不斷練習,以初學者的心態,好奇並開放於這種語言應該如何運行。 有些語言很無聊,有些非常令人興奮。這完全取決於你需要做什麼。如果你夢想著機器學習,Python對你來說可能非常令人興奮。如果你的夢想是構建一個被世界各地數百萬用戶使用的iOS應用程序,Swift就是你的選擇。 我覺得在你的職業生涯中並不只學習一個編程語言。除非是特殊情況,事物會不斷變化。 20年後我不會繼續使用JavaScript。JavaScript要麼會完全不同於現在(就像你將現在的JavaScript與10年前的JavaScript比較),要麼它將會是一種古老的語言。 這就是為什麼我不標榜自己是一個“JavaScript開發者”或任何其他標籤。我只是一個開發者,這就是全部。 語言只是工具。 學習一門新語言並不是一個終點,而是一個冒險的開始。

從教學到自己的專案的過程

什麼時候應該從閱讀/觀看教學轉移到實際開始進行專案呢? 有人在Twitter上問我:如何從教學轉移到專案呢? 我覺得這個問題很有趣,因為我相信要真正學會一個技術,你需要用它來建立一些東西。 你不能只是閱讀教學,但是當然,一些教學仍然是必需的。 沒有人天生就會使用某個東西,除非我們被教導如何使用,或者我們深入研究了相關文件,或者在一個特殊情況下,我們瞭解該事物應該如何工作,這是我們在使用開源軟件時可以實際做到的事情(但這比較容易說得比做得好)。 每週我都會定期學習新東西,這是我的工作的一部分。這也是我喜歡做的事情。 學習新知識是我的生計。然後我使用這些知識來創建項目和軟件,或者將這項技術教授給其他人。 但是從學習一些東西到實際構建項目是具有挑戰性的。 在“閱讀/觀看X教學”和“構建下一個Airbnb”之間,沒有明確可見的界線。 教學使你達到比你起點更進階的程度。 但在某個時候,你需要開始一個項目,以跨越到下一個水平: 在“結束教學階段”和“開始項目階段”之間存在著一段神秘的間隔。 通過“項目”,我的意思也是指一個樣本網絡應用程式,用於測試你的想法,不一定是一個大型或最終的項目。 如果不進行項目,你就無法達到那個更高的水平。 著名的格言“讓你成功的東西不會讓你更進一步成功”說得很對。 你會達到遞減回報的點,如果你不停止僅僅閱讀教學,你會開始遺忘那些將要應用的知識,而你將不得不回到閱讀教學的階段: 不管怎樣,你仍然會不斷回到教學中。但是對於在項目開發過程中遇到的特定需求,你需要回顧教學。 你只需要有一個項目的想法。如果你還沒有想法,就去想一想。或者看看我的樣本應用點子清單。 從按照IKEA傢俱的逐步指示開始,到從頭開始建造自己的傢俱難嗎?當然很難。 但如果你從不開始,就永遠不會達到那個點。 給自己一些時間,然後開始做吧。

我在2017年成為Go開發者的計劃

我知道,現在已經是2020年了。但我在整理電腦時,偶然發現了一張2017年的思維導圖。 根據那些記錄,早在2016/2017年我就有一個目標:成為一名員工。獲得一份穩定、待遇優厚的工作,而不是當一名承包商,從事無數個副業,卻從未發展成盈利的企業。 我希望能夠以Go開發者的身份被一家公司雇用。雖然我精通PHP和JavaScript開發,但對於除了個人項目外的Go經驗一無所知。但是,我對於使用相同技術堆棧開發感到有些厭倦,想要嘗試一些新的東西。 對我來說,現在這個想法聽起來有些瘋狂,因為: 我從未做過員工 那個時候,我已經擔任自由職業者/承包商將近10年了(現在已經超過13年) 讓我不再從事自己的項目的想法對我來說很難相信 但是,對你來說,看到我是如何計劃從對Go一無所知到在幾個月內成為一家公司的Go開發者,可能會很有趣。 我買了一本關於Go的權威書籍:《The Go Programming Language》作者是Donovan和Kernighan。是的,就是那個《C語言程序設計》(K&R)的Kernighan。 這本書非常棒,強烈推薦。 我花了一個月的時間認真閱讀了每一章。每天都學到一些新知識,並將我的筆記整理成博客文章。 我每天發布博客文章,有時甚至一天發布多篇。 我在算法和算法平台上進行了一些小項目的開發。 我開始了自己的項目,它是一個很好的主意,我現在仍然這麼認為。這是一個與GitHub互動的Web應用程序,旨在幫助可視化項目隨時間的進展情況。 我使用Go來構建它,這是一個很好的學習過程。 當你在一個你對之充滿興趣的項目上工作時,學習起來比在學校裡因為獲得詢問而學習要容易得多。 我讀其他人在GitHub上的代碼。我花了幾天的時間在Go論壇上,試圖理解人們寫的內容。 我看了一些使用Go開發的熱門項目(如Docker、Kubernetes等)。 我追蹤了Go領域的每一位主要的「影響力者」,每一位在這個主題上有影響力的Twitter帳號。 我訂閱了我能找到的所有Go郵件列表。 我訂閱了所有關於Go的播客和YouTube頻道。 總之,我整天都在全身心地投入到Go中。 從早上到晚上。 這是一個很好的計劃。 在一些面試過程的後期,它算是有點成功。 但它沒有成功,也就是說我沒有被雇主聘用,因為有1個原因:我並不真正想成為一個員工。 對於自由和獨立以及建立自己的事業的渴望太強烈了,所以由自由職業者/承包商/獨立人轉變為員工的轉變失敗了。 回顧起來,我對此感到滿意。 而且,我可能無法長期成為一個員工。 我仍然了解Go,並且我真的很高興我花了那麼多時間和精力去學習。 這使我成為一個更好的開發者,無疑的。