在这个系列博客的第一篇中,首先要涉及到的哲学原理就是——世界的本原是物质。
在IT领域,有硬件和软件之分,而二者之间的关系,就和物质与精神类似。没有硬件的存在,那么软件就没有能够发挥作用的基础支持了。所以,我们会看到,硬件的作用非常重要,即便是我们只从事软件开发,也需要对硬件有足够的了解,这也正是计算机软件专业的学生也需要学习计算机原理,计算机网络等等课程的原因所在把。
硬件的不同,有时候会在很大程度上决定运行其上的软件,比方说,在不同体系结构的计算机硬件上,所能够运行的软件会受到限定,比方说,计算机会分为微型计算机、小型计算机、大型计算机等等,上面运行的软件,从操作系统到各种应用软件,都会有很大的区别,这也是由于每种计算机所要完成的工作也是不同的。再比方说x86架构和RISC架构的计算机,软件运行的方式也不尽相同。很多大型软件,像Linux、Oracle等等都需要针对不同的架构来开发出不同的软件。
在解决问题的过程中,尽管我们是开发人员,大部分的时间只会和软件打交道,但是对于特定的问题,也要关注硬件。比方说性能问题,根据摩尔定律,硬件更新的速度非常之快,所以在很多时候,大家都希望通过从硬件的角度来解决,软件运行的速度不够快,那么我们就换更好的CPU,甚至是四核、八核的,提高并行计算的速度,或者加更多的内存,让更多的程序在内存中运行,或者把磁盘换成固态的硬盘等等。这样的手段在某些情况下会很有效,起到立竿见影的效果,而且购买这些硬件所需要付出的成本,远远要比一个程序员修改程序、从软件的角度调优的成本要低得多。
然而,我们又不能够把所有的性能优化问题都交给硬件工程师来解决,那样软件工程师不就失去了存在的价值吗?很多时候,我们在编写程序的时候就应该关注性能的问题,从开始的时候就避免因为程序的编写而造成性能问题。比方说,因为各种设备或者的速度大概会是:网络 < 传统硬盘 < 固态硬盘 < 内存 < 高速缓存,这样我们在编写程序的时候,就应该尽量避免网络传输的频率和数量,比方说应用服务器和数据库服务器是通过网络连接的两台独立的计算机,那么就应该在往返一条指令的过程中,在一台服务器上做更多的处理,而不是过于频繁地在两台服务器之间传递数据。而且在二者之间传递数据的时候,要尽可能地节省,只传递必要的数据,而不是眉毛胡子一把抓,传递了一大堆没有用的数据,这样就会产生大量的浪费。
硬件和软件是密不可分的,而且硬件是看得见摸得着的实体,而想要一个人认识到软件,就有一些抽象了,它们只不过是存在于计算机中的“1”和“0”,因此就会产生这样的情况,人们愿意为硬件付费,但是却不愿意为了软件花钱。很多人愿意花1万元购买一台昂贵的计算机,却不愿意花30元购买一个小软件。这对于程序员群体是一种悲哀,因为那就意味着大家的劳动成果没有得到认可,毕竟钱也是对价值的一种体现。所以,在很多项目中(特别是国内项目),厂商都喜欢采用硬件和软件搭配在一起销售的方式,因为只有见到了硬件,才认为自己的钱花的值得。更可笑的是,为了证实自己的硬件有价值,厂商们可能会把本来可以做的很小的设备放在一个庞大无比的铁箱子里,那样才能够卖得出价钱——这铁块儿也太值钱了吧,哈哈。
因为同样的原因,还有一些厂商喜欢把软件的功能集成到硬件之中去,把原来的卖软件变成了卖硬件,比方说大家最为熟悉的防火墙,有硬件防火墙,也有软件防火墙,其实二者的功能以及运行机制上都是类似的,但是销售起来却完全不是一个概念了。
在现在流行的移动开发中,硬件对于开发者的影响也非常大。iOS的开发者很幸福,只需要针对一种或者几种设备开发应用就好了,而Android的开发者就比较悲催了,光是主流设备的种类就够头疼的了,更不用提各种各样的山寨机了,尽管现在有不少网站提供了虚拟测试的环境,但是很多功能只有用具体的设备才能够测试出真正的效果。因此,现在才会有HTML 5技术会更为流行的说法,这样开发者就不需要去适配各种各样的设备了。然而这又会导致另外的问题,原生的应用和基于HTML 5的应用,不论从开发方法还是从各种使用方式来说,都会有一些区别。
软件的确会受到硬件的各种限制,同时,没有软件,硬件也就没有用武之地了。想要让一个硬件发挥出真正的作用,需要大量软件的支持,比方说我们的计算机中会安装操作系统软件、办公软件、开发软件、游戏软件等等,每种不同的软件都会为我们的工作提供不同的便利,有了这些软件,我们的工作和生活才会变得如此美好。
总之,硬件和软件的关系,与物质和精神之间的关系类似,硬件决定了软件,反过来软件也会让硬件体现出存在的价值,决定硬件所能够起到作用的效果,二者是密不可分的。