「老僧三十年前未參禪時,見山是山,見水是水。及至後來,親見知識,有個入處。見山不是山,見水不是水。而今得個休歇處,依前見山只是山,見水只是水。大眾,這三般見解,是同是別?有人緇素得出,許汝親見老僧。」
——青原惟信禪師 《五燈會元》卷十七
一)見山是山,見水是水——背菜譜階段
我們應該接受迅速失敗,而不是緩慢失敗,最不該接受的則是沒有失敗。如果有人從不犯錯誤,那只能說明他們努力不夠。失敗的結果是試圖去嘗試其他可能。
——比爾·蓋茨
每讀完一本書,我們都像得到了一把嶄新的錘子似的興奮不已,這時每樣東西都開始變得特別像釘子。這樣雖然幼稚,卻是必須經過的過程。可當你迫不及待地想要在專案中實踐它(也應該如此),你的專案經理卻報以輕蔑的目光,同事們也對你的熱情並不感冒,怎麼辦?如果你本人就是專案經理,自然可以在專案裡運用新東西,可是新東西必然帶來新問題,有一天你發現當初的決定是錯誤的,而且是致命的錯誤,怎麼辦?
我又不得不說我們程式設計師真是太幸運啦!如果我們是學物理的,就會發現做乙個實驗動輒幾萬、幾十萬。而作為程式設計師,要想實踐一下新想法,只需要動動手指頭而已。所以,桌面軟體也好,小遊戲也好,做**也好,跟著興趣走吧,盡量使用新東西吧,盡情地犯錯吧!
讀書會讓人失去自信。書讀得越多,就越發覺得寫書的人如此偉大,知識如此浩瀚,自己如此渺小。每本書都自成體系,十分有道理。可是書和書之間卻有不少矛盾的地方,我們該信誰?我們迷惑了,對任何事都不敢確定了。
實踐讓人獲得自信。在實踐中成功,在實踐中失敗。在無數的成功和失敗之後,我們獲得了自信——知道在什麼條件下可以獲得怎樣的成功;或者失敗,以及失敗的後果是什麼。
實踐太重要了,一定要想辦法參與到大專案中去,哪怕只是堆砌乙個又乙個的頁面也好。要獨立思考,可以嘗試自己實現乙個框架。同時也要學習下市面上流行的成熟框架。最好再看看理論書籍,例如《企業應用架構模式》一類的。三方印證,才最有效率。
二)見山不是山,見水不是水——分解、抽象階段
每一次炒豆芽,我們都會想,為什麼要先放肉,再倒醬油呢?為什麼要用大火而不是小火呢?於是我們開始嘗試顛倒一些步驟,替換或增加一些材料,改用不同的鍋子,改變加熱的方式……通過假設->實驗的方式,我們逐步了解到每個步驟對菜品的影響是什麼。
通過橫向比較幾百種不同菜式的相似之處,我們總結出典型的搭配——即模式。例如糖醋模式、爆炒模式、清蒸模式、麻辣模式等等。
我們開始對菜譜背後的原理感興趣。我們會讀一些講解原則、原理的書籍。例如《深入淺出設計模式》、《大話設計模式》、《深度探索c++物件模型》、《t-sql 程式設計徹底研究》(感謝包包的推薦)、《clr via c#》、《人月神話》等等。
我們會覺得炒豆芽不再是菜譜上的那個炒豆芽了,它是活生生、香噴噴、熱騰騰的炒豆芽,它的色澤、香氣、味道,我們都知道是怎麼來的。
我們會發現處理「根據不同的型別使用不同的演算法」不一定非得使用多型或策略模式。只要運用得當,使用表、字典、if else也可以同樣優雅而有效。
三)見山只是山,見水只是水——知行合
一、靈活運用階段
某天早上一醒來,發現對於最近接觸的事物有了新一層的認識,似乎什麼都不會了,卻好像什麼都理解了——就像張無忌練太極劍,不求劍招,只求劍意。
——jeffrey zhao《我們到底該怎麼學技術?》
如果說「見山不是山」是因為處在了痛苦的量變積累的過程之中的話,那麼「見山只是山」則是在量變基礎上發生了質的變化。
要達到「見山只是山」的境界,需要兩個條件:
1)在「見山不是山」階段有了足夠多的積累,知識淵博、技巧純熟、理解深刻,外加心態平和、人品不錯。
2)形成了簡單而深刻的、超脫於具體技術之上的統一理論和模型。
在實踐的過程中,我們會越來越強烈地感覺到,理論並不是孤立地存在著,似乎總有更高抽象級別的法則控制著世間萬物。不斷重構的結果,似乎總會形成似曾相識的模式;模式又會符合某些設計原則,設計原則可以滿足設計目標……有了更高階別的抽象理論,一切的存在似乎都有了新的意義。那些被我們分解得支離破碎的世界又還原成了乙個整體。那迷霧繚繞的山也突然變得前所未有地清晰、自然、可愛……
但是沒有條件1的基礎,就算有人告訴我們條件2裡面的理論也是沒有什麼用處的。例如,我在軟體工程第一堂課裡面就被老師告知:「軟體設計很簡單,只要達到低耦合、高內聚」就可以了」。可是這有什麼用呢?我又不能像哈利菠菜那樣,揮舞著魔棒,反覆念著「低耦合呀低耦合~高內聚呀高內聚~」,然後螢光一閃,奇蹟就出現了。同樣,「後發制人,先發制於人」對於我們來說只是一句似乎有那麼點道理的話而已,但是當楊過聽到這句話的時候卻猶如醍醐灌頂一般。特別地,由於楊過當時已經對天下武學融會貫通,並且有極強的輕功和深厚的內力,所以才能夠做到後發先至。要是換了我們,在打架的時候,要是不先出手一定會吃虧的。
對於到達了這個境界的廚師來說,炒豆芽只是炒豆芽——就是把豆芽炒熟而已。不過,你會發現他每次炒出來的豆芽全都不一樣。因為吃豆芽的客人不同、季節不同、地域不同、食材不同、天氣不同、用來盛食物的盤子也不同,所以他炒出來的豆芽自然也不同。所有這些細微、精妙的變化,對於他來說卻如呼吸般自然。而這自然、輕巧的一瞬,卻是千錘百鍊的結果。
創造性和合理性是這個階段的顯著特點。對於不斷遇到的新環境、新困難,他們總能創造出新的解決方案。他們的設計也許不總像教科書那樣中規中矩,卻總能在複雜度和靈活性之間取得很好的折中。他們經常被迫在資訊不足的情況下作出判斷,而這些判斷在事後多數會顯得正確無比。
人類在學習的過程中,會很自然地對所學知識進行歸納、抽象。人類想要獲得大統一理論的願望幾千年來從未間斷過。我們在學習的過程中,總會感到似有一層窗戶紙怎麼也捅不破,似有一層迷霧在眼前,讓人看不到盡頭,這挫折感便是這願望的表現。在這種時候,我們可以尋求一些講解哲理和思考方法的書的幫助。不過哲學書有點太過抽象,推薦溫伯格和愛德華·德·波諾的書。
不論處在哪個學習階段,都可以有意識地讓思維在抽象和具體之間來回移動,這是思考問題的非常有效的技巧。關於這個技巧可能會在後面的文章裡進行更為詳細的討論。
IT技術的三個層次
全稱 informationtechnology,即資訊科技 it實際上有三個層次 第一層是硬體,主要指資料儲存 處理和傳輸的主機和網路通訊裝置 第二層是指軟體,包括可用來蒐集 儲存 檢索 分析 應用 評估資訊的各種軟體,它包括我們通常所指的erp 企業資源計畫 crm 客戶關係管理 scm 鏈管理...
重構的三個層次
domain driven design一書還沒有完整地看完,只能就一些部分做些介紹,只能等以後迭代重構,直到得到這本書的model.軟體是知識的載體,模型是領域知識的結晶 擠壓知識 一般開發複雜的軟體都需要領域專家和軟體開發人員密切合作,開發人員快速地學習領域知識 但一般不可能很快成為專家 領域專...
B S模型的三個層次
表示層 web瀏覽器。位於客戶端,其任務是通過web瀏覽器向網路上的某個web伺服器提出服務請求,web服務請求,web伺服器對使用者身份進行驗證後用http協議把所需的頁面傳送給客戶,並顯示在web瀏覽器上 功能層 具有應用程式擴充套件功能的web伺服器。負責事物邏輯處理,位於web伺服器端,其任...