底层与上层

今天聊天聊起了编程的时候底层与上层的问题。对计算机系统甚至是整个人类社会来看,分层可以说都是一种最最基本的架构。越底层的模块,解决越纠结越核心的问题。然后上层调底层的接口去实现一些相对负责的功能。通过这种逐层封装的方式。我们用三极管实现了现在这个炫酷的信息时代。

对现在浮躁的软件行业来说。程序员在编码的时候,都是能用上层接口就用上层接口,甚至是上层接口无法提供想要的功能的时候去找三方库,为了提高效率,这也是正常的。但是,对一个真正的程序员来说,其实是很有必要去尽量了解底层的。

了解底层最直接的好处,就是你可以实现上层接口没有提供的功能。就拿我做的苹果软件开发来说。绝大部分的功能你是可以调用 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文件的作用,突然感觉好惆怅。



时间: 2024-10-21 09:13:53

底层与上层的相关文章

Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整(原理:底层SurfaceView+上层绘制ImageView)

Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整实现(原理:底层SurfaceView+上层绘制ImageView) 分类: Android开发 Android UI2013-05-23 15:04 1600人阅读 评论(1) 收藏 举报 目录(?)[+] http://blog.csdn.net/yanzi1225627/article/details/8580034 最近一直在审视以前做过的东西,关于android摄像头预览,预览界面上呈现矩形框,在

MTK andorid从底层到上层添加驱动

1 [编写linux驱动程序] 1.1 一.编写驱动核心程序 1.2 二.配置Kconfig 1.3 三.配置Makefile 1.4 四.配置系统的autoconfig 1.5 五.编译 2 [编写hal模块] 2.1 一.新建xxx.h文件 2.2 二.新建xxx.c文件  2.2.1 1.包含相关头文件和定义相关结构 2.2.2 2.定义hello_device_open函数 2.2.3 3.定义自定义的api函数 2.3 三.在hello目录下新建Android.mk文件 2.4 四.编

为什么很多人不喜欢出身底层的人

转自天涯问答 http://wenda.tianya.cn/jinghua/19hkleudaaeaeil4s5isghle4gee23h8t4j4f 著名学者史莱克曾经有一句名言:洋葱是分层次的,怪物也一样. 不管你承认不承认,尽管从政治正确的角度来说,人性共通,但是人跟人是不一样的,底层和上层是不一样的. 可以说没有人真心喜欢出身底层,包括为底层辩护的人.出身底层,是有原罪的,底层的生活,常常不是生活,而是直面生存这个课题,所以身为底层,容易突破下限,容易不讲规则,这就是一楼 @茶小花 引用

华为C语言编程规范

DKBA华为技术有限公司内部技术规范DKBA 2826-2011.5C语言编程规范2011年5月9日发布 2011年5月9日实施华为技术有限公司Huawei Technologies Co., Ltd.版权所有 侵权必究All rights reserved密级:confidentiality levelDKBA 2826-2011.52011-06-02 华为机密,未经许可不得扩散 Huawei Confidential 第2页,共61页Page 2 , Total61修订声明Revision

手游帧同步的研究

网络游戏的同步可以做的很简单,也可以做的很复杂.简单来说就是通过Http或者Socket来跟服务器同步数据.而如果往复杂了说,可以有p2p.帧同步.航位预测等等高级课题可以研究. 因为我们的项目需求----几百个独立单位的实时同步(带pvp的rts),所以研究了下帧同步.不过后来发现它其实有很多问题,所以具体如何还要看其他同事的研究成果.以我个人来说,修改游戏方案反而是最合理的解决方案. 首先从需求上来说,几百个独立单位的作战,本身结果和士兵强弱从策划的角度来看就是不可控制的.玩家更加不可控制.

【转】mvc

又看到有人在问三层架构和MVC的关系,感觉这种问题有点教条化了.因为它们都在逻辑上将应用程序划为三块,凑了一个数字3,就有人非要把它们联系到一起了. 这两个东西我接触有几年了,有一点体会,表达一下: 三层是三层,MVC是MVC,它们毫无关系的. 三层是从整个应用程序架构的角度来分的三层(如果程序需要,还可以分多层). 三层是为了解决整个应用程序中各个业务操作过程中不同阶段的代码封装的问题,为了使程序员更加专注的处理某阶段的业务逻辑. 比如将数据库操作代码封装到一层中,提供一些方法根据参数直接返回

云计算课的笔记1

从底层到上层包括 IaaS,PaaS,SaaS. IaaS(Infrastructure as a Service),即基础设施即服务,计算机资源.如阿里云的服务器,可以动态调整计算机资源,还有openstack PaaS (Platform-as-a-Service) ,平台即服务,这个范围很广,可以用中间件作为代表,如web容器(tomcat),消息中间件(AMQ) SaaS(Software as a Service),软件即服务,上层业务相关的应用 openstack:OpenStack

为何计算机人应该懂一点编译知识?

2009年冬,本科计算机<编译原理>课程结业考试结果公布,虽然取得了不错的考试成绩,可是自己除了熟练掌握了那些艰涩难懂的文法分析算法之外,对编译器的工作原理仍然貌似“一无所知”.这让我下定决心在本科毕业设计时,选定了<自定义语言编译器的设计与实现>这个题目,从此与编译领域结下了不解之缘.2012年读研期间,在之前实现的编译器的基础上继而实现了汇编器和静态链接器,并添加了编译优化器.2013年着手启动<自己动手构造编译系统>书稿的撰写,历经两年终于完稿.2016年8月,&

IMS Modify Call (2) receive request 收到视频升级请求

主要内容为MT收到视频升级的请求的过程,也是MT消息上传的过程. 流程图 可以看到信息上报跨了4个模块,没有经过service/Telecom 看关键log方便跟踪 06-19 19:05:41.437 3329-4362/com.android.phone V/ImsSenderRxr: Read packet: 24 bytes 06-19 19:05:41.437 3329-4362/com.android.phone V/ImsSenderRxr: processResponse[SUB