2019年二月份总结与三月份计划

Posted by AlstonWilliams on February 28, 2019

读书

在家无事,读了几本书.

《吴晓波企业史》

首先是把《吴晓波企业史》大体读完了,虽然不能说对商业史理解的多么透彻,但是看待世界的眼光确实变了.

刚开始读这一系列的时候,吴晓波在前言中说,他发现商业史就是一次一次的循环.我本打算找到这个循环,判断现在的形式,该做什么.

然而,这套书读了一半,我都没有找到这个循环.却在清朝末年到1980年左右,看到了第一次循环.

也怨我笨,在吴晓波总结的时候,道出了这个循环.而这个循环实际上实在太多,而我只发现了一个.

书中有这么一段话:”历朝历代的经济治理有’先开放,后闭关’的规律,往往一开放就搞活,一搞活就失衡,一失衡就内乱,一内乱就闭关,一闭关就落后,一落后再开放,朝代更迭,轴心不变,循环往复,无休无止.”

细细品味,确实是这个样子,每个朝代刚开始基本都是开放,到结束的时候都是终止于闭关.

我看到的规律是,清朝末年,民国时期,以及1980年左右,政府大规模干预企业,导致很多优质企业倒闭的现象.

而吴晓波在书中也提供了好多经典的案例.从中我们可以看到,企业经营,是一件非常困难的事情.公司要想不倒闭,在财务,人才,管理等方面都需要做好.这不是一件容易的事情.书中有好多案例,就是因为财务不透明,没处理好导致的传奇一般的企业倒闭了.

这套书,应当购来,一有时间,就细细品味.

其实历史总是惊人的相似.像现在在风口浪尖的贸易战,其实上世纪美国和日本打过,你看当时日本和美国的关系,其实跟如今中国跟美国的关系类似,都是第一第二.但是,日本在这场贸易战中输了,日本从此沦为了美国的跟屁虫.那我们未来会是什么样子呢?

还有房地产泡沫,也在很多国家出现过.研究研究这些国家出现这些泡沫的时候,市场是什么样子,国家如何处理,造成了什么后果,对现在的形式,也能有个比较清晰的判断.

很多时候,我们回头看看,会觉得当时的人好傻,以后肯定会怎样怎样,为什么不作出某种决策.而我们其实本身就是处在迷雾中,我们现在也不知道未来会是什么样子,我们该怎么做.但是,如果我们能搞懂规律,熟悉时代背景,市场背景,我们做出决策,就会理智,简单得多.

这就是研究历史的作用.

《看见》

这本书是柴静写的.也是非常不错的一本书.

柴静作为记者,很多事情她都有更深的体会,有不一样的看法,往往会触碰到事情的本质.而有很多事情的本质,可能跟我们看到的大相径庭.

读完这本书,我一直记得的一句话,大意是”只有接触到事情的本质,你才会更加宽容”.

现在互联网太廉价,恶意攻击太廉价,一家企业,可以被舆论淹死,一个人,可以被人骂死,而那些害死它们的人,却不用承担一点责任.甚至不会感到愧疚,不会反省.

像这本书中提到的药家鑫事件.这件事情,若我们只看新闻,当然非常恶劣.但是,事情的本质,是家庭的教育不到位,家庭教育失败导致的.药家鑫其实也是受害者.我们更应该做的,难道不应当是反思怎样把自己的孩子教育的更好么?为什么有那么多人只知道谩骂?

在某些极端的情况下,比如A杀了人,B被当做嫌疑犯.然后媒体报道出来,认为B是杀人犯.即使最后法庭审判,B是无罪的,没有任何证据表明是B杀了人.这段时间,B可能早就被人人肉了很多次了,早就被辱骂过多少次了.如果B有一个正在上大学的女儿,被人人肉出来,羞辱她,欺负她,最后她不堪重负,自杀了.那么,请问那些喷子们,那些自认为正义的人们,你们谁来负责?你们甚至会有一点心痛,有一点点自责么?我相信,这些人,只会不知悔改,下次再逼死一个个无辜的人吧.

