走少有人走的路:編程真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+的女孩子接觸編程,那麼你們知道最後有多少個人真正成為有編程能力的人嗎?

兩個。

一位是若水,這是她的故事( ituring.com.cn/article/ ); 還有一位是北京去年Workshop的學員,她原本在傳統行業,受RG影響,後來自學了Python(故事轉彎有點大,我們教的可是Ruby)。對,千分之二的轉化率。難不難呢?挺難的呢。

1 推遲滿足感,認清蜜月期

很難去責怪那另外千分之九百九十八:當初她們開始都抱著極大的熱情來學習編程,卻沒有幾人學成。

一方面是就像我們小時候聽到的「狼來了」的童話故事,只是現在童話故事中的老狼換成了編程,讓人望而生畏。大家周邊從小也不乏這樣的聲音:女孩子學什麼理科、搞什麼計算機呢、學點文科找份踏實的工作就行了。這種社會聲音製造莫須有的恐懼,嚇退了很多人學習編程。

另一方面, 「學習編程」的運動在世界各國興起,各種學習資料和教程,打破了學習的邊界,而且也證實學習編程確實無害。例如Codecademy Code School, Edx/Coursera的各種免費公開的MOOC課程,從入門到高級,比比皆是。跟著教程作出東西會製造一種我已經會編程的假象。

但,新問題也出現了。有時候不再是害怕開始踏入學習編程,對於現在的你們,你們已經開始學習編程,應當已經克服「狼來了」這部分這種恐懼。新問題是過高的期望和急功近利。

過去六周,CGC給你們設計的路線、介紹各種工具和教程,就像扶著小孩子走路一樣,學習變數、基本語法、完成小程序的挑戰、製作簡單的網頁,你們一步一步建立起個人成就感,自信心開始增長:你覺得自己基本上具備一個程序員的基本素養。編程哪有那麼難呢?你們開始在朋友圈曬你們的「學習成績」。

這就是問題所在,你們處於稱之為「蜜月期」的時期:儘管你感覺處於學會編程的轉角,但實際上才剛剛敲門,門還沒有推開。

想一想,假如你打算重新學習一門外語。拿日語來說吧,從前,你只知道有這門語言,從日本動畫片《柯南》或者是日劇《白夜行》等學會了兩句,然後你打算開始學習日語。每周利用自己的業餘時間加入學習班,跟著一個教程學習了六周,會了基本的語法、句式、也能日常對話,可是你能說你會日語嗎?

學習一門普通語言尚且如此,更何況是編程語言呢?

況且我們的日常語言是模糊語言,大腦比計算機高級太多,能夠處理的模糊模式也多很多,試著第一次讀讀下圖:

再仔細看一遍上圖,語序全都是亂的,卻也一點都不影響你的大腦識別其中信息。但計算機不行,計算機必須語法、演算法等絲毫不差,否則就會報錯出bug。

因此,在享受蜜月期的同時,必須清醒地認識到「推遲滿足感」的意義:

編程真正的快樂絕不在於跟著教程按部就班完成別人設置的任務,而是重新設置快樂與痛苦的次序:認清自己目前對於編程「You know nothing」的事實並感受痛苦;然後解決接踵而來的新問題並享受更大的快樂,這是唯一可能讓你前行的方式。

【插入曲】編程路上的四個時期

對編程了解愈少,思維就越是混亂。虛假、錯覺和幻覺,只能讓我們不知所措。我們對編程實際情況的觀念就像一張地圖,憑藉這張地圖,我們同我們前進路上的障礙不斷協調和談判。

地圖準確無誤,我們就能確定自己的位置,知道要到什麼地方、怎樣到達那裡;地圖漏洞擺出,我們就會迷失方向。

在進入階段二之前,我們先來看看 The Bigger Picture

上圖畫出了編程旅途上典型的四個階段,下面從可獲得資源密度(解決問題的可能性)以及所需知識範疇(需要解決問題的難度)來詳細定義說明這四個階段。

