欢迎来到本文作者“dhew”,豆瓣app。
那天我喝多了,对在场的程序员朋友很好奇。
你们是怎么坚持下来的。这个社会对程序员有那么多的误解,你们是怎么坚持下来的。那个程序员哥们估计也喝多了。就跟我讲了一个所有程序员都知道的故事。
----
一开始,只是有人想要做一个天气预报软件。想做这件事的人是一个程序员,是谁不重要。重要的是他想做的事,他想做的不是那种从气象局抓一下预测结果,再配一些小清新照片就完事的手机应用。他想从零开始,即从气温,风向,风速,云图入手,推测出接下来24小时的天气变化。
程序员们很像手工匠人,天生喜欢从无到有做点什么东西出来。这个程序员也不例外。他从气象学的基本理论开始构建了一个算法,我们姑且把它称为算法A吧。软件通过调试上线运行的那天,气象局预报下午有雨。而软件预报天晴。
对自己开发的软件坚信不移的程序员被雨淋了个透湿,于是回头来寻找bug。在反复审视自己的作品后,他把问题锁定在了算法上。并不是算法有问题,而是所依据的气象学本身的数学表达就不完备。但他没能力把这门科学再往前推进一步。他把源代码上传到github,并开了一个帖子,向其他程序员们求助,有人回复说,没办法了,上机器学习吧。
和大众想象的不一样,程序员们对机器学习抱持着一种爱恨交加的复杂感情。爱是因为它让全世界的程序员们都出了次风头,恨是因为它完全不符合程序员们习惯的思考方式。
机器学习的原理和小学生做数学题很相似。你给一个习题集,再提供一个标准答案。计算机做一道题,对一遍答案,如果错了,就重做。如此反复几百万遍,直至正确为止。通过这个反复纠错的过程,计算机会自然得出一个正确率最高的解题思路,然后如快刀斩乱麻一样解决所有类似的问题。而你甚至不需要给计算机灌输一加一等于二之类的基本数学理论。更无从领悟这个最后的解题思路到底是什么。机器学习就好像一个魔法师的帽子。程序员们只能把手伸进去掏出兔子,却无法解释这个帽子到底是连通了异次元还是怎么的。
引入机器学习后,算法的准确率大幅提升,气象局预测下雨时,算法预测为下冰雹。气象局预测天晴时,算法预测为高温警报。虽然看起来只是在气象局的结果上叠加了一个正态分布。但程序员知道这个算法已经踏上了正确的道路。训练三周后,算法在预测的即时性和准确度上就已经超过了气象局。程序员欣喜的将软件放到网上,为所有人免费提供未来24小时的天气预测,并在预测结果上加入了“更精准,更及时”的标题。意识到这会让自己丢了饭碗的气象学家们开始上电视,宣称这是气象学理论推动社会进步发展,而程序员只是适逢其会。
看完节目的程序员愤怒将算法的代码开源了。立刻就有同仇敌忾的程序员跟进并重写了代码,剔除了依据气象学理论加入的基本原则和预测方法,直接使用机器学习由零开始构筑新的算法。这一次,项目获得了一个正式的命名:天气算法。
一开始,天气算法给出的结果惨不忍睹。例如它曾预测在撒哈拉沙漠正中央出现彩虹,或在印度洋的正中央出现沙尘暴。但在两周的训练后,它就碾压了自己的前任。不但准确率更高,需要的计算单位还更少。气象学家们被狠狠地扇了一巴掌。比名誉扫地更可怕的是,他们丢了工作。
程序员们隔着屏幕互相拍手庆贺。
----
然后,粮食公司找了上来。
古希腊的哲学家曾预测当年风调雨顺,橄榄丰收,于是事先租下了所有的榨油机,并在橄榄收获季大赚了一笔。而当代的粮食公司在做的差不多是同样的事。只是规模和赌注都大了许多。他们希望这个预测软件能够提供未来三个月的天气变化,让粮食公司得以决定在什么时间用什么价格下注。
新手程序员乐观的认为这只是对现有软件的再应用。而老程序员则明白事情没那么简单。要预测24小时后的天气,只需要就特定区域的气象数据进行建模。但要预测3个月后的天气,就需要将全球气候变化都纳入模型中统一考量。此前所使用的算法是局部的。要预测长期变化,就必须换成一个整体化的思考方式。
为了说明这一点,一个擅长3D建模的程序员用粮食公司提供的天气数据做了一个全球的气候模型,带上VR头盔,就能看到一个巨大的地球,这里风起云涌,那里电闪雷鸣。冰岛的火山爆发让整个欧洲上空笼罩着一片的淡淡阴云并经久不散;上升的气温让冰山融化,冰架断裂,冰山一路向下飘移;低温洋流形成的恢弘暗影横跨整个太平洋;洋流的末端,飓风成型进而横扫整个美国东部。
部分构成整体,而整体涵盖部分。现在是未来的缩影,而未来是现在的延伸。
论坛沉默了整整两个星期,然后一名程序员上传了自己的算法。这个注定被载入史册的算法开端平淡无奇,这名程序员简单的将之命名为“气候算法”。声称他使用了粮食公司提供的历史数据进行了训练,气候算法已能预测未来三个月的天气数据。 而立刻就有好事者发现,算法预测一周后的纽约市会下一场鳟鱼雨。
这一次,混沌物理学家们也加入了等着看笑话的行列。他们不相信算法可以解决这个困扰了他们近半个世纪的问题。而后他们目瞪口呆的看着鳟鱼从天而降,在曼哈顿的马路上活蹦乱跳。于是他们也丢了工作。
绝大多数人并不关心混沌物理学家有没有工作。因为绝大多数人一辈子也没见过一个混沌物理学家。但挥舞着天气算法的大棒,在全球的粮食市场兴风作浪的粮食公司,立刻受到了媒体的关注。混沌物理学家开始和气象学家争抢登上电视屏幕机会,控诉粮食公司为非作歹,程序员们助纣为虐。
这当然引起了绝大多数程序员的反感。于是在很短的一段时间里,气象学家和混沌物理学家所使用的任何软件,从运行在大型机里的数据处理软件到手机上运行的小游戏都极容易崩溃。
粮食公司们并没有开心多久。气候算法的设计理论很快发表在IEEE的会刊上。甚至连用来训练算法的天气数据集都被人放到了github上——毕竟,程序员是这个世界上最缺乏理解,又最需要理解的群体。在几个月的封闭开发后,各种大同小异的气候算法,就如雨后春笋般冒了出来。天气不再是无法解释的谜团,而是可以购买的订阅服务。直至最后,一个想要抢夺流量的互联网公司把预测服务免费开放给了所有人。所有那些为容纳并训练各种天气算法而搭建的庞大硬件设备立刻成了资产负债表上的红字,被无情的财务人员们建议廉价出售以挽回损失。
----
幸而对算法的需求是无止境的。只是这一次轮到了大型仓储式超市。
超市经营者一直对市场占有率,商品流转率等数据斤斤计较。他们很想知道顾客们到底买什么,为什么买,怎么买。以便向顾客们推销更多东西,减少乏人问津却不得不设置的货架面积。他们向程序员们提供了在某家超市注册的三十万会员的全部信息。从顾客访问商店的频次,购买的物品清单,使用信用卡还是现金付帐,一直到是否兑换了免费的停车券,是否在超市内设的快餐店进餐等。而后又提供了通过非法途径获得的会员们的社会保险号,驾照编号,家庭住址。
程序员们首先尝试在这些纷繁芜杂的信息中建立关联。而最后得出的结果也不过是在尿布边放啤酒,卫生巾边上放酵素减肥商品之类的建议。这令超市经理们开始担心那些投在GPU,内存条和水冷模块上的费用毫无意义。虽然这些电脑部件的价格因为天气预测竞争的崩盘而跌了不少。但超市经理可能是全世界最讨厌固定资产和折旧的一群人,几乎跟程序员们对“加班”的抗拒程度有的一拼。
程序员们则开始寻求新的解决方案。他们在超市门口架设了一个摄像机进行人脸分析。每次有一名顾客来到超市,算法会自动将顾客的信息纳入数据库,或与数据库中已经存在的用户信息进行匹配。根据匹配的结果,算法将对他或她将要购买的商品进行预测。每天结束运营后,算法将比对当天数万名顾客的预测结果和实际购物情况,对算法进行修正。并在第二天开门前,按照修正后的算法再次进行预测。如是反复进行了三个月,算法对固定客户需求的预测准确率达到了96%,对非固定用户需求的预测准确率达到了76%。
但超市经营者需要的不是等顾客到超市就递过去一袋子已经准备好的商品,让他赶快付钱并滚蛋。而是尽可能的让同样的一批人花更多的钱,买性价比更低的东西,并始终不渝的购买。程序员们第一次感觉有点束手无策。超市算法已取得了阶段性成果,引入新的变量只会推翻原有的成果。正如粮食公司依靠天气算法在期货市场上大笔投资后,一些农民们开始利用人工降雨来改变预测结果。大量的人工降雨,导致对远期天气预测的准确率下降了不少。而超市经营者提出的要求则无异于要求算法主动引发人工降雨,让远在万里之外的沙漠变成绿洲。
一部分程序员更因此退出了项目,他们坚定的认为算法应当受人指挥,而非指挥人。剩下的程序员们挠了挠头,提出购买更大、更快的计算机。这得到了论坛成员们的一致赞同(就连那些退出项目的程序员们都赞同了)——所有工作了十年以上的程序员都明白这么一个道理,与其绞尽脑汁向代码要效率,不如坐下来等着硬件升级换代。按照摩尔定律,那些一直困扰着你的性能问题,自然会被更快的CPU和更大内存解决。而同时,采购硬件是一个漫长的过程,程序员们由此获得了额外的时间来排查问题。
一个大型计算中心在加州的荒芜海岸边拔地而起。拔地而起这个形容方式并不准确。因为所有的计算机都位于海底,拔地而起的是为设备供电的太阳能电池板和输电设备。至此程序员们已没有理由再推脱,只能把算法丢进去,并祈求计算之神保佑。
计算中心运行了整整一个月。算法吞噬了所有用户信息,货架调整记录,定价和销量的历史数据,并生成了一个意义无法辩明的关系链。运算排出的大笔热量,导致这一区域的海水温度上升了0.1度,甚至部分延缓了季风季节的到来,让太平洋另一侧,安达曼海的渔民们获得了丰收,也让天气算法的预测准确度再次下跌了0.1%。
最后,这个被命名为超市算法的新玩意给出了一条前所未有的复杂建议,从货架间距,物品的摆放顺序到价格标签的变化规律无所不包。其繁琐程度让超市经营者们无比信服,并立刻推动执行。位于纽约市郊区的一座大型超市进行了全面改造,引入了全自动的分货上架设备,以及可快速调整价格的电子价签,所有在职人员接受再培训,整个超市停业三周再重新开张后,净利润由原先的0.5%上升到了3%,并随着算法的不断调整和更新,一路朝着5%高歌猛进。于是超市经理们也加入了失业大军。
----
政客们终于注意到了这个与人工智能有关的项目。他们发来询问,是否能在竞选领域内引入算法。
部分程序员们退出了项目。他们并不介意算法为顾客买什么东西提出建议(因为大多数人确实需要建议),但非常介意算法为选民如何投票提出建议(因为投票似乎比买可乐还是买雪碧更重要)。而那些认为投票和买可乐一样重要,或者一样不重要的程序员们接下了这个活。因为只要稍微研究就能发现,这些政客提出的需求只是对现有算法的简单复用。毕竟竞选与超市管理没有什么差别,其目的都是让顾客花更大的价钱,买更廉价的东西,并且越买越多,越买越自信。不过一者用钱买,一者用选票买。
程序员们开始喂给算法各种各样的数据,一部分数据,即民众的经济状况,消费情况,在为超市提供支持时已经获得过了,甚至连去除脏数据的工序都省了。而另一部分数据,即所有选民的政治立场,投票记录,犯罪记录,受教育程度,完整的报税清单,生育记录,亲缘关系,社会关系,则由政客们提供。经过行政机器长达两个世纪的维护和整理,这些数据已非常精确而完备。导入的步骤并没有花多少时间。可生成结果时却出了问题。
竞选经理发来热情洋溢的邮件,称赞算法给出的建议非常明智,几乎是他们所能想象出来的,覆盖绝大多数选民意愿的最稳妥的选择。但一个无可辩驳的稳妥选择毫无意义。竞选者们需要的是在整个竞选过程中,持续不断的,能获得最大关注和最多支持的无数个选择。
程序员们这才意识到问题所在,政治不同于超市。当顾客进入超市时,其购物欲望与其面对的货架摆放将直接导向结果——放进购物车或不放进购物车,这是个一次性的判断。而竞选是一个持续演进的动态过程,是一个信息与反馈不断交织,直至最后以投票方式得出结论的长期过程。算法需要在这个长期的动态的过程中,反复多次向选民提供信息,不断强化印象,直至选民投出那神圣的一票。
幸好在解决天气问题时,程序员们已经找到了解决问题的办法。他们结合了天气算法和超市算法,获得一个了新的,能够在一个动态系统内主动给出操作建议,从而影响远期结果的算法,并毫无创意的将这个算法命名为,政治算法。
政治算法的上线,除了导致大批竞选经理的失业外(没有人真正喜欢竞选经理),还将竞选彻底变成了金钱游戏。能够租用大型计算中心运行算法的竞选者们天然具有优势。而当所有参选者们都希望租用计算中心以获得算法支持时,计算中心的租用价格自然水涨船高。于是很多参选者从算法获得的第一条建议,是放弃寻求算法的支持,把省下来的钱拿去投放广告。这一建议的明智之处立刻获得了所有人的理解和认同,进一步加强了参选者对政治算法的渴求。
于是,全球所有的互联网用户,都不得不面临这样的窘境——只要有大型竞选开锣,用于支持整个互联网运转的计算资源,就立刻被竞选算法剥去一大半。而剩下的计算资源经过垃圾邮件、黄色视频、在线游戏和购物网站的盘剥后,只剩下指甲盖大小的一丁点。幸好绝大部分互联网用户只需要视频、游戏和购物。而剩下的那些,没有互联网也能生存。
----
第一位依赖算法竞选的政客登上总统宝座后,立刻推动立法,禁止在政治领域内应用算法。这一立法虽然获得了政客们的一致支持,却只导致了政治算法的完全地下化。由于资源配置的不公开和不透明,在大选期间租用计算中心的价格如火山爆发般飞升。互联网能够使用的计算资源被进一步挤占,差点连那指甲盖大小的一丁点都不复存在。差点连论坛都无法登入的程序员们,展开了对垃圾邮件的复仇之战。然而哪怕新的邮箱过滤算法筛掉了90%的垃圾邮件,节省下来的那些计算资源,仍然被政治算法吞噬殆尽。这让习惯了利用系统冗余资源跑一点自己的小项目的程序员们不得不开始反思这样的一个问题,算法的存在,到底意味着什么。
一部分程序员不再相信“算法是中立的”,因为算法是一个威力巨大的武器,什么人会需要威力巨大的武器呢?当然是邪恶之人。那么为邪恶之人铸造威力巨大的武器的人,当然也是邪恶的。
另一部分程序员认为前者纯粹是日漫看多了。粮食公司可以依靠算法投资全球粮食市场;农民可以使用算法对抗天气灾害。政客们可以利用算法登上权力顶峰,选民可以使用算法厘清竞选资金来源。程序员无法决定什么人,为什么使用算法,但可以决定用算法来解决什么问题。
还有一部分程序员发出无情的冷笑,你们真的能决定用算法来解决什么问题?
这让所有人都陷入了沉默中。
说实话,成型的算法已经不是任何人能够理解的了。它像一个由无数根小钢棒构成的黑箱子。上面有一个小孔。从小孔里丢下一个小钢球。小钢球一边朝下坠落,一边撞击小钢棒并改变方向,直至最后落进“大雾”,“鳟鱼雨”,“在泡椒凤爪边上放啤酒”,“针对亚裔移民投放一个与教育有关的广告”之类小格子里。程序员们只是设计了这样的一个黑箱子,然后让算法自己去调整钢棒。他们其实并不知道每一根钢棒的具体位置,更不知道算法是如何如何调整这些钢棒的。从引入机器学习让计算机自行生成算法那一刻起,程序员们就已无法理解自己的造物了。
但它毕竟是我们创造出来的。不是吗?
最后,一小部分程序员们跳了出来,开发一个算法的真正意义,不在于这个算法的运营机制到底是什么,也不在于要用这个算法去解决什么问题,而在于这个算法本身所具有的可能性。这种对可能性的探索,才是这个项目的真正意义所在。就好像一座山在那里,因为你不知道为什么会有这座山,不知道登上山顶会怎样,所以就不去攀登了吗?
虽然程序员们可能是世界上离山最远的一群人。但这个观点却得到了全体程序员的一致赞同。在一片欢呼中,程序员们提出了一个宏伟的计划,要开发一个囊括世间万物的算法。将物质的流转,人的取舍,都放入这个巨大的黑箱中。他们不再纠结一个不可知的黑箱是不是对程序员尊严的挑战,也不再考虑是否会有人使用这个黑箱为非作歹。把这个黑箱做出来,剩下的事都可以之后再考虑。
----
这个“万物算法”的项目,开始通过邮件组,博客,论坛在程序员之间传播。并逐渐变得清晰起来。
当然,这个算法不应该去预测原子在碰撞五十次之后的位置之类的问题。一方面现有的计算资源的总和都不足以计算出问题的答案,一方面类似的计算毫无意义。程序员们需要的是不可预测之上的可以预测,是基于混沌世事之上的规则和结论。从一开始这个项目就不考虑从微观态反推宏观态,而直接向宏观世界寻求规律。
就连那些从未接触机器学习的程序员们,也被这个计划所吸引。抛开职业分野(是的,程序员也是有职业分野的)和知识鸿沟(是的,程序员也不是都会修电脑的),他们单纯的对这个项目感到好奇,并寄望于这个项目为程序员们的职业生涯赋予意义。他们相信万物算法的开发成功,意味着程序员们终于能坦然面对身边纷繁芜杂的现实世界,毕竟除了他们,再也没有任何人将整个世界握在手中,而又不为人所知。
为了推进这个计划,程序员们开始攫取一切能弄到手的运算资源。他们用各种项目的名义向全球所有计算中心提交运算任务。在所有色情网站和垃圾页游上植入木马以获得观看者的本地计算资源。他们甚至违背原则发送了大量的垃圾邮件将许多贸然点开链接的用户的电脑变成了并网计算用的肉鸡。只是在是否要挤占在线游戏服务器的问题上,他们爆发了争论。部分程序员以退出整个计划作为威胁,才为魔兽世界服务器留下了50%的运算性能。
于是,几乎所有的计算机,从埋在水底的超级计算机,到咖啡馆里的苹果笔记本,从亚马逊的在线服务器,到高中生们在课间偷偷打开的手机,都自觉或不自觉的被卷入到了这一宏大而近乎无止尽的运算中。它们所耗费的电能和额外制造的热量,不但让一些运行不良的电网走向崩溃,更让天气算法的远期预测结果出现了接近5%的偏差。
关于计算机运行速度变慢,与服务器断开链接,看视频的时候一卡一卡的之类的抱怨充斥着整个互联网。而所有程序员都对此保持缄默不语,或者以此为由要求建造更多、更大的计算中心。一部分从程序员转行的产品经理注意到了曾经的同僚们的疯狂举动,然而在他们来得及得出结论或发出警报前,就已经被算法本身灭了口。当然不是物理毁灭。只是他们登入的网站被断开连接,打电话时会发现不在服务区,发出的邮件被告知收件人不存在。他们在绝望中拍下的“疯狂程序员想要统治整个世界的”警告视频,倒是被几名程序员传到了网上,作为人畜无害的程序员们屡次被迫害的证明供人嘲笑。
这样无止境的计算了三个月,全球互联网在崩溃边缘擦擦蹭蹭数次之后,计算终于得出了结果。算法生成了。程序员们按照其不同的宗教信仰,对这一刻进行了描述,从“hello world”到“越过长城,走向世界”,从“我是alpha,也是omega”到“天上地下,唯我独尊”。从“Armageddon”到“42”,不一而足。然而直至这时,他们才发现一个尴尬的问题。
我们要用这个算法干什么?
当然,它能回答一些,明年的总统会是谁?南美的雨林会不会在接下来的50年内消失。东京的房价在未来10年的走势如何之类的问题。但程序员们其实并不真正关心这些问题。
经过了争辩,论战,不记名投票,刷票,加入防作弊机制并重新投票后,第一个提交算法的问题是:“什么是最好的编程语言。”
算法回答:“请定义好。”
程序员们沉默了。并在长久的争论后,放弃了这个问题。
第二个提交给算法的问题是:“哪些编程语言会在二十年后被停止使用。”
算法回答:“全部。”
程序员们再次沉默。部分程序员建议投票决定是否干掉这个算法。而一些不死心的程序员们则提出了第三个问题。
“现存的哪些语言将被使用的最久?”
算法回答:“汇编语言。”
于是大多数程序员都投票赞成干掉这个算法。只有少数经常跟底层打交道的觉得这个算法仍有存在价值。
第四个问题是:“汇编语言被停用前的使用目的是什么?”
这个问题,显而易见,是那些不支持汇编语言是现有编程语言中最长寿语言的程序员们提出的。
算法回答:“教学。”
在其他程序员的哧哧笑声中,汇编语言的使用者们也投下了赞成票。
----
于是这个诞生没有多久的,关于万物的算法,在回答了四个问题后就被关闭。其核心代码被压缩成一个大小为32.17T的压缩包。所有被挤占的计算资源都被还给了计算中心,个人电脑,游戏机和手机。互联网松了口气,又开始苟延残喘。
程序员们又开始响应需求。
绝大部分是一些被重复过无数次的,没有挑战的需求。例如电脑蓝屏了,网络连不上了,这个页面要改一下,新的苹果手机无法适配了什么的。一小部分是尝试解决某个特殊领域内已经被解决过但解决方案并没有被放到网上的问题。只有很小很小很小一部分,是关于效率的提升,资源的最优化配置,关于生产力的解放。
程序员们坦然接受了这一切。
他们从未想过要解开压缩包。
他们曾登上世界之巅,所以能心平气和的走在马路上。
应程序员朋友的要求,追加恶搞的结局二:
结局二:
等等。
在算法即将被关闭的那一瞬,一个程序员突然提出了这么一个问题:“这个算法能帮我找女朋友吗?”
所有人都沉默了。三十秒钟后,一个新的投票窗口上线。这一次,几乎84.97%的人都赞成使用算法开设一个专为程序员服务的婚恋介绍机构。而没有投赞成票的那些,则被标上“人赢”的tag,剥夺了投票权。
于是,这个囊括万物的算法,再次轰轰烈烈的运转起来。它首先筛选出了大量的测试、UI、UE、前端妹子。但却无奈的发现,哪怕把女性策划、产品经理和项目经理都加入到备选名单里,仍无法匹配单身程序员的庞大数量。
“所以,你知道了吧?”那名程序员停止了叙述。
“知道什么?”我下意识的反问道。
“为什么所有人都该学习编程,以及为什么编程能力会和女权、平等、社会地位等因素挂钩。”
“为什么?”
那名程序员看着我,脸上露出了微妙的笑容:“呵呵。”
(全文完)
本文作者“dhew”,现居上海,目前已发表了33篇原创文字,至今活跃在豆瓣社区。下载豆瓣App搜索用户“dhew”关注Ta。