这种事情并不是少数.有多少无辜的人,被喷子们搞死了.

其实说白了,就是一群傻逼,以为自己是福尔摩斯.只看到了新闻报道,就诊断出了事情的全部经过.

一个社会,有这种人,一个社会,集体逼死一个无辜的人,比起那些蓄意谋杀,不是更应该让人震惊,让人感到害怕么?

记得前段时间,看到一篇文章,大意是外国人向一个女孩要联系方式,这个女孩给了.然后这位女孩的男朋友知道了,非得让这位女孩删掉他.女孩刚开始不同意,最后演变到那位女孩的男朋友对女孩谩骂,然后写了这篇文章来骂这位女孩.

我在底下评论说,从聊天记录来看,那位女孩并没有做错什么.只不过是给了一个联系方式,又没有做其它的事情.这位女孩不同意删除那位外国人的联系方式,更多的是对男朋友的无理取闹的反对,就像我们父母如果非让我们做什么事情,我们很可能偏偏不会做一样.而从聊天记录上看,倒是那位女孩的男朋友,一直无理,谩骂,缺少对女朋友的起码的尊重.

那篇文章的评论中,很多都是骂那位女孩的.还有人给我的评论留言骂我.还有人说,都是男人,什么事情都理性看待就没意思了.我只想说,”呵呵”.

还是那句话,”只有接触到事情的本质,你才会更宽容.”永远不要相信媒体,要知道,你能看到的,都是别人想让你看到的.经过处理加工以后,本身就已经带了个人色彩在里面.

永远不要随便评论一个人,一件事情.因为你接触到的信息量,远远不足以让你了解事情的真相.就像前段时间骂六小龄童的事件,请问那些骂六小龄童的人,又了解多少事情的真相呢?

Google说得好啊,”不作恶.”

《吴晓波企业史》中也有一些例子,具体哪些企业我忘记了,就是死在了媒体的诋毁上.

追求事情的真相,独立思考,接触到了事情的本质,才有资格发言.

《指匠》

一部小说,没什么可说的.

《高效能人士的十个习惯》

这本书给我的感觉是,道理人人都懂,但是我们往往不讲道理.

看完最大的感受就是,”一次只做一件事”.

过去工作时,经常会有各种优先级不高,或者只是聊天,导致工作被打断.然后再次进入状态,都需要花不少时间.这样很多时候都导致再次转回去的时候,忘记了原先是在做什么.

而现在呢,”一次只做一件事”.每天早晨都在计划表里写清楚今天要做的事情,并按照优先级排序.中间若出现什么事情,按照优先级排序,如果比当前做的事情,优先级高不少,那么立即中断当前做的事情,去做那件事,特别是那件事既重要又紧急.如果只是重要,但是不紧急,那么就做完这件事,再去做那件事.如果优先级低,那么不好意思,排队吧,或者干脆不响应.

自从采取这种方法以来,确实清晰了不少.

《一只特立独行的猪》

读王小波的书籍,给我的感觉就是,这是一位非常独特,文笔犀利,又不拘一格的作家.

他的很多书中都会涉及到性,涉及到同性恋等非常敏感的话题.但是,在他的书中,不仅不会感觉到粗俗,还会感受到对自由的渴望,以及对独立思考的向往.

在这本书中,王小波抨击了各种社会的阴暗面,针针见血.

糖果

15,16,17号,我吃了三天糖果.

满心甜蜜的时候,才发现,这些糖果是砒霜.

本不想写下这段话,可是这半个月过的实在是太过痛苦,所以写下来,聊以慰藉.

短视频

不知道从何时开始,喜欢上《陈翔六点半》.

刚接触《陈翔六点半》时,是看《陈翔六点半网络大电影之铁头无敌》.看完以后给了差评,觉得情节安排的实在不合理,把观众当傻子.

后来无事时,偶尔看到了《陈翔六点半》的短视频.正是这些短视频,让我对网络大电影里的人物的印象迅速转变.

