陳皓(左耳朵皓子):程序算法與人生選擇

寫于2012,雖然過去很久了,現在讀來依然很受啟發,或許這就是好文的標準吧,不隨著時間的流逝而減弱。

????????每年一到要找工作的時候,我就能收到很多人給我發來的郵件,總是問我怎么選擇他們的offer,去騰訊還是去豆瓣,去外企還是去國內的企業,去創業還是去考研,來北京還是回老家,該不該去創新工場?該不該去thoughtworks?……等等,等等。今年從7月份到現在,我收到并回復了60多封這樣的郵件。我更多幫他們整理思路,幫他們明白自己最想要的是什么。(注:我以后不再回復類似的郵件了)。我深深地發現,對于我國這樣從小被父母和老師安排各種事情長大的人,當有一天,父母和老師都跟不上的時候,我們幾乎完全不知道怎么去做選擇。而我最近也離開了亞馬遜,換了一個工作。又正值年底,就像去年的那篇《三個故事和三個問題》一樣,讓我想到寫一篇這樣的文章。

幾個例子

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

  • 某網友和我說,他們去上海騰訊,因為騰訊的規模很大,但卻發現薪水待遇沒有豆瓣高(低的還不是一點),如果以后要換工作的話,起薪點直接關系到了以后的高工資。我說那就去豆瓣吧,他說豆瓣在北京,污染那么嚴重,又沒有戶口,生存環境不好。我說去騰訊吧,他說騰訊最近組織調整,不穩定。我說那就去豆瓣吧,慢公司,發展很穩當。他說,豆瓣的盈利不清楚,而且用Python,自己不喜歡。我說,那就去騰訊吧,……
  • 還有一網友和我說,他想回老家,因為老家的人脈關系比較好,能混得好。但又想留在大城市,因為大城市可以開眼界。
  • 另一網友和我說,他想進外企,練練英語,開開眼界,但是又怕在外企里當個螺絲釘,想法得不到實施。朋友拉他去創業,覺得創業挺好的,鍛煉大,但是朋友做的那個不知道能不能做好。
  • 還有一網友在創新工場的某團隊和考研之間抉擇,不知道去創新工場行不行,覺得那個項目一般,但是感覺那個團隊挺有激情的,另一方面覺得自己的學歷還不夠,讀個研應該能找到更好的工作。
  • 還有一些朋友問題我應該學什么技術?不應該學什么技術?或是怎么學會學得最快,技術的路徑應該是什么?有的說只做后端不做前端,有的說,只做算法研究,不做工程,等等,等等。因為他們覺得人生有限,術業有專攻。
  • 等等,等等……

????????我個人覺得,如果是非計算機科班出生的人不會做選擇,不知道怎么走也罷了,但是我們計算機科班出生的人是學過算法的,懂算法的人應該是知道怎么做選擇的

排序算法

????????你不可能要所有的東西,所以你只能要你最重要的東西,你要知道什么東西最重要,你就需要對你心內的那些欲望和抱負有清楚的認識,不然,你就會在糾結中度過。所以,在選擇中糾結的人有必要參考一下排序算法。

  • 首先,你最需要參考的就是“冒泡排序”——這種算法的思路就是每次冒泡出一個最大的數。所以,你有必要問問你自己,面對那些影響你選擇的因子,如果你只能要一個的話,你會要哪個?而剩下的都可以放棄。于是,當你把最大的數,一個一個冒泡出來的時候,并用這個決策因子來過濾選項的時候,你就能比較容易地知道知道你應該選什么了。這個算法告訴我們,人的雜念越少,就越容易做出選擇。
  • 好吧,可能你已茫然到了怎么比較兩個決策因子的大小,比如:你分不清楚,工資>業務前景嗎?業務前景>能力提升嗎?所以你完全沒有辦法進行冒泡法。那你不妨參考一個“快速排序”的思路——這個算法告訴我們,我們一開始并不需要找到最大的數,我們只需要把你價值觀中的某個標準拿出來,然后,把可以滿足這個價值的放到右邊,不能的放到左邊去。比如,你的標準是:工資大于5000元&&業務前景長于3年的公司,你可以用這個標準來過濾你的選項。然后,你可以再調整這個標準再繼續遞歸下去。

    這個算法告訴我們,我們的選擇標準越清晰,我們就越容易做出選擇。這是排序算法中最經典的兩個算法了,面試必考。相信你已爛熟于心中了。所以,我覺得你把這個算法應用于你的人生選擇也應該不是什么問題。關于在于,你是否知道自己想要的是什么?

