天空之城
new,think,program,happy to live
posts - 39,comments - 39,trackbacks - 0

1 .建立并理解 Web Server

Web Server 是网络编程的基础。推荐使用 Apache ,它是免费的,并可运行在多种平台上。

推荐安装和调试时间: 2 天。

2 .理解 HTML/XHTML/JavaScript( 建议 JavaScript HTML 一起学习 )

       使用 JSP HTML 混合编程,精通 HTML 语法是非常重要的,因此花些时间来学习和写 HTML 语法是必要的

       JavaScript 作为目前最实用的客户端编程工具,对学习 JSP 有重要意义。 JavaScript 不能被认为成是 Java 的网络版,它在表单验证、框架处理等方面有独到之处。通过学习 JavaScript 可以简单了解 Java 面向对象的语法特点,因此 JavaScript 对开发一个优秀的 JSP 页面有着极为重要的帮助。

训练时间: 4 7 周。                        

推荐书籍                                

HTML XHTML 权威指南(中国电力出版社)

XHTML 初级编程(机械工业出版社)         

JavaScript 权威指南(中国电力出版社)        

JavaScript 开发使用手册(机械工业出版社)    

3 .开始学习 Java

       不必太多介绍,如果你学好这门语言,前途一定不差。

训练时间: 4 7 周。              

推荐书籍                      

think in java 2( 机械工业出版社 )    

JAVA 技术手册(中国电力出版社)

Java 夜未眠(电子工业出版社)    

4 .学习并理解 Web Server 的细节

       首先应理解 Web 的基本工作原理,了解并分清楚 Web 定义的两个方面: Web 的客户端和服务器端,并知道两者是如何通讯的。其次熟悉 Web Server 的特征。

训练时间: 2 天。

5 .建立 JSP Server

       推荐 Tomcat ,因为它完全免费,并可以很好的运行 JSP 程序。使用 Tomcat 遇到问题时,可以很容易的获得相关的帮助(在 Tomcat 的官方网站你可以获得许多技术支持,但前提你的英文还不错)。

安装时间: 1 2 天。

6 .开始学习 JSP

       经过以上步骤, JSP 的基础学习已基本完成。现在可以使用 JSP 写程序来实际练习。另一个学习 JSP 的方法是学习怎样创建一个分布式的应用程序。

       经过以上学习,我们已经可以完成一个 JSP Web 的应用程序了(如:“ Hello World ”)。

如果出错的话,先检查你的 JDK Tomcat 的环境变量配置是否正确,其次检查 Tomcat 是否已经启动。

训练时间: 4 6 周。                    

推荐书籍                             

JSP 设计(中国电力出版社)             

JSP 变成指南(第二版)(电子工业出版社)

7 .学习更多的 JSP Server

       很多 JSP Server 都有自己的一些优秀特征,可以更轻松的开发 JSP 。建议深入学习 JSP server ,可以优化 JSP 应用程序,并使之运行的更快而不出问题。

训练时间: 2 7 天。                   

推荐书籍                            

JSP 站点设计变成指南(电子工业出版社)

8 .学习 JDBC

       JSP 的大多数应用需要使用数据库。 JDBC 可以很好的用于 JSP 中的数据库连接。了解和熟悉 JSP 上被采用的 JDBC Driver 的细节是很重要的。一定要熟悉 JDBC 中所定义的主要接口和类。

       学习初期推荐使用 MySQL ,短小精悍,容易上手。这期间你也要学习 SQL 语句,等你真正熟悉了这方面的知识就可以考虑用一些企业级的大型数据库了。

训练时间: 2 3 周。                               

推荐书籍:                                        

JDBC JAVA 数据库编程(第二版)(中国电力出版社)

MySQL 网络数据库指南(不必精读)                 

 

       至此,你一成为一个熟练的 JSP 程序员了。 5 6 个月的时间可以训练一个人成为一个 JSP 程序员了,但要成为高手,你还有很长的路要走。可以考虑扩展的知识面: DHTML XML EJB 等等。

posted @ 2006-06-02 16:41 太极虎~宏 阅读(344) | 评论 (0)编辑 收藏
     摘要: WINDOWS XP 的关机中。 Windows XP 系统是通过一个名为 Shutdown.exe 的程序来完成关机操作的,关机的时候调用 shutdown.exe 。在 Windows XP ...  阅读全文
posted @ 2006-06-01 23:14 太极虎~宏 阅读(1105) | 评论 (2)编辑 收藏

计算机科学与技术学习心得

计算机科学与技术反思录
计算机科学与技术这一门科学深深的吸引着我们这些同学们,上计算机系已经有近
三年了,自己也做了一些思考,我一直认为计算机科学与技术这门专业,在本科阶段是不
可能切分成计算机科学和计算机技术的,因为计算机科学需要相当多的实践,而实践需
要技术;每一个人(包括非计算机专业),掌握简单的计算机技术都很容易(包括程序设
计),但计算机专业的优势就在于,我们掌握许多其他专业并不“深究”的东西,例
如,算法,体系结构,等等。非计算机专业的人可以很容易地做一个芯片,写一段程
序,但他们做不出计算机专业能够做出来的大型系统。今天我想专门谈一谈计算机科
学,并将重点放在计算理论上。

计算机理论的一个核心问题——从数学谈起:
记得当年大一入学,每周六课时高等数学,天天作业不断(那时是六日工作制)。颇
有些同学惊呼走错了门:咱们这到底念的是什么系?不错,你没走错门,这就是计算机科
学与技术系。我国计算机科学系里的传统是培养做学术研究,尤其是理论研究的人(方
向不见得有问题,但是做得不是那么尽如人意)。而计算机的理论研究,说到底了,如
网络安全,图形图像学,视频音频处理,哪个方向都与数学有着很大的关系,虽然也许
是正统数学家眼里非主流的数学。这里我还想阐明我的一个观点:我们都知道,数学是
从实际生活当中抽象出来的理论,人们之所以要将实际抽象成理论,目的就在于想用抽
象出来的理论去更好的指导实践,有些数学研究工作者喜欢用一些现存的理论知识去推
导若干条推论,殊不知其一:问题考虑不全很可能是个错误的推论,其二:他的推论在
现实生活中找不到原型,不能指导实践。严格的说,我并不是一个理想主义者,政治课
上学的理论联系实际一直是指导我学习科学文化知识的航标(至少我认为搞计算机科学
与技术的应当本着这个方向)。

其实我们计算机系学数学光学高等数学是不够的(典型的工科院校一般都开的
是高等数学),我们应该像数学系一样学一下数学分析(清华计算机系开的好像就是数
学分析),数学分析这门科学,咱们学计算机的人对它有很复杂的感情。在于它是偏向
于证明型的数学课程,这对我们培养良好的分析能力极有帮助。我的软件工程学导师北
工大数理学院的王仪华先生就曾经教导过我们,数学系的学生到软件企业中大多作软件
设计与分析工作,而计算机系的学生做程序员的居多,原因就在于数学系的学生分析推
理能力,从所受训练的角度上要远远在我们之上。当年出现的怪现象是:计算机系学生
的高中数学基础在全校数一数二(希望没有冒犯其它系的同学),教学课时数也仅次于数
学系,但学完之后的效果却不尽如人意。难道都是学生不努力吗,我看未见得,方向错
了也说不一定,其中原因何在,发人深思。

我个人的浅见是:计算机系的学生,对数学的要求固然跟数学系不同,跟物理类差别则
更大。通常非数学专业的所谓“高等数学”,无非是把数学分析中较困难的理论部分删
去,强调套用公式计算而已。而对计算机系来说,数学分析里用处最大的恰恰是被删去
的理论部分。说得难听一点,对计算机系学生而言,追求算来算去的所谓“工程数学”
已经彻底地走进了误区。记上一堆曲面积分的公式,难道就能算懂了数学?那倒不如现
用现查,何必费事记呢?再不然直接用Mathematics或是Matalab好了。
我在系里最爱做的事情就是给学弟学妹们推荐参考书。中文的数学分析书,一般都
认为以北大张筑生老师的“数学分析新讲”为最好。万一你的数学实在太好,那就去看
菲赫金哥尔茨的“微积分学教程”好了--但我认为没什么必要,毕竟你不想转到数学系
去。吉米多维奇的“数学分析习题集”也基本上是计算型的东东。书的名气很大,倒不
见得适合我们,还是那句话,重要的是数学思想的建立,生活在信息社会里我们求的是
高效,计算这玩意还是留给计算机吧。不过现在多用的似乎是复旦大学的《数学分析》
也是很好的教材。

中国的所谓高等代数,就等于线性代数加上一点多项式理论。我以为这有好的一面,因
为可以让学生较早感觉到代数是一种结构,而非一堆矩阵翻来覆去。这里不得不提南京
大学林成森,盛松柏两位老师编的“高等代数”,感觉相当舒服。此书相当全面地包含
了关于多项式和线性代数的基本初等结果,同时还提供了一些有用的又比较深刻的内
容,如Sturm序列,Shermon-Morrison公式,广义逆矩阵等等。可以说,作为本科生如能
吃透此书,就可以算高手。国内较好的高等代数教材还有清华计算机系用的那本,清华
出版社出版,书店里多多,一看就知道。从抽象代数的观点来看,高等代数里的结果不
过是代数系统性质的一些例子而已。莫宗坚先生的《代数学》里,对此进行了深刻的讨
论。然而莫先生的书实在深得很,作为本科生恐怕难以接受,不妨等到自己以后成熟了
一些再读。

正如上面所论述的,计算机系的学生学习高等数学:知其然更要知其所以然。你学习的
目的应该是:将抽象的理论再应用于实践,不但要掌握题目的解题方法,更要掌握解题
思想,对于定理的学习:不是简单的应用,而是掌握证明过程即掌握定理的由来,训练
自己的推理能力。只有这样才达到了学习这门科学的目的,同时也缩小了我们与数学系
的同学之间思维上的差距。

概率论与数理统计这门课很重要,可惜大多数院校讲授这门课都会少些东西。少了的东
西现在看至少有随机过程。到毕业还没有听说过Markov过程,此乃计算机系学生的耻
辱。没有随机过程,你怎么分析网络和分布式系统?怎么设计随机化算法和协议?据说
清华计算机系开有“随机数学”,早就是必修课。另外,离散概率论对计算机系学生来
说有特殊的重要性。而我们国家工程数学讲的都是连续概率。现在,美国已经有些学校
开设了单纯的“离散概率论”课程,干脆把连续概率删去,把离散概率讲深些。我们不
一定要这么做,但应该更加强调离散概率是没有疑问的。这个工作我看还是尽早的做为
好。

计算方法学(有些学校也称为数学分析学)是最后一门由数理学院给我们开的课。一般
学生对这门课的重视程度有限,以为没什么用。不就是照套公式嘛!其实,做图形图像
可离不开它,密码学搞深了也离不开它。而且,在很多科学工程中的应用计算,都以数
值的为主。这门课有两个极端的讲法:一个是古典的“数值分析”,完全讲数学原理和
算法;另一个是现在日趋流行的“科学与工程计算”,干脆教学生用软件包编程。我个
人认为,计算机系的学生一定要认识清楚我们计算机系的学生为什么要学这门课,我是
很偏向于学好理论后用计算机实现的,最好使用C语言或C++编程实现。向这个方向努力
的书籍还是挺多的,这里推荐大家高等教育出版社(CHEP)和施普林格出版社
(Springer)联合出版的《计算方法(Computational Methods)》,华中理工大学数学系
写的(现华中科技大学),这方面华科大做的工作在国内应算是比较多的,而个人认为
以这本最好,至少程序设计方面涉及了:任意数学函数的求值,方程求根,线性方程组
求解,插值方法,数值积分,场微分方程数值求解。李庆扬的那本则理论性过强,与实
际应用结合得不太紧。

每个学校本系里都会开一门离散数学,涉及集合论,图论,和抽象代数,数理逻辑。不
过,这么多内容挤在离散数学一门课里,是否时间太紧了点?另外,计算机系学生不懂
组合和数论,也是巨大的缺陷。要做理论,不懂组合或者数论吃亏可就太大了。从理想
的状态来看,最好分开六门课:集合,逻辑,图论,组合,代数,数论。这个当然不现
实,因为没那么多课时。也许将来可以开三门课:集合与逻辑,图论与组合,代数与数
论。(这方面我们学校已经着手开始做了)不管课怎么开,学生总一样要学。下面分别
谈谈上面的三组内容。
古典集合论,北师大出过一本《基础集合论》不错。 数理逻辑,中科院软件所陆钟万教
授的《面向计算机科学的数理逻辑》就不错。现在可以找到陆钟万教授的讲课录像,
http://www.cas.ac.cn/html/Dir/2001/11/06/3391.htm自己去看看吧。总的来说,学集
合/逻辑起手不难,普通高中生都能看懂。但越往后越感觉深不可测。

