1. 程式人生 > >3.1 學習計算機,從程式設計入手 ——《逆襲大學》連載

3.1 學習計算機,從程式設計入手 ——《逆襲大學》連載

返回到【全文目錄

目錄

3.1 學習計算機,從程式設計入手 

程式是計算機的靈魂

學習計算機繞不開程式設計

用程式設計進入計算機世界 


3.1 學習計算機,從程式設計入手 

計算機的神通廣大,已經是有目共睹。

  • 計算人造衛星軌道、分析原子結構、氣象預報等各種超級複雜的數學計算問題,利用具備高速計算和海量資訊儲存能力的計算機完成。
  • 為人診病的專家系統、會下棋的機器人,計算機表現出的智慧讓人驚歎。
  • 計算機輔助設計、計算機輔助製造,大大提高了技術人員的設計速度和質量,工程師如虎添翼。
  • 衛星發射成本高、生物遺傳試驗週期長、醫學實習風險大、戰爭演習難展開,這是計算機模擬顯神通的地盤,在這裡,也有無數青少年著迷的虛擬世界中的精彩遊戲。
  • 計算機全面介入資訊處理,帶來了無以倫比的便捷,積累的海量資料,成就了用“資料探勘”尋寶的夢想。
  • 神奇的網路呼嘯而來,攜帶著web、搜尋、電子商務、即時通訊、移動應用,整個世界由此改變,世界變大了,世界也變小了,亦正亦邪的黑客,撩撥著少年的心。

讚歎著計算機的神奇,我們不禁要問,這個穿越了時光隧道來到我們身邊的人造精靈,究竟為什麼會有如此強大的功能?計算機是從何處“學”得了如此多、如此高深的本領?

現在要隆重請出的,是英雄的主角——程式。正是有了程式,計算機在與棋王卡斯帕羅夫的周旋中取得勝利,模擬空戰得以惟妙惟肖,計算機能聽會說,網際網路光芒四射。

程式是計算機的靈魂

時至今日,我們所用的計算機,都稱之為馮•諾依曼結構的計算機,由運算器、控制器、儲存器、輸入裝置、輸出裝置五類基本裝置所組成。這些部件各盡其職,提供了各種複雜的功能。計算機要完成不同的任務,需要的就是這些功能的組合。計算機能提供的資源,分為硬資源和軟資源,就是我們常說的硬體和軟體。

硬體,港臺地區稱“硬體”,英語中稱為hardware,直譯就是“五金”。在我小的時候,五金店都算得上是大商店,而現在都是小鋪面,裡面買的東西,是生活中必需的各種工具、部件和勞動防護用品。計算機的硬體,也都是這些摸得著看得見的東西。不論是體積龐大的超級計算機,還是擺在辦公室和家裡的桌上型電腦、可以隨處攜帶的膝上型電腦,以及形影不離的智慧手機,我們能夠看得到的,都有一個外殼,裡面裝著電路板,電路板上有積體電路,積體電路上有各種器件和線路。就這樣裝配好的計算機,只是一個沒有活力的軀幹,徒有一身硬功夫卻沒有用武之地。要讓它具有活力,就要啟用它、操縱它,讓它按照人的意志工作。

與硬體的名稱相對應,那些使用計算機的技術資源,我們將其統稱為軟體,港臺地區稱為“軟體”,英語中稱為software。一個人,如果只有軀體,而沒有思想,無法將其稱為一個完整的人。軟體就是計算機的“思想”的載體。正是由於有了豐富多彩的軟體,才能夠讓計算機的硬體提供的功能得以應用和發揮,儲存大量的資訊,進行高速的運算,以此組合出更強大、更復雜、千姿百態的功能。

