Menu Home

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 正如上面所说,我们没有做这样的前后统计,来证明有了单元测试以后,我们app的bug少了多少。然而,我自己的经验是,我已经不知道多少次以为只是做了一点小改动,不会有任何问题,结果一跑单元测试,发现还是改出问题来了。从这点来说,单元测试帮助我发现了不少问题,至少是更快的发现了问题。很多时候,这些问题是因为不小心疏忽了而导致的。然而话说回来,大部分bug不都是因为不小心疏忽了,很多情况考虑到,或者是考虑错了而导致的吗? 你或许会觉得,自己很厉害很专业,一定不会有这种“疏忽”,写的代码一定是没有bug的。然而事实是,再厉害的人,都有状态不好的时候,都有情绪不高的时候,都有感觉比较累的时候,都会受到或多或少外界的干扰,这种时候都是很容易犯错的。这个跟厉不厉害,专不专业其实没有关系。李世石多么专业,在跟AlphaGo比赛的时候,不是依然会失误,会犯错吗?这个时候如果有那么一层保障,来防止你不小心犯错,岂不是更好的一件事情? 节约时间 对于安卓开发来说,一遍一遍的运行app,再执行相应的用户操作,看界面是否显示正确的结果,通过这种方式来测试自己的新代码、重构是否是正确的,这是非常浪费时间的一件事情,而且效果还不好。有了单元测试,我现在开发过程中几乎已经不用把app运行起来了,速度相对来说快多了。 此外,因为单元测试能帮我减少bug,从而也减少了调试bug,fix bug的时间。一个切身感受是,自从开始写单元测试以后,我启动AndroidStudio的debugger的次数明显减少了。这也是单元测试节约时间的地方。 当然,这个结论也是自我感觉的结果。写单元测试需要时间,这也是不能否认的事情,至于有单元测试是否真的更快,快了多少,我没有具体的统计数据,所以很难给出一个确切的答案。 这里需要重点说一下的是,你为新代码写的单元测试,不仅仅是能在目前你这次写新代码的时候起了作用,它的作用更体现在以后重构代码的时候,你可以很快速,很安全的进行重构。这点往往大家会忽略,所以会觉得在单元测试上花费的时间“不值得”。 更好的设计 当你为自己的代码写单元测试的时候,尤其是采用TDD的方式,你会很自觉地把每个类写的比较小,功能单一,这是软件设计里面很重要的SRP原则。此外,你能把每个功能职责分配的很清楚,而不是把一堆代码都塞到一个类里面(比如Activity)。你会不自觉的更偏向于采用组合,而不是继承的方式去写代码。这些都是很好的一些代码实践。 至于为什么TDD能够改善代码的设计,网上有很多的文章去分析和论证这个结论。我看到比较印象深刻的一句话是(具体在哪看的搜不出来了):当你TDD的时候,你是从一开始,就从一个代码的使用者,或者说维护者的角度,去写你的代码。这样写出来的代码,自然会有更好的设计。 更强的自信心 有单元测试来保证你的代码是对的,这对于你写代码、发布代码、重构都提供了信心保证,没有那么多的担心,从而工作起来也更快乐更开心。做人呐,最重要的是开心。。。 没有时间写单元测试? 前面大概讲了讲我为什么要写单元测试,以及单元测试给我带来的好处,这些其实如果大家去google “why unit testing”,估计会得到类似的答案,然而依然会有很多人不写单元测试。如果问为什么的话,那么得到最多的回答,估计是:没有时间。 那么,写单元测试真的需要很多时间吗?为什么多数真正写过单元测试的人会说,写单元测试可以节约时间呢?在这里,首先要承认两点。。。 1. […]

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

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

命名是件大事情

