张大胖学习了Java语言,学习了Web的基础知识,学习了SpringBoot、MyBatis、Vue等框架。他成为了一名“全职”程序员。他觉得这样也很好,可以在coding的世界里自由飞翔了。但是,他经常在网上和群里听到有人说计算机基础很重要,尤其是程序员翻身的时候,就像:别用浮沙搭建高台,基础不牢,怎么办?地动山摇深,弹起何深?这么高……张大发不以为然,冷笑道。他想,除了面试中的计算机底层基础知识,他不会在其他地方用到。主要工作是实现业务,连稍微复杂一点的Children算法都没有用到。他决定请教软件大师,弄清楚到底是怎么回事。张胖子:师父,我觉得现在编程变得很容易了。使用现有的框架和类库开发软件非常容易。高中生编程没有问题。师:为什么会这样呢?张胖子:不用去触及底层细节,直接业务开发即可。师父:说到点子上了。这就是抽象的好处。张胖子:抽象?好像听过一句话,计算机行业的任何问题都可以通过抽象层来解决。师父:对,就说计算机编程语言,它是一个不断抽象的过程,逐渐脱离计算机硬件。当年我用的是汇编编程,累到屏幕上输出一个HelloWorld。编写大型程序更加困难。我会累得吐血的。张胖子:嗯,我现在用的是最高级别的Java,汇编语言、机器语言,甚至指针都不用考虑!师父:再比如web编程,我用CGI的时候,很痛苦。张胖子:哈哈,我还在上面呢。Guru:网络编程也是如此。张胖子:哈哈,我只用HTTP,根本不关心底层的东西。Master:还有对数据的操作,也是一层层抽象出来的。张胖子:师父,我发现我一直在最上面!师父:这有什么了不起的,站得越高,就越容易出现难以解决的抽象泄漏问题。张胖子:抽象泄露?大师:对,这是StackOverflow创始人JoelSpolsky提出的一个理论:所有主要的抽象机制都在某种程度上被泄露了!张胖子:不行!分层抽象的好处是每一层都可以屏蔽下层的变化。我在高层编程,不关心底层。为什么会漏?师父:我举几个例子,你就明白了。在国外有一个程序员。她使用Ruby语言通过HTTP将消息发送到本地消息队列。这个抽象层次很高!但是每次发送一条消息,需要40ms,不应该,时间太长了。她查看了一下,发现Ruby类库没有设置TCP_NODELAY,但是本地的HAProxy使用了TCP延迟确认,所以双方互相等待,出现了延迟。张胖子:不懂!大师:你站在抽象的巅峰,怎么能看懂这些TCP细节?让我给你一个简单的例子。例如,您使用Hibernate,一种ORM工具,它是一个抽象层,隐藏了SQL,但是当Hibernate出现性能问题时怎么办?张大发:那我得看看Hibernate是怎么把对象转成SQL语句的,然后慢慢调。大师:对,你看Hibernate的抽象层不能完美的隐藏底层信息,已经泄露了。SQL也是一个抽象层,它隐藏了读取数据库表的查询处理细节。SQL语句出现性能问题怎么办?张大发:那……我要分析SQL查询计划,索引怎么用,还是得慢慢调整。大师:你看SQL这个看似完美的抽象层也泄露了吧?张大发:有道理,哎呀,这个抽象层泄露的成本很高,要学那么多底层的东西。大师:所以JoelSpolsky说“抽象只能节省你的工作时间,不能节省你的学习时间”。抽象高了会快一些,但是底层的东西还是得学,逃不掉。.张胖子:我明白了。为了继续搬好砖头,我必须尽快学习计算机的底层基础知识。(超过)
