《Java架构师的第一性原理》00计算机的第一性原理
1 信息、知识、智慧
我所说的,都是错的。
庄子说过吾生有崖,知无涯。以有限的生命去学习无尽的知识是很愚蠢的。那么,我们应该学习什么?
语言是人类用于交流的一种工具。语言是主要以呼吸器官发声为基础来传递信息的符号系统,用于表达事物、动作、思想和状态。
语言用来传递的比特,可以分为三个层次,信息、知识、智慧。互联网诞生引发信息泛滥,知识付费诞生加大知识繁杂,人类由信息贫瘠的状态,骤然堕入信息的海洋,无法挣脱又焦躁不安。信息用来生产奶牛乐,知识用来创造价值,唯有智慧,跨越文明和技术的进程。
信息、知识和智慧有什么区别?信息没有经过系统化的整理,碎片化未经验证地传递给你。知识是经过系统化的整理理论,可以部分用来指导人类生产生活的信息。智慧是思考的产物,是经过长期思考并且经过大量社会实践、采用归纳法或者演绎法总结出来的理论。不同的是,前两者是外部输入向外求得,后者是内部产生向内求得。
需要注意的是,无论是信息、知识、还是智慧,你都需要对他们保持怀疑的态度。信息、知识、智慧依次产生的误判可能性逐渐递减,反过来一旦产生误判所产生的破坏性逐渐增强。
回到开头的问题,我们应该学习什么?
信息垃圾太多、知识会过时不稳定,我们应该学什么?学习永恒不变的东西。这里的永恒,我定义为以5年为一个单位,可以在1-N个单位持续产生价值的智慧。
这些智慧有很多代名词,哲学、方法论、第一性原理、抽象模型。为了让信息更易于传播,我选取其中一个流行的代名词来叙述,第一性原理。
2 计算机的第一性原理
计算机的第一性原理是什么?
想要了解第一性原理,先要探究一个事务的本质。我们先来探究计算机的本质。
那么,怎样探究一个事务的本质?我们使用历史跨越模型来研究本质,“历史不会重复自己,但会押着同样的韵脚。历史、现实、未来是相通的。”
1)电
电的发现里程碑:
公元前600年左右,古希腊哲学家泰勒斯,对常见的静电现象做了仔细观察和记录。
1752年2月,科学家富兰克林做了著名的风筝实验,证明闪电也是一种放电现象。
1791年,动物学家路易吉·伽伐尼利把静电机和青蛙肌肉相连,利用静电让死去的青蛙出现肌肉颤动,开创了生物电学领域。
1800年, 意大利教授伏打发明了首个电池组——伏打电池,此后科学家的电学实验不再限于静电研究。
1831年,法拉第提出了“电磁感应现象”,并发明了人类的首台发电机,为人类迈入电气时代打下了基础。
人类从发现放电现象到电力的应用,花了2000多年的时间。
2)计算机
计算机的发展里程碑,可以分为五个阶段:
- 第一代计算机:真空管计算机 1945年~1955年
- 第二代计算机:晶体管和大型机 1955年~1965年
- 第三代计算机:集成电路和小型机 1965年~1980年
- 第四代计算机:个人计算机和移动终端 1980年~至今
这里面有意思的历史脉络是,在电子计算机出现前,还有前人尝试过机械式计算机。
- 17世纪法国有一位“全能超人”帕斯卡(数学家、物理学家,也是哲学家、流体动力学家,还是概率论的创始人之一) 造出了一个内部装着一堆齿轮的盒子,这个“第一台机械式计算机”只能进行简单的加减运算。
- 德国数学家莱布尼茨制造出了一台可以进行加减乘除运算的机械式计算机,它的计算能力达到了小学生的水平。
- 英国数学家巴贝奇在19世纪20年代制造出的差分机,则会计算一些数学函数了。
后来人们意识到,如果只使用机械齿轮进行计算,计算能力是极其有限的,要想让计算机拥有更强的计算能力,只有另辟蹊径。于是,电子计算机被制造出来了。依靠电力来工作比依靠齿轮工作速度更快,因此电子计算机有更强的计算能力。
人类从电力的应用到发明第一台电子计算机,花了62年的时间。
3)互联网
本文将50年全球互联网发展史加上史前10年和21世纪20年代开始的10年,每10年一期,划分为七个阶段:
第一阶段,20世纪60年代的基础技术阶段,以计算机广域网和数字通信技术的成熟为标志,尤其是包交换技术的突破,为互联网前身——ARPA网的诞生奠定了基础;
第二阶段,20世纪70年代的基础协议阶段,最大的突破就是TCP/IP的诞生,使得不同计算机和不同网络之间互联成为大势所趋;
第三阶段,20世纪80年代是基础应用阶段,全球各种网络如雨后春笋一般冒出,并且通过电子邮件、BBS和USEnet等应用的普及,促成了互联网在全球学术界的联网,TCP/IP和NSFNET成为协议大战和网络大战的胜出者。
上述三个阶段,包含史前阶段,是互联网商业化之前孕育、积累和完善的30年。没有风险投资,没有一夜暴富,互联网故事大多平淡乏味,缺乏轰动效应。然而正是这长达30年的“寂寞期”,积蓄了互联网厚积薄发的巨大能量。
第四阶段,20世纪90年代的Web 1.0阶段,主要是万维网(WWW)的诞生和商业化浪潮,推动着互联网走向大众,以浏览器、门户和电子商务等应用开启了互联网发展的第一次投资热潮;
第五阶段,是21世纪头10年的Web 2.0阶段,主要是博客、社交媒体等兴起,网民成为内容的生产主体;
第六阶段,是21世纪10年代的移动互联阶段,随着智能手机全面崛起,移动互联网成为全球互联网新一轮扩散的主力军,更加深入地改变着人们的日常生活;
第七阶段,就是21世纪20年代开启的智能物联阶段,随着5G应用的展开,全球将进入万物互联新阶段。
人类从发明第一台电子计算机到开始设计计算机局域网,花了5年的时间。
4)三次工业革命
第一次工业革命与蒸汽时代。工业社会的蒸汽时代起于18世纪初,止于19世纪30年代的第二次工业革命。 在蒸汽时代,工业的最重要特征是机械化。
发电机的发明和使用引起了第二次工业革命,把人类社会推进到电气时代。 从1831年法拉第制造第一台发电机,到1877年发电机被批量化生产,期间46年时间是蒸汽时代向电气时代的过渡阶段。从此,人类社会进入电气时代。在电气时代,工业的最重要特征是生产电气化、自动化。
20世纪40 年代,人类历史开始了第三次技术革命。从1939年第一台电子计算机发明,到1947年通用电子计算机UNIVAC-I批量生产和使用,期间只有8年时间,这是电气时代向信息时代的过渡阶段。电子计算机的发明和使用引起了第三次技术革命,把人类社会从电气时代推进到信息时代。人类社会现在仍然处在信息时代。
5)艾伦•图灵、冯·诺依曼、包交换、Unix、TCP/IP
1936年英国数学家图灵首先提出了一种以程序和输入数据相互作用产生输出的计算机构想,后人将这种机器命名为通用图灵机。
为了提高第一台现代电子计算机ENIAC的计算能力效率,工程师们设想将程序与数据都放在存储器中。数学家冯·诺依曼将这个思想以数学语言系统阐述,提出了存储程序计算机模型,后人称之为冯·诺依曼机。
人们普遍认同现代计算机理论最重要的奠基人是图灵与冯·诺依曼。前者建立了图灵机的理论模型,发展了可计算理论;而后者确定了现代计算机的基本结构。
1965年,英国国家物理实验室(NPL)的唐纳德·戴维斯(Donald Davies)被任命为NPL的负责人,第二年就提出了一种基于“分组交换”(即包交换)的全国性数据网络。在包交换网络上,信息被分解成一系列单独发送的离散“包”,并在接收端重新组合成完整的信息。
1969年,最早由肯·汤普森(Ken Thompson)、丹尼斯·里奇(Dennis Ritchie)和道格拉斯·麦克罗伊(Douglas McIlroy)在AT&T的贝尔实验室开发的UNIX分时操作系统诞生。这是一个强大的多用户、多任务操作系统,支持多种处理器架构的分时操作系统。
1970年12月,史蒂夫·克洛克(S.Crocker)领导的国际网络工作小组(International Network Working Group,简称INWG)完成了最初的名为网络控制协议(NCP)——阿帕网主机到主机协议。阐明了构建一组分层协议的概念,底层是通用传输服务,顶层是多个特定于应用程序的协议。(阿帕网立项之初的构想,仅仅是希望联接并共享宝贵的计算机资源。但是,项目一旦启动,技术创新就有了自己的意志和取向。不务正业的电子邮件不经意间成为互联网第一个杀手级应用。可以说,互联网是建立在电子邮件的应用之上发展起来的。)
1973年,正式到IPTO工作的鲍勃·卡恩提出建立Internet,开始在ARPA进行网络互连的研究。3月,文顿·瑟夫在旧金山一个饭店的大堂里,将网关体系结构的草图画在一个信封的背面。到1973年底,瑟夫和卡恩完成了他们的论文,题目定为《关于包网络相互通信的一个规范程序》。论文对TCP协议(传输控制协议)的设计作了详细的描述,后来发展为今天的TCP/IP协议。TCP/IP 意味着 TCP 和 IP 在一起协同工作,TCP 负责应用软件(如浏览器)和网络软件之间的通信,IP 负责计算机之间的通信,这为实现真正的互联网插上了腾飞的翅膀。
6)计算机的第一性原理
计算机的发明是为了提高计算速度,帮助数学家们解决数学问题,图灵机最初被用于密码破译,通用电子计算机ENIAC是专门为美国奥伯丁武器试验场计算弹道需要而研制的。
网络的发明也是为了通过联接并共享宝贵的计算机资源,来提高计算速度。
(信息时代是计算机的衍生产物。我们预料计算机作为运算工具,将会推动世界进入一个更为高效的时代。但是,没有人会预料到,一旦计算机被用作通讯工具,这些被网络联结起来的计算机就会将这个已经取得诸多进步的世界彻底颠覆,并把它推向一个完全不同的逻辑方向——Net的逻辑。正如1994年,有一个叫凯文·凯利的美国老头,在他的几乎预测未来式的著作《失控》里所说,“虽然网络尚在襁褓之中,但就在那天拂晓,我意识到计算机的未来不在数字而在于联结”。)
本章结语:
本来想写点干货,发现吹牛更过瘾。从下一篇章开始,尽量减少吹牛的部分。
计算机的发明初衷是提高计算速度,网络的发明初衷也是为了提高计算速度,只是在被用作通讯工具不小心产生了巨大的经济价值(后来的分布式计算弥补了网络的发明初衷)。
计算机的第一性原理就是,一切为了更好地计算。
找到计算机的第一性原理后,后面的章节只需围绕第一性原理来思考即可。
- 计算机基础中,操作系统是为了在有限的资源中有序分时地计算,计算机网络是为了连接多个程序、多台计算机并行提高计算速度。
- Java是一门用于运算和联结网络的语言,可运行在JVM(跨平台的虚拟机)上。
- 分布式计算是指挥多台机器、多个应用程序同时运行,降低硬件成本、提高运算速度,同时解决分布式计算可能引入的新问题。
- 存储是为了服务于提供运算的输入、运算中间过程、运算结果。
- 算法用来设计一种使用计算机来解决问题的方法。数据结构(Data Structure)是计算机中存储、组织数据的方式。
3 程序员的学习路线
1)左耳朵耗子(酷壳https://www.coolshell.cn/)
(1)程序员需要学习什么
变化都是表面的东西,内在的东西其实并没有太多的变化。
在技术世界不要觉得量变会造成质变,这是不可能的。技术这个东西就像搞建筑砌砖头,砌砖头砌的再多也不可能让你能成为一个架构师的,因为你不懂原理,不懂科学方法,你就不可能成长上去的,就像学数学一样,当你掌握了微积分这种大杀器后,你解题的能力是无所披靡,而微积分这种方式绝对不是你能“量变”出来的。
掌握技术基础可以让自己找到答案和知识,基础是抽象和归纳,很容易形成进一步的推论。
对于技术的基础,我会把其它成四类:
- 程序语言:语言的原理,类库的实现,编程技术(并发、异步等),编程范式,设计模式……
- 系统原理:计算机系统,操作系统,网络协议,数据库原理……
- 中间件:消息队列,缓存系统,网关代理,调度系统 ……
- 理论知识:算法和数据结构,数据库范式,网络七屋模型,分布式系统…
(2)学习效率
- 挑选一手知识和信息源。
- 注意原理和基础
- 使用知识图谱。一定要学会使用知识图谱,把知识结构化。
- 学会举一反三。就是用不同方法学一个东西。
- 总结和归纳。只有学会总结和归纳,才能形成自己的思维框架、自己的套路、自己的方法论,以后学这个东西应该怎么学。套路这种东西只有学的多了以后才能形成套路,如果你只学会一门语言不会有套路,你要每年学门语言,不用学多精,你思考这个语言有什么不一样,为什么这个这种有玩法,那个有那种玩法,这些东西思考多了套路方法论就出来了。
- 实践和坚持。剩下就是多做多练,多坚持,只有实践才会有经验,只有锻炼了才能够把自己的脂肪变没,所以,要把知识变成技能必须练。
2)闪客sun(低并发编程 https://www.cnblogs.com/flashsun/p/9766221.html)
我认为的学习路线应该是:
自制个cpu--微机原理--简单数据结构与算法--计算机组成原理--汇编语言--操作系统--C语言--编译原理--复杂数据结构与算法--计算机网络--Java--Java虚拟机--源码研究--多线程linux高并发Spring负载均衡各种以这些评判一个人Java水平的东东...
3)Edison Zhou (https://www.cnblogs.com/edisonchou/p/4996163.html)
三大原理(计算机原理、操作系统原理、编译原理)两个协议(TCP与HTTP协议)一种结构(数据结构)
3)码农唐磊
99 直接读这些牛人的原文
深入理解计算机系统(序章)------谈程序员为什么要懂底层计算机结构
|
作者:沙漏哟 出处:计算机的未来在于连接 本文版权归作者和博客园共有,欢迎转载,请留下原文链接 微信随缘扩列,聊创业聊产品,偶尔搞搞技术 |