短视频做的非常不错,有搞笑的地方,也有拿现实中的素材,暖人心的.最近看起来更加倾向于感动人的素材,常常把我感动到.

代码

我一直都在寻找喜欢的编程方式,喜欢的编码风格.

看过不少源码,但是总是感觉太过繁琐,不够简洁.当然我自己写的也不怎么样.可就是想从代码中,找到那种简约且优雅的编码风格.

我不喜欢过度面向对象编程,也不喜欢不面向对象编程.前者虽然看起来挺简洁,但是有太多小的类,让我感觉很不舒服.后者呢,又太乱,我也不舒服.

现在回想起来,其实读过的觉得好的源码,只有两个地方.一个是ZooKeeper中对请求的链式处理这里感觉很不错.另一个是Hadoop中的状态机模型.

最近也找了一些编码风格的书在看,看看能不能找到喜欢的编码风格.

上面这段,是我25号晚上写下的.在随后的这些天,我尝试换了一种方式,重写以前的代码.

当我写公用的代码时,我自我感觉良好.并不会跟写业务代码一样,堆一箩筐.在后来的这几天里,我尝试用写公用代码的态度,来重写业务代码.

尽管不喜欢自己写的业务代码,可我在反思,在寻找的时候,竟然无法回答出来,什么是简约且优雅的代码,我想要寻找的代码究竟是什么样子的代码.

深入思考以后,觉得业务代码让我痛苦的原因有这么几点:

  • 该抽象的地方,没有抽象,全都写到了一起.因为我觉得,不抽象五行代码就完事了,抽象以后,可能要写二十行,就没有动力.这就导致,不仅代码自己看不下去,也无法进行单元测试,导致隐藏了bug.
  • 在写Spark的时候,Transition中,我们老是直接把函数写在里面,比如:
    rdd.map {
       entry -> {
            entry._1
       }
    }
    

    这就导致,我们无法对Transition做单元测试,这其中的bug自然也无法发现.这样不仅导致调试的效率,还很容易耽误测试的进度. 我们是不是应当把它们也抽出来,然后单独做单元测试?以后我会尝试都这么写.

  • 不想抽象出来的另一个原因是,抽象出来,也不想写单元测试,因为单元测试的代码实在是烦得很.这样就保证不了正确性. 不过最近我们老大给我介绍了一个自动生成Java单元测试的插件,能够生成基本的模板,这样子写单元测试的工作量大大减少了,写起来单元测试也很愉快. 不过单元测试对于private方法的测试也比较繁琐,必须通过反射生成出来,我不想这么麻烦.回想到HBase代码中,很多private方法都是标记为@VisualForTest,看看能不能借鉴这种东西,把private方法的测试做的更好? 另一个不足点就是Scala的单元测试没办法生成.其它插件生成的Scala单元测试也都是用Java代码写的,但是我们一般调用Scala代码的时候,都是通过Scala来调.目前Intellij IDEA中没有插件能够满足我们这方面的需求,那么,有时间应该尝试一下,写一个Intellij IDEA插件,来自动生成Scala代码的单元测试.这个意义非常大,配合上Spark代码都是Scala代码,可以发挥非常大的作用.

就这几点,搞得我过去写的业务代码特别烂,不仅看起来很差,质量也保证不了.

不过好在,用上了老大给我介绍的那个插件以后,配合上模块化的思想,重写以后的代码,比以前的,好了太多.自认满足了简洁优雅这一点了.

以后写业务代码的时候,还要大力通过这种方式来做,即简单,代码质量也有保证.

之前一直问我们的测试人员,她们有没有自动化的回归测试脚本.因为有的时候改了一些之前的东西,不测一遍,总是心里过不去,担心引入了什么新的bug.而答案是,没有自动化的回归测试脚本.而我们过去的代码,单元测试又不完善.这样每次改了以后都很忐忑.

现在起码我可以把自己写的代码,单元测试都做好,以后修改了代码,对我写的功能有没有影响,跑一遍单元测试就好了,这样不仅提升了效率,对代码质量也更好.