学完以上各书之后,如果你还有精力兴趣进一步深究,那么可以试一下GTM系列中的
《Introduction to Axiomatic Set Theory》和《A Course of Mathematical
Logic》。这两本都有世界图书出版社的引进版。你如果能搞定这两本,可以说在逻辑方
面真正入了门,也就不用再浪费时间听我瞎侃了。

据说全中国最多只有三十个人懂图论。此言不虚。图论这东东,技巧性太强,几乎每个
问题都有一个独特的方法,让人头痛。不过这也正是它魅力所在:只要你有创造性,它
就能给你成就感。我的导师说,图论里面随便揪一块东西就可以写篇论文。大家可以体
会里面内容之深广了吧!国内的图论书中,王树禾老师的“图论及其算法”非常成功。
一方面,其内容在国内教材里算非常全面的。另一方面,其对算法的强调非常适合计算
机系(本来就是科大计算机系教材)。有了这本书为主,再参考几本翻译的,如Bondy &
Murty的《图论及其应用》,人民邮电出版社翻译的《图论和电路网络》等等,就马马虎
虎,对本科生足够了。再进一步,世界图书引进有GTM系列的"Modern Graph Theory"。
此书确实经典!国内好象还有一家出版了个翻译版。不过,学到这个层次,还是读原版
好。搞定这本书,也标志着图论入了门。

离散数学方面我们北京工业大学实验学院有个世界级的专家,叫邵学才,复旦大学概率
论毕业的,教过高等数学,线性代数,概率论,最后转向离散数学,出版著作无数,论
文集新加坡有一本,堪称经典,大家想学离散数学的真谛不妨找来看看。这老师的课我
专门去听过,极为经典。不过你要从他的不经意的话中去挖掘精髓。在同他的交谈当中
我又深刻地发现一个问题,虽说邵先生写书无数,但依他自己的说法每本都差不多,我
实在觉得诧异,他说主要是有大纲的限制,不便多写。这就难怪了,很少听说国外写书
还要依据个什么大纲(就算有,内容也宽泛的多),不敢越雷池半步,这样不是看谁的
都一样了。外版的书好就好在这里,最新的科技成果里面都有论述,别的先不说,至少
是“紧跟时代的理论知识”。

组合感觉没有太适合的国产书。还是读Graham和Knuth等人合著的经典“具体数学”吧,
西安电子科技大学出版社有翻译版。 抽象代数,国内经典为莫宗坚先生的“代数学”。
此书是北大数学系教材,深得好评。然而对本科生来说,此书未免太深。可以先学习一
些其它的教材,然后再回头来看“代数学”。国际上的经典可就多了,GTM系列里就有一
大堆。推荐一本谈不上经典,但却最简
单的,最容易学的:http://www.math.miami.edu/~ec/book/这本“Introduction to
Linear and Abstract Algebra"非常通俗易懂,而且把抽象代数和线性代数结合起来,
对初学者来说非常理想,我校比较牛的同学都有收藏。

数论方面,国内有经典而且以困难著称的”初等数论“(潘氏兄弟著,北大版)。再追溯
一点,还有更加经典(可以算世界级)并且更加困难的”数论导引“(华罗庚先生的名著,
科学版,九章书店重印,繁体的看起来可能比较困难)。把基础的几章搞定一个大概,对
本科生来讲足够了。但这只是初等数论。本科毕业后要学计算数论,你必须看英文的
书,如Bach的"Introduction to Algorithmic Number Theory"。
计算机科学理论的根本,在于算法。现在很多系里给本科生开设算法设计与分析,确实
非常正确。环顾西方世界,大约没有一个三流以上计算机系不把算法作为必修的。算法
教材目前公认以Corman等著的"Introduction to Algorithms"为最优。对入门而言,这
一本已经足够,不需要再参考其它书。

再说说形式语言与自动机。我看过北邮的教材,应该说写的还清楚。但是,有一点要强
调:形式语言和自动机的作用主要在作为计算模型,而不是用来做编译。事实上,编译
前端已经是死领域,没有任何open problems,北科大的班晓娟博士也曾经说过,编译的
技术已相当成熟。如果为了这个,我们完全没必要去学形式语言--用用yacc什么的就完
了。北邮的那本在国内还算比较好,但是在深度上,在跟可计算性的联系上都有较大的
局限,现代感也不足。所以建议有兴趣的同学去读英文书,不过国内似乎没引进这方面
的教材。可以去互动出版网上看一看。入门以后,把形式语言与自动机中定义的模型,
和数理逻辑中用递归函数定义的模型比较一番,可以说非常有趣。现在才知道,什么叫
“宫室之美,百官之富”!

计算机科学和数学的关系有点奇怪。二三十年以前,计算机科学基本上还是数学的一个
分支。而现在,计算机科学拥有广泛的研究领域和众多的研究人员,在很多方面反过来
推动数学发展,从某种意义上可以说是孩子长得比妈妈还高了。但不管怎么样,这个孩
子身上始终流着母亲的血液。这血液是the mathematical underpinning of computer
science(计算机科学的数学基础),也就是理论计算机科学。原来在东方大学城图书馆中
曾经看过一本七十年代的译本(书皮都没了,可我就爱关注这种书),大概就叫《计算
机数学》。那本书若是放在当时来讲决是一本好书,但现在看来,涵盖的范围还算广,
深度则差了许多,不过推荐大一的学生倒可以看一看,至少可以使你的计算数学入入
门。

最常和理论计算机科学放在一起的一个词是什么?答:离散数学。这两者的关系是如此
密切,以至于它们在不少场合下成为同义词。(这一点在前面的那本书中也有体现)传
统上,数学是以分析为中心的。数学系的同学要学习三四个学期的数学分析,然后是复
变函数,实变函数,泛函数等等。实变和泛函被很多人认为是现代数学的入门。在物
理,化学,工程上应用的,也以分析为主。

随着计算机科学的出现,一些以前不太受到重视的数学分支突然重要起来。人们发现,
这些分支处理的数学对象与传统的分析有明显的区别:分析研究的问题解决方案是连续
的,因而微分,积分成为基本的运算;而这些分支研究的对象是离散的,因而很少有机
会进行此类的计算。人们从而称这些分支为“离散数学”。“离散数学”的名字越来越
响亮,最后导致以分析为中心的传统数学分支被相对称为“连续数学”。

离散数学经过几十年发展,基本上稳定下来。一般认为,离散数学包含以下学科:
1) 集合论,数理逻辑与元数学。这是整个数学的基础,也是计算机科学的基础。
2) 图论,算法图论;组合数学,组合算法。计算机科学,尤其是理论计算机科学的核心

算法,而大量的算法建立在图和组合的基础上。
3) 抽象代数。代数是无所不在的,本来在数学中就非常重要。在计算机科学中,人们惊
讶地发现代数竟然有如此之多的应用。

但是,理论计算机科学仅仅就是在数学的上面加上“离散”的帽子这么简单吗?一直到
大约十几年前,终于有一位大师告诉我们:不是。D.E.Knuth(他有多伟大,我想不用我
废话了)在Stanford开设了一门全新的课程Concrete Mathematics。 Concrete这个词在
这里有两层含义:
首先:对abstract而言。Knuth认为,传统数学研究的对象过于抽象,导致对具体的问题
关心不够。他抱怨说,在研究中他需要的数学往往并不存在,所以他只能自己去创造一
些数学。为了直接面向应用的需要,他要提倡“具体”的数学。在这里我做一点简单的
解释。例如在集合论中,数学家关心的都是最根本的问题--公理系统的各种性质之类。
而一些具体集合的性质,各种常见集合,关系,映射都是什么样的,数学家觉得并不重
要。然而,在计算机科学中应用的,恰恰就是这些具体的东西。Knuth能够首先看到这一
点,不愧为当世计算机第一人。其次,Concrete是Continuous(连续)加上discrete(离
散)。不管连续数学还是离散数学,都是有用的数学!

理论与实际的结合——计算机科学研究的范畴
前面主要是从数学角度来看的。从计算机角度来看,理论计算机科学目前主要的研
究领域包括:可计算性理论,算法设计与复杂性分析,密码学与信息安全,分布式计算
理论,并行计算理论,网络理论,生物信息计算,计算几何学,程序语言理论等等。这
些领域互相交叉,而且新的课题在不断提出,所以很难理出一个头绪来。想搞搞这方面
的工作,推荐看中国计算机学会的一系列书籍,至少代表了我国的权威。下面随便举一
些例子。
由于应用需求的推动,密码学现在成为研究的热点。密码学建立在数论(尤其是计算
数论),代数,信息论,概率论和随机过程的基础上,有时也用到图论和组合学等。很多
人以为密码学就是加密解密,而加密就是用一个函数把数据打乱。这样的理解太浅显
了。
现代密码学至少包含以下层次的内容:
第一,密码学的基础。例如,分解一个大数真的很困难吗?能否有一般的工具证明协议
正确?
第二,密码学的基本课题。例如,比以前更好的单向函数,签名协议等。
第三,密码学的高级问题。例如,零知识证明的长度,秘密分享的方法。
第四,密码学的新应用。例如,数字现金,叛徒追踪等。
在分布式系统中,也有很多重要的理论问题。例如,进程之间的同步,互斥协议。一个
经典的结果是:在通信信道不可靠时,没有确定型算法能实现进程间协同。所以,改进
TCP三次握手几乎没有意义。例如时序问题。常用的一种序是因果序,但因果序直到不久
前才有一个理论上的结果....例如,死锁没有实用的方法能完美地对付。例如,......操
作系统研究过就自己去举吧!
如果计算机只有理论,那么它不过是数学的一个分支,而不成为一门独立的科学。
事实上,在理论之外,计算机科学还有更广阔的天空。

我一直认为,4年根本不够学习计算机的基础知识,因为面太宽了......
这方面我想先说说我们系在各校普遍开设的《计算机基础》。在高等学校开设《计
算机基础课程》是我国高教司明文规定的各专业必修课程要求。主要内容是使学生初步
掌握计算机的发展历史,学会简单的使用操作系统,文字处理,表格处理功能和初步的
网络应用功能。但是在计算机科学系教授此门课程的目标决不能与此一致。在计算机系
课程中目标应是:让学生较为全面的了解计算机学科的发展,清晰的把握计算机学科研
究的方向,发展的前沿即每一个课程在整个学科体系中所处的地位。搞清各学科的学习
目的,学习内容,应用领域。使学生在学科学习初期就对整个学科有一个整体的认识,
以做到在今后的学习中清楚要学什么,怎么学。计算机基本应用技能的位置应当放在第
二位或更靠后,因为这一点对于本系的学生应当有这个摸索能力。这一点很重要。推荐
给大家一本书:机械工业出版社的《计算机文化》(New Perspective of Computer
Science),看了这本书我才深刻的体会到自己还是个计算机科学初学者,才比较透彻的
了解了什么是计算机科学。另外在厦门大学赵致琢老师的著作《计算科学导论》当中的
很多经典理论都是在同类书籍中很难找到的。看看他也许你才会明白一个最基本的问
题:为什么计算机科学叫计算科学更为准确。这本书在世界上也可成为精品级的著作。

一个一流计算机系的优秀学生决不该仅仅是一个编程高手,但他一定首先是一个编程高
手。我上大学的时候,第一门专业课是C语言程序设计,念计算机的人从某种角度讲相当
一部分人是靠写程序吃饭的。在我们北京工业大学实验学院计算机系里一直有这样的争
论(时至今日CSDN上也有),关于第一程序设计语言该用哪一种。我个人认为,用哪种
语言属于末节,关键在养成良好的编程习惯。当年老师对我们说,打好基础后学一门新
语言只要一个星期。现在我觉得根本不用一个星期,前提是先把基础打好。不要再犹豫
了,学了再说,等你抉择好了,别人已经会了几门语言了。

汇编语言和微机原理是两门特烦人的课。你的数学/理论基础再好,也占不到什么便宜。
这两门课之间的次序也好比先有鸡还是先有蛋,无论你先学哪门,都会牵扯另一门课里
的东西。所以,只能静下来慢慢琢磨。这就是典型的工程课,不需要太多的聪明和顿
悟,却需要水滴石穿的渐悟。有关这两门课的书,计算机书店里不难找到。弄几本最新
的,对照着看吧。组成原理推荐《计算机组成与结构》清华大学王爱英教授写的。汇编
语言大家拿8086/8088入个门,之后一定要学80x86汇编语言。实用价值大,不落后,结
构又好,写写高效病毒,高级语言里嵌一点汇编,进行底层开发,总也离不开他,推荐
清华大学沈美明的《IBM—PC汇编语言程序设计》。有些人说不想了解计算机体系结构,
也不想制造计算机,所以诸如计算机原理,汇编语言,接口之类的课觉得没必要学,这
样合理吗?显然不合理,这些东西迟早得掌握,肯定得接触,而且,这是计算机专业与
其他专业学生相比的少有的几项优势。做项目的时候,了解这些是非常重要的,不可能
说,仅仅为了技术而技术,只懂技术的人最多做一个编码工人,而永远不可能全面地了
解整个系统的设计,而编码工人是越老越不值钱。关于组成原理还有个讲授的问题,在
我学这门课程时老师讲授时把CPU工作原理誉微程序设计这一块略掉了,理由是我们国家
搞CPU技术不如别的国家,搞了这么长时间好不容易出了个龙芯比Intel的还差个十万八
千里,所以建议我们不要学了。我看这在各校也未见得不是个问题吧!若真是如他所
说,那中国的计算机科学哪个方向都可以停了,软硬件,应用,有几项搞得过美国,搞
不过别人就不搞了,那我们坐在这里干什么?教学的观念需要转变的。

