作者归档:贺 利华

关于贺 利华

正在学习编程,享受编程 热爱文学,闲来读读《读库》 有思想,没理想 正在学会专注

昨夜的朋友圈值得被记住

昨天是北京22年继5月份那一次「静下来」后的又一次「静下来」的一个周五的晚上,卡塔尔世界杯上伊朗🇮🇷🆚🏴󠁧󠁢󠁷󠁬󠁳󠁿威尔士,伊朗队在伤停补时阶段凭借着自己不放弃的精神和场上多一人的优势最终将比分锁定在2:0,拿到一场非常漂亮的胜利和珍贵的3分。

在居家办公一周之后,听说过有人举报自己公司恶意到岗办公的,有见过群里有人堂而皇之地埋怨「小区怎么还不封控啊,哪怕是一天也行啊,我还没有享受过不上班也领薪水的日子呢,一天都没有,就让我体验一下呗」,然后看到了乌鲁木齐的大火惨剧新闻,心中更是发涩犯堵。

到了晚上8点,提前跟公司同事们约好的「周五晚-云喝酒」钉钉视频会议开始了,大家依次进入会议,有的伙伴还在准备酒菜(可能工作刚刚才忙完),大概十来分钟后,大家各自落座,在手机屏幕前开始频频举杯。长时间不见面后,突然能一次见到这么多昔日每天一起工作的伙伴们,大家心情都极为舒畅,甚至比在线下饭馆喝酒的时候更为放得开,除了劝酒没有线下压力山大之外,大家都尤为自在。平时话多的伙伴,在视频会议中也更贫了(我也算是其一),平日里话少一些的伙伴,更是需要频频被cue才会应付几句,更多就是听着,跟着一起乐。整场云喝酒下来,有的伙伴喝了1.8L的啤酒,有的伙伴喝了6瓶啤酒,有的伙伴喝了8两53度的汾酒,也有伙伴喝了一杯茶或是一瓶大窑,最终会议结束时间在22:12,约定好解封后到岗上班得及时行乐,赶紧吃上一顿,吃一顿少一顿的。

洗漱结束后,躺在床上打开朋友圈,看到一篇篇文章和视频转发,我在这里罗列一下这些文章和视频的标题

  • 《习仲勋:应当允许人民讲话!》
  • 《路是通的,是他们不跑》
  • 《毛泽东:让人说话,天塌不下来》
  • 视频号内容外交部发言人办公室发布的《赵立坚引用美国歌曲批驳美方》,这首美国歌曲就是鲍勃·迪伦的《答案在风中飘》

也许是喝了一点酒,也许是被这防疫的种种怪象给弄的,我毫不犹豫地频频转发了多篇文章和视频,然后趁着酒劲就睡了。

早上一起来,想着看看昨天的测试结果,果然不出所料,大家所有的动作都非常有效地传达到了各大审核团队那儿,突然朋友圈又一次清净了。姑且不谈这些内容还可见不可见,我倒是觉得以后大家发内容,只要标题足够清晰有力,即便别封了被敏感了,大家的态度也完成了表达,也探测到了当局的态度和应对策略,也蛮好的。大家持续发声,也持续被失声,人总是会疯的,等大家都疯了,也许会有一些变化吧。

从现在开始,我不想等着别人帮我发声,看着别人失声,我也想发声,反正失声只是早晚,何必呢。

聊聊近况吧

昨天居家办公的时候听完了池建强和王建硕在播客节目《夜航西飞》中的一次关于web3、大理、写作、思考、创业等等一系列话题的对谈。其间聊到了一次王建硕与阮一峰的一次对谈,阮一峰在谈及其自身的个人写作更需要读者的互动来给自己正反馈的激励,而王建硕相对来说就比较享受写作过程中的自我表达和逻辑的完善,其写作的目的更多的是帮助自己的思考和凝练。

今天早上在微信视频号里看到了读库老六与陈晓楠关于写作的对谈,老六非常骄傲地「鄙视」了一下他口中的「拖拉机」为啥会不愿意写稿,他已经能从写作中找到一种与自己对话和疗愈的出路,写作会让自己放松,把自己劝开了,写完了整个人都舒坦了,跟一次健身结束后的感受很类似。

