1第一章学前必读1概述【案例分析】作为一个普通人,我们上班做的第一件事可能就是打开个新闻网站,看看有什么新闻了。如下图:要不就是打开某个购物网站,看看有什么需要买的。如下图:【本章概述】回顾软件开发的历史,每一个浪潮的出现,都伴随着一次硬件基础设施的跨越。从最早的大型机时代到PC时代,从互联网时代到移动互联网时代。面对如此混乱的局面,我们试图在每次浪潮中发现一条线索,希望能抛砖引玉,引发大家透过现象,进行一些对本质的独立思考。其实,不管处在哪个时代,数据永远都是我们关注的重点。有句古诗说的好,不识庐山真面目,只缘身在此山中。作为我们这些小菜或老菜来说,有时要好好深思一下了。2每当看到这类的网站的时候,是不是每个人都思考过下面这样的问题吧!网站数据都保存到哪了?其实,所有应用的数据都保存到机器上的硬盘中了。而保存了这些数据的机器可能在一个地方或者分布在全国各地。据报道,阿里云将会在美国东岸及香港开设第2座数据中心;未来亦会在新加坡、德国、中东及印度等地方设数据中心,方便海外业务的发展。阿里巴巴将未来的增长押宝于云计算和大数据,未来十年将为金融、政府和网络游戏公司提供交易处理和存储服务。……以下这张图就是位于北京亦庄经济技术开发区北京联通数据中心,该数据中心是北方地区最大的数据中心,北京联通目前拥有22个国际标准的大规模专业机房,机房遍布北京各城区,该数据中心同时也是亚洲最大的IDC机房。很多知名企业(例如:互联网企业的BAT,传统企业的苏宁,国美,万达等),都在这里建立有自己的数据中心。3以下这张图就是该数据中心中的某托管机房的一角。其实在这类数据中心转了一圈都发现了什么?一堆机器?当然不只是一堆机器了!其实和我们相关的,能看到的就是那点玩意儿:硬件4软件网络传输介质2硬件、软件、网络、传输介质就在前不久(2015年7月3日),我在新浪上的科技栏目中看到了这样一段内容,现摘录给大家:日本企业巨头索尼公司连续第6年巨亏,破产传闻风声再起。其实,索尼公司已经“被破产”多次了,破产的征兆可追溯到2003年4月的“索尼震撼(SonyShock)”。当年索尼公司如日中天时,总裁出井伸之获评为2000年全球最佳经理人,索尼公司的股价一路飙升,在2002年2月达到每股314美元的巅峰之后急转直下,仅14个月就跌到23美元,跌幅逾92%!2003年,出井伸之获评为当年全球最差经理人!这就是“索尼震撼”。此后的索尼公司一直在垂死挣扎,至今仍无起色。索尼总裁出井伸之在1996年破格上任,公司战略重心从硬件转为软件,他声称“硬件已死,内容为王”,此后10年没有再推出革命性的创新产品。到苹果和三星在新的硬件技术上异军突起时,索尼悔之晚矣,公司的命运如同其股价走势般一落千丈,一直活在衰败的阴影之下。时至今日,国内持这样观点的人还大有人在,对此,我只能呵呵了。2.1硬件所谓硬件系统:是指构成计算机的物理设备,即由机械、光、电、磁器件构成的具有计算、控制、存储、输入和输出功能的实体部件。如CPU、存储器、软盘驱动器、硬盘驱动器、光盘驱动器、主机板、各种卡及整机中的主机、显示器、打印饥、绘图仪、调制解调器等等,整机硬件也称“硬设备”。下图所示的就是一个典型的计算机硬件系统的内部结构图。5下图所示的就是一个典型的计算机硬件系统的外部结构图,我们上大学时曾经用过的老古董,在当时可值老鼻子钱了。62.2软件所谓软件系统:是指看不见摸不着,由人们事先编制的具有各类特殊功能的程序组成。计算机软件总体分为系统软件和应用软件两大类。系统软件是各类操作系统,如:Windows、Linux、UNIX等,还包括操作系统的补丁程序及硬件驱动程序,都是系统软件。下图就是那些我们曾经使用过、和现在正在使用的操作系统。7通过上图,我们可以看出来,硬件的不同,就决定了操作系统的不同。应用软件可以细分的种类就更多了,如:工具软件、游戏软件、管理软件等都属于应用软件类。下图为新浪应用中心的部分截图,所截取的应用软件内容无特别含义,不代表本人的倾向,只是为了方便说明罢了!特此声明,请勿朝本人拍砖。8这从侧面也验证了这句话,没有任何软件支持的计算机称为裸机。那么,我们的问题来了,你知道软件系统开发都有哪些吗?请列表!下面的图就是我总结的汇总,仅供参考,版权所有,违者不究。从这张图我们可以看出,软件开发的范围非常的广,不仅仅是MIS系统、ERP系统、CRM系统、OA系统、Web开发等。2.3网络提到“网络”,相信大家并不陌生,因为我们身边存在着各种各样的网,有线电视网,固定电话网,电力网……这些都是网络。它们的共同特点是什么呢?是计算机和类似计算机的设备连接起来的一个系统,这些设备能够通过公共传输媒体进行通信,请看下图,一个传统数据中心的网络拓补图。9当然,这是一个示例,和实际上真正的数据中心的拓扑图不是一个数量级别。不是一般人、一般公司能玩得起的。另外,值得注意的是我们这里所说的网络,主要是指电信网络(电话,传真等)、有线电视网络和计算机网络。也就是所谓的三网网络产生的主要原因:分享、交流;协同工作;挖掘价值。而分享、交流是网络的一个最基本的特征。计算机网络有可能会取代那2类网络。什么时候,不知。存疑。在我们实际的软件开发中,经常会听到公网,私网这两个术语。公网我们可以称之为外网,因特网(Internet),而私网我们可以称之为内网,局域网(Intranet)。【提示】一个网络中,由一台计算机发出请求(指的是某种通信协议)和数据,通过传输介质(指的是网络电缆、光纤或电话线)传送到另一台计算机。最简单的计算机网络就只有两台计算机和连接它们的一条链路,即两个节点和一条链路。2.4传输介质大家一定还记得下面的这段新闻吧!2015年5月27日下午5点左右,支付宝出现全国范围的系统瘫痪。用户均无法登陆支付宝钱包,无法查看个人信息及余额。对于无法登陆原因,官方回应称光纤被挖断。目前,支付宝服务还未恢复正常。10以下省略500字。这样的新闻信息屡见不鲜。通过上面的这个案例,我们可以得出以下的结论:网络中有许多相似的个体或者节点;网络用线路或介质把这些节点彼此连接起来。网络有多少个节点就有多少物理介质。网络连接的物理介质一般分为同轴电缆、双绞线、光纤电缆、无线电网络可以进行各种信息(文字、语音、图像、视频、控制信号等)的全向传送。网络必须有冗余的通信信道,即某一条通信线路出现故障后,网络其他各部分依然能进行通信。【提示】还记得小时候玩的土电话的游戏吗?它是一种古老的具有实用性和娱乐性的工具,由中国人最先发明,是电话机最初的原型,曾为人们之间的交流和娱乐立下汗马功劳。土电话制作简单,两个圆形纸盒,一根棉线,两支小木棒即可轻松制作而成。古时称传声筒。那根棉线就是把连接的物理介质,把2个话筒给连接起来。更令人惊奇的是,两个节点之间的最远连接距离居然是100米,也就是和普通网线最远连接距离完全一样。11土电话就是一个最简单的网络!2.5小测试测试问题1:人们通常说的计算机系统是由哪几部分组成的吗?记得上大学的时候,曾经学过计算机组成原理这门课程,由于当时课程比较枯燥,在加上老师水平有限,因此,经常上课昏昏欲睡。如果这图你都记不起来了的话,我看编程(俗称:码农)儿不太适合你!虽然,当初我记得很清楚,但一直也想不明白和我以后从事的软件开发有半毛钱的关系。可是这几十年过去了,现在想来,真是大错特错了。不但有关,而且关系大了,这部分内容,我们会在以后的章节中会提到。测试问题2:你知道什么是并发,共享,异步吗?作为一个经常搞挨踢的人士,尤其是搞软件开发的,都不好意思说自己不懂这些术语,但当真的被问到时,一时半会儿还真说不出个所以然。并发:“大家都前进了”;指两个或多个活动在同一给定的时间间隔中进行。共享:“一件东西大家用”;指计算机系统中的资源被多个任务使用,例如:共享内存、打印机、共享文件夹、共享文件等。异步性:“你走我停”;表示各程序在执行过程中“走走停停”的性质。123为什么说要熟悉系统的运行环境有的程序员说了“我只管编我的程序,硬件怎么配置是别人的事情”,这种想法的程序员恐怕随处可见,大有人在。我曾经也是持这样的看法的。之所以我们有这样的想法,恐怕还是处于”就程序论程序“的阶段。没有从整体看问题。为什么这么说?3.1必要性前面的那个计算机系统结构图,恐怕我们现在是不是都忘掉了,让我们再来重温下吧。应用程序是操作系统的扩展,而操作系统又是在硬件基础上的。如果不关心硬件,也不关心操作系统和网络环境,那么我们的应用程序就失去了其运行基础;又如何可以设计高质量的应用程序呢?。任何一个完整的”系统工程(无论规模大小)“都是靠着众多的硬件系统、软件系统和网络系统组织而成,任何孤立地谈软件系统的方法都是不可取的。大部分成功的系统工程设计方案可以在相同的预算的情况下,让系统运行速度更快,更好。例如,部署硬件、网络建设和软件采购的预算为500万人民币,不同的设计方案实施后,它们的运行速度也许会要相差数倍,甚至数百倍。而这个运行速度必定和如下的内容有关。持久化数据13大量数据(几百万条记录)大量并发(多人同时访问数据)大量操作数据的用户界面分布式(与其它企业应用通信)概念的不一致性网络因素(带宽如何分配,何时用千兆,何时用百兆,何时走公网,何时用专线)经济因素(有经费、没经费)其它例1:曾经被全国挨踢人士讨伐的12306购票网站。例2:发动”双11扫货”活动的淘宝。14等等,都会在某个阶段内,遭遇到上述的问题。支持这么庞大的应用,你猜需要多少台服务器?几千台?那是零头。这么多服务器,上面部署什么操作系统,操作系统的内核能否优化?Java虚拟机能否优化?通信模块有没有榨取性能的空间?软件怎么部署上去?出了问题怎么回滚?你装过操作系统吧,优化过吧,被360,百度,腾讯坑过没,崩溃过没?这里面又有很多门道。3.2分清主次我发现现在的程序员,无论是初学者、还是已经工作的程序员,特别喜欢研究性能优化的问题,一看到诸如:系统架构/高性能/高并发/海量/大数据等字眼,眼中顿时打了鸡血,恨不能今晚就结果了它!工作需要?荣誉感?还是让简历好看?可能都有吧。我有个朋友读大学的时候一心想做CPU,《计算机体系结构》连续听了3年的课,当然只有最后一年才完全听懂了;但不好意思,我还是没有听懂。在他宿舍的床头上到处摆的是《dragonbook》,《linkerandloader》类似这样的书,一人做CPU,全家都光荣,CPU编译器才是核心技术哇。不好意思,当时我们学校的计算机还是PC时代,操作系统还是DOS,学校的计算机中心机房当时还是用的从罗马尼亚引进的小型机,操作系统就是UNIX6800呢!噢对了,苹果当时是Apple15II,乔布斯叔叔当时还在,比尔盖茨叔叔当时估计正在故弄他的Basic给他老妈的公司IBM编写编译程序呢吧!别跟我说什么PHP、Java、C#、京东、百度、阿里巴巴、腾讯等等;那时它们都还没出生呢!它们的创始人都在学校里面肯书本呢!这些技术(或者称之为技巧)其实说的都是应用都应该具有可伸缩性。如果你对”可伸缩性”的定义要求达到百度搜索引擎或是新浪,网易,搜狐等等首页那样的数量级,那么你就不用再需要继续阅读本书了。实际上,没有任何一种现有的商业解决方案能够适用于那样规模巨大的网站(它们其实也不可能是一步到位的)。然而,如果你正在开发一个应用,并且你还没有10万个用户的情况下就开始考虑如何处理1亿个用户的情况,那么你应当重新考虑开发时的优先级了。作为一个码农首先需要关注的是开发出一个用户喜欢和愿意使用并且具有较好体系结构的应用。其次,就是能按时交活。如果你能很好地做到这一点,你才会有时间和金钱来有效地应对你的第1亿个用户。所以,性能真不是问题,但99%的企业都没有活到出现性能问题的那一天。即使你真的是在类似BAT这样的企业工作,这样的事情一般也轮不到你的头上,因为学习是可以试错的,而工作不能试错的。请在合适的时间,做合适的事情吧。其它都是浮云!4群雄纷争在各大路边社的报道上面