读书笔记

去年乘着同事去中国回来的机会让带了几本书,其中一本便是“The Clean Coder: A Code of Conduct for Professional Programmers”,人民币¥59,比amazon.com上面英文原版美元$31还是便宜不少。这个月利用业余的时间读了一遍。
这本书的作者是Robert C. Martin,所谓的Bob大叔,之前还读过他的另外一本“Agile Principles, Patterns, and Practices in C#”。语言的风格还是比较一致的,很多是作者自身的经历解释作如何成为一个专业的程序员。并不是很多的大道理,但是还是很值得一个不够专业的程序员,比如鄙人,好好反思并在行动中去实践的。考虑到我是个健忘的人,还是在这里记录下关键的一些行为准则,以便时常对照。
本书开始提到了著名的挑战者号航天飞机灾难,该事故一个重要原因是管理层忽视了在当天清晨时,工程师对于低温下进行发射的危险性发出的警告,且未能充分地将这些技术隐患报告给他们的上级。在这个过程中,工程师们做了他们所能做的事情,但是作者也反问了这是否足够?由此作者引出来专业的最重要的前提是承担责任(Taking Responsibility),在开发中应该维持功能的结构的一致性(Do No Harm),自动化QA,持续学习(Continuous Learning),熟悉计算机专业知识(Know your field), 练习(Practice), 合作(Collaboration) ,了解领域知识(Know your domain), 谦虚(Humility).
其中Know your field提到了作为软件开发人员应该精通的最低限度领域知识包括,设计模式(Design Pattern), 设计原则(Design principles), 方法学(XP, Scrum,…), 纪律(Disciplines including TDD, OOD, …), 设计工具(UML, …). 这方面我的确还有待提高。
接着作者提出了作为专业的程序员如何在应该说不的时候说不(Saying No), 在应该说是的时候说是(Saying Yes). 有以下几点有些意思:

  • Why is a lot leas important than the fact. Providing too much detail can be an invitation for micro-management.
  • There is no trying.
  • Professionals become heroes when they get a job done well, on time, and on budget.
  • If you can’t make your commitment, the most important thing is to raise a red flag as soon as possible to whoever you committed to.
  • It’s easier to say you’ll get a lot done on the weekends, it’s a lot harder to actually muster enough energy to do high-quality work.
  • Professionals know their limits.
  • Professionals are not required to say yes to everything that is asked of them, however, they should work hard to find creative ways to make “yes” possible.
  • Saying “yes”, it’s commitment, Say. Mean. Do.

接下来作者谈到程序员最核心的工作之一, Coding. 其中的一些建议:

  • Your code must work to solve the problem for you by the customer
  • Your code must fit well into existing system
  • Your code must be readable by other programmers.
  • Do not code If you are tired or distracted.
  • Willingness to be helpful
  • Know when to walk away

下面一章作者专门用来推荐Test Driven Development, 其中提到Unit test不仅可以衡量程序可测试性,而且其本身就是关于程序设计的底层的文档,想到之前某些tester对于TDD的理解,不禁莞尔。另外一章作者提到了Acceptance test作为完美需求文档的作用,并确保程序员和Stakeholder之间的理解一致,之后作者提到他对于测试策略的理解。总的来说Bob大叔还是非常重视测试的。
接着作者提出一些对于时间管理的建议,其中包括会议,”Meeting are necessary” and “Meetings are huge time wasters”. 应该拒绝参加不必要的会议,在可能的情况下提前离开,确保会议有明确的议程和目标,控制standup meeting的时间(1个人1分钟),避免在不一致的问题上耗费过多时间, “Any argument that can’t be settled in five minutes can’t be settled by arguing”.
然后谈到了Estimation,Estimation is a distribution and Professionals draw a clear distinctions between estimates and commitments. 之后是如何面对压力)Pressure),其中非常重要的一点是即使在压力的情况,仍然应该follow your disciplines and keep it clean。在和人协作这个话题中,作者提到程序员有时候难以一些工作,但是Professionals work together and programming is all about working with people.
在最后作者推荐了他经常使用的工作,包括Git作为源代码管理工具,IntellJ作为IDE,已经其他的一些开源工作用于单元测试,Issue tracker, 建模工具,其中Git我倒是颇有兴趣尝试下。
总的来说,这次算是浏览了一篇,还是有不少建议可是应用到实际的工作中,包括和人的沟通,对测试的重视,时间的管理等等。