以上提及的几位,在我个人成长的过程中,或多或少都对我有一定程度上的影响,阮一峰老师很多的技术科普类文章在我学习很多新技术概念的时候给到我很多的帮助,我自己的技术类文章也力求向阮一峰老师的技术类文章看齐,想要做到用简单和确定的文字把一个纯技术领域的内容说明白。对了,想起来了,虽然我没有正经写过 JavaScript 的代码,我还是买了一本阮一峰老师的 ES 相关的书,纯支持作者(是的,我每年或多或少都会做类似的一些事情,去年和今年就为了支持推上的两个技术书籍作者,买了一本 Golang 和一本 Python 的技术书籍,实际上这两本书我压根儿都没打开读过)。

池建强老师作为微信公众号早期的三剑客之一,又是MacTalk的主笔人,我一直都是其微信公众号的订阅者,看着他从用友到锤子,从锤子到极客时间,再到现在的墨问西东。虽然期间有一段时间因为「懒投资」的事情,我把曾经不断给「懒投资」和「张磊」站台的池建强和冯大辉的公众号都取关了,最后还是都关注回来了。池建强老师的书貌似我还买了一本,虽然其中大部分的内容都在微信公众号上都读了个七七八八,还是支持了一把。池建强老师的爱好广泛,其中爱读闲书对人文学科兴趣浓厚这一点,我也沾点边,所以会有天然的亲切感,而且他也是一个不折不扣的老程序员,直到最近几年才彻底完成转身,刚好我自己也处于这样的一个节点上。

读库老六对我个人的影响可能更为深远了,我早在上大四的时候通过网络了解到了有读库这么个出版物,在我开始来北京实习后,从 2009 年开始我就成为了读库的全年订户了,直到今年每一年都没有落下,虽然大概还有一半的读库我没有读完(持续创业996留给自己阅读的时间相对较少,毕竟自己不是那种重度阅读爱好者),但是每一期的老六的语和每一年的 00 刊,我都会完整地读完,看着这个小机构一步步成长,看着一个这么传统的行业里头,一位这么没有野心的人,踏踏实实把这么一个事做到「随时可死」的状态,对我自己的触动还是很大的。我记得当年我从喜讯离职的时候,跟我的老大聊的时候,我曾经还说过我有可能会选择去投奔读库,看看那家出版机构有没有能用得上我的地方。当然最终因为手游创业元年的大浪潮给了我一些其他的机会和幻想,我就跟着我的另外一位老哥哥就投身于手游创业去了,这事儿我就抛诸脑后了,连发个邮件问询一下的动作都没做,所以可能还是不够真热爱吧,都是说来骗人和骗自己的。

前一阵子,我隔几天都会问自己一个问题,那就是我到底是个什么样的人,缘由呢就是因为我做了多年的工作内容发生了变化,我从一个技术开发人员半推半就地转成了一个产品经理,并且要带领一个已经相对成熟的产品的产品团队。这期间产生的一些不适和压力,让我开始反问自己是不是适合这份工作,人大抵都会在不舒服的时候产生一些怀疑情绪吧,至少在我这儿是成立的。所以我就写了不长不短的大概一万来字吧,用手机在「纯纯写作」里配合着「微信键盘」写完的,从自己上学开始写到就业和创业,一直到现在,甚至有点自己写回忆录的感觉了,但是我应该还不到要给自己写回忆录的时候吧,如果自己能活到平均年龄的话,而且坦白讲自己的人生历练还非常的浅薄,远没有啥实际内容可写的。

前一阵子在多抓鱼上买了一本《讣告》,目前还没有打开塑封,跟它一起下单的另一本《变局:七千人大会始末》的塑封也还没有打开,不过对于《讣告》一书早有耳闻,因着这书是读库出品的,所以通过读库的各种渠道多少听了那么几耳朵,而且播客节目《文化有限》和《忽左忽右》都有专门做过节目介绍此书,所以大抵这该书中的内容和形式有所了解,应该是汇集了经济学人杂志上刊登的一些人物的讣告出版的一本书,由于杂志篇幅和形式,大体上每位人物的讣告篇幅都会凝练为两张纸以内吧,书籍出版的时候伊丽莎白女王还健在,当节目录制的时候女王刚刚去世不久,节目中主播们还在讨论「不知道经济学人会怎么给伊丽莎白二世写这篇讣告」。

