story2

原本不再打算更新Hawk,直到去年10月的某个晚上,刚上完B站发呆的我收到了升哥的吐槽,远程他的电脑改bug。开始觉得手气不错用着太差,数据清洗的交互匪夷所思,再后来界面太丑,一种无形的力量推动我,一发不可收拾。整整十几个周末,再加上晚上10点匆匆下班进家门,改到11点钟赶紧睡觉,就这么持续了小半年。

记得Hawk3发布那天是在杭州,我解决完最后几个问题,上传压缩包,发完公众号之后,如同大病一场,在西湖边上跑了一圈,吃了顿饱饭,修了个脚,心中的石头才慢慢落了地。

这篇文章权当是发布两个月后的总结,闲扯背后的经历和思考。它是这篇《设计爬虫Hawk背后的故事》的延伸,两年之后的复盘。

1.从优化细节到做减法

有朋友问这次更新了哪些新功能?我不好意思地说,优化细节。

细节实在太重要,细节让无数人卡在最基本的操作上。如果你吐槽Hawk3界面丑,交互难用,bug多,那是因为你没用过之前的1和2,至今我都在想,之前那么多bug和“反人类”设计,别人是怎么用的。一个小问题的修复可能并无明显区别,但上百个迭代实现却会产生很大的积累,量变引发质变,从来没有刚出生就完美的事物。这一点想想QQ从2002年到2018年的变化就感同身受了。

在花了很多时间分析用户将大部分时间用在哪里,如何理解使用方法和犯错原因之后,我竟然发现,80%的用户至多只用到Hawk中20%的功能,撑死就是手气不错和少数几个清洗模块,对其余80%功能的存在都茫然不知。因此,我们将80%的改进投入在打磨细节上,增加稳定和易用性,追求大而全没多少意义。

在界面设计上,我们绘制了大量交互的草图,将重点功能予以重新组织罗列,以便鼠标移动距离变小,反复推敲了核心功能呈现的模式,让它更符合用户心智(比如数据清洗模仿了播放器设计,网页采集器则真的模仿了一个浏览器)。在采集器上搜索关键字时,会自动跳转并高亮,这些都很大程度上提升了效率。

在落地时,需要我们对细节有充分的重视;但在营销宣传和给人讲故事时,却要抓大放小,抓住重点忽略细节。市面上的爬虫软件非常多,实现的技术手段列都列不完。你的Hawk有什么能耐,用一句话就能让用户愿意去使用它呢?

这是个核心问题,我之前的答案是:即使是不会编程的用户也能低成本地获得数据。还想出一个“小芳用开源租房分析工具勇斗二房东“的营销故事:用Hawk抓取实时租房数据,判别虚假房源,一键导出到Excel和可视化分析,有段子有干货,再加上微博和微信的病毒式传播,一个能还算吸引人且反映Hawk特点的故事就讲成了。

但这还不是本质,网上不需编程的爬虫工具也有很多,Hawk还需要进一步的升级和提炼,在交互和功能上依然需要做减法。哎,做减法需要勇气。这让我想起老板的一个问题:如何用一页PPT,和尽可能少的文字,给别人讲清楚几年来做的工作?曾经认为不可能,但经过多次优化后,一页PPT竟绰绰有余。越是高端上档次的广告,惜字如金;越是乡村风的宣传,一张大红纸密密麻麻全是字。

2.软件的思维模型

Hawk是款好用也是难用的软件,但它的问题在于非常陡峭的学习曲线,刚开始你会对着界面完全不知所措,但理解其思维模型,突破临界点后,心中会浮现出“原来如此”,于是一马平川。

任何一个正经的软件,都有其主轴和思维模型: - Photoshop的主轴是图层,每个图层都有自己的透明度,特效,蒙版...最终效果是多个图层的混合。 - Excel的主轴是表格,思维模型是表格cell的计算,改变输入后,输出随之改变。

