我的演算法感悟
由於機器學習,深度學習,神經網路的興起,演算法的話題漸漸變熱了。
在知乎上,經常有人拿某一個演算法來作為"XXX公司面試題",來進行講解,一瞬間應者如雲。(XXX一般泛指某些大公司,國際級技術公司)。好像一夜之間,演算法已經成為了各個公司必不可少的一種能力。
有時候問自己,演算法能帶給我什麼?
看看自己,已經是奔四的人了。單論學習能力,肯定不如剛畢業的學生來的強。有些人說中年危機,多少在自己身上也有點應驗罷。不過這麼多年以來,依舊喜歡開發,而且一直堅持下來,也覺得自己足夠幸運。身邊一直有朋友們的支持,不斷的前進,努力去做最好的自己。
我職業的前十年,一直和演算法幾乎沒什麼直接關聯。要說用到了一些演算法,也即是拿來主義,介面直接用。根本不細研裡面到底是怎麼做的,那時候對演算法的態度,就如當初在大學學線性代數,離散數學,概率論。覺得和做程序還是很遙遠的事情。相對而言,那時候機緣巧合進入了網路遊戲開發,雖然用到了一些AOI,AStar,歐拉圖,排序。但是總覺得這些東西不是重點。
還記得自己的第一個頁游,2003年是台灣人寫的AVATAR系統,當時用的還是SQLServer,前端頁面大量是asp,我因為興趣,幾乎重寫了裡面的所有數據存儲過程,觸發器,視圖,函數,總共一千多個,花了一個月的時間,建立文檔,優化索引,當時覺得自己的數據能力幾乎達到了巔峰,只要有足夠的時間,什麼都是可以用關係型數據表達的。
後來,開始寫遊戲伺服器代碼,那時候繼承了很多前人的東西,演算法部分基本不用我考慮,主要會用,知道怎麼用就行了。組織數據流程,邏輯校本化確實讓我收穫頗多。就在那個時段,依舊對演算法覺得若即若離。
後來,開始了自己的開源項目,立志把所有邏輯模塊化,代碼自動化,項目可控化。這裡涉及到了一些演算法組織,比如條件樹,決策樹等等。越想做的深入,越是覺得自己對演算法的理解變了。
不去自己設計,不走自己的路,很難知道自己真的需要什麼。
啃別人的東西,有時總有一種懈怠,總覺得別人都做的這麼牛了,也不缺我一個。
後來,有一天,讀了一篇關於圖論的文章,其實所謂的大數據的分析,什麼機器學習也好,深度神經網路也好,實際上就是把數據轉換為一種圖的形式,求各種最優路徑。有點空間幾何的東東,很是興奮了一陣,覺得自己似乎摸到了數據演算法的入口。
在網上找一些演算法的書,滿屏都是怪異的符號等式,以及各種奇怪的圖形,忽然發現,和自己想的完全不一樣啊。自己像一個白痴一樣,站在門口,捏著門票,卻不知道怎麼進去。那時候真有點後悔,自己當初在大學,為什麼不好好去聽概率論?
一切又回到了原地。
看著滿天世界的演算法文章,說的神乎其神,還是心有不甘。
會有那麼一刻,感覺自己被社會脫節了,十幾年的程序積澱,似乎一夜間灰飛煙滅。以前自己取得的成就,目前看上去是多麼空虛和蒼白。當初自信的幾十萬行代碼經驗,在此覺得如此的不值一提。走到現在,自己真的是老了嗎?新的一代,會把我這樣的人遠遠的甩在後面么?
但是更多的時候,我還是在堅持著自己的路。因為我相信,這個世界上,只要無悔的走自己的路,無論如何結果,只要未來的自己可以驕傲的看待目前的過程,那就是我的勝利。
我的開源工程項目,在開始做的時候,在代碼的第一行寫下的注釋。
"無畏懼十年磨一劍,因為那是溶在我血液裡面的純粹。化作塵泥碾做塵,只有香如故。"
當無所謂堅持和放棄,無所謂成功與失敗。純粹享受那種那種純粹的自我,讓未來的自我為自己驕傲吧。
2008年12月25日的晚上,我寫下了自己的誓言。
9年以後,我依舊如項目開始那樣的興奮,不斷的提交著各種改進。只是此刻,我不再是一個人的前進。
9年中,我學會了很多,更多的是學會了自己需要什麼。經過了孤獨,體會了被肯定的興奮,不斷的推翻自己,只求最合理的方案。
直到有一天,我偶爾去參加一個技術研討會。
會議上,有幾個華為的資深講師,在講他們的理念以及演算法。
提問環節,我問了幾個問題,華為的講師說了幾個不懂的演算法的名詞,說,你去看看,就會明白。
我確實再一次發現了自己,和那些大師們差距依舊遙遠。
我不知道那天是怎麼了,而是更直接的說,針對這些問題,你不要告訴我演算法的名字,我需要知道你是怎麼想的過程?如果換做是我,我會怎麼去做,怎麼去解決這個問題。我都驚訝自己為什麼會說出這些,或許,在他們看來,我真的只是一個演算法小白罷了。甚至沒有多餘的去交流的價值吧。但是我越說越快,文字幾乎是噴涌而出,這麼多年做開源遇到的各種實際問題,以及使用我開源的人們的問題和解決思路,自問自答,彷彿那一刻,我所經孤獨和驕傲,變成了一種洪流,把我推向遠方,於是把關於數據流程處理,組織,以及分解,我的思路,居然洋洋洒洒的說了半個小時,等我說完了。才發現台上台下一片寂靜。
說真的,我那是有點尷尬了,或許作為一個小白,這麼說話有點唐突,但是我卻清晰的聽到了掌聲。
在場的華為的講師,沉默了一會,然後突然說;"你的思路,有很多我值得學習的東西。"
是的,那一刻,我忽然發現,演算法對於我,只是一個名詞。
因為在我做開源的時候,經歷了十個,二十個,三十個項目,那些使用我開源的人們,不斷的在給我提問,不斷的督促我解決實際問題。有幾次我都覺得我不行了,可能真的做不出來了。但是我卻因為他們一次次的超越自我的極限,甚至把之前的自己推翻,重新來過。因為我覺得,世界這麼大,能夠相信你,並且用你的東西的人,其實就是我自己啊,我必須用自己的全力,去解決那些"自己"所帶來的問題。那一刻,沒什麼執著與傲嬌,一切以最合理作為目標,沒有別的,這也許就是純粹吧。
確實,我真的不如那些演算法大師們,一切都能用演算法解決的很好。
但是我收穫了自己的路,我可以用那些"我"的經歷,經驗,用自己的辦法去解決和演算法一樣的問題。
當我再回頭審視這些演算法的時候,我越發的發現,這些演算法在某些場景下,局限性是什麼,在什麼時候,它能做的更好。
這就是9年開源,我的收穫。
在應用領域,演算法是一種工具,而取決於你能否駕馭它的關鍵,不是你怎麼去學它,而是大量的經驗,這些經驗來源於那一次次的超越自我的決心,相信自己的路。就像金庸的《射鵰英雄傳》那樣,當你像郭靖那樣去做一千次,一萬次重複的練習,實踐。你再臨陣對敵,再精妙的招式對於你而言也不算什麼。
這就是我的感悟,而且,我越發堅信自己的感悟。
學習對於每個人都是不一樣的,就如同每個人的經歷一樣,不要人云亦云,別人的成功是屬於他們自己的,這不是你的。在此時此刻,或者那些關鍵的時刻,你真的堅信了自我,你就會找到一條屬於自己的路。沒必要一定去和別人一樣去走所謂前人的"捷徑"。
我寫演算法周講的目的,更多的也是督促自己。用自己的方式去學習,去理解。
因為總有一天,未來的你會對現在的你做出評價。
推薦閱讀:
※NVDIA GeForce Experience 3.0 強制賬戶登陸是出於怎樣的考慮?
※為什麼知乎上這麼多做計算機科學的?
※哪些字體適合程序員用來維護代碼?
※如何利用python讀取特定目錄下的特定文件的倒數兩行?
※【20171027】- 不使用第三方程序快速啟動Windows應用程序(二)