像我这般的升斗小民,徇着社会大势,通过升学一步步从农村走到城市,生活非常的具体,也很模式化,有属于个人的喜怒哀乐,更多的是淹没在尘世中的一粒沙。没有太多闪光点,生活的单元基本可以用年来计算,跟我们国家的GDP统计单元有点类似😭,咋听着好像我就是一个经济大循环中的小螺丝呢,好无力啊。

不过回到自己为何主动尝试写作,尤其以回顾自己为何会走到今天这一步来做私人的写作这个话题上来,虽然写作不是一笔写到底,而是断断续续,中间还间隔了不短的时间,大概在一个月内写完的。前半部分的情绪会非常饱满,书写的速度和流畅感也会更好,也许那会儿心中还有比较强烈的肿胀感?有些块垒亟需抒发一下子?也许吧。后半部分有点想延续前半部分把这个写作完成,但是由于工作内容的变化和自己心境的变化,逐渐进入到新的岗位和角色后,最初的那个心境已经很难直接找回来了,写作的过程中还能延续的就是逻辑。也就是说,我后半部分的写作相对来说情绪更弱,更多的是在前半部分已形成的内容中呈现的逻辑之上的延续。然后在整个写作完成之后,我会发现一次较为完整的自己回顾,自己还是会选择那些自己情绪想要突破的出口相关的高光点来完成自己的书写,而那些同样真实的,在自己潜意识里与当前情绪相关度不高的内容,还是会选择性的放弃掉,最终会出现前文逻辑非常严密,立意非常清晰,但是后文有点难以为继,逐渐出现羞于呼应的状态了。

这次书写还是达成了两个目的的:

  • 情绪的出口找到了,至少那几天自己羞于对外人诉说的情绪被化解了;
  • 拉长时间的非即兴书写能帮助自己厘清自己的思考逻辑,设置产生怀疑;

所以,我感觉王建硕老师说的那句话还蛮有意思的,公众号更适合用来输出自己比较成型的一些思考结果,而Blog就是自己的自留地,我想种点啥都可,甚至不开花不结果也不重要,重要的是过程能历练我们自己的种地技巧并积累经验,内化为我们的能力。

那么我是不是也可以这么干呢,我想试试。

记录一下自己动手恢复本站访问的琐碎

这个站点是我在 08 年来到北京实习后,自己跟着网络上的教程买了虚拟主机,请别人帮忙注册的域名,然后搭建起来的,算来已经有些时日了。

7 月 9 日,突然收到了一封 Jetpack 发来的邮件,通知我的站点已经 down 了,无法正常访问了。当时我自己尝试着访问了一下,发现确实无法访问了,当时想着反正也没啥人访问,自己最近也没啥写字的冲动,先那样吧。

然后 Zapier 隔一天给我发一封邮件,提示我站点好像没法访问了。鸵鸟最终实在是不好意思了,尝试排查一下吧。

程序员大法第一步,重启服务器。重启之后,依然未恢复,查看进程列表发现,php-fpm 正常,nginx 未正常启动,那么就看一下错误信息吧。

执行命令

journalctl -u nginx

然后我就看到这个这样的一个错误

nginx: [emerg] unknown directive "<IfModule" in /var/www/vhosts/www.7dot9.com/public/.htaccess:5

然后我就搜索了一圈,各种折腾,最终还是没能把问题解决,甚至向我的老哥们耀华发出了求救,不过可能耀华小哥哥当时也比较忙,未能自己上手(原来每次迁移或者遇到问题,基本上我都是直接丢给他,最后我只需要通过 Web 终端登录就好了),仅仅是提供了一个思路,我参考了这个思路搞了一番还是未遂。当时我就放弃了,接着当了一周的鸵鸟。

