2021 小白版,360 行行行轉 IT

程式設計師cxuan發表於2021-04-12

hey guys ,我是 cxuan,這一篇文章我就要和你聊聊程式設計如何學習,這一篇文章涉及的內容簡直太多了,我將從入門開始,一步一步到如何提高,然後到一些學習的相關問題,還有一些計算機相關的術語等,乾貨也非常多,準備好了嗎?那麼我們開始吧。

程式設計入門

我們首先需要解決的就是如何入門的問題了,這也是很多新手/小白的困惑,到底如何入手呢?我該從哪裡開始呢?

如果你有興趣學習程式設計,那麼樹立一個正確的程式設計觀念是很有幫助的。這個短片是很好的一個入門 https://www.youtube.com/watch?v=mvK0UzFNw1Q ,這個短片解釋了你應該以一種合適的觀點來開始程式設計。

在你樹立了正確的程式設計觀念後,你需要意識到一個問題,那就是沒有通用的學習程式設計的方法,所以市面上大多數培訓機構所提倡的方法並不適用於所有人,這只是他們大多數人所認可的學習方法,但是並不適用於你,你必須找到適合自己的程式設計方式。


這裡需要說兩個現象:

很多小夥伴們諮詢我關於程式設計方式的問題,這個沒有定數,有的人喜歡早上程式設計,因為早上比較清醒,思路比較清晰;有的人適合網上程式設計,晚上沒人打擾,而且晚上有一種魔力:空杯心態,你能更清晰的認識自己,到達一種心流的狀態。但是晚上有一點特別忌諱,那就是熬夜。所以你更需要平衡程式設計和生活,生活不全部是程式設計,程式設計不能完全替代生活,至少國內是這樣。


所以你需要找到適合自己的程式設計方式,我這裡強烈建議一下你按照下面這幾種方式來進行:

  1. 首先找到一些你所感興趣的問題或者專案,你可以嘗試構建工具來解決生活中的小問題,也可以嘗試實施從頭開始發現有趣的程式。這個專案將有助於激發你繼續學習編碼的經驗,併為你提供練習應用所學內容的機會。
  2. 做一些研究以確定哪種程式語言最適合你的專案。(下面我會進行介紹)
  3. 找到一些高質量的面對初學者的學習程式設計的資源。(同樣,下面我會進行介紹)
  4. 通過 google 搜尋來提問或者補充學習資源,如果沒有 tz 的話,可以使用必應和搜狗(面向微信公眾號平臺),微信公眾號很多文章比較專業的。
  5. 最終使用該語言完成了幾個有意義的專案

其實,上面這幾點歸根結底就是這樣

剛開始強烈建議規避這些不良的程式設計習慣!!!!!!

  1. 不要只是簡單的、被動的使用你正在使用的資源,要及時進行練習和家庭作業,實踐是學習編碼絕對必要的部分。
  2. 避免在程式語言之間來回切換;選擇一門語言並堅持下去。這是因為程式設計最終與解決問題有關,而不是與程式語言有關。學會解決問題是具有挑戰性的,並且是隻有通過練習才能磨練的技能。每次切換語言時,你都在浪費時間,可以花時間練習運用所學的知識來提高解決問題的能力
  3. 完成教程後,不要停止學習。程式設計是一項永遠需要新知識的領域

最後,請你記住,學習編碼註定是一項長期而又困難的過程,如果你覺得編碼很困難,那完全不要氣餒,這是很正常的,因為許多人會花很多年的時間學習和練習,才認為自己有能力找到尋找工作或者為重大開源專案做貢獻。但是幸運的是,程式設計入門並不難。

如何選擇程式語言

所以現在需要為上面的程式設計入門提到的幾點做一個解釋了。

首先,找到合適的、你所感興趣的程式設計專案,這個因人而異的,所以就是程式語言的選擇問題了。

我經常會被問到這個問題,我該選擇哪種語言作為入門

提出這種問題的人有兩個誤區:第一個是你潛意識中認為一定有一門最完美的程式語言來進行學習;第二個是第一門學習的程式語言好像會伴隨你的一生。。。。。。

事實上,沒有最好的程式語言(PHP 是最好的程式語言純碎是調侃,這篇文章要解惑下,大家不要相信,有的時候玩笑開著開著就成真的了)。而且你的第一門程式語言對你的職業生涯沒有決定性的作用,說起到決定性作用的人,你捫心自問,自己是不是思想懶惰不願意接觸新的程式語言了?

我要告訴你一件事情,剛開始學習一門語言是最難的,因為有很多複雜的概念你搞不懂,但是其實上大多數基本概念是各個語言通用的。隨著時間流逝和你對程式設計工作的深入,要學習一門新的語言會變得越來越容易。可能你剛開始可能要幾個月才學會一門程式語言,而一個有經驗的程式設計師可以在幾天內熟悉一門新的程式語言。

理想情況下,所有程式設計師都應具有多種語言的經驗。一旦你對一種語言感到滿意,就可以繼續使用另一種在某些基本方式上有所不同的語言。隨著學習更多語言,你將變得更有能力為手頭的任務選擇合適的工具,這是優秀程式設計師的標誌。由於程式設計概念至關重要,因此我建議初學者從下表中選擇一種主流語言。所有這些語言使初學者可以開始編寫簡單的應用程式並練習程式設計,而不必使用任何更復雜的語言功能。

如果你已經有了專案和目標,並且將自己的技能應用到要解決的問題上,你將會學的更快。下面是一些常用程式語言的說明,能夠讓你有更多的選擇。

如果看了這些你仍然覺得迷茫的話,那就不妨使用一門簡單易上手的程式語言 Python,Python 是一種良好的,適合初學者的語言,擁有一個龐大的社群和許多庫,可以執行幾乎任何你想做的事情,從製作遊戲到在家中或工作場所中使事情自動化,從進行資料分析到製作網站等等等等。在進入更復雜的應用之前,你需要找到一些好的學習資源