Hawk的主轴是流(迭代器,或一行行的数据),一切功能都是围绕它而服务的。其思维模型是不同模块的拼接,进而组合成更复杂的模块和任务。真正理解这个概念后,Hawk的使用顿时豁然开朗。然而,这种模型让程序员理解起来很容易,但对普通用户来说有相当大的挑战,因此Hawk还需要一次思维模型和交互的优化革命。

如何在不破坏模型,同时在易用性上达到平衡呢?VSCode作为一款非常火爆的编辑器,给了我们大量有价值的参考:一方面它极易入门,维持简单的内核,按需扩展插件,避免了不必要的复杂。另一方面它的“交互演练场”很有意思:它给了用户一组简单任务,从而快速学习操作。而这块,Hawk要优化的实在太多。

Hawk当然做不到Photoshop和Excel那样的强大稳定,但也不是美图秀秀或那些奇葩的页游的傻瓜化UI:一个大大的按钮:“开始只有一条狗,一刀9999级!”那样的突兀破坏了应有的美感,如同树上长了一个大蘑菇。

不过,想想那些使用Hawk的用户吧,他们可能是程序员,或是白领和数据爱好者,应该很少玩”暖暖“这样的穿搭养成游戏吧?既然是这样,让我们暂时继续钢铁直男风格的界面吧!

3.桌面

去年,我最纠结的是Hawk的部署和使用方式:它应该是web化的,用户用任何浏览器登录网站,即可配置数据任务,在服务器上实现抓取,灵活性不言而喻。

为此我曾学习了大量React前端知识,还开发了Python编写的etlpy,它是函数库而非Hawk一样的集成环境。虽拥有一些重要的概念和创新,但是用起来极其缺乏手感和反馈:流的概念太抽象,使用难度太高,我自己都不愿意用。它必须依赖强大的前端,而我的前端水平,做这款产品需要至少1年,工作繁忙,只能放弃。

一年以后,面对这个问题,反而有了新的理解。

先从技术层面考虑,开发web版需要重写代码,设计前端,更要租用服务器和IP地址,带来巨大维护成本,在现有条件下是很难接受;再者浏览器有沙箱限制,不少功能实现起来很困难,而桌面版反而则容易得多,桌面程序真的是邪魔么?

如果web化是绝对趋势,那为何Photoshop,各种工具还是客户端的?如果全球化是普世价值,为什么英国脱欧,特朗普上台呢?Hawk是桌面还是web根本不重要,用什么语言开发也不重要。重要的是它解决了用户什么问题。

我们再想想,2000年火的是桌面程序,后来是网站,再后来是app,再后来是小程序,可到了2017年,一个创业者说他做了个app,会有投资人感兴趣么?人们关注的点,已经不在于产品呈现的形式,甚至不在于其背后的服务,而是概念:比如人工智能,爆款文章,甚至虚拟货币,很多人连虚拟货币是啥都不知道,却为之疯狂。经济早已从实入虚,人们的关注更是”虚“到了一定境界。

再深一层说,它的想象空间在哪里?然而Hawk作为爬虫,在这个段位上已经输掉了。你说你做了一个超牛的爬虫,投资人点点头,然后淡淡地对你说“保持联系”。我们能看到一个确定的上界:成立一家几十个人的公司,每年营收上千万也不是问题,然而它最终一定会成为贩卖数据的灰色公司,标榜大数据却面对监管终日胆战心惊:这与我的梦想差距太远了。你说,再用js将其重写一遍,又tmd so what?

4.对Hawk的批评

我更愿意去听批评,因为能比听赞赏更能增进对问题本质的理解。公司的一位大神说,产品被人骂说明是好事,没人骂才可怕:差到根本没人用。

尽管我花了大量的时间来修复bug,但依然有用户反馈了至少五六个很严重的问题。我还确信,Hawk3里还有十几个严重的bug,鬼知道代码的哪个角落里藏着一个大魔王呢?我司的一位大神说,看一套软件,尤其是分布式软件做的如何,只要看单元测试的覆盖率就行了。“测试驱动开发”虽然被提过很多次,但对这种个人项目,从开始时懒惰就战胜了原则。所以Hawk的单元测试是多少呢?0

