当我们在写代码时,我们到底在写什么

当我们在写代码时,我们到底在写什么

前序

从实习到正式参加工作以来,我都编写着服务端代码。对于服务端业务代码,总的来说,就是简单的“增删改查”,因为当我们在设计编写某个功能的实现时,到了软件开发这一步,基本上就从数据库的设计开始了。

软件开发,或者说是编程,本质上是用机器语言对我们的显示世界进行建模,针对一个又一个的业务需求,程序员在乎的已经不再是我们如何对这个需求进行建模,而是如何对这个业务产生的数据进行建模。对于数据的建模,简单来说,就是对于存储下来的业务数据怎么保存,怎么查询,怎么更新,更直白的来说,大部分都是考虑数据库表的设计。这么多年以来,我一直遵循着这一办事“基本准则”进行软件的开发。对于数据的存储,大多情况下还是基于关系型数据库,MySQL\Oracle数据库在这一方面大行其道,同时夹杂着NoSQL的流行,像Redis这类K-V数据库也流行到几乎每家公司的面试笔试都会提上一笔,哪怕面试官也仅仅会使用框架自带的工具进行简单的操作以及使用图形管理界面进行简单的查询,也有在大数据发展的前景下普遍使用的HBase、ElasticSearch等在各类应用中不乏有表现自己特性的机会。

回到程序员开发后台业务代码的“基本准则”,这么多年来,没有什么人质疑过为什么要先设计库表结构,因为这样的确对于业务的开发,功能的确定有极大的帮助,尤其是团队开发中。但是从编程的角度,我们仅仅是对业务的数据进行了建模,我们只知道业务与数据的关系,对于所有的业务逻辑,我们所能做的是如何操作数据,编写一个又一个的函数去搬弄我们一开始定义的业务数据。使用面向对象的编程语言,对于存储在数据库里的数据,从我们的应用软件层面对其进行建模。是的,数据库软件对业务数据进行建模,而我们的编程语言对数据库数据进行建模,而在我们的开发过程中,程序执行的方向,我们的应用程序往往是在数据库前面。用户通过浏览器或者手机APP上的一次操作,请求将先打到我们的应用服务器,然后再经过数据库,是否经过数据库,完全取决于我们的应用程序。因为存在数据库的设计,我们的代码,我们的软件也间接的对现实世界进行了建模。除了后端应用程序,前端浏览器页面,手机APP界面,本质上也是对现实世界的一次建模,只是从前端的角度来讲,需要考虑的是我要更靠近现实世界一点,还是更靠近为为现实世界建模的数据库建模的后端应用软件一点,两者从软件的表现上,虽然不会有较大的差别,但是从开发的角度上,却是天壤之别。

程序员理应是虚拟世界的诗人,是哲学家。哲学家通过思考,对世界进行归纳,而程序员通过思考,也对世界进行归纳,片面的说,程序员面向对象的思想,决定了他在软件开发道路上的上限。程序员之所以是诗人,是因为编写代码不是自然语言,而是基于特定规则有着特定语法的语言,虽基于英文单词,但英文单词仅仅是提供了26个字母而已,当然在开发过程中对于世界进行建模时,我们通过英文单词也仅仅是为了提高代码的可读性,为了其他程序员能够更好的理解我们的想法。面向对象的思想,带来了各种各样的设计模式,代码结构随之变得干净整洁,整体结构严谨。程序员双手在键盘上敲击输入一行行代码,正如诗人提笔在纸上写下一行行诗篇。


从浏览器到服务器

当我们在手机APP上或者浏览器上打开一个页面,或者点击一个按钮,发生了哪些事情?

我们将手机APP以及浏览器当做大前端。前端的一个操作,如果是需要跟后端服务器进行交互的,前端软件受用户的委托,像具体的后端应用发起一次请求,或者询问应用服务器问题,或者指派应用服务器去做一些事情。首先,前端要知道找谁询问或者指派谁去工作,前端仅仅是一个应用软件,如果是网页,则前端就是使用的浏览器,如果是手机APP,前端则是这个APP,浏览器与手机APP本身并不具备发起请求的功能,他们都是委托给所运行的操作系统完成的,常见的也仅仅是windows、linux、unix这些操作系统,安卓、IOS、MACOS本质上也是linux和unix而已,操作系统拥有对网络世界的连接与交互功能。当我们的前端需要向某个地址,从现实世界来讲,域名是我们所能理解的地址,而对网络世界来讲,MAC地址才是他们本质上认识的标识,TCP/IP协议将MAC地址与可读性更高,存储、维护难度更小的IP地址关联起来,IP地址是面向现实世界的一次建模,DNS服务将更加靠近现实世界的域名与靠近网络世界的IP进行关联,使得普通用户只需知道域名即可,而不去关心这次请求,是发往哪台机器上。

世界通过互联网连接起来的,而互联网从一个一个局域网到整个区域或者世界的连接,本质的实现是类似的,用户的操作系统委托与网路进行交互的硬件设备—-网卡,先根据域名解析得到IP地址,再在局域网段里通过集线器向其他网卡询问IP是否在这里,没有的话,集线器将去询问路由器,路由器不管询问,只管按照IP的规则,去转发请求到下一站,如果没有,将会去网络运营商,网络运营商是网络世界的实体展现。

【未完待续】