開始學編程 0x01

開始學編程 0x01

來自專欄 小牛圈

編程開發到底是一件什麼樣的工作?用簡單的話來描述就是開發一款軟體來解決某一個問題。很多同學學習編程的出發點,就是想動手來開發一款軟體來解決自己或者身邊的問題。大體上工程師們所做的工作就是這樣一件事情,不過在體量,場景上有較大的區別。

其實這裡漏了很重要的一環,軟體運行在哪裡?計算機上(移動設備現在也可看做是計算機)! 幫助我們解決問題的真正載體是計算機,我們使用的各種編程語言不是給人看的,是寫給計算機來看的,是告訴計算機如何來操作和運算。

「題圖是世界上第一台電腦(可能)ENIAC,誕生於二戰時期,用於計算炮彈軌跡。」

我們用計算機來解決人腦計算能力所解決不了的問題,本質上是通過,輸入數據->處理數據->輸出數據流程來進行。初期的打孔機,現在的高級語言,圖形界面,都是輸入,輸出一種形式。

軟體所做的工作就可以看做:接受用戶的輸入數據->使用計算設備的能力處理數據->把數據以合適的方式展現給用戶。再簡化一點,編程是通過操縱數據來解決問題。

OK,了解了編程是在做什麼,那什麼是編程需要的基礎能力?

操縱數據的能力,高效利用計算設備能力來處理數據。

那我們需要學習什麼知識來獲取這種能力?數據結構和演算法!

很多時候我們在工作時候感知不到數據結構和演算法,那是因為很多基本數據結構和演算法都已經做好了的實現,只需要用就可以了。比如鏈表,隊列,哈希,快排等等。在你調用sort排序時,不會意識到其內部使用快排進行排序; 當你使用LinkedList和ArraryList時也不太能搞清楚兩兄弟有什麼區別。

很多人接觸數據結構和演算法都是從字元串排序開始的,所以會讓人產生這有什麼用的錯覺。但實際上,數據結構和演算法是用來解決現實世界中問題。比如,如何在成千的微信好友中,迅速找到以Z開頭的人,如何在上萬條病毒資料庫中,比對某一個特徵數據?

那麼,該如何學習數據結構和演算法?

Google工程師RobertLove有個很棒的回答。

學習數據結構和演算法最重要的不是記住每一種演算法,記住大O小o複雜度。當然如果你能全背出來,也很牛。對於大部分開發工程師來說,在工作中基本不會需要去實現一個複雜的演算法,大多數常用的都已經實現好了。但是知道什麼時候用,怎麼用很重要。比如在什麼情況需要使用二叉查找樹?為什麼要用?

從最基礎數據結構和演算法開始學習,嘗試按照下面的兩點來做。

  • 可視化數據結構。直觀的理解數據結構的長什麼樣,能夠用在哪。在抽象層面是如何實現的,在物理層面(內存中)又是如何實現的。從最簡單的隊列,棧到複雜的平衡樹,都可以這樣去學習。當你需要用到時候能夠在紙上,在腦海裡面迅速把它勾畫出來。

  • 學習什麼時候用,如何來用各種數據結構和演算法。當然對學生來說這有點難。但是不去解決現實世界中的問題是無法真正掌握數據結構。所以要注重學習如何來用而不只關注實現的細節。嘗試學習什麼時候需要用到哈希,什麼時候需要用到樹,而什麼時候用最小堆更合適。

  • visualgo.net-可視化數據結構學習

推薦閱讀:

推薦一部C語言的經典著作
[2] 編寫第一個C語言程序
Teach Yourself Computer Science
[6] 分支、循環與遞歸
Teach Yourself Programming in Ten Years - 用十年的時間自學編程

TAG:編程學習 | 編程入門 |