分层的概念——认知的基石
分层的概念举例
客户端的UI编程。一般情况下,我们对于UI编程的认知是建立在与「View」相关的各个概念之上的。View是什么呢?可以认为它是一块矩形的区域,具有位置和大小,能够渲染出内容,可以和用户交互。只要理解了View这一层次,我们就知道如何用它来组装出各种页面,我们平常大部分的客户端编程工作便能胜任了。单以渲染绘制方面来说,我们可以自定义绘制的内容,可以绘制出矩形、圆形,也可以绘制出任意图片。但如果再往下深入到「OpenGL ES」的概念层次,那么就能理解所有形状其实都由三角形组成的(包括圆形也是三角形拼成的),一个形状和纹理是怎么绘制出来的,少数的几个顶点是怎么对应到那么多个像素点上去的,这中间是怎样的一种插值的过程。如果我们想实现一些稍微复杂的功能,比如滤镜(需要执行像素级的操作),就很有可能需要在「OpenGL ES」这个层面上去理解各个概念。
网络通信。以HTTP通信为例,如果我们的认识只是局限在一些具体的API层次,不管它是系统本身提供的(比如Java的HttpURLConnection,或者iOS的NSURLConnection),还是第三方库提供的(比如HttpClient, OkHttp, Android-Volley等),那么我们虽然也有可能在某些情况下写出能运行的代码,但是使用不同编程环境的人之间(比如前后端之间)就基本没法交流,因为具体的API都有所差异。为了能互相听懂对方的话,我们必须要到HTTP协议的层次去交谈,这样,我们才能分清什么是Method,什么是参数,什么是Header,什么是Body,各部分的格式是怎样的,缓存策略以及Cookie这些概念和HTTP Header有什么关系,等等。更进一步,如果我们涉及到要做一些更底层的工作,比如网络性能优化,或者协议处理,我们就必须理解到TCP这一层,理解HTTP和TCP是怎样的关系,一个HTTP请求或响应怎样被封装进TCP包,多个HTTP请求如何共用一条TCP连接,等等这些问题。
Web框架。后端在实现一个Web Server的时候,经常基于一些成熟的MVC框架,就类似Spring这样的。这种MVC框架所提供的功能,就组成了一个概念层次。我们知道,在这个层次上,我们只需要写一个小小的Java Annotation,就能够按照我们精确定义的规则来实现Request Mapping;我们在处理方法最后返回的Java对象,也会被转成正确的格式(一般是JSON)输出到网络上去;配置一个拦截器就能够进行某种通用的处理。但是,有时候我们也需要深入到下一个层次,Servlet规范的层次,去了解框架的所有这些功能是怎样在Servlet的基础上构建出来的。只有这样,当我们碰到一些难解的疑难杂症,或者想对框架进行扩展的时候,才知道从哪里下手。
响应式编程。当我们使用Rx系列的架构来构建我们的代码时,在这一层次上,我们可以执行各种变换,灵活地切换线程,流式地处理事件和逻辑。但如果要理解这背后到底发生了什么,我们必须要深入一层,把这些抽象的东西构建在我们已经熟知的基本概念之上,这些基本概念包括:多线程、同步原语、事件队列,以及一些基本的异步逻辑。
机器学习。利用机器学习,我们至少能解决两个大类的问题:分类(Classification)和回归(Regression)。为了解决这些问题,机器学习就像一个工具箱,为我们提供了很多现成的的算法框架,比如:LR, 决策树,随机森林,Gradient boosting等等,还有近两年大热的深度学习的各种算法,但要想做到深入的话呢,只是会使用这些现成的算法库还不够,还需要在底层的数学原理上有所把握。比如,研究优化理论,才能够有更好的思路去设计和优化目标函数;研究统计学,才能够理解机器学习本质的由来,理解为什么机器学习的方法能够使得模型一步步地逼近真实的数据分布;研究线性代数,才能够更灵活地使用矩阵这一数学工具,提高了性能且表达简洁,才能够更好地理解机器学习中涉及到的维数灾难及降维问题;研究信息论,才能够准确地度量不同概率分布之间的差异。
计算机图形学。如果要做2D的图像处理,基本上能理解OpenGL的规范和Shader程序的语法就差不多能进行开发工作了。但如果要做3D的图像处理,则需要理解3D的坐标变换(model, view, projection),尤其是投影变换。这个层次的知识超出了OpenGL的范畴,本质上是线性代数中的线性变换。
必要性。有些时候,当我们接触一个新的知识领域时,有大量的概念需要理解。如果我们想理解上层的概念,那么必须先理解下层的概念,一层层推下去,直到我们到达了一层我们已经熟知的概念为止。这时候,我们才能理解整个体系。
更深刻的理解。几乎所有情况下,理解了下层的概念,上层的概念也变得更加清晰。试想一下,分别站在四个不同的层面来看系统:JDK,JVM,POSIX规范,Kernel,看到的东西自然相差甚远。很多情况下,受限于时间和精力,我们没有机会去一窥各个层次的究竟,但我们也不应该忘了在研究方法中这种层层深入的可能性。
更清晰的知识结构。如果我们头脑中对于某个知识领域的认识,只有一系列杂乱的概念,且它们来自各个不同的层次,那么我们的知识就是支离破碎的。在这样一个支离破碎的基础上,我们是没法进行正常的逻辑思考的。
概念的层次与Spec的关系
自底向上还是自顶向下
自底向上,知识的根基会打得更深。但缺点是费时费力,目的性不明确。
自顶向下,优点是目的性强。缺点是获得的知识可能不够系统。
其它精选文章:
技术的正宗与野路子
知识的三个层次
朋友,你的时间够用吗?
三个字节的历险
那些让人睡不着觉的bug
捍卫技术的尊严
技术攻关:从零到精通
马拉松式学习与技术人员的成长性
蓄力十年,做一个成就
扫码或长按关注微信公众号:张铁蕾。
有时候写点技术干货,有时候写点有趣的文章。
这个公众号有点科幻。