什么是基础知识?
共 2537字,需浏览 6分钟
·
2021-11-27 02:21
译自:https://skorks.com/2010/04/on-the-value-of-fundamentals-in-software-development/
译者:cxuan
我相信基本面的价值,但有时似乎只有我一个人相信。
我认为在软件开发或者说其他方面真正掌握专业知识做到触类旁通的关键在于基础知识,而只有牢牢掌握这些基础知识,才能让你在应用开发时不加思考就知道该怎么做。然而,每当我提出这些想法的时候,我总是发现我才是那个局外人。
我们软件开发人员总是想把自己当做问题的解决者。我们真的不需要对任何事情有足够深入的了解和理解,只要我们认为某个功能甚至某项技术能够完成需求,我们就可以随时推断、查找它从而达到让我们使用的目的。
这个态度是非常正确的,但是对基础知识来说却是错误的方式,这也是很多人反对我的缘由,所以在继续讨论之前,我们先定义一下什么事基础知识。
基本面:股票中一般会用基本面来表示一个行业的基本情况,在这里可以理解为基础知识层面。
什么是基础知识
几年前,我在一次面试中被问到这个问题,请你解释一下 Hibernate 中的乐观锁的工作机制,此时我对 Hibernate 的研究甚少,更别说是专家了,所以我画了一个大大的圈。
我这次面试彻彻底底的失败了,我觉得很羞愧,因为乐观锁并不是 Hibernate 所特有的概念,它只是一个基本的并发控制概念。
我认为基本面大体上可以分为宏观层面和微观层面。
在宏观层面上(即从整体上来看)无论你从事的是何种类型的工作和领域,都有使用的概念、算法和知识。比如数组(Arrays)、哈希(Hashes)、树(Trees)、排序(Sorting)、查询(Searching)和图算法(Graph algorithms)、缓存(Caching)、某些面向对象的概念、懒加载和乐观锁之类的东西,还有一些其他的。你需要向后来理解这些概念,在小型和大型数据集上使用它们、它们适用的常见问题、局限性以及如何克服等。在你的职业生涯中,你将每天都会和这些打交道,所以,你更应该尽可能深入的理解。但是事实情况是,大部分人充其量只有工作知识,自从大学以来一直保持相同的水平。
在微观层面(包括特定的技术、语言和 API 库)上,你必须内化 API 细节、工具才能真正有效。当我开始学习 Ruby 时,我阅读了各种书籍、博客文章,同时我发现了各种技术和工具,但是它们是否对我的代码质量或者我的编码速度产生了重大影响?
我认为不是的,至少你不会注意到,它超出了你所希望的改进。然后又一次,我花了几个小时仔细研究 Array 类的 API,我想不起来这么做的原因是什么了,但是我明显的感觉自己编码速度更快了,而且能够持续心流很久很久。
然后,我就不用再花太多时间在查找 Array 类及有关东西上了。我真的很惊讶产生了这么大的差异,所以你知道我对开始学习 Ruby 的人有什么建议吗?数组、哈希、字符串和文件这些 API 你要尽快记住,这样你能够马上领先其他 Ruby 程序员。这是微观上的基本面。
真正理解
将某件事情完全内化是什么意思呢?我们以武术为例,你可以找一本武术书,把它们都读一遍。你可以让某个师傅向你展示所有动作,甚至你可以尝试一些其中的动作,但是这会让你成为一名武术专家吗?
你需要练习,一遍又一遍的练习,练习到这些基本动作能够形成你的肌肉记忆,你的条件反射,对此你可以说内化了它们。
更重要的是,你不用花很多时间练习复杂的组合。你要多花时间在基本动作上,因为复杂动作都是由基本动作构成的。如果你把动作做扎实,那么你就可以通过简单的组合来完成更复杂的动作(如果我过于简化了任何东西,我向真正的武术家道歉)。
然而,在软件方面,我们大多数人就像那个狂热的武术家,我们啃掉了一点 Ruby,又啃了一点 JavaScript,然后转到 C# 并回来尝尝 Rails。最后,回到 Java 领域,我们吸收了刚好够用的 Spring 和我们需要的 Hibernate 将其列为简历中的一项技能。
我们从一个技术跳到另一个技术,想了解一切并意识到一切(让我们不会落后主流技术),但一直以来,我们可能都没有练好我们的基础动作。
不管你知道多少种面向对象的编程语言,如果你确定耦合、内聚意味着什么,不管你的代码怎么写可能都同样糟糕。不管你用过多少种控制反转容器,如果你不知道依赖注入试图解决什么问题,那么你只是一只准备跟随领导者跳下悬崖的羊(真是真的,羊真的会这么做)。
真正理解某件事情与学习它足够应付工作之间是有根本区别的。
通常日常工作你只需要了解工作的相关知识就可以了,根本不需要了解你处理过很多库的技术细节。之所以你工作没问题,是你对这些技术的基本原则有一定的认识。
如果你了解懒加载或乐观锁的实现原理,你就无需了解 Hibernate 或 ActiveRecord 实现的细节。如果你不懂 MVC,那么无论你使用 Structs 还是 Rails 都没有区别,这只是一个实现细节问题。一个好的经验就是,你得基础越扎实,你建的房子就越稳固。
有时我认为,一个基本面扎实的人才能成为技术专家。你有没有见过走到电脑前,编码 10、15、20 分钟没有停下来,不用参考任何东西?这样的人是不是令人印象深刻?他们似乎在很短的时间内产生了惊人的代码数量,
当他们离开时,人们可能会认为他是个天才,其实这里并没有什么天才,只是有人愿意花时间学习特定领域的基础知识,并且不断练习罢了。
你可以做同样的事情,把你的宏观和微观层面的基本面打扎实。对我来说,这一切都很有意义。我原以为这对其他人也同样有意义,但我经常发现人们在这一点上不同意我的观点——这真的很令人费解 :)。
完
PS::) 这个表情我今天才知道是什么意思。
不过作者写这篇文章的时候是 10 年,那时候作者已经使用了这个表情。
然后我发现才最近我们流行起来了这个表情,这说明了什么?