Las Vegas游记

今年至今似乎只写了两篇,还是多留下点东西,以后至少还知道自己曾经在某个时候做了些什么事情。上周请了两天假,周四周五加上周末,去了LasVegas一趟,整好可以记下流水账。
周四早上出发去机场赶7:20的飞机,上飞机前以为东西带全了,结果忘记了非常关键的GPS。两个半小时之后到达拉斯维加斯的麦卡伦国际机场。坐摆渡车到达租车的地方,取车的时候又做了一个错误的决定,没有租GPS,准备去Coscto买一个用完退。在Windows Phone的帮助下,绕了好几个弯停了好几个地方终于开到了最近的Coscto,Windows Phone真的很难用,地图导航和Andriod或者Iphone比起来简直就是渣。很不幸Coscto不卖GPS,或许是因为以前有同样想法的人太多了?所谓偷鸡不成蚀把米。只有回去机场再租了个GPS,这折腾完已经中午了。由于准备工作做得不充分,在去什么地方吃的问题上踌躇了好一会儿,还是在GPS的帮助下去了China down吃了米粉,还行。吃完往回的路上看到了WYNN酒店,直接进去赌场参观了一会儿,然后觉得太累于是开车去定好的宾馆休息。晚上直接去了著名的The strip大道,在Bellagio吃了自助,平时人也不少,排队排了快半个小时,看了外面的音乐喷泉,逛了Paris和Planet Hollywood并小赌20块钱之后回去休息。
DSC_0932
DSC_0923
周五改变了计划,没有去死亡谷国家公园,考虑到周六市区可能人多,于是继续The strip大道,在逛的途中去了杜莎夫人蜡像馆,直接在门口买的票,事实证明又是失策,在别的地方买其实可以便宜一半的,蜡像馆不大,不过是第一次参观这样的地方,感觉还行。基本上把The strip大道上比较大的酒店都逛了一边,中午继续在Paris吃的自助,在两次自助之后晚上完全没有胃口再吃自助,在麦当劳直接啃了个汉堡了事,回去休息。
DSC_1046
DSC_1061
DSC_1065
DSC_1084
周五晚上做了下死亡谷国家公园的功课,因为担心那里太危险,其实倒是杞人忧天了。周六一早出门,去7-Eleven加油买了食物之后沿着160向西,一路都是荒漠的风景,开了一个小时候在一个叫做Pahrump的小镇休息了下,在Walgreens超市买了瓶咖啡继续出发,一个小时之后到死亡谷国家公园,发现这一天不需要买门票,在Zabriskie Point看了一下,然后去了Furnace Creek Visitor Center,加满油后向南去了Bad Water,号称美洲海拔最低地,之后掉头去Rhyolite Ghost town。其实只玩了公园的小半部分,一天时间不够。
DSC_1091
DSC_1123
DSC_1133
DSC_1147
DSC_1149
一路沿着95开回拉斯维加斯,路上几十miles都没有休息点,全是荒漠。回去后吃饭,赌博,睡觉,第二天飞机回到下雨的西雅图,流水账结束。

买房记

