阅读我们的学科——计算机专业学习浅谈:二、把握全局,学习计算机导论

2006/11/21 | 08:20 | 分类:学习随感 | 标签: | 940次阅读

阅读我们的学科——计算机专业学习浅谈
(北理计算机学院新闻社《九歌》专栏文章)

二、把握全局,学习计算机导论

  当你对计算机学科涉及的领域有所了解后,就应该着手展开专业学习了。初读本专业的教学计划与课程设置,你或许会被诸如离散数学、编译原理、接口技术等生疏的课程名称弄得一头雾水。这些课程都是研究什么的?它们各自与我们面前的计算机有哪方面的联系?要回答这类问题,首先需要把握全局,从整体上认识计算机科学。

  国内高等院校一般都为大一学生开设计算机基础课程。这类课程的受众面广,主要涉及计算机基础应用知识。各种版本的计算机基础教程几乎都以计算机科学导论作为开篇。对于把计算机作为应用工具的其他专业的学生而言,导论只算是“内容概要”,他们往往更注重后面的应用型知识;而对于把计算机作为研究对象的我们,则决不能忽略这类指导性的内容。专门地、有意识地学好计算机科学导论,能够使你对计算机科学有一个大局观,清楚地认识到每一个分支学科的研究领域与重要意义,从而在今后的具体学习中明确方向,加深理解。

  依我个人的学习经验,建议初学者阅读一些国外优秀计算机基础与导论教材。与国内大多数讲解软硬件具体使用的同类教材相比,国外教材更偏重以应用为切入点,深入浅出地阐述计算机科学原理。诸如《计算机文化(第8版)》(《New Perspectives on Computer Concepts》,中文版,机械工业出版社)、《计算机科学导论》(《Foundations of Computer Science: From Data Manipulation to Theory of Computation》,中文版,机械工业出版社):前者适合于各种信息类专业的学生或计算机爱好者阅读。该书图文并茂,语言生动,从应用角度出发,广泛涉及计算机软件、硬件、网络的基本原理,同时概述了计算机学科的历史背景与行业现状。随书的光盘中给出了不少影音材料,在学习的同时还可以提高计算机专业英语听说能力。后者在风格上与前者类似,但内容更适合计算机专业学生阅读,被美国不少高校定为计算机专业学生的入门课。它以实例作为出发点,系统地讲解了计算机组成、计算机网络、操作系统、数据结构、算法设计等分支学科的研究领域、基本原理和应用方向,而几乎不涉及晦涩的数学模型与实现细节。阅读此类书籍,可以在潜移默化中理清初学者对于计算机科学学习的思路。

  计算机科学是一个有机联系的整体,每个分支都或多或少地与其它分支存在依赖关系。如果死板地依照教学计划线性地进行学习,往往会遇到知识理解上的问题。例如算法分析课程与程序设计课程分属理论与实践;组成原理课程与体系结构课程是对计算机系统不同层面的剖析。我们不能简单地找出它们的先修、后修关系,这样难以建立完整的知识体系。因此在把握大局之后,我们仍有必要简单了解一下每个分支学科的基础知识。在这方面,推荐大家阅读《编程卓越之道(第一卷):深入理解计算机》(《WRITE GREAT CODE: Volume 1:Understanding the Machine》,中文版,电子工业出版社)这本书。分开来看每一章节,其内容编排结构与国内高校计算机课程体制相近,涵盖了逻辑代数、数字电路、机器指令、体系结构、存储器管理等方面的基础知识和实现方法,特别是阐明了各个分支学科之间的本质联系。有了这些基础之后,在遇到更高阶的问题时,你至少会明白这个问题应该在哪个分支学科中寻找答案了。

  当你有了一定的计算机理论基础,尤其是程序设计基础后,想更加深入地把握计算机科学的脉络,不妨看看这本书:《深入理解计算机系统(修订版)》(《Computer Systems A Programmer's Perspective》,中文版,中国电力出版社)。它与《编程卓越之道》系列的共同特点是从程序员的视角观察计算机系统。而这本书作为国外数十所高校的计算机系统导论教材,其组织更加严密,风格更加严谨。它以“程序在计算机中如何执行”为主线,全面阐述计算机系统内部实现的诸多细节。当你在学习数据结构、组成原理和体系结构等课程和时候,翻阅一下此书的相应章节,同时编程实现其中的例子,一定会对课本上单纯的文字型理论有更加感性的认识——原来它们是这样活生生地存在于我的计算机里的!

  正所谓“会当凌绝顶,一览众山小”,从计算机科学全局的高度整体把握其分支学科,在头脑中率先构建计算机科学的整体框架并为其夯实最基层的结构,就能够为你在未来每一步的学习中扫清迷雾,指明方向。

阅读我们的学科——计算机专业学习浅谈:一、广泛了解,从科普书籍开始

2006/11/04 | 00:00 | 分类:学习随感 | 标签: | 814次阅读

阅读我们的学科——计算机专业学习浅谈
(北理计算机学院新闻社《九歌》专栏文章)

一、广泛了解,从科普书籍开始

  选择计算机专业的同学,也许是因为原先有一定的基础,也许是因为一时的激情,但更多的人,可能对自己的选择没有深刻的认识,或多或少对计算机专业有一些神秘的感觉。自己究竟是否喜欢这个学科?才华能够在哪个分支领域有所施展?抑或是真的不适合这个专业?诸多疑问,解决的方法首先便是了解和认识我们的学科。浓厚的兴趣是学好任何学科的源泉;而广泛的了解则是获得兴趣的途径。当今我们对于信息的获取已非难事,其中“阅读”是一个简洁而有效的方法。

  也许你认为阅读专业书籍对于刚刚步入大学的自己来说有点困难,也很枯燥,那么不妨先从科普书籍看起。科普书籍是了解理论、获得应用知识最好的途径。相信不少理工科的同学被量子物理和相对论搞得头昏脑胀过。究其原因,是我们的现实生活与抽象的数学模型之间存在思想意识上的鸿沟。然而要是读读斯蒂芬·霍金的《时间简史》,你就会被书中有趣的故事和例证所吸引,从而对抽象的理论有了感性的认识——即使仍然没有读懂,你也至少了解了这个学科研究的领域和目标是什么,也必然有所收获。所有理工学科都有这样的性质,计算机专业也不例外。

  我们知道,计算机理论是建立在数学基础之上的。大学计算机专业对数学的要求较高,其重要性不必多言。数学令不少同学头痛,除了其“繁”与“难”外,很大程度上是因为他们没有理解这些抽象理论的实际应用方向。与本科数学专业的课程设置相比,计算机专业的数学课程大都偏重实用性。比如我们的离散数学课程中涉及到的逻辑代数奠定了计算机一切运算的基础,形式语言构成了计算机程序编译的模型,代数系统则是当前各类数据库系统的理论依据等等。因此,如果能够提前地了解到并简单地学习一下这些数学知识的具体应用,对理解理论是很有益处的。此外,电子学、信号与系统、控制理论等也是计算机专业学生必修的公共课,然而不少同学往往认为它们与计算机专业的关系不大,从而放松了学习。事实上这些学科是计算机硬件与网络通信的基础,学好这方面知识的前提是认识它们的现实应用及其与计算机的密切联系。

  也许你将来学习图论的时候,对“欧拉路”的概念会很清晰,这是因为你在小时候的图画书上玩过“一笔画”的游戏;然而“二分图”、“生成树”这些概念又是怎么回事呢?你的理解可能就不是那么深刻了——因为你一时难以找到一些生活中的实例,并从中抽取出特性。在这种情况下,翻阅一些涉及这些知识的科普书籍就十分有必要了。我曾读过一套《数学游戏》(《科学美国人》杂志汇编,中文版:科学技术文献出版社),它将图论、逻辑代数、自动机理论等领域的抽象的概念具体化为一个个有趣的故事,引导读者了解这些知识的现实应用,启发读者将抽象思维与感性生活有机结合。我还读过一本《编码的奥秘》(《CODE》,中文版:机械工业出版社),它则将逻辑代数、数字电路、汇编语言等知识以实物和简单电路的形式进行类比,揭示其中的原理,并引导读者动手实践。事实上这类与计算机专业相关的科普书籍还有很多,在学习课本的间隙阅读一下,绝对能起到催化剂的作用。

  谈到科普书籍,相关的另一个问题便是计算机科学与计算机技术之间的关系。也许不少同学选择计算机专业,是源于对计算机令人眼花缭乱的应用的认识。所谓计算机技术,一般是指包括文字处理、信息管理、多媒体、网站建设等在内的计算机应用技术;而所谓计算机科学,一般指数据结构、组成原理、操作系统、编译原理等计算机内部实现机制。前者是计算机在各行各业提高生产力的体现,属于各类职业教育和专科教育的范畴;而后者是研究是计算机本身的理论,是本科计算机教学的重点。市面上大多数计算机书籍与杂志是计算机应用技术方面的,属“技术普及型”,从受众角度来看与科普书籍有着类似的性质。适当地涉猎一些自己感兴趣的应用技术,对培养学习兴趣、增强实践能力、了解业界行情是很有好处的。不过如果确实想在计算机行业长期做下去,仍然应当将主要精力放在对计算机科学的学习方面。毕竟用科学的理论指导实践是大学教育的意义所在。

  总之,广泛了解计算机学科基础科普知识,在今后学习具体理论的时候才会少一些盲目,多一些顿悟。

分清程序“所在路径”和“执行路径”

2006/09/14 | 21:49 | 分类:Windows开发 | 标签: | 729次阅读

  我的一个程序在执行时需要调用其所在路径下的数据文件。这个程序在独立运行时没有问题,但用第三方程序将其作为子进程加载后,却发生了无法找到数据文件的错误。其原因:我是通过相对路径查找数据文件的,在由第三方程序调用该程序时,执行路径是第三方程序所在路径,所以无法通过原相对路径找到数据文件。因此,我们有必要明确程序的“所在路径”和“执行路径”,才能正确地处理相对路径文件引用。

  下面给出C、C#和Python中,获取程序“所在路径”和“执行路径”的方法。其中的C程序只在Windows下有效,在Linux下缺乏现成的函数,需要“曲线”现实,可参见coldcrane的专栏《Linux下GetModuleFileName的四种写法》一文。

  1. #include <stdio.h>
  2. #include <windows.h>
  3.  
  4. #define MAXPATH 256
  5.  
  6. int main()
  7. {
  8.     char str[MAXPATH];
  9.  
  10.     GetModuleFileName(NULL, str, MAXPATH);
  11.     *(strrchr(str, '\\')) = '\0';
  12.     printf("The program is in: %s\n", str);
  13.  
  14.     getcwd(str, MAXPATH);
  15.     printf("The program runs at: %s\n", str);
  16.  
  17.     return 0;
  18. }
  1. using System;
  2.  
  3. namespace CSharp
  4. {
  5.     class Program
  6.     {
  7.         static void Main(string[] args)
  8.         {
  9.             string str;
  10.  
  11.             str = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
  12.             str = str.Substring(0, str.LastIndexOf("\\"));
  13.             Console.WriteLine("The program is in: " + str);
  14.  
  15.             str = System.IO.Directory.GetCurrentDirectory();
  16.             Console.WriteLine("The program runs at: " + str);
  17.         }
  18.     }
  19. }
  1. #!/usr/bin/python
  2.  
  3. import os
  4.  
  5. if __name__ == '__main__':
  6.     print "The program is in: %s" % os.path.dirname(__file__)
  7.     print "The program runs at: %s" % os.getcwd()

  附:Windows下简单测试的方法。在以上代码末尾添加诸如getchar()一类的暂停效果指令,编译之(当然Python就不用了),对生成的可执行文件建立快捷方式,修改快捷方式的属性,将“Start in(起始位置)”设为有别于程序所在路径的其它位置。运行这个快捷方式,观察“The program is in:”与“The program runs at:”的不同。

Live.com系列网站的界面语言设置

2006/08/15 | 20:22 | 分类:Web与移动平台 | 标签: | 570次阅读

  一些朋友由于使用英文版Windows系统或国外的代理服务器,在注册和使用微软Live.com系列网站服务时界面语言变成了英文或中英文夹杂的。如果不习惯英文,可以将大多数服务改为中文界面。但微软在语言设置方面做得不是很直观,将语言设置藏在了一些不显眼的地方。

  Live.com主页:右上角“Settings”——下拉菜单“Language”,选择“中国”。

  Live.com帐户:左边“Feedback”——右上角“English (United States)”,选择“Simpified Chinese (China)”。(一般来说如果先修改Live.com主页语言,再进入Live.com帐户,界面语言将自动与Live.com主页一致)

  Hotmail:右上角“Options”——左边“Personal”——中间“Language”,选择“简体中文”。

  Spaces:这个最隐蔽,没有在界面上出现语言选项。从其帮助网页的一段晦涩的文字中找到了答案:请访问http://space_name.spaces.live.com/?mkt=xx-xx,其中,space_name是共享空间的名称,xx-xx是相应语言网址的四个字母。如简体中文为zh-cn。

  看来Live.com的人性化工作仍待改善。

“理治棋壮”中国象棋计算机博弈引擎开发总结

2006/08/12 | 22:36 | 分类:团队合作 | 标签: | 1,039次阅读

  “理治棋壮”中国象棋计算机博弈引擎作为北京理工大学2004级软件基础实习项目,自2006年7月初启动以来,在黄鸿、黄远灿、陈朔鹰、汤建平、李凌等领导和老师的关怀指导下,由开发小组林健、高然、应张彬、武斌四位成员分工合作,完成了基础但完整的程序编码,撰写了详细的书面说明与程序文档,并成功参加了全国首届中国象棋计算机博弈锦标赛,获得“新秀奖”。

“理治棋壮”中国象棋计算机博弈引擎开发总结

  计算机博弈是人工智能领域公认的最具挑战性的科研课题之一,中国象棋是一个标准的博弈问题。但中国内地计算机博弈研究起步较晚,理论成果和成熟产品少。小组成员在接到这个项目后积极收集资料,检索到该领域先驱的一些论文,借阅了《PC游戏编程(人机博弈)》等相关书籍,下载过数个开源的中国象棋与国际象棋软件。通过一周的学习研究,我们了解了计算机博弈的基本理论和博弈程序的经典架构,以及业界的一些标准与常见象棋软件的使用习惯。

  考虑到对现有资源的充分利用及项目将来的持续开发问题,我们决定将此项目做成遵循GPL许可的开源项目。在决定程序现实方式时,我们有两种选择:一是独立开发界面、核心在内的所有功能,二是开发算法引擎,协同第三方象棋界面程序工作。考虑到参赛时间因素,我们选择了后者。这也体现了我们本次软件基础实习项目以提高数据结构和算法设计能力为核心目的。而在引擎协议方面,我们选择了简单易懂但功能强大、诞生刚刚2年而蓬勃发展的UCCI协议。从后来的锦标赛上18个队伍中有7个使用UCCI协议引擎看来,我们的这个选择是正确的。通用的协议使我们的引擎可以与强大的界面程序配合进行功能测试和性能调试;可以与他人开发的引擎进行自动化对战,便于比较分析,改进算法。

  小组成员根据个人特长和实际能力进行了分工:林健有一定的项目开发经验,负责设计程序架构,编写博弈树搜索模块,管理文档;应张彬和武斌算法分析能力强,负责编写着法生成模块、局面评估模块等,并进行单元测试;高然象棋知识丰富,负责整体黑盒测试,局面评估值审定和测试用例管理。

“理治棋壮”中国象棋计算机博弈引擎开发总结

  依小组成员普遍掌握的技能和程序效率需要,我们决定使用GNU C++语言编码。我们对程序进行迭代开发,持续完善。在搭建基础框架后首先与界面程序进行命令行方式的通信实验,保证通信畅通。在完成着法生成模块后立即编写测试程序及测试用例,并连接界面程序进行随机走棋实验。有了搜索和评估模块后,程序便可以正常运行并马虎地与人对弈了,此时我们一方面用一系列典型的局面测试添加新的代码后棋力的变化,一方面将程序交给小组外的同学试用,收集意见与建议。之后我们添加了静态搜索、迭代深化搜索、置换表、开局库、局势变化策略、时间分配策略等增强型功能,在添加每一段代码后,都要将原有的测试用例运行一遍,检验新功能的效果,同时避免bug的引入。

  比赛前夕,我们又特别针对参赛用计算机的性能优化了搜索参数,并根据比赛章程的要求改善了时间分配策略。在比赛当日凌晨,连夜运行测试用例,保证了最后参赛版本的稳定性。

  终因实力悬殊,我们以2胜7负1和积5分的预赛战绩,在18支队伍中名列第15名,失去了出线机会。但小组成员没有因此而气馁。参加比赛是本着学习的态度和交流的精神,利用比赛的机会提高自身的算法水平与象棋技艺。总结比赛失利原因,客观方面由于我们时间仓促,从设计到实现仅用一个月的时间,中途还不能放松其它课程的学习。主观方面我们没有深入理解某些核心算法,将一些既有理论简单撮合,不能充分发挥棋力。

“理治棋壮”中国象棋计算机博弈引擎开发总结

  通过比赛与交流,我们找到了程序总体改进方向。我们需要重新审核核心算法,将算法优化整合;加入完善的调试输出,随时掌控机器思路;编写辅助程序实现大量局面自动化连续测试,自动分析测试结果;使用神经网络、遗传算法等自学习技术调整评估函数,节约人力。比赛之后,我们将程序源代码发布在了UCCI电脑象棋联赛的网站,同时商议了将源代码挂靠在sourceforge.net便于持续开发的事宜。

  总结小组成员一个月以来的学习、开发、参赛过程,总体而言,达到了软件基础实习的课程要求。小组成员体会了多人合作开发的苦与乐,巩固了数据结构基础知识,提高了算法分析与设计能力,实践了软件工程与OOAD基本思想。通过相互协作,取长补短,提高了每个人的团队合作精神和学习创新能力。

  合作开发过程中,小组内部也出现过一些问题。例如开会的守时问题。参赛程序版本的定夺问题等,都曾引起过小组成员的争论,但我们均以大局为重,团结协商,妥善解决。

  在本次项目开发过程中,我们要感谢指导老师黄鸿的关怀指导。她实时关注开发进度,帮我们联系开发交流场所与校内象棋高手,并安排了参赛相关事宜,准备了参赛用的高性能计算机等。为我们提供了这次与高手过招、学习交流的机会。

  同时我们要感谢软件学院2003级学长赵陈翔。我们在学习计算机博弈理论的时候得到了他的帮助指导。在开局库筛选和局面评估值审定方面,他给出了不少可行的建议,并实地参与了调试。“理治棋壮”这一名称也是项目启动之初由赵陈翔所取。

  我们还要特别感谢UCCI协议制定者、上海格尔软件工程师黄晨。我们的程序参考并引用了他的部分开源代码。这次比赛他也参加了。比赛期间,我们与他进行了广泛的交流,向他请教了一些技术和非技术问题,都得到了满意的答复。

  比赛虽已结束,但我们的脚步没有停止。我们已与指导老师沟通,希望将计算机博弈项目在我校坚持下去,建立持续的开发团队与良好的学习氛围,争取在不久的将来为校争光!

页面存档: 上页 1 2 3 ...35 36 37 38 39 ...47 48 49 下页