如何打好程式設計基礎

2021-07-12 06:56:00 字數 3806 閱讀 5807

這篇文章是寫給那些真心想學程式設計的人看的——那些憋著一股狠勁兒,一定要做出個什麼真東西,不學好不罷休的人;而不是那些「聽說程式設計好玩」的人,在我看來,這種人永遠都入不了程式設計的門,更別提做出個像樣的東西來了。

心態調整

在你學習程式設計之前思考一下你的目標,當你有最終目標時道路會更加的清晰。

那麼,你想要寫什麼?**?遊戲?ios或者android應用?或是你是想自動化完成一些乏味的任務讓你有更多的時間看窗外的風景?也許你只是想更具有就業競爭力找個好工作。所有的這些都是有價值的目標,這些目標都是你程式設計學習推動力的一部分,沒有推動力的人,是無法在略顯枯燥的漫長學習之旅中走遠。

沉醉於程式設計,程式設計更是為了興趣。興趣是推動力的不竭源泉,保持這種充滿興趣的感覺,以便於你能將其投入到你的10年/10000小時的程式設計時間中。程式設計很有趣,那是探索的喜悅。那是創造的喜悅。看到自己親手完成的作品顯示在螢幕上很有趣。有人為你的**而驚嘆很有趣。有人在公共場合稱讚你的產品、鄰居使用你的產品、以及在**上討論你的產品很有趣。程式設計應該十分有趣,若並非如此,就找出導致程式設計無趣的問題,然後解決之。

啟蒙

「學程式設計應該學哪門語言?」這經常是初學者問的第乙個問題,但這是乙個錯誤的問題,你最先考慮的問題應該是「哪些東西構成了程式設計學習的基礎」?

程式設計知識的金字塔底部有三個關鍵的部分:

啟蒙階段的初學者若選擇c語言作為第一門語言會很困難並且枯燥,這是因為他們被迫要同時學習這三個部分,在能做出東西前要花費很多時間。

因此,為了盡量最小化「語法」與「系統基礎」這兩部分,建議使用 python 作為學習的第一門語言,雖然python對初學者很友好,但這並不意味著它只是乙個「玩具」,在大型專案中你也能見到它強大而靈活的身影。熟悉python後,學習c語言是便是乙個不錯的選擇了:學習c語言會幫助你以靠近底層的視角思考問題,並且在後期幫助你理解作業系統層級的一些原理,如果你只想成為乙個普通(平庸)的開發者你可以不學習它。

入門結束啟蒙階段後,初學者積累了一定的**量,對程式設計也有了一定的了解。這時你可能想去學一門具體的技術,諸如web開發,android開發,ios開發什麼的,你可以去嘗試做一些盡可能簡單的東西,給自己一些正反饋,補充自己的推動力。但記住別深入,這些技術有無數的細節,將來會有時間去學習;同樣的,這時候也別過於深入特定的框架和語言,現在是學習電腦科學通用基礎知識的時候,不要試圖去抄近路直接學你現在想學的東西,這是注定會失敗的。

那麼入門階段具體該做些什麼呢?這時候你需要做的是反思自己曾經寫過的程式,去思考程式為什麼(why)要這樣設計?,思考怎樣(how)寫出更好的程式?試圖去探尋理解程式設計的本質:利用計算機解決問題。

設想 :

x = 用於思考解決方案的時間,即「解決問題」 部分

y = 用於實現**的時間,即「利用計算機」部分」

程式設計能力 = f(x, y) (x>y)

要想提高程式設計能力,就得優化 x,y 與函式 f(x, y),很少有書的內容能同時著重集中在這三點上,但有一本書做到了——structure and interpretation of computer programs(sicp)《電腦程式的構造和解釋》,它為你指明了這三個變數的方向。在閱讀sicp之前,你也許能通過呼叫幾個函式解決乙個簡單問題。但閱讀完sicp之後,你會學會如何將問題抽象並且分解,從而處理更複雜更龐大的問題,這是程式設計能力巨大的飛躍,這會在本質上改變你思考問題以及用**解決問題的方式。此外,sicp的教學語言為 scheme,可以讓你初步了解函式式程式設計。更重要的是,他的語法十分簡單,你可以很快學會它,從而把更多的時間用於學習書中的程式設計思想以及複雜問題的解決之道上。

有了之前程式設計的基礎後,想更加深入地把握電腦科學的脈絡,不妨看看這本書:《深入理解計算機系統》 computer systems a programmer』s perspective 。這裡點名批評這本書的中譯名,其實根本談不上什麼深入啦,這本書只是 cmu的「計算機系統導論」的教材而已。cmu的電腦科學專業相對較偏軟體,該書就是從乙個程式設計師的視角觀察計算機系統,以「程式在計算機中如何執行」為主線,全面闡述計算機系統內部實現的諸多細節。