然后好心的 Zapier 依然每天给我发一封邮件提醒我「你的站点挂了噢,亲」,鸵鸟不好意思了。最终选择了一个周一的大早上来到办公室后,再次撸起袖子,这回我换了一个思路。我的想法是这样的,这个 WordPress 站点是一个动态的 CMS 系统,所有需要持久化的文章内容都在 MySQL 数据库中,所有上传的图片文件都在指定文件目录下,其他的就一个数据库配置是动态的,剩下的插件和主题啥的,我可以完全放弃不要了。这样一来,我的思路就清楚了,我可以完全把这当成一个全新的站点来配置。

为了验证我这个想法是合理的,我先把自己的站点目录 /var/www/vhosts/www.7dot9.com/public 压缩打包后下载到了我的本地,确认我的站点当前使用的 WordPress 版本是 5.9.3-zh_CN 版本后,我就从 WordPress 的中文官方站点下载了其原始版本的 ZIP 包,解压之后,我用 Beyond Compare 对这两个目录进行了对比(选择文件内容对比模式),发现确实如果所说,也就几个配置配置相关的文件内容有实质性的区别,和 uploads 目录内容需要迁移,plugins 和 themes 目录我们暂且可以先不用理会。

那么接下来,就是在 VPS 上先下载 WordPress 5.9.3 版本,解压到指定目录,然后将配置文件 wp-config.php 和 uploads 目录的内容迁移到新解压的 WordPress 目录下,这一步完成后,就需要确认 nginx 的配置是否正确指向了这个新的目录。

然后我就打开了 /etc/nginx/nginx.conf 这个文件,读到里头的内容,除了部分由 Let’s Encrypt 的 certbot 自动生成的跟 SSL 证书相关的配置之外,都是一些通用的 nginx 配置项,其中关键的两行内容,应该就是这个了。

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

然后我看了一眼 conf.d 目录下,没有任何配置文件,sites-enabled 目录下就有我老哥们耀华同学帮忙配置好的名为 www.7dot9.com 的配置文件。本次 nginx 服务无法正常启动,正式因为 nginx 启动时加载配置文件时,在处理 www.7dot9.com 这个配置文件中的这一行内容

include /var/www/vhosts/www.7dot9.com/public/.htaccess;

最终在加载这个原来的 wordpress 目录下的 .htaccess 文件的时候出现了错误 [emerg] unknown directive “<IfModule” in /var/www/vhosts/www.7dot9.com/public/.htaccess:5,具体原因我也不是很懂,但是搜索了一圈之后,发现这个文件好像是早前的 Apache Server 使用的,现在我使用的已经是 nginx 了,实际上可能已经不太需要这个文件了,所以我的想法就是完全按照 nginx 官方针对 wordpress 出的配置教程来设置我自己站点的配置。所以我就先将原来的配置给备份了,直接将 nginx 官方教程中的配置拷贝了一份,命名为 www.7dot9.com,依然放在 /etc/nginx/sites-enabled/ 目录下。但是启动后还是无法正常访问,然后仔细排查,发现其中有一处需要修改,那就是上游 php 应用服务器的配置,需要修改为我的 VPS 上运行的 fpm 的 sock 如下

upstream php {
        server unix:/run/php/php7.4-fpm.sock;
        server 127.0.0.1:9000;
}

到这里之后,整个站点就能启动起来了,能通过 wp-admin 入口登录到 wordpress 后台了。登录成功后随意点进一篇文章查看,会发现提示缺少相关主题文件的错误,这里直接将当前应用的主题修改为当前新的 wordpress 中默认打包的主题,然后再重试访问,一切如常。

开心了一下,然后再找到自己原来使用的主题,再安装应用一下,就恢复如前了,不愧为世界上最流行的 CMS,👍

【利器系列】01-Dash-开发人员的随身好字典

前文

Dash 是我开始工作有了收入之后,购买的第一款跟开发相关的软件,从 2011 年开始,「这本好字典」就一直在我手边,每每遇到不认识的「字」,打开 Dash 便是我下意识的动作。今天,我们就来聊聊 Dash 这本「好字典」。

