weitom1982

向各位技术前辈学习,学习再学习.
posts - 299, comments - 79, trackbacks - 0, articles - 0
  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理


1、甲A026/027/028是最牛的,路上一定要躲得远远的,通天级人物阿……
   如果甲A026/7/8再挂个警备、安个警灯(车里,中控台上方),那么在中国这片大地上就没有车能超过他们   比他们更牛了……
   京ET也很牛,都是和国务院老干部沾边的……
   京AG6就不说了,也是牛B的挂警备又有安警灯的也不要惹(废话)……
   只挂警备没警灯的,就是假的了,当然也不排除靠关系搞的牌子,但肯定是有水分的。
  “023”、“323”,塑封的置于前挡风左下角的,北京市委的车,不是很牛,警察一般
   不管,但脾气不顺了也会管管的……
  “安全”置于前挡风左下角的,北京市政府最高级别车辆,没人管,比较 牛……
  “国A”,置于前挡风下端,国务院的,不用说了,也很牛……
  “901”金融通行证,以前叫“免检通行证”也还行……
  “京安”这个正是用来代替“警备”的,带原来的警备谁也不撤,没辙,只好一起用了……
   还有就是京A80开头的,国管局等的车,也牛……
  “使”字牌子前5号的,有外交豁免权……

2、京A81、82、83开头的也牛,京A88:钓鱼台。
   庚A,军区司令部,庚G,北京警备区。甲 A:总参、甲B:总政、甲C:总后、甲D:总装、未A:海军司令部、午A:空军司令部、甲F:军事院校、甲N:二炮司令部、WJ01:
   武警总部、WJ31:武警北京总队。
   京OB,北京市公安局及下属各分局。
   京OD,北京市公安交通管理局及下属各支队。
   京OE,北京市铁路公安局。
   京A-****警,北京市公安局及下属各分局各总队,警务车如治安防暴巡查等。
   京A-A***警,法院警务车。京A-B***警,检察院警务车。   
  
3、025、026、027、028、029都是军委和总参领导专车,更牛的是020、021、022、023、024,都是中央政治局领导专车。
   黄色字体“警备”牌是一级警备,发行量不多,多数用于国家、中央政治局、军委专用开道车,白色的是普通警备牌,数量多些。

4、京A81是中直国管局,京A83是北京市政府。
   京AG6XXX是全国人大副委员长、全国政协副主席专车。有BUICK、A6、S320

5、中国最NB的车是:甲A02156,是黑色德国特制AUDI A8 4.2 

6、补充说:白字“警备”好像是公安部发的,“警备”加“京安”的车证组合可算是一级车证了。还有“特别通行”、“禁毒”也比较牛,铁的,红的,有备案号。新出一种“通”字牌也牛 。而且,车里都带红外线感应的,李委员长原来去河北时,走京石高速就是,车对超速探头都有反应。所以,通知全部关掉探头。而且都防弹。


北京市(京)
京A、京C、京E、京F、北京市(城区),京G 北京市(远郊区), 京B 出租车,京O警察

天津市(津)
津A、津B、津C、天津市 ,津E 出租车

上海市(沪)
沪A、沪B、沪D 上海市区,沪C 远郊区

重庆市(渝)
渝A 重庆市区(江南),渝B 重庆市区(江北),渝C 永川区,渝F 万州区,渝G 涪陵区,渝H 黔江区

河北省(冀)
冀A 石家庄,冀B 唐山,冀C 秦皇岛,冀D 邯郸,冀E 邢台,冀F 保定,冀G 张家口,冀H 承德,冀J 沧州,冀R 廊坊,冀T 衡水

河南省(豫)
豫A 郑州,豫B 开封,豫C 洛阳,豫D 平顶山,豫E 安阳,豫F 鹤壁,豫G 新乡,豫H焦作,豫J 濮阳,豫K 许昌,豫L 漯河,豫M 三门峡,豫N 商丘,豫P 周口,豫Q 驻马店,豫R 南阳,豫S 信阳,豫U 济源

云南省(云)
云A 昆明,云B 东川,云C 昭通,云D 曲靖, 云E 楚雄彝族,云F 玉溪,云G 红河哈尼族,云H 文山壮族苗,云J 思茅,云L 大理白族,云K 西双版纳,云M 保山,云N 德宏傣族,云P 丽江,云Q 怒江傈族,云R 迪庆藏族,云S 临沧
       
辽宁省(辽)
辽A 沈阳,辽B 大连,辽C 鞍山,辽D 抚顺,辽E 本溪,辽F 丹东,辽G 锦州,辽H 营口,辽J 阜新,辽K 辽阳,辽L 盘锦,辽M 铁岭,辽N 朝阳,辽P 葫芦岛,辽V 省直机关

黑龙江省(黑)
黑A 哈尔滨 ,黑B 齐齐哈尔,黑C 牡丹江,黑D 佳木斯,黑E 大庆,黑F 伊春,黑G鸡西,黑H 鹤岗,黑J 双鸭山,黑K 七台河,黑L 松花江行署,黑M 绥化,黑N 黑河,黑P 大兴安岭

湖南省(湘)
湘A 长沙,湘B 株洲,湘C 湘潭,湘D 衡阳,湘E 邵阳,湘F 岳阳,湘G 大庸,湘H 益阳,湘J 常德,湘K 娄底,湘L 郴州,湘M 零陵,湘N怀化,湘P 湘西州

安徽省(皖)
皖A 合肥,皖B 芜湖,皖C 蚌埠,皖D 淮南,皖E 马鞍山,皖F 淮北,皖G 铜陵,皖H安庆,皖J 黄山,皖K 阜阳,皖L 宿州,皖M 滁州,皖N 六安,皖P 宣城,皖Q 巢湖,皖R 池州

山东省(鲁)
鲁A 济南,鲁B 青岛,鲁C 淄博,鲁D 枣庄,鲁E 东营,鲁F 烟台,鲁G 潍坊,鲁H 济宁,鲁J 泰安,鲁K 威海,鲁L 日照,鲁M 莱芜,鲁N 德州,鲁P 聊城,鲁Q 临沂,鲁R 菏泽,鲁U 青岛开发区

新疆维吾尔(新)
新A 乌鲁木齐,新B 昌吉回族,新C 石河子,新D 奎屯,新E 博尔塔拉,新F 伊犁哈萨,新G 塔城,新H 阿勒泰,新J 克拉玛依,新K 吐鲁番, 新L 哈密,新M 巴音郭,新N 阿克苏,新P 克孜勒苏柯,新Q 喀什,新R 和田

江苏省(苏)
苏A 南京,苏B 无锡,苏C 徐州,苏D 常州,苏E 苏州,苏F 南通,苏G 连云港,苏H淮阴,苏J 盐城,苏K 扬州,苏L 镇江,苏M 泰州,苏N 宿迁

浙江省(浙)
浙A 杭州,浙B 宁波,浙C 温州,浙D 绍兴,浙E 湖州,浙F 嘉兴,浙G 金华,浙H 衢州,浙J 台州,浙K 丽水,浙L 舟山

江西省(赣)
赣A 南昌,赣B 赣州,赣C 宜春,赣D 吉安,赣E 上饶,赣F 抚州,赣G 九江,赣H 景德镇,赣J 萍乡,赣K 新余,赣L 鹰潭

湖北省(鄂)
鄂A 武汉,鄂B 黄石,鄂C 十堰,鄂D 沙市,鄂E 宜昌,鄂F 襄樊,鄂G 鄂州,鄂H 荆门,鄂J 黄岗,鄂K 孝感,鄂L 咸宁,鄂M 荆州,鄂N 郧阳,鄂P 宜昌,鄂Q 鄂西州

广西壮族(桂)
桂A 南宁,桂B 柳州,桂C 桂林,桂D 梧州,桂E 北海,桂F 南宁,桂G 柳州,桂H 桂林,桂J 梧州,桂K 玉林,桂M 河池,桂L 百色,桂N 钦州,桂P 防城

甘肃省(甘)
甘A 兰州,甘B 嘉峪关,甘C 金昌,甘D 白银,甘E 天水,甘F 酒泉,甘G 张掖,甘H武威,甘J 定西,甘K 陇南,甘L 平凉,甘M 庆阳 ,甘N 临夏回族,甘P 甘南藏族

山西省(晋)
晋A 太原,晋B 大同,晋C 阳泉,晋D 长治,晋E 晋城,晋F 朔州,晋H 忻州,晋J 吕梁,晋K 晋中,晋L 临汾,晋M 运城

内蒙古(蒙)
蒙A 呼和浩特,蒙B 包头,蒙C 乌海,蒙D 赤峰,蒙E 呼伦贝尔盟,蒙F 兴安盟,蒙G锡林郭勒盟,蒙H 乌兰察布盟,蒙J 伊克昭盟,蒙K 巴彦淖尔盟,蒙L 阿拉善盟

陕西省(陕)
陕A 西安,陕B 铜川,陕C 宝鸡,陕D 威阳,陕E 渭南,陕F 汉中,陕G 安康,陕H 商洛,陕J 延安,陕K 榆林,陕U 省直机关

吉林省(吉)
吉A 长春,吉B 吉林,吉C 四平,吉D 辽源,吉E 通化,吉F 白山,吉G 白城,吉H 延
边朝鲜族

福建省(闽)
闽A 福州,闽B 莆田,闽C 泉州,闽D 厦门,闽E 漳州,闽F 龙岩,闽G 三明,闽H 南平,闽J 宁德,闽K 省直机关

贵州省(贵)
贵A 贵阳,贵B 六盘水,贵C 遵义,贵D 铜仁,贵E 黔西南州,贵F 毕节,贵G 安顺,贵H 黔东南州,贵J 黔南州

广东省(粤)粤A 广州,粤B 深圳,粤C 珠海,粤D 汕头,粤E 佛山,粤F 韶关,粤G湛江,粤H 肇庆,粤J 江门,粤K 茂名,粤L 惠州,粤M 梅州,粤N 汕尾,粤P 河源,粤Q阳江,粤R 清远,粤S 东莞,粤T 中山,粤U 潮州,粤V 揭阳,粤W 云浮,粤X 顺德,粤Y 南海,粤Z港澳进入内地车辆

青海省(青)
青A 西宁,青B 海东,青C 海北,青D 黄南,青E 海南州,青F 果洛州,青G 玉树州,青H 海西州,

西藏(藏)
藏A 拉萨,藏B 昌都,藏C 山南,藏D 日喀则,藏E 那曲,藏F 阿里,藏G 林芝

四川省(川)
川A 成都,川B 绵阳,川C 自贡,川D 攀枝花,川E 泸州,川F 德阳,川H 广元,川J 遂宁,川K 内江,川L 乐山,川Q 宜宾,川R 南充,川S 达县,川T 雅安,川U 阿坝藏族,川V 甘孜藏族,川W 凉山彝族  

宁夏回族(宁)
宁A 银川,宁B 石嘴山,宁C 银南,宁D 固原

海南省(琼)
琼A 海口,琼B 三亚,琼C 琼北

军车牌:
现行军车牌称为“97式”,格式是
甲A-12345
第一部分为中文“天干地支”,代表解放军军种序列:
甲――解放军总部(总参谋部、总政治部、总后勤部)
乙――集团军
丙――通信和运输
己――沈阳军区
庚――北京军区
辛――兰州军区
壬――济南军区
寅――南京军区
辰――成都军区
戍――广州军区
午――空军
未――海军
申――总装备部

第二部分为英文字母,代表下属分类(不全):
A――司令部、总部
B――政治部
C――后勤部
D――装备部
G――省军区
H――仓库、干休所
K――驻当地铁路、航空、水运单位军代处
P――医院及医卫院校
S――后勤工厂

第三部分五位数字就是军事秘密了,不过省军区第一位是序号,如广州军区下辖湖北、湖南、广东、广西、海南各省军区分别是“戍G”1、2、3、4、5字头。

武警车牌:
“97式”武警车牌格式是:
WJ18-12345
第一部分WJ代表“武警”
第二部分两位数为省市区代码:
01――武警总部
02――河北省
03――内蒙古自治区
04――山西省
05――辽宁省
06――吉林省
07――黑龙江省
08――上海市
09――江苏省
10――浙江省
11――安徽省
12――江西省
13――福建省
14――山东省
15――广东省
16――广西壮族自治区
17――湖北省
18――湖南省
19――河南省
20――四川省
21――云南省
22――贵州省
23――陕西省
24――甘肃省
25――青海省
26――新疆维吾尔自治区
27――宁夏回族自治区
28――天津市
29――西藏自治区
30――海南省
31――北京市
32――重庆市

第三部分五位号码,首位代表武警序列,首位为数字的为内务部队,“消”为消防部队,“边”为边防部队,“通”为交通部队,“森”为森林部队,“金”为黄金部队,“警”为警卫部队,“电”为水电部队

posted @ 2006-06-13 10:49 高山流水 阅读(1217) | 评论 (0)编辑 收藏

  没什么感觉,端午节又到了。
日子过的真快,不折磨一下自己看来是不行了。
最近身体太糟糕,几天晚上半夜不停的跑大号,人是为自己活着的。

海明威说罪恶总是源于清白。
我看到的一些事情,
既得利益者总是指定规则维护即得利益,妨碍新生力量和敌对势力。
  新陈代谢过程中要找到可以依靠的人的即得利益和已有规则,不destroy的基础上挑战更高的利益和规则。达到双赢。说说而已,多么邪恶的思想啊。
  自己总是感觉痛苦,不能解脱,希望有一个引导和帮助自己的人,实际上每个人都有相同的或不同的痛苦,同样也在等待者leader的出现,谁先扮演这个角色,谁就是主动者,即使失败了,也是成功者。
容易看到别人的缺点,看不到别人的优点。其实别人的缺点就是与自己不同的地方,别人的优点就是跟自己相同的或是对自己有利的。习惯会使你事半功倍,但错误同样也来源于习惯,求新求知才不会迷失。

堕落了。。。。。。。。。
不吸烟,少喝酒,不贪女色,不暴食,不贪婪,不懒惰。
诚实善良是24岁的终极目标。

posted @ 2006-05-29 11:06 高山流水 阅读(373) | 评论 (1)编辑 收藏

一  DSP定点算数运算 自由人笔记
1  数的定标
    在定点DSP芯片中,采用定点数进行数值运算,其操作数一般采用整型数来表示。一个整型数的最大表示范围取决于DSP芯片所给定的字长,一般为16位或24位。显然,字长越长,所能表示的数的范围越大,精度也越高。如无特别说明,本书均以16位字长为例。
DSP芯片的数以2的补码形式表示。每个16位数用一个符号位来表示数的正负,0表示数值为正,l则表示数值为负。其余15位表示数值的大小。因此,
      二进制数0010000000000011b=8195
      二进制数1111111111111100b= -4
    对DSP芯片而言,参与数值运算的数就是16位的整型数。但在许多情况下,数学运算过程中的数不一定都是整数。那么,DSP芯片是如何处理小数的呢?应该说,DSP芯片本身无能为力。那么是不是说DSP芯片就不能处理各种小数呢?当然不是。这其中的关键就是由程序员来确定一个数的小数点处于16位中的哪一位。这就是数的定标。
通过设定小数点在16位数中的不同位置,就可以表示不同大小和不同精度的小数了。数的定标有Q表示法和S表示法两种。表1.1列出了一个16位数的16种Q表示、S表示及它们所能表示的十进制数值范围。
    从表1.1可以看出,同样一个16位数,若小数点设定的位置不同,它所表示的数也就不同。例如,
         16进制数2000H=8192,用Q0表示
         16进制数2000H=0.25,用Q15表示
但对于DSP芯片来说,处理方法是完全相同的。
    从表1.1还可以看出,不同的Q所表示的数不仅范围不同,而且精度也不相同。Q越大,数值范围越小,但精度越高;相反,Q越小,数值范围越大,但精度就越低。例如,Q0 的数值范围是一32768到+32767,其精度为1,而Q15的数值范围为-1到0.9999695,精度为1/32768=0.00003051。因此,对定点数而言,数值范围与精度是一对矛盾,一个变量要想能够表示比较大的数值范围,必须以牺牲精度为代价;而想精度提高,则数的表示范围就相应地减小。在实际的定点算法中,为了达到最佳的性能,必须充分考虑到这一点。
浮点数与定点数的转换关系可表示为:
        浮点数(x)转换为定点数(xq):xq=(int)x* 2Q
        定点数(xq)转换为浮点数(x):x=(float)xq*2-Q
    例如,浮点数x=0.5,定标Q=15,则定点数xq=L0.5*32768J=16384,式中LJ表示下取整。反之,一个用Q=15表示的定点数16384,其浮点数为163幼*2-15=16384/32768=0.5。浮点数转换为定点数时,为了降低截尾误差,在取整前可以先加上0.5。





表1.1    Q表示、S表示及数值范围
Q表示    S表示    十进制数表示范围
Q15    S0.15    -1≤x≤0.9999695
Q14    S1.14    -2≤x≤1.9999390
Q13    S2.13    -4≤x≤3.9998779
Q12    S3.12    -8≤x≤7.9997559
Q11    S4.11    -16≤x≤15.9995117
Q10    S5.10    -32≤x≤31.9990234
Q9    S6.9    -64≤x≤63.9980469
Q8    S7.8    -128≤x≤127.9960938
Q7    S8.7    -256≤x≤255.9921875
Q6    S9.6    -512≤x≤511.9804375
Q5    S10.5    -1024≤x≤1023.96875
Q4    S11.4    -2048≤x≤2047.9375
Q3    S12.3    -4096≤x≤4095.875
Q2    S13.2    -8192≤x≤8191.75
Q1    S14.1    -16384≤x≤16383.5
Q0    S15.0    -32768≤x≤32767

2  高级语言:从浮点到定点
    我们在编写DSP模拟算法时,为了方便,一般都是采用高级语言(如C语言)来编写模拟程序。程序中所用的变量一般既有整型数,又有浮点数。如例1.1程序中的变量i是整型数,而pi是浮点数,hamwindow则是浮点数组。
例1.1  256点汉明窗计算
int i;+
float pi=3.14l59;
float hamwindow[256];
for(i=0;i<256;i++)  hamwindow[i]=0.54-0.46*cos(2.0*pi*i/255);
    如果我们要将上述程序用某种足点DSP芯片来实现,则需将上述程序改写为DSP芯片的汇编语言程序。为了DSP程序调试的方便及模拟定点DSP实现时的算法性能,在编写DSP汇编程序之前一般需将高级语言浮点算法改写为高级语言定点算法。下面我们讨论基本算术运算的定点实现方法。
2.1  加法/减法运算的C语言定点摸拟
设浮点加法运算的表达式为:
float x,y,z;
z=x+y;
将浮点加法/减法转化为定点加法/减法时最重要的一点就是必须保证两个操作数的定标
temp=x+temp;
z=temp>>(Qx-Qz),若Qx>=Qz
z=temp<<(Qz-Qx),若Qx<=Qz
例1.4结果超过16位的定点加法
设x=l5000,y=20000,则浮点运算值为z=x+y=35000,显然z>32767,因此
Qx=1,Qy=0,Qz=0,则定点加法为:
x=30000;y=20000;
temp=20000<<1=40000;
temp=temp+x=40000+30000=70000;
z=70000L>>1=35000;
    因为z的Q值为0,所以定点值z=35000就是浮点值,这里z是一个长整型数。当加法或加法的结果超过16位表示范围时,如果程序员事先能够了解到这种情况,并且需要保持运算精度时,则必须保持32位结果。如果程序中是按照16位数进行运算的,则超过16位实际上就是出现了溢出。如果不采取适当的措施,则数据溢出会导致运算精度的严重恶化。一般的定点DSP芯片都没有溢出保护功能,当溢出保护功能有效时,一旦出现溢出,则累加器ACC的结果为最大的饱和值(上溢为7FFFH,下溢为8001H),从而达到防止溢出引起精度严重恶化的目的。
