编程核心:组织力胜过算法魔法

技术本身并不是最重要的,关键是你能否用它来实现你的想法。

组织能力比算法技巧更重要 我看过很多关于大公司技术面试的博客文章,这让我觉得自己很幸运,因为我不是在找工作。那些面试要求你当场写出一些复杂的数据结构,比如堆和树的变种,或者解决一些有严格限制的难题。有些数学问题,如果你不能巧妙地分析和重新表述,可能需要一百亿年才能算出来。我的第一反应是:哇,他们是怎么招到人的?

我的第二个反应是:其实大部分编程工作根本不需要这种高深的算法技巧

说到写代码,最重要的技能其实是如何让一堆功能不至于因为太复杂而崩溃。我做过很多项目,比如大型电信系统、游戏机游戏、博客软件,还有一些个人小工具。在这些项目中,很少会遇到那种特别复杂的数据结构或算法问题。但总是有很多状态需要跟踪,很多值需要重新排列,还有很多特殊情况要处理。你得仔细研究系统的各个部分是怎么相互作用的。

总的来说,写代码更像是一种组织工作。你要不断重构代码,简化它,想办法去掉那些不必要的操作。

这也是为什么有很多人“偶然”成为了程序员。你不会看到有人在业余时间随便就变成了神经外科医生——因为那需要专门且密集的训练。但很多人通过自学掌握了足够的编程技能,能够自己做出一些东西。当年我在一台8位家用电脑上学习编程时,我甚至不知道“算法”是什么。我也不知道怎么对数据进行排序,不过幸运的是,我做的小游戏不需要这些知识。我写的代码主要是关于计时器、计数器和状态管理的。我更像是一个组织者,而不是什么天才。

几年前,我开发了一个小工具,用来把图片组合成矩形纹理。这个程序不大,大概只有1500行代码,用的是Erlang和C语言。其中有一个20行的小片段是用来做矩形打包的,虽然写起来不难,但我怀疑如果让我在面试中写出来,我可能做不到。其余的代码主要是用来加载文件、生成输出、处理图片属性(比如原点),以及处理程序不同部分之间的数据流。每当我需要新功能、更好的错误处理或者改进用户体验时,我都会去调整这些代码。

这其实代表了大多数软件开发的情况。

写代码更多是关于如何组织和管理,而不是搞什么高深的算法魔法。

组织能力 简单来说,就是把事情安排得井井有条的能力。在编程中,组织能力指的是你如何设计和管理代码,让它清晰、易读、易维护,而不是一团乱麻。具体来说,它包括以下几个方面:

  1. 代码结构清晰:把代码分成合理的模块或函数,每个部分只负责一件事,避免把所有功能都堆在一起。
  2. 状态管理:跟踪和管理程序中的各种状态(比如变量、数据流),确保它们不会混乱或出错。
  3. 处理复杂性:当程序功能越来越多时,如何让代码不至于变得太复杂,避免“牵一发而动全身”。
  4. 重构与简化:不断优化代码,去掉重复的部分,简化逻辑,让它更容易理解和修改。
  5. 协调系统各部分:确保程序的不同部分能够很好地协同工作,数据能正确流动,功能之间不会互相干扰。
举个例子:假设你写了一个小游戏,里面有计时器、分数计算、角色移动等功能。组织能力强的程序员会把这些功能分开写,比如一个函数专门处理计时器,另一个函数处理分数计算,然后再把它们合理地组合在一起。这样,当你需要修改某个功能时,不会影响到其他部分。

组织能力不仅仅是分而治之,它还包括如何设计系统结构、管理代码、协调模块、处理复杂性等。分而治之是组织能力中的一种工具或方法,但组织能力更注重整体性和可持续性。

例子:如果你在开发一个电商网站,组织能力会让你:

  • 把系统拆分成用户管理、商品管理、订单管理等多个模块(分而治之、领域划分、上下文辨识)。
  • 设计清晰的接口,让这些模块能互相通信。
  • 管理代码的复杂度,确保每个模块内部逻辑清晰。
  • 处理模块之间的依赖关系,避免混乱。
  • 不断优化和重构代码,让系统更容易维护和扩展。

组织能力=架构能力+分而治之