作為一名青椒页衙,這幾年在大學的教學工作做下來,發(fā)現(xiàn)無論是計算機專業(yè)的學生阴绢,還是把編程作為公修課的其他專業(yè)學生店乐,很多人內(nèi)心都有一個靈魂拷問——為什么我認真聽課,認真看書書旱函,幾個月甚至一年下來但還是寫不好代碼响巢?!
為什么學了很久很久編程棒妨,還是只會寫一些簡單的算法題踪古?
為什么學了幾個月編程含长,還是寫不出哪怕100行的小項目?
為什么好不容易堅持看完了語法伏穆,卻發(fā)現(xiàn)內(nèi)容全沒記拙信ⅰ?
我是不是天生和編程無緣枕扫,寫不出代碼是不是就必須放棄編程陪腌?
以上現(xiàn)象你中招了嗎?
不要怕烟瞧,你不是一個人诗鸭,我剛學編程那會兒也是這樣的。不僅是我参滴,我相信還有很多同學是這樣强岸,那到底是什么神秘的力量在阻止我們學會編程呢?又該如何打破這個魔咒呢砾赔?
一蝌箍、降低目標:明確學編程的目標和初衷
首先我們要想明白自己為什么學編程,學到什么程度為止暴心。這個問題根據(jù)不同的身份妓盲,會有不同的答案。如果你是一名計算機專業(yè)的學生专普,那自然要建立完整的知識體系悯衬,從算法到數(shù)據(jù)結(jié)構再到各類框架,都是要進行系統(tǒng)學習的檀夹。這時候你的學習目標是整個體系甚亭,要求自然會高,過程自然會慢击胜,我們在這篇文章里不展開討論,我們今天主要討論一下針對非計算機專業(yè)的學生——學編程的核心到底是學什么役纹?
實際上偶摔,學習編程,對大多數(shù)非計算機專業(yè)的人來說促脉,就是在當前這個時代辰斋,獲得一種直覺——在學習、工作瘸味、生活中碰到問題時宫仗,可以大概的判斷這個問題或想法是否可以交給計算機解決,并在這個過程中逐漸建立一個看待世界的新維度旁仿、新視角藕夫。
因此,我們要降低對編程的要求,我們不能要求自己做到像專業(yè)的程序員那樣從無到有從零到一百的去搭建一個完整的項目毅贮,這不符合我們跨專業(yè)學編程的初衷办悟,就像你學數(shù)學,學化學滩褥,學物理病蛉,但你并不會做個數(shù)學家化學家物理學家。
我們的目標是能將問題從編程的角度建模瑰煎,并且能利用網(wǎng)絡資源铺然,開源代碼等快速找到需要的模型,進行修改和調(diào)試酒甸,然后解決自己的某個小問題魄健,這就足夠了。
二烘挫、以練為學:編程不是知識诀艰,而是一門手藝
我們從小到大的學習都是學習知識,流程一般是課前看書預習饮六,上課聽講其垄,下課做作業(yè),然后復習考試卤橄。但是學手藝可不是這么學的绿满。回憶你小時候?qū)W游泳窟扑,學樂器喇颁,學開車。需要記憶知識體系掌握各類原理和知識點之后再開始練習嗎嚎货?顯然不是這樣的橘霎。
教練是不是就強調(diào)一點:別廢話,練就完了殖属!
回歸到線上編程本身的職能定位姐叁,不管是當前主流的錄播模式,還是各類花哨的互動網(wǎng)課洗显,又或是實時直播的方式外潜,其實本質(zhì)上都無法構成學習編程的全部客觀要素。這是因為任何課堂本質(zhì)上挠唆,終歸都是一種入門方式和輔助手段处窥。而我們想要真正掌握一個技能掌握一門手藝,都是要通過反復的練習玄组、實踐滔驾,不斷的反饋迭代谒麦,才能越來越熟練,最終完全掌握嵌灰。正如格拉德威爾所說弄匕,“1萬小時的錘煉是從平凡變成大師的必要條件”。
就像開車和學英語一樣沽瞭,你想要熟練掌握迁匠,就要在學的時候放棄速成的想法,慢慢來才是最快的驹溃。編程和其他技能類似城丧,唯有更多的練習,才能讓你形成思維習慣豌鹤,掌握各類建模的套路亡哄,甚至變成條件反射和肌肉記憶。
編程和投資理財一樣布疙,期待收獲和成長時蚊惯,要時刻提醒自己銘記復利思維:不怕進步小,就怕停下腳灵临。這也是所有“手藝”學習的通用思維截型。持續(xù)的使用和持續(xù)的思考,會讓你對這個陌生領域的理解逐漸加深儒溉,會把散落的知識點逐漸在練習的過程中宦焦,織結(jié)成網(wǎng),最終融會貫通順手拈來顿涣。開始也許每天的進步很小波闹,小到你自己很難察覺到。但是這個時候只要咬牙堅持住涛碑,假以時日精堕,你就會收獲復利帶給你的成果。
當然練習也要遵循一定的技巧和規(guī)律蒲障,不能毫無計劃锄码,也不要沖動盲目。那么該如何進行有效的學習和練習呢晌涕?
三、知識爆炸的年代痛悯,堅持三個不要
現(xiàn)在這個知識爆炸的時代余黎,任何領域都有大量的資料,也有大量的前人做的很好的基礎工作载萌,甚至是偉大的成果惧财。那么我們?nèi)绾芜M行更有效率的學習呢巡扇,我認為堅持三個不要:
不要學什么都先買本教材,試圖系統(tǒng)的從頭讀到尾垮衷。特別是在編程領域厅翔,最好的資料莫過于官方的文檔,最全面也最權威搀突,而且在持續(xù)的更新刀闷。但即便是官方文檔,我們也沒有必要從頭到尾順序閱讀仰迁,你會發(fā)現(xiàn)你讀著讀著甸昏,前面讀過的內(nèi)容居然又更新了,氣人不氣人徐许,永遠讀不完施蜜。正確的方法是當做工具來用,當做字典來用雌隅。互聯(lián)網(wǎng)和搜索引擎就是你的腦力補充翻默,在這個信息爆炸的時代,掌握如何檢索知識遠比如何記憶知識重要的多恰起。
不要隨便拿篇文章就讀修械,不比較、不思考的閱讀村缸,就是在揮霍時間祠肥。知識爆炸和自媒體導致的另一個問題,就是網(wǎng)絡上各類內(nèi)容質(zhì)量參差不齊梯皿,謬誤百出仇箱。如果你閱讀的代碼或者文章質(zhì)量低下,甚至是充滿錯誤东羹,那很可能不只浪費時間剂桥,還會帶來錯誤的引導,甚至會讓你離初衷漸行漸遠属提。因此閱讀的時候一定要花時間鑒別和選擇優(yōu)質(zhì)內(nèi)容权逗,我們要時刻考慮時間成本,機會成本和沉沒成本冤议。
不要過于“勤奮”斟薇,什么都自己從頭開始搞。互聯(lián)網(wǎng)的紅利之一恕酸,就是共享和迭代堪滨。我們要善于利用互聯(lián)網(wǎng)上大量的開源項目,大量的共享代碼蕊温。站在別人的肩膀上袱箱,總不會太矮遏乔。同時我還建議大家也積極共享自己的成果,除了可以給別人提供便利发笔,也可以收獲大家的反饋盟萨,進而提升自己的能力。
想明白這些之后呢了讨,問題就變得簡單了捻激,具體到跨界學編程這個領域,我總結(jié)出來以下幾個小技巧量蕊,大家可以參考一下铺罢。
1、語法很重要残炮,但無需逼迫自己記憶之后再寫代碼韭赘。回憶上小學你第一次學寫作文的時候,是不是還有很多字不認識势就,詞匯量也很小泉瞻,甚至一篇文章一大半都是拼音?老師不會等我們掌握了所有常用字苞冯,學會了嚴謹?shù)恼Z法之后袖牙,才讓我們寫作,是不是舅锄?編程也是這個道理鞭达,語法記不住沒關系,參數(shù)含義記不清也沒關系皇忿,重要的是我們要趕緊動手寫起來畴蹭,遇到記不清楚的語法我們可以翻課件,查官方文檔鳍烁,問老師叨襟,問同學。一次兩次不會幔荒,三次五次記不清楚糊闽,但我相信十次八次之后,你一定可以記住了爹梁,就算記不住右犹,也知道去哪可以快速查到解決方案。
2姚垃、用電腦之前念链,先用人腦。編程和寫作很像,網(wǎng)絡上有大量的資源可以參考借鑒钓账,有大量的開源社區(qū)可以供我們拿來利用,但不假思索的復制一千篇文章絮宁,仍然對你的寫作幾乎毫無幫助梆暮。因此,同樣的绍昂,這個模式要千萬要避免啦粹,很多同學直接復制別人的代碼,點下運行發(fā)現(xiàn)報錯窘游,然后就直呼太難了我放棄或者直接去提問‘代碼跑不通怎么辦唠椭?!’忍饰。這個是學編程中的大忌贪嫂,問題出在哪里呢?因為缺少了思考的過程艾蓝。
首先要思考去哪里檢索力崇,優(yōu)質(zhì)的、專業(yè)的內(nèi)容社區(qū)要比泛泛的撒網(wǎng)更有成效也更節(jié)約時間赢织。然后要帶著思考看代碼亮靴,看懂你復制的這個代碼是如何構建的,之后才是動手去修改和調(diào)試于置。運行出了錯誤茧吊,仍然是繼續(xù)思考這個錯誤反饋的是什么問題,如果解決不了要進一步去谷歌百度八毯,看看大家是怎么解決這類錯誤的搓侄。
只有不斷的投入思考,練習才有意義宪彩。你快速進步的過程休讳,不是復制代碼,而是不斷的自己去解決問題尿孔,直到調(diào)試完成俊柔,得到你想要的結(jié)果。
3活合、使用目標驅(qū)動的方法雏婶,采取驗證學習的策略。把教材和官方資料當做字典白指,看書查資料是輔助留晚,動手才是主動。極端一點,甚至可以除了必要的文檔错维,其他一律不看奖地。先把編程的基礎語法都親自動手逐一完成一遍,最簡單的辦法就是看一個知識點之后馬上去驗證赋焕。驗證不是指看著示例代碼敲一遍参歹,而是跟實戰(zhàn)一樣的,自己設想一個用到這個知識點的問題場景隆判,然后試著修改示例代碼去解決自己的提問犬庇。
四、比編程更重要的侨嘀,是編程思維
日常教學中臭挽,時不時會有同學絕望的給我說,“無論如何努力咬腕,一寫代碼就頭大欢峰,一看程序就懵圈,實在是沒辦法郎汪,可能是和編程天生八字不合......”那是不是不寫代碼真的就得放棄編程了呢赤赊?答案是否定的。
《Computational Thinking》作者就曾倡議煞赢,計算機科學的教授應當為大學新生開一門稱為“怎么像計算機科學家一樣思維”的課抛计,面向非專業(yè)的,而不僅僅是計算機科學專業(yè)的學生照筑。因此事實上吹截,寫代碼只是一種向計算機傳達信息的方法,而真正重要的凝危,不是代碼如何寫波俄,而是你是否具備“編程思維”。
舉個簡單的例子蛾默,如果你不會開車懦铺,是不是就不能從北京到上海了呢?顯然不是支鸡,只要你知道從北京到上海是有路的冬念,是可以跑汽車的,你即便不會開車牧挣,也可以讓別人開車載你去急前,對不對?真正可怕的瀑构,不是不會開車裆针,而是你不知道有車,不知道有路,不知道從北京到上海有多少種可達途徑——即不知道這個問題的數(shù)據(jù)結(jié)構和算法思維世吨。
如果說我們現(xiàn)在的問題是“在北京澡刹,想去上海”耘婚,那么我們其實都會自動的調(diào)用大腦的程序思維像屋,例如我們會先把問題建模,輸入條件是“出發(fā)地北京边篮,目的地上海”奏甫,其中的常量是“出發(fā)時間戈轿,出行人數(shù)”,變量是“不同的交通工具和出行方式”阵子,判斷條件為“預算費用思杯,到達時間,天氣等等”挠进,最后我們會根據(jù)常量色乾,依托條件,篩選和改變變量领突,最終輸出一個“從北京到上海的出行方案”暖璧,要求更高一點,你可以優(yōu)化算法君旦,得到一個時間澎办、預算、精力均衡的“最優(yōu)出行方案”金砍。你看局蚀,面對簡單的問題,我們不自覺的就已經(jīng)在調(diào)用編程思維了恕稠。
然而面對一些復雜的問題的時候琅绅,我們就需要主動的,有意識的去培養(yǎng)和應用自己的編程思維鹅巍,計算思維千扶,從而能夠?qū)碗s問題進行有效的拆分,降維昆著,從容有序的去解決县貌。正如《寫給所有人的編程思維》一書中所說,編程的核心凑懂,不是編程語言煤痕,也不是語法,甚至不是算法或數(shù)據(jù)結(jié)構本身。而是如何分解問題摆碉,從中發(fā)現(xiàn)規(guī)律塘匣,建立解決問題的模型,映射到合適的數(shù)據(jù)結(jié)構和算法上巷帝,然后才能寫程序?qū)崿F(xiàn)忌卤。
也就是說,寫代碼是最后一步楞泼,也是最沒有技術含量的一步坏晦,重要是前面的思考和建模的過程融求。
因此,如果你對寫代碼厭煩至極,你大可以把最后這個繁瑣的勞動交給我們計算機專業(yè)的人去“搬磚”豆拨,你只需要清楚的知道你想要什么某饰,正確的利用編程思維些膨,將你的問題進行建模和映射喇澡,那至于代碼本身,只要你向程序員傳達时呀,就可以得到自己需要的代碼了张漂,將來這也許會成為一個服務,成本也會越來越低谨娜,甚至就像你出門打車一樣方便航攒。
喬布斯喬幫主說,每個人都應該學習編程趴梢,因為它教會你如何思考屎债。那么如何先拋開代碼,訓練自己的編程思維呢垢油?復雜的數(shù)據(jù)結(jié)構該如何理解呢盆驹?如何將各類抽象的算法映射到日常生活中去呢?又該如何把工作學習中的問題進行拆解建模滩愁,選擇合適的解決框架呢躯喇?
為此,我們會推出一個“編程思維”的專題硝枉,在這個專題中廉丽,我們不講代碼,而會給大家逐個將計算機編程中的抽象概念妻味,用大家都能理解的方式進行解讀正压,力求能夠讓非計算機專業(yè)的人,都能更輕松的掌握編程思維责球。歡迎大家持續(xù)關注焦履。