2.2乘法运算的C语言定点模拟
设浮点乘法运算的表达式为:
float x,y,z;
z=xy;
假设经过统计后x的定标值为Qx,y的定标值为Qy,乘积z的定标值为Qz,则
z=xy
zq*2-Qx=xq*yq*2-(Qx+Qy)
zq=(xqyq)2Qz-(Qx+Qy)
所以定点表示的乘法为:
int  x,y,z;
long temp;
temp=(long)x;
z=(temp*y)>>(Qx+Qy-Qz);
例1.5定点乘法。
设x=18.4,y=36.8,则浮点运算值为=18.4*36.8=677.12;
根据上节,得Qx=10,Qy=9,Qz=5,所以
x=18841;y=18841;
temp=18841L;
z=(18841L*18841)>>(10+9-5)=354983281L>>14=21666;
因为z的定标值为5,故定点z=21666,即为浮点的z=21666/32=677.08。
2.3除法运算的C语言定点摸拟
设浮点除法运算的表达式为:
float x,y,z;
z=x/y;
假设经过统计后被除数x的定标值为Qx,除数y的定标值为Qy,商z的定标值为Qz,则
z=x/y
zq*2-Qz=(xq*2-Qx)/(yq*2-Qy)
zq=(xq*2(Qz-Qx+Qy))/yq
所以定点表示的除法为:
int x,y,z;
long temp;
temp=(long)x;
z=(temp<<(Qz-Qx+Qy))/y;
例1.6定点除法。
设x=18.4,y=36.8,浮点运算值为z=x/y=18.4/36.8=0.5;
根据上节,得Qx=10,Qy=9,Qz=15;所以有
z=18841,y=18841;
temp=(long)18841;
z=(18841L<<(15-10+9)/18841=3O8690944L/18841=16384;
因为商z的定标值为15,所以定点z=16384,即为浮点z=16384/215=0.5。
2.4程序变量的Q值确定
    在前面几节介绍的例子中,由于x,y,z的值都是已知的,因此从浮点变为定点时Q值很好确定。在实际的DSP应用中,程序中参与运算的都是变量,那么如何确定浮点程序中变量的Q值呢?从前面的分析可以知道,确定变量的Q值实际上就是确定变量的动态范围,动态范围确定了,则Q值也就确定了。
设变量的绝对值的最大值为|max|,注意|max|必须小于或等于32767。取一个整数n,使满足
2n-1<|max|<2n
则有
2-Q=2-15*2n=2-(15-n)
Q=15-n
例如,某变量的值在-1至+1之间,即|max|<1,因此n=0,Q=15-n=15。
    既然确定了变量的|max|就可以确定其Q值,那么变量的|max|又是如何确定的呢?一般来说,确定变量的|max|有两种方法。一种是理论分析法,另一种是统计分析法。
  1.  理论分析法
    有些变量的动态范围通过理论分析是可以确定的。例如:
(1)三角函数。y=sin(x)或y=cos(x),由三角函数知识可知,|y|<=1。
(2)汉明窗。y(n)=0.54一0.46cos[nπn/(N-1)],0<=n<=N-1。因为-1<=cos[2πn/(N-1)]<=1,所以0.08<=y(n)<=1.0。
(3)FIR卷积。y(n)=∑h(k)x(n-k),设∑|h(k)|=1.0,且x(n)是模拟信号12位量化值,即有|x(n)|<=211,则|y(n)|<=211。
(4)理论已经证明,在自相关线性预测编码(LPC)的程序设计中,反射系数ki满足下列不等式:|ki|<1.0,i=1,2,...,p,p为LPC的阶数。
  2.  统计分析法
    对于理论上无法确定范围的变量,一般采用统计分析的方法来确定其动态范围。所谓统计分析,就是用足够多的输入信号样值来确定程序中变量的动态范围,这里输入信号一方面要有一定的数量,另一方面必须尽可能地涉及各种情况。例如,在语音信号分析中,统计分析时就必须来集足够多的语音信号样值,并且在所采集的语音样值中,应尽可能地包含各种情况。如音量的大小,声音的种类(男声、女声等)。只有这样,统计出来的结果才能具有典型性。
    当然,统计分析毕竟不可能涉及所有可能发生的情况,因此,对统计得出的结果在程序设计时可采取一些保护措施,如适当牺牲一些精度,Q值取比统计值稍大些,使用DSP芯片提供的溢出保护功能等。
2.5浮点至定点变换的C程序举例
    本节我们通过一个例子来说明C程序从浮点变换至定点的方法。这是一个对语音信号(0.3~3.4kHz)进行低通滤波的C语言程序,低通滤波的截止频率为800Hz,滤波器采用19点的有限冲击响应FIR滤波。语音信号的采样频率为8kHz,每个语音样值按16位整型数存放在insp.dat文件中。
例1.7语音信号800Hz 19点FIR低通滤波C语言浮点程序。
#include  <stdio.h>
const int length=180/*语音帧长为180点=22.5ms@8kHz采样*/
void filter(int xin[],int xout[],int n,float h[]);/*滤波子程序说明*/
/*19点滤波器系数*/
static float h[19]=
{0.01218354,-0.009012882,-0.02881839,-0.04743239,-0.04584568,
-0.008692503,0.06446265,0.1544655,0.2289794,0.257883,
0.2289794,0.1544655,0.06446265,-0.008692503,-0.04584568,
-0.04743239,-0.02881839,-0.009012882,O.01218354};
static int xl[length+20];
/*低通滤波浮点子程序*/
void filter(int xin[],int xout[],int n,float h[])
{
int i,j;
float sum;
for(i=0;i<length;i++)x1[n+i-1]=xin[i];
for(i=0;i<length;i++)
{
sum=0.0;
for(j=0;j<n;j++)sum+=h[j]*x1[i-j+n-1];
xout[i]=(int)sum;
for(i=0;i<(n-l);i++)x1[n-i-2]=xin[length-1-i];
}
/*主程序*/
void main()
FILE *fp1,*fp2;
int frame,indata[length],outdata[length];
fp1=fopen(insp.dat,"rb");/* 输入语音文件*/
fp2=fopen(Outsp.dat,"wb");/* 滤波后语音文件*/
frame=0;
while(feof(fp1) ==0)
{
frame++;
printf(“frame=%d\n”,frame);
for(i=0;i<length;i++)indata[i]=getw(fp1);  /*取一帧语音数据*/
filter(indata,outdata,19,h);/*调用低通滤波子程序*/
for(i=0;i<length;i++)putw(outdata[i],fp2);/*将滤波后的样值写入文件*/
}
fcloseall();/*关闭文件*/
return(0);
}
例1.8语音信号800Hz l9点FIR低通滤波C语言定点程序。
#include <stdio.h>
const int length=180;
void  filter (int xin[],int xout[],int n,int h[]);
static int h[19]={399,-296,-945,-1555,-1503,-285,2112,5061,7503,8450,
7503,5061,2112,-285,-1503,-1555,-945,-296,399};/*Q15*/
static int x1[length+20];
/*低通滤波定点子程序*/
void filter(int xin[],int xout[],int n,int h[])
int i,j;
long sum;
for(i=0;i<length;i++)x1[n+i-111=xin][i];
for(i=0;i<1ength;i++)
sum=0;
for(j=0;j<n;j++)sum+=(long)h[j]*x1[i-j+n-1];
xout[i]=sum>>15;
for(i=0;i<(n-1);i++)x1[n-i-2]=xin[length-i-1];
}
主程序与浮点的完全一样。“
3  DSP定点算术运算
    定点DSP芯片的数值表示基于2的补码表示形式。每个16位数用l个符号位、i个整数位和15-i个小数位来表示。因此:
00000010.10100000
表示的值为:
21+2-1+2-3=2.625
     这个数可用Q8格式(8个小数位)来表示,其表示的数值范围为-128至+l27.996,一个Q8定点数的小数精度为1/256=0.004。
    虽然特殊情况(如动态范围和精度要求)必须使用混合表示法。但是,更通常的是全部以Q15格式表示的小数或以Q0格式表示的整数来工作。这一点对于主要是乘法和累加的信号处理算法特别现实,小数乘以小数得小数,整数乘以整数得整数。当然,乘积累加时可能会出现溢出现象,在这种情况下,程序员应当了解数学里面的物理过程以注意可能的溢出情况。下面我们来讨论乘法、加法和除法的DSP定点运算,汇编程序以TMS320C25为例。
3.1定点乘法
    两个定点数相乘时可以分为下列三种情况:
1.  小数乘小数
例1.9  Q15*Q15=Q30
0.5*0.5=0.25
0.100000000000000;Q15
  *  0.100000000000000;Q15
--------------------------------------------
00.010000000000000000000000000000=0.25;Q30
    两个Q15的小数相乘后得到一个Q30的小数,即有两个符号位。一般情况下相乘后得到的满精度数不必全部保留,而只需保留16位单精度数。由于相乘后得到的高16位不满15位的小数据度,为了达到15位精度,可将乘积左移一位,下面是上述乘法的TMS320C25程序:
LT  OP1;OP1=4000H(0.5/Q15)
MPY OP2;oP2=4000H(0.5/Ql5)
PAC
SACH  ANS,1;ANS=2000H(0.25/Q15)

posted @ 2006-05-09 13:28 高山流水 阅读(523) | 评论 (1)编辑 收藏

 

 

                                      

B1的功能
* 协助碳水化合物的代谢,能量产生
*  维持正常神经系统

B1缺乏症
*肌肉疲劳
*酸痛
*食欲不振
*无精打采
*气喘

B2的功能
*参与许多代谢
*构成红细胞
*促进视网膜再生
*令指甲头发坚固
*减少口腔发炎
A+B+C,让眼睛水汪汪

B2缺乏症
* 唇舌炎  * 咽喉炎
* 口角炎  *牙龈溃疮
* 脂溢性皮炎* 贫血
  * 不会笑,没有幽默感,反应迟钝

烟酸的功能
*  食物释放能量
*  脂肪代谢

烟酸缺乏症
* 新陈代谢异常
* 消化道功能障碍
* 运动功能失调

泛酸的功能
*帮助糖类、脂肪、蛋白质释放能量
*维持皮肤健康
*参与控制血糖

泛酸缺乏症
* 癞皮病
* 皮肤炎
* 腹泻
* 痴呆症

B6的功能
* 抗过敏性  * 促进血红素的合成
* 参与合成激素
* 脑机能维持
* 蛋白质代谢
* 免疫系统运作

B6缺乏症
* 贫血
* 抑郁症
* 失眠
* 步行困难
* 皮肤炎症
* 骨骼异常
* 智力发育迟缓

B12的功能
*维持正常身体生长
*生成红血球
*维持神经系统健康
*叶酸、糖、脂肪
蛋白质代谢和DNA合成所需

B12缺乏症
* 恶性贫血
* 头痛(B+钙镁片)
* 神经退化
* 口腔及消化道炎症

叶酸的功能
* 促进发育
* 血色素的形成
* 维持细胞的遗传基因
* 调节细胞的分裂

叶酸缺乏症
* 贫血
* 失眠
* 舌炎
* 胃肠功能紊乱
* 生长发育不良
* 胎儿易畸形
* 情绪不稳

posted @ 2006-05-09 13:15 高山流水 阅读(3346) | 评论 (5)编辑 收藏

一般,我们认为这个世界上存在着工业、农业和第三产业。第三产业中,以服务业为人们有最多体会。那么,软件应该算作那个产业?一般传统认为,软件行业属于工业。

一般来说,软件按照其最终用户的不同,分为两种:面向个人用户,为个人提供各种服务或者娱乐的软件,以及面向企业用户,主要为企业提高劳动生产率,降低成本的软件。

  因此,当我们讨论中国软件行业的时候,我认为有必要把生产这两种不同软件的行业分别讨论。

  首先,面向企业用户的软件,我认为,从本质上来说,是属于润滑剂产业。也就是说,此时,只依靠软件本身,是无法产生任何利润和价值的,软件必须通过依附在某个传统行业身上,才能够体现自身的价值。举例来说,不论CRM也好,ERP也好,还是DB,OA等等一切应用于企业的软件,如果企业本身经营困难,生产汽车的卖不出汽车,生产电器的卖不出电器,那么软件再好,信息化再强,面向困难企业的软件也一样不会给软件企业带回利润。因此,传统企业经营状况的好坏直接决定了面向企业软件的市场的大小。

  也正因为如此,虽然目前不论在全世界还是只在中国范围内,面向企业用户的软件行业的市场和总产值,要远远超过面向个人用户的软件,但是就局限于中国软件行业而言,至少在短期内,面向企业用户的软件,我认为并没有前途。

  是的,我知道如今响当当的软件公司都是面对企业进行服务的,整个软件市场,特别是e时代排头兵美国的软件市场,其绝大部分都是由面向企业的软件构成的。如果面向企业的软件没有前途,那为什么作为我们的榜样,我们的前驱,处在世界最顶端的美国是这个样子的呢?

  很简单,因为那是美国,不是中国。我认为,先进的规则、方法,思想、观念,尽可以先简单照搬,有了实践经验之后,再进行探讨和取舍。但是,对于奋斗的步骤、过程,目标的设定,一定要结合自己的实际情况来决定。

  我们知道,市场规模的大小,市场需求的大小,直接决定了产品的生产规模、成本和前途。我们无法想象,一个需求量长期为100的市场,能够容纳10个以上的生产能力为10的企业蓬勃发展。

  面向企业的软件,其市场就是企业对于信息化的需求。而美国面向企业的软件市场,就是建立在世界第一,占全世界经济总量30%以上(具体数字记不清了,如果有错,请指正)的经济实体的基础之上的。同时,基于其商品经济的发达,美国企业对于信息化的需求可以说是全世界最强的。因此,美国才能拥有全世界最大的软件市场,拥有全世界最多、最大的软件公司专为企业服务。

  而对于我们来说,社会上生产实际产品,满足人民真正需要的企业的经营状况决定了整体经济的形势,软件行业只能顺从这个形势而不是相反。目前中国正处于整体的通货紧缩,并且在可以预见的未来内尚看不到好转的趋势,整个社会的生产处于一种整体的生产过剩状态。并且,我国的商品经济尚处在极不发达的状态,企业对于信息化的要求几乎可以忽略不记。在这种情况下,只有极少数的企业,比如一些垄断机构,一些经营状况很好的特异分子,或者基于很特殊的原因,比如国家对于信息产业的扶持,电子政务的推行,才有对于信息化的需求。整个软件市场小的可怜。

  与此相对的,则是全国上下,多如牛毛,什么都能做,什么技术都精通,敢把牛皮吹得比神州五号还高的大小软件公司,在小的可怜的软件市场上进行恶性竞争。

  因此,我认为,指望依靠面向企业的软件行业,来达到人们所期望的所谓“作为支柱产业,拉动整个国民经济发展”的目的,恐怕是不现实的。面向企业的软件行业不可能脱离和超越整体经济形势,它的润滑剂的性质就决定了它只能和整体经济形势一起前进,一起衰退。

  面向企业的软件在中国难以发展的另一个原因是,发达资本主义国家的人力资源成本很高,因此使用软件的相对成本较低。而在中国,人力成本极低,用不用软件,在成本上几乎体现不出什么差别,因此如果不是出于别的原因(政府推动,企业喜欢求新),一般的中国企业很少会有主动使用软件的热情。

  这里附上一个从前一个投资人对于我的某个想法做出的分析:假设某经销商每年产生14600张发票,他雇佣4个人为他处理发票,平均每人每天处理10张,假设每人工资为2000元/月,一年的工资为96000,也就是说,如果改用软件来处理发票,该经销商所愿意付出的成本不会高于96000元。也就是说,假设半年开发完成这个软件,每个月的开发成本不能超过16000元,除去运营成本,这些钱能雇几个程序员?软件公司又能得到多少利润?96000元,能开发一个什么样的软件,大家心里清楚。不要觉得处理发票简单,其实际的过程可能是很复杂的,对人来说可能不难,而软件来做想做到不出大错就很难说了。有兴趣的话,大家可以自己找美国的例子进行分析。

  并且,就算以美国自己的形势来说,IT产业的增长必然放缓,不可能再出现前几年的高速发展。为什么?一开始,人们都以为信息化是点石成金的魔杖,无理智的追捧促成了IT产业的大发展。而如今,很明显,信息化并不是上帝。

  人们在最初实现信息化的时候,的确得到了极大的好处,比如,海量的数据由文件柜里变到硬盘里的数据库中,这是革命,是质变,不论付出多么大的代价,都能够获得相称的回报。但是,随着信息化的逐渐发展,现在,IT整体的发展趋势是在精益求精,是在原有的基础上去追求更快的速度,更高的效率。这当然是需要的,但问题是IT的技术发展速度远远超过人们的需求,在很多领域里,对于更先进的IT技术的追求,已经变得没有实际的意义。打个比方,当初在DOS下编程,往往需要优化程序,提高程序运行的速度,但是,后来的Windows编程,人人都知道很多地方优化不再那么重要,因为用1秒还是2秒画出一个窗口,效率差100%,但对于用户来说,几乎没有意义。从经济学的角度来说,对同一领域持续的投入,其边际效益递减,即越到后来,你投入相同的资金,得到的回报是越来越少的。对于信息化的投入也是如此,只不过,由于信息技术极高的发展速度,使信息产业边际效益递减的效应来得要远远超过其他行业。

  因此,目前,信息化的发展只是量变,企业对于信息化的投入必然因为收益的越来越少而同样呈下降的趋势。不要被站在潮头的IT巨头们迷惑了双眼,信息化的发展是不会单纯随着他们的指挥起舞的。

  综上所述,我认为,在可以预见的未来内,面向企业的软件开发前途有限。

  但是,在这其中,有一个特例。那就是为国际软件产业提供外包服务。有很多人瞧不起软件外包服务,觉得那只是为别人做苦力,自己掌握不了核心技术,终究不过是被人利用。这些并没有错。但是,目前中国软件产业,最缺乏的,实际并不是技术,而是资金。如今IT产业的技术进步,实际上都是和成百上千万的资金投入联系在一起的。没有资金,是不可能研发出真正先进的技术的。而软件外包服务,是目前来源最可靠,最稳固,能够获得资本原始积累的途径,同时,还能够锻炼和培养大批的专业人才。

  因此,我认为,中国软件产业当前的出路之一就是大规模的软件外包服务,先期积累资金和技术人才,做外包为了有一天不做外包,在有了足够的资金、技术和人才积累时候,才有可能研制自己的技术。

  特别是,目前***软件外包业务正方兴未艾。对于美国客户,我们比不过印度人,但是对于***客户来说,印度人是无法和我们竞争的(一个中国人培训几个月可以看懂80%的日文文档,印度人?算了吧)因此,配合当前***制造业的整体输出趋势,对日的软件外包业务是大有可为的。

  让我们再来看面向个人的软件开发。几年前,以金山词霸的降价为标志,一般认为国内的消费软件市场已经事实上灭亡了。我赞同这个论断。互联网和自由软件运动的蓬勃发展,编程技术的进步,决定了对于软件公司来说,小型的消费软件开发注定是一项事倍功半的事情。

  但是,消费软件并不是面向个人的软件的全部。我认为,中国软件产业当前除去外包业务的第二条出路,正是面向个人的软件开发。

  随着科学技术、社会的进步,人的欲望和要求是在逐渐增加的,并且这种增加是一种单调上升的过程。目前,随着互联网,现代通讯技术的发展,个人的信息化要求越来越多,而且随着技术的发展,只会越来越多,而不会变少。并且,这种信息化的要求几乎是以指数倍的速度在增长,其发展的迅猛程度,决不逊于计算机技术本身的发展。前面说过,市场的大小决定一个产业的前途和命运,因此,个人对于信息服务的这种增长极为迅速的需求,决定了提供面向个人的信息服务,是一项极有前途的工作。

  我们只要稍微回顾过去几年的历史,就可以发现,当一种信息服务能够满足个人用户的需要的时候,不论是即时通讯服务(ICQ、QQ、MSN),还是手机短信服务,等等,其发展的速度都会在很短的时间内达到一种近乎爆炸的程度。因此,我们丝毫不用怀疑这个飞速增长的市场是否能够成为软件产业的希望。这种提供面向个人的信息服务的软件开发,正是中国软件产业的真正出路。

  当然,这并不是说,随随便便搞个什么提供信息服务的软件就能够赚钱了。开发用户不需要的东西在任何情况下都没有出路。重要的是开发真正能够满足用户需要的软件。

  那么,什么才是用户需要的?可惜,这个世界上没有任何人,任何书本能够明确的告诉你用户需要的是什么。甚至用户自己,在绝大多数情况下,也都并不知道自己需要的是什么,至少不能够清楚的描述自己所需要的东西。即时通讯服务,短信服务在出现之前,也并没有什么用户去明确要求这个东西。因此不要觉得现在好像用户没有什么需求了,只是还没有人发现而已。

  所以,在这里,再没有什么比商业眼光,嗅觉,敏锐的察觉用户潜在的需求更重要的了。我认为,当前中国经济的发展,人民生活水平的提高,所带来的普通用户对于信息服务的不断迅猛增长的需求,蕴含了无数的机遇与希望。
