1.学习VC的一点体会
如果没学过编程,最好从C开始,然后学习VC++。当然一开始就学VC也行,不过VC太庞大了,难以把握。用VC时,别用它的类,就用标准C和Win32 API编写命令行的程序,这样VC只是一个方便的C编辑/编译/调试器,而不是功能极多、庞杂的重型软件,这就和使用Turbo C差不多,只是功能更强了,使用更方便了。同时这样编程还有一个好处,就是可以熟悉Windows系统的工作方式和组织方式。
在没有熟练C、C++及编程思想前,一定不要接触VC的图形界面编程和MFC类库,否则你就会对VC望而却步的。我在上学时学了一学期的VC,在那之前学了C、汇编和很多其他的编程课程。可是学完VC后,班上大多数人害怕VC,不敢用它,没人逼着说什么也不会去碰VC,就是因为一直在学界面编程和使用MFC类库,学得糊里糊涂,不熟悉类库的使用和MFC体系结构,对Windows各种消息不熟悉,编起程来举步维健,有时根本无从下手;而不用MFC类库又不会编程了,因为不会用Windows API,对Windows系统的工作原理不了解。
由于Windows NT的界面十分友好,管理员很容易就熟悉了NT的使用和日常管理,但是却不了解Windows NT的工作原理,也不注重Windows NT配置工作,因而降低了Windows NT的安全性,可以说这是Windows NT相对于Unix来说安全性差的一个重要原因。管理员只需按微软提供的NT C2 Config CheckList的配置列表,实现其中重要的几个配置就可以挡住大部分的普通入侵者,然而Admin为空密码和允许空连接的 NT 计算机就是如此之多,尤其在中国。说远了,对于编程人员其实也是一样,Windows系统的界面友好,使得很多人只是简单的使用它,而不去深究它内在的实现。对系统理解越少,编程的困难越多,实现所需的功能越难,因为编程基本上是在和系统提供给程序员的编程接口(API)打交道,你不知道系统提供给你什么支持,就难以编程。举个例子,大家知道Unix的用户帐号存在/etc/passwd文件里,如果要查找当前系统的一个用户名就只需打开/etc/passwd文件,然后一行一行的读文件,并分析一行里的内容,从而找到用户名部分和要查找的用户名相比较即可,这没有问题,我想大多数不了解unix编程的程序员都会这样想。然而unix提供的getpwnam函数恰好实现了这个功能,一个函数调用就解决了问题。可以看出,理解系统提供的API的重要性;实际上,程序员在学会了编程语言和基本编程技巧后,最主要的任务就是了解系统提供的函数支持,对系统API了解越多,编起程来就越得心应手。
学习Win32 API的理想方法就是使用一个适当的编译器,学习控制台编程(不是DOS编程,虽然它的界面是命令行界面)。我想VC是比较合适的,它功能强大、使用方便自不必说,而且可以很容易的支持SDK的程序,这也是大家选择VC的重要原因。对于Delphi和BCB我了解不多,印象里和VB有些像,不知编写控制台程序如何。Turbo C是不错的编译器,大多数人在Dos下用C编程都用它,不过可惜,它不支持Windows API。
对于网络编程,用Winsock和标准 C 基本可以了(要进行Windows NT/2000的Netbios编程使用Winsock是不行的),而且不难,但要是使用它的MFC类库,方便是方便了,可是复杂的关系太多了,容易乱。而且有些功能是MFC所没有提供的,MFC提供了最常用的类,而一些特殊的应用没有MFC类。
要是想用图形界面编程,使用MFC还是比较简单和理想的(和使用API相比),不过自然不然VB快。首先C++的基础要打好,然后可以找本好的VC书,编些例子,慢慢熟悉MFC,不过要掌握MFC类库谈何容易。
2.其实人都容易犯贪多的毛病,这就是求知欲,非常好,但要把握度
很多人学习电脑觉得自己懂的太少,于是什么都想学,什么作图、作动画、HTML、脚本、CGI、C、Authorware,仅仅Windows下流行的编程平台就有微软的Visual Stutio外加一系列开发工具包(SDK、DDK、DXSDK等)和Delphi、BCB。此外还有N多Unix和N多Linux呢。实际上你能学多少呢?一个VC就可以有很多分支(当然不是绝对的不可跨越),能够学好一个就不错了。其实人都容易犯贪多的毛病,这就是求知欲,非常好,但要把握度,否则就什么都蜻蜓点水,却没有专长。
下面我说说学习编程的一点体会。首先在有了一定的编程基础后,看别人的程序,尤其是好程序(看多了,自然会看到好的),是非常有益的,其帮助也会很大。不过在这同时你一定要动手去编,不然只能算是你看明白了或者‘懂’了,而不能说你会了、‘掌握’了,这之间有很大的差别。就拿下面这个程序来说,看了两遍,明白怎么回事了,建socket--监听--客户连接--建管道--建cmd进程,然后不断将客户的输入传给cmd,将cmd的输出发给客户;但是你‘掌握’了吗?让你写一个同样的你写不写的出呢?如果能,那你掌握了,否则没有。
记得我第一次在unix下编程,是研究DOS攻击,好像是smurf攻击,那之前我从未在unix下编过程,连unix也不熟悉,cc命令还是问别人的,tcp/ip协议也了解不深,只是学生时课本上的那点知识而已,网络编程从未用过,只知道使用socket,然后就看smurf的linux源码,然后转为sco unix代码执行,很快做完了,找个sniffer一看运行对了。但是,我会unix编程了吗?我会网络编程了吗?没有,我写不了,只能看、改。后来找本书看看,渐渐明白点了,可还编不了程序,每个函数用什么参数,类型是什么,全要对着别人的程序才行。后来编了个小程序,Socket编程的基本知识就差不多了,其实很小很小的一个程序,似乎胜过看好几个程序,应该说这是量变到质变吧。有时看来看去,流行的新书都看过了,也没什么新鲜的,好像自己都会了,翻回来让你写一个,似乎又无从写起,好像什么都不会似的,就是因为我们看到太多了,明白了不少,但却都没掌握,于是就没有什么进步,此时写几个程序,会有很大帮助的。唉,这可能是人的通病吧,总觉得自己很强,什么都可以,越多越好,其实呢?能够在一个领域做好就是专家了。我不知是否看到近来ipxodi一篇学习网络安全方法的文章,确实,人很容易犯这个毛病。
当然,我并不是否认看程序,其实‘看别人的’和‘自己写 ’几乎同等重要。有时我觉得总写一些程序,似乎没什么新东西(是不是有点像看多了时的感觉??怪了),原来很久没看新东西了,看一看,似乎会有点发现,新的或者原来问题的解决办法。其实学习就是这样:看看,记记,然后就掌握了。有时看别人一个程序,能解决自己长期的困惑。
>> 本文固定链接: http://www.vcgood.com/archives/993