张大胖学了Java语言,学了Web基础知识,又学了SpringBoot, MyBatis,Vue等框架, 他成了一个"全沾"程序员。
他觉得这样也挺好,前后端通吃,可以在编码的天地中自由地飞翔了。
可是他在网上、群里经常听到大家说计算机基础很重要,尤其以码农翻身为甚, 像什么:
勿以浮沙筑高台
基础不牢,地动山摇
沉下去有多深,弹起来就有多高
......
张大胖不以为然嗤之以鼻,他认为除了在面试时会用到计算机底层的基础知识,别的地方根本用不到,工作中主要是实现业务,连个稍微复杂一点儿的算法都用不到。
他决定去请教一下软件大师,问问到底是怎么回事。
张大胖:大师,我觉得现在的编程已经变得非常轻松了,利用现有的框架和类库开发软件非常容易,高中生编程都没有任何问题。
大师:你觉得为什么会这样?
张大胖:就是不用接触底层的那些细节了,直接就可以面向业务开发了。
大师:你算是说到点子上了,这就是抽象带来的好处啊。
张大胖:抽象?我似乎听说过一句话,说计算机行业的任何问题,都可以通过一个抽象层来解决。
大师:是啊,就说计算机编程语言吧,就是不断抽象,逐渐远离计算机硬件的一个过程,想当年我用汇编编程, 想在屏幕上输出一个Hello World都累得要死,写个大程序更是要累得吐血了。
张大胖:嗯,我现在用的就是最高层的Java,根本不用考虑什么汇编语言,机器语言,连指针都用不上!
大师:再比如说,Web编程,我用CGI那会儿真是痛不欲生。
张大胖:哈哈,我还是站在最高层。
大师:网络编程也是如此。
张大胖:哈哈, 我只用HTTP,根本不管底层的东西。
大师:还有对数据的操作,也是一层层地抽象。
张大胖:大师,我发现我一直是站在巅峰啊!
大师:这有什么好得瑟的,你站得越高,越容易出现难以解决的抽象泄露的问题。
张大胖:抽象的泄露?
大师:对, 这是Stack Overflow的创始人Joel Spolsky提出来的一个理论:所有重大的抽象机制在某种程度上都是有泄露的!
张大胖: 不对吧! 这种分层的抽象,好处不就是每一层都可以屏蔽下层的变化嘛,我站在高层编程,根本不用理会底层, 为什么会泄露?
大师:我来给你举几个例子,你就明白了。外国有个程序员,她使用Ruby语言通过HTTP向本地的一个消息队列发送消息, 这抽象层次很高吧! 但是每次发送消息都得耗费40ms,这是不应该的, 时间太长了。 她查来查去,发现Ruby的类库没有设置TCP_NODELAY, 但是本地的HAProxy却使用了TCP delayed acknowledgement,于是双方互相等待,出现了延时。
张大胖:我听不懂!
大师:你站在抽象的巅峰,这些TCP的细节怎么能听懂呢?我给你举个简单例子吧, 比如你用了Hibernate这个ORM工具,它是一个抽象层,隐藏了SQL, 但是当出现Hibernate性能问题的时候,你怎么办?
张大胖:那我得去看Hibernate 是怎么把对象变成SQL语句的,然后慢慢调优。
大师:对啊,你看Hibernate这个抽象层没法完美地隐藏底层的信息,发生泄露了。 SQL 也是个抽象层,隐藏了读数据库表查询处理的细节,如果SQL语句出现性能问题,你怎么办?
张大胖:那...... 我只好去分析SQL的查询计划,如何利用索引,还得慢慢调优。
大师:你看SQL这个看似完美的抽象层也泄露了不是?
张大胖:有道理,哎呀,这抽象层泄露的代价很高啊,我得学习这么多底层的东西。
大师:所以Joel Spolsky说“抽象只能节省你的工作时间,不能节省你的学习时间”, 用高层的抽象来工作,会比较快,但是你还得学习底层的东西,那是跑不掉的。
张大胖:明白明白了,为了能继续好好地搬砖,我得赶紧去学学计算机的底层基础知识了。
(完)
如需转载,请通过作者微信公众号coderising获取授权。