关于本文

我为了学习 JavaScript,让 GPT-4 为我编写了一份简明的入门教程:JavaScript:从入门到脱线 - https://github.com/Kit086/javascript-from-novice-to-nonsense

但为什么我要学 JavaScript 呢?原因有很多,现在我把我为这份教程编写的前言搬过来,作为这篇博客的内容:

Preface - 批判性思维与灵活应用:反思软件开发中的设计模式

一开始,编程语言和工具的流行趋势,让我这个新手开发者心潮澎湃,我曾一度坚定地认为,后端开发就是 Java、C# & .NET、Golang 的天下,前端开发则离不开 React、Angular 和 Vue。开发嘛,不就是要高性能、高并发,还要模式优雅吗?但随着时间的推移,我才意识到,当时的自己就像一个拿着宝剑的愚蠢骑士,以为自己能解决所有问题,结果却常常因为绊倒在自己的脚上而一败涂地。

file

这张截图来自推特(Twitter),展示了一位名叫 Fredy R. Guibert 的用户发布的一条推文,以及另一位用户 Manzur Alahi 的搞笑回复。

Fredy R. Guibert 的推文内容列举了多种软件设计模式和方法学,包括:

  • Clean Architecture(整洁架构)
  • Domain Driven Design(领域驱动设计)
  • Test Driven Design(测试驱动设计)
  • Outbox Pattern(Outbox 模式)
  • Repository Pattern(仓储模式)
  • CQRS Pattern(CQRS 模式)
  • Mediator Pattern(中介者模式)
  • Result Pattern(Result 模式)

Manzur Alahi 回复道:“list of things to avoid?”(这些都是要避免的东西吗?)

这句玩笑话的背后藏着对当前软件开发实践中各种设计模式和方法的深刻反思,简直像是在说:嘿,别再浪费时间在这些复杂的术语上了,兄弟,回归基本吧!

推主列出的设计模式和方法学在软件开发中非常流行,被视为解决复杂问题的良药。然而,这些模式和方法学也可能带来以下问题:

  • 过度复杂化:你是否曾经在代码里迷路,甚至怀疑人生?过多地应用设计模式可能会导致代码复杂度增加,难以维护和理解,维护起来如同拆炸弹。
  • 盲目应用:有时候我们就像是在为模式而模式,像是为了参加模式奥运会,而不是根据实际需求来选择合适的解决方案。
  • 学习曲线:掌握这些模式和方法需要一定的学习时间,对新手开发者来说,就像是在爬一座没有尽头的山。
  • 偏离目标:专注于遵循特定的设计模式可能会让你忘记了软件的实际需求和最终目标,最后发现自己在解决根本不存在的问题,就像一个厨师只顾摆盘却忘了味道。

Manzur Alahi 的回复“list of things to avoid?”(这些都是要避免的东西吗?)虽然简单,但却揭示了一个真理:设计模式和方法学本身是中立的工具,其价值在于是否能有效地解决实际问题。设计模式和方法学并不是软件开发的灵丹妙药。它们应该作为解决问题的工具,而不是必须遵循的教条。然而,在实际应用中,我们常会遇到一些开发者,他们的“经验”只是工龄的增长,并未带来真正的技能和思维的提升。他们就像是开着豪华跑车,但却不知道如何换挡的司机,或者说是开车只看地图不看路的司机,结果迷失在了自己设下的复杂道路中。他们以为自己是经验丰富的老手,实际上不过是在用经验堆砌的自信掩盖自己的惰性。。

  1. 固定思维模式与盲目自信 这些开发者的固定思维模式使他们难以适应快速变化的技术环境。他们可能过于依赖自己习惯的做法,不愿意接受新的思路和方法,就像一只马戏团的老猴,感觉自己是团里的“猿老”,不愿意学习新把戏,结局可想而知。此外,盲目的自信也使他们难以从错误中学习和改进。他们可能认为自己已经掌握了所有必要的知识,忽视了持续学习和自我提升的重要性,仿佛已经成为了技术界的“圣人”。

  2. 缺乏反思与对新技术的抗拒 在这种固定思维模式下,开发者往往忽视反思和反馈的价值。在项目失败或遇到问题时,他们可能更多地归咎于外部原因,而不是审视自己的不足。对新技术的抗拒也使他们错失了许多提升技能和效率的机会。面对新技术和新方法,他们往往表现出怀疑和抗拒的态度,认为现有的做法已经足够好,就像是坚信地球是平的一样。他们对新技术抱有天然的敌意,仿佛新技术是潜伏在暗处的敌人,随时准备摧毁他们那套陈旧的武器装备。

  3. 培养批判性思维与灵活应用 解决这些问题的关键在于培养开放和批判的思维方式,鼓励持续学习和改进。设计模式和方法学应该作为工具来帮助我们解决问题,而不是紧箍咒,不是必须遵循的规则。理解它们的原理和适用场景,根据具体情况灵活应用,才能真正提升软件质量。毕竟,工具箱里的工具是用来解决问题的,而不是用来炫耀的。