????????排序算法的核心思想就是,讓你幫助你認清自己最需要的是什么,認清自己最想要的是什么,然后根據這個去做選擇

貪婪算法

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

????????對于人類來說,一般人在行為處事的時候都會使用到貪婪算法,

  • 比如在找零錢的時候,如果要找補36元,我們一般會按這樣的順序找錢:20元,10元,5元,1元。
  • 或者我們在過十字路口的時候,要從到對角線的那個街區時,我們也會使用貪婪算法——哪邊的綠燈先亮了我們就先過到那邊去,然后再轉身90度等紅燈再過街。

????????這樣的例子有很多。對于選擇中,大多數人都會選用貪婪算法,因為這是一個比較簡單的算法,未來太復雜了,只能走一步看一步,在當前的狀況下做出最利于自己的判斷和選擇即可。

????????有的人會貪婪薪水,有的人會貪婪做的項目,有的人會貪婪業務,有的人會貪婪職位,有的人會貪婪自己的興趣……這些都沒什么問題。貪婪算法并沒有錯,雖然不是全局最優解,但其可以讓你找到局部最優解或是次優解。

????????其實,有次優解也不錯了。貪婪算法基本上是一種急功近利的算法,但是并不代表這種算法不好,如果貪婪的是一種長遠和持續,又未嘗不可呢?

動態規劃

????????但是我們知道,對于大部分的問題,貪婪法通常都不能找出最優解,因為他們一般沒有測試所有可能的解。因為貪婪算法是一種短視的行為,只會根據當前的形式做判斷,也就是過早做決定,因而沒法達到最佳解。

????????動態規劃和貪婪算法的最大不同是,貪婪算法做出選擇,不能在過程優化。動態規劃則會保存以前的運算結果,并根據以前的結果對當前進行選擇,會動態優化功能。動態規劃算法至少告訴我們兩個事:

????????1)承前啟后非常重要,當你準備去做遍歷的時候,你的上次的經歷不但能開啟你以后的經歷,而且還能為后面的經歷所用。你的每一步都沒有浪費。

????????2)是否可以回退也很重要。這意思是——如果你面前有兩個選擇,一個是A公司一個是B公司,如果今天你選了A公司,并不是你完全放棄了B公司。而是,你知道從A公司退出來去B公司,會比從B公司退出來去A公司要容易一些。

????????比如說:你有兩個offer,一個是Yahoo,一個是Baidu,上述的第一點會讓我們思考,我以前的特長和能力更符合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里的一段程序,我們每個人的算法決定著我們每個人的選擇,我們的選擇決定了我們的人生。

(全文完)

程序算法與人生選擇 | 酷 殼 - CoolShell

編程能力與編程年齡 | 酷 殼 - CoolShell

這個算法告訴我們,人的雜念越少,就越容易做出選擇。

這個算法告訴我們,我們的選擇標準越清晰,我們就越容易做出選擇

讓你幫助你認清自己最需要的是什么,認清自己最想要的是什么,然后根據這個去做選擇

貪婪算法基本上是一種急功近利的算法,但是并不代表這種算法不好,如果貪婪的是一種長遠和持續,又未嘗不可呢?

因為貪婪算法是一種短視的行為,只會跟據當前的形式做判斷,也就是過早做決定,因而沒法達到最佳解。

承前啟后非常重要。

是否可以回退也很重要

所謂踏實,并不是踏踏實實追求你的目標,而是踏踏實實把你夠得著看得見的就在身邊的東西干好。

任何的選擇都意味著放棄——當你要去獲得一個東西的時候,你總是需要放棄一些東西人生本來就是一個蹺蹺板,一頭上,另一頭必然下

你總是要用某種東西去交易某種東西

