<本文转自酷 壳 – CoolShell.cn 做者 陈浩> html
在StakeOverflow上有这样一个贴子叫“Confessions of your worst WTF moment”(WTF就是What the fuck的缩写),挺有意思的,我摘几个小故事过来,但愿你们在笑过以后能从中学到什么——全部的经验都是从错误中来的(我在其中加了一些点评) linux
咱们公司的软件是给警察局用的,那是一个对用来处理被逮捕的人的系统,此系统还须要收集脸部特征和指纹信息,而且,这个系统和会向FBI的系统提交这些信息。当咱们在测试这个系统的时候,咱们通常都是用咱们本身的指纹,固然,数据库联着的是咱们的测试数据库。不过,有一次,在咱们测试完后,咱们忘了把系统切换回生产库,因而咱们的测试数据库就联上了生产环境,因而咱们的指纹信息和照片就散布到了其它系统中……清除咱们警察局这边的还好办,可是,你须要波士顿警察局警司去法院签字才能从FBI的数据库中清除咱们的信息。 程序员
点评:测试环境和生产环境的数据不要混在一块儿。 shell
有一次,我须要向新系统中导入一堆数据,由于数据量太大,须要5个小时,只能在夜里来干,在系统须要正式使用前2个小时,数据导完了,此时是凌晨4点。随后,我须要删除一些数据,因而我在SQL命令地上输入了“DELETE from important_table; where id=4”。是的,我没有看到哪里还有个分号,天啊。 数据库
点评:这就是加班工做的恶果。另,在delete以前最好先作一次select。 编程
我把个人管理员口令提交到了一个开源软件的源码里。 服务器
点评:1)版本管理器里的东西是删不掉的。2)一些用户和口令要hard code在代码里,因此,不要混用代码使用的权限和管理员的权限,当心管理程序的运行权限,为其注册专门的用户。 网络
我为一个很大的银行开发软件,在个人代码里,我为一段理论上根本不可能执行到的代码加了一个报错信息。有一天,不可思异的事发生了,这条报错信息显示在了该银行的1800个分行的超过10000个终端上——“若是你看到这个信息,说明整个系统被Fuck了,回家吧,祝你过得愉快!” app
点评:“假设是恶魔”,Assume意为Ass – u – me,意为——搞砸你和我。对于一些关键东西,永远不要作假设。当心你言语中的——“可能、应该、以为、不该该”等词语,程序可不认这些东西。 学习
我远程登陆到服务器上加几个防火墙规则。第一件我想干的事是在不容许任何人的任何链接,第二件是,为某个端口打开访问权限。不过,我在作完第一件过后就把配置保存了,结果其生效了……
点评:这样的事常常发生,作远程网络管理的人多少会有那么几回发生这样的错误。在你将你的网络配置生效前,你得想想,断线了你是否还能登得上去。改配置不要太冲动,生效前检查几回。
咱们的代码中有一个模块完美地工做了不少年了,只是代码太乱了。我说服了个人老板,我能够重写这个模块,因而我花了三个星期来重写这个模块。今天 ,我还记得,个人老板站在个人后面看着我,而我在在流着斗大的法汗珠去fix被我重写的“超级漂亮”的那个模块中一个接一个的bug。从那之后,我不再重写代码了,除非有重大的利益。
点评:这就所谓的屠宰式编程。这个案例告诉咱们两个道理,1)维护代码要用最最最保守的方法来进行。2)重构代码前要像一个商人同样学会计算利益。固然,ThoughtWorks的咨询师必定会告诉你TDD,结对,极限等等方法告诉你若是实践重构。但我想告诉你,一个程序在生产环境里运行好几个年能没有问题是一件很不容易的事,那怕其中的代码再烂,你再看不过去,你都要有一个清醒的头脑明白这几点,1)软件的运行质量是远远大于代码质量的,2)你的测试案例是远远小于生产环境的,3)软件的完美的质量,是靠长时间的运行、测试和错误堆出来的,而不是某种方法论。
————————————————
相信你们作程序员这一辈子中也有不少发生在本身身上的悲催的事儿,欢迎分享。我先分享几个我亲身经历过的事。
一个发生在个人领导身上。
我98年刚参加工做的时候,在某单位网络部门,一次,咱们整个部门去给下属单位培训Cisco路由器,结果咱们发现带去培训地点的设备少带了集线器HUB,设备连不起来。因而领导很不高兴,质问咱们为何没有带集线器?那几个对领导平时就不满的老员工说办公室里没有集线器了,都借给别的部门了。领导想了想,问我:“陈皓,我记得上次我给过你个集线器”,我说,“好像没有吧,我记不起来了,什么牌的?几口的?”,领导说:“什么牌子想不起来了,不过我记得那个集线器是一个口的”。“一个口的?!”,我内心嘀咕着,“真敢说啊”。但我不敢接话了。那几个老员工来劲了——“哪有一个口的HUB啊,一个口的怎么联两台电脑啊?”,领导说:“用两个一个口的不就好了”。领导这话一出,全场一片寂静,无言以对……
后来:咱们全部的组员都离开了咱们的这个领导,咱们的这个领导今天还在那里工做。我想告诉你们,不少时候该走的是领导(包括外企,我上一东家正在裁员,不过我以为该被裁掉的应该是那些经理)。咱们的领导常常出这样或那样的笑话,这让我随时随地地警醒本身——“不要当一个被人笑话的经理”,因而,今天我还在努力地学习技术。
另外一个发生在我身上
刚刚接触Linux的时候,还不是很懂,那时的PC还只有奔3,编译公司的程序好慢啊,有时候为了调查一个问题,须要不断地打log,来来回回地编译,很不爽。直到有一天,硬盘不够了,df一下,发现/dev/shm还有空间。因而,把所有程序copy了过去,发现编译起程序超快无比,爽得不行。因而就把工做环境放在/dev/shm下了,连开发都放在这里了。这一天,开发一个功能,改了十来个文件,加班很晚,以为基本搞定,大喜,回家睡觉。次日一来,发现/dev/shm下空了,一个文件都没有了,问同事,同事不知,同事还安慰我说,上次他的文件也不知道被 谁删了,因而我大怒,告老板!老板也怒,发邮件到整个公司质问你们谁删了陈皓的程序,无人应答。IT部门答,“昨晚惟一的操做就是重启了linux服务器,什么也没干,不过咱们每天备份服务器,能够恢复”,IT部门问我丢的文件在哪一个目录下?因而,我reply to all – “在/dev/shm下……”,哎,人丢大发了……
后来:我很感谢我之前犯的这个错,从那天之后,我开始立志学好Linux,这个错误让我努力,让我发奋。因此,我想告诉你们——尤为是刚出道的程序员,大家要多多犯错,要犯错那种丢死人的错,这样你才会知耻而勇。
再来一个发生在我同事身上的
01年,咱们开发银行系统,在AIX上开发,RICS6000很贵,只能在客户那里开发,开发进度很紧张,慢慢地硬盘就不够用了,系统中有大量的垃圾文件,因而须要清除一些文件,因而有一个同事写了一个脚本,能够自动清除的各类不重要的文件,里面有一条命令大体是这个样子“ rm -rf ${app_log_dir}/*”,意为清除程序运行的日志。为了使用这个脚本,须要在root用户下运行,一开始还不错。直到有一天,某人一运行,整个根就没了。搞得整个团队只能用一周前的备份重写已写好的代码。后来,才发现缘由是${app_log_dir}变量为空,因而成了“rm -rf /*”……
后来:这个过后,个人那个同事,把rm命令改了名,并本身写了一个rm命令,把删除的文件先放到一个临时目录下。而我也由于这个事情,到今天,每次当我在root目录下使用rm时,敲击回车的手都是抖的。(另,rm时永远使用绝对路径)这里,我想告诉你们——犯错不可怕,可怕的是不会从中总结教训,同一个错犯两次。