如何學習一門程式語言或框架

螞蟻金服資料體驗技術發表於2018-03-08

作者簡介:Alan 螞蟻金服·資料體驗技術團隊

前言

年關剛過,相信已經有不少同學看著肚腩,習慣性地開始制定新年的運動計劃了。在這種時候如果你還看到了這篇文章,說明你是熱愛學習(工作不飽和)的。大魚大肉,滿腹油膩之時看乾貨並不合時宜,所以本次就翻譯一篇指導大家怎麼學習程式語言或框架的軟文,來作為開啟大家新年學習之門的潤滑劑吧。

原文連結:hackernoon.com/how-to-lear…

由於原文並不針對前端所寫,而讀者可能多是前端背景,所以我把一些素材和描述做了些許修改和擴充套件,以便更容易理解,以下是譯文。

正文

每天都會有許多新的程式語言誕生,例如:Dart、Go、Kotlin和Elixir等,前端框架更是日新月異。學習一門新的程式語言或框架並非易事,但是確實有一些方法和竅門能幫助你更快更好地掌握它們。

0_WW-iV1yoPWqUcd5H.jpeg | center | 686x457

先語言,而後框架

以前端為例,現在入門的很多同學上來就是React或者Vue,對JavaScript本身則知之甚少。語言根基不穩,學習和使用框架的時候自然也是搖搖欲墜,舉步維艱。如不知道原生JS事件機制,不知道事件代理 、捕獲和冒泡,想必也不能掌握React的事件機制;如不知道JS中經典的this指向問題,那麼在給React元件繫結事件處理函式的時候,就可能會出現莫名其妙的錯誤。像上面這樣的例子不勝列舉,所以同學們還是應當先掌握語言本身,打好基礎,再學習對應語言之上的框架,一方面使能更好地理解框架,同時也能避免一葉障目的情況。

多刷程式設計題

有許多這樣的網站,你可以在上面做各種程式語言的題目(有的還會經常有一些程式設計比賽)。通過做這些題目,可以讓你在語法、類庫和邏輯等方面學到很多。同時,這也不妨是準備面試的一種好方法。

多逛逛StackOverflow

在程式設計的過程中,你總會遇到自己無法解決的難題,這個時候,要記得上StackOverflow去求助,去看看別人有沒有遇到類似的問題。另外在StackOverflow上,還有一個專門的Code Review社群,只要你貼上自己的程式碼,就會有相應語言的專家評審你的程式碼,並提出改進意見。

對於那些可能打不開StackOverflow的同學,也可以去SegmentFault問問。

多讀程式碼

GitHub在你的學習之路上是必不可少的。在這裡,你可以找到許多用你現在正在學的程式語言或框架構建而成的開源專案。你可以看到別人在生產環境下,在大型專案下是如何使用這些語言和框架的。而且,如果你有自信,有技術,還可以為開源專案貢獻程式碼。

做個專案

一般來說,當我們去學習一門程式語言或框架的時候,都是為了要用它做一個專案,比如:搭建一個部落格網站,todo應用或百度百科這樣的網站。通過實際寫一個專案,會提高你各方面的能力。這裡還有一個很經典的網站就是ToDoMVC,這裡有基於各種框架做的todo應用,可謂框架入門必備。

安裝一個lint工具

現在的lint工具越來越強大了,以ESLint為例,不僅可以檢查程式碼格式,常見錯誤,還可以給出許多最佳實踐方面的建議。在編碼時使用lint工具,可以讓你更早地發現程式碼中可能存在的bug,同時也可以讓你的程式碼看起來更加優雅。

寫地道的程式碼

當我在學JS的時候,我想當然地把C#語言的程式設計知識應用到JS中,這是一種學習新語言的好方法。不過這種方法在一定程度上也阻礙了你更好地掌握新語言,因為它使你無法學習用新語言最地道的方式來編寫程式。例如:把矩陣中的每一個值都轉換成浮點數,程式碼如下:

const matrixOfFloats = matrixOfAny => {
  const l = matrixOfAny.length;
  const li = matrixOfAny[0].length;
  const newMatrixOfFloats = [];
  for (let i = 0; i < l; i++) {
    const row = [];
    for (let j = 0; j < li; j++) {
      row.push(parseFloat(matrixOfAny[i][j]));
    }
    newMatrixOfFloats.push(row);
  }
};
複製程式碼

而較為地道的JS寫法是這樣的:

const matrixOfFloat = matrixOfAny => matrixOfAny.map(row =>
  row.map(anything => parseFloat(anything))
);
複製程式碼

不放棄,不拋棄

有些語言和框架的學習曲線是陡峭的,你需要時間和精力來克服。當你遇到瓶頸的時候,不要放棄,因為可能你已經離精通不遠了,請運用上面提到的這些資源,去尋求幫助。

while(true) => study()

我認識一個程式設計師已經鑽研C#超過20年,至今仍在探索C#和.NET方面的新鮮事物。這個人就是Antonio Maniero——StackOverflow上最具影響力的葡萄牙人。事實上,我們永遠無法掌握一門程式語言的全部,這使得我們必須持續學習。某一天,你可能會擅長某些領域,併成為該領域的標杆人物,但是你會發現總有更多的東西需要去學習。

0_jPXlNYlwyodytXJ1.jpeg | center | 686x457

後記

原作者提到的這些方法大多偏重於實踐方面,然而我們知道,學習一樣東西,理論也同樣重要。所以,我建議同學們在學習時能多看一些官方文件,多看一些大神和前人的文章筆記。這樣,有了理論才能指導實踐,並用實踐來驗證理論。最後,送給大家一句名人名言。

不怕困難,不怕挫折,堅持奮鬥,努力學習,就能獲得進步與成功!
——《為陳醒民題》(1939年4月18日),《毛澤東題詞墨跡選》第17頁

對我們團隊感興趣的可以關注專欄,關注github或者傳送簡歷至'tao.qit####alibaba-inc.com'.replace('####', '@'),歡迎有志之士加入~

原文地址:github.com/ProtoTeam/b…

相關文章