每個人有每個人的算法,每個算法都有每個算法的purpose,就算大家在用同樣的算法,但是每個人算法中的那些變量、開關和條件都不一樣,得到的結果也不一樣。我們就是生活在Matrix里的一段程序,我們每個人的算法決定著我們每個人的選擇,我們的選擇決定了我們的人生

也只有在做自己事業的時候,你才能不懼困難,才會勇敢地面對一切那種想找一個安穩的避風港呆著的心態是不會讓你平靜地,你要知道世界本來就是不平靜的,找了自己的歸宿和目標才可能讓你真正的平靜

每個人都應該為自己的事業為自己的理想去活一次,追逐自己的事業和理想并不容易,需要有很大的付出,而也只有你心底里的那個理想值得這么大的付出……

《教父》里有這樣的人生觀:第一步要努力實現自我價值,第二步要全力照顧好家人,第三步要盡可能幫助善良的人,第四步為族群發聲,第五步為國家爭榮譽。事實上作為男人,前兩步成功,人生已算得上圓滿,做到第三步堪稱偉大,而隨意顛倒次序的那些人,一般不值得信任

什么樣的人干什么樣的事,什么樣的階段做什么樣的選擇,有人的說,選擇比努力更重要的,我深以為然,而且,我覺得選擇和決定,比努力更難,努力是認準了一個事后不停地發力,而決定要去認準哪個事是自己該堅持努力的,則是令人彷徨和焦慮的(半途而廢的人也很多)。面對人生,你每天都在作一個一個的決定,在做一個又一個的選擇,有的決定大,有的決定小,你的人生的軌跡就是被這一個一個的決定和選擇所走走出來的。

越是有能力的人,就越不計較一些短期得失,越計較短期得失的人往往都是很平庸的人

技術。對于計算機技術來說,要學的東西實在是太多,我并不害怕要學的東西很多,因為學習能力是一個好的工程師必需具備的事,我不懼怕困難和挑戰。我覺得在語言和技術爭論誰好誰壞是一種幼稚的表現, 沒有完美的技術,Engineering 玩的是 Tradeoff。所以,我對沒有完美的技術并不擔心,但是我反而擔心的是,當我們進入到一些公司后,這些公司會有一些技術上的沉淀也就是針對公司自己的專用技術,比如一些中間件,一些編程框架,lib庫什么的。老實說,我比較害怕公司的專用技術,因為一旦失業,我建立在這些專用技術上的技能也會隨之瓦解,有時候,我甚至害怕把我的技術建立在某一個平臺上,小眾的不用說了,大眾的我也比較擔擾,比如Windows或Unix/Linux上,因為一旦這個平臺不流行或是被取代,那么我也會隨之淘汰(過去的這20年已經發生過太多這樣的事了)。為了應對這樣的焦慮,我更愿意花時間在技術的原理和技術的本質上,這導致我需要了解各種各樣的技術的設計方法,以及內在原理。所以,當國內的絕大多數程序員們更多的關注架構性能的今天,我則花更多的時間去了解編程范式,代碼重構,軟件設計,計算機系統原理,領域設計,工程方法……因為只有原理、本質和設計思想才可能讓我不會被綁在某個專用技術或平臺上,除非,我們人類的計算機這條路沒走對。

通常來說,管理者的技能力需要到公司和組織里才能展現,而有創造力的技能的人是可以自己獨立的能力,所以,我覺得程序員的技能比管理者的技能能讓我更穩定更自地活著

我在24歲放棄了一房子離開銀行到小公司的時候,我就知道,人生的選擇就是一個翹翹板,你要一頭就沒有另一頭,選擇是有代價的,你不選擇的代價更大;選擇是要冒險的,你不敢冒險的風險更大;選擇是需要放棄的,因為無論怎么選你都會要放棄。想想你老了以后,回頭一看,好多事情在年輕的時候都不敢做,而你再也沒有機會,你就知道不敢選擇不敢冒險的代價有多大了。選擇就是一種 trade-off,這世上根本不會有什么完美,只要你想做事,你有雄心壯志,你的人生就是一個坑接著一個坑,你所能做的就是找到你喜歡的方向跳坑。

