2010 年 10 月

浏览模式: 标准 | 列表 | 图文
转贴:每位开发人员都应铭记的10句编程谚语

转贴:每位开发人员都应铭记的10句编程谚语

  所谓谚语,就是用言简意赅、通俗易懂的方式传达人生箴言和普遍真理的话,它们能很好地帮助你处理生活和工作上的事情。也正因如此,我才整理了10句编程谚语,每位开发人员都应该铭记他们,武装自己。

1. 无风不起浪
代码设计是否糟糕,从某些地方就可以看出来。比如:

  • a. 超大类或超大函数
  • b. 大片被注释的代码
  • c. 逻辑重复
  • d. If/else嵌套过深


程序员们通常称它们作代码异味(Code Smell),但是就我个人认为“代码警报”这个名字更为合适一些,因为它有更高的紧迫感的含义。根本问题处理不当,终将引火烧身。

译注:Code Smell中文译名一般为“代码异味”,或“代码味道”,它是提示代码中某个地方存在错误的一个暗示,开发人员可以通过这种smell(异味)在代码中追捕到问题。


2. 预防为主,治疗为辅
20世纪80年代,丰田公司的流水作业线因为它在缺陷预防方法上的革新变得出了名的高效。每个发现自己的部门有问题的成员都有权暂停生产。这个方法意在宁可发现问题后马上暂定生产、解决问题,也不能由其继续生产而导致更棘手且更高代价的修复/更换/召回后的问题。

程序员总会做出生产率就等同于快速编码的错误臆断。许多程序员都会不假思索地直接着手代码设计。可惜,这种Leeroy Jenkins式鲁莽的做法多会导致软件的开发过程变得很邋遢,拙劣的代码需要不断的监测和修改——也可能会被彻底地替换。最终,生产率所涉及到的因素就 不仅仅是写代码所消耗的时间了,还要有调试的时间。稍不留神就会“捡了芝麻丢了西瓜”。(因小失大。)

译注:Leeroy Jenkins 行为:WOW游戏中一位玩家不顾大家独身一人迎敌,导致灭团。


3. 不要孤注一掷 (过度依赖某人)

一个软件开发团队的公共要素(bus factor)是指那些会影响整个项目进程的核心开发人员的总数。比如某人被车撞了或某人生孩子或某人跳槽了,项目可能就会无序,甚至会搁置。

译注: bus factor 即指公共要素,比喻了开发过程中的一些共同因素。如果挤上 bus 的 factor 越多,bus 就越不稳定,所以要控制好 bus factor ,以免问题发生。

换句话说,如果你的团队突然失去了一个主力成员,你会怎么办?生意依旧进行还是戛然而止?

很不幸,大多数软件团队都陷入了后一种情况。这些团队把他们的开发员培养成了只会处理他们自己专业领域的“领域专家”。起初,这看起来是一个比较合理 的方法。它 对汽车制造装配生产线很适用,但是为什么对软件开发团队就不行呢?毕竟,想让每个成员都掌握所编程序的细微差别也不太可能,对吧?

问题是开发人员不容易轻易替换掉。虽然当每位成员都可用时,“抽屉方法”很有效,但如果当“领域专家”突然因人事变动、疾病或突发事故而无法工作时, 抽屉 方法立马土崩瓦解。(所以,)软件团队有一些看似多余实则重要的后备力量是至关重要。代码复查、结对编程和共有代码可用成功营造一个环境,在这个环境中, 每位开发人员至少表面上是熟悉自己非擅长领域之外的系统部分。


4. 种瓜得瓜,种豆得豆

  《注重实效的程序员》一书中有这样一段话解释“破窗理论”:不要留着“破窗户”(低劣的设计、错误的决策或者糟糕的代码)不修。发现一个就修一个。如 果没有足够的时间进行适当的修理,就先把它保留起来。或许你可 以把出问题的代码放到注释中,或是显示“未实现”消息,或用虚拟数据加以替代。采取一些措施,防止进一步的恶化。这表明局势尚在掌控之中。

我们见过整洁良好的系统在出现“破窗”之后立马崩溃。虽然促使软件崩溃的原因还有其他因素(我们将在其他地方接触到),但(对“破窗”)置之不理,肯定会更快地加速系统崩溃。

简而言之,好的代码会促生好的代码,糟糕的代码也会促生糟糕的代码。别低估了惯性的力量。没人想去整理糟糕的代码,同样没人想把完美的代码弄得一团糟。写好你的代码,它才更可能经得住时间的考验。