很久没有写任何东西,总是没有静下来的时候,自己似乎也并非那样的忙,浮躁吧或许。写点东西不知道是否能好一些,姑且试一试。而最近穷的很,原因是买房。按照中国人的观念,这也算是人生的一件大事,所以记录一下。
其实上半年的时候已经看到了房价的势头,但是个人的原因还是等到五月份从国内回来才开始看房。问了下组里面买了房子的同事,非常热心给我推荐他的Agent,于是便联系了下,约在Star-Buck聊一下,确认了市场的确非常热,完全的卖方市场,以及大概的价位。同样的房子比一年前普遍贵了15%-20%,虽然这和帝都完全没法比,但是还是倍感压力,或许是当年的错误给心里面留下太大的挫折感吧。
老美的房子市场还是比国内的市场成熟很多,至少每个房子的信息和以前的成交记录都是可以清楚地查到的,Agent也是推荐redfin.com,于是开始了看房的经历,其实看的很少。大概在Samammish, Redmond, Kirkland晃悠,看的房子应该不到10个,但切实地感到了市场的火爆程度,最终还是递了一个Redmond Ridge的offer,加价3%,结果第一个offer就成了,我们颇有些失落。其实对于那里的位置不甚满意,但是实力不够,又不想买过于老旧的房子。现在想一想似乎有些失策,位置才是最重要的其实。
于是两周就结束了看房,开始贷款的流程,这些方面Agent可以直接办Loan,这让事情简单很多,而且Agent是说中文的,也比较负责,所以自己所做的无非是准备一些材料的问题。很不幸的是房贷利率飙升,我们开始看房的时候还在3.5,到我们可以贷款的时候已经过4了,最终锁定在4上面,现在似乎已经是4.5了。
现在发现,有了房子便有了无穷的家务和开销了,换厨房的台面,找人洗地毯,买洗碗机,电冰箱,都是开销。还有一块地板需要修,院子的草也秃了,屋顶的苔藓要除,等等等等。
从我买了房以后,似乎市场开始没有那么火爆了,不会又是买在顶上吧。不过人生或许就是折腾吧,总算折腾完一件,至少父母也可以稍微安心点。

修车记

昨天去Body shop把车给取回来了,毕竟是我第一次去修车,值得记录一下。
2012年12月24号大概上午11点的时候,从520高速去Redmond downtown的一个出口出来后红灯右拐,我看了一眼,没车于是踩油门,但是似乎又不是很确定,于是又犹豫了一下,速度没有加上去了,这个时候,听到后面咕咚一声,觉得不妙。下来一看,被后面也是右拐的车追尾了。这个没啥说的,必然是后车全责,虽然我还是觉得自己也有点问题开的。开后面车的是个老爷爷,于是我们把车都开到路边停下,虽然第一次处理,但是以前还是从网上了解过一些,得记下对方的姓名,联系方式以及保险的信息,我给他留了我的姓名和手机号。于是各自走了。
考虑到第二天就是圣诞节,于是等到26号给对方的保险公司PEMCO打电话,之前还准备了下怎么用英文描述这个事情。结果发现根本不用这么麻烦,对方已经report claim了,但是对方把我的电话给错了一个数字,所以他们没有能够联系上我,直接给了我一个Claim Number就说我可以修车去了,不是很清楚流程,于是让他给推荐了一个Body shop,是在Bellevue的Kelly’s body shop。当天下午把车开过去做了一个Estimation, 要换后保险杠,一千多$,约定了某天把车开过来修。回来突然想起来,还没有问租车的事情,于是打电话给PEMCO,告诉我是可以租车的,Body shop的人会帮忙的。
等到约定的时间,突然想起来租车时候的保险问题,于是打电话问自己的保险公司,说是保的。于是把车开过去,Body shop的人给租车公司打电话,十几分钟车就开来了。于是开着走人。
过了两天,Body shop打电话说可以驱车了,于是开过去,拿回自己的钥匙,给了租车的钥匙,一切搞定。
总的来说,还是很简单高效的。

2012总结

