王辉的博客

是什么让我对未知世界始终充满热情?

在人于人之间的相处中,换位思考有利于人们理解彼此的需求,进而促成共赢的局面。把换位思考用到软件的设计中,能够提升软件的质量。这是我在Michael Feathers的培训里,领悟到的最巧妙的一个思维方式。如果你对Michael的名字不熟悉,那么他写的Working Effectively with Legacy Code这本书,你可能听说过。

如何在软件的开发中做到换位思考?在回答这个问题之前,让我们看看换位思考为什么能提升软件质量。

不用不知道,一用吓一跳

你代码敲得很High,把属于你的那部分模块写完了。旁边的小组终于可以调用你的代码了,然而,不用不知道,一用吓一跳。没想到,调用你的代码,得给你准备好十个依赖关系,一个方法要传二十个参数。当然我是夸张了点,可软件的设计中经常会出现这样的问题。

当一个工程师设计代码的时候,如果仅仅站在自己的角度上考虑问题,那么他很难能体会到别人用他代码时的感受。不能从对方的角度出发考虑问题,往往会无法满足对方的需求,甚至损害对方的利益。

拿上面那个例子来说,如果我们能早早的站在对方的角度上思考,就不至于写出来一个需要二十多个参数的方法,换成是你,你也不愿意去用这样的代码。所以换位思考,理解对方的痛点,可以帮助软件设计者降低软件的复杂度,设计出别人方便用,也喜欢用的代码。

测试驱动开发

通过上面的分析,我们理解到了换位思考在软件设计中所能起到的重要作用。那么,怎么才能做到换位思考呢?测试驱动开发是一个极佳的工具,能够引导我们进行换位思考。

我之前对测试的理解,大部分是停留在正确性的层面,比如测试可以保证软件的正确性,重构的时候,测试可以保证已有的功能受到保护。其实,测试还有它的另外一个巨大的作用。它通过让开发者本人,先写测试调用自己的代码的方式,不知不觉的站在了被人的角度上去考虑问题。在让别人用自己的代码之前,先自己用用,看看会不会被吓一跳。这种换位思考写代码的方式,可以很即时,很明显的发现设计上的缺陷。

结语

测试驱动开发,不仅是一种工具,更是一种思维方式,它第一时间帮助工程师去为他人着想,从他人的角度,审视自己的代码。

这周看了Martin的演讲,讲的是高性能系统的设计。他劝我们一定要舍得时间和精力在数据结构上下功夫,因为数据结构会陪伴你的整个职业生涯,长久不息的回报你,是一个程序员最好的投资。

为什么数据结构会有这种收益?

每天都给你节省时间

掌握好数据结构能帮助我们节省时间,并且每天都能省,这是因为我们每天都要和他们打交道。这就像,你每天上班,必须得坐地铁,但地铁太绕,开车十分钟能到的路程,生生被饶了一个半小时,后来你终于学会了开车,开车上班,每天省了一个小时二十分钟。如果数据结构掌握的不好,Queue里边有什么方法,怎么用还得看文档,毫无疑问,这绕的太多,浪费了太多时间。

熟能生巧

熟能生巧,一个巧字,如果你有幸遇到了,我磐石般的相信,这将是你作为程序员中生命中最为闪亮的时刻。学习之道,引起我强烈共鸣的一本书,讲述了作者Josh如何成长为象棋和太极宗师。我想利用其中的一段小故事来说明这个巧字。

和很多普通象棋学习者不同,Josh学象棋的时候,不是从开局而是从尾局开始,他解释道,在棋盘上所剩无几的时候,才能体会到一个棋子所能爆发的最大能量。只有把每个棋子的用法都体会透彻之后,才能催生出妙招。在一次比赛中,当所有的人都认为要和棋的时候,Josh走出了连自己都无法解释的妙招,这也许就是传说中的无招胜有招。其实,这并不是一种偶然,而是他积累到了熟能生巧的阶段,当知识融会贯通的时候,巧妙的招数,想法便不知不觉由心而生了。

