测试驱动开发的实际收益

我并不试图系统地谈TDD,因为我在这方面的经验还不足以做到这一点。但是TDD的一些方法论和工具确实解决了我在实际开发过程中遇到的一些问题。

第一个问题是健壮性。尤其是对于我这样思维发散、容易迷失又喜欢重构的人,TDD给了我一个明确的目标,在一切刚开始的时候,我要做的只是满足测试用例,让它们由红变绿。到了重构阶段,我就可以把精力放到优化代码上面,且不必对健壮性有过多的担心。在此之前,由于手动测试比较麻烦,很多时候惰性会说服潜意识告诉自己这部分逻辑很简单、不会有什么bug,结果提交测试后却一再地发生问题。

第二个问题是效率。曾经只有不忙的时候才会写测试用例,但是现在一般都会写,因为确实可以提高开发效率,而不只是保证重构的健壮性。可能对于所有对单元测试不熟悉的人来说,这都是匪夷所思的,我也曾认为单元测试只是用来保证健壮性的,必然和开发效率是一对矛盾,因为要花很多时间写测试代码。这种想法首先是因为对单元测试不熟悉,所以才需要花很多时间在上面。其次是没有看到它所带来的好处。

例如你要实现一整套退款单的功能,退款单是依赖订单的,这意味著你需要不只一条符合条件的订单数据。但是订单是有状态的,随著时间的推移、人为的操作或者开发过程中程序的影响,状态会变得不再符合你的要求,这时候你就必须停下来去做更多符合要求的订单。而创建订单也存在很多麻烦,你需要找到有库存的商品,有时候还要去库管系统中补充库存,然后下单并支付。最后花了很多时间做出来的订单,因为正在开发的退款单的程序出现的一个小问题变得不能使用!时间被大量浪费在创建所依赖的上游数据上。

这时候如果用单元测试并mock出依赖关系,就可以随时随地、无限制地执行相关的业务逻辑。对效率的提高不言而喻。

特别的,mock并不是随时可以抓起的救命稻草,它的原罪在于:不负责任地滥用mock会导致很多问题被掩盖。因此,对mock的使用应该是节制的、目标明确的。

当然,这并不包括单纯地为了提高代码覆盖率而使用mock,只所以这是个在很多强制TDD的团队里的普遍现象,归根结底是因为KPI是万恶之源,任何好的方法论,一旦沦为KPI,就离死不远了。

BaiduPCS:当前最好用的百度网盘下载工具

BaiduPCS是个命令行工具,用于下载百度网盘中的资源。之前用的是浏览器插件,需要先创建分享,再拿到下载链接,最后用下载工具下载。这个工具可以直接执行一条命令下载指定的资源,非常方便。

这里有安装说明,然后按照使用说明操作即可。

iOS垃圾短信过滤器:熊猫吃短信

“熊猫吃短信”是个新上架的App,用于过滤垃圾短信。据说是基于机器学习训练出来的,用了一周,识别得非常准确。

之前用的腾讯手机管家,即使把“精准识别”、“上传到云端”等选项都打开,还会有漏网之鱼,而且会牺牲隐私。这个App声称不会主动上传短信。最重要的是,这一周里所有不关心的短信都被过滤掉了,而且没有失误。

全新Kindle Oasis使用感受

fullsizeoutput_358

早在Paperwhite 1的时候我就不喜欢它的工业设计:边框太宽,屏幕内陷。此外,非人体工学设计和没有实体翻页键导致单手握持体验很差。再有就是做工的问题,机身表面接缝处缝隙明显而不均匀、通体强烈的塑料感。然而还是从一代用到了三代,除了kpw是kindle全系列里性价比最高的产品线之外,还有就是没有其它任何一款产品解决了kpw的主要问题。

例如Voage,虽然屏幕不内陷了、楔形机身优化了握持感、增加了翻页键,但整体的设计只算是在kpw基础上的优化,何况各项硬件配置和kpw3几乎无差。

后来当第一代Oasis发布的时候,看了第一眼就瞬间失掉了兴趣。捆绑的充电保护壳绝对是体验杀手,装上壳比kpw还要厚重,不装的话本体的续航又很差,频繁拆装也很不方便,这样的体验连kpw都不如。所以我很不看好它,果然很快在今年六月就下架了。

十月刚看到新Oasis的消息时,马上觉得这回终于有买的价值了。

首先是7寸的屏幕,瞬间和其它产品线拉开了距离。更大的屏幕意味著能展示更多内容,增加了宽度后也更接近实体书的观感。