不知不觉中,又一年过去了,时间飞逝,这一年过得有些迷糊,还是总结一下吧。
一月份的时候,Redmond下了大雪,大狗在这个时候来访,还帮我们搬了不少吃的过来,所谓有朋自远方来,不亦乐乎,特别在这异国他乡。然后是第一个不在家里面过的春节,心里面失落落的。被同事邀请去他家里面包饺子,感谢。
二月份的时候,老婆学开车把轮胎给撞破了,前面的车身偏入我们道,老婆一紧张打方向盘,于是撞到路牙上,正好是在GoodYear边上,于是直接去修,花费180$,买个教训吧,所谓让速不让道。
三月份的时候,想不起来发生什么事情了,看了看微博,有次打乒乓球踩了别人的脚了。
四月份的时候,真的不记得有啥事情了。
五月份的时候,买了Diablo III,这是我买的第二个正版游戏,于是花费了颇多的时间在这个游戏上面,可能更多的是为了回味当年Diablo 2的时光吧。事实证明,没有那帮在一起玩的朋友,游戏便少了太多的乐趣。这个月还申请了加拿大的旅游签证。
六月份的时候,跑了趟温哥华,悲剧的是忘记了GPS之前被我刷过,没有加拿大的地图,而且是在跑到一半的时候才发现的,不过好的是,还有手机。去了Downtown还有唐人街,边上似乎就是吸毒一条街,那条街上人的眼神都非常不正常。去了Richmond吃了几家中餐馆,那个小南国上海小吃不错,我给了20%的小费。这个月不知道为什么感觉工作身心俱疲,于是匆忙中计划了七月份的旅游计划。
七月份的时候,请了一周假,去了加拿大东部一趟,Montreal,Sherbrooke,Quebec City, Ottawa。看了下老婆当年读书的地方,探访了她的几位朋友,她有两位朋友非常热心,请我们吃了三顿饭,颇有些过意不去,希望有机会回请吧。Quebec City非常漂亮,法式风格,在去那边的路上加油,结果那个店员只会法语,我的信用卡又不能直接刷,只有靠着手势交流,不得不说,那边的人非常Nice。这个月,我还给自己买了Nexus 7,Google的产品做的还是不错的,相对这个价格。这个月还去给车做了第一次的维护。
八月份的时候,很高兴大狗又来了一趟,其实应该是七月低吧,我很怀恋当年的吃喝协会和那帮狐朋狗友,只是能感觉到大狗不怎么开心,但是我也不知道该怎劝她。这个月我还买了SSD硬盘,把我的濒临死亡的T60给挽救回来了。
九月份的时候,我姐在合肥买的房子交房了,可惜还没能去看一下呢,很高兴姐终于在合肥有个安身之所了。这个月的时候工作上拿到一个很差的Review,很受打击,在严重思考到底自己的问题出在什么地方。这个月Sanjay来出差,帮我带了不少东西。
十月份的时候租的房子到期了,本来是想换个两居,但是自己懒而且心情不佳,最终还是决定续租,这个月还看到双彩虹。
十一月份的时候,似乎很是迷恋Dominion,和在这边的两位大学同学一起玩了不少次。
十二月份,这个月看了两场电影,Life of Pi和The hobbit,自己的听力还是不够。这个月国内同事出差,强老板还请我吃了一次饭。这个月还修复了一次笔记本电脑显示的问题,这个月还跑了一次Portland购物,这个月还第一次被别人追尾,找别人保险修车中。
似乎还有Guanyi同学出差,但是不记得是那个月份了,记性是越发差了。
这一年过去了,感谢我的亲人,我的朋友,我的同事,希望你们在新的一年都好。也希望我自己在新的一年能够坚持做到:
1. 每周三次的锻炼.
2. 早睡早起
3. 改掉拖延的习惯.
4. 更加积极的心态.
5. 坚持学习.

修电脑

或说干IT这一行的,修电脑也是基本功。不过有相当一段时间没有练习了,前一阵机会来了。不知道是否是被我给碰的,家里一台笔记本Lenovo E420开机之后显示的内容比实际的屏幕要大,于是Windows的任务栏就看不到了,这就几乎没有办法用了,于是开始尝试不同的方法来折腾。
1. 修改分辨率,卸载安装显卡驱动,问题没有解决,反而不知道为啥新的驱动显示出四个桌面,每个都很小,卸载安装回原来的驱动。
2. 开始Google,看到别人有类似的问题,提到说是因为屏幕的接口线松动了,于是找出E420的拆机手册,拆!把屏幕的接线给紧了紧,还是没有解决问题,反而不小心把手给划了下。
3. 这样就因为有两三个晚上被折腾掉了,在准备放弃的时候,Google到一个叫做EDID (Extended display identification data)的东西,这个是Windows系统读取屏幕信息的地方,同时找到这一片文章提到可以让Windows使用定制的EDID,这似乎是一个可行的方案。于是去wikipedia上进一步了解下EDID的格式,下载了一个叫做EDID Manager的工具,看到系统的EDID的确是错误的,分辨率是1440×900,而E420最大支持的分辨率是1366×768,同时屏幕的尺寸也是不对的。找到对应的问题,修改了EDID的数值,保存后用moninfo.exe打开保存为.inf文件,再去硬件管理器更新显示器的驱动,从硬盘安装保存好的inf文件,重启搞定!
这个过程大概耗费了我四五个晚上的时间,得到以下的结论:
1. 你一定不是遇到这个问题的第一个人,所以Google一定能找到可以帮助自己的信息
2. 了解具体的工作原理,能够帮助自己更有针对性地找到解决的方案。
3. 要支持Wikipedia,要坚持给Wikipedia捐款。
4. 不要轻易放弃