我相信,学习数据结构,也会有同样的功效。我时常会沉浸于一些程序员所创造出的新的数据结构或算法,不可自拔,感叹他们的聪明才智。可他们之所以能创造出巧妙的新结构,也是他们在基本的数据结构上投入了大量精力,不仅知道他们的实现原理,怎么用,而且还知道为什么要这么用。

可转移技能

数据结构是比较底层的知识,一般底层的知识都具有可转移的属性。举个例子说,你用Java编程语言,明白了TreeMap是一个平衡二叉树。那么恭喜你,你将会在所有的编程语言里碰到这个数据结构,这可以帮助你快速的学习新语言。

资源

修改历史

IO和交互

IO, 是一个应用和外界交互的手段。

应用,最关键的交互对象,是用户。通过IO,应用可以响应用户在屏幕上的按,滑,拉等操作,显示相应的内容。一款应用,必须通过和用户的交互,才能展现它的功能。如果按它点它都没反应,显而易见,这个应用没有存在的意义。

除了和用户的交互,应用时常需要和其他的外部系统配合,比如服务器,文件系统,数据库。交互过程中,应用会读取网络请求,发送网络答复,修改文件等等。这种交互可以让不同的软件系统相互协作,共同完成用户所期待的功能。

由此可见,对一个应用来讲,IO必不可少。

IO和测试

然而,从软件自动化测试的角度来看,IO不仅增加了测试的难度,而且降低了测试的质量。

从和用户交互的角度来看,首当其冲的难题,自动化测试的实现绝不可能依赖于用户的手动介入,否则就不能称之为自动化测试了。一种对策,是事先录制下来用户的操作,然后将其重现。还有一个办法,就是用编程的方式,模拟用户操作。仅仅处理用户输入这一部分,就给测试带来了不少麻烦。

除此之外,还有应用和其他系统的交互。如果一个前端应用使用了后台,那么测试前端就得把后台服务器跑起来。在某些情况下这根本无法完成,比如交互的对象是一个不受自己控制的服务器。即便应用所需的各个交互对象都可以被成功构建,文件或网络的写入和读出,都会大大增加测试的执行时间,进而降低测试的质量。

测试策略

在这种情况下,我们需要什么样的测试策略?这个问题的答案,将是我们测试方案最根本的指导思想。

你开发了一个应用,你最需要测的是什么?我建议你现在暂停五分钟,好好想想这个问题的答案。

你需要测的是按钮吗,是文字输入框吗,是数据库的读写吗,是HTTP的调用吗?不是,一方面它们应该都是非常成熟的模块,是基石,它们必须好用。另一方面,也是最重要的,它们不是你存在的理由!你需要测的,是能把你的应用和他人的区分开来的东西,专属于你的那一部分,换句话说,你需要测的是你的核心业务,核心竞争力。这就是我们的指导思想。

IO蒸馏

这恰恰是我想提出的IO蒸馏的概念,通过IO蒸馏,我们要把我们的核心竞争力给提炼出来,越纯越好,纯到所有的IO都被分离出来。一旦实现分离,我们就可以用一种模拟的假IO来替换难以控制的真IO,这样既能保证我们通过IO来测验应用的功能,又大大的降低测试的复杂度。

下图表示的是我们IO蒸馏的过程。

结语

对任何一款应用来讲,IO都扮演着至关重要要的作用,IO是应用体现它价值的舞台。然而,IO的自然属性对自动化测试带来了巨大的挑战。面对这个挑战,以测试核心竞争力为出发点的IO蒸馏,给我们带来了一套高效的测试方法。它把IO和应用的核心业务高度隔离开来,一方面使得应用的核心竞争力得以凸显,另一方面,让模拟假IO替换真IO成为可能,大大了提高了测试的效率。

延伸阅读