普通用户到底需要多少种,需要什么样的信息服务?没人知道。这个产业的发展几乎没有任何的限制,成功的唯一要素就在于你是否能够先于别人找到用户真正需要、感兴趣的东西,并且即时的把它提供给用户。

  用户的需求可能很难察觉,可能很复杂,但也可能很简单,很明显,捅破一层窗户纸马上每个人都明白。举一个我mm在饭桌上提出来的意见:为什么手机短信服务不能跨越国家?我当时就一愣。这个难吗?一点都不难,只要两端的电信服务商达成协议,可以使用互联网在电信网络之间传送信息,成本几乎不会增加。当然我并不是说这个意见有什么现实意义,因为需要这种服务的人毕竟在少数(不然也不会随便公开)。我只是想就这个例子说明,有时候,创意就在你身边,只是你还没想到而已。

  同时,这也是一个健康的、公平的市场,没有长官意志,不用跑关系,成功就只依赖于你能不能取得用户的欢心。

  当然,还有一点需要注意的就是,在这个时代,好的创意很快就会被别人模仿,因此要注意自己提供的服务,要通过一定的方法和形式让别人难以模仿。在这方面,很多商业教科书上会有专门的讲授。

  综上所述,我认为中国软件产业当前的出路就只有两个:软件外包服务和面向个人的信息服务。

  然后,让我们来讨论程序员的这个职业的前途。

  坦白的说,虽然身为程序员的一员,但是根据前面对于中国软件产业的整体预测,我认为,目前,中国程序员这个职业基本上可以说没什么前途。

  如果说软件行业的兴衰系于整体经济形势的好坏,那么,程序员个人的前途,就直接由软件企业经营的好坏来决定。而很遗憾,目前中国本土所有的软件公司,都处在资本的原始积累状态。一方面,软件企业需要通过软件开发积累资本,求得发展,另一方面,市场形势严峻,能不能在这样的市场上发展起来,是绝对的未知数。两相综合,市场上没有多少钱,软件企业要赚钱,那么,还能够剩下多少残渣,给软件行业最底端的程序员呢?就算是那些大名鼎鼎的大公司,虽然在资金上可能比较宽裕,但是同样因为面临着不知道该向什么样的市场发展,不能够保证投入资金一定能够得到回报,因此不敢在程序员身上投入多少资金。

  目前,大的软件企业都集中在几个主要的大城市。我在北京,就以北京为例。相信大家也知道,北京的房价之高,不要说中国程序员,就是美国程序员要买到称心的房子也需要咬咬牙。几乎很少有软件公司考虑过自己的员工公司之外的生活问题,为了在残酷的市场竞争中生存下来,都只会残酷的透支程序员生命和生活,无限制的无偿加班,超重的工作压力,仅能糊口的薪水。程序员也是人,也需要自己的生活,要娱乐,要恋爱,要买房,要成家,要生小孩,就凭当前的形势,过一个正常人的生活,几乎是中国程序员不可能完成的任务了。

  因此,我认为,当前我们的出路就只有如下这些。

  本科毕业,刚出校门不满3年的同学,你还年轻,你的生命还有希望,你有权不屑的唾弃我的悲观,你还能够继续承受简单而清苦的日子。只要你对于你所在的公司有信心,就努力吧。通过你的奋斗,像个苦行僧一样,无欲无求一心工作,你也许能和你的公司一起成长起来,到那个时候,再来笑话我好了。

  其他所有的朋友们,像我一样,年纪不小了,生存的责任和压力越来越大。我们必须考虑一些编程以外的东西了。我认为我们的目的应当只有一个,那就是找一份比较稳定,收入足够支撑我们未来的基本生活需求,不要求我们像年轻人一样过苦行僧生活的工作。

  结合前面我的分析,其实我们的目标已经很明确了:脱离中国软件行业,努力争取被外国资本家剥削,去外企工作;从事软件外包业务;投入面向个人信息服务的软件开发。

  外企工作好,人人都知道,外国资本家已经吃的比较肥了,不至于再跟我们这些小虾米计较。如果从事软件外包业务的话,要注意的是,一定要参加***企业直接投资的企业,千万不要加入中国人自己办的公司,那里的状况和普通的公司不会有什么区别。所以这个选择从本质上讲其实也是去外企。而最后一项,坦白的说,这是最有希望但风险也最高的选择。您有权为了自己的梦想而奋斗,而且,一旦成功,我辈外国资本家的奴隶是只能仰望的。在这里,先预祝您成功。

  因此,我想跟大家说的是,不要在国内众多水平低下的软件公司中浪费时间了,我们应该从现在起就立下一个目标,争取上面三个归宿中的一个。从今后,一切都要为了自己的目标而努力,绝对不要再在国内的普通软件公司身上浪费宝贵的青春,从一个垃圾公司辗转到另一个垃圾公司了。程序员有权追求自己喜欢的生活,生活要有目的性,让我们一起为了自己的未来而奋斗!

posted @ 2006-05-08 20:11 高山流水 阅读(247) | 评论 (0)编辑 收藏

 


一、注册表遭到破坏后,可能会出现以下现象:
·无法启动系统
·无法运行或正常运行合法的应用程序
·找不到启动系统或运行应用程序所需的文件
·没有访问应用程序的权限
·不能正确安装或调入驱动程序
·不能进行网络连接
·注册表条目有误
二、注册
表被破坏的原因
通常注册表被破坏的原因可以归纳为以下四类。
1、应用程序错误
通常用户需要经常在Windows操作系统中添加或删除各种应用程序。而在实际使用过程中,很少有完全没有错误的应用程序,那些看似很微小的错误,可能会导致非常严重的后果。同时,当计算机中安装了大量软件后,有可能出现彼此间的冲突。此外,一些做Beta测试的软件,自身也没有定型,还存在许多错误,可能会对注册表造成影响。这些应用程序在注册表中添加了错误的内容。错误的数据文件和应用程序间的关联,是破坏注册表的一个潜在原因。
2、驱动程序不兼容
由于PC机的体系结构是一个开放性的体系结构,当驱动程序和其他程序协同工作的时候,就会发生不兼容的现象。又或者某些驱动程序是16位的,在安装到32位的Windows 9x操作系统后,也会出现不兼容的现象。
3、硬件问题
除了非正常断电外,比如硬盘、内存或其他硬件的质量不过关,都会造成数据读写错误或因过度超频等状况使机器的稳定性下降,以及病毒等对BIOS程序或CMOS存储器造成破坏等,都可能导致注册表的破坏。
4、误操作
注册表中的数据众多、内容复杂,不太熟悉注册表的用户在手工修改注册表时,很可能会破坏注册表中的内容。用户可能在无意间将某个重要的键值删除或双击了某个注册表文件将其导入了注册表,这些操作都极易破坏整个系统。
这个问题,用户可以尝试将系统对双击注册表文件的响应,由默认的“合并”该为“编辑”,以避免用户的误操作,提供系统安全性。具体的操作步骤如下。
步骤
(1)打开任意一个浏览器窗口,选择【查看】菜单下的【文件夹选项】选项,打开“文件夹选项”对话框,再打开“文件类型”选项卡。
(2)选中“注册表项目”,单击【编辑】按钮,随即系统将弹出“编辑文件类型”对话框,选中“编辑”并单击【设为默认值】按钮。
(3)单击【关闭】按钮即可。
这样,再单击.reg的注册表文件时,它的默认行就会变成编辑状态,与Windows界面的其他部分保持了一致。
三、注册表的还原及恢复
如果在注册表被破坏前进行了备份,则修改注册表就会比较方便,否则就要借助于一些专用工具了。通常,要恢复注册表,应从最简单的方法做起。这里,将从易到难逐一给大家介绍。
1、重新启动系统
这是最简单的处理方法。由于Windows注册表中的许多信息都保存在内存中,并且每次启动系统时,注册表都会把硬盘中的信息调入内存,所以用户可以通过重新将硬盘中的数据调入内存的方式来修正各种错误。在启动Windows时出现错误信息时,单击【确定】按钮,则Windows将首先恢复注册表,然后进入启动过程,若注册表的错误较轻,可能机器启动后系统就会恢复如初了。
虽然并不是所有情况下都适用这种方法,但在做复杂的处理之前可以试一试。
2、使用安全模式启动
若在启动Windows系统时遇到注册表错误,可以尝试在安全模式下启动。具体做法是在启动时,单击【F5】键,此时系统会自动修复注册表问题。若在安全模式下启动成功,就可以在正常模式下启动Windows系统了。
3、简单拷贝法还原
对Windows95来讲,可以利用自身提供的备份文件,进行简单的拷贝,覆盖现有的注册表文件。具体的操作步骤与备份的过程类似。这里就不再做过多的解释了。
4、Windows98自动备份的还原
若可以进入Windows,哪怕只是在安全模式下,只要Win Zip等支持CAB压缩格式的软件选择最近的或前几天的备份压缩包文件,将其中的4个文件解压出来,重新启动计算机到DOS下,利用这些文件覆盖相应的文件即可。
若无法进入Windows,可以尝试在DOS下利用Windows自带的Extract.exe文件打开该压缩文件,恢复替换原注册表文件即可,命令为“extract/Y Sysbackup\rb00?.cab”(其中?为0~4)。
5、Windows2000备份的还原
用户可以在启动Windows2000时使用备份的注册表来恢复,具体的操作步骤如下。
步骤
(1)在任务栏上单击【开始】按钮,然后单击【关闭系统】选项。
(2)单击【重新启动】之后,单击【确定】按钮。
(3)当屏幕出现“正在启动Windows2000”提示后,单击【F8】键。
(4)使用箭头键,选中“最后一次正确配置”,然后按回车键确认,系统将启动Windows2000。
操作执行完毕,注册表被还原到上一次成功启动计算机时的状态。
6、利用导入法完全还原
可以在Windows或DOS下,利用导出的注册表文件还原系统。通常,为了保险起见,用户最好在安全模式下或直接在DOS下操作。
在Windows下恢复注册表时,在注册表编辑器中,单击【注册表】菜单中的【引入注册表文件】选项,在出现的对话框中选中所需恢复的备份文件,再单击【打开】按钮即可将注册表备份还原到Windows系统中了。
7、利用导入法部分还原
部分还原是指利用以前备份的注册表文件或其他注册表文件来覆盖现有的主键,也就是“还原项”。具体的操作步骤如下。
步骤
(1)在Regedit32注册表编辑器中,将光标移至要还原的主键上。
(2)选择【注册表】菜单下的【还原】命令,并在“还原项”对话框中选择要还原的注册表文件。
(3)单击【打开】按钮,确认覆盖现有的主键后,即可还原该项到当前选定的项上。
8、利用加载配置单元还原
“加载配置单元”和“卸载配置单元”这两个命令仅在HKEY_USERS或HKEY_LOCAL_MACHINE预定义项窗口中才有效。将配置单元加载到注册表中后,配置单元将成为其中一个项的子项。具体的操作步骤如下。
步骤
(1)在Regedit32注册表编辑器中,任选一个预定义项中的主键。
(2)选择【注册表】菜单下的【加载配置单元】命令,在随即弹出的“加载配置单元”对话框中,选择要加载的注册表文件。
(3)单击【打开】按钮后出现“加载配置单元”对话框,在对话框的“项名称”文本框内输入新主键的名称,再单击【确定】按钮。
这里,“加载配置单元”引入的是注册表内原来没有的内容。
9、用Eru.exe恢复Windows 9x注册表
在Windows 9x光盘的Other\Misc\ERU目录中,提供了备份注册表的程序Eru.exe。在装有Eru和备份文件的软盘上运行Eru.exe命令对注册表进行恢复,具体的操作步骤如下。
步骤
(1)把可执行文件Eru.exe复制到C:\Windows目录下。
(2)重新启动计算机到MS-DOS模式下。
(3)运行Eru.exe,并根据提示操作即可。
备份信息可以保存在驱动器A中的引导盘中,也可以指定存放在包括网络驱动器的任何位置上。
10、使用System.lst恢复注册表
如果Windows 9x不能正常启动,并且没有对系统注册表进行备份,这时可以尝试利用System.lst对系统注册表进行恢复。
当Windows 9x成功安装以后,系统会自动将第一次正常运行时的系统信息保存在C盘根目录下的System.lst文件中,这个文件也是系统、只读、隐含文件,它不会随着Windows的系统配置改变而改变,利用它,有可能将系统恢复到最初安装时的状态。具体操作步骤如下。
步骤
(1)在DOS环境下,依次执行如下命令:
Attrib –h –r –r C:\System.lst
Attrib –h –r –s C:\Windows\System.dat
Copy C:\System.lst C:\Windows\System.dat
Attrib +h +r +s C:\System.lst
Attrib +h +r +s C:\Windows\System.dat
(2)重新启动计算机。
由于System.lst中保存的是Windows第一次正常运行时的系统信息,后面更改Windows的软硬件配置信息都没有被更新到这个文件中,所以在成功启动后,还需对系统进行许多调整才能恢复到被破坏前的状态。
在实际应用中,当Windows98的注册表遭到较重破坏后,即使能够修复,效果可能也并不太好,此时重新安装系统也许是更好的选择。
最后再一次重申,如果对注册表不熟悉,不要随意用注册表编辑器对其进行修改,因为注册表的一点小问题会导致系统不正常工作。在修改注册表之前,一定要记得备份注册表。
恶意网页更改注册表
在浏览网页注册表被修改,使得IE默认连接首页、标题栏及IE右键菜单被改为浏览网页时的地址(多为广告信息),更有甚者使浏览者的电脑在启动时出现一个提示窗口显示自己的广告,遇到这种情况我们该怎样办呢?
  其实,该恶意网页是含有有害代码的ActiveX网页文件,这些广告信息的出现是因为浏览者的注册表被恶意更改的结果。
  1、IE默认连接首页被修改
  IE浏览器上方的标题栏被改成“欢迎访问……网站”的样式,这是最常见的篡改手段,受害者众多。
  受到更改的注册表项目为:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\Start Page
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\Start Page
  通过修改“Start Page”的键值,来达到修改浏览者IE默认连接首页的目的,
  解决办法:
  ①在Windows启动后,点击“开始”→“运行”菜单项,在“打开”栏中键入regedit,然后按“确定”键;
  ②展开注册表到
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main下,在右半部分窗口中找到串值“Start Page”双击 ,将Start Page的键值改为“about:blank”即可;
  ③同理,展开注册表到
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main
  在右半部分窗口中找到串值“Start Page”,然后按②中所述方法处理。
  ④退出注册表编辑器,重新启动计算机,一切OK了!
  特殊例子:当IE的起始页变成了某些网址后,就算你通过选项设置修改好了,重启以后又会变成他们的网址啦,十分的难缠。其实他们是在你机器里加了一个自运行程序,它会在系统启动时将你的IE起始页设成他们的网站。
  解决办法:运行注册表编辑器regedit.exe,然后依次展开
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Current Version\Run
  主键,然后将其下的registry.exe子键删除,然后删除自运行程序c:\Program Files\registry.exe,最后从IE选项中重新设置起始页就好了。
2、篡改IE的默认页
  有些IE被改了起始页后,即使设置了“使用默认页”仍然无效,这是因为IE起始页的默认页也被篡改啦。具体说来就是以下注册表项被修改:
HKEY_LOCAL_MACHINE\Software\Microsoft\InternetExplorer\Main\Default_Page_URL “Default_Page_URL”这个子键的键值即起始页的默认页。
  解决办法:
  运行注册表编辑器,然后展开上述子键,将“Default_Page_UR”子键的键值中的那些篡改网站的网址改掉就好了,或者设置为IE的默认值。
  3、修改IE浏览器缺省主页,并且锁定设置项,禁止用户更改回来。
  主要是修改了注册表中IE设置的下面这些键值(DWORD值为1时为不可选):
[HKEY_CURRENT_USER\Software\Policies\Microsoft\InternetExplorer\Control Panel]"Settings"=dword:1
[HKEY_CURRENT_USER\Software\Policies\Microsoft\InternetExplorer\Control Panel]"Links"=dword:1
[HKEY_CURRENT_USER\Software\Policies\Microsoft\InternetExplorer\Control Panel]"SecAddSites"=dword:1
  解决办法:
  将上面这些DWORD值改为“0”即可恢复功能。
4、IE的默认首页灰色按扭不可选这是由于注册表 HKEY_USERS\.DEFAULT\Software\Policies\Microsoft\InternetExplorer\Control Panel
下的DWORD值“homepage”的键值被修改的缘故。原来的键值为“0”,被修改为“1”(即为灰色不可选状态)。
  解决办法:将“homepage”的键值改为“0”即可。
5、IE标题栏被修改
  在系统默认状态下,是由应用程序本身来提供标题栏的信息,但也允许用户自行在上述注册表项目中填加信息,而一些恶意的网站正是利用了这一点来得逞的:它们将串值Window Title下的键值改为其网站名或更多的广告信息,从而达到改变浏览者IE标题栏的目的。
  受到更改的注册表项目为:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\Window Title
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\Window Title
  解决办法:
  ①在Windows启动后,点击“开始”→“运行”菜单项,在“打开”栏中键入regedit,然后按“确定”键;
  ②展开注册表到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\InternetExplorer\Main下,在右半部分窗口中找到串值“Window Title” ,将该串值删除即可,或将WindowTitle的键值改为“IE浏览器”等你喜欢的名字;
  ③同理,展开注册表到
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main然后按②中所述方法处理。
  ④退出注册表编辑器,重新启动计算机,运行IE,你会发现困扰你的问题解决了!
  6、IE右键菜单被修改
  受到修改的注册表项目为:
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt下被新建了网页的广告信息,并由此在IE右键菜单中出现!
  解决办法:
  打开注册标编辑器,找到
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt
  删除相关的广告条文即可,注意不要把下载软件FlashGet和Netants也删除掉啊,这两个可是“正常”的呀,除非你不想在IE的右键菜单中见到它们。
7、IE默认搜索引擎被修改
  在IE浏览器的工具栏中有一个搜索引擎的工具按钮,可以实现网络搜索,被篡改后只要点击那个搜索工具按钮就会链接到那个篡改网站。出现这种现象的原因是以下注册表被修改:
HKEY_LOCAL_MACHINE\Software\Microsoft\InternetExplorer\Search\CustomizeSearch
HKEY_LOCAL_MACHINE\Software\Microsoft\InternetExplorer\Search\SearchAssistant
  解决办法:
  运行注册表编辑器,依次展开上述子键,将“CustomizeSearch”和“SearchAssistant”的键值改为某个搜索引擎的网址即可。
  8、系统启动时弹出对话框
  受到更改的注册表项目为:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Winlogon
  在其下被建立了字符串“LegalNoticeCaption”和“LegalNoticeText”,其中“LegalNoticeCaption”是提示框的标题,“LegalNoticeText”是提示框的文本内容。由于它们的存在,就使得我们每次登陆到Windwos桌面前都出现一个提示窗口,显示那些网页的广告信息!
  解决办法:
  打开注册表编辑器,找到
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Winlogon
  这一个主键,然后在右边窗口中找到“LegalNoticeCaption”和“LegalNoticeText”这两个字符串,删除这两个字符串就可以解决在登陆时出现提示框的现象了。
  9、浏览网页注册表被禁用
  这是由于注册表
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System下的DWORD值“DisableRegistryTools”被修改为“1”的缘故,将其键值恢复为“0”即可恢复注册表的使用。
  10、浏览网页开始菜单被修改
  这是最“狠”的一种,让浏览者有生不如死的感觉。浏览后不仅有类似上面所说的那些症状,还会有以下更悲惨的遭遇:
  1)禁止“关闭系统”
  2)禁止“运行”
  3)禁止“注销”
  4)隐藏C盘——你的C盘找不到了!
  5)禁止使用注册表编辑器regedit
  6)禁止使用DOS程序
  7)使系统无法进入“实模式”
  8)禁止运行任何程序
  具体的原因和解决办法请看天极网e企业之安全之路栏目的这篇文章:《浏览网页注册表被修改之迷及解决办法》。
  11、IE中鼠标右键失效
  浏览网页后在IE中鼠标右键失效,点击右键没有任何反应!
  要特别注意的是,在你编制的注册表文件unlock.reg中,“REGEDIT4”一定要大写,并且它的后面一定要空一行,还有,“REGEDIT4”中的“4”和“T”之间一定不能有空格,否则将前功尽弃!许多朋友写注册表文件之所以不成功,就是因为没有注意到上面所说的内容,这回该注意点喽。
注:1.3721网站上网助手中有一个安全与修复,可以修复以下ie被改的症状
修复浏览器标题、首页、默认地址等
修复非法写入浏览器链接栏、文件创建日期、
系统时间显示等其他地方的网址
修复浏览器的Internet选项为可用
修复浏览器查看源文件功能
修复注册表编辑器为可用
取消对"控制面板"的非法限制
修复注册表文件导入功能
取消"网上邻居"的非法限制
修复重新开机后自动弹出浏览器窗口的问题
修复重新开机后重复感染浏览器的问题
修复开机后弹出对话框的问题
恢复浏览器默认的搜索引擎
在地址栏中键入www.3721.com ,然后选择其它产品—上网助手—安全与修复—在线安装3721上网助手,然后在页面的右侧有一个“一健修复”,点击后关掉所有浏览器窗口,然后重新启动浏览器,即可修复大部分的浏览器被更改的故障。

posted @ 2006-05-08 17:15 高山流水 阅读(723) | 评论 (0)编辑 收藏

 

悲哀,你选择开发工程师做为自已的职业

  本文所指的开发工程师,仅指程序开发人员和以数字电路开发为主的电子工程师。
  当你选择计算机或者电子、自控等专业进入大学时,你本来还是有机会从事其它行业的,可你毕业时执迷不悟,仍然选择了开发做为你的职业,真是自做孽不可活。不过,欢迎你和我一样加入这个被其它人认为是风光无限的“白领”吧。
  如果你不是特别的与人世隔绝,我想你一定看过金老先生的名著《笑傲江湖》吧,里面有一门十分奇特的武功叫做"辟邪剑法",你看这个小说第一次看到这种功夫的练法时,我想你当时一定笑歪了牙“呵呵,真好玩!”,可是现在我很痛心的告诉你:你选择的开发工作就是你人生路上的"辟邪剑法",而你现在已经练了,并且无法再回头。

 相对同时刚出校门同学从事其它行业而言优厚的薪水,以及不断学习更新的专业知识不仅仅让你感到生活的充实,更满足了你那不让外人知的虚荣心。在刚出校门的几年中,你经常回头看看被你落在后面的同学们,在内心怜悯他们的同时,你也会对自已天天加班的努力工作感到