那麼我在哪裡能找到這些資源呢

下面我為你列出了一些資源獲取途徑

如何提高

如何從開始過渡到中等水平

當我剛開始入門的時候,我也有過這種現象,那就是現在該做什麼了?這種情況當你讀過一些書籍和教程解決過世紀問題後尤甚,但是最終很難從理解 if ... else 和 for 迴圈之類的事情過渡到理解如何使用應用所學知識來製作更復雜而有趣程式,這也是大多數程式設計師的問題所在。

在入門教程和複雜程式碼之間進行這種過渡可能很困難,https://www.thinkful.com/blog/why-learning-to-code-is-so-damn-hard/ 這篇文章很好的描述了這種現象。許多教程包括我上面列出來的一些教程和資源都會傾向於讓你掌握某種語言所具備的知識,但是你掌握了就掌握了,並沒有更進一步的打算。。。。。。這使很多初學者程式設計師陷入困境。

下面是一些針對改善這種情況的建議。

  • 從被動學習轉變為主動學習

    把學習的主觀能動性從希望別人教會你哪些知識到自己積極/主動去學習/吸收哪些知識。舉個例子,比如你不知道如何製作網站,你 google 如何使用 x 語言製作網站,然後 google 就會提示一大堆 HTML5 、CSS、JavaScript 等一系列教程,然後找到大而全的教程或者線上程式設計課程開始搞起。

    你通常可以找到你想要執行操作的教程,或者至少找到為你提供有關如何組成更具體的搜尋查詢的概述和線索的文章。更廣泛地說,面向搜尋來學習並不應該讓你感到羞愧,事實上這是所有程式設計師的入門和高階工作。

    我在剛開始工作的時候經常會因為自己不知道程式碼如何寫而感到羞愧,我恥於網上搜尋,經常自己悶聲想解決辦法,想不出來,無可奈何只能網上搜尋,出現正確的結果後,我不是 ctrl c v ,而是一個一個程式碼的敲下來,然而還在厭惡自己為什麼記不住這些程式碼如何寫,事實上這種情況及其不可取,既浪費時間又浪費精力,還不斷的懷疑自己,產生惡性迴圈。

  • 不斷練習

    程式設計有點像鍛鍊,因為改進的主要方法是不斷練習。從簡單開始,然後嘗試在命令列上編寫諸如剪刀石頭布之類的基本遊戲。完成後,嘗試選擇一個更具雄心的專案,然後完成該工作。如果您想混合一些東西,也許可以嘗試一些程式設計練習。

    從根本上說,程式設計實際上是關於應用問題的解決,而學習如何解決問題的最佳方法是不斷解決各類大大小小的問題。

  • 瞭解如何分解問題

    不管你在工作中嘗試解決困難問題,還是在嘗試找到一些大型開源專案時,你很可能會感到沮喪,因為任務看起來多麼龐大或令人生畏。不要被嚇倒,而是將問題分解分解問題)為越來越小的子問題,直到每個子問題都看起來比較容易上手和解決。

    例如,如果你正在學習 Java,想學習編寫遊戲,但不知道從哪裡開始或如何解決問題,那麼搜尋java 遊戲教程將帶來幾個不錯的結果,通常會告訴你如何將編寫遊戲的過程分解成較小的部分。

    從本質上講,你正在嘗試樹立工程師的心態。如果問題很大,請不要放棄。不斷將其分解成越來越小的碎片,並搜尋看起來不可能完成的任務。然後重複,繼續迴圈:分解,搜尋,分解,搜尋。。。。。。

    順便說一句,這是一種非常有效的自我教學策略!在練習時,你將會更好地瞭解如何解決問題,並將擴大你的知識/可能的問題解決方案庫。

  • 學習如何系統化

    我們程式設計師在遇到問題並除錯時經常會這樣,改改 border 大小重新整理一下頁面行不行,改改 margin 大小重新整理一面頁面看看生沒生效,就類似這種靠 去除錯和解決問題,這種習慣切勿養成。你需要運用所學知識,儘可能分析問題,判斷錯誤,學習,再分析判斷,再學習。。。。。。儘可能系統,避免試錯

    除錯時,切勿漫無目的。像科學家一樣嘗試思考-進行實驗以嘗試修復錯誤或縮小錯誤的可能範圍,並記錄結果。如果你的假設/嘗試的更改被證明是錯誤的,或者如果你認為某些更改不起作用,請停止,暫停並找出原因。

    當你的假設與現實不符時,就會發生錯誤。如果感覺不對勁,請不要忽略它 - 一直追溯到你確定問題出在哪裡/你所做的錯誤假設是什麼。

    這種學習是有意義的,它會讓你不斷思考,雖然過程很艱難,但是會促進你想解決問題的慾望,這種學習會一直持續下去。

    切記不要因為瞎 TM 試出來正確的結果而沾沾自喜。

  • 不要因必須除錯或谷歌而灰心

    並非所有初學者都意識到,即使在專業程式設計師中,花更多的時間進行除錯或谷歌搜尋是完全正常的。

    除錯(而且很費勁!)是編碼的重要組成部分。如果可能的話,儘量避免過分緊張或者不耐煩。將其視為有趣的探索和知識的拼接!!!

    即使由於某些錯誤而使你的實際程式碼沒有取得任何進展,只要你是在系統的學習,就可以練習解決問題的技能,儘管採用了不同的方式。

    結果,即使你花費大量時間來解決一個錯誤,你仍然要認為這部分的時間是值得花費的,除錯是善於解決問題的最佳方法之一!

    隨著你變得越來越有經驗,這更加正確。事實證明,遇到的錯誤的難度會隨著你的經驗水平的提高而增加。有經驗的程式設計師有時也會不得不花幾個月的時間來追蹤錯誤的情況並不少見。如果發現是特別令人討厭的錯誤。

  • 不要害怕尋求幫助

    最後,如果你完全陷入困境,又不知道下一步該怎麼做了,請不要忘了你可以找其他人尋求幫助!

    程式設計師通常非常有幫助。我們中的許多也是自學成才的,因此瞭解作為初學者奮鬥的感覺以及完全陷入困境的感覺。

    但是尋求幫助前,你需要儘可能的把問題描述清楚,問問題的技巧也是非常多,這一篇關於如何提問問題的文章,對你應該非常有幫助 https://www.reddit.com/r/learnprogramming/wiki/index#wiki_asking_questions

