从三件小事上谈谈至少提出两种方案的重要性

Photo by Pixabay from Pexels


前段日子要实现一个推荐算法,其中需要实现一个功能:把出id(某个标识)下的所有类目id。

由于当时没有标识id与类目id的直接对应关系表,所以计划将id与一级类目id在代码中写死,然后通过类目id之间的层级关系获取所有类目id。

忘记当时是怎么想的,我写的代码是这样的:

val catLevel1idParentid: RDD[(String, String)] = sc.parallelize(List(("catid1","id1"), ("catid2","id1"), ("catid3","id1"), ("catid4","id1"), ("catid5","id2")))

也就是把一级类目id和标识id一个个关联起来。

当时只需要两个标识id和5个一级类目id,所以也没觉得有什么问题。但后来把标识id扩展到10个,一级类目id数量也翻了几倍,问题马上就显现出来了。

后来我就改成了下面这样子:

val catLevel1idParentid = sc.parallelize(List(("id1","catid1:catid2:catid3:catid4"), ("id2","catid5"))).flatMapValues(_.split(":"))

较之前的写法,这种方案更简洁,也更易读,也不容易出错。若是别人看前一段代码,他一定会问哪个是标识id,哪个是类目id。而后一种就不会出现这种情况,别人也能一眼看出各个标识id下的一级类目id的数量。


类目id之间是有层级关系的,有时需要获得一个catid的所有上级类目id。

原先的函数核心部分写了七行,而且刚开始接手时我确实是没看懂。

后来我改成下面这样子:

/**
  * 获得 catid 的所有上级类目id
  * @param catid2parentid catid -> parentid
  * @return cate_levle1id:...:catid
  */
def factorial(catid2parentid: Map[String, String],catid: String): String ={
  if (!catid2parentid.contains(catid.split(":")(0)) || catid2parentid(catid.split(":")(0)) == "-1") catid
  else factorial(catid2parentid,catid2parentid(catid.split(":")(0))+":"+catid)
}

核心部分只用了两行,而且便于理解。


有时候作为最后的填充,或者是作为冷启动项目使用,需要给每个类目id推荐GMV最高的一个商品。

最初接手的代码中是用spark sql完成这项功能的。统计好每个商品的GMV后,使用row_number 函数获得排序值,并选取第一个商品。

由于spark sql对内存的要求更大,运行效率比RDD低些,所以后来我把代码中的sql改成了RDD。

为了完成这项任务,我用reduceBykey函数把同一catid下的商品聚合起来,再对这样聚合的商品列表按GMV排序(sortBy),然后选取第一个商品。

当时根本就没想到这样做有什么问题,想法也很简单,就是使用row_number的功能,然后选取第一个商品。

后来意识到,我压根不需要排序。我的目的只是获得GMV最大的那个商品,使用maxBy函数就行了,没必要做多余的事情。

总结
我们接到一个需求时,脑子会蹦出一个想法。很可能后面就会按照这个想法去实现,即使这个想法并不合理,但当时是不会想到有什么不合理的地方的。

就像一、三先说的那样,其实我至少能想到两种方案的,但仅仅是由于第一时间想到是较为低效的方案,我就按照这种方案实施了。

像二中的写的代码,其实也很简单,原先的同事肯定也是能写出来的。但也许就是因为当时想出的方案是那个样子,后面也没想过其它的方案,就写出了一段让人百思不得其解的代码。

问题的根源既然是自己的惰性,那么解决方案是每次实现某个新功能时,至少提出两种解决方案,逼自己停下来先想清楚,这就大大降低了出现上面这些情况的风险。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,045评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,114评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,120评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,902评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,828评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,132评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,590评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,258评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,408评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,335评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,385评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,068评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,660评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,747评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,967评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,406评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,970评论 2 341

推荐阅读更多精彩内容

  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,872评论 2 89
  • 我拥有一个很美好的家庭,是很多人都拥有的那种平平淡淡却无比美好,令人艳羡的四口之家。 我的家被我的母亲撑着。我的母...
    雪荫阅读 424评论 0 3
  • 七绝•四首 埝坛公园之春 寒亭园静平波亮, 萌草灵湖柳树黄, 桃水沉鱼听暖日, 河开冰化又春光。 埝坛公...
    青山野渡阅读 404评论 9 3
  • 今天前几天来个朋友,今天早上回去,我们给他拼了车,定好早上9点多的车,工作告一段落,我发现微信上他发过来说上车了,...
    三三蜗牛阅读 320评论 0 1
  • 一只可爱烁阅读 228评论 0 1