以下仅谈谈个人对编程的些许看法与本人学习的经历,并适当提些学习建议,仅是个人观点,如有不对还望指教。如有想法,欢迎跟帖讨论。
开发工具&&语言篇
首先编程的确可以说是一门艺术,每一个作品都是一件艺术品。但是编程学习却是一个循序渐进的过程,刚开始写的时候只会照着书本上依葫芦画瓢地写一些零碎的代码,但是到了后面当你掌握好了一种编程语言后写的就不仅是代码而更多是你的思想。
再谈谈程序语言的选择。由于这篇文章是给我一大学同学写的,所以我就我周围同学的一些情况来讨论。我们正式通过上课学习的语言有C、C++、C#,其中C++与C#为选修课程,而现在同学们用得最多的语言,据我观察所知应该是C++和Matlab,而C++的开发环境肯定就是VC 6.0。虽然说语言都是相通的,但是也是有差别的,先说说C++。首先我不喜欢C++,C++的语法非常严格,区分大小写、必须先定义后使用、声明数组还必须指定数组的长度等等,还有就是令人抓狂的指针。我没有用过多少C++,也不知道C++其它方面的情况怎么样,就这些东西就让我很不爽了,相对于我学的另一门语言Pascal来说,C++使用起来实在是太不人性化了,太麻烦了。大家都在用的C++开发环境VC 6.0,那简直太不好用了。可能有的同学没有意识到这个问题,说用VC写一些算法程序很方便啊,也并不复杂啊,那是因为还停留在控制台程序的阶段,如果让你去用VC开发一个复杂点的Windows窗体应用程序,一定会让你抓狂的。
VC的MFC构架是极其复杂的,在这世界上也恐怕只有他的创始人能够完全把它搞懂。而对我们这些业余的编程人员用不着这么专业这么复杂的工具,对我们来说方便、好用、快捷才是最重要的,而VC其中一个优点都不占。说了这么多的VC的坏话,并不是说VC垃圾,只是说它并不适合我们,其实现在一些大公司里面的主流开发工具还是VC,而且听说微软内部只用VC 6.0,所以VC还是高级开发的最佳选择。如果你是用C++语言的话,那么我建议你使用.NET平台,也就是VS。VS的整体构架就比VC高明多了,不管是软件的界面设计还是代码的编写都要优于VC不少。界面设计方面,VS拖放式控件的设计方式,会使你很容易“画”出你想要的窗体界面。代码编写方面,VS非常智能的代码提示能大大减少你的代码输入量,而且会大大减小输错的概率。
由于我们很多算法程序中都要用到矩阵和运算,而C里面没有现成的矩阵算法代码,而Matlab的矩阵运算可是非常简单好用,所以很多同学就用Matlab写。Matlab仅仅是一种解释性语言,执行效率非常低,而且语言也不是面像对象的,所以并不是最佳的选择。而且Matlab写出来的语句,执行时只能信赖他的那个3G大的运行环境,也就是说只有装了Matlab才能运行,所以用起来非常不方便。以上就是我不喜欢也不推荐大家去用的Matlab的原因。
C#语言相对于C++来说就要简单得多了,没有了指针。C#与Delphi非常相似,其中有一个非常重要的原因,C#的首席构架师就是Delphi之父,Delphi的编译器就是他写的,后来微软把他挖过去进行C#的开发,所以才有了与Delphi非常相似的C#语言。就是因为C#与Delphi有些类似,我才比较喜欢C#,而且在VS里面开发C#也非常快速与简单,和Delphi差不多了。所以我推荐大家用C#,如果你现在对其它语言没有深入地学习和研究的话,不妨转向C#。C#是C++演化过来的,也就是只要会了C、C++,那么C#上起手来也会非常快,他们的语法都是差不多的。
再者,我觉得编程的过程就是让你去驾驭计算机的过程,让计算机按照你的思路你的方法去替你做事,也就是我们去玩计算机。如果你选择比较难的语言,那么你想顺利地去驾驭计算机可能就不会那么容易了,比如说你在VC里面写了一百多行的C++代码,结果一调试就出了几十个错误,那时候你就会觉得不是你在玩计算机,而是计算机在玩你,而且是把你玩得团团转。喜欢简单是人类的通性。而Delphi正是它的简单和人性化让我对它爱不释手,一个Delphi程序员做的事,可能需要十几个VC程序员才能做完,“真正的程序员用C++,聪明的程序号用Delphi”。
编程建议篇
首先当然是要多加练习,多写东西。并且在写程序的过程中做好学习笔记,遇到问题解决后如果有必要就记下来,以防后面遇到一样的问题。拿我来说,我在编程的过程中就会遇到各种各样的问题,经常写着写着就卡在某个地方了,这时通过网上搜索解决问题后,我就会把解决的办法记下来,一般是帖到博客上,特别是帖一些现成的代码,这样后面写程序遇到类似的问题就可以到博客上去找,找到后直接把代码复制进去小加修改就行了,这样就会提高效率。我博客里面“学习笔记”这一栏里面的文章就是我平时做的一些编程笔记。
多查MSDN,遇到问题,百度一下。我对微软非常满意的有两个地方,一个就是MSDN,另一个是VS的代码提示。微软的MSDN做得相当好,里面有各种问题的详细用法描述,而且有大量的示例代码,一般在编程过程中遇到的问题都可以在里面找到解决办法。所以我经常给同学说,在写代码的时候遇到问题,就按F1。比如说现在我想从文本文件中读数据,现在不知道应该怎么用C#写,那么就到百度去搜索“C# 文本文件”,然后就查到了要用到StreamReader这个类,但是这个类的一些用法我都还不知道,这时就可以去查MSDN了。在MSDN中输入StreamReader就出来StreamReader类,然后就可以查看这个类里面有什么东西,怎么用等。而且在搜索结果那一栏里还可以看到StreamReader类在哪个命名空间里,如图所示:
由图中可以看到StreamReader类是在System.IO这个命名空间里,于是我们引用这个命名空间,using System.IO;这样就可以使用StreamReader这个类了。然后我们在MSDN中的StreamReader成员里面找到了Readline()这么一个成员函数,我们点进去看看,我们就会看到Readline()函数的功能与用法,还有各种语言的用法示例代码,读过示例代码就可以非常清楚地了解这个函数的用法了。我们甚至可以把MSDN上的一些代码Copy过来修改一下就为自己用,于是我们就很轻松地写出了从文本文件中读取数据的代码:
StreamReader sr = new StreamReader(“data.txt”);
string text = sr.ReadLine().Trim();
这样就把data.txt中的第一行的值给了text变量,如果要一直向下继续读下面的数据可以用下面的一个while循环:
while ((text = sr.ReadLine()) != null) { if (text.Trim() != "") { rows++; } }
上面这个循环的作用就是获取文本文件中的非空行的数量,rows就等于非空行数量。看吧,我们刚才都还不知道应该如何下手去写,我们只是上了下百度,查了查MSDN就都知道了,代码也就写出来了。所以只要你多查多问,编程是没有问题的。大家可以类似地去查一下把数据写入到文本文件的类StreamWriter的用法。
不管用什么语言写什么程序,模块化思想非常重要。模块化会使你的程序思路清晰,便于维护和移植。所谓模块化,就是把一个功能分成几个相对独立的模块,每一个模块做一件事情,每一件事情就写一个函数,这样这一功能就可以通过调用这几个模块函数来实现。若是遇到什么问题,也可以一个函数一个模块地去检查,这样检查起来也是很容易的。我这里就用那个后方交会的程序来说明这个问题。当我们弄懂算法原理后,就会发现整个算法可以分为几个过程,所有过程都是用一个循环控制。计算旋转矩阵R、计算矩阵L、计算矩阵A、计算矩阵X,其中矩阵X内的值就是限差值,我们通过判断矩阵X里面各值的大小是否达到精度来决定是否再进行迭代运算。所以核心代码如下:
do { CalcR(); CalcL(); CalcA(); CalcX(); Xs = Xs + X.Matrix[0, 0]; Ys = Ys + X.Matrix[1, 0]; Zs = Zs + X.Matrix[2, 0]; //加上限差值为我们运算的新值 F3.ψ = F3.ψ + X.Matrix[3, 0]; F3.ω = F3.ω + X.Matrix[4, 0]; F3.κ = F3.κ + X.Matrix[5, 0]; times = times + 1; //迭代次数加1 } while ((Math.Abs(X.Matrix[0, 0]) > LowLimit) || (Math.Abs(X.Matrix[1, 0]) > LowLimit) 等等); //判断是否达到限差
其中变量LowLimit就是可以自己设置大小的精度。写好主要的代码后,我们就可以把我们划分的各个模块函数进行各个击破了。
下面分别给不同阶段的同学不同学习建议。如果你还是一个初学者,语言都还没有搞好,写一个程序完全没有一点头绪,或者是写一句错一句,那么我建议你把语言从头学起。程序语言是编程最基础的知识,如果没有把语言掌握好,写什么都是枉然。我建议你从图书馆搞一两本相应语言的入门书籍,然后从头到尾把书认认真真地搞一遍,但是要注意编程是要动手的,所以我觉得你把书上的示例代码完全自己再敲一遍是非常有必要的,而且这样做的效果非常明显,因为我刚开始也是这么做的。我学C++的时候,把C++教材上面的所有代码都在VC里面敲了一遍,当我敲完的时候就发现,C++语言我已经基本上掌握好了,而且写代码的速度与习惯也在不知不觉中提高了一个档次。所以我觉得刚开始学习的时候用一些笨办法,做一些笨事情是非常有效果的,就像段龙妹说学英语要去背点文章一样。但是这个学习过程对你有一些要求,那就是能够坐得住,能够静下心来静静地坐在电脑前一行一行地敲写代码,并且能够坚持下去,如果你能够这样地坚持下去,那么你一定能够成为高手,高手都是能耐得住寂寞的。
如果你已经掌握好了一门语言,并且写一些程序已经没有了太大的困难,但就是找不到再往前面学习的目标,不知道还要学些什么东西,那么你就有必要去了解更多。其实编程是永远都学不完的,有很多个方向和领域,如果你不主动地去了解,不主动地深入学习,那么你永远不会进步,永远不可能发现新大陆。我建议你去了解一些语言的高级特性,或者去学习新的语言也可以。比如说可以向网页编程方向去发展啊,可以学习数据库的编程啊,等等。这里我就拿C#语言作为例子,其实C#语言除了我们上课时老师所讲的东西之外还有很多新的特性是非常有必要去了解的,比如C#里面的范型,C#里面的正则表达式,TList类TArrayList类,等等。我们学的东西越多、越广,那么我们做起事来就会方便很多。同时我们通过更多的学习可以去领悟那些程序设计的思路,那些构架师设计的巧妙之处,特别是他们的那种思维,绝对是值得我们去学习。当然,这些东西也只有当你有了一定的编程功底之后才能明白和领悟得到的。
这里我就以我的学习经历给大家一些学习方向的建议,首先是数据库,现在无论做什么事情都少不了数据库。之后可以学习多线程编程,多线程在处理一些问题的时候会大大提高运算效率,所以如果你想要研制一个比较好的软件,那多线程的学习是必不可少的。如果你是C方向也就是航测的,那么图像处理就显得很重要了,这个不用我说你也会自主去学的,但是我这里要提的是三维与动态显示方面的技术。三维与动态显示这方面有OpenGL和DirectX这么两种实现方式,其实也并不是很难,难的工作已经由那些大公司替我们做了,封装在OpenGL或DirectX里。大家不要把三维想得那么神秘,我记得当时邓非演示那个三维显示拍摄像片的时候好多同学都发出了不可思议的嘘声,坐在我身边的外班的同学还在那放肆地讨论这个是怎么怎么高深……我用OpenGL写过三维,功能和邓老师那个差不多,只是要简陋得多,只用了一百来行代码,所以一点都不高深。最后我推荐大家去学习网页编程。网页涉及的内容比较杂,也比较烦,但是一旦都学会了,就会比Windows编程简单得多。学习网页编程首先要学习Html与CSS,学习用Div+Css构架与控制网页,然后要选择一种动态语言作为网页的交互语言,可以是PHP或ASP.NET(C#语言),我两种都会,但是我更喜欢ASP.NET。然后学习JavaScript与AJAX,XML或JSON等等,还有就是数据库查询语言是少不了的。看这学习过程就知道网页制作是一个多么繁琐的过程,知识很多很杂!而且同时你还得用好几个最基本的制作工具,Dreamweaver、VS2008,Fireworks等。差点忘了,算法也很重要。算法即是思想,有的同学就算是语言学好了还是不会写东西,那就是没有思想,不知道该如何下手。算法不用过深入地研究,只要了解和掌握最基本的那几种就好(附录有相关链接),主要是学习那种算法实现的思路,非常重要!
编程技巧篇
首先,代码书写规范与变量命名规范。编程过程中要注意非常多的细节,这是其中一个。代码尽量一行只写一句代码,不要为了省点空间而把十几句代码累在一行,这样做不仅看起来不直观,而且一旦程序出了什么问题,一经调试,正好错误就出在这一行,而这一行有若干条语句,那么你怎么知道是哪条语句出了问题呢?还有就是变量命名,不要随便乱命名,建议大家用英语意思来表达变量的含义,不要ABCD的乱搞一通。有一次我同学叫我帮忙调一程序,我一看,里面变量全部是a、b、b、d之类的,看不懂,搞得我相当无语。比如这个后方交会程序,我程序里面的函数名,比如CalcL计算L矩阵,CalcX计算X矩阵,变量PointNum表示控制点的个数,LowLimit表示精度,也就是X矩阵内值最后的最小值,这样写起来程序就好懂得多了。至于变量命名,建议大家都按Pascal语言命名规范来(可在百度搜索)。还有,大家在写一些比较长、结构比较复杂的公式的时候,可以先用括号把整体结构写出来,然后再在括号里面填东西,这样写下来就不会出错。
程序调试是一门学问,我也没有学多少,只会最基本的。在VS里断点快捷键是F9,单步是F11,逐过程是F12。VS的调试还是设计得非常方便的,在下好断点程序跑起来,暂停后,能够很方便地查看所有变量当前的值,只要用鼠标指向该变量即可。如图所示:
有的同学想让自己写的窗体程序拥有一个比较好看的界面,也就是皮肤。这个用VC实现比较麻烦,但是VS就方便得多,有很多第三方插件,非常好用,但再怎么也远远不及Delphi。大家可以到网上去找找,下载些示例程序,看看用法。一般是在窗体初始化的时候写几句代码就够了。如果我没猜错的话,学院软件大赛,我们年级七班那个女生用VS写的那个程序,应该就是用的SkinEngine这款第三方皮肤插件。
写得不好,欢迎前来拍砖。