編程旅途中學習的快樂與你的自信心相關聯,而信心源於編程能力,對應上圖坐標系中的XY軸。

  1. 手把手蜜月期是充滿快樂且擁有豐富優質學習資源的時期,看起來你掌握不少tricky的技能,但其實完全是在老師(書、MOOC課程、CGC的TA)的刻意支持下做一些do-ables, 實際上並不tricky。

  2. 懸崖迷茫徘徊期是痛苦的覺醒,當蜜月期結束時會異常痛苦。是的,你會發現一個痛苦的事實:離開教程和教練,實際上,你完全無法獨立依靠自我解決任何問題。在此期間,你需要不停地debug,以及依靠自己那點稀薄且不太靠譜的編程知識問自己正確的問題、請教達人正確的問題,直到你用自己的方法實實在在地完成你自己的to-do list。

  3. 絕望沙漠之旅漫長而且孤獨,恍如進入無人之境,好像每條路都能到羅馬,嘗試之後被挫敗,不停地繞圈子,同時又極其渴望資源。此階段,容易走入歧途,猶如海市蜃樓。

  4. 上升膨脹期 最終你走出荒野沙漠,不管你是一帶一路還是西天取經。終於你把所有你會的的語法(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的決心和勇氣,你才能才這個階段生存下來,你才能進入下個階段。

但這僅僅是編程生涯的開始,對,這才算入門而已。 想要越過這個階段, 你可以:

  1. 找個學習夥伴,即使是另外一個是初學者,你會驚訝發現兩雙眼睛更容易發現bug。

  2. 閱讀她人的代碼,學習別人的設計思維、模式。學習的開始,應該對老師的方法全盤接受,不應有批判精神,要是你已經具備批判的框架,你還要模仿人家幹嘛呢?

  3. MVP迭代。Minimum Viable Product,大家在周后兩周都有一個相對宏大的想法,但你應該從小處入手,不停地練習。

3 尊重事實,逃脫海市蜃樓

什麼是海市蜃樓?

本質地講,就是你知道某個地方是你的終點、你的目的地,但不知道如何走向目的地,且被困在沙漠當中,缺水、環境惡劣危險,出現致命地幻覺。

要理解為什麼在All-in獲得了從懸崖縱身一躍的勇氣和能力之後,從懸崖躍起還會進入海市蜃樓的困境,需要繼續從資源密度所需知識的範疇講起

資源密度

搜索Google Learn to code, 有幫助的工具、教材、視頻等等有1.09億,這是我們這個時代的禮物。

越在初級階段,資源越多,這是為什麼大家開始的時候會有蜜月期;越往後面,資源越少,這是為什麼大家會有進入資源稀缺的沙漠之旅。

資源密度表蜜月期迷茫期沙漠之旅膨脹期Codecademy

Khan Academy

Treehouse

Code School

GA Dash

Udacity

edX

Coursera

W3 School

Code Combat

and so onStack Overflow

Tutorials

The Odin Project

Free Code Camp

RailsApps ProjectTextbooks

The Docs

MOOC coursesRailscasts

Professional blogs

Corporate tech talks

The Docs

Conference speakers

所需知識範疇

與知識密度正好想法,入門起步階段所需知識較少,越往後面系統範圍、所涉及的層面越多,所需知識範圍越廣。

所需知識範疇表蜜月期迷茫期沙漠之旅膨脹期Basic SyntaxBuilding

DebuggingCS fundamentials

Object-orientation

Agile development

Moduarity

Frameworks

Code smells

Method decomposition

How to ask for help

and so onTesting

Best practices

Optimization

Architecture

Data modeling

Systems

綜合以上兩點,就容易在資源稀缺(資源密度角度)的沙漠,遭遇知識詛咒(所需知識範疇角度),產生海市蜃樓的學習現象:

你不知道你不知道什麼

怎麼辦呢?怎麼走出沙漠呢?

尊重事實, 繪製尊重事實的地圖。你必須獨自走過這一遭,嘗遍火焰山的滋味,過一過幾天不喝水的日子,發現綠洲的欣喜。

前面說過,如果我們有一張準確無誤的地圖,我們就能知道自己的位置,就能走出沙漠,到達目的地。

可這張地圖需要自己繪製,我們生來並不攜帶地圖。在為人的經歷中,過程中,我們探索,繪製自己的地圖。當我們對事實認識越多,我們地圖的準確性就越高。

繪製地圖很難,不在於我們要重新開始,而在於:

  • 科技變化太快,尤其是編程技術,一兩年就一個語言被淘汰。

  • 因為地形變化快,另一個難點在於我們要不斷修訂自己的地圖,放棄原有的知識和看法。

下面有幾個繪製地圖的原則:

  1. 與他人聊天請教,找到一條適合你的最強路線。 地圖是死的,資料也是死的,世界編程技術日新月異,只有已經掌握了這些地圖繪製辦法的人是活的。信息不重要,承載信息的人才是關鍵中的關鍵。

  2. 在 Google 搜集需要學習的資料 沙漠中搜索資料的指南針,雖然沒有明確的路線,卻能讓你更接近目標。

  3. 看需要看的圖書,保持專註避免東看看西看看 系統化地建立知識系統,即使是古代的看星星識別方位依然有效,哪怕比不上現代社會的GPS。

  4. 設定一個自己真正感興趣的目標,自己反覆實踐和嘗試 內化知識,找到自己地圖缺陷的唯一最佳實踐(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)

wap.koudaitong.com/v2/s (二維碼自動識別)


推薦閱讀:

[數據結構]表達式樹——手動eval()
GacUI終於獲得第一個願意跟我溝通的商業的case了
從過去找原因
第一篇:關於開發環境
API開發文檔構建(ApiDoc)

TAG:編程 | 編程學習 | 女性 |