軟體的核心是程式,計算機的工作就是執行計算機程式。計算機程式,就是人們為使用計算機解決某種問題,用計算機可以識別的指令,編製成的指令序列,清楚地指示計算機每一步該做什麼的工作。根據指令的安排,計算機完成了人要求它做的工作。開始學習程式設計的同學要知道這樣的內幕:

  • 計算機能準確計算“神州十號”的執行軌道,是航天科技人員根據天體物理的規律設計好了計算方法,並把這些計算方法編成了程式交給計算機執行。
  • 計算機之所以能夠診斷病情,是人們為它配備了稱為“專家系統”的計算機程式,模擬醫學專家對病人的病情進行分析、解釋,最後開出處方。
  • 你在遊戲中玩得正酣,是計算機程式在不停地排程著需要的資源,與你的各種動作、決策保持著密切的互動。
  • 你在計算機上欣賞熱播的大片,計算機程式悶頭鑽在CPU裡,忙碌地讀資料、解壓縮、匹配編碼標準,協調著顯示卡、音效卡、網路,讓它們同步工作,為你獻上有聲有色的大餐。
  • 你在發微博,晒照片,資料該如何打包、用什麼協議、如何找到伺服器、傳輸中怎麼保證資料不要丟失、傳輸成功後怎麼顯示出來

計算機程式在幕後乾的這些事情,如果不去想永遠不知道。事實是,如果沒有程式,計算機什麼事情也做不了,缺少了程式的打理,計算機只能是一件擺設。

程式,不愧是計算機的靈魂!

學習計算機繞不開程式設計

程式的“水平”越高,計算機就越能幹,越聰明。具有高速處理能力的計算機硬體加上“聰明”的程式,使計算機有了強大的功能,千變萬化的程式使計算機無所不能。

程式是由人設計出來的,設計程式的工作常被人稱為“程式設計”,從事程式設計工作的人就是程式設計師。計算機無論有多麼神奇,都是執行人編制的程式,按照人的意圖行事的,程式的水平高低完全取決於設計程式的人的水平。讓它怎麼幹,它就怎麼幹,這是一件非常過癮的事情。當我們拋開這個小孩過家家的想法,換上一種說法,設計程式是一件非常具有創造性的工作

學習計算機的人,一般都從程式設計學起。程式設計的能力是從事相關研究、開發的基本能力。通過學習程式設計,會逐步瞭解計算機的工作原理,會逐漸領會到計算機機械化、自動化地完成任務的本質。這種以程式設計優先的入門學習模式被廣泛採用。會使用一種程式設計語言,會解決一般的問題之後,漸次地圍繞著程式設計的方法、解決問題需要的演算法、計算機內部結構與工作原理、工程組織方法等各個專題,學習一些課程,藉此形成一定的知識結構,掌握學科的思維方式,一位合格的專業人才就此走向社會。

這種程式設計優先的方式並不是學習計算機的唯一方式。比我大十歲左右的那一批人學習計算機採用過一種演算法優先入門的模式。有的人是在大四的時候,才有機會見著了真的計算機,才有機會將自己編的程式在真的計算機上執行。他們的程式已經先在自己的大腦中“執行”好了,才有機會使用昂貴的計算機,追求的是一次就出正確結果。這種方式由於我們社會的進步和條件的改善已經不再使用,但這給當代大學生的啟示是,程式設計更加註重人本身,而不是一說程式設計就必須獨佔一臺計算機。

也有少部分人採用硬體優先的入門模式學習計算機。先從電路、計算機組裝或計算機硬體系統開發入手瞭解計算機,再繼續學習高階程式設計等。這種模式常見於微電子、電子資訊系統、通訊等專業的學生,以及一些業餘的計算機愛好者。

由此看來,要學習計算機,繞不開程式設計。這可是愁壞了在學習程式設計中打不開局面的同學。於是有人寫信來問:“想在IT行業發展,但是不學程式設計,可以嗎?”

有大量非計算機類專業的人員在IT行業從事工作,從這個角度,“可以不程式設計”是一種回答。行業中有大量的如營銷、策劃、客服、資訊採集、編輯等非技術崗位。這些崗位上的人員在工作中不需要程式設計。但是這些崗位需要其他方面的知識和技能儲備。相關人員大多沒有學過程式設計,他們走進入IT行業是發揮的是他們自己專長。

