之前看过一些关于算法方面的书,提到了一些最优化问题。最优化问题在现实中非常常见,比如工程设计中,怎样选择设计参数,使得设计方案能以尽量低的成本预算满足设计要求。而近年来热门的机器学习建模也是一个最优化问题,基于一组已知的数据去构建一个模型,让这个模型去适配未来未知的数据达到最优,然后求解关于这个模型的参数。
在求解最优参数的算法中,很多都有一个缺陷,就是容易达到一种局部最优点,即:参数的选择尝试收敛到了一小块范围内,无论再怎么尝试变化都没法取得更优的结果。而从全局来看,这并不是最优的选择,但算法此时就进入了一种尝试的徘徊状态,这就是局部最优点,但算法并不知道这到底是不是全局最优的。
对于我们这些自诩智能的人,在成长的路上,其实也经常陷入这样的成长局部最优点。
关于成长最形象的类比便是爬山,但爬到山顶的路并不总是向上的。
我长居成都,每过一阵就会去爬一回成都附近的青城山。像青城山这种著名景区的山,总有很多路标告诉你,沿着这条路一直走,你就能到达山顶。即使这条路有时会向下走,让你产生下山的感觉,但你也不会动摇,因为路标已经告诉你了,山顶就在前方,那里才是你的目的地。虽然成长这一路就像爬山,成长路上的感觉也和爬山相似,但不同的是,成长的路上并没有清晰的路标告诉你山顶在哪里。
有时你很幸运地爬上了一个高点,你并不知道这个高点是否就是山顶了,因为再往前走,无论哪个方向的路都是向下的,你会心下疑惑:这是要下山了吗?
即便你明确知道了这个高点便是此山的山顶,有时也会遗憾地发现原来这山只有这么高啊。就像青城山名气虽大,但山并不高,海拔只有 1200 多米。你站在山顶,虽然是此山的最高点,但你知道这不过你成长路上的局部最优点,继续前行,则不可避免地先要下山。
爬山的全局最优点,应该是珠峰顶,但不是所有人都能爬得上去的。每个人都有自己期望的一个高度,比如我登高爬山是想看看云海,但青城山的高度还不够,也许峨眉山(海拔 3100 米)就够了。
我们在成长(爬山)的路上,会进入局部最优点。一方面可能是 “山形” 所致,要继续上山的路需要先向下走,而向下的疑虑又会让我们徘徊不前。另一方面,可能是此 “山” 只有这么高了,就像青城山,你想看云海,可能就得换一座山了。
所有的局部最优点,都意味着我们爬到了一定阶段,在这个位置徘徊不去,恋恋不舍。
十多年前,我刚毕业找工作那时,外企在国内的吸引力可以相比今天互联网行业的头部企业。我也想进入外企这座 “山”,屡屡尝试,但每次都卡在英语口语面试,屡屡失败。同寝室的另一位同学则顺利进入一家国外的电信行业外企,获得的 offer 薪酬比我们平均高了 50%,让人羡慕不已。
数年后,我们同学再次相聚,听闻该外企在中国已经被当时的华为、中兴竞争的步步退缩,业务缩水不少,已有裁员迹象。当时,同学会上,都劝这位同学早做打算,但他表现为瞻前顾后,徘徊不决,还想看看情况。一年后,我当时也正在做浙江省的电信项目,该同学所在公司的系统正被我当时的公司取代,没多久就听闻该公司进入了破产清算。
曾经领先的电信行业设备服务公司,就这样退出了市场。那位同学就算曾经站的位置再好,“山” 都塌了,何谈继续攀登。这样的情况,有时主动的转身,比被动的离开可能要从容得多。
而另一个朋友的故事,经历过后再回首一看,更让人扼腕叹息,可惜当时的我也是见识有限,给不了更好且更坚决的建议与支持。
那时,小米公司刚成立不到一年,第一款手机尚未发布,正处在快要井喷发展的扩张期,到处找人,正好也找到了我这位朋友。但朋友觉得自己所在公司也还不错,也能成长,正“爬山爬得不亦乐乎”,遂放弃。
过了两年,朋友又有了另一次机会,微信来了,给了机会,但她正考虑准备生孩子,同时又考虑在当前公司已经熟悉,且业务稳定,换新公司难免需要打破现状和当前的节奏,遂徘徊一阵,选择停留。
后来再看,以前公司的最高点,相比这两座 “山”,也就相当于它们的山脚下。但有时职业的路径就是这样,我们迷茫、徘徊,正是因为 “不识庐山真面目,只缘身在此山中”。跳脱不出来,看不见 “山” 的全貌。
审视下你的当下,再回顾下你的职业生涯,你花了多少时间和功夫来看清自己正在攀爬的 “山”,它的高点能让你去到你想去的地方吗?能让你看到你想看的风景吗?有时,我们大部分的努力,都没有什么进展和结果,仅仅是让我们能勉强呆在同一个地方。
看清了自己目标的高山,发现自己爬错了山,要舍得离开;停留在低矮的山上,无论再努力,看到的风景也有限。
如何知道你正站在局部最优点上徘徊呢?当你知道自己做得很好,但却没有感觉到成长与进步时,那么也许你就正在徘徊了。
在我的成长路上,也经历过一些徘徊点,这里我分享几个这一路上关于逃离的故事。工作早期,我做银行业的企业软件开发,被外派到了客户公司的项目组。在那里,不仅仅需要写程序、查 Bug,还需要兼顾从售前技术咨询、需求分析谈判到售后技术支持,甚至包括客服咨询解答都要涉及。正常的白天(朝九晚五)是没有一刻安静的时间能写写代码的,都是在客户下班后才能有个安静时段做做编码的事情。
一年后,我有些困惑,因为我感觉自己做的事情太杂,但似乎又没一样东西做精、做深的。当时的想法是以技术立身,一年下来却不免惶惑。我感觉自己选错了山,没必要继续爬下去,因为我已经看到了当时大我十岁的项目经理也许就是这座山的一个局部最优点。一年后,我选择了逃离。
之后,该怎么选下一座山?第一考虑自然是想离技术更近,做的更纯粹一些,另一个无法免俗的考虑自然还是希望收入也能提高一些。如今回想起来,当时为了一千块的差距,纠结了半天也不免哑然失笑。最后的选择,其实也是马马虎虎,运气好的一面是选对了技术,这次不做项目,做产品了,作为程序员在里面做的工作更纯粹了;运气差的一面是,还是没选对行业。
从金融行业软件开发转到了电信行业软件开发,而当时一个新的行业——互联网,正方兴未艾。相比之下,当时的电信行业应该正在迅速步入成熟期,拥有成熟度最高且用户流量也最大的信息化系统。一入此 “山” 中,便埋头修炼技术,熟悉行业业务,直到数年后,蓦然发现似乎又到了一个局部最优点:技术无法再快速进步了,业务领域也已经熟得不能再熟了。
在原地徘徊了一段时间后,我选择了第二次逃离,但这次困惑更大。我换了一个城市,在这里找了好几个月工作,见了很多很多的 “山”,却发现居然没有一座 “山” 乍一看比之前的更高、更大,顶多和之前差不多。
我有些沮丧,我只是不愿又重新立刻去爬一次差不多的山。就像有次一早爬青城山,下午回到山脚,有人问“谁愿意再爬上去一次”一样,当然没人愿意。但如果山顶有一百万,再爬上去就能得到呢?我想这样也许会有不少人愿意吧。但现实的生活是,有时会让你迫不得已重新爬上刚下来的“山”,但“山顶”却没有任何额外的奖励。
在我的故事中,我一次次逃离,是为了什么?因为失去了成长的感觉。每一座 “山” 刚开始爬时,你会对它的风景充满新奇,会有一条陡峭的上升之路,之后慢慢失去了新奇感,而很多工作任务渐渐变成了自动化的处理,不需要学习新的技能,失去了有意识的反思,从而让成长停滞。
当然,逃离,不一定都是换一座 “山”,也有可能是换一种爬山的方式,找到一条新的路。
在日常工作中,你可以尝试问问自己,对于十年后而言,现在的工作和事情,哪些会是很重要的?哪些会让你的技能变得更好?这就需要你有意识地试图在一些你已经知道如何做的事情上,再去做得更好。如果没有这种有意识的尝试与努力,很可能你就还在原地依赖过往的经验和技能自动化地完成同样的事情。
算法进入了局部最优解,通常都是通过在环境参数中引入一些震动来帮助算法脱离,继续寻找更优点,而成长的路何尝不是呢?
有时,有人会同时面对好几座山都想爬,但因为种种原因(主要还是生活所迫)只能爬其中一座。当你站在你选择的这座山的一个高点,远远看到曾经放弃的山峰,会感到徘徊遗憾么?
进入局部最优,徘徊于局部最优,逃离局部最优,都是你的选择。而站在局部的最优点,走出徘徊的第一步,总是从下山开始,而这样的选择并不容易。
最后,能否分享一下:如今你正在爬怎样的“山”?爬到了什么位置?以及你是如何选择的?