作为爬虫的Hawk,它有太多的技术问题没有解决,代理和封禁,对复杂HTML的精细化解析,验证码识别...四年前刚开发Hawk时,简单的抓取技术就能遍历全站,而如今重要数据全被几家巨头所掌握,而防爬虫技术是这些系统设计时首要考虑的,抓取的成本呈指数上升。没解决这些问题,你谈什么爬虫?其实这些问题不是不能解决,而是成本和风险,关乎Hawk本身的盈利模式和设计目的,这些我们在后面进行讨论。

其他严重的问题还包括:文档不全,示例工程极少;视频不完整,讲解速度太快,简单听一遍很难消化。因为精力有限,只能优先保证软件的质量,文档不好还可以随时更改,然而作为一款桌面软件,每次更新迭代让所有客户升级客户端的代价太大了。

其实,Hawk的关键问题根本不是桌面还是web,那只是呈现形式,而是太封闭了。开源只是开放的第一步,但作为设计者,我只能听到少数几个用户的意见,大多数人问了几个问题便消失在人海;用户独立在各自的工程之中,贡献和设计无法共享,有问题难以讨论,没有形成良好的社区环境。

人们需要一个良好的社区,去分享他们的设计和思路,然而在国内却很难找到这样的产品,博客不合适,GitHub和stackoverflow做得非常好,但其纯英文的环境在国内水土不服,不翻墙连Hawk下载链接都打不开。而微信和QQ太碎片化,没有像论坛一样的对话语境。说起论坛,现在还有多少人在上论坛呢?且论坛的维护成本也是非常高昂的。说句实话,想找一个稳定可更新的软件上传下载容器都很困难。

再次回到“客户端埋点”这个问题上,它能收集用户实际的操作和完成的任务,了解用户的真实想法,明确改进目标。只是因为成本略高,直到Hawk3也没能实现有意义的埋点功能。另外,当你满心期待地直接询问用户对Hawk的需求和反馈时,就会发现这种收集方式也是很困难的。使用Hawk的用户一定都是高效能型的,他们时间宝贵,任务众多,其对Hawk的的观感,在使用前5分钟就已经决定了:不论背后做得再好还是再差,很多人是不会有完整的观点的。因此,不要指望用户给你定义什么是“好的需求”,用户是懒惰的,而开发者则必须勤奋地通过各种手段去探索和思考。

如今各类软件和游戏铺天盖地,究竟会有多少人会对一款用完即走的爬虫软件产生用户粘性呢?更遑论产生浓厚兴趣呢?当时《金错刀》的主编一针见血地指出:收费才能产生粘性。

5.开源:打江山易,守江山难

你用开源和免费引起了用户的注意,然而作为爬虫应用,用户还是需要大量的学习和劳动才能让Hawk产生价值,他们满心希望地打开软件,期待一个开箱即用的甜品,没想到却是一大盒子零件的一脸懵逼,更难以找到像样的维护和支持,很容易想象到他们的失望情绪。曾经我对这个问题淡然一笑,现在却重新重视起来,它是问题的核心。

一款软件的成本,除了开发,大部分来自维护和支持。打江山时,将军临阵,热血沸腾,情怀可以让一群战士冲锋陷阵,我一个人小半年凭着一股拼劲就能把软件做完。然而守江山才难,要付出大量时间,当用户找上门提出咨询时,如何支持?此时讲情怀早已不够,纵然兄弟们能坚持三个月甚至半年,后面的支持又如何进行呢?

在上一篇文章中,我们谈到了开源的意义和价值。然而彼时未曾讨论的问题,是开源和商业的关系。中国传统文化讲求情怀和贡献;忽略商业和服务:不少人认为,物质才是有价值的,而服务应该是免费的,因而盗版软件横行;你能接受餐厅高额的菜价,但若服务员要求小费,一个白眼肯定甩过去了。