模拟电路这东东,如今不仅计算机系学生搞不定,电子系学生也多半害怕。如果你真想
软硬件通吃,那么建议你先看看邱关源的“电路原理”,也许此后再看模拟电路底气会
足些。教材:康华光的“电子技术基础”(高等教育出版社)还是不错的(我校电子系
在用)。有兴趣也可以参考童诗白的书。

数字电路比模拟电路要好懂得多。推荐大家看一看我们北工大刘英娴教授写的《数字逻
辑》业绩人士都说这本书很有参考价值(机械工业出版社的)。原因很明了,实用价值
高,能听听她讲授的课程更是有一种“享受科学”的感觉。清华大学阎石的书也算一本
好教材,遗憾的一点是集成电路讲少了些。真有兴趣,看一看大规模数字系统设计吧
(北航那本用的还比较多)。

计算机系统结构该怎么教,国际上还在争论。国内能找到的较好教材为Stallings
的"Computer Organization and Architectureesigning for Performance"(清华影印
本)。国际上最流行的则是“Computer architecture: aquantitative approach", by
Patterson & Hennessy。
操作系统可以随便选用《操作系统的内核设计与实现》和《现代操作系统》两书之
一。这两部都可以算经典,唯一缺点就是理论上不够严格。不过这领域属于Hardcore
System,所以在理论上马虎一点也情有可原。想看理论方面的就推荐清华大学出版社《操
作系统》吧,高教司司长张尧学写的,我们教材用的是那本。 另外推荐一本《Windows
操作系统原理》机械工业出版社的,这本书是我国操作系统专家在微软零距离考察半
年,写作历时一年多写成的,教操作系统的专家除了清华大学的张尧学(现高教司司
长)几乎所有人都参加了。Bill Gates亲自写序。里面不但结合windows2000,xp详述操
作系统的内核,而且后面讲了一些windows编程基础,有外版书的味道,而且上面一些内
容可以说在国内外只有那本书才有对windows内核细致入微的介绍,
如果先把形式语言学好了,则编译原理中的前端我看只要学四个算法:最容易实现
的递归下降;最好的自顶向下算法LL(k);最好的自底向上算法LR(k);LR(1)的简化SLR
(也许还有另一简化LALR)。后端完全属于工程性质,自然又是another story。
推荐教材:Kenneth C.Louden写的“Compiler Construction Principles and
Practice”即是《编译原理及实践》(机械工业出版社的译本)
学数据库要提醒大家的是,会用VFP,VB, Power builder不等于懂数据库。(这世界
上自以为懂数据库的人太多了!)数据库设计既是科学又是艺术,数据库实现则是典型的
工程。所以从某种意义上讲,数据库是最典型的一门计算机课程——理工结合,互相渗
透。另外推荐大家学完软件工程学后再翻过来看看数据库技术,又会是一番新感觉。推
荐教材:Abraham Silberschatz等著的 "Database System Concepts".作为知识的完整
性,还推荐大家看一看机械工业出版社的《数据仓库》译本。

计算机网络的标准教材还是来自Tanenbaum的《Computer Networks》(清华大学有译
本)。还有就是推荐谢希仁的《计算机网络教程》(人民邮电出版社)问题讲得比较清
楚,参考文献也比较权威。不过,网络也属于Hardcore System,所以光看书是不够的。
建议多读RFC,http://www.ietf.org/rfc.htm里可以按编号下载RFC文档。从IP的读起。
等到能掌握10种左右常用协议,就没有几个人敢小看你了。再做的工作我看放在网络设
计上就比较好了。

数据结构的重要性就不言而喻了,学完数据结构你会对你的编程思想进行一番革命性的
洗礼,会对如何建立一个合理高效的算法有一个清楚的认识。对于算法的建立我想大家
应当注意以下几点:
当遇到一个算法问题时,首先要知道自己以前有没有处理过这种问题.如果见过,那么你一
般会顺利地做出来;如果没见过,那么考虑以下问题:
1. 问题是否是建立在某种已知的熟悉的数据结构(例如,二叉树)上?如果不是,则要自己
设计数据结构。
2. 问题所要求编写的算法属于以下哪种类型?(建立数据结构,修改数据结构,遍历,查找,
排序...)
3. 分析问题所要求编写的算法的数学性质.是否具备递归特征?(对于递归程序设计,只要
设计出合理的参数表以及递归结束的条件,则基本上大功告成.)
4. 继续分析问题的数学本质.根据你以前的编程经验,设想一种可能是可行的解决办法,
并证明这种解决办法的正确性.如果题目对算法有时空方面的要求,证明你的设想满足其
要求.一般的,时间效率和空间效率难以兼得.有时必须通过建立辅助存储的方法来节省时
间.
5. 通过一段时间的分析,你对解决这个问题已经有了自己的一些思路.或者说,你已经可
以用自然语言把你的算法简单描述出来.继续验证其正确性,努力发现其中的错误并找出
解决办法.在必要的时候(发现了无法解决的矛盾),推翻自己的思路,从头开始构思.
6. 确认你的思路可行以后,开始编写程序.在编写代码的过程中,尽可能把各种问题考虑
得详细,周密.程序应该具有良好的结构,并且在关键的地方配有注释.
7. 举一个例子,然后在纸上用笔执行你的程序,进一步验证其正确性.当遇到与你的设想
不符的情况时,分析问题产生的原因是编程方面的问题还是算法思想本身有问题.
8. 如果程序通过了上述正确性验证,那么在将其进一步优化或简化。
9. 撰写思路分析,注释.
对于具体的算法思路,只能靠你自己通过自己的知识和经验来加以获得,没有什么特定的
规律(否则程序员全部可以下岗了,用机器自动生成代码就可以了).要有丰富的想象力,就
是说当一条路走不通时,不要钻牛角尖,要敢于推翻自己的想法.我也只不过是初学者,说
出上面的一些经验,仅供大家参考和讨论。
关于人工智能,我觉得的也是非常值得大家仔细研究的,虽然不能算是刚刚兴起的
学科了,但是绝对是非常有发展前途的一门学科。我国人工智能创始人之一,北京科技
大学涂序彦教授(这老先生是我的导师李小坚博士的导师)对人工智能这样定义:人工
智能是模仿、延伸和扩展人与自然的智能的技术科学。在美国人工智能官方教育网站上
对人工智能作了如下定义:Artificial Intelligence, or AI for short, is a
combination of computer science, physiology, and philosophy. AI is a broad
topic, consisting of different fields, from machine vision to expert
systems. The element that the fields of AI have in common is the creation of
machines that can "think".
这门学科研究的问题大概说有:
(1)符号主义: 符号计算与程序设计基础,知识表达方法 :知识与思维,产生式规
则,语意网络,一阶谓词逻辑问题求解方法:搜索策略,启发式搜寻,搜寻算法,问题
规约方法,谓词演算:归结原理,归结过程专家系统:建立专家系统的方法及工具
(2)联接主义(神经网络学派):1988年美国权威机构指出:数据库,网络发展呈直线
上升,神经网络可能是解决人工智能的唯一途径。
我想对于人工智能的学习,大家一定不要像学数学似的及一些现成的结论,要学会分
析问题,最好能利用程序设计实现,这里推荐给大家ACM最佳博士论文奖获得者涂晓媛博
士的著作《人工鱼—计算机动画的人工生命方法》(清华大学出版社)。搞人工生命的
同学不会不知道国际知名的涂氏父女吧。关于人工智能的书当然首选《Artificial
Intelligence A New Synthesis》Nils J.Nilsson.鼻祖嘛!
关于网络安全我也想在这里说两句,随着计算机技术的发展,整个社会的信息化水平突
飞猛进,计算机网络技术日新月异,网络成了当即社会各个工作领域不可缺少的组成部
分,只要有网络存在,网络安全问题就是一个必须解决好的问题,学习网络安全不是简
简单单的收集一些黑客工具黑一黑别人的网站,而是要学习他的数学原理,实现原理,
搞清底层工作机制,这样才能解决大部分的现有问题和新出现的安全问题。

关于计算机科学的一些边缘科学我想谈一谈软件工程技术,对于一个企业,推出软件是
不是就是几个程序员坐在一起,你写一段程序,我写一段程序呢?显然不是。软件工程
是典型的计算机科学和数学,管理科学,心理学,社会学等学科的综合。它使我们这些
搞理论和技术的人进入了一个社会。你所要考虑的不仅仅是程序的优劣,更应该考虑程
序与软件的区别,软件与软件产品的区别,软件软件产品的市场前景,如何去更好的与
人交流。这方面我还在学习阶段,以后这方面再写文章吧,先推荐给大家几本书:畅销
20年不衰的《人月神话》(清华大学中文版,中国电力出版社影印版),《软件工程-实
践者研究的方法》(机械工业出版社译本),《人件》(据说每一位微软公司的部门经
理都读过这本书,推荐老总们和想当老总的同学都看看,了解一下什么是软件企业中的
人)以及微软公司的《软件开发的科学与艺术》和《软件企业的管理与文化》(研究软
件企业的制胜之道当然要研究微软的成功经验了!)

关于计算机技术的学习我想是这样的:学校开设的任何一门科学都有其滞后性,不要总
认为自己掌握的某门技术就已经是天下无敌手了,虽然现在Java,VB,C,C++用的都很多,
怎能保证没有被淘汰的一天,我想.NET平台的诞生和X#语言的初见端倪完全可以说明问
题。换言之,在我们掌握一门新技术的同时就又有更新的技术产生,身为当代的大学生
应当有紧跟科学发展的素质。举个例子,就像有些同学总说,我做网页设计就喜欢直接
写html,不愿意用什么Frontpage,Dreamweaver。能用语言写网页固然很好,但有高效的
手段你为什么不使呢?仅仅是为了显示自己的水平高,unique? 我看真正水平高的是能
够以最快的速度接受新事物的人。高级程序设计语言的发展日新月异,今后的程序设计
就像人们在说话一样,我想大家从xml中应是有所体会了。难道我们真就写个什么都要用
汇编,以显示自己的水平高,真是这样倒不如直接用机器语言写算了。反过来说,想要
以最快的速度接受并利用新技术关键还是在于你对计算机科学地把握程度。

计算机技术牵扯的内容更为广泛些,一项一项说恐怕没个一年半载也说不清。我只想提
醒大家的还是那句话,技术与科学是不能分家的,学好了科学同时搞技术,这才是上上
策。犹如英语,原先人们与老外交流必须要个翻译,现在满马路的人都会说英语。就连
21世纪英语演讲比赛的冠军都轮不到英语系的学生了。计算机也是一样的,我们必须面
对的一个现实就是:计算机真就只是一个工具,如果不具备其它方面的素养,计算机系
的学生虽然不能说找不到工作,不过总有一天当其他专业性人才掌握了计算机技术后将
比我们出色许多。原因就在于计算机解决的大都是实际问题,实际问题的知识却是我们
少有的。单一的计算机技术没有立足之地。
我想是时候指出:学习每一个课程之前,都要先搞清这一课程的学习目的。这一学
科的应用领域。据我自身所了解到的同龄同学和低年级的同学的学习状况:他们之中很
少有人知道学一个学科的学习目的,期末考试结束了也不知道学这科做什么用。这就失
去了读计算机科学的意义。当然这与现存的教育思想不能说一点关系都没有。
总的来说,从教育角度来讲,国内高校的课程安排不是很合理,强调理论,又不愿意在
理论上深入教育,无力接受新技术,想避开新技术又无法避得一干二净。我觉得关键问
题就是国内的高校难于突破现状,条条框框限制着怎么求发展。我们虽然认识得到国外
教育的优越性,但为什么迟迟不能采取行动?哪怕是去粗取精的取那么一点点。我们需
要改变。从我们自身角度来讲,多数人4年下来既没有学习计算机科学的学术水平,也没
有学习计算机技术的那种韧劲。在我刚上大一时,我的计算机科学入门导师,淮北煤炭
师范学院王爱平教授曾经对我说过这样一番话:“当你选择了计算机这一门科学,就意
味着你踏上了一条不归路,就意味着你一生都要为之奋斗……你的身后是悬崖,只有向
前走,不能往后退。”
有些同学说按照这样学习学的东西太多,有的未见得有用,我想打个形象的比方:
学校学出来的人都是一个球体,方方面面的知识都应具备。可是社会上需要球体的地方
很少,反而需要的是砖和瓦,即精通某一行的人才。但是对于同等体积的物体,用球体
来改造是最方便最省事的。学校的学生很多,为了能够使更多的学生来适应这个社会,
学校也就不得以把所有的学生都打造成一个球体,然后让社会对这些学生进行再加工,
成为真正能够有用的人才。即使你非常清楚自己的将来要干什么,并且非常下定决心要
走自己的路,这一步你也必须走,世界是在不断变化的,你不能预料未来。想清楚,努
力去干吧!
必须结束这篇“胡侃”了,再侃下去非我力所能及。其实计算机还有很多基础课都值得
一侃。怎奈我造诣有限,不敢再让内行耻笑。对于博大精深的计算机科学,我只能说我
永远都是个Beginner.最后声明:这些只针对本科阶段的学习。即使把这些全弄通了,前
面的路还长,计算机科学需要我们为之奋斗......学习计算机科学需要韧性,更需要创
新,需要***。深刻学习理论知识,勇于接受新技术的挑战,这才是我们这一代人应具
有的素质。最后送大家一句话“Wake up every day with a feeling of passion for
the difference technology will make in people's life!”。

