學習你的第一門程式語言

2016-11-03    分類:程式設計師人生、首頁精華1人評論發表於2016-11-03

本文由碼農網 – 小峰原創翻譯,轉載請看清文末的轉載要求,歡迎參與我們的付費投稿計劃

這篇文章摘自於我即將推出的新書《The Complete Software Developer’s Career Guide》的其中一章。

好的,決定好想學什麼程式語言了嗎,現在就讓我們開始學習吧。

所有你需要做的就是開啟一本書,然後開始閱讀,是這樣的嗎?

不全是這樣的。我的意思是,你可以用那種方式學習——如果你喜歡挫折的話。

還記得我們談到過的通過動手才能學得最好嗎?

這就是本文的主旨。

我會給出學習第一門程式語言的理想方法佈局,你不僅應該學習這個佈局方法,還應該享受精通它——如果不能掌握的話。

學習第一門程式語言或許是學習程式設計最困難的事情,但並非一定會這樣。

大多數程式設計師——包括我自己 ——通過閱讀一本書嘗試做一些東西出來,遇到挫折難題,然後再重讀並繼續嘗試的事情,直到終於可以按預期工作。

我將與大家分享的東西來自於教導和訓練軟體開發人員學習第一門程式語言和提高語言技能的經驗。我也加進去了我自己學習語言,如C++,C#和Java的經驗。

基本上,在這篇文章中,我將展示給你我做的一些事情——我現在瞭解的東西——如果我是你,並且現在要去學習第一門程式語言的話。

從看一個正在工作的應用程式開始

大多數程式設計師,當他們想學習程式設計的時候,往往是從一本書開始。

雖然有一些優秀的書籍會手把手地教你程式設計,但我認為最佳的開始是檢視一個能實際工作的應用程式的原始碼,然後試著儘可能多地找出正在發生的事情。這很難。

它會讓人覺得不舒服,但是不要畏懼。要習慣這種不舒服的感覺。這是讓人成長的唯一路徑。

我想要你做的是選擇一個開源應用程式——最好是流行的,才有可能被精心設計——然後瀏覽它的原始碼。你可以在GitHub上找到大量專案,因此我建議你去那裡尋找。

並且,你最好可以下載這些程式碼,自己構建並執行這個應用程式——雖然這樣說的話超出了這本書的範圍。如果你有一個朋友可以幫助你做這些事情,那就更棒了。當然沒有,也沒有關係。

重要的是,你要去探索程式碼,從而瞭解程式語言的語法看起來是什麼感覺,並試著閱讀程式碼看看你能否理解或弄清楚意思。

使用應用程式本身,如果可能的話,這樣你才能夠感覺到程式碼和程式碼作用之間的關係。

就像我說的,這讓人感到很不舒服。你可能會覺得你看不懂任何東西。

再說一遍,那沒關係。你只需要竭盡全力看看你能夠搞清楚一兩件事是如何工作的,或在程式碼中你可以做哪些變動以便於用某種方式改變功能。

此外,大致瞭解程式碼如何命名以及如何被組織的。就像你是一個考古學家試圖瞭解一些古文明的著作一樣。這樣的開始可以讓你比大多數不知道將要學習的程式語言是什麼樣的程式設計師要更有目的性。

在沒有開始旅程之前先大致瞭解當地情況總歸是好的。程式設計沒什麼不同。

找一些好的資源或書籍,大致看一遍

要想在啟航之前,更進一步地瞭解當地情況,接下來要做的並不是反覆閱讀程式設計書籍,而是挑選一些其他資源——如視訊,文章,或教程——大致看一遍。同樣的,這又讓人覺得有些不舒服,因為很多你看到的內容你並不明白它是什麼意思。

但是……你需要涉足這個領域。你只要能夠差不多瞭解這個東西到底有多大,你要學習的是什麼以及常見概念是什麼就可以了。

這些前提工作在你大概明白要學習什麼型別的東西以及概念是如何建立在彼此之上的時候,會收到效果。