另外现在还有一点做的不足的地方是,单元测试时,往往只是非常简单的单元测试,并没有考虑到各种情况.做一个非常详尽的单元测试.一方面是由于开发人员往往自认为自己写的代码没问题,另一方面也是由于详尽的单元测试其实非常麻烦,需要考虑各种边界情况,我也很容易考虑不到.

这一方面,应该跟测试同学多多取取经,看看有什么好的方法,让单元测试尽可能全面,保证代码的质量.

对代码的性能方面,现在做的也不怎么样.这次让我彻底看清了这个问题.之前是写出来就完事了.并没有做性能测试,只有上uat才能测出来性能怎么样,这是由Spark的特性决定的.而这次写的单机版的一个功能,竟然都没有性能测试,最后测出来发现有很大的问题.

所以我开始思考,是否有办法,对Spark的程序也进行性能测试.毕竟我们在JProfiler中,都能看到每个方法执行的时长,那么,对Spark程序,我们是否通过local模式,配合上JProfiler,初步测试一下性能,保证不会有大问题?

我相信这是可以做到的,以后的代码我也会这么做.

为了寻找简洁优雅的代码,我开始看Sanjay(他跟Jeff Dean是Google唯二的Level 11的大牛)的代码,看了他写的一个Stream项目,以及leveldb中他提交的部分.尽管代码看不懂,但是从编码风格上说,确实非常简洁优雅.比之前看过的开源代码好太多.

偶像

我这辈子,从来没有想过崇拜谁.强如费曼先生,也只是觉得这人TMD牛逼了,没有想过要崇拜他.

但是自从我知道了Jeff Dean这个名字,看了他的相关事迹,便决定跪舔.并感叹,”牛逼的人是真牛逼,菜的人是真菜”,”哪时候我也能达到那种程度,便此生无憾了”.

看他的事迹,提到他有次跟Sanjay一起debug,最终发现是磁盘错误导致该是0的地方变成了1,主要这是通过读Native Code发现的,即Native Code中,该是bit 0的地方,变成了bit 1,解决了这么一个问题.

看得我热血沸腾啊,握草,太TM牛逼了,我现在debug的东西算个P啊.

接着我给他发了条Twitter,问他能不能把他调试一个东西的经历写下来,让我们学习.不过他没回我.

另一个他的介绍是,他跟Sanjay考虑Tensorflow代码大小优化的问题.说,某个地方几KB,有2000+多个stack(具体数据我忘记了),要执行7s.看到这儿给跪了,大佬性能优化都这么牛逼.我们优化的算个P啊.

想想自己连汇编语言都不会,更不知道如何阅读Native Code,只能仰望了.

但是以后有时间,还是需要非常深入的了解一下计算机底层的东西,争取每天进步一点点,离他的距离能越来越近.

看到一句话,是”Fake it until you become it”.所以,遇到问题,自问一句,如果是Jeff Dean,他会怎么做?

回顾二月份计划

技术方面:

  • 去找不同版本的HBase的bug尝试修复(×)
  • 再努力复现公司遇到的HBase问题,争取找出元凶(√)
  • 通过调试Spark源码,找出Spark Executor内存分配的原理.到底什么时候使用Storage Memory,什么时候使用Execution Memory,什么时候使用Shuffle Memory.做聚集操作时,或者普通操作时,用的是哪块内存?进一步确定针对不同的数据量,该如何分配Executor memory,才不会导致资源的浪费.(√)
  • 回顾看过的Hadoop源码,从JIRA里继续深入研究源码(×)
  • 回顾ZooKeeper源码,查看JIRA,继续深入研究(×)
  • 继续多写技术blog,包括自己的总结,翻译过来的,或者转载过来的(√)
  • 多尝试一些新技术,多读精品blog或者一些书籍,借鉴别人的经验(√)
  • 尝试编译Dr.elephant.这个东西还是蛮有用的,之前编译失败了.这个月尝试把源码搞下来,自己定位编译问题并解决.(×)

这个月本身时间就不多,去掉过年在家的时间,只有15天左右.而由于工作也比较忙,没有太多时间,所以就挑了最重要的几个来做,继续研究HBase/Hadoop/ZooKeeper源码的事情没时间去做.

