从前有一个傻呆程序员,他老婆交给他一项任务:“去买3斤橙子,买最大最甜最便宜的脐橙”。
普通人买水果直接去店里就买了,但程序员不同。程序员心道:“大,好分辨,甜,不好分辩。水果店老板肯定不让每个橙子都试吃一下的”。于是问Siri,Siri说:“一般橙子屁股上有脐圈的,是母橙,母橙比较甜”。就这样通过调研,甜度辨别的技术难题解决了。
接下来程序员开始策划去哪里买。经Siri调查,小区里共有4家水果店。程序员心道:“这4家店每家都可能卖橙子,也都有可能是最便宜的。如果冒然去了A店买,而C店才是最便宜的,就失去了做事的严谨性,回来可能挨骂。严谨的做法应该是货比三家,每家都看看并把价格记下来,然后选一家价格最低的购买。但是,应该先去哪家看价格呢?理论上应该先去离家的店,最后去离家最远的店。”
经大致估算,4家店按离家距离排序,依次是ABCD。程序员应该先去A店。但估算毕竟是不严谨的,于是程序员请出百度地图,在地图上一一标上家和4家店的GPS坐标,再以水果店的GPS坐标分别计算离家的距离。最后得出结论,顺序依次是CABD(因为C店是直接距离,店距离排序逻辑略)。
于是程序员去C店,得到一个结果,然后又分别去ABD各店,最终得出A店返回无穷大。A店可能没有脐橙或有效货存不足。其它3家店,B店最便宜。程序员决定去B店购买。此时程序员老婆打来了电话,说“叫你买个橙子怎么去这么半天!”,程序员道:“目标已经锁定,即将完成任务”。
程序员到了B店,不敢耽搁,马上开始了选脐橙的逻辑:
半小时后,程序员拎着水果回到了家。老婆骂他:“怎么买水果比种果树都慢!”程序员开始反思,这个买水果的流程是不是还有很多优化的空间?
第二次买橙子时,净化数据源与冒泡排序这两个循环,程序员将它们合在了一起:
由于减少了时间复杂度,并且略去了第一次技术调研、系统架构的时间,这一次只用了20分钟,但老婆大人还是嫌慢:“别人买水果几分种,你买水果20分钟!”
第三次买水果,程序员不再使用单只手的冒泡排序,而使用两只手的快速排序法,左手向右比较,右手向左比较(算法过于复杂,不作伪码展示了)。这次用了15分钟,但老婆大人仍然不满意。
第四次买水果,程序员优化了进店询价逻辑。前几次买水果,程序员要了老板的微信,这次出发前先给4家老板群发了一条微信息:“老板,今天脐橙还有没有,多少钱一斤?”
这次用多线程问询,替代了之前的单线程走路问询,只用了5分钟就完成了任务。老婆满意了。
程序员感叹道:“程序优化果然是无止境啊!但貌似目前的逻辑还可以再优化,譬如历次购买水果第一优先选择基本都是B店,下次可以直接去B店。在去的路上向4家老板发微信询价,大概率答案还是B店。如果不是,进店前还有时间调整路线,这是执行与问询的多线程。”
你能从这个程序员买橙子的故事中,看出编程难在哪里吗?
2018年12月29日
本文首发于微信公众号“艺述思维”:从前有一个傻呆程序员,老婆交给他一项任务,他办了四次才满意