这一年来,我阅读了大量商业书籍,深刻地认识到,商业和开源从来不是矛盾的。即便我们打的是造福用户并做好Hawk的情怀牌,而非低俗的“赚钱”,一个合理的商业模式也是必须的:付费才能促进共赢:用户通过付费获得了更好地产品和服务,产生更强的粘性;开发者有了鼓励和经济支持,便有了更多的动力去优化它。金钱重新分配了用户和开发者的注意力,优化资源配置,直接量化了服务的价值。说直白一点,”穷则独善其身,达则兼济天下“,远没达到财富自由时,不谈盈利是违反自然规律的,是耍流氓。

任何一款产品,都要明确它的受众,讲一个好的故事,理清它的思维模型和商业模式。那Hawk的合理商业模式是什么呢?我能确认的是,像文章开头讲的故事那样,除了通用功能,它一定要走向行业定制,为房地产或金融等行业提供专业方便的数据抓取和分析服务。尽管模式如此重要,我们却依然在探索之中,至今想不清这个问题。

6.那为何继续改进它?

对一个工作压力不小的算法工程师来说,抽出大量时间来更新Hawk是极度奢侈的事情。压缩的只能是少得可怜的个人时间。那为何要继续更新它呢?

Hawk的更新升级伴随着工作后的几年的跌宕,Hawk1是处在低落时期的自我证明,2代则是状态向好后的普惠天下。到了2017年-2018年的第3代,状态则复杂得多,工作非常繁忙,一切都要tradeoff,心情大起大落,它是沉淀反思后的产物,以致从这篇文章的风格就能看得出来。

一方面,Hawk的开发拥有极高的迭代效率:在大公司,个人想推动一项决策是非常困难的,90%的环境不受控制,一个接口都要反复沟通多次,效率很低。而Hawk这样的工具,可能要一个不太协调的10人团队开发一两年,这不是没有可能。

更重要的是,它实现了远程社会化协作:以我和升哥为核心,五六个热心朋友出谋划策,我们却从未谋面。相比于公司内面对面的重量级协作,基于微信和碎片化时间的轻盈互动却充满力量:困扰许久的问题,竟然能被好友短短几个字戳地恍然大悟:没有职业压力和上下级的顾忌,创意碰撞反如泉涌。

我曾经崇尚振臂一呼的个人英雄主义,但后来的这些经历让我体会到了协作的美德。在最近的一次Hawk的线下聚会中,我提出写公众号的文章的时间不够,导致产量极低,一位在HR行业浸淫十年的朋友问道:软件可以协作,为何文章不能协作?一份充满思维碰撞干货满满的好文章重要,还是苦心孤诣却差强人意的纯原创重要呢?

时至今日,曾经一切以技术为核心的我已经走出了当时的怪圈。更加关注产品,合作,商业和人性,这才是最难和最不确定的因素,技术只是实现它们的一种手段。那篇《全链路思维》总结说:从兴趣出发的开源软件,能有机会从技术,产品甚至运营上进行思考和锻炼。我觉得这就是它对我最大的价值:有难得的机会,在较低的成本下,实现灵活的社会化协作,在小型的演练场去实现和落地想法:相比于漫天飞舞的虚拟概念,能做实际落地的事情是很重要的。

7.Hawk的终极形态

Hawk是一个C#实现的流系统,第一步要解决的是这些技术问题:

  • 支持多国语言(已完成)
  • ADSL底层代理切换,更强的HTTP功能,集成fiddler
  • 保存,暂停,断点重试正在执行的任务
  • 更强的任务管理,流控,避免封禁

这些问题想解决也不太难:如果你是程序员,应该听过flink,它是流算法的工业界标准,实现了任务恢复,异步流控,自动负载均衡等各种功能。秉承着不重新造轮子的理念,Hawk的底层执行引擎可以被很容易地替换成flink。

