程序算法與人生選擇

每一年一到要找工做的時候,我就能收到不少人給我發來的郵件,老是問我怎麼選擇他們的offer,去騰訊仍是去豆瓣,去外企仍是去國內的企業,去創業仍是去考研,來北京仍是回老家,該不應去創新工場?該不應去thoughtworks?……等等,等等。今年從7月份到如今,我收到並回復了60多封這樣的郵件。我更多幫他們整理思路,幫他們明白本身最想要的是什麼。(注:我之後再也不回覆相似的郵件了)。前端

我深深地發現,對於我國這樣從小被父母和老師安排各類事情長大的人,當有一天,父母和老師都跟不上的時候,咱們幾乎徹底不知道怎麼去作選擇。而我最近也離開了亞馬遜,換了一個工做。又正值年末,就像去年的那篇《三個故事和三個問題》同樣,讓我想到寫一篇這樣的文章。面試

幾個例子算法

當咱們在面對各類對選擇的影響因子的時候,如:城市,公司規模,公司性質,薪水,項目,戶口,技術,方向,眼界…… 你總會發現,你還會發現你會在兩個公司中糾結一些東西,舉幾個例子:編程

某網友和我說,他們去上海騰訊,由於騰訊的規模很大,但卻發現薪水待遇沒有豆瓣高(低的還不是一點),若是之後要換工做的話,起薪點直接關係到了之後的高工資。我說那就去豆瓣吧,他說豆瓣在北京,污染那麼嚴重,又沒有戶口,生存環境很差。我說去騰訊吧,他說騰訊最近組織調整,不穩定。我說那就去豆瓣吧,慢公司,發展很妥當。他說,豆瓣的盈利不清楚,並且用Python,本身不喜歡。我說,那就去騰訊吧,……後端

還有一網友和我說,他想回老家,由於老家的人脈關係比較好,能混得好。但又想留在大城市,由於大城市能夠開眼界。架構

另外一網友和我說,他想進外企,練練英語,開開眼界,可是又怕在外企裏當個螺絲釘,想法得不到實施。朋友拉他去創業,以爲創業挺好的,鍛鍊大,可是朋友作的那個不知道能不能作好。學習

還有一網友在創新工場的某團隊和考研之間抉擇,不知道去創新工場行不行,以爲那個項目通常,可是感受那個團隊挺有激情的,另外一方面以爲本身的學歷還不夠,讀個研應該能找到更好的工做。測試

還有一些朋友問題我應該學什麼技術?不該該學什麼技術?或是怎麼學會學得最快,技術的路徑應該是什麼?有的說只作後端不作前端,有的說,只作算法研究,不作工程,等等,等等。由於他們以爲人生有限,術業有專攻。編碼

等等,等等……設計

我我的以爲,若是是非計算機科班出生的人不會作選擇,不知道怎麼走也罷了,可是咱們計算機科班出生的人是學過算法的,懂算法的人應該是知道怎麼作選擇的。

排序算法

你不可能要全部的東西,因此你只能要你最重要的東西,你要知道什麼東西最重要,你就須要對你心內的那些慾望和抱負有清楚的認識,否則,你就會在糾結中度過。

因此,在選擇中糾結的人有必要參考一下排序算法。

首先,你最須要參考的就是「冒泡排序」——這種算法的思路就是每次冒泡出一個最大的數。因此,你有必要問問你本身,面對那些影響你選擇的因子,若是你只能要一個的話,你會要哪一個?而剩下的均可以放棄。因而,當你把最大的數,一個一個冒泡出來的時候,並用這個決策因子來過濾選項的時候,你就能比較容易地知道知道你應該選什麼了。這個算法告訴咱們,人的雜念越少,就越容易作出選擇。

好吧,可能你已茫然到了怎麼比較兩個決策因子的大小,好比:你分不清楚,工資>業務前景嗎?業務前景>能力提高嗎?因此你徹底沒有辦法進行冒泡法。那你,你不妨參考一個「快速排序」的思路——這個算法告訴咱們,咱們一開始並不須要找到最大的數,咱們只須要把你價值觀中的某個標準拿出來,而後,把能夠知足這個價值的放到右邊,不能的放到左邊去。好比,你的標準是:工資大於5000元&&業務前景長於3年的公司,你能夠用這個標準來過濾你的選項。而後,你能夠再調整這個標準再繼續遞歸下去。這個算法告訴咱們,咱們的選擇標準越清晰,咱們就越容易作出選擇。

這是排序算法中最經典的兩個算法了,面試必考。相信你已爛熟於心中了。因此,我以爲你把這個算法應用於你的人生選擇也應該不是什麼問題。關於在於,你是否知道本身想要的是什麼?

排序算法的核心思想就是,讓你幫助你認清本身最須要的是什麼,認清本身最想要的是什麼,而後根據這個去作選擇。

貪婪算法

所謂貪婪算法,是一種在每一步選擇中都採起在當前狀態下最好或最優(即最有利)的選擇(注意:是當前狀態下),從而但願致使結果是最好或最優的算法。貪婪算法最經典的一個例子就是哈夫曼編碼。

對於人類來講,通常人在行爲處事的時候都會使用到貪婪算法,

好比在找零錢的時候,若是要找補36元,咱們通常會按這樣的順序找錢:20元,10元,5元,1元。

或者咱們在過十字路口的時候,要從到對角線的那個街區時,咱們也會使用貪婪算法——哪邊的綠燈先亮了咱們就先過到那邊去,而後再轉身90度等紅燈再過街。

