【计算机与社会知识】我们相信冯·诺依曼

我们相信冯·诺依曼

出现BUG的时候,请检查大脑

这里谈到的是计算机体系

什么是程序员

我的第一篇博文是在去年七月写的,那时候是大三结束,找到一个实习,主要从事的是BS开发,历经一年多,我现在仍然是BS开发员,只不过换了很多项目了,从最开始用EasyUI做简单的页面,利用XML去在两个系统中做映射,到后面利用ASP.NET做类似AOP的编程,然后就是直接接入Spring MVC项目,数据存储也都涉及到了主流的SqlServer、Oracle、Mysql、ElasticSearch、Redis,经历了对得起我这个年纪的开发,我开始想什么是程序员?

我目前所在的职位其实是技术支持,比起互联网里面的技术部门,我的工作应该是扩大到维修电脑,对于每一个CS出身的学生,都不得不吐槽这些问题,但是,我觉得这让我更加接触我所开发的东西到底是面向怎样的群体。

透明”是计算机体系结构的核心字词,在软件工程中也同样重要,原因就是它能阐述我们所创造的东西到底是有怎么样应用场景,比如,作为外包,那么可能对他我就会采用部分的业务透明,因为他不需要太了解我们业务的要求,他主要是完成开发活动,而对于使用我BS系统的业务员,那么我就会采用软件透明,对他来说就是上网,然后根据自己的实际工作实现一些网页的操作,例如输入几个输入框,点击一个保存,即使我们后台复杂到需要同时驱动几个Service甚至外调其他语言,或者涉及一个复杂的算法。这也是当前敏捷开发的最大特点。

当然到目前为止我还没说什么是程序员,因为从字面上,可以理解为coder,但针对我们面对的是一台确定性执行的机器,那么我觉得程序员叫做creator更加合适,世界空间就是机器,其定理、规则都是程序员去确定,所以在计算机的世界中,程序员就是“上帝”,只不过你得接受,有很多的“上帝”协同工作,更像是希腊的神,谁也没有办法只手遮天,甚至之间还有很多的矛盾,更会有好坏之分。

无论是从事前端、后端、全栈,你都不得不去扮演上帝的角色,这样最大的好处就是,无论怎么样,当出现问题的时候,十有八九都是上帝的错,要知道,真的想挑出一个编译器的BUG是多么不容易,它比你还死板,只是你的一个拥有一定智能的助手,帮你做翻译工作而已。

角色的诞生

前面说到上帝,细想一下,基本上是对的,但深究一下,为什么程序员扮演这个角色?

有很多的问题看起来是那么显而易见,这两天我突然想到为什么角度为90°的角叫做直角,在我大脑一直徘徊着直角尺、桌角等形象化的东西,但针对90°却很难想出来,最后翻翻欧几里得在《几何原本》才重新找到小学时候学到的均分,真是神奇,点线面,二维空间的知识差点儿就把我弄晕了。

从这里开始深究,我们写的每一个程序都只会按照我们写的那样去执行,无论是面向对象还是面向过程,最终都只是按照我们的想法去执行,如果没有的话,最好是检查一下你在写那段代码时候,是不是大脑短路了,逻辑性搞错了,至少我们在通用机上写的应用程序很难因为CPU排线的电子跃迁导致结果错误。

从现在我觉得就是上帝角色的诞生,是程序员去安排规则的,而且从一定角度讲是简单规则,程序员在编程的时候,大脑肯定会有一个蓝图(如果你没有做到,请尽快培养这样的思维),写代码和代码运行存在很多的类似,那就是,写的时候,是你的大脑在调控你的行动,手按照大脑指定的方式去敲击键盘(纸上画流程图之类的也是),而代码运行也就是CPU去中央调度,只不过他的方式更加简单粗暴,那就是算数运算和基础逻辑运算,或者控制,但总的来说,我们知道的就是中央调度。

冯·诺依曼体系结构之所以让我们能轻松编程,最大的原因就是现代通用机器都是中央处理单元,和我们的大脑思考方式一样,中央调度的,我们输入的程序、数据,都是由CPU在寄存器上进行单步处理的,哪怕是分布式编程,从数据流的角度来看,都是存在时间序列,和中央调度的。这集大地减轻了我们的大脑转换难度,从另一个方面来看,就是真出现时间序列的问题,常常导致我们很难去Debug,相信写过Verilog的人都经历过入门的崩溃期,虽然我们都能理解中央调度和流程图,但一旦问题出现在时序上,那就是用四维的思考,相信做分布式的程序员们都知道时间戳到底是多么重要。

总之,冯·诺依曼的体系能让我们轻松地将流程图转换成具体程序。

简化

