近来重新复习了计算机网络原理,在书中提及了一个分层思想,略有感触。
分层的目的之一是让层与层之间独立,一层变化并不会影响另一层。仅这么说,可能我们没有直观的认识,那就举个例子吧!像QQ这样的应用层软件,ISP由移动切换成电信,QQ依然可以正常使用的,QQ这个程序并不用做任何的变动,这其实就是网络层发生了改变,而应用层并不用变化;假如因为网络的变化,还要重写程序,那得多麻烦!所以分层思想很有必要。
在CPU内部的电路当中也是用到了分层思想,寄存器内部的立即数的下一个地址单元往往存储也不是具体要操作的数,而是某个地址,要操作的数存放在这个地址空间内部,因为这样当加数与被加数改变时,运算模式不用改变。而编程当中的变量概念,我猜可能就是从这里得到的启示。
假如我在程序当中想打印我的名字:
print(“zhanghe”)
这样可以,没有问题,假如这个程序有几万行,现在要把zhanghe改变成zhangjia的话,那么肯定要改好多行,很不方便,假如我们使用分层的思想,我们完全可以把zhanghe定义一个变量,要改动的时间只改动一个变量即可,如下:
NAME=‘zhanghe’ print(NAME)
大家不要小看分层的思想,由其是开发人员,下面我们来举一个实际的例子,让你看到如果没有使用分层思路会造成多大的麻烦!
某医院要连接医保中心的网络,医保中心要求各医院的IP地址要统一规划,要求医院更改主机的IP地址,问题是各个医院原本是有IP地址,不能随便改动,一旦改动客户端就连接不上数据库了,为什么这样?因为在客户端软件在开发时直接把数据库所在的主机IP写入到了客户端程序当中了,一旦数据库改变了地址,客户端就连接不上了。连上医保网络就连接不上数据库,连接上数据库就不能连接医保网络!这家医院的网络管理人员陷入了两难的境地!
好了,我们反思一下,造成这个问题原因是什么!造成这个问题的原因就是应用层和网络层混到一起了,应用层的代码里面混合了网络层的IP地址,应该将其分开的。如果再思考的稍微深一些,我认为根本原因是开发人员仅关注功能的实现,医院让开发一款客户端软件,然后开发人员就着急开发出来了,开发人员根本没有考虑到后期网络会变动,肯定也没有考虑安全性,这就造成了这个软件没有“弹性”,不能适应一个变化的网络环境。
我们不能站着说话不腰疼,我们要站在开发人员的角度去考虑这个问题,那么开发人员应该怎样做才能使这个客户端软件能够适应一个变化的网络环境呢?在程序代码要引用到IP地址是必须的,但又不能直接写IP地址,怎么办呢?我们可以在代码里面通过域名或者计算机名进行引用,而不是直接引用IP地址。当数据库主机更改了IP地址后,客户端程序可以通过DNS解析到新的数据库主机的IP地址,这样应用层和网络层就没有关联了。
哦,对了,上面这些解释都只是“马后炮”,因为你不能穿越时空,回到客户端程序开发之前,告诉开发人员不要把Ip地址写入到程序里面。医保中心的网络肯定是要加的,但让开发公司把客户端的程序再重写一遍也不太现实,那么到底这个问题应该怎么解决呢?好在现实的生活也并不是非黑即白的,还是有解决的办法的,解决办法也很简单,但是需要妥协,就是给网卡配置两个IP地址,需要连接数据库的时候就用原来那个地址,需要连接医保时再切换到医保所在的网段,这无疑给网络管理人员加大了工作量!虽然加大了网络管理人员的工作量,但这已经是相当好的解决办法了,即加入了医保网络,同时也能连接上数据库。
我认为分层思想对于IT人员的职业生涯还是影响挺大的,无论是做开发、做网管、做运维、安全都得深入理解分层思想。一个不懂分层的程序员是写不出好程序的,同样一个不懂分层的运维人员是不可能把运维工作做好的,最要命的是一个不懂分层思想的IT安全从业者,呃……,不敢想像,我认为安全问题的根源之一就是分层思想。
好处多多,就从一个学习角度来说吧!我们既然知道了IT行业是分层的,程序员工作在应用层,网络工程师和运维人员工作在网络层,通信工程师和硬件工程师在工作物理层和链路层,假如我们我们把这几层都学好了,那就是集开发、运维、网络、硬件、通信与一体的高级复合型人才,都说AI将来可能会威胁到很多人工作,我觉得肯定不会威胁到这样的复合型人才,因为这样的人才是具有上帝视角的,是人工智能缔造者,毕竟人工智能里面程序也是由程序员写的,没有网络、硬件这些东西人工智能也只是一个“傻瓜”而已。
原文:https://www.cnblogs.com/yizhangheka/p/11033606.html