神一样的注释

曾经的我被批评过很多次写的注释写的很糟糕,我原本以为把函数名取得长一点,意思更明确一些,变量更易懂一些,就不用写注释了。结果后来我去年的代码给评奖的时候,说注释不规范,每个函数就几行,看不懂。有一次同事问我新增代码多少,我看了一下代码统计,发现不多,但是突然注意到注释率56%。也就是说100行代码,有56行注释。真是神一样的代码。
这次我倒是真的“专心”写了注释的。每一个函数头都谢了注释,即便是构造函数,也写了注释。

/*******************************************
* 作用:构造函数* 输入:无
*输出:无
*作者:xxxxxxxxxxx
********************************************/
XXXXXXXXX:XXXXXXXX()
{
}

这样,两行代码,写了6行注释,会得到很高的注释率。但,这个注释,真的有用么?
神一样的注释还有:

/**********************************************
Function name:*
Param:*
IN:*
OUT:*
Reference by:*
Called by:*
Return:
History:*
Author:*
Date:*
*********************************************/

刚进公司的时候,发的是一个17寸的LCD,一个代码要滚很多屏幕才能滚完。这些注释都是Source Insight的一个插件搞得,相当霸道。但很多注释完全是为了注释而注释,一个有用信息都没有。每次看到这种注释都有种冲动想把它干掉。前段时间新员工代码检视被软件部经理说注释不齐全,说这些要补齐。幸好当时我看到了,她正在机械的补齐Reference by这些注释。我立刻制止,给她一份我的注释

/******************************************
功能:
参数:
返回值:
作者:
******************************************/

并且,如果没有的信息,不要填。如果返回值是void,这一行就干掉。
我认为注释真的要写一些有意义的东东,写一些不容易变化的,重要的。例如什么函数名写来干啥,下面不是立刻就有?构造函数和析构,如果不是带参数的,也建议不写。谁不知道这是个构造函数?
还有一种特色的注释,如果你打开华为的G330手机的ROM的build.prop文件,你就会看到这种神奇的注释:

persist.fuse_sdcard=false
#DTS2012011902027 guanjunujie 20120120 begin
ro.config.hw_allowformat=true
#DTS2012011902027 guanjunujie 20120120 end
#DTS2012011902069 guanjunujie 20120120 begin
ro.config.hw_allow_ums_and_mtp=true
#DTS2012011902069 guanjunujie 20120120 end
#DTS2012021607935 guanjunujie 20120214 begin
ro.config.switchPrimaryVolume=true
#DTS2012021607935 guanjunujie 20120214 end
# DTS2012022802590 wuye00193878 20120229 begin
ro.config.internal_sdcard=yes
ro.config.hw_cdma_cdg=false
# DTS2012022802590 wuye00193878 20120229 end
#/*< DTS2012031303262 yufei 20120313 begin */
#/*< DTS2012022306777 yufei 20120301 begin */ #/*DTS2012022306777 yufei 20120301 end >*/
#/*DTS2012031303262 yufei 20120313 end >*/
# /* # /* # /* */
# /* DTS2012030302649 tiandazhang 20120303 end> */
# /* DTS2012031100199 tiandazhang 20120311 end> */
#DTS2012030300592 Cheng Wei c81003953 2012-03-09 add begin.
ro.build.characteristics=default
#DTS2012030300592 Cheng Wei c81003953 2012-03-09 add end.
#DTS2012022804910 chensaitao 20120323 begin
ro.config.hw_test_version=false
#DTS2012022804910 chensaitao 20120323 end
# DTS2012062806152 z81003396 20120628 Delete ro.huawei.cust.drm.fl_only=true.
#/**/
# DTS2012032607960 tiandazhang 20120327 begin
ro.config.widevine_level3=true
# DTS2012032607960 tiandazhang 20120327 end
#/**/

# DTS2012041703860 zhangqijia 20120417 begin
# DTS2012080800950 baitao 20120905 begin
ro.com.google.gmsversion=ics_signed_r4
# DTS2012080800950 baitao 20120905 end
# DTS2012041703860 zhangqijia 20120417 end

#DTS2012022002232 wangwenbo 20120220 begin
ro.config.hwft_simrefresh=true
#DTS2012022002232 wangwenbo 20120220 end

我在当时移植4.1的时候,就被这些“注释”搞得头晕眼花。不觉得这些都是些天书么?他们试图想代替版本管理软件,来展现一段历史。

在我们的一些老代码中,也有很多类似的注释,一连几个begin,然后不知道哪里end,然后一行代码被围上了好几个begin。看代码的人不断滚屏。我当新员工的时候就问,为啥要这么搞?凭啥要这么搞?被告知,和代码的时候要方便点。

后来,当我真正用到IBM的Clearcase的时候,我才知道,为啥这样要“方便一点”。Clearcase,至少在7.x版本,还是没有一个元commit的概念。他只能每个文件生成一个节点,对每次commit,都会给不同的文件形成多个节点。每次commit,其实是对几个文件的commit,之间没有丝毫的关系。所以一旦上库后,你想知道某个问题是怎么修改的,你光看一个文件,没法找到其他文件的修改!而SVN,GIT这些,每次commit都是一个完整的集合,则不存在这些问题。所以,在这样老土的版本管理软件下,只能采取类似的注释,企图能够快点找到所有的修改。特别是CMO合并问题单的时候!

