拿到ThoughtWorks Offer,不容易啊

华为三年了,也该转变一下了。在华为郁闷的开发,人力不够的左手和右手结对,抽空写代码,都要成为往昔记忆了。

从去年开始就在关注找新工作了,但都是想试试水,看看怎么样。猎聘网上也了解了一些,也投了韩国NHN的简历,也有诺基亚西门子的面试预约,还有一个不晓得啥公司直接叫去面试的。结果这些都没有搞成,买了本《程序员面试宝典》,随便看了看,也准备了一些。后来在发现猎聘网的要求太高了,都是些要求很长工作经历的,对我这种刚出来工作两三年的,显然没有太好的职位可供选择。后来就回到了51job和智联招聘,怀着试一试的心理,修改简历、投简历,直到投到了ThoughtWorks公司。

投了以后我就没管了,我觉得估计是没啥希望的。神奇的是第二天就给我进行电话面试,聊了许久,然后约了时间进行笔试。笔试在成都Office进行的,早上去的,头脑比较清醒。笔试没有其他公司那种对专业知识的要求,做一些逻辑测试题,做的很抓狂。后来就通知做Homework,编程。这些题目都是可以在网上搜索到的,三道题选一个。回家以后,我自己做了一些设计,又参考了一下网上的一些设计,写了测试用例,最后就提交了。

这个环节我还是比较有信心的。然后就是后来通知去Office进行Pair Programming, Technical Interview,也就是上个星期的事情啦。也是早上去的。约得9点半,9点钟我就到办公室,发现同时些都还没来。来了的同时就在厨房弄点早餐,泡点水,很惬意。

9点半钟就开始Pair,但C#的环境还没安装,就一边装环境一边和我交流。反正我这个人就喜欢吹牛,啥都说,自己的博客、自己之前做的项目,已经自己业余开发的东东。当然,看过的很多书以及以前的经验,都是相当有用的。侃大山的能力不是每个人都能做到的。Pair开始了,面试官之前看过我做的题目,然后指出了我测试用例的一些问题。没办法,在公司学到的测试用例的写法,也就是按照业务来写,而ThoughtWorks的TDD的用例写法,则是按照输入输出来写的。后来和面试官交流了很多,慢慢的融入正规的TDD中了。

面完了这一步,我以为就完了。结果还有一轮,这轮是熊杰和另一个同事面试的。大神就在眼前,当然紧张啦。呵呵。面试也是多种问题轮番轰炸,我之前准备的英文自我介绍,也没用上,结果用英文大概讲一个项目。那是一个紧张啊,刚开始事态、单词,都一塌糊涂,后来慢慢好了起来,总算有点流畅了。

轰炸到了中午,有幸和熊杰他们吃了个中午饭,聊了聊华为。我以为下午就有结果了,结果HR通知要等到下周!!!天啊,周六、周天乃至今天上午,都是忐忑不安啊,到底是什么样的呢?中午午休也没睡好,直到下午2点过HR来了电话。

刚开始叫我讲一讲面试心得啥的,后来就谈到了我的一些缺点,我是听得越发不对劲啊,难道是ThoughtWorks把我鄙视了?担心了15分钟,终于谈到了Offer,终于尘埃落定~!!!

总结一下,ThoughtWorks需要的人是一种对编程有极大兴趣的人。我追求效率,追求技术,追求创新,正好符合ThoughtWorks的要求。期待今年6月的新启程!

QA应该写代码

开发人员的时间就像卫生纸,项目经理扯一把,QA扯一把,测试扯一把,开发的时候,纸都没了……这时候已经下午下班了……开发人员只有继续加班了。

今天整惨了,PL要整个变态的数据,要统计什么Infusion、圈复杂度、代码重复度,还要统计什么新老代码之间的……好嘛。费了九牛二虎之力,帮PL搞定了。全是手工自己点击各种工具,效率极其低下。明天过去得看看CI工具,搞个自动化的工具解决!