工业设计相对于我的kpw3当然是有了质的改变。玻璃材质的纯平表面,金属背壳,没有了kpw的塑料感,显得更精致。得益于窄边框,7寸屏的机身长度比6寸的kpw还短。虽然因为加宽了屏幕和增加了单手握持的边框导致机身宽度超过kpw很多,不过在平时携带中并没有造成很多困扰。

单手握持是ko系列的主要卖点,实际使用体验当然很好。为握持设计的宽边框加上实体翻页键非常方便。虽然因为加大屏幕和增加续航导致194g的重量远远超过1代的131g,但还是比kpw轻了10g,而且主要重量集中在单手握持的一边,杠杆效应很小。配合重力感应,随时换手可以有效缓解疲劳。当然,作为长时间单手握持的阅读设备,重量自然越轻越好,这一点上,ko还有很大优化的空间。

此外,新ko的做工远远好于kpw,没有了廉价感。12颗背光灯使得背光的均匀度比kpw强了很多,几乎不会有kpw上明显的光影。性能上是现在kindle全系列里最高的,翻页时虽然还会看到闪屏,但比以前已经快了很多。自动亮度调节算是个聊胜于无的功能吧。至于防水和有声书,我没有这方面的需求。

如果说缺点的话,还是续航。虽然相对于1代本体,续航已经达到可用的水平,但是对于被其它产品线惯坏的我们来说,新ko电量的消耗还是快了点。我没有精确的对比,但是能明显地感觉到比kpw掉得快不少。

清洁手机的最佳实践

以前的做法是先用湿巾清理,再用纸巾擦干。后来屏幕的触感逐渐不如开始时顺滑,也更容易沾指纹和灰尘,而且不容易清除。估计应该是湿巾的酒精会腐蚀屏幕的涂层,纸巾粗糙的表面也会造成磨损。

现在先用软毛刷扫除灰尘,然后用3M魔布擦拭。效果应该会更好。

Firefox Quantum:狐狸的反击

不知不觉已经很多年没有用过Firefox了。在Chrome发布之前,这只狐狸以一己之力扛著互联网承前启后的大旗。后来被Chrome在网页加载速度上吊打,逐渐式微。之后还在用Firefox的人一般也只是因为受不了Chrome的内存占用。

Firefox Quantum刚发布的时候我就安装了,以为是个全新的项目,新项目初期往往特性不健全,所以就没有太多关注。

然后发现版本号接续了旧版,也兼容原Firefox的插件,所以就装上几个必要的插件,尝试了一下。新的UI借鉴了Chrome,不像原来那么过时。最重要的是内存占用和网页打开速度比Chrome有优势。如官方宣传语所说——快而不俗。

准备把默认浏览器改成FQ,用一段时间看看。

Vim最好的PHP语法高亮插件

StanAngeloff/php.vim应该是目前最新、最全的PHP语法高亮插件了,它解决了旧版本无法高亮@throws的问题。

默认会把方法注释全部当做普通注释显示,也就是没有高亮,需要专门做配置:

1
2
3
4
5
6
7
8
9
function! PhpSyntaxOverride()
hi! def link phpDocTags phpDefine
hi! def link phpDocParam phpType
endfunction

augroup phpSyntaxOverride
autocmd!
autocmd FileType php call PhpSyntaxOverride()
augroup END
iPhone X官方硅胶保护壳使用感受

我相信所有注重体验的人都不愿意用保护壳,我也一样,所以用iPhone 6的两年多里绝大部分时间也都是裸奔。

对于给X加壳这件事,我是很矛盾的,然而面对这个既易碎又碎不起的东西,贫穷限制了我对体验的偏执。

对于壳的选择,我有这些考虑:

  • 防护性好:毕竟这是加壳的唯一目的,所以那些超薄的壳就在考虑范围内了。
  • 易装卸:只有出门时会加壳,在家要去掉,所以这是个很频繁的行为,既要容易操作,又要不伤手机。
  • 易维护:方便清洁,所以皮质的就不考虑了。
  • 贴合度高,触感好:体验还是很重要,软壳一般很难做到这一点,所以范围限制在硬壳上。
  • 外观简约。
  • 材料安全。
  • 试错成本低:少花冤枉钱,节省时间精力。

符合这些条件的就只剩下官方硅胶壳了,然而我还是在颜色的选择上纠结了很长时间。因为硅胶壳容易粘灰,所以越是浅色越不明显,然而深色可以减少和X黑色前面板的割裂感。最终选择了钴蓝色。

IMG_0008

IMG_0009

用了一周的时间,完全符合预期。

电影《疾速追杀》

上周看了《疾速追杀》和《疾速特攻》,后者是前者的第二部。

情节比较老套:一个因爱退隐的职业杀手,在妻子病逝、黑道欺凌下,不得以奋起反击、与整个杀手行业为敌,最后善恶有报、空余萧索。