我是 2009 年 7 月来到北京,加入超图软件开始了为期不到一年的 SuperMap Objects for Java 的 SDK 开发后,于 2010 年 5 月加入了喜讯无限,开始了自己为期 10 年之久的创业之路。从喜讯无限最初的 Android App 开发到如今的 Flutter App 开发,中间还有为期近 7 年的移动游戏开发经历,期间做过大量的 Unity3D 和少量的 Cocos2dx 开发工作。

在 2011 年,我们当时创业的团队喜讯无限从第二个民房办公地(天居园媒体村)搬到了第三个正经办公地(一路之隔安全大厦)。当时我们那个年轻可爱的创业团队中的几个开发同学大多都是同年毕业的伙伴,其中一位同学,我们总是称他为「正经梁」,他是一位非常非常全栈的折腾党,从硬件到软件,从前端到后端,从数据库到运维,基本上只要他感兴趣的领域,他都非常愿意投入巨大的热情和精力去折腾,验证自己所见所闻并形成自己的一套方法和实践,实属同辈中的佼佼者。

与此同时的我们其他几位伙伴,恰好也都是有好奇心的家伙,只是大家感兴趣的领域可能稍有不同,大家也乐于相互分享。例如「张Tree」同学就非常热衷于体验当时互联网和移动互联网的各种新奇的服务和 App(当时 App 还少得可怜,他们还在用着诺基亚的 E71 呢),在体验之后精选出来他认为不错的服务和 App 分享给我们,对于某些做得有所欠缺或者体验欠佳的友商们,偶尔还会 diss 或心疼一番,「孔雀67」同学就非常痴迷于游戏开发底层框架技术的钻研和图形学,对算法实现有一定的造诣,时不时地给我们丢一两篇很好的文章好某个实现得很优雅的开源框架或引擎的仓库地址。

在那样的环境下,我们一共是 4 位年轻的开发伙伴,「正经梁」负责后端,当时的我们后端使用 PHP 开发(没错,当年的 Facebook 主站核心开发也是基于 PHP 的),他就是那个戏称自己每天站在鄙视链顶端用着「世界上最好的编程语言」跟我们在一起玩。「张Tree」「孔雀67」和「我」,我们三个都是前端程序员,「张Tree」和「孔雀67」由于 C/C++ 的基础不错,还在我们创业之初做过一段时间的塞班(Symbian)应用开发,后面也都转到了 Android 和 iOS 应用开发了,「我」因为从一开始在 Java 编程上有些基础,所以我从 2010 年一开始就在做 Android 开发。

当时的我们四个人,开发环境都大不相同:

「正经梁」=> 自己折腾安装的黑苹果 + VIM

「张Tree」 + 「孔雀67」=> Windows + Visual Studio

「我」=> Ubuntu + Eclipse(ADT)

在我们搬到安全大厦后,趁着大家都在重新布置自己的工位和电脑,「正经梁」同学说要升级一下他的黑苹果到最新的系统,我们还一顿 diss 他,说他穷逼买不起白苹果。然后他笑称「黑苹果一样非常的稳定,没事别瞎搞,GPU 和 CPU 的能力显然性价比更高」,然后建议说我们也可以尝试一下。我随口开了一个玩笑,「你要是帮我装上,我就用,而且能不能双系统?」没想到「正经梁」一口答应了,说「刚好拿我的机器来测试一下最新黑苹果的兼容性,反正你还有 Ubuntu 作为备份」。就这样,我开始使用「黑苹果」,隐约记得当时使用的系统应该是「Mac OS X 10.6 Snow Leopard」,当时做 Android 开发的我主要使用 Eclipse + ADT,在「黑苹果」上除了快捷键需要重新适应一下,其他基本上没有明显的区别。

在开始使用 Mac OS X 之后,慢慢地除了开发之外也有一些其他的需求,很多的时候都会向我的「黑苹果」体验前辈「正经梁」请教一二,而作为一个满怀好奇心和浑身折腾欲的二逼青年「正经梁」总是能给出非常令人满意的答案。Dash 和 1Password 就是在那个时候由「正经梁」墙裂推荐给我的(那会儿我们还不咋使用安利和种草这样的词)。