瞭解如何建立“Hello World

好的,關於這一點你依然不用“閱讀”或上手程式設計。

以後會讓你做到想吐的——如果你想的話。(不遵循這些步驟,實際上你也能學習程式語言。)

此時你要做的是儘可能地建立最基本的程式,無論你學習的是什麼程式語言。

還記得我們談到過的“如何開發技術技能”嗎?這正是此處的目標。你想要儘快開始,這樣你就有足夠的信心和知識學以致用。

你所要開始的一個非常基本的程式叫“Hello World”。大多數程式設計書籍一開始都會讓你去建立一個“Hello World”程式,這通常指的是輸出“Hello World”到螢幕上。

這可能並不需要太多關於程式語言的知識,但是需要熟悉並測試用來構建和執行程式所需的基本工具鏈。

如果你正在閱讀有關程式語言的書,那麼書中應該包含一個“Hello World”程式便於你建立。

如果沒有,那就谷歌搜尋“Hello World +你的程式語言”。馬上就能找到例子。通過建立“Hello World”程式,你還可以學到該程式語言程式的基本結構。

學習基本構造,並用真正的問題測試

如果你使用相應的書籍或某種形式的教程學習程式語言,那麼現在你可以通過它們來學習了。

此時,你會覺得正在閱讀的書或上的課程並沒有你剛開始認為的那麼神祕。

現在你要做的是熟悉所學程式語言的每個基本結構,然後使用這些構造編寫一些程式碼。

你需要儘可能實際地嘗試和思考將所學的東西與問題和應用程式聯絡起來,當你將技能應用到實際問題的時候,這樣才能更好地理解和記住這些知識。

下面是大多數程式語言所包含的一些基本結構:

  • 能夠輸出到螢幕上
  • 基本的數學能力
  • 作為一個變數儲存資訊
  • 組織程式碼成函式,方法,或模組
  • 呼叫函式或方法
  • 布林邏輯評估的效能
  • 分支條件語句(if / else)
  • 迴圈語句

下面是一些好訊息。

一旦你瞭解這些基本結構並知道如何使用它們,你就具備了語言的基礎知識。是的,語法可能不同,但這是程式設計的核心。你可能會花費大量時間在這個階段。

用你自己的方式去做,一次一個地去學習程式語言的結構,並通過實際編寫一些程式碼來應用每個結構。如果你採取的是自己的方式,那麼你需要確定結構是什麼以及學習的順序。

如果你正在閱讀書籍或學習教程(最好是多本書籍和多個教程),那麼具體路徑應該已經呈現在你眼前,甚至有一些例子和挑戰任務。儘量確保明白你正在學習的內容以及如何應用它們。

現在可以回去看看你第一步看的原始碼了,看看你能明白多少。

知道語言功能和庫之間的區別

經常絆倒初級程式設計師的一件事——尤其是今天的程式語言——是知道語言的部分是什麼,以及語言自帶的標準庫的部分是什麼。

通常情況下,區別不是很清楚,因為,習慣上看,你會非常頻繁地使用標準庫編寫程式碼。

沒關係。你需要了解所學程式語言的程式設計約定,但你應該特別小心地去嘗試並指出實際語言部分以及常用於語言的庫的部分。

這似乎有點雞蛋裡面挑骨頭,但我認為這很重要,因為它可以擼順此刻在你腦中雜亂無章一塌糊塗的語法,並幫助你更有意義地分類和組織。

你會明白,對於大多數程式語言,語言的實際部分本身並不是很大,並且比較容易學,但標準庫很大,用你的方式瞭解它們相對而言要困難得多。

現在的程式設計,比起說是做語言絕對的專家,更多的是關於知道如何使用庫和框架。這就是為什麼這種區別顯得重要的原因之一。

通過認識到哪些並非語言的一部分,而是庫的一部分,並瞭解如何查詢庫來完成相應語言中的常見任務,你會成為一個更好的程式設計師。

