关闭

关闭

关闭

封号提示

内容

首页 编程学习指南(书目).doc

编程学习指南(书目).doc

编程学习指南(书目).doc

上传者: 4594cc 2010-12-19 评分 0 0 0 0 0 0 暂无简介 简介 举报

简介:本文档为《编程学习指南(书目)doc》,可适用于IT/计算机领域,主题内容包含编程“初学者”入门指南TOCo""hzu编程“初学者”入门指南各种计算机语言的经典书籍怎样成为优秀的软件模型设计者?修炼一名程序员的职业水准(林庆忠符等。

编程“初学者”入门指南TOCo""hzu编程“初学者”入门指南各种计算机语言的经典书籍怎样成为优秀的软件模型设计者?修炼一名程序员的职业水准(林庆忠署名原创)计算机科学与技术学习反思录计算机经典书籍编程“初学者”入门指南这篇文章大致上是我上次的一个回帖今天有空就把它整理了出来希望能造福更多的人。   首先我想说的是人各有志不是每一个计算机专业出生的人以后都会去“编程”的以前和我同寝室的同学现在在编程的人只有两个另外的六个有的去当公务员了有的去类似银行、法院这样的地方做计算机维护什么的还有一个改行了现在在做“信贷”。所以你完全有别的选择如果对编程没有兴趣建议你还是去干点别的因为没兴趣的话你坚持不下去的就算硬着头皮去学永远也只能跟在别人后面跑很痛苦的。另外考研其实是个不错的选择只可惜要考“政治”和“英语”不然我也去考了。:)   如果你是一名本科在校生的话下面的文章就是为你写的如果你刚刚开始工作不久也希望下面的内容能对你有所帮助。。。。。。 一。关于计算机本科大学四年的各种必修课  我首先想说的是并不是每一门必修课都是有用的而且确实如此。。“显然没用”的课是:“大学物理”这门课你只要做到能有分就行了。“大学物理”我们是大一学的由于高中带来的惯性我学得很认真可是现在回头来看它是最没用的一门课一点用都没有当然也许某某会说这是个“素质”问题当然如果你这么想的话也行但是我觉得如果你不是对它十分的感兴趣的话还是别在这上面花太多的时间时间宝贵呀。。“更显然没用”的如:“XX革命史”、“XX品德”我也就不废话了。。“十分有用”的它们是:“程序设计”、“数据结构”、“操作系统原理”。这三门课我觉得是整个大学四年最有用的三门课了而且是直接的有用。“程序设计”在我们的课表上全称叫做“C程序设计”其实就是教会你使用一门高级语言重要性不言而喻而且学到后面比如在学“编译原理”的时候讲到各种词法分析方法时它就会用C(我看的那本书用的是C)来写一些例子再接着讲也就是说“程序设计”这门课同时也是用来学习后面很多的课程的工具。“数据结构”可以说是“编程整件事”要使用到的核心技术之一必须要很好的理解、完全掌握这门课。“操作系统原理”包括了很多东西都应该很好的掌握比如“进程和线程”的基础知识如果你掌握的不好那你以后编“多线程”程序的时候就会碰到很多麻烦而且只有理解了操作系统才有可能编好应用软件道理很简单所用的应用软件都必须运行在操作系统之上都必须调用它的功能。  对于这三门课最好不要看国人写的教材。“操作系统原理”建议看《操作系统:设计与实现》(第二版)作者AnderwSTanenbaum等。此书中译本分上下两册上册为原理下册为Minix操作系统的源代码上册必看下册根据各人情况有选择的读一些也是好的。“数据结构”建议看《数据结构C语言描述》作者WilliamFord等但是裘宗燕的一本《数据结构C与面向对象的途径》也还行如果你们学校用它做教材的话那你勉强看看也就凑合了。至于“程序设计”书太多了《TheCProgrammingLanguage》、《CPrime》、《ThinkingInC》、《ThinkingInJava》都是好书。另外说到这里不得不提到一个问题:以前经常看到有人争论一个问题就是C、Java、(现在又多了一门C#)这三种语言到底哪种好?我们应该学习哪一种?这其实是一个无聊的争论因为它们的都是相同的所以你用“用来争论的这点时间”已经可以在“掌握它们其中之一”的前提下学完另外的两种了等你精通了这三门语言后也就不屑于这种争论了语言本身只是表现思想的一种手段罢了它们是何等的容易学习!。“有用”的课。这些课不能算是“直接的有用”也就是说它们的很多内容你过几年也许就忘得差不多了竟然也不会影响你当前的工作。但是它们是铺垫是基石。对于这些课我们的态度应该是注重基本概念做到“弄清楚大致的框架”就可以了但可以忽略不必要的细节(但也许考试的时候会考到一些细节那你就自己看着办了)。。这些课是:“微机系统与汇编语言”、“计算机组成原理”、“计算机网络”、“软件工程”、“数据库原理”、“计算机接口原理”、“编译原理”、“计算方法”、“离散数学”。“汇编”还是有用的它是你理解和学习“计算机组成原理”和“计算机接口原理”的钥匙。“计算机组成原理”和“计算机接口原理”其实是给你讲一遍计算机的硬件结构比如CPU内部是怎么回事它是怎么计算和缓存的DMA传输方式是怎么样的等等弄清楚(或者说曾经弄清楚过毕竟它们的很多东西你以后会慢慢忘记的)这些东西心里会感觉比较有底。“计算机网络”感觉上和实际的网络编程联系不大也是为你解释了一些原理性的东西看了心理比较有底:)。另外“数据库原理”除了讲一些原理以外一般还会教你SQL语法其中最难的是各种“查询”语法了但是到了实际用的时候你会发现这些是不必要的一般的“复杂查询语句”都有工具可以自动生成的不用你自己写的所以对此你不必担心。“软件工程”其实作为一个本科生来说是不可能很好的理解它的它必须要有很多实践经验以后才能体会其中的一些道理而且国内的“软件工程”教材一般都比较“教条主义”建议浏览一遍即可知道个大概了解一下大型软件的开发流程是怎么样的就可以了(并且也是需要的)至于其中的诸多概念重在理解能理解多少就理解多少千万不要去“背”没有用的。“计算方法”这门课现在可以说是实用价值剧减因为基本上所有的算法都有现成的程序库可以调用的所以大概了解一下就行了真到要自己开发算法的时候不管你当时学得再好肯定还要回过头来看这些书的因为这之间你根本不曾使用过它们早忘记了。至于“编译原理”有人认为它很重要我认为做个了解大致上知道是怎么回事就行了因为你不太可能会去开发一个编译器但是在实际中用到的机会也是有的比如我有一次编程时就需要用到“编译原理”的知识来做一个“词法分析程序”用来处理用户输入的函数表达式再调用几个库函数来做定积分但总的来说“编译原理”只对很有限的一部分程序的编写起到了实际的作用所以先了解一下等到用时再来细看。“离散数学”是前面提到的“数据结构”的理论基础如果“离散数学”学得好理解“数据结构”会更容易些所以还是花点时间看看吧。推荐一本书:《编译原理及实践》作者KennethCLouden此书附录中有一份Tiny语言编译器的源代码对照着前面的理论来看就不会像清华版的《编译原理》那样不知所云(我们当时用的就是这本教材后来我去买了KennethCLouden的《编译原理及实践》来看很多问题才豁然开朗)。  另外我想说的是“软件工程学”其实现在才处在一个初级的发展阶段CMM、XP等等的理论打得不可开交各说各的理几乎达到了互相对骂的程度。作为一个初学者特别是“实践经验缺乏”的初学者我建议你对各种理论多了解注意我指的是“了解”不是去“背”其中的条条框框当你了解了大多数现在的主流软件工程思想以后就会形成你自己的比较客观的思想了当然还需要结合一些实践的经验这是以后的事了。至于看哪些书太多太多了自己去找吧。。“不太有用”的。其实说这些课“不太有用”已经是客气的了它们其中的一些其实就是“没用”。这些课是:“自动控制原理”、“通信原理”、“电路原理”、“数字电路原理”、“模拟电路原理”、“复变函数与积分变换”、“线性代数”、“概率论与数理统计”、“高等数学”。其中“自动控制原理”和“通信原理”我感觉和实际的编程相差得实在是太远了我学过它们可是现在全忘了也不影响我现在的任何东西。“电路原理”、“数字电路原理”、“模拟电路原理”这三门课讲起来也是计算机学科的基础课我只觉得“数字电路原理”对于理解比如“计算机组成原理”和“计算机接口原理”这样的课还有一些帮助但是另两门课我实在发现不了它们到底有用在哪里比如“模拟电路原理”主要是教你“三极管的内部构造”之类的东西如果你觉得这也属于“必须要掌握的东西”的话那我也无话可说。另外“复变函数与积分变换”是“数字图象处理”(这是一门研究生课程)的基础如果以后想到Adobe去工作的人还是应该趁早学好它们但是除此以外好像也是别无他用。“线性代数”、“概率论与数理统计”和“高等数学”我倒觉得是属于所谓的“素质”了这些东西不懂好像就说不过去了但是要懂到什么程度各人自己看了。另“高等数学”也是“复变函数与积分变换”的基础。。英语。这门课很特殊很有用总之一句话现在学好了以后绝对不会后悔。:) 二。关于课外的学习  首先我想说的是如果有志以后成为“优秀的程序员”的人应该从大学就开始自己的“课外自学”了这是很必要的否则你会一开始就落在别人后面。另外不要以为“所有的基础课都学得十分的好了”就可以“用比别人短得多的时间来学会各种实际的编程技术”。(还有我想说明的是我只了解Windows编程Linux我不懂。所以你以后如果立志于Linux领域的我下面的文章对你不会有多少帮助)。主线。  作为“主线学习”。我建议这样进行:首先看这两本书:《Windows程序设计》(第五版)作者CharlesPetzold《Windows核心编程》(第四版)作者JeffreyRichter毫无疑问此两本书必看!否则你永远也不可能成为一个专业的、高级的程序员(我指Windows程序员)。另看《Windows核心编程》以前需要有“操作系统原理”的基础。同时如果学的是C(在目前C在中国仍然是使用最广泛的编程语言)只看看你们的教材是肯定不够的除了上面说的《TheCProgrammingLanguage》等书(挑一本看就够了)以外还应该看看《EffectiveC中文版》作者ScottMeyers。接下来我建议你不要去学MFC了它已经过时了而且确实不太好用我回想起当年学MFC的情景总是觉得付出和得到不成正比。这时候可以去学“NET”编程了先学一下C#的语法(TomArcher的《C#技术内幕》还算不错)你会发现它极容易可以飞速的看完因为你已经有了很好的C基础了。然后再找一本比较全面介绍“NET”的书看起现在的话我觉得《NET程序设计技术内幕》是个不错的选择作者JeffProsise。我这里不是说学“NET”就看这两本书就OK了但是作为一个“学生”能看到这里就不错了(当然你要是觉得还不够的话可以去看看JeffreyRichter的《AppliedMicrosoftNETFrameworkProgramming》)。还有在学习各种编程技术期间编一些自己的小程序是必不可少的不然的话你会学什么忘什么。最后再有时间的话学一学“设计模式”(它其实很重要的而且慢慢的你会觉得它越来越重要)书蛮多《设计模式》值得推荐(作者ErichGramma等)它是“设计模式”类书籍的宗师很不错的书“设计模式”也是要一些实践经验作铺垫的因此你可能不能完全的理解它。。支线。  作为支线也就是说我觉得它们相对次要些。并且学习它们可以不分先后次序但是我还是建议先看完上面说的前三本书(《Windows程序设计》、《Windows核心编程》、《EffectiveC中文版》)以后再来学下面的东西。  “Java”。。把“Java”作为支线一定会引起很多人的不满或者说是愤慨当然你也可以把它作为主线来学用来替代上面说的“NET”。可是根据我自己的体会“NET”拥有更多的优势如果你不同意我的观点当然可以去学“Java”没问题。但是作为一个“初学者”我还是建议你两样都学一下这样自己才能有比较才能为自己的将来选择一条更适合自己的“技术路线”。另外时间还是多的(主线中才提到了六本书)而且我这里说的“学Java”只建议你看一本书:《ThinkinginJava》这本书可以说是入门的绝佳选择至于以后怎么继续学习“Java”可以去看看蔡学庸在CSDN上的专栏文章里面讲得很详细了。   “网络编程”。。这个东西我想很多人都是比较向往的。我建议如果想做到对网络编程“比较精通”的话应该去看看《Windows网络编程技术》(第二版)作者AnthonyJones。这本书和上面讲的《Windows程序设计》属于同一个技术层次都是用“WindowsAPI”直接编程学这类东西的好处是能使你不仅“知其然”而且“知其所以然”。但是如果立志要学“Java”的也可以跳过这本书直接看《JavaNetworkProgramming》是O'Reilly的书作者我忘记了。至于“NET”方面我还没发现专门讲网络编程讲得特别好的书自己去找找吧。(其实一般的“NET”书籍中已经有大量关于网络编程的内容了)  “COM”。。“以前的学习方法”是先看《深度探索C对象模型》作者StanleyBLippman再看《COM本质论》(作者DonBox)的前面两章然后看《COM原理与应用》(作者潘爱民)再回过头来看《COM本质论》的后面部分。《COM本质论》的前面两章讲得极好它用最能让人理解的方式讲述了“什么是COM”但这本书的后面部分比较晦涩如果没有一点实际的“COM程序编写经验”就很难理解了所以我提到这里要插进来看一看潘爱民的《COM原理与应用》。但是这里有一个问题《COM原理与应用》里的应用部分使用的是MFC和ATL(抱歉我又提到了这些过时的东西我只是对它们太熟悉了)我前面曾建议大家不要去学MFC了于是产生了矛盾请恕我无知在当前的情况下我不太能肯定要怎么学习“COM”才是最有效的这里我确实不能给大家“更新的方法”了。但是现在随着“NET”的推进“COM”的生存空间似乎是越来越小了因此“到底要把COM学到什么程度”也几乎成了“到时候看情况再说”的问题了。但是我觉得无论如何了解一下“COM的基本思想”还是能带来莫大的好处它太经典了!也就是我上面说的《COM本质论》的前面两章。  “DDK”。。所谓“DDK”就是“设备驱动程序”这属于一个相对冷僻的方面但事实是“正因为它冷僻所以这方面的技术人员的收入还是不错的”但是“DDK”的知识对你学习别的很多东西(比如“NET”、“Java”)都不会带来任何的帮助它比较独立。所以我的建议是“在你还没有能力确定以后自己的专攻方向时不要去学它”因为它实在也不太好学。我对它只是略知一二所以也只能说到这里就作罢了。不过可以给你推荐一本书:《ProgrammingMicrosoftWindowsDriverModel》(作者WalterOney)。  好了好了再下面就绝对要超出“初学者”的范畴了。其实学到这里再加上你已经积累了一定的实际经验了那下面再要学些什么路要怎么走就一定会有自己独立的想法了。我就不再废话了。 三。几个初学者要注意的问题。无论在学基础课的时候还是在学实际的编程的时候都是重在理解千万不要死记硬背。比如上面说的“软件工程”就是最好的例子。有一次我碰到两个人正在讨论MFC“甲”说:“我觉得MFC真是复杂这么多的类和方法根本不知道怎么去学。”这时“乙”表示他也有同感但是已经找到了学习的方法于是“乙”很诚恳的对“甲”说:“其实有时候还是要背一些东西的你可以去买一本中文版的MFC类库手册天天背天天记慢慢的就好了。”。我当时从旁边走过打了一个冷颤。。对于MFC这种东西除了理解还要多用很多东西自然就记住了当然这么多的类和函数还是没能记住它们的确切名字和用法但是别着急你已经知道了有哪些类和方法大概是存在的所以真到用的时候再到“MSDN”里去找呗怕什么呢。。我前面提到了《Windows程序设计》和《Windows核心编程》这两本书是必看的它们都是在介绍基于“WinSDK”平台(或者说是接口)的编程也就是用“WindowsAPI”直接编程这是一种十分底层的Windows编程方法。就今天来说学习“WinSDK”编程的意义更大的在于“使你能够更彻底的理解基于它们之上的、包装得更好的、更易于使用和效率更高的各种技术以便能更好的使用它们”比如“MFC”、“NET”等等。如果你一定要在实际的开发中也直接用“WindowsAPI”来编程无疑是自讨苦吃。因此我们要鼓励使用各种开发效率更高的工具当然理解“WinSDK”平台的编程能在你使用这些高级工具的时候给你带来巨大的好处。“网络编程”也是同理我上面提到的那本《Windows网络编程技术》也是基于Winsock(它是WinSDK的一部分)的书实际编程的时候你也许不太会直接去用它。。实践很重要。这个道理是很明显的比如C的语法如果你不去用它的话就算你当初能把整本书都背下来到了大四的时候肯定也忘得差不多了。用的过程其实就是熟悉的过程在用的时候可能会发现自己某一个细节怎么又想不起来了没关系正常的再拿来书翻开看看如此反复几次也就记住了。。坚持很重要。这里有一个前提就是“你是真的对编程很有兴趣”如果确实如此那不用说你也会去不断的学习的。但如果不是这样那就很糟糕了就像我开头的时候提到的那个人他就是“实在对编程没兴趣呀”所以一直工作的很辛苦感到身心疲惫还总是落在别人后面现在终于不得以该行去作“信贷”了。。关于“高级程序员”考试。这个考试其实是名不副实的他分上午场和下午场上午考一些基础概念也就是上面提到的那些本科课程中比较重要的几门课考试难度和形式都和你们的期末考试差不多下午考编程其实就和你们的“程序设计”期末考试最后的几道编程题差不多。一句话考的是很理论的东西死读书的人一般都能通过的:)。如果你了解到你以后要去应聘的公司对这张证书比较看重的话那就花一些时间去复习一下以前的课程去拿一张证书像我的两个去当公务员的同学居然也都通过了这个考试。但是如果这张证书不是你就业的前提的话我建议你不要在这上面花时间了因为它太简单了对提高你的实际水平没有帮助的。当然这只是我的个人观点没有蔑视这项考试的意思。。也许你的志向是当一个“技术总监”或是“XX主管”之类的也就是所谓的“不写代码的人”当然很多人都这么想。但是请记住这些人其实都有着很好的实际编程经验如果没有这段经历和积累他们根本就到达不了现在的境界也不能服众。所以趁早多学一些“技术”是很必要的。。最后我想提醒各位虽然至此你可能已经觉得自己“学识满腹”了但是千万不要以为自己懂的多了就开始自以为是开始看不起别人了。我曾经有幸听过“钱能”老师的课他给我印象最深的一句话就是:“你越学就应该越是觉得自己无知啊怎么这么多东西自己都不懂呢?所以要谦虚啊要谦虚啊千万不能学了一点点东西就自认为了不起了。”(这是他在课堂上的原话。。。)各种计算机语言的经典书籍、JavaJava编程语言(第三版)Java四大名著JamesGosling(Java之父)Java编程思想(第版)Java四大名著BruceEckelJava编程思想(第版)Java四大名著BruceEckelJAVA核心技术卷I:基础知识(原书第版)Java四大名著CayHorstmannJAVA核心技术卷II:高级特性(原书第版)Java四大名著CayHorstmannEffectiveJava中文版Java四大名著JoshuaBloch精通Struts:基于MVC的JavaWeb设计与开发孙卫琴精通Hibernate:Java对象持久化技术详解孙卫琴Tomcat与JavaWeb开发技术详解孙卫琴Java与模式阎宏、c#C#程序设计CharlesPetzold“windows编程泰山北斗”C#语言“倚天屠龙双剑”C#Primer中文版StanleyBLippmanC#语言“倚天屠龙双剑”NET框架程序设计(修订版)JeffreyRichter“windows编程泰山北斗”NET平台四大天王c#Windows程序设计CharlesPetzold“windows编程泰山北斗”NET平台四大天王NET程序设计技术内幕JeffProsiseNET平台四大天王NET本质论第卷:公共语言运行库(中文版)ChrisSellsNET平台四大天王 、CC程序设计语言(特别版)c八大金刚BjarneStroustrup“C之父”CPrimer(第版)中文版c八大金刚StanleyBLippmanCPrimer(第版)中文版c八大金刚StanleyBLippmanC标准程序库自修教程与参考手册c八大金刚NicolaiMJosuttisC语言的设计和演化c八大金刚BjarneStroustrup“C之父”深度探索C对象模型c八大金刚StanleyBLippmanEssentialC中文版c八大金刚StanleyBLippmanEffectiveC中文版ndEditionc八大金刚ScottMeyersMoreEffectiveC中文版c八大金刚ScottMeyersC编程思想(第版)第卷:标准C导引BruceEckelC编程思想(第版)第卷:实用编程技术BruceEckelC程序设计谭浩强C程序设计教程(第版)钱能CPrimerPlus(第五版)中文版StephenPrata广博如四库全书Thecprogramminglanguage、cPrimer深奥如山重水复Insidethecobjectmodel程序库大全Thecstandardlibray工程经验之积累Effectivec、MoreEffectivec、Exceptionalcc八大金刚:、EssentitalclippmanC之父旁枝暂略主攻核心轻薄短小初学者、ThecprogramminglanguageC之父技术权威用词深峻思想深远c百科全书代表圣经。、cPrimerlippman纵横书市十数年c最佳教本c百科全书代表。、Insidethecobjectmodellippman揭示c底层非常好非常难。、Effectivec通过个编程实例展示专家经验行文有趣深处浅出。、MoreEffectivec----通过个编程实例展示专家经验行文有趣深处浅出。、Thecstandardlibray---c标准库的百科全书。、设计模式:可复用面向对象软件的基础------good!、cC程序设计语言(第版新版)C语言“倚天屠龙双剑”BrianWKernighan“C语言之父”CPrimerPlus中文版(第五版)C语言“倚天屠龙双剑”StephenPrataC程序设计(第三版)谭浩强C语言大全(第四版)HERBERTSCHILDTC语言接口与实现:创建可重用软件的技术DAVIDRHANSON C语言参考手册(原书第版)SamuelPHarbisonC程序设计教程HMDeitelPJDeitelC陷阱与缺陷AndrewKoenig 、VBVisualBasicNET技术内幕VB编程三剑客FrancescoBalena“vb首席大师”Windows程序设计VisualBasicNET语言描述VB编程三剑客CharlesPetzold“windows编程泰山北斗”NET框架程序设计:VisualBasicNET语言描述VB编程三剑客JeffreyRichter“windows编程泰山北斗”FrancescoBalena“vb首席大师” VisualBasic编程技术大全FrancescoBalena“vb首席大师”VisualBasicNET从入门到精通Petroutsos,E高级VISUALBASIC编程MATTHEWCURLAND  、DelphiInsideVCL(深入核心VCL架构剖析)李维Delphi高效数据库程序设计李维面向对象开发实践之路(Delphi版)李维、VCWindows程序设计(第版)CharlesPetzold“windows编程泰山北斗”Windows核心编程JeffreyRichter“windows编程泰山北斗”Windows高级编程指南JeffreyRichter“windows编程泰山北斗”深入浅出MFC(第二版)“MFC四大天王”侯捷MFCWindows程序设计(第版)MFC四大天王”JeffProsiseVisualC技术内幕(第版)MFC四大天王”DavidKruglinski深入解析MFCMFC四大天王”GeorgeShepherdVisualCNET技术内幕(第版)MFC四大天王”DavidKruglinski、VFVisualFoxpro程序设计参考手册张洪举专家门诊VisualFoxPro开发答疑问张洪举VisualFoxPro解决方案与范例大全张洪举VisualFoxPro软件开发模式与应用案例张洪举 、黑客应用密码学(协议算法与C源程序BruceSchneier网络信息安全的真相BruceSchneier黑客大曝光:网络安全机密与解决方案(第版)STUARTMCCLURE软件加密技术内幕看雪学院加密与解密软件保护技术与完全解决方案看雪学院加密与解密(第二版)段钢、汇编Intel微处理器结构、编程与接口(第六版)BarryBBrey*、奔腾机汇编语言程序设计BarryBBreyWindows环境下位汇编语言程序设计(第版)罗云彬IBMPC汇编语言程序设计(第版) 本书是国内优秀教材沈美明温冬婵IBMPC汇编语言程序设计(第五版) 这本书籍是国外优秀教材PETERABEL著,沈美明温冬蝉译、驱动开发WindowsWDM设备驱动程序开发指南ChrisCantWindowsXPWDM设备驱动程序开发(第版)武安河WINDOWSXPWDM设备驱动程序开发武安河、网络计算机网络第四版中文版网络编程三剑客AndrewSTanenbaumTCPIP详解卷本RichardStevens网络编程三剑客UNIX网络编程卷本RichardStevens网络编程三剑客用TCPIP进行网际互联DouglasEComer高级TCPIP编程JonCSnaderC网络编程DouglasSchmidtUNIX环境高级编程(第版)RichardStevens 、算法计算机程序设计艺术DonaldEKnuth算法“倚天屠龙”双剑算法导论ThomasHCormen算法“倚天屠龙”双剑离散数学及其应用KennethHRosen具体数学计算机科学基础DonaldEKnuth 、图形编程Windows图形编程FENGYUAN图形编程界的CharlesPetzold之书、数据结构数据结构C语言描述》(DataStructuresC)WilliamFord,WilliamTopp刘卫东沈官林数据结构算法与应用C语言描述》SartejSahni汪诗林孙晓东等机械工业出版社 、软件工程设计模式可复用面向对象软件的基础重构改善既有代码的设计、操作系统深入理解计算机系统(修订版)RANDALEBRYANT 、UnixUNIX网络编程卷I套接字联网API(英文版第三版UNIX编程艺术UNIX环境高级编程(英文影印第版UNIX编程“圣经UNIX环境高级编程(英文影印版)(第版)UNIX环境高级编程(第版)UNIX环境高级编程(第版)UNIX编程“圣经UNIX网络编程第卷:套接口API(第版)UNIX网络编程卷:进程间通信(第版)(英文影印版)UNIX网络编程(第二版)第卷:进程间通信UNIX编程环境UNIX网络编程卷I套接字联网API(英文版第三版UNIX系统编程UNIX环境高级编程UNIX环境高级编程(英文影印版LINUX内核分析及编程UNIX网络编程卷I套接字联网API(英文版第三版)UNIX网络编程第卷:套接口API(第版)UNIX网络编程(第二版)第卷:进程间通信UNIX网络编程卷:进程间通信(第版)(英文影印版)UNIX网络编程(第版)第卷:套接口API和XOpen传输接口APIUNIX网络编程(卷):连网的APLS:套接字与XTI(第二版)(英文影印版)UNIX环境高级编程UNIX环境高级编程(英文版)UNIX环境高级编程(第版)Unix技术手册 、LinuxLinux内核设计与实现Linux内核完全注释LINUX内核分析及编程GNULinux编程指南(第二版)Linux设备驱动程序(第三版)嵌入式设计及Linux驱动开发指南基于ARM处理器Linux设备驱动程序第三版(英文影印版)Linux内核设计与实现(第版)Linux内核设计与实现(英文影印版)(第版)linux技术手册、游戏编程Windows游戏编程大师技巧(第二版游戏之旅我的编程感悟OpenGL超级宝典:第三版OpenGL编程指南(第四版)Java游戏高级编程JME手机游戏编程入门游戏之旅我的编程感悟游戏开发中的人工智能(英文影印版)D游戏:卷动画与高级实时渲染技术面向对象的游戏开发Java游戏高级编程D游戏编程大师技巧游戏编程精粹面向对象的游戏开发D游戏卷:实时渲染与软件技术D游戏:卷动画与高级实时渲染技…JME手机游戏编程入门DirectD游戏编程入门教程(第二版… 、移动开发WindowsMobile手机应用开发SYMBIANOSC手机应用开发WindowsMobile手机应用开发傅曦齐宇徐骏SYMBIANOSC手机应用开发(第卷)RICHARDHARRISON著,周良忠王伯欣译SYMBIANOSC手机应用开发RICHARDHARRISON著,周良忠译 WindowsCEnet内核定制及应用程序开发周毓林宁杨陆贵强付林林嵌入式系统WindowsCE开发技巧与实例傅曦PalmOS编程实践绝版 、单片机单片机轻松入门周坚(平凡老师) 单片机典型模块设计实例导航求是科技例说张义和陈敌北KEILCXV单片机高级语言编程与ΜVISION应用实践徐爱钧  单片机应用程序设计技术(修订版)周航慈单片机实践与应用吴金戎MCS系列单片机实用接口技术李华、串并口通讯VisualCTurboC串口通信编程实践龚建伟VISUALBASIC与RS串行通信控制(最新版)范逸之 、电子无线电识图与电路故障分析轻松入门(第二版)胡斌无线电元器件检测与修理技术轻松入门(第二版)胡斌图表细说电子技术识图胡斌图表细说电子元器件胡斌图表细说元器件及实用电路胡斌怎样成为优秀的软件模型设计者?作者:ScottAmbler著乐林峰译本文选自:wwwumlchinacom我们期待自己成为一个优秀的软件模型设计者但是要怎样做又从哪里开始呢?将下列原则应用到你的软件工程中你会获得立杆见影的成果。人远比技术重要你开发软件是为了供别人使用没有人使用的软件只是没有意义的数据的集合而已。许多在软件方面很有成就的行家在他们事业的初期却表现平平因为他们那时侯将主要精力都集中在技术上。显然构件(components)EJB(EnterpriseJavaBeans)和代理(agent)是很有趣的东西。但是对于用户来说如果你设计的软件很难使用或者不能满足他们的需求后台用再好的技术也于事无补。多花点时间到软件需求和设计一个使用户能很容易理解的界面上。理解你要实现的东西好的软件设计人员把大多数时间花费在建立系统模型上偶尔写一些源代码但那只不过是为了验证设计过程中所遇到的问题。这将使他们的设计方案更加可行。谦虚是必须的品格你不可能知道一切你甚至要很努力才能获得足够用的知识。软件开发是一项复杂而艰巨的工作因为软件开发所用到的工具和技术是在不断更新的。而且一个人也不可能了解软件开发的所有过程。在日常生活中你每天接触到的新鲜事物可能不会太多。但是对于从事软件开发的人来说每天可以学习很多新东西(如果愿意的话)。需求就是需求如果你没有任何需求你就不要动手开发任何软件。成功的软件取决于时间(在用户要求的时间内完成)、预算和是否满足用户的需求。如果你不能确切知道用户需要的是什么或者软件的需求定义那么你的工程注定会失败。需求其实很少改变改变的是你对需求的理解ObjectToolSmiths公司(wwwobjecttoolsmithscom)的DougSmith常喜欢说:“分析是一门科学设计是一门艺术”。他的意思是说在众多的“正确”分析模型中只存在一个最“正确”分析模型可以完全满足解决某个具体问题的需要(我理解的意思是需求分析需要一丝不苟、精确的完成,而设计的时候反而可以发挥创造力和想象力译者注)。如果需求经常改动很可能是你没有作好需求分析并不是需求真的改变了。你可以抱怨用户不能告诉你他们想得到什么但是不要忘记收集需求信息是你工作。你可以说是新来的开发人员把事情搞得一团糟但是你应该确定在工程的第一天就告诉他们应该做什么和怎样去做。如果你觉得公司不让你与用户充分接触那只能说明公司的管理层并不是真正支持你的项目。你可以抱怨公司有关软件工程的管理制度不合理但你必须了解大多同行公司是怎么做的。你可以借口说你们的竞争对手的成功是因为他们有了一个新的理念但是为什么你没先想到呢?需求真正改变的情况很少但是没有做好需求分析工作的理由却很多。经常阅读在这个每日都在发生变化的产业中你不可能在已取得的成就上陶醉太久。每个月至少读、本专业杂志或者本专业书籍。保持不落伍需要付出很多的时间和金钱但会使你成为一个很有实力的竞争者。降低软件模块间的耦合度高耦合度的系统是很难维护的。一处的修改引起另一处甚至更多处的变动。你可以通过以下方法降低程序的耦合度:隐藏实现细节强制构件接口定义不使用公用数据结构不让应用程序直接操作数据库(我的经验法则是:当应用程序员在写SQL代码的时候你的程序的耦合度就已经很高了)。耦合度低的软件可以很容易被重用、维护和扩充。提高软件的内聚性如果一个软件的模块只实现一个功能那么该模块具有高内聚性。高内聚性的软件更容易维护和改进。判断一个模块是否有高的内聚性看一看你是否能够用一个简单的句子描述它的功能就行了。如果你用了一段话或者你需要使用类似“和”、“或”等连词则说明你需要将该模块细化。只有高内聚性的模块才可能被重用。考虑软件的移植性移植是软件开发中一项具体而又实际的工作不要相信某些软件工具的广告宣传(比如java的宣传口号writeoncerunmany译者注)。即使仅仅对软件进行常规升级也要把这看得和向另一个操作系统或数据库移植一样重要。记得从位Windows移植到位windows的“乐趣”吗?当你使用了某个操作系统的特性如它的进程间通信(IPC)策略或用某数据库专有语言写了存储过程。你的软件和那个特定的产品结合度就已经很高了。好的软件设计者把那些特有的实现细节打包隐藏起来所以当那些特性该变的时候你的仅仅需要更新那个包就可以了。接受变化这是一句老话了:唯一不变的只有变化。你应该将所有系统将可能发生的变化以及潜在需求记录下来,以便将来能够实现(参见“ArchitectingforChange”ThinkingObjectively,May)通过在建模期间考虑这些假设的情况你就有可能开发出足够强壮且容易维护的软件。设计强壮的软件是你最基本的目标。不要低估对软件规模的需求Internet带给我们的最大的教训是你必须在软件开发的最初阶段就考虑软件规模的可扩充性。今天只有人的部门使用的应用程序明天可能会被有好几万人的组织使用下月通过因特网可能会有几百万人使用它。在软件设计的初期根据在用例模型中定义的必须支持的基本事务处理确定软件的基本功能。然后在建造系统的时候再逐步加入比较常用的功能。在设计的开始考虑软件的规模需求避免在用户群突然增大的情况下重写软件。性能仅仅是很多设计因素之一关注软件设计中的一个重要因素性能这好象也是用户最关心的事情。一个性能不佳的软件将不可避免被重写。但是你的设计还必须具有可靠性可用性便携性和可扩展性。你应该在工程开始就应该定义并区分好这些因素以便在工作中恰当使用。性能可以是也可以不是优先级最高的因素我的观点是给每个设计因素应有的考虑。管理接口“UMLUserGuide”(GradyBoochIvarJacobson和JimRumbaugh,AddisonWesley,)中指出你应该在开发阶段的早期就定义软件模块之间的接口。这有助于你的开发人员全面理解软件的设计结构并取得一致意见让各模块开发小组相对独立的工作。一旦模块的接口确定之后模块怎样实现就不是很重要了。从根本上说如果你不能够定义你的模块“从外部看上去会是什么样子”你肯定也不清楚模块内要实现什么。走近路需要更长的时间在软件开发中没有捷径可以走。缩短你的在需求分析上花的时间结果只能是开发出来的软件不能满足用户的需求必须被重写。在软件建模上每节省一周在将来的编码阶段可能会多花几周时间因为你在全面思考之前就动手写程序。你为了节省一天的测试时间而漏掉了一个bug在将来的维护阶段可能需要花几周甚至几个月的时间去修复。与其如此还不如重新安排一下项目计划。避免走捷径只做一次但要做对(doitoncebydoingitright)。别信赖任何人产品和服务销售公司不是你的朋友你的大部分员工和高层管理人员也不是。大部分产品供应商希望把你牢牢绑在他们的产品上可能是操作系统数据库或者某个开发工具。大部分的顾问和承包商只关心你的钱并不是你的工程(停止向他们付款看一看他们会在周围呆多长时间)。大部分程序员认为他们自己比其他人更优秀他们可能抛弃你设计的模型而用自己认为更好的。只有良好的沟通才能解决这些问题。要明确的是不要只依靠一家产品或服务提供商即使你的公司(或组织)已经在建模、文档和过程等方面向那个公司投入了很多钱。证明你的设计在实践中可行在设计的时候应当先建立一个技术原型或者称为“端到端”原型。以证明你的设计是能够工作的。你应该在开发工作的早期做这些事情因为如果软件的设计方案是不可行的在编码实现阶段无论采取什么措施都于事无补。技术原型将证明你的设计的可行性从而你的设计将更容易获得支持。应用已知的模式目前我们有大量现成的分析和设计模式以及问题的解决方案可以使用。一般来说好的模型设计和开发人员都会避免重新设计已经成熟的并被广泛应用的东西。http:wwwambysoftcomprocessPatternsPagehtml收藏了许多开发模式的信息。研究每个模型的长处和弱点目前有很多种类的模型可以使用,如下图所示。用例捕获的是系统行为需求数据模型则描述支持一个系统运行所需要的数据构成。你可能会试图在用例中加入实际数据描述但是这对开发者不是非常有用。同样数据模型对描述软件需求来说是无用的。每个模型在你建模过程中有其相应的位置但是你需要明白在什么地方什么时候使用它们。在现有任务中应用多个模型当你收集需求的时候考虑使用用例模型用户界面模型和领域级的类模型。当你设计软件的时候应该考虑制作类模型顺序图、状态图、协作图和最终的软件实际物理模型。程序设计人员应该慢慢意识到仅仅使用一个模型而实现的软件要么不能够很好地满足用户的需求要么很难扩展。教育你的听众你花了很大力气建立一个很成熟的系统模型而你的听众却不能理解它们甚至更糟-连为什么要先建立模型都不知道。那么你的工作是毫无意义的。教给你开发人员基本的建模知识否则他们会只看看你画的漂亮图表然后继续编写不规范的程序。另外你还需要告诉你的用户一些需求建模的基础知识。给他们解释你的用例(usescase)和用户界面模型以使他们能够明白你要表达地东西。当每个人都能使用一个通用的设计语言的时候(比如UML译者注)你的团队才能实现真正的合作。带工具的傻瓜还是傻瓜你给我CADCAM工具请我设计一座桥。但是如果那座桥建成的话我肯定不想当第一个从桥上过的人因为我对建筑一窍不通。使用一个很优秀的CASE工具并不能使你成为一个建模专家只能使你成为一个优秀CASE工具的使用者。成为一个优秀的建模专家需要多年的积累不会是一周针对某个价值几千美元工具的培训。一个优秀的CASE工具是很重要但你必须学习使用它并能够使用它设计它支持的模型。理解完整的过程好的设计人员应该理解整个软件过程尽管他们可能不是精通全部实现细节。软件开发是一个很复杂的过程还记得《objectorientedsoftwareprocess》第页的内容吗?除了编程、建模、测试等你擅长工作外还有很多工作要做。好的设计者需要考虑全局。必须从长远考虑如何使软件满足用户需要如何提供维护和技术支持等。常做测试早做测试如果测试对你的软件来说是无所谓的那么你的软件多半也没什么必要被开发出来。建立一个技术原型供技术评审使用以检验你的软件模型。在软件生命周期中越晚发现的错误越难修改修改成本越昂贵。尽可能早的做测试是很值得的。把你的工作归档不值得归档的工作往往也不值得做。归档你的设想以及根据设想做出的决定归档软件模型中很重要但不很明显的部分。给每个模型一些概要描述以使别人很快明白模型所表达的内容。技术会变基本

用户评论(0)

0/200

精彩专题

上传我的资料

每篇奖励 +2积分

资料评价:

/53
2下载券 下载 加入VIP, 送下载券

意见
反馈

立即扫码关注

爱问共享资料微信公众号

返回
顶部