不过倒是有订阅开发者邮件列表,看到JIRA里的一个个问题,感觉那都是肥肉啊,非常眼馋.三月份有时间的话,开始搞起来.

至于编译Dr.elephant么,尝试了,但是没成功.主要是依赖的问题.源码中默认采用的Scala版本是2.10.4,用到的很多库,都是只提供给Scala 2.10.x的.而我们使用的Spark版本,需要Scala 2.11.x.我尝试过将源码中的Scala版本替换成2.11.但是另一个难缠的方式是它用的play版本,默认是2.2.2.而2.2.2没有Scala 2.11.x版本的.我替换成2.3.0,但是play 2.3.0跟play 2.2.2差距蛮大的,而且不知道为什么,即使我依赖中写明了我要用2.3.0,还给我下载并使用play 2.2.2的依赖,烦的很.

看Dr.elephant全部的分支,都是Scala 2.10.x,压根就没想过支持2.11.x.而且已经好久没更新过了.

而且这个月由于对Spark的内存模型了解深了一些,以后对内存分配的事情思考的能多些,对Dr.elephant的需求也就没那么强烈了.

所以最终决定放弃编译Dr.elephant.

文化建设方面:

  • 制定价值观列表,并熟记于胸.(×.制定了,但是没有熟记于心)
  • 读完吴晓波的《吴晓波企业史》.并总结历朝历代的背景,采取的政治经济措施,以及产生的后果(×.大体读完了,但是没有做后面的总结)
  • 阅读《高效能人士的十个习惯》,并以此完善价值观列表(√)
  • 阅读《现代世界史》.这本书实在太长,或许可以从《极简欧洲史》开始更好.(×.压根没读)
  • 阅读几本文学小说类的书籍,第一本是柴静的《看见》,然后是王小波的《一只特立独行的猪》(√)
  • 通过较好的公众号等,深入了解当前国际形势,以及国内形式(√)
  • 《国家地理杂志》,《好奇心日报》等可以继续看起来的.否则老是用自己的眼睛看世界,很容易麻木.(×.看的特别少.)

书大多都是在家里读的,回上海以后,没什么时间,也就没读什么书,也没做什么总结.

生活方面:

  • 将番茄工作法真正使用起来,提升时间管理效率(×.但是通过实践”一次只做一件事”,效率也有不小的提升)
  • 少吃点饭,瘦下来(√.瘦了五六斤)
  • 继续黑芝麻糊等补起来,争取早日恢复一头密发(√.头发掉的明显比以前少了.而且现在的头发比以前要结实了不少,以前又细又软,一看就不正常)
  • 周末出去漫步游两次.现在似乎习惯了周末宅在家里(×.没时间出去走)
  • 游戏时间需要节制(×.在家的时候玩的贼凶)

三月份计划

技术方面:

  • 阅读《Beautiful Code》
  • 去JIRA里面找HBase/Hadoop/ZooKeeper/Spark的ISSUE,并尝试解决.同时积极参与社区讨论
  • 实践对Spark程序做单元测试
  • 实践对Spark程序做初步性能测试
  • 学习如何编写Intellij IDEA插件,尝试实现Scala单元测试自动生成的插件
  • 用改良以后的编码方式编写每一处代码
  • 学习一项实时流处理技术,从Flink/Kafka中选择一个
  • 学习汇编语言,尝试了解一个简单的C程序如何生成Native Code
  • 了解JVM如何将字节码文件转换成Native Code
  • 多阅读INFOQ上的关于架构,云计算的文章

文化建设方面:

  • 背熟价值观准则
  • 阅读《穷爸爸富爸爸》
  • 阅读《极简欧洲史》
  • 看完《历史转折中的邓小平》,这个看了得两三个月了,还没看完,就还剩三四集了
  • 总结《吴晓波企业史》
  • 看《正阳门下小女人》

生活方面:

  • 继续恢复头发
  • 继续少吃饭减轻体重