心里平衡:“有付出才会有回报”这句话在那几年中你说的最多,不管是对自已的朋友们还是自已的爱人。第二句最常说的话是对公司的领导:“不行我就走人!”,实际上你也真的走过几回。对了,在这几年中,因为你的经济条件不错,你开始买房、开始谈恋爱、结婚、开始有了自已的小孩。有时候你会对自已说再过两年就去买车。当然其中可能有许多大件是需要分期付款的,但你对前途充满了信心,你确信认为这种日子会永远的持续下去,即使不是变得更好的话。
  日子总是在这种平淡中一天天的过去,就在那么不经意间,你突然发现自已已经快30岁了,或者已经30了,莫名的,你心里会漫延着一种说不清楚的不安情绪,你好像觉得前途并非像前几年那样变得越来越好,你也忽然发现你以前所瞧不起的同学里好像已经有不少开着车的了,也有几个人住着比你还大的房子,好像房款还是一次付清的,你突然明白你现在的生活比起你的同学来最多是中游偏上了。工作中最让你感到心里不舒服的是,你越来越不敢对你的领导说不了,即使比你来的晚的同事升职或提薪,你也只是在私下与朋友们一起喝酒时才敢发发牢骚,在头的面前你的声间越来越小、笑脸是越来越温柔。
  你终于开始迷茫“再过几年我会是在干什么呢?”,这句话常常出现在你的心里。
  计算机开发工作,是一种以年轻为资本的工作,说句通俗点的话是“吃青春饭的”,嗯,这句话好像在一种特别的行业也听到过。

其标志就是一:工作的时间性非常强,一个开发项目被定的时限通常是很紧张的,更有甚者,有些号称开发管理的书里面还非常卑鄙的号召将一个项目切成多个小片,每个小片都定一个叫“里程碑”的东东来严格跟踪开发进度,加班加点在其它行业是需要加班工资的,而在开发行业,加班工资好像还没见到几个公司发过,是啊,反正有时间限制着,你干不完我再找你算账.所以开发工作通常有着其它工作所没有的精神上的压力。

一旦一个人步入而立之年,因为家庭和孩子的负担,加上精力上面的衰退,加班工作时间变得越来越少,这点让很多老板们感到:这些人已经老了,不好用了。指示人事部门:“以后招开发人员限制在30岁以下!”,相对而言硬件开发会年龄方面限制会稍好一点点,但也是五十步笑百步。还有一个很重要的一点就是:计算机这个烂东东实在是进步的太快了,前两年买的顶级配置电脑,现在怎么看怎么像废品,这还是小事,更可气的是好像每天都需要学习新的知识,刚毕业时只会书本上的PASCAL,学会了用腐蚀的办法来做电路板,一上班就开始学习TURBOC和TANGER2.0,刚刚学会,还没来得及高兴,马上开始学Borland C++和Protel3.0,好不容易学会了,却发现需要学习VC和Protel98了。单片机也是啊:Z80的指令背的很熟,工作中没来得及用就要学8031,好好学吧,本来想着这辈子就吃它了,又发现又出来什么PIC、DSP、CPLD、FPGA、ARM等等....这还不包括中间要学一大堆74系列、4000系列、XX系列...IC卡居然里面还有CPU卡..如果学习的知识里每个字都能变成一分钱,我想所有的开发工程师都是腰缠万贯的富翁。
  一眼看去,这种日子好像见不到头,年轻时乐此不彼,但现在你一定对自已能坚持到什么时候感到怀疑了。我们都玩过像仙剑奇侠传这样的RPG游戏,刚开始时你只是一个一名不文的少年,随着你去打怪物、捡宝贝、学秘芨,最后终于有一天你会变成一个大英雄!那么你在实际生活中过得比那些小侠们还辛苦,为什么成不了一个生活中的大侠呢?呵呵,原因在这里:因为开发工作是邪门功夫,它虽然可以让你速成的变成小资,但它最大的特点是经验不积累!日新月异的知识更新,让你总是感到自已在退步,你就像在RPG中的主人公,开始时就给了你一把好剑和好盔甲,而且让你的级别很高,但让你的经验不累积,虽然刚开始打小怪物时你觉得自已很爽,但越到后来,你会发现你会死的很惨!比较一下你与其它非开发行业的同学你就可以知道了,例如和你学医的同学比起来。套用岳不群他老人家说华山剑宗和气宗的区别那段话:前十年你比你那些学医的同学收入和地位要好的多,但十年以后你和他基本上各方面都会持平,而二十年以后你的各方面远远不能与你学医的同学相提并论!嗯,你已经开始不笑辟邪剑法了吧。
  “敢问路在何方?路在脚下...”,不过猴兄和八戒兄这么认为是可以的,你呢?
总结了许多开发朋友在30岁以后的生活之路,让我们一起看看开发人员“路在何方?”那么开发人员在30岁以后都干些什么呢?
其路一:继续做你这个很有“前途”的职业吧!
  偶掰着脚指头仔细数了数,发现还真的有很多朋友在30岁以后还在从事开发工作,我这里说的从事,是指你还需要天天在电脑边上编程序和画电路板,与你手下是否有几个小兵无关,也与你是否头上顶着什么项目经理、主任工程师的帽子无关,只要你还需要亲自开发,你就属于这一类。其中有个年龄最大的朋友是63年的,从事医疗仪器的开发工作,35岁左右还在从事软硬件开发工作的仍有一大堆,分析这些仍然从事开发的朋友,基本上都有以下特点:
1 痴迷工作或者痴迷电脑,晚上八点到十二点的这段时间,基本上是在电脑桌或工作台前渡过的。
2 不喜欢与人交住,朋友很少,常联系的人不超过五个。
3 与朋友交往时谈工作多,但一般不主动谈钱。
4 体型偏胖或偏廋,不在正常区间。
5 无未来计划,对五年后自已生活怎么样、从事什么工作说不清楚。
6 俭省,从不乱花钱。
即使你是还不到30岁的开发人员,你也可以看看自己对以上几条是否符合,是否会在30岁后还从事开发职业,四条疑似,五条以上基本确诊你也是这类型的人。
  这些朋友们通常报着过一天是一天的态度生活,到了这个年龄,也不敢再轻易的换工作了,年轻时的锐气慢慢的也消退了。唯一不变的希望是有一天从天上掉下来一大堆钱把自己砸伤。说实在话因为他们的性格所限,基本上可以确定他们以后不可能在职场上获得更好的发展,当个小头头,带几个人开发已经是他们发展的顶点。至于以后的人生之路,不仅他们自己迷茫,可能上帝也正在头痛。
不过像这类朋友,偶很奇怪的发现:他们的小孩都是儿子!不知是偶然还是有什么其它说法。
简单建议:要改变命运,先改变性格:坚持半年晚上不从事工作、游戏及电视,用此时间与人交往,你的人生会有改变。


其路二:转行从事技术支持、行政或生产等工作还有一些朋友,从事了几年的开发工作,因为自已并非特别的爱好,或者领导上面的强制工作安排,他们转到了技术支持、服务或行政等工作,至少当时从表面上看起来,他们的薪水较开发要少一些,但真正的统计这些人,发现他们之中有半数的人获得了更好的发展,升职为服务部经理或行政经理等职,最历害的一个朋友已升职为总经理助理,进入高层。
  这类朋友当时转行通常并非自已志愿,属被逼无奈或者其它原因,但显然,拥有专业知识技术的他们显然在非技术部门中鹤立鸡群,遇到什么事情他们均可从专业的角度提出建言,久而久之,他们获得更多的升职和加薪机会也就不足为奇。
  因为不从事开发,所以经验开始积累,这类的职业通常会给你一个很安定的感觉,你到30多岁后会发现这类职业反而比开发工作更容易获得新的工作机会。

  简单建议:你如果确定在开发部无法获得很好的发展机会,不妨转到其它几个部门试试,换个活法,钱少点就少点吧,机会多。
其路三:开发管理
  如果你现在已经是总工或开发部经理,或者你眼看就有机会被提升为这类职务,那么恭喜你,你走的是从“弼马温”到“斗战胜佛”这条金光大路,你不仅拥有很高的专业技能,而且很显然,你也有着很强的人际交往能力,你这类人根本不需要对未来有着任何的担心,你在即使一无所有的时候也很容易白手起家。
  你这种人算是练辟邪剑法练成了仙,嗯,我无话可说。
  你是不是这类人也很容易区别,就像围棋二十岁不称国手终身无望一样,你应该在工作三、四年以后,也就是说二十七岁左右就会发现自已工作中指手划脚的时间比亲自开发的时间要多了,而且大多数这类人在这个年龄手下应该有“兵”了,相反的,如果你快30岁了还天天埋头于电脑前编程序和画板子,或者30多岁了你还没升到部门经理(虽然你总是觉得自已很有希望),基本上可以确定你不是这类人。好了,如果你确定你是这类人,那么你唯一的想法就是尽快爬上中层和高层,因为有时候人生偶然性太大,不占住坑的萝卜很有可能被人拔出来!

  简单建议:天天去你的老板家里面拖地和擦桌子!


其路四:出国或考研
  有两个搞开发后出国的朋友,其中一个甚至打工打到了一个小公司总工的位置,数据库和软件方面水平巨牛,但仍感觉心里不踏实,于是将自己工作多年的钱忍痛掏出来,出国费加上机票大概将自已辛苦所攒的银子花完,然后又借了一些钱,在02年身上揣着一万美元跑去了加拿大,在加拿大不停的重复找工作,换工作,然后再找工作的循环,找的工作基本上与计算机无关,不过工资总是在1500加元左右,呵呵,折成人民币与他在国内打工拿的基本上差不多,不过租个地下室就花了300加元,然后吃吃喝喝,再买个电脑上上网这类的,基本每月平均还要倒贴一点。前段时间给我的邮件里说,现在身上花的差不多只有5、6000美元了,准备开个小公司,看看能不能往国内倒腾点东东,做最后一搏。另外一个朋友去澳州,时间稍早一些,先是大概摘了一年多的葡萄,后来总算找了个技术工作,每天的工作是画机械图纸,收入还算不错

将近3000澳元,买了个旧车,也算是过上了资本主义生活。不过前年回来一趟,唯一的感叹就是:在国外拿2000美元的生活,绝对不如在国内拿5000人民币的生活舒服。
  也有两个考研的朋友,不过其中一个严格的说不是做开发的出身,偏重于市场方面的工作性质,不过我的朋友里面考研的不多,只好凑两个人说说,一个考研后在北京找了个工作,每个月5、6000元钱,但还是做开发,生活仍然与没考研之前没有任何的改变,前途仍然没见到什么大亮的光,还是搞不清楚以后再干些什么,标准的过一天算一天了。另外一个考研后在大学里面找了个工作,工资虽然比他原来打工少了不少,但毕竟终身有靠,稳定了下来,也算修成了正果,这位哥们心情一放松下来,也开始有时间琢磨着业余时间自已做点什么,好像现在慢慢的也开始有了点眉目。
  简单建议:这两条路,对开发人员来说都不算是很好,出国十年前是好事,现在难说,考研能成功转行的概率恐怕也不是很大,多半仍然去搞开发,只不过研究生可以多干几年罢了。


其路五:转行到市场
  绞尽脑汁的想想,我所知道的人之中只有两个开发人员去了市场,这两个人都不能说是朋友,认识而已。他们都是主动要求去了市场,结果是这两个人均在市场都是干到一年左右,然后都自已开公司了。呵呵,很奇怪,极高的转行成功率!不过仔细想想,我对这两个人的思路佩服的五体投地。能下决心仍掉每月5、6000元的开发职位,从事一个自已并不熟悉的岗位,每月拿个2000多元+提成,但提成那是说不清楚的事情,这个决定,只能让人感觉到他们对自已前途清晰的把握和老谋深算的心机。而且他们不去服务不去生产,挖空心思说服领导去市场(市场部门与开发部门通常是一个公司的核心部门,进入其实并不容易),可以说是有着长远的考虑的。有技术了,再与客户交成朋友,马上就会产生很大的机遇应该是正常的事情。
  有实力,有心机,也有着很强的决心力,这种人恐怕早在大学毕业时或更早的时候就已经决定了自已的人生之路,他们的每一步路在若干年前早就计划周全,现在看起来:学会技术->进入市场->寻找商机->开公司,一条多么清楚的人生之路。但就像我们上小学中学时,所有人都知道上大学是我们最清楚的人生路一样,最后只有少数人才能真正达到目标(当然,现在扩招的历害是另外一回事,我是说我们那个时候,也就是:“很久很久以前,当我像你那么大的时候”)。

  简单建议:你若是这类人,我的建议是:...嗯?....那个你.你,你别走啊,我还有个事想请你赞助一下啊.....


其路六:开公司自已干

  呵呵,看到这一条,发现你的眼睛已经圆了,你肯定千百次的想过这个事情吧,咳咳,其实我从事开发的时候也是天天梦想着这种事情。总想着过两年找个机会就自已干,这个梦想一年又一年的折磨着你也给着你希望。看看吧,开发后来开公司的还真的不少,里面有成功的也有很多失败的,通常开公司都是几个人合伙开始的,有做技术的,有做市场的,几个人一拍即合、狼狈为奸,共同策划了这一个大活动。一般说来能让这几个人下决心走出这一步,产品肯定是先进的,甚至是国内独一无二的,市场也是很大的,负责市场的那个哥们通常会拍着胸保证可以卖出去,并悄悄地告诉你他在某主管领导是他小舅子的同学的二叔,肯定没问题。于是你们几个人找地点、注册执照、买了几个破桌子,再攒了两台电脑,每个人又凑了几万银子,公司开张了!
  产品很快出来了,市场的哥们也不负重望,有几个客户表示要试用了,一切看起来都是如此的正常,“.......你坐在老板桌前,不停的有人来汇报工作或者找你签字...人进人出中...你又想起公司再穷也不能只有一把椅子的故事.....”你在梦中笑出声来。
是如此的顺利,你们很快就有单子了,很快的单子让你们凑的那点钱不够了,你们很高兴的每个人又增加了投入,拿出钱时你眼泪汪汪的数着钱说:“这就是我那生蛋的母鸡啊”。你们的产品确实不错,市场也经营的很好,客户慢慢的多了起来,单子来的时候一笔接着一笔,你每天都处于兴奋之中,唯一美中不足的是好像客户回款总是会拖一些日子,不过客户给你保证说:过几天,过几天就付给你们,因为回款总是在计划外,所以你们为了资金的流畅运行又凑了一些钱,这个时候你有一些心事了,因为你的存款折上面的数字已经快趋向于零了。“没事,过两个月等回款了一切都OK了,谁干事业不吃点苦呢?”你这么安慰着自已又投入到工作中去,资金总是在回款和生产经营费用之间走着一个窄窄的小木桥,你的账上总是没有太多的钱,扩大了的公司规模和许多意外情况,使你又一次、二次、三次的与合作者们再次投入了自已的资金,当然,后来的钱你可能已经是借的了.....
  终于有一天,你的会计再一次告诉你,老板啊,账上又没现金了,吃过多次苦头的你终于下决心开始重视资金的运行了,你裁掉了一些不必要的人手,减少了开发的投入,要求市场人员签单的时候必须予付XX%的款,回扣也必须等收过款后再付,同时也开始对产品的生产成本开始进行控制。
  时间一天一天的过去,因为竟争对手的产品也对你的产品进行了仿造,你的产品慢慢变得不再先进,市场人员开始埋怨公司的合同资金方面规定太严格,不好签单,生产成本的下降通常也导至产品毛病的增多,客户也开始埋怨你的服务人员不能及时进行服务。
  终于有一天,你重新走进了人才交流中心,以前你是来招人的,现在你拿着自已的简历开始寻找一个工作
......
公司的成功与否,与产品有关,与市场有关,但更重要的是与资金有关,产品与市场都可以通过资金来弥补,而却没有任何东西可以代替

资金,凡是倒下的公司,99%与资金链的断裂有关。在你决定要开公司以前,先估计一下你公司支持一年所需要的资金数额,包括人工费,生产,场地,广告宣传、市场费用、甚至电、水费等等等等,把你所想到的一切加在一起,得出的值就是..慢..如果你没有实际的开过公司的经验,你需要将此数字乘3,然后就是你开公司一年最少需要的费用,呵呵,公司的实际运营所需要的钱是你想像的3倍以上,你要是不信我也没办法。

简单建议:开公司前最重要的是先确立你后续的资金来源!也就是说钱不够了怎么办?---因为你投入的钱肯定会不够的。


其路七:第二职业
这类的朋友有不少,他们没有脱离开发工作,但是在业余时间又不停的接项目或者在卖产品,在单位里面他们显得并不出众,比起其它人来说他们属于最不愿意加班的一类.为此他们白天通常工作很勤奋.这类人也许不一定可以挣很多钱,但平均下来他们一年之中通常都可以比同事们多挣个几万元.有时候比上班拿得还多.但令人疑惑的是,这类人在生活中更加注重稳定,基本上没见到他们跳过蹧,即使私下里面已经开了个小公司,他们通常也不会辞职.
你的旁边有没有这类人呢?分辨他们很容易:
--电话很多,而且更愿意来电话时离开办公室找个没人的旮旯通话.神秘兮兮给人一种"这家伙是不是有二奶啊?"的感觉的人,通常是这类人。这类人是女性最佳的选择对象:很顾家,不象那些富人容易花心,而比起一般人来说,他们收入相对要高得多。但总结了一下几位这类的开发朋友:也得出了一个令人沮丧的结论:这种人通常个子不高,体形类似桶状.....

简单建议:这好像是开发人员最佳的出路了,但比较丰厚的收入通常让这类人不愿意去冒风险....到现在为止我所认识的这类人还没有一个真正算是成功的。
好了,虽然偶的经历远远说不上丰富,也没有什么成功之处可以自满的,但或许因为比其它朋友痴长了几岁,见过的人可能会稍多一些,所

以斗胆写出了以上的一些文字,让您掉牙了。
下面是偶走过开发这条路上总结出来的一点心得,你可以不看,但看了就千万别把嘴咧的太大:
一、不管是给别人打工还是自已干,都要全心全意的工作,因为你所做的任何一点工作都会让自已的人生多一点筹码,这一点最最重要!这样的例子我至少可以举出两起,优秀的开发人员被其它新公司挖走,并给一定的股份,成为新公司的股东的例子。当时与这样的开发人员一个部门同时工作或更早工作的有许多人,他们平时经常偷点懒,能少干点工作就少干点,有时候还笑话那个平时努力工作的人傻,几年过去了,究竟谁比谁傻?
二、多与市场人员交朋友,你接触他们时可能总会觉得他们知识比你少,甚至素质比你低,可能比你还有点黄。但实际上他们比你更懂这个社会!参加到他们这个圈子中去,和他们一起赌赌钱、一起聊聊天、一起洗洗桑拿、一起.....你会通过他们接触到另外一个世界。
三、机会远比钱重要,挣不挣钱在年轻时并不是特别重要!不论是在实际生活中还是在网上或其它地方,如果有机会参与到除本职工作外的一些项目或产品的开发中(包括你的朋友拉你去做点小生意之类的非开发性质的工作),那怕是帮忙的性质,也要积极介入,至少你会交到很多的朋友,这样你的人生会多出很多的机会。

posted @ 2006-05-08 16:52 高山流水 阅读(199) | 评论 (0)编辑 收藏

 


作者简介:侯捷,台湾电脑技术作家,着译评兼擅。常着文章自娱,颇示己志。
个人网站:www.jjhou.com
北京镜站:www.csdn.net/expert/jjhou


--------------------------------------------------------------------------------

「侯捷观点」进行了4期。通过这个专栏的作用,我开始接触大陆的电脑技术刊物《程序员》和电脑技术网站 CSDN,并累积了相当量的观察和感想。这个专栏前数期谈的都是技术,不是深度书评就是高阶技法。这一期让我们轻松一下,谈谈程序员(programmer)与编程(programming)。其中不少议题起因於读者来信的触发,许多观点我也已经回应於侯捷网站上。所以若干文字可能你曾经在侯捷网站上阅读过。有些看法也许读来刺眼,听来刺耳。但如果大家不把我视为外人,当能平心静气地思考。台湾存在许多相同的问题,我也时常为文针砭。

有一句话这麽说:如果你想使人发怒,就说谎。如果你想使人大怒,就说实话。说实话的人来了,但愿你心平气和。


急功近利是大忌
一位读者写信给我,说他非常着急。他一个月挣300元人民币,家里情况又不好。他希望赶快把 VC/MFC 学会,进入 IT 产业挣钱。信写得很长,看着看着,我也不禁为他着急起来。

