原文链接:On The Value Of Fundamentals In Software Development

我坚信基础知识的价值,但有时似乎只有我持此观点。我坚定地认为,要在软件开发(以及其他所有领域)达到真正精通和专业水平,关键在于牢固掌握基础知识——牢固到运用时无需刻意思考的程度。然而每当我提出这个观点时,发现自己总是少数派。要知道,我们软件开发者自视为问题解决者。我们并不需要深入理解和掌握所有知识(况且日常接触的技术如此庞杂,这根本不可能实现)。只要知道某个技术存在,我们总能通过推断、查阅资料和实践来掌握使用它所需的一切。这种态度本身无可厚非,但我认为将其应用于基础知识领域是错误的——让我始终感到诧异的是,似乎很多人都不赞同这一点。在深入探讨之前,我们先来明确什么是基础知识。

何为基础知识

几年前在一次面试中,我被问到这样一个问题:请解释在 Hibernate 框架下乐观锁的工作原理。当时我虽接触过 Hibernate,但远非专家,因此大脑一片空白。这实在是我的重大失误——因为乐观锁本质上并非 Hibernate 特有的概念,而是并发控制的基础理论。我本应能流畅阐述乐观锁的通用原理,这样就能涵盖其在 Hibernate 中九成的实现机制。

我是这样看待这个问题的:基础概念可分为宏观和微观两个层面。在宏观层面(即从整体视角审视软件开发),存在一些无论你从事何种工作或身处哪个领域都适用的概念、算法和知识体系。我们谈论的是诸如数组、哈希表、树结构、排序算法、搜索技术、部分图论算法、缓存机制、特定面向对象概念,甚至包括延迟加载与乐观锁等技术。虽然还有其他类似概念,但令人惊讶的是核心要素并不算多。你需要对这些知识达到倒背如流的掌握程度——包括它们在小规模与海量数据集上的应用影响、适用场景、局限性及其突破方法。在未来的职业生涯中,你将日复一日地与这些概念打交道;毫无疑问,你理应竭尽全力去深入理解它们。然而现实中,多数人仅停留在应用层面认知,其理解深度自大学毕业后就几乎停滞不前。

在微观层面(即考察特定技术、语言或库时),你需要完全内化 API 细节、工具特性及使用技巧才能实现真正的高效。初学 Ruby 时,我阅读了大量书籍和博客,接触了各种技巧、工具和 gem 包。这些是否显著提升了我的代码质量或编码速度?其实不然,至少除了持续使用带来的自然进步外,并无明显改善。直到某次我花了几小时深入研究 Array 类的 API——虽然已经忘了具体原因——却突然发现自己编码速度变快,并能长时间保持心流状态。因为不再需要频繁查阅 Array 类的用法,这种改变带来的效率提升令我惊讶(但细想我们操作数组的频率,其实也不足为奇)。若有人刚接触 Ruby,你知道我会给出什么建议吗? 数组、哈希、字符串和文件——请尽快熟记它们的 API,你会立刻发现自己的水平远超大多数 Ruby 程序员。这是微观层面的基本功。

扎实的理解

完全内化某个事物意味着什么?以武术为例。你可以买几本书全部读完,可以请人展示所有招式,甚至还能尝试练习几次。但这能让你成为武术大师吗?远远不够。要达到那个境界,你需要持续练习,直到形成肌肉记忆,让招式成为你的第二本能。这时你才真正内化了这些技能。更重要的是,你并非一开始就花大量时间练习复杂组合动作,而是专注于基础训练——复杂动作正是由基础动作构成的。当基础动作扎实掌握后,只需稍加练习就能将简单动作组合成复杂招式(若我对武术的阐述过于简化,谨向真正的武术家致歉)。

然而在软件领域,我们大多数人都像那个追星族的业余武术爱好者。我们浅尝辄止地学点 Ruby,再啃些 JavaScript,转而涉猎 C#,回头又尝鲜 Rails,待回到 Java 领域时,只摄取刚够应付的 Spring 框架知识,对 Hibernate 的掌握也仅够在简历上充作技能点缀。我们在技术栈之间不断跳跃,渴望通晓所有前沿(以免落后于时代),但自始至终,或许专注打磨"基础招式"才是更明智的选择。无论掌握多少面向对象语言,若对耦合性、内聚性、抽象化这些概念一知半解,你写出的代码在任何语言中都同样糟糕;无论用过多少控制反转容器,若不明白依赖注入要解决的根本问题,你终究只是盲目跟风、随时可能坠入悬崖的羊群中的一员(没错,羊群确实会这样盲目跟随)。

真正理解某事物与仅学够应付(即具备实用知识)之间存在差异。对于日常使用的大多数技术,通常只需掌握实用知识即可;毕竟没必要对接触的数百种库和技术都深入理解。但之所以可以这样,是因为我们默认你已经牢固掌握了这些技术所依赖的基本原则。如果你理解延迟加载或乐观锁的工作原理,就不必深究 Hibernate 或 ActiveRecord 的具体实现。如果你精通 MVC 框架,那么使用 Struts 还是 Rails 并无区别,那只是实现细节而已。基本上,一个很好的经验法则是:概念越基础,你对它的掌握就应该越扎实。这就像建造坚固的房屋必须打好地基一样。

我常觉得,掌握扎实基础的通才几乎总能被视作专家。你有没有曾经见过有人坐到键盘前,连续编程 10 分钟、15 分钟甚至 20 分钟,全程无需查阅任何资料?这场景令人惊叹不是吗?他们能在极短时间内产出大量实用代码,离开时人们总会低声赞叹"天才"。但这与天赋无关,不过是有人在特定领域潜心钻研了微观基础——剩下的唯手熟尔。你同样可以做到:先夯实宏观与微观基础,之后便是策略性练习,不过这都是后话。于我而言,这一切都顺理成章。原以为众人都会认同这个道理,却总发现有人对此持有异议——实在令人费解:)