十年
MFC
经历认识的
Microsoft
技术【原创】
孙辉
自从
2005
年
3
月
8
日下午
16
时
“
十年
MFC
经历认识的
Microsoft
技术
”
以帖子的方式发表于
优快云
论坛后,引起了许多网友得好评,使得笔者诚惶诚恐,考虑到该贴过长
(
人气指数为
5000)
,因此转移到
Blog
上,许多网友对此帖的评语只好省略,在此鄙人谢过了!为感谢网友的支持,本人希望今后能发出新的帖子以回报网友对我的鼓励,再一次谢谢!
初识
MFC
我最初知道
MFC
大概是在
1993
年,那个时候
Visual C++
还没面世,当时
Microsoft
的
C++
编译器还很弱,官方的名字是
Microsoft C/C++ 7.0
,
MFC
的版本是
1.0
,几乎没有引起什么反响,那个时期最好的
C++
开发环境是
Borland C++ 3.1
,其实,大概是
1992
年
11
月份,一个偶然的机会,我领略到
Borland
公司的厉害,记不得在什么地方,我看到一个绝妙的集成开发环境,即
Turbo C++ 3.0 for Windows
,这是我记忆中第一个真正的
Windows
环境下的
C++
集成开发环境,那种激动的感觉至今仍记忆犹新,不客气的说,当时至少在
C++
方面,
Microsoft
与
Borland
不是一个水平的,
Borland
明显的要高于
Microsoft
,
Borland
的产品在技术上给我留下深刻的印象。那个时候
Microsoft
最好的开发平台是
Visual Basic 3.0
,而
Borland
的
Delphi
正处于开发阶段(
Delphi
的代码名称是:
“VB Killer”
)
……
,想起这些十几年前的往事,我不禁感慨万千。
十几年来,我用过许多开发环境,关于
Visual Basic
,我用过最早的
DOS
版本,
Windows
版的
Visual Basic
我基本上全都用过,至今我还记得每个版本的
VB
安装盘磁盘的盘数。同样,我用过各个版本的
Delphi
,特别是
Delphi 2.0
,给我留下极好的印象。
Delphi
提供真正编译的可视化开发环境,那个时候(
1994
年左右),
Delphi
就可以开发带有
GUI
的动态链接库,你可以想象,在
Microsoft Access 2.0
的应用程序中可以加载一个
Delphi Form
并进行程序交互,那种感觉真是棒极了。
Borland C++
是我心中无法抹掉的遗憾,从
Turbo C
到
C++ Builder
,我深刻的体验到
Borland
的辉煌和无奈,
Delphi
从
VB Killer
走到为
VB
护航(你可以想象
Delphi
一步到位的
ActiveX
控件开发技术有多牛,早期的
VB
有多土,早期的
VB
不能开发动态链接库,因此无法开发
ActiveX
控件,想起来真令人嘘唏不已),
Borland C++
的命运也是不济。
Borland C++ 3.1
的辉煌永远不再了,十几年的开发工作中,我在
C++
上投入了大量的精力,
Borland C++
曾经给我带来无数的激动,然而这个经典的名字却在与
Microsoft
的竞争中渐渐的流逝了
……
。
MFC4.0
的出现,使得人们感觉
Microsoft
在
C++
方面赶上来了,这一版的
MFC
是
Win95
推出后出现在
Visual C++ 4
中(
Microsoft
没有
VC 3
,
VC4
以前的版本是
2.2
、
2.1
、
2.0
、
1.51
、
1.5
、
1.0
)。也许是对
Borland C++
的潜意识的失望,我不知不觉的接受了
MFC
,
VC 4.2
推出时,我通过正常渠道购买了这个编译器的企业版。
关于
Microsoft
关于
Microsoft
,有无数的人要对这个名字叙说感觉,这个令人讨厌的名字!不知道是喜欢还是憎恶,你是程序员,你的心思可能就要因
Microsoft
的存在而动,即使你用
Linux
,你可能也是因为
Microsoft
技术因素。多少年来,这个名字每天都出现在你、我、他的面前,因为你不得不面对
Windows
的存在,可是你憎恨这个名字吗?你讨厌这个名字吗?我不知道是否已经对这个名字麻木了。
1998
年我个人订了
Microsoft MSDN Universal
版,我开始比较全面接触这个公司的开发技术,你可以想象,
1998
年当你面对上百张技术光盘的时候,你就知道什么叫做
“
厚度
”
,当我们有时说出
“
赶上
”
或
“
达到
”Microsoft
某些产品的水平的时候,可能我们缺乏对这个公司
“
厚度
”
的真实了解。进入
MSDN
,我感觉
Microsoft
简直不是一个
“
公司
”
,而是(或者正在形成)一个
“
社会
”
。当时著名的技术网站
http://www.codeguru.com
全部的技术资料是可下载的(那个时候
http://www.codeguru.com
提供整个网站内容下载服务,大约
3M
左右),大名鼎鼎的
www.codeproject.com
还不存在。一开始,我始终潜意识在技术上对比
Microsoft
与
Borland
,应当说技术上
Borland
不比
Microsoft
弱,即使现在也有人持有这个看法,可是为什么
Borland
走到今天这个地步?而
Microsoft
却如日中天?若干年前,这两个公司竞争何等激烈,而现在却是另一番
“
合作
”
的景象?可能很多人想过,如果
Borland
不存在,对
Microsoft
不是更有力吗?其实
Microsoft
可能精通中国历史,读过《三国》、十分了解战国时期的中国,其实
Borland
形式上的存在,对
Microsoft
是十分有利的,至少形式上还有竞争对手,而事实上
Borland
已经受控于
Microsoft
(
Microsoft
是
Borland
的大股东)。你可以看到一些微妙的现象:
Borland
为
Microsoft
提供了大量的人才,其中包括
Delphi
总设计师以及
Borland C++
编译器的核心成员;同时也为
Microsoft .NET
提供强有力的护航服务(看看
C# Builder
、
Delphi .NET
)。
1998
年
Microsoft
的
COM
技术基本已经成熟,这个技术使人感到震撼,当时
Microsoft
的对手们提出
“OpenDoc”
用于对抗
“COM”
,你看看
“OpenDoc”
阵营的几个成员:
IBM
、
Apple
、
Borland
、
Novell
,你会感到这个阵营十分豪华、强大。但结果却差强人意,
“OpenDoc”
无疾而终,而
“COM”
依然生机勃勃。
有人说
“COM”
没落了,那么就太不了解
Microsoft
了。在与
“OpenDoc”
的竞争中,
“COM”
是个彻底的胜利者,在与
“Java”
的竞争中,
“COM”
成功的进化了,在这个过程中
Microsoft
体现了强大的吸收能力、以及无法想象的韧劲。
.NET
只不过是
COM
的
“
别名
”
而已。对于一个经验丰富的
C++
程序员而言,
.NET
就是
COM
的进化,而
Microsoft
内部
.NET
就是
“COM 3.0”
(
OLE2
就是
COM 2.0
),而
“CLR”
就是一个不择不扣的
COM
对象。曾经有人问我,既然牛顿时代就奠定了基础(想想著名的牛顿
-
莱布尼茨公式),几百年后的今天,数学还研究
“
微积分
”
吗?回答当然是依然在研究!
“
微积分
”
早期是针对函数的,现代
“
微积分
”
是针对
“
流形(
Manifold
)、纤维丛(
Fiber Bundle
)
”
的,概念深奥了,可是基本思想不变,只是
“
微积分
”
的思想得到合理的延拓与进化,你了解
Microsoft
吗?
Microsoft Research
有一批超一流的数学家在为
Microsoft
工作,其中一些是斐尔兹奖的得主,
Microsoft
正在实现如同
“
微积分
”
进化到
“
微分流形
”
一样将
“COM”
进化到
“.NET”
。从科学概念角度上分析
COM
与
Java
,可能
COM
更全面、精确,从实现的成熟度上
Java
可能更成熟,可是你看到,
Microsoft
正在不紧不慢的追赶。
Microsoft
令人联想起战国时期的强秦。
战国时期的秦国,采取
“
远交近攻
”“
抚弱掠强
”
等措施傲视六国,今天的
Microsoft
也是这样,
VB1.0
时,
Microsoft
推出
“VBX”
控件技术,众多的小公司得以生存,
Microsoft
自己不开发
“VBX”
组件,同样
“VBX”
进化为
“OCX”
时,
Microsoft
并不十分强大,可是这种试探得到众多小公司的响应。
1997
年
Microsoft Office 97
、
1998
年
Microsoft
推出
Visual Studio 6.0
,给众多中、小公司提供了生存、发展的机会,例如
Microsoft Office 97
中集成了
Visual Basic for Application 5.0
,这项技术使得几百家软件开发商与
Microsoft
签署了
VBA
技术许可协议,即使
AutoDesk
这样的公司都与
Microsoft
签署了这个协议,这个协议使得每个集成
VBA
的产品的给个用户许可为
Microsoft
付
40$
的许可费,如果你了解
VSIP
(
Visual Studio Integration Protocol
)协议,以及有多少公司签订了
VSIP
协议,你就真正感觉到
Microsoft
的可怕;
Microsoft Office 97
、
Visual Studio 6.0
的用户界面十分漂亮,为什么
Microsoft
自己的开发工具不提供类似的软件组件?你看到众多第三方的
Microsoft
盟友纷纷推出自己的界面库以模仿
Microsoft
,他们不会反对
Microsoft
,因为他们已经形成了使得
Microsoft
以及这些公司得以生存的生态圈。
Microsoft
的技术储备有多少,
Microsoft
之外的人很难说清楚,
Microsoft
中国公司也未必了解多少,
1999
年
WTL
类库刚刚出现的时候,人们就希望
WTL
能得到官方的支持,或授权给一个
Microsoft
之外的一个公司(你能想象出
Borland C++ 5.0
内置的
ActiveX
开发机制是基于
Microsoft ATL
类库吗?),直到今天,
WTL
依然如故,我们完全相信,如果
Microsoft
强力推广
WTL
,
WTL
完全可以流行,可是
Microsoft
不缺类似的技术,类似的类库还有
BCL(Base Control Library
,一个用于开发轻量级
ActiveX
控件的类库
)
,
Microsoft
还有一个基于
ATL
的类库,这个类库用于开发
ActiveX Designer
,
ActiveX Designer
是绝大多数程序员不了解得一类对象,如果你熟悉
Office
开发,你知道
Office VBA
中有一类对象,即
Form2
,此外
VB6.0
中的报表设计器(以及著名的
Active Reporter
),都属于此类对象,用这个类库,你可以为
VB6.0
以及集成
VBA
的系统提供定制化的可视化设计机制等等,如今
ActiveX Designer
已经演化为集成于
Visual Studio .NET
中的设计器。
向
Microsoft
学习
无论从什么角度评价
Microsoft
,我觉得
Microsoft
是值得我们学习的,如果说生活在这个时代有
Microsoft
存在是一场灾难,你就应该痛恨这个家伙,但你首先要向这个家伙学习!我无意为
Microsoft
歌功颂德,我只是想说出十几年我对
Microsoft
技术的感受。
Microsoft
在研究式的开发中受益极大,如果你有兴趣,你可以访问
http://research.microsoft.com/
,虽然部分中国公司也有研究院,但与
Microsoft
相比,真有
“
米粒之珠,也放光华?
”
的感觉。
2003
年,我在北京的一个地方现场体验了
Microsoft
亚洲研究院的招聘会,我看到中国的精英们进入
Microsoft
的渴望,事实上,在中国大陆,
Microsoft
亚洲研究院的人力资源已经延伸到各著名高校的相关专业的核心层,我感到,
Microsoft
几乎不需要
“
求贤
”
,因为,只要
Microsoft
需要,精英们会
“
蜂拥而至
”
,每个人都有
“
可以理解
”
的理由而向往那个地方,如果为搞数学研究蜂拥到加州大学,我觉得可以理解,因为那里有数学土壤,出了成果国人也会感到自豪,因为
“
科学无国界
”
。技术是否有国界?不知道是否有定论?!想想
DVD
等技术专利给国内业界带来的灾难,不知道应不应该痛定思痛,在
Microsoft
校园招聘现场的气氛中,我似乎明白了为什么国人
“
原创技术
”
少得可怜。我读过几本
Microsoft
亚洲研究院的高手写的书,明显可以看出,
Bill gate
是他们的精神领袖以及他们对
Microsoft
的虔诚,国内的研究机构应当研究一下
Microsoft
的用人之道,
Microsoft
好像是三国里的人物,不知是刘备还是曹操,或者二者的混合物。我经常路过西格玛大厦,第一次西格玛大厦进入真有
“
朝圣
”
的感觉,也与
Microsoft
中国的几个层次的人打过交道,各中滋味实在一言难尽。
在
Office
大战中,国产软件的确在一些方面与
Microsoft
进行较量,其实给人的感觉很勉强,界面上的似是而非,或用户习惯方面的接近并不能解决根本的问题,一个好的软件开发人员必须是一个软件使用的高手,很难想象一个软件操作水平很拙劣的开发人员能开发出高水平的软件,我最早使用的软件之一就是
Microsoft Word
,当时的版本是
2.0
,大概是
1992
年的事情,给我留下深刻印象的是集成于
Word
中的
Word Basic
,后来,我接触到
Excel 3.0
,不出所料,
Excel
中集成的是
Excel Basic
,后来使用的
Access
中自然内置
Access Basic 1.0
,在这些软件集成捆绑成
Office
之前,我就感觉这些产品的构思十分了不起,很具有
Microsoft
的风格,因为你知道,即使是一个
DOS
,
Microsoft
都要提供一个内置的
QBasic
或
GW Basic
。虽然关于
Microsoft
的产品评论很多,作为一个技术人员,我认为
Microsoft
的产品构思绝对是第一流的,从
1994
年早期的
Office
系列到
1997
年形成的
Office 4.2
,我认为,技术构思上均领先于我国
2002
年以后的
Office
产品,你听说过如下说法吗?
“Dos
作为操作系统的时代,
Windows
是应用软件;
Windows
是操作系统时,
Office
成为
Dos
时代的
Windows
;那么如果按此规律,
Office
会不会替代
Windows
而成为操作系统?
”
,现在在开发领域
Visual Studio( .NET)
正在成为另一个
Office
,你注意到了吗?控制
Visual Studio( .NET)
集成开发环境的仍然是一个
Basic
语言引擎(
Visual Basic .NET
)。
与许多公司不同的是,在技术体系上,
Microsoft
几乎所有的产品是息息相关的,
Windows
、
Office
、
Visual Studio .NET
虽然各不相同,但公共的核心即将形成,我们已经看到,核心组件方面,
Office
与
Visual Studio .NET
日渐趋于一致,例如
Microsoft
正在将
Office 2003
的核心组件
VBA 6.X
逐步用新的
Visual Studio Tools for Office
替代,而我们依然在一些似是而非的现象上与
Microsoft
的产品比较差距,国家采购或政府采购支持的公司,不去钻研核心技术,只是急功近利的采用短期行为急于与
Microsoft
相争,不知是否有蚍蜉撼树的感觉,个人的体验是,先学习
Microsoft
,踏踏实实的学,了解
Microsoft
,深入的了解,然后再喊口号。
为什么用
MFC?
经过若干年的竞争,
Borland
的
OWL
几乎消失了,这个
OWL
是个非常漂亮的
C++
类库,在
Borland C++ 3.1
风光无限的年代,
OWL
真正的做到了独领风骚。然而,
Borland C++ 4.0
错过了进入
32
位程序的最佳时机,
BC 4.0
推出后不久,迎来了
Win95
,
Borland
仓促上阵,以一个小的
“Pack”
使得
BC4
可以编译基于
Win4
的程序,当时的
Visual C++
是
2.0
版,支持
Window16
的版本为
Visual C++1.51
,有意思的是
Borland
可以用同一个编译器同时支持
Win16
、
Win32
,而
Microsoft
却不得不为
Win16
、
Win32
提供不同的编译器。然而,非正式版本的
Visual C++ 2.1
与
Visual C++ 2.2
却悄悄地支持了
Win95
的最新特征,即
Win95
新提供的一组公共控件,在我的印象中,
Borland
对
Win95
新特征的支持不利使得
MFC
与
OWL
的距离极大的缩短了。稍后到来的
Borland C++ 4.5
没有改变这个状况,尽管
Borland C++ 5.0
同时支持
OWL
与
MFC
,可是败象已经显露,
Borland C++
非常遗憾的只走到了
5.5
版。
C++ Builder
虽然形式上引入了
Delphi
的
VCL
库,可是许多
C++
程序员并不买账,因为许多以
C++
为乐的人更喜欢以编辑的模式进行编码。
Visual C++ 4.0
的出现,在
C++
这个战场上,
Borland
开始落败了。
MFC
发展到今天,已经十多年了,尽管褒贬不一,但可以肯定,十几年的技术积累已经奠定了
MFC
的生存基础,即使
Microsoft
的长角发布,
MFC
也不能推出
Windows
的舞台,事实上,长角(
Longhorn
)之后的
Visual Studio .NET
仍将
MFC
作为一个重要的组成部分,在今年的
Visual Studio .NET 2005
中,
MFC
在
C++
中的位置依然如故。
MFC
的未来,应该不必担心,只要你深入考察
.NET
类库,你会发现,
MFC
的许多思想机制正悄然进入
.NET
,与此同时,
Microsoft
的第三方盟友十多年来已为
MFC
开发了大量的扩展库,如果
Microsoft
是船,第三方盟友就是载舟之水。许多人认为
MFC
不发展了,其实是一种错觉,
Visual C++ 6
的界面十分经典,特别是其中的
Docking
控制条机制,其实
Visual C++ 6
的
IDE
完全就是
MFC
写的,可是
MFC
类库中控制条相关的类功能很弱,为什么?你会看到许多与
Microsoft
友好的公司,他们很快的在
MFC
基础上实现了
Visual C++ 6
的
Docking
机制,这就是
Microsoft
的高明之处,
Microsoft
很会给盟友提供机会,其一贯的做法就是在自己的商品化产品中预先提供一些有趣的特征,使得其他一些公司进行模仿以带动用户群体。
Borland
不具备这样的储备。
MFC
第三方市场的繁荣,得益于
Microsoft
的策略与明智。
MFC
可否跨平台?理论上完全可以,
Microsoft
不做,也是策略,但是有许多重要的产品
Microsoft
却默许
MFC
移植到其他平台,事实上,
Microsoft
的合作伙伴之一
Mainsoft
公司(
Windows
源码就是从这家公司流失的),几年来就是负责移植
MFC
程序移植到
UINIX
、
Linux
、
AIX
等操作系统之上。
新版的
Visual C++
中
MFC
已经支持
.NET
开发了,
MFC
与
ATL
的协作更好了。根据我的经验,
MFC
、
ATL
与
.NET
库三者完全可以融合在一起综合应用到实际的开发工作中去,如果你是
MFC
行家,我希望
ATL
与
.NET
库能成为你的忠实的左右手。那么有没有同时支持
MFC
、
ATL
与
.NET
库的程序?当然有,
Visual Studio .NET IDE
就是!而且
Visual Studio .NET IDE
还支持用
ATL
与
.NET
库扩展的
Addin
。
认识
Application
对象
如果你熟悉
Microsoft Office
,你应该进一步的剖析这个大型软件,
Microsoft Office
中几乎每个程序都是可二次开发的,这一点得益于
Microsoft Office
内置的二次开发机制,一个是基于
COM
机制的
VBA
模型,另一个是基于
.NET
框架的托管模型:
Visual Studio Tools for Office
。作为一名程序员,你应当在技术角度解析
Office
的技术结构。
Microsoft
的大多数软件的对象结构可以通过
Visual Studio
提供的工具
OLE/COM Object Viewer
考察其类型库得到,通过引用类型库,你甚至可以得到描述对象信息的
C++
头文件。这样做真是好处多多。一个典型的
Office
通常都有一个
Application
对象(或其他一个与之相当的对象),这个对象相当于软件枢纽,在这里,我们不讨论
Office
,借此话题说说
Application
对象。大多数支持扩展(
Addin
、
Plugin
)的软件都存在类似的构造。通常,一个系统得
Application
对象或者是一个
COM
对象,或者是一个
.NET
对象,如果你的系统存在这类对象,你的系统就基本具备支持
Addin
、
Plugin
的机制了。一个理想的做法就是在一个
MFC
系统中,内置一个
ATL
对象或
.NET
对象,稍后我们给出方案如何做到这一点。设计
Application
对象的关键是如何规划这个对象的属性、方法、事件。如果你希望系统具备良好的扩展性,
Application
对象是十分关键的,这也是构架艺术的体现。所谓
Addin(Plugin)
,是系统运行时根据需要加载的对象库,
Addin(Plugin)
之所以可以扩展系统,关键的因素就是系统加载
Addin(Plugin)
时,将
Application
对象传递给
Addin(Plugin)
库,设想一下,如果
Application
恰到好处的触发了系统事件,而
Addin(Plugin)
库如愿的解释了事件,一个
Addin(Plugin)
库的任务不就
OK
了吗!因此
Application
对象是系统设计的关键。
如果你精通
ATL
对象,在你的
MFC
系统中添加一个
ATL
对象,这个任务可以用
VC Wizard
完成。你已经接受了一个事实,就是
MFC
程序中存在一个
CXXXApp
对象(
CWinApp
的派生类),现在你要做的是增加一个对应得
ATL
对象。这个对象可以在
CXXXApp::InitInstance()
中创建,如果
ATL
对象的类是
CXXXAppObject
,建议你在
CXXXApp
对象对象中增加一个成员变量,例如:
CComObject <CXXXAppObject >* m_pAppObj
,然后可以入下初始化
m_pAppObj
:
m_pAppObj = new CComObject <CXXXAppObject >
;
注意程序结束时在
CXXXApp::ExitInstance()
中释放
m_pAppObj
,语句如下:
delete m_pAppObj
;
你可以将系统得关键属性设置成
CXXXAppObject
的属性,例如系统得标题、是否为多文档等等。系统希望外部调用的功能可以实现为
CXXXAppObject
的方法,这一点取决于你的需要。系统需要外部扩展的功能,表现为
CXXXAppObject
的事件,关键是在恰当的位置触发事件以及提供的事件参数。例如,你可以在
CXXXApp::InitInstance()
触发应用程序开始的事件
OnStartUp
,
Plugin
捕获事件后,可以进行特定的初始化(身份确认、初始信息查询等等);
你可以在
CXXXApp::ExitInstance()
触发应用程序结束事件,
Plugin
捕获事件后,处理用户需要的系统退出工作。所有的设计取决于具体设计。
如何加载
Plugin
,是一个有趣的问题,如果
Plugin
实现为一个
COM
范畴(
Category
),可以运用
COM
技术枚举这个
Category
;可以将
Plugin
安装到一个特定目录,也可以通过注册表。
Plugin
的实现可以用
COM
技术、也可以用
.NET
框架。适当的机会我会提供例子
……
一些感想
一时心血来潮,就发了这个帖子,很难说是有心,还是无意。几天前我在新浪网上看应氏杯围棋决赛,我觉得该赢了吧,作为一个围棋迷,我们等了十几年,等到了属于国人的应氏杯。记得
7
、
8
年前在还在大学工作的时候,有一次,一位同事兴致冲冲的走道我面前对我说:
“
嗨,昨天马
XX
赢了李昌镐!
”
,当时我在系办公室正在看报纸,那位仁兄见我头都没抬,非常不满的抢下报纸,对我吼道:
“
喂!马
XX
赢了李昌镐!!你听到没有!!!
”
,我对他说:
“
你大惊小怪个啥?!马
XX
输了李昌镐多少盘,你知道吗?
”
,马
XX
几乎一直在输给李昌镐,人们已经不奇怪了,偶尔赢一次,国人就把他捧得北都找不到了,李昌镐弱冠
17
的时候就傲视这个世界了,可至今面孔不变,几天前的农心杯,中日联军
5
个人,被他打个落花流水,李昌镐是公认的世界第一,以至于有的高手知道下一个对手如果是他,就会去订回程机票。这次应氏杯,国人竟然感谢崔哲瀚,何也?因为这个弱冠
19
的小子,挡住了他的大哥李昌镐才使得应氏杯有了悬念。当国人媒体在说韩国仅李昌镐一人厉害的时候,不知道是出何居心还是自欺欺人,李昌镐年方
30
,不知道要力压中、日多少年!面对这个名字,真有点麻木了,这个太极虎!软件界又来了我们一向不齿的印度虎,
2001
年我们的软件出口额仅是印度的四十分之一,我们震惊了,怎么可能呢?这个四十分之一水分很大,很可能更可怜!当时我在大连参加一个关于
“
大连软件出口国内第一
”
的官方会议,那位大人在会上说:
“
据说,我们大连软件出口国内排名第一,市有关领导希望今天的会议给出这个第一的数字依据,希望你们把数据报上来,去年的数据也可申报,注意,我们要的只是数据,你们仔细体会,我们根据数据,有奖励,机会难得呀!
”……
。某一天,几个朋友在我家看央视的对话节目,对话一方为国内的软件大鳄们(用友、阿尔派等公司的老总们),另一方为印度软件的一个代表团。当问及中、印软件差距的时候,我们的刘老总(代表阿尔派)不以为然的说,据他的看法,我们已经快赶上(印度)了,
……
,言下之意颇有印度的水平不过如此的感觉,印度方的话我至今记忆犹新:
“
是否赶上,国际市场说的算!在中国看来,印度程序员的个性不足,技术也不怎么样,其实是个错觉,印度软件首先注重个性,许多重要的美国商品化软件都是在印度本土开发的
……”
,我们的舆论总是将印度程序员的水平描述的平庸至极,可是差距日渐拉开,
……
,围棋、足球(不好意思谈,谈不出口!)、软件,我们被近邻严酷的封锁了,乐坏了记者们、给媒体带来了生机
……
日本江户时代的围棋,如果一个人要想世袭一个称号(例如:本因坊),他必须战胜所有的师兄弟,然后,住进师父家的内室,你知道以后的事情吗?以后,这个棋手,就得为师父一家做饭、带孩子、搞卫生
……
,其余的门人则一心一意的下棋,这样的人、方式,造就了一代一代的本因坊,他们的棋谱大多数都流芳至今,这就是早期日本围棋的悟道模式。软件总共有多少语句?我最早接触的计算机软件教材是一本英文版的(影印的
D
版),不同于我们,那本书的作者构造了
“X-
语言
”
,他们不讲什么
C
、
Pascal
、
Basic
,一旦缺了什么机制,就给
“X-
语言
”
添加些成分。什么
C
、
Pascal
、
Basic
,你感觉差不多,但现在却分出了等级!我们驾驭语言的能力弱得很,可是我们在语言的细微之处却很讲究,不知道对不对,许多程序员也许是出于虚荣而用
C++
,事实上,地球人都知道,做数据库,
Delphi
、
VB
远比
C++
胜任,铺天盖地的
C++
的书,写的东西几乎雷同,因为,有用的或者作者不写、或者作者不懂。有时我在想,如果国内没有内需,会怎样?也许软件内需的存在,造就了中国软件的特色,我认为国内业界并没有充分利用中国软件内需的存在,也许中国软件内需的存在是软件落后的硬伤。
我记得一部电影《神辫》,那个英雄的大辫子被洋人炸掉了,最终他成了神枪手,战胜洋人用大刀、秘籍是不行的,用洋的东西战胜洋的技术才是正道。我觉得,一个好的程序员必须了解软件的历史,学习历史,你知道你为什么弱,别人是如何强大的。我们正在另一个战场上抗美(可笑的是我们却要赶超印度!),无论
Microsoft
、
Borland
如何争斗,无论他们谁统治谁,他们不影响美国的强大,朋友们,学习
Microsoft
,开发出让国人感到牛的软件!
这个帖子出乎本人的意料,愿意与大家共勉,希望这个帖子常在,与大家敞开心扉的交流!
FireFox
与
Microsoft
FireFox
在一片赞扬、欢呼声中激情登场了,也许人们真的期待已久,平静的水面终于被扔进一块石头。我是
IE
的最早期的用户了,
1996
年首次
Microsoft
的
TED
(技术教育大会),
IE4
还没有发布时候,我们有机会目睹了内部版本的
IE4
(当时内部名称是:纳什维尔,英文名称忘记了),那真是一次令人激动的预览,当时
IE3
与
Navigator 3
激战正酣。当你第一次看到想象中的
“Active Desktop”
,如果你没有身临其境,你不会激动。
IE4
本质上是一个
Shell
,其
SDK
是免费的,
Navigator
是基于
Mozilla
的浏览器,虽然是开源的,由于要照顾更大的共性(与操作系统无关),因此
Mozilla
不能充分的利用
Windows
的优势,
Mozilla
不能为广大的程序员带来所谓开发人员的
“
快感
”
,顶尖程序员可以驾驭
Mozilla
,以实现技术深度带来的乐趣,最早的
Navigator
同时提供
17
个版本(注意:不是
17
种自然语言,而是
17
种操作系统),从数学角度分析,
Mozilla
就像一组公理,你可以以此为基础开发不同操作系统上的浏览器,
Navigator
就是基于
Mozilla
的一个漂亮的结果,你能欣赏到代码结构的优美,然而失去的却是功能强大的个性(要知道,
Windows
用户在数量上远大于其他操作系统用户的总和)。普通用户不可能读懂
Mozilla
的代码,即使懂了也不能很好的运用,这也许是
Mozilla
(以及大多数开源代码)失败的致命原因之一。
IE
内核聪明的抓住了开发者,你想想:对数以万计的中、初级开发者而言,容易驾驭是首选的选择,也是明智的。我读过
Mozilla
,但我不会在开发过程中为一个具体的项目应用它。只要是浏览器,就不可能绝对的安全,无论是
Mozilla
,还是
IE
。当我了解到
FireFox
是基于
Mozilla
的一个新的浏览器,我基本上对其失去了信心,我有一个奇怪的观点:
FireFox
的推出,最大的受益者绝对是
Microsoft
,即使
Microsoft
失去
20%
的份额,但是会导致
Microsoft
强化
IE
,
Microsoft
正不知道如何促使
IE
进化的时候,
FireFox
的出现无疑为
Microsoft
提供了机会,物种进化的原则就是竞争,
FireFox
就是促进
IE
进一步强大的催化剂。
FireFox
的扩展机制的确十分灵活,如果对手不是
Microsoft
,就很难掀起波澜,而且当高级的开发者逐渐了解
FireFox
的时候,
FireFox
的漏洞就会渐渐暴露,试想想,如果某种
Linux
取代了
Windows
,那么,它的漏洞也会与
Windows
一样多,因为那个时候,会有与研究
Windows
漏洞一样多的人去研究对应得
Linux
的漏洞!从个人的角度上看,
Microsoft
也许有点
“
冤
”
,因为窥视
Microsoft
弱点的人实在太多了。从理论上看,计算机安全性是个永远的话题,就像任何社会都需要警察一样,没有了小偷、贼、犯罪,警察也就消失了,你想想,文明是什么?野蛮能消失吗?野蛮消失了,文明也就不存在了,高度文明就是更不存在了。人类克服了癌症,下一个疾病会比癌症更致命,但这并不意味着不必克服了癌症,进步真是一种挑战
……
IE
的技术构思肯定是个卓越的构思,
IE
可扩展的机制,会给
Windows
开发者带来许许多多的益处。我正在计划一片文章,介绍如何将你的对象模型与
MSHTML
库实现对接,这样,在
HTML
文件中可以将你的指令系统与
HTML
对象模型融合在一起。
话说
“Hook”
在
优快云
上时常看到关于
“hook”
,的问题,令我想起另一个话题,那就是游戏
“
外挂
”
。
Hook
提供一种改变一个
Windows
窗口消息处理的一种手段,通常的开发根本用不到,因此,谈不上
“
常用
”
,早期的
Windows
,由于不能很好的支持远东(当然包含汉字)地区的文字,因此出现了许多外挂的软件补充
Windows
的不足,中文之星是一个典型的、令国人自豪的软件,监控软件也许要运用
hook
技术,此外,很难想象什么软件会用到
hook
。有人问我,能不能改变一个进程的数据处理行为,我曾经告诉他:能,也不能!感觉告诉我,
hook
绝大多数场合下是一种
“
不礼貌
”
的行为。曾有一段时间,我的服务器,经常有人悄悄地近来,给我增加许多超级用户,肆意修改我的管理权限,我找到托管商,解决了这个问题,那时,我也买了几本服务器监听、安全方面的书,看了几天,我就放弃了,为什么?担心学坏(正、邪仅在一念之差),其实,每个服务器都很脆弱,对有经验的系统程序员而言,安全性与道德准则是联系在一起的,软件技术上走邪路很容易,有时我会想,如果我去设计病毒或者当黑客,会怎样?基础数学出身的我,数论、组合学、密码理论统统不是问题,
Windows
虚拟驱动程序开发,也不是问题!为什么那么多的人关心
hook
?国人的正道软件寥寥无几,可破解术却出神入化,可惜,可惜!
hook
是一种底层的编成机制,能理解好
hook
的人,完全具备掌握一流技术的底蕴,真希望回头
……
MFC
的批判
记得梁羽生先生笔下有一位正邪兼修的高手,名曰
“
乔北溟
”
(好像是这个名字),一次此人与大侠张丹枫在一个庙中相遇,乔北溟随手操起香案上的香炉,张丹枫问他:
“
你的家伙称手吗
?”
,乔北溟笑答:
“
以吾辈之见识,还在意手中之物是否为剑?
”
,张丹枫一愣,心中暗念,此人果然不同凡响
……
说起
MFC
,许多人都会撇撇嘴,高手们会对其提出许多尖锐的批评,例如,刻板的
Document-View
机制,繁复的框架结构,怪异的
COM
实现以及令人莫名其妙的宏,等等。
MFC
的大而全,不仅捆住了
MFC
开发组的手脚,也为全面掌握
MFC
的愿望设置了障碍。高手们批评之余,可能忽略了一个基本的事实,这个事实就是,你的批评来自于你对
MFC
的深入理解,当许多人指出
MFC
的种种弱点时,他们或许不愿意承认:他们的技高一筹、见识超人一等是
MFC
带来的,不止一次有人与我谈及:
“MFC
的
COM
实现,实在差劲,看看
ATL
(不容否认,
ATL
至今仍然是开发
COM
的最佳
C++
类库),你就会感觉
MFC
的臃肿
……”
,我们中的许多人潜意识里不知不觉的在作一件事:
“
当我们借助一部梯子登上一层楼的时候,我们会评价这个梯子是如何如何之糟糕。
”1999
年,我的一个项目中需要一个描述引擎,
VBS
(
Visual Basic Script
),是个免费的语言引擎,但功能局限极大,我联系了美国的
Summit
公司,他们很快寄来了
Microsoft
的
Visual Basic for Application SDK 6.0
,当时我的团队可谓很强,其中的几位研究生
C++
修养很好,拿到
VBA SDK
时,他们对我说:
“
应当没问题,我们很快就会搞定
VBA SDK”
,可是几天过去了,连个例子都没出来,原来,虽然
VBA SDK
提供了
MFC
扩展类库(基于模版机制的
MFC/ATL
合成类库),可实现得极其别扭,我接手后的当天晚上,
VBA
的
IDE
就集成到系统中,第二天可编程对象顺利出现在
VBA
的
IDE
中,其余人觉得很奇怪,一看代码,原来我绕过
Microsoft
的例子,完全是另外的实现途径,那个时候,我感觉到,
Microsoft
这个家伙真的可恶,本来清晰的集成途径,却人为的让你绕来绕去增加技术难度,过后想想,也可以理解,不这样,第三方的
Summit
何以作技术支持?我经常想,如果没有商业利益,许多技术应当十分简洁、高效,这一点,
Microsoft
以及其他大公司都十分明白,如果一切都是最佳的实现模式,可能就另外一种局面了,复变函数论中有一个著名的定理:
“
复平面上处处解析的函数一定是常值函数。
”
,
学生们很难理解,当时我说,如果把一个省几十个县的最好学生组成一个班会怎样?结果是一定有一个较差的学生(除非这个班只有一个学生!),这是个无法抗拒的定则,你想想,用天下最好的
20
个菜形成的酒席是什么味道?那一定是最差的!
Microsoft
的
MFC
是值得你学习和使用的,如果你讨厌这个东西或者你认为这是个邪恶的东西,你学学乔北溟,实现正邪归一
……
有感于
“
鸡兔同笼
”
小女初到北京时,对北京的教育颇为不适,铺天盖地的数学奥赛培训班向她压过来,孩子真是辛苦。她四年级时,就的对初等数论的基本内容进行强迫性的熟悉,还好,经过一段时间的努力,掌握了
“
鸡兔同笼
”
、
“
韩信点兵
”
等中国经典,马马虎虎的能证明费马小定理,有一天,她问我:
“
爸爸,大学数学什么样?还有
‘
鸡兔同笼
’
吗?
”
,我说,有,我特意找了本老外写的《
Basic Algebra
》,找到其中的
“
中国剩余定理
”
,小孩子接着问道:
“
这本书中还有中国人的数学内容吗?
”
,我在习题中给她找到华罗庚老先生的
“
反同构定理
”
,小孩子又接着问:
“
还有吗?
”
,我感到很没面子,因为真的找不到了
……
曾经的一个梦,就是当一个数学家!为此,研究生时期买了大量的数学书,当时我们系的资料室是联合国教科文组织的藏书室,可以说,里面就是一个装满武功秘籍的宝库。有一天我们打扫资料室的一个仓库,仓库里全是鼓鼓囊囊的麻袋包,上面落满灰尘,手触摸一下,能粘出几毫米厚的灰尘,可以想象有几年没有打扫了。同学无意中揭开一个麻袋,我们惊呆了,里面是美国
60
年代各大学的数学杂志,每个杂志的名字都是响当当的,那真叫浩如烟海!当时我们就想,我们的论文能发表到其中吗?如果侥幸发了几篇,可想而知,我们就可以当博导了,这些比国内所谓核心期刊有分量得多的杂志,就像
优快云
上的帖子一样,很快就会被淹没了,也许很久都不会有人参考、访问
……
,有一天,我也当了老师,面临着种种考核,于是,我们就成了论文机器,不论是否有价值,只要是核心的,你就高人一等。那个时候,我经常想起那些麻袋里的文献
……
我们整体水平的落后,导致整体的浮躁,数量上上去了,质量却下来了。若干年后,也许我成熟了,我们这些曾经站在大学讲坛上的人,没什么好的东西讲(谈不上
‘
教
’
)给年轻的学生,记得当年我校的计算中心计划招个培训班,几天过去,仅有
7
人报名,第
8
人来时,前
7
人就退了
3
人,主任感到奇怪,问学生,学生不语,其中原委并不复杂。我发此帖并没有精心策划,的确如某些网友所言是随感而发,
“
鸡兔同笼
”
、
“
勾股定理
”
已经有了历史地位,如果仅仅够用,我们住草房子一样保暖,为何建大厦呢?为什么放弃传统的长袍、马褂而去穿西装革履?病毒软件大战几乎是自杀性的内战,没有撼动国外产品的分毫,我们许多人喜欢对自己人说三道四,是不是很少想一致对外?人家卖我们打折的产品,条件是附加一份
“
忏悔书
”
,而执行者却是我们国人,为什么?因为我们的东西匮乏!当年别人用钢铁武器掠夺了我们的财富,他们强大了,地痞无赖换上了绅士面孔,讲起了法律,当你用
D
版时,人家文明的指责你,你的人力、财力、物力统统为人所用,取之于你用之于你,而我们却依然陶醉在
“
鸡兔同笼
”
、
“
勾股定理
”
的历史成就之中,我们依然喜欢争论
“
勾股定理
”
谁发现得更早,
π
是谁最先精确计算的,就像谈论
C++
谁的水平更高一样。
想起西太后
……
据说,西太后垂帘时期,洋人曾送给她一量火车,慈禧看过后,大骇,以为妖魔
……
。火车进入中国,最初可能也是引起争议的,大多数百姓都对此怀有惧怕的心理,时间长了,也就自然而然的接受了。
想想
Windows
,最早也就是
1983-1984
年间出生的,到现在充其量也就
20
几岁,
Linux
大概比
Windows
小十岁。
Windows
来自一个贵族家庭,家长是
Microsoft
;
Linux
来自一个单身
“
母亲
”
,成长环境是一个社会,正可谓一个是贵族娇儿、一个是山野村夫。在洋人的世界里,
Windows
与
Linux
正如火如荼的争斗着,就跟人类历史上贵族与平民之间的争斗一样。我们很看不惯许多贵族娇儿,往往拿平民子弟的良好习惯与之比较,这一点都不奇怪。然而,我们平民阶层却有培养贵族的愿望,
Linux
社会也是如此,
Linux
社会已经分化出许多贵族了,为了各自的利益,面和心不和的联盟不知结了多少回,历史告诉我们,如果
Windows
死了而且如果
Linux
社会繁荣了,
Linux
社会就会出现一个贵族来接替
Windows
(叫不叫
Windows
无所谓,改朝换代吗)。某次,与国内一著名软件研究所的几个朋友一起进餐,谈到了
Linux
,话题自然很多,话题之一就是中国的
Linux
,朋友们笑曰:
“……
,自主知识产权的操作系统,也就是对开源代码内核的汉化,
……”
。人们可以列举许多关于
Linux
的强大之处,比如著名的电影《泰坦尼克》的特技制作,高性能计算
Linux
操作系统占据绝对主动等等
……
,其实对了解
Linux
的人而言,这一点并不奇怪:为某一特定的任务定制的
Linux
很容易剔除许多不必要的服务,这就好比轻装上阵,事实上,如果可以将许许多多的不必要的
“
虚拟
”
服务卸掉,
Windows
的性能并不差(
Windows
要加载许多虚拟服务),其实,即使
Linux
专家也承认,如果
Windows
允许向
Linux
一样可以按要求订制,许多弱点也许就不存在了,但市场也就是另一回事了。
回到我们国人的立场,本人以为,没必要太多的对比
Windows
、
Linux
,如果我们
Linux
领域很强或者我们创造了
Linux
(毕竟这些都是洋玩意儿),倒也罢了,事实上,我们在
Linux
领域也不比
Windows
领域光彩多少,我们的许多人愿意用
Linux
说话,可是我们在
Linux
上拿出让我们立足的工作了吗?看看
Linux
社区就知道了!我们为什么不能把
Windows
、
Linux
都当作进入中国的两种新型火车而客观对待呢?在外交礼仪、航海公约以及种种标准等方面,我们已经潜移默化的接受了,为什么?因为我们弱势。
Linux
也是别人的,与
Windows
没什么区别。我们真正应该做的,是接受并使自己强大,许多网友给我回信,认为我的观点偏激或奉
Microsoft
为神,其实不对!只有认识一个强大的令你敬佩的敌人,你才有激情去强大自己。谈论
Microsoft
越多,其实客观上是对其承认越深,如果
Microsoft
不够强,就没必要拿它说话或对比,
Microsoft
给世界带来太多的负担,任何一个操作系统想战胜它,前提是必须兼容它给这个世界已经带来的积累,因此
Microsoft
很可能是无疾而终,铁木真的王国,是巨大无比的(据说他要讨伐一个对象,路上要在他的疆土内走上一年的时间),可并没有谁灭了这个王国,是自己灭的。我们认为铁木真是中国历史上的人物,可是有些国家认为是他们历史上的人物。其实只要客观对待
Windows
、
Linux
,能够正确定位他们的应用环节,
Windows
、
Linux
就都是好的东西!
我们应当更多的看到,
IBM
、
Microsoft
等的崛起,是公司行为,这些公司为美国创造的不仅仅是辉煌,而是国力!我们的软件,依赖国家行为的投资(我们的软件研究所拿出什么来了?),靠国家的资助,却抱怨别人在垄断,多可笑!我们应当搞清楚我们在食物链中的层次,然后再指责别人。你不强大,你就受人欺负,拳头是硬道理。看看我们的北大青鸟,如果你看了他们的组件工厂的论述,你会觉得这是世界上最好的东西,可是你看到市场上北大青鸟在干嘛?我们有太多的自欺欺人的东西,有太多的世界领先、国内首创的鉴定,可是回头来,我们不得不清醒了
……
后记:
为感谢
优快云
网友的支持
,
本人拟定陆续增加几个新的帖子
:
一、十年
MFC
经历认识的
Microsoft
开发技术
-
多文档界面开发技术:此贴讨论一类多文档界面,主窗口是一个单文档界面,如果你愿意,你可以将多文档窗口作为主窗口的一个视图(
CView
)显示,这类多文档界面支持无限多个文档类型(即可以加载任意多个文档模板),支持(基于
COM
、
.NET
)二次开发技术以及
VBA
集成;
二、十年
MFC
经历认识的
Microsoft
开发技术
-
可视化文档界面设计技术:此贴讨论
MFC Document/View
机制的可视化实现,将给出一种所见即所得的
Document/View
设计机制;其中包含如何集成
ActiveX Ctrl
、
.NET User Control
、
MFC CView
类对象以形成一个
MFC
窗体;
三、在
MFC
程序中如何有效的使用
HTML
、
flash
,例如,可以实现
flash
动画作为一个程序的
Splash
以增强程序的感染力,使用
HTML
、
flash
动画作为
MDI
程序的
MDI
用户区的背景等等
……
;
四、十年
MFC
经历认识的
Microsoft
开发技术
-MFC .NET
组件开发技术:介绍如何使用
MFC
类库开发
.NET
组件,例如可以用
MFC
开发
WinForm
对象,然后用于
VB.NET
、
C#
等等。
如果大家有好的建议,请与我联系(
sunhui@mail.apptemplate.com
、
sunhuizlz@yeah.net
)
,
如果有北京的朋友肯帮忙协助,在下不胜感激,希望得到大家的支持!