薛老師:擁有知識不是目的,是必要的基礎和手段,解決問題才是目的!我們的現狀是滿腦子的知識和標準答案,而缺乏很多重要的能力。其中最重要的能力包括:生存能力、學習能力、思辨能力(批判能力)、創新能力等等。
我們從未接受過解決問題的訓練,所以今天給大家推薦一種能幫助我們解決問題的思維方式:編程思維。
編程的核心,不是編程,不是語法,甚至不是算法或數據結構本身,恰恰是如何分解問題——發現規律建立解決問題模型,映射到合適的數據結構和算法上,最后才根據算法寫程序實現。
基于此,卡耐基梅隆大學計算機的一名華裔教授提出“編程思維”這個概念。
他定義編程思維是:能夠把現實生活中的復雜問題,逐步拆分成可理解的小問題。
【二】
Decomposition,即拆分。根據已有的知識和經驗,把問題拆分。比如我想喝咖啡,那我可以請求你:“可以幫我倒杯咖啡嗎?”
但這句話如果想讓電腦聽懂,我得先告訴它哪個是“杯子”、哪個是“咖啡”、什么是“倒”,然后再告訴它怎么去倒,比如先直走5米,左轉75度,左臂下放50度……
現實生活,每一個復雜問題,都是基于解決一個個被拆分的小問題而被解決的。
比如說,超級計算機感覺很復雜最后無非是解決一個帶寬問題、一個存儲問題;比如說,解決碳排無從下手,實際上是解決人口、服務、能源、單位能源的碳排放這幾個問題。
【三】
Pattern Recognition,即模式識別。根據新問題和以前解決過的問題的相似性,舉一反三琢磨出規律。假如你需要畫100只貓,你會怎么辦?找100只貓來挨個臨摹?對于計算機來說,你需要找出貓的“模式”。
你要知道貓是專屬的毛,眼睛,尾巴,四條腿等,按照這個“模式”,你才可以“批量”畫貓——你不用每次畫一個新動物,只需要變換局部特征:黃白條的貓還是黑貓,長尾巴的貓還是短尾貓。
【四】
Abstraction,即抽象。將問題里涉及的數據,抽象到數據結構(變量,數組,鏈表等),把數據處理過程可重復執行部分抽象成函數模塊。
聽起來很復雜吧?這是一個過濾的過程,整個過程你要聚焦重要的關鍵信息,忽視無用細節,這樣才能通過認知問題的核心本質,幫助我們形成解決問題的構想。
比如,當我們看到這一房子,我們看到的是:
但在建筑師的眼中,它可能是這樣的:
建筑師通過自己的經驗,抽象出房子里面具體的構造。這一步,我們雖然幾乎難以在應試教育的學習方法中獲得,但我們能從不斷地編程訓練中去培養抽象思維。
會編程的人,往往能透過一個應用表象,看到背后實現的步驟。
【五】
Algorithms,即算法。通過循環執行,根據前三步的分析成果,設計步驟,寫出算法,從而解決問題。這一整個過程,我們看到所謂的編程語言和語法,在最后才發揮出作用。所以當我們覺得學編程難,是因為我們還未從過去根深蒂固的學習習慣中抽離出來,凡是需要打破習慣的事,必是不易的。
就像很多剛剛出國讀書的孩子,常常在面對外國老師問出“why”的問題時,馬上一種驚慌失措的表情,滿腦子想著自己是不是又說錯答案了,不知道老師這樣問僅僅是為了引導他們拓展思維。
我們真實的社會和生活也是不易的,它們沒有標準答案!許多人終其一生沒有追尋問題的能力,無法理解世界的復雜。而編程,是你找出解決方法的能力,把現實問題轉換為代碼邏輯的能力。
最后,以喬布斯的話來結尾:我覺得每個人都應該學習一門編程語言。學習編程教你如何思考,就像學法律一樣學法律并不一定要為了做律師,但法律教你一種思考方式。學習編程也一樣,我把計算機科學看成是教育,每個人都應該花至少1年時間學習編程。——Steve Jobs