審查現有程式碼,理解每一行程式碼的意思

此時,你應該已經熟悉所有所學程式語言的主要概念,並在實際例子中用過大多數程式語言功能。

你對語言本身和與語言結合使用的庫之間的差異也有了深入瞭解。但你對程式語言可能仍然覺得沒有那麼舒服,或者你實際上還不懂。

這是一個你感覺自己可以理解所有一切是如何工作的階段,但卻不知道如何把它們放在一起,寫出一個真正的應用程式。許多初級程式設計師往往會因此而停留在這個階段,感到沮喪,覺得他們永遠成不了一個真正的程式設計師。

脫離這個困境並確保在知識上不會有欠缺的最好方法之一是,檢視現有的程式碼,一行一行地,確保你能準確理解每一行和每一個宣告在程式碼中是做什麼用的。(即使你有時不知道原因,知道具體的過程依然是一種進步。)

這裡的現有程式碼可以用你在第一步時看的專案的原始碼裡面隨機的專案檔案。開啟一個檔案並仔細檢查檔案中的每一行程式碼,確保你知道它到底是做什麼的。

如果你不明白——話說會有很多東西你都不明白——那就花一些時間思考一下,仔細檢視你不明白的地方。有點乏味。甚至可能是枯燥的,但是值得。

當你到達一個你覺得你可以讀懂任意一行程式碼並理解它做什麼的階段——同樣的,知道為什麼在此時也並沒有那麼重要——說明你已經做好了繼續前進的準備。

構建東西,構建很多東西

現在是時候真正開始使用程式語言了。

此時,你已經能寫一些小程式了,使用大部分的語言特性,但只有真正實際去構建應用程式,你才能更深刻地感受程式語言。

挑幾個小專案——別太大——然後構建應用程式。

不要太雄心勃勃,要知道一口吃不成個大胖子,所以在這個階段不要試圖做任何相關於平臺或UI密集的東西。最好你的應用程式只輸出文字到螢幕上,並暫時只從鍵盤中接受輸入。

目的是為了建立專注於使用程式語言和標準庫的簡單應用,不要額外新增針對於平臺功能的框架——接下來會涉及這方面。

這樣做可以幫助你增加使用程式語言的信心,並瞭解為了完成目標你需要使用什麼樣的語言構造。

下面是一些幫助你開始的簡單的專案點子:

  • 建立一個解決數學問題的程式,從使用者獲取輸入。
  • 創造一個可選擇冒險型別的程式,從使用者輸入來確定接下來會發生什麼。
  • 建立一個非常簡單的基於文字的冒險遊戲,使用者可以發出命令來拾起物件,在房間移動等。
  • 建立一個能夠從一個文字檔案中讀取輸入並輸出寫入到不同文字檔案的程式。
  • 建立一個聊天機器人,能和使用者交流,假裝是人或給出幽默的回覆。

應用程式語言到特定技術或平臺

到了這個時候,你主要學習了關於在封閉條件下如何使用程式語言。

這是有意的,因為你需要在增加環境和用於構建真正應用程式所需框架這些額外的複雜性之前,瞭解並熟悉程式語言本身和它的標準庫。

為了用程式語言創造一些有用的東西,你需要應用語言到特定的技術或平臺。

所以,這個時候,你需要確定幾個可以完成的需要在特定平臺上使用程式語言的小專案。

舉個例子,假設你正在學習Java。到現在為止,你會編寫Java程式碼,程式碼可工作在任意Java可執行的平臺上,因為你大多數時間會使用標準庫,並且只會輸入和輸出到螢幕或檔案。

此時,你可能會決定使用Java來構建一個Android應用程式。你需要學習如何構建Android應用程式以及有關Android框架的知識。 但是,由於你已經熟悉Java,所以就沒有必要一次性學習大量的東西。

當然,你可以一起學習Android和Java,事實上,我做了一個Pluralsight課程來教授如何做到這一點——但為了實際掌握語言並且避免混淆,從平臺或技術獨立語言,然後再結合它們可能會容易得多。