第二步,是将人工智能引入Hawk,我们用手气不错实现了网页采集的智能化,但是数据清洗还完全依赖于人工。通过对用户大量任务的自动学习和仿真,AI能自动推断最合理的工作流,从而简化到给定一个网址,即可完成全部任务。这项工作其实是AutoML(自动机器学习)的一部分,依赖于收集大量的用户行为和任务。

第三步,则是彻底解决被封禁的问题,还靠代理切换?那太low了。让我们打开脑洞,想像Hawk背后的概念:数据和计算。Hawk会最终形成一个去中心化的系统的一部分:

  • 按需供应的数据流
  • 通过建立规则市场,用户可以设计,上传分享任务和算子,实现共享
  • 良好的数据加密,一致性和权限管理
  • 实现类似BitTorrent的分布式系统,将任务分配给其他客户端执行,彻底解决代理问题
  • 数据可以分布式缓存共享,对网络的贡献越多,价值越高
  • 借助区块链技术,你的任务价值取决于给他人带来的价值

自来水和电能做到了按需供应,而想想人们获取哪怕是公开数据的艰难过程吧:去各个网站探索,再花大量时间去做后处理和分析。Hawk将数据彻底变成了可复用的公共资源,极大提高了工作效率。举个例子,已经有用户开发了针对不同租房网站的任务(管道),我们就能在上层轻松地将它们组合成全局租房的数据流,系统自动去重和规范化后,便可随时分析数据得到结论。其他用户还可以调用你的租房数据流,在更大层面去讨论城市和经济的未来。未来的数据源也远不止web,也能来自各类传感器,API和服务商,它最终能实现一个基于实时流的分布式数据系统,数据和信息像空气一样被每个人共享,从而产生最大化的价值。

曾经我们对这种虚拟概念不够重视,甚至嗤之以鼻。但让人目瞪口呆的新概念,从无到有的开创性工作,不才是真正有价值,无数技术人渴求的方向么?

8.献给妻子的礼物

我知道你在吐槽什么,那篇《全链路思维》的文章中提到的“辛辛苦苦开发的开源软件,发布后缺少维护进而无人问津,发布根本不是终点”。而在发布后的两个月内,这种令人担心的现象居然真的梦想成真了,近一个月,Hawk被我降级到了谷底,没有更新任何功能,几乎没有答疑。以至于这篇文章,都花了我四个周末才写完。

改进Hawk的那段时间确实艰难,过年前的几周,从周五晚上改到周日晚上,出门后眼睛都变花了,担心视力一落千丈。通常周末的工作流程是这样的,早上八点起床做到电脑前,中午花一小时吃饭和休息,再直接工作到晚上11点,只有这样才能获得足够稳定的产出。工作上的事情不能有任何闪失,很多时间都在纠结中度过。但是后来想开了,就当通关我心仪的游戏远哭5(PS4上的一款游戏)吧,游戏机从此落灰。

我只能集中地做好几件事情,一方面不能在工作上失败,否则代价巨大,另外还有更重要的事情:结婚。我大概能明白为什么老外写书和程序,都会感谢家人,因为不能耽误工作,就只能压榨陪伴家人的时间了。

婚礼的大部分细节,都交给了她和爸妈,我真的是去“参加了自己的婚礼”。我在这半年多的时间,除了一多半时间的外地出差,还把极其有限的时间用来改进Hawk。那么多个周末,我在家里顶着大油头,穿着大裤头光着膀子改代码,媳妇没有任何怨言,做好饭把热饭热菜送到我面前,还各种支持和鼓励我,我非常感谢她,Hawk是我送她的礼物。

我也感谢老板对我的支持,他对我非常认可;感谢升哥和众多朋友的支持,他们给了我继续改进Hawk的动力。只是实在不好意思,改进Hawk就像大姨妈一样,一个月抽出一整块时间,才能做出点像样的进展。生活的艰难,只有体会过才知道,我对此充满敬畏。

如果你对Hawk有任何想法和建议,都欢迎给我留言。

一切还没有结束,一切还刚刚开始。Hawk如此,生活和工作更是如此。