很有啟發(fā)的一篇關(guān)于編程的文章
2020-02-13閱讀?2200
編程究竟難在哪市埋?
1
“編程一點(diǎn)都不難刻蚯,它只是和你十幾年來在學(xué)校受的教育格格不入而已谋旦∈JВ”
第一次看到這句話,是在知乎問題“編程究竟難在哪里册着?”里一位名叫@ invalid s的高贊回答拴孤。
與也是這兩年才開始半路學(xué)編程的我,所感所悟不謀而合甲捏。
所以今天站在前人的肩膀上演熟,我想和大家好好聊聊“編程究竟難在哪?”這件事。
一司顿、難在我們從未接受過解決問題的訓(xùn)練
從小到大芒粹,我們受到的教育終極目的是有一個(gè):考取理想的學(xué)校。每一張張考卷都是一個(gè)個(gè)堆砌起來的知識點(diǎn):三角函數(shù)大溜,解析幾何化漆,數(shù)列,函數(shù)…...
這么多知識點(diǎn)钦奋,你需要做的是背下它們座云,或者說的更高級一點(diǎn)疙赠,理解它們。
即便是強(qiáng)調(diào)思辨和分析的“文科類”朦拖,也可以靠死記硬背答題模板拿分圃阳,就連作文都要有統(tǒng)一的標(biāo)準(zhǔn)。
我記得有一年考試璧帝,題目是對冰心的一首小詩寫評論:
“墻角的花捍岳,當(dāng)你孤芳自賞的時(shí)候,世界就變小了裸弦∷钔”
出題老師原意是讓大家批判孤芳自賞,但有同學(xué)偏偏贊美孤芳自賞理疙,贊美這種潔身自好的精神晕城。而這種文章要一律判作不及格。
年紀(jì)尚小的我們甚至都來不及懷疑“為什么這個(gè)學(xué)生說得沒有道理窖贤?為什么所有的人都只能有一樣的價(jià)值觀呢砖顷?”因?yàn)榍f軍擠獨(dú)木橋,保險(xiǎn)起見的我們只需要按照所理解下來的知識赃梧,將一塊塊碎片滤蝠,根據(jù)正確而萬能的模板拼好,才容易拿下滿分授嘀。
我們非常擅長理解和記憶物咳,并井井有條地套公式。
這一切蹄皱,到了學(xué)編程這里览闰,統(tǒng)統(tǒng)不奏效。
我大一的時(shí)候剛開始接觸C語言巷折,非常痛苦压鉴。那會兒,沒有任何計(jì)算機(jī)基礎(chǔ)锻拘,編程語法大多靠背——C++語法油吭、操作系統(tǒng)各項(xiàng)定義、計(jì)算機(jī)網(wǎng)絡(luò)各種協(xié)議署拟、常量婉宰、作用域、多態(tài)...........
身邊不少同學(xué)也這樣推穷,“高考精神”還深深印烙在骨子里芍阎,我們都認(rèn)為學(xué)習(xí)一門編程語言最重要的就是掌握其語法,所以為了將語法爛熟于心缨恒,最直接的方法就是記憶谴咸。
結(jié)果可想而知,即便拿了相應(yīng)的學(xué)分骗露,沒有人敢說自己會編程岭佳。
我們接受了十幾年的應(yīng)試教育,為了最大化公平萧锉,考試必須有一套清晰的標(biāo)準(zhǔn)珊随。正是如此,我們更看中重應(yīng)試技巧而非知識本身柿隙,學(xué)習(xí)變成了追求標(biāo)準(zhǔn)答案叶洞,求知變成了死記硬背。
絕大部分人禀崖,難以形成系統(tǒng)的學(xué)習(xí)方法論的意識衩辟,以至于很多人一旦脫離試卷,在社會中面對實(shí)際問題的時(shí)候波附,完全沒有一套行之有效的方法論支撐其解決問題艺晴。
而編程的核心,不是編程掸屡,不是語法封寞,甚至不是算法或數(shù)據(jù)結(jié)構(gòu)本身,恰恰是如何分解問題——發(fā)現(xiàn)規(guī)律建立解決問題模型仅财,映射到合適的數(shù)據(jù)結(jié)構(gòu)和算法上狈究,最后才根據(jù)算法寫程序?qū)崿F(xiàn)。
基于此盏求,卡耐基梅隆大學(xué)計(jì)算機(jī)的一名華裔教授提出「編程思維」這個(gè)概念抖锥。
他定義編程思維——能夠把現(xiàn)實(shí)生活中的復(fù)雜問題,逐步拆分成可理解的小問題风喇。
1宁改、Decomposition,即拆分魂莫。根據(jù)已有的知識和經(jīng)驗(yàn)还蹲,把問題拆分。
比如我想喝咖啡耙考,那我可以請求你:“可以幫我倒杯咖啡嗎谜喊?”但這句話如果想讓電腦聽懂,我得先告訴它哪個(gè)是“杯子”倦始、哪個(gè)是“咖啡”斗遏、什么是“倒”,然后再告訴它怎么去倒鞋邑,比如先直走5米诵次,左轉(zhuǎn)75度账蓉,左臂下放50度……
現(xiàn)實(shí)生活,每一個(gè)復(fù)雜問題逾一,都是基于解決一個(gè)個(gè)被拆分的小問題而被解決的铸本。
比如說,超級計(jì)算機(jī)感覺很復(fù)雜最后無非是解決一個(gè)帶寬問題遵堵、一個(gè)存儲問題箱玷;
比如說,解決碳排無從下手陌宿,實(shí)際上是解決人口锡足、服務(wù)、能源壳坪、單位能源的碳排放這幾個(gè)問題舶得。
2、Pattern Recognition弥虐,即模式識別扩灯。根據(jù)新問題和以前解決過的問題的相似性,舉一反三琢磨出規(guī)律霜瘪。
假如你需要畫100只貓珠插,你會怎么辦?找100只貓來挨個(gè)臨挠倍浴捻撑?
對于計(jì)算機(jī)來說,你需要找出貓的“模式”缤底。
你要知道貓是專屬的毛顾患,眼睛,尾巴个唧,四條腿等江解,按照這個(gè)“模式”,你才可以“批量”畫貓——你不用每次畫一個(gè)新動物徙歼,只需要變換局部特征:黃白條的貓還是黑貓犁河,長尾巴的貓還是短尾貓。
3魄梯、Abstraction桨螺,即抽象,將問題里涉及的數(shù)據(jù)酿秸,抽象到數(shù)據(jù)結(jié)構(gòu)(變量灭翔,數(shù)組,鏈表等)辣苏,把數(shù)據(jù)處理過程可重復(fù)執(zhí)行部分抽象成函數(shù)模塊肝箱。
聽起來很復(fù)雜吧哄褒?這是一個(gè)過濾的過程,整個(gè)過程你要聚焦重要的關(guān)鍵信息狭园,忽視無用細(xì)節(jié)读处,這樣才能通過認(rèn)知問題的核心本質(zhì),幫助我們形成解決問題的構(gòu)想唱矛。
比如,當(dāng)我們看到這一房子井辜,我們看到的是:
但在建筑師的眼中绎谦,它可能是這樣的:
建筑師通過自己的經(jīng)驗(yàn),抽象出房子里面具體的構(gòu)造粥脚。
這一步窃肠,我們雖然幾乎難以在應(yīng)試教育的學(xué)習(xí)方法中獲得,但我們能從不斷地編程訓(xùn)練中去培養(yǎng)抽象思維刷允。會編程的人冤留,往往能透過一個(gè)應(yīng)用表象,看到背后實(shí)現(xiàn)的步驟树灶。
4纤怒、Algorithms,即算法天通。通過循環(huán)執(zhí)行泊窘,根據(jù)前三步的分析成果,設(shè)計(jì)步驟像寒,寫出算法烘豹,從而解決問題。
這一整個(gè)過程诺祸,我們看到所謂的編程語言和語法携悯,在最后才發(fā)揮出作用。
所以當(dāng)我們覺得學(xué)編程難筷笨,是因?yàn)槲覀冞€未從過去根深蒂固的學(xué)習(xí)習(xí)慣中抽離出來憔鬼,凡是需要打破習(xí)慣的事,必是不易的奥秆。
就像很多剛剛出國讀書的孩子逊彭,常常在面對外國老師問出「why」的問題時(shí),馬上一種驚慌失措的表情构订,滿腦子想著自己是不是又說錯(cuò)答案了侮叮,不知道老師這樣問僅僅是為了引導(dǎo)他們拓展思維。
我們真實(shí)的社會和生活也是不易的悼瘾,它們沒有標(biāo)準(zhǔn)答案囊榜,許多人終其一生沒有追尋問題的能力审胸,無法理解世界的復(fù)雜。
而編程卸勺,是你找出解決方法的能力砂沛,把現(xiàn)實(shí)問題轉(zhuǎn)換為代碼邏輯的能力。只有認(rèn)清這一點(diǎn)曙求,你才能更好地攻克它碍庵。
二、難在我們從未學(xué)過創(chuàng)造
清華大學(xué)前校長陳吉寧曾提過一個(gè)觀點(diǎn):
清華大學(xué)里有很多“A型學(xué)生”悟狱,但未來社會最需要的是“X型學(xué)生”静浴。
“A型學(xué)生”,指的是傳統(tǒng)觀念里的“好學(xué)生”挤渐,他們的成績總是能得“A”苹享。
“X型學(xué)生”與之不同,他們的成績并不一定拔尖浴麻,但愿意承擔(dān)創(chuàng)新風(fēng)險(xiǎn)得问,勇于嘗試新鮮事物。
兩者最重要的差別软免,在于創(chuàng)造力宫纬。
可是我們連作文還不敢寫得太跳,生怕閱卷的是個(gè)老古董或杠,大筆一揮哪怔,讓你再考一年。創(chuàng)造力向抢,更是我們在學(xué)校想都不敢想的事认境。
絕大部分學(xué)生的思維,早已在填鴨式的教學(xué)中挟鸠,變成了一個(gè)只會收納外部知識的容器叉信,根本無法用所學(xué)的東西創(chuàng)造出任何東西來。
所以艘希,當(dāng)我們開始學(xué)編程硼身,面對“Hello world.”這個(gè)等著我們創(chuàng)造的世界,其實(shí)是非常茫然的覆享。
因?yàn)榫幊虥]有“題型”和“公式”能把你解決問題的過程簡化成填空佳遂,編程提出的問題基本都是空而泛,需要你根據(jù)腦子里的邏輯推斷撒顿,利用所學(xué)編程語言的各項(xiàng)功能組織成代碼丑罪,來解決問題。
整個(gè)世界的運(yùn)轉(zhuǎn),都是靠你的大腦想象出來的吩屹。這是編程的難跪另。
但是,只要你明知其中不易煤搜,仍有一腔驍勇免绿,你可以嘗試在編程的世界中,保持“實(shí)驗(yàn)者心態(tài)”擦盾,不斷探索自己的想法嘲驾,質(zhì)疑自己的假設(shè),從所犯錯(cuò)誤中學(xué)習(xí)寶貴的經(jīng)驗(yàn)厌衙,就一定能在編程的魔法世界中得到更多寶藏距淫。
如果你看過近期大火的《樂隊(duì)的夏天》,那么在參賽的三十一支樂隊(duì)中婶希,你一定會被其中一支叫做“刺猬”的樂隊(duì)所打動。
刺猬樂隊(duì)的子健蓬衡,他是臺上的狂躁主唱喻杈,臺下的學(xué)霸碼農(nóng)。
即使每天都在和冰冷的數(shù)字打交道狰晚,但作為程序員的他筒饰,體內(nèi)有被保護(hù)得非常好的創(chuàng)造力,使得他擁有滿腔的詩意與細(xì)膩的內(nèi)心壁晒,更可以譜寫出令人折服瓷们,引人共鳴,充滿無限色彩的音樂作品秒咐。
三谬晕、難在我們從未需要如此深刻了解世界
在我工作以后,曾受過一名編程大佬指點(diǎn)携取,他說了一句讓我印象深刻的話:
“所有的程序攒钳,都是建立在自然之上,我們現(xiàn)在所學(xué)的編程雷滋,和自然是一體的不撑。”
舉兩個(gè)小例子:
C語言冒泡排序法晤斩,它的原理是來自汽水中的氣泡焕檬,水中常常有許多小小的氣泡,嘩啦嘩啦飄到上面來澳泵。而組成小氣泡的二氧化碳比水要輕实愚,所以小氣泡可以一點(diǎn)一點(diǎn)向上浮動。
在C語言中,這種排序算法的每一個(gè)元素都可以像小氣泡一樣爆侣,根據(jù)自身大小萍程,一點(diǎn)一點(diǎn)向著數(shù)組的一側(cè)移動。
(圖片來源于網(wǎng)絡(luò))
人工神經(jīng)網(wǎng)絡(luò)兔仰,則是依靠一種類似于大腦神經(jīng)突觸聯(lián)接的結(jié)構(gòu)茫负,進(jìn)行信息處理的數(shù)學(xué)模型。
它們都受到了自然的啟發(fā)乎赴。
學(xué)編程忍法,往往學(xué)的也不僅僅是計(jì)算機(jī)本身,而是將各行各業(yè)榕吼,結(jié)構(gòu)力學(xué)饿序,生物細(xì)胞,光學(xué)聲學(xué)……等千百萬個(gè)行業(yè)羹蚣,抓住它們的重點(diǎn)原探,迅速理解并且教給CPU,讓它代替人類工作顽素。
尤其是身處信息時(shí)代咽弦,計(jì)算機(jī)是信息處理的核心,商業(yè)胁出、農(nóng)業(yè)型型、工業(yè)、教育等全蝶,都被計(jì)算機(jī)技術(shù)推動著進(jìn)步闹蒜,如果能知道計(jì)算機(jī)是怎么做到這一切的,即知道這里蘊(yùn)含的編程思維是什么抑淫,才能給個(gè)人在所處行業(yè)的發(fā)展帶來幫助绷落。否則,就只能浮于表面地應(yīng)用現(xiàn)成軟件而已丈冬。
這是編程的第三難嘱函。應(yīng)試教育標(biāo)準(zhǔn)化的課堂,正好背離了這點(diǎn)埂蕊。
從前的課堂里往弓,為了實(shí)現(xiàn)教學(xué)效益化,將課程進(jìn)行了劃分蓄氧。
遺傳學(xué)被歸入了生物課函似,概率這個(gè)概念被歸入了數(shù)學(xué)教育,然而遺傳學(xué)實(shí)際上是對概率的應(yīng)用喉童。同理撇寞,物理明明需要應(yīng)用代數(shù)和微積分,它卻與這兩門課程脫節(jié),成了獨(dú)立的學(xué)科蔑担。
仿佛每個(gè)知識只存在于真空中牌废,于外界事物毫無關(guān)聯(lián)。
這些劃分限制了學(xué)生的理解啤握,讓學(xué)生對世間萬物運(yùn)行規(guī)律的理解產(chǎn)生了偏差鸟缕。
于是,為了了解每個(gè)“獨(dú)立”的知識排抬,我們接收各種各樣精細(xì)化加工的知識:推演好的理論懂从、公式,講義蹲蒲、ppt番甩、難點(diǎn)總結(jié)、高分模板届搁,我們無需知道這些公式是怎么推導(dǎo)出來的缘薛,只要運(yùn)用公式去解題就好了。
久而久之卡睦,我們認(rèn)為學(xué)語文就是語文掩宜,數(shù)學(xué)就是數(shù)學(xué),甚至我們對世界的認(rèn)知么翰,只是基于“知識共同體”,對于許多現(xiàn)象無須究其根本辽旋,自動達(dá)成共識浩嫌。
什么叫知識共同體?
史蒂文·斯洛曼和菲利普·費(fèi)恩巴赫的《知識的錯(cuò)覺》一書提出了“知識共同體”补胚。
知識共同體由某一知識領(lǐng)域相互聯(lián)系的行為體組成的码耐,人類社會本身就是一個(gè)龐大的知識共同體系統(tǒng)。
為了人與人之間的相互協(xié)作溶其,人們逐漸根據(jù)不同人擅長的領(lǐng)域進(jìn)行分工骚腥。時(shí)至今日,如果我們家的鎖壞了瓶逃,我們會去找鎖匠束铭;如果有人生病了,我們會去找醫(yī)生厢绝。不同的工種的人契沫,掌握了不同的知識。于是昔汉,人們被歸入一個(gè)個(gè)不同的群體懈万,這就是所謂的“知識共同體”。
我們以為自己非常了解世間萬事萬物,其實(shí)是個(gè)錯(cuò)覺会通,事實(shí)上我們腦袋里存著的知識微不足道口予,全靠相互依存和形成的認(rèn)知。
就好比中世紀(jì)的人們相信地球是平的涕侈,而現(xiàn)代的我們相信地球是圓的沪停,并非由于我們大多數(shù)人能夠給出基于物理學(xué)的解釋,而是現(xiàn)代科學(xué)讓我們相信了這個(gè)基本事實(shí)驾凶。
即便日常生活中充滿了各種各樣的奇跡牙甫,也因?yàn)樗究找姂T的緣故,很多人甚至沒有意識到它們是奇跡:
我們坐擁空調(diào)暖氣调违,搭乘高鐵飛機(jī)窟哺,手握平板手機(jī), 搜索查詢問題技肩,享受生活之安全愜意且轨,當(dāng)整個(gè)世界的知識就在指尖之時(shí),我們仿佛真的認(rèn)為自己博學(xué)多聞虚婿,其實(shí)我們只是活在在知識共同體里旋奢。
這也是為什么我們以為掌握了知識,其實(shí)沒有——
考完試以后然痊,我們會忘記大部分所學(xué)的知識至朗;
開會討論出很多點(diǎn)子,但一到執(zhí)行的時(shí)候剧浸,就故態(tài)復(fù)萌锹引,還是不知道從哪里入手,典型的“一聽就會唆香,一做就廢”嫌变。
回到學(xué)編程。
之所以感覺那么難躬它,正是因?yàn)樗辉试S我們喪失獨(dú)立并深入探究知識細(xì)節(jié)的能力腾啥,不允許我們冠以籠統(tǒng)的態(tài)度求知,因?yàn)橛?jì)算機(jī)聽不懂我們模棱兩可的語言冯吓。
程序員需要探其根本倘待,理解每一個(gè)概念的來由、定義和用途桑谍;需要多學(xué)科延柠、深入而原始了解這個(gè)世界:
他要懂“生物”:不同的技術(shù)構(gòu)成不同的生態(tài)系統(tǒng),不同的生態(tài)系統(tǒng)有不同的規(guī)則锣披。
他要懂“化學(xué)”:各類系統(tǒng)和語言的關(guān)鍵性質(zhì)贞间,提供能寫出優(yōu)秀程序的原料贿条;
他要懂“歷史”:技術(shù)從哪里來,要到哪里去增热;
他甚至還要懂“藝術(shù)”:寫程序?qū)Φ闷鹱约旱难劬φ裕霎a(chǎn)品對得起用戶。
……
編程世界是真實(shí)世界的縮影峻仇。
四公黑、尾聲
所以,你說編程難嗎摄咆?編程一點(diǎn)都不難凡蚜,用電腦聽得懂的語言,告訴它幫你做你想要做的事情吭从,只要認(rèn)真學(xué)朝蜘,誰都可以。
難就難在涩金,"學(xué)以致考"和"學(xué)以致用"是不一樣的谱醇;記憶和創(chuàng)造是不一樣的;學(xué)好學(xué)科和理解世界是不一樣的步做。
當(dāng)然副渴,并非要徹底否定應(yīng)試教育。在中國教育資源極其不平均全度、經(jīng)濟(jì)文化撕裂的大生態(tài)下煮剧,以考試為目的的教育,提供了一套非常清晰的評判標(biāo)準(zhǔn)将鸵,通過分?jǐn)?shù)這個(gè)顯性的指標(biāo)來篩選和劃分學(xué)生群體轿秧,選拔出社會精英,可能是當(dāng)下最公平的取舍了咨堤。
只是時(shí)代在不斷的發(fā)展,無論是學(xué)校漩符,家長還是孩子一喘,都應(yīng)該反思一下現(xiàn)在的所接受的教育形式,如何發(fā)揮出每一個(gè)自己的個(gè)性嗜暴,讓他們成長為更好的人——學(xué)編程的過程會給你提供答案凸克。