开放的心态和批判性思维是开发者成长的基础。我们需要不断挑战自己的认知边界,接受新的思想和方法,在实践中验证和优化自己的做法。只有这样,我们才能真正成长为经验丰富、有洞察力的开发者,而不是那种只会背诵“设计模式圣经”的教条主义者。

回到推特的对话,Manzur Alahi 的回复提醒我们,设计模式和方法学并不是万灵药。我们在应用这些模式时需要保持批判性思维和灵活性,避免盲目依赖和过度复杂化。通过持续学习和反思,我们可以不断提升自己的技能和思维,成为真正具备编程思维的开发者。

在这个快速发展的技术世界里,只有不断学习和适应,才能真正站稳脚跟,迎接未来的挑战。设计模式和方法学是我们的工具,而不是我们的束缚。让我们以开放和批判的态度,灵活应用这些工具,创造出更加高效和优质的软件。

回到主题。现在我的观点与刚入行的时候相比,已经发生了一些改变。我认为我们不应拘泥于狭隘思维。我们应关注问题的本质,根据实际需求选择合适的工具和方法,而不是盲目追求所谓的“最佳实践”。例如,在重构一个高并发的老旧系统时,我们可能会选择 Java、C# & .NET、Golang、Rust 等技术,但在快速开发一个小型应用时,JavaScript 尤其是 Next.js 和 SvelteKit 等则是理想选择。这并不是说 Java、C# & .NET、Golang 不适合快速开发,也不是说 Python、JavaScript 不适合高并发,而是我们应根据实际需求和团队技术熟悉度,选择最合适的工具和方法。

所以我认为,对于前端和后端来说,JavaScript 都是一个不错的选择。JavaScript 是一种灵活、强大的语言,可以用于开发各种类型的应用程序,包括网页、移动应用和服务器端应用。它具有丰富的内置功能和库,使开发人员能够快速构建复杂的应用程序和交互式界面。此外,JavaScript 的生态系统非常庞大,有许多优秀的框架和工具可供选择。因此,我认为学习 JavaScript 对于软件工程师来说是非常有价值的,也就有了这本书的诞生。

下面是对这本简明教程的介绍:

About this Tutorial

欢迎来到《JavaScript:从入门到脱线》——一本专为那些已经在其它编程语言中打滚多年的软件工程师们设计的简明教程。是的,你没听错,这本书的目标是让你在 JavaScript 的海洋中,不再像个溺水的孩子,而是能自信地划着小船,甚至偶尔来个漂亮的 360 度大回旋。

在这本书里,我们将无所不包地探讨 JavaScript 的方方面面。你会学到变量、操作符、控制流、对象、数组、函数、模块以及那个让人爱恨交织的异步编程。每一节都精炼地呈现教程内容和实用示例,力求让你在理解 JavaScript 知识时不至于过早脱发。

书名中的“脱线”其实是个有点自嘲的幽默表达,暗示你在学习过程中可能会遇到的那些让你抓狂又忍俊不禁的时刻。是的,我们都知道编程有时就像是在走迷宫,尤其是当你意识到自己又走回了原点的时候。这种轻松的调侃希望能让你在迷茫中保持一丝笑意,同时记住,即使最聪明的程序员有时也会抓狂。

虽然我的主业是 .NET 开发,但我一直坚信 Python 和 JavaScript 将会是未来的主宰。老实说,我从未系统地学习过 JavaScript,所以有一天晚上,我心血来潮打开了 freeCodeCamp,准备找个视频自学一下 JavaScript。当我发现了这两套教程时:

虽然这些视频总共只有几个小时,但我的“急功近利”基因让我连这几个小时都不想花费。而且,我很清楚自己会不断倒退视频,反复观看那些晦涩难懂的部分,这样的学习体验实在糟糕。于是,我灵光一闪,何不把这些教程变成文本形式呢?于是我把这些教程的标题发给了 GPT-4,结果就是你现在手中的这本书。你可能会发现这本书中有一些特别明显的 GPT 的前言和总结的痕迹,就像 希望这个教程能够帮助你的学员快速掌握 JavaScript 的基本和高级特性。如果需要进一步深入某个主题或有其他章节需要制作,请告诉我! 这种话一样,那是因为我懒得删除掉它们。

尽管我对 JavaScript 一无所知,但我希望这本书能帮你快速掌握相关知识,提升编程技能。不过,由于我无法确保内容的准确性,所以如果你发现了错误,请务必提 issue——毕竟,我们一起修复 Bug 才是程序员的日常,不是吗?