所以, 你要想清楚你要什么,不要什么,而且還不能要得太多,這樣你才好做選擇。否則,你影響你的因子太多,決定不好做,也做不好。

我覺得一個人有一定的影響力,其中有很大一部份原因來自他的獨立性,如果我開始寫軟文了,相當于我把自己賣了

關于獨立性,這里說兩個花絮吧——

我在Amazon的時候,我和公司講,我想在我的博客上寫幾篇關于亞馬遜的文章,介紹亞馬遜的技術和一些做事的方法,也算是個宣傳,讓我的團隊也好招人,但是,我當時的老板和我說,你的博客之所以有影響力是因為你的獨立性,不要寫亞馬遜的,這樣會把你自己賣了,千萬別這么做。

然而,我在Alibaba的時候,我的大老板要求我用我的博客和微博幫阿里云做營銷,我非常委婉地拒絕了,結果,團隊合作的價值觀不達標了。呵呵。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/36047.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/36047.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/36047.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用 position:absolute; 定位的元素在ios上被遮蓋

在ios上一個元素使用position:absolute;定位后,被其它元素遮蓋 在使用absolute的元素上加一行代碼 -webkit-transform: translate3d(0, 0, 0);

[滲透測試] 任意文件讀取漏洞

任意文件讀取漏洞 概述 漏洞成因 存在讀取文件的功能(Web應用開放了文件讀取功能)讀取文件的路徑客戶端可控(完全控制或者影響文件路徑)沒有對文件路徑進行校驗或者校驗不嚴格導致被繞過輸出文件內容 漏洞危害 下載服務器中的…

Linux下反匯編相關工具

Linux下反匯編相關工具 程序出現崩潰堆棧,如果事先沒有裝調試包或者以調試模式編譯,則打出的堆棧中看不到函數名,或者顯示 n/a。此時往往需要根據 backtrace 打印的函數偏移地址來確定調用的是什么函數,這里就涉及到比較高級的調…

Java8新特性Stream

Stream 是 Java 8 引入的一種新的抽象,用于處理集合類 (Collection) 的數據。Stream 并不存儲數據,而是按需計算數據。Stream 操作有兩個重要特性: 流水線操作 (Pipelining):Stream 操作可以鏈式調用,形成一個流水線&…

springboot項目的打包問題(常用)

在java的日常開發中,離不開項目的打包,怎么將項目打包,并部署到服務器,這是每一個java程序猿都需要會的知識點,我根據自己的經驗寫這篇文章,希望可以幫助到有需要的人。 知識鋪墊:在java項目中…

第十五站:Java琥珀——持續集成與交付的自動化之路

Java作為一種廣泛使用的編程語言,它的生態系統非常龐大和成熟,其中包括了持續集成與持續交付(CI/CD)的工具,這些工具對于現代軟件開發至關重要。下面我將結合Java源代碼,簡要介紹Jenkins和GitLab CI/CD如何…

Compiled blocks

目錄 一,編譯塊 Compiled Block 二,編譯循環 三,調用編譯塊 Invoke 四,Tips and notes 一,編譯塊 Compiled Block 在幾何體網絡內,可將網絡的一部分放入編譯塊(compiled block)內…

jenkins nginx自動化部署 php項目

在當今快速發展的IT領域,自動化部署已成為提高工作效率和減少錯誤的關鍵。Jenkins作為持續集成/持續部署(CI/CD)的佼佼者,結合Docker容器技術和PHP編程語言,以及Ansible自動化工具,可以實現高效、可靠的自動…

Node.js RESTful API

Node.js RESTful API Node.js,作為一種流行的服務器端JavaScript運行環境,因其輕量級、高效和易于學習的特點,成為了開發RESTful API的優選技術之一。RESTful API是一種廣泛使用的Web服務架構風格,它利用HTTP協議的標準方法(如GET、POST、PUT、DELETE)來訪問和操作數據。…

開發指南035-刷新待辦

這個問題在平臺上的難點在于:待辦是在門戶系統里,待辦的處理是在另一個獨立的前端工程里,兩者是跨域關系。當然這兩個系統都是同一個瀏覽器打開的。跨域頁面通訊技術的核心是:消息監聽。 1、門戶主界面的vue頁面的create中掛接消息…