如何提升程序员的价值?通过对最近经历的几件事情的深入分析,我得到的结论是,用您的代码给更多的人带来便利,受益的人越多,您的价值也就越高。

这种崭新的思路,彻底改变了我对价值的看法。之前的我,看待价值,是以我为核心的,英语考的分越高,我的价值越高;看过的书越多,价值越高;写的代码质量越好,价值越高;我参加会议,兴趣小组越踊跃,价值越高。统统都是以自身获得的经验,知识,技能来衡量自我价值的。然而,当我把注意力从我转移到他人身上的时候,我惊奇的发现,我的价值并不在我这里,它不是我考过的试,写过的代码,读过的书,参加过的会议,而是我能给别人带来的便利。并且更为可怕的是,这种价值增长的速度,取决于我帮助的人的数量,如果它呈指数增长,那么我的价值也是指数增长!想想都觉得不可思议。

接下来拿几个生活中的真实经历来举例说明。

开源插件

前几天我发布了一个开源插件,这插件可以帮助Hexo静态博客更好的被百度收录。从代码复杂度上来讲,相比我在公司里写的代码,都没有必要谈复杂度,因为实在太简单了。为了介绍这个插件如何使用,我在博客里专门为它写了一篇教程。出乎意料的是,短短的几天时间,它就成为了我博客的流量担当。这次经历,让我开始体会到,我的价值不仅仅是我的代码,而是代码能给够帮助到的人们。人们越多,我的博客流量也就越多,我的价值也会越高。

上面是一个开源插件给我带来的思考,从正面讲如何提升程序员的价值。接下来是一个反面的例子,说一说我如何没有更好的提升我的价值。这个反面例子也是工作几年来一直困扰我的事情。我一直在摸索挖掘,如今在这个新思路的引导下,我有了一些新的体会。既然是反面的例子,我就毫不忌讳的,敞开门谈。这个困扰就是我一直没有超出预期。

超出预期

我们公司对员工的年终考核是按照【低于预期】,【达到预期】和【超出预期】三个标准来考核的。2016年像往年一样,我只是达到了预期,很失望,一年的努力又付之东流了。回想过去的一年,感觉自己做了很多事情。参加了法国最佳程序员竞赛,斩获第十三名;争取到了仅有的几个名额去三番参加了JavaOne会议;还成功的完成了几个实验性项目;但最后,还是不如意,没能超出预期。困惑,我问老板,如何做才能超出预期。新老板是公司调整后,刚接手我们组的。这次得到的提示,和以往不一样。以往老板说,超出预期,就是你做出了让我眼前一亮,意想不到的事情。如今的老板说,作为一个程序员,首先是你的代码,非常过硬的代码。其次是你做的东西,必须是很多人都强烈期待的东西,在这种情况下,你超出预期的可能性会变大。

我对以往老板的说法持怀疑态度,眼前一亮,更多是对新人来说的,一起工作了五年,都互相很了解了,要真是亮了,倒很可能是出了什么幺蛾子。我认为这只是表象,真正的原因,是这么多年以来,我们没有过年度目标。没有年度目标意味着什么?意味着没有人期待你的产品。更残酷的说,你没有在公司的主站场上,上不了战场,立什么功!没有预期,何来超出预期!新老板的话,没有提超出,也没有提眼前一亮,而是说你做的东西要有人期待,并且是强烈的期待。所以,你自身再怎么好,那是你自己好,竞赛获奖,参加会议,实验性项目,都没能给他人带来福利,所以你并没有价值。

结语

做为程序员,在职场里闯荡,提升个人素质,写出过硬的代码,非常重要,这是基础。但想提升自己的价值,只提升自己素质是远远不够的,必须要用你的代码击中他人的痛点,人越多,你的价值才越高。这种思路也提醒我们,如果你的组没有目标,不被人强烈的期待,你就要注意了,你提升自我价值的难度会变得特别大。这其实也是一种信号,你已经迷失主战场了。