在哪裡可以找到程式設計練習和專案

如果你要建立一個專案,請參考以下一些想法以獲取啟發:

如果你想要做一些有挑戰性的工作,那麼你可以嘗試寫

  • 命令列實用程式(ls,wget,curl等)
  • 文字編輯器
  • 整合開發環境
  • 圖片瀏覽器
  • Office 套件(類似於Microsoft Office或Libreoffice)
  • 程式語言(編寫直譯器或編譯器)
  • 網頁瀏覽器
  • 資料庫(關係或非關係)
  • 網路伺服器
  • 版本控制系統

如何提高將任務/問題轉換為程式編碼的能力(演算法思維)

這是很常見的問題之一。

普遍的答案就是:編寫大量的程式

但是,有一個技巧能夠幫助你建立這項技能:

  • 選擇一項每天應該做的事情,例如做早餐或類似的事情。它應該不太容易,但也不要太困難。
  • 寫下你應該為該活動執行的步驟,但是要在與實際執行該活動的時間的不同時間內用完記憶體。
  • 下次執行該活動時,記下筆記並嘗試認真執行以下步驟。儘量不要偏離你所寫下的步驟,如果有必要,請記下差異。
  • 改進演算法,直到滿意為止。
  • 嘗試不同的活動。任務變得越來越容易。

儘管聽起來很愚蠢,但它確實有效。上面的方法已經在許多學生身上嘗試過,並證明可以顯著改善。

對於一個專案,我很難有很酷的新想法,我只是缺乏創造力嗎?其他程式設計師是如何受到啟發呢

對於初學者來說,https://en.wikipedia.org/wiki/Chuck_Close Chuck_Close 一個很不錯的想法

我想給年輕藝術家或任何願意聽我的人提供建議,就是不要等待靈感。靈感是針對業餘愛好者的;我們其餘的人只是出現並開始工作。如果你等著雲散開,一束閃電擊中你的大腦,那麼你將不會做很多工作。所有最好的想法都來自過程。他們來自工作本身。事情發生在你身上。如果您想幻想一個偉大的藝術構想,那麼你可以坐在那裡很長時間,然後再進行任何事情。但是,如果你只是開始工作,你會想象一些事情,但是實際上會發生另外一些事情,而這些其他事情會將你推向另一個方向。靈感是絕對沒有必要的,並且從某種方式上具有欺騙性。你覺得自己需要這個好主意才能開始工作。

只是坐在那裡等待靈感的火花,很少會有新奇的想法。如果你只是繼續嘗試構建一些東西(任何東西!),即使你的想法看起來有些愚蠢或已經完成,你的時間話費也是值得的。

畢竟,這就是藝術家和音樂家的工作 - 他們不一定從嘗試創作出高度創意的繪畫或創作自己的音樂開始。取而代之的是,他們繪製風景或花瓶,或覆蓋現有的歌曲。同樣的,提出專案構想時不要感到有壓力。重新實施現有程式是一個歷史悠久的傳統 - 看看你能獲得多大的收穫吧!

不過,這裡又一些想法和技巧能讓你參考

  • 嘗試重新實現現有專案:就像剛開始的音樂家是從報導別人寫的歌開始一樣,最好重新執行別人製作的程式。

  • 嘗試將程式設計連線到另一個愛好:程式設計是一項非常有用的技能,因為你可以將其應用於廣泛的領域,甚至與電腦科學完全無關的領域。例如,如果你對政治感興趣,則可以嘗試分析投票池和趨勢;如果你對音樂感興趣,則可以嘗試編寫數字音板;如果你對體育感興趣,則可以嘗試編寫幻想足球追蹤器或預測變數,如果你經營一家企業,可以寫些東西來幫助您跟蹤庫存。

  • 試著跟蹤讓你煩惱的事情:如果你發現生活中不喜歡的事情或發現重複的事情,請問問自己是否可以自動化。我記得耗子叔(左耳朵耗子) 也提到過這個 idea,比如使用 Python 來完成一些無聊的工作,這個 https://automatetheboringstuff.com/ 網站或許有幫助,你也可以搜尋家庭自動化教程 或者更多的解決方案

如何完成一個大型專案

我們上面也談到過對於大型專案的訓練方式:細化、拆分

但是首先,你需要對專案有一個全面的瞭解,也許橡皮鴨除錯會非常有用。向知識或理解為零的人(或某物)解釋問題或概念有助於更深入地瞭解問題。通過這樣做,人們必須對問題進行更多的思考,這將導致更深刻的理解。

然後,不要直接去碰電腦

你要花大量的時間去思考問題/任務。繪製一些草圖,一些虛擬碼,一些通俗易懂的語言提示,要現在紙上或者繪圖板上寫下你的思路,會有一些幫助。

自己處理大型專案時,請記住一件事

世界上的所有事物都是由較小的部分組成的。

這意味著你所看到的基本上是任何大型機器,房屋,摩天大樓,汽車,火車,計算機等,都由許多較小的結構組成,這些結構共同構成了最終產品。較小的結構由較小的結構組成,依此類推。