在我大一时无意中找到了南京大学网友sir的帖子“胡侃(理论)计算机学习”,这个帖
子对我的大学生活起了至关重要的作用,也因此同他成为了好友,本帖子在原有帖子的
基础上改进了其中我认为不太合适的理论,修正了一些观点,在推荐教材方面结合我的
学习情况有了较大改变。值得一提的是增加了一些计算机理论的内容,计算机技术的内
容结合我国的教学情况和我们学习的实际情况进行了重写。感谢大家的支持,这篇文章
才能比较快的完成,这里也只是写下了我在学习计算机科学时的所思所想,很不成熟。
与原文相比增加了一些推荐参考书,删去了一些过陈旧的难以找到的材料。并且对一些
问题作了更为详细地阐述,也增加了一些新观点。希望大家多多讨论,改进不足,让我
们共同努力吧!

posted @ 2006-06-01 11:58 太极虎~宏 阅读(1822) | 评论 (3)编辑 收藏

[ 转帖][推荐]考研全攻略{写给正在彷徨或犹豫的你}

收到录取的通知,理想的学校,理想的专业,一切都几乎完美的不真实,自己从来不算个优秀的学生,本科没拿过一次奖学金,还挂过几门科目,旷的课比上的课多,在被窝里比在书桌前多,这样的我,曾经没有一点自信,觉得考研,北京,公费...诸如此类的字眼都是遥不可及的事情,然而,半年的生活改变了这一切,考研不单单只是改变了我今后的人生轨迹,更重要的是,它改变了我对自己的看法,它让我第一次以一种负责的态度来面对生活面对自己,让我知道其实我可以做到些什么,我想这就是这半年的生活给予我最大的奖励.

 

1. 关于报考 只有一个原则,选择你所爱,爱你所选择.先不要考虑报考学校的难度,竞争的激烈等等...没有谁能百分百得肯定自己能上哪个学校,考到最后,就会发现,北大和X(自己最有把握的地方性大学)并没有实质性的区别,都得一样地投入,一样地付出,一样地辛苦,所以,若没有热情和兴趣,是很难坚持走下去的.有一个梦想已久的地方,为了奔向它而努力,于是,再辛苦的日子都会泛出甜蜜.
    
  2.关于导师 "找还是不找,这是个问题.'关于找不找导师的问题,网上一千种答案.请大家具体情况区别对待.一般来说,初试的时候,不用找.如果没有很硬的关系,找也没用.跨学校跨地区的,找也找不到.当然,如果你是本校学生,跟导师关系不错,或者你能有些小门道,又或者你报考的学校风评不太好有举办补习班历史的,就请你最好找找.但是请大家放心,这些都是极少数,大部分学校基本上还是公正优先的.而且越是名校透明度越高,如果你什么门路也没有,千万也别慌张,好好做好的该做的事情就行.我们专业复试的时候,没有一个人事先联系过导师(本校生也只是认识导师而已),我本人连电话都没打过,还是挺欣慰现在逐渐成熟了的考研制度.
    
  3.关于英语 本人英语最烂,四级也考了三次才过,半年来好死赖活地搞英语,好歹混了个及格,虽不满意,但对于自己而言,进步也不小.所以这一段是写给那些英语很差的师弟师妹们的,如果你是六级70多的那种,请你跳过,就不用浪费时间了.都说英语是考研最大的一条拦路虎,每年都有很多上380但英语不过线而被刷的烈士,实在可惜.其实半年的努力让英语差的你混上国家线也不是很难.首先一个好消息是取消了听力,这是全国每年平均得分最低的一个部分,然后你要清楚,得阅读者得天下,一定要把这个当做最大头.关于英语复习,最重要的推荐是历年真题.这是无数考研先驱们总结出来英语复习精华.以本为本,反复做,特别是阅读部分,用新东方老师的话说"要做到没有一个词是生词,没有一个句子的语法成分是含糊的,看到一个题目,就要知道它出自于文章的那个部分.'做到这些,才叫精读.在考试前起码把真题阅读做到6遍以上,由于每年的出题原则都是有一定连贯性的,样在考试中,你对出题人的思路,模式都会有很熟悉的感觉,得心应手,即便是猜,概率也会大许多.关于世面上流行的各种阅读280/220/200/100篇什么的,没有精力就不用去看了,最多用来做泛读材料,看文章就好,对于题目的错对更不用深究,因为它们跟真题还是有很大差距的,如果变换了自己的思路反而不好.关于英语,还要推荐的就是新东方的FLASH课堂,各大BT网站都会有下的,听这个跟去总部上课一样,而且节省金钱和时间,新东方的老师们都很幽默,深入浅出,听他们的课反正不会打瞌睡,可以培养你对英语的兴趣和信心,确实不错.关于单词,只推荐一本新东方的<核心词汇>.考研词汇量比六级还少,常考的不过一两千,但是跟四六级不一样的是,它考察单词的深度很大,平常我们只知道某个单词的最常用意思,但是考研英语往往会考到它的第二个,第三个...生僻的意思.对单词的用法,在具体语境下的解释等等,这些就要求靠生们深入地掌握每个核心的词汇.总之一句话,关于单词,求深不求多.冲刺阶段做少量模拟题,要严守时限,主要是感觉一下气氛,把握一下自己的速度,看看自己该怎么分配时间,每年都有人因为时间不够做不完考题的.因此要自己协调,哪些部分必须做细些哪些地方可以做快些,总之,根据分数分布和自己的情况合理地分配时间,这也是很重要的一件事情.
    
  4.关于政治.政治考试是一个最奇怪的部分,准备两个月甚至两周的人经常会超过准备了半年的人,有人说运气很重要,其实不然,政治其实是最高产的,只要你花了一些工夫,而且方法对头的话,70分是很容易拿下的.关于政治,9月份大纲下来了开始准备足以.不推荐那些大本的讲义,看着累人又浪费时间,最重要的是书的绝大部分都不会考到.买一本教育司出的<考试分析>,这是最权威的参考书,薄薄的一本,几天就可以翻一遍,如果你有工夫的话把它背下来,基本上你就不需要别的参考书了.不过本人最恨背书,所以再推荐一本王锁明的<核心考案>,也是薄薄的一本,条理清晰,串讲透彻,风评也相当好,这两本书打理论底子就够了,当然,如果你是理科生,自己感觉政治基础很差,觉得这样薄薄的参考书没什么安全感的话,那建议你买岳华亭的辅导讲义,这是所有讲义里边卖的最好的一本,整本书风格清晰,语言流畅,看着也舒服,而且老岳的哲学确实很强,可以补补你的弱底子.还有就是各种吹地天花乱缀的补习班,我负责任地说,除了强制你可以腾出时间学政治以外,基本上没有别的功效.如果你有自制力,就不用去上那些班来浪费时间浪费钱了.最后听听串讲班或许还有点用,不过若是时间不够,一律省略.现在出题组是年年反猜题,除了事实政治,其他部分命中原题的可能都很小很小,因此,到冲刺阶段,大家千万不要被泛滥的信息打乱阵脚,今天背这个老师的最后几套题,明天又跟风那个补习班的内部绝密,越耸人听闻的标题就预示着越平乏无味的结果,每年一考完就可以看见论坛上漫骂各种老师和补习班的网友,其实他们也没错,色不迷人人自迷,如果自己报着不劳而获撞大运的心态,则注定落空.越接近考试的时候,这些乱七八糟的东西就越多,你要做的只是,按照自己的进度好好复习,那些模拟题绝密题押题猜题看看就好,主观题目主要是看标准答案如何组织,有些什么样的答题模式,拿来背就实在没有必要了.习题集的话陈先奎的<2000基础过关>不用说是名声最大的了,个人觉得这本书知识点全面,而且每道选择题都带有讲解,讲解精练,确实是同类中的佼佼者.美中不足的是,题目太多浪费精力,而且毛概和邓三部分识记题过多,编排陈旧,(今年毛概部分没考一个识记题),任汝汾的序列二序列三都还不错,题量适中,大字体,看起来心里舒服.关于习题集,重在做选择题,辨析题看看,问答题可看可不看,(都用不着背).
  
  5.关于专业.大家专业不同,这一块也没什么好说,如果你也是文科,就一定记得把学校指定的参考书看个烂熟,一般来说专业考试不会很难,基本上不会超过参考书的部分.专业课考上130和考下90一样的难,除了极个别的以外,大家都不会相差很多,所以虽然专业课分最重,可实际拉分的还是公共课,大家一定要处理好这个关系.
  
  6.关于计划.考研是一个跨年度的大工程,没有计划是不行的.要根据自己的情况制定一个合适的计划,一旦拟定,就要按计划行事,表老给自己找借口,每个阶段都有不同的复习方法和时间分配.一般来说,从暑假开始,为三个阶段比较合适,7~9月是全面打底阶段在这个阶段你首先要做的事情是等各个学校的招生简章下来后,确定好你报考的学校和专业,一旦确定,就不要再动摇,然后以英语为重头,首先单词要全部解决,否则无法继续下面的复习,然后每天保持一到两篇的真题阅读(这个量并不会少,中要的是钻深砖透)政治和专业课在这个阶段都以看为主,不要求记,只要你有个全面的印象和大概的框架.10~12月就是最重要的强化期,这个阶段是进步最快的时候,气候也最适合学习.这个阶段要以专业课为主,熟读~识记,基本上吃透了你手头的参考书,政治在这个阶段要开始做题,看一章节的书做一章节的题,做错题目再回头去找去看,这样子看书,底子就能扎得很塌实,英语仍是不能丢弃的,每天保持大约4时的学习时间.仍然是每天都要记一点单词,看一两篇阅读,(记住,单词和阅读必须贯穿复习的始终,可以每天只分配少量的时间,但不可偏废一天),同时每个月分重点攻破一个部分.比如10月份重点做完形,11月分重点做翻译,12月份重点做作文,这些都依个人情况而定,没有定数.1月份是最后的冲刺期,不用说这个时期的重头就是政治.一个字:.没有办法,只有背,背考试分析也行,背核心考案也行,或者是的起航最富盛名的2020,虽然很罗嗦,但是不背些句子在肚里是没法做论述题的.专业课基本上不会再有什么突破了,但书还是要看的,保持水准就行.英语方面,单词是不用再背了,做做模拟题,背一些作文模式,集中练练新题型,作文是很容易突击的.总而言之,我只能提供一个大概的模式,还得大家自己具体量化,每一个阶段,每一个月,每一周,甚至每一天都要规划好自己必须完成的任务.这样一点点得积累和前进,突然某一天你就会发现自己的质变.
  
  7.关于作息.本人非常反对疲劳战.每天保持清醒的头脑,高效的学习,乐观的心态,比你夜夜通宵管用的多.其实每天能保持8个小时的学习时间已经非常足够了,当然前提是每个小时你都在全神贯注地学习.我在考研期间,每天都睡到自然醒(当然我是在家考研,可能条件比学校好些),但是每个人兴奋点不一样,我就是夜猫子型,晚上看通宵,然后从早上睡到下午,夜晚很安静,适合我这样好动贪玩的人.总之,你觉得什么时间你最兴奋最看得进书你就好好把握住那个时段,一分一秒都不要浪费,反之,如果某个时间,你怎么也看不进书,那就不要强迫自己了,开开心心地去放松一下,一张一弛,方为文武之道.
  
  8.写在最后.罗罗嗦嗦了一大堆,我想多少会对大家有点用处吧,最后我想说的是:每个人都有自己都不会相信的潜力,选择考研也就选择了对自己的寻宝.我快乐吗?我喜欢自己吗?我对现在的生活满意吗?这些问题,也许我们每个人都在不停得问自己,不要被自己对自己的看法所约束,不要自己困住自己,大胆些超越自己,如果从不尝试,就永远不会知道自己其实可以.:)YOU CAN WHEN YOU BELEIVE!