计算机发展到今天,在科学上的用处已经多得难以想象,而且很多学者喜欢用计算机去进行模拟,这就导致另一个领域的兴起,数学建模,计算机的计算本质是什么?布尔代数,如果我们只考虑0和1的问题,那么很多东西都会很简单,例如针对明天下不下雨,0表示不下,1表示不下,那么在明天结束的时候,就可以根据实际发生,在当天的下雨表中填入一个布尔值,那假如填入的是个叫下雨概率表,且精度为百分位,那么就有0%到100%,将布尔值0表示为0%,那么怎么得到1%?当存在一个由布尔值组成的字符串,如果我们告诉他来表示数字,那么我觉得最好的解决办法就是用0000000表示0%,用0000001表示1%,用0000010表示2%,看到了么,这就是最简单的数值表示,与我们常用的十进制之间有明显的区别,虽然在转换时候,我们的大脑会不太喜欢,比如127表示计数的127,但实际上是十进制方式【1 * 10^{2} + 2 * 10^{1} + 7 * 10 ^{0}】的字符串表达形式,同理就可以得到二进制下的127表达形式为1111111,一点儿都不神奇吧!只是放弃我们曾经最习惯的简化而已,只不过计算机在最底层做了这个最简单的简化,所以想要真的接触计算机本质,就得转变一下对数的看法,当然作为高级语言程序员可能不太重要,但我觉得面向全栈的多少学一下。

我们将所有能量化的东西都进行量化,差距太大的,用归一化,无论怎么样的都是决定容易,哪怕有些不能显而易见简化的,也能暴力简化。记住,计算机目前只能计算简化的东西,即使这个东西有人告诉你是大数据计算,是科学计算,不要觉得多么困难,本质上,他只是通过熟悉工具的人写出的一个计算流程,当然你没进入那个领域,所以还是很难写出那样的代码,特别是掌握一个思想,例如MapReduce。

冯·诺依曼体系的计算机真是这样的一个怪东西,机器的处理方式和我们简化后思考的方式一样,其实也应该庆幸,倘若我们真的需要按照非简化模型去处理问题,就连计算机的位数都是问题,更何谈计算的性能。

抽象及高级语言

如果把什么都看成0和1,那么说实话,我们几乎写不了多少代码,就得去找新的办法,这也就是计算机编程语言的开始,我的入门语言是C,比起现在写JAVA , PYTHON,简直是无比痛苦,特别是老师动不动要我们做处理字符串的作业,当我开始写C++、JAVA的时候,我已经失去了好多基本能力,我清楚记得在数据结构考试时候,做字符串匹配,当时我已经开始写JAVA程序,可想而知,我真后悔没有背过KMP的C语言实现。但后来我选修了汇编语言,我不知道有没有什么好的IDE,反正我是用最传统的DOS下进行编程, 就像用GEDIT一样,不过他的功能更加强大,能在CMD里面直接使用,只不过每次编译都得退出,然后指令去控制编译程序,这还好,最恐怖的是,当真的处理存储以及递归的时候,需要画着草图去存,每一个指令的操作,还得画寄存器,特别是在16位上进行32位的操作。

我觉得我描述的已经够清楚了,我们每一次进行编程语言层次的提升都一定程度上是摆脱繁琐的容易出错的工作,把问题抛给自动化的东西,这就是编译器,不得不说这里得提到抽象的话题,当计算机执行到我输入的int a=10时候,其实在内存就开辟一个空间,长度随计算机位数变化,并且在相应的位置充电和放电,这个过程时间也是很值得思考的,我们把这个事物的实质抽象成一个赋值语句,太了不起了。

但现在作为JAVA或者PYTHON的程序员,还去思考这些问题简直是不可思议的,毕竟JAVA是JVM,学到那一层就可以,而PYTHON这样的语言更加难想象。

一层一层地语法抽象,大多数主流的编程语言已经基本上是人人都可以接触的,特别是写Javascript,环境都不用搭建,一个浏览器软件安装完就可以。

但我觉得很多人没有想过为什么编程语言可以这样的转换,我已经忘记了很多编译器知识,但从另一个方面,我觉得可以归功于冯·诺依曼体系,他的基础操作是那么稳定以及具备完整逻辑,通过中央调控,指令根据指定的位置去读取数,再进行约定的逻辑电路操作,再根据指令进行反馈。真是这样的稳定性,使得再高级的语言,只要能履行约定的逻辑就可以转换为机器语言。当然编译器还做了很多了不起的事儿,他的确也是比较难入门的。

总结

冯·诺依曼体系给了我们一个清晰地计算机概念,现在通用计算机区别于计算器的最大一点就是,存储能力和逻辑支持,布尔代数提供了硬件实现以及基本推理的要素。这些带来的最大好处就是使得我们思考的方式不用因为计算机而去改变太多,就像程序员买菜的笑话,实际上很难出现,因为程序员在现实中早就做到了对常规语言的生活化转换,或者说面对计算机,我们的世界就是简单模式,简单化所有的问题,通过人脑去控制手敲击键盘,借助计算机大脑去构建我们的世界,使得规则得意执行,并不会出现一个二义性的计算机语法,出现BUG的时候,请检查大脑。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值