在开发笔记的第一篇里,我讲了为什么要开发这个系统和为什么要开源。第二篇,我想介绍一下我的开发思路。简单的说,就是用最快的速度发布最小可用产品,来验证想法的可行性。
虽然是做一个开源软件,但我把它当成一次创业来对待的。在我的上次创业经历中,踩过一个坑,就是耗费了时间和精力的一款产品,在发布完的时候,没人用。这次为了避免走老路子,我做了两个调整,为了从第一天起就建立起来反馈循环。
市场调查
我把市场调查的范围限制在我比较熟悉的领域里。我使用的博客基于Hexo框架,主题来自于Hexo-Next-Theme,所以我在这两个圈子里发了市场调查(1, 2)。结果并没有想象中的那么理想,响应的人并不多。不过还是有收获的,主要分为三个方面。其一,有些人排斥在推荐文章里使用互换连接的想法,认为这伤害了博客的独立性。其二,有些人虽然对该想法持接受态度,可担心潜在的性能问题。其三,也是我们所谓的天使用户,有一个非常乐观开放的博主乐意尝试这个想法。
除了市场调查之外,我还和朋友聊我的想法。其中一个博主朋友(法国朋友,Octopress博主)说,他愿意付费使用这个服务,另一个(法国朋友,WordPress博主)说这是一个非常好的想法。还有一个朋友(中国朋友,写过博客但放弃了),说为什么要做一款无觅已经做过的产品,后来发现无觅已经退出博客圈去做金融科技去了。显然,不同背景的朋友,有不同的想法,但都非常具有参考意义。
不论是从Hexo圈子里,还是从朋友那里,都是喜忧参半的结果。可不论如何,我找到了一个愿意和我合作把点子实现的朋友。
最小可用产品
在我上次组织的精益创业演讲里,就接触到了最小可用产品(Minimum Viable Product)的概念。其目的,就是最快的发布一个可用但功能比较局限的版本来收集用户反馈。我们的MVP是什么?
系统大概架构
系统架构,包括两部分,一是后端服务器,负责推荐算法的实现,二是前端Hexo插件,显示推荐文章列表。
推荐算法
推荐算法,大家研究的比较透,大概有三种,一是根据用户的喜好推荐,如果用户给某些文章点赞了,我们应该能从他过去的使用习惯中推算出他可能喜欢的内容。第二是内容相似法,完全抛去用户的喜好,只看内容。还有更为先进的算法,就是引入社交网络的概念,如果你的亲近朋友喜欢了一样东西,那么基于人以群分的定理,你应该也会喜欢同样的东西。
显然,只有内容相似法,有可能在一周的时间内实现。即便只基于内容,不考虑用户个性化,我们也面临分析内容相近性的挑战,吴军在数学之美里,给大家讲了如何使用余弦定理来判断文章的相似性,一个高中生就能用的余弦定理,理论上简单,但实践起来,要求我们搞定自然语言处理中的分词算法等等,所以这也不太现实。
我最终的选择,是最简单的标签对比法,具体实现可见源代码,大概意思是说,如果两篇文章如果同时被打上一样的标签,那么它们就是相似的,就可以推荐,如果没有相同的标签,则不相似。
数据收集
说完了算法,人工智能里不可或缺的就是数据。如何采集数据是必须解决的问题。这时候,很多朋友会想到要使用爬虫爬取博客文章,提取它们的标签。可这不仅在工程量上比较大,而且还需要很多的计算资源。我暂时舍弃了这个想法。由于我控制前端的实现,最简单的方案,就是让前端主动上传推荐需要的数据。这样不仅减少了工程量,而且也大大削弱了对计算资源的需求。
结语
通过最初期的市场调查,我发现产品虽然有很多阻力,但除了我之外,还是有人愿意尝试的。其次,就是通过对推荐系统的简化,我找到了在一周以内就能发布的解决方案,即便失败了,也最多丢了一周的时间,可以一试。在接下来的开发笔记里,我会给大家讲一下MVP的具体实现,其中会涉及到Spring Boot 2.0,Node.js Promise,Docker容器和服务器的选择。