posted @ 2006-05-31 22:45 太极虎~宏 阅读(280) | 评论 (0)编辑 收藏

  算法(Algorithm):计算机解题的基本思想方法和步骤。算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。通常使用自然语言、结构化流程图、伪代码等来描述算法。

  一、计数、求和、求阶乘等简单算法

  此类问题都要使用循环,要注意根据问题确定循环变量的初值、终值或结束条件,更要注意用来表示计数、和、阶乘的变量的初值。

  例:用随机函数产生100个[0,99]范围内的随机整数,统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数并打印出来。

  本题使用数组来处理,用数组a[100]存放产生的确100个随机整数,数组x[10]来存放个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数。即个位是1的个数存放在x[1]中,个位是2的个数存放在x[2]中,……个位是0的个数存放在x[10]。

void main()
{ int a[101],x[11],i,p;
for(i=0;i<=11;i++)
x[i]=0;
for(i=1;i<=100;i++)
{ a[i]=rand() % 100;
printf("%4d",a[i]);
if(i%10==0)printf("\n");
}
for(i=1;i<=100;i++)
{ p=a[i]%10;
if(p==0) p=10;
x[p]=x[p]+1;
}
for(i=1;i<=10;i++)
{ p=i;
if(i==10) p=0;
printf("%d,%d\n",p,x[i]);
}
printf("\n");
}

  二、求两个整数的最大公约数、最小公倍数

  分析:求最大公约数的算法思想:(最小公倍数=两个整数之积/最大公约数)
(1) 对于已知两数m,n,使得m>n;
(2) m除以n得余数r;
(3) 若r=0,则n为求得的最大公约数,算法结束;否则执行(4);
(4) m←n,n←r,再重复执行(2)。
例如: 求 m=14 ,n=6 的最大公约数. m n r
14 6 2
6 2 0
void main()
{ int nm,r,n,m,t;
printf("please input two numbers:\n");
scanf("%d,%d",&m,&n);
nm=n*m;
if (m<n)
{ t=n; n=m; m=t; }
r=m%n;
while (r!=0)
{ m=n; n=r; r=m%n; }
printf("最大公约数:%d\n",n);
printf("最小公倍数:%d\n",nm/n);
}

  三、判断素数

  只能被1或本身整除的数称为素数 基本思想:把m作为被除数,将2—INT( )作为除数,如果都除不尽,m就是素数,否则就不是。(可用以下程序段实现)
void main()
{ int m,i,k;
printf("please input a number:\n");
scanf("%d",&m);
k=sqrt(m);
for(i=2;i<k;i++)
if(m%i==0) break;
if(i>=k)
printf("该数是素数");
else
printf("该数不是素数");
}
将其写成一函数,若为素数返回1,不是则返回0
int prime( m%)
{int i,k;
k=sqrt(m);
for(i=2;i<k;i++)
if(m%i==0) return 0;
return 1;
}

  四、验证哥德巴赫猜想

  (任意一个大于等于6的偶数都可以分解为两个素数之和)
基本思想:n为大于等于6的任一偶数,可分解为n1和n2两个数,分别检查n1和n2是否为素数,如都是,则为一组解。如n1不是素数,就不必再检查n2是否素数。先从n1=3开始,检验n1和n2(n2=N-n1)是否素数。然后使n1+2 再检验n1、n2是否素数,… 直到n1=n/2为止。

  利用上面的prime函数,验证哥德巴赫猜想的程序代码如下:
#include "math.h"
int prime(int m)
{ int i,k;
k=sqrt(m);
for(i=2;i<k;i++)
if(m%i==0) break;
if(i>=k)
return 1;
else
return 0;
}

main()
{ int x,i;
printf("please input a even number(>=6):\n");
scanf("%d",&x);
if (x<6||x%2!=0)
printf("data error!\n");
else
for(i=2;i<=x/2;i++)
if (prime(i)&&prime(x-i))
{
printf("%d+%d\n",i,x-i);
printf("验证成功!");
break;
}
}

  五、排序问题

  1.选择法排序(升序)

  基本思想:
1)对有n个数的序列(存放在数组a(n)中),从中选出最小的数,与第1个数交换位置;
2)除第1 个数外,其余n-1个数中选最小的数,与第2个数交换位置;
3)依次类推,选择了n-1次后,这个数列已按升序排列。

