软件行思
天为罗盖地为毯,日月星辰伴我眠。
什么人撒下名利网,富贵贫困不一般。
也有骑马与坐轿,也有推车把担担。
骑马坐轿修来的福,推车担担命该然。
骏马驮着痴呆汉,美妇常伴拙夫眠。
八十老翁门前站,三岁顽童染黄泉。
不是老天不睁眼,善恶到头报应循环。
一首定场诗,没别的,是说一切都在因缘和合之中流转不定。却又遵循着规律的大河。
软件亦然,从最初的ENIAC(据说两层楼高),随着晶体管替代电子管,微电子技术的发展,存储单元计算单元变得越来越小。计算力越来越提升,到如今的笔记本电脑、智能手机设备。
网站从开始的纯静态页面展示,到动态效果展示。从巨石架构到微服务架构。从开始的命令行模式到现在多种多样的操作界面。从开始的只有台式电脑,到现在各种移动终端设备(手机、Pad、手表、汽车等)。
从技术角度来讲,编程语言从最开始的命令行、BASIC、汇编语言、C语言到后来的C++、Java、.NET、GO,前端页面从纯HTML到JavaScript、还有如今各种各样的框架组件React、Jquery、AngularJS、VUE、NodeJS等。
从思想角度讲,从面向命令、面向过程、面向对象、面向组件到面向服务不断迭代发展。
从开发方式讲,从开发过程中总结工程方法,比如瀑布式开发,到敏捷开发。
从技术类型上讲,有网络协议、有系统命令、有计算机原理、有前端技术、后端技术、服务器技术、客户端技术等。
从开发工具讲,有最原始的命令行、记事本,到文本编辑器、到集成开发环境IDE、甚至云端开发。
从软件开发步骤来讲,有需求分析、可行性分析、概要设计、详细设计、功能实现、测试、维护、发布等。
从版本管理条件讲,有SVN模式、有GIT模式。
从软件周期来讲,有设计、开发、编辑、编译、运行时期。编译工具又有ANT、MAVEN、GRADLE等。
从操作系统来讲,有Windows、Unix、Linux、Mac、iOS、Android、WindowsPhone等。
从软件思想来讲,从分而治之,从易于用户使用,从追求更高的复用性、可扩展、可维护性,从各种算法、架构提高安全、性能、稳定性。衍生出许许多多的技术和工具。所有精妙的思想、算法、技术都服务于软件,方便了人们的生活。一切硬件、社会的发展也在促进着软件的进化。往往出现了问题,我们想办法解决了问题。出现了更好的解决问题方法。
问题总是存在的,而解决问题的方法也总是存在的。
作为软件从业人员,我以为,应该透过现象看本质,以发展的眼光看问题。技术、代码、语言的改变是会不断进行的,因为这是时代发展的需要,是很多人的心血如此,网页你能看到的文字、听到的声音、看到的视频等等这些是表象,而本质是数据的CRUD增删改查,数据库的操作,硬盘的转动,内存、硬盘、CPU的交互运作。再底层是汇编、01010101、电流电压变化而形成了各种逻辑单元、能量的转移、保存。
再扩展一下,互联网中,你发送了一个请求,遵循着HTTP/HTTPS协议,传输了一些数据,到一个指定的服务器,然后服务器解析、处理你的请求并返回给你一些数据。这些数据经过电流、经过电缆、网线,经过路由器、网关中转到指定的服务器、服务器中的应用服务器处理请求。这些数据在传输过程中,首先从你用键盘或者语音输入,经过各种介质传输到计算机、浏览器,传送到服务器。
人与人之间交流,是不是也遵守着一定的协议,相互传输着信息呢?人们的语言就是字典,空气、电流就是传播介质,空气的震动、声音就是加密,对于声音、文字的理解就是解密,转化为理解。
难道这不是一样的道理吗?
或者我们可以用一种新的视角来看这个世界。
输入设备包括鼠标、键盘、摄像头、扫描仪、游戏杆、光笔、手写装置、语音识别装置等。
所有鼠标的主要目的都是将手部运动转化为计算机可以读取的信号。
输入设备是人或外部与计算机交互的装置,各种各样的数据,包括数值型和非数值型如声音、图像等都可以通过不同类型的输入设备传输进计算机,用以处理、存储和输出。
输入设备是外部与计算机传输数据信息、沟通交流的媒介。
输出设备包括显示器、打印机、音箱、绘图仪等。
输出设备是将计算机处理的结果数据和信息以数字、字符、图像、声音等形式表现出来。
说回软件,技术是实现业务的手段,标准是指定大家都遵守的协议,通过技术把各方各面联结起来,形成一个系统、组织成为架构。技术都是为了解决一个问题,比如高级编程语言是将高级语言转化为低级语言。比如Java/C#将转化为低级的汇编语言、机器码(010101)。一个程序的运行需要环境,这个环境的标准以Java为例是JVM,JavaWeb为例是Servlet容器,而网络传输的协议HTTP/HTTPS,客户端是浏览器访问具体的URL,这个URL经过DNS解析后会成为目标IP,这个IP就是可谓一定位的互联网中的一台主机,网络的七层架构寻址将请求发送到目标主机,以某个端口访问,收到请求后目标主机的服务器(这里主要是网页服务器,比如Apache之类),决定是直接返回某个页面HTML还是经过Application Server(比如Tomcat、JBoss等)解析处理后返回。
看到了吗?这里面的TCP/IP、HTTP、网络传输架构、Web Server、Servlet容器等都是协议都有标准。这个就是通信的基础。比如Web Server将请求发给Application Server是不管这个Application Server是什么,底层是用什么技术(Java/.Net/PHP/C++等),而Java也不管底层是什么OS操作系统,编译器将目标语言解释、编译,直至可运行(此时,一定是转化为可执行的文件了)。每一层由每一层的规范、任务,这有点类似于程序设计中的面向接口编程。层与层交互的时候关心的是你是否实现了协议、能否完成任务。
操作系统是系统软件,各种外设与计算机之间连通需要驱动软件,各种用途的是应用软件,软件的开发需要编程,你肯定不想直接写010101机器码吧?但最开始可能真的要这样,渐渐就发明了汇编语言,还是很难对吗?就有了面向过程的C语言,就有了面向对象的C++/Java/.Net等,前端页面直接写HTML?效果用JS?随着网站需求的发展进化,各种各样的技术演进也进行了,进而用框架、架构。
除了做研究之外,技术是为业务服务的。也就是如果你有最精尖的技术不能应用也无用武之地。从计算机时代、互联网时代乃至正在火热的大数据、AI互联互通时代。技术的革命带动了产业的升级变革,同时产业的演进也推动着相应的技术来支撑业务需求。相辅相成共同发展,所以有了从简单的计算器软件到现在大型的ERP。从单纯的网页展示到后来的炫酷的动态效果网页。从只有单一功能的网站到复杂可以一站式购物支付的大型网站。
因为有了业务需求,就有了软件。业务会变,所以软件也要有可扩展可复用性。软件工程从之前的瀑布式演化为现在迭代飞快的敏捷开发也是由于业务市场日新月异的特性决定的。
当然了,这种高速发展的产业也对从业人员提出了高要求,可能20年前你会Js、Java都可以了,而今呢各种软件框架、前后端技术、数据库技术是至少的。随着近年来高并发、高负载、分布式的大型网站需求越来越多,这方面也是考察点之一。这就要求技术人员要从实际业务需求出发,学习相应的技术。
这是最好的时代,也是最坏的时代。知识依旧可以改变命运吗?是日复一日的重复劳动还是专研成就安身立命之本?