有许多读者,虽然情况没有那麽急迫,燃眉之情却也溢於言表。不外乎都是希望能够尽快把某技术某技术学习起来。

但是哪一样东西哪一样技术是可以快速学成的呢?能够快速学成的技术,人才也就必然易取易得,根据市场供需法则,也就不可能有很好的报酬。所以诸君当有心理准备,门槛高的,学习代价高,报酬高;门槛低的,学习代价低,报酬低。

说起来是老生常谈了。这其中最可怕的心理在急功近利。从读者的来信,以及从 CSDN 上的众多帖文,我感觉,许许多多人学习 IT 技术,进入 IT 产业,是认为 IT 产业可以助你脱困,远离贫穷。
 

是的,IT 产业有这个「钱」景,但你得有那份实力。要吃硬核桃,也得先估量自己的牙口。

「好利」是基本人性,Acer 总裁施振荣先生大力提倡「好逸恶劳」之说,视为人性之本,进步的原动力。谁能说不是呢?好利可以,近利就不妙了。近利代表目光浅短,一切作为都因此只在小格局中打转。

梨园有句话:要在人前显贵,就要在人後受罪。台上一分钟,台下十年功。老祖宗这方面的教诲太多了,身为中国人的我们,应该都耳熟能详。

对於心急的朋友,我只有一句话:勿在浮沙筑高台。你明明很清楚这个道理,为什麽临到自己身上,就糊涂了?急是没有用的,浮躁更会坏事。耐住性子扎根基吧。做任何事都要投资,扎根基就是你对自己的未来的投资。如果想知道如何按部就班扎根基,侯捷网站上有一篇文章:「97/06 选义按部 考辞就班」,请你看看。


口舌之战有何益
最常在程序技术相关论坛上看到毫无价值而又总是人声鼎沸的口舌之战,就是诸如「VB 和 Delphi 谁好」、「BCB 和 VC 谁优」、「Linus 和 Windows 谁棒」、「Java 和 C++ 谁强」这种题目。每次出场都一片洋洋洒洒,红红火火急速窜升为超酷话题。众人各拥所好,口沫飞扬,但是从来说服不了任何异阵营的人,话都只说给自己人听,给自己人爽。

这样的论战有何意义?许多人在重组自己的偏见时,还以为自己在思考呢。战到最後,就只是争谁说最後一句话而已。而且,擦伤引起的争吵几乎总是以刺伤结束。

工具与技术的评比,是一场高水准的演出。真有能力做评比,侯捷是很尊敬的。但是这些各拥所好,口沫飞扬的人,真的对评比两造都有深刻的了解吗?很多时候我们看到的只是无知,而无知是这麽一种东西 : 当你拥有了它,你就拥有巨大的胆量。

很多人喜欢某种工具,只不过因为那是他的初体验。他玩它玩出了一点心得,可以说出它的某些好,就开始做「评比」了。你只看到牡丹的艳丽,又怎知寒梅的清香,幽兰的空灵?

绝大多数人使用某种工具,不是因为它最好,不是因为众里寻它千百度,仅仅只是因缘际会。虽然说不同的应用环境选择不同的工具,是最伶俐的作为,但我真的怀疑,在现今工具(以及工具背後反映的技术)如此繁复的时空下,有多少人能够同时精通一个以上的同质工具?追二兔不得一兔,我还是认为你精专一样工具,把它发挥到最高效能,获得的利益多些。被大家拿来评比的,都是市场上的佼佼者,还能差到哪里去?能够两雄相争,必然是在技术面、非技术面(资源的普及、品牌的可靠度)各有一片天,你的评比意义大吗?全面吗?

大多数人没有能力同时精通两种同质工具,初学者听了网路上不知名大侠的高论,也不可能有所选择(如果有,怕也只是蒙着头瞎选)。这种没有提供数据,评论者也没有显示任何信誉(credit)的论战,没有任何意义,纯粹只为自己爽。浪费网路资源!

C++ 之父 Bjarne Stroustrup 曾经在他自己的网页上的 FAQ (以及其他许多场合)中回答如下问题。虽然其中谈的是语言,但是扩大到其他层面仍然合适,值得大家好好咀嚼(注:全文由孟岩先生译出,可自侯捷网站浏览):

Q: 你愿不愿意将C++与别的语言比较?

A: 抱歉,我不愿意。你可以在The Design and Evolution of C++的介绍性文字里找到原因。有不少人邀请我把C++与其它语言相比,我已经决定不做这类事情。在此我想重申一个很久以来我一直强调的观点:语言之间的比较没什麽意义,更不公平。主流语言之间的合理比较要耗费很大的精力,多数人不会愿意付出这麽大的代价。另外还需要在广泛的应用领域有充份经验,保持一种不偏不倚客观独立的立场,有 公正无私的信念。...

人们试图把各种语言拿来比较长短,有些现像我已经一次又一次地注意到,坦率地说我感到担忧。作者们尽力表现出公正无私,但最终都是无可救药地偏向于某一种特定的应用程序,某一种特定的编程风格,或者某一种特定的程序员文化。更糟的是,当某一种语言明显地比另一种语言更出名时,一些不易察觉的偷梁换柱就开始了:比较有名的语言中的缺陷被有意淡化,而且被拐弯抹角地加以掩饰;同样的缺陷在不那麽出名的语言里就被描述为致命伤。同样的道理,较出名的语言的技术资料经常更新,而不太出名的语言的技术资料往往是陈年老酒,试问这种比较有何公正性和意义可言?

Q: 别人可是经常拿他们的语言与C++比来比去,这让你感到不自在吗?

A: 当这些评比不够完整,或者出於商业目的,我确实感觉不爽。那些散布最广的比较性评论大多是由某种语言,比方说Z语言的拥护者发表的,其目的是为了证明Z比其它语言好。由於C++被广泛运用,所以C++通常成了黑名单上的头一个名字。通常这类文章被夹在Z语言供货商提供的产品之中,成了其市场竞争的一个手段。令人震惊的是,相当多的此类评论竟然引用的是那些Z语言开发厂商的员工的文章,而这些经不起考验的文章无非想证明Z是最好的。尤其当评论之中确实有一些零零散散的事实...,特意选择出来的事实虽然好像正确,有时却是完全误导。

以後再看到语言评比文章时,请留心是谁写的,他的表述是不是以事实为依据,以公正为准绳,特别是评判的标准是不是对於所引述的每一种语言来说都公平合理。这可不容易做到。

我说过了,真正精譬的技术评比,对於相当程度的研究者,是很有价值的,但我很少在论坛上看到精品 ─ 论坛还能有什麽精品,99% 是打屁闲谈没有营养的文字。我们每每在其中看到偏见、我执、以及最後免不了因擦伤而引起的刺伤。这真令人伤感。这些人把时间拿来学习,多好。奉劝各位少花时间瞎打屁,多花时间学习,看些真正的精典,别动不动就在论坛上提问,也别动不动就挂在论坛上看别人的瞎打屁。

不但评比性的话题,大家喜欢强出头,其他话题,情绪性的反应也很多。中国强盛之道,眼前彷佛全压宝在 IT产业(尤其软件工业)上面。程序员被赋予了过多的期许,程序员也自我膨胀了许多。夹杂着民族主义或个人好恶,看到不满意的人事物,就号召大家「黑(hack)」过去。这是什麽心态?比拳头吗?说实话,就算要比拳头大小,「黑」个网站算是什麽尺寸的拳头?网路是个大暗室,君子不欺暗室。


杂志定位在哪里
CSDN上头,前一阵子曾经请大家就《程序员》的定位问题给意见。很热闹。我不知道刊物掌门人在看了那麽多建言之後,有没有收获。猜想是没有   ─ 就算有也恐怕不大。

就像面对书籍一样,读者最直观的感觉,就是要看他所需要的东西。100个人有100种需求,这样的询问得不出总结。隐性读者、不上网的读者、不投票的读者、不写帖文的读者,你又如何知道他的想法。

我以为,只需把握一个原则:永远比大众水平高一个档次,扮演引导者,带领读者接触前沿思想与宏观视野,那就是了。读者本身会成长,不论你把刊物定位在实质技术的哪一个层次,都会有人不满足;今年的读者成长了,不见得明年还是你的读者。唯有保持前沿思想与宏观视野,时常导入新的技术形式、新的思维、专家的见解、意见领袖的看法,才能够长期吸引读者,并对许多人以及整个技术开发环境做出长久的贡献。

美国大物理学家费曼,曾经批评物理课的教学。他说老师老是在传授解物理习题的技巧,而不是从物理的精神层面来启发学生。这一点是不是可以给刊物经营者和刊物读者一点点启发?

以此观之,就我个人的专长领域,STL 之父访谈录、算法大师 Donald Knuth 采访、C++/OOP 大系、GP/STL 大系、将标准C++视为一个新语言┅以及一些总括性、大局观的文章,是我认为最好的主题。此中有侯捷自己的作品,唔,我向来不客气。

当然啦,太形而上的东西是不行的,太过抽象的东西不容易被接受。抽象层次愈高,人的自由度愈大,但抽象思考是层次高的人的专利,要普罗大众能够接受,还需具象细节稍做辅助。

如何长期保持具有前沿思想与宏观视野的稿源?与外国杂志合作是一个既快又好的办法。每一期《程序员》最前数页都有当期重要外文期刊的前沿摘要,可见《程序员》编辑群一直与外文专业期刊保持着阅读上的接触。要挑选合作夥伴,心中一定有谱。

当然啦,与国外合作涉及经费问题。旁人(尤其读者)很难体会或换位思考经费上的种种困难。就像有人痛心疾首义正词严地埋怨 CSDN 速度慢得像蜗牛,却可曾想过网站的资源从哪里来。向你收费,你接受吗?台湾已经倒掉很多很多家着名的网站,我等着看免费的服务撑到几时。

要刊物宏观耐读,读者们也得成熟些。一群很好的读者,才拱得起一本很好的刊物。

下面是一封读者来信:

现在技术发展太快了,国外(甚至印度)在实现「软件工业化」的时候,大陆(至少我周围是这样)还停留在小作坊手工打造的水平。我认为未来的世界不再属于「个人数字英雄」,软件工程似乎比一两项技术更迫切。以您的大局观和丰富的阅历,对这个问题是否有不同的看法,不知您是否愿意就此从技术(或其他)角度写篇文章发表您的见解。

软件工程对整个软件工业的提升,至为重要。但是一个程序员要修练到对「软件工程」这个题目感兴趣,非三五载(甚至更多)不为功。我的意思是什麽呢?我的意思是,这类书籍、这类工具、这类网站、这类刊物,在一个嘈嘈切切、急功近利的环境中难有生存空间。这是为什麽蒋涛先生想要将《程序员》杂志导向软件工程主题时,我对他兴起巨大的尊敬与忧虑的原因。

顺带一提,《程序员》的文字水平一直以来带给我「阅读的乐趣」。这个评语我从来少有机会用在台湾的电脑刊物或电脑书籍上。比起台湾的电脑读物,这里的文字有深度多了。


轻浮躁进没信心
只要上网看看程序员出没的论坛,你就会看到一片浮躁与焦虑。反映出来的就是没有信心。

「C# 推出,Java 将死」,「Java 演进,C++ 将亡」,「.Net 推出,VB程序员死定了」,「Kylix 推出,大夥儿快学」,「Delphi 持续新版,哥儿们别怕」,「我刚学VC,怎麽它就出场了」,「MFC 真的要过时了吗」┅。诸如此类的问题,不知该归类为谣言还是童语?

很奇怪也很感叹,为什麽大家对这类问题如此感到兴趣。那透露出一种肤浅 ─ 没有深刻了解技术本质,因而汲汲营营慌慌张张惶惶惑惑於新工具、新事务、并且认为新的大概一定都是好的。对自己没有信心,对整个环境也没有信心。

有深度的程序员绝对不会在意这种事情。当然,并不是早晚三柱香就万事保平安。并不是告诉自己别在乎别在意,就真的能够不在乎不在意了。那必需是发自内心,胸中自有丘壑的一种笃定,有着好的本质学能做靠山。

台湾 BBS(连线)前阵子也有许多热烈讨论 Java, C#, C++, .NET 的贴信。我把我最欣赏的一封引於下。其最後结语,扩张到任何领域都是合适的。

发信人: algent@kkcity.com.tw (流云), 看板: programming
标  题: 一些想法Re: 不懂,业界一直喊Java,在喊些什麽..."
发信站: KKCITY (Sun Feb 18 12:55:49 2001)

以目前台湾业界的情形来看,C\C++ 应该是想成为一个软体工程师的基本技能;至於 Java,如果熟悉 C++,学 Java 应该花不了一个月的时间。

以我个人的观点,Java 的 OO 程度是胜於 C++ 的,而且在这个 Internet盛行的年代,效率的瓶颈在於网路本身的频宽而不在单机执行时的效率,Java 所提供的 Collection framework 是非常威力强大的程式设计工具,又内建了对 Multi-thread 程式的支援,丰富的 class library 让人在设计网路、资料库┅的相关软体时无後顾之忧。

C++ 可能是过去十多年以来最重要的程式语言之一,它的效率显然较Java为佳,但在撰写需要安装在Internet上成千上万种不同厂牌的机器上执行的程式时,相对於Java可能就不是最好的解决方案。

「目前」不需要以 Java 来开发 DeskTop 上的应用程式,因为「当下」而言 Java 撰写的程式相对於 C++ 会占据更多的记忆体且执行效能不彰。

我们不能期待免子游得比鱼快,也不能期待鱼飞得比鹰高。

工程上的需求使得各种场合有不同的适合的程式语言,不必费心去批评 A、推崇B、打压 C。基本的理论比这些事重要多了。

VB 将死?Java 将亡?C++ 将被 Java 取代...,这很重要吗?我用Java 也用 C++,即使明年它们全都被 Java++、C++++、Lisp++、Forth++取代,何有於我哉?FFT 还是 FFT、Dijkstra algorithm 还是Dijkstra algorithm...还是别太担心这些事了...

侯捷除了偶在 BBS 上自说自话外,绝少回应或叁与讨论。看了上封信,忍不住回了一帖:

作者: jjhou (jjhou) 看板: programming
标题: 一些想法Re: 不懂,业界一直喊Java,在喊些什麽..."
时间: Fri Feb 23 21:12:14 2001

同意你的看法。写得非常精采。

人到了一个层次,才会去思考事物的本质是什麽,不被浮面的工具所系绊。

熟练工具是必要的,但工具的演化汰换,不是大家在这里关起门来喊爽就好。

Donald Knuth 说:「语言持续演进,那是必要的。不论现在流行什麽语言,你都可以肯定十年二十年之後它不再风光。我总是在自己的书中写些不时髦的东西,但这些东西却值得後代子孙记取。」(注:以上局部是《程序员》2000/12 的译文)

DDJ 1996/04 p18:
"Language keep evolving, and that is necessary. ...Whatever computer language is in fashion, you can guarantee that whitin a decade or two it will be completely out of fashion. In my book, I try to write things that are not trendy, but are things that are going to be worth remembering for other generations."


追求新知固然是一个计算机从业人员该有的态度,但是追求新工具与充实固有知识两者之间,应该取得一个平衡。过犹不及!

再说,凡走过必留下足迹。你现今的任何努力,只要它是扎扎实实的,就绝不至於落空。技术是有累积性的呀,技术总是触类旁通的呀。你说 MFC 和 OWL 就没有累积性,我说有,message map 的原理不一样吗?framework 的工作原理不一样吗?

我个人并非任何语言或任何工具或任何技术的狂热者,我是务实派。对於自称熟稔多种(属性不同的)语言的人,我充满敬畏并保持工作上的距离。要精通一个语言,使自己能发挥其最大效能,不是件容易的事,需要不少精力的投注。99.99% 的人都是凡人,身为凡人的我们,把时间用来精通一(或二)种适合其工作性质的「语言」,比泛泛认识多种「语法」,要高明得多,回报也大得多。

真的,还是别太担心谁将兴起谁将亡的事了吧。


天才的沃土
教育永远是我最关心的议题。教育的重要性绝对不亚於产业。没有好的教育,何来好的产业人才?

学校教育就不提了,那不是侯捷能够着力的地方。虽然我也在大学教书,但一年不过教育数十位学生,影响能有多大?书籍的读者动辄数万人,刊物的读者动辄数十万人,这才是有大影响力的地方。

自修教育如影随形,打你离开学校就跟随你一辈子,重要性远胜於学校教育。谈到自修,离不开读物 ─ 各种型式的书籍和刊物。在咱们程序员这一行,书籍和刊物的情况如何?

下面是一封读者来信:

我记得您说过,到一个地区的书店去逛逛,对这里的IT技术水平就知道大概。这话太得我心了。我学习软件技术5年,花在买书的钱有一万二千(人民币)以上,如今回头来看,绝大部份是垃圾。以前曾经担心:若要到外地工作,这麽多书怎麽带走?现在则是一种心痛的轻松,因为值得带走的书只够一提。学习IT之初,谁不想在产业上做出一番成成绩?但多年之後回首,则恐怕都会为自己当时所处的教育环境痛心。

关於计算机书籍的浮滥、低劣,我收到太多太多的读者反应了。以上只是冰山一角,有兴趣的读者请上侯捷网站看个饱。有些出版社甚至以出烂书闻名,看看这封信:

您想必看过蒋先生在《程序员》上写的文章,知道所谓IT出版四大家。蒋先生可能碍於礼仪,有些地方还没讲透。例如其中的XXX出版社,在译作方面现在已经是一块榜样 粗制滥造的榜样。

再看这封信:

我在您网站中看到了有关对关於xxx 出版社的评价,深有感慨。其实该出版社是大陆IT业引进外文书籍的鼻祖,我们这一辈程序员(92年以前的)就是读该出版社的译着成长起来的(我至少还有两大纸箱xxx出版社的旧书),在那个时候,差不多所有的计算机类图书都是它们引进并翻译的,现在看来,那个时候的翻译质量差得无法忍受(比Incide VC++ 5/e还差许多),但我们那个时候已经很满足了,毕竟有比没有好。现在大家对xxx出版社的批评,我想是竞争的结果,因为大家看到了更好的译着,有了比较。总而言之,xxx 出版社当年的特点是大量翻译,草草出版,让科技人员能够在尽快的读到优秀作品。这种作风显然已经不合时宜了,或者说它已经完成了它的历史使命。我现在当然也不象从前那样狂买xxx 出版社的书了,因为有了更多的选择。

这封信让我跌入回忆。台湾也曾有两家出版社,有过同等劣质的作法。这两家恶贯满盈的出版社,一名莹圃,一叫松格。两家都关门了。他们的作法都是,快速而大量地翻译外文书。由於速度快,也由於选材之中不乏好书,所以曾经拥有一定的市场。怎地都关门了?因为读者只能被欺负一次两次,不会永远当傻瓜。这样的出版心态摆明没有长远打算,只想捞一票走人,不关门才怪。

我们可能因为,垃圾堆中多少捡过一些经过修补尚称堪用的东西,而对刻意制造这些垃圾的人产生一种奇怪的情愫。东西明明不好,但我们从中吸收了一点点养份。该谢他还是该恨他?

该唾弃他!

这些商人之所以大量而快速地引进外文书,因为有利可图。有利可图是好事,但他没把他该做的事做好。他们放弃品质而无所惧,因为他们知道,在怎样的时空背景下可以怎样轻松地赚钱。大陆出版界朋友告诉我,谁谁谁(都有名有姓)很轻松地在几年里就这样积聚了几百万人民币的身家。几百万人民币呀,我的天。这也算 IT 产业吧,果然是一片红火,鸡犬升天。

因努力做事而致富,应该得到我们的赞美和祝福。可这样的出版社,花更大的功夫赚更多更长远的钱他们不要,因为轻松钱赚起来不费劲儿。百分之一的人可能从这些垃圾中吸收到一些养份,百分之百的人从中感受了阅读的痛苦。谁知道从中被误导的人又有百分之几?买书的钱我们没少花,得到的正价值却是那麽少,痛苦指数那麽高。

这位读者说『总而言之xxx 出版社当年的特点是大量翻译,草草出版,让科技人员能够尽快的读到优秀作品』,又说『它们引进并翻译的,现在看来,翻译质量差得无法忍受』。喔,一本优秀的原作,经过无法忍受的翻译质量洗礼後,还会是一本优秀的作品吗?待人宽厚是美德,但是刻意制造馊水油让人吃坏肚子者,不值得为他们说话。你说『它已经完成了它的历史使命』。不,他们从来就没有历史使命,也没有使命。

如此「仁厚自持」而且忍耐度奇佳的读者,相当稀少。绝大部份程序员谈到计算机图书,都是斑斑血泪的控诉。《程序员》2001/03 p119 可不就有一篇「计算机图书出版商的陷阱」。

读者来信写道:

鲁迅说,未有天才之前,应该要先营造天才的土壤。...您的心情我确实能够深刻理解(这大概就是堆在墙角那几百本垃圾书的最大贡献吧)。

