Android单元测试(三):JUnit单元测试框架的使用

我们写单元测试,一般都会用到一个或多个单元测试框架,在这里,我们介绍一下 JUnit4 这个测试框架。这是 Java 界用的最广泛,也是最基础的一个框架,其他的很多框架,包括我们后面会看到的 Robolectric,都是基于或兼容 JUnit4 的。 然而首先要解决的问题是。。。 为什么要使用单元测试框架 或者换句话说,单元测试框架能够为我们做什么呢? 从最基本的开始说起,假如我们有这样一个类: public class Calculator { public int add(int one, int another) { // 为了简单起见,暂不考虑溢出等情况。 return one + another; }…

Continue ReadingAndroid单元测试(三):JUnit单元测试框架的使用

Android单元测试(二):再来谈谈为什么

今天早上8点半坐到桌子前,打开电脑,看了几分钟体育新闻,做其他一些准备工作,到9点开始真正开始着手写这篇文章。于是开始google,找资料,打算列一大段冠冕堂皇的理由,来说明为什么要写单元测试,比如: 对软件质量的提升 方便重构 节约时间 提升代码设计 。。。 等等等等。 然而我发现上面提到的几点,都不是很好解释。首先,我并没有具体的数据,来说明有了单元测试,我们的app crash率降了多少,bug少了多少等等。这种东西首先我们没有去衡量,因为单元测试的增加是循序渐进的,每个版本的迭代增加一点点。很难,我们也没有,去前后对比。再次,crash率的降低和bug的减少,也难以证明就是单元测试的作用。另外,像重构这种理由,怎么举例证明呢?例子小了显得没有意义,例子大了写起来很困难,读起来也困难。而关于节约时间,我也没有测量过,这个恐怕也很难去测量。只能从理论上去说明,为什么可以节约时间,恐怕也很难有说服力的去论述。同样的,对于代码设计的提升,也很难有力的去证明。 更重要的原因是,上面提到的种种好处,好像其实并不是我之所以要写单元测试的直接原因,更多的,他们像是一种结果。所以如果从列举和证明单元测试的好处这个角度去说明为什么要写单元测试的话,我感觉甚至很难说服我自己。 那就从自身的经历和感受去说说,我为什么要写单元测试吧。其实我之所以要写单元测试,或者说这么喜欢单元测试这种写代码的方式,是出于我自身的原因,或者说因为自身的一些缺点,让我走上了单元测试这条路,而且再也不想回头。 我为什么写单元测试 首先,是因为我不够自信 我相信大家都有接手,或者说参与到一个新项目的经历,也许是因为换了工作,也许是因为职位调动,或其他原因。当我拿到一个新项目的时候,会有一种诚惶诚恐的感觉,因为一时间比较难理清楚整个app的结构是怎么划分的,各部分各模块之间又是什么样的关系。我怕我改了某一个地方,结果其他一个莫名其妙的地方的受到了影响,然后导致了一个bug。这对于用户群大的app,尤其严重。所以,那种时候就会希望,如果我改了某个地方,能有个东西告诉我,这个改动影响到哪些地方,这样改是不是有问题的,会不会导致bug。虽然我可以把app启动起来,看看是不是能正常工作,然而一种case能工作,并不代表所有影响到的case都能工作。尤其是在不知道有哪些地方用到了的情况下,我更加难以去遍历所有用到的地方,一个一个去验证这个改动有没有问题。哪怕我知道所有的case,这也是一个很痛苦很费时间的过程,而且很多的外部条件也很难满足,比如说需要什么样的网络条件,需要用户是会员等等。 在这种情况下,单元测试是才是最好的工具。首先,单元测试只是针对一个代码单元写的测试,保证一个代码单元的正确性总比保证整个app的正确性容易吧?遍历一个方法的所有参数和输出情况总比遍历一个app的所有用户场景容易吧?跑一次单元测试总比运行一次app快吧? 因此,在改现有的代码之前,我会先对要改的代码单元做好隔离,写好测试,再去改,改好以后跑一边单元测试,验证他们依然是通过的,这时候我才有信心,将代码合并进去。 同样的情况会发生在重构的时候,我是一个对烂代码不大有忍受能力的人,看到不好的代码,我会忍不住想要去重构,不然的话,没有办法写新的代码。而重构就会有风险。因为我不够自信,重构的时候,也会有一种诚惶诚恐的感觉。这时候如果有完备的单元测试的话,我就能知道我的这次重构到底破坏了哪些地方,是不是对的,这样相对来说,就会放心的多了。 因此,想用单元测试来保证代码的正确性,这个是我喜欢写单元测试的重要原因之一。 再次,是因为我没有耐心 对于有一定经验,有一定代码思想的人来说,当他拿到一个新的需求,他会先想想代码的结构,应该有那些类,那些组件,什么责任应该划分到哪里去,然后才开始动手写代码,这个是很自然的一个思维过程。然而在不写单元测试的情况下,我们可能要把整个feature都做完整,从model到controller(或Presenter、ViewModel)到view到util等等,一整套流程做下来,到最后才可能运行起来看看是不是对的,有的时候哪怕所有代码都写完了,也不一定能验证是不是对的,比如说后台还没有ready等等。总之,在没有单元测试的情况下,我们需要等到最后一刻才能手动验证代码是不是对的,然后发现原来这里错了一点,那里少了一点,然后一遍一遍的把app运行起来,改一点运行一遍。。。 当我开始写单元测试之后,我发现这个过程实在是太漫长了,我喜欢写完一部分功能独立的代码,就能立刻看到他们是不是正确的。如果不是的话,我可以立刻就改正,而不用等到所有代码都写完整。要达到这点,那就只有写单元测试了。 当然,哪怕有单元测试,最后还是要做一遍手动测试工作,然而因为前面我已经保证每一个单元都是对的,最后只不过是验证每一部分都是正确的串联起来了而已,这点相对来说,是很容易的。所以最后所需要的手动测试,可以少很多,顺利很多,也简单得多。 最后,是因为我懒 如前所述,如果没有单元测试的话,那就只有手工测试,把app运行起来,如果有错的话,改一点东西,再运行起来。。。这个过程太漫长太痛苦,对于一个很懒的人来说,如果能写代码来代替手工测试,每次写完代码只需要按一次快捷键,就可以直接在IDE里面看到结果,那是多爽的一件事!所以冲着这点,我也不想回头。 我记得上一次使用“把app运行起来”这种开发方式,还是因为调试一个动画效果。因为动画效果是很难单元测试的,那就只有改一点代码,跑一边app,觉得不对,再改一点,跑一边,这样来来回回反反复复,那感觉真是。。。 单元测试给我带来了什么 前面讲了为什么我要写单元测试的原因,接下来讲讲用了单元测试这种写代码的方式以后,给我带来什么样的好处。这根前面讲的“原因”有部分重合的地方,然而也有不一样的地方。 更快的结果反馈 这点前面讲过了,有单元测试的帮助,我可以写完一个独立的代码单元,就立刻验证它的正确性,这跟需要完成所有代码再把app运行起来手动测试相比,是一个更快的反馈循环,能更快的发现代码是否正确,也更快的得到一种成就感。 更少的bug,或者说更快的发现bug…

Continue ReadingAndroid单元测试(二):再来谈谈为什么

Android单元测试: 首先,从是什么开始

这是一系列安卓单元测试的文章,目测主要会 cover 以下的主题: 什么是单元测试 为什么要做单元测试 JUnit Mockito Robolectric Dagger2 一个具体的app例子实践 神秘的bonus 什么是单元测试 首先需要介绍一下什么是单元测试。很多人像我一样,本科并不是计算机专业出身的,如果在职的公司不要求做单元测试的话,可能对这个词并没有一个确切的概念。而即使是计算机专业出身,如果毕业以后写的不多的话,可能对这个词的含义也不是很清楚。从名字上看,单元测试是为了测试某一个代码单元而写的测试代码。但是什么叫“一个代码单元”呢?是一个模块、还是一个类、还是一个方法(函数)呢?不同的人、不同的语言,都有不同的理解。一般的定义,尤其是是在OOP领域,是一个类的一个方法。在此,我们也这样理解:单元测试,是为了测试某一个类的某一个方法能否正常工作,而写的测试代码。 我们举一个例子说明一下,假如你有一个类,定义如下: public class Calculator { public int add(int one, int another) { //为了简单起见,暂不考虑溢出等情况。 return one + another;…

Continue ReadingAndroid单元测试: 首先,从是什么开始

命名是件大事情

这是《Clean code》第二章的笔记总结,关于程序变量、方法、类的命名的一些建议。文章的内容还是非常有帮助的。很多的建议虽然我们都听过,然而看了其中的例子,你就会发现,那些建议都并不是一句空话,这样写和那样写,可读性就是有很大不同。 ### 使用的名字要表现出它的作用 不好的命名:int d; // elapsed time in days. 好的命名: int elapsedTimeInDays; 很多时候,为了更好的可读性,可以使用一个类来封装一下基础类型,比如一个扫雷程序,游戏中每个格子可以用一个int[]来表示,其中数组中的元素表示了这个格子的坐标、状态等其他信息。下面的函数用于获取棋局中所有被点开的格子。 public List<int[]> getFlaggedCells() { List<int[]> flaggedCells = new ArrayList<int[]>(); for (int[] cell : gameBoard) if…

Continue Reading命名是件大事情

《Clean Code》阅读:在大师们的眼中,什么样的Code才是Clean Code?

前几天开始看Uncle Bob的《Clean Code》,在第一章里,作者讨论了这样的一个问题:什么样的code才是Clean code。对于这个问题,一千个Programmer可能会有一千个答案,所以作者请教了6个著名的专家,问问他们对于这个问题的看法,以下三个是我认为不那么虚的,比较有操作参考意义的回答: #### 1. Bjarne Stroustrup, C++之父 I like my code to be elegant and efficient. The logic should be straightforward to make it hard for bugs to…

Continue Reading《Clean Code》阅读:在大师们的眼中,什么样的Code才是Clean Code?

Life is short

这是Paul Graham上个月在他的个人网站上面发表的一篇文章,在twitter上引起了大量的转载。Paul Graham何许人也?硅谷非常著名的创业家,YCombinator的Co-founder。YCombinator(简称YC)是什么东西? YCombinator是美国一个类似于创新工场的创业孵化器。当然正确的说法应该是,先有YC,后有创新工场。同时,YC所孵化出来成功的公司:Dropbox,Airbnb、Heroku、Codecademy、Disqus、Reddit、BusinessInsider,Just to name a few。也是创新工场: 知乎、涂鸦移动、豌豆荚、友盟等等,所不能比的。当然因为GFuckingW的原因,从YC出来的很多公司大家都不知道。 话说回来,PG在文章中的大意,大致翻译一下是这样的,一下的“我”指的是作者。 ------------生平第一次翻译一篇文章开始了-------------------- 人的一生是很短暂的,这个已经是老生常谈的事情了,然而直到有了孩子,我才慢慢的意识到这句话的“真理”性。假设你的孩子相信“圣诞老人”这个童话的时间是从3岁到10岁,那么你只有8次机会,你的孩子圣诞老人的惊喜。“8”并不是一个很多的数字,如果你说你只有8片花生,或者是8本书,你不会认为你有很多花生或书籍。 人生是短暂的,那意识到这一点,又有什么样的意义呢?对我有什么样的影响吗? 对我来说,这就意味着,“生命太短暂,我没有时间浪费在X上面” 这个句式有了巨大的力量。如果你觉得你没有时间浪费在某件事上,那或许,你应该努力的将这件事情踢出你的生活。同时,你应该努力的想想,生活中浪费生命的事情还有哪些呢? 对我来说,浪费生命的事情有以下一些: 没有必要的开会 毫无意义的争论 官僚化的流程 装模作样 交通拥堵 容易上瘾却毫无意义的消遣 。。。 这些毫无意义的事情,有两种来源,其中一些是你自己选择的;不幸的是,还有一些是外界强加到你身上的。比如说你要赚钱工作,那么工作中可能有一些事情是交代给你的,在你看来却是浪费生命的事情。然而这些强加给你的情况,事实上比你想象的要少,并且相对来说是比较容易去掉的。更多浪费时间的事情,是你自己选择的。 这里作者举了他自己的一个例子,那就是网上争论,很多人在网上毫无缘由的攻击你,这时候人的本能就是去辩解,去反击。这样会浪费很多时间,然而并不会给你带来什么好处。我们要做的是有意识的去避免这件事情。经常的问自己:你想要把你的生命花费在这种事情上面吗? 人生很短暂,一方面,人应该有意识的去除那些浪费生命的事情,另一方面,也应该努力的找出那些对你来说重要的事情。当然,对不同的人来说,重要的事情是不一样的,一小部分人很早就明白这辈子想要做什么,并且想办法花很多时间在上面。然而更多的人,生活在重要的事情和不重要的事情之间徘徊。 这里需要特别注意避免的一点,就是一种人为虚假的重要性,其中最明显的一个例子就是太在乎别人的看法。避免这种情况一个很好的办法,就是问你自己这个问题:以后我还会像现在这样,这么在乎这件事情吗?虚假重要的事情总是在一瞬间,诱人上当,让人觉得它很重要,然而其实它并不是。 生命是很短暂的,毫不客气的把那些浪费你生命的事情剔除出去。同时,对于那些自己很想去做的事情,我们应该更加“没有耐心”一点。不要总是“等到某一天”,再去做那些你想做的事情,无论是去爬山,去世界看看,去写一本书,还是其他任何你想做的事情。 ------------------------翻译结束----------------------- 以上是文章的大意,翻译过来少了很多鸡血性,有时间的话,还是直接看原文把:http://www.paulgraham.com/vb.html,保证是一碗好鸡汤。…

Continue ReadingLife is short

民主和文明,需要我们自己去争取

过年在家看完了《野火集》,一本刷新我三观的书。据说这本书最初写的是30年前的台湾,然而字字句句每行每页,我看到的都是如今的中国大陆:政治独裁、官员腐败、民众冷漠、环境无节制污染、各种不文明、不公平、不道德的行为盛行无阻。。。 当然,如果仅仅是批判,那其实没有太大意义。这本书最震撼我的地方,是里面提醒我们的一个观点,那就是,明主和文明,是要我们自己去争取的。民主不是共产党某一天大发慈悲,选择把决定权真正的交给人民。文明也不是如今各种不文明的人某一天醍醐灌顶幡然醒悟,从此不再做那些不文明的事。不是这样的。 民主需要我们自己去争取,怎么争取呢?但你遇到不公平的事情的时候,选择大声说出来,向相关的人员去反应,抗议。也许一两个人的抗议并没有任何用,然而如果大家都去抗议,那相关单位肯定是没有办法忽略,而必须采取一些措施的。 最好的例子莫过于中国三大运营商,上网流量月底清零不清零的事件。从2015年10月1日起,三大运营商(移动、联通、电信)宣布推出月底上网流量不清零的政策。这个政策推出的直接原因,是李克强总理在2015年5月13日召开的国务院常委会上发表的一些“建议”。然而我没有办法将这件事情跟2013年,长沙律师刘明状告长沙移动关于当月上网流量月底就被清零的这个案件分离开来。当时一个人告移动,便引起众多网友剧烈的反响。那如果有很多人告各种地区的移动呢?如果能早点有人告移动呢?那或许,流量不清零的政策可以不需要通过总理的建议,也许也能早点出来。 “如果”的事,说起来总是简单,实现起来真的很难,如今大部分人都只关心自己凄凄惨惨的小世界,多挣点钱,少惹点事,明哲保身是现代人的生存法则。然而这样带来的结果就是,当政府实施暴政的时候,受压迫受强奸的还是我们自己。当社会上不公平的事情发生在自己身上的时候,你只能不吭一声默默忍受。 从人类历史发展到现在的轨迹看来,文明和民主是大趋势,我相信未来的中国,也一定会有它自己的民主。什么时候到来,这是个时间问题了,然而这并不是一个无关紧要的时间问题。台湾在20年之内达到了相当程度的民主,而中国呢?在共产党的“领导“下,如今快70年了,依然还远远没有达到。从刚刚过去的我党年会看来,更是显得任重而道远。然而尽管如此,我依然相信,如果每个人都能发出自己的一份声音,表达出自己对专制、对各种不公平政策的不满,中国的民主一定会早点到来。 对这本书的高度认同,也默默的改变了,或者说坚定了我自己的很多行为。作为一个新世纪的“正直”的人,你做好你自己,注意好你自己的行为,其实你只做好了一半。另外一半是,你还有责任去阻止别人做一些不公平、不文明、不道德的行为。所以现在。。。 当我在排队看到别人插队的时候,我会大胆的跟他说,请排下队,哪怕他长得人高马大。 当我在过斑马线而有车从我面前呼啸而过的时候,我会毫不犹豫的朝着他竖起中指。 当我发现有人在禁烟区吸烟的时候,我会不卑不亢的跟他说这里是禁烟区,请你能否不要吸烟。 当我在办事,排着长长的队而办事人员依然谈笑风生不紧不慢的时候,我会跟她说你能否认真一点,这里好多人都等着你办事呢! 。。。 也许这些行为会给我带来一些不愉快的经历,也许我会被这个人喷“关你屁事”,会被那个人抛来白眼,也许会被一些人当做另类。然而我相信大部分人都是Reasonable的,这些少数的不愉快的经历,是我所愿意承受的。说到这里真想Shameless的套用美队的一段话来装逼一下:“民主与文明的道路总要有些付出,如今愿意做这些付出的人并不多,哪怕只有我一个人,我也愿意继续下去,然而在这里,我更愿意相信,I’m not alone!”。所以也希望,所有在看这篇文章的人,你我一起行动起来,对不公平、不文明、不道德的行为勇敢的说不!我们所不愿意的,是过一辈子窝窝囊囊、贪生怕事、畏首畏尾的生活! 最后,如果你有同感,强烈推荐去看一看《野火集》,保证你一定不会后悔。

Continue Reading民主和文明,需要我们自己去争取

新的一年,做一个堂堂正正的人

这几天在看龙应台的《野火集》,有太多太多的感触,里面核心的一个词是《民主》,民主是争取过来的,我们不能放弃这个争取的权利。 民主太大,从个人的角度,先要有勇气做一个堂堂正正的人。那么什么叫堂堂正正呢?野火集里面有这样一段论述: 所谓“堂堂正正”,不过是理直气壮罢了。他不必躲躲藏藏地读禁书,不必畏畏缩缩地不敢说出对时事的看法,不必因为批评了学校当局而被记“暗”过,不必为了参与社会活动而被迫停刊,更不必奉唯唯诺诺为美德…… 应用到自己生活中,是不是可以理解为,可以不必为了讨好谁,而说一些口是心非的话,不必为了“融入”某些圈子,而假装对某一些事情感兴趣,让自己强颜欢笑的去应付一些场合? 有人说你太认真了,说说笑笑就过去了,我想说每个人对很多事情反应是不一样的,你对这样的场合觉得无所谓很舒服,不代表别人也会这样觉得。我更希望能通过自己的实力,在这个世界找到自己的定位。有人说这样你会少了很多圈子,从而也会少了很多机会,你这样,是成不了大事的。这个理论我百分之百认同。然而问题是,我并没有想过要成就什么大事。我只是希望能通过自己的努力,在自己希望的行业做自己喜欢的事情,然后靠这些事情过一分相对体面的生活,那就够了。 我也不知道能不能做到,至少目前的心境是这样的,共勉!

Continue Reading新的一年,做一个堂堂正正的人

读《亲爱的安德烈》– 想要这样一段不煽情,不鸡汤,不说教的家书来往

这段时间看了一本书,叫《亲爱的安德烈》,作者是龙应台和她儿子,安德烈。 这本书是龙应台所谓的“人生三书”中的第二本,第一本叫做《孩子你慢慢来》,那本书我也看过,薄薄的一本,讲述的是安德烈童年从出生到大概七八岁的样子,生活中的一些有趣的事情,读下来给人的感觉是很温暖,很可爱,让人既想有个孩子,又想永远做个孩子。而这本《亲爱的安德烈》,是在安德烈18~21岁期间,根据龙应台跟安德烈之间的书信来往,整理而成的一本书。 那这些书信具体是怎么开始的呢?在安德烈18岁那年,龙应台某一天突然发现,她已经无法了跟他儿子进行交流了,这个在序言里有一段描述: 我想和他说话,但是一开口,发现,即使他愿意,我也不知说什么好,因为,十八岁的儿子,已经是一个我不认识的人。他在想什么?他怎么看事情?他在乎什么,不在乎什么?他喜欢什么讨厌什么,他为什么这样做那样做,什么使他尴尬什么使他狂热,我的价值观和他的价值观距离有多远……我一无所知。 他在德国,我在香港。电话上的对话,只能这样: - 你好吗? - 好啊。 - 学校如何? - 没问题。 …… 我知道他爱我,但是,爱,不等于喜欢,爱,不等于认识。爱,其实是很多不喜欢、不认识、不沟通的借口。因为有爱,所以正常的沟通仿佛可以不必了。 当时我看到这一段的时候,心里惊呆了,这不正是我跟我妈之间的现状吗?你爱她,你把她当做你生命中最重要的人,你也知道她很爱你,但是你们两之间已经不知道该说些什么了。 于是,出于要认识她的孩子的这个初衷,龙应台邀请她儿子跟她一起以书信的方式写了一个专栏,历经三年,终于完成,结果这个专栏引起非常大的反响,再后来就整理成了现在的这本书。 而我看到这样的一个序言,也立刻被吸引住了,我想看看她跟她儿子之间是怎么进行交流的,对我跟我妈之间的沟通问题上面又有什么样的帮助。于是就决心一定要读一下这本书。读完以后我觉得,虽然它在帮助我跟我妈沟通的问题上并没有什么卵用,然而依然是一本非常值得一读的书。 上面提到这本书最初是以一封一封书信的形式发表出来的,书信里面的内容是从,龙应台18岁的时候在做什么开始,讨论她对一些事情的看法,而她儿子会回应,也有是他儿子生活中遇到什么事情,然后龙应台是怎么看待的。这样一来二去下来,涉及到的内容非常丰富,从平穷带给她的影响,到怎么样面对不公平、贫富差距的问题,从安德烈的感情问题,到香港的文化问题,从对儿子的期望,到政府的权利的问题等等等等。这本书看下来以后,我个人的感受,或者说收获,主要有三点: 1. 看这本书本身就是一个非常愉悦的过程,书里面谈论到的很多事情,既没有让人觉得很说教很严肃,也没有让人觉得很单调无聊。龙应台的文笔让人看起来非常舒服,我个人也很喜欢。 2. 看这本书是一个开阔眼界的过程,书里面讲述到的很多事情,是我以前所不知道的,比如说欧洲国家现代青年的生活方式是怎么样的,对比之下中国大陆、台湾、香港的青年的生活方式又是怎么样的,对同样的一件事情,比如说游行示威、政府规定戒烟政策等,每个地区的人反应又有什么样的不同等等。里面还说到一些很有趣的事情,比如说,现在我们喝酒开心都要干杯,那干杯这个习俗是怎么来的呢?原来在中世纪时代,如果你要害死一个你恨的人,你就在他喝的啤酒里下毒,很多人是这样被毒死的。后来就开始流行碰杯,厚厚的啤酒杯用力一碰,啤酒花溅到别人杯里,要死就跟对方一起死。再后来渐渐地,就变成社会习俗了。一起喝啤酒,碰杯,醉倒,表示你信任坐在你身边的人。再比如说我们都听过“左派”或“左派”,来描述一个政治家,或者是一种政治观念是激进还是保守,那这两个词是怎么来的呢?原来在法国大革命期间的国会里,支持王权和贵族的人坐在右边,主张改革的人坐在左边,于是后来就有了“左派”和“右派”这两个形容词。这些“知识”的了解也是一件让人感到开心的事情。 3. 书里面谈论到的很多话题,都是比较有深度的。比如说在其中一封信里面,安德烈这样提到: 老爸开着BMW745的车,我穿着一件Ralph Lauren的白衬衫,我们住的小镇,是全德国平均收入最高的小镇——世界上有那么多人在饿死的边缘,我们开豪华的车是不是不道德?有些人做一天的工还赚不够吃的,而我只是上学,什么工都不必做,生活舒服得像个小王子一样,我可不可以心安理得呢?我也知道,电视在操纵、玩弄人的思维和价值观,但是我继续坐在那里看电视。我也知道,物质满到一个程度,就失去意义,但是我仍旧享受物质的满,我是不是一个十足的混蛋呢? 对于儿子的这种困惑,龙应台是这么回应的: 安德烈,我相信道德有两种,一种是消极的,一种是积极的。 我的消极道德大部分发生在生活的一点一滴里:我知道地球资源匮乏,知道20%的富有国家用掉75%的全球能源,所以我不浪费。从书房走到厨房去拿一杯牛奶,我一定随手关掉书房的灯。离开厨房时,一定关掉厨房的灯。在家中房间与房间之间穿梭时,我一定不断地开灯、不断地关灯,不让一盏灯没有来由地亮着。你一定记得我老跟在你和弟弟的后头关灯吧——还一面骂你们没有“良心”?窗外若是有阳光,我会将洗好的湿衣服拿到阳台或院子里去晾,绝不用烘干机。若是有自然清风,我绝不用冷气。室内若开了暖气,我进出时会随手将门关紧。浇花的水,是院子里接下的雨水。你和菲力普小的时候,我常让你们俩用同一缸水洗澡,记得吗?…

Continue Reading读《亲爱的安德烈》– 想要这样一段不煽情,不鸡汤,不说教的家书来往