今天聊天聊起了编程的时候底层与上层的问题。对计算机系统甚至是整个人类社会来看,分层可以说都是一种最最基本的架构。越底层的模块,解决越纠结越核心的问题。然后上层调底层的接口去实现一些相对负责的功能。通过这种逐层封装的方式。我们用三极管实现了现在这个炫酷的信息时代。
对现在浮躁的软件行业来说。程序员在编码的时候,都是能用上层接口就用上层接口,甚至是上层接口无法提供想要的功能的时候去找三方库,为了提高效率,这也是正常的。但是,对一个真正的程序员来说,其实是很有必要去尽量了解底层的。
了解底层最直接的好处,就是你可以实现上层接口没有提供的功能。就拿我做的苹果软件开发来说。绝大部分的功能你是可以调用 UI层,NS层来实现的,但是有一些特殊需求呢,比如涉及到复杂的绘图问题时,你必须得调用coreGraphics库自己去实现。而coreGraphics 就是相对与UI层来说的一个底层,他提供了UI层所需要的绘图功能。更进一步来说呢 coreGraphics 库最终肯定是调openGL 来实现的。涉及到更高端的功能时,比如你需要对一个图形做到像素级别的控制的时候,coreGrphics也无法提供这样的功能了,你必须得去调openGL
函数去做。这就是更底层。这也是为什么网上那些牛逼哄哄的动画效果都是直接用openGL去做的。之前看的一个水波纹效果的动画,几百行代码而已,炫酷到爆,不懂openGL的人根本做不出来,这就是程序员的内功啊。
再比如计算机网络,HTTP,调 tcp 实现,如果你懂TCP,那么你就可以在特定的时候,不用web的方式,自己用TCP去设计实现一个更符合当前业务逻辑,性能更高的网络架构。再进一步,如果你懂IP层,那么你甚至可以连TCP都不用了,自己设计传输控制协议。
越懂底层越能实现高效或者牛逼的功能,想起来,当年听说的某某游戏公司服务器端,调用最频繁的模块直接用汇编写,甚至特定的计算逻辑单元直接做成硬件。
可能现在好多人觉得调上层接口就能实现的功能,干嘛去学习底层呢。这就是之前为什么网上说JAVA .NET 程序员是伪程序员,因为这些系统封装的太好了,功能太强大了,以至于程序员不用懂太多东西就可以做出程序来。只知道HTTP,不知道TCP,UDP 的人应该很多吧。就是这样不思进取的人多了,所以拉低了整个JAVA,.net 程序员界的水平,也给了C语言界鄙视他们的理由吧。但实际上真正读懂了.net 运行时,摸清了整个 famework架构的人那照样是大牛啊。JAVA更不用说了,struts
hibernate Spring,牛逼的三大框架,如果一个人能说出这三个框架是怎么设计实现的,你能说他不牛逼?,从语言本身去看,如此优美的一个语言,从编译原理级别读懂这个语言的人估计都得成艺术家了。越是从底层去看一个系统的设计实现方式,越是眼界开阔心胸舒展。
跟几个哥们聊到了,什么时候该学底层呢,我觉得,作为一个程序员,作为一个有志于摆脱伪程序员身份的人,应该是有空的时候就去看底层知识,而不是说用到的时候才去看。有时候,看起来调个接口就能实现的功能,如果你能懂这个接口的实现原理的话,好处也是多多的。而且,如果你一直用不到,一直不去学,水平也就一直不会提高。
我在想,如果我是面试官,去面一个ios程序员的话,我会怎么跟他聊。你知道委托吗,那你知道委托的实现原理吗。你知道通知吗,那你知道通知的实现原理吗。如果让你在一个没有通知的功能的系统中实现同样的功能,你会怎么做。你知道block吗,那你知道系统对block在编译之前做了哪些处理吗。OC里面的类,在预处理之后变成了什么样?C语言中没有类,OC从C语言扩展而来,它是如何实现 类的功能。突然想起了很早之前找工作的时候,那个硬件出身的哥们跟我讲Linux底层原理,讲Linux程序编译过程,讲makefile文件的作用,突然感觉好惆怅。