大程式也是如此。它們由許多較小的單元組成,這些單元耦合在一起構成一個整體。理想情況下(但通常不可能),每個較小的單元應獨立於其他單元工作(並進行測試)。

從小的單元開始,檢視問題或者專案是否還能夠繼續拆分,直到拆成你認為無法拆開為止。

不要看最終完整的專案和大圖,這會讓你不知所措,一次只處理一個單獨的部分就好。

經驗不足的程式設計師面臨的最大問題是,當他們處理大型任務時,大多數人會不知所措。但是這個問題並不是很難克服的:

不要試圖檢視所有程式的最終程式。專注於一個小的,易於管理的部分,完成它並繼續前進。即使是最複雜的程式/系統,也包含小的簡單的模組。

想象一下,你正在為客戶工作,並且客戶在開始編寫程式碼之前需要先檢視並批准你的設計,因為他們需要確保你是否正確理解了他們的想法。

  • 準備專案的詳細描述,即所謂的功能設計規範。
  • 與你的假想客戶討論該功能設計規範(即,將其解釋給一些無生命的物件,或者如果你可以承受,請向他們解釋)。
  • 完善功能設計規範 - 返回上一步 - 迴圈直到你滿意為止。
  • 在截止日期前準備專案進度表。
  • 堅持上述規定。

一些其他建議

  • 首先,完全忘記寫程式碼這件事情,要從使用者的角度想象該程式。
  • 寫下軟體執行的功能列表。
  • 寫下該軟體不具備的功能列表。(這將使您避免出現需求變更)
  • 寫出一些有關使用者將看到哪些螢幕及其工作流程的圖形。這些不是藍圖,也不是為了顯示它們的外觀,更多的是“首先使用者在此頁面上,然後他們可以轉到此頁面”。繪製草圖可以幫助你不要遺漏細節問題。
  • 解如何使用 git 並獲得一個 github 帳戶。這非常適合進行備份,也可以徵求程式碼審查。(忽略任何有關程式碼樣式的評論,在 99% 的時間裡都是徒勞的辯論)

一些擔憂和恐懼

很多讀者朋友向我諮詢自己是否可以學習 xxx 種語言,那麼為什麼不學呢?又有誰阻止你去學了?那還不是你的擔憂和恐懼來阻止你的嗎?還有一些諸如下面的問題

我太老了,還能編碼嗎

不,你可以在任何年齡學習程式設計,並且可能會從事該職業。

我們現在經常會出現 35 歲危機問題,事實上這個問題在各行各業都會出現。上週我家搬家了,和搬家工人聊起來,他已經 40 歲了,還在做搬家工作,要知道這種工作就是體力活,他也很擔心沒幾天就被老闆以身體原因開除了。過了 35 歲,身體機能下降是企業衡量用人的最大考慮因素,那麼有沒有 35 歲不被辭退的現象呢?有,所以就有類似於拿到拼多多和國家電網的 offer,該選哪個的問題。

還有就是,為什麼會擔心 35 歲危機呢?那是因為你的工作具有可替代性,如果你是一個公司的架構師,公司的核心架構是你搞的,你覺得公司會開除你嗎?可能會,因為公司快倒閉了。。。。。。 這當然都是意外情況,不可控制。

so,我們擔心的 35 歲危機,都是因為我們不想再學了,想摸魚賺點錢了,但是企業可不這麼認為,他們如果不發展就會被替代,那麼企業為什麼會花大價錢養你呢?這裡我並不是說要和企業同流合汙,但是你總要知道我們為什麼會有 35 歲危機。

一個普遍的神話是,擅長程式設計的唯一方法是從小就開始學習編碼。這是錯誤的 - 雖然有些人開始早點學習編碼(因此可能會有一些先發優勢),但大多數人在上大學或以後會開始學習編碼。所以什麼類似於讓孩子贏在起跑線上,只是抓住了一些家長的弱勢心理,潛臺詞就是你的孩子不早點報班,從小就不如其他孩子優秀,而家長們都是心疼孩子的,既然家長們抓住了這個心理,那麼培訓班能不賺錢?

然而學習是任何年齡的人都可以做的事情 - 不要專注於他人,只專注於自己和個人的進步速度。這篇文章會很有用 https://www.edglossary.org/growth-mindset/

還有一些朋友喜歡問下面這些問題

有什麼我首先應該學習的嗎

程式設計的前置條件很少,唯一的先決條件是

  • 你知道如何打字
  • 你擁有一臺電腦,並且你的電腦能上網
  • 你知道如何獨立搜尋答案

OK 就這些,有了上面這幾點你就可以直接程式設計,如果你知道一些數學知識,最多不用超過基礎代數;並且你有基本的英語功底,那當然是錦上添花的事情。

如果你想獲得大學的正式學位,以上所有這些都是差不多的。大多數大學和學院都希望入學的學生對電腦科學和程式設計一無所知,並且會從頭開始教你(儘管在某些情況下,如果你通過測試或證明有足夠的先驗技能,則可以跳過一兩個入門課程)。如果你是高中或更早的學生,並且想在大學學習電腦科學,那麼最好提前開始學習以取得良好的開端。

我必須精通數學嗎

不一定,程式設計和電腦科學是一個廣闊的領域,你是否需要精通數學取決於你選擇專門研究的學科。

例如,某些程式設計學科確實需要很強的數學技能。2D 和 3D 戲將頻繁使用向量,矩陣和線性代數;資料分析和機器學習利用了統計和微積分中的許多概念;如果你對代數和基本演算有很好的瞭解,則計算演算法的複雜性將變得更加容易。

通常,主題越高階和複雜,就越有可能需要紮實的數學基礎。如果你的目標是能夠解決這些型別的複雜問題,那麼擁有良好的基礎將是無價的。