學習了計算機類專業的,但在工作中不程式設計的,大抵有兩類人:一類轉崗去了非技術崗位,另一類做的是比程式設計更加巨集觀或抽象的工作。轉崗去了非技術崗位的,又有兩種情況:一種是本身在其他方面的能力、優勢更強,能在其他崗位上發揮著更大的作用,另一種是技術水平實在不行,無奈選擇而已。這兩種情況的差距是顯然的。從事比程式設計更加巨集觀的工作包括擔任專案經理、產品經理等技術管理類工作的,也包括從事架構師、系統分析師等高階技術工作的。不少計算機研究人員日常的工作中,從事理論、演算法等抽象層次的研究更多一些,看不到他們需要編寫多少程式碼,在團隊中有人為他們寫程式,要知道,這些人是很擅長編碼的,只是不需要他們親自去編碼而已。有一點值得注意,“可以不程式設計”和“可以不會程式設計”是兩回事。

用純粹不程式設計的崗位和專注於程式設計的崗位進行分類,走的是兩個極端。實際上,IT行業的工作大多是有一定技術含量的,程式設計能力放在那裡,就是鎮山之寶。有程式設計能力,可以做得更好,而不會程式設計的,人手不夠也能頂一頂,但其中的差別不是一點兩點。例如,負責計算機系統、網路系統執行和維護的運維人員中,有人通過分析系統執行中出現的效率問題,通過命令列或編寫指令碼程式,為幾千臺機器組成的機群做系統優化,這樣的人程式設計功夫一定不弱,只不過是沒有去做寫程式的工作罷了;而有的運維人員卻只會做換個記憶體、配個網絡卡之類的工作。兩種運維人員的不可替代性,包括從工作中能夠得到的回報,相差甚遠。當遇到行業波動時被動應對的人會是誰,也就很顯然了。

一些人灑脫地表白:我將來搞硬體開發,不學程式設計了;我畢業後就去賣電腦,不用程式設計的。諸如此類的觀點還可以有很多。我們要正視的是,提出了“學計算機是否可以不程式設計”問題的人,一定是在程式設計中遇到了困難,這是問題的根本。在程式設計學習中遇到了困難,是很正常的現象,但要想辦法克服。學會了程式設計,這個問題就解決了。人生的奮鬥剛剛開始,專業的學習剛剛起步,不必到處給自己找一個“可以不程式設計”的理由而放棄這份突破。有人聲稱對程式設計不感興趣,大多隻是沒有投入地程式設計,沒有體會到程式設計中存在的樂趣而已。在程式設計中不起步、起不了步,很多的時候是讓一些人的言論拽住了腳步,被自己的畏難心理統治了心靈而已,還有什麼“碼農很苦逼”、“邏輯思維差”、“女生不適合”,不去試一試,永遠不知那河水有多深,不去搏一把,舒服地泡在持續加熱的溫水中,那不應該是年輕人的選擇。

既然已經是計算機類專業的學生,要將學業進行下去,程式設計優先的模式是當前的共識,學會程式設計,繞不開。一位大四了還不會程式設計的學生被分配到我的手下做畢業設計,在我的“高壓”政策下,依靠他的努力,做出來了要求的設計。他意識到了自己是能程式設計的,對程式設計也是有興趣的。他後來沒有如預先打算的那樣被迫轉行,而是悔恨為什麼沒有早些行動起來。有位做了高管的學生說,他就用程式設計中練出來的指揮計算機工作的思維安排公司的事務,那不是一般的條理清楚。

學計算機,先學會程式設計,這是一個常識。至少,學習了計算機類專業而不會程式設計,這是一件說不出口的事。

用程式設計進入計算機世界 

有的同學在程式設計學習開始時吃了苦頭,賭氣說:“學會程式設計的都是非人類!”其實程式語言都是標準的人造物,更何況使用程式語言寫程式呢。程式設計學習,對大多數大學生來講,是進入大學後的一件新鮮事,需要去適應。找到了方法和節奏,學會程式設計就會是件順理成章的事。放棄成見,卸下包袱,找到方法,困難的時候頂一頂,就和《料理鼠王》中小老鼠雷米信奉的名言“Everyone can cook”一樣,我們可以見證“Everyone can code”!