程序代码如下:
void main()
{ int i,j,imin,s,a[10];
printf("\n input 10 numbers:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<9;i++)
{ imin=i;
for(j=i+1;j<10;j++)
if(a[imin]>a[j]) imin=j;
if(i!=imin)
{s=a[i]; a[i]=a[imin]; a[imin]=s; }
printf("%d\n",a[i]);
}
}

  2.冒泡法排序(升序)

  基本思想:(将相邻两个数比较,小的调到前头)
1)有n个数(存放在数组a(n)中),第一趟将每相邻两个数比较,小的调到前头,经n-1次两两相邻比较后,最大的数已“沉底”,放在最后一个位置,小数上升“浮起”;
2)第二趟对余下的n-1个数(最大的数已“沉底”)按上法比较,经n-2次两两相邻比较后得次大的数;
3)依次类推,n个数共进行n-1趟比较,在第j趟中要进行n-j次两两比较。
程序段如下
void main()
{ int a[10];
int i,j,t;
printf("input 10 numbers\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("\n");
for(j=0;j<=8;j++)
for(i=0;i<9-j;i++)
if(a[i]>a[i+1])
{t=a[i];a[i]=a[i+1];a[i+1]=t;}
printf("the sorted numbers:\n");
for(i=0;i<10;i++)
printf("%d\n",a[i]);
}

  3.合并法排序(将两个有序数组A、B合并成另一个有序的数组C,升序)

  基本思想:
1)先在A、B数组中各取第一个元素进行比较,将小的元素放入C数组;
2)取小的元素所在数组的下一个元素与另一数组中上次比较后较大的元素比较,重复上述比较过程,直到某个数组被先排完;
3)将另一个数组剩余元素抄入C数组,合并排序完成。
程序段如下:
void main()
{ int a[10],b[10],c[20],i,ia,ib,ic;
printf("please input the first array:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<10;i++)
scanf("%d",&b[i]);
printf("\n");
ia=0;ib=0;ic=0;
while(ia<10&&ib<10)
{ if(a[ia]<b[ib])
{ c[ic]=a[ia];ia++;}
else
{ c[ic]=b[ib];ib++;}
ic++;
}
while(ia<=9)
{ c[ic]=a[ia];
ia++;ic++;
}
while(ib<=9)
{ c[ic]=b[ib];
b++;ic++;
}
for(i=0;i<20;i++)
printf("%d\n",c[i]);
}

  六、查找问题

  1.①顺序查找法(在一列数中查找某数x)

  基本思想:一列数放在数组a[1]---a[n]中,待查找的数放在x 中,把x与a数组中的元素从头到尾一一进行比较查找。用变量p表示a数组元素下标,p初值为1,使x与a[p]比较,如果x不等于a[p],则使p=p+1,不断重复这个过程;一旦x等于a[p]则退出循环;另外,如果p大于数组长度,循环也应该停止。(这个过程可由下语句实现)
void main()
{ int a[10],p,x,i;
printf("please input the array:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("please input the number you want find:\n");
scanf("%d",&x);
printf("\n");
p=0;
while(x!=a[p]&&p<10)
p++;
if(p>=10)
printf("the number is not found!\n");
else
printf("the number is found the no%d!\n",p);
}
思考:将上面程序改写一查找函数Find,若找到则返回下标值,找不到返回-1
②基本思想:一列数放在数组a[1]---a[n]中,待查找的关键值为key,把key与a数组中的元素从头到尾一一进行比较查找,若相同,查找成功,若找不到,则查找失败。(查找子过程如下。index:存放找到元素的下标。)
void main()
{ int a[10],index,x,i;
printf("please input the array:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("please input the number you want find:\n");
scanf("%d",&x);
printf("\n");
index=-1;
for(i=0;i<10;i++)
if(x==a[i])
{ index=i; break;
}
if(index==-1)
printf("the number is not found!\n");
else
printf("the number is found the no%d!\n",index);
}

  2.折半查找法(只能对有序数列进行查找)

  基本思想:设n个有序数(从小到大)存放在数组a[1]----a[n]中,要查找的数为x。用变量bot、top、mid 分别表示查找数据范围的底部(数组下界)、顶部(数组的上界)和中间,mid=(top+bot)/2,折半查找的算法如下:
(1)x=a(mid),则已找到退出循环,否则进行下面的判断;
(2)x<a(mid),x必定落在bot和mid-1的范围之内,即top=mid-1;
(3)x>a(mid),x必定落在mid+1和top的范围之内,即bot=mid+1;
(4)在确定了新的查找范围后,重复进行以上比较,直到找到或者bot<=top。
将上面的算法写成如下程序:
void main()
{
int a[10],mid,bot,top,x,i,find;
printf("please input the array:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("please input the number you want find:\n");
scanf("%d",&x);
printf("\n");
bot=0;top=9;find=0;
while(bot<top&&find==0)
{ mid=(top+bot)/2;
if(x==a[mid])
{find=1;break;}
else if(x<a[mid])
top=mid-1;
else
bot=mid+1;
}
if (find==1)
printf("the number is found the no%d!\n",mid);
else
printf("the number is not found!\n");
}

  七、插入法

  把一个数插到有序数列中,插入后数列仍然有序

  基本思想:n个有序数(从小到大)存放在数组a(1)—a(n)中,要插入的数x。首先确定x插在数组中的位置P;(可由以下语句实现)
#define N 10
void insert(int a[],int x)
{ int p, i;
p=0;
while(x>a[p]&&p<N)
p++;
for(i=N; i>p; i--)
a[i]=a[i-1];
a[p]=x;
}
main()
{ int a[N+1]={1,3,4,7,8,11,13,18,56,78}, x, i;
for(i=0; i<N; i++) printf("%d,", a[i]);
printf("\nInput x:");
scanf("%d", &x);
insert(a, x);
for(i=0; i<=N; i++) printf("%d,", a[i]);
printf("\n");
}

  八、矩阵(二维数组)运算

(1)矩阵的加、减运算
C(i,j)=a(i,j)+b(i,j) 加法
C(i,j)=a(i,j)-b(i,j) 减法
(2)矩阵相乘
(矩阵A有M*L个元素,矩阵B有L*N个元素,则矩阵C=A*B有M*N个元素)。矩阵C中任一元素 (i=1,2,…,m; j=1,2,…,n)
#define M 2
#define L 4
#define N 3
void mv(int a[M][L], int b[L][N], int c[M][N])
{ int i, j, k;
for(i=0; i<M; i++)
for(j=0; j<N; j++)
{ c[i][j]=0;
for(k=0; k<L; k++)
c[i][j]+=a[i][k]*b[k][j];
}
}
main()
{ int a[M][L]={{1,2,3,4},{1,1,1,1}};
int b[L][N]={{1,1,1},{1,2,1},{2,2,1},{2,3,1}}, c[M][N];
int i, j;
mv(a,b,c);
for(i=0; i<M; i++)
{ for(j=0; j<N; j++)
printf("%4d", c[i][j]);
printf("\n");
}
}
(3)矩阵传置
例:有二维数组a(5,5),要对它实现转置,可用下面两种方式:
#define N 3
void ch1(int a[N][N])
{ int i, j, t;
for(i=0; i<N; i++)
for(j=i+1; j<N; j++)
{ t=a[i][j];
a[i][j]=a[j][i];
a[j][i]=t;
}
}
void ch2(int a[N][N])
{ int i, j, t;
for(i=1; i<N; i++)
for(j= 0; j<i; j++)
{ t=a[i][j];
a[i][j]=a[j][i];
a[j][i]=t;
}
}
main()
{ int a[N][N]={{1,2,3},{4,5,6},{7,8,9}}, i, j;
ch1(a); /*或ch2(a);*/
for(i=0; i<N; i++)
{ for(j=0; j<N; j++)
printf("%4d", a[i][j]);
printf("\n");
}
}
(4)求二维数组中最小元素及其所在的行和列
基本思路同一维数组,可用下面程序段实现(以二维数组a[3][4]为例):
‘变量max中存放最大值,row,column存放最大值所在行列号
#define N 4
#define M 3
void min(int a[M][N])
{ int min, row, column, i, j;
min=a[0][0];
row=0;
column=0;
for(i=0; i<M; i++)
for(j=0; j<N; j++)
if(a[i][j]<min)
{ min=a[i][j];
row=i;
column=j;
}
printf("Min=%d\nAt Row%d,Column%d\n", min, row, column);
}
main()
{ int a[M][N]={{1,23,45,-5},{5,6,-7,6},{0,33,8,15}};
min(a);
}

  九、迭代法

  算法思想:对于一个问题的求解x,可由给定的一个初值x0,根据某一迭代公式得到一个新的值x1,这个新值x1比初值x0更接近要求的值x;再以新值作为初值,即:x1→x0,重新按原来的方法求x1,重复这一过和直到|x1-x0|<ε(某一给定的精度)。此时可将x1作为问题的解。
例:用迭代法求某个数的平方根。 已知求平方根的迭代公式为:
#include<math.h>
float fsqrt(float a)
{ float x0, x1;
x1=a/2;
do{
x0=x1;
x1=0.5*(x0+a/x0);
}while(fabs(x1-x0)>0.00001);
return(x1);
}
main()
{ float a;
scanf("%f", &a);
printf("genhao =%f\n", fsqrt(a));
}

  十、数制转换

  将一个十进制整数m转换成 →r(2-16)进制字符串。

  方法:将m不断除 r 取余数,直到商为零,以反序得到结果。下面写出一转换函数,参数idec为十进制数,ibase为要转换成数的基(如二进制的基是2,八进制的基是8等),函数输出结果是字符串。
char *trdec(int idec, int ibase)
{ char strdr[20], t;
int i, idr, p=0;
while(idec!=0)
{ idr=idec % ibase;
if(idr>=10)
strdr[p++]=idr-10+65;
else
strdr[p++]=idr+48;
idec/=ibase;
}
for(i=0; i<p/2; i++)
{ t=strdr[i];
strdr[i]=strdr[p-i-1];
strdr[p-i-1]=t;
}
strdr[p]=’\0’;
return(strdr);
}
main()
{ int x, d;
scanf("%d%d", &x, &d);
printf("%s\n", trdec(x,d));
}

  十一、字符串的一般处理

  1.简单加密和解密
加密的思想是: 将每个字母C加(或减)一序数K,即用它后的第K个字母代替,变换式公式: c=c+k
例如序数k为5,这时 A→ F, a→f,B→?G… 当加序数后的字母超过Z或z则 c=c+k -26
例如:You are good→ Dtz fwj ltti
解密为加密的逆过程
将每个字母C减(或加)一序数K,即 c=c-k,
例如序数k为5,这时 Z→U,z→u,Y→T… 当加序数后的字母小于A或a则 c=c-k +26
下段程序是加密处理:
#include<stdio.h>
char *jiami(char stri[])
{ int i=0;
char strp[50],ia;
while(stri[i]!=’\0’)
{ if(stri[i]>=’A’&&stri[i]<=’Z’)
{ ia=stri[i]+5;
if (ia>’Z’) ia-=26;
}
else if(stri[i]>=’a’&&stri[i]<=’z’)
{ ia=stri[i]+5;
if (ia>’z’) ia-=26;
}
else ia=stri[i];
strp[i++]=ia;
}
strp[i]=’\0’;
return(strp);
}
main()
{ char s[50];
gets(s);
printf("%s\n", jiami(s));
}
2.统计文本单词的个数
输入一行字符,统计其中有多少个单词,单词之间用格分隔开。
算法思路:
(1)从文本(字符串)的左边开始,取出一个字符;设逻辑量word表示所取字符是否是单词内的字符,初值设为0
(2)若所取字符不是“空格”,“逗号”,“分号”或“感叹号”等单词的分隔符,再判断word是否为1,若word不为1则表是新单词的开始,让单词数num = num +1,让word =1;
(3)若所取字符是“空格”,“逗号”,“分号”或“感叹号”等单词的分隔符, 则表示字符不是单词内字符,让word=0;
(4) 再依次取下一个字符,重得(2)(3)直到文本结束。
下面程序段是字符串string中包含的单词数
#include "stdio.h"
main()
{char c,string[80];
int i,num=0,word=0;
gets(string);
for(i=0;(c=string[i])!='\0';i++)
if(c==' ') word=0;
else if(word==0)
{ word=1;
num++;}
printf("There are %d word in the line.\n",num);
}

  十二、穷举法
  
  穷举法(又称“枚举法”)的基本思想是:一一列举各种可能的情况,并判断哪一种可能是符合要求的解,这是一种“在没有其它办法的情况的方法”,是一种最“笨”的方法,然而对一些无法用解析法求解的问题往往能奏效,通常采用循环来处理穷举问题。
例: 将一张面值为100元的人民币等值换成100张5元、1元和0.5元的零钞,要求每种零钞不少于1张,问有哪几种组合?
main()
{ int i, j, k;
printf(" 5元 1元 5角\n");
for(i=1; i<=20; i++)
for(j=1; j<=100-i; j++)
{ k=100-i-j;
if(5*i+1*j+0.5*k==100)
printf(" %3d %3d %3d\n", i, j, k);
}
}

  十三、递归算法
  
  用自身的结构来描述自身,称递归
  
  VB允许在一个Sub子过程和Function过程的定义内部调用自己,即递归Sub子过程和递归Function函数。递归处理一般用栈来实现,每调用一次自身,把当前参数压栈,直到递归结束条件;然后从栈中弹出当前参数,直到栈空。
递归条件:(1)递归结束条件及结束时的值;(2)能用递归形式表示,且递归向终止条件发展。
例:编fac(n)=n! 的递归函数
int fac(int n)
{ if(n==1)
return(1);
else
return(n*fac(n-1));
}
main()
{ int n;
scanf("%d", &n);
printf("n!=%d\n", fac(n));
}

posted @ 2006-05-26 22:34 太极虎~宏 阅读(1086) | 评论 (4)编辑 收藏

1.中国站长站:http://www.chinaz.com  
  站长站以专业提供站长相关资源下载而出名,可以说做得也不是很早,但现在人气很旺,下载资源更新很快,有很多的服务器下载点,下载速度也不错,提供收费下载通道,站点知名度及竞争力都在国内同类站点领先。对于站长来说的确已经不错,特别是论坛交流。但对于WEB技术资源来说,是否还缺一些除了下载外,其它的东东呢:)。  
   
  2.中国WEB开发者网络:http://www.webasp.net  
  一个新起的站点,以提供WEB开发相关技术资源为主,最大的特色是其文档资源真的很多,栏目丰富,包括在线软件供求之类的,源码资源也比较多,更新也比较快,下载点有几个,但速度有点慢,提供收费下载通道,这个站现在还没什么名气,人气比较差,可能是新站没什么宣传,但应该具有很强的竞争力。  
   
  3,源码之家:http://www.mycodes.net  
  比较早的源码下载站点,源码比较多,有三个下载点,全部http下载,速度不错,更新速度比较快,应该说站点的知名度也是很高的,但也是专门提供下载服务及论坛,无其它技术栏目,站点人气也不错,具有较强的竞争力。  
   
  4.ASP300:http://www.asp300.com  
  国内做的很早的下载站之一,专业提供asp代码下载,是比较早进行收费的代码下载站点,很多人都说其“拿别人站点免费代码当商业代码”,今年进行一次改版,整个感觉不错,更新速度较快,一个下载点,下载速度也不错,下载资源库存也比较大,但很多需是收费会员才能下载。知名度比较高,但现在人气比较差,一般现在很多都是看其知名度去的。如果告别免费能让大家接受,那么其竞争力是比较强的。  
   
  5.中国源码中心:http://www.cncode.com  
  也是比较早的源码下载站点,只提供下载和论坛服务,现有源码容量一般,一个下载点,速度比较慢,一直以来都没什么起色,老字号,更新速度还可以,人气一般,但知名度比较高,所以现在还是比较多人去的,具有较强的竞争力。  
   
  6.源码吧:http://www.yuanma8.com  
  一个新起的站点,专门提供源码下载服务,现有库存容量一般,一个下载点,速度一般,感觉建站好象没多长时间,但现在人气也还不错。现在有一定的知名度,不长时间能做到这样,受益于其好记的站名外,更主要的是其站点的管理团队应该不错,具有较强的竞争力。  
   
  7.时代者:http://www.im86.com  
  主要提供源码下载服务,现库存源码容量一般,一个下载点,下载速度比较快,更新也比较快,人气也还不错。有一定的知名度,具有较强的竞争力。  
   
  8.源码联盟:http://www.aspsun.com  
  也是一个较早的源码下载站点,现有库存一般,四个下载点,下载速度还不错,更新速度一般,人气较差,只提供下载无论坛,有一定的知名度,感觉还行,具有较强的竞争力。  
   
  9.下吧源码联盟:http://www.xia8.com  
  一个专门的下载站,现有的库存还可以,三个下载点,下载速度还不错,更新速度还可以,人气较差,感觉还可以,印象不是很深,具有较强的竞争力。  
   
  10.k666软件园:http://down.kk66.com  
  这个相信大家都知道的,建站很早,资源容量很大,更新也比较快,但现在很多人都被其站点的乱七八糟内容及广告给打走了,极端商业化已经使他逐渐的失去他自身的魅力。对于WEB技术来说,源码下载无分类,比较难找,就这点就不够专业。原来有人形容“瘦死的骆驼比马大”“垃圾代码一大堆”。还是希望其重整一下,能提供更多好的东东。因为其不是专门提供WEB类资源,排在最后,但的确其资源及整站的人气还是很不错的。如果重整一下,应具有很强的竞争力。  

posted @ 2006-05-16 19:59 太极虎~宏 阅读(252) | 评论 (0)编辑 收藏
当软件开发遭遇政治流氓

       在国内的软件行业不长不短工作了十年了,呆过的企业从国有到外企,从民营小作坊到民营大作坊,做过的领域,从工业控制(现在叫嵌入式系统)到ERP,从电子商务到电子政务,大小各类项目产品有十几个,团队伙伴有大陆人,香港人,台湾人,有东洋人,有西洋人.现在回头缕缕,项目没有失败的(当然这取决于怎么定义失败),反正都能做出来,过程中间,反正死几批人,当官的照样当官,投资人心疼不已,甲方抱怨甚至谩骂,计划延期甚至一倍,最后都做出来了,正是那句"一将功成万骨枯".
 久而久之,我发现,无论什么样的项目里,其开发团队里总有一类人,这类人的共性特征很明显,如下几点:
       1.满嘴跑概念,尤其是英文缩写语(acronym),比如:OO,AOP,SSO,IOC,SOA,GOF,Open-Close,MDA,TDD,B2B,,以及英文词汇,比如,pattern,schema,catalog,Service Engine,Portal,然而对于概念的内含或者语义并没有清楚的理解.请注意我说话的重点不是他们说概念(为了沟通的方便,我也倾向直接引用原文的英文术语),而是他们在对于概念的内涵的理解不透彻的情况下,频频使用,甚至不分上下文(context),就往上胡邹.可笑的是,大多数情况下,这类人凭着这种说话pattern,总能在开发组织里混得比那些每天分析,设计,写代码,debug的老实人(扎扎实实的技术人员)得老板(不单指企业所有者,指广义上的上一层领导)赏识,尤其是当这些所谓的"老板"也是个二五眼的时候,"老板"也是在打工挣钱混日子,为了政治上的需要,这时候多数都会用对这类人的认可换得支持.这时候,"皇帝的新装"这个模式就实例化了.之后,那些"概念贩子"通常都能青云直上,而"老实人"就永远都给这些人打工.
        2.一旦发现在成员中有人比自己更清楚这些概念的涵义,通常都会视之为眼中钉,务必除之而后快.因为这后者实际是扮演了"皇帝的新装"中的那个小男孩,但是,皇帝对小孩也得矜持点儿,而前者对后者,通常是同事,或是上下级.而一旦"概念贩子"是上级,那就更坏了,我们可以企望这个上级的宽阔胸襟(小概率事件),然而事实通常是恰恰相反,这里的没有小孩,只有杨修.
        3."弄",这个"弄"便是"弄臣","弄权"的"弄",也是<金瓶梅>里常说的"弄将起来"的"弄".在项目进程中,这类人很能"弄".最简单的场景是,当团队成员为某个技术方案攻关而献计献策的时候,这类人常常会抛出一些概念,再附上简单的异想天开的解说,一面证明着大多数人的"不慧,甚矣",一面证明着自己的卓然出众,令决策者拍板,然而总是有个特殊之处,就是,这种情况往往都不是这个弄者需要亲自实践证明其说法的时候.为什么要"弄"呢?其实很简单,这类人,靠得就是这个来吃饭的.通过"弄",结果往往是,为了解决一个问题,一"弄"就会多出n个问题,变小乱为大乱,不乱这些人怎么混呢?
 
        我说这些,不是为了砸这些人的饭碗,而且我不信我有这个能力."天生我才必有用"这句话从谁的嘴里都能说出来.但是,这类人确实是软件开发团队的致病基因.我知道有人会说,大家都是出来混口饭吃,你何必呢?我只是想给大家提个醒.当这类人当领导的时候,你可得小心谨慎一万倍,不然你糊里糊涂的就被领导给喀嚓了.当这类人当领导的时候,会演变出另一大特性,就是喜欢有人提鞋和"拍".所以,目前尽管internet很普遍,各位也都通过google可以做一个称职的knowledge worker,但是,有google搜不到的,就是"概念贩子"的那个"小".

         呵呵.本周刚刚遭遇了一回这样的人,被算计了,被迫辞职.翻着<<狼图腾>>这本书,突然想到这个了,技术上,我们别说跟着MIB(Don Box语:MIB==Microsoft,IBM,BEA,其实大家可能都知道,这是电影MIB==Man In Black),能跟上open source社区就不错了.但是,中国软件业的经理们,牛啊,牛得中国软件业就和中国国家男子足球队似的.没办法,经理们也是苦大的,跟狼一样,还在靠和别的狼抢肉吃活着呢.经理们开会的时候,坐在VIP的位子上,理解是:Very Important Person,但是我的前德国老板对此的解释为:Very Interesting Pig.


posted @ 2006-05-14 13:25 太极虎~宏 阅读(136) | 评论 (0)编辑 收藏


女性进入软件业必看 

 说句实话,如果你不是因为有兴趣,那么女生最好还是不要做程序员。
做程序员很苦很累,对身体也不好,钱可能暂时多一下,以后发展也是大问题。特别是现在许多企业都不招收女性做程序员.....除非你很牛。

如果你选定了做程序员这条路,那么恭喜你,你至少要做好三件事的准备。
1放弃正常生活,放弃女性爱美的心态,把精力投入到看书看代码写程序上,放弃对购物化妆的爱好,否则你将很快被新人新技术淘汰。
2做好被拒绝被剥削的思想准备,由于生理原因,软件行业的程序员一般不喜欢用女性,就算是女性做程序员,工资也很难超过男性程序员,除非....你很牛。
3做好长期低收入的准备。刚入行的程序员一般在2-3K之间(不排除你运气好,微软要你给你开10K的收入),而且如果不能在2-3年内得到发展,那么你的工资在4-5K左右将不会再变动,直到你30岁被踢出程序员的行列前,你将一直拿这个工资。

如果你愿意,那么我再根据你以后想从事的专业,给你提一下你该学习的知识。


如果你看了我写的东西还没有被吓倒,那么我继续谈你该学习的内容。

做程序员,应该选好自己努力的方向。是准备做ERP,通讯,嵌入式等等,是准备在WINDOWS平台下发展还是在UNIX\LINUX下发展,你以后准备由技术-技术架构,还是技术-管理。如果只是被动的走,只想多拿钱,那么我可以告诉你,你这个程序员是非常失败的,而且以后路会越走越窄,不要指望公司会为你考虑发展,国内公司都是非常自私的。

无论如何,作为程序员,以下几个内容必须掌握

C语言,数据结构,算法,编译原理(不强求,至少知道词法分析和语法分析),OS的一些基本原理(进程调度,内存调度等等),计算机体系结构,软件工程

其他的要求至少英语四级(不然MSDN没法看),写过程序,数学不要太差

如果你掌握了这些内容,说明你至少和科班出身站在了同一起跑线上了。下面再根据你自己愿意从事专业发展。发展大致可以按平台划分
1WINDOWS平台
2LINUX/UNIX平台
3嵌入式平台

WINDOW平台机会最多,待遇也最低,LINUX/UNIX次子,嵌入式待遇最好。但是学习机会刚好相反,WIN平台很好学,LINUX/UNIX一般用于大型机,而你自己估计平时也不会用这些东西,至于嵌入式,如果公司不给你机会学习,那你根本就没法进入这个行业。

当如,如果你在三个平台之一能做到精通,那么待遇都会很高。不过我敢说,就算CSDN,真正能透彻了解WINDOWS运行机制,能把API运用的纯熟的人都不会太多。
如果你做网络,网络也可以分很多。你是准备做布线,管理,架构还是研发?如果研发,又可以分写一般通讯程序,路由等网络设备研发(已经偏硬)等。

那么建议你至少熟悉以下内容
多平台的进程调度多线程和线程同步(TCP/IP协议在不同平台通讯很正常)
TCP/IP协议的了解
熟悉C/C++(跨平台C开发,包括VC,GCC等等)
等等

 

posted @ 2006-05-12 12:48 太极虎~宏 阅读(219) | 评论 (1)编辑 收藏

代码走查(code walkthrough) 和代码审查(code inspection)


代码审查
又叫人工走查,就是用人工检查被测试的程序。

代码走查是一个开发人员与架构师集中与讨论代码的过程。代码走查的目的交换有关代码是如何书写的思路,并建立一个对代码的标准集体阐述。 在代码走查的过程中,开发人员都应该有机会向其他人来阐述他们的代码。 通常地,即便是简单的代码阐述也会帮助开发人员识别出错误并预想出对以前麻烦问题的新的解决办法。

当团队成员对代码进行讨论的时候,他们的讨论应该集中到一些重要的话题上,比如算法,基于对象的编程,类设计。 然而,许多代码走查不会做这些事,通常代码走查是枯燥的,烦人的,机械的。 这就是为什么许多开发人员讨厌这些。要使得代码走查变得很有效,那么这个过程就必须是有趣的,有创造性的。 很经常地,代码走查退化成了仅是关注于强制代码标准--一个可以被自动执行的实践。当这种情形出现后,团队通常会觉得代码走查没有价值,然后将代码走查从他们开发过程中去除掉。这样便失去了他们可以从正确地执行代码走查的过程获益的机会。

posted @ 2006-05-12 00:54 太极虎~宏 阅读(4787) | 评论 (3)编辑 收藏

引言

  "Visual C++与Delphi之比较"最近在CSDN的论坛上的讨论非常火热,本文将以一个程序员的角度,从技术水平、功能、性能、易用性、稳定性、发展历程和前景等方面,以Visual C++6和Delphi5为代表,尽可能客观地比较介绍Visual C++和Delphi这两大主流开发工具的优缺点,其中将涉及到语言、应用框架、控件、编译和连接、集成界面、调试、COM、数据库开发等。本文还将对如何选择使用这两个开发工具提出一些建议。   

  值得一提的是,由于C++Builder与Delphi同为Inprise公司产品,它们除了使用的语言不同,其余特性几乎都相同。因此本文对C++Builder程序员和学习者也有参考价值。

语言:存在即是合理

  首先声明常被混淆的一点:VC和Delphi本身不是语言,而是开发平台。它们所用的语言分别是略作扩展的C/C++和Object Pascal。我在网上常看到有人问应该学C/C++还是VC,这个问题很好回答:如果你学VC你就必须得学C/C++,或者说你学会了VC也就学会了C/C++了。   

  言归正传,我们来比较一下C++和Object Pascal的优缺点。有人认为Object Pascal是"玩具语言",C++才是"专业语言",这是不对的。单从语言本身看,Object Pascal与C++属同一重量级。它们都是完全支持面向对象的语言,都扎根于"历史悠久"的面向过程的语言。C++是由C发展而来的,Object Pascal由Pascal进化而来。它们都有很强的灵活性,都有自己的特长和不足。比如说,Object Pascal不支持多重继承、模板、操作符重载、内联函数定义、预处理、宏、全局静态类变量、嵌套类定义,等等,而这些都是C++支持的。但同样地C++也不支持Object Pascal的虚构造函数、过程嵌套、内置集合类型、内置字符串类型、"finally"构造等等,在RTTI方面Object Pascal也比C++做得好。但这些并不重要,因为可以通过其它方式达到同样的目的,比如C++可以通过类扩展支持集合、字符串,Object Pascal可以通过"interface"多重继承,等等。关键是二者都可以很好地完成你手头的任务,这就够了。   

  但是,仅仅比较语言本身是不够的,还得看它们的被接受和流行程度,学习曲线,发展前途,可移植性等,以及,很重要但常常被忽略的一点:与开发环境(指VC与Delphi)及其应用框架的"磨合"程度。   

  VC和Delphi作为开发平台,很重要的一点就是提供了一个"无所不包"的应用框架:VC的MFC和Delphi的VCL。MFC是用C++写的,VCL是用Object Pascal写的。当然,我们都知道,C++的使用范围比Object Pascal广得多,移植性也好得多。这本来是优点,但很有意思的是,正因为如此,微软写MFC时必须考虑最大限度减少对语言本身的改动,而把功夫下在源代码级,以便能尽可能支持ANSI等标准,结果导致MFC的封装复杂而不直观。(尤其是它对消息的封装,下文还会提到)。太多的宏定义和含义模糊且自动生成、不得改动的注释使MFC乃至VC让很多新手望而生畏,不敢"下水"深入学习。而Object Pascal几乎是Inprise"专用"的,不必考虑"标准"问题,因此Inprise写VCL时就把全部精力放在了结构与性能上,结果语言与框架的磨合程度非常好。VCL框架的结构清晰,VCL代码的可读性非常好。许多人说Delphi比较容易上手,也是这个缘故。天下没有白吃的午餐。你要工业标准吗?你要可移植性吗(关于可移植性和兼容性,下文会详细比较)?那么请面对MFC的"天书"级代码吧。

编译和连接:The Need For Speed

  不同的语言带来的另一个不同是,编译和连接的速度的不同,以及执行速度的不同。Delphi的编译和连接速度,毫不夸张地说,比VC快几十倍。即使把VC的Incremental Link选项打开,Delphi的编译和连接速度仍比VC快好几倍。并不是说微软的编译器不行,这是由C++的复杂性决定的。模板的处理、预处理和宏的展开都是很费时的。前文不是提到Object Pascal没有模板、预处理和宏吗?这本来是缺点,但带来的一个好处就是编译速度极快。至于编译完的二进制代码,在打开相同的优化选项的情况下,Delphi和VC执行速度并没有太大的差别。

  为了克服编译的速度问题,C++编译器一般需要增强的连接器和预处理机制。但是预处理机制仍然存在若干问题:1)程序调试的断点行可能和代码行不同;2)没有将最新的代码信息综合进去;3)容易产生错误的逻辑;4)因为读错文件头而很容易产生类似"Unexpected End of File"的错误。

  两个编译器有个共同点是都能识别无用的"死"代码,比如一个没有用的函数等等。编译后的程序将不包含这些多余的信息。Delphi在这方面作得更加出色。它可以让你在编辑器中可视化地提示出那行代码是"活"的、那行代码是"死"的。这样你就能整理出最精简的代码。Delphi在编译后将在左边显示一个小蓝点表示这行代码是"活"的。Visual C++做不到这点。

  Delphi编译后可执行文件至少有200K(如果不使用VCL,仅仅使用WinAPI,文件的大小将大大缩小)但是Visual C++编程使用MFC编译后的可执行文件通常只有几十K,主要是因为微软已经将系统运行库包含在Windows系统了(Borland公司曾经和微软协商这个接口,但是微软利用操作系统的优势不愿意公开)。同样道理,使用BDE开发的的数据库程序必须附带3-5M的额外系统文件,也是非常不协调的。

  非常有趣的是,Delphi能够使用由C++ Builder创建的的OBJ文件,但是使用上受很大的局限性。

  最后,Visual C++的编译和连接时的错误信息比Delphi要详细和具体的多。特别是使用ATL开发更加如此。