但这样,真的是相当的不安全。所以我采取的做法是,我在问题单中贴上我所有的修改,但不在代码中做注释,你想合并问题,自己看我的问题单,理解了,然后再合并。省得由于我的begin end没有整对,到时候怪到我头上。

要准备睡觉了,后面再写一些源代码版本管理之类的小文。最近突然有兴趣写点啥……呵呵。

尊重开发人员

我们的讨论群上,软件部经理发起了一个讨论,如何去改善我们的老代码,如何做好代码守护、重构等。上面有几个人回了帖子,都在说如何搭好UT的架子,如何怎么安全重构。

我直言不讳,如果开发人员连基本的代码都没时间写完,谈什么重构,谈什么质量。平时谈论的最多的就是,如何“抽空”写写代码。当年面试华赛的时候,最后一面,问我问题说我那个项目完成了多少行代码,用了多久。所说一年多,8万行代码。当是面试官就说,每天多少,我说有两三百吧,然后他说那不出去玩了,不休息了。哎,最后他说,业界的水准是20行每天。现在在公司,还真体会到了这个“业界”。

现在做项目搞得所谓的“敏捷”。人力紧张,每个迭代3个星期,整个迭代就4个。“敏捷”中提到的结对编程,在这里,只能左手和右手结对。测试在这个时候不见了,开发代替了测试的工作。每天开发人员最期望的就是不要被杂事所打扰,能够安安静静的编写几个代码。但XX会议,XX方案讨论,完全在打乱着开发人员的思路。而开发人员,能够“抽空”的时间,就是晚上那片刻的安静,或者周六周天的加班。

在疲于奔命的时候,我想考虑得更多,我想把之前我写的不好的代码怎么重构一下,再回头看看。但这就像是打仗一样,没时间回头看看,还有两三个模块等着你去完成。最后在所谓的进度压力下,只能赶鸭子了。领导提倡的三层代码检视固然是个好事。怎么实施?每天把自己的代码写完了测试的没问题了,然后就想回家休息了。每次检视代码都是一次负担。后来领导自己检视了一下代码,三天后,他说看不下去了。

今天某高层领导谈话的纪要中,终于看到了说要重视软件人员了,要纠正一些不正确的观点和绩效考评的思路。真的按照之前的绩效,什么那些代码出了问题,就像受审判一样的对待开发人员。绩效和问题数挂钩,那我宁愿少做点模块,做简单的模块好了。

事实上,我们都想把事情做好。只是“物质上”都得不到满足,加班没有加班费,没有激励,连吃饭都成问题的时候,我还考虑那么多干啥?

应该尊重开发人员了,虽然我们很底层,但真正上面的成功,还得靠我们这些螺丝钉啊。

2012年末,最后两天加班。明天,后天,元旦?未知数。

蛋疼的元旦

早上开晨会,PL说,和PM说了,本周加两天的班。大家有没有啥问题?……元旦,看31号完成的情况。也就是说,这周连续上8天。还好周一请了假在休息了一天,否则这周还真是难熬。

元旦节,真的要搞得蛋疼,等这周累死了,元旦节还真哪里都不想去。出去锻炼锻炼身体,做做自己想做的事情,就好了。2013年,开年就要上7天班,周六说不定又要搞的来加班,只好认了。内部调休也不知道什么时候能够修,今年搞完就剩下4天的调休。说不准调着调着就给你不调了。没有激励,没有挣加班费那样的激情,加班也只能沦为一种形式。至于加班的效果,恐怕只能是时间的堆砌,疲惫,再加上抱怨,其他的就没啥了。

今天也订了机票了,2月9号大年30到广州,256块钱的机票,加上50和130,算下来436,还算靠谱。回来的机票现在看起来还有点贵,再观察一段时间看看了。和丁丁分开那么久,到时候丁丁还认识粑粑不……哈哈。小伙子最近被妈妈剃了一个郭德纲的发型,那是一个的帅。今天都可以自己玩巧克力筒子了,指头很灵活,相当不错!粑粑期待着宝贝的成长,辛苦了妈妈~!

还有一个多月,熬一下吧,但愿过了会好一些吧。

今天不上班

今天请了一天的假,在家休息一下。连续很久都没有双休了,感觉单休总是不能让人满足 ,一方面是 因为一天的时间过于仓促,想干的事情太多,二来是因为想出去锻炼又怕回来累的第二天没法休息。所以双休还是挺好的,至少我可以放心大胆的在第一天出去锻炼,第二天好好的睡个懒觉。

不上班也挺好,晚上不用加班了。最近一直加班,原来周三晚上都是不加班的,但现在搞得来也加班。加班?有钱?木有,在所谓的世界500强,加班费还真的不仅仅是世界500强。早上9点到公司,到晚上9点才下班,12个小时,有时候可能还会延长一点,回家洗个澡,基本上就可以睡觉了。所谓的8个小时,只不过是空谈而已。