译注:《注重实效的程序员》,作者Andrew Hunt / David Thomas。该书直击编程陈地,穿过了软件开发中日益增长的规范和技术藩篱,对核心过程进行了审视――即根据需求,创建用户乐于接受的、可工作和易维护 的 代码。本书包含的内容从个人责任到职业发展,直至保持代码灵活和易于改编重用的架构技术。从本书中将学到防止软件变质、消除复制知识的陷阱、编写灵活、动 态和易适应的代码、避免出现相同的设计、用契约、断言和异常对代码进行防护等内容。

译注:破窗理论(Broken Window theory):是关于环境对人们心理造成暗示性或诱导性影响的一种认识。“破窗效应”理论是指:如果有人打坏了一幢建筑物的窗户玻璃,而这扇窗户又得不 到及时的维修,别人就可能受到某些暗示性的纵容去打烂更多的窗户。发现问题就要及时矫正和补救。


5. 欲速则不达

经理、客户和程序员正日益变得急躁。一切都需要做的事,都需要马上就做好。正因如此,快速修复问题变得非常急迫。

没时间对一个新功能进行适当的单元测试?好吧,你可以先完成一次测试运行,然后你就可以随时回来继续测试它。

当访问Y属性时,会不会碰到奇怪的对象引用错误?无论怎样,把代码放到try/catch语句块中。我们要钓到大鱼啦!

是不是似曾相识呢?这是因为我们在以前已经都做到了。并且在某些情况下、它是无可非议的。毕竟,我们有最后期限,还得满足客户和经理。但不要过于频繁 操 作,否则你会发现你的代码不稳定,有很多热修复、逻辑重复、未测试的方案和错误处理。最后,你要么是把事情草草做完,要么是把事情好好做完。

6. 三思而后行

“敏捷开发”这个词最近被频繁滥用,经常被程序员用来掩饰他们在软件开发过程中的糟糕规划/设计阶段。我们是设计者,看到产品朝正当方向有实质进展, 我们理应高兴。但意外的是,UML图和用例分析似乎并不能满足我们的愿望。所以,在不知自己做什么的情况下或者不知自己身处何处时,我们开发人员经常就稀 里糊涂地写代码了。

这就好比你要去吃饭,但你根本没有想好去哪里吃。因为你太饿了,所以你迫不及待地找个餐馆,定个桌位。然后你上车开车后沿途在想(找地方吃饭)。只 是,这样会耗费更多的时间,因为你要过较多的U型弯道,还在餐馆前停车,也许最后因等待时间过长而不吃了。确切地说,你最后应该能找到地方吃饭,但你可能 吃的饭并不是你想吃的,并且这样花费的时间,可能比你直接在想去的餐馆订餐所花的时间更长。


7. 如果你惟一的工具是一把锤子,你往往会把一切问题看成钉子

  程序员有一种倾向,当一谈到他们工具时,其视野就变狭窄了。一旦某种方法在我们的一个项目上“行得通”,我们就会在接下来所有的项目上都用到它。学习 新东 西仿佛是一种煎熬,有时候甚至会心神不定。从始至终都在想“如果我用之前的方法做、这个就不会这么麻烦了”。一定要摒弃这种想法,按我们所知道的去做,即 使那不是最完美的解决方法。

坚持自己所知很简单,不过从长远的角度讲,选择一个适合这项工作的工具要容易得多。否则,就会与你的职业生涯格格不入。


8. 沉默即赞同

  "破窗理论"与"变成惯性理论"有着宏观的联系。

编程社区就好像一个现实社区。每个作品都是一个开发者的缩影。糟糕的代码发布的越多,就越容易反映现状。如果你不去努力编写优秀、整洁和稳定的代码,那你每天都将和糟糕的代码相伴了。

同样地,如果你看到别人写出了糟糕的代码,你就要跟这个人提出来。注意,这时候机智就应该用上场了。一般情况下,程序员都愿意承认他们在软件开发中还是有不懂的地方,并且会感谢你的好意。互相帮助对大家都有利,而对问题视而不见,只会使问题一直存在。


9. 双鸟在林,不如一鸟在手

如果可以讨论系统架构和重构,那么就差找个时间把事情做完。为了使正常运作的东西更加简洁而做改动,权衡改动的利弊很重要。当然了,简洁是一个理想目 标, 但总会有可以通过重构改进的代码。在编程世界中,为了代码不过时,会频繁简单改动代码。但有时候你又必须保证代码对客户有价值。那么,你面临一个简单窘 境:你不能一石二鸟。你在重构旧代码上所发时间越多,你编写新代码的时间就越少。在及时改进代码和维护程序之间,也需要找到平衡点。