現在,你用程式語言來發展特定和專業技能,在找工作時會很有用。

選擇任何你想要使用的任何平臺或技術,用這些平臺或技術來建立一些小的應用程式。

我還建議你在這個時候最好還是隻專注於單個技術或平臺。以後你總能學到更多。

通過這種專攻的方式,你不僅可以瞭解你需要學習的東西,還能讓你更深刻地瞭解知識和掌握特定技術,而這能讓你更有自信,大大提高你的技能的市場化能力。

解決困難的演算法問題以便於更好地掌握語言

到現在為止,你對你所學的程式語言應該感覺舒服多了。

你已經對它知之甚深,並且已經在各種不同的應用程式中使用過了。

你應該有了一個應用技能的特定技術或平臺,並且使用此技術來建立基本的應用程式感覺已經趁手和舒服多了。

儘管如此,你可能還是不覺得你掌握了這種程式語言。

不要擔心;這也是正常的。

當我第一次學習C ++的時候,我記得即使在我知道關於語言的一切,並且已經用這種程式語言實際建立了多個應用程式,甚至還被聘為一個編寫C ++程式碼的開發人員的時候,我仍然不覺得我真正掌握了這門程式語言。

我覺得我是一個很好的C ++程式設計師,但並非是偉大的。我真的很想提升我的C ++技能,但我不知道怎麼辦。然後,我發現了這個叫TopCoder的編碼競賽網站。

每個星期,那裡都會有一系列新的程式設計挑戰,你可以和其他的程式設計師一起比賽著解決一些相當困難的演算法問題。起初我怕極了。我甚至連最簡單的問題也解決不了。

我去看其他人的解決方案,我不知道他們是如何想出這個解決方案的,也不知道他們的程式碼是如何工作的。他們用著一種我萬萬沒有想到的方式使用C ++程式碼。但後來,隨著時間的推移,隨著我鍥而不捨地去嘗試解決問題,以及看別人是如何解決問題的,我漸漸成長起來了……一點一點,越來越優秀。

我發現瞭解決某些型別問題的模式。我開始真正瞭解如何利用我以前忽略了的C ++特性。我學會了如何高效地使用標準庫和語言功能以及資料結構來解決複雜的問題。我變得不僅擅長於C+ +,而且非常出色。我終於覺得自己貌似掌握了這門程式語言。這就是我要你做的。

你不必去TopCoder參與競爭,有很多你可以練習解決演算法型別程式設計問題的地方。

對於這類問題,我已經提到了一個很好的資源,還有一些是:

這些問題一開始你解決起來會覺得極其困難,沒有關係。本來就是這樣的。

你會發現,隨著時間的推移,你會開始認識到,只有屈指可數的一些問題型別,並且你能立馬指出如何解決這些問題。

起初,你毫無頭緒,不知道該做什麼,就像我說的,沒關係——只要繼續努力即可。

另外,不要忘了去看看其他人是如何解決這些讓你疲於應對的問題的。嘗試著去理解為什麼他們要用這樣的方式去解決特定的問題。

這是我用於學習如何解決這類問題的最佳途徑之一。

我會看看TopCoder上頂級程式設計師的解決方案,從中我學到了很多東西。

一旦你可以用你所學的程式語言解決這些型別的程式設計問題,那麼你不僅相當接近於掌握語言,而且通過編碼面試將會成為一件輕而易舉的事情,因為其他的候選人碰到問題只能汗流浹背,自愧不如。

即使是寫一本書也一個相當大的事業,我很高興能踏上這個旅程。

我希望你能和我在這條道路上一起前行。

譯文連結:http://www.codeceo.com/article/learn-first-programming-language.html
英文原文:Learning Your First Programming Language
翻譯作者:碼農網 – 小峰
轉載必須在正文中標註並保留原文連結、譯文連結和譯者等資訊。]

相關文章