Dash 和 1Password 这两款软件不愧是「正经梁」的镇机之宝,自打我开始安装这两个软件到的我的电脑上之后,就再也没有离开我的手边。这两款软件,我的首次安装确实都是从「正经梁」同学处拷贝的破解版,都在我使用不到半年之后,主动购买了正版授权,并且在往后的 10 年时间里,每每跟着版本升级再次付费或订阅。

前面叨叨叨地说了这么多,只是想交代一下我是如何接触和开始使用 Dash 的背景,虽然跟本文核心的内容没有那么大的关系,可是跟我自己有很大的关系,在此回忆和说明一下,也还是蛮高兴的。不是老说人会受原生家庭的影响吗?我这也是受到我们这个小小的原生团队的影响才接触到并开始使用 Dash 的。后面咱们还会聊到很多这种「大家毕业后第一份重要的工作会影响我们整个职业生涯」类似的话题,这就算是一个不是那么明显的稍显微妙的案例。


接下来,正文开始。

Dash 能干嘛?

引用一下 Dash 官网的描述

Dash is an API Documentation Browser and Code Snippet Manager. Dash instantly searches offline documentation sets for 200+ APIs, 100+ cheat sheets and more. You can even generate your own docsets or request docsets to be included.

我们简单翻译一下

Dash 是一个 API 文档浏览器和代码片段管理器。 Dash 可以快速搜索包含 200 多个公开的 API 和 100 多个速查表的离线文档集等。你也可以创建自己的文档集或申请官方新增对某些文档集的支持。

从这个描述上来看,这就是一个本地快查开发参考文档的工具,将大量公开的编程语言和开发框架的官方文档聚合到了一个软件中,并且在本地提供了一个快速搜索的功能。

乍看上去,感觉就这么个功能,为啥还要付钱购买呢?而且我记得当年价格应该也不便宜,至少应该是 19.99 美金这样的价格,而且每次大版本升级都需要付费升级,真的值得吗?我的回答是值,非常值,因为每次我基本都是第一时间付费升级,即便近几年我使用 Dash 的频率越来越低(说明自己基本上停止进步和学习新东西了),但是出于一种习惯和支持优秀开发者的优秀作品,确保这样的产品不会消失,我都会用自己的钱来直接投票。

下面我们来展开讲讲,Dash 到底能干嘛?

Dash 的离线文档聚合能力

在 08 年前后,我们发明了一个新词「科学上网」来应对我们的防火墙长城——GFW对某些网络资源的封锁。作为 Android 开发者的我很巧的是,我需要经常查看 Android for Developers 这个归属于 Google 的网站上的开发者资源,其中就包含了 Android 官方的开发文档,那么非常不幸的告诉你,大概率上你是无法非常顺畅地直接访问该网站的。对于当时的我来说,初入 Android 开发门道,很多类和方法都不是那么的了然,时常需要查阅官方文档一窥究竟。虽然那个时候的我也有一些「科学上网」的手段,可以参考 2014 年的我写的文章我是怎么科学上网的,这其中简单概述了多年来我为了能自由访问互联网做过的各种尝试,个中辛酸冷暖自知。

要知道,作为开发人员,无法正常访问一门开发语言(Python语言的官网曾经多年无法正常)和主流开发框架(Android for Developers直到今天依然无法直接访问)的官方文档,对于一个开发者来说,我认为这种难受是令人发指的,而 Dash 将所有在线文档都打包成了离线文档集,我们可以直接通过 Dash 提供的托管地址下载所需要的文档集资源,例如我就一定会下载 JAVA SE + Android + Python 的文档集。随时流畅访问 Android 和 Python 的开发文档,对于我来说,体验无与伦比,当浮一大白。必须给钱!

Dash 的文档本地快速索引能力