但是,正如電腦科學和程式設計的許多方面都不需要對數學有深入的瞭解。你真正*需要知道的唯一事情是如何加,減,乘和除,也許還有一些基本的代數。許多程式設計師在整個職業生涯中幾乎不需要做任何數學運算。

特別是,許多面向產品的角色(例如,Web 開發,移動開發)只需要很少的數學知識。在這些子學科中,最重要的是你編寫健壯和可維護的程式碼的能力,以及找出如何構建對使用者有價值的東西的能力。

無論如何,如果你不太擅長數學,那麼你絕對可以學習和提高!畢竟,你可能也不是很擅長程式設計,但是你正在學習編碼。

確切地說,CS 學位在數學上的差異會因學校而異。一些學校過分強調涵蓋理論,而另一些學校則不再強調兩者,而只注重應用。(有些學校同時強調兩者)。如果你想了解更多資訊,則應直接調查你有興趣參加的任何學院或大學的學位要求和結構。

總而言之,如果你想成為一名成功的開發人員,則不一定需要精通數學。如果你想成為電腦科學家,你最終將學習大量的數學。如果你想解決更棘手的問題/在某些領域內,那麼數學可以是一個很有用的工具。

程式設計難嗎

程式設計也像大多數技能一樣,學習基礎知識並應用它們相對容易。但是如果你想成為一名競爭性的保齡球手,你將需要花費數年時間來掌握這項技能,編碼也是如此:你將需要花費很多時間來弄清楚為什麼即使你已經檢查了三遍,這個愚蠢的程式仍然無法執行。。你將需要閱讀書籍,坐下來上課,並與人們討論解決辦法。

這就是上手非常容易,但是鑽研一個領域,學的越來越深之後會非常難。

初學者在問題和練習上遇到麻煩是正常的嗎

我不想給你顯而易見的答案。

初學者幾次從自行車上摔下來是正常的嗎?學習游泳時,初學者沉沒幾次是正常的嗎?對於初學者來說,在學習樂器時遺漏音符或演奏錯誤的音符是正常的嗎?在健身房鍛鍊時,初學者想要練胸卻練的是三頭是正常的嗎?

絕對沒錯

失敗和煎熬是學習過程中非常重要和自然的部分。每個初學者都會經歷失敗和煎熬。因此,您不要灰心,而應該擁抱讓你煎熬的事情:奮鬥是你正在挑戰自己的標誌。使用它作為指南,可以幫助你弄清楚下一步需要閱讀和學習的材料,或者應該問什麼問題。

甚至專家在需要學習新東西時也會失敗和掙扎(儘管他們往往更善於恢復/利用失敗作為幫助他們加快學習速度的一種方式)。

事實上,如果你沒有經歷煎熬,那麼可以表明你肯定在做錯事。如果一切都很簡單,那就意味著

  1. 你不是在挑戰自己
  2. 你不是在強迫自己學習真正的新東西
  3. 你並不會強迫自己通過嘗試應用它來真正確保你瞭解它

這類似於鍛鍊。如果你在鍛鍊後不感到身體疲勞,那麼你真的得到鍛鍊了嗎?同樣,如果你在完成一些編碼挑戰後沒有精神疲倦或精神上的挑戰,那麼你真的學到了什麼嗎?

有關學習的問題

我剛剛開始學習語言 X,是否應該開始學習語言 Y

尤其是當你開始學習程式設計時,最好學習一種語言並堅持使用一段時間,即使特定的問題使用了你尚不知道的特定語言。一旦瞭解了基礎知識(流控制,錯誤處理,I / O,演算法的實現,資料結構等),你就可以開始考慮使用不同的語言了。

我是否應該一次學習一種以上的程式語言

除非你有充分的理由,否則大多數初學者應該只使用一種語言至少幾個月。由於以下幾個原因,這是一種更有效的學習方法:

  1. 大多數語言的基礎知識都非常相似。例如,大多數語言以幾乎相同的方式處理 if 語句。花時間學習兩種基本的語法不一定是一種好的習慣,並且可能會使初學者感到困惑。
  2. 學習如何程式設計的最困難部分不是學習程式語言的工作方式:而是學習如何解決程式碼問題。因此,你要想最大化地利用時間來練習程式碼解決問題,而不是花費更多的時間來學習特定於語言的細節/必須浪費腦力來跟蹤語言之間的差異。
  3. 一旦你精通第一門語言並具有很強的解決問題的能力,選擇第二種語言就容易得多。