完成這本書後,你會具備堅實的系統基礎,也具有了學習作業系統,編譯器,計算機網路等內容的先決條件。當學習更高階的系統內容時,翻閱一下此書的相應章節,同時程式設計實現其中的例子,一定會對書本上的理論具有更加感性的認識,真正做到經手的**,從上層設計到底層實現都了然於胸,並能在腦中回放資料在網路->記憶體->快取->cpu的流向。

此外,也是時候去接觸 unix 哲學了: kiss - keep it ******, stupid. 在實踐中,這意味著你要開始熟悉命令列介面,配置檔案。並且在開發中逐漸脫離之前使用的ide,學會使用vim或emacs(或者最好兩者都去嘗試)。

如今,很多人認為程式設計(特別是做web開發)的主要部分就是使用別人的**,能夠用清晰簡明的方式表達自己的想法比掌握硬核的數學與演算法技巧重要的多,資料結構排序函式二分搜尋這不都內建了嗎?工作中永遠用不到,學演算法有啥用啊?這種扛著實用主義大旗的「碼農」思想當然不可取。沒有紮實的理論背景,遭遇瓶頸是遲早的事。

資料結構和演算法是配套的,入門階段你應該掌握的主要內容應該是:這個問題用什麼演算法和資料結構能更快解決。這就要求你對常見的資料結構和演算法了熟於心,你不一定要敲**,用紙手寫流程是更快的方式。對你不懂的資料結構和演算法,你要去搜它主要拿來幹嘛的,使用場景是什麼。

《演算法導論 》:有人說別把這本書當入門書,這本書本來就不是入門書嘛,雖說書名是 introduction to algorithms,這只不過是因為作者不想把這本書與其他書搞重名罷了。當然,也不是沒辦法拿此書入門,讀第一遍的時候跳過習題和證明就行了嘛,如果還覺得心虛先看看這本《資料結構與演算法分析》

coursera algorithms: design and analysis [part 1] & [part 2]: stanford 開的演算法課,不限定語言,兩個部分跟下來演算法基礎基本就有了;英語沒過關的:麻省理工學院公開課:演算法導論

入門階段

還要注意培養使用常規演算法解決小規模問題的能力,結合前文的sicp部分可以讀讀這幾本書:《程式設計珠璣 》,《程式設計實踐 》

此外還要知道,學習第n門程式語言的難度是第(n-1)門的一半,所以盡量去嘗試不同的程式語言與程式設計正規化,若你跟尋了前文的指引,你已經接觸了:「乾淨」的指令碼語言 python, 傳統的命令式語言 c, 以及浪漫的函式式語言 scheme/racket 三個好朋友。但僅僅是接觸遠遠不夠,你還需要不斷繼續加深與他們的友誼,並嘗試結交新朋友,美而雅的 ruby 小姑娘,hindley-milner 語言家族的掌中寶 haskell 都是不錯的選擇。但有這麼一位你躲不開的,必須得認識的大夥伴 — c++,你得做好與他深交的準備:

如果你能設法完成以上的所有任務,恭喜你,你已經真正實現了程式設計入門。這意味著你在之後更深入的學習中,不會畏懼那些學習新語言的任務,不會畏懼那些「複雜」的api,更不會畏懼學習具體的技術,甚至感覺很容易。當然,為了掌握這些東西你依舊需要大量的練習,腰還是會疼,走路還是會費勁,一口氣也上不了5樓。但我能保證你會在思想上有巨大的轉變,獲得極大的自信,看老師同學和 csdn 的眼光會變得非常微妙,雖然只是完成了程式設計入門,但已經成為了程式設計師精神世界的高富帥。不,我說錯了,即使是高富帥也不會有強力精神力,他也會懷疑自己,覺得自己沒錢就什麼都不是了。但總之,你遵循指南好好看書,那就會體驗「會當凌絕頂」的感覺。

重視基礎,打好基本功

看到 演算法與資料結構考研試題精析 這本書有感。現在會看感覺以前沒有認識到基礎的意義,就那些考試還有面試問題左移,指標那些你覺得沒有意義,你當時覺得學那些東西沒有意義。你當時的意義好像就是激情,而且反正激情也能做出東西,所以那些對你而言就覺得沒什麼意義 現在回看這種想法很錯誤。你以前確實非常不重視基...

紮實打好基礎知識理論(一)

一天,乙個學生發給我這麼一道關於資料庫的題目 表table1 id name 12 aa 2 cc de dd 23a eee s3wd fff 3 jjjj 一次性把這個表新增到另乙個表 並且把id列修改不滿五位的加上 a0 0的個數由id列的長度覺得 例如 12 修改後 a0012 咋看到這一題...

設計師如何跟開發打好關係?

本文講的是設計師如何跟開發打好關係?在製作原型時 在產品中 或者在 web 檢視中我應該如何載入 css?載入字型圖示的最佳方式是什麼?它們對效能有什麼影響?我應該在 發現檔案錯誤,又應該在 尋找其他人解決自身問題的辦法 問題追蹤,知識基礎 我該如何為設計系統做貢獻 修復 bug 增加乙個圖示 我是...