早年间众多开发框架和编程语言的官方文档站点虽说基本能做到结构清晰,文档齐全(主流编程语言和框架),但是其搜索能力相对来说都非常的弱,甚至没有。对于我们在初学某门编程语言或者某个新的开发框架时,实际上很多的地图我们都还没有点亮,我们远不知道这地图上都还有些啥,而很多的时候我们又是带着某个问题或者目的而来求索的,然后我们来到了一个官方文档的页面。我们首先看到的是诸如此类的内容:

Install Guide | Download | Get Started | Documention | References

然而这些目录式的陈列,虽然提供了类似于字典般的检索和引导路径,但是对于一个初到此地的陌生人,坦白讲我们可能连北都找不到,假设我想找一下在 Android 中如何调用接口让手机震动,我能怎么快速找到我想找的内容呢?

通常我们都是打开 Google 直接搜索 「android vibration」,当然我发现更多的同学会直接使用百度,搜索内容大致类似「Android 控制手机震动」等等,然后我们可以来看看搜索结果:

百度搜索 Android 控制手机震动的结果页截图
Google 搜索 android vibration 的结果页截图

从上图来看,我们发现使用英文搜索引擎 Google 配合英文技术关键字搜索结果会更为符合我们预期一些。然后我们再来看一下在 Dash 中的检索体验是如何的。

Dash 中搜索 Android Docset 中的 vibrate 的结果页截图

按照我的设定,我只需要输入「and:」这四个关键字先限定我只需要在 Android 的文档集中进行搜索,当我输入「vib」这三个字符后,我就能看到我想要的结果 Vibrator 已经出来了,我一个回车就直接跳转到了 Vibrator 的内容页面了。

虽然这个例子很特殊,但确实不是我刻意挑选的,我就是刚好看到我的手机放在我的手边,收到了一条消息然后手机震动了一下,我就想着是不是可以直接用「手机震动」这个特性来搜索一下。没想到结果也这么的五毛,好像收了钱一样的完全符合我想要表达的。

但是我们理智地来分析一下,实际上很多时候我们作为开发者,遇到一些疑难问题想寻找解决方案的时候,是没有这么明确的关键字可以搜索的,例如「Flutter 中如何监听手机软件盘的打开和关闭?」这样的问题才是我们日常遇到的问题,那么通常我们的解题思路会是啥呢?

我想大部分同学会直接拿着这段关键词在百度搜索框中直接搜索,然后我们也能搜索到很多中文的博客文章,通常文章的来源为「博客园」「CSDN」「简书」「掘金」这么几个地方。我自己的习惯是,先把我自己的问题翻译成英文,然后在 Google 搜索框中搜索,也并没有高级到哪儿去,大家都是换汤不换药,然后通常也能搜到好几篇文章,为首的多是「Stack Overflow」「Medium」,不少的独立博客,偶尔还会有 Youtube 视频结果。

然后大家都会点击搜索结果中的链接,跳转到别人发布的解决方案的文章去查看方案,这个时候如果对方给出的方案中提及了一些关键的类或者方法,咱们好奇心重一些的同学,可能会再拓展延伸阅读一下,通常还是再次回到刚刚打开的搜索引擎页面,再次输入新的关键字,然后重复刚刚我们做的步骤,只是这一次很有可能就会搜索和跳转到我们使用的编程语言或者开发框架的官方文档,如果一次递归还没有到这里,那么递归通常最终结束都是到官方文档这里的。

我们想想看,每次这样在浏览器不同的 Tab 页中频繁的新增和切换,最终达成我们找到解决方案,同时溯源到官方文档的这个流程是否有些过于繁琐了。有了 Dash 之后,基本上我在 Stack Overflow 就可以停止我继续搜索的路径了,通常只需要再配合 Dash 打开具体的编程语言或框架的文档,搜索一下具体的关键词,搭配阅读就能搞清楚我的问题究竟是咋来的要咋解决,以及其中的来龙去脉和基础原理通常八九不离十了。再有兴趣深度了解背后的实现逻辑,我们可能就要转入到源代码级别的阅读了,这里我们就暂时先不展开了。

Dash 提供了一种快速联想的能力

大家可能觉得👆以上咱们谈到的这两个能力确实还不错,对于一个需要快速检索离线 API 文档的开发人员来说,确实是个利器,能给大家提效不少,如果经济实力允许也有购买正版软件的习惯,完全可以买买买。