「天才的土壤」,嗯,鲁迅说得好。不正应该是出版社的职志吗?我们却能向谁说去?其实我们也只是希望有一些好书造就一些资质不错的程序员而已。前一阵子才沸沸扬扬於印度程序员与中国程序员的比较,我们哪企望天才?不过就是希望培养一些扎实的人才而已。

看倌也许奇怪,书不好,侯捷为什麽不把矛头对准作者,却大骂出版社。哇勒,我早就抱着「得之我幸,不得我命」的卑微态度,不敢期望创作性中文好书。上面我说的,以及读者最痛心疾首的,是翻译书的低劣水平。人才济济的中国,怎麽可能找不到够格的译者?如果不是出版社的抢钱抢短心态,会造就出这一大批劣品吗?我能不怪罪出版社吗?

到头来,还是要靠自己。「计算机图书出版商的陷阱」一文最终是这麽说的:『记住,您花的是自己辛苦挣来的钱,所以千万不要浪费在没有用的东西上。对於出版了优秀图书的出版公司要有所回报。买他们的书,给他们写信,让他们知道你在想什麽,你需要什麽。』


良性循环
一个体系的建制,需要从底层到顶层的坚实构筑。不论是 C++, Java, .Net, OO, UML, Windows programming, Linux programming,每一个主题欲成就一个完整体系,都需要一大套书。拿C++/OOP 来说,就得涵盖语法语意的、物件模型的、专家经验的、设计样式(design patterns)的、入门的、进阶的,作为叁考工具的┅。拿 GP/STL 来说,就得有 GP 泛论型的、STL 源码剖析的、STL 应用大全的、STL 规格大全的、STL 组件设计的、其他泛型技术的┅。拿Java 来说,就得有语言核心的、物件导向的、多绪编程的、图形介面的、网路应用的┅。对生手而言,不先把底层的东西弄清楚就学习高层的抽象,必会成为空中楼阁,流于形式。对熟手而言,缺乏抽象思维,意味层次上的停滞。

写作、翻译、乃至於出版全体系好书,真的是一件需要目光长远、意志坚定、带点理想色彩的人,才做得起来的志业。

如果这样的人,这样的出版社,没有得到大家理念上和实质上的支持,谁会投入这种傻事?

我个人一向是高品质高价位的坚定信奉者。高品质高价位是生产者经营的最大诱因。因为努力做出了高品质,所以得享高价位带来的高利润,天经地义。否则谁要费心去做高品质?慈善家吗?傻瓜吗?

对於消费者,高价位当然令他不舒服。但是你应当思考是否物有所值,甚至物超所值。拿英文书为例,USD 49.95 一本的 The C++ Standard Library,或是 USD 49.95 一本的 Generic Programming and the STL,完全物超所值。当我了解这些书的价值,就算他们再贵两倍,我也要买。有人拼死吃河豚,我可是要拼命买好书。现实地说,眼下「知识经济」喊得震天响,好书带来的知识不正是赚钱工具吗?对赚钱工具小气,是不是和自己过不去?

下面是一封读者来信:

相较***无论是漫画作家、文学作家或是偶像歌星、影星的客观条件来比较, 在台湾,身为专业作家竟如此难为?有人可以连夜搭帐篷排队买票看演唱会,有人却可以论斤计两地讨论页数与书价高低。或许他们不知道,一本介绍C程式语言的入门书,在德国索价100 DM (约NT$2000)。 因此我的德国同事们购书前必定徵询意见或叁考书评。书价虽不低,但其读书风气仍不亚於***。

这里点出了一个重点:书价很高,於是大家慎选好书,重视书评。下面是另一封读者来信:

我是一名大陆的读者,同时也是一名计算机的初学者。我在网上看到网友都十分推崇您的着作及译作。知道您的作品《深入浅出MFC》第二版即将在内陆出版,我决定买这本书,并与华中科技大学出版社取了联系。从那里知道您今年还会在大陆出几本书,我非常高兴,但在知道了您对价格的看法後,又有些失望。

大陆与台湾的经济水平是不同的,作为普通的工薪阶层,购买力也是有限的。我们这里,各类图书中计算机类图书的价格是最高的,图书页码的最高位与书价的最高位基本相同 -- 700页的书,价格在70到80元之间,1000页以上的,价格在100元以上。这是目前大陆书价的大体情况。如果按您所说,350页,书价80元,在这里算是很高的价格了,这种价格的书,只能看,不能买。

"春蚕到死丝方尽,蜡炬成灰泪始干",教师工作被我们看成很神圣的职业,燃烧自己,照亮别人。我想您出书的目的,也是想让更多渴望知识的人受益于它,少走弯路。作为读者,我们也希望能够看到更多更好的书。但是在一定历史时期内,购买力与价格应当有一个平衡,350页80元的价格确实太高了,如果能够降到60元以内,我相信大多数读者可以接受。

您的书的品质很高这是大家的共识,从价格上应当与其它书区别开来,但书价也不宜太高。名牌服装走高价位的路线,当然可以提高它的身价,显得它档次很高,但是太高的价格使它脱离了主要的消费群体,大多数人只能在口头上谈论它,却只有极少数的人会把它穿在身上。书籍与名牌服装不同,只有经过很多读者长时间的阅读之後,才能够证明它的价值,如果很多人都知道侯先生的书质量很好,但是却很少有人读过(因为价格问题),那岂不是一种悲哀。

我最不乐意看到「xxx 页的书,售价 xxx 元」这种观念。一本书的价值在内容,不在页数。真要这麽算,每本书我们都应该检视一下其字型大小、行距字距、硬拷图多寡、留白多寡 -- 因为这些都关系着页数。如果大家都接受页数和书价的固定比例,肯定会有大量浮滥的书跑出来(不就是现在的情况)。

不必这麽累。一本书值它的价,就买;不值它的价,就别买。很简单的逻辑。

我们难道能够拿着尺衡量一件亚曼尼用了多少码布,来决定它的价格吗?或是拿着尺衡量一张梵谷是几号,来决定它的价格?我能够说因为我画的绣球花比梵谷的鸢尾花大两倍,所以我应该卖他的两倍价?

买东西不能光看有形;那无形的往往更重要。买书不是买纸。正确价值观必须建立起来。

当然很有可能你认为买名牌服装或名画的人都是疯子。你要的只是布和框。那表示那些物品在你心中不值那个价。很好,你有你的评价,你有你的选择。

我不打算在「引喻」(例如名牌服装或名画)上面多着墨。引喻有顾此失彼的时候,笔战都是这样打起来的。各位知道我要强调的是什麽。

350页的书,不应该一定卖 80元,也不应该一定不卖 80 元。这要看350页的含金量有多少。况且我从没说过侯捷有 350页的书要卖 80元。但所有的可能都存在。350页可以是180元,也可以是80元,也可能 530 页连 18 元都不值。请不要再以页数做为书价的依据了。

教师的工作很神圣,但「燃烧自己,照亮别人」太沉重。「燃烧自己」,呵呵,说起来多麽容易,做起来多麽痛苦。某人的工作对众人有益,他会很开心。但你要他燃烧自己照亮别人,除非圣人,否则不干的。我很乐意照亮别人,却不想燃烧自己。燃烧自己,我只能照亮别人五年;把自己照顾好,我可以一辈子照亮别人。抬出大帽子,会让有能力写作好书的人畏惧不前。

请大家接受这样的观念吧:书的价值在内容,不在厚薄,不在页数。价值影响价格,价值带动价格。接受这样的观念,便是对好书的所有出力者致上敬意与实质支持。如果大家慎选好书,10 本垃圾书的价格支撑两三本高价(其实是适价)好书绰绰有馀。走编程这条路,谁手上没有 10 本 20 本垃圾书!当大家慎选好书,支持好书(尽管它价格较高),就会带动书评风气,带动优良写译风气。这对所有的人都好。不需有人燃烧自己,大家都被照亮了。

当然,高价位的薄书很可能带来盗印与影印的歪风。但无论如何,我是坚持己见不会退缩的。如果大环境真的无法提升,好书离开了,好人退出了,最後损失的是谁?

不论各位相信不信,侯捷企图以个人影响力(如果有的话)建立优良的技术写作大环境,对台湾如此,对大陆也是如此。「问渠安得清如许,为有源头活水来」,要让大家有更多好书可读,就要有源头活水注入;要有源头活水,就要有更多诱因吸引更多才能之士到技术写译领域来。更多的诱因是什麽?让他们知道,好作品可以突出,可以区隔(讲白了就是有好价格),不会牛骥同一皂,这就是一种诱因。不,这不算诱因,这根本是一种基本道理。

优质的书使读者受惠,优质书籍所带来的高报酬使作者、出版社受惠,并吸引更多优秀人才到这个领域。形成一个良性循环,大家都受惠。

另外我要建议大陆出版社,善用你们独特的「影印版」。台湾的计算机类翻译书,由於也是良窳不齐,窳多於良,曾有读者开玩笑建议,出版社取得授权後,不要译了,直接以原文出版,读者看得高兴,售价又得以大幅下降。想来这就是大陆的影印版(在台湾是不许的)。既然翻译书已到了千夫所指的地步,何不乾脆多多引进影印版?不是要抢短抢快吗?这个最快了,读者也多一种选择。


翻译出了什麽问题
计算机翻译书的一个大问题是,译者没有时间(或正确的心态,或足够的中文能力)将译稿一看再看,一改再改。中文有一个缺点,那就是名词本身表现不出复数,动词本身表现不出时态。多数时候这可能不是很重要,因而可以忽略。但某些时候它们占有关键地位,於是一个精准的英文句子,往往需要译者额外花很大的心力,才能精准地以中文表达出来,那麽译者就得有足够的时间和足够的中文能力。而唯有译者在专业技术上具备足够的素养,才能够看出某些隐微地方对理解之正确性有关键性影响。

英文里头的子句如果又臭又长,别说中国人,老外也得费一番手脚才看得懂。看看这个(C++ Primer 3/e, p730):

[code..] where the conditional test if (this != &rhs)   prevents assigning a class object to itself. This is particularly inappropriate in a copy assignment operator that first frees a resource currently associated with the class in order to assign the resource associated with the class being copied.

我的译文是:

[code..] 其中的条件测试 if ( this != &rhs ) 避免将 class object 指派给自己,因为「自己指派给自己」这个动作,对於那种「先将目前系结於自己身上的资源释放掉,以便稍後将该份资源再系结於即将被拷贝的那个 object 身上」的 copy assignment 运算子而言,尤其不合适。

只需加几个引号,标示出子句,就好看多了。寻常一样窗前月,才有梅花便不同。如果没有引号辅助,你试译看看会是什麽样子。别对我说「根据教育部规范,上下引号只适用於强调专有名词或特殊语气┅」,规范是死的,人是活的呀。只要能够灵活而正确地表现出文意,就是好办法。小平同志不是说,管它黑猫白猫,会抓老鼠的就是好猫吗。阿波罗13号登月计划失败时,太空舱内的备用排气罩规格不符,地面控制中心要求宇航员必须想办法将方形罩子塞进圆形的排气管中,否则大家都得因为饱食二氧化碳而死於太空。这时候还想什麽规范?脑筋灵活点。

另一个中文表达的大缺点是:动名词不分。操作是名词(operation),也可以是动词(operate);实现是名词(implementation),也可以是动词(implement);叁考是名词(reference),也可以是动词(refer);请求是名词(request),也可以是动词(request);委托是名词(delegation),也可以是动词(delegate)。当动词名词混杂一起的时候,就造成阅读上的错乱。於是你可以看到这样的句子(取材自《设计模式》p14,李英军等译,机械工业出版社)。请诸位先看原译,能否就中文语句结构分析出其大致意思:

(1)原译:只有当委托使设计比较简单而不是更复杂时,它才是好的选择。

(1)侯译:只有当「委托方式」简化了设计,它才是一个好的选择。

(1)原文:Delegation is a good design choice only when it simplifies more than it complicates.

(2)原译:委托方式为了得到同样的效果,接受请求的对象将自己传给被委托者(代理人),使被委托的操作可以引用接受请求的对象。

(2)侯译:为了以「委托方式」获得相同效果,「请托(request)受理者」将自己传给被委托人,使自己得以让「被委托之操作行为」取用。

(2)原文:To achieve the same effect with delegation, the receiver passes itself to the delegate to let the delegated operation refer to the receiver.

我没有一别苗头之意。我的译法不见得最高明。况且翻译一整本书所需的各种前後呼应的考量,远比光译一两个句子复杂许多。只是既然我提出了问题,我总要提出自己的解法,给大家叁考评量。对於机械工业出版社愿意出版这样一本经典,李英军先生等人愿意翻译这样一本高阶而吃力不讨好的书,我是带有敬意的。

另一个翻译上的问题就是大家往往在计算机类书中硬套一般字典查来的词汇,没人敢突围。要知道,一般字典并未考量电脑技术,更不可能考虑到上下文(context)。太多人抱着少做少错,不做不错的心理,一昧紧跟字典,不敢变动,才会造成目前许多译词不够理想,却动弹不得。我印象最深刻的是这几个字:

instance:台湾和大陆均有不少人译为「实例」。这个「例」字根本不好。台湾甚至有人译为「案例」,更不妥当。为什麽这麽译,因为字典查来的现成词汇是这样。所谓 instance 就是根据某个东西(可能是实物,可能是某种表述)产生出来的一份实际物体。我认为译为「实体」是很合适的。根据 class 产生出来的便是object实体,根据 class template 产生出来的则是class 实体,根据 function template 产生出来的是function 实体。根据可执行档(executable files)产生出来的,则是一份 process 实体。

paradigm:台湾常译为「典范」。为什麽?喔,字典查来的现成词汇。有时候这样译有点道理,例如 paradigm shift 叫做「典范移转」。问题是,何谓「典范移转」?很难望文生义是吧。把 generic paradigm 译为泛型典范,更是令人不知所以。我们日常用语里也有「典范」一词,我们会说某某人是国家社会的典范,那和计算机术语里头的 paradigm 根本不是同一个意思。根据 paradigm 在计算机术语中的实际意义,我把它译为「思维模式」 ─ 典型的、根本的思维模式。

读者来了这样一封信:

我向您讨教一个翻译风格的问题。正如您所说,英文技术书籍最难在长句子,因为英文的句式组合形式比中文大大丰富,理解起来已经费力,翻译成顺口的中文更难。我有时遇到这种句型,切分组合,翻来覆去掂量,还是觉得中文不忍卒读。您认为此时 (1) 我可不可以放弃 "信" 而求 "达",也就是说略掉部份句子成份以保全译句的通顺?还是 (2) 务求将原义表达出来,宁可中文句子不顺畅也在所不惜?更有甚者,有时 (3) 某些句子无关宏旨,却异常难译,可不可以乾脆略过不译?您的看法是什麽?

(各位有没有注意到,这位读者的中文很好。「切分组合,反覆掂量」这几个字用得多精简传神)我的看法是,译者有权利也有义务通权达变,但也必须有这份能耐才行。因此你的第一个问题我认为可以,你的第二个问题我认为不可以。你的第三个问题我认为可以,但需谨慎为之,莫因译者本身水平,牺牲了某些东西。

科技翻译应该务求义译而非字译。信与达,应从整个句子或甚至整个段落来看,不是从一个个单字来看。技术文章和文学多有不同,译者最重要的任务是正确传达知识,并尽量减少读者的吸收困难。

到底弹性的底限在哪里?我这麽认为,译者於技术层次上愈有把握,便享有愈大的弹性。只要技术层次够,有把握正确了解并传达了原作者要表达的技术,那麽,文字上不必字字拘泥。

中文在科技表达中并非一无是处。中文有一个优点,就是资讯密度高,很多时候精简漂亮的一行中文,可以表达出「子句夹带子句再夹带子句」的三行冗长英文。中文有优美的词藻与取之不尽用之不竭的典故、成语、俗谚,如果善用它们,冰冷的技术文字一下子就能有阅读的乐趣。一本烂译本,会让读者诘屈聱牙,痛苦至极;但是一本好译本,能使人如沐春风。

容我说一句,正确的心态、足够的时间、充裕的中文表达能力、水平以上的专业素养,是造就好译本的基本元素。现今情况如何?话说回头,好译者的报酬几何?你愿意多花点钱表示你对他们的付出的认同吗?


健康的选书心态
以下谈到选书的心态和作学问的态度,由於都以读者来信展开讨论,因此避免不了提到我写的《深入浅出MFC》。我要谈的问题,其实不局限於某一本书,或某一种技术。就像这篇文章先前举的许多例子一样,都是可以放大来看的。

读者修书一封如下:

2个星期前好不容易读完了您的大作,让我对MFC的认识多了不少,不过一点遗憾的是从您的书里并不能学到如何写一个具体的程序,仅仅是明白了MFC的'包装技术'。本来我还以为又上当了呢 因为我买这本书的目的就是要学习用MFC来做程序的...一个偶然的机遇让我得到了 Jeff Prosise的《programming windows with MFC》,这才发现老师您的书是多麽的重要,假如没有您的《深入浅出MFC》我又怎麽可能programming with MFC呢?...您的书救我于水深火热之中,带领我冲破MFC的条条封锁线。

虽然这位读者最终对侯捷和侯捷的书以感谢和赞美作收,但我颇有感慨。

读者往往以最直观的态度来审视一本书的价值,以最直接的方式来表达他的爱憎。但不能凡是不需要的,一律视为灌水;凡不符合需求的,一律视为欺骗。这不是一种健康的选书态度。即使你最後并没有发现《深入浅出MFC》「是多麽的重要,救我于水深火热之中,带领我冲破MFC的条条封锁线」,这本书又何尝在书名或内容欺骗过你,使你「以为又上当了呢」。再者「我买这本书的目的就是要学习用MFC来做程序的」,可是你若连MFC与application 的第一线接轨都不了解,照着葫芦画瓢,能写出多好的程序?

我不是责怪这位读者,只是这封来信代表某些现象,让我心有感慨。下面是另一种偏激:

您的书我觉得有些无用的原理讲的太多了! 你所写的并不是真正的教人怎麽用VC,而是教人VC运做是怎麽样进行的! 其实很多读者真正关心的问题并不是在这里! 而是在怎麽对用VC设计出真正出色的程序!

读者永远只想要看自己想看的内容,这一点很自然。但是你不想看到的东西并非就是「无用」,它对别人可能「很有用」。再说,连MFC与application 的第一线接轨都不了解,照着葫芦画瓢,我不知道你能写出什麽「出色的程序」。只要出一点差错,你连除错的能力都没有。开车是很简单的,开车上路遇到各种突发状况而能应付并排除障碍,才是困难的地方,才是技术的表现。

下面是两封台湾读者的意见,有点年代了。当然我必得先说明,抱持这种态度的读者,比例大约在百分之零点零一。

读者意见一

这本书包装太厚。不该有的东东太多,附录A所列的无责任书评,在我想来也是多馀。因为这篇书评在RUN!PC早有提及,後来也出了无责任书评第三集,因此实在没有这个必要。想来是侯先生要增加书的厚度,有以致也。

读者意见二

书评不应该放在这本书里吧! 因为这些东西而让书太厚实在有点┅这些灌水的东西共计有:
(a)1-16页的读者来函:共16页
(b)超长的序,嗯,这应该没有关系
(c)843-872页的无责任书评:共30页(其实里面有一些发人省思的东西,还好)
(d)873-914页的Scribble原始码:共42页(这最严重,几乎没必要的东西)
(e)915-920页的VC范例程式一览:共6页(很可惜,如果再多加发挥的话很有用,
但是侯Sir只是列个标题,连说明都是英文,和看Help档没什麽差别)
共计:94页

不是我无聊找碴,您可曾看到有哪本书有将近一百页的赘肉?更别题书中动不动就列出四五页的原始码了。这些在光碟上都有,何必浪费纸张? 不过消掉这些赘肉,这本书还是有它的价值┅至於书中缺少的部份,我认为要看您如何去定位这本书。
总不能要求一本书把所有Program的东西讲完吧! 以探讨MFC的内部而言,本书没什麽好批评的了。总而言之,这本书该不该买,我想还是肯定的。但是如果书能瘦点、售价能低点,那就更好了。

说来说去,原来是为了「如果书能瘦点、售价能低点那就更好了」。这便是页数和售价牵扯观念下的可怜受害者,他们扭曲了书籍的价值,也严重扭曲了自己该有的正确价值观。如果我告诉这些读者,少掉那100页的所谓「赘肉」,售价一样是 NTD 860,恐怕他们又要对这些「赘肉」热情拥抱来一个亲亲了。真的是这样,这本书是先确定价格,最後为了给读者更多资讯和更大的方便,我才加上那些「赘肉」的。

这一类读者,站在敌对的立场,看待出版社和作者,幻想每一个人都在觊觎他的钱包,并且认为对他无实质帮助的每一页(可能只是因为他已看过)都是被刻意灌水的结果,都是为了欺骗他的钞票。这样的读者在杯弓蛇影的压力之下,忘记了没有任何一本书是为个人量身打造的,也忘记了其他人可能有不同的需求,完全以自我为中心。