读书改变了什么

前一阵读了中国青年报的一片文章”读书改变了什么“,讲述了一个农村的父亲韩培印怀着理想主义的幻想,辛辛苦苦打工,支撑儿子韩胜利完成了大学,结果却是大学生的工资还不如他自己在工地打工的收入多,憧憬破灭了。曾经是一家人骄傲的事情,却成了村里面人嘲讽的对象,成了家人心头挥之不去的梦魇。如果时光倒流给这个父亲一个另外选择的话,那必然是不会让他儿子上大学。由此引出了一个很现实的问题,读书到底有什么用?
我想多数人读了这篇文章,都会同情甚至是钦佩这位憨厚的父亲,但同情并不能改变什么,这是一个时代的悲剧,类似的事情会一直重演下去。十几年前国有企业改革,精简人员,无法接受毕业的大学生,从1996年开始到1998年,大学生国家分配工作的制度取消,与此同时,国家开始了以“拉动内需、刺激消费、促进经济增长、缓解就业压力”为口号的高等教育的大扩招,或者是所谓的教育产业化,十几年来,大学生毕业人数从1998年的108万增加到2011年的758万,在这样的时代背景下,必然是教育质量大幅下滑,而且严重的供过于求,所以大学生就业难是违反事物规律的必然结果。而韩培印和韩胜利的命运只是这个时代趋势的一个注脚而已。
只不过更不幸的是,这是一位农村的父亲和一个农民的儿子,传统观念和残酷现实的冲突。在中国农村的传统观念中,学而优则仕,在漫长的几千年中,读书是唯一的正经出路。而至少在取消分配工作之前,读书至少可以改变农村人的身份,成为城市户口,有着城里的工作,成为村里面羡慕的对象。对于韩培印来说,这些年的现实摧毁了他几十年的人生信条,而对于韩胜利来说,他要面对的是一条和父辈完全不同的道路,而内向自卑,不善交流这些农村孩子的通病则更是雪上加霜。
读到这片文章,对于来自农村有着类似的体验我而言则更有些切肤之痛。记得在初中毕业的时候,那是97年,我的一位远房姥爷是那个中学的语文教师,他告诉我爸和我关于大学生就业分配制度取消的事情,当时的我并不是很明白这些。在我上高中的时候,邻村有家孩子考上了中科大,那一家成为了方圆一片大家羡慕的对象,那位大学生成为我们的楷模,而我更加感受到周围人的好面子或者虚荣。在2000年的时候,我去了北京上学,同时我隔壁堂爷爷家的一位外孙也去了北京,他是去打工。我这位远方表兄和我同年,月份稍大,能吃苦,头脑活,运气好。在08年的时候自己开装修公司,差点关门,但是四万亿的经济刺激成就了房地产的繁荣,当然他的公司也顺便赚了不少,于是在09年买了房子几套,成为我们那里小有名气的年轻老板了,成为了我们那里羡慕的新的对象。而我则还是幻想着房价会下跌,把攒的一点点钱投入了股市。于是在过年的时候,我这个表兄的父亲在我家酒后大谈读书无用论的时候,我亦无言。记得还是在那一年,同村里面有另外一家的孩子大学毕业,似乎专业不好,而且性格极其内向,找不到工作。过年的时候我去亲戚家拜年,他家在隔壁,他父母让我和他聊一聊,结果他却不愿意出来,我亦无言。
那么读书到底有什么用呢?如果用现在唯一的衡量标准钱来说,对于大部分特别是贫困家庭来说,的确不是好的买卖,小富由勤大富由命。中国经济现在的发展模式并不需要那么多的大学生,学习一技之长更符合这种粗放型的发展模式。而对于现在的很多大学教育,甚至连一技之长都没有教授。可能任何事物都有两面性,对于有些人来说,读书是个好的选择,对于另外一些人,读书可能只是浪费时间和金钱。而我的感受是读书是改变人性格的唯一途径,如果大学四年书读完还不能够对自己有个相对客观的认识,对于外界事物没有思辨的能力,那么这样的教育就是彻底失败和无用的,指望这样的读书去改变什么自然是一种奢望。