第1章庖丁解牛之产品和项目Word文档下载推荐.docx
- 文档编号:16572299
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:21
- 大小:2.55MB
第1章庖丁解牛之产品和项目Word文档下载推荐.docx
《第1章庖丁解牛之产品和项目Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《第1章庖丁解牛之产品和项目Word文档下载推荐.docx(21页珍藏版)》请在冰豆网上搜索。
当年索尼公司如日中天时,总裁出井伸之获评为2000年全球最佳经理人,索尼公司的股价一路飙升,在2002年2月达到每股314美元的巅峰之后急转直下,仅14个月就跌到23美元,跌幅逾92%!
2003年,出井伸之获评为当年全球最差经理人!
这就是“索尼震撼”。
此后的索尼公司一直在垂死挣扎,至今仍无起色。
索尼总裁出井伸之在1996年破格上任,公司战略重心从硬件转为软件,他声称“硬件已死,内容为王”,此后10年没有再推出革命性的创新产品。
到苹果和三星在新的硬件技术上异军突起时,索尼悔之晚矣,公司的命运如同其股价走势般一落千丈,一直活在衰败的阴影之下。
时至今日,国内持这样观点的人还大有人在,对此,我只能呵呵了。
2.1硬件
⏹所谓硬件系统:
是指构成计算机的物理设备,即由机械、光、电、磁器件构成的具有计算、控制、存储、输入和输出功能的实体部件。
如CPU、存储器、软盘驱动器、硬盘驱动器、光盘驱动器、主机板、各种卡及整机中的主机、显示器、打印饥、绘图仪、调制解调器等等,整机硬件也称“硬设备”。
下图所示的就是一个典型的计算机硬件系统的内部结构图。
下图所示的就是一个典型的计算机硬件系统的外部结构图,我们上大学时曾经用过的老古董,在当时可值老鼻子钱了。
2.2软件
⏹所谓软件系统:
是指看不见摸不着,由人们事先编制的具有各类特殊功能的程序组成。
⏹计算机软件总体分为系统软件和应用软件两大类。
⏹系统软件是各类操作系统,如:
Windows、Linux、UNIX等,还包括操作系统的补丁程序及硬件驱动程序,都是系统软件。
下图就是那些我们曾经使用过、和现在正在使用的操作系统。
通过上图,我们可以看出来,硬件的不同,就决定了操作系统的不同。
⏹应用软件可以细分的种类就更多了,如:
工具软件、游戏软件、管理软件等都属于应用软件类。
下图为新浪应用中心的部分截图,所截取的应用软件内容无特别含义,不代表本人的倾向,只是为了方便说明罢了!
特此声明,请勿朝本人拍砖。
这从侧面也验证了这句话,没有任何软件支持的计算机称为裸机。
那么,我们的问题来了,你知道软件系统开发都有哪些吗?
请列表!
下面的图就是我总结的汇总,仅供参考,版权所有,违者不究。
从这张图我们可以看出,软件开发的范围非常的广,不仅仅是MIS系统、ERP系统、CRM系统、OA系统、Web开发等。
2.3网络
提到“网络”,相信大家并不陌生,因为我们身边存在着各种各样的网,有线电视网,固定电话网,电力网……这些都是网络。
它们的共同特点是什么呢?
是计算机和类似计算机的设备连接起来的一个系统,这些设备能够通过公共传输媒体进行通信,请看下图,一个传统数据中心的网络拓补图。
当然,这是一个示例,和实际上真正的数据中心的拓扑图不是一个数量级别。
不是一般人、一般公司能玩得起的。
⏹另外,值得注意的是我们这里所说的网络,主要是指电信网络(电话,传真等)、有线电视网络和计算机网络。
也就是所谓的三网
⏹网络产生的主要原因:
分享、交流;
协同工作;
挖掘价值。
而分享、交流是网络的一个最基本的特征。
⏹计算机网络有可能会取代那2类网络。
什么时候,不知。
存疑。
⏹在我们实际的软件开发中,经常会听到公网,私网这两个术语。
公网我们可以称之为外网,因特网(Internet),而私网我们可以称之为内网,局域网(Intranet)。
【提示】
一个网络中,由一台计算机发出请求(指的是某种通信协议)和数据,通过传输介质(指的是网络电缆、光纤或电话线)传送到另一台计算机。
最简单的计算机网络就只有两台计算机和连接它们的一条链路,即两个节点和一条链路。
2.4传输介质
大家一定还记得下面的这段新闻吧!
2015年5月27日下午5点左右,支付宝出现全国范围的系统瘫痪。
用户均无法登陆支付宝钱包,无法查看个人信息及余额。
对于无法登陆原因,官方回应称光纤被挖断。
目前,支付宝服务还未恢复正常。
以下省略500字。
这样的新闻信息屡见不鲜。
通过上面的这个案例,我们可以得出以下的结论:
⏹网络中有许多相似的个体或者节点;
⏹网络用线路或介质把这些节点彼此连接起来。
⏹网络有多少个节点就有多少物理介质。
⏹网络连接的物理介质一般分为同轴电缆、双绞线、光纤电缆、无线电
⏹网络可以进行各种信息(文字、语音、图像、视频、控制信号等)的全向传送。
⏹网络必须有冗余的通信信道,即某一条通信线路出现故障后,网络其他各部分依然能进行通信。
【提示】还记得小时候玩的土电话的游戏吗?
它是一种古老的具有实用性和娱乐性的工具,由中国人最先发明,是电话机最初的原型,曾为人们之间的交流和娱乐立下汗马功劳。
土电话制作简单,两个圆形纸盒,一根棉线,两支小木棒即可轻松制作而成。
古时称传声筒。
那根棉线就是把连接的物理介质,把2个话筒给连接起来。
更令人惊奇的是,两个节点之间的最远连接距离居然是100米,也就是和普通网线最远连接距离完全一样。
土电话就是一个最简单的网络!
2.5小测试
测试问题1:
人们通常说的计算机系统是由哪几部分组成的吗?
记得上大学的时候,曾经学过计算机组成原理这门课程,由于当时课程比较枯燥,在加上老师水平有限,因此,经常上课昏昏欲睡。
如果这图你都记不起来了的话,我看编程(俗称:
码农)儿不太适合你!
虽然,当初我记得很清楚,但一直也想不明白和我以后从事的软件开发有半毛钱的关系。
可是这几十年过去了,现在想来,真是大错特错了。
不但有关,而且关系大了,这部分内容,我们会在以后的章节中会提到。
测试问题2:
你知道什么是并发,共享,异步吗?
作为一个经常搞挨踢的人士,尤其是搞软件开发的,都不好意思说自己不懂这些术语,但当真的被问到时,一时半会儿还真说不出个所以然。
⏹并发:
“大家都前进了”;
指两个或多个活动在同一给定的时间间隔中进行。
⏹共享:
“一件东西大家用”;
指计算机系统中的资源被多个任务使用,例如:
共享内存、打印机、共享文件夹、共享文件等。
⏹异步性:
“你走我停”;
表示各程序在执行过程中“走走停停”的性质。
3为什么说要熟悉系统的运行环境
有的程序员说了“我只管编我的程序,硬件怎么配置是别人的事情”,这种想法的程序员恐怕随处可见,大有人在。
我曾经也是持这样的看法的。
之所以我们有这样的想法,恐怕还是处于”就程序论程序“的阶段。
没有从整体看问题。
为什么这么说?
3.1必要性
前面的那个计算机系统结构图,恐怕我们现在是不是都忘掉了,让我们再来重温下吧。
应用程序是操作系统的扩展,而操作系统又是在硬件基础上的。
如果不关心硬件,也不关心操作系统和网络环境,那么我们的应用程序就失去了其运行基础;
又如何可以设计高质量的应用程序呢?
。
任何一个完整的”系统工程(无论规模大小)“都是靠着众多的硬件系统、软件系统和网络系统组织而成,任何孤立地谈软件系统的方法都是不可取的。
大部分成功的系统工程设计方案可以在相同的预算的情况下,让系统运行速度更快,更好。
例如,部署硬件、网络建设和软件采购的预算为500万人民币,不同的设计方案实施后,它们的运行速度也许会要相差数倍,甚至数百倍。
而这个运行速度必定和如下的内容有关。
⏹持久化数据
⏹大量数据(几百万条记录)
⏹大量并发(多人同时访问数据)
⏹大量操作数据的用户界面
⏹分布式(与其它企业应用通信)
⏹概念的不一致性
⏹网络因素(带宽如何分配,何时用千兆,何时用百兆,何时走公网,何时用专线)
⏹经济因素(有经费、没经费)
⏹其它
例1:
曾经被全国挨踢人士讨伐的12306购票网站。
例2:
发动”双11扫货”活动的淘宝。
等等,都会在某个阶段内,遭遇到上述的问题。
支持这么庞大的应用,你猜需要多少台服务器?
几千台?
那是零头。
这么多服务器,上面部署什么操作系统,操作系统的内核能否优化?
Java虚拟机能否优化?
通信模块有没有榨取性能的空间?
软件怎么部署上去?
出了问题怎么回滚?
你装过操作系统吧,优化过吧,被360,XX,腾讯坑过没,崩溃过没?
这里面又有很多门道。
3.1分清主次
我发现现在的程序员,无论是初学者、还是已经工作的程序员,特别喜欢研究性能优化的问题,一看到诸如:
系统架构/高性能/高并发/海量/大数据等字眼,眼中顿时打了鸡血,恨不能今晚就结果了它!
工作需要?
荣誉感?
还是让简历好看?
可能都有吧。
我有个朋友读大学的时候一心想做CPU,《计算机体系结构》连续听了3年的课,当然只有最后一年才完全听懂了;
但不好意思,我还是没有听懂。
在他宿舍的床头上到处摆的是《dragonbook》,《linkerandloader》类似这样的书,一人做CPU,全家都光荣,CPU编译器才是核心技术哇。
不好意思,当时我们学校的计算机还是PC时代,操作系统还是DOS,学校的计算机中心机房当时还是用的从罗马尼亚引进的小型机,操作系统就是UNIX6800呢!
噢对了,苹果当时是AppleII,乔布斯叔叔当时还在,比尔盖茨叔叔当时估计正在故弄他的Basic给他老妈的公司IBM编写编译程序呢吧!
别跟我说什么PHP、Java、C#、京东、XX、阿里巴巴、腾讯等等;
那时它们都还没出生呢!
它们的创始人都在学校里面肯书本呢!
这些技术(或者称之为技巧)其实说的都是应用都应该具有可伸缩性。
如果你对”可伸缩性”的定义要求达到XX搜索引擎或是新浪,网易,搜狐等等首页那样的数量级,那么你就不用再需要继续阅读本书了。
实际上,没有任何一种现有的商业解决方案能够适用于那样规模巨大的网站(它们其实也不可能是一步到位的)。
然而,如果你正在开发一个应用,并且你还没有10万个用户的情况下就开始考虑如何处理1亿个用户的情况,那么你应当重新考虑开发时的优先级了。
作为一个码农首先需要关注的是开发出一个用户喜欢和愿意使用并且具有较好体系结构的应用。
其次,就是能按时交活。
如果你能很好地做到这一点,你才会有时间和金钱来有效地应对你的第1亿个用户。
所以,性能真不是问题,但99%的企业都没有活到出现性能问题的那一天。
即使你真的是在类似BAT这样的企业工作,这样的事情一般也轮不到你的头上,因为学习是可以试错的,而工作不能试错的。
请在合适的时间,做合适的事情吧。
其它都是浮云!
4群雄纷争
在各大路边社的报道上面,比如:
CSDN、51CTO、XX贴吧、XX知道、XX问答、博客园、知乎,……。
我们经常会看到有关各类编程语言、开发工具和应用平台优劣的大混战。
可实际的问题就在于,由于没有一个统一的标准,所以也就谈不到哪个对与错。
因此上面的那些话题的大讨论、大辩论都说明不了什么问题。
最多也就是告诉你外面的世界很精彩,也很无奈。
4.1苦恼的码农
一旦我们选择成为码农,就等于选择了一条与技术为伍的道路。
编程(写代码只是编程工作中的一个小的步骤)有如一场智力游戏,克服难题的成就感会很让人上瘾,欲罢不能。
初启编程大门,无数名词扑面而来,设计模式、重构、单元测试、Java、.NET、PHP、JavaScript、OOA、OOD、OOA、RUP、XP、UML、IOS、Android、开发工具、操作系统、数据库、并发、异步、大数据、云计算、系统架构、Web2.0、移动开发……,除了必须要学一种程序设计语言之外,我们何去何从。
并不是所有的东西都是技术,有些则是码农的基本素养。
技术如果脱离了市场,就失去了用武之地。
我们的日常工作都是围绕代码在进行,所以,代码应该成为码农的骄傲。
那么,其它的就只是一些技巧罢了。
比如:
设计模式、OOA、OOD、框架等等。
说白了,就是让自己未来的日子好过一些。
不具备这些素养并不代表不能作程序员,无非是与别人合作困难点,自己未来难受点,不过,也许在老板的眼中,忙忙碌碌的你会成为加薪的预备役,塞翁失马,焉知非福啊!
更何况,那些技巧又不是学不到。
只不过暂时在自己实际的日常工作中暂时还用不上罢了。
学就是为了用,否则,你学它的目的是什么?
技术的运用固然重要,理解技术内涵却应具备更重的分量。
一叶障目的好戏经常在码农这个群体中上演。
最典型的一个例子就是J2EE让很多人忽略了OO的存在,PHP的短、频、快、稳让很多人都以为PHP只能做Web开发,而做不了企业应用。
很多码农眼里只有一项具体的技术,而绑定在一项技术的结果就是,任何新技术的诞生都会让他们心惊肉跳,他们无法承受技术过时的现实。
说到底,其实是为了让自己学习技术的付出可以获得更长时间的回报。
说白了,就是想多挣点奶粉钱。
不然掉队事小,掉饭碗事大。
微软已经多次让追随它的码农面临这种窘境了,如果没能赶上当年Windows替代DOS的那场大戏,那还有与Borland公司编程工具混战、C++与BC++、VB与Delphi之战,第一次浏览器大战、以及.NET的现在进行式。
诺基亚、摩托罗拉等手机厂商的衰败,苹果的再次崛起都值得我们去深思。
有选择是一种幸福,但有时也不尽然。
我LP在餐馆点菜时,总会让服务员站的两腿发软,有时我都会纳闷儿,她是在看菜单呢还是在背菜单?
而我只要进了马兰拉面,从来不看单子,一句话“大碗拉面”。
所以说,有选择是幸福的,但有太多的选择的时候,却成了另外一种痛苦。
人不会死在绝境,却往往栽在十字路口。
我们的古人不是也常常教育我们不要在一棵树上吊死嘛!
技术之间存在很大的共性,发现这种共性就是加深对技术理解的过程。
编程时,我们更愿意提倡抽象,而发现共性就是一个抽象的过程。
有了抽象作后盾,面对具体的时候,我们自然就能够得心应手了。
4.2大难不死的Java
Java的前身是Sun(光荣的于2008年被Oracle收购了)为了开发一个能够在手机、交互电视等消费类电子产品的平台上运行的系统而研发的语言,遗憾的是这个项目在市场上并不成功,Sun几乎已经决定取消这个项目的计划,Java面临夭折。
就在此时,互联网时代到来了,因此,Java重新活过来了,但是,一直不温不火,桌面应用开发搞不过VB,Delphi;
Web应用开发搞不过PHP,ASP,企业应用开发过于复杂,效率低下,直到SSH的出现,移动开发又做不过C++;
虽然,号称是“一次编写,随意运行”,但直到移动开发时代的来临,才真正焕发了青春。
4.3技术垄断的.NET
.NET技术是微软想统一Web开发与桌面开发的关键构思,也是COM技术的延续。
微软推出.NET技术原本是为了在WebService时代占据先机,虽然WebService存在多年没有真正的大作为,但C#和ASP.NET的确是发展壮大起来。
实际上,从市场角度来看,.NET技术更多的是以Java技术为假想敌的,用VB.NET维护原属于自己Basic阵营,推出C#对付Java,C#也被人称为Java的杀手,推出银光技术对付Adobe的Flash,而Silverlight也被人称为Flash的杀手。
微软的梦想其实是:
一个平台、一个语言。
4.1开源技术LAMP
以前微软和一些开源的厂商认为,是否使用他们的软件乃是一个非此即彼的决定。
简单地说,前一种选择保证更容易地管理,有较高的生产力,但价格更贵;
后一种选择具有更低的成本和更好的安全性,相对较高的生产力,但代价是更高的复杂性。
LAMP这个词的由来最早始于德国杂志“CTMagazine”;
MichaelKunze在1990年最先把这些项目组合在一起创造了LAMP的缩写字;
这些组件虽然并不是从一开始就设计为一起使用的,但是,这些开源软件都可以很方便的随时获得并免费获得。
但随着LAMP逐渐成熟,LAMP也悄悄地演化出了WAMP/MAMP/FAMP/WIMP/NMP等组合。
因此,我们可以这样的认为:
LAMP更像是一种“胶水技术”。
4.2混合技术AIR
1998年,乔布斯叔叔兴致冲冲地找到图像图形和排版软件生产商Adobe,希望他们为苹果公司研发一套视频处理软件。
Adobe认为给当时市场份额少得可怜的苹果Mac电脑开发软件,是对公司自身资源的一种严重浪费。
这让乔布斯很没面子,也很伤心。
因为在历史上,乔布斯曾帮助Adobe起家,是对方的“恩人”。
乔布斯叔叔很不鸟Adobe是众所周知的。
微软和Adobe也有一段貌合神离的合作。
“人世几回伤往事,山形依旧枕寒流“。
有兴趣的朋友可以在网上搜索下这段历史。
AIR技术曾在2007年的时候,被媒体誉为最值得关注的技术,就像当时的Ajax一样。
从Adobe官方的宣传资料上来看,主要有以下几点:
⏹本地运行------类似于桌面应用程序。
⏹跨平台运行----类似JAVA技术,在不同的操作系统上有对应的虚拟机支持,已经有Windows和Mac,Linux,Android,IOS。
⏹开发是基于现有的Web技术,如Flash/Flex/ActionScript/HTML/JavaScript/CSS/Ajax/PDF,对于开发人员,不需要学习C/C++、Java之类的底层开发语言,不需要学习具体操作系统底层API的开发;
这降低了开发门槛,使现有的做Web开发的技术人员,依赖其原本就很熟悉的开发模式,稍加训练就可以开发良好丰富的富客户端应用。
它的本质就是想抛弃浏览器,但实质上它自己也是一个浏览器(Webkit),这个浏览器可以从本机加载静态资源文件,可以受限的访问本机资源。
但是,随着HTML5技术的兴起,AIR的日子也越来越不好过了!
关键是微软目前也在倒向了HTML5,并放弃了该公司开发的Flash竞争对手Silverlight。
个人感觉AIR其实还真的不错,只是可惜一直没有机会来实际应用它!
4.3后起新秀Node.js
做过Web前端的人,都知道JavaScript是一种运行在浏览器的脚本,它简单,轻巧,易于编辑,通常用于浏览器的前端编程,但是一位开发者Ryan有一天发现这种前端式的脚本语言可以运行在服务器上的时候,一场席卷全球的风暴就开始了。
Node.js是一个基于ChromeJavaScript运行时建立的平台,用于方便地搭建响应速度快、易于扩展的网络应用。
Node.js使用事件驱动,非阻塞I/O
模型而得以轻量和高效,非常适合在分布式设备上运行的数据密集型的实时应用。
V8引擎执行JavaScript的速度非常快,性能非常好。
Node.js是一个JavaScript运行环境(runtime)。
实际上它是对GoogleV8引擎进行了封装。
另外,Node.js对一些特殊用例进行了优化,提供了替代的API,使得V8在非浏览器环境下也能运行。
其实,在互联网时代的第一次浏览器大战的时候,当时的网景公司就开发了基于服务器端的JavaScript(SSJS)。
但局限于当时种种客观的,主观的原因,以及技术所限,该技术被最终放弃了。
当然,除了以上几种技术平台外,一定也存在着其它类型的技术平台。
这里不列入它们,其实是有原因的,其中一个重要的原因就是上面这几种技术平台都是跨平台的(微软也宣布.Net核心运行库跨平台运行),并且都是开源的。
Node.js的梦想是:
“一个语言,前端到后端”。
5回顾:
数据结构+算法=程序
这个公式是著名的瑞士计算机科学家,Pascal之父,结构化程序设计的先驱沃思(N.Wirth)教授在70年代的时候提出来的。
核心内容就这么几个:
⏹查找,排序
⏹数组
⏹结构化数据,非结构化数据
在计算机发展初期,人们使用计算机主要是处理数值计算问题。
例如:
线性方程的求解;
该类问题涉及的运算对象是简单的整型、实型或布尔型数据。
编程的主要精力集中于程序设计的技巧,无须重视数据结构。
但随着计算机应用领域的扩大和软、硬件的发展,"
非数值性问题"
越来越显得重要。
据统计,当今处理非数值性问题占用了90%以上的机器时间,这类问题涉及到的数据结构更为复杂,数据元素之间的相互关系一般无法用数学方程式加以描述。
因此,解决此类问题的关键已不再是分析数学和计算方法,而是要设计出合适的数据结构,才能有效地解决问题。
就拿淘宝来说吧,当你看到的页面上,最重要的那几个功能:
【搜索商品】——如果你有几千条商品,完全可以用select
*
from
tableXX
where
title
like
%XX%这样的操作来搞定。
但是——当你有10000000000(一百亿)条商品的时候,任何一个数据库都无法存放了,请问你怎么搜索?
这里需要用到分布式的数据存储方案,另外这个搜索也不可能直接从数据库里来取数据,必然要用到搜索引擎(简单来说搜索引擎更快)。
好,能搜出商品了,是否大功告成可以啵一个了呢?
早着呢,谁家的商品出现在第一页?
这里需要用到贼复杂的排序算法。
要是再根据你的购买行为做一些个性化的推荐——这够一帮牛叉的算法工程师奋斗终生了。
【商品详情】——就是搜索完毕,看到你感兴趣的,点击查看商品的页面,这个页面有商品的属性、详细描述、评价、卖家信息等等,这个页面的每天展示次数在30亿以上,同样的道理,如果你做一个网站每天有10个人访问,你丝毫感觉不到服务器的压力,但是30亿,要解决的问题就多了去了。
首先,这些请求不能直接压到数据库上,任何单机或分布式的数据库,承受30亿每天的压力,都将崩溃到完全没有幸福感,这种情况下要用到的技术就是大规模的分布式缓存,所有的卖家信息、评价信息、商品描述都是从缓存里面来取到的,甚至更加极致的一点“商品的浏览量”这个信息,每打开页面一次都要刷新,你猜能够从缓存里面来取吗?
淘宝做到了,整个商品的详情都在缓存里面。
不再多写了,除了上面提到的这些,还有很多很多需要做的技术,当然并不是这些东西有多么高不可攀,任何复杂的庞大的东西都是从小到大做起来的,里面需要牛叉到不行的大犇,也需要充满好奇心的菜鸟,最后这一句,你当我是别有用心好了。
在我们实际的PHP代码的编写当中,数组是用的最多、也是最方便的数据结构。
在游戏软件开发、搜索引擎开发、GIS应用、地图应用、工程应用软件开发、数学分析应用软件开发中,算法的编写都是非常重要的。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 庖丁解牛 产品 项目