传道解惑 软件开发技术名词解密
DirectDraw & D3D
大凡像样的2维Windows游戏,几乎都是采用此技术来实现显示的。DirectDraw有两种模式:全屏和窗口。其中全屏应用更多一些。在全屏下,DirectDraw有一个十分著名的“换页”技术,即在两个显示页面之间用“交换”来实现显示刷新,这个速度十分地快,只是一个显存内一个指针的交换,比你用BitBlt复制一屏的像素快太多太多,游戏的高效的动画效果大多源于此技术。DirectDraw主要用于娱乐领域和一些实时显示要求较高的场合,如医疗图像。D3D是目前大多三维游戏的标准采用,我没钻研过,不敢多言。它的效果嘛,玩玩游戏就知道了:)
UML:Unified Modeling Language,多译为统一建模语言
这个语言是一种图形语言,主要是作为设计时建模的一种标准的图形模型,便于程序员与程序员、程序员与客户、设计员与代码员之间的沟通,同时它也帮助设计人员将头脑中的基于程序代码的对程序功能的理解形成文档,便于理清头绪,进行下一步编码的工作。换言之,设计过程的产品,可以表现为一些文本文档,或者一些框架代码,或者一些伪代码,但比较标准通用的,是表现为一堆UML图。UML包括动态图和静态图两大类,其中静态图中的类图最为常用。很多人初学时不知道该怎么做设计,写小软件时常常没有设计过程,其实很简单,把软件的类图画出来就好了。学做设计时未必要找一个像Together或者Rational Rose一样的巨无霸。用一些简单的可以做UML图的工具就好,专门用来画UML图的小工具很多,网上容易找。补充一点:画UML图不要面面俱到,不要什么都画,突出重点方便理解就好,甚至使用不规范的记号也不要紧(当UML的功能是草稿的时候)。
RTTI: Runtime Type Information 运行时类型信息
在程序中,当我们得到某一个对象的实例或者指针时,大多数时候并不能直接肯定它的类型(都是继承以及类型转换惹的祸),这个时候,依靠VC4.0或更高版本的编译器提供的RTTI支持,调用库函数typeid()即可在运行时获取这个对象的“类型信息”,在一些动态处理中“类型信息”很重要,获取了类型信息以后,你就可以有十分把握地调用该类型的相关操作,或者类型转换,或动态生成。因其重要性,在JAVA和.net库中借助单根继承和“虚拟机”对此有了更优雅的做法,每一个自object继承的类天然就有了表述自己类型信息的能力(继承的好处),并且容易扩展,现在你需要类型信息的时候,大可直接ask那个对象:tell me, what type are you?它就会告诉你答案。
debug & release 调试 & 发行
大家都知道,debug是调试版,release是发行版,区别在于debug版生成的程序中包含大量供调试用的场景代码(不是真正运行需要的),而release一般去掉了这些信息,并进行了某些代码优化,所以release版的程序会比debug版的程序小很多,运行速度也快一些。同时,debug版为了便于调试,往往会对调试使用的诊断代码加上DEBUG一类的宏,使得在release下不对这些代码进行编译。正由于两种版本编译使用的源代码的差异(以及release糟糕的优化),常常使得两种版本运行时产生截然不同的效果,一个正常一个崩溃是大多数人都遇到过的。导致问题的可能性很多,注意事项详见各论坛的诸多精华贴。另,同一个程序如果DLL之间的链接使用了不同版本(譬如EXE是release版,dll是debug版),有时会无法正常运行,所以我一般的做法是每一个DLL针对不同版本使用两个DEF文件,编译生成不同名的两个文件(debug版文件名后加d),调用时各个版本针对自己的版本调用,这在一定程度上可避免混乱。另,release也是可调试的,在工程设置里把调试信息打开即可。
XP:eXtreme Programming 极限编程
这是近几年才时兴起来的开发模型,国内大致是01/02年开始有所宣传。
它主要是针对中小型开发团队在开发时间要求紧、需求不稳定的中小项目(大多数软件项目都是这个情况)时使用。它打破了传统软件工程的框架,非常新巧。譬如整个开发过程中文档很少,大量使用“卡片 (如CRC卡片)”来描述开发计划和内容;没有真正意义上的软件功能规格说明书,取而代之的是一系列可测试的用例;没有独立的设计和测试阶段,它们总是在迭代中增量反复进行;设计:尽可能小和简单;一般没有代码复审(code review),大家共同拥有代码。而它的最显著的一个外在特征是它常使用“成对开发”,即一台机器前坐两个开发人员,共同开发(一个看,一个写),这乍听起来真是蛮有趣的:),它的基本出发点是认为成对开发的效率在一定条件下要高于两个人独立开发的和。不要觉得天方夜谭,在很多项目中,这种做法的有效性已经被证实。
XP的特点可以用“快、小、灵”来概括,它和传统瀑布模型(自顶向下)的区别在于它使用迭代增量(设计->代码->测试->设计->代码...)的方式。想法很简单:没有什么目标是可以一开始就容易确定的。用爬山来做一下比喻的话,传统的是在山下研究地图,选好一条路线,然后沿着此路前进,XP则是走一走,停一停,看一看,对下一步的方向作出新的选择,在很多时候,这样做会让你选择到更好的捷径。
ICONIX:
这个字相信很多人都没见过,我也不知道是什么字拼起来的,作为开拓眼界,我还是提一下吧。这是一种界于XP和RUP(Rational Unified Process)之间的开发模型,换言之,它比XP“大”,比“RUP”要小。它采用了UML的一个子集,特点是用例驱动,保持良好的进度跟踪能力。它的目标是用最短的时间来把用例变成代码。具体来说,这种开发模型相对精简的XP而言,更加强调用例的建立、分析和代码化,用例是其中心地位。
RUP:Rational Unified Process
前面已经提到了,相信你已经感觉出它是一个丰富的软件开发模型。这是由IBM提出来的软件工程模型,它使用完整的UML图,对开发的各阶段(需求、设计、代码、测试、维护)均有十分完善而复杂的标准,就不详述了。RUP本质上是迭代式开发,在每一次迭代中均完成以下四个阶段:初始阶段(inception)、详述阶段(elaboration)、构建阶段(construction)、转换阶段(transition)。
CMM:Capability Maturity Model 软件成熟度模型
这是卡内基*梅隆大学软件工程研究所(我的专业正是软件工程,所以这也成为我心目中的圣地)的一大力作,一度曾形成了席卷全球软件开发的CMM浪潮。CMM分为五级,大多数软件企业都处于第一级,而得到第五级认证的全球也没有多少,国内去除掉挂羊头卖狗肉的,也是寥若星辰(嗯,比星辰是寥多了)。所以CMM实施一般是从第二级开始,能做到第三级的都是颇有实力的软件公司了。CMM是以Process(过程)为中心的模型,从二级始每一级都有几个Key Process(关键过程),每一个KP又分为若干Key Active(关键活动)。CMM的实施一般不能越级实施,并且每一级的实施通常都要一年以上,所以要达到较高等级是一级很困难的事。另,CMM不仅可用于较大规模公司,同样也可实施于小公司,小项目组(这是很多人所不知道的)。实施视具体情况等级之间可交叉,譬如实施时采用二级的某些KP再加上三级甚至四级的KP,但你只有实施了所有二级的KP,你才能也只能通过二级认证,即便你采用了某些四级的KP。CMM最新发展成果是CMMI(Integration),这主要是新考虑了软件与非纯软件因素的关系(譬如系统),以及团队之间的协作问题。CMM在国内的发展似乎有点走向ISO同样的道路,这实在不是一个好消息。
Callback Function: 回调函数
在侯sir的<<深入浅出>>中一开始就提出了这个概念,大概的提法是说回调函数是操作系统调用而你永远不要去调用的函数。这个提法让初学者有点望而生畏,以为是一种多么高深而难以领会的系统底层的核心技术。其实不然,这个技术本质很简单,而且很常用。它实质就是函数指针的基本运用(如果不知道什么是函数指针的话,翻翻书)。在一个模块中,有时想让一部分功能由其它模块实现,譬如说一个做显示的模块,它只想实现显示的资源配备,画面的刷新,缩放等控制功能,而把画具体实体(譬如圆、多边形,都可以有很多种不同效率的实现方法)的代码由别的模块来实现,怎么办呢?用函数指针。在自己的类中放一个画圆的函数指针,使用时由外部为这个函数指针赋值(其实就是指向了一个外部的函数),在自己的代码中直接调用这个函数指针来画就可以了(本模块完全不知道外部模块是怎么画圆的)。那个外部的函数在这里就是回调函数!
在很多系统API中就使用了这种函数回调的方法,让我们开发的代码实现可以嵌入到API的代码实现当中,其实我们就是传了一个函数地址给它而已。换句话说,这些API搭好了某些运行的代码框架,我们来为它具体实现。
XML: Extensible Markup Language 可扩充标记语言
也许你还在为选择.net和j2ee而徘徊不前,如果是这样的话,不妨先着手学一下它们所共通的一个基础:XML。有了HTML为什么我们还要XML?很简单,HTML重在表现文本/图片以及一些多媒体内容,它很难表达数据,因为它的标记是固定的,而数据类型千千万,根本无法描述。.net和j2ee都要解决一个信息传输格式标准化的难题,这个格式要能承载文本/数据,最好还能描述程序接口,同时又应该像HTML一样简单,具有通用性,能够在HTTP下很好的运作。在这种要求下,XML产生了。它的特点正如其名,和HTTP一样,它也是一种标记语言,但是它的标记不是固定的,是可自定义(也就可无限扩展)的,这些自定义标记能够很好的描述数据类型以及对应的数据内容(乍看起来很像数据库表的定义)。除此以外,XML还可以描述程序接口,所以XML可以方便地与网络程序构件(COM、EJB等)直接交互。由于它也是一种ASCII文本流,所以与当前的HTTP兼容,在当前的internet上畅通无阻(这很重要)。有了以上功能,XML就名副其实地成为了新一代互联网技术的标准信息载体,在.net和j2ee的网络架构中,各种“构件”的信息交互都交给了XML,可谓任重而道远。
XML我自己没怎么写过,单就学习上的经验而言,感觉语法上比HTML更琐碎一些,小细节更多,没那么容易速成:) 好在根本同源,有HTML基础甚至WEB开发基础的,学起来也很轻松。
Java2:
这是近几年最吸引大众焦点的语言,在Web开发,网络平台,移动开发的世界里发光发热。你可以不用java,但你不可以不了解java,毕竟这是一个极大且丰富的软件开发领域。有些没使用过java的VS阵营里的人可能还不明白java2里的那个2是什么意思,容我先解释一下。Java最初正式推出1.0时,并没有受到如此多的好评,受到颇多责难,于是它不断地推出新版本来完善自己,其中变化显著的一个版本是1.2(我没记错吧),Java的每一个新版本除了语法上的更新,还有一明显的标志,那就是JDK(Java Development Kit,就是Java自带的一套SDK)的更新,版本1.2以后的java为了在宣传上与以前的java相区别,便被称为java2。目前用得比较多的jdk是1.3/1.4 ,最新的JDK是1.5(代号tiger)。java开发的IDE国内主要以JBuilder为主,另外就是在开源领域如雷贯耳的Eclipse,而sun也力推自己的开源java IDE:Netbeans(从sun的网站上可下载,免费)。Java运行是虚拟机机制,相当于在操作系统上增加了一个软操作系统,源码被编译成一种字节中间码,由虚拟机解释执行,只要有对应的虚拟机,java程序就可以在该操作系统上运行,这就是java号称的一次编译,到处运行的由来。而附带而来的不可避免的性能问题也让Java难以成为桌面程序开发的主流。补充一下:对初学者学习而言最好的Java IDE我推荐使用JCreator,这是一个C++写成的IDE,几MB的大小,比Eclipse快十倍以上的启动速度,对初学者带来极大的便利。
J2EE:
Java实际上又被分为3类:J2EE/J2SE/J2ME,不同类分别对应不同的JDK,J2EE针对企业平台开发,J2SE是标准版,J2ME针对移动平台开发。J2EE现在实在是热得烫手,我前不久翻了一下程序员早期的杂志,发现在第一期创刊号里(2001.1)已经有了j2EE方面的讨论,现在已经是2004.6了,你对它的认知又多了多少?J2EE不是一种单纯的技术,而是一种体系架构以及组成该架构的诸多标准。企业平台开发和桌面/简单Web数据库开发有很大的不同,它的程序规模往往很大(不是一个或者几个EXE可以搞定的),用到的往往是海量的数据库和海量的通信,并且常常是不可中断的,这些特殊性都使得企业平台开发更多地去关注架构的问题。而我们写一个熟悉的java客户端程序,或者消息处理中间件,又或者数据库处理程序,都只是这样一个架构里的一小部分。J2EE是很宠大的,所以请不要写了几个EJB(这是java世界里的构件,概念上大概是类似于COM)的例子程序就感觉自己精通j2EE。
J2EE中传递消息时往往引入了一个被称作消息管理器的中间件,在服务器端使用EJB的容器来管理和调用EJB。在J2EE中一个重要的概念是Transaction(事务)处理,事务的概念最早广泛应用于数据库技术。这实际上是一个封装了很多操作的单元,它的作用是中间任何一个操作失败,可以自动依次整体撤销,所以一个transaction就是操作成功/失败的最小单元,不存在一个transaction只成功了部分操作的情况。
在企业服务平台开发中比较知名的有一个叫BEA公司(这是一家不错的公司,应该知道它的名字),它的产品是Weblogic。
.net
.net是微软为下一个十年准备的技术,你呢?.net也是一种平台技术,而不是单一技术。它主要分为.net运行时平台(对应java的虚拟机)和.net类库(对应java的jdk)。目前只有Windows2003是天然集成了.net运行时平台的操作系统,所以如是你写的.net程序想要在别的操作系统上运行,该操作系统必须先安装.net平台,这是一件蛮烦人的事,也是为什么到目前为止,还没有太多的人改用.net来写程序(尽管可较高提升开发效率)。希望Longhorn的出现可以扭转这一现状。那我们就终于可以和MFC这样过时的框架类库说再见了,一大快事。
.net采用了很多最新的技术和思想,对走VS路线的人来说(特别是有COM概念的),学起来相对轻松且很过瘾,前人推荐的“.net框架程序设计“和”.net本质论“都是很好的书。当然,看它们之前你最好基本掌握一门.net语言,譬如C#,掌握语言对我们来说是最easy的。
聊了这么多技术,下面让我们来放松一下:)
公共密钥: (也常被译为公开密钥)
"密码"已经是一个老少皆知的词,想从银行里把钱取出来吗?没密码可万万不行。不知从什么时候开始,这么一个军事级的词汇已经走进了千家万户,妇孺皆知。不过知道“密钥”这个词的人就少多了,知道“公共密钥”的人就更少了,不但知道而且了解其原理的人则少之又少,当然,如果你以前不清楚的话,那么你即将加入这少之又少的行列:)
long long ago,随着军事的日益发展,情报的重要性日益提高,如何获得准确的情报成为军事上的一大重点,伴随而来的另一个问题则是如何尽量保证自己的情报在被敌人截获后(这总是无可避免的)敌人依然无法获得该情报的信息,防止情报外泄。不妨让我们以今人的智慧来设身处地的想一想,有什么好的解决方法……首先想到的当然是用密文不要用明文,把明文按某种规则打乱为密文、或者让明文与密文有某种一一对应的规则 ,这样即使密文泄露,只要敌人不知道我的明文与密文之间转换的规则,它将一无所获。这是一种简单且行之有效的方法,即便到了近代一战二战中,还被广泛使用着,当然它的这个规则往往是动态的,甚至可能相当复杂。然而这样的方案在理论上有一个重大的缺陷,那就是你如何安全地传递“规则”?两地之间要确保能互相将密文变成明文,必须有共同的规则,那么就至少需要"一次"安全地将“规则”从一地传到另一地,这在理论上是无法保证的,所以整个的安全体系也就无法让人完全地放心,一旦规则泄露,对密文体系的打击则是致命的。有没有什么更好的办法呢?嗯,如果你以前没有接触过的话,我估计你是想不出了。解决的方法正是公共密钥体系。
让我们再回头来看一看我们是如何将明文变成密文的,最简单的是将它重新打乱,或者进行某种线性或非线性变换,立刻就让人难以阅读,但这也是最容易破译的,因为这种自身的变换在数学上相对容易求解,在现在的计算机的帮助下,通过一定量密文明文的统计分析,很容易找到其变化的规则。高级一点的,可以再用一组密码(可以是动态改变的,譬如随日期而改变),让明文与这组密码进行某种组合变化,从而得到一组密文,这样,由于这个“组合变化”可能是非常复杂的一种数学变换,仅通过密文或者加上一定量的明文也很难找出这组密码以及这个“组合变化”的规则。这就是目前绝大多数加/解密的根本原理。而这里的这组密码,我们就把它称作密钥。
但是这只是提高了获得密文者的对密文的破译难度,并没有解决我们前面提出的问题。现在就要来看看“共公(共开)”的含义了。在数学上有一种运算是单向的(在数学理论上截止目前为止),从一个方向算过去很简单,但是它的逆运算当缺少正向运算时加入的一些信息时,就会变得几乎不可能(譬如大素数的分解,分解是困难到几乎不可能的,分解后的两个数乘回去是简单的,小学生就会,这就是著名的RSA的原理)。这就构成了我们的“共公密钥”的理论基础。
具体使用如下:我们首先产生一对密钥,一把称为加密密钥,一把称为解密密钥,它们是相关但不相同的。加密时我们把明文与加密密钥一起采取“不可逆”数学运算进行“组合变化”,形成密文,解密时把密文与解密密钥一起采取类似的运算进行解密,注意,这处因为加密密钥与解密密钥产生时即是相关连的,所以解密密钥能够完成这样一个“逆运算”。同时,解密密钥也可以用来加密,相应的,加密密解也可以用来解“用解密密钥加密的密文”。具体使用的时候很简单,把加密密钥当作公共密钥,分发给任何想要获取的人,解密密钥由自己妥善保管作为私钥。当拥有加密密钥的人要传递密文给自己时,他只要使用自由获取的我的公共密钥来加密该明文即可,当然,他加密以后他自己也是不能解的,但是传到我手里以后,我则可以用解密密钥来解密,这样就很好地解决了前面提出的无法安全传输“规则”的问题,现在我的公共密钥是公开的,你要拿就拿去好了:) 而私钥我自己好好保存,不用把它放出来。
公共密钥另一个重要作用就是用来签名。我使用私钥对自己的文件加密后,你来使用我发放的公钥来解密,如果解密成功,则可证明这的确是我发出来的文件。
在现在网络信息安全常常使用的证书体系中,“证书”的背后其实也是这样的一种公共密钥体系。http://www.hack58.net/Article/60/63/2006/6848.htm
大凡像样的2维Windows游戏,几乎都是采用此技术来实现显示的。DirectDraw有两种模式:全屏和窗口。其中全屏应用更多一些。在全屏下,DirectDraw有一个十分著名的“换页”技术,即在两个显示页面之间用“交换”来实现显示刷新,这个速度十分地快,只是一个显存内一个指针的交换,比你用BitBlt复制一屏的像素快太多太多,游戏的高效的动画效果大多源于此技术。DirectDraw主要用于娱乐领域和一些实时显示要求较高的场合,如医疗图像。D3D是目前大多三维游戏的标准采用,我没钻研过,不敢多言。它的效果嘛,玩玩游戏就知道了:)
UML:Unified Modeling Language,多译为统一建模语言
这个语言是一种图形语言,主要是作为设计时建模的一种标准的图形模型,便于程序员与程序员、程序员与客户、设计员与代码员之间的沟通,同时它也帮助设计人员将头脑中的基于程序代码的对程序功能的理解形成文档,便于理清头绪,进行下一步编码的工作。换言之,设计过程的产品,可以表现为一些文本文档,或者一些框架代码,或者一些伪代码,但比较标准通用的,是表现为一堆UML图。UML包括动态图和静态图两大类,其中静态图中的类图最为常用。很多人初学时不知道该怎么做设计,写小软件时常常没有设计过程,其实很简单,把软件的类图画出来就好了。学做设计时未必要找一个像Together或者Rational Rose一样的巨无霸。用一些简单的可以做UML图的工具就好,专门用来画UML图的小工具很多,网上容易找。补充一点:画UML图不要面面俱到,不要什么都画,突出重点方便理解就好,甚至使用不规范的记号也不要紧(当UML的功能是草稿的时候)。
RTTI: Runtime Type Information 运行时类型信息
在程序中,当我们得到某一个对象的实例或者指针时,大多数时候并不能直接肯定它的类型(都是继承以及类型转换惹的祸),这个时候,依靠VC4.0或更高版本的编译器提供的RTTI支持,调用库函数typeid()即可在运行时获取这个对象的“类型信息”,在一些动态处理中“类型信息”很重要,获取了类型信息以后,你就可以有十分把握地调用该类型的相关操作,或者类型转换,或动态生成。因其重要性,在JAVA和.net库中借助单根继承和“虚拟机”对此有了更优雅的做法,每一个自object继承的类天然就有了表述自己类型信息的能力(继承的好处),并且容易扩展,现在你需要类型信息的时候,大可直接ask那个对象:tell me, what type are you?它就会告诉你答案。
debug & release 调试 & 发行
大家都知道,debug是调试版,release是发行版,区别在于debug版生成的程序中包含大量供调试用的场景代码(不是真正运行需要的),而release一般去掉了这些信息,并进行了某些代码优化,所以release版的程序会比debug版的程序小很多,运行速度也快一些。同时,debug版为了便于调试,往往会对调试使用的诊断代码加上DEBUG一类的宏,使得在release下不对这些代码进行编译。正由于两种版本编译使用的源代码的差异(以及release糟糕的优化),常常使得两种版本运行时产生截然不同的效果,一个正常一个崩溃是大多数人都遇到过的。导致问题的可能性很多,注意事项详见各论坛的诸多精华贴。另,同一个程序如果DLL之间的链接使用了不同版本(譬如EXE是release版,dll是debug版),有时会无法正常运行,所以我一般的做法是每一个DLL针对不同版本使用两个DEF文件,编译生成不同名的两个文件(debug版文件名后加d),调用时各个版本针对自己的版本调用,这在一定程度上可避免混乱。另,release也是可调试的,在工程设置里把调试信息打开即可。
XP:eXtreme Programming 极限编程
这是近几年才时兴起来的开发模型,国内大致是01/02年开始有所宣传。
它主要是针对中小型开发团队在开发时间要求紧、需求不稳定的中小项目(大多数软件项目都是这个情况)时使用。它打破了传统软件工程的框架,非常新巧。譬如整个开发过程中文档很少,大量使用“卡片 (如CRC卡片)”来描述开发计划和内容;没有真正意义上的软件功能规格说明书,取而代之的是一系列可测试的用例;没有独立的设计和测试阶段,它们总是在迭代中增量反复进行;设计:尽可能小和简单;一般没有代码复审(code review),大家共同拥有代码。而它的最显著的一个外在特征是它常使用“成对开发”,即一台机器前坐两个开发人员,共同开发(一个看,一个写),这乍听起来真是蛮有趣的:),它的基本出发点是认为成对开发的效率在一定条件下要高于两个人独立开发的和。不要觉得天方夜谭,在很多项目中,这种做法的有效性已经被证实。
XP的特点可以用“快、小、灵”来概括,它和传统瀑布模型(自顶向下)的区别在于它使用迭代增量(设计->代码->测试->设计->代码...)的方式。想法很简单:没有什么目标是可以一开始就容易确定的。用爬山来做一下比喻的话,传统的是在山下研究地图,选好一条路线,然后沿着此路前进,XP则是走一走,停一停,看一看,对下一步的方向作出新的选择,在很多时候,这样做会让你选择到更好的捷径。
ICONIX:
这个字相信很多人都没见过,我也不知道是什么字拼起来的,作为开拓眼界,我还是提一下吧。这是一种界于XP和RUP(Rational Unified Process)之间的开发模型,换言之,它比XP“大”,比“RUP”要小。它采用了UML的一个子集,特点是用例驱动,保持良好的进度跟踪能力。它的目标是用最短的时间来把用例变成代码。具体来说,这种开发模型相对精简的XP而言,更加强调用例的建立、分析和代码化,用例是其中心地位。
RUP:Rational Unified Process
前面已经提到了,相信你已经感觉出它是一个丰富的软件开发模型。这是由IBM提出来的软件工程模型,它使用完整的UML图,对开发的各阶段(需求、设计、代码、测试、维护)均有十分完善而复杂的标准,就不详述了。RUP本质上是迭代式开发,在每一次迭代中均完成以下四个阶段:初始阶段(inception)、详述阶段(elaboration)、构建阶段(construction)、转换阶段(transition)。
CMM:Capability Maturity Model 软件成熟度模型
这是卡内基*梅隆大学软件工程研究所(我的专业正是软件工程,所以这也成为我心目中的圣地)的一大力作,一度曾形成了席卷全球软件开发的CMM浪潮。CMM分为五级,大多数软件企业都处于第一级,而得到第五级认证的全球也没有多少,国内去除掉挂羊头卖狗肉的,也是寥若星辰(嗯,比星辰是寥多了)。所以CMM实施一般是从第二级开始,能做到第三级的都是颇有实力的软件公司了。CMM是以Process(过程)为中心的模型,从二级始每一级都有几个Key Process(关键过程),每一个KP又分为若干Key Active(关键活动)。CMM的实施一般不能越级实施,并且每一级的实施通常都要一年以上,所以要达到较高等级是一级很困难的事。另,CMM不仅可用于较大规模公司,同样也可实施于小公司,小项目组(这是很多人所不知道的)。实施视具体情况等级之间可交叉,譬如实施时采用二级的某些KP再加上三级甚至四级的KP,但你只有实施了所有二级的KP,你才能也只能通过二级认证,即便你采用了某些四级的KP。CMM最新发展成果是CMMI(Integration),这主要是新考虑了软件与非纯软件因素的关系(譬如系统),以及团队之间的协作问题。CMM在国内的发展似乎有点走向ISO同样的道路,这实在不是一个好消息。
Callback Function: 回调函数
在侯sir的<<深入浅出>>中一开始就提出了这个概念,大概的提法是说回调函数是操作系统调用而你永远不要去调用的函数。这个提法让初学者有点望而生畏,以为是一种多么高深而难以领会的系统底层的核心技术。其实不然,这个技术本质很简单,而且很常用。它实质就是函数指针的基本运用(如果不知道什么是函数指针的话,翻翻书)。在一个模块中,有时想让一部分功能由其它模块实现,譬如说一个做显示的模块,它只想实现显示的资源配备,画面的刷新,缩放等控制功能,而把画具体实体(譬如圆、多边形,都可以有很多种不同效率的实现方法)的代码由别的模块来实现,怎么办呢?用函数指针。在自己的类中放一个画圆的函数指针,使用时由外部为这个函数指针赋值(其实就是指向了一个外部的函数),在自己的代码中直接调用这个函数指针来画就可以了(本模块完全不知道外部模块是怎么画圆的)。那个外部的函数在这里就是回调函数!
在很多系统API中就使用了这种函数回调的方法,让我们开发的代码实现可以嵌入到API的代码实现当中,其实我们就是传了一个函数地址给它而已。换句话说,这些API搭好了某些运行的代码框架,我们来为它具体实现。
XML: Extensible Markup Language 可扩充标记语言
也许你还在为选择.net和j2ee而徘徊不前,如果是这样的话,不妨先着手学一下它们所共通的一个基础:XML。有了HTML为什么我们还要XML?很简单,HTML重在表现文本/图片以及一些多媒体内容,它很难表达数据,因为它的标记是固定的,而数据类型千千万,根本无法描述。.net和j2ee都要解决一个信息传输格式标准化的难题,这个格式要能承载文本/数据,最好还能描述程序接口,同时又应该像HTML一样简单,具有通用性,能够在HTTP下很好的运作。在这种要求下,XML产生了。它的特点正如其名,和HTTP一样,它也是一种标记语言,但是它的标记不是固定的,是可自定义(也就可无限扩展)的,这些自定义标记能够很好的描述数据类型以及对应的数据内容(乍看起来很像数据库表的定义)。除此以外,XML还可以描述程序接口,所以XML可以方便地与网络程序构件(COM、EJB等)直接交互。由于它也是一种ASCII文本流,所以与当前的HTTP兼容,在当前的internet上畅通无阻(这很重要)。有了以上功能,XML就名副其实地成为了新一代互联网技术的标准信息载体,在.net和j2ee的网络架构中,各种“构件”的信息交互都交给了XML,可谓任重而道远。
XML我自己没怎么写过,单就学习上的经验而言,感觉语法上比HTML更琐碎一些,小细节更多,没那么容易速成:) 好在根本同源,有HTML基础甚至WEB开发基础的,学起来也很轻松。
Java2:
这是近几年最吸引大众焦点的语言,在Web开发,网络平台,移动开发的世界里发光发热。你可以不用java,但你不可以不了解java,毕竟这是一个极大且丰富的软件开发领域。有些没使用过java的VS阵营里的人可能还不明白java2里的那个2是什么意思,容我先解释一下。Java最初正式推出1.0时,并没有受到如此多的好评,受到颇多责难,于是它不断地推出新版本来完善自己,其中变化显著的一个版本是1.2(我没记错吧),Java的每一个新版本除了语法上的更新,还有一明显的标志,那就是JDK(Java Development Kit,就是Java自带的一套SDK)的更新,版本1.2以后的java为了在宣传上与以前的java相区别,便被称为java2。目前用得比较多的jdk是1.3/1.4 ,最新的JDK是1.5(代号tiger)。java开发的IDE国内主要以JBuilder为主,另外就是在开源领域如雷贯耳的Eclipse,而sun也力推自己的开源java IDE:Netbeans(从sun的网站上可下载,免费)。Java运行是虚拟机机制,相当于在操作系统上增加了一个软操作系统,源码被编译成一种字节中间码,由虚拟机解释执行,只要有对应的虚拟机,java程序就可以在该操作系统上运行,这就是java号称的一次编译,到处运行的由来。而附带而来的不可避免的性能问题也让Java难以成为桌面程序开发的主流。补充一下:对初学者学习而言最好的Java IDE我推荐使用JCreator,这是一个C++写成的IDE,几MB的大小,比Eclipse快十倍以上的启动速度,对初学者带来极大的便利。
J2EE:
Java实际上又被分为3类:J2EE/J2SE/J2ME,不同类分别对应不同的JDK,J2EE针对企业平台开发,J2SE是标准版,J2ME针对移动平台开发。J2EE现在实在是热得烫手,我前不久翻了一下程序员早期的杂志,发现在第一期创刊号里(2001.1)已经有了j2EE方面的讨论,现在已经是2004.6了,你对它的认知又多了多少?J2EE不是一种单纯的技术,而是一种体系架构以及组成该架构的诸多标准。企业平台开发和桌面/简单Web数据库开发有很大的不同,它的程序规模往往很大(不是一个或者几个EXE可以搞定的),用到的往往是海量的数据库和海量的通信,并且常常是不可中断的,这些特殊性都使得企业平台开发更多地去关注架构的问题。而我们写一个熟悉的java客户端程序,或者消息处理中间件,又或者数据库处理程序,都只是这样一个架构里的一小部分。J2EE是很宠大的,所以请不要写了几个EJB(这是java世界里的构件,概念上大概是类似于COM)的例子程序就感觉自己精通j2EE。
J2EE中传递消息时往往引入了一个被称作消息管理器的中间件,在服务器端使用EJB的容器来管理和调用EJB。在J2EE中一个重要的概念是Transaction(事务)处理,事务的概念最早广泛应用于数据库技术。这实际上是一个封装了很多操作的单元,它的作用是中间任何一个操作失败,可以自动依次整体撤销,所以一个transaction就是操作成功/失败的最小单元,不存在一个transaction只成功了部分操作的情况。
在企业服务平台开发中比较知名的有一个叫BEA公司(这是一家不错的公司,应该知道它的名字),它的产品是Weblogic。
.net
.net是微软为下一个十年准备的技术,你呢?.net也是一种平台技术,而不是单一技术。它主要分为.net运行时平台(对应java的虚拟机)和.net类库(对应java的jdk)。目前只有Windows2003是天然集成了.net运行时平台的操作系统,所以如是你写的.net程序想要在别的操作系统上运行,该操作系统必须先安装.net平台,这是一件蛮烦人的事,也是为什么到目前为止,还没有太多的人改用.net来写程序(尽管可较高提升开发效率)。希望Longhorn的出现可以扭转这一现状。那我们就终于可以和MFC这样过时的框架类库说再见了,一大快事。
.net采用了很多最新的技术和思想,对走VS路线的人来说(特别是有COM概念的),学起来相对轻松且很过瘾,前人推荐的“.net框架程序设计“和”.net本质论“都是很好的书。当然,看它们之前你最好基本掌握一门.net语言,譬如C#,掌握语言对我们来说是最easy的。
聊了这么多技术,下面让我们来放松一下:)
公共密钥: (也常被译为公开密钥)
"密码"已经是一个老少皆知的词,想从银行里把钱取出来吗?没密码可万万不行。不知从什么时候开始,这么一个军事级的词汇已经走进了千家万户,妇孺皆知。不过知道“密钥”这个词的人就少多了,知道“公共密钥”的人就更少了,不但知道而且了解其原理的人则少之又少,当然,如果你以前不清楚的话,那么你即将加入这少之又少的行列:)
long long ago,随着军事的日益发展,情报的重要性日益提高,如何获得准确的情报成为军事上的一大重点,伴随而来的另一个问题则是如何尽量保证自己的情报在被敌人截获后(这总是无可避免的)敌人依然无法获得该情报的信息,防止情报外泄。不妨让我们以今人的智慧来设身处地的想一想,有什么好的解决方法……首先想到的当然是用密文不要用明文,把明文按某种规则打乱为密文、或者让明文与密文有某种一一对应的规则 ,这样即使密文泄露,只要敌人不知道我的明文与密文之间转换的规则,它将一无所获。这是一种简单且行之有效的方法,即便到了近代一战二战中,还被广泛使用着,当然它的这个规则往往是动态的,甚至可能相当复杂。然而这样的方案在理论上有一个重大的缺陷,那就是你如何安全地传递“规则”?两地之间要确保能互相将密文变成明文,必须有共同的规则,那么就至少需要"一次"安全地将“规则”从一地传到另一地,这在理论上是无法保证的,所以整个的安全体系也就无法让人完全地放心,一旦规则泄露,对密文体系的打击则是致命的。有没有什么更好的办法呢?嗯,如果你以前没有接触过的话,我估计你是想不出了。解决的方法正是公共密钥体系。
让我们再回头来看一看我们是如何将明文变成密文的,最简单的是将它重新打乱,或者进行某种线性或非线性变换,立刻就让人难以阅读,但这也是最容易破译的,因为这种自身的变换在数学上相对容易求解,在现在的计算机的帮助下,通过一定量密文明文的统计分析,很容易找到其变化的规则。高级一点的,可以再用一组密码(可以是动态改变的,譬如随日期而改变),让明文与这组密码进行某种组合变化,从而得到一组密文,这样,由于这个“组合变化”可能是非常复杂的一种数学变换,仅通过密文或者加上一定量的明文也很难找出这组密码以及这个“组合变化”的规则。这就是目前绝大多数加/解密的根本原理。而这里的这组密码,我们就把它称作密钥。
但是这只是提高了获得密文者的对密文的破译难度,并没有解决我们前面提出的问题。现在就要来看看“共公(共开)”的含义了。在数学上有一种运算是单向的(在数学理论上截止目前为止),从一个方向算过去很简单,但是它的逆运算当缺少正向运算时加入的一些信息时,就会变得几乎不可能(譬如大素数的分解,分解是困难到几乎不可能的,分解后的两个数乘回去是简单的,小学生就会,这就是著名的RSA的原理)。这就构成了我们的“共公密钥”的理论基础。
具体使用如下:我们首先产生一对密钥,一把称为加密密钥,一把称为解密密钥,它们是相关但不相同的。加密时我们把明文与加密密钥一起采取“不可逆”数学运算进行“组合变化”,形成密文,解密时把密文与解密密钥一起采取类似的运算进行解密,注意,这处因为加密密钥与解密密钥产生时即是相关连的,所以解密密钥能够完成这样一个“逆运算”。同时,解密密钥也可以用来加密,相应的,加密密解也可以用来解“用解密密钥加密的密文”。具体使用的时候很简单,把加密密钥当作公共密钥,分发给任何想要获取的人,解密密钥由自己妥善保管作为私钥。当拥有加密密钥的人要传递密文给自己时,他只要使用自由获取的我的公共密钥来加密该明文即可,当然,他加密以后他自己也是不能解的,但是传到我手里以后,我则可以用解密密钥来解密,这样就很好地解决了前面提出的无法安全传输“规则”的问题,现在我的公共密钥是公开的,你要拿就拿去好了:) 而私钥我自己好好保存,不用把它放出来。
公共密钥另一个重要作用就是用来签名。我使用私钥对自己的文件加密后,你来使用我发放的公钥来解密,如果解密成功,则可证明这的确是我发出来的文件。
在现在网络信息安全常常使用的证书体系中,“证书”的背后其实也是这样的一种公共密钥体系。http://www.hack58.net/Article/60/63/2006/6848.htm
0
相关文章