JavaScript 中的 change

什么是 change 事件&#xff1f; change 事件是 HTML 表單元素的一種事件類型&#xff0c;當表單元素的值發生變化并且失去焦點時&#xff0c;該事件會被觸發。常見的表單元素包括 <input>、<select> 和 <textarea>。 適用元素 <input>&#xff08;…

基于DeepNLP AI Store真人點評和ShowCase分享社區-AI for Image Generator

來源 quora 社區: https://deepnlpaistore.quora.com/ github: https://rockingdingo.github.io/deepnlp/store/image_generator 內容 DeepNLP AI Store 網址&#xff1a;http://www.deepnlp.org/store/image-generator 網站針對圖像生成類別 Image Generator下多個AI工具如 …

Spring MVC數據綁定和響應——復雜數據綁定(一)數組綁定

一、數組綁定的使用場景 在實際開發中&#xff0c;可能會遇到客戶端請求需要傳遞多個同名參數到服務器端的情況&#xff0c;這種情況采用前面講解的簡單數據綁定的方式顯然是不合適的。此時&#xff0c;可以使用數組來接收客戶端的請求參數&#xff0c;完成數據綁定。 接下來…

CS與MSF的權限互相傳遞/mimikatz抓取windows 2012明文密碼

目錄 CS和MSF的簡單介紹 Metasploit Cobalt Strike 1、CS權限傳遞到MSF 2、MSF權限傳遞到CS 3、使用mimikatz抓取明文密碼 通過修改注冊表用戶重新登錄后抓取明文密碼 今天的任務是兩個 一個是CS與MSF的權限互相傳遞一個是抓取windows2012的明文密碼 那就分別來完成 …

云計算基礎技術

云計算基礎技術概覽 計算類產品主要提供算力&#xff0c;支持業務運行&#xff0c;例如網站、辦公軟件、數據分析等計算能力&#xff0c;目前典型的產品主要是虛擬化和容器&#xff0c;在公有云上的云主機本質也是虛擬機。網絡類產品主要滿足資源的網絡連通性和隔離&#xff0c…

軟考初級網絡管理員__軟件單選題

1.如下圖所示&#xff0c;在IE“Intemet選項”對話框的()選項卡中可指定電子郵件程序。 常規 內容 高級 程序 2.在Excel的A1單元格中輸入函數“ROUND(1/3,3)”,按回車鍵之后&#xff0c;A1中的值為()。 1 1/3 0.34 0.333 3.在輸入Word文檔過程中&#xff0c;為了防止意…

Pinia的基本用法

Pinia的安裝和引入 1.安裝Pinia npm install pinia2. 在vue項目的main.js文件中引入pinia import { createApp } from vue import { createPinia } from pinia import App from ./App.vueconst pinia createPinia() const app createApp(App)app.use(pinia) app.mount(#ap…

日志打印中對容器(包括多級容器)的通用輸出

在日志打印中&#xff0c;往往有打印一個數組、集合等容器中的每個元素的需求&#xff0c;這些容器甚至可能嵌套起來&#xff0c;如果每個地方都用for循環打印&#xff0c;將會特別麻煩。基于這種需求&#xff0c;作者嘗試實現一個通用的打印函數SeqToStr()&#xff0c;將容器序…

線上民族傳統服飾商城

摘 要 隨著互聯網的不斷發展和普及&#xff0c;電子商務成為了人們生活中不可或缺的一部分。傳統的線下購物方式逐漸被線上購物所取代&#xff0c;人們越來越習慣在互聯網上購物。而民族傳統服飾作為我國豐富多樣的民族文化的重要組成部分&#xff0c;具有獨特的藝術價值和商業…

unity VR Interaction Framework 創建新手勢

提示&#xff1a;文章有錯誤的地方&#xff0c;還望諸位大神不吝指教&#xff01; 文章目錄 前言一、新建物體&#xff0c;并添加必要組件二、添加抓取點三、查看手勢的可視化樣式四、制作新的手勢1.點擊編輯2.根據需求調節手指關節3.保存手勢4. 使用創建的手勢5.運行 總結 前言…