这一类不成熟的读者,实在是当前劣品充斥下的牺牲者。老实说我个人并不喜欢他们成为我的读者。只是,读者有选择作者的权利,作者却没有选择读者的机会。


正确的作学问态度
前面两篇来信透露出一个疑惑,《深入浅出MFC》是不是一本对VC编程有帮助的书。我不是要在这里夹带推荐该书(相信我,我不需要如此),而是想透过MFC与VC的关系,引申谈谈作学问的态度。如果「作学问」太高远了,那我们来谈谈「学习」的态度吧。

以下是一封读者来函:

我有个疑惑,想请你帮助。我们今天学C/C++,明天学MFC,OWL(如果流行的话)
後天学C#,JAVA...如果 WINDOW 被 X WINDOW 淘汰,岂不是都要从头学过?有没有必要把一切搞得如此精通?同样的目的,为什麽不用更方便简单的快速RAD开发工具?而非要以钻研繁杂作为乐趣?和体现水平?是否搞错了方向和目标?我认为这正是目前大陆(台湾我不了解)软件开发的一个错误的方向。

所有同质的技术都有累积性与共通性。信中提到的三组东西:MFC, OWL, 或是 Windows, X Window, 或是 C++, Java, C#, 都有类似性与共通性。技术是会累积的,有了某种经验,学习新技术会快很多。经验愈多,学习愈快。所以我常喜欢说「触类旁通」。如果每种技术都得从新学习,大家三五年就得归零一次,人类世界就不会在 20 世纪像爆炸似地进步这麽快。

「有没有必要把一切搞得如此精通?」我的回答是:看个人需求与定位。基础知识的精通,是做为应用的一种过程与手段,而不是目的。如果你不需要通过这样的过程,就可以把你要做的事情做得很好,那麽当然你可以跳过这个过程。我所知道的是,许多许多人必须先有这样的过程,才能够良好达成期望目标。我自己也需要通过这样的过程(否则写不出这样的书)。这不是你所谓的「钻研繁杂」或「体现水平」。

既然信中提到RAD,我也谈谈我的看法。我曾经写过一篇文章,把RAD喻为「匹夫无罪,怀璧其罪」(见侯捷网站 1999/01/26 怀璧其罪 RAD),建议各位看看。我很赞成使用RAD。我书写MFC书籍,探讨MFC技术,但从来没有认为它最好,或不好,我只是要帮助那麽多使用MFC的人。和Bjarne 的态度一样,我对诸如此类的工具评比活动一点兴趣都没有。我乐意当一名观众,但从来不评比(应该可以说,也没有能力评比)。

RAD 的情况,可以拿汽车做比喻。现今谁开车还需要知道齿轮箱、传动轴、离合器、引擎点火原理、火星塞呢?但是满街开车人谁又能够表演360度大回旋?要到达「车手」的程度,就必须对车子的原理有相当程度的了解。同样是开车,洗拿(F1方程式冠军车手)和侯捷两人发挥车辆功能的程度,绝对有天壤之别。我认识的所有惯使RAD 的高手,无一不是有底层深厚功力。以RAD始,以RAD终,断不能在技术上有所太大长进。你的生涯将是空白的五线谱,没有高音,没有低音,永远的水平┅。

RAD是要用的,有好工具不用,和自己过不去。但是使用RAD的同时,对底层做更多的了解才有助於在某种情况下脱困或自助。这和 STL 的运用也一样。会用STL,是一种档次。对STL原理有所了解,又是一个档次。追踪过STL源码,又是一个档次。第三种档次的人用起 STL 来,虎虎生风之势绝非第一档次的人能够望其项背。

学习某种工具,及其背後代表的某种技术,究竟要钻研到什麽深度?唔,答案视你想扮演什麽角色而定。「F1方程式车手」和「半夜三点才敢上台北大马路的用车人」之间,有许多许多的层次,你自己定位自己。

有些人绝对拥护RAD,有些人又重新反省RAD。下面是另一封信:

我原本是一个一天到晚使用RAD工具的人...但是历经了三个版本之後,我有一种被骗的感觉,因为处在这个环境中,似乎是投身在别人设好的一个圈套里!这种东西会让人对於『了解 OS 内部运作以及各种规范与协定的基础层面』的欲望慢慢减低至零。今天为了突破某一个元件的限制而自己写了一个元件,明天新版RAD内附元件就出现了比自己写得还要好的东西。到了最後,自己不想写,只想等别人写给你
;要是别人不写,你就彻头彻尾地丧失了一项能力...(天晓得要等到何年何月),要不然就是官方给的元件功能少东少西。不只这些!最让我受不了的是,我竟然发现:程式用这种方式去写,简直就比用Office 还要简单,深入的思考几乎是零...。

我在「怀璧其罪 RAD」一文中是这麽回答的:

1. RAD 并非罪恶,而是优点。要怎麽用它则是你自己的问题。我有两位朋友是 Delphi 专家,他们可以使用 Delphi 做任何事情,没有任何你想像中 RAD「该有」的限制。

2. 果真能够「写一个程式,比使用 Office 还要简单,深入的思考几乎是零」,并不是坏事。大家都能够随手写个小程式解决手边几个小问题,是为component software 以及 RAD 的大贡献。但你的形容太夸张了,目前的 RAD 还不至於美好若此,总还需要一些程式逻辑和程式语言的基本训练。真到了你说的那一天,我觉得是件好事而不是坏事。只不过,那样子完成的程式,都需藉助现成的元件。如果要突破现成的框框,就得有更深的功力。无论如何,RAD 不会是你的绊脚石。

这类话题很难一言以蔽之。总之,优秀的技术者一定需要一个向下沉淀的历练,通过了这层历练,有了扎实的基础,就可以向上浮升,开始以抽象的思考,抽象的语言、快速开发工具来进行高层次的开发工作。这时候运用 RAD 工具,当能如虎添翼。

所谓百炼成钢;钢的形成,是将铁块不断锤打,不断回火,不断淬炼。做为一个程式员,本身技能的层次,和回火淬炼的次数有密切关系。

让我们再回头谈谈基础建设。很多资讯科系在学学生对学校所开的课程,非常不服气,非常不屑,认为对编程能力一点帮助也没有。首先我要说,编程、软件开发并不是资讯系学生的唯一出路。资讯领域何其广泛,编程只是其中小小的一支而已(但对就业市场而言则是大大的一脉)。其次我要说,基础理论课程并非对你的编程一无是处 ─ 不是无用,只是未到用时。有些科目的影响非常直接而深远,例如对编程最重要的两门课:资料结构(data structure)和演算法(algorithm),这两门课对逻辑思考与实现能力的训练,有关键性的价值。没有这两门课做底,任你 C/C++/Java 多强多行,也写不出个好程式。其他基础理论课程也都各有用途,会不会在你未来的编程生涯中带来帮助,那得看你编哪一种程。就业与学校所学,不必然会发生关系,不必然不会发生关系。

编程能力强的年轻同学,容易孳生一种趾高气扬的恶习,看这不顺眼,看那不顺眼,教授都老朽,同学都可笑。问他为什麽,哦,因为「他们的编程功力都不如我」。可笑的正是你自己呀。

编程实力的培养其实很容易的。我所谓容易,是指不需借助外力,纯粹自修就几乎可以做到。再没有比这更幸运的事了。当然你的进修必须按部就班(在我的专长范围内,我写了很多让你前进时有所依循的文章,都在侯捷网站上)。任何高深的理论,只要实际操作过都可以霍然理解,编程的实作又有什麽难的。数本好书,一部电脑,一些必要的工具,全部搞定,只欠一股「头悬梁锥刺股」的苦读精神。实力进展到一个阶段後,我非常鼓励你追踪名家源码(有人指导更好)。司马相如说:能读千赋则善赋,能观千剑则善剑。侯捷说:读过千赋亦能赋,观过千剑亦能剑。

最後我还要说,学校(尤其大学)原本不是职训所。但是关於人格的培养,思想的启迪,视野的开拓,现今言之,恐怕是陈义过高,没人爱听了。

学校肯定有学校的缺失。其一是课程太过理论,高来高去。以大学生的程度而言,太过抽象的东西他们是没有能力接受的。但是要化抽象为具象,化繁为简,可得有非常深厚的实力才行。其二是教材、教具、教师太过陈旧,跟不上时代。我印象最深刻的是,台湾BBS时常有学生问 Turbo C 3.0 上的问题。我的妈呀,C++ Standard 都出来两年了,学校还在用TC3.0。倒不是说一定要追最新最炫的工具或产品,但是TC3.0 距离 C++ Standard,有月球到地球的距离吧。用这个编译器,可想而知老师教的是什麽内容,可想而知老师本身跟上外界脉动的程度。如果新工具新产品都很贵,顾及学校经费,我们也能体谅。可 Borland C++ 5.5, GNU C++ 2.96, TAI C++ 都是可以免费下载或限期试用的呀。它们对 C++ Standard 的实现,比TC3.0 好太多太多了。

这就涉及学校教育里头最重要的关键:师资。说句实在话,大学里头有不少老师,书是念得很棒,就是没有实作经验,更没有业界经验。因循苟且之念一动,万年教材一摊,同学们就只有自求多福。

自救之道当然有:你必须更勤奋。勤奋看书,勤奋发问。勤奋搜寻好的导师和好的读物。或许天道酬勤,就让你碰上一个传道授业解惑的贵人,就让你知道一本必读的经典,并且就让你找到它。

说到勤奋发问,让我发出本文的最後一声感叹做为结束。台湾大学生在「表达能力」这一点,程度普遍低下幼稚。能够条理分明把自己的意思表达清楚的,十分罕见。反映出来的,就是怯怯懦懦,理不直而气不壮。私底下声若洪钟,要他站起来公开表示意见,却如细蚊之嗡嗡。不论口语或文字,用词普遍地「俗」。大陆情况,就我的印象,以及我收到的读者来信,感觉好很多。以前台湾的说法是,因为大陆斗争厉害,人人得有一口利嘴以求自保。但文革已过数十年,我看大家的表达能力普遍还是很不错,是不是求学阶段中曾经特别重视这个?

发问的能力影响学习甚巨。善问者使人继其声,善教者使人承其志。我常自诩为一名善教者,但如课堂上兼能有一名善问者,高潮迭起,全班受惠。

posted @ 2006-05-08 16:28 高山流水 阅读(301) | 评论 (0)编辑 收藏


原文:Teach Yourself Programming in Ten Years
作者:Peter Norvig
翻译:郭晓刚(foosleeper@163.net)
最后修订日期:2004-3-19
2005-01-12增加了新的译本链接。

本中文译本得到了Peter Norvig的许可。



为什么每个人都急不可耐?

走进任何一家书店,你会看见《Teach Yourself Java in 7 Days》(7天Java无师自通)的旁边是一长排看不到尽头的类似书籍,它们要教会你Visual Basic、Windows、Internet等等,而只需要几天甚至几小时。我在Amazon.com上进行了如下搜索:
    pubdate: after 1992 and title: days and (title: learn or title: teach yourself)
    (出版日期:1992年后 and 书名:天 and (书名:学会 or 书名:无师自通))
我一共得到了248个搜索结果。前面的78个是计算机书籍(第79个是《Learn Bengali in 30 days》,30天学会孟加拉语)。我把关键词“days”换成“hours”,得到了非常相似的结果:这次有253本书,头77本是计算机书籍,第78本是《Teach Yourself Grammar and Style in 24 Hours》(24小时学会文法和文体)。头200本书中,有96%是计算机书籍。
结论是,要么是人们非常急于学会计算机,要么就是不知道为什么计算机惊人地简单,比任何东西都容易学会。没有一本书是要在几天里教会人们欣赏贝多芬或者量子物理学,甚至怎样给狗打扮。
让我们来分析一下像《Learn Pascal in Three Days》(3天学会Pascal)这样的题目到底是什么意思:



学会:在3天时间里,你不够时间写一些有意义的程序,并从它们的失败与成功中学习。你不够时间跟一些有经验的程序员一起工作,你不会知道在那样的环境中是什么滋味。简而言之,没有足够的时间让你学到很多东西。所以这些书谈论的只是表面上的精通,而非深入的理解。如Alexander Pope(译注:英国诗人、作家,1688-1744)所言,一知半解是危险的(a little learning is a dangerous thing)。

Pascal:在3天时间里你可以学会Pascal的语法(如果你已经会一门类似的语言),但你无法学到多少如何运用这些语法。简而言之,如果你是,比如说一个Basic程序员,你可以学会用Pascal语法写出Basic风格的程序,但你学不到Pascal真正的优点(和缺点)。那关键在哪里?Alan Perlis(译注:ACM第一任主席,图灵奖得主,1922-1990)曾经说过:“如果一门语言不能影响你对编程的想法,那它就不值得去学”。另一种观点是,有时候你不得不学一点Pascal(更可能是Visual Basic和JavaScript之类)的皮毛,因为你需要接触现有的工具,用来完成特定的任务。但此时你不是在学习如何编程,你是在学习如何完成任务。

3天:不幸的是,这是不够的,正如下一节所言。





10年编程无师自通

一些研究者(Hayes、Bloom)的研究表明,在许多领域,都需要大约10 年时间才能培养出专业技能,包括国际象棋、作曲、绘画、钢琴、游泳、网球,以及神经心理学和拓扑学的研究。似乎并不存在真正的捷径:即使是莫扎特,他4 岁就显露出音乐天才,在他写出世界级的音乐之前仍然用了超过13年时间。再看另一种音乐类型的代表--披头士,他们似乎是在1964年的Ed Sullivan节目中突然冒头的。但其实他们从1957年就开始表演了,即使他们很早就显示出了巨大的吸引力,他们第一次真正的成功之作《Sgt. Peppers》也要到1967年才发行。Samuel Johnson(译注:英国诗人)认为10 年还是不够的:“任何领域的卓越成就都只能通过一生的努力来获得;稍低一点的代价也换不来。”(Excellence in any department can be attained only by the labor of a lifetime; it is not to be purchased at a lesser price.) 乔叟(译注:Chaucer,英国诗人,1340-1400)也抱怨说:“生命如此短暂,掌握技艺却要如此长久。”(the lyf so short, the craft so long to lerne.)
下面是我在编程这个行当里获得成功的处方:



对编程感兴趣,因为乐趣而去编程。确定始终都能保持足够的乐趣,以致你能够将10年时间投入其中。

跟其他程序员交谈;阅读其他程序。这比任何书籍或训练课程都更重要。

编程。最好的学习是从实践中学习。用更加技术性的语言来讲,“个体在特定领域最高水平的表现不是作为长期的经验的结果而自动获得的,但即使是非常富有经验的个体也可以通过刻意的努力而提高其表现水平。”(p. 366),而且“最有效的学习要求为特定个体制定适当难度的任务,有意义的反馈,以及重复及改正错误的机会。”(p. 20-21)《Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life》(在实践中认知:心智、数学和日常生活的文化)是关于这个观点的一本有趣的参考书。

如果你愿意,在大学里花上4年时间(或者再花几年读研究生)。这能让你获得一些工作的入门资格,还能让你对此领域有更深入的理解,但如果你不喜欢进学校,(作出一点牺牲)你在工作中也同样能获得类似的经验。在任何情况下,单从书本上学习都是不够的。“计算机科学的教育不会让任何人成为内行的程序员,正如研究画笔和颜料不会让任何人成为内行的画家”,Eric Raymond,《The New Hacker's Dictionary》(新黑客字典)的作者如是说。我曾经雇用过的最优秀的程序员之一仅有高中学历;但他创造出了许多伟大的软件,甚至有讨论他本人的新闻组,而且股票期权让他达到我无法企及的富有程度(译注:指Jamie Zawinski,XEmacs和Netscape Navigator的作者)。

跟别的程序员一起完成项目。在一些项目中成为最好的程序员;在其他一些项目中当最差的一个。当你是最好的程序员时,你要测试自己领导项目的能力,并通过你的洞见鼓舞其他人。当你是最差的时候,你学习高手们在做些什么,以及他们不喜欢做什么(因为他们让你帮他们做那些事)。

接手别的程序员完成项目。用心理解别人编写的程序。看看在没有最初的程序员在场的时候理解和修改程序需要些什么。想一想怎样设计你的程序才能让别人接手维护你的程序时更容易一些。

学会至少半打编程语言。包括一门支持类抽象(class abstraction)的语言(如Java或C++),一门支持函数抽象(functional abstraction)的语言(如Lisp或ML),一门支持句法抽象(syntactic abstraction)的语言(如Lisp),一门支持说明性规约(declarative specification)的语言(如Prolog或C++模版),一门支持协程(coroutine)的语言(如Icon或Scheme),以及一门支持并行处理(parallelism)的语言(如Sisal)。

记住在“计算机科学”这个词组里包含“计算机”这个词。了解你的计算机执行一条指令要多长时间,从内存中取一个word要多长时间(包括缓存命中和未命中的情况),从磁盘上读取连续的数据要多长时间,定位到磁盘上的新位置又要多长时间。(答案在这里。)

尝试参与到一项语言标准化工作中。可以是ANSI C++委员会,也可以是决定自己团队的编码风格到底采用2个空格的缩进还是4个。不论是哪一种,你都可以学到在这门语言中到底人们喜欢些什么,他们有多喜欢,甚至有可能稍微了解为什么他们会有这样的感觉。

拥有尽快从语言标准化工作中抽身的良好判断力。


抱着这些想法,我很怀疑从书上到底能学到多少东西。在我第一个孩子出生前,我读完了所有“怎样……”的书,却仍然感到自己是个茫无头绪的新手。30个月后,我第二个孩子出生的时候,我重新拿起那些书来复习了吗?不。相反,我依靠我自己的经验,结果比专家写的几千页东西更有用更靠得住。
Fred Brooks在他的短文《No Silver Bullets》(没有银弹)中确立了如何发现杰出的软件设计者的三步规划:



尽早系统地识别出最好的设计者群体。

指派一个事业上的导师负责有潜质的对象的发展,小心地帮他保持职业生涯的履历。

让成长中的设计师们有机会互相影响,互相激励。


这实际上是假定了有些人本身就具有成为杰出设计师的必要潜质;要做的只是引导他们前进。Alan Perlis说得更简洁:“每个人都可以被教授如何雕塑;而对米开朗基罗来说,能教给他的倒是怎样能够不去雕塑。杰出的程序员也一样”。
所以尽管去买那些Java书;你很可能会从中找到些用处。但你的生活,或者你作为程序员的真正的专业技术,并不会因此在24小时、24天甚至24个月内发生真正的变化。



参考文献

Bloom, Benjamin (ed.) Developing Talent in Young People, Ballantine, 1985.
Brooks, Fred, No Silver Bullets, IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.
Hayes, John R., Complete Problem Solver, Lawrence Erlbaum, 1989.
Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life, Cambridge University Press, 1988.



答案

各种操作的计时,2001年夏天在一台典型的1GHz PC上完成:
    执行单条指令            1 纳秒 = (1/1,000,000,000) 秒
    从L1缓存中取一个word        2 纳秒
    从主内存中取一个word        10 纳秒
    从连续的磁盘位置中取一个word    200 纳秒
    从新的磁盘位置中取一个word(寻址) 8,000,000纳秒 = 8毫秒



脚注

T. Capey指出Amazon上面《Complete Problem Solver》的页面中,《Teach Yourself Bengali in 21 days》和《Teach Yourself Grammar and Style》被列在了“购买此书的顾客还买了以下书籍”栏目里面。我猜其中一大部分察看这两本书的人都是从我这里过去的。

posted @ 2006-05-08 16:21 高山流水 阅读(250) | 评论 (0)编辑 收藏

一、 工具篇JDK (Java Development Kit)

JDK是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具和Java基础的类库(rt.jar)。不论什么Java应用服务器实质都是内置了某个版本的JDK。因此掌握JDK是学好Java的第一步。最主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如IBM公司开发的JDK,BEA公司的Jrocket,还有GNU组织开发的JDK等等。其中IBM的JDK包含的JVM(Java Virtual Machine)运行效率要比Sun JDK包含的JVM高出许多。而专门运行在x86平台的Jrocket在服务端运行效率也要比Sun JDK好很多。但不管怎么说,我们还是需要先把Sun JDK掌握好。

1、 JDK的下载和安装

JDK又叫做J2SE(Java2 SDK Standard Edition),可以从Sun的Java网站上下载到,http://java.sun.com/j2se/downloads.html ,JDK当前最新的版本是J2SDK1.4.2,建议下载该版本的JDK,下载页面在这里:http://java.sun.com/j2se/1.4.2/download.html。下载好的JDK是一个可执行安装程序,默认安装完毕后会在C:\Program Files\Java\目录下安装一套JRE(供浏览器来使用),在C:\j2sdk1.4.2下安装一套JDK(也包括一套JRE)。然后我们需要在环境变量PATH的最前面增加java的路径C:\j2sdk1.4.2\bin。这样JDK就安装好了。

2、 JDK的命令工具

JDK的最重要命令行工具:


java: 启动JVM执行class
javac: Java编译器
jar: Java打包工具
javadoc: Java文档生成器




这些命令行必须要非常非常熟悉,对于每个参数都要很精通才行。对于这些命令的学习,JDK Documentation上有详细的文档。