這樣的例子有不少。對於選擇中,大多數人都會選用貪婪算法,由於這是一個比較簡單的算法,將來太複雜了,只能走一步看一步,在當前的情況下作出最利於本身的判斷和選擇便可。

有的人會貪婪薪水,有的人會貪婪作的項目,有的人會貪婪業務,有的人會貪婪職位,有的人會貪婪本身的興趣……這些都沒什麼問題。貪婪算法並無錯,雖然不是全局最優解,但其可讓你找到局部最優解或是次優解。其實,有次優解也不錯了。貪婪算法基本上是一種急功近利的算法,可是並不表明這種算法很差,若是貪婪的是一種長遠和持續,又何嘗不可呢?。

動態規劃

可是咱們知道,對於大部分的問題,貪婪法一般都不能找出最優解,由於他們通常沒有測試全部可能的解。由於貪婪算法是一種短視的行爲,只會跟據當前的形式作判斷,也就是過早作決定,於是無法達到最佳解。

動態規劃和貪婪算法的最大不一樣是,貪婪算法作出選擇,不能回退。動態規劃則會保存之前的運算結果,並根據之前的結果對當前進行選擇,有回退功能。

動態規劃算法至少告訴咱們兩個事:

1)承前啓後很是重要,當你準備去作遍歷的時候,你的上次的經歷不但能開啓你之後的經歷,並且還能爲後面的經歷所用。你的每一步都沒有浪費。

2)是否能夠回退也很重要。這意思是——若是你面前有兩個選擇,一個是A公司一個是B公司,若是今天你錯失了B公司,那到你明天還能不能找回來?

好比說:你有兩個offer,一個是Yahoo,一個是Baidu,上述的第一點會讓咱們思考,Yahoo和Baidu誰能給咱們開啓更大的平臺?上述的第二點告訴咱們,是進入Yahoo後若是沒有選好,是否還能回退到Baidu公司?仍是進入Baidu公司後能容易回退到Yahoo公司?

Dijkstra最短路徑

最短路徑是一個Greedy + DP的算法。至關經典。這個算法的大意以下:

1)在初始化的時候,全部的結點都和我是無窮大,默認是達不到的。
2)從離本身最近的結點開始貪婪。
3)走過去,看看又能到達什麼樣的結點,計算並更新到全部目標點的距離。
4)再貪婪與原點最短的結點,如此反覆。

這個算法給咱們帶來了一些這樣的啓示:

我記得有個朋友和我說過他想成爲一個架構師,或是一我的某技術領域的專家,並會踏踏實實的向這個目標前進,永不放棄。我仍是鼓勵了他,但我也告訴他了這個著名的算法,我說,這個算法告訴你,架構師或某領域的專家對你來講目前的距離是無窮大,他們放在心中,先看看你可以得着的東西。所謂踏實,並非踏踏實實追求你的目標,而是踏踏實實把你夠得着看得見的就在身邊的東西幹好。我還記得我剛參加工做,從老家出來的時候,歷來沒有想過要成爲一個技術牛人,也歷來沒有想過個人博客會那麼的有影響力,在作本身力所能及,看得見摸得着的事情,我就看見什麼技術就學什麼,學着學着就知道怎麼學更輕鬆,怎麼學更紮實,這也許就是個人最短路徑。

有不少朋友問我要不要學C++,或是問我學Python仍是學Ruby,是否是不用學前端,等等。這些朋友告訴我,他們不可能學習多個語言,學了不用也就忘了,並且術業有專攻。這並無什麼不對的,只是我我的以爲,學習一個東西沒有必要只有兩種狀態,一種是不學,另外一種是精通。瞭解一個技術其實花不了多少時間,我學C++的目的實際上是爲了更懂Java,學TCP/IP協議實際上是爲了更懂Socket編程,不少東西都是連通和相輔相成的,學好了C/C++/Unix/TCP等這些基礎技術後,我發現到達別的技術路徑一下縮短了(這就是爲何我用兩天時間就能夠了解Go語言的緣由)。這就好像這個算法同樣,算法效率不高,也許達到你的目標,你在一開始花了很長時間,遍歷了不少地方,可是,這也許這就是你的最短路徑。

算法就是Trade-Off

你根本沒有辦法能獲得全部你想獲得的東西,任何的選擇都意味着放棄——當你要去得到一個東西的時候,你老是須要放棄一些東西。人生原本就是一個蹺蹺板,一頭上,另外一頭必然下。這和咱們作軟件設計或算法設計同樣,用時間換空間,用空間換時間,還有CAP理論,老是有不少的Trade-Off,正如這個短語的原意同樣——你老是要用某種東西去交易某種東西。

咱們都在用某種東西在交易咱們的將來,有的人用本身的努力,有的人用本身的思考,有的人用本身的年輕,有的人用本身的自由,有的人用本身的價值觀,有的人用本身的道德…… …… 有的人在交換金錢,有的人在交換眼界,有的人在交換經歷,有的人在交換地位,有的人在交換能力,有的人在交換自由,有的人在交換興趣,有的人在交換虛榮心,在交換安逸享樂…… ……

每一個人有每一個人的算法,每一個算法都有每一個算法的purpose,就算你們在用一樣的算法,可是每一個人算法中的那些變量、開關和條件都不同,獲得的結果也不同。咱們就是生活在Matrix裏的一段程序,咱們每一個人的算法決定着咱們每一個人的選擇,咱們的選擇決定了咱們的人生。

相關文章
相關標籤/搜索