上班最希望的时间有两个时间点,一个是中午,可以睡一觉,第二个是周五,可以晚上不用加班。对于周六和周天的期望,都不大,对于即将来到的元旦,可能放假还真是个“圆蛋”。

周六的加班,上半年还可以申请加班费的。一天算下来还是可以。下半年说是财政比较紧张,连加班费都木有了,变成了所谓的“内部调休”。也就是项目组内部记账。还好,我们的PL人很好,记了的帐,调休都比较容易,没有说不给你调休的。听说有些项目组是不管的,基本上加了就白加了。这样看来,我们还是算幸运的。

不上班,还可以充实一下自己。天气太冷没想出去,就窝在家里面,看看书,最近在补充一些算法方面的知识。以前买了本《算法导论》,自己看根本看不懂,还好有公开课可以看,虽然是英语的,但有字幕,讲的细致,理解起来就变得不是那么困难了。

还有一个多月时间,就过年了。PL说争取过年的时候不加班。今年也要到广州去过年,老婆孩子都在广州,去一趟,和爸妈吃个饭,也很温馨。过完年老婆孩子回来了,得争取多的时间陪陪他们,加油~!

希望明天也不上班……钱……

阿里云调整系统分区大小

阿里云的云服务器,40G的硬盘,20G分给了系统,20G分给了数据。那么,如果不加调整,只能用上20G的空间,其余系统占用的20G就不怎么好用了。

那么,有没有办法能够将系统的20G分区分出来呢?有。resize2fs不支持挂在的分区的调整,我们需要将整个root转移到data盘,然后调整fstab和grub,让/挂在到/dev/xvdb1分区中,然后再对/dev/xvda进行调整,然后再将数据恢复回去。

. 备份数据

给data盘

fdisk /dev/xvdb

格式化

mkfs.ext4 /dev/xvdb1

挂载data盘到/mnt

mount /dev/xvdb1 /mnt

搬移整个root

rsync -aAXv /* /mnt --exclude={/dev/*,/proc/*,/sys/*,/tmp/*,/run/*,/mnt/*,/media/*,/lost+found,/home/*/.gvfs}

. 修改fstab和grub.cfg

首先查看GUID编号:

ls -l /dev/disk/by-uuid/
total 0
lrwxrwxrwx 1 root root 11 Nov 10 11:41 56a7fe0d-1d1c-4aa5-82ad-59dedb0177b3 -> ../../xvda1
lrwxrwxrwx 1 root root 11 Nov 10 11:42 cd6331ee-47db-4338-9288-82d66e7e1572 -> ../../xvdb1

看到xvda1的号和xvdb1的号,将在fstab中的56a7fe0d-1d1c-4aa5-82ad-59dedb0177b3替换成cd6331ee-47db-4338-9288-82d66e7e1572即可(每个空间的号不一样哈,不要乱替换)

替换好后,

reboot

如果一切顺利,1分钟之内则可以重新连上。否则只有重置阿里云了……

登录上去,则可以看到:

# mount
/dev/xvdb1 on / type ext4 (rw,errors=remount-ro)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
none on /sys/fs/fuse/connections type fusectl (rw)
none on /sys/kernel/debug type debugfs (rw)
none on /sys/kernel/security type securityfs (rw)
udev on /dev type devtmpfs (rw,mode=0755)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
tmpfs on /run type tmpfs (rw,noexec,nosuid,size=10%,mode=0755)
none on /run/lock type tmpfs (rw,noexec,nosuid,nodev,size=5242880)
none on /run/shm type tmpfs (rw,nosuid,nodev)

xvdb1分区被挂载了。

好了。这下可以分区了。

. 重新分区

重新分区要把以前的xvda1分区删除了。如果想无损分区,似乎可以用resize2fs来做。但我采用的方法是将以前的分区删除了,然后重新将现有的系统拷贝过去。

fdisk /dev/xvda

删除第一个分区,然后新建一个分区,分区大小自己定。

记得按a添加一个boot flag,否则启动不了。然后p以下,应该可以看到有一个*

Device Boot      Start         End      Blocks   Id  System
/dev/xvda1   *        2048    10487807     5242880   83  Linux

然后

mkfs.ext4 /dev/xvda1

格式化

完成后,

mount /dev/xvda1 /mnt

然后,我们又要将现有系统同步过去:

rsync -aAXv /* /mnt --exclude={/dev/*,/proc/*,/sys/*,/tmp/*,/run/*,/mnt/*,/media/*,/lost+found,/home/*/.gvfs}

. 修改分区挂载。

由于重新启动后的分区将是/mnt下面的分区,那么,我们需要修改/mnt/etc/fstab和/mnt/boot/grub/grub.cfg内的挂在点。

修改方法和之前的一样,先

ls /dev/disk/by-uuid看一下GUID,然后再修改即可。

. 重启后,看一下分区信息,搞定。

df -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      5.01.23.724% /
udev            2374.0237M   1% /dev
tmpfs            99264K   98M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            246M     0  246M   0% /run/shm