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