应用框架:MFC?有KFC流行吗?

  应用程序框架(Application Frame),有时也称为对象框架。Visual C++采用的框架是MFC。MFC不仅仅是人们通常理解的一个类库(同样,Delphi的VCL也不仅仅是一个控件库,尽管它的名字叫"可视控件库")。你如果选择了MFC,也就选择了一种程序结构,一种编程风格。MFC早在Windows 3.x的时代就出现了,那时的Visual C++还是16位的。经过这些年的不断补充和完善,MFC已经十分成熟。但由于原型出现得比较早,MFC相比于VCL落后了一个时代。尽管微软对MFC的更新没有停止,我也经常读到"只要Windows不过时,MFC就不会过时"之类观点的文章,但就象Inprise(原Borland)的OWL框架的淡出一样,MFC的淡出也是早晚的事。其实MFC是和OWL同一个时代的产物。OWL已经不在了,MFC怎能不"居安思危"呢?如果MFC青春永驻,微软的开发人员也不会"私自"开发出基于ATL的WTL呀。当然,WTL的地位不能和MFC比,它并不是微软官方支持的框架,封装的功能也相当有限。但至少也反衬出了MFC存在的不足。   

  我们以为,最能体现一个应用程序框架的先进性的是它的委托模型,即对Windows消息的封装机制。对Windows API的封装就不用说了吧。大同小异,也没什么技术含量。如果高兴,你也可以自己写一个类库来封装。但对Windows消息驱动机制的封装就不是那么容易的了。最自然的封装方式是采用虚成员函数。如果要响应某个消息就重载相应的虚函数。但出乎我的意料,MFC采用的是"古老"的宏定义方法。用宏定义方法的好处是省去了虚函数VTable的系统开销(由于Windows的消息种类很多,开销不算太小)。不过带来的缺点就是映射不太直观。对于MFC,则是"太不直观"了。它的消息映射代码虽然是可见的,但"劝君莫碰"。好在VC的ClassWizard可以自动生成消息映射代码,使用起来还算方便。但和VCL的委托模型相比,MFC的映射方法就显得太落后了。而Delphi的Object Pascal因为没有"标准负担",语言引入了组件、事件处理、属性等新特性。由于功夫做在编译器级,生成的源代码就显得十分简洁。似乎VC是"让框架迁就语言",而Delphi是"让语言迁就框架"。   

  我想举一个对字符串操作的封装的例子来说明MFC和VCL的优缺点。在MFC中,CStringList类有加入、获取、删除等功能,但VCL的TStringList类除了上述功能还有排序、从逗号分隔的字串读入、流输入输出等功能。但同样的字符串替换功能,VCL的StringReplace要比MFC的CString::Replace慢2-3倍。总的来说,VCL的封装比MFC更为高层,更为抽象,但不可避免地带来的问题是某些部分执行效率比MFC略低。这就象低级语言(如汇编)的执行效率比高级语言(如Basic)高,但编程效率较低。鱼和熊掌不可兼得嘛。   

  VCL比之MFC的另一优点是对异常处理的支持,而一大缺点是对多线程支持差。VCL的大部分都不是针对多线程优化的。虽说VCL提供了简化多线程操作的类,但只是工作者线程(worker threads)使用起来比较简单。如果线程要和界面打交道的话事情就变得麻烦了,因为除了应用程序的主线程,任何线程不能访问任何可视的VCL部件。你不得不使用Synchronize方法等待主线程处理它的消息,然后在主线程中访问VCL部件。而MFC就没有这样的限制。

