在上一篇文章中,我思考了套路对个人成长的意义和两个我认为对总结套路有价值的方法。在写作过程中我突然发现编程的世界充满套路,如果你沿着这样的思维去学习编程,或许会理顺你的思路,加速你的学习过程。谨以此文分享给有兴趣的朋友。
函数是最小的套路
学过编程的朋友都知道函数的概念。那为什么要函数呢?就是因为这部分的功能需要经常使用,那干脆就写成一个函数把这部分的功能统一起来让整个程序使用。这样就不需要每次使用这个功能的时候,再从头编写代码了。
比如c语言中最基本的输出函数printf。如果没有这个函数,那所有人都需要点用系统调用syscall来和操作系统打交道才能在屏幕上输出字符。这么一说,你会不会觉得很懵?什么操作系统?什么系统调用?这都是啥?然后我告诉你一个更郁闷的事情。那就是在不同的操作系统上,系统调用会不同,参数传递也会不同。也就是说原本printf这么一个简单的函数,需要手动写的话需要在每个不同的操作系统上都实现一遍。当然现在这个步骤都已经由前人总结好了套路,你直接使用就可以了。
为了让大家有直观的印象,我把使用了printf这个套路,和不使用printf这个套路的代码贴出来,让大家自行感受。
使用printf函数的例子
printf直接调用系统调用的样子
syscall这就是函数作为程序中最小套路的例子。
库是高层次的套路
有了函数还不够,之后又产生了库的概念。比如说网络的库,文件读写的库,json处理的库等等等。因为实际使用过程中并不满足于某些简单的功能,比如字符输出,更希望能够直接映射到实际的工作甚至是现实世界中。
这里举个计算机网络编程的栗子。对计算机网络有一定了解的朋友可能听说过计算机网络的五层模型(从这点看,计算机网络是彻底的小套路到大套路。)。简单来讲,当我们访问一个网页的时候大致要经过这么几层的网络协议:http, tcp,ip。也就是我们从浏览器上输入http开头的一个网址,要经过好几层的网络转换才能让我们真正获得一个页面,而最终显示在屏幕上。
networkinternal_1_1.JPG再回到刚才的情形,如果每个程序员都需要从ip层编写网络应用,那估计我们现在都没有淘宝用,更吃不到各种外卖了。之所以现在有这么丰富的互联网应用,得益于现在有各种网络协议的库。所以程序员只需要专注在http层,按照协议制作出http的报文,扔给库函数,就可以得到反馈了。不需要关心报文如何发送,如何与下层协议交互,更不需要了解转过了多少路由器,是通过哪个运营商,哪个数据中心,最后就能获得结果。一切变得如此轻松~
当你再凑近一些去看,有意思的是某个库可能是另一个库的依赖。比如处理json的库为了处理json文件,就会依赖文件读写的库而不是自己重新编写文件读写部分的函数。你看,这个是不是可以看作是一层层套路往上叠加?设计良好的底层架构,能够让人从复杂的底层事务上脱离出来,从而有更多精力去实现更有价值的应用?
我想,这种层层嵌套,各自发展,小套路到大套路的发展模式,对计算机产业蓬勃发展的有着不可磨灭的作用。
不同语言框架体现了不同的套路思维
我们再往深层次看,一种编程语言或者一种框架体现了一种套路的思维。
如果对某些语言有一定的理解,大家或许听说,js是用来写网页的,python用来处理大数据的,c用来写操作系统的,java用来写后端的。
当然这些分类不是完全准确的,只是大家在业界有基本的这么一个共识。而为什么会形成这样的一个现状,个人分析的原因是每种语言抽象的套路不同。比如虽然用c语言也可以写服务器,处理json,但是很少人会这么做。是因为c语言在这些层次上的套路没有,或者没有别的语言好用。如果偏要这么做,就得从头写起,显然就比使用现成的套路要麻烦和耗时。
另外不同的框架使用的套路也体现了不同抽象思维角度和层次。
比如最近我在上新大的js入门,其中徐高阳老师就比较了jquery和vue两个js库的使用和理念。而vue之所以现在这么流行这么好用,是因为jquery依然使用旧有的dom方式抽象页面,而vue直接将页面的元素绑定在了一个对象上,而后者更适合于人的直觉思维。这种抽象层次上角度上的不同导致最终形式的不同非常值得玩味。感觉已经和最近流行的认知差距,降维打击有共通之处了。
一不小心把代码读出了哲学的味道。
对大家有什么帮助
计算机程序是我认为最为严谨的套路集合,更是人类思维方式的结晶。因为机器没法说谎,其运行结果必然是程序严格执行的产物。
那说了这么多,对大家有什么帮助呢?尤其是对学习编程的朋友有什么帮助呢?
从套路层次的角度去学习
每个人的大脑容量是有限的,处理事务,接收新知识的能力也是有限的。我在怎样保持你的鸡血状态一文中也提到了,当我们遇到比较庞大的事务时,容易觉得超出了自己的能力范围而把自己吓跑。这点倒是和计算机运行有点类似,程序如果需要太多内存就会导致死机。那我提出的解决方法就是,不断拆分。把复杂的,庞大的问题拆解成小的能够处理的问题。
那转换到计算机编程学习,既然我们知道了函数,库,甚至是语言是不同层次上的套路抽象,那么我们在学习的时候,就可以顺着这些套路的抽象层次去学习,而不是一锅端。
比如我们学习json文件处理,那么就可以简单得把问题拆解成
- 文件读写
- json格式处理
文件读写是一个学习内容,格式处理是另一个内容。当两者都学习完了,合成一起则是一个完整的内容。这么讲大家可能觉得太简单了,我不说都会这么做。那我点出一个有些同学容易忽略的问题。
比如在文件读写中,很多人会同时去学习文件目录结构。原本文件读写学习,主要内容应该关注在如何读或者写指定文件的内容。可能是因为第一次在程序中认识到“指定文件”这个概念,比如上一层目录,上上一层目录,根目录,用户根目录,这些如何在代码中表示。对有经验的系统使用者,这些也不是问题。但是对一直使用图形界面,刚开始使用命令行使用程序操作文件的同学,这些概念可能就是陌生的。如果能够意识到“文件目录结构”和“文件读写函数使用”是两个不同的概念,那就可以使用我说的分解套路层次去逐个击破,而不是让自己陷在两个新概念同时学习但无法理解的情形中。
多插一句,这种思维在程序设计和调试中处处存在
好了,我这次的套路讲完了,希望大家能够掌握分层的套路,快速跨过初期的困惑,进而享受编程过程带来的思维乐趣。
网友评论