程序算法与人生选择
每年一到要找工作的时候,我就能收到很多人给我发来的邮件,总是问我怎么选择他们的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里的一段程序,我们每个人的算法决定着我们每个人的选择,我们的选择决定了我们的人生。
2012年就要过去了,祝大家新年快乐!
(全文完)
(转载本站文章请注明作者和出处 宝酷 – sou-ip ,请勿用于任何商业用途)
《程序算法与人生选择》的相关评论
等了好久,先拿个沙发在慢慢看。
这文章写的不错,作为板凳的我深表赞同。愿意“清楚”地思考,明了知之与不知,进退有据,真是好策略啊
谢谢分享。看后很值得深思。
说得真好,年底了,我也该好好想想自己想要的是什么~
非常贴切,鱼与熊掌不可兼得也
新年快乐~
算法与人生,选择重要,一元化的成功也恨重要。最重要的还是保持自己内心的快乐,毕竟技术除了是自己的爱好或者工作,还有其他可以追去的事。所以个人觉得选择工作,20几岁还是要看自己能学到的多少。如果一个小公司能让我学到很多技能,不止包括技术,我不会选择浅多,说出去有面子,单却只是螺丝钉的大公司。
总结:为学日增,为道日损。即皓哥说的踏实的做,考虑的越多越迷茫
一年的总结啊,也是人生的一种总结:
我们都在用某种东西在交易我们的未来,有的人用自己的努力,有的人用自己的思考,有的人用自己的年轻,有的人用自己的自由,有的人用自己的价值观,有的人用自己的道德。有的人在交换金钱,有的人在交换眼界,有的人在交换经历,有的人在交换地位,有的人在交换能力,有的人在交往自由,有的人在交换兴趣,有的人在交换虚荣心,在交换安逸……
终于更新了!博主不但技术好,文笔也好。谢谢分享!祝新年快乐!
皓哥果然有才,估计里面的有一封邮件是我发的,而且皓哥也帮我分析了各种企业的利弊,再次感谢!
归根结底,了解自己,认识自己是多么的重要,这是我们许多中国人接受的教育给不了的。
一直等着浩哥更新,原来浩哥在忙换工作的事,新年新起点,加油!
{quote}所谓踏实,并不是踏踏实实追求你的目标,而是踏踏实实把你够得着看得见的就在身边的东西干好{quote}
赞同
牛!我喜欢你的回复!@seesea
上班开电脑顺便瞅了一眼微博,就链到了这么好的文章,这算是“出门见喜”了吧。:)真的很有收获。
不过有个小疑问。陈老师最后提到了trade off,我注意到博客中字、词、句方面有些无伤大雅的瑕疵,不知道宝酷老师是怎么看待这个的。是完全无心的,还是有心觉得用一点文字上的准确性来trade off时间和blog产量是完全值得的?
这些小瑕疵包括:
(1)“因为腾讯的规模很大,但却发现薪水代遇没有豆瓣高……”——个错别字。
(2)“不知道去创新工场行不行,觉得那个项止一般……”——一个错别字。(陈老师也用五笔?握握手,^_^)
(3)“所谓贪婪算法是指,是一种在每一步选择中都采取在当前状态下最好或最优的选择……”——“是指”跟“是一种”在句式上杂糅。
(4)“动态规划和贪婪算法的最大不同是,贪心算法做出选择……”——一句话里用了同一概念的两种说法。
(5)原先好像还有个“交往自由”已经被您改过来了。:P
文章挺有意思的,拿程序员熟悉的这些算法做类比,让人觉得很贴切。Dijkstra最短路径 的那一段很有启发性。
嘿嘿,我使用的是层次分析法。
“所谓踏实,并不是踏踏实实追求你的目标,而是踏踏实实把你够得着看得见的就在身边的东西干好”。我也很同意这句话!
非常赞的文章!
皓哥,新年快乐!
我觉得这个问题不像是排序,动态规划,图论。反而更像是运筹学算法,线性规划,整数线性规划之类的。
清楚自己想要什么真的很重要,作为还在纠结的我要好好理解下上面的内容。
感谢皓哥 准备换工作呢看了后很有启发~
说的真亲切
如果大学时,老师能像这种讲法来讲算法,我们的算法还怕学不好吗?!
有得必有失,总有些东西是要放弃的!!!
这些是牛人的算法,有多种选择,但是大部分人真没有太多的选择,有就算不错了
读过后,我有种豁然开朗的感觉。其实职业规划可以做到顺从己心,看自己的内心想要的是什么,然后做出选择。
看完皓歌这篇文章,给我的感触很大,是啊,生活中好多地方需要自己做权衡,我们也有很多距离自己无穷大的目标和愿景,但更要踏踏实实的做好身边的事情,做的专业,在这里预祝皓哥,家庭幸福,身体健康,工作顺利,新年快乐哦!
can not agree more:
“这就好像这个算法一样,算法效率不高,也许达到你的目标,你在一开始花了很长时间,遍历了很多地方,但是,这也许这就是你的最短路径。”
8年c++经验,若干年python经验, 连学带写java就是一个星期的事情,包括java的各种惯用法约定。
迷茫中,有点启发,谢谢~
我现在就在一个关键路口,我知道做出选择的只能是我自己。
呀,那不是我写的,是博主最后的总结,我抄了遍而已。
曾经也有类似想法,但是有时候想想人生路和算法还是有差别的,
生活中乐趣是很大一块,不一定是最优解才算好的。
新年快乐。
找个脑图工具,把所有可能影响的因素一一罗列出来,不断按重要性、优先级调整,然后就清楚了
看了文章,貌似挺不错的哦!
文章很好,挑一个错。“觉得那个项止一般”这段应该是“项目”吧。
一个有目标有原则,并且已经有成型的人生观和价值观的人,是不会被这类问题困绕的。
文章中说到这么多都是外表的东西,没有提及本质。博主应该建议他们多读一些人文方面的书,形成自己的价格观与人生观,这样就不会无目的的求助了。
个人见解,我认为我已经我的正确人生观和价值观以及目标原则,可以发表这个看法。
我高中时就思考过人生与算法,简述下我当时的思考:
贪婪算法最容易做到,但肯定不是最优解;
动态规划最优,但面对的不是数据而是人生,太难做到了……
这问题好复杂,我水平有限,没得出啥结论……
我要好好看看这文章应该能给我很多启示。。。
是篇真的好的文章,仔细品味后,感觉必须mark,然后每过一段周期就读一次,为了醒脑
我总结的感概就是:修身养德 执着淡定 努力学习 与时俱进
皓兄,顶礼了! 算法与人生是IT人的思考方式,这里与您分享,生命科学与人生:
凤凰卫视报道:
http://news.ifeng.com/history/video/detail_2012_10/15/18268433_0.shtml
http://v.youku.com/v_show/id_XNDU0MjQ2NzI0.html
see see
像评估算法一样评估要做的事,这才是牛b的程序员。
技高人胆大,打铁还需自身硬。
能力上来了,选择就多了!!!
作者的文笔不错,不过换工作考虑的问题的确很多,貌似我也遇到了这样的困境! 我觉得我应该寻求一个能提升自己能力的公司~
喜欢你对踏实的理解。
算法没学好,赶紧学去
皓哥离开亚马逊啦,不会是去了InfoQ吧!呵呵~
我觉得每个人都会遇到这样的问题,我猜皓哥以前应该也遇到过类似的问题,
我个人觉得我们的问题在于不知道自己究竟想要什么,是想要物质,还是想要提升职能,
还是平衡于二者之间的什么。如果你能确认问题,需求,我相信对于有相关经验的人应该可以
给出有参考价值的回答。比如,哪一个挣的多,哪一个工作性质更有挑战性,等等。
而对于皓哥给出的算法,实现出来容易,但怎么输入参数哪? 是想和家人朋友更近一些,
还是想要更理想的工作哪? 如果10分是满分,今天家人是7分,工作是3分, 也许明天家人
变成5分,工作变成7分了,到底应该如何确认自己究竟想要什么。
这样模糊的问题,能给出答案的只有自己。就算是这样,我们依旧想从别人那里获得一份安全感,
而非计算机。
人生就是二叉树,只可惜我没学好最优怎么算···
不错不错,程序员的生活