十年MFC经历认识的Microsoft技术

 
十年 MFC 经历认识的 Microsoft 技术【原创】
孙辉
 
 
自从 2005 3 8 日下午 16 十年 MFC 经历认识的 Microsoft 技术 以帖子的方式发表于 CSDN 论坛后,引起了许多网友得好评,使得笔者诚惶诚恐,考虑到该贴过长 ( 人气指数为 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”
CSDN 上时常看到关于 “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 年代各大学的数学杂志,每个杂志的名字都是响当当的,那真叫浩如烟海!当时我们就想,我们的论文能发表到其中吗?如果侥幸发了几篇,可想而知,我们就可以当博导了,这些比国内所谓核心期刊有分量得多的杂志,就像 CSDN 上的帖子一样,很快就会被淹没了,也许很久都不会有人参考、访问 …… ,有一天,我也当了老师,面临着种种考核,于是,我们就成了论文机器,不论是否有价值,只要是核心的,你就高人一等。那个时候,我经常想起那些麻袋里的文献 ……
        我们整体水平的落后,导致整体的浮躁,数量上上去了,质量却下来了。若干年后,也许我成熟了,我们这些曾经站在大学讲坛上的人,没什么好的东西讲(谈不上  ‘ )给年轻的学生,记得当年我校的计算中心计划招个培训班,几天过去,仅有 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 等的崛起,是公司行为,这些公司为美国创造的不仅仅是辉煌,而是国力!我们的软件,依赖国家行为的投资(我们的软件研究所拿出什么来了?),靠国家的资助,却抱怨别人在垄断,多可笑!我们应当搞清楚我们在食物链中的层次,然后再指责别人。你不强大,你就受人欺负,拳头是硬道理。看看我们的北大青鸟,如果你看了他们的组件工厂的论述,你会觉得这是世界上最好的东西,可是你看到市场上北大青鸟在干嘛?我们有太多的自欺欺人的东西,有太多的世界领先、国内首创的鉴定,可是回头来,我们不得不清醒了 ……
 
后记:
为感谢 CSDN 网友的支持 , 本人拟定陆续增加几个新的帖子 :
一、十年 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 , 如果有北京的朋友肯帮忙协助,在下不胜感激,希望得到大家的支持!
 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值