方法論、方法論——程序員的阿喀琉斯之踵以前,我認(rèn)為一個(gè)事物對(duì)我沒(méi)有直接用途的時(shí)候就不會(huì)去理會(huì)它,心理學(xué)上說(shuō)我們都戴著自己的認(rèn)知偏見(jiàn)的有色眼鏡去有選擇性地看待這個(gè)世界, 紛繁的信息經(jīng)過(guò)我們的認(rèn) 知圖式過(guò)濾之后便成為少量有序的事件,所以我們都在有強(qiáng)烈選擇性地關(guān)注一些事物和忽視另一些事物,然而,這樣可能會(huì)導(dǎo)致喪失一些很有價(jià)值的信息, 而總是將知識(shí)面停留在自己的小世界中——當(dāng)然這倒也不是說(shuō)看到什么都要湊上去學(xué)一學(xué)。如何在這兩者中間取得折中,我覺(jué)得一個(gè)好的辦法是先簡(jiǎn)略地想一下這是 個(gè)什么東東,他的本質(zhì)是什么,出現(xiàn)是為了滿足什么需求,等等比較“高層”的問(wèn)題(即“What”和“Why”而不是“How”),這些問(wèn)題應(yīng)該是可以通過(guò) 簡(jiǎn)單的調(diào)研和思考得出結(jié)論的,至于背后的技術(shù)細(xì)節(jié),如果你打算入行,就可以去學(xué),如果不打算的話則可以免了,至少前面的思考和簡(jiǎn)單的調(diào)研能夠一定程度上保 證當(dāng)有價(jià)值的信息或機(jī)會(huì)擺在你面前的時(shí)候你不會(huì)把眼睛蒙上走開(kāi),并且多做做這類思考對(duì)于思維的廣度也很有價(jià)值。最近我開(kāi)始認(rèn)為,最佳的學(xué)習(xí)方法就是先廣度 優(yōu)先遍歷(先弄清What和Why),然后擇最合適的分支深入(How)(算法牛人DD同學(xué)在TopLang上的一個(gè)帖子里面也提到類 似的想法,剛進(jìn)大學(xué)就能夠如此清晰地看清前方道路的走法,我對(duì)DD很佩服)。 方法論看似是個(gè)很抽象的東西,并且的確有一些方法論是抽象到 over-generalized (泛化過(guò)度)的地步,然而說(shuō)實(shí)話在 實(shí)踐當(dāng)中我總是發(fā)現(xiàn)(正確的)方法論是再現(xiàn)實(shí)不過(guò)的東西,比如一個(gè)大家都明白的道理是:如果方向走錯(cuò)了,那么做的功就基本全白費(fèi)了(還 有比如“如果方法對(duì)頭,就能事半功倍,反之可能多走很多彎路”)——然而現(xiàn)實(shí)中有多少人能夠真正實(shí)踐這個(gè)方法呢?絕大多數(shù)人都是只顧解決眼前問(wèn)題,抓了這 頭丟了那頭,更多人是不知道問(wèn)題是什么,只管把頭腦中能聯(lián)想到的一個(gè)以前類似情況下的類似方案套用上來(lái)。以前我總是覺(jué)得一個(gè)公司里面,CEO/CTO 這樣的角色是基本擺設(shè),但我現(xiàn)在不這樣想了。在 How 層面把事情做好,做成一個(gè)精鉆的程序員,那頂多就是能把鉗子使好,這樣的事情很多人都能做到,熟能生巧嘛。換句話說(shuō)程序員基本上是去解決 一個(gè)定義好的問(wèn)題,去實(shí)施一個(gè)定義好的方案。然而決策問(wèn)題就不一樣了,決策問(wèn)題是需要去定義問(wèn)題是什么,以及權(quán)衡最佳方案是什么,不管 是決策技術(shù)架構(gòu)還是決策商業(yè)策略,都是非常復(fù)雜的思維過(guò)程,需要綜合和權(quán)衡大量的信息,這種能力就不 是簡(jiǎn)單楞著頭搞下去能練出來(lái)的了,很多時(shí)候需要抬起頭來(lái)看,免得只見(jiàn)樹(shù)木不見(jiàn)森林。(以上也是為什么我在討論組里面一篇帖子(什 么是算法?為什么學(xué)習(xí)算法?以及學(xué)到什么程度?)中提到我覺(jué)得學(xué)數(shù)學(xué)學(xué)到 精通未必就會(huì)思考日常決策問(wèn)題的原因——數(shù)學(xué)幾乎總是去解決一個(gè)定義好的問(wèn)題,用的也都是定義好的嚴(yán)密的邏輯推導(dǎo)。然而現(xiàn)實(shí)中的問(wèn)題是一個(gè)復(fù)雜系 統(tǒng),諸多變量互相影響,如何權(quán)衡最佳方案實(shí)際上是一個(gè)復(fù)雜的統(tǒng)籌規(guī)劃。更重要的是,你往往甚至都不知道問(wèn)題是什么,能夠從紛繁的信息中抽象出問(wèn)題,是一種 極大的能力。這里推薦《你的燈亮 著嗎?》和《失敗的邏輯》) 當(dāng)然,我自己還沒(méi)能到這個(gè)層面,尚需要不斷實(shí)踐和總結(jié),所以只能稍微的談一點(diǎn)感受,再往下扯只怕就會(huì)流于空泛了。這一點(diǎn)上我還是舉一個(gè)程序員們喜聞 樂(lè)見(jiàn)的例子吧,在程序員眼睛里面,做一個(gè)項(xiàng)目,也許首先想到的是用什么語(yǔ)言,什么框架,什么庫(kù),在這個(gè)方向上那就是什么看上去牛B用什么,恨不能都用 haskell、lisp 來(lái)寫才爽,用 Java?那多沒(méi)意思啊,Java 那坨弱智語(yǔ)法我小學(xué)的弟弟都能掌握,也沒(méi)啥牛B的語(yǔ)言特性,忒沒(méi)成就感(只可惜真正判別弱智與否的并非用什么語(yǔ)言技術(shù),而是做出什么產(chǎn)品 滿足什么需求)。這就是屬于只考慮單個(gè)孤立因素的簡(jiǎn)單(或者說(shuō) Naive 的)決策,這個(gè)因素就是——只要讓我自己感覺(jué)爽——只可惜并 不是讓自己感覺(jué)爽的做法就是真正解決問(wèn)題的做法,始終要弄清問(wèn)題是什么,在后者意義上,一些對(duì)于技術(shù)型程序員往往沒(méi)有吸引力的話題其實(shí) 有著極其重大的價(jià)值——比如什么時(shí)候設(shè)計(jì),什么時(shí)候重構(gòu),什么時(shí)候集成,再往上一層其實(shí)這些又都是次級(jí)問(wèn)題,首要的問(wèn)題還是這個(gè)產(chǎn)品滿足什么需求,有什么 市場(chǎng)(即這件事情值不值得做),有一句話想必很多人常聽(tīng)說(shuō),如果不知道要做什么,套上十二層架構(gòu)也無(wú)濟(jì)于事,方法永遠(yuǎn) 不是因,而是果(我在以前的另一篇文章“Failing to see the Big Picture – Mistakes we make when learning programming” 中也闡述了類似的觀點(diǎn))。 再舉個(gè)例子,如果我想給我的網(wǎng)站做一個(gè) feature ,我認(rèn)為這個(gè) feature 技術(shù)上很牛很強(qiáng)大,而且剛好有機(jī)會(huì)使用一下我最近修煉的某某 framework 和某某語(yǔ)言,而且這玩意很有挑戰(zhàn)性,還不是一般人能夠做得了的,綜合以上三點(diǎn),我立時(shí)覺(jué)得心癢難耐摩拳擦掌。然而實(shí)際上這個(gè)問(wèn)題應(yīng)該怎樣分析呢?首先,考 慮到以上三點(diǎn),這將會(huì)是一個(gè)投入相當(dāng)大的項(xiàng)目,那么其收益就必須要對(duì)得起這個(gè)投入,技術(shù)上很牛不代表商業(yè)上就牛,再牛再難做的 feature 如果不能帶來(lái)商業(yè)價(jià)值那就是負(fù)收益??偠灾?, 1. 一件事情僅僅讓你
感覺(jué)挺牛不代表這件事情就是值得做的; 這兩句話和我們?nèi)粘5恼J(rèn)識(shí)并不沖突,其實(shí)我們幾乎總可以找到既有價(jià)值、又有趣、又有足夠挑戰(zhàn)性的工作。舉個(gè)例 子,本科數(shù)學(xué)學(xué)得精純無(wú)比的同學(xué)有沒(méi)有偶爾也會(huì)覺(jué)得盲目呢?做這些題目到底有什么實(shí)際用途呢?這就像是你總是在磨一把刀,磨得閃閃發(fā)光鋒利無(wú)比,你可以向 別人炫耀自己的刀很牛B,但是刀是為了沖鋒陷陣血濺五步的,你也不想讓它折戟沉沙吧,不管是將數(shù)學(xué)用在數(shù)學(xué)物理上還是用在人工智能、機(jī)器學(xué)習(xí)、密碼學(xué)、通 信上,都是既讓人有成就感,同時(shí)又有意義和價(jià)值的事情。對(duì)我們程序員來(lái)說(shuō),你把一門語(yǔ)言玩得很精通,不僅知曉它所有的語(yǔ)法細(xì)節(jié),陷阱和缺陷,還了解它的底 層實(shí)現(xiàn)模型是如何。你覺(jué)得很牛很有成就感——的確,我們都會(huì)為一件自己做到了別人做不到的事情而感到自豪,然而反問(wèn)一句,除了情緒價(jià)值之外,這樣的事情在 本身的價(jià)值上有沒(méi)有你感覺(jué)到的那么牛呢?如果你只是在削鉛筆,那么何必磨一把倚天屠龍劍來(lái)?反之,如果你做的是一個(gè)本身功能很牛很創(chuàng)新很 有價(jià)值的軟件,那么語(yǔ)言技術(shù)其實(shí)完全是次要的,并不是看上去越眩越好,關(guān)鍵是選擇各個(gè)方面綜合考慮起來(lái)最合適的工具即可,瑞士軍刀也許 很丑,但對(duì)于叢林冒險(xiǎn)很實(shí)用就行。拿著一把屠龍寶刀去野外生存,同樣也不靠譜。 編程語(yǔ)言是為了實(shí)現(xiàn)軟件的,軟件是為了服務(wù)于人的。誠(chéng)然,了解一門語(yǔ)言的方方面面能夠使你更有效地使用它,然而另一方面,如果結(jié)果發(fā)現(xiàn)這門語(yǔ)言并不 何時(shí)來(lái)解決你手頭的問(wèn)題呢?受到投入的沉沒(méi)成本的 影響你一定覺(jué)得很不甘心吧?同理,由于你對(duì)一門工具投入了很多的精力,這門工具已經(jīng)和你的情感掛上了鉤,于是如果讓你來(lái)決策用什么工具來(lái) 完成一個(gè)任務(wù)的時(shí)候,你幾乎會(huì)毫無(wú)疑問(wèn)地想到使用你最熟悉而喜愛(ài)的那個(gè),這就是“當(dāng)你手頭拿的是一個(gè)錘子,任何東西看上去都像釘子”這 句話的一個(gè)解釋。原先的問(wèn)題是使用一門技術(shù)使得能夠性價(jià)比最高地實(shí)現(xiàn)要完成地產(chǎn)品,然而到你那里問(wèn)題就悄悄地變成了“使用一門技術(shù)讓我感 覺(jué)最爽”,問(wèn)題的所有其他需要綜合考慮的因素都被選擇性忽略掉了,所以如果你是一個(gè)語(yǔ)言技術(shù) fans ,那么幾乎毫無(wú)疑問(wèn)你會(huì)成為一個(gè)糟糕的決策者。最近,在學(xué)習(xí)和研究的方法論上我已經(jīng)聽(tīng)到不止一個(gè)人(參見(jiàn)《失敗的邏輯》和這里——一位諾貝 爾獎(jiǎng)得主的忠告(引言如下))忠告我們,不要為了工具而工具,忘記了工具的目的是什么。
…沒(méi)有效率的科學(xué)家中,有一小類就是所謂的崇拜研究?jī)x器的狂人,他們對(duì)金屬的閃爍非常著迷,就像是夜鷹對(duì)它在鏡里的反影著迷一樣。他們非常仔細(xì)照顧 所崇拜的東西,把儀器拭擦得雪亮,可以當(dāng)鏡子使用,而且把它擺飾在最崇高的地方,就好像在教堂里面的圣壇… CodingHorror 的作者最近在博客里面跟著 Steve Yegge 同學(xué)宣稱,如果有一件事情是他想教給程序員同學(xué)們的,那就是 Marketing 。無(wú)獨(dú)有偶,有一次吃飯的時(shí)候鮑志云同學(xué)也提到: Marketing Sense 是很重要的。其實(shí)也就是不要總想著寫牛代碼,用牛語(yǔ)言技術(shù),不要落入為技術(shù)而技術(shù)的怪圈,而是首先想明白做的事情有什么價(jià)值,先弄清做什么,為什么做,再 去想怎么做,這樣后面的功夫才花的有價(jià)值。
當(dāng)然,最后必須聲明的是,不要矯枉過(guò)正,誤會(huì)以上的觀點(diǎn),以上觀點(diǎn)并不是說(shuō)學(xué)生時(shí)代做的基本功是不需要的,一些 非?;镜墓Ψ颍ㄈ缬?jì)算機(jī)體系結(jié)構(gòu)、數(shù)據(jù)結(jié)構(gòu)和算法、兩個(gè)主要流派(命令式和聲明式)的編程語(yǔ)言都使用了哪些主要的編程范式、對(duì)主流語(yǔ)言的優(yōu)缺點(diǎn)和適用場(chǎng) 合的了解等等)是有必要掌握牢靠的,因?yàn)橐环矫嫖覀儾⒉皇嵌寄苋プ雠袛嗯c決策,碼農(nóng)總是一個(gè)可靠的職業(yè)。另一方面對(duì)技術(shù)大方向的把握也是決策的基礎(chǔ)知識(shí), 只是不要掉進(jìn)無(wú)盡的技術(shù)漩渦,成為技術(shù)追星族。此外也許還有一個(gè)小小的好處就是如果被老板逼著用一門不熟悉的語(yǔ)言時(shí)不會(huì)很不痛快,因?yàn)?strong>真 正重要的事情是你完成的產(chǎn)品,而不是用的語(yǔ)言。 一個(gè)有趣的附錄 我們的思維有很多很多的弱點(diǎn),前文講的其實(shí)就是這樣的弱點(diǎn),更多更系統(tǒng)一點(diǎn)總結(jié)可以看下這 里,和這里。我一向認(rèn)為,正確的思 維方式,是一切高效學(xué)習(xí)的基礎(chǔ)。比如參見(jiàn)如下2個(gè)例子,錯(cuò)誤的思維方式得到的結(jié)論有大得多的可能性是謬誤。 [1] 人總喜歡沿襲以往習(xí)得的經(jīng)驗(yàn),并通過(guò)類比來(lái)進(jìn)行外推。我第一次在一個(gè)地鐵終點(diǎn)站坐地鐵的時(shí)候,看著從遠(yuǎn)方開(kāi)來(lái)的地鐵,我心生疑惑——“這車每節(jié)車廂都這么 長(zhǎng),待會(huì)怎么調(diào)頭呢(我心說(shuō)沒(méi)看到鐵軌終點(diǎn)有一個(gè)大大的供調(diào)頭的U形彎啊)?”,當(dāng)車開(kāi)始開(kāi)的時(shí)候我終于意識(shí)到原來(lái)車是可以往兩頭方向開(kāi)的。 [2] 人喜歡從關(guān)聯(lián)當(dāng)中尋找因果,有一次我我老婆去銀行取款,到了 ATM 室的自動(dòng)門口,我開(kāi)玩笑地拿著手頭的飯卡去刷了一下,然后——門居然開(kāi)了。我頓時(shí)來(lái)了勁,立即得出一個(gè)結(jié)論:這個(gè)刷卡裝置不安全,至少不是能夠?qū)iT識(shí)別銀 聯(lián)的卡的。我甚至飛快地泛化出了一個(gè)更具一般性的理論來(lái)解釋這個(gè)現(xiàn)象:即可能所有帶有磁性的卡都可以用來(lái)開(kāi)門。老婆看我得意洋洋,就潑過(guò)來(lái)一盤冷水:不一 定是你的卡刷開(kāi)的啊,你不刷卡試試看。我不信,說(shuō)怎么可能呢,心想我刷卡,門就開(kāi)了,還有比這更明顯的因果關(guān)系嘛。但出乎我意料的是,我走出門,這次沒(méi)刷 卡,門也開(kāi)了——原來(lái)是感應(yīng)門——原先這個(gè) ATM 室的確是刷卡門,但后來(lái)改成了感應(yīng)門,刷卡的那個(gè)裝置只不過(guò)沒(méi)拆掉殘留在那里而已。 [3] 《失敗的邏輯》里面從認(rèn)知心理學(xué)的角度系統(tǒng)介紹了我們?cè)趶?fù)雜情況下的判斷與決策是如何出錯(cuò)的,非常值得一讀。 |
|
|
來(lái)自: ShangShujie > 《我的圖書館》