软件的本质
科技发展是懒人驱动的。在我们完成一项工作,或者一项业务的时候,在信息化没有出现之前,我们就是用人和工具,还有机器,严格来说机器是一种复杂的组合式工具。人类总是发明新的工具,来代替旧的工具,其目的就是不断的提高工作效率,而不断的减少人的劳动,不仅仅是体力劳动,还有脑力劳动。也就是说不断的解放双手,双脚,甚至解放人类的大脑。理解这一点,才能理解为什么人类会发明计算机和自动化系统。自动化系统将控制电路与机械的结合取代了人的手和脚,计算机代替了人类的大脑。当然现在还做不出来完全能代替人的聪明的机器人,但是你可以基本预测出人类科技的发展方向:不断发明自动化工具,让人更省心,更省力,这个追求好象是没有止境的。对于信息技术来讲,编程语言的不断改进,各种框架的出现,甚至现在低代码编程或者是无代码编程的出来,都体现了这一点。
软件是相对于硬件来说的。硬件与软件的界限越来越模糊,除了一些需要物理变化、化学反应才能完成功能的器件外,凡是和信息处理逻辑有关的部件都可是软件,也可以做成硬件。需要它很灵活多变的,就以软件存在,需要它不变且高性能的就可以做成硬件,象早期看视频用的解压卡,就是在cpu性能不高的时候,专门把解压算法做成芯片,硬解压的播放速度就高。再比如现在的SDN,软件定义网络,用软件的方式实现了路由器,网卡,交换机等的功能,实现了非常低成本,灵活弹性的网络配置。还有现在大兴其道的“云计算”也是基于硬件虚拟化技术来实现的,即用软件的方式模拟出一台主机。
所以说软件的本质其实是自动的信息逻辑处理。用电路表示出来就可称之为“硬件”,但其内涵其实还是“软件”。但归根结底的话,它都是实现业务功能或是解决某一个问题的过程中的一环。这一环很关键但并不是全部,它相当于人的神经与大脑,它还需要与四肢相结合才能完成任务。所以开发软件的人一方面要深入的了解业务的逻辑规则,另一方面要深入了解相关的输入,输出设备的接口和原理。这样才能很好的完在真正的业务功能。这里所说的业务规则,有两个层面,一个是针对机器世界的的,一个是针对人类世界的。你搞软年开发的,要不你偏重于机器世界,你就要多学学计算机组成原理,还有相关的外部设备的原理,及其它们之间的通讯接口和协议等。如果你偏重于人类世界的逻辑,看你做什么样的应用软件了,基础点的,物理学,化学,电子学,数学等等,商业领域的,比如管理学、经济学,金融学。总之,这些业务逻辑知识才是最重要的。要想开发出好用的软件,最重要的并不是用什么语言,用什么框架。而是业务领域知识。这是本质。
编程的本质
编程就是利用程序开发语言来表达你的业务领域的知识逻辑,它就是一个工具,一个手段,编程不是目的。所以用什么语言都可以实现你想要的业务逻辑,只不过是效率高不高的问题。
效率问题主要有两个方面,一个是运行效率,另一个是开发效率,运行的效率,除了硬件的速度外,主要靠好的算法,学过编程的人都知道,同样是一个排序,不同的算法速度差着几倍,一方面原因是计算机的基本原理的限制,还有一方面与数学原理有关,本质上是用空间与时间的互换。当然,最终运行的速度还由硬件来决定,了解程序在计算内部执行的过程原理,就可以精细调整你的算法实现,让硬件发挥出最佳效能,有时候这几方面要互相配合,才能发挥出整体优势。
随着硬件的性能的提高和成本不断降低,运行效率问题相对不是太大了,编程界越来越重视开发效率。一方面出现了结构化编程、模块化编程;面向过程编程,面向对象编程,面向切面编程,微服务架构等等,这一些技术的出现,都是为让人编程更简单更有效率。编程技术的发展就是不断的把可重用的,程序设计方法论的演变、再到软件架构,设计模式等等理论的发展,无外呼做了一件事:抽象简化,就是尽量的把可重用的算法包装成块,用组装的方式,搭积木的方式来编程。
所以搞编程的,就要研究两个方面,一个是运行效率,你主要要学好算法。另一个就是学好软件工程化的理论。用什么设计方法,用什么框架和工具,能让这个开发过程更简单,更高效。