怎么将自己的产品做到第一个10万用户?


-
小芒果导读:一款产品最难的阶段的往往是最初的1M的用户积累,起步远比我们想的要难,就像开车一样,起步到五档的过程,特别耗油。那么如何获取用户?小编整理了知乎上票数最多和干货类的回答给大家参考。移动端产品,目前已经出了demo,需要一定的优化可以上线,当然这段时间对于找风投机构也是有些犹豫;但是最大的盲点在于上线后怎么将用户做到10万;我们想努力尝试,等有了一定的成绩在去做出选择。前辈们可以各种角度出发:方式方法、产品类型、产品本身具备的素质、需求等。之前听到的一个故事,现在找出来,供你参考:进价18元的裤子卖50元为什么净赚52元有一次和一个伯伯聊天,他无意间说起了年轻时做过的一单生意,让我这

303KB
怎么将自己的产品做到第一个10万用户?
2021-02-20小芒果导读:一款产品最难的阶段的往往是最初的1M的用户积累,起步远比我们想的要难,就像开车一样,起步到五档的过程,特别耗油。那么如何获取用户?小编整理了知乎上票数最多和干货类的回答给大家参考。移动端产品,目前已经出了demo,需要一定的优化可以上线,当然这段时间对于找风投机构也是有些犹豫;但是最大的盲点在于上线后怎么将用户做到10万;我们想努力尝试,等有了一定的成绩在去做出选择。前辈们可以各种角度出发:方式方法、产品类型、产品本身具备的素质、需求等。之前听到的一个故事,现在找出来,供你参考:进价18元的裤子卖50元为什么净赚52元有一次和一个伯伯聊天,他无意间说起了年轻时做过的一单生意,让我这
30KB
微信十万加文章阅读器 v1.3.rar
2019-07-17微信十万加文章阅读器是一款最新的微信公众号热门文章公布程序,为广大用户提供当前国内最热门各类微信公众号爆文,第一时间了解受最欢迎的热点,同时帮助广大用户更好的进行微信公众号运营,协助大家快速做到微信阅读量10W ,软件下载使用完全免费,想知道如何做到微信文章十万加,此好用的微信文章阅读工具绝对是你做公众号的必备神器。 微信十万加文章阅读器 v1.3更新内容: 1. 搜索微信号 2. 导出数据 3. 优化文章排版 微信十万加文章阅读器截图
12.39MB
自己动手写操作系统(含源代码).part1
2010-10-18内容简介 本书从只有二十行的引导扇区代码出发,一步一步地向读者呈现一个操作系统框架的完成过程。书中不仅关注代码本身,同时关注完成这些代码的思路和过程。本书不同于其他的理论型书籍,而是提供给读者一个动手实践的路线图。读者可以根据路线图逐步完成各部分的功能,从而避免了一开始就面对整个操作系统数万行代码时的迷茫和挫败感。书中讲解了大量在开发操作系统中需注意的细节问题,这些细节不仅能使读者更深刻地认识操作系统的核心原理,而且使整个开发过程少走弯路。本书分上下两篇,共11章。其中每一章都以前一章的工作成果为基础,实现一项新的功能。而在章的内部,一项大的功能被分解成许多小的步骤,通过完成每个小的步骤,读者可以不断获得阶段性的成果,从而让整个开发过程变得轻松并且有趣。 本书适合各类程序员、程序开发爱好者阅读,也可作为高等院校操作系统课程的实践参考书。 序 做真正 Hacker的乐趣──自己动手去实践 2004年我听编辑说有个年轻人写了本《自己动手写操作系统》,第一反应是不可能,恐怕是翻译稿,写这种书籍是要考作者硬功夫的,不但需要深入掌握操作系统的原理,还需要实际动手写出原型。 历史上的 Linux就是这么产生的,Linus Torvalds当时是一名赫尔辛基大学计算机科学系的二年级学生,经常要用自己的电脑去访问大学主机上的新闻组和邮件,为了方便读写和下载文件,他自己编写了磁盘驱动程序和文件系统,这成为了 Linux第一个内核的雏形。 我想中国有能力写出内核原型的程序员应该也有,但把这个题目写成一本书,感觉上不会有人愿意做这件事情,作者要花很多时间,加上主题比较硬,销售量不会太高,经济上回报有限。 但拿来文稿一看,整个编辑部大为惊艳,内容文笔俱佳,而且绝对原创,马上决定在《程序员》连载。2005年博文视点出版的第一版也广受好评。 不过有很多读者还是质疑:现在软件编程主要领域是框架和应用,还需要了解操作系统底层吗? 经过四年的磨练成长,于渊又拿出第二版的书稿《Orange'S:一个操作系统的实现》,这本书是属于真正 Hacker的。我虽然已经有多年不写代码了,但看这本书的时候,让我又重新感受到做程序员的乐趣:用代码建设属于自己的系统,让电脑听从自己的指令,对系统的每个部分都了如指掌。 黑客(hacker)实际是褒义词,维基百科的解释是喜欢用智力通过创造性方法来挑战脑力极限的人,特别是他们所感兴趣的领域,例如软件编程或电气工程。个人电脑、软件和互联网等划时代的产品都是黑客创造出来的,如苹果的 Apple电脑、微软的 Basic解释器、互联网的 Mosaic浏览器。 回答前面读者的质疑,学软件编程并不需要看这本书,想成为优秀程序员和黑客的朋友,我强烈建议你花时间来阅读这本书,并亲自动手实践。正如于渊在本书结尾中所说“我们写自己的操作系统是出于一种好奇,或者说一种求知欲。我希望这样不停地‘过把瘾’能让这种好奇不停地延续”。 好奇心是动力的源泉,追究问题的本质是优秀黑客的必备素质,只有充分掌握了系统原理,才能在技术上游刃有余,才能有真正的创新和发展。中国需要更多真正的黑客,也希望更多的程序员能享受属于黑客的创造乐趣。 蒋涛 2009年 4月 作者自序 本书是《自己动手写操作系统》的第二版,通过一个具体的实例向读者呈现一个操作系统雏形的实现过程。有关操作系统的书籍资料可以找到很多,但是关注如何帮助读者实现一个试验性操作系统的书籍却不多见,本书便是从一个简单的引导扇区开始,讲述一个操作系统成长的故事,以作读者参考之用。 本书面向实践,通过具体实例教读者开发自己的操作系统。书中的步骤遵循由小到大、由浅入深的顺序,跟随这些步骤,读者可以由一个最简单的引导扇区开始,逐渐完善代码,扩充功能,最后形成一个小的操作系统。 本书不仅介绍操作系统的各要素,同时涉及开发操作系统需要的各个方面,比如如何建立开发环境、如何调试以及如何在虚拟机中运行等。书中的实例操作系统采用IA32作为默认平台,所以保护模式也作为必备知识储备收入书中,而这是传统的操作系统实践书籍经常忽略的。总之,只要是开发自己的操作系统中需要的知识,书中都尽量涉及,以便于读者参考。 众所周知,一个成型的操作系统往往非常复杂。如果考虑到操作系统作为软硬件桥梁的特殊地位,那么它可能看上去比一般的软件系统更难理解,因为其核心部分往往包含许多直接针对CPU、内存和 I/O端口的操作,它们夹杂在一片代码汪洋之中,显得更加晦涩。 我们有许多源代码公开的操作系统,可供随时下载和阅读,看上去好像让实现一个供自己把玩的微型操作系统变得容易很多,但事实往往不尽人意,因为这些代码动辄上万甚至几十几百万行,而且细节之间经常互相关联,要理解它们着实不易
42.39MB
让Oracle跑得更快:Oracle10g性能分析与优化思路--详细书签版
2013-02-06CruiseYoung提供的带有详细书签的电子书籍目录 http://blog.csdn.net/fksec/article/details/7888251 让Oracle跑得更快:Oracle10g性能分析与优化思路 本信息 作者: 谭怀远 丛书名: ITPUB技术丛书 出版社:电子工业出版社 ISBN:9787121113253 上架时间:2010-8-6 出版日期:2010 年8月 开本:16开 页码:438 版次:1-1 编辑推荐 国内第一本真正意义上从工作经验出发,以作者的心得体会全面论述Oracle数据库性能优化的书籍。 作者内心经历的表白,站在全局角度对性能做
9.21MB
自己动手写操作系统(含源代码).part2
2010-10-18内容简介 本书从只有二十行的引导扇区代码出发,一步一步地向读者呈现一个操作系统框架的完成过程。书中不仅关注代码本身,同时关注完成这些代码的思路和过程。本书不同于其他的理论型书籍,而是提供给读者一个动手实践的路线图。读者可以根据路线图逐步完成各部分的功能,从而避免了一开始就面对整个操作系统数万行代码时的迷茫和挫败感。书中讲解了大量在开发操作系统中需注意的细节问题,这些细节不仅能使读者更深刻地认识操作系统的核心原理,而且使整个开发过程少走弯路。本书分上下两篇,共11章。其中每一章都以前一章的工作成果为基础,实现一项新的功能。而在章的内部,一项大的功能被分解成许多小的步骤,通过完成每个小的步骤,读者可以不断获得阶段性的成果,从而让整个开发过程变得轻松并且有趣。 本书适合各类程序员、程序开发爱好者阅读,也可作为高等院校操作系统课程的实践参考书。 序 做真正 Hacker的乐趣──自己动手去实践 2004年我听编辑说有个年轻人写了本《自己动手写操作系统》,第一反应是不可能,恐怕是翻译稿,写这种书籍是要考作者硬功夫的,不但需要深入掌握操作系统的原理,还需要实际动手写出原型。 历史上的 Linux就是这么产生的,Linus Torvalds当时是一名赫尔辛基大学计算机科学系的二年级学生,经常要用自己的电脑去访问大学主机上的新闻组和邮件,为了方便读写和下载文件,他自己编写了磁盘驱动程序和文件系统,这成为了 Linux第一个内核的雏形。 我想中国有能力写出内核原型的程序员应该也有,但把这个题目写成一本书,感觉上不会有人愿意做这件事情,作者要花很多时间,加上主题比较硬,销售量不会太高,经济上回报有限。 但拿来文稿一看,整个编辑部大为惊艳,内容文笔俱佳,而且绝对原创,马上决定在《程序员》连载。2005年博文视点出版的第一版也广受好评。 不过有很多读者还是质疑:现在软件编程主要领域是框架和应用,还需要了解操作系统底层吗? 经过四年的磨练成长,于渊又拿出第二版的书稿《Orange'S:一个操作系统的实现》,这本书是属于真正 Hacker的。我虽然已经有多年不写代码了,但看这本书的时候,让我又重新感受到做程序员的乐趣:用代码建设属于自己的系统,让电脑听从自己的指令,对系统的每个部分都了如指掌。 黑客(hacker)实际是褒义词,维基百科的解释是喜欢用智力通过创造性方法来挑战脑力极限的人,特别是他们所感兴趣的领域,例如软件编程或电气工程。个人电脑、软件和互联网等划时代的产品都是黑客创造出来的,如苹果的 Apple电脑、微软的 Basic解释器、互联网的 Mosaic浏览器。 回答前面读者的质疑,学软件编程并不需要看这本书,想成为优秀程序员和黑客的朋友,我强烈建议你花时间来阅读这本书,并亲自动手实践。正如于渊在本书结尾中所说“我们写自己的操作系统是出于一种好奇,或者说一种求知欲。我希望这样不停地‘过把瘾’能让这种好奇不停地延续”。 好奇心是动力的源泉,追究问题的本质是优秀黑客的必备素质,只有充分掌握了系统原理,才能在技术上游刃有余,才能有真正的创新和发展。中国需要更多真正的黑客,也希望更多的程序员能享受属于黑客的创造乐趣。 蒋涛 2009年 4月 作者自序 本书是《自己动手写操作系统》的第二版,通过一个具体的实例向读者呈现一个操作系统雏形的实现过程。有关操作系统的书籍资料可以找到很多,但是关注如何帮助读者实现一个试验性操作系统的书籍却不多见,本书便是从一个简单的引导扇区开始,讲述一个操作系统成长的故事,以作读者参考之用。 本书面向实践,通过具体实例教读者开发自己的操作系统。书中的步骤遵循由小到大、由浅入深的顺序,跟随这些步骤,读者可以由一个最简单的引导扇区开始,逐渐完善代码,扩充功能,最后形成一个小的操作系统。 本书不仅介绍操作系统的各要素,同时涉及开发操作系统需要的各个方面,比如如何建立开发环境、如何调试以及如何在虚拟机中运行等。书中的实例操作系统采用IA32作为默认平台,所以保护模式也作为必备知识储备收入书中,而这是传统的操作系统实践书籍经常忽略的。总之,只要是开发自己的操作系统中需要的知识,书中都尽量涉及,以便于读者参考。 众所周知,一个成型的操作系统往往非常复杂。如果考虑到操作系统作为软硬件桥梁的特殊地位,那么它可能看上去比一般的软件系统更难理解,因为其核心部分往往包含许多直接针对CPU、内存和 I/O端口的操作,它们夹杂在一片代码汪洋之中,显得更加晦涩。 我们有许多源代码公开的操作系统,可供随时下载和阅读,看上去好像让实现一个供自己把玩的微型操作系统变得容易很多,但事实往往不尽人意,因为这些代码动辄上万甚至几十几百万行,而且细节之间经常互相关联,要理解它们着实不易
30KB
世界各国电网关口和工商用户电能表的更新国外电能表
2010-03-152010年国外智能电表发展趋势——中国智能电网电力市场改革因能调动社会各方面投资办电的积极性,合理配置资源,降低电价和促进合理节约用电而受到世界各国的重视,故能迅速发展和取得较大的经济效益。 电力市场的发展对电能计量提高了新的要求。例如,需量电价和分时电价实施范围的扩大;电厂竞价上网要求计量0.5或1小时时段电量实施实时电价并有扩大到用户的趋势;电能质量监控和无功计量也已提上日程;预付费、网上处理电费、接电和断电等多种电子商务的发展,以及自动抄表(AMR)功能用于结算和监视表计的实施等等。 这些不断发展的新要求是已使用了上百年的传统感应式电能表和原有管理模式难以满足,因而促进了电能计量从技术、设备到运营组织方式的巨大改革和发展。下面我们 介绍一下国外这方面的发展情况。1、国际经验的评估和借鉴 我国电力市场发展已经从电厂竞价上网起步,在东北和华东电网正式实施。评估近年来国际上电力市场发展进程中电能计量的发展,以供我国借鉴、参改很有必要,下面分四个方面进行评述。 1.1世界各国电网关口和工商用户电能表的更新 世界各国电网关口和工商用户电能表基本上已全部更新为电子式电能表。 电网关口用0.2或0.5级表;工商用户用0.2、0.5或1级表。这类表的功能包括有功、无功电能,需量,负荷曲线(带时标的时段电量),分时计量和通信接口,选项还有负荷控制等,当然,可靠而完备的软、硬件安全措施也是必备的。 欧洲国家工业化基础好,标准化工业扎实。我国不少电能表标准均源自IEC,而IEC是由欧盟EN标准和德国DIN标准发展而来的。研究欧洲国家发展电能表的经验是有益的。 北欧四国和法国早在1995年,英国于1994~1995年,德国、西班牙和比利时在1997~1998年,最迟的意大利也已在1999年全部完成了工商用户电能表的100%电子化。在1988~1999年德、西、意、比四国曾使用过混合式电能表,但那仅是过渡。 为什么欧洲特青睐于电子式电能呢?除了其易于实现多功能,便于自动抄表,具有通信功能和可靠性高外,北欧四国还看重其在大温度范围(-40~+60℃)下能克服感应表的精度变化大和超差的缺点。 1.2居民住宅用电能表的逐步电子化 法国1990~1992年试用10万只电子式电能表取得经验后,已于2001年起停止购置感应表,每年购95万只电子表以逐步淘汰感应表。 意大利已决定于2002~2005年间全部更新其2600万只感应表为带AMR(自动抄表)功能的电子式表。这种表还带有内置断路器(带遥控和保护功能);并考虑到非线性负荷的增长,增设无功功率测量功能。 英国目前已更换其80%居民表为电子式表,且保有13%电子式预付费表。其他欧洲各国也多准备于2005年前后开始考虑感应表的全部更新问题。 Niagra Mohawk是美国纽约州的一个国家电网公司,该公司鉴于Plexus Reseach公司在新英格兰电网中140万户AMR工程的成效以及自己已在万维网上实施在线付费,并考虑用户服务的需要,决定自2003年起在25个月内更新其150万只感应表为Schlumberger Sema公司的电子式电能表(工商用户用SENTINEL型,居民用户用CENTRON型)并和包括50万只煤气表在内的全部200万只表计上实施AMR项目。该公司已在《国际计量》杂志上刊登广告求售其更换下的150只感兴表(包括GE的150S、155S、1160S和1170S型共60万只,Schlumberger的J4S、J5S型共25万只,ABB的D4S和D5S型共18万只以及L&G的MS和MX型共35万只等)。 1.3表计数据采集、计费计算业务从电力公司分离,实施专业化运营 为便于供售电公司精力集中改进用户服务和提高市场竞争力,也便于各种售电公司共享有关表计数据,各国已将表计数据采集、计费计算业务从电力公司中分离出来,实施专业化运营。 英国是电力市场改革的先驱,早在1992年就建立了UKDOS(英国数据采集服务公司)承担发、供售、用户计量数据采集管理和计算出账单等业务。1994年开放>100kW用户可自选供售电商的另售电力市场,1997年扩大到全部用户。1999年电价比1990年下降29%。市场竞争促使电价下降,而这也带来大量用户改变其供售电商的问题。例如2000年即有300万用户更换其供售电商(占全部用户2200万的13.6%)。如果没有UKDOS就难以实现在这种市场状况下的抄表和结算。 UKDOS从1992年起就建立MV-90电表数据采集系统和Star数据库系统。1994年起在线运行采集包括半小时电量的发、供、电交易电量,1998年扩大到全部用户。值得注意的是UKDOS也负责对尚无通信通道的约32万户小用户的抄表和数据处理工作。 UKDOS按用户所属的供售电商
60.21MB
Oracle Database 9i10g11g编程艺术:深入数据库体系结构(第2版)--详细书签版
2013-02-03CruiseYoung提供的带有详细书签的电子书籍目录 http://blog.csdn.net/fksec/article/details/7888251 Oracle Database 9i/10g/11g编程艺术:深入数据库体系结构:第2版(世界顶级专家Thomas Kyte力作) 基本信息 原书名: Expert Oracle Database Architecture: Oracle Database Programming 9i, 10g, and 11g Techniques and Solutions, Second Edition [ 原出版社: Apress 作者: (美)Thomas Kyte 译者: 苏金国 王小振 丛书名: 图灵程序设计丛书 数据库 出版社:人民邮电出版社 ISBN:9787115244857 上架时间:2011-1-5 出版日期:2011 年1月 开本:16开 页码:706 版次:2-1 编辑推荐 久负盛名的Oracle经典 世界顶级专家Thomas Kyte力作 Ask Tom!解决你所有的Oracle疑难杂症 内容简介 本书是一本关于oracle database 9i、10g 和11g 数据库体系结构的权威图书,涵盖了所有重要的oracle 体系结构特性,包括文件、内存结构和进程,锁和闩,事务、并发和多版本,表和索引,数据类型,分区和并行,以及数据加密等,并利用具体的例子来全面介绍每个特性,不仅讨论了各个特性是什么,还说明了它是如何工作的,如何使用这个特性来开发软件,以及有关的常见陷阱。 本书面向所有oracle 数据库应用开发人员和dba。 作译者 作者 Thomas Kyte Oracle公司核心技术集团副总裁。从5.1.1c版本开始使用Oracle,自7.0.9版本发布就一直任职于Oracle公司,帮助Oracle数据库用户设计和构建系统,或者对系统进行重构和调优。此前曾是一位系统集成师,主要为美国军方和政府部门的客户构建大规模的异构数据库和应用。长期主持Oracle Magazine “Ask Tom”专栏,热心回答困扰全世界Oracle开发人员和DBA的各种问题。除本书外,还著有广受好评的《Oracle专家高级编程》和《Oracle高效设计》。 作者: Thomas Kyte Thomas Kyte是Oracle公司核心技术集团的副总裁,从Oracle 7.0.9版本开始就一直任职于Oracle公司,不过,其实他从5.1.5c版本就开始使用Oracle了。 在Oracle公司,Kyte专门负责Oracle数据库,他的任务是帮助使用Oracle数据库的客户,并与他们共同设计和构建系统,或者对系统进行重构和调优。在进入Oracle公司之前,Kyte是一名系统集成人员,主要为美国军方和政府部门的客户构建大规模、异构数据库。 Thomas Kyte就是主持Oracle Magazine Ask Tom专栏和Oracle公司同名在线论坛的那个Tom,他通过这一方式热心地回答困扰着Oracle开发人员和DBA的各种问题。 目录 封面 -40 版权声明 -38 译者序 -37 序 -36 第1版序 -34 前言 -31 致谢 -24 配置环境 -23 目录 -5 第1章 开发成功的Oracle应用 1 1.1 我的方法 2 1.2 黑盒方法 3 1.3 开发数据库应用的正确(和不正确)方法 10 1.3.1 了解Oracle体系结构 11 1.3.2 理解并发控制 19 1.3.3 多版本控制 22 1.3.4 数据库独立性 28 1.3.5 怎么能让应用运行得更快 42 1.3.6 DBA与开发人员的关系 44 1.4 小结 45 第2章 体系结构概述 46 2.1 定义数据库和实例 47 2.2 SGA和后台进程 52 2.3 连接Oracle 54 2.3.1 专用服务器 54 2.3.2 共享服务器 56 2.3.3 TCP/IP连接的基本原理 57 2.4 小结 59 第3章 文件 60 3.1 参数文件 61 3.1.1 什么是参数 62 3.1.2 遗留的init.ORA参数文件 65 3.1.3 服务器参数文件 67 3.1.4 参数文件小结 72 3.2 跟踪文件 73 3.2.1 请求的跟踪文件 74 3.2.2 针对内部错误生成的跟踪文件 78 3.2.3 跟踪文件小结 82 3.3 警告文件 83 3.4 数据文件 85 3.4.1 简要回顾文件系统机制 86 3.4.2 Oracle数据库中的存储层次体系 87
11.11MB
用TCP/IP进行网际互联 第二卷:设计、实现与内核(第三版)(ANSI C版)--详细书签版
2012-10-12CruiseYoung提供的带有详细书签的电子书籍目录 http://blog.csdn.net/fksec/article/details/7888251 用TCP/IP进行网际互联第二卷:设计、实现与内核(第三版) 基本信息 原书名:Internetworking With TCP/IP Vol Ⅱ:Design,Implementation,and Internals Third Edition 作者: (美)Douglas E.Comer David L.Stevens 译者: 张娟 王海 黄述真 丛书名: 国外计算机科学教材系列 出版社:电子工业出版社 ISBN:7505366300 上架时间:2001-5-28 出版日期:2001 年4月 页码:518 版次:1-1 所属分类:计算机 > 计算机网络 > 网络协议 > TCP/IP 教材 > 计算机教材 > 本科/研究生 > 计算机专业教材 > 计算机专业课程 > 计算机网络 内容简介 本书是一部有关计算机网络的经典教科书。它是目前美国大多数大学里所开设的计算机网络课程的主要参考书。目前国内外能见到的各种有关TCP/IP的书籍,其主要内容均出自本书。本书的特点是:强调原理、概念准确、深入浅出、内容丰富且新颖。 全书共分为三卷。第一卷介绍了TCP/IP的基本概念,第二卷在第一卷的基础上,进一步详细讨论了TCP/IP的实现过程,这一卷的突出特点是非常注重实际。本书作者利用程序代码实现了TCP/IP的每一个具体细节,并且所有的代码在书中均可找到,这对于读者深入了解并掌握TCP/IP的细节内容大有帮助。各章之后附有很多习题,内容全面且结合实际。全书最后还有三个附录,分别给出了过程调用交叉参考表、程序代码中用到的c数据结构交叉参考表以及xinu函数和常量。本书可供计算机和通信专业的研究生、高年级本科生作为教科书和学习参考书,也可供各种从事科研的人员参考。 作译者 Douglas Comer博士是TCP/IP协议和因特网的国际公认专家。自20世纪70年代末、80年代初形成因特网以来,他就一直致力于因特网的研究工作,他也是负责指导因特网开发的因特网结构委员会(IAB)的成员,该委员会是确定互联网发展标准的权威机构, 还是CSNET技术委员会的主席和CSNET执行委员会的成员。 Comer为一些公司提供网络设计和实现的咨询,还给全世界的技术和非技术人员开TCP/IP和互联网络的专业讲座。他的操作系统Xinu以及TCP/IP协议的实现在他的书中都有介绍,并且应用到了商业产品中. Comer是Purdue大学计算机科学系的教授,他主要教授计算机网络、互联网络和操作系统的课程,并进行相关的研究.除了撰写一系列畅销的技术书籍外,他还是《Software—PracticecandcExperience》杂志的北美地区编辑.Comer是ACM会员(Fellow). 其他的信息可查询以下网址:www.cs.purdue.deu/people/comer 目录 封面 -24 封底 -23 书名 -22 版权 -21 出版说明 -20 前言 -17 序言 -16 目录 -14 第1章 引言与概述 1 1.1 TCP/IP协议 1 1.2 了解细节的必要性 1 1.3 协议间交互作用的复杂性 1 1.4 本书采用的方法 2 1.5 研究代码的重要性 2 1.6 Xinu操作系统 2 1.7 本书其余部分的组织 3 1.8 小结 3 深入研究 4 第2章 操作系统中的TCP/IP软件结构 5 2.1 引言 5 2.2 进程的概念 5 2.3 进程的优先级 6 2.4 进程的同步通信 6 2.5 进程间通信 8 2.5.1 端口 8 2.5.2 消息传送 9 2.6 设备驱动程序和输入、输出程序 9 2.7 网络的输入和中断 10 2.8 向高层协议传递分组 11 2.9 IP协议与传输协议之间的数据报传递 12 2.9.1 将传入的数据报发送给TCP 12 2.9.2 将传入的数据报发送给UDP 12 2.10 向应用程序的传递操作 13 2.11 输出时的信息流 13 2.12 从TCP经过IP到网络输出 14 2.13 UDP输出处理 15 2.14 小结 15 深入研究 16 习题 16 第3章 网络接口层 18 3.1 引言 18 3.2 网络接口抽象模型 18 3.2.1 接口数据结构 18 3.3 以太网的基本定义 21 3.3.1 应用中的统计数据 24 3.4 接口的逻辑状态 24 3.5 本地主机接口 24 3.6 缓冲区管理 25 3.6.1 大缓冲区方案 25 3.6.2 链表方案(mbuf) 26 3.6.3 方案举例 26 3.6.4 有关缓冲区的其他议题 26 3.7 传入分组的多路分解 27 3.8 小结 28 深入研究 29 习题 29 第4章 地址的发现及绑定(ARP) 30 4.1 引言 30 4.2 ARP软件在理论上的结构 30 4.3 ARP设计方案举例 30 4.4 ARP高速缓存的数据结构 31 4.5 ARP输出处理 34 4.5.1 搜索ARP高速缓存 34 4.5.2 ARP请求分组的广播 35 4.5.3 输出过程 36 4.6 ARP输入处理 38 4.6.1 向表中增加已转换的表项 38 4.6.2 发送等待发送的分组 39 4.6.3 ARP输入过程 40 4.7 ARP高速缓存的管理 42 4.7.1 高速缓存表项的分配 42 4.7.2 高速缓存的定期维护管理 43 4.7.3 释放队列中的分组 44 4.8 ARP初始化 45 4.9 ARP参数配置 46 4.10 小结 46 深入研究 47 习题 47 第5章 IP:软件的总体结构 48 5.1 引言 48 5.2 中心环节 48 5.3 IP软件设计思想 48 5.4 IP软件结构和数据报流程 49 5.4.1 选择传入数据报的策略 49 5.4.2 允许IP进程被阻塞 51 5.4.3 IP使用的常量的定义 54 5.4.4 校验和的计算 57 5.4.5 处理定向广播 57 5.4.6 识别一个广播地址 59 5.5 IP首部中的字节顺序 60 5.6 向IP发送数据报 61 5.6.1 发送本地生成的数据报 61 5.6.2 发送传入数据报 63 5.7 表格的维护 63 5.8 小结 65 深入研究 65 习题 65 第6章 IP:选路表和选路算法 67 6.1 引言 67 6.2 路由维护和查找 67 6.3 选路表结构 67 6.4 选路表数据结构 68 6.5 路由的生成源及保持时间 70 6.6 为数据报选择路由 70 6.6.1 实用过程 70 6.6.2 获得一个路由 73 6.6.3 数据结构初始化 74 6.7 选路表的定期维护 75 6.7.1 增加路由 77 6.7.2 删除路由 80 6.8 IP选项处理 82 6.9 小结 83 深入研究 83 习题 84 第7章 IP:分片与重组 85 7.1 引言 85 7.2 数据报的分片 85 7.2.1 为一个数据报片再次分片 85 7.3 分片的实现 85 7.3.1 发送一个数据报片 87 7.3.2 复制数据报首部 89 7.4 数据报的重组 90 7.4.1 数据结构 90 7.4.2 互斥操作 91 7.4.3 在链表中加入一个数据报片 91 7.4.4 溢出时的丢弃 93 7.4.5 测试一个完整的数据报 94 7.4.6 将数据报片组装成完整的数据报 96 7.5 数据报片链表的维护管理 97 7.6 初始化 99 7.7 小结 99 深入研究 100 习题 100 第8章 IP:差错处理(ICMP) 101 8.1 引言 101 8.2 ICMP报文格式 101 8.3 ICMP报文的实现 101 8.4 传入ICMP报文的处理 103 8.5 ICMP重定向报文的处理 105 8.6 设置子网掩码 107 8.7 为一个ICMP分组选择源地址 108 8.8 生成ICMP差错报文 109 8.9 避免出现关于差错报文的差错报文 111 8.10 为ICMP报文分配缓冲区 112 8.11 ICMP报文中的数据部分 114 8.12 ICMP重定向报文的生成 116 8.13 小结 117 深入研究 117 习题 117 第9章 IP:组播处理(IGMP) 119 9.1 引言 119 9.2 维护组播主机群的成员信息 119 9.3 主机群表 119 9.4 查找一个主机群 121 9.5 向主机群表中增加一个表项 122 9.6 为一个组播地址设置网络接口 124 9.7 IP组播地址和硬件组播地址之间的转换 125 9.8 从主机群表中删除一个组播地址 126 9.9 加入一个主机群 127 9.10 维持与一个组播路由器的联系 129 9.11 IGMP成员关系报告的实现 130 9.12 计算随机时延 131 9.13 发送IGMP报告的进程 132 9.14 处理输入的IGMP报文 133 9.15 脱离主机群 134 9.16 IGMP数据结构的初始化 136 9.17 小结 137 深入研究 137 习题 137 第10章 UDP:用户数据报 138 10.1 引言 138 10.2 UDP端口和多路分解处理 138 10.2.1 成对通信使用的端口 138 10.2.2 多对一通信使用的端口 138 10.2.3 操作模式 139 10.2.4 多路分解处理中的细节问题 139 10.3 UDP的输入处理 141 10.3.1 UDP数据结构的说明 141 10.3.2 传入数据报队列的说明 142 10.3.3 UDP端口号与队列的映射 144 10.3.4 分配空闲队列 144 10.3.5 网络字节顺序与本机字节顺序之间的相互转换 145 10.3.6 处理一个已到达的数据报 146 10.3.7 UDP校验和的计算 148 10.4 UDP输出的处理 149 10.4.1 一个UDP数据报的发送 150 10.5 小结 151 深入研究 152 习题 152 第11章 TCP:数据结构和输入处理 153 11.1 引言 153 11.2 TCP软件概览 153 11.3 传输控制块 153 11.4 TCP报文段格式 158 11.5 序列空间中的比较 159 11.6 TCP有限状态机 160 11.7 状态变迁举例 160 11.8 有限状态机的说明 161 11.9 TCB的分配及初始化 163 11.9.1 分配一个TCB 163 11.9.2 释放一个TCB 164 11.10 有限状态机的实现 165 11.11 处理一个输入报文段 165 11.11.1 将TCP首部转换为本地字节顺序 167 11.11.2 计算TCP的校验和 168 11.11.3 为报文段查找对应的TCB 169 11.11.4 检查报文段的有效性 171 11.11.5 为当前状态选择一个过程 172 11.12 小结 173 深入研究 173 习题 173 第12章 TCP:有限状态机的实现 175 12.1 引言 175 12.2 CLOSED状态处理 175 12.3 从容关闭 175 12.4 关闭后的延迟计时 176 12.5 TIME-WAIT状态处理 177 12.6 CLOSING状态处理 178 12.7 FIN-WAIT-2状态处理 179 12.8 FIN-WAIT-1状态处理 180 12.9 CLOSE-WAIT状态处理 181 12.10 LAST-ACK状态处理 182 12.11 ESTABLISHED状态处理 183 12.12 处理报文段中的紧急数据 184 12.13 处理报文段中的其他数据 186 12.14 经常注意已接收的八位组 188 12.15 终止一个TCP连接 190 12.16 建立TCP连接 191 12.17 初始化TCB 191 12.18 SYN-SENT状态处理 193 12.19 SYN-RECEIVED状态处理 194 12.20 LISTEN状态处理 196 12.21 为一个新TCB初始化窗口变量 197 12.22 小结 199 深入研究 199 习题 199 第13章 TCP:输出处理 200 13.1 引言 200 13.2 TCP输出控制的复杂性 200 13.3 TCP输出的四种状态 200 13.4 作为一个进程的TCP输出 201 13.5 TCP输出报文 201 13.6 对输出状态和TCB编号的编码 202 13.7 TCP输出进程的实现 202 13.8 互斥操作 203 13.9 IDLE状态的实现 203 13.10 PERSIST状态的实现 204 13.11 TRANSMIT状态的实现 205 13.12 RETRANSMIT(重发)状态的实现 206 13.13 发送一个报文段 206 13.14 计算TCP数据长度 210 13.15 序号计算 210 13.16 其他TCP过程 211 13.16.1 发送复位 211 13.16.2 转换成网络字节顺序 213 13.16.3 等待输出缓冲空间 213 13.16.4 唤醒等待TCB的进程 214 13.16.5 选择初始序号 216 13.17 小结 217 深入研究 217 习题 217 第14章 定时器管理 218 14.1 引言 218 14.2 定时事件的通用数据结构 218 14.3 TCP事件使用的数据结构 219 14.4 定时器、事件和报文 220 14.5 TCP定时器进程 220 14.6 删除TCP定时器事件 222 14.7 删除一个TCB的所有事件 223 14.8 确定出现一个事件的尚需时间 224 14.9 插入TCP定时器事件 225 14.10 启动无时延的TCP输出 227 14.11 小结 227 深入研究 228 习题 228 第15章 流量控制和自适应重发 229 15.1 引言 229 15.2 自适应重发中的难题 229 15.3 自适应重发的调整 229 15.4 重发定时器和退避 230 15.4.1 Karn算法 230 15.4.2 重发输出状态的处理 230 15.5 基于窗口的流量控制 231 15.5.1 糊涂窗口综合症 232 15.5.2 接收方预防糊涂窗口 232 15.5.3 零窗口之后的性能优化 233 15.5.4 调整发送方的窗口 233 15.6 最大报文段长度的计算 235 15.6.1 发送方的最大报文段长度 235 15.6.2 选项处理 236 15.6.3 通告一个最大输入报文段长度 238 15.7 网络拥塞预防与控制 239 15.7.1 成倍递减法 239 15.8 慢启动和拥塞预防 239 15.8.1 慢启动 239 15.8.2 超过上限后减速递增 240 15.8.3 递增拥塞窗口尺寸的实现 240 15.9 平均往返时间估值及超时 242 15.9.1 一种快速平均值更新算法 242 15.9.2 传入确认的处理 243 15.9.3 为窗口外的数据创建确认报文段 245 15.9.4 接收到一个确认后改变输出状态 246 15.10 技巧和注意事项 247 15.11 小结 247 深入研究 248 习题 248 第16章 紧急数据处理和推功能 250 16.1 引言 250 16.2 带外信令 250 16.3 紧急数据 250 16.4 标准的解释 250 16.4.1 带外数据的解释法 251 16.4.2 数据标记解释法 252 16.5 为Berkeley紧急指针解释法而进行的配置 252 16.6 通知应用程序 253 16.6.1 多个并发应用程序 253 16.7 从TCP中读取数据 254 16.8 发送紧急数据 255 16.9 TCP的推功能 256 16.10 在失序交付时对推数据的解释 257 16.11 输入时推功能的实现 257 16.12 小结 258 深入研究 258 习题 259 第17章 套接层的接口 260 17.1 引言 260 17.2 通过设备形成的接口 260 17.2.1 单字节I/O 261 17.2.2 其他一些非传送的函数 261 17.3 作为设备的TCP连接 262 17.4 TCP客户程序举例 262 17.5 TCP服务器程序举例 263 17.6 TCP主设备的实现 265 17.6.1 TCP主设备打开功能 265 17.6.2 被动TCP连接的形成 266 17.6.3 主动TCP连接的形成 267 17.6.4 分配一个未使用的本地端口 268 17.6.5 主动连接的完成 269 17.6.6 TCP主设备的控制 271 17.7 TCP从设备的实现 271 17.7.1 由TCP从设备输入数据 271 17.7.2 由TCP从设备输入单字节 273 17.7.3 通过TCP从设备的输出 274 17.7.4 TCP连接的关闭 276 17.7.5 TCP从设备的控制操作 278 17.7.6 接受来自被动设备的连接 279 17.7.7 改变LISTEN队列的长度 279 17.7.8 获取从设备中的统计数据 280 17.7.9 设置或清除TCP选项 282 17.8 从设备的初始化 283 17.9 小结 284 深入研究 284 习题 284 第18章 RIP:主动路由传播和被动获取 286 18.1 引言 286 18.2 主动和被动模式的参与者 286 18.3 基本的RIP算法和费用度量 286 18.4 不稳定性及解决方案 287 18.4.1 计数到无穷大 287 18.4.2 网关瘫痪和路由超时 288 18.4.3 水平划分 288 18.4.4 毒性逆转 288 18.4.5 具有毒性逆转的路由超时 289 18.4.6 触发更新 289 18.4.7 随机化以防止广播风暴 289 18.5 报文类型 290 18.6 协议特性 290 18.7 RIP的具体实现 291 18.7.1 实现的两种形式 291 18.7.2 定义 291 18.7.3 输出的理论结构 293 18.8 基本RIP进程 294 18.8.1 “必须为零”的字段内容必须为零 295 18.8.2 处理一个传入响应 296 18.8.3 在更新期间的锁定 298 18.8.4 验证一个地址 298 18.9 对输入请求的响应 299 18.10 生成更新报文 300 18.11 初始化一个更新报文的副本 301 18.11.1 向更新报文的副本中添加路由 302 18.11.2 计算一个待通告的费用值 304 18.11.3 为RIP报文分配数据报 305 18.12 生成定期的RIP输出 306 18.13 RIP的局限性 307 18.14 小结 307 深入研究 307 习题 307 第19章 OSPF:使用SPF算法的路由传播 308 19.1 引言 308 19.2 OSPF配置和选项 308 19.3 OSPF的图论模型 308 19.4 OSPF的说明 311 19.4.1 OSPF分组格式的说明 311 19.4.2 OSPF接口说明 313 19.4.3 全局常量和数据结构的说明 314 19.5 邻接关系和链路状态信息的传播 316 19.6 用Hello发现相邻网关 317 19.7 Hello分组的发送 319 19.7.1 Hello分组的一个模板 320 19.7.2 Hello分组输出进程 321 19.8 指定路由器 323 19.9 选出一个指定路由器 324 19.10 变动之后重建邻接关系 327 19.11 处理到达的Hello分组 329 19.12 在相邻网关表中增加一个网关 331 19.13 相邻网关状态的变迁 332 19.14 OSPF定时器事件和重发 333 19.15 判断是否允许邻接关系 335 19.16 OSPF输入的处理 336 19.17 链路状态处理中的说明和过程 339 19.18 数据库描述分组的生成 341 19.19 创建一个模板 343 19.20 传送数据库描述分组 344 19.21 处理到达的数据库描述分组 345 19.21.1 处理EXSTART状态下的分组 347 19.21.2 处理EXCHNG状态下的分组 348 19.21.3 处理FULL状态下的分组 349 19.22 处理链路状态请求分组 350 19.23 建立链路状态概要信息 352 19.24 OSPF实用过程 354 19.25 小结 356 深入研究 357 习题 357 第20章 SNMP:MIB变量、表示形式和绑定 358 20.1 引言 358 20.2 服务器的组织和名字的映射 358 20.3 MIB变量 359 20.3.1 表格中的字段 359 20.4 MIB变量名 360 20.4.1 变量名的数字表示形式 360 20.5 名字之间的字典顺序 360 20.6 除去前缀 361 20.7 在MIB变量上执行的操作 361 20.8 表格名 362 20.9 名字体系概念上的线索 362 20.10 MIB变量的数据结构 363 20.10.1 使用独立的函数完成操作 365 20.11 用于快速查找的数据结构 365 20.12 散列表的实现 366 20.13 MIB绑定的描述 366 20.14 绑定中使用的内部变量 373 20.15 散列表的查找 374 20.16 SNMP的结构和常量 376 20.17 ASN.1表示形式的处理 382 20.17.1 长度表示法 382 20.17.2 将整数转换为ASN.1格式 384 20.17.3 将对象标识符转换为ASN.1格式 386 20.17.4 用于转换对象值的例程 389 20.18 小结 391 深入研究 391 习题 392 第21章 SNMP:客户与服务器 393 21.1 引言 393 21.2 服务器中数据的表示形式 393 21.3 服务器的实现 393 21.4 对SNMP报文的分析 396 21.5 绑定链表中ASN.1名字的转换 400 21.6 解析一个请求 401 21.7 对get-next操作的解释 404 21.8 操作的间接执行 404 21.9 表格的间接寻址 407 21.10 应答报文的反向生成 408 21.11 将内部格式转换为ASN.1表示形式 410 21.12 服务器使用的实用函数 412 21.13 一个SNMP客户的实现 413 21.14 变量初始化 415 21.15 小结 417 深入研究 417 习题 417 第22章 SNMP:表格访问函数 419 22.1 引言 419 22.2 表格访问 419 22.3 表格的对象标识符 419 22.4 地址人口表函数 420 22.4.1 对地址人口表的get操作 421 22.4.2 对地址人口表的get-first操作 423 22.4.3 对地址人口表的get-next操作 424 22.4.4 地址入口表中的递增搜索 425 22.4.5 对地址人口表的set操作 426 22.5 地址转换表函数 426 22.5.1 对地址转换表的get操作 428 22.5.2 对地址转换表的get-first操作 429 22.5.3 对地址转换表的get_next操作 431 22.5.4 地址转换表中的递增搜索 432 22.5.5 乱中有序 433 22.5.6 对地址转换表的set操作 434 22.6 网络接口表的函数 435 22.6.1 接口表标识符的匹配 435 22.6.2 对网络接口表的get操作 436 22.6.3 对网络接口表的get-first操作 440 22.6.4 对网络接口表的get-next操作 441 22.6.5 对网络接口表的set操作 442 22.7 选路表函数 443 22.7.1 对选路表的get操作 444 22.7.2 对选路表的get-first操作 446 22.7.3 对选路表的get-next操作 447 22.7.4 选路表中的递增搜索 449 22.7.5 对选路表的set操作 450 22.8 TCP连接表函数 452 22.8.1 对TCP连接表的get操作 453 22.8.2 对TCP连接表的get-first操作 455 22.8.3 对TCP连接表的get-next操作 456 22.8.4 TCP连接表中的递增搜索 457 22.8.5 对TCP连接表的set操作 458 22.9 UDP Listener表 460 22.9.1 对UDP Listener表的get操作 461 22.9.2 对UDP Listener表的get-first操作 462 22.9.3 对UDP Listener表的get-next操作 463 22.9.4 UDP Listener表中的递增搜索 464 22.9.5 对UDP Listener表的set操作 465 22.10 IP地址转换的实用例程 466 22.11 小结 467 深入研究 467 习题 468 第23章 实现的回顾 469 23.1 引言 469 23.2 程序代码统计分析 469 23.3 各个协议的程序代码行数 469 23.4 每个协议所需的函数和过程 470 23.5 小结 471 习题 471 附录1 过程调用交叉参考表 473 附录2 程序代码中使用到的C数据结构交叉参考表 493 附录3 程序代码中使用到的Xinu函数和常量 498 参考文献 513 附录页 前言 很荣幸Doug Comer给我这个机会,让我能在他的这本书第三版付印时与诸位探讨一些个人的想法。在过去的十年期间,Internet以惊人的速度发展着。Internet上主机的数目从1989年的100000台发展到1998年的30000 000台。在本书第二版出版的时候,连接到Intemet的网络大约有26000个。到1998年,这个数字大约在200000到350000之间,这还不包括那些利用互联网技术但未连接到公共网络上的专用内联网。 除了规模上的变化,Internet在应用上也发生了惊人的变化。Internet技术与正在蓬勃发展的WWW作为一个完整的、不可缺少的系统已被人们所认可。而WWW在商业、学术和政府等部门都掀起了一场革命。在WWW上每天出现的“网页”可达3.2亿之多,并且还在不断涌现。有些学校大约四分之一的入学申请都是通过电子邮件或其他网页申请形式进行的。Dell公司透露,他们通过网站每天销售价值大约600万美元的PC机。Amazon网上书店以季度盈利达6600万美元而成为历史上发展最快的公司,这也是第一个在一年之内销售额超过2.5亿美元的公司。 目前,至少有两千多家无线电台将其音频服务推向了Internet,许多网站也开始提供音频甚至低质量的视频服务。随着访问速度提高到兆比特的范围以及主干网容量的增加,视频服务质量也将得到提高。 随着1996年网络电视和1997年Nokia推出的支持网络功能的手机的问世,其他支持网络功能的产品也不断地涌现。更多的实用产品实现了相似的网络功能,例如水暖加热器既可以由家用电脑来控制,也可以由电力公司来控制,以满足适度的调峰需求。尽管智能代理还没有成为主流,但是XML近来的发展也表明Internet上有关事务处理的应用正在急剧增多。SML的标准“文档”表示方式以及一致的常用解释格式构成了一种可传输对象,该对象已形成所有商业、金融事务、数据库事务及其他需要标准表示方式和解释格式的交易的基础。 再回头看看电话产品的发展,无论传统的服务商还是现代企业都在将支持网络的电话产品推向市场。“Soft PBX”系统利用LAN和Internet实现传统的专用交换机的功能,基于微处理器的电话机也正在改变远程通信的经济情况和可操作性。具有IP功能的传真机已经出现。网关把原有的模拟世界与现在的Intemet世界联系在一起,起着非常重要的作用。 对Internet服务需求量的增长速度赶上甚至超过了网络本身的增长。主干网络的速度达到622MM/s已是很平常的事。利用硬件IP交换机的新一代路由器可望以10Gb/s(OC192)以上的速度处理Internet分组。下一个挑战是利用单模光纤处理每秒兆兆字节的信息量。 网络的安全性过去总是处于后台操作状态,随着更多领域依赖于Internet,安全性已逐渐走向前台。防火墙技术、端—端加密、密钥管理、证书系统和鉴别系统已成为成功管理Internet的关键因素。 再向未来展望,网络协议和结构已经朝着星际互联的方向发展,也许会形成和互联网一样的形式。域名系统如果还存在,还要考虑将不同的行星计人命名体系。“互联的Internet”协议将能够处理更高的延迟,传统的TCP概念也将被更多的单向过程取代。未来的网际邀游者回看这十年,一定会觉得这是个充满挑战但技术相对落后的时代。在他们看来,这段前言中的观点可能已经过时又难以理解,因为他们所面对的是经历了另外二十年变革的Internet。 Vinton Cerf Camelot Northern Virginia 序言 用TCP/IP进行网际互联第二卷提供了第一卷所没有包含的关于TCP/IP协议的一些细节问题。第二卷如同将TCP/IP置于放大镜下,考察每个协议的具体细节。它讨论了协议的实现方案,并着重于介绍协议软件的内部机制。第三版包含了对某些协议的修改和更新的内容。其中的代码改用C++语言的ANSI标准C子集,包含了函数原型和参数的声明。另外还纠正了一些错误。我们将SNMP更新为SNMPv2,其中包括替换了地址转换表,增加了UDP listener列表。在本书的最后,还增加了附录2,给出了书中代码所用到的主要数据结构的声明及变量的交叉参考表,并扩充了附录1中的过程调用交叉参考的内容。 书中的范例代码用Gnu C++编译器在Intel体系平台编译通过,也在Pentium TM系统上经过测试。所有的代码均可在以下网址得到: ftP://ftp.cs.purdue.edu/pub/comer/TCPIP—vol2.dist.tar.Z 虽然本书受到版权保护,但书中的代码可供读者使用,而且已经在许多商业产品中实现。这些代码使用的惟一限制是不得在公开出版物中出版。 我们鼓励读者利用计算机工具来查看、修改、编译和测试这些代码。事实上,尽管附录1和附录2中提供了定位代码条目的有效途径,但在查看大段代码时,UNIXgrep程序的价值更是不可估量。 对于各种正式的协议规范,以及对协议的实现和使用的讨论,可参见请求评论文档(RFC)。尽管一些RFC文档对初学者来讲难以理解,但这些文档是信息详尽的权威性资源,没有哪个作者能够做到在自己编写的书中包含RFC文档中的所有内容。尽管RFC文档涉及了每一个协议,但有时它们对协议之间的交互问题并未加以说明。例如,选路信息协议(RIP或OSPF)之类的选路协议规定了网关如何将路由置人IP路由表中,以及如何将表中的路由通知其他网关。RIP还规定路由必须设立定时机制,一旦某条路由超时,就将其删除。但是,我们在RFC文档中并不容易看出RIP和其他协议之间是如何交互作用的,随之而来的问题是:“路由超时机制将如何影响路由表中那些由ICMP设置的路由呢?”我们可能还会考虑这样一个问题:“当RIP更新路由时,应不应该推翻那些由管理员直接输入的路由呢?” 为了有助于解释协议之间的交互作用,并确保我们的方案能协调工作,我们设计并构造了一个工作系统,作为全书的中心范例。该系统提供了TCP/IP协议族中的大部分协议,包括:TCP、IP、ICMP、IGMP、UDP、ARP、RIP、SNMPv2以及OSPF的主要部分。另外,该系统还有一个finger服务的客户和服务器范例。由于本书包括了每一个协议的程序代码,读者可以研究其实现方法并了解其内部结构。最重要的是,由于范例系统将所有协议软件集成为一个工作整体,读者可以清楚地了解协议之间的交互作用。 范例的程序代码试图做到一方面遵守协议标准,另一方面引入一些新的思想。例如,我们的TCP程序代码中包含了“糊涂窗口预防”技术、Jacobson—Karels的“慢启动”和“拥塞预防”等优化技术,诸如此类的性能可能在商业实现中被忽略。但同时我们也清楚地认识到商业领域并不总是遵从已经公布的标准,因此我们也努力将系统调整到能够在现实环境中使用。例如,程序代码中包含了一个配置参数,使得它既可以采纳Internet标准,也可以采纳BSD UNIX中“TCP紧急数据指针”的实现方法。 我们并不认为书中所提供的程序代码都是准确无误的,甚至不能断言它肯定比其他实现方法要好。事实上,经过多年使用,我们仍然在不断完善这套软件,同时,也希望读者跟我们一起继续改进它。 本书可以作为网络工程人员的高级教程或者作为研究生教材使用。在作为本科教程使用时,应将重点放在前几章,而忽略有关OSPF、SNMP和RIP这几章内容。研究生可能会在有关TCP的章节中发现一些最为有趣和最难理解的概念。为保证其高性能而采用的自适应重发和相关的试探法尤为重要,应当仔细加以研究。纵观全书,绝大部分习题都向大家提示了其他可选择的实现方案及其大致情况,这些内容并不要求死记硬背,学生们可能需要阅读本书以外的其他资料,才能解答这些习题。 正如任何耗费甚巨的工程一样,本书中包含了许多人的心血,对此我们表示衷心的感谢。作者.之一David Stevens完成了大部分软件的编制工作,其中包括一个完整的TCP版本。Shawn Ostermann为本书付出了许多努力。Shawn将TCPAP代码集成到xinu版本8中,并将其从最初的Sun 3平台移植到DECstion 3100上。在这一版本中,他还对上一版中由Vic Norman编写的SNMP软件进行了大量的修改,以符合第二版的标准并有助于代码的调试。John Lin对书中的技术细节进行了校对,纠正了一些错误。 珀杜(Purdue)大学的网际互联研究小组(Internetworking Research Group)的许多成员对程序代码的早期版本做过很多贡献。Andy Muckelbauer和Steve Chapin建立了一个UNIX兼容库,并与Shawn Ostermann和Scott Mark合作,使用TCP代码运行一个X window服务器。他们对TCP做了大量的测试工作,并指出其性能上存在的几个问题。Scott M.Ballew参与了一些软件的开发工作。 我的妻子Christine对本书手稿进行了编辑,并提出了许多建议。最后,我们感谢珀杜大学的计算机科学系和计算个L1所提供的帮助。 Douglas E.Comer David L.Stevens
44.79MB
软件工程教程
2012-07-06软件工程ppt 建议没有基础或者兴趣的同学别下载 因为软件工程理解需要耐心和能力 主讲:邱焕耀 经历 华南理工大学,博士,计算机控制 曾任职以下公司: 中国民航信息广州公司(香港上市)技术总监 广州金鹏集团(电子百强)项目总监 广东金宇恒(佛山最大软企)技术总监 曾获国家创新基金、广州科学技术奖 中联通炫铃广东/湖南/广西项目负责人(用户800万) 长期移动、民航、政府、互联网行业软件研发 项目一 软件工程概述 任务1 软件工程任务2 软件生命周期与软件开发模型任务3 建模工具 最富哲理的软件工程 UML是“三人帮”“捣”出来的 迭代开发过程这样流转 软件工程水平是这样提高的 敏捷开发过程-Scrum 送餐管理系统--用例图 送餐管理系统--类图 送餐管理系统--顺序图 任务1 软件工程 软件的定义及其特点 软件危机 软件工程概念 软件的定义及其特点 软件的定义 软件是计算机系统中与硬件相互依存的部分,它是包括程序、数据及相关文档的完整集合。 软件的定义及其特点 软件危机 软件危机 软件危机 在软件开发和维护过程中所遇到的一系列严重问题 软件危机的表现 对软件开发成本和进度的估算很不准确 用户很不满意 质量很不可靠 没有适当的文档 软件成本比重上升 供不应求:软件开发生产率跟不上计算机应用迅速深入的趋势 软件危机 原因 客观:软件本身特点 逻辑部件 规模庞大 主观:不正确的开发方法 忽视需求分析 错误认为:软件开发=程序编写 轻视软件维护 软件危机 产生的原因(软件开发人员的错误观点): “有一个对目标的概括描述就足以着手编写程序了,许多细节可以在以后再补充” “所谓软件开发就是编写程序并设法使它运行” “用户对软件的要求不断变化,然而软件是柔软而灵活的,可以轻易地改动” “软件投入生产性运行以后需要的维护工作并不多,而且维护是一件很容易做的简单工作” 软件危机的解决 解决途径 组织管理 工程项目管理方法 技术措施 软件开发技术与方法 软件工具 软件工程概念 软件工程的概念 应用计算机科学、数学及管理科学等原理,以工程化的原则和方法来解决软件问题,指导计算机软件开发和维护的一门工程学科。 软件工程的原则 任务2 软件生命周期与软件开发模型 软件生命周期 软件开发模型 软件生命周期 软件定义 阶段 软件开发阶段 软件的使用和维护阶段 退役 软件开发模型 瀑布模型 软件开发模型 演化模型 螺旋模型 喷泉模型 任务3 建模工具 两种典型的建模工具 : 1.IBM Rational Rose 2.Microsoft Office Visio IBM Rational Rose Microsoft Office Visio Visio是一个图表绘制程序,可以帮助用户描述复杂设想以及系统的业务和技术图表。使用Visio创建图表可以使信息形象化,能够以更为直观有效的方式进行信息交流,这是单纯的文字和数字无法比拟的。 软件工程课程设计 考核方式: 课程设计(附设计说明文档,正文字数不少于1000字)(60%)+平时作业及实验(30%)+平时表现(10%),按优秀、良好、中、及格、不及格五级评定成绩 通过演示及讲述,讲解课程设计的整体情况,针对其设计提出一些技术及细节问题确认是否真正理解课程设计中的要点、是否掌握了进行系统设计的知识和能力、是否本人完成。如通发现没有真正设计或者不清楚技术细节,则课程设计不及格。 答辩部分: 40分(没有课程设计说明文档不予参加答辩) 设计部分: 60分 选题:创新性, 实用性, 界面美观友好(15分) 难度:设计包含的难度(15分) 设计的完整性(30分) 迭代和增量开发方式 迭代过程的优势 复杂系统-分解->多个简单系统 提高软件项目可控性 降低软件开发风险 有效地应对需求变更 何时使用迭代开发? 只对希望成功的项目使用 项目二 统一建模语言UML 任务1 UML概述任务2 UML静态建模任务3 UML动态建模 任务1 UML概述 UML的概念 UML的发展 UML的主要内容 UML与OO(面向对象) UML的概念 UML的概念 UML Unified Modeling Language 统一建模语言 统一建模语言是一种通用的可视化建模语言,用于对软件系统的制品进行规范化、可视化处理,然后构造它们并建立它们的文档。 UML的发展过程 图 与 语言 谁一级棒? UML的优势 过去数十种面向对象的建模语言各自为战,而UML可以消除一些潜在差异,一统江湖 通过统一语义和符号表示,提高面向对象技术 使项目建立在一个成熟的标准建模语言基础之上 便于沟通和交流,统一的理解 UML主要内容 精确的元模型定义 UML表示法 UML表示符 UML可视化的图形建模语言 UML提供了五类图形 任务2 UML的概念模型 UML基本的构造块 事物 关系 图 UML 公共机制 规格说明 UML模型: 使用图和图标可视化模型 各种建模元素的规格说明所组成 规格说明 模型元素的特征和语义的文本描述—模型的“肉” 形成了承载模型的语义背板,赋予模型意义,各种图仅仅是该背板的视图或者可视化投影 修饰 修饰:图中建模元素上暴露的信息项 任何UML图仅是模型的视图, 只有在修饰增强了图的整体清晰性和可读性或者突出模型的某些重要特征时,才应该表示那些修饰 公共分类 描述认识世界的特殊方法 类和实例 类元:一类事物的抽象概念;如“银行帐户” 实例:一类事物的特定实例;如“张三丰帐户” 接口和实现 接口:说明事物行为的契约(做什么) 实现:事物是如何工作的特殊细节(如何做) 扩展机制 约 束:允许对模型元素添加新的规则 构造型:基于已有的建模元素引入新的建模元素 标记值:允许为模型元素添加新的特性,是带有相关值得关键字 JAVA开发平台体系结构 构架是一个系统的组织结构包括: 1. 系统分解成的各个部分 2. 它们的连接性 3. 交互机制 4. 通知系统设计的向导规则 JAVA开发平台架构 构架是一个系统的组织结构包括: 1. 系统分解成的各个部分 2. 它们的连接性 3. 交互机制 4. 通知系统设计的向导规则 架构 构架是一个系统的组织结构包括: 1. 系统分解成的各个部分 2. 它们的连接性 3. 交互机制 4. 通知系统设计的向导规则 4+1视图 UML小结 任务3 UML静态建模机制 用例图 类图 对象图 包 使用类图的建议 用例图 用例“捕获需求” 用例图从系统外部、从用户角度出发描述系统的功能集 用例图所描述的系统功能依靠外部用户或另一个系统激活,为用户或另一个系统提供服务 用例表达“做什么” 用例图中可以包含若干个用例,用例表达了系统的功能 用例只描述参与者和系统在交互过程中做些什么,并不描述怎么做。 用例图 关联关系 用例图 泛化关系 用例图 泛化关系 用例图 用例图 用例图 用例用于什么情况? 不知道什么情况不用用例 如果没有用到用例,闭门反省 实例:监听器用例 实例:监听器用例 功能需求 监听删除操作,保证数据的安全。 场景 监听删除操作 删除操作一旦执行,立即被监听器捕获到,进而在执行 删除操作前执行自定义的函数体,即判断实体有无undeletable标签,有则中断删除操作,无则正常删除。 用例图 关系 关联关系 ;依赖关系 ;泛化关系;关系的扩展 类图 类 名称;属性;操作 关联关系 泛化 依赖关系 约束 类图 类 名称;属性;操作 类图 类图 类图 类图 类图 何时用 类图? 类图是面向对象方法的支柱 如果没用到类图?? 找电杆撞下,看是否用面向对象方法 用 类图 的危险! 类图用滥了,建狗屋画了10页类图 类图没分清粗细层次: 概念类图 规约类图 实现类图 鸟类图 鸟类图 鸟类图 实例:监听器类图 使用类图的建议 不要试图使用所有的符号 根据项目开发的不同阶段,用正确的观点来画类图 不要为每个事物都画一个模型,应该把精力放在关键的领域 对象图 对象图 表示在某一时刻类的具体实例和这些实例之间的具体连接关系 类 与 对象 关系 类 与 对象 关系 类图和对象图的区别 包 包 一种分组机制,把各种各样的模型元素通过内在的语义连在一起成为一个整体就叫做包 包的关系 包--软件比赛作品 架构图--包图的变形 任务4 UML动态建模机制 对象之间的交互 状态图 交互图 活动图 四种图的运用 软件模型与现实 模型与现实要匹配 对象之间的交互 简单消息 同步消息 异步消息 同步且立即返回消息 什么是状态图? 状态图 用来建模对象是如何改变其状态以响应事件,展示对象从创建到删除的生命周期 状态图 状态标记符 状态图 实例:打电话 状态图 状态和转移 事件 状态图 如果你太喜欢 状态图 详细状态 状态图 子状态 状态图 子状态 状态图 子状态 航班状态 放松下 交互图 顺序图 交互图 顺序图 实例:监听器顺序图 电影动画-软件模型 电影大量使用3D动画 交互图 协作图:交互关系 和 链接关系 链接;消息流;对象生命周期 交互图 协作图:交互关系 和 链接关系 交互图 协作图 链接;消息流;对象生命周期 顺序图与协作图 相同点 描述对象间的交互关系 不同点 顺序图:交互的时间顺序 协作图:交互的静态链接关系 3D电影动态建模 活动图 -状态变种 活动图 -状态变种 活动图 活动和转移 泳道 对象 信号 活动图 活动和转移 泳道 对象 信号 四种图的运用 动态建模 目的、侧重不同 状态图只有极少关键对象 顺序图、协作图:单用例中几个对象的行为 顺序图突出顺序,协作图着重对象间链接关系 项目三 项目市场调研 任务1. 系统的研发背景 任务2. 软件开发计划 油画创作背景 波洛克 《1948年第五号》 1.4亿$,最昂贵画作 这幅画在一副优雅的4x8英尺画布上以画家特有的滴溅泼洒的艺术手法来进行风暴式设计并拨开油彩。 任务1 系统的研发背景 追问:为什么呢? 你好,这里是梦幻家园售楼处,我是蔡小姐。 我是张总,我严重警告你。 为什么呢? 试用期2月了,你有业绩吗?你卖出去过一套房子吗? 为什么呢? 问你自己! 哦……为什么呢? 今天下班之前你要再不卖出一套房子去,你就给我卷铺盖走人! (电话挂了) 为什么呢? 项目背景--钢琴练奏师 问:为什么开发这个软件? 答: 传统的音乐播放器功能单一 用户对音乐缺少参与感 问:开发这个软件目标是什么? 答: 提高用户对音乐的学习和娱乐 参与创作音乐 项目背景--钢琴练奏师 问:为什么传统音乐程序不好? 答: 传统音乐程序功能单一,容易令人感到枯燥无味,没有吸引力; 传统音乐程序强调单方向,用户没有参与感; 传统音乐程序设计不够灵活,扩展性差。 项目背景--钢琴练奏师 问:开发内容包括什么? 答: 本项目从Android的声音处理入手,实现音乐功能,根据用户的兴趣,提高用户参与度。 问:有什么应用价值? 答: 本项目是一个能提高用户参与和娱乐程序的项目,具有一定的使用价值。 追求的结果--钢琴练奏师 1.2 项目背景 传统的音乐播放器功能单一,用户对音乐缺少参与感,本项目志在提高用户对音乐的学习和娱乐,参与创作音乐: (1)传统音乐程序功能单一,容易令人感到枯燥无味,没有吸引力; (2)传统音乐程序强调单方向,用户没有参与感; (3)传统音乐程序设计不够灵活,扩展性差。 本项目从Android的声音处理入手,实现音乐功能,根据用户的兴趣,提高用户参与度。本项目是一个能提高用户参与和娱乐程序的项目,具有一定的使用价值。 系统的研发背景 1.图书馆系统的提出 传统的手工方式对图书信息的管理已越来越不能适应社会发展的需要,尤其是随着计算机网络和Internet的普及,运用先进的信息管理系统对信息进行科学化和网络化管理,已成为图书信息管理系统发展的趋势。 系统的研发背景 2.国内外研发现状 图书管理系统的发展历史 国内外应用的图书管理系统调研 (1)开发方式 (2)开发方法 (3)结构形式 (4)开发平台 (5)系统使用的范围 (6)按照系统开发主体面向的对象 国内图书管理系统应用情况 国内Android开发行业市场现状 国内的Android开发还是以应用开发为主,主要分成3类: 为企业开发应用 开发通用应用(Android Market或者其他App Market销售) 游戏开发(Android Market或者其他App Market销售)。 国内Android开发行业市场现状 第一类开发者 在较大的公司,为自有品牌或者其他品牌设计手机或者平板电脑的总体方案。 根据需求对系统进行定制外,为系统编写定制的应用。 第二类开发者 在创业型公司或者是独立开发者,盈利方式主要2种: 为国外公司外包开发,或者通过Google的移动广告(AdMob)点击分成。 通过付费下载的形式来盈利的,现在国内鲜见成功者。 第三类开发者 和第二类开发者类似。开发者提交的应用开发数目远超游戏开发。 任务2 软件开发计划 任务2 软件开发计划 软件开发计划 软件开发计划 问题定义-案例 项目可行性 软件开发计划 软件开发计划 可行性分析-案例1 炫铃项目的可行性 无人 无积累(技术) 环境(有市场前景) 资金(1年) 可行性分析-案例2 华为任正非早期冒险: 人不够(一边开发,一边找人) 无积累(无技术--红宝书) 资金(前期约1年,后欠工资) 环境(有市场,政策无支持) 一拍脑袋:“豁出去,干!” 可行性分析-案例3 联想集团柳传志 没钱赚的事我们不干; 有钱赚但投不起钱的事不干; 有钱赚也投得起钱但没有可靠的人选,这样的事也不干。 成本收益分析 成本: (1)办公室房租。 (2)办公用品,如桌、椅、书柜、电器、空调。 (3)计算机、打印机、网络等硬件设备。 (4)电话、传真等通讯设备以及通讯费用。 (5)资料费。 (6)办公消耗,如水电费、打印复印费等。 (7)软件开发人员与行政人员工资。 (8)系统软件费用,如数据库、开发工具等。 (9)市场调查、可行性分析、需求分析的费用。 (10)公司人员培训费用。 (11)产品宣传费用。 (12)如果客户攻关费,吃喝玩乐的费用。 (13)管理费。每戳一个公章都要化一把钞票。 收入: 项目收入(合同) 技术可行性 技术可行性可以表述为: 做得了吗? 做得好吗? 做得快吗? 社会环境的可行性 社会环境的可行性: 市场 未成熟的市场 成熟的市场 将消亡的市场 政策 例: 民航收费 电信收费 人才可行性 有人吗? 手上的人 挖掘一下 够用吗? 要多少才够 成本超支 可找吗? 挖得到 给得起¥ 软件开发计划 软件开发计划 软件开发计划 软件开发计划 小结 项目四 软件项目需求分析 项目四 软件项目需求分析 任务1. 调查系统的需求 任务2. 模型 任务3. 事件 任务4. 事物 任务5. 实体—联系图 任务6. 类图 任务1. 调查系统的需求 1. 调查系统的需求 功能需求和技术需求 系统相关者 建立系统需求原型 需求分析的困难! (1)客户说不清楚需求; (2)需求自身经常变动; (3)分析人员或客户理解有误。 需求分析的困难! (1)客户说不清楚需求 例:买鞋子 脚 大小 形状 需求分析的困难! (2)需求自身经常变动 没有一个软件的需求改动少于三次 唯一改动需求两次的 在去第三次改动需求的路上去世了 例:时装 需求分析的困难! (3)分析人员或客户理解有误 调查系统的需求 1.功能需求和技术需求 功能需求 系统必须完成的活动,是系统将要投入的业务应用 技术需求 和企业的环境、硬件和软件有关的所有可操作目标 调查系统的需求 树上有10只鸟,打了1只,还有几只? “是无声手枪或别的无声的枪吗?” “不是。” “枪声有多大?” “80-100分贝。” “那就是说会震的耳朵疼?” “是。” “在这个城市里打鸟犯不犯法?” “不犯。” “您确定那只鸟真的被打死啦?” “确定。”偶已经不耐烦了“拜托,你告诉我还剩几只就行了,ok” “ok,树上的鸟里有没有聋子?” “没有。” “有没有关在笼子里的?” “没有。” “边上还有没有其他的树,树上还有没有其他鸟?” “没有。” “有没有残疾的或饿的飞不动的鸟?” “没有。” “算不算怀孕肚子里的小鸟?” “不算。” “打鸟的人眼有没有花?保证是十只?” “没有花,就十只。” 偶已经满脑门是汗,且下课铃响,但他继续问, “有没有傻的不怕死的?” “都怕死。” “会不会一枪打死两只?” “不会。” “所有的鸟都可以自由活动吗?” “完全可以。” 学生满怀信心的说,“打死的鸟要是挂在树上没掉下来,那么就剩一只,如果掉下来,就一只不剩。” 调查系统的需求 2. 系统相关者 用户:实际使用系统处理日常事务的人 客户:那些购买和拥有系统的人 技术人员:确保系统运行的人 外部实体:例如公司的顾客 调查系统的需求 需求调查方法: 直接与客户交谈 足球评论员“大嘴” 侃出需求 有些需求客户讲不清楚 请教行家 “听君一席言,胜读十年书。” 客户与分析人员想都没有想过 分析同类软件,优点、缺点 坐享其成 调查系统的需求 3.建立系统需求原型 (1)确定现有系统的物理过程和活动 (2)从现有物理过程中提取出业务逻辑功能 (3)为将在新系统中使用的方法开发出业务逻辑功能(删) (4)定义新系统的物理处理需求 (物理改为业务) 任务2 模型 2. 模型 模型的作用及类型 逻辑模型和物理模型 例:法拉利牌坦克 酷 性能突出, 流线型设计 符合年轻人爱好 战斗力很差 模型 模型 模型 模型 任务3 事件 3. 事件 事件的概念和类型 事件定义 图书馆管理系统中的事件 事件 事件 事件 《金刚》-3D软件建模 2.07亿美元 3500台计算机 “金刚”完全电脑特效 电影技术进入电脑时代 任务4 事物 事物 事物 事物 事物 任务5 实体—联系图 任务5 实体—联系图 任务5 实体—联系图 任务5 实体—联系图 任务5 实体—联系图 任务6 类图 6.类图 用面向对象的方法分析事物 类图的符号 建模的目标 需求分析规格说明书编写提纲 类图 1.用面向对象的方法分析事物 分类分析方法(概括-具体) 继承 类图 1.用面向对象的方法分析事物 分类分析方法(概括-具体) 继承 类图 1.用面向对象的方法分析事物 整体—局部分析方法 聚合 合成 类图 2.类图的符号 基于统一建模语言(UML) 面向对象系统开发中建立模型的实际标准 类图 2.类图的符号 基于统一建模语言(UML) 面向对象系统开发中建立模型的实际标准 类图 3. 建模的目标 结构化方法:--错误的! 事件表->数据流图(DFD) 面向对象方法: 事件表->用例图->类图->顺序图/状态图 类图 3. 建模的目标 结构化方法--错误的! 面向对象方法 需求分析规格说明书 仅仅建模还是不够的 需求分析成果->需求分析说明书 需求分析规格说明书提纲 1.引言 2.任务概述 3.需求规定 4.运行环境设定 5.缩写词表 6.参考文献 送餐管理系统--需求分析过程 分析员:“在你们打理生意时,哪些事情促使你们决定采用计算机管理?告诉我通常这些业务是如何进行的。” 客户:“是这样,当客户打电话订餐时,我需要把它记下来,然后通知给相应的餐馆。我需要决定派哪一个司机去送货,因此要司机打电话告诉我他们什么时间有空。有时,客户会又打电话更改订单内容,因此我必须找到原始订单,然后通知餐馆更改。” 分析员:“好的,那你们又怎么管理现金呢?” 客户:“司机取饭菜时会从餐馆直接拿到账单的副本,账单和我们的计算应该是一致的,然后司机送货时收取相应的现金并加上服务费。在下班时,司机报账,我们把司机收到的现金汇总起来,和我们的记录进行比较,所有的司机都交完账后,我们需要开张银行存款单,存入当天的现金总收入。每周末,我们按提前约定的批发价来计算欠餐馆多少钱,把结算单和支票寄给他们。” 送餐管理系统--需求分析过程 分析员: “那你们还想从这个系统中获取别的信息吗?” 客户:“如果每周末能统计出每个餐馆有多少订单、城里每个区有多少订单等信息就更好了。这能帮助我们制定广告策略及与餐馆的合同,而且我们还需要每月财务状况统计结果。” 在客户说话时,分析员记下了几个要点,画了几张草图。之后,他花了一些时间仔细考虑,总结出“送餐管理”的需求状况。 送餐管理系统--需求分析过程 1.在发生如下事件时,系统可以进行处理: 客户打电话下订餐订单 客户打电话修改订单 送货司机汇报工作情况 送货司机上交一天的收入 2.在特定时间内系统产生所需信息: 生成日结算存款单 生成周末餐馆支付帐单 生成周销售报表 生成月财务报表 3.需要建立业务实体: 餐馆 菜单 客户 订单 订单支付帐单 司机(送餐员) 送餐管理系统--用例图 送餐管理系统--类图 送餐管理系统--顺序图 小结 面向对象分析方法(掌握) 用例图 类图 顺序图 状态图/协作图(可选) 结构化分析方法(了解) 实体-联系图 数据流图 项目五 软件项目总体设计 软件项目总体设计 1.总体设计基本内容 2. 结构化软件设计 3. 面向对象软件设计 任务1 软件总体设计 1.总体设计的基本内容 软件设计定义 总体设计的目标与步骤 总体设计的基本任务 总体设计的准则 软件设计分解过程 总体设计的基本内容 1.软件设计 设计解决从需求(做什么?)到(怎么做?) 概要设计(总体设计) 将软件需求转化为软件体系架构 确定系统级接口 全局数据结构或数据库模式 详细设计 确立每个模块的实现算法和局部数据结构 用适当方法表示算法和数据结构的细节 软件设计 总体设计 体系结构 就如同人的骨架 如骨架是猴子,无论怎样喂养和美容,始终是猴子,成不了人。 模块(子系统) 就如同人的器官,有特定的功能 最出色的子系统是手,只有几种动作,却能做无限多的事情。 最糟糕的模块设计之一是嘴巴,混合毫无相干的功能(如吃饭、说话、亲吻) 软件设计 详细设计 数据结构与算法 如同人的血脉和神经(发挥功能) 聋子天生就是哑巴(关系) 人体的数据结构与算法设计十分神奇也十分可笑 用户界面 如同人的外表,让人一见钟情(或一见呕吐) Unix系统是健壮的汉子和妇人 Windows系统是妩媚的小白脸和狐狸精 化妆可以获得更好的界面 总体设计的基本内容 1.总体设计的目标 设计合理的软件架构 分解为合理的模块(包) 2.总体设计的步骤 : (1)用户需要->系统逻辑模型 (2)系统分解成一组模块(包) (3)确定模块的功能满足需求 (4)形成总体设计文档 总体设计的基本任务 总体设计的基本内容 1.软件设计 软件架构是总体设计的核心内容 体系结构是本质的 软件系统中最本质的东西 对复杂事物的一种抽象 在一定的时间内保持稳定 常见层次结构和WEB结构 总体设计--层次结构 为什么分层次? 系统太复杂 无法一口气干完 与人的认识符合 总体设计-体系结构 总体设计--网络结构 总体设计--系统架构 总体设计--模块功能划分 体系结构-(决定)各模块功能 从功能上划分模块 模块化设计原则 保持“功能独立” 抽象(事物本质) 信息隐藏 总体设计--模块功能划分 保持“功能独立” 降低开发、测试、维护等阶段的代价 沟通成本最低 例:美国独立战争 (独立国家) 总体设计--模块功能划分 抽象(事物本质) 抽象是设计的本质 例: 微软和联通有仇? 国际码,“啊”:B0A1 总体设计--模块功能划分 信息隐藏 模块只提供对外的接口 模块内部不对外开放 好事不出门,坏事传千里!(克林顿) 老师:要是坐在后排聊天的同学能象中间打牌的同学那么安静,就不会影响到前排睡觉的同学。 总体设计--UI模块 总体设计--DAO模块 总体设计--DAO模块 总体设计--DAO模块 总体设计的基本内容 3 系统架构 3.1 系统总体架构 3.1.1 UI构件 3.1.2 DAO构件 3.1.3 MVC构件 3.1.4 MODEL构件 总体设计的准则 任务2 结构化的软件设计 1.结构化设计的基本概念 (1)模块 (2)模块的独立性 (3)抽象 (4)信息隐蔽 结构化的软件设计 2.结构化的设计方法 (1)功能模块划分设计 (2)面向数据流设计 (3)输入/输出设计 模块划分的设计 功能模块划分设计 面向数据流设计 变换型数据流设计 面向数据流设计 事务型数据流 输入/输出设计 输入/处理/输出设计 结构化的软件设计 3.运行环境设计 硬件平台 CPU 硬盘 内存 软件平台 操作系统 数据库 任务3 面向对象设计 面向对象的的设计方法 系统行为−图书管理系统的用例图 对象交互−图书管理系统的交互图 对象行为−图书管理系统的状态图 面向对象的软件设计 面向对象的软件设计 是一种新的程序设计范型 是一种运用 对象、 类、 继承、 封装、 聚合、 消息传送、 多态性等 概念来构造系统的软件开发方法 面向对象方法主要思想 面向对象方法主要思想 面向对象开发方法的开发过程 软件开发全过程运用面向对象方法 面向对象语言正取得令人振奋的发展 编程并不是软件开发问题的主要根源 需求分析与设计问题更为普遍并且更值得解决 适合于解决分析与设计期间的复杂性 实现分析与设计的复用 在软件生命周期采用一种全新的方法 ——《软件工程百科全书》 面向对象方法 对象:属性 + 服务 (独立的系统单位) 尽可能隐蔽对象的内部细节 面向过程与面向对象的区别 面向对象的软件设计 1. 面向对象的的设计方法 设计特点: 抽象性 信息隐藏性 功能独立性 模块化 设计步骤: 识别对象 确定属性 定义操作 确定对象之间的通信 完成对象定义 1 识别对象—例子 家庭安全系统--潜在的对象 房主 传感器 安全系统 控制板 监控服务 ………. 1 识别对象 对系统进行描述 对描述进行语法分析 找出名词或者名词短语 根据这些名词或者名词短语确定对象 对象可以是 关键抽象 关键抽象 2 确定属性 找出对象的一组有意义的属性 研究系统描述,选择与对象相关联的信息 例:“家庭安全系统” 的属性 传感器信息=传感器类型+传感器编号+警报临界值 报警响应信息=延迟时间+电话号码+警报类型 起动/撤销信息=主口令+允许尝试的次数+暂时口令 标识信息=系统表示号+验证电话号码+系统状态 3 定义操作 研究系统的需求描述 进行语法分析,隔离出动词 选择与对象相联关的动词(操作) 选择属于对象的操作(方法) 例: “家庭安全系统” “传感器被赋予一个编号和类型” “设置一个主口令使系统处于警报状态或警报解除状态”。 4 确定对象之间的通信 仅定义对象不够 对象之间必须建立一种通信机制,即消息 作用: 要求一个对象执行某个操作 就要向它发送一个消息 告诉对象做什么 完成对象定义 面向对象的软件设计 面向对象的软件设计 2.系统行为−图书管理系统的用例图 (1)用例、参与者以及场景 (2)用例和参与者关系以及用例之间的关系 关联关系 面向对象的软件设计 2.系统行为−图书管理系统的用例图 (1)用例、参与者以及场景 (2)用例和参与者关系以及用例之间的关系 包含关系 一个用例包含另一个用例的行为 面向对象的软件设计 2.系统行为−图书管理系统的用例图 (1)用例、参与者以及场景 (2)用例和参与者关系以及用例之间的关系 扩展关系 基础用例的增量扩展 面向对象的软件设计 2.系统行为−图书管理系统的用例图 (1)用例、参与者以及场景 (2)用例和参与者关系以及用例之间的关系 泛化关系 子用例是父用例的特例 图书管理系统的用例图 图书管理系统的用例图 图书管理系统的用例图 面向对象的软件设计 3. 对象交互−图书管理系统的交互图 (1)顺序图的基本构成 面向对象的软件设计 3. 对象交互−图书管理系统的交互图 (1)顺序图的基本构成 (2)如何开发顺序图 确定所有与场景有关的对象和参与者 确定完成场景的消息 将消息排序,放在合适的参与者和对象上, 标示对象生命线 图书馆管理系统中的顺序图 图书馆管理系统中的顺序图 图书馆管理系统中的协作图 图书馆管理系统中的协作图 图书馆管理系统中的协作图 图书馆管理系统中的协作图 面向对象的软件设计 4.对象行为−图书管理系统的状态图 (1)对象状态和状态转换 面向对象的软件设计 4.对象行为−图书管理系统的状态图 (2)如何开发状态图 选择状态复杂的关键类 辨识类的所有状态 从初始状态开始,按转换顺序联接状态,到终止状态 标示转换消息 图书馆管理系统的状态图 图书馆管理系统的状态图 小结 项目六 软件项目详细设计 三层构架 项目六 软件项目详细设计 1.系统详细设计的基本内容 2.图书管理系统的详细设计 3. 用户界面设计 软件项目详细设计 1.系统详细设计的基本内容 详细设计概述 详细设计的基本任务 详细设计方法 系统详细设计的基本内容 1.详细设计概述 详细设计 又称程序设计 设计数据结构 设计算法 自然语言描述 系统详细设计的基本内容 1.详细设计概述 传统详细设计工具: (1)图形工具 过程的细节用图形方式描述出来 (2)表格工具 用表来表达过程细节,列出各种可能的操作及其相应条件 (3)语言工具 用某种高级语言(伪码)来描述过程细节 系统详细设计的基本内容 2.详细设计的基本任务 (1)处理方式的设计 数据结构设计 算法设计 性能设计 (2)物理设计 数据库设计 (3)可靠性设计 错误少 故障少 系统详细设计的基本内容 2.详细设计的基本任务 (4)其他设计 代码设计 输入/输出格式设计 人机对话设计 (5)编写详细设计说明书 引言 程序设计结构 程序1 。。。 (6)详细设计的评审 坐而论 对事不对人 系统详细设计的基本内容 3.详细设计方法 (1)传统的详细设计方法 图形符号的设计方式 表格的设计方式 程序设计语言 系统详细设计的基本内容 1.详细设计概述 (1)图形工具 系统详细设计的基本内容 1.详细设计概述 (1)图形工具 系统详细设计的基本内容 1.详细设计概述 (2)表格工具 例:三角形应用系统决策表 系统详细设计的基本内容 1.详细设计概述 (3)语言工具(伪代码) 伪码是混合语言,形式语言的控制结构和自然语言描述 例:描述打印N!的流程: 面向对象详细设计 详细设计软件类或接口 按架构模式设计边界类、控制类和实体类; 设计数据库接口(面向对象到数据库转换ORM) 面向对象详细设计 包的设计 包是一种逻辑分组的概念; 相关成分聚在一起,构成更高层的组织单元; 常用将类以包为单位进行分组; 如:同一层的所有类组成一个包; 一个包可以包含其他的包。 面向对象详细设计 分包的原则 共同封闭原则: 将一组职责相似、不同实现的类归为一个包 例如: 交互界面的类放在界面包 业务逻辑的类放在业务逻辑包 共同复用原则: 一个包中的各个类应该一起被复用 复用其中一个类可能需考虑同一个包中的其他类 设计包图 设计包图 描述包及其依赖关系; 标识一个完整系统的主要部分; 两个符号: 包的标识符 虚线箭头 包的依赖关系 包依赖关系可以是直接的,也可以间接的,依赖关系可以传递; 通过包图,可估算包中类的复杂度, 可估算重用一个包的难易程度。 三层构架包 软件类的设计 基本概念 设计属性 设计方法 设计关系 软件类的设计 软件类 又称设计类 (对应的分析阶段的类称为概念类或领域类) 分析中的类 是现实事物或概念的抽象 要转换为软件世界中的类 计算机领域的软件对象的类 计算机领域的对象的类 软件类的设计 边界类 系统与其参与者的交互 包括接收来自用户和外部系统的信息与请求 将信息与请求提交给用户和外部系统 封装用户界面或通信接口 接收用户的触发事件 通过界面中的图形元素进行响应 软件类的设计 边界类 例:码单创建界面 实体类的设计 实体类 来源于领域模型中的类 对应于领域模型中的领域类 控制类的设计 控制类 用于封装与某个具体用例有关的控制流; 还用于表示复杂的派生与演算; 根据分层原则,只对 控制、 协调、 排序、 事务处理、 复杂业务逻辑 进行封装 。 控制类 例:入库控制类 设计类的属性 设计属性的类型和初值: 属性的类型 默认的初始值 设计属性的可见性: 公有的(public)—“+” 受保护的(protected)——“#” 私有的(private)——“-” 完整的属性定义: 可见性 属性名:类型 = 初始值 设计操作(方法) 设计操作(方法) 设计类的操作(方法)重要 分析中勾画了对象行为的轮廓 设计阶段对这些行为进行细化 结合用例和交互图来定义类(对象)的方法 消息和方法 消息和方法 职责通过消息发送分配给对象 消息发送者需要某项服务 消息接收者要提供相应的服务 最终转化为接收者的方法 接收对象会产生结果回传给发送者(返回消息) 例:类的操作 定义操作(方法) 定义方法 和属性一样,类的方法可以定义可见性; 方法按如下格式进行标识: 可见性 方法名(方法参数列表):类型表达式 设计类的关系 设计关系 类的关系: 依赖关系 泛化关系 关联关系 设计依赖关系 作为类的方法的参数; 类的关系 设计泛化关系 一般在面向对象语言中使用继承来实现泛化关系,继承机制实现了子类拥有父类特性的这一过程。 类的关系 设计关联关系 在关联的源类中声明一个实例属性来保存对目标类的实例的引用 系统详细设计的基本内容 (2)面向对象的详细设计 算法和数据结构的设计 数据结构的设计与算法是同时进行 对数据的维护操作(如增、删、改、查) 对数据进行计算 监控对象事件 模块和接口 系统详细设计的基本内容 (2)面向对象的详细设计 算法和数据结构的设计 模块和接口 软件项目详细设计 2.图书管理系统的详细设计 系统包图 类的类型以及类之间的关系 图书馆管理系统的类图 设计类图的开发 图书管理系统的详细设计 1.系统包图 图书管理系统的详细设计 2.类的类型以及类之间的关系 (1)类的类型 实体类(Model) 边界类(View) 控制类(Controller) (2)类之间的关系 关联 聚合 泛化 依赖 图书管理系统的详细设计 3.图书馆管理系统的类图 图书管理系统的详细设计 4. 设计类图 (1)决定需要设计的类 读者编号 读者姓名 读者性别 读者电子 读者类别 (2)找到属于类的所有方法 图书管理系统的详细设计 4. 设计类图 (1)决定需要设计的类 (2)找到属于类的所有方法 (3)描述带有逻辑的方法 描述方法 图形 表格 伪码 软件项目详细设计 3. 用户界面设计 用户界面设计应具有的特点 用户界面设计的类型和原则 图书馆管理系统的界面设计 用户界面设计 1.用户界面设计应具有的特点 (1)可(使)用性 使用的简单性 用户界面中的术语标准化和一致性 拥有HTML帮助功能 快速系统响应和低系统成本 具有容错能力、错误诊断功能 (2)灵活性 界面(算法)的可隐可显性 用户可制定和修改界面形式 提供不同详细程度的系统响应信息 应有标准的界面 (3)复杂性与可靠性 用户界面的规模和组织的复杂程度就是界面的复杂性 用户界面的可靠性是指无故障使用的间隔时间 用户界面设计 2.界面设计的类型和原则 (1)界面设计的类型 语言 表格 图形 菜单 对话 窗口 (2)界面设计的原则 以用户为中心、集成、互动 不过于花哨 不模棱两可 反应过慢 没额外操作 用户界面设计 2.界面设计的类型和原则 (3)界面设计的方法 描述任务脚本 设计命令层 涉及详细交互 (4)继续做原型 (5)设计用户界面类 窗口 按钮 菜单 (6)依据现有图形用户界面进行设计 Windows Macintosh X-windows Motif 界面设计--图书馆管理系统的界面设计 界面设计--图书馆管理系统的界面设计 界面设计--图书馆管理系统的界面设计 界面设计--图书馆管理系统的界面设计 界面设计--图书馆管理系统的界面设计 界面设计--图书馆管理系统的界面设计 界面设计--图书馆管理系统的界面设计 界面设计--图书馆管理系统的界面设计 界面设计--图书馆管理系统的界面设计 界面设计--图书馆管理系统的界面设计 界面设计--图书馆管理系统的界面设计 界面设计--图书馆管理系统的界面设计 界面设计--图书馆管理系统的界面设计 界面设计--图书馆管理系统的界面设计 界面设计--图书馆管理系统的界面设计 界面设计--图书馆管理系统的界面设计 界面设计--图书馆管理系统的界面设计 界面设计--图书馆管理系统的界面设计 界面设计--图书馆管理系统的界面设计 界面设计--图书馆管理系统的界面设计 界面设计--图书馆管理系统的界面设计 界面设计--图书馆管理系统的界面设计 界面设计--图书馆管理系统的界面设计 界面设计--图书馆管理系统的界面设计 界面设计--图书馆管理系统的界面设计 界面设计--图书馆管理系统的界面设计 界面设计--图书馆管理系统的界面设计 小结 项目七 软件项目实现 项目七 软件项目实现 结构化程序设计 面向对象程序设计 程序设计语言 程序复杂度 面向对象的依赖关系 类的关系 设计关联关系 源类中有一个实例属性,是对关联类的实例的引用 类的关系 设计关联关系 源类中有一个实例属性,是对关联类的实例的引用 面向对象程序设计 1.抽象 (1)过程抽象 (面向过程) 面向过程的设计 (2)数据抽象 (面向对象) 类型=数据+操作 面向对象程序设计 2.封装 类里面封装了相关的数据和操作 数据被保护在抽象数据类型的内部 只有通过封装在数据外部的被授权的操作 优点: 类之间的耦合和交叉大大减少 降低了开发过程的复杂性 减少了可能的错误 保证数据的完整性和安全性 面向对象程序设计 继承 使用现有类的功能 可对这些功能进行扩展 继承方式 实现继承--复用代码 接口继承--定义操作 面向对象程序设计 多态性 不同对象对同一操作采用不同的行为 例:有人大叫“Cut” 面向对象设计原则 单一职责原则 一个类应该仅有一个引起它变化的原因 一个类的功能要单一,只做与它相关的事情。 面向对象设计原则 开放—封闭原则 软件是可以扩展的,但不可以修改 “变化才是不变的真理”, 使系统能在保持相对稳定下,适应改变 程序设计语言排行榜 程序设计语言 1.第一代语言(机器语言) 2.第二代语言(汇编语言) 3.第三代语言(高级语言)——Java, C#, Ruby, Python 4.第四代语言(简称 4GL) 非过程化语言, 只需说明“做什么”,不需描述“怎么做” 例:数据库查询SQL 程序设计语言 从层次上看语言 语言适合做什么? 不要用阳江小刀砍大树 不要用威猛电锯削水果 程序设计语言 程序设计语言 操作系统 软件开发经典 第一名:1333票《代码大全(第二版)》,两届Software Jolt Award震撼大奖得主!(Java, C, C++) 第二名:1181票 《程序员修炼之道》(软工) 第三名:701票 《计算机程序的构造和解释》(LISP) 第四名:572票 《C程序设计语言》(C) 第五名:481票 《算法导论》(伪码) 第六名:478票 《重构:改善既有代码的设计》(Java) 第七名:447票 《人月神话》(软工) 第八名:440票 《设计模式》(C++, Smalltalk) 第九名:394票 《计算机程序设计艺术(第一卷)》 第十名:364票 《编译原理》 程序设计语言 我的选择: Java(移动应用Android) ruby(Web应用/一般任务) C/C++(性能优化/没招了) 程序复杂度 程序: fact = 1; for i=1 to n do fact = fact * i; 分析: 一次乘法为一个基本操作 忽略i改变的时间 共f(n) = n次基本操作 程序复杂度 程序: sum = 0; for i=1 to n do for j=1 to n do sum = sum + a[i,j]; 分析: 基本操作:加法 忽略循环变量i和j的改变时间 共n2次基本操作 小结 结构化程序实现 数据流 过程(函数) 面向对象程序实现 数据抽象 封装 多态 选择适合项目的编程语言 程序复杂度按循环的次数估算 项目八 软件测试 项目八 软件测试 软件测试基础 软件测试方法 测试驱动开发(TDD) 软件测试报告 我的烂鞋被拿去做胶囊了么? 软件的可靠吗? 微软的软件:3~6 个/每千行 注:Vista系统含5500万行代码 XP系统含4500万行代码 已闲置不用的Wind 98仍有很多错误代码 什么是软件缺陷? 未达到产品说明书中已经标明的功能; 出现了产品说明书中指明不会出现的错误; 未达到产品说明书中虽未指出但应当达到的目标; 功能超出了产品说明书中指出的范围; 难以理解、不易使用,或用户认为使用效果不良。 软件缺陷严重性的级别 软件缺陷的产生★需求解释有误★需求定义有误★需求记录有误★设计说明有误★编码说明有误★程序代码有误★其他如数据输入有误等 修复缺陷的成本 软件测试 需求分析说明书概要设计说明书详细设计说明书源代码 ★软件测试不仅仅是对程序的测试,而是贯穿于软件定义和开发的整个过程 测试类型 单元测试 集成测试 系统测试 验收测试 单元测试 也称模块测试, 测试的对象是软件的程序模块(类), 如模块(类)及其操作 目的是检测程序模块中的错误故障: 模块(类)接口 模块(类)局部数据结构 覆盖测试 出错处理 边界条件 集 成 测 试 从单元到整个系统要经历多次集成, 每次都要进行相应的集成测试。 开始集成时规模较小,以白盒测试为主。 随集成规模的壮大,要以黑盒测试为主。 系 统 测 试 针对系统进行的综合测试, 目标不是找的缺陷,而是证明功能/性能要求 包括: 功能测试、 性能测试、 用户界面测试、 安全性测试、 压力测试、 可靠性测试、 安装/卸载测试等。 验收测试 产品交付用户之前进行的最后一次质量检验活动 产品是否符合预期要求,用户是否接受 明确验收测试通过的标准; 确定验收计划和方式; 确定测试结果的分析方法; 设计验收测试的用例; 执行测试,分析结果,决定是否通过验收。 软件测试的关键问题1. 测试由谁执行?2. 测试什么?3. 什么时候进行测试?4. 怎样进行测试? 如何进行软件测试? 软件测试的信息流 软件测试的原则 尽早地和不断地进行软件测试 测试用例由: 测试输入数据 对应的预期输出组成 程序员应避免检查自己的程序(错误) 应:程序最后要由测试人员测试通过 应包括合理的输入条件和不合理的输入条件 软件测试的原则 充分注意测试中的群集现象。 执行测试计划,排除测试的随意性。 应当对每一个测试结果做全面检查 需要: 测试计划、 测试用例、 出错统计、 最终分析报告 软件测试方法 软件测试报告 测试阶段最后的文档产出物 测试经理应具备良好的文档编写能力 报告包括产品质量和测试过程的评价 报告基于测试中的数据采集以及对最终的测试结果分析 什么是单元测试? 为什么做单元测试? 你的代码真的工作吗? 测试驱动开发 现实中的设计和开发 程序员心中的测试 测试驱动开发的优势 测试驱动开发的步骤(1) 测试驱动开发的步骤(2) 测试驱动开发的步骤(3) 测试驱动开发的步骤(4) 测试驱动开发和传统软件过程的不同 谁来写单元测试 什么时候写单元测试? 单元测试的工具 测试驱动开发举例(1) 测试驱动开发举例(2) 测试驱动开发举例(3) 测试驱动开发举例(4) 测试驱动开发举例(5) 测试驱动开发举例(6) 测试驱动开发举例(7) 测试套件(Test Suite)的结构 测试套件(Test Suite)举例 每晚构建与测试 利用Ant来做每晚测试 单元测试覆盖率 单元测试:总是100%通过 小结 软件测试 程序错误 测试类型 测试方法 测试驱动开发 单元测试 测试驱动方法 每晚构建 项目九 软件维护 项目九 软件维护 软件维护的类型 软件维护的成本 软件维护的方法 软件维护 软件系统交付使用以后, 为了改正错误 或满足新的需求而修改软件的过程。 维护的原因: (1)改正程序中的错误和缺陷 (2)改进设计以适应新的软、硬件环境 (3)增加新的应用范围 软件维护的类型 各类软件维护的比例 软件维护成本 软件维护工作量的模型 M是维护中消耗的总工作量 p是生产性工作量 K是一个经验常数 c是因缺乏好的设计和文档而导致复杂性的度量 d是对软件熟悉程度的度量。 系统大小 程序设计语言 系统年龄 数据库技术的应用 结构化的软件开发技术 软件维护活动 软件维护工作 修改软件需求说明 修改软件设计 设计评审 对源程序做必要的修改 单元测试 集成测试( 回归测试) 确认测试 软件配置评审等 软件维护问题总结 在每次软件维护任务完成后进行评审,做总结:(1) 设计、编码、测试中的哪一方面可以改进?(2) 哪些维护资源应该有但没有?(3) 工作中主要的或次要的障碍是什么?(4) 是否应当有预防性维护? 软件维护记录 软件可维护性 指纠正软件系统出现的错误和缺陷, 以及为满足新的要求 进行修改、扩充或压缩的容易程度。 是软件开发阶段各个时期的关键目标。 影响可维护性的因素 维护量化的度量 可维护性 在各类维护中的侧重点 提高可维护性的方法 建立明确的软件质量目标和优先级 使用提高软件质量的技术和工具 进行明确的质量保证审查 选择可维护的程序设计语言 改进程序的文档 软件开发期间各个检查点的检查重点 检查是否符合标准,是否满足规定的质量需求。 在不同的检查点,检查的重点不完全相同。 周期性地维护审查 对已有的软件系统,应当进行周期性的维护检查 软件修改,会导致软件质量下降,破坏程序概念的完整性 必须定期检查,做维护审查,以跟踪软件质量的变化 审查的结果同以前的结果比较,看在软件质量所起的变化 对于改变的原因应当进行分析 对软件包进行检查 软件包是标准化的,可为不同系统使用的软件 源代码和程序文档可提供或不提供给用户 维护人员要分析、研究: 用户手册、 操作手册、 培训教程、 验收测试报告等。 机器语言 汇编语言 高级语言 查询语言 报表生成语言 图像语言 应用生成语言 逆向工程 一、软件的逆向工程定义 分析已有的程序,寻求比源代码更高级的抽象表现形式。 二、相关概念: * 重构:转换系统描述; * 设计恢复:抽象出有关数据设计、总体设计等信息; * 再生工程:产生新版本; 重构例子(提取方法) Struts组件 Struts组件 Struts组件 Struts组件 Spring容器 Spring的IOC(控制反转) Hibernate体系结构 Hibernate体系结构 项目十 软件项目管理 项目十 软件项目管理 工作范围 进度计划 风险管理 人力资源 质量管理 软件项目管理的特点 软件项目管理 软件项目管理是指在软件开发过程中对项目的 成本、 人员、 进度、 风险、 质量 进行详细分析和控制的管理活动 风险管理-项目风险 实际案例: 在需求分析过程中,老王带领的需求分析小组和用户在进行交流的过程中发生了矛盾,出现了争吵,用户方说将不再配合需求分析小组的工作,而且他们确实没有配合开发方的工作 风险管理-风险来源 风险来源: 1.需求风险 2.计划编制风险 3.组织和管理风险 4.人员风险 5.开发环境风险 6.客户风险 7.产品风险 8.设计和实现风险 9.过程风险 风险管理-风险识别 根据风险的内容,风险分为: 1.产品规模风险 2.商业影响风险 3.客户特性风险 4.过程定义风 5.开发环境风险 6.技术风险 7.人员数目及经验带来的风险 风险管理的组成 风险评估 风险危险度 = 风险概率 × 风险损失 风险控制 风险监控 敏捷宣言 个体和交互 胜过 过程和工具 可以工作的软件 胜过 面面俱到的文档 客户合作 胜过 合同谈判 响应变化 胜过 遵循计划 敏捷规则 最高目标是能持续地、及早地向客户交付软件; 拥抱变化; 频繁地发布可运行的软件; 客户和开发人员在一起工作; 以人为本; 最重要的衡量开发过程的手段,是可工作的软件; 稳定的开发速度; 敏捷高效的设计; 简单有效; 重视Teamwork; 积极的调整 XP实践洋葱图 SCRUM的过程图 组建敏捷项目团队 敏捷项目团队由三种角色组成 1、Product Owner—由系统分析人员担任。负责收集和描述待开发产品的信息,并转换成待开发列表。解释和描述每一项任务的要求,项目开发过程中关注每个Story是否实现,解释其要求细节。 2、开发团队成员-由来自开发、测试、资料共同组成的多功能团队,负责构建产品。 3、Scrum Master-由熟悉敏捷的成员,负责帮助和指导团队按照敏捷方式操作。 除此之外,还有一个项目经理,负责整个团队的管理。 项目启动-搭建项目环境 搭建持续集成环境 敏捷项目需要维护一套唯一的持续集成环境,能够实现自动的从配置库获取代码、编译、静态检查和测试。 持续集成环境搭建,可采用ICP持续集成系统,联系软件工程部进行技术支持。 持续集成至少做到每天固定执行一次,也可根据配置库代码变化触发执行。 搭建开发环境 包含项目的编译等环境的配置等 搭建测试环境 尤其是自动化测试的环境,能够为持续集成系统调用执行 项目启动-准备及制订Product Backlog Product Owner分析待开发需求任务列表,形成产品Product Backlog,并按照商业价值排序。 Product Backlog是产品唯一的待开发任务列表(如示例),是对开发任务的初步简要描述,并附带工作量的初步估计。Backlog既可以包含新增需求、功能,也可以包含待解决的问题等(有点类似传统的AR列表) Product Backlog随项目进行,根据外部环境的变化,可能会不断调整,但是已经在迭代内实施的任务项将不受影响。 Product Backlog通常使用User Story形式分析描述。 用户故事 User Story User Story- User Story是站在外部的用户角度来描述系统所具有的功能/特性,并且此功能/特性能为客户感知。 User和Story的识别: 用户Users-使用到待开发系统的任何角色(包含人、也包含其他软件或程序),一般可以采用头脑风暴形式识别所有的Users. Story识别及描述: As a <Role>,I want <function>,so that<reason> 做为一个<XXX角色>,我希望<YYY功能>,以便<解决什么问题/原因> User Story通常是最小的用户感知粒度。 注意: 1、项目所有成员都可参与分析制作User Story(含开发、测试人员,资料人员也从使用资料的对象分析,形成资料User Story),这时候并不需要太多的系统实现内部细节。 2、User Story分析结果记录在《User Story模板》中,虽然敏捷可以记录在白板、卡片等形式上,但在公司内部实施的特定环境下,用文档记录还是比较好的。 划分迭代和开工会议 敏捷计划和开工会议包含: 1、Product Owner向开发团队介绍待开发任务Product Backlog,讨论各项需求任务的目标和背景,提供所有成员深入理解需求的机会。 2、开发团队集体从Product Backlog根据优先级,选择任务,初步划分迭代,设定迭代周期(迭代周期通常是固定周期,比如1-4周都是常见的迭代周期)。划分迭代时,通常从Backlog的优先级开始,结合需要的工作量进行划分。 3、完成迭代划分后,启动第一次迭代的分析工作,分解成任务,形成本迭代的Sprint Backlog. Backlog列举任务的大小不同,可能分解为一到多个任务项Task.各Task也可以用User Story形式进行描述。这时候会涉及到部分的实现细节。 敏捷中的迭代实施过程 敏捷项目中程序员的一天 每日晨会(站立式会议) 15分钟的站立式会议,通常在早上进行。 每个成员介绍三个事情: 从上次会议结束后,完成了哪些工作? 到下次会议前,将准备完成哪些工作? 工作中还存在哪些障碍? Product Owner和所有项目成员必须参与会议。 每日晨会后,项目经理负责更新每项任务的进展情况。 迭代评估和回顾会议 在每次迭代结束时,进行迭代评估,团队展示他们所构造出的产品。 参加人员:所有项目成员,以及项目的客户。 不需要准备PPT胶片材料,只需要如实的展示工作进展即可。 同时回顾当前做得好的和不足的,以便在下一个迭代中改进。 通常,迭代评估紧接召开下一个迭代的计划会议。 测试如何参与敏捷项目
50KB
SQL Server 2008数据库设计与实现(关系数据库实现的通关宝典)--随书源代码
2013-02-06CruiseYoung提供的带有详细书签的电子书籍目录 http://blog.csdn.net/fksec/article/details/7888251 该资料是《SQL Server 2008数据库设计与实现》的随书源代码 对应的书籍资料见: SQL Server 2008数据库设计与实现(关系数据库实现的通关宝典) 基本信息 原书名: Pro SQL Server 2008 Relational Database Design and Implementation 原出版社: Apress 作者: (美)Louis Davidson Kevin Kline 译者: 程桦 张绪业 丛书名: 图灵程序设计丛书 数据库 出版社:人民邮电出版社 ISBN:9787115215543 上架时间:2009-10-30 出版日期:2009 年11月 开本:16开 页码:560 版次:1-1 编辑推荐 资深数据库专家的心血力作 SQL Server设计思想的独到解析 关系数据库实现的通关宝典 内容简介 本书深入浅出地介绍了目前世界上最受欢迎的数据库管理系统之一——sql server。全书共分三个部分:第一部分阐释了数据库的基本概念,讲解了数据库建模语言;第二部分展示了从概念建模到在 sql server 2008上真正实现数据库的过程;第三部分深入探讨了 sql server若干方面的技术细节,如数据保护、索引、并发访问等。通过将理论融入数据库实践,清晰地讲解了关系型数据库的设计原则,完整地展示了如何进行良好的关系型数据库设计,深入揭示了 sql server 2008的技术细节。. 本书浓缩了作者作为 sql server数据库架构师多年来丰富的实践经验,适合各类数据库开发和管理人员学习参考。... 作译者 作者: Kevin Kline是Quest软件公司SQL Server解决方案的技术战略经理。Kevin从2004年开始就是微软的SQL Server MVP,他是国际SQLServer专家联盟(PASS)创辽委员会的成员和下一届总裁。他独自写作或参与合著了好几本书,包括SQL in a Nutshell(O'Reilly,2004)、Pro SQL Server 2005 Database Design and Optimization(Apress,2006)以及Database Benchmarking:Practical Methods for Oracle&SQL; Server(Rampant,2007)。Kevin给SQL Server Magazine和Database Trendv and Applications杂志供稿,他的博客可以在SQLBlog.com和SQLMag.com上找到。在世界范围内的会议上,比如微软的Tech Ed、PASS社区峰会、微软汀论坛、DevTeach以及SQLConnections,Kevin也是人气最高的演讲者。从1986年开始Kevin就活跃在IT工业中。.. Kurt Windisch是Levi,Ray,and Shoup,Inc.公司内部IT部门的应用程序监管,该公司是——家技术方案的全球供应商,总部位于伊利诺伊州的Springfield。Kurt在IT工业中的经验超过了17年。他在SQL Server专家联盟的董事会中服务了5年,为很多SQL Server杂志供过稿,也在讨论SQL Server数据库编程的国际会议上发过言。 Louis Davidson,作为企业数据库开发人员和架构师,他拥有超过15年的工作经验。目前他是田纳西州Nashville的Christian广播网络和NorthStar工作室的数据架构师。对于Louis而言,他全部的职业经验几乎都与微软的SQL Server有关,从早期版本一直到当前最新版本的Beta版。Louis是一本讲数据库设计的书的4个版本的主要作者。Louis主要的兴趣领域是数据库架构和用T-SQL编码,并且,他设计过许多数据库,在这许多年中编写过数以千计的存储过程和触发器。 Scott Klein是一位独立咨询师,对SQL Server、.NET和XML相关的所有知识都充满热情。他是几本书的作者,这包括Professional SQL Server 2005 XML(Wrox,2006)和Professional LINQ(Wrox,2008),他还为SQL PASS Community Connector写每两周一次的特辑文章。他也为好几个网站供稿,这包括Wrox(http://www.wrox.com)和TopXML(http://www.topxml.com
4.79MB
Highcharts-Gantt-8.1.2.zip
2020-08-11Highgantt 是用纯 JavaScript 编写的甘特图控件 主要优势(功能特点) browsers兼容性 Highstock 可以在所有的移动设备及电脑上的浏览器中使用,包括 iPhone,iPad 和 IE6 以上的版本。在 IOS 和 Android 系统中 Highstock 支持多点触摸功能,因而可以给您提供极致的用户体验。在现代的浏览器中使用 SVG 技术进行图形绘制,在低版本 IE 则使用 VML 进行图形绘制。 free非商业使用免费 在个人网站、学校网站及非盈利机构中使用 Highstock 完全不需要经过我们的许可,直接可以任意使用! 商业网站或网站,请查看我们的 使用协议及价格。 open开源 Highstock 最重要的特点之一就是:无论免费版还是付费版,你都可以下载源码并可以对其进行编辑。 基于开源社区我们可以第一时间获取用户的需求、Bug 修复及吸收社区贡献。 no-backend纯 JavaScript Highstock 完全基于 HTML5 技术,不需要再客户端安装任何插件,如 Flash 或 Java。此外你也不用配置任何服务端环境,不需要 PHP、Tomcat、ASP.NET 等,只需要两个 JS 文件即可运行。 chart-types图表种类丰富 Highstock 支持直线图、折线图、面积图、面积曲线图、柱形图、散点图、蜡烛图(OHLC)、K线图、标签图、面积范围图、柱形范围图等多种图表, 其中很多图表可以集成在同一个图形中形成混合图 config-syntax简单的配置语法 在 Highstock 中设置配置选项不需要任何高级的编程技术,所有的配置都是 JSON 对象,只包含用冒号连接的键值对、用逗号进行分割、用括号进行对象包裹。JSON 具有易于人阅读和编写,同时也易于机器解析和生成的特点。 动态交互性 Highstock 支持丰富交互性,在图表创建完毕后,可以用丰富的 API 进行添加、移除或修改数据列、数据点、坐标轴等操作。 结合 jQuery 的 ajax 功能,可以做到实时刷新数据、用户手动修改数据等功能,结合事件处理,可以做到各种交互功能。 范围选择器 在处理大数据集时,我们可能需要查看不同时间范围的数据。Highstock 提供了范围选择器,方便的用它来选择预设范围的时间,例如 1个月、一季度、1年等,你可以通过时间输入框来选择自己想要查看数据范围。 滚动条和导航器 通过滚动条和导航器可以更加直观的操作和查看特定范围的数据。 事件标记 通过添加标志数据列可以为数据相关的事件做标记和注释。 支持多坐标轴 多个数据进行对比这是非常常见的需求,Highstock 可以让你为每个类型的数据添加坐标轴,每个轴可以定义放置的位置,所有的设置都可以独立生效,包括旋转、样式设计和定位,当然也支持多个数据共用一个坐标轴。 tooltip数据提示框 当鼠标划过图形时,Highstock 可以将数据点或数据列的信息展示在提示框中,并且提示框会跟随用户的鼠标;我们做了大量工作,可以智能的显示离鼠标最近的点或被遮盖点的信息。 datetime时间轴 Highstock 对时间轴的处理非常智能,可以精确的计算出月、周、日、小时、分钟等时间刻度的位置。 data grouping数据分组与合并 如果数据集包含 10 万个,浏览器对每个点进行计算并渲染的话效率会非常低。Highstock 具有数据分类功能,可以以飞速的进行数据分组;放大至小范围的数据是会重新分组,因为你可以查看高度清晰的数据又不失效率和速度。 exporting导出和打印 Highstock 支持导出功能,用户可以一键导出 PNG、JPEG、PDF 或 SVG 文件,通过插件可以实现导出为 Excel 文件功能;另外,用户还可以从网页上直接打印图表。 zooming缩放和平移 除了通过滚动条或导航器控制放大和平移功能,你还可以通过鼠标和手指来进行这两个操作。 ajax方便加载外部数据 Highstock 的数据是 JavaScript 数组或对象,这些数据可以是本地的配置对象,独立的数据文件(JSON、CVS)甚至是不同的网站上定义。另外,这些数据可以用任何形式处理好并加载到 Highstock 中。
4.62MB
ecshop 2.5正式版
2008-12-08ECShop是Comsenz公司推出的一款B2C独立网店系统,适合企业及个人快速构建个性化网上商店。系统是基于PHP语言及MYSQL数据库构架开发的跨平台开源程序。 ECShop悉心听取每一位商家的需求与建议,不仅设计了人性化的网店管理系统帮助商家快速上手,还根据中国人的购物习惯改进了购物流程,实现更好的用户购物体验。 经过近两年的发展,ECShop网店系统无论在产品功能、稳定性、执行效率、负载能力、安全性和SEO支持(搜索引擎优化)等方面都居国内同类产品领先地位,成为国内最流行的购物系统之一。 灵活的模版机制 ECShop开发了独有的高效模板引擎(2.15以前版本使用smarty模板引擎),并结合了Dreamweaver的模板和库功能,使得编辑制作模板变得更简单。 开放的插件机制 支付、配送,会员整合都是以插件形式实现。商家可以随时增加或变更的支付方式和配送体系。ecshop支持大部分php开发的论坛系统,包括discuz,phpwind等,只需在后台做简单参数配置,即可完成会员整合。 功能 AJAX 化 ECSHOP 使用目前流行的 AJAX 技术,批量数据编辑变得更迅速,方便。 促销功能 ECSHOP提供了积分、红包、赠品,夺宝奇兵等多种促销方法。 高效率的代码和执行性能 通过优化代码与数据库结构,配合ecshop独家设计的缓存机制,在不考虑网速的情况下,网店动态页面与纯静态页面访问速度相当。 常规功能的更完善实现 针对常规功能尤其是后台管理和购物流程,ECShop进行了更简洁的设计,实现更好的用户体验。 搜索引擎优化 在 SEO (搜索引擎优化)上,ECShop独家支持两种 URL 重写方式,并且是同类软件中第一家支持 google / yahoo / microsoft 三家共同发布的 sitemaps 0.9 网站索引规范,能够为站点被搜索引擎收录做到最大限度的支持和帮助。 内置手机短信网关 ECShop内置手机短信网关,支持会员信息群发,订单提醒等功能。 多语言支持 支持简体,繁体,英文。 源代码开放 用户可根据自己的需求对ECSHOP进行定制,扩展。 ECSHop历史 ECShop 2005年底,2006年初,高春辉和李梁(时任手机之家总经理),因为在给朋友建网上商城的时候,发现没有一个好用的商城软件,萌生了自己制作一个的商城软件的想法。 2006年3月,从零开始招兵买马,团队组建出来,2006年6月,ECShop推出第一个版本1.0,但应为功能比较单一,最终使用的用户没有超过10个。 2006年6~7月,高春辉开始全面介入ECShop的开发管理工作,大大的加速了ECShop的开发进度,在推出 2.0版本之后,陆续推出了2.0.1,2.1,2.1.1.,2.1.2,2.1.3等版本后,用户群逐步扩大,安装量突破5万。 2007年5~6月,ECShop管理层与康盛世纪接触,最终确定,将ECShop卖给康盛世纪。 2007年6~7月,ECShop完成了一个重要的项目摩托罗拉手机商城 http://www.motostore.com.cn/. 2007年9月,ECShop团队全部迁至康盛世纪上班,交易完成。 2007年9月,ECShop分为两个团队,ECShop|(买否网)Maifou.com ,(卖否网)Maifou.net;ECMall. ECShop团队介绍: 高春辉 著名第一代互联网人,1989年接触电脑,1997年创建了当时访问量最高的个人主页“ 高春辉的个人网站”,被评为中国十大个人网站第一名。1999年受金山公司邀请,共同发起金山卓越网并担任总经理。2002年创立手机之家。ECSho创始人,ECShop灵魂,主要负责产品规划、定义,带领开发团队。 李梁 擅长团队管理、运营,多年互联网公司从业经验。中科院软件工程硕士在读,曾供职于方正技术研究院、263网络,后加盟手机之家,任手机之家总经理,将手机之家带入一个高速发展的时期。ECSho创始人,主要负责团队管理,公司运营、管理、DB等工作。 刘伟 早年即开始从事互联网开发工作,2001年曾著有《狂人日记:狂人部落网站建设实录》一书,2004年先后与搭档开发 UltraCMS 、UltraShop并运营,有丰富的互联网产品规划及研发能力。ECShop创始人之一,核心团队成员,任ECShop技术总监。 成功案例 摩托罗拉 http://www.motostore.com.cn/ 2007年8月29日,摩托罗拉公司牵手ECShop对外开通了其网上商城系统,此举意味着这个全球五百强企业之一的通讯巨头正式涉水国内B2C电子商务市场。摩托罗拉因在无线和宽带通讯领域的不断创新和领导地位而闻名世界。摩托罗拉是世界财富百强企业之一,拥有全球性的业务和影响力,2006年的销售额为428亿美元。 联想阳光在线 http://digistore.lenovo.net/ 联想阳光在线 是联想专为联想产品用户提供网络增值应用的客户服务门户网站。阳光在线是联想阳光服务体系的有机组成部分,通过互联网在线运营基于联想信息终端设备的增值服务产品,联合业界优质服务资源,为终端客户提供的一系列在线增值应用服务。作为联想中国推出的 7 大业务之一,联想阳光在线的 Vision 是利用在线服务改善客户使用信息终端的方式,客户可以通过使用联想阳光在线的应用服务不断会用电脑、用好电脑、爱用电脑,更便捷体验互联网的精彩。 海尔商城 http://www.ehaier.com/ 海尔集团创办的家电系列商品网上直销。 16397数码[font color=#000000]商城[/font]http://www.16397.com/ 16397数码商城公司一直致力开创手机及配件的网上销售领域。凭借完善的销售体系,得到国内外多家知名品牌厂商的认可,如多普达、诺基亚等等,华龙数码商城做为的大型手机销 售商家,被多普达、诺基亚等厂商指定网上专卖运营商。
1.24MB
LZZ Virtual Drive
2010-03-29LZZ Virtual Drive 在win7下面可以用的虚拟光驱 (就只有一个文件超好用,我现在就用这个,打开ISO文件很好用的哦)以前XP上可以用的虚拟区现在都用不了 这个是在win7 只是想赚点积分在这网站下看点东西。
832KB
最好用的UPX 图形界面外壳程序3.5(最新)
2010-11-21最新的upx shell[更新了上次的一些小错误]单文件版,包含upx3.07,界面已汉化,也可加载其它语言,可以指定要压缩的资源,也可排除不能压缩的资源(如屏保文件的字符串资源1) .
53.4MB
SQL Server 2008数据库设计与实现(关系数据库实现的通关宝典)--详细书签版
2013-02-06CruiseYoung提供的带有详细书签的电子书籍目录 http://blog.csdn.net/fksec/article/details/7888251 SQL Server 2008数据库设计与实现(关系数据库实现的通关宝典) 基本信息 原书名: Pro SQL Server 2008 Relational Database Design and Implementation 原出版社: Apress 作者: (美)Louis Davidson Kevin Kline 译者: 程桦 张绪业 丛书名: 图灵程序设计丛书 数据库 出版社:人民邮电出版社 ISBN:9787115215543 上架时间:2009-10-30 出版日期:2009 年11月 开本:16开 页码:560 版次:1-1 编辑推荐 资深数据库专家的心血力作 SQL Server设计思想的独到解析 关系数据库实现的通关宝典 内容简介 本书深入浅出地介绍了目前世界上最受欢迎的数据库管理系统之一——sql server。全书共分三个部分:第一部分阐释了数据库的基本概念,讲解了数据库建模语言;第二部分展示了从概念建模到在 sql server 2008上真正实现数据库的过程;第三部分深入探讨了 sql server若干方面的技术细节,如数据保护、索引、并发访问等。通过将理论融入数据库实践,清晰地讲解了关系型数据库的设计原则,完整地展示了如何进行良好的关系型数据库设计,深入揭示了 sql server 2008的技术细节。. 本书浓缩了作者作为 sql server数据库架构师多年来丰富的实践经验,适合各类数据库开发和管理人员学习参考。... 作译者 作者: Kevin Kline是Quest软件公司SQL Server解决方案的技术战略经理。Kevin从2004年开始就是微软的SQL Server MVP,他是国际SQLServer专家联盟(PASS)创辽委员会的成员和下一届总裁。他独自写作或参与合著了好几本书,包括SQL in a Nutshell(O'Reilly,2004)、Pro SQL Server 2005 Database Design and Optimization(Apress,2006)以及Database Benchmarking:Practical Methods for Oracle&SQL; Server(Rampant,2007)。Kevin给SQL Server Magazine和Database Trendv and Applications杂志供稿,他的博客可以在SQLBlog.com和SQLMag.com上找到。在世界范围内的会议上,比如微软的Tech Ed、PASS社区峰会、微软汀论坛、DevTeach以及SQLConnections,Kevin也是人气最高的演讲者。从1986年开始Kevin就活跃在IT工业中。.. Kurt Windisch是Levi,Ray,and Shoup,Inc.公司内部IT部门的应用程序监管,该公司是——家技术方案的全球供应商,总部位于伊利诺伊州的Springfield。Kurt在IT工业中的经验超过了17年。他在SQL Server专家联盟的董事会中服务了5年,为很多SQL Server杂志供过稿,也在讨论SQL Server数据库编程的国际会议上发过言。 Louis Davidson,作为企业数据库开发人员和架构师,他拥有超过15年的工作经验。目前他是田纳西州Nashville的Christian广播网络和NorthStar工作室的数据架构师。对于Louis而言,他全部的职业经验几乎都与微软的SQL Server有关,从早期版本一直到当前最新版本的Beta版。Louis是一本讲数据库设计的书的4个版本的主要作者。Louis主要的兴趣领域是数据库架构和用T-SQL编码,并且,他设计过许多数据库,在这许多年中编写过数以千计的存储过程和触发器。 Scott Klein是一位独立咨询师,对SQL Server、.NET和XML相关的所有知识都充满热情。他是几本书的作者,这包括Professional SQL Server 2005 XML(Wrox,2006)和Professional LINQ(Wrox,2008),他还为SQL PASS Community Connector写每两周一次的特辑文章。他也为好几个网站供稿,这包括Wrox(http://www.wrox.com)和TopXML(http://www.topxml.com)。他经常同佛罗里达附近的SQL Server和.NET用户群体交流。Scott住在佛罗里达的Wellington,当他不坐在计算机前时,你会发现他和自己的家人在一起,或者骑着他的雅马哈摩托车轰鸣在当地的摩托车越野赛赛道上。你可以通过ScottKlein@SqlXml.com联系他。 目录 封面 -17 封底 -16 扉页 -15 版权 -14 译者序 -13 关于作者 -12 序 -11 前言 -10 致谢 -6 目录 -4 第1章 数据库概念简介 1 1.1 数据库设计阶段 2 1.1.1 概念阶段 3 1.1.2 逻辑阶段 5 1.1.3 实现阶段 5 1.1.4 物理阶段 6 1.2 关系数据结构 6 1.2.1 数据库和模式 6 1.2.2 表、行和列 7 1.2.3 信息原则 10 1.2.4 域 12 1.2.5 元数据 13 1.2.6 键 13 1.2.7 未显式赋值的项(NULL) 18 1.3 实体之间的关系 20 1.3.1 二元关系 21 1.3.2 非二元关系 24 1.4 数据访问语言(SQL) 24 1.5 理解依赖性 25 1.5.1 函数依赖性 26 1.5.2 判定 26 1.6 总结 27 第2章 数据建模语言 28 2.1 数据建模介绍 28 2.2 实体 29 2.3 属性 32 2.3.1 主键 33 2.3.2 替代键 35 2.3.3 外键 35 2.3.4 域 36 2.3.5 命名 38 2.4 关系 39 2.4.1 识别性关系 40 2.4.2 非识别性关系 40 2.4.3 角色名字 43 2.4.4 关系基数 44 2.4.5 动词短语(关系名字) 49 2.5 描述信息 51 2.6 其他建模方法 52 2.6.1 信息工程 53 2.6.2 Chen ERD 54 2.6.3 Visio 55 2.6.4 Management Studio数据库关系图 56 2.7 最佳实践 57 2.8 总结 57 第3章 概念阶段数据建模 59 3.1 理解需求 60 3.2 文档化过程 61 3.3 需求收集 62 3.3.1 客户访谈 63 3.3.2 要回答的问题 64 3.3.3 现存的系统和原型 67 3.3.4 其他类型的文档 67 3.4 识别对象和过程 69 3.4.1 识别实体 70 3.4.2 实体间关系 76 3.4.3 识别属性和域 82 3.5 识别业务规则和业务过程 90 3.5.1 识别业务规则 90 3.5.2 识别基础业务过程 92 3.6 完成概念模型 93 3.6.1 识别明显的、额外的数据需求 94 3.6.2 和客户一起评审 95 3.6.3 重复以上步骤直到客户同意你的模型 95 3.7 最佳实践 95 3.8 总结 96 第4章 规范化过程 97 4.1 为什么要规范化 98 4.1.1 消灭重复数据 98 4.1.2 避免编写不必要的代码 98 4.1.3 给表瘦身 98 4.1.4 最大化聚集索引的使用 99 4.1.5 降低每张表中索引的数量 99 4.2 规范化应该走多远 99 4.3 规范化过程 100 4.4 实体和属性的形式:第一范式 100 4.4.1 所有属性必须是原子的 101 4.4.2 实体的所有实例必须包含相同数量的值 104 4.4.3 实体中出现的所有实体类型都必须不同 106 4.4.4 第一范式所避免的不规则编程 106 4.4.5 当前设计不符合第一范式的线索 110 4.5 属性间的关系 111 4.5.1 第二范式 111 4.5.2 第三范式 116 4.5.3 Boyce-Codd范式 121 4.6 实体中的多值依赖 124 4.6.1 第四范式 124 4.6.2 第五范式 135 4.7 非规范化 136 4.8 最佳实践 136 4.9 总结 137 4.10 额外的例子 137 4.11 本书迄今为止所讲述的故事 142 第5章 实现基础的表结构 144 5.1 评审逻辑设计 147 5.2 变换设计 148 5.2.1 选择名字 148 5.2.2 处理子类型 151 5.2.3 决定树的实现方式 155 5.2.4 选择键的实现方式 156 5.2.5 决定域的实现方式 161 5.2.6 设置模式 172 5.2.7 评审“最终的”实现模型 172 5.3 实现设计 173 5.3.1 创建基本表结构 175 5.3.2 添加唯一性约束 183 5.3.3 构建默认约束 189 5.3.4 添加关系(外键) 195 5.3.5 处理排序规则和排序 205 5.3.6 计算列 209 5.3.7 实现用户定义的数据类型 212 5.3.8 文档化你的数据库 220 5.3.9 处理依赖信息 222 5.4 最佳实践 225 5.5 总结 226 第6章 保护数据的完整性 228 6.1 最佳实践 229 6.2 自动数据保护 231 6.2.1 声明性数据保护 231 6.2.2 基本语法 233 6.2.3 基于简单表达式的CHECK约束 235 6.2.4 基于函数的CHECK约束 237 6.2.5 约束引起的错误 242 6.2.6 DML触发器 244 6.2.7 处理来自触发器和约束的错误 277 6.3 手动数据保护 280 6.4 更多最佳实践 287 6.5 总结 287 第7章 模式与查询技术 289 7.1 预计算值 290 7.1.1 序列表 290 7.1.2 日期计算 297 7.2 二进制大型对象(BLOB) 305 7.3 存储用户自定义数据 307 7.3.1 一长串通用列 308 7.3.2 实体-属性-值(EAV) 309 7.3.3 往表中增加列 313 7.4 通用实现对象 318 7.5 反模式 319 7.5.1 多用途键域 320 7.5.2 通用键引用 322 7.5.3 对非结构化数据的过度使用 325 7.6 总结 326 7.7 回顾与展望 326 第8章 数据访问安全 328 8.1 安全主体与安全对象 329 8.2 数据库安全概述 330 8.2.1 模拟 331 8.2.2 权限 333 8.2.3 控制对象访问 334 8.2.4 角色 338 8.2.5 模式 344 8.3 通过T-SQL编程对象控制对象访问 345 8.3.1 存储过程和标量函数 346 8.3.2 对象内模拟 347 8.3.3 跨数据库边界 352 8.3.4 不同的服务器(分布式查询) 357 8.4 视图与表值函数 357 8.4.1 一般用法 358 8.4.2 使用视图实现可配置的行级安全 360 8.5 数据混淆 364 8.6 监视与审核 367 8.6.1 服务器与数据库审核 367 8.6.2 使用DML触发器查看表的变更历史 371 8.6.3 DDL触发器 374 8.6.4 分析器日志 377 8.7 最佳实践 379 8.8 总结 380 第9章 表结构与索引 382 9.1 数据库物理结构 383 9.1.1 文件与文件组 383 9.1.2 分区与页 386 9.1.3 页中的数据 388 9.1.4 分区 391 9.2 索引概览 393 9.3 基本索引结构 393 9.4 索引类型 395 9.4.1 聚集索引 395 9.4.2 非聚集索引 397 9.4.3 聚集表上的非聚集索引 398 9.5 索引创建的基本方法 400 9.6 基本的索引使用模式 402 9.6.1 使用聚集索引 403 9.6.2 使用非聚集索引 405 9.6.3 使用唯一索引 416 9.7 高级的索引使用案例 416 9.7.1 外键索引 416 9.7.2 索引视图 419 9.8 最佳实践 422 9.9 总结 423 第10章 并发编程 425 10.1 什么是并发 426 10.2 查询优化的基础知识 427 10.3 操作系统与硬件因素 428 10.4 事务 429 10.4.1 事务语法 430 10.4.2 已编译的SQL Server代码 437 10.5 SQL Server并发控制 444 10.5.1 锁 445 10.5.2 隔离级别 448 10.6 完整性与并发性编程 459 10.6.1 悲观锁定 459 10.6.2 实现单线程代码块 461 10.6.3 乐观锁定 463 10.6.4 基于行的锁定 464 10.6.5 逻辑工作单元 469 10.7 最佳实践 470 10.8 总结 471 第11章 数据访问策略 472 11.1 即席SQL 473 11.1.1 优点 474 11.1.2 缺陷 480 11.2 存储过程 484 11.2.1 封装性 485 11.2.2 动态存储过程 486 11.2.3 安全性 488 11.2.4 性能 490 11.2.5 缺陷 491 11.2.6 观点 495 11.3 T-SQL与CLR(公共语言运行时) 497 11.3.1 选择T-SQL的准则 500 11.3.2 选择.NET的准则 501 11.3.3 CLR对象类型 501 11.4 最佳实践 503 11.5 总结 504 附录A Codd的RDBMS十二法则 506 附录B 标量数据类型参考 511 索引 538 译者序 如果将数据库称为现代数字生活的基础,那么这样的说法一点也不夸张——大型企业应用、网站,所有这些东西的背后,都是数据库在支撑。并且,最终说来,产生价值的并不是绚丽的界面和现代化的输入方式,而是存放在数据库中的数据。不幸的是,虽然关系型数据库历经了约30年的发展,有成熟的理论和大量的实践基础,但是,大多数设计、开发人员在设计数据库结构时仍然是“跟着感觉走”,根据业务的需要和编程的方便,把字段这张表放几个那张表放几个完事。对这样设计出来的数据库,只需多问几个为什么——业务模型是如何体现的?数据完整性如何保证?性能是如何权衡的?——恐怕设计者就该崩溃了。. 这也难怪,设计、开发人员在学校中学习数据库时,理论书籍离实际开发较远——试问有几个人能够以可实践的方式把规范化的几条原则阐述清楚?在工作时,使用的数据库资料和书籍又往往是“手册型”,大多仅仅讲解特定数据库提供的功能。 正如作者所说——“我的书目标很简单,那就是填补这个空白,架起学院教科书与通常针对SQL Server所写的,纯粹面向实践的书之间的桥梁”。翻译的过程中,译者感到此言不虚:作者从数据库的基本概念到数据库建模,从如何运用规范化原则到如何做成实际的数据库表,从如何保护数据库完整性到如何提高数据库的性能,从数据库的安全机制到并发事务控制,从数据库设计开发的常用模式到应用程序的数据访问策略,既有理论又紧扣实践。阅读本书的过程,就是把一些以前模糊地知道,但又觉得很难运用的理论实实在在地运用到实践中的过程。 虽然本书是针对SQL Server这个特定数据库平台来阐述理论和实践的,然而,本书所体现的思想和方法,完全可以运用到其他关系数据库平台上。.. 翻译的时间很紧,如果没有家人的支持和理解,很难想象如何完成这项工作。 感谢人民邮电出版社图灵公司很好地推动了这本书的翻译工作。另外,图灵公司的论坛上丰富的资料和活跃的讨论也使我们眼界大开,受益良多。 翻译工作并非阐述自己的思想,翻译的第一要务是忠实地传达原著者的思想。虽然无法自由地表达自己的想法,然而,翻译的快乐就在于:使另一个人的好想法能让更多的人了解。当然,由于时间紧张,译者水平有限,错误粗糙之处相信不在少数,敬请广大读者批评指正。 感谢我的妻子魏萍,你容忍我一吃完饭就坐到计算机前。谢谢女儿程灵馨,在爸爸不能陪你玩时,5岁的你居然也表示理解。谢谢作者Louis Davidson,你耐心地回答了我的问题。 程桦 感谢我的未婚妻张艳,是你的鼓励和体贴让我在寒冷的冬日伏案不辍。还要感谢我的家人,你们殷殷的期盼让我产生了对知识的不渝追求。... 张绪业 2009年5月 前言 我经常扪心自问,“为什么要做这件事?为什么还要写新版本?这值得吗?如果我抛开书去打任天堂游戏机,我是不是能帮超级玛丽快点把公主救出来?”在微软MVP 2008年峰会上,这些问题都由一位MVP帮我回答了。他感谢我写了这本书,说他曾经试着读点这方面的大学教材,但那些书都太难了,读不太懂。. “喔,是的,”我想,“那是我最开始要写这本书的原因。”当我最早开始设计数据库时,我从几位伟大的导师那里学到了不少东西,但是,当我想进一步深入研究时,我开始寻找数据库设计方面的材料,但没找着多少。我找到的最好的一本书是Chris Date的An Introduction to Database Systems(Addison Wesley,2003),然后我读了自己能读懂的部分。然而,我很快就有点晕头转向,没法做到一旦理解了概念之后,就能很好地将关于设计的理论转换到真正的、同时较为简单的设计过程中去。在我所使用的Chris和其他人的教材中,很明显,创建关系模型这件事包含了太多理论,甚至是数学知识。 如果你想要成为一名理论家,那Chris的书就是必读的,当然,除此之外还有很多可以参考的书(最好去看看http://www.dbdebunk.com/books.html,你会找到更多的书)。问题在于,这些书大多数都包含了太多的理论,超出了一般实践工作者所需了解的(或者愿意花时间去读的)内容,并且它们没有真正地深入到实际数据库系统的实现中去。我的书的目标很简单,那就是填补这个空白,在大学教材与通常针对SQL Server所写的、纯粹面向实践的书之间架起一座桥梁。我的目的不是顶替这些书,完全不是,在我的书架上有很多这样的书。本书更像是一本面向技术的书,而不是讲解SQL Server功能的使用手册。我将介绍关系引擎的大多数典型功能,教给你使用它们的技术。然而,我不能说这是你书架上需要的唯一一本书。 如果你有本书以前的版本,你可能会问为什么还需要这个新版本,我了解你的感受。我花了大量时间找出应该买这个新版本的理由,而这个理由并不那么明显——那就是,我现在涵盖了2008的所有功能。很明显,这只是部分原因,最重要的是,我一直在努力加入更多新内容让你的工作更轻松。我加入了一章(第7章)介绍开发模式,每一章中也都加入了大量新材料,从而能帮你改进数据库设计。 诗人和剧作家奥斯卡王尔德曾经说过:“只有年轻人才会无所不知。”现在回头看时有点后悔,自己在写第一本书Professional SQL Server 2000 Database Design之前,以为自己什么都知道。正是那种无知和放纵不羁的热情,才让我有勇气写下第一本书。最后,我确实完成了第一本书,它之所以还不错,主要归功于技术编辑给予的批评。并且,如果我没有最初那种驱使我写完书的热情的话,我也不可能写这本书的第四版。无论如何,如果你花几周的时间逐章逐节地比较了这些书的每个版本的话,你会发现这是个内容逐步丰富的过程,而且作者也在逐步成熟。 过程的逐步丰富和作者的逐渐成熟都有其原因。一个原因是过去两个版本以来我所碰到的编辑:首先是Tony Davis,现在是Jonathan Gennick。他们两人对我的文风都多有指摘,并且他们把本书的结构调整得很棒。另一个原因可以简单地归结为经验,因为从我开始写第一版以来已经过了8年。但是,书中所用的材料之所以有进步,最大的原因还是它们经过了检验。一方面我在对别人贡献着自己的好评论,另一方面我也收到了大量关于如何改进的反馈(其中一些评论可不那么友善)。我非常用心地倾听,从书发布那天开始就记一系列笔记。对于我能用得上的任何反馈,我都会感到很高兴。可以用电子邮件联系我(louis@drsql.org),如果你愿意也可以在我的网站(drsql.org)留下匿名反馈。你可以在网站上找到一个附录,里面含有我希望自己在写这本书时就了解了的材料。 数据库设计的目的 数据库设计的目的是什么?你到底为什么要关心这事?主要的原因是设计良好的数据库用起来很简单,因为所有东西都在其应处于的逻辑位置上。这非常像一个收拾得很好的橱柜,如果你需要红辣椒粉,直接到调味品搁架的红辣椒粉那格就能取到,这就比到处乱找要强得多。但是,许多系统组织得一团糟。即使每件东西都有一个分好的地方,如果找起来很困难,那件东西也就没啥价值了。想象如果一本电话簿完全没有排序会如何?或者,编排字典的时候把词任意放在文字中能放下的地方又会如何?数据库如果组织良好的话,即使要写一两个联结,你也可以靠本能就知道去哪里获取需要的数据。我的意思是,说到底,这难道不是件很有趣的事吗?.. 你也可能吃惊地发现,数据库设计是件相当简单的任务,不像听起来那么困难。与随着项目进行而拼凑数据存储相比,要做好这件事需要在项目一开始多花些时间,但是,在项目的整个生命周期中,这样做能获得相应回报。要想正确地进行数据库设计,我们面对的最具挑战性的问题是:与不做设计相比,正确地设计数据库会花更多的时间(在项目计划会议上,关于时间的争论经常发生)。因为数据库设计没有什么可见的东西来让客户感到赏心悦目,因此这一阶段经常会被压缩,目的就是让事情看起来进行得较快。对于普通客户而言,即使是最没有挑战性、最不让人感兴趣的用户界面也比最漂亮的数据模型要吸引人得多。虽然一般说来,数据才是投资创建系统的最终原因,但是,用户界面编程往往占据了中心地位。并不是说你的同事没有注意到一个糟糕的数据模型与一个漂亮的数据模型之间的区别,他们确实注意到了,但是,当程序员需要编码时,往往会顾不上考虑如何能正确地存储数据。我希望自己知道这个难题的答案,因为要是有这个答案,我的书会卖出一百万本。本书将努力提供一些技术和过程,帮助你进行数据库设计,力求对新手清晰易懂,对老练的专家也有所助益。 这个设计和架构数据存储的过程与数据库安装和管理的角色并不相同。例如,作为数据架构师的角色,我很少去创建用户、执行备份,或者去设置复制与集群。我很少谈及这些任务,它们被认为是管理工作,由DBA角色担当。既是开发人员又是DBA的人并不罕见(实际上,如果你在小公司工作,你会发现自己担当了多个角色,以至于不堪重负),但是,如果你能将自己的思维与偏重实现的角色相分离,从而使你能更多地思考数据有多难用,那么一般说来,你设计出的东西会好很多。对许多情况而言,数据库设计没有看起来那样困难。 注解为安全起见,我要澄清一件事:如果你做过任何编程工作的话,毫无疑问,你会反对本书中的某些观点和意见。我完全同意本书不是什么Katmai 的圣路易斯 福音书。我的意见和观点来自于超过16年对数据库的学习、在数据库上的工作,并且由来自于许多不同的人、书、大学课堂和研讨会的知识所补充。我在“致谢”一节已经感谢了其中的许多人,但是,我忘掉的人名也数以百计,我脑中铭刻的某些知识精华就来自于他们。本书所展示的设计方法是所有这些思想的集合。我希望本书能被看作是个有用的学习工具。通过阅读本书和其他人的著作,再实践你自己的想法,你将会总结出自己的方法论,它会适合你自己,并使你成为成功的数据库设计人员。 本书的结构 本书由如下各章组成。 第1章:数据库概念简介。该章提供了对关键术语和概念的简要概览。 第2章:数据建模语言。该章的作用是介绍数据架构师的主要工具——模型。该章详细介绍了一种建模语言——IDEF1X,因为它是本书中用于展示数据库设计的建模语言。还介绍了其他几种常见的建模语言,因为某些读者或者出于偏爱、或者由于公司的要求会使用这些类型的模型。 第3章:概念阶段数据建模。在概念阶段数据建模中,我们的目标是讨论这样的过程:引入顾客的需求集合,将表、列、关系和业务规则放入数据模型格式中相应的地方。 第4章:规范化过程。数据库设计过程的下一步是规范化。规范化的目标是将表、列、关系和业务规则的集合格式化为每个值只在一个地方存储、每张表只代表一个单一实体的形式。在最初几次进行规范化时,这个过程会感觉不太自然,因为你不用琢磨如何使用数据,却必须琢磨数据本身以及结构会如何影响数据的质量。然而,一旦你掌握了规范化,那么,不以规范化的方式存储数据就会让人觉得不舒服。 第5章:实现基础的表结构。在数据库设计过程中,这是第一个要启动SQL Server,开始写脚本来构建数据库对象的时间点。该章讨论了构造表(包括为列选择数据类型)及关系,其中提到了实现后的结构可能与我们在规范化过程中得到的模型不一致的问题。 第6章:保护数据的完整性。除了要将数据安排在表和列中之外,也需要实现其他业务规则。在SQL Server中,保证数据完整性条件得以满足的第一条防线由CHECK约束与触发器构成,因为用户无法轻易绕开由约束和触发器进行的验证。这一章还讨论了其他几种保护数据的方法,它们可以用存储过程和客户端代码来实现。 第7章:模式和查询技术。除了设计表时的各种基本技巧之外,我们还利用几种技巧来构成常见的数据/查询接口,从而方便未来的查询和使用。该章讨论了几种常见的、有用的模式,同时也观察了某些人需要使用的一些模式——有些查询需求的接口实现对你来说非常困难,而这些模式能使它们变得更简单些。 . 第8章:数据访问安全。这些日子以来,安全问题几乎在每个程序员的头脑中都占据了很重要的位置。该章讨论了用来在系统中实现数据安全的某些策略,比如使用视图、触发器、加密,甚至使用SQL ServerProfiler等。 第9章:表结构与索引。该章展示了如何在SQL Server中建立表结构的基础知识,以及某些对数据进行索引以获得更好性能的策略。 第10章:并发编程。数据库设计和实现过程的一部分是不仅要考虑结构,而且还要考虑如何在多个用户之间最大化资源的利用率。该章描述了几种策略,它们都与如何在你的数据访问和修改代码中实现并发相关。 第11章:数据访问策略。该章讨论了关于编写代码来访问SQL Server的许多概念和问题。比较了即席SQL与存储过程(包括两者面对的所有风险和挑战,比如计划的参数化、性能、开发投入、可选参数、SQL注入等),同时也讨论了T-SQL还是CLR对象更好,其中包括用CLR来编码不同类型的对象的示例。有关CLR的材料由Kurt Windisch提供,可以下载的CLR示例代码也由他提供。 附录A:Codd的RDBMS十二法则。本附录介绍了Codd关于数据库应该如何实现的创新的十二条原则。随着硬件的发展,我们离实现他的梦想越来越近。 附录B:标量数据类型参考。本附录介绍了可以被合法地当作标量类型的所有类型,为什么要用它们,以及它们的实现信息和其他细节。 再一次强调,给我反馈时不用犹豫,任何时候都不要犹豫(只要你不在早上3点给我打电话就行)。对任何章节,我都将努力改善大家发现还有所欠缺的地方,并将改善后的内容发布到我的博客上(http://sqlblog.com/blogs/louis_davidson),其标签为DesignBook,同时也会发布到我的网站上(http://drsql.org/ProSQLServerDatabaseDesign.aspx)。如果有什么新的想法或者找到了一些错误,或者有额外的资料,我都会将其添加在这两个地方。因为这是一本书,而不再是零零星星的资料,这两处是我能想到并选来发布信息的地方。... 序言 数据库设计是Louis和我都热衷的事情。今年秋季,我将幸运地和我的朋友Louis Davidson登上同一个舞台。我们将在DevLink会议上演讲,地点是Louis的家乡Nashville,然后,在西雅图的PASS上我们也将同台演讲。在这两次演讲中,我们都将针对数据库设计这个题目开展讨论和辩论,并探讨对以数据为中心的应用来说数据库设计有多关键。. 数据库设计是门科学也是门艺术。规范化应该说是门科学,而确定实体的范围则是一门艺术,需要具有与各种数据库打交道的经验才能学到手。优雅的解决方案都有一种简单的美。Louis不止是位作者和数据库设计人员,也是一位大师级技师。在本书中,你会发现字里行间都隐藏着作者的呼吁——改善你的技能,精心雕刻出能够经受时间考验的数据库,创造一个能让开发人员充分施展拳脚的、虚拟的数据世界。.. 数据库设计是每个以数据为中心的应用的基石。一个优雅的数据库设计使得数据一目了然、容易查询,并且使用有效的、基于集的查询将开发人员武装起来,使他们获得成功。但是,如果数据库设计就很糟糕,则无论多少代码也无法补偿,也无法为数据库加上缺失的功能。对任何以数据为中心的应用来说,没有什么角色比数据建模人员这个角色更为重要。用户界面换来换去,但是,即使经历了好几代应用编程语言,数据仍然存在着。数据库架构上犯下的错误迟早会被未来的程序员诅咒,即使他现在还未出生,即使他用的是现在还没发明的语言和工具。在我的好朋友Louis的指导下,多花一点时间来润色你的数据库设计,绝对是件值得的事。 因此,欢迎你阅读本书,这是Louis针对软件世界最重大的工作所写的战地指南的第三版。能够为本书作序我感到无比愉快。... Paul Nielsen SQL Server MVP 媒体评论 “跟本书的2005版一样,我认为Louis的这本书写得非常好,信息量极其丰富而且实践性强。阅读过程中,你会觉得是在跟作者讨论问题。我喜欢这本书,还因为它有自己的观点,而非从在线图书中照搬过来……” —— Amazon读者评论...
5.4MB
SCJP 模拟考试系统 附注册码
2009-11-27SCJP是SUN认证体系的第一级证书,已经成为IT行业最热门的证书之一,是每一个程序员踏入工作岗位的敲门砖。一般在大城市,大公司,Java程序员起薪都在10万以上。 《SCJP模拟考试系统》是优秀的SCJP认证备考软件。本软件采用先进的学习+应试+练习+模考的记忆学习模式,符合认证考试的复习特点,可以明显缩短备考时间,您无需花费上千元的培训费用,就可轻松通过认证考试。 《SCJP模拟考试系统》几大模块简介: Java学习: 经典辅导,教您从零开始学习Java。配大量例题,上机辅导,祝您获得真才实学。 认证应考: 在经过一段的练习后,用户可以通过随机练习,题目已被打乱顺序,检查一下自己对所学知识的掌握程度。也可以选择显示答案,能够同时浏览题目和结果。另外系统提供了强大的错题练习功能,反复练习您的错题,真正做到不放过一题,万无一失! 随机练习: 勤学苦练,近500道经典练习题,涵盖所有知识点。采用循环记忆法帮您快速突破。 模拟考试: 实战演习,模拟考试环境,让您置身真实的考试环境,轻松检验复习成果。 选择本软件的理由: 最新题库: 模拟题和练习题全部遵循最新SCJP1.4大纲,随机题库加上附送光盘覆盖率可以达到80%以上。 功能强大: 学习融合了Java学习、认证应考、随机练习以及模拟考试等功能,符合记忆规律和学习曲线,随机练习能够同时浏览题目和答案,并配有大量的习题注解,方便记忆,随机练习还能够保存学习进度,方便再次继续练习。随机练习还可以反复练习做过并错误的题目,真正做到,题题把关,万无一失!模拟考试能...
19.87MB
搜狗五笔输入法 v3.1.0.1751 官方正式版.zip
2019-07-13搜狗五笔输入法是当前互联网新一代的五笔输入法,其最大的特点就是超前的网络同步功能,并能设置设置“纯五笔打字”“五笔拼音混打”“拼音打字”三种打字模式。软件还兼容目前强大的搜狗拼音输入法的所有皮肤,界面美观简洁、简单全面、实用方便,可快速上手,轻轻松松完成日常五笔打字功能,真正做到简单全面实用。是用户实现五笔打字功能的好帮手。 搜狗五笔输入法下载特点介绍 1.多种输入模式向您提供便捷输入途径: 五笔拼音混合输入、纯五笔、纯拼音多种输入模式供用户选择,尤其在混输模式下,用户再也不用切换到拼音输入法下去输入一个暂时用五笔打不出的字词了,并且所有五笔字词均有编码提示,是增强五笔能力的有力助手;对于五笔高手来说,纯五笔的输入能能让你更得心应手,不影响您的输入习惯。 2.创新的候选项调序功能: 想修改系统词库的初始顺序?搜狗五笔全球范围内首家提供了的鼠标调序功能,将鼠标悬浮候选项上2秒钟,出现调序操作提示后即可将词条任意调序。想怎么调,就怎么调。同时搜狗五笔也提供了传统的快捷键调序功能,按Ctrl Shift 序号即可将该词调至首位,马上就可以使用。 3.近万款细胞词库: 搜狗五笔输入法可以直接使用近10000款搜狗输入法的细胞词库,成为凝聚着数千万用户智慧和汗水宝贵财富的第二个展示舞台。经过大量热心网友长期建设的游戏、娱乐、专业、文艺、体育等众多类别细胞词库等你使用! 4.界面美观:兼容所有搜狗拼音可用的皮肤,资源丰富: 搜狗五笔输入法和拼音输入法一样,兼容拼音输入法所有精心设计的皮肤,输入窗口和状态栏全面支持不规则图片。输入法官网开通的皮肤下载频道,有上万款网友制作的皮肤供你选择! 5.词库随身: 包括自造词在内的便捷的同步功能,对用户配置、自造词甚至皮肤,都能上传下载,有网络的地方,您就能用属于自己的五笔:搜狗五笔是真正的互联网五笔输入法。 6.人性化设置:功能强大,兼容多种输入习惯: 即便是在某一输入模式下,也可以对多种输入习惯进行配置,空码自动取消输入,误码时自动发声提示,固定词频与否等等,对习惯有更高要求的你可以随心所欲的让输入法随你而变。 搜狗五笔输入法 v3.1.0.1751 官方正式版更新日志 功能改进 优化打字性能,解决部分win10下打字卡顿问题 修正智能造词引起的调频词库冲突 优化输入法稳定性 搜狗五笔输入法截图
10.65MB
支持多数据库的ORM框架ef-orm.zip
2019-07-19ef-orm A Simple OR-Mapping framework on multiple databases. 使用手册(中文)http://geequery.github.io/ef-orm/manual/EF-ORM-user-guide.docx 使用示例工程 https://github.com/GeeQuery/ef-orm/tree/master/orm-tutorial EF-ORM是一个轻量,便捷的Java ORM框架。并且具备若干企业级的应用特性,如分库分表、JTA事务等。 代码生成插件for eclipse(请在eclipse中Help/Install new software后输入地址并安装)http://geequery.github.io/plugins/1.3.x/特点一 EF的设计的一个主要目的是提高开发效率,减少编码工作,让开发者“零配置”“少编码”的操作数据库大部分功能。 例如:数据库查询条件的传入问题是所有ORM框架都不能回避的一个问题,所以我经常在想——既然我们可以用向DAO传入一个Entity来实现插入操作,为什么就不能用同样的方法来描述一个不以主键为条件的update/select/delete操作?为什么DAO的接口参数老是变来变去?为什么很多应用中,自行设计开发类来描述各种业务查询条件才能传入DAO?为什么我们不能在数据访问层上花费更少的时间和精力? JPA1.0和早期的H框架,其思想是将关系型数据库抽象为对象池,这极大的限制了本来非常灵活的SQL语句的发挥空间。而本质上,当我们调用某H框架的session.get、session.load、session.delete时,我们是想传递一个以对象形式表达的数据库操作请求。只不过某H框架要求(并且限制)我们将其视作纯粹的“单个”对象而已。JPA 2.0为了弥补JPA1.0的不足,才将这种Query的思想引入为框架中的另一套查询体系——Criteria API。事实上针对单个对象的get/load/persist/save/update/merge/saveOrUpdate API和Criteria API本来就为一体,只不过是历史的原因被人为割裂成为两套数据库操作API罢了。 因此,对于关系型数据库而言——Entity和Query是一体两面的事物,所谓Query,可以包含各种复杂的查询条件,甚至可以作为一个完整的SQL操作请求的描述。为此,EF彻底将Entity和Query绑在了一起。这种思想,使得—— 开发人员需要编写的类更少。开发人员无需编写其他类来描述复杂的SQL查询条件。也无需编写代码将这些查询条件转换为SQL/HQL/JPQL。DAO层也不会有老要改来改去的接口和API,几乎可以做到零编码。 对单个对象进行CRUD的操作API现在和Criteria API合并在一起。Session对象可以直接提供原本要Criteria API才能提供实现的功能。API大大简化。 IQueryableEntity允许你将一个实体直接变化为一个查询(Query),在很多时候可以用来完成复杂条件下的数据查询。比如 ‘in (?,?,?)’, ‘Between 1 and 10’之类的条件。 xxQL有着拼装语句可读性差、编译器无法检查、变更维护困难等问题,但是却广受开发人员欢迎。这多少有历史原因,也有Criteria API设计上过于复杂的因素。两者一方是极端灵活但维护困难,一方是严谨强大而学习和编写繁琐,两边都是极端。事实上JPA的几种数据查询方式存在青黄不接的问题。选择查询语言xxQL,项目面临后续维护困难,跨数据库移植性差;选择Criteria API,代码臃肿,操作繁琐,很多人望而却步。EF的设计思想是使人早日摆脱拼装SQL/HQL/JPQL的困扰,而是用(更精简易用的)Criteria API来操作数据库。 基于轻量级Criteria API的操作方式,使得对数据库的变更和重构变得非常轻松,解决了SQL语句多对软件维护和移植造成产生的不利影响。 阅读推荐:第3、4章 特点二,将SQL的使用发挥到极致,解决SQL拼凑问题、数据库移植问题 大部分OLTP应用系统到最后都不免要使用SQL/JPQL,然而没有一个很好的方法解决SQL在多种数据库下兼容性的问题。 EF-ORM中采用了独特的SQL解析和改写技术,能够主动检查并确保SQL语句或者SQL片段在各个数据库上的兼容性。 EF中除了Criteria API以外,可以直接使用“SQL语句”或者“SQL片段”。但是这些SQL语句并不是直接传送给JDBC驱动的,而是 有着一个数据库方言层,经过方言层处理的SQL语句,就具备了在当前数据库上正确操作的能力。这相当于提供了一种能跨数据库操作的SQL语言。(E-SQL) E-SQL不但解决了异构数据库的语法问题、函数问题、特殊的写法问题,还解决了动态SQL问题、绑定变量扩展等特性。 对于各种常用SQL函数和运算符,都可以自动转换为当前数据库支持的方言来操作。其函数支持也要多于HQL支持的函数。 阅读推荐:第7、8章 特点三,可能是业界最快的ORM框架. 得益于ASM的动态代码生成技术,部分耗时操作通过动态代码固化为硬编码实现,EF-ORM的大部分操作性能要超过已知的其他框架。 实际性能测试表明,EF的大部分操作都要快于Hiberante和MyBatis, 部分操作速度甚至数十倍于上述框架。 EF在极限插入模式下,甚至刷新了每秒10万条写入的记录。远远超过了其他框架。 一个初步的性能测试:测试代码:http://geequery.github.io/ef-orm/manual/performance-test.rar 测试报告:http://geequery.github.io/ef-orm/manual/performance-compare.docx 阅读推荐:第9、17章 特点四,分库分表 开发过程中参照了Hibernate Shards、Alibaba TDDL、Cobar等框架,也是基于词法分析器来提取SQL参数,并计算路由。 能支持分库维度含糊等场景下的分库分表。以及包括多库多表下的 order by , distinct, group by, having等操作。 阅读推荐:第10章 特点五,常用DDL操作的封装 从数据库元数据访问,到建表,创建约束,创建sequence等各种DDL操作进行了封装,用户无需编写各种SQL,可以直接通过API操作数据库结构。 尤其是ALTER TABLE等修改数据库的语句,各种不同的RDBMS都有较大语法差异。特点六、解决各种跨RDBMS的移植问题 1、DML操作、自增值处理与返回、查询这些不同数据库操作差异很大的东西,都了统一的封装。 2、DDL操作、建表、删表、trunacte,Sequence创建和TABLE模拟Sequence等,都做了支持。 3、对SQL语法操作和函数的改写与支持。其他特性轻量 该框架对应用环境、连接池、 是否为J2EE应用等没有特殊要求。可以和EJB集成,也可与Spring集成,也可以单独使用。整个框架只有两个JAR包,模块和功能都较为轻量。依赖少 整个框架只有三个jar库。间接依赖仅有commons-lang, slf4j等7个通用库,作为一个ORM框架,对第三方依赖极小。简单直接的API 框架的API设计直接面向数据库操作,不绕弯子,开发者只需要数据库基本知识,不必学习大量新的操作概念即可使用API完成各种DDL/DML操作。 最大限度利用编译器减少编码错误的可能性 API设计和元数据模型(meta-model)的使用,使得常规的数据库查询都可以直接通过Criteria API来完成,无需使用任何JPQL/HQL/SQL。可以让避免用户犯一些语法、拼写等错误。JPA2规范兼容 使用JPA 2.0规范的标准注解方式来定义和操作对象。(但整个ORM不是完整的JPA兼容实现)更高的性能 依赖于ASM等静态字节码技术而不是CGlib,使得改善了代理性能;依赖于动态反射框架,内部数据处理上的开销几乎可以忽略。操作性能接近JDBC水平。对比某H开头的框架,在写入操作上大约领先30%,在大量数据读取上领先50%以上。更多的性能调优手段 debug模式下提供了大量性能日志,帮您分析性能瓶颈所在。同时每个查询都可以针对batch、fetchSize、maxResult、缓存、级联操作类型等进行调整和开关,可以将性能调到最优。可在主流数据库之间任意切换 支持Oracle、MySQL、Postgres、MSSQL、GBase、SQLite、HSQL、Derby等数据库。除了API方式下的操作能兼容各个数据库之外,就连SQL的本地化查询也能使之兼容。JMX动态调节 可以用JMX查看框架运行统计。框架的debug开关和其他参数都可以使用JMX动态调整。动态表支持 表结构元数据的API也向用户开放,同时支持在使用过程中,灵活调整映射关系,因此用户可以用API动态的创建表结构的模型,从而实现各种动态类型和表的映射(例如POJO中包含一个Map,用于映射各种动态扩展的字段)企业级特性支持 SQL分析,性能统计,分库分表,Oracle RAC支持,读写分离支持 标签:eform
-
下载
AXJ一键新机无限制版本无数台设备永久使用.zip
AXJ一键新机无限制版本无数台设备永久使用.zip
-
下载
HCIA-Datacom培训教材.pdf
HCIA-Datacom培训教材.pdf
-
下载
linux基础学习.xmind
linux基础学习.xmind
-
下载
Devart MyDAC v10.4.3 by [CS].exe
Devart MyDAC v10.4.3 by [CS].exe
-
下载
dlib不用编译的whl文件.zip
dlib不用编译的whl文件.zip
-
下载
下载b站视频(python)
下载b站视频(python)
-
下载
华为慕课软件定义园区网络的开发与实践课件下载.pdf
华为慕课软件定义园区网络的开发与实践课件下载.pdf
-
下载
Keil.STM32F0xx_DFP.2.1.0.rar
Keil.STM32F0xx_DFP.2.1.0.rar
-
下载
简历制作PPT课件.ppt
简历制作PPT课件.ppt
-
下载
VS2019 编译gRPC C++ x64版本
VS2019 编译gRPC C++ x64版本