有一些例外情況,你可以直接學習第一語言和第二語言

  1. 第二種語言不是程式語言。例如,最好與程式語言(例如 C,C ++,C#,Java,JavaScript,Python,Ruby)一起學習標記語言(例如 HTML 或 CSS )。

  2. 對於你感興趣的各種專案都是必要的。保持自己繼續學習的動力很重要,如果那意味著一次學習兩種程式語言,那就這樣吧。

  3. 如果你有專門的老師或指導者來指導你。稱職的老師和導師可以極大地簡化你的學習過程,這將足以彌補效率低下的問題。

如果你不認為自己是初學者,並且對使用程式語言來完成中等複雜的專案感到滿意,那麼嘗試一次學習多種語言當然是不錯的選擇。在這一點上,你應該對程式設計有足夠的瞭解,以便以更快的速度開始學習新語言,並且應該對自己一次學習多少有一個很好的認識。

如何獲得/保持學習程式設計的動力

這個問題最好看看其他人是怎樣做的

如何使用 X

我如何開始製作視訊遊戲

現代的視訊遊戲是使用遊戲引擎製作的 https://en.wikipedia.org/wiki/Game_engine:比如處理諸如圖形,聲音,物理和網路等複雜任務的軟體庫 https://www.reddit.com/r/gamedev/wiki/engine_faq,但是強烈建議初學者使用以下引擎,因為它們可以自由開發,並且具有學習的最佳文件:

  • Unity(C#):適用於 2D 和 3D 移動,桌面,瀏覽器/線上和控制檯遊戲
  • Construct2(JavaScript):適用於 2D 移動版,桌上型電腦,瀏覽器/線上
  • Pygame(Python):2D 桌面遊戲的引擎
  • LÖVE(LUA):適用於 2D 桌面遊戲

永遠記住你的目標是開發遊戲,而不是開發遊戲引擎。

引擎可以幫助你開始使用遊戲的圖形和使用者控制元件,但是你仍然需要徹底學習程式語言來編寫遊戲邏輯 ,因此,請選擇我上面給你推薦的圖書或者線上資源。

最重要的是:從簡單開始。您可能會想直接潛入水中並立即建立自己的夢想遊戲,但請記住,爬山的唯一方法是採取許多小步驟 https://www.reddit.com/r/gamedev/comments/stg2o/how_i_went_from_knowing_nothing_about_programming/ ,以下是按難度升序列出的簡單練習遊戲的列表:

如何開始製作網站/製作 Web 應用程式/進行網站開發

瞭解 Web 開發的方法有很多,但是通常你需要掌握的核心技能通常分為前端技能(在使用者的 Web 瀏覽器上執行的程式碼)和後端技能(在伺服器上執行的程式碼)。

通常,大多數人會建議你先學習 HTML,CSS 和 Javascript(按此順序),這是在每個 Web 瀏覽器上執行並組成每個網站的三種核心語言。

你可以在 https://www.reddit.com/r/webdev/wiki/faq 上找到更多資訊。這是面向初學者的另一套線上課程、教程和資源列表 https://github.com/Michael0x2a/curated-programming-resources/blob/master/resources.md#html-css-and-javascript。

如何開始製作移動應用程式/ Android 應用程式/ iOS 應用程式/ Windows Phone應用程式

你將需要為每種型別的智慧手機學習不同的程式語言。

你還可以使用PhonegapTitanium等技術製作可以在所有三款主要智慧手機上執行的應用程式-它們使你可以使用 HTML,CSS 和 Javascript 編寫應用程式一次,並可以在任何平臺上執行該應用程式。

有關更多資訊,可以查閱移動應用程式開發資源列表 https://www.reddit.com/r/learnprogramming/wiki/online#wiki_mobile_app_development

但是,請記住,上述資源中的許多都是針對已經具有一些程式設計經驗的人。如果你以前從未程式設計過,則可能要開始學習一種語言,該語言擁有更多的資源供初學者使用。一旦獲得了一定的經驗,並瞭解了程式設計背後的基本概念,你通常會發現學習一種新語言並開始學習移動開發容易得多

如何使事情自動化

對於 Windows,有兩種專用的程式語言,例如AutohotkeyAutoIt

另一個可行的跨平臺替代方法是 Python https://www.python.org/,使用 Python 更容易構建自動化並完成一些無聊的 working http://automatetheboringstuff.com/

如果要自動化 MS-Office,請使用內建的程式語言Visual Basic for Applications(VBA)https://www.reddit.com/r/vba 專門用於 VBA 程式設計。

什麼是最最最最最最好的

這篇文章 https://www.reddit.com/r/learnprogramming/comments/3r7lhp/a_collection_of_150_what_are_the_best_dev/ 彙總了 150 涉及什麼是"最好的"問題和答案,包括語言工具和主題。

術語和詞彙

電腦科學,計算機工程,軟體工程,程式設計和編碼之間有什麼區別

電腦科學(CS),計算機工程(CE),軟體工程(SE),程式設計和編碼都是相互關聯的術語,但彼此之間有微妙的區別,這通常使初學者很難區分它們。

你應該做的第一個區分是區分CS / CE / SE和程式設計/編碼。CS,CE 和 SE 都是研究領域,說“我正在學習電腦科學”將類似於說“我正在學習化學”或“我正在學習文學”。相反,程式設計和編碼是活動-它們是您要做的事情。要使用隱喻,學習 CS / CE / SE 就像學習音樂理論,而學習程式設計/編碼就像學習如何彈奏特定樂器。

從理論上講,你可以學習一個而不能學習另一個,但是如果你同時學習兩者,那麼你的經驗將更加豐富。

另一個區別是,雖然 CS / CE / SE 是你可以學習的東西,但是學習程式設計只是通過實踐才能實現的。實際上,大多數大學和學校將要做的是正式教授一種語言以教授編碼的基礎知識,然後將重點放在 CS,CE 和 SE 的教學上,讓學生學習如何通過練習和完成家庭作業來程式設計。

CS vs CE vs SE

你應該在 CS,CE 和 SE 之間進行下一個區分。簡而言之,儘管有很多重疊之處,但“電腦科學”與計算機或科學無關,而更多地是研究可計算性概念的應用數學領域。計算機工程與 CS 類似,但傾向於將重點更多地放在低階硬體上,就像電腦科學和電氣工程之間的交叉。最後,軟體工程更多地是關於如何構建大型而複雜的程式,同時防止因為一些因素導致軟體崩潰,軟體工程理論較少。

關於這三個概念的論述,你可以在 https://www.reddit.com/r/learnprogramming/comments/2k569h/eli5_computer_science_vs_software_engineering_vs/ 找到更詳細的。

程式設計與編碼

最後,程式設計 vs 編碼,這兩個術語之間的差異很小-許多人可以互換使用它們。通常,術語“程式設計”似乎比“編碼”具有更積極的含義。如果你說“我是程式設計師”,則表示你具有一定的專業水平-這表示你不僅可以編寫程式碼,而且對基本原理和理論有紮實的瞭解,知道如何與客戶溝通和工作與其他人等。

相反,如果你說“我是編碼員”,則通常意味著你的注意力僅集中在編寫程式碼上,而其他方面則更少。

但是,這裡的不同含義仍然很小 - 在絕大多數情況下,您可以互換使用這兩個術語。

C,C ++,Objective-C 和 C#有什麼區別

C 語言是這些語言中最小和最早的一種。它最初是作為 Unix 作業系統的系統程式語言建立的,如今仍廣泛用於應用程式程式設計。

C++ 是一種非常流行的通用程式語言,最初是基於 C 的。通過一些調整,大多數 C 程式碼都可以編譯為 C++ 程式碼。但是 C++ 新增了大量語言功能,這些語言功能與使用 C 的方式相比,大大改變了使用該語言的方式。用 C++ 編寫 C 風格的程式碼通常被認為是不好的做法。

Objective-C 是 C 的嚴格超集,這意味著所有有效的 C 程式碼也是有效的 Objective-C 程式碼。Objective-C 的普及程度不及 C 或 C++,它目前主要用於 Apple OS X 和 iOS 平臺的開發中。

從任何技術意義上講,C# 都不基於C。C# 是 Microsoft 設計的通用語言,在許多方面與 Java 相似。它可以編譯為在虛擬機器中執行的中間形式,這與之前的三種語言都被編譯為本地機器程式碼不同。儘管 C# 借鑑了 C 和 C++ 的語法元素(就像 Java一樣),但它與這些語言沒有真正的技術關係。

Java 和 JavaScript 有什麼區別

很多人經常會把 Java 和 JavaScript 搞混,其實這兩者語言除了叫法有點關係外, Java 和 JavaScript 在任何技術意義上都不相關。它們共享一些語法,因為它們都受 C 的影響,僅此而已。Wikipedia 很好地解釋了為什麼存在名稱相似性:https://en.wikipedia.org/wiki/JavaScript#JavaScript_and_Java

工具和版本控制

什麼是源/版本/版本控制?我應該使用它嗎

軟體開發是一項協作的技能。版本控制系統(VCS)是一種可跟蹤程式碼更改的工具,可讓你執行諸如撤消編碼錯誤之類的方便工作,並檢視程式碼隨時間的變化。現代分散式版本控制系統(DVCS)還使您可以輕鬆地與其他程式設計師使用同一程式碼。應該說你絕對應該使用版本控制系統!

目前最受歡迎的應該就是 git 了。

你可以通過閱讀 git 入門 https://cgordini.blogspot.com/2013/05/git-101.html 以及免費的 gitbok https://git-scm.com/book/en/v2 來使用 git。

當然廖雪峰的 git 講解的也非常好 https://www.liaoxuefeng.com/wiki/896043488029600

什麼是 IDE,我應該使用嗎

IDE 是一個整合開發環境,它是一個 GUI 應用程式,通常包括帶有程式碼完成和語法突出顯示功能的文字編輯器,一些專案管理功能,一個編譯器或直譯器(可配置或包含)以及許多其他用於編寫的精美功能。 執行和測試程式碼更加容易。使用 IDE 的替代方法是自動自行執行 IDE 為你執行的操作。此方法要求程式設計師使用單獨的工具,並且對開發過程有更深入的瞭解。

對於初學者來說,這兩種開發方法都有爭論:

  • 使用 IDE 意味著你不必對開發過程有太多瞭解,不必使用命令列介面,也不必配置這些工具即可正常工作。IDE 提供了一種快速的方法來建立程式碼,甚至可以為你編寫一些程式碼!
  • 另一方面,從命令列工作意味著您不必適應 IDE 設計人員的思維方式,並且由於隱藏了更少的開發過程,因此你可以更好地瞭解軟體構建過程。

使用 IDE 而不是使用單獨的工具通常取決於個人喜好(除非你的僱主/學校當然需要使用特定的開發環境)。如果您以前從未使用過 IDE,請下載一種流行的 IDE 並進行修改。而且,如果您從未使用過命令列中的 vim 或編譯的程式碼,請嘗試一下,看看你是否喜歡它。

常見的 IDE 和輕量級文字編輯器都可以在 https://www.reddit.com/r/learnprogramming/wiki/tools 中找到。

電腦和作業系統

我應該使用哪種作業系統

許多初學者經常遇到的一個問題是,他們應該使用哪種作業系統 - Windows,Mac 或 Linux。

坦白地說,這無關緊要 - 在當今時代,你可以使用的工具的質量和成熟度在所有平臺上都將大致相同,並且任何完善的程式語言都將在所有作業系統上使用。

話雖這麼說,你最終應該對這三種作業系統有一定程度的瞭解,以免遇到新的作業系統不知所錯。

這個規則有兩個例外

  • 如果要在 Windows 平臺上開發,請選擇 Windows 計算機
  • 如果要在 Mac 或者iOS 平臺上開發,請獲取 Mac 計算機

某些 Microsoft 和 .NET 工具仍主要針對 Windows。

雖然可以在任何計算機上開發 Mac 和 iOS 應用程式,但必須在 Mac 機器上使用 Xcode 來編譯應用程式並將其提交到應用程式商店。

最後,還值得注意的是,如果我有一臺 Windows 計算機,那麼設定一個我可以使用的 Linux 虛擬機器將非常容易,而不必擔心它會干擾我現有的 Windows 作業系統。

我應該選擇什麼樣的電腦/膝上型電腦

同樣,這並不重要 - 任何中檔膝上型電腦或計算機都可以。如果你已經擁有一臺計算機或膝上型電腦,則應該使用它而不是購買新計算機。基本上,你可以學習程式設計,並且可以在現有的幾乎所有計算機上編寫複雜而有趣的程式。

但是,如果你碰巧需要購買一臺新計算機並想將其用於程式設計,則應優先選擇 CPU,RAM 和硬碟驅動器。如果可能,請嘗試獲得具有以下規格或更高規格的計算機:

  • 英特爾 i5 CPU(3.0+ GHz)+
  • 4 GB以上的 RAM
  • 200 + GB硬碟
  • (可選)固態驅動器

如果你可以升級,則優先考慮獲得更好的 CPU 和更多的 RAM 而不是獲得更大的硬碟驅動器 - 更加強大的 CPU 總是有幫助的。

如果你想購買桌上型電腦,那麼這些規格實際上是唯一相關的規格。如果你希望具有便攜性,則應購買一臺膝上型電腦,並確保其配備足夠大的螢幕和鍵盤,以方便進行程式設計。但是,行動式計算機的可用性和可移植性之間達到了很好的平衡:

  • 螢幕越大,電池壽命越短(但你願意設定螢幕亮度的調光器,電池壽命越長)
  • 螢幕越小,可以容納的空間就越少,並且必須在 Windows /桌面之間進行更多的翻轉。
  • 理想情況下,你應該能夠舒適的使用兩個視窗
  • 膝上型電腦越大,重量越重,隨身攜帶的重量也越重

還還需問你自己,你打算如何使用膝上型電腦。你是否打算整天坐在辦公桌上,還是將其隨身攜帶在校園中。

如果你對機器學習,自然語言處理或圖形(包括遊戲開發)特別感興趣,則可能要考慮購買配備 GPU 的機器。儘管不需要 GPU 來執行任何這些操作,但是你通常可以通過仔細編寫程式碼來加快程式碼的速度,從而儘可能地利用GPU。

如果您對機器學習或 NLP 感興趣,你可以通過相對便宜的價格通過 Amazon Web Services(AWS)或 Google Compute Engine(GCE)等服務在雲中租用帶有 GPU 的機器。

職業和工作

程式設計師賺錢嗎

這個因人而異,現在 360 行行行轉程式設計師,導致這個行業的門檻越來越低,所以一般程式設計師大家的薪資水平差不多,網際網路的薪資相比傳統行業會高不少,但是網際網路對於程式設計師的要求也相對較高。

如何進入該行業並獲得入門級工作

前提假設是你已經掌握一門語言並知道如何進行編碼,獲得入門級工作主要有兩個階段

  • 製作出足以使 HR 開始邀請你面試的簡歷
  • 通過面試

這兩個階段需要一些不同的策略。

階段1:建立引人注目的簡歷

在第 1 階段中,你的目標是穩步開始向簡歷中新增可幫助你脫穎而出(或至少可以使你與其他正在申請的申請人相媲美的專案)。

為此,一項特別有用的策略是開始構建可以向潛在僱主炫耀的專案組合。

  • 獨立副業
  • 志願工作,比如為一些非營利組織建立網站
  • 課堂專案
  • 你在工作中所做的工作,找到了整合程式設計的方法
  • 研究獨立的專案,或者你在學校實驗室中做過的研究
  • 過去的工作或實習專案

擁有強大的專案組合可以使僱主成功地運用程式語言,庫和技術來解決問題,併為他們提供一種更準確地評估你的技能水平的方法。

一些注意事項

  • 你的專案不一定需要外觀華麗。具有技術背景的招聘人員會明白,不是所有的有趣的專案已經或需要一個漂亮的介面。更重要的是你能描述清楚你所做的工作,你所負責的事情,從而展現你所做工作的複雜性

    也許主要的例外是,如果你申請的職位需要一些視覺才能。例如,如果你要申請前端 Web 設計師角色,那麼擁有一些可以顯示出可以打造美觀且可用的網站的專案會有所幫助。

  • 當然,從事專案並不是你唯一可以做的事情。諸如獲得學位(最好是與電腦科學相關的學科)之類的事情也肯定會有所幫助。

  • 有些人還參加訓練營,以部分加快建立相關簡歷/作品集的過程。只需確保在參加訓練營之前先做一下研究:有些很棒,有些甚至是徹頭徹尾的騙局。這個需要你自己甄別

階段 2:通過面試

這個過程就需要你和麵試官真刀真槍的幹架了!不過國內的面試主要分為兩種:傳統軟體行業和網際網路公司。一般傳統軟體公司或者一些網際網路公司會問一些你能不能快速上手解決問題的面試題,而一些國內頂尖的網際網路卻喜歡專注於基礎知識和框架的深度使用

你可能會遇到的一些常見面試原型包括:

  • 給你帶來某種形式的編碼挑戰,通常是關於資料結構和演算法的挑戰,一般俗稱刷題。你可以在牛客網或者 LeetCode 進行刷題。
  • 向你詢問與面試的特定職位有關的問題-例如前端網頁設計,網路安全,中介軟體原理,JVM 原理,框架深度使用等
  • 要求你嘗試設計一些較大專案的體系結構
  • 向你詢問簡歷中列出的專案(有時,通常是有時深入關注單個專案)
  • 只是一般地討論技術

總結

這一篇內容內容我為你介紹了小白新手如何學習程式設計、一步一步到高階程式設計師會經歷哪些步驟,為你羅列了非常多優質的程式設計資源,以及學習中國的困惑,如何提高,在最後為你解釋了一些程式設計中常見的問題,簡歷都需要注意哪些等等。

這篇內容相當於是一個使用說明手冊了,你可以按照這個路線來一步一步規劃你的程式設計生涯。最後祝你早日成為大牛(形容這個程式設計師的水平非常高)

有任何疑問或者問題想要諮詢我,可以新增我的微信 lx252279279,當然是免費的哦!

我自己肝了六本 PDF,全網傳播超過10w+ ,微信搜尋「程式設計師cxuan」關注公眾號後,在後臺回覆 cxuan ,領取全部 PDF,這些 PDF 如下

六本 PDF 連結

相關文章