这就是QA干的事,每天就让你给这样数据那样数据!!我还记得那年去面试华赛的时候,我说做了一个项目,6万行代码左右,2万自动生成,一年时间。面试者问我,一天能搞多少代码,我说大概200多行。他说不用休息了?周末周天不休息了?不玩了?他说,业界水平,每天20行代码,算多的啦。现在我能理解到了,为啥。当时我自己整项目,没有QA,没有啥啥啥的,轻松自在。最近看《软件工艺》一书,其中提到软件工程中,越来越多的时间用来传递信息去了,而且经常出错。写代码从来就是件很简单的事情,但是理解那些乱七八糟的文档,搞清楚”怎么写“占用了太多的时间。

QA应该对我们的代码负责。要做好质量,要得到我们一个时期内解决了多少问题,发现了多少问题。不是靠我们开发人员每时每刻的”记录“,而是可以从开发人员的代码日志入手。当然,这要求开发人员”素质“很高,每解决一个问题就进行上库。这样,最后的日志可跟踪,问题可回溯。整个质量也就会更好一些了。

QA,如果不懂代码,怎么玩?

就当在这里发发牢骚吧……~

没有版本管理就是在悬崖上走钢丝

晚上给单板软件做软件包的时候,发现SVN库上的软件编译不过,找到开发人员一问是否上库,给我的回答是,好像还没有吧。那我说赶紧给我上一下库,我需要这些脚本。

回到电脑面前,一如既往的git svn rebase,一看似乎没有更新啥。再查了一下git svn log,看了一下,时下已经是2月4日,之前那个开发人员的最后一次上库是1月4日。也就是说,一个月以来,他从来没有上库。在紧张的软硬件联调中,每天都会会涉及到代码修改,并且很多修改是反反复复的。开发人员没有自己的一套像样的本地版本管理,经常是xxx.bak,xxx.bak.1,xxx.bak.2这样简单的,浑浊的“版本管理”。美其名曰是”备份“,但一个月以后,我不相信你还能记得住每一个细节。万一,哪天代码突然丢失了,或者服务器崩溃了,磁盘损坏了,怎么办?

同事说,不要对人家要求太高。但我觉得,这并不是一个要求的问题。作为开发者,在开发的同时,也需要思考一下自己的工作。半年前,项目组上库困难,用的是苦逼的ClearCase。在我的再三坚持下,项目组切换成了SVN。换成SVN后,虽然没有git来的方便,但还好学习门槛不是那么高,就像是个自动挡的车,没有太多的难度,踩着油门就可以跑。大家都是本地准备一份代码,然后在服务器上调试好了,然后再手工合入到SVN库上。

其实这也没啥,如果搞定一个问题就上一次库,并且大致写了一下解决了什么问题,那么整个SVN的log价值就很高了。所以,我经常查看svn的log,虽然我只是一个小兵,如果我发现谁经常不写log,或者写的log没任何意义,我会提醒他log的重要性,让他知道对于他自己,以及对于团队的意义。从优秀的开源软件中,可以学到很多的东西,一个重要的原因就在于版本管理日志写的不错。小批量的,精确的上库,能够让后续的问题定位、合入变得更加容易。

例如真的发现一个暂时无法找到原因的问题,可以利用二分法(git也支持),从历史版本中来进行定位。小批量的上库,可以将问题找到,并且能够知道,当时是改了什么问题造成的。少量的代码,也容易定位出具体是什么代码出现了问题。要是,一个月不上库一次,最后上库的时候写了个”联调代码上库“,试问,后续找问题,你确定你能高效的找得到?到时候问一下,为什么这行代码这样改,你能回答的出来么?

切换成SVN后,也有一个好处,我在Linux服务器上就可以使用git svn来进行各种版本管理了。当然,整个团队也只有我一个人再用git,git学习曲线是比较陡峭。但上次我尝试了一下15个人,需要每天合入大量代码的情况下,用git非常高效的完成了整个任务。为了较少学习分支对大家的疑惑,我就一个分支。我给大家总结了标准动作:修改,验证,commit,push,不成功则pull,再编译验证,再push。一旦大家用熟了以后,即便不懂git,也非常完美的搞定了大量代码手工同步的问题。

