2010年10月31日
你是否工作在这样的一个大公司里——他们工作效率缓慢,会议无穷无尽?你是否有被告诉去完成一个任务,去开发一个API,但你的不知道它会用在哪里,怎么用?你只是按照文档在技术上把它正确的实现?
“如何做”是一个开发人员在团队生活中需要知道的最有价值的信息。但遗憾的是,有些人却认为这是开发人员在项目中唯一要知道的事情。
我们不能这么认为。
如果不知道自己做的究竟是个什么东西,即使是最高效的Ruby on Rails家伙,最熟练的Spring开发人员,或PHP编程者,也不可能做出最有价值的东西。
你们中有多少人,曾经写出了API,但却不能说出它们将被在哪里、如何使用?有多少人曾生气的追问“你们要怎么用它们?我按照规格书里的要求把17个Web Service都开发完了,但现在你们只用了其中的4个。该死。”
我认为,一个开发人员如果想把工作出色的完成,除了要知道“怎么去做”外,还必须知道自己究竟做的是什么。
然而,知道做的是什么和如何做,这还不够。
我深信一个开发人员还需要知道和理解“为什么这样做“。只有当你知道这些后,你才能开发出最有价值的产品。
为什么会有这个项目?为什么需要这样的产品?该死,为什么会有这样的公司?每个人都需要问这样的问题。当知道并理解了“为什么”后,我们才能做出最优的解决方案。
知道了“为什么”,我们才能真正的理解项目的目标,产品的目标和公司的目标。它能激励我们,因为我们看到了大蓝景。
理解了“为什么”会使决策更加准确。
我们要坚持从是什么 和 为什么入手。这样我们就知道如何最好的去做了。
这一招对我很有效。而你又是如何走上成功之路的呢?
[英文出处]:Developers should know How, What and Why
所谓谚语,就是用言简意赅、通俗易懂的方式传达人生箴言和普遍真理的话,它们能很好地帮助你处理生活和工作上的事情。也正因如此,我才整理了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
2010年5月12日
问题:装SQL 2005 检测信息时,老是显示“COM Plus Catalog Requirement(warning)”,我用的是XP系统,装的是开发版~~
原因:你的COM+应用程序出错,装的IIS有问题所致~~
解决方法:
“开始”->“设置”->“控制面板”->“管理工具”->“组件服务”中,“控制台根目录”->“组件服务”->“计算机”->“我的电脑”->“COM+应用程序”中,
(1)
到com+应用程序这一步时,弹出:"执行最后操作时发生错误,错误代码80080005-服务器运行失败"的错误.咋办啊.
一、 开始运行msdtc -resetlog ,问题解决,能打开了。
二、再看看 Distributed Transaction Coordinator 服务有没有打开
三、重装IIS
(2)
回到“ “COM+应用程序” ”中, 有一个“IIS Out-Of-Process Pooled”鼠标右键“属性”--“标识”--把“此用户”调整为“交互式用户--目前已登录的用户”。然后“确定”,再鼠标右键“属性”--“启动”。
(3)
设下IIS的 “ 目录安全性选项卡 ”---- “ 匿名访问与控制 ” , 在“集成Windows身份验证”打勾
2010年5月4日
今天连接到服务器上查找东西,无意中发现服务器中保存SQLServer2005数据文件的文件夹下多了N多trc文件。简单的看了一下,总共210个文件,一个文件约占200MB,总共占用了29GB的空间。这下知道为什么前一阵子听测试的人员报告说服务器磁盘空间满了,原来都被这些给占用了。
于是登陆到DBMS上,查看了一下数据库服务器的属性,结果发现不知道是谁把Security标签下的Enable C2 audit tracing前的复选框勾中了,这下终于找到罪魁祸首了。于是乎将该选项前的勾选取消掉之后,删除文件夹下的全部trc文件,硬盘由此又增加了很多的空间。
PS:一般在正常使用时,数据库的C2审核是不需要开启的,除非是需要进行详细的调优或是程序的debug,此时开启C2审核之后可以用Profiler打开生成的trc文件查看。否则的话为了节省咱的硬盘空间,还是将C2审核关掉吧。
附:一些关于C2审核的相关链接资料(备查):
http://technet.microsoft.com/zh-cn/library/ms187634(SQL.90).aspx
http://www.cnblogs.com/NationWoo/archive/2010/03/31/1701532.html
http://technet.microsoft.com/zh-cn/library/ms189631(SQL.90).aspx
2009年8月18日
CentOS系统:
uname,获取系统信息:uname -a 列出全部的信息;uname -r 列出安装的Linux kernel版本信息。
cat /etc/redhat-release 查看当前安装的CentOS具体版本信息。
2008年12月5日
1.在运行时配置内核参数,可以使用sysctl命令
2.sysctl命令用法举例:
参数:-w 此选项用于改变一个sysctl设置
例:sysctl -w net.ipv4.ip_forward=1
参数:-p 此选项用于载入sysctl配置文件,若-p后未指定路径,则载入 /etc/sysctl.conf
例: sysctl -p /etc/sysctl.conf
3.可以通过修改/etc/sysctl.conf文件,将参数设置进行保存,以使得在机器重启后原有设置仍然有效。例:
vi /etc/sysctl.conf
修改: net.ipv4.ip_forward=0的值为1
作用:打开数据包的转发功能
若需要使修改马上生效,则:
sysctl -p /etc/sysctl.conf //重新载入/etc/sysctl.conf文件
4.附一些有用的链接:
http://en.wikipedia.org/wiki/Sysctl
http://os.cnfan.net/freebsd/2078.html
http://tech.ddvip.com/2008-01/120091029240855.html
最近一段时间为一个项目做项目实施,其中涉及到了使用CentOS5.1操作系统假设一台网关服务器的问题,要通过其实现外网计算机访问不到内网的主机,内网中仅指定的主机才可以访问外网的功能,经过一番测试之后终于能够实现了,现在将实现的过程记录下来,以备今后的不时之需。
一、所需软件:安装了自带的iptables防火墙的CentOS5.1操作系统
二、前提准备:
1.进行网关的相关配置,为了方便起见,使用root用户登录到系统中;
2.首先对网关服务器的两块网卡进行网络设置,其中内网网卡设置的时候网关的地址空白,设置好之后检查一下网关服务器是否能够上外网,以及与内网是否已经联通。均联通之后将内网网卡和外网网卡的设备号分别记录下来。(在本例中,内网网卡设备号为eth1、外网网卡设备号为eth0)
3.要实现内网主机可以通过网关服务器上外网的功能,需要将网关操作系统中的数据包转发功能开启,可以通过sysctl -A命令查看当前内核参数设置,找到其中net.ipv4.ip_forward项查看其对应的参数值(0表示未开启,1表示开启)
4.如果在上一项中发现的参数值为0,则需要将内核的数据包转发功能开启,具体实现方式为:
输入vi /etc/sysctl.conf命令打开配置文件,找到其中net.ipv4.ip_forward所在的行,将"="后面的数值由0更改为1,之后将文件保存后退出vi编辑器。
5.将配置文件修改完成后,可以使用sysctl -p /etc/sysctl.conf命令或将操作系统重新启动,以使参数生效。此时准备工作已经完成,接下来对防火墙的规则进行配置即可。
三、ipables规则设置:
1.此例中使用CentOS自带的功能强大的iptables防火墙来实现上述的要求,此时需要对iptables的规则进行设置,运行vi /etc/sysconfig/iptables命令,打开规则配置文件,按照下面给出的配置文件模板进行设置:
1 # Firewall configuration written by system-config-securitylevel
2 # Manual customization of this file is not recommended.
3 *filter
4 :FORWARD ACCEPT [0:0]
5 :INPUT ACCEPT [0:0]
6 :RH-Firewall-1-INPUT - [0:0]
7 :OUTPUT ACCEPT [0:0]
8 -A INPUT -i eth1 -j ACCEPT //此处的eth1按实际更改为内网设备号
9 -A INPUT -j RH-Firewall-1-INPUT
10 -A FORWARD -j RH-Firewall-1-INPUT
11 -A RH-Firewall-1-INPUT -i lo -j ACCEPT
12 -A RH-Firewall-1-INPUT -i eth1 -j ACCEPT //此处的eth1按实际更改为内网设备号
13 -A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
14 -A RH-Firewall-1-INPUT -p 50 -j ACCEPT
15 -A RH-Firewall-1-INPUT -p 51 -j ACCEPT
16 -A RH-Firewall-1-INPUT -p udp -d 224.0.0.251 --dport 5353 -j ACCEPT
17 -A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
18 -A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
19 -A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
20 -A RH-Firewall-1-INPUT -p tcp -m state -m tcp --dport 22 --state NEW -j ACCEPT
21 -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
22 COMMIT
23 *nat
24 :PREROUTING ACCEPT [0:0]
25 :POSTROUTING ACCEPT [0:0]
26 :OUTPUT ACCEPT [0:0]
27 -A POSTROUTING -s 192.168.1.1 -o eth0 -j MASQUERADE //此处为转发规则设置,增加访问外网复制此行即可
28 //上述中ip地址要按实际设置为允许访问外网机器的ip地址,eth0也要按实际更改为外网设备号
29 COMMIT
30 # Completed
2.编辑好规则配置文件后,保存并退出vi编辑器。
3.只有运行service iptables status查看系统当前iptables服务的状态。如果为stop,则使用service iptables start命令将其开启即可;如果为Start,则使用service iptables restart命令将其重新启动以使新的规则设置生效。
4.此时即可实现网关服务器的设置,可以到那台允许访问外网的主机上访问一下外网以检测设置是否正确。
2008年11月6日
最近一段时间在玩Ubuntu的Linux操作系统,更新的时候倒是很方便但是一切的东西都需要apt-get才行,安装光盘只有最基本的内容,没有网络的话感觉非常不爽。算了闲话少说,本文的目的是记录一下Ubuntu各个版本的信息,因为我发现Ubuntu的各个版本的代号都挺有意思的,于是就Goole了一下找到了现有的各个版本的信息留在这里。
发布版本 |
开发代号 |
发布时间 |
中文 |
4.10 |
Warty Warthog |
2004年10月20日 |
多疣的疣猪 |
5.04 |
Hoary Hedgehog |
2005年4月8日 |
白发的刺猬 |
5.10 |
Breezy Badger |
2005年10月13日 |
活泼的獾 |
6.06 |
Dapper Drake |
2006年6月1日 |
伶俐的公鸡 |
6.10 |
Edgy Eft |
2006年10月6日 |
尖利的小蜥蜴 |
7.04 |
Feisty Fawn |
2007年4月19日 |
烦躁不安的小鹿 |
7.10 |
Gutsy Gibbon |
2007年10月18日 |
胆大的长臂猿 |
8.04 |
Hardy Heron |
2008年4月21日 |
坚强的苍鹭 |
8.10 |
Intrepid Ibex |
2008年10月27日 |
勇敢的野山羊 |
9.04 |
Jaunty Jackalope |
2009年4月23号 |
?? |
2008年10月17日
由于Linux的内核目前还不直接支持NTFS格式的分区,因此需要给内核打上支持NTFS的补丁,因此首先要执行以下几步:
1.使用uname -r(uname -a)命令查看当前Linux系统内核的版本号。
2.到
http://www.linux-ntfs.org/网站中查找与当前系统内核版本号一致的rpm格式的NTFS补丁,并下载到硬盘。
3.使用rpm -ivh kernel-module-ntfs-x.x.x.x-x.x.x-x.x.x.x.i686.rpm命令将,对应的NTFS补丁安装好。
之后就可以使用mount命令来挂载Windows下面的NTFS分区了:
1.先使用fdisk -l命令来查看系统中硬盘的信息,形式如下:
Device Boot Start End Blocks Id System
/dev/sda1 * 1 2551 20490876 7 HPFS/NTFS
/dev/sda2 2552 19457 135797445 f W95 Ext'd (LBA)
/dev/sda5 2552 7650 40957686 7 HPFS/NTFS
/dev/sda6 7651 9014 10956298+ 7 HPFS/NTFS
/dev/sda7 9015 10926 15358108+ 83 Linux
/dev/sda8 10927 15528 36965533+ 83 Linux
/dev/sda9 15529 15659 1052226 82 Linux swap / Solaris
/dev/sda10 15660 19457 30507403+ 83 Linux
2.使用mkdir /mnt/x命令在mnt文件夹中创建新的文件夹,用来对应Windows下的分区。
3.再使用mount -t ntfs /dev/xxx /mnt/x 命令将Windows下的各分区挂载在新建的文件夹里,例如:
mount -t ntfs /dev/sda1 /mnt/WinC
如果需要设置在系统启动时,就将分区自动进行挂在的话,则需要做以下步骤:
1.使用vi /etc/fstab 命令,打开fstab文件进行编辑。
2.在文件中以后的数据之后添加一行新的数据,形如:
/dev/sda1 /mnt/WinC ntfs defaults 0 0
3.保存之后,以后再次启动Linux时系统会自动将Windows下的C盘挂载到/mnt/WinC目录下。
2008年6月5日
又是许久没有更新博客了,主要原因一个是工作忙,另一个是觉得没有什么可写的。最近发现一个问题——很严重的问题,现在的我做事情很没有长性经常是半途而废,没有一件事情坚持下去的。这样来看博客的问题其实根本原因还是自己的毛病又犯了——浅尝辄止。其实仔细想想还是有很多东西可以写一写的,只是自己没有发觉且缺少发觉。工作了3年了发现很多的东西其实会常用到的,只是一次用过之后没有记录下来,下次再用的时候又要费时间去找,像这些东西其实多可以记录下来的,以后看着也方便。
一定要把这件事情坚持下去,经常进行更新。