如何教女朋友編程?
自從我?guī)啄昵皠偝蔀橐粋€軟件開發(fā)者之后,我就一直夢想著有一個能和我一起討論工作的女朋友。我想和她討論我所從事的工作。不是像“對,我做計算機 的”那樣,而是以真正深入的方式討論。就像你和同事間對話一樣。無論什么時候,當我發(fā)現(xiàn)一些令我激動的新東西時,我希望她是我***想告訴的人,并且能夠理 解這個新東西。
回到我還是一個學生的日子,具體地說是大學時期,我曾經(jīng)跟朋友們說過這些。我期望每個人的想法都和我一樣,但是出乎我的意料,我是那個瘋狂極客小組里面唯一瘋狂的人。他們告訴我,他們不需要程序媛女朋友,那樣他們會發(fā)瘋的。但是我認為這是胡扯。
這只是他們不愿意說罷了。每個人真正想的是,是否有可能找到一個既漂亮聰明,又對編程感興趣的女孩,并且會對你這個不懂社交的極客有好感。這一切發(fā)生的概率能有多大?
但是老兄,讓我告訴你一個秘密:她不需要懂這些東西。生活中的任何事情都是可以學會的。一些人可能會傾向于某些特定的事 情,但是不代表其他人學不會、理解不了。我們對自己的職業(yè)非常自豪,因為我們花費了很多年來掌握它。但是說實話,如果你掌握了方法,很多需要你花費一年時 間來理解的東西,可以在5分鐘內(nèi)解釋清楚。
指針運算真的很難么?還是因為我們最終理解了它,就認為自己的水平提高了呢?理解多態(tài)很難嗎?是 Monad(譯者注,Monad是為了消除副作用的一種模式,如函數(shù)式編程中的鏈式結(jié)構(gòu),參見維基解釋)真的很難理解,還是我們站在一個錯誤的角度來理解它?
智商達到 80 就足夠了。
如果你選擇了合適的比喻,你可以在幾個小時內(nèi)解釋清楚指針、手動內(nèi)存管理、棧/堆分配、垃圾回收等等知識。
問題來了,請用白話向外行解釋“指針”、”手動內(nèi)存管理”、”棧/堆分配”、”垃圾回收”。
還是算法很難呢?我打賭你不會希望有人在午夜叫醒你,讓你寫一個快速排序。但是假使你有幾把刀,并想教你的女朋友如何對它們排序(當然是按尺寸)呢?你可能不得不為她示范兩三次,從而讓她相信這個算法真的管用,雖然算法本身簡單到爆。
如果你遇到一個問題,在幾個小時后還是不能理解,去找你的女朋友,并向她解釋。不要像跟墻說話那樣,在你說話過程中意識到該如何做之后就中斷談話。嘗試向她解釋,即使她一點兒都不懂技術(shù)。一旦你找到了合適的比喻,她就很容易理解了。
時刻記住,她需要有意愿來學習,你不能把你的知識強推給她。這里***的障礙是,打破“我永遠也理解不了”的恐懼。
這不難,只需要一些時間
大約 6 個月之前,我女朋友正在為她的碩士學位學習政治學。在此之前,她真的沒有任何技術(shù)經(jīng)歷。
有一天她決定要學習一些JavaScript中酷酷的東西,并在我為她做的個人網(wǎng)站上制作一些動畫。一周后我在教她Ruby on Rails。幾周后她已經(jīng)在做自己的Web應(yīng)用了。又幾周后她意識到需要更多底層的知識,因此我們開始學習一些基礎(chǔ)的技術(shù)。
我們開始學習諸如計算機如何工作,如何手動申請內(nèi)存,棧和堆的區(qū)別,如何在Objective-C中做引用計數(shù)管理,垃圾回收機制如何工作,函數(shù)式編程(我指的是Haskell),網(wǎng)絡(luò)協(xié)議等等。她甚至知道了我在一年前還不知道的東西。
基本上,我能夠從我的知識里面,選擇重要的東西,拋棄掉為了搞清楚什么東西最重要而浪費的99.5%的時間,從而只教給她那些需要知道的知識。
讓一個人成為一個程序員,這些足夠了嗎?不。她仍然不得不經(jīng)歷困難的部分,要理解許多東西,但是她僅僅在6個月后,就已經(jīng)比在大學里學習軟件工程專業(yè)的大多數(shù)學生掌握了更多的知識。
你是一個專業(yè)的老師
作為一個專業(yè)的開發(fā)者,在某種程度上意味著你也是一個專業(yè)的老師,因為我們的工作迫使我們不斷地向其他人解釋。我們不得不站在閱讀者的角度,使我們的代碼可讀。我們不得不在我們所做的事情看起來沒意義時,解釋我們做了什么。我們不得不教育實習生,讓他們成長得更優(yōu)秀。
在工作中,我們做了很多復(fù)雜的事情,讓它看起來簡單(希望有些人喜歡做相反的事情)。學習某個知識需要花費很長時間,其中的一個原因是,你一直在迷失。你可能有一個老師會偶爾向你解釋,但是每周只有一次聽講的機會。
另一方面,如果你在教和你生活在一起的人,她將能***次地接觸你,且能夠立即得到任何問題的答復(fù)。
開發(fā)者很擅長Google,因為我們一直在迷失。我們一直在尋找答案。但是如果你有一個在同一個房間、知道所有答案的人一起,你的生產(chǎn)力會怎么樣呢?