知道这部戏是因为和《极寒之城》是同一个导演,卖点都是暴力美学,风格不同。《极寒之城》用不加特效的长镜头表现格斗的残酷,画风冷峻。《疾速》系列更像《杀死比尔》,场面华丽,十步杀一人、千里不留行。

关于暴力美学,维基百科是这么解释的:

主要在官感上,使暴力以美学的方式呈现,诗意的画面,甚至幻想中的镜头来表现人性暴力面和暴力行为。观赏者本身往往惊叹于艺术化的表现形式,无法对内容产生具体的不舒适感。支持人士往往称「暴力程度与票房收入成正比」,社会道德捍卫者和舆论谴责人士则称其是对社会道德教化的阻碍和负面影响;恐引发心理未臻成熟的人们,间接以为暴力行为亦是一种美感的呈现。

在众多香港导演中,吴宇森是运用这种电影表现手法的代表性人物。其标志性的白鸽漫天飞舞,手持双枪的英雄人物纵横在屏幕之上,使象征和平和安详的白鸽与血腥暴力的枪弹形成了强烈的视觉反差,吸引了无数的目光。

然而我并不打算马上去看新《追捕》,炒冷饭的鲜有好戏,等等再说。

iPhone X使用感受

上手用了两天,感觉优点多于缺点,总体是进步的。

P1030587

如果没有新的工业设计,我可能会把小6继续用下去。毕竟当初就对小6的白带和粗边框很不满意,虽然8因为改回玻璃背板已经基本解决白带问题,但是前面板几乎没有变化,一个工业设计用了四代,再优秀也审美疲劳了,而且那个屏占比在现在的千元机里也是倒数了,哪怕把边框做得再窄一点,8也不至于跳水成现在这样。

P1030579

买的银色,实际观感更接近乳白色,而深空灰更接近黑色。后者配色的一体性并没有别人说的那么好,而前者配色也没有很强的割裂感。

P1030585

宽度比6稍大,长度更长,单手握持无压力,不过单手操作就别想了,即使是6,搭配指环单手操作也不方便。

P1030584

前面板在息屏状态下一体性很好。当然我不认为这是个很重要的标准,好像罗永浩说过黑色边框可以隐藏低成本的做工,白色边框想做好更难,不管真假,息屏美学就是个营销手段,有谁会盯著息屏的手机瞅?

功能方面,这次最大的卖点就是Face ID,体验真是比Touch ID好太多!尤其是我手汗多,指纹解锁失败率很高,不过这些年倒是因此养成了一天洗几十次手的习惯……

性能上,找回了6在iOS8时的流畅度。如果没有意外,6在iOS11下就现在这德性了,追求流畅度的在10.3.3止步吧。

拍照方面,「世界第二」的摄像头效果搭配人像模式效果比6好很多。

至于续航,虽然免不了一天一充,起码比6在iOS11下强多了,毕竟多了一千毫安。

此外,作为古老的小6的用户,3D Touch、抬手亮屏、随时喊Siri也有更好的体验。

屏幕方面,全面屏+OLED效果拔群。看久了X的屏幕,再看6的会觉得模糊很多。另外,True Tone比起Night Shift也更智能了。

异形屏不是苹果的首创,全面屏也不是小米的首创,而它们连同三星S8已然成了全面屏的三个流派。我个人更倾向于异形屏,虽然iPhone X的屏占比实际上并不是非常高,不过观感上更彻底。S8用曲面屏把左右边框做到视觉上宽度接近零,不过三星的供货问题是这个流派最大的障碍。至于小米MIX,完全就是在低成本、供应链和软件生态话语权弱、硬件技术落后等因素作用下、利用普通LCD面板追全面屏热度的怪胎。MIX1就是个半成品,到了MIX2才算基本可用。所以小米不是第一个做全面屏的,但是是第一个不要脸的,还是老罗实在,「全面屏」后面还加个「almost」。

未来一两年,从千元机到高端机会全面普及全面屏。中低端机型主流应该会选择坚果Pro2的风格,用普通面板,然后尽量把边框做窄。高端机型在异型屏和曲面屏之间会有一场好戏。

取消Home键换来的新的交互方式,整体上是进步了。回到主界面和切换任务这两个常用操作改用触摸手势,取消了到实体键的依赖,也提高了效率。侧边键得到了更充分的利用,呼出Siri和Apple Pay从Home键挪了过来。如果同时按侧边键+音量减能自定义或者实现像坚果Pro2闪念胶囊按键那样的功能会更好。

缺点主要是边框和厚度,原本我对小6的厚度是很满意的,只是希望把边框做窄点。现在不但祖传的粗边还在,还越做越厚是什么毛病?!