對大多數計算機類的大學生,程式設計能力的培養是在大學剛開始就起步的。要修讀的課程名稱通常稱之為“×語言程式設計”,所用的語言有C、C++、Java、Python,各有道理。這門課程屬於專業基礎課,是幾乎所有專業課程的“先修課”,以掌握一門程式設計語言,熟練運用其語法和語言功能,掌握程式編碼、除錯到最終成功執行的完整過程為培養目標。在學習過程中,學生要通過對具體問題進行分析、進行初步的演算法設計和編碼的訓練,具備基本的演算法設計和程式設計能力,並通過實踐訓練,培養學生規範的程式設計風格,嚴謹的程式設計思想。

在程式設計課的支撐下,後續的課程將逐步拓展專業知識和能力,學習第二門程式設計語言會緊隨其後。程式語言有很多,各有其適用性,發展也很快,一個優秀的IT從業人員要有能力使用幾種程式語言工作,並且要有能力在需要的時候自學新的語言;為了能描述更復雜的資料,以及設計出高質量的程式,要學習關於資料結構、演算法設計和演算法分析的知識;學習編譯過程和技術,關注的是語言處理的一般理論和技術,也使學習者對程式語言的理解達到一個新的層次;在作業系統中,會學到管理和有效利用計算機軟、硬體資源,以及為使用者提供互動操作介面的各種技術方法;計算機圖形學、平行計算等課程,學習的是特定領域中的演算法與程式設計方法。實際上,對於計算機組成原理、計算機體系結構、微機原理、嵌入式系統、計算機網路等這些所謂偏重於硬體和系統的課程,到處也是程式設計的味道。

這是大學中圍繞程式設計能力的發展制定出的學習路線。大學課程有一定的銜接性,後面的課程需要用到前面的課程作為基礎,而程式設計是所有專業課的基礎。後續所有的專業課程都是建立在會程式設計的前提上的。不少課程的考核是不需要用寫程式碼的形式體現的,很多程式設計基礎不紮實的學生得到了及格或更好的分數也能夠理解,但是他們的所學不能和程式設計聯絡起來,學得的知識就是空洞的。程式設計學習的起步不順利,可以理解,暫時也可以接受,然而這個問題要儘早解決,越早越好。

狹義地理解,程式設計就是寫出程式碼。要求初學者會運用某一種特定語言的語法規則,根據別人設計好的演算法,寫出求解問題的程式,完成除錯、執行,這是程式設計的初始階段的基本要求。廣義地講,一切和IT有關的事情都是程式設計。時下不少IT學子知道程式設計的重要性,然而在口口聲聲重視的“程式設計”中,僅僅只是將目標定格為學習某一門語言,而忽視其他更為重要的思維和方法的訓練,這是一種非常有害的理解,在深入學習中應當糾正過來。

學會程式設計,就是找到了一條通往計算機世界的路徑,我們的腳步可以藉此通向更遠的前方。和IT行業內的人士交流,複雜性、效率、架構、模式等等一系列的術語貫穿其中,這些需要在圍繞程式設計的學習中去體會。學會程式設計的過程,是對計算機內部工作機理和計算機作為一個系統的理解過程,程式設計,是登堂入室的臺階。

學會程式設計,是計算思維習得的過程。通過豐富的程式設計的經歷,抽象、理論、設計的基本學科形態得以建立,計算科學和計算機工程中需要的知識和技能由此累積。程式設計能力的提高,不僅是對在校學生的要求,在相關崗位上工作過程,也是程式設計能力進一步持續提高的過程。IT技術人員可以吃的老本,不在於哪種語言運用有多熟練,而在於計算思維所支撐的學習能力和解決問題的能力。

學會程式設計的過程,也是對一個人品質塑造的過程。面對撲面而來的上百個錯誤提示不慌不忙,一一排除;面對成百上千行,甚至更多程式碼行中潛在的執行錯誤,哪怕就是隻在偶然的情況下才出現的微小錯誤,也能長時間專注其中,直至bug現出原形;有不達目的不罷休的偏執,也有知錯即改的坦然,有沉浸其中的穩重,也有投身創造的激情。這樣的品質,經過了程式設計學習過程的歷練才能得到,成為未來應對一切挑戰的底氣。

學會程式設計,真不是會寫那麼幾個語句那樣簡單。學會程式設計,其意義也並不僅在於會編幾個程式。

返回到【全文目錄