反模式为何重要

大多数程序员在采取某种形式的反模式之前都有类似的背景,直到最终意识到它无法扩展或无法很好地工作。当我 17 岁的时候,我的第一份工作是一名学徒开发人员,周一至周五我会被送到伦敦,把西装和全黑的衣服压缩到一个令人惊讶的小行李箱里,并学习软件开发。在星期五,我们经常在下午 12 点被提前释放半天,但我会提前预订公司的火车票,这样我可以在快餐店或咖啡店工作,做一些简单的项目。每周回来后,当我试图扩展这些解决方案时,我都会意识到新的可扩展性和代码质量问题。当然,我之前做过开发,但这些主要涉及非常短的新编程任务、使用预制作框架或处理遗留代码,其中架构已经完成(或者我现在意识到是用一把严重钝刀完成的)。这种学习自己代码可扩展性的过程非常棒;我迅速学会了如何更好地设计软件。作为人类,我们往往对一个主题了解不够,不知道自己知道多少(我发现那些管理软件开发者的人从来没有自己写过代码,这一点非常正确);当我们记住这一点时,我们应该记住我们永远需要从自己的错误中学习。虽然这非常重要,但教导自己记录反模式也是从别人的错误中学习的关键。

我曾经是一名技术主管,也是一名开发人员的导师,该开发人员从错误中吸取教训的方式非常残酷。在我与这位开发人员的第一次评估中,我的人力资源部同事告诉我,每次他犯错,前任技术和人力资源主管都会把他拖进会议室,进行正式的纪律处分。这两个人技术知识非常有限,在管理开发人员方面也完全不合格(以至于他们是那种生活在自己的泡沫中的人,对人们在更成功的环境中工作一无所知,并且在很大程度上陷入了死胡同,不知道如何在职业生涯中做任何有意义的事情)。在他们离开的时候,这位可怜的开发者信心被摧毁到了如此地步,以至于他在网络上没有真正的职业抱负,也不热衷于学习。在你的职位上快乐并没有错。正如我的一位前老板在我告诉他一些非常私人的事情后所说,“最终,最重要的是你快乐”。是的,很多人才能让世界运转,但一旦你把自己放在指导或管理其他开发人员的位置上,你就必须保持自己在游戏中的领先地位。如果你是经理,你应该知道如何有效地完成工作。

我所遇到过的最好的人员管理者都是那些拥有丰富知识的人,他们随时掌握最新、最先进的管理方法,就像我喜欢随时掌握 PHP 内核和社区中最新、最先进的知识一样。在撰写本书的过程中,我对项目和人员管理的认识有所提高,但还有很长的路要走。在我工作过的公司里,恃强凌弱实际上是一种管理策略,我曾经向部门主管提到过这一点,他的回答是 "我们并没有说这是最好的方法";如果这是真的,为了企业的利益,肯定应该采取一些措施来解决这个问题!事实上,技术总监曾在一次技术讲座上谈到过这个话题,并强调了 "知其然不知其所以然" 的重要性。公司首席执行官也曾与我进行过类似的谈话,他说他如何知道自己不知道。旧习难改,但至少它们已经开始在变革的风中扬帆起航。

除了咆哮之外(我确实喜欢咆哮),我为什么要谈论这个问题呢?我想说的是,你的态度很重要。在这个问题上,我最喜欢引用的一句话是:"如果你把开发人员当白痴,他们很快就会变成白痴"。让我延伸一下这句话:

  • 学生的糟糕表现往往是教师糟糕表现的反映。

  • 每个人都会犯错,错误失控是管理者而不是开发者的愚蠢行为造成的。

  • 白痴吸引白痴。如果你在自己的学科知识体系中是个白痴,那么你反过来也会招来更多的白痴。

  • 如果你在工作场所实行恐惧制度,那么你就是一个白痴,害怕被发现。

  • 如果你不知道自己知道得有多少,也不设法有效地弥补自己的无知,那么你就是个白痴。

  • 如果你把你的开发人员当白痴,你就是白痴。

简而言之,了解自己所知甚少,然后成长。这听起来很残酷,但却是事实。我们都是无知的,不可能什么都知道。有效地利用自己的知识和他人的知识是成功的关键。认识到自己的无知是关键所在。例如,去年我发现自己在基础计算机科学方面的知识不够广博,无法满足自己的需求,也无法满足我指导的学生的需求;因此,我决定去攻读非全日制计算机科学硕士学位。学习的过程非常棒,让我了解了以前不知道的计算机科学领域。

有些软件开发人员使用别人的作品,是的,WordPress 或 Drupal 开发可以让你的职业生涯快乐而富有成效,但你会发现,自己构建和架构东西是一个很好的学习经历。我曾在传统的工程环境中工作过,我认为扎实的计算机科学理论背景对软件工程师大有裨益。事实上,理解计算机科学基础所需的知识体系其实很容易掌握。当然,在很多方面,我都是在向皈依者说教;如果你正在阅读本书,想必你已经明白需要更深厚的计算机科学理论知识基础,但请不要在阅读本书后就停止积极学习。继续有计划地学习知识,努力提高我们头骨中那块蛋白质中存储的信息。

人们常说 "在盲人的国度里,独眼的人才是王者";当涉及到良好的软件开发时,较小的开发团队可能经常缺乏基本知识(也许是因为缺乏必要的知识),而事实上,一些陷入过去的大型开发环境可能最终也会陷入同样的境地。在这方面,知识变得更加珍贵,开发人员接受软件开发教育变得同样重要。

反模式不仅仅是教你的团队避免的东西;良好的软件开发不仅需要对编程语言的牢固理解,对软件开发的理论理解也是关键。

最后,请允许我引用 SourceMaking 上一篇文章中的一段话:

"架构驱动型软件开发是构建系统的最有效方法。架构驱动法优于需求驱动法、文档驱动法和方法驱动法。项目的成功往往与方法无关"。
— SourceMaking

咆哮结束。让我们介绍一些反模式。