10. 能力越大,责任越大

  毫无疑问,软件已成为我们生活中一个既基本又重要的一部分。正因如此,开发优秀软件格外重要。乒乓球游戏中的Bug是一回事,航天飞机导向系统或者航 空交通管制系统中的Bug是另外一回事。Slashdot曾发表一文,讲述了单单Google News的一个小失误使一家公司股票蒸发11.4亿美元。其他例子参见《软件Bug引发的十次严重后果》。这些例子便说明了我们正行使着多大的权利。你今天写的代码,无论你是否有意,说不定有朝一日在重要的应用程序中派上用场,这想想都令人害怕。编写正确合格的代码吧!

译注:Slashdot是一个资讯科技网站。

原文来自http://www.jobbole.com/entry.php/297,看了笑笑即可

摘:mysql主从同步快速设置

摘:mysql主从同步快速设置

记录一个比较简便的mysql的主从同步设置步骤,方便日后使用。

安装环境

  • centos 5.4
  • mysql 5.1.xx 采用rpm直接安装
  • xtrabackup 1.2.22 采用rpm直接安装
  • [mysqld]
    server-id = 1
    log-bin
    innodb_flush_log_at_trx_commit=1
    sync_binlog=1
    datadir=/var/lib/mysql
    character-set-server=utf8
    init_connect='SET NAMES utf8'

    设定了默认字符集为utf8,可以按实际情况取舍这段配置。

    2. Slave:/etc/my.cnf
    [mysqld]
    server-id=2
    datadir=/var/lib/mysql
    character-set-server=utf8
    init_connect='SET NAMES utf8'

    3. Master:在master数据库设置用来同步的slave用户权限
    GRANT REPLICATION SLAVE ON *.*
    TO '<slave_username>'@'<slave_ip>'
    IDENTIFIED BY '<slave_password>';

    4. Master:导出数据到slave

    采用xtrabackup来备份mysql,好处是在master的锁表时间很短,在实际的生产环境也可以使用,并且xtrabackup会自动记录同步日志文件的位置。

    sudo innobackupex-1.5.1 --stream=tar /tmp/ | ssh <slave_host> "mkdir /tmp/db; tar xfi - -C /tmp/db/"

    这个步骤会把master的数据包括表结构整个导出并压缩复制给slave,同时解压到slave的/tmp/db目录下。

    5. Slave:导入数据到slave
    innobackupex-1.5.1 --apply-log /tmp/db
    innobackupex-1.5.1 --copy-back /tmp/db
    chown -R mysql.mysql /var/lib/mysql/*

    6. Slave:开始同步数据

    查看/var/lib/mysql/xtrabackup_binlog_info,获得日志文件以及position。

    CHANGE MASTER TO
    MASTER_HOST='<master_host>',
    MASTER_USER='<slave_username>',
    MASTER_PASSWORD='<slave_password>',
    MASTER_LOG_FILE='<see xtrabackup_binlog_info>',
    MASTER_LOG_POS=<see xtrabackup_binlog_info>;
    START SLAVE;

    原文来自:http://www.ooso.net/archives/547,做个备份啦

    怎样让文件目录与VirtualBox中的虚拟机共享

    怎样让文件目录与VirtualBox中的虚拟机共享

    最近在用UBUNTU,那么遇到的问题就是如何让我的ubuntu的文件与windows共享?虽然一般来说我们有常见的几种:
    1、samba文件共享(windows可以直接搜索网上邻居来访问,但配置较烦和繁)
    2、remote desktop,这个,如果虚拟机是XP,那么在连接的时候,默认界面就被锁定了,不方便
    3、VirtualBox自带的sharefolder。推荐的也是这个。
    4、FTP(SFTP)这两种都可以,只是FTP需要HOST装FTP软件,sftp的话,则是需要HOST装ssh,XP装SSH客户端

    现在说说sharefolder吧,如果你开启了这个功能,默认系统会让你选择一个UBUNTU的目录,然后就可以共享了。只是你不知道这个共享后目录在哪里,怎么办?
    这时候,打开网上邻居,你会发现,除了windows network外,多了一个virtualbox network,在这里,你就找到:
    d658c47c4ba11c861f05fc7855ec49d7
    打开后,将这个目录映射为虚拟盘就OK了。
    然后就你可以象在本地一样操作了,灰常爽啊。

    判断QQ号是否为企业QQ

    在商城程序中,不可避免的会给商城的用户展示自己的QQ,于是QQ在线状态就好象比较重要了,因为光显示一个号码并不能使得用户直接与商家交流,所幸QQ提供了这样的功能。

    如果你是个人用户,那么:http://wp.qq.com/就可以生成自己的在线状态,比如我就这样显示了一下:

    点击这里给我发消息
    但如果你是企业QQ,上面的功能就不能用了,因为企业QQ的状态与其他的不太一样,他的在线状态生成在这里:http://b.qq.com/wp/

    但目前从网上找的资料来看,好象没有更好的办法来判断用户是否是企业QQ,因此只能找了一些相关资料:

    企业QQ是按您所购买的工号数,来收取相应的年费的。我们按工号数量划分为3个套餐,您可以根据自己的需要,购买我们的产品。同时我们会免费赠送一个尊贵的400/800开头的10位企业QQ号码,此企业QQ号码,可以与您的热线400/800电话一致,从而尽显您企业的专业形象。具体经销商联系方式,请参见“企业QQ经销售联系方式”。
    所以只能现在这样判断:10位的数字,前三位是400或者800:
    <?php
    $qqnumber = '';
    $bizPre = substr($qqnumber,0,3);
    if( ($bizPre == '400' || $bizPre == '800' ) && strlen($qqnumber) == '10' ){
    //企业qq
    }
    //至于那个判断是否是QQ号的,这里就不写了,也只是简单的判断而已
    于是,就可以根据QQ号显示不同的在线状态了
    关于resolv.conf文件

    关于resolv.conf文件

    /etc/resolv.conf,这个文件是DNS域名解析的配置文件,它的格式很简单,每行以一个关键字开头,后接配置参数。

    resolv.conf的关键字主要有四个,分别是:

    nameserver #定义DNS服务器的IP地址
    domain #定义本地域名
    search #定义域名的搜索列表
    sortlist #对返回的域名进行排序

    较为简单的/etc/resolv.conf示例:

    domain neatstudio.com
    search www.neatstudio.com neatstudio.com
    nameserver 8.8.8.8
    nameserver 4.3.2.1

    最主要是nameserver关键字,如果没指定nameserver就找不到DNS服务器,其它关键字是可选的。(一般dhcp的时候都会带有nameserver过来,也可以自己指定一下nameserver)

    使用UBUNTU作为常用开发环境

    使用UBUNTU作为常用开发环境

    最近,使用UBUNTU作为了我在单位的常用开发环境,虽然有时候还是不太习惯,但大多时间里我还是能够顺利的使用了。
    比如,我的开发工具选择了Netbeans这个基于JAVA的IDE,他有一个好处就是跨平台,因此,在WIN用使用了它之后,到LINUX下再使用的时候,就很顺利了(而且MAC下面也有该软件,如果哪天我用MAC了,它也能用,HOHO)

    浏览器,FIREFOX,这个就不多说了,反正我的插件和WIN下一样(fastdial,firefox sync,search status,firebug,firecookie,readitlater等),也没有什么不习惯的地方了。

    没有editplus,但是有gedit。

    邮件,没有foxmail,但是有很多类似的,比如thunderbird

    FTP,我在win下用filezilla因此,UBUNTU下也可以用这个,很爽。

    唯独几个不爽的就是IM了,都不太好用。MSN吧,不太好,GTALK算是比较正常的,QQ吧,问题多。。不得已,经用virtualBox装了一个虚拟机,里面跑起了XP,然后在里面跑QQ。。。(最主要的原因是WEBQQ和LINUXQQ不支持讨论组,而我们部门偷懒,没用架群,直接用讨论组了。。。)

    再接下来不爽的就是,明明我smbmount开发机上共享的目录到本地的,但权限总是1002,除了root外无法更改。但是用GUI界面的:ConnectServer工具,就可以直接连接上(问题在于连接上后,找不到在映射在哪个目录下,无法直接用IDE打开了)

    最后netbeans直接打开remote功能,本地保存代码的时候,自动提交到remote上去。至此,几乎没有不能完成的工作了。(好象除了网银等不支持外,其他都可以接受,以前的aliedit的xpi不支持了。。伤心,不过刚才试了一下建行的网行,用firefox顺利打开,可惜我建行里没钱,也没有开通更多功能,失败呀)

    界面嘛,就是关闭在左边不太舒服,还好几乎所有的软件都支持ctrl+w(关闭),问题也就显得不那么明显了。当然也算是习惯一下,等哪天我用苹果的时候,就可以少习惯几天了。阿Q很开心

    64位的win7

    64位的win7

    这两天为了满足自己笔记本4G内存的兽欲,决定把电脑升级成win7 64位的,说起来这台电脑所装过的系统就多了,XP,2K,2K3,win7 32位,win2008,还有ubuntu 8.10,9.04等,但64位的系统,我是第一次装,于是就开始了我的处女安装。

    由于ultraISO强劲的功能,以及我那可爱的电脑能够优盘启动,于是我选择了将ISO刻录到优盘的功能,也避免了那所谓的U盘量产。然后重启后就能安装了(在将ISO刻录到优盘时,我开始是用移动硬盘,但都失败了,灰常郁闷,最后不得不选择优盘)

    安装速度很快,20分钟不到就完成了。几乎所有的驱动都认出了,当然最重要的是网卡驱动,有了它,剩下一些不太能认的驱动,也通过自动更新完成了,然后就是一系列软件的安装:netbeans,sogou wubi,youdao dict,wiz explorer,360(安装这个,只是为了更新补丁的时候会比较方便,还有可以方便设置一些自动启动,而不要让我手工改msconfig之类的配置)

    其实一切都很方便,除了QQ,我从2010最新版装到2009版,然后又装了tm2009,没有一个能够正常运行。最后只能哭着放弃了。结果刚才晚上回来,我尝试了一下,2010最新版,居然又能成功了,不过,我是安装在D盘,而且不是在x86的目录下,我指定了D:\Program Files\目录,难道是这个原因?

    值得开心的是,我现在几乎所有的软件都安装完毕了,只是office不敢装了,我已经装了2遍,不知道我的序列号还能用几次,好郁闷啊。我的正版office...等咨询后再装。

    OK,上面就是我的win7 64旅程开始。(最后说一句,最新版的QQ有群分组功能了,感觉不错,因为我加入的和创建的群太多了。。。)

    杂谈

    传说中,taobao公司的Dba很牛叉,只是一直在关注他们的博客时,发现QA其实也很牛叉。看他们每月的测试中都有一些算法题,而且完成这些题目的语言也是各种各样,也就觉得自己真的很丢人了。。。

    看这个吧:Mysql Query Cache学习篇,讲的很详细,不知道淘宝的QA薪水怎么样,他们是怎么面对QA这个职业的,毕竟在很多公司QA都处于一种很尴尬的位置。博客精华文章,是淘宝QA他们的一些精华,确实值得一看。

    再转一些javascript的东西,司徒正美博客上的:一些javascript题目,然后我也想着一个很奇怪的事情。好象DZ对firebug作了一点处理?屏蔽了firebug的console的输出(可能是写了同名函数等覆盖了?我没有仔细研究过,只是在测试DZ代码的时候发现没有数据输出)

    最后再想着scala和java,前段时间看了一阵,但突然又忘光了。(如果工作中用不到这类语言,想真正学确实比较烦,等工作走上正轨后,就要开始考虑用这类语言做点东西了。)

    ThinkInLamp Mysql专场之杨涛涛 的PPT

    ThinkInLamp Mysql专场之杨涛涛 的PPT

    10月16日 ThinkInLamp Mysql专场中,杨涛涛作了关于MYSQL数据库的优化,最近他在自己的博客上将PPT放了出来,我在这里做一个简单的备份,其实还有SNDA几位DBA的PPT也已经出来了,他们的在thinkinlamp.com 上已经提供下载,我就不再转载了。
    我个人相对来说还是比较喜欢mysql的优化,或许对于数据库的设计 我还是停留在程序员的阶层吧。

    OK,翠花,上PPT(哦,是PDF版的)
    20123c5d0b5ae3ec903ee28aa9f28fdb

    嗯。顺便再附上一份mysql优化的PPT
    29056b4488acc43cef88c56535f48502

    Robots文件的写法

    如果你想你的网站能够被更好的访问,恐怕robots文件是相对比较好的解决方案之一,但很多人都忽略了这个玩意。
    当你的网站的一些内容不想被蜘蛛访问时,但事实上他却不由自主的被蜘蛛抓取而显示在网站上,于是我们就不得不利用robots来disallow一些目录。
    内容就大致如下喽:

    User-agent: *
    Disallow: /xxx/

    如果所有的目录都不想被蜘蛛抓取,那就是

    Disallow: /

    除了目录外,还可以禁止一些特殊的后缀名的文件被蜘蛛抓取,比如你的网站图片是专业的有版权的,当然不希望被蜘蛛抓取,因此,你可以写成类似这样:

    Disallow: .jpg$
    Disallow: .jpeg$

    上面写的User-agent是针对的所有的蜘蛛,如果你不想某个蜘蛛来抓你的网站,你可以单独指定某些蜘蛛disallow,而其他的为allow

    一些User-agent类似如下:

    百度蜘蛛名字:baiduspider
    谷歌蜘蛛名字:googlebot

    其他的我也说不清楚太多,不过你可以通过查看apache日志来进行查看那些蜘蛛的User-agent。

    说的不是很多,希望有点帮助吧,其实我也是做点笔记。