走少有人走的路:編程真TM難學
Coding Girls Club 第一期學員:
我們一起相伴六周,每日Daily Topic,每周一次線下Meetup以及每周一次Online Meetup,時間真快。今天是第一期的最後一次meetup,有些掏心窩的話,要跟你們說說。
你是編輯,來學編程幹嘛呢?
你是律師,來學編程幹嘛呢?
你是HR,來學編程幹嘛呢?
你是測試人員,來學編程幹嘛呢?
你是旅遊攻略達人,來學編程幹嘛呢?
你已經在用世上最好的語言,來學Ruby幹嘛呢?
你創業當合伙人,那麼忙,來學編程幹嘛呢?
你出差那麼忙,一直在香港,來學編程做啥呢?
這是你們需要自問的問題,而且是你們自己來回答的問題,是解決學編程路上所有問題的基本前提。不想去搞清楚這個問題,甚至認為「這不是我的問題」,一點好處都沒有;指望別人解決,也一點用處都沒有。唯一 的解決辦法 -- 你應該勇敢地說「這是我的問題,這應該也必須由我來解決!」
六周,大家到現在都經歷過了什麼?
最先開始,相比大家對於學習編程抱著極大的熱情:我要把我業餘的時間全部投入在編程上面、我一定要學會編程,甚至有同學購買新的Mac等等;大家從對編程什麼都不知道開始,第一次打開Terminal、第一次自己苦心琢磨安裝環境、第一次跑通自己的小程序,學習Git/ CLI/Ruby基礎知識,你們的能力(Competence)獲得增長,在此過程中,你們有你們的小確幸。我相信,猶如我自己開始學習編程一樣,每一次依靠自己的智慧和努力解決每一個學習上面的bug和疑惑,我都能獲得十足開心,我在進步,我能感受到升華。 Running program successfully often made my day!
但是,更多的是其他的情緒,焦慮、挫敗、迷茫、不自信,想放棄、覺得自己不是學習編程的料子、以至於回歸到剛剛開始的問題:我幹嘛來學習編程了?我的初心是什麼,學了一遭,我還是啥都不會,依然不能自己獨立作出網站,寫出程序;離開依葫蘆畫瓢的教程和TA的指導,我依然不會編程。
對的, 學習從來都不是一件容易的事情,傳統的教育系統培養學生十幾年,企業才招收你;就編程而已,更是: 真TM難學
我曾經當過Rails Girls 三年志願者,論及我直接和間接組織的workshop 共18次:北京6次、上海1次;做過一次6個城市同一天workshop的總協調人員、7個城市7周的總調度人;每次按50人估算(北京有時候多一點,最後一次有120個參與者),有讓差不多讓1000+的女孩子接觸編程,那麼你們知道最後有多少個人真正成為有編程能力的人嗎?
兩個。
一位是若水,這是她的故事( http://www.ituring.com.cn/article/202161 ); 還有一位是北京去年Workshop的學員,她原本在傳統行業,受RG影響,後來自學了Python(故事轉彎有點大,我們教的可是Ruby)。對,千分之二的轉化率。難不難呢?挺難的呢。
1 推遲滿足感,認清蜜月期
很難去責怪那另外千分之九百九十八:當初她們開始都抱著極大的熱情來學習編程,卻沒有幾人學成。
一方面是就像我們小時候聽到的「狼來了」的童話故事,只是現在童話故事中的老狼換成了編程,讓人望而生畏。大家周邊從小也不乏這樣的聲音:女孩子學什麼理科、搞什麼計算機呢、學點文科找份踏實的工作就行了。這種社會聲音製造莫須有的恐懼,嚇退了很多人學習編程。
另一方面, 「學習編程」的運動在世界各國興起,各種學習資料和教程,打破了學習的邊界,而且也證實學習編程確實無害。例如Codecademy Code School, Edx/Coursera的各種免費公開的MOOC課程,從入門到高級,比比皆是。跟著教程作出東西會製造一種我已經會編程的假象。
但,新問題也出現了。有時候不再是害怕開始踏入學習編程,對於現在的你們,你們已經開始學習編程,應當已經克服「狼來了」這部分這種恐懼。新問題是過高的期望和急功近利。
過去六周,CGC給你們設計的路線、介紹各種工具和教程,就像扶著小孩子走路一樣,學習變數、基本語法、完成小程序的挑戰、製作簡單的網頁,你們一步一步建立起個人成就感,自信心開始增長:你覺得自己基本上具備一個程序員的基本素養。編程哪有那麼難呢?你們開始在朋友圈曬你們的「學習成績」。
這就是問題所在,你們處於稱之為「蜜月期」的時期:儘管你感覺處於學會編程的轉角,但實際上才剛剛敲門,門還沒有推開。
想一想,假如你打算重新學習一門外語。拿日語來說吧,從前,你只知道有這門語言,從日本動畫片《柯南》或者是日劇《白夜行》等學會了兩句,然後你打算開始學習日語。每周利用自己的業餘時間加入學習班,跟著一個教程學習了六周,會了基本的語法、句式、也能日常對話,可是你能說你會日語嗎?
學習一門普通語言尚且如此,更何況是編程語言呢?
況且我們的日常語言是模糊語言,大腦比計算機高級太多,能夠處理的模糊模式也多很多,試著第一次讀讀下圖:
再仔細看一遍上圖,語序全都是亂的,卻也一點都不影響你的大腦識別其中信息。但計算機不行,計算機必須語法、演算法等絲毫不差,否則就會報錯出bug。
因此,在享受蜜月期的同時,必須清醒地認識到「推遲滿足感」的意義:
編程真正的快樂絕不在於跟著教程按部就班完成別人設置的任務,而是重新設置快樂與痛苦的次序:認清自己目前對於編程「You know nothing」的事實並感受痛苦;然後解決接踵而來的新問題並享受更大的快樂,這是唯一可能讓你前行的方式。
【插入曲】編程路上的四個時期
對編程了解愈少,思維就越是混亂。虛假、錯覺和幻覺,只能讓我們不知所措。我們對編程實際情況的觀念就像一張地圖,憑藉這張地圖,我們同我們前進路上的障礙不斷協調和談判。
地圖準確無誤,我們就能確定自己的位置,知道要到什麼地方、怎樣到達那裡;地圖漏洞擺出,我們就會迷失方向。
在進入階段二之前,我們先來看看 The Bigger Picture
上圖畫出了編程旅途上典型的四個階段,下面從可獲得資源密度(解決問題的可能性)以及所需知識範疇(需要解決問題的難度)來詳細定義說明這四個階段。
編程旅途中學習的快樂與你的自信心相關聯,而信心源於編程能力,對應上圖坐標系中的XY軸。
手把手蜜月期是充滿快樂且擁有豐富優質學習資源的時期,看起來你掌握不少tricky的技能,但其實完全是在老師(書、MOOC課程、CGC的TA)的刻意支持下做一些do-ables, 實際上並不tricky。
懸崖迷茫徘徊期是痛苦的覺醒,當蜜月期結束時會異常痛苦。是的,你會發現一個痛苦的事實:離開教程和教練,實際上,你完全無法獨立依靠自我解決任何問題。在此期間,你需要不停地debug,以及依靠自己那點稀薄且不太靠譜的編程知識問自己正確的問題、請教達人正確的問題,直到你用自己的方法實實在在地完成你自己的to-do list。
絕望沙漠之旅漫長而且孤獨,恍如進入無人之境,好像每條路都能到羅馬,嘗試之後被挫敗,不停地繞圈子,同時又極其渴望資源。此階段,容易走入歧途,猶如海市蜃樓。
上升膨脹期 最終你走出荒野沙漠,不管你是一帶一路還是西天取經。終於你把所有你會的的語法(syntax)、模式(pattern)、演算法(algrithm)、想法(idea)、實踐(practice)搭建出你自己的網站。但你的代碼依然很脆弱,宛如紙房子。你膨脹,因為你自我感覺良好:你的網站尚在運行,你運用有用的模式,你的朋友覺得你的界面很漂亮。 但離CGC所言成為真正有編程能力的人,還有很大差距。
2 承擔責任,縱身一躍度過迷茫期
從你們報名加入的那一刻起,你們就超越絕大多數人。
6周的時光,前四周是蜜月期,你們創立了粽子理論來理解面向對象思維、用Ruby語言來寫詩、用律師的概念跨界類比理解Ruby的設計思維,你們獲得甜蜜的感覺。
最後兩周是實戰,CGC把你們推向懸崖,從Idea出發,設計功能,描繪 User Story,繪畫Page Flow,設計資料庫。
此時此刻,你們蒙圈了,即使你們當中潛在的優質同學也在懸崖邊上徘徊,你們充滿沮喪:「還沒有學會如何展翅飛翔。」
此時此刻,你有幾種選擇:
自己不是這個料,打退堂鼓,退回去,原來幹什麼繼續幹什麼。
管他的,縱身一躍,摔得遍體鱗傷,繼而對編程深惡痛絕。
對自己負責,勇於承擔責任。在懸崖邊上一邊擔驚受怕,一邊鍛煉自己,觀測風向,選擇適合自己的恰當時機,縱身一躍 — 終於開始展翅。
如何對自己負責,如何承擔責任呢? 回到最開始的問題,這是你自己的責任嗎?這是你自己的問題嗎?造成你現在沒有足夠能力飛翔的原因是CGC課程設計的問題?是教練輔導不好的問題?還是無法控制的社會因素造成的?這個問題應該別人和社會來幫我解決,還是應該我自己主動解決呢?
加入CGC的時候,我們有一項必要條件:每周至少投入10-15個小時,大家需要問問自己,都有做到嗎?
如果你決心讓自己成為有編程能力的人, 從 懸崖迷茫徘徊期 生存下來,是時候在這個點讓自己 All-in了,
要有足夠的勇氣和判斷力,承擔責任,也要拒絕不該承擔的責任和拒絕當下不該有的享樂。
放棄人生中的某些東西,一定會給心靈帶來痛苦。放棄夜晚去跟朋友KTV、放棄周末去跟戀人遊山玩水、放棄抱著薯片看韓劇。當然,你也可以迴避放棄這些東西,那就是永遠原地踏步,不讓自己展翅飛翔。
相當多的人都沒有選擇放棄,因為他們不想經受「放棄的痛苦」。放棄可能帶來不小的痛苦,需要放棄的部分,有著不同的規模和形態。上面這些都是小規模的放棄:放棄暫時當吃貨、放棄暫時當旅遊達人、放棄暫時當社交達人、放棄享樂其他誘惑。其實這些放棄並不會帶來太大的痛。
更大的放棄是固有人格、放棄根深蒂固的行為模式或者意識形態甚至整個人生理念,其痛苦可想而知。一個人要有所作為,在人生旅途中不斷邁進,或早或晚,都要經歷需要放棄的重大時刻。
拿我自己近期來說,我去年放棄了我用三年一手養大的孩子Rails Girls,年輕人的兩三年就是一輩子,我放棄了我上輩子,可想其中之痛。回想我在其中的樂趣和成就:給7個城市1000+的人免費提供workshop,多麼實實在在的奉獻;上南方都市報和環球時報鼓勵更多女性來編程,多麼實在的認可;可我放棄了,現在回想起來,不免傷感,心中還那麼痛。那些朋友、那些人、那些故事,都歷歷在目。
只有當你有All-In的決心和勇氣,你才能才這個階段生存下來,你才能進入下個階段。
但這僅僅是編程生涯的開始,對,這才算入門而已。 想要越過這個階段, 你可以:
找個學習夥伴,即使是另外一個是初學者,你會驚訝發現兩雙眼睛更容易發現bug。
閱讀她人的代碼,學習別人的設計思維、模式。學習的開始,應該對老師的方法全盤接受,不應有批判精神,要是你已經具備批判的框架,你還要模仿人家幹嘛呢?
MVP迭代。Minimum Viable Product,大家在周后兩周都有一個相對宏大的想法,但你應該從小處入手,不停地練習。
3 尊重事實,逃脫海市蜃樓
什麼是海市蜃樓?
本質地講,就是你知道某個地方是你的終點、你的目的地,但不知道如何走向目的地,且被困在沙漠當中,缺水、環境惡劣危險,出現致命地幻覺。
要理解為什麼在All-in獲得了從懸崖縱身一躍的勇氣和能力之後,從懸崖躍起還會進入海市蜃樓的困境,需要繼續從資源密度和所需知識的範疇講起
資源密度
搜索Google Learn to code, 有幫助的工具、教材、視頻等等有1.09億,這是我們這個時代的禮物。
越在初級階段,資源越多,這是為什麼大家開始的時候會有蜜月期;越往後面,資源越少,這是為什麼大家會有進入資源稀缺的沙漠之旅。
資源密度表蜜月期迷茫期沙漠之旅膨脹期Codecademy
Khan AcademyTreehouseCode SchoolGA DashUdacityedXCourseraW3 SchoolCode Combatand so onStack Overflow
TutorialsThe Odin ProjectFree Code CampRailsApps ProjectTextbooksThe DocsMOOC coursesRailscastsProfessional blogsCorporate tech talksThe DocsConference speakers
所需知識範疇
與知識密度正好想法,入門起步階段所需知識較少,越往後面系統範圍、所涉及的層面越多,所需知識範圍越廣。
所需知識範疇表蜜月期迷茫期沙漠之旅膨脹期Basic SyntaxBuildingDebuggingCS fundamentialsObject-orientation Agile developmentModuarityFrameworksCode smells Method decompositionHow to ask for help and so onTestingBest practices Optimization ArchitectureData modelingSystems綜合以上兩點,就容易在資源稀缺(資源密度角度)的沙漠,遭遇知識詛咒(所需知識範疇角度),產生海市蜃樓的學習現象:
你不知道你不知道什麼
怎麼辦呢?怎麼走出沙漠呢?
尊重事實, 繪製尊重事實的地圖。你必須獨自走過這一遭,嘗遍火焰山的滋味,過一過幾天不喝水的日子,發現綠洲的欣喜。
前面說過,如果我們有一張準確無誤的地圖,我們就能知道自己的位置,就能走出沙漠,到達目的地。
可這張地圖需要自己繪製,我們生來並不攜帶地圖。在為人的經歷中,過程中,我們探索,繪製自己的地圖。當我們對事實認識越多,我們地圖的準確性就越高。
繪製地圖很難,不在於我們要重新開始,而在於:
科技變化太快,尤其是編程技術,一兩年就一個語言被淘汰。
因為地形變化快,另一個難點在於我們要不斷修訂自己的地圖,放棄原有的知識和看法。
下面有幾個繪製地圖的原則:
與他人聊天請教,找到一條適合你的最強路線。 地圖是死的,資料也是死的,世界編程技術日新月異,只有已經掌握了這些地圖繪製辦法的人是活的。信息不重要,承載信息的人才是關鍵中的關鍵。
在 Google 搜集需要學習的資料 沙漠中搜索資料的指南針,雖然沒有明確的路線,卻能讓你更接近目標。
看需要看的圖書,保持專註避免東看看西看看 系統化地建立知識系統,即使是古代的看星星識別方位依然有效,哪怕比不上現代社會的GPS。
設定一個自己真正感興趣的目標,自己反覆實踐和嘗試 內化知識,找到自己地圖缺陷的唯一最佳實踐(best practice);反覆意味著失敗,若是沒有強目標做指引,極易中途中斷。
學習是一個知識管理的過程,而知識管理的可度量標準就是:你能否自己把這個知識傳授給別人,你能會繪製一張地圖,讓後來闖進這個沙漠的新手依你的圖走出來。這也是我們宣言中的一條。
4 保持平衡,防止膨脹
終於你走出前面三個時期,能夠獨立建立程序,且像模像樣,外部對你一致好評。但你自己心裡明白:金玉其外,敗絮藏其內。意味著,你知道你的程序不夠好,有安全隱患,但危險的地方在於隱患藏起來,而你還不具備火眼金金的能力。
這也叫躁鬱期,一方面你覺得自己是一個標準的程序員,另外一方面你自己某些領域很薄弱。一條腿跑得很快,卻又另外一條腿脫你後腿,因此會焦躁。隨著時間的推進,你經歷上升下降,波谷式前進,你會發現原來你很無知,因此會鬱悶。
當你能力並不匹配表現出來的自信心,這叫膨脹。
但你終究會擺脫躁鬱這種情緒,情緒讓你難受,難受你就會學習,學會越多知識你對地級別的困擾就會越少。而且隨著時間的推移,躁鬱的情緒對你影響越來越小,你越能在平和的心情下調整自己的方向。終於,你上路了,而且是飛奔在路上,比以前的任何時候學東西都快而且學得好。
保持平衡,天秤的砝碼要擺在中間。中國的文化管這叫中庸,在這個要求人人奮進拼搏的時代中庸並不太被提倡。但對於膨脹期的你來說,你需要保持一顆謙卑的心,把自己的姿態放低,海納百川。對,度過這個時期最重要的方法是獲得反饋:用戶的反饋、同學同事的反饋、高級程序員的反饋等等。
這聽起來讓人很沮喪,原來學習編程這麼難。我想這些旅程,程序員都應當經歷過。對於你們,剛剛完成最初級的Club,而Coding Girls Club針對每一條成長路線都設計了進階路線,初級中級高級,你接下來應當想法設法投入更多的時間到自學編程中去,將來以不同的角色加入到未來的高級Club,或許中級你還是學員,再往後,你就可以是初級club的助教: Capable of teaching is the primary measure of learning progress.
為什麼要走這條少有人走的路?
是的,這真是一個問題。你們都已經有一份工作,生活也無大憂患,為什麼要費那麼多心力去學編程呢?我還在要你們放棄一些已有的東西,經歷磨難和痛苦。
你們學編程確實挺難的,但我做的事情呢?Coding Girls Club的使命呢?好像更難一點,走的人似乎更少:賦予自我驅動型女性自學編程的元學習能力。自己學編程都已經很難了,卻還要做這樣更難的事情?
生命力。
大多數人,朝九晚五按部就班,暮氣沉沉,缺乏實踐的慾望,也害怕痛苦的感受。他們其實也相信可以實現某種目標,卻不願因此經受痛苦。
反觀你們,已經選擇一件很難的事情開始折騰,越難你就越痛苦,痛苦就要與就我割裂,經歷各種折磨九九八十一難之後,超越自我,新生!
少有人走的路,有了領路的人,自然走的人會多起來,路也沒有那麼難走。你們,會給未來三年、五年、十年踏入編程領域的女性樹立榜樣,做吃螃蟹的人。是的呢,你們不光在超越自己獲得新生,也在為女性這個群體謀福利,我們就安安靜靜地學、安安靜靜地做,不死命嘶喊,為平權,為新生。
小結
這是結束,這是開始!
-------
下一期將於7月31日開始,欲報名請掃描下方二維碼添加微信
或直接加微信 codingirls(只有一個g)
https://wap.koudaitong.com/v2/showcase/homepage?kdt_id=17815051 (二維碼自動識別)
推薦閱讀:
※[數據結構]表達式樹——手動eval()
※GacUI終於獲得第一個願意跟我溝通的商業的case了
※從過去找原因
※第一篇:關於開發環境
※API開發文檔構建(ApiDoc)