稳定性与完善程度:VC是老大哥

  VC要比Delphi稳定和完善。VC的发展历史比Delphi长,微软的总体实力比Inprise强。VC的框架MFC经历了那么多年的发展和完善,功能非常全面,而且十分稳定,bug很少。其中你可能遇到的bug也更少。而且有第三方的专门工具帮助你避开这些bug。如此规模的一个类库,能做到这一点不容易。不要小看了这一点,很多专业程序员就是为这个选择VC的。因为尽管VCL比MFC的抽象程度高,封装较为高层,但由此带来的开发效率的提高对高手来说毕竟是有限的。而如果你遇到一个怪问题,调试了半天,发现不是你的代码有错,而是VCL的bug,你作何感想?虽说遇到这类问题的可能性很小,但对VCL的形象的影响可不小。Delphi的IDE太占资源,启动速度太慢,和某些显卡驱动程序冲突,VCL中有bug,调试器不够健壮,对不稳定的第三方控件没有防护措施 …… 问题多多,在这方面Delphi不如VC。希望Inprise能更上一层楼。顺便说一下,我们在网上看到有些人极言Delphi的不稳定,说几分钟出现20多次非法操作。Delphi的确不如Visual C++稳定,但也不至于如此呀。我估计是那位朋友的Delphi装了某些有问题的第三方控件,导致了Delphi的频频出错。不妨卸下那些控件试试?

可移植性:立足现实,放眼未来

  Inprise正在开发Delphi的Linux版本,代号为Kylix。也许通过Kylix,用VCL构架编写的Windows程序向Linux移植成为可能。但这只是可能。因为在目前Inprise的兼容性工作做得并不好。低版本的Delphi不能使用高版本的VCL组件,而高版本的Delphi竟然不能使用低版本的VCL组件。真是岂有此理,我们很少看见软件有不向下二进制兼容的。如果Windows 98不能运行95的程序,Windows 95不能运行3.x的程序,Win 3.x不能运行DOS程序,你还会用Windows吗?如果Windows 95的程序必须经过重新编译才能在98下运行,98会卖得那么好吗?"同门兄弟"C++Builder和Delphi也不能互相使用对方的组件,甚至同一套VCL库的文件名也不一样。所以一个组件有for D1/D2/D3/D4/D5/C1/C3/C4/C5这些不同版本是常有的事,而且随着Delphi和C++Builder版本的升级可能还会增加。希望Inprise能先解决同门兄弟的兼容性问题。而微软的VC就没有这类问题。MFC1.0的程序也可以毫无障碍地在VC6.0下编译通过。

集成界面:宏观与微观

  就大处说,VC的集成界面是不如Delphi的。Delphi仅仅一个Object Inspector就可以将VC的一堆Wizards比下去,何况它还有Code Explorer、ToDo List等。但从小处,又可以看出Delphi的不成熟。比如"自动完成"功能的智能化程度和提示详细程度不如VC,响应速度也没有VC快。

  Visual C++所带的MSDN是一部"开发者的百科全书",信息庞大,查询方便,这方面比Delphi更专业。很多帮助项都有源程序示范。

  Delphi的OpenTools是完全面向第三方的开放系统,开发者可以修改很多Borland公司自身的功能,从IDE的可扩充性上说Delphi更好。

调试:细微之处见真功

  Visual C++和Delphi的调试功能都非常强大,同时都具有单步可视化调试、断点跟踪、运行时改变变量、鼠标指向可以得到变量值等等功能。对DLL的输入输出也能方便的管理,能够进行源码级别的调试。

  相对而言,Visual C++能够更加方便地看到变量的变化情况,这包括对结构可以展开成数据树,从而了解每一个变量的值,每一步调试,变化了的变量会加红,从而使调试更加方便。另外,Visual C++的块内存察看比Delphi也要方便。

  当然,Delphi也有很多体贴的细微之处,比如在线程调试的时候,Delphi能够很方便地察看线程的变化,Visual C++却必须要弹出一个模式对话框。

数据库开发:Delphi一枝独秀

  数据库支持是Delphi的强项。这主要体现在Delphi与BDE的无缝集成,以及Delphi提供的那一大堆现成的数据库操作控件。这是VC望尘莫及的。目前Delphi支持BDE、ADO、InterBase三种数据库访问方式。所有的方式都能拖拉到应用程序中实现可视化操作。正是因为Delphi对数据库类的包装,使得用户操作数据库不像在Visual C++中必须从开始到最后都要干预。明显地提高了开发速度。

  Delphi中使用WebBroker控件还能很方便地构造出基于数据库的Web页面,通过HTML管理Web数据库。 Visual C++访问数据主要通过ADO和OLEDB,很多ActiveX控件也能添加数据库功能。但是没有像Paradox这样的桌面数据库,Access相对功能太弱了。也许SQL Server是不错的选择。

COM:新技术的力量

  COM是组件对象模型的缩写。它是OLE和ActiveX技术的基础,COM定义了一组API和一个二进制标准,让不同的编程语言、不同平台的彼此独立的对象相互进行通讯。

  COM是Microsoft制订的行业标准。但Delphi也为COM提供了强大的语言支持。支持接口、variant、宽字符串功能。这些对COM的封装确实比C++更方便。比如在C++(没有类框架)进行COM编程时,变体定义为oaidl.h文件中的VARIANT结构。要处理变体,必须手工调整oleaut32.dll中VariantXXXX() API函数对其进行初始化和管理,如VariantInit()、VariantCopy()、VariantClear()等等。

  Visual C++实现COM编程有一种特殊的方法就是使用ATL。ATL使用Visual C++特有的多重继承来实现COM接口。虽然不见得实现COM服务和控制更容易,但是ATL和最新COM技术的接口,基于模板的构造都比Delphi强。ATL更有利于建立小巧、快捷的COM组件程序。

  按目前通用的观点,Visual C++应用到COM服务程序更有优势,Delphi应用到COM组件程序更合适。

昨天,今天,明天

  技术的进步在很多时候是此消彼长的。当初Borland的Turbo C和Borland C++几乎是C/C++程序员唯一的选择。微软的Quick C(现在还有人知道这个产品吗?)和Microsoft C/C++从来也没有成为过主流。但Borland C++又流行了多少年呢?不久就被新崛起的Microsoft Visual C/C++压下去了。于是Inprise(原Borland)拣起了当年Turbo Pascal和Borland Pascal的辉煌(事实上Borland的成名作就是第一个Pascal编译器),全力推出了Delphi。Delphi当初推出时被称为VB杀手,但VB现在仍然活得挺好。毕竟微软是靠Basic起家的嘛,VB不是那么容易被打败的。Inprise想了想不和VB争了,使用Delphi的IDE和VCL配上C++语言,推出了C++Builder,又向Visual C++的市场发起了夹攻。C++Builder似乎是个不错的折衷选择了?再仔细想想!C++Builder的优点Delphi都有,但Delphi的优点C++Builder未必有。比如C++Builder的编译速度比VC还慢,哪能和Delphi比?而且因为VCL是Object Pascal写的,C++语言和VCL磨合得并不好。C++Builder的bug比Delphi还多,甚至Sample代码中还有错。VCL的部分功能不能使用,要靠嵌入pascal代码访问。C++Builder可用的第三方控件远没有Delphi多。   

  唉,真是金无足赤。Microsoft和Inprise,谁会笑在最后呢?

鱼和熊掌:艰难的选择

  选择一个开发工具依赖于很多不同的因素,每个人都能因为某种语言的某个缺陷而放弃学习或使用这种语言。任何程序员都希望自己喜欢的工具能达到理想的境界,通过上面不完善的比较,我想大家都有自己的看法。我们认为影响大家选择开发语言的因素主要包括:

1) 哪门语言更容易入门?
  学习一种语言需要投入大量的时间和精力。开发程序的开发成本是值得考虑的现实。一个熟练的Delphi程序员和一个熟练的VC程序员工作效率是一样的。但是,成为熟练的程序员必须很快掌握一门语言的技巧。不幸的是,目前熟练的Visual C++程序员是十里挑一。相对而言,Delphi更适合初学者。

2) 哪门语言有更多可继承的代码?
  语言代码的可重用性是加快开发效率明显方面,从早期的过程、函数到现在的组件技术都是朝这个目标在奋斗。这两种语言对代码重用的理解是不一样的,Delphi主要通过VCL控件来实现代码重用,Visual C++实现起来就比较复杂。

3) 语言自身的本性。   
  就技术(主要指应用框架)来说,Delphi目前领先于Visual C++。但稳定性和健壮性的不足又让我对Inprise"想说爱你不容易"。而VC尽管发展到今日已十分完善,但MFC框架已是明日黄花了。如果不使用MFC,目前又没有合适的替代品。根据你的需要和实际情况做选择吧。实际上Visual C++和Delphi也不是简单竞争关系。它们在许多领域并不重叠,甚至是互补的。到底怎样取舍,要根据你的项目特性决定。如果你开发系统底层的东西,需要极好的兼容性和稳定性,选Visual C++吧。你可以只调用Windows的各种API,不用MFC。如果你写传统的Windows桌面应用程序,Visual C++的MFC框架是"正统"的选择;如果界面部分占这个应用程序代码比例较大的话,或者Delphi中有相关功能的控件的话,Delphi是事半功倍的选择。如果你为企业开发数据库、信息管理系统等高层应用("高层"是相对于"低层/底层"而言的,不是说技术高级或低级),而且有比较紧的期限限制,选Delphi比较好。如果你熟悉的语言是Object Pascal,又不打算学复杂的C++,那么Delphi几乎是唯一的选择。传统的观点是:Delphi适合编写Internet/Intranet、表格制图、数据库操作、高级用户界面等等。Visual C++适合编写设备驱动、COM服务程序、科学计算、控制台(console)程序、WinCE的应用和一些小的工具等等。应用范围的不同要求好的程序员同时精通这两门语言。

4) 语言的前景和可扩充性。
  Delphi是Inprise的旗舰产品之一,前景应当还是比较乐观的,而且Inprise已经在向Linux进军了,而微软还迟迟没有动作。遗憾的是,Inprise公司Delphi的创始人已经跳槽到微软去主持Visual J++和C#项目了。但愿对Inprise冲击不会太大。

  微软的Visual C++的前景又怎样呢?Visual Studio 7.0就要推出了。这一版本将加强网络开发的特性。看来微软虽然被判解体,开发实力可是一点没打折扣。   

  另外,虽说MFC已稍显落后,但不是说它不值得学。事实上,不学MFC就等于没学VC。利用MFC框架开发程序仍然是目前开发桌面应用的主流模式,而且还会保持相当长的时间。微软公司CEO史蒂夫·巴尔默(Steve Ballmer)曾说,.NET流行还得等2-3年。那么,MFC至少还有2-3年的生命空间。在技术日新月异的IT界,2-3年实在是很长一段时间了。好好把握吧。即使你不使用MFC框架,花点时间看一下MFC的封装机制对你熟悉C++的OOP机制和Windows底层功能也是很有好处的。而VCL的源代码是Object Pascal的,对C/C++程序员就没有这个"额外"的作用了。

posted @ 2006-05-10 22:31 太极虎~宏 阅读(545) | 评论 (4)编辑 收藏
仅列出标题
共4页: 1 2 3 4