这是《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 (cell[STATUS_VALUE] == FLAGGED) flaggedCells.add(cell); return flaggedCells; } 这时候可以用一个类Cell来封装一下表示每个格子的int[], 程序将变成下面的样子: public List<Cell> getFlaggedCells() { List<Cell> flaggedCells = new ArrayList<Cell>(); for (Cell […]

《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 hide, the dependencies minimal to ease maintenance, error handling complete according to an articulated strategy, and per- formance close to […]

Use FactoryGirl in Rails

FactoryGirl is a gem aimed at replacing Fixtures. If you wonder that, take a look at what's wrong with fixtures. ### 1. Add factory_girl_rails to your Gemfile group :test, :development do gem ‘factory_girl_rails’ end ### 2. Add to your spec/rails_helper config block: RSpec.configure do |config| # Other config code config.include […]

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,保证是一碗好鸡汤。 那对我来说,生命中浪费时间的事情又有那些呢? 赖床 太频繁的刷朋友圈 过量的看美剧、电影 过于考虑别人的看法 交通上浪费的时间 对未来毫无意义的担忧 经常被打扰,难以集中精力做深度的思考 。。。 知道那些事情浪费生命,其实还不够,如果不能想出解决的办法,那么知道了,又有什么用呢?对于以上的一些事情,我的解决办法如下: 赖床:跟人约好几点钟起来,如果没起来的话发红包 太频繁的刷朋友圈:已经把自己的朋友圈功能禁用了 过量的看美剧、电影:额。。现在是美剧冬歇期,好像没这个问题。 过于考虑别人的看法:跟文中提到的建议那样,经常的问自己,“以后我还会这么在乎这件事情吗?”,一般来说,当你回答完这个问题的时候,心里其也就没那么在乎了。 交通上浪费的时间:住的离公司近一点,周末出行尽量避开高峰期,路上可以听podcast。 对未来毫无意义的担忧:人生本来就是一种过程,无论怎么样的经历体验,都会有它的精彩,就看上天怎么安排。多这样“安慰”自己。 经常被打扰,难以集中精力做深度的思考:工作的时候如果需要高度集中精力,那就换一个安静点的地方。周末的话,只要条件允许,那就关掉手机吧。 。。。 各位看官,在你们的生活中,浪费生命的事情,又有哪些呢? 共勉!

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

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

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

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

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

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

2015年总结与2016年计划

基本就是数数,去年中做了哪些自认为值得一提的事情,来年有打算做哪些自认为值得一提的事情,虽然心里很清楚,大部分都完不成。 ## 2015年总结 年初的时候就跟前女友闹矛盾了,还挺严重的,主要是自己不成熟傻逼吧,不细说。最后还好,顺利的和好了。 5月初的时候老妈过来杭州了,从此有了一个人照顾我的生活起居,给我做饭,洗衣服之类的,每天不用去想中午晚上吃什么这个问题。 6月初从前一个公司离职了,其实想离职的想法已经很久很久,因为各方面时机都不合适,所以拖到那个时候。在那个公司期间,其实工作还是挺开心的,老板很Nice,同事很好,就是做的事情跟我所谓的“意义观”不是很符合,但不可否认的是,这个社会需要这样的公司,所以祝福你们能顺利的发展,祝在直播持续做中国真人视频直播领域的NO.1。在那段时间,趁“出差”的时候也顺便把北京游了一遍,去过长城故宫清华园等等地方,依然很向往清华园,哈哈。。抱歉,我就是个俗人。在那期间,认识了小江雷蒙晕晕等等很有趣的人。当然,很高兴的是还认识了一个志同道合的朋友–汪涛,虽然接触时间并不长。然而人跟人的交往就是这个样子,当你跟一个人接触的时候,基本很快能断定,你跟他会以什么样的形式相处,什么样的层面相处,什么样的深度相处。很多人你会跟他们一起快乐的玩耍,另外一些人你会跟他们交流感情的问题,还有一些人你会跟他在更深层次上面的精神交流。当然,每个人都是多方面的,也许也许每个人等你跟他熟悉了以后,都是类似的样子。然而每个人呈现给世界的,却又各不相同,这就导致了前面的那种情况。。。总的来讲,在那个公司工作期间,是我觉得很愉快,也很重要的一段经历。 7月份开始,跟女朋友之前的感觉又出现矛盾,最后还是分开了。她说觉得跟我妈合不来,当然其中有我处理不力的地方。她是个很好的女孩子,可惜还是我不够成熟,很多事情处理不好,所以没能带给她足够的幸福,祝福她能够得到想要的幸福。 6月-9月,3个多月期间,“尝试”了一次创业,自己做了一个产品,叫我爱复习,后来改名叫多记,这是一个帮助你记住每天学到的一些知识的网站,配套的app,会每天提醒你复习你记录的东西。现在回过头来看看,好像也不算怎么尝试创业,更多的时候或者说更多的精力在处理失恋的事情上,最后当然结果很明显,事情很不顺利,钱花的差不多以后,到9月分就乖乖的去找工作了。 9月份找到一个公司叫9贝壳,这是一个做二手物品回收的公司,我非常喜欢他们做的事情,觉得非常有意义,是一件伟大的事情。于是就去了,然而去上了一个月班之后发现,虽然公司做的事情很伟大,然而自己能做的却很少,像这种公司,更多的是靠业务部门去做第一线的工作。技术,或者说IT技术相对来说,起的作用并不是那么大。同时觉得公司的氛围好像也并不是很符合自己的想法,所以一个月之后就离开了。 8月份去四川旅游了一次,去了九寨沟,在成都呆了好几天,非常非常感谢那边的小伙伴菁喜小盆友,抽时间甚至请假陪我,请我吃饭,帮我找酒店等等等等。路上也遇到其他几个小伙伴,非常愉快的一次旅行。 11月份入职蘑菇街,一直到现在,我觉得,我算是找到了属于自己的地方,现在工作很开心,我能做自己擅长的,喜欢的工作,同时又有空间,让我去探索一些不是那么熟悉的领域,接触更广阔的世界。 还有一件事非常重要,那就是,去年不知道具体是那一天,开始去参加了一个叫7分钟读书会的活动,后来就非常喜欢这个读书会,觉得每次去参加,都能感受到很大的收获,同时还认识了一大帮有共同兴趣爱好的朋友,之后自己也分享了几次,现在也会慢慢的帮忙做一些事情,感觉棒棒哒! 自从进了蘑菇街以后,日子就相对没有那么多的变化,当然,也可能是因为时间还不长把,哈哈。。。不过最近的生活状态,我是真心觉得很喜欢。我希望日子就这样安安静静的过下去。 如果说去年有什么成长,我觉得有两点,一个是处理情绪方面,自己成熟了很多。这主要是因为跟前女友相处的时候,自己的情绪处理的并不好,后来发现,这样真的很不行,要改,一定要改,现在相对来说,会成熟很多,情绪也会稳定很多。 第二点,是自己年底的时候突然意识到的一个算是idea吧。那就是,其实生活并不是非要过得完美,就像现在一个人的日子,也许有时候有那么一些忧伤,一些孤单寂寞,一些失落无助,不代表现在的生活就不好,也不代表需要去改变什么。其实这样的日子就已经很美好了,好好珍惜当下,不要贪心,这样就没有那么多焦虑,也可以避免很多不必要的麻烦。 ## 2016年目标 接下来说2016年的目标,这也是在上一次七分钟读书会提到过的话题,想了想,应该是有如下的一些吧: ### 1. 尽量保持单身 这点可能会有一些人会觉得意外,现在单身汪们都愁找女朋友呢,为什么你的“目标”却刚好相反?这么说吧,我从18岁开始谈恋爱谈到现在快10年了,期间空窗期大概也就两年左右。现在对于谈恋爱这件事情,真是觉得累了。所以今年就想安安静静的过一年。好好的花点时间,多看看书,多锻炼,多交几个朋友,多学点自己感兴趣的事情,提高一下自己,这样等缘分来了的时候,也能有更足够的信心,更成熟的心态,去跟对方交往。 说道这个,去年刚分手的那段时间,其实就很想结婚,很想很想结婚,好像这样就能把两个人绑住似得。那段时间没有断联,于是自己甚至很长一段时间都没有觉得自己分手了,单身了,别人问我有没有女朋友,我也回答说有。直到快年底的时候,某一天突然觉得,好像自己现在是一个人了,是单身了。再后来慢慢的,倒是想通了,对于恋爱也好,结婚也好,都是要看自己的缘分,看自己的心境。不是说别人都有女朋友了,所以你也应该有女朋友,不是说别人都结婚了,所以你也应该结婚,不是说你年龄不小了,所以就应该结婚。什么时候应该结婚呢?我是这么认为的,当你遇到一个人,非常非常爱她,你想下半辈子都跟她在一起,你想用你的余生去守护她,给她温暖,给她关照,给她陪伴。我想等我遇到一个人,让我产生这种想法的时候,才是该考虑结婚的时候。 总之,这一年,尽量保持单身,那为什么叫尽量呢?谁知道我会不会遇到一个女生,然后疯狂的喜欢她,情不自禁的想跟她在一起呢???哈哈哈。。想想而已,概率还是很小的。 ### 2. 技术水平再提升一下 技术作为我的“立身之本”,自然是作为第一目标来对待的。除了一直从事的安卓开发,也要学点新的东西,我给自己选的是ES6,除此之外,关于软件理论方面的知识,也要深入一点。具体的说来: Android开发: AndroidTesting要熟练 往底层学习,学习android系统层面的一些东西,具体说来,看懂看透《android框架揭秘》 看完、看懂RxJava的源码 ES6:语言要熟练,Jasmine要熟练,React要熟练,RxJs要熟练 软件理论及其他感兴趣的技术,列一个书单好了 code complete clean code clean coder effective java第二遍 Refactoring第二遍 SICP 深入理解Java虚拟机 Java Concurrency in Practice Working […]