这是写在新年的第一篇文章,给自己,也算给同行鼓劲加油吧。作为程序员,我们生在了一个诞生英雄,可以建功立业的时代,软件已经影响到了人们生活的方方面面。作为程序员,代码是我们无与伦比的工具,因为它可以跑在千千万万的设备上,帮助人们提升生活质量,实现我们的价值。

延伸阅读

你遇到了号称可以改变你一生的书,看了几页,发现不错。碰见朋友,你就忍不住推荐它。可人家问了个有深度的问题,你答不上来,说才看了开头。

作为推荐者,会给人留下不求甚解的印象。这还只是影响了自己。如果那书并没有号称的优秀,你还可能浪费了对方的时间。所以,推荐要负责任,对人对己。

没吃透的知识,不要推荐。有一次,我们需要测试一个实时系统的延迟。我看到了一个演讲,演讲人想说服听众,”为什么你的延迟测量是错误的”。看完之后,我欢欣雀跃,感觉觅得了真谛,底气十足地和同事讲,我们测的延迟都是错误的!他们感到惊诧,但还是和我一起考证一番。考证过程中,面对他们的不少提问,我都没给出清晰的答案,最终也没改变我们测延迟的方式。

从这次经历中,我总结了很多教训。最重要的一点就是,不成熟的推荐会降低你话语的重量。道理很简单,话说的多,事成的少。

我体验过最高效的推荐,是以成果为基础的。我有个校友,杨琛,在中国银行的全国海淘大赛中,获得冠军,取得白银讲师称号。这些成果强有力的表明他在演讲上的能力。因为我对演讲也感兴趣,就主动询问他关于提升演讲技能的书,他给我推荐了一本,演讲的力量。这种推荐既有说服力,又能帮助作为被推荐者的我找到最好的学习材料。

推荐本身是好事,是为了给人指路。然而,有时候你可能想表现你路走的多,把那些只走了一小段,甚至道听途说的路指给了他人,误人误己。

昨天,我在公司组织了一场关于精益创业的演讲。演讲人Matthieu Garde是法国推广精益创业的先锋之一,拥有培训法国各个领域企业家的丰富经验。 观众是Murex各个部门之间的60多名员工。作为组织者,我客串了主持人的角色。虽然只是简短的介绍了演讲人,也算是五年来第一次登上公司的演讲台。这次经历让我收获很大,一方面是组织活动本身,另一方面是对精益创业有了更加深入的理解。

活动组织者的收获

作为组织者,收获很多。首先,是事后演讲人和同事们的感谢和鼓励。其次,是宝贵的和演讲人一对一交流的机会。最后,是对自我组织和表达能力的锻炼。

在付出努力之后,最令人感动的莫过于他人的认可。演讲结束后,有同事专程拍着我的肩膀说,“王辉,演讲很精彩,谢谢你的组织”。还有说,“以后这样的演讲,要多组织!”。从他们的眼神中,我可以读到他们学习到了新知识后的满足。演讲人,也给我竖起了大拇指,感谢我对他全面的介绍,和为他召集到的那么多好奇的观众。一句简单的谢谢,温暖了我的心田,让我觉得所有的付出都是有价值的。

阅读全文 »

请注意, 本插件的配置文件中包含秘钥, 请您妥善管理好您的博客源码。
您可以把源码保存在本地
如果要托管在git仓库里,请选择私有仓库,博主本人选择的是免费的gitlab

开发目的

某些主机,比如Github,禁止百度爬虫访问博客,导致博客无法被百度收录。多亏百度提供了主动提交的接口,这才有了个补救的方法。

除此之外, 使用主动推送还会达到如下功效:

  • 及时发现:可以缩短百度爬虫发现您站点新链接的时间,使新发布的页面可以在第一时间被百度收录
  • 保护原创:对于网站的最新原创内容,使用主动推送功能可以快速通知到百度,使内容可以在转发之前被百度发现
阅读全文 »
0%