我用git开发时,每次开发一个特性或者修改一个问题,都拉一个分支出来,并且修正一点,完成一点,就commit一下,等最后开发完毕,通常也就一两天时间,就rebase一下,将svn库上最新的代码搞下来编译验证,没问题后,dcommit到svn上。就这样,几乎没一个功能点,都可以回溯。后续如果出现了问题,还可以利用blame功能,找到问题点。我想,这样一定会比一个月一次上库,来得更高效吧。

我想,对一个合格的、对自己负责的开发人员来讲,在走向”软件工匠“的途中,需要学习一套实用的工具,并且在解决问题中,不断积累、改进工具。当自己的工作变得混乱时,就需要思考一下,是否有工具可以帮忙。当工具没有的时候,制造工具——我想,这就是人和动物的区别吧。

当然,如果你觉得要求过高,则后面你自己加班去吧。

百度云ROM adb神奇的问题

华为G330D在装了百度云ROM后,在Ubuntu 12.04下,用最新的google adt,发现无法显示设备,一直出现问号。

root@derek-desktop:/home/derek/adt-bundle-linux-x86_64/sdk/platform-tools# ./adb devices
List of devices attached
????????????    device

类似这种问题,之前遇到过是显示no permission。使用sudo ./adb kill-server然后再用root启动adb即可。

但这次的问题不一样了,似乎是序列号没法显示。后来在Windows系统上,也基本上是同样的问题。

我记得之前用华为官方的系统是没问题的,所以肯定是百度云ROM有问题。在Google了很久以后,没有任何解决方案,差点就放弃了。

后来看了一下adb的使用,发现有一个adb root命令。试试吧。

root@derek-desktop:/home/derek/adt-bundle-linux-x86_64/sdk/platform-tools# ./adb root
restarting adbd as root
root@derek-desktop:/home/derek/adt-bundle-linux-x86_64/sdk/platform-tools# ./adb devices
List of devices attached
0C37DC6F22FC    device

居然可以了……

就这么神奇的解决了该问题。

推测手机上的adbd不是用的root权限运行的!

另外,还发现弹出移动USB大容量存储设备后,再切换到HOME界面,会导致ADB终端,并弹出大容量设备。真是神奇~~~

阿里云主机免费扩容

我购买的阿里云的系统盘有20G,数据盘也有20G。为了让有限的空间发挥更多的作用,要想点办法才行。

最简单的莫过于透明压缩。Linux下支持透明压缩的文件系统不多,Ubuntu 12.04中,能支持的有btrfs和zfs。之前试了一下btrfs,压缩率虽然还行,但有一次更改了压缩选项后,就起不动了,最后只能所有文件丢失。ZFS在Linux下也有,试了一下,相当好用。在12.04中,无任何问题。

安装PPA,得自己研究一下哟!

https://launchpad.net/~zfs-native/+archive/stable

然后安装ubuntu-zfs

完成后重启一下

我是想让home目录压缩,home挂载到数据盘,所以先将home目录的数据拷贝到另外的地方。

然后,创建一个home目录

zpool create home /dev/xvdb

然后zfs set compression=gzip home,使用gzip要比默认的压缩率更高。之前的使用默认的压缩,压缩率只能到2.5x,用gzip可以到5.x,相当不错。

通过zfs get compressratio home可以看到压缩率

root@cloud:/home# zfs get compressratio home
NAME  PROPERTY       VALUE  SOURCE
home  compressratio  5.10x  -

如果是20G的盘,则相当于扩大到了100G的容量。

那么系统盘的空间也不能浪费了,我们先创建一个img文件,然后将创建一个pool,这样就可以使用连续的空间了。创建一个10G的文件

dd if=/dev/zero of=/disk.img bs=100M count=100

挂载到/dev/loop0

loset /disk.img /dev/loop0

然后

zpool create home/sysdisk /dev/loop0

当然,你也可以将/dev/loop0加入到现在的home下面,使得home的容量进一步扩大。但小心的是,一旦系统盘出现了问题,或者没办法需要回滚数据,则数据可能会丢失。

好吧,就到这里,大家试一下吧,很爽的哟~!