二、 JDK Documentation

Documentation在JDK的下载页面也有下载连接,建议同时下载Documentation。Documentation是最最重要的编程手册,涵盖了整个Java所有方面的内容的描述。可以这样说,学习Java编程,大部分时间都是花在看这个Documentation上面的。我是随身携带的,写Java代码的时候,随时查看,须臾不离手。

三、 应用服务器(App Server)



App Server是运行Java企业组件的平台,构成了应用软件的主要运行环境。当前主流的App Server是BEA公司的Weblogic Server和IBM公司的Websphere以及免费的Jboss,选择其中一个进行学习就可以了,个人推荐Weblogic,因为它的体系结构更加干净,开发和部署更加方便,是Java企业软件开发人员首选的开发平台。下面简要介绍几种常用的App Server:

1、 Tomcat

Tomcat严格意义上并不是一个真正的App Server,它只是一个可以支持运行Serlvet/JSP的Web容器,不过Tomcat也扩展了一些App Server的功能,如JNDI,数据库连接池,用户事务处理等等。Tomcat被非常广泛的应用在中小规模的Java Web应用中,因此本文做一点下载、安装和配置Tomcat的介绍:

Tomcat是Apache组织下Jakarta项目下的一个子项目,它的主网站是:http://jakarta.apache.org/tomcat/ ,Tomcat最新版本是Tomcat4.1.27,软件下载的连接是:http://www.apache.org/dist/jakarta/tomcat-4/binaries/ 。

下载Tomcat既可以直接下载zip包,也可以下载exe安装包(个人建议zip更干净些),不管哪种情况,下载完毕安装好以后(zip直接解压缩就可以了)。需要设置两个环境变量:


JAVA_HOME=C:\j2sdk1.4.2
CATALINA_HOME=D:\tomcat4 (你的Tomcat安装目录)




这样就安装好了,启动Tomcat运行CATALINA_HOME\bin\startup.bat,关闭Tomcat运行shutdown.bat脚本。Tomcat启动以后,默认使用8080端口,因此可以用浏览器访问http://localhost:8080来测试Tomcat是否正常启动。



Tomcat提供了两个Web界面的管理工具,URL分别是:

http://localhost:8080/admin/index.jsp

http://localhost:8080/manager/html

在启用这两个管理工具之前,先需要手工配置一下管理员用户和口令。用一个文本工具打开CATALINA_HOME\conf\tomcat-users.xml这个文件,加入如下几行:


<role rolename="manager"/>
<role rolename="admin"/>
<user username="robbin" password="12345678" roles="admin,manager,tomcat"/>




这样用户“robbin”就具备了超级管理员权限。重新启动Tomcat以后,你就可以使用该用户来登陆如上的两个管理工具,通过Web方式进行Tomcat的配置和管理了。

2、 BEA Weblogic

Weblogic可以到BEA的网站上免费注册之后下载到最新的Weblogic8.1企业版,License可以免费使用1年时间,其实这已经完全足够了。Weblogic的下载连接:http://commerce.bea.com/index.jsp,.../edocs.bea.com/ 。

3、 IBM Webshpere

Websphere同样可以下载到免费的试用版本,到IBM的developerWorks网站可以看到Websphere试用产品的下载和相关的Websphere的资料,developerWorks中文网站的连接是:http://www-900.ibm.com/developerWorks/cn/wsdd/ ,Websphere的下载连接:http://www7b.software.ibm.com/wsdd/...WASsupport.html 。

4、 Jboss

Jboss是免费开源的App Server,可以免费的从Jboss网站下载:http://www.jboss.org/index.html,然...n.com/idea.html

四、 Java应用的运行环境

Java的应用可以简单分为以下几个方面:

1、 Java的桌面应用

桌面应用一般仅仅需要JRE的支持就足够了。



2、 Java Web应用

Java的Web应用至少需要安装JDK和一个web容器(例如Tomcat),以及一个多用户数据库,Web应用至少分为三层:

Browser层:浏览器显示用户页面

Web层:运行Servlet/JSP

DB层:后端数据库,向Java程序提供数据访问服务



3、 Java企业级应用

企业级应用比较复杂,可以扩展到n层,最简单情况会分为4层:

Browser层:浏览器显示用户页面

Client层:Java客户端图形程序(或者嵌入式设备的程序)直接和Web层或者EJB层交互

Web层:运行Servlet/JSP

EJB层:运行EJB,完成业务逻辑运算

DB层:后端数据库,向Java程序提供数据访问服务



4、 Java嵌入式应用

Java嵌入式应用是一个方兴未艾的领域,从事嵌入式开发,需要从Sun下载J2ME开发包,J2ME包含了嵌入式设备专用虚拟机KVM,和普通的JDK中包含的JVM有所不同。另外还需要到特定的嵌入式厂商那里下载模拟器。  


书籍篇

学习一门新的知识,不可能指望只看一本,或者两本书就能够完全掌握。需要有一个循序渐进的阅读过程。我推荐Oreilly出版的Java系列书籍。

在这里我只想补充一点看法,很多人学习Java是从《Thinking in Java》这本书入手的,但是我认为这本书是不适合初学者的。我认为正确的使用这本书的方法应该是作为辅助的读物。《Thinking in Java》并不是在完整的介绍Java的整个体系,而是一种跳跃式的写作方法,是一种类似tips的方法来对Java很多知识点进行了深入的分析和解释。

对于初学者来说,最好是找一本Java入门的书籍,但是比较完整的循序的介绍Java的语法,面向对象的特性,核心类库等等,在看这本书的同时,可以同步来看《Thinking in Java》,来加深对Java的理解和原理的运用,同时又可以完整的了解Java的整个体系。

对于Java的入门书籍,蔡学镛推荐的是Oreilly的《Exploring Java, 2nd Edition》 或者《Java in a Nutshell,2nd Edition(针对C++背景)》,我并没有看过这两本书。其实我觉得电子工业出版社的《Java 2编程详解》或者《Java 2从入门到精通》就很不错。

在所有的Java书籍当中,其实最最有用的,并不是O'reilly的 Java Serials,真正最最有用处是JDK的Documentation!几乎你想获得的所有的知识在Documentation里面全部都有,其中最主要的部分当然是Java基础类库的API文档,是按照package来组织的,对于每一个class都有详细的解释,它的继承关系,是否实现了某个接口,通常用在哪些场合,还可以查到它所有的public的属性和方法,每个属性的解释,意义,每个方法的用途,调用的参数,参数的意义,返回值的类型,以及方法可能抛出的异常等等。

可以这样来说,所有关于Java编程方面的书籍其实都不过是在用比较通俗易懂的语言,和良好的组织方式来介绍Documentation里面的某个package里面包含的一些类的用法而已。所以万变不离其宗,如果你有足够的能力来直接通过Documentation来学习Java的类库,那么基本上就不需要看其他的书籍了。除此之外,Documentation也是编程必备的手册,我的桌面上有三个Documentation的快捷方式,分别是J2SDK1.4.1的Documentation,Servlet2.3的Documentation和J2SDKEE1.3.1的Documentation。有了这个三个Documentation,什么其他的书籍都不需要了。

对于Java Web 编程来说,最核心的是要熟悉和掌握HTTP协议,这个就和Java无关了,在熟悉HTTP协议之后,就需要熟悉Java的实现HTTP协议的类库,也就是Servlet API,所以最重要的东西就是Servlet API。当然对于初学者而言,直接通过Servlet API来学习Web编程有很大的难度,我推荐O'reilly的《Java Server Pages 》这本书来学习Web 编程。

EJB的书籍当中,《Enterprise JavaBeans, 2nd Edition》是一本很不错的书, EJB的学习门槛是比较高,入门很难,但是这本书完全降低了学习的难度,特别重要的一点是,EJB的学习需要结合一种App Server的具体实现,所以在学习EJB的同时,必须同步的学习某种App Server,而这本书相关的出了三本书,分别是Weblogic6.1,Websphere4.0和JBoss3.0上面部署书中例子的实做。真是既有理论,又有实践。在学习EJB的同时,可以边看边做,EJB的学习会变得很轻松。

但是这本书也有一个问题,就是版本比较旧,主要讲EJB1.1规范和部分EJB2.0的规范。而Ed Roman写的《Mastering EJB 2.0》这本书完全是根据EJB2.0规范写的,深入浅出,覆盖了EJB编程的各个方面,并且还有很多编程经验tips,也是学习EJB非常推荐的书籍之一。

如果是结合Weblogic来学习J2EE的话,《J2EE应用与BEA Weblogic Server》绝对是首选读物,虽然是讲述的Weblogic6.0,仍然值得购买,这本书是BEA官方推荐的教材,作者也是BEA公司的工程师。现在中文版已经随处可见了。这本书结合Weblogic介绍了J2EE各个方面的技术在Weblogic平台上的开发和部署,实践指导意义非常强。

在掌握了Java平台基础知识和J2EE方面的知识以后,更进一步的是学习如何运用OO的方法进行软件的设计,那么就一定要学习“设计模式”。Sun公司出版了一本《J2EE核心模式》,是每个开发Java企业平台软件的架构师必备的书籍。这本书全面的介绍了J2EE体系架构的各种设计模式,是设计师的必读书籍。

过程篇

每个人的学习方法是不同的,一个人的方法不见得适合另一个人,我只能是谈自己的学习方法。因为我学习Java是完全自学的,从来没有问过别人,所以学习的过程基本上完全是自己摸索出来的。我也不知道这种方法是否是比较好的方法,只能给大家提供一点参考了。

学习Java的第一步是安装好JDK,写一个Hello World,? 其实JDK的学习没有那么简单,关于JDK有两个问题是很容易一直困扰Java程序员的地方:一个是CLASSPATH的问题,其实从原理上来说,是要搞清楚JRE的ClassLoader是如何加载Class的;另一个问题是package和import问题,如何来寻找类的路径问题。把这两个问题摸索清楚了,就扫除了学习Java和使用JDK的最大障碍。推荐看一下王森的《Java深度历险》,对这两个问题进行了深入的探讨。

第二步是学习Java的语法。Java的语法是类C++的,基本上主流的编程语言不是类C,就是类C++的,没有什么新东西,所以语法的学习,大概就是半天的时间足够了。唯一需要注意的是有几个不容易搞清楚的关键字的用法,public,protected,private,static,什么时候用,为什么要用,怎么用,这可能需要有人来指点一下,我当初是完全自己琢磨出来的,花了很久的时间。不过后来我看到《Thinking in Java》这本书上面是讲了这些概念的。

第三步是学习Java的面向对象的编程语言的特性的地方。比如继承,构造器,抽象类,接口,方法的多态,重载,覆盖,Java的异常处理机制。对于一个没有面向对象语言背景的人来说,我觉得这个过程需要花很长很长时间,因为学习Java之前没有C++的经验,只有C的经验,我是大概花了一个月左右吧,才彻底把这些概念都搞清楚,把书上面的例子反复的揣摩,修改,尝试,把那几章内容反复的看过来,看过去,看了不下5遍,才彻底领悟了。不过我想如果有C++经验的话,应该一两天时间足够了。那么在这个过程中,可以多看看《Thinking in Java》这本书,对面向对象的讲解非常透彻。可惜的是我学习的时候,并没有看到这本书,所以自己花了大量的时间,通过自己的尝试和揣摩来学会的。

第四步就是开始熟悉Java的类库。Java的基础类库其实就是JDK安装目录下面jre\lib\rt.jar这个包。学习基础类库就是学习rt.jar。基础类库里面的类非常非常多。据说有3000多个,我没有统计过。但是真正对于我们来说最核心的只有4个,分别是


java.lang.*;
java.io.*;
java.util.*;
java.sql.*;




这四个包的学习,每个包的学习都可以写成一本厚厚的教材,而O'reilly也确实是这样做的。我觉得如果时间比较紧,是不可能通过读四本书来学习。我觉得比较好的学习方法是这样的:



首先要通读整个package的框架,了解整个package的class,interface,exception的构成,最好是能够找到介绍整个包框架的文章。这些专门介绍包的书籍的前几章应该就是这些总体的框架内容介绍。

对包整体框架的把握并不是要熟悉每个类的用法,记住它有哪些属性,方法。想记也记不住的。而是要知道包有哪些方面的类构成的,这些类的用途是什么,最核心的几个类分别是完成什么功能的。我在给人培训的时候一般是一次课讲一个包,所以不可能详细的介绍每个类的用法,但是我反复强调,我给你们讲这些包的不是要告诉你们类的方法是怎么调用的,也不要求你们记住类的方法调用,而是要你们了解,Java给我们提供了哪些类,每个类是用在什么场合,当我遇到问题的时候,我知道哪个类,或者哪几个类的组合可以解决我的问题,That'all!,当我们具体写程序的时候,只要你知道该用哪个类来完成你的工作就足够了。编码的时候,具体的方法调用,是边写代码,边查Documentation,所有的东西都在Documentation里面,不要求你一定记住,实际你也记不住3000多个类的总共将近10万个方法调用。所以对每个包的总体框架的把握就变得极为重要。



第五步,通过上面的学习,如果学的比较扎实的话,就打好了Java的基础了,剩下要做的工作是扫清Documentation里面除了上面4个包之外的其他一些比较有用处的类。相信进展到这一步,Java的自学能力已经被培养出来了,可以到了直接学习Documentation的水平了。除了要做GUI编程之外,JDK里面其他会有用处的包是这些:


java.text.*;
java.net.*;
javax.naming.*;






这些包里面真正用的比较多的类其实很少,只有几个,所以不需要花很多时间。

第六步,Java Web 编程

Web编程的核心是HTTP协议,HTTP协议和Java无关,如果不熟悉HTTP协议的话,虽然也可以学好Servlet/JSP编程,但是达不到举一反三,一通百通的境界。所以HTTP协议的学习是必备的。如果熟悉了HTTP协议的话,又有了Java编程的良好的基础,学习Servlet/JSP简直易如反掌,我学习Servlet/JSP就用了不到一周的时间,然后就开始用JSP来做项目了。



在Servlet/JSP的学习中,重头仍然是Servlet Documentation。Servlet API最常用的类很少,花比较少的时间就可以掌握了。把这些类都看一遍,多写几个例子试试。Servlet/JSP编程本质就是在反复调用这些类来通过HTTP协议在Web Server和Brower之间交谈。另外对JSP,还需要熟悉几个常用JSP的标记,具体的写法记不住的话,临时查就是了。



此外Java Web编程学习的重点要放在Web Application的设计模式上,如何进行业务逻辑的分析,并且进行合理的设计,按照MVC设计模式的要求,运用Servlet和JSP分别完成不同的逻辑层,掌握如何在Servlet和JSP之间进行流程的控制和数据的共享,以及Web Application应该如何配置和部署。


第七步,J2EE编程

以上的学习过程如果是比较顺利的话,进行到这一步,难度又陡然提高。因为上面的知识内容都是只涉及一个方面,而像EJB,JMS,JTA等核心的J2EE规范往往是几种Java技术的综合运用的结晶,所以掌握起来难度比较大。

首先一定要学习好JNDI,JNDI是App Server定位服务器资源(EJB组件,Datasouce,JMS)查找方法,如果对JNDI不熟悉的话,EJB,JMS这些东西几乎学不下去。JNDI其实就是javax.naming.*这个包,运用起来很简单。难点在于服务器资源文件的配置。对于服务器资源文件的配置,就需要看看专门的文档规范了,比如web.xml的写法,ejb-jar.xml的写法等等。针对每种不同的App Server,还有自己的服务资源配置文件,也是需要熟悉的。

然后可以学习JTA,主要是要理解JTA对于事务的控制的方法,以及该在什么场合使用JTA。这里可以简单的举个例子,我们知道一般情况可以对于一个数据库连接进行事务控制(conn.setAutoCommit(false),....,conn.commit()),做为一个原子操作,但是假设我的业务需求是要把对两个不同数据库的操作做为一个原子操作,你能做的到吗?这时候只能用JTA了。假设操作过程是先往A数据库插一条记录,然后删除B数据库另一个记录,我们自己写代码是控制不了把整个操作做为一个原子操作的。用JTA的话,由App Server来完成控制。

在学习EJB之前要学习对象序列化和RMI,RMI是EJB的基础。接着学习JMS和EJB,对于EJB来说,最关键是要理解EJB是如何通过RMI来实现对远端对象的调用的,以及在什么情况下要用到EJB。

在学习完EJB,JMS这些东西之后,你可能会意识到要急不可待学习两个领域的知识,一个是UML,另一个是Design Pattern。Java企业软件的设计非常重视框架(Framework)的设计,一个好的软件框架是软件开发成功的必要条件。在这个时候,应该开始把学习的重点放在设计模式和框架的学习上,通过学习和实际的编程经验来掌握EJB的设计模式和J2EE的核心模式。

J2EE规范里面,除了EJB,JMS,JTA,Servlet/JSP,JDBC之外还有很多很多的企业技术,这里不一一进行介绍了。

另外还有一个最新领域Web Services。Web Services也完全没有任何新东西,它像是一种黏合剂,可以把不同的服务统一起来提供一个统一的调用接口,作为使用者来说,我只要获得服务提供者给我的WSDL(对服务的描述),就够了,我完全不知道服务器提供者提供的服务究竟是EJB组件,还是.Net组件,还是什么CORBA组件,还是其他的什么实现,我也不需要知道。

Web Services最伟大的地方就在于通过统一的服务提供方式和调用方式,实现了整个Internet服务的共享,是一个非常令人激动的技术领域。Web Services好像目前还没有什么很好的书籍,但是可以通过在网络上面查资料的方式来学习。

方法篇

Java作为一门编程语言,最好的学习方法就是写代码。当你学习一个类以后,你就可以自己写个简单的例子程序来运行一下,看看有什么结果,然后再多调用几个类的方法,看看运行结果,这样非常直观的把类给学会了,而且记忆非常深刻。

然后不应该满足把代码调通,你应该想想看如果我不这样写,换个方式,再试试行不行。记得哪个高人说过学习编程就是个破坏的过程,把书上的例子,自己学习Documentation编写的例子在运行通过以后,不断的尝试着用不同的方法实现,不断的尝试破坏代码的结构,看看它会有什么结果。通过这样的方式,你会很彻底的很精通的掌握Java。

举个例子,我们都编过Hello World


public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}




很多初学者不是很理解为什么main方法一定要这样来定义public static void main(String[] args),能不能不这样写?包括我刚学习Java的时候也有这样的疑问。想知道答案吗?很简单,你把main改个名字运行一下,看看报什么错误,然后根据出错信息进行分析;把main的public取掉,在试试看,报什么错误;static去掉还能不能运行;不知道main方法是否一定要传一个String[]数组的,把String[]改掉,改成int[],或者String试试看;不知道是否必须写args参数名称的,也可以把args改成别的名字,看看运行结果如何。



我当初学习Java的时候就是这样做的,把Hello World程序反复改了七八次,不断运行,分析运行结果,最后就彻底明白为什么了main方法是这样定义的了。



此外,我对于staic,public,private,Exception,try{ }catch {}finally{}等等等等一开始都不是很懂,都是把参考书上面的例子运行成功,然后就开始破坏它,不断的根据自己心里面的疑问来重新改写程序,看看能不能运行,运行出来是个什么样子,是否可以得到预期的结果。这样虽然比较费时间,不过一个例子程序这样反复破坏几次之后。我就对这个相关的知识彻底学通了。有时候甚至故意写一些错误的代码来运行,看看能否得到预期的运行错误。这样对于编程的掌握是及其深刻的。



其中特别值得一提的是JDK有一个非常棒的调试功能,-verbose


java –verbose
javac –verbose 以及其它很多JDK工具都有这个选项
-verbose




可以显示在命令执行的过程中,JVM都依次加载哪里Class,通过这些宝贵的调试信息,可以帮助我们分析出JVM在执行的过程中都干了些什么。

另外,自己在学习过程中,写的很多的这种破坏例程,应该有意识的分门别类的保存下来,在工作中积累的典型例程也应该定期整理,日积月累,自己就有了一个代码库了。遇到类似的问题,到代码库里面 Copy & Paste ,Search & Replace,就好了,极大提高了开发速度。最理想的情况是把一些通用的例程自己再抽象一层,形成一个通用的类库,封装好。那么可复用性就更强了。



所以我觉得其实不是特别需要例程的,自己写的破坏例程就是最好的例子,如果你实在对自己写的代码不放心的话,我强烈推荐你看看JDK基础类库的Java源代码。在JDK安装目录下面会有一个src.zip,解开来就可以完整的看到整个JDK基础类库,也就是rt.jar的Java源代码,你可以参考一下Sun是怎么写Java程序的,规范是什么样子的。我自己在学习Java的类库的时候,当有些地方理解的不是很清楚的时候,或者想更加清晰的理解运作的细节的时候,往往会打开相应的类的源代码,通过看源代码,所有的问题都会一扫而空。

posted @ 2006-05-08 16:20 高山流水 阅读(196) | 评论 (0)编辑 收藏

仅列出标题
共30页: First 2 3 4 5 6 7 8 9 10 Last