每年找工作的时候,都能收到很多人发来的邮件,总是问我怎么选他们的offer,去腾讯你还去吗豆瓣,去外企还是国内公司,创业还是考研,来北京还是回老家,该去创新工场?我应该去thoughtworks吗?……等等等等。从今年7月份到现在,我已经收到并回复了60多封这样的邮件。我帮助他们更多地整理思路,帮助他们明白自己最想要的是什么。(注:以后不再回复类似邮件)。我深深地发现,像我们国家这样在父母和老师安排的各种事情中长大的人,有一天,当父母和老师跟不上的时候,我们几乎不知道该如何选择。而且我最近也离开了亚马逊去另一份工作,这让我写了一篇这样的文章。举几个例子当我们面临各种影响选择的因素,比如:城市、公司规模、公司性质、薪资、项目、户籍、技术、方向、愿景……你总会发现,你会在afew这个公司有一些问题,这里举几个例子:有网友告诉我,他们去了上海的腾讯,因为腾讯规模大,但是发现工资没有豆瓣那么高(不是a低一点),如果他们以后想换工作的话,起薪点直接关系到以后的高薪。我说,我们去豆瓣吧。他说,豆瓣在北京,污染这么严重,又没有户口,生活环境不好。我说去腾讯。他表示,腾讯近期组织架构调整,不稳定。我说去豆瓣吧,慢公司,发展很稳定。他说豆瓣的盈利不清楚,不喜欢用Python。我说,我们去腾讯吧。。。还有一个网友跟我说,他想回老家,因为人脉比较好,可以好好相处。但我想留在大城市,因为大城市可以开阔我的眼界。另一位网友告诉我,他想进外企,练练英语,开阔眼界,但又怕在外企做螺丝钉,自己的想法得不到实施。朋友邀请他创业,觉得创业很好,很好的锻炼,不知道朋友做的能不能做好。还有一位网友正在创新工场某队和考研之间做选择。不知道去创新工场好不好。他觉得项目一般,但觉得团队挺有激情的。另一方面,他觉得自己的教育还不够。应该可以找到更好的工作。也有一些朋友问我应该学什么技术?什么技术不应该学?或者说怎么学才能学得最快,技术的路径应该是怎样的?有的说只做后端不做前端,有的说只做算法研究,不做工程等等,等等。因为他们觉得人生有限,艺术有专攻。等等,等等……我个人认为,如果不是计算机科班出身,是不会做出选择的,也不知道怎么走,但是我们这些计算机科班出身的人学过算法,懂算法的应该知道如何选择。排序算法你不可能什么都想要,所以你只能想要你最重要的东西。如果你想知道什么是最重要的,你需要对你内心的那些欲望和野心有一个清晰的认识,否则,你将在纠结中度过。所以,纠结选择的人需要参考一下排序算法。首先大家最需要参考的就是“冒泡排序”——这个算法的思想是每次冒泡最多一个数。因此,你有必要问问自己,面对那些影响你选择的因素,如果只能有一个,你会选择哪个?其余的可以丢弃。所以,当你把最新的数字一个一个地冒出来,并用这个决定因素来筛选选项时,你就很容易知道你应该选择什么。这个算法告诉我们,一个人的注意力越少,就越容易做出选择。好吧,也许您对如何比较这两个决策因素的大小感到茫然,例如:您无法区分,薪水>业务前景?业务前景>能力提升?所以你根本做不到冒泡。那你呢,不妨参考一个“快速排序”的思路——这个算法告诉我们,不需要一开始就找最好的数,只需要在你的值中取出某个标准,然后put能满足这个值的放在右边,不能满足的放在左边。例如,如果您的标准是:工资大于5000元的公司&&业务前景超过3年,您可以使用此标准来过滤您的选项。然后,您可以调整此标准并继续递归。这个算法告诉我们,我们的选择标准越明确,我们就越容易做出选择。这是排序算法中最经典的两个算法,面试必考。我相信你很熟悉它。所以,我认为你把这个算法应用到你的人生选择中应该不是问题。关于这一点,你知道你想要什么吗?排序算法的核心思想是让你帮你认清自己最需要什么,认清自己最想要什么,然后据此做出选择。GreedyAlgorithm所谓贪心算法就是在每一步选择中,在当前状态下取***或***(即最有利)的选择(注意:是当前状态),使得结果希望是**或***算法。贪心算法最经典的例子之一是霍夫曼编码。对于人类来说,大部分人在做事的时候都会使用贪心算法。比如找零钱的时候,如果我们要补36元,我们一般会按照这样的顺序找钱:20元、10元、5元、1元。或者我们过路口的时候,想从街区走到对角线的时候,也会用到贪心算法——绿灯先亮我们先走,然后转90度,等等。红灯的街道。这样的例子很多。对于选择,大部分人会选择贪心算法,因为这是一个比较简单的算法。未来太复杂,我们只能一步一个脚印,在当前形势下做出最有利的判断和选择。有人贪薪水,有人贪项目,有人贪生意,有人贪职位,有人贪利益……这些都可以。贪心算法没有错。虽然它不是全局最优解,但它可以让你找到局部最优或次优解。事实上,有一个次优解也不错。贪心算法基本上是一种急功近利的算法,但并不代表这个算法不好。如果贪婪是长期的、持续的,是不是可以?.#p#动态规划但是我们知道,对于大多数问题,贪心法通常无法找到最佳解,因为它们一般不会测试所有可能的解。因为贪心算法是一种短视行为,只会根据当前的形式进行判断,也就是过早地做决定,所以达不到最优解。动态规划和贪心算法最大的区别是贪心算法做出选择,不能后退。动态规划会保存之前的计算结果,并根据之前的结果选择当前的,具有回滚功能。动态规划算法至少告诉我们两件事:1)连接过去和未来非常重要。当你要做遍历的时候,你上次的经历不仅可以打开你以后的经历,还可以为以后的经历所用。你迈出的每一步都没有白费。2)能不能回滚也很重要。这意味着——如果你面前有两个选择,一个是A公司,一个是B公司,如果你今天错过了B公司,明天还能找回来吗?例如:你有两个offer,一个是雅虎,一个是百度。以上几点让我们思考,雅虎和百度谁能为我们打开更大的平台?上面第二点告诉我们,进入雅虎后选择失败是否可以返回百度?还是进入百度后容易回到雅虎?Dijkstra的ShortestPath最短路径是一种Greedy+DP算法。相当经典。这个算法的总体思路是这样的:1)在初始化的时候,所有的节点都是和我无限的,默认是不可达的。2)从离你最近的节点开始贪心。3)走过去看能到达什么样的节点,计算并更新到所有目标点的距离。4)贪婪有原点的最短节点,等等。这个算法给我们带来了一些启示:一个朋友告诉我,他想成为一名架构师或者某个技术领域的专家,他会朝着这个目标稳步前进,永不放弃。我仍然鼓励他,但我也告诉他这个著名的算法。我说,这个算法告诉你,架构师或者某个领域的专家目前的距离对你来说是无限的。他们应该记在心里,先看看。你能得到的东西。所谓脚踏实地,不是脚踏实地去追求自己的目标,而是把身边看得见、看得见的事情做好。还记得刚开始工作从老家出来的时候,我从来没有想过要成为一个技术天才,更没想过我的博客会有这么大的影响力。我是在做力所能及的,看得见摸得着的,看到什么技术我就学什么,我知道怎样学得更轻松,怎样学得更扎实。这可能是我最短的路径。很多朋友问我到底该不该学C++,还是该学Python还是Ruby,是不是不需要学前端等等。这些朋友告诉我,他们不可能多学一门语言,用不着就忘了,还得专攻技能。这并没有错,但是我个人认为,没有必要去学一个东西,只有两种状态,一种是不会学,一种是熟练。了解一项技术并不需要太多时间。我学习C++的目的其实是为了更好地理解Java。学习TCP/IP协议的目的其实是为了更好的理解Socket编程。很多事情都是相互联系、相辅相成的。学习了C/C++/Unix/TCP等基础技术后,发现通向其他技术的路子缩短了(这也是我两天就能看懂Go语言的原因)。就像这个算法,这个算法效率不高,也许为了达到你的目的,一开始你花了很长时间,遍历了很多地方,但也许这是你最短的路径。算法是Trade-Off,你根本不可能得到所有你想要的东西,任何选择都意味着放弃——当你想得到一些东西的时候,你总是需要放弃一些东西。人生就是一个跷跷板,一方往上,另一方必定往下走。这和我们做软件设计或者算法设计一样,用时间换空间,用空间换时间,用CAP理论,总会有很多Trade-Off,就像这句话的本义——你总是要用某种东西来交换某物。我们都在用某种东西来换取自己的未来,有的用自己的努力,有的用自己的思想,有的用青春,有的用自由,有的用自己的道德,有的人用自己的道德……有的人用金钱换取,有的在交换愿景,有的在交换经验,有的在交换地位,有的在交换能力,有的在交换有的在交换自由,有的在交换利益,有的在交换虚荣,有的在交换舒适和愉悦……有自己的算法,每个算法都有它的目的。我们用的是同一个算法,但是每个人算法中的变量、开关和条件都不一样,得到的结果也不一样。我们是一个生活在黑客帝国中的程序,我们每个人的算法决定了我们每个人的选择,而我们的选择又决定了我们的人生。原文链接:http://www.36dsj.com/archives/2757