但是,我更想说的是 Dash 的另一个隐藏的能力才是让我自己最为受益匪浅的,那就是 Dash 的快速检索和反向查找的能力,在事实上提供了一种快速联想的能力,让我能做到举一反三。我还以我刚才随手举的「手机震动」的这个案例来作为切入点,我们可以看看👇下面的这张截图

在 Dash 中搜索 vibrate 的过程的屏幕动画录制动图

我们可以看到除了正是我们想找的 Vibrator 可以直接控制手机震动之外,我们还能看到跟系统设置相关的,跟音频管理器相关的,跟系统通知栏相关的,跟权限相关的关键字们。实际上他们都是一些相关联的知识点,只是散落在这个庞大而丰富的 Android 开发文档集中的不同模块里头。通过阅读这些关联的文档,我们不但能直接了解到很多关联的功能和特性,我们更探索到了很多不同的模块,拓宽了我们在 Android 开发这个领域中的全面发展的可能性。

这样类似的例子真的数不胜数,但是关键在于我们要是有心人,是有着好奇心的人,而不是一个快速消费者,来了只点一个蛋挞,吃了就走,完全不看菜单,也不想着自己可能还想吃点其他的,或者先看看了解一下,下回点个鸡翅啥的。而 Dash 就非常好地满足了我自己的好奇心,很多的时候,我就会在使用 Dash 查找 A 的同时,会发散阅读和了解 D 和 S 等等可能并没有那么直接关联的知识点,甚至又回再次回到搜索引擎,最终看了一个 Youtube 视频或者读了一篇其他开发者写的 Medium 长文,花了好几个小时。但是这样提供给我的养料和知识是丰富的,是多维的,更让我能从多方面去了解某一个特性或者知识点。这些知识点终将在我的脑子里形成勾连,最终结网,成为我的能力中的一小块。

Dash 的基本功很扎实

👆以上三点是我自己对 Dash 最为推崇的三点特性,但是其基础功能的靠谱更是前提,下面我们简单挑几个基本功夸一夸啊。

  1. Dash 的作者做了不少的脏活累活,例如把 .NET Framework, Android, Apple API Reference 等文档做成了 Dash 支持的格式,并且提供了非常快速的离线文档下载速度,请简单回忆一下安装完 Visual Studio 后再安装 MSDN 所需要的时间和那个体验;
  2. 搜索结果展示的高亮,搜索结果条目的所属模块的展示和相似结果的提醒,都非常好地提供了更多维度的信息,供开发者快速判断和定位自己想要查找的信息;
  3. Dash 支持的快速关键词匹配特定文档集索引的功能就是一个很不错的创新性的特性;
  4. 支持第三方文档接入,例如支持第三方文档源:Go Docsets, Java Docsets 等等;
  5. 与其他开发工具的集成一直都做得不错,我们常用的开发工具和场景基本都覆盖到了,例如我自己偶尔会用到的:IDEA,Visual Studio Code,Terminal,Alfred,PopClip,除了这些还有不少,至少在开发者效率上,作者还是很下功夫和花心思的,哪怕帮咱们省一秒钟,作者也是努力去做了,👍。

结语

拉拉杂杂写了也不少,一个人遇到一款软件,有很多的机缘巧合。我是因为加入了一个非常年轻且好奇心浓厚的一个团队,遇到了一些很可爱的伙伴,然后尝试了这些优秀的软件,对自己造成了一些影响,也许是改变,也许只是更加深了对自我本真的塑造,然后我成为了今天我,不算太好,也不算太坏。

作为一个普通的开发者,我有着比较清楚的自知之明,我也清楚地知道,在真实的互联网开发团队中,很多的开发伙伴们还依然在使用土法制炸弹,虽然做出来的炸弹也能响,也能以此卖得三二两酒钱,但是我想大体上大家还是希望有一些更为不错的工具和方法能让自己做的不那么狼狈,做得不那么辛苦,做得稍微体面一些吧。

希望能提供一丁点帮助,带来多一丢丢启发或思考,大家一起进步,加油。