首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

编程≠编码!

作者 | James Cash

译者 | 弯月   责编 | 郑丽媛

出品 | CSDN(ID:CSDNnews)

学习编程的时候,实际上我们花在逻辑学习上的时间非常少,大多时间都花在了学习和管理编程工具上;程序员认为他们把所有时间花在了创建精心的设计和复杂的抽象上,但实际上更多时间都花在了处理工具和带有历史包袱的习惯写法上。

有什么问题?

根据我教授编程的经验,我们很少花时间让学生去学习如何编写代码:在最初的一段时间里,新手要学习“算法思维”,然后学习新语言或范例。我们会帮助学生学习逻辑和编程,但在“学习写代码”的课程中,代码本身并不是他们需要学习的内容。

相反,导师需要处理的问题主要是工具,比如“EADDRINUSE 错误,然后崩溃了”;“git 出错了”;“npm 分段错误”。我们需要尽最大努力消除配置的问题,让所有学生都使用标准化的编辑器,并在虚拟环境中写代码,这样可以保持环境完全相同。

如今“每个人都应该学习编程”的说法很流行,但如果没有事先设置好环境就开始学习,情况会很糟糕吗?如果没有良好的基础,是否也可以学习编程呢?

经验丰富的程序员一般不怎么讨论工作中多么需要依赖工具,我们喜欢把自己塑造成才华横溢的概念艺术家,着重强调我们掌握了算法和数据结构等极其复杂的知识。虽然有些职位确实需要这种抽象级别,但我敢打赌,绝大多数程序员更多时间都花在了解决编程工作中遇到的各种工具问题。

一些具体的例子

烦人的工具有一箩筐。

使用终端

对于大多数非 Windows 开发人员来说,使用终端浪费了大量时间。不幸的是,对于大多数新手程序员来说,在终端中写代码似乎是非常新鲜的事情,当然遇到麻烦的情况另论。

我经常看到学生通过 cd 命令,层层深入目录(而不是执行一个命令 cd dir1/dir2/dir3),他们也不知道使用 Tab 键可以自动补齐,会奇怪为什么不能直接用鼠标点击来移动光标,以及许许多多奇怪的问题。

如何退出程序

关于使用终端的麻烦,还有一个例子是退出各种程序。

相信很多人都听过一个笑话:“怎么退出 vim?”当默认的 $EDITOR 设置为 vi 时,这就真的会变成学生的一个问题。不仅仅是 vi,很多学生不知道大多数程序可以按 Ctrl-C 中断,另一些可以按 Ctrl-D 结束,q 可以退出分页,\q 可以退出 PSQL。

有些学生偶然发现按 Ctrl-Z 可以暂停进程,他们觉得很有趣,对他们来说这就相当于退出。这种想法会引发一些非常奇怪的问题,尤其是他们以为自己已经退出了服务器,但仍有一堆副本在后台运行。

Git

关于 git 难以理解的讨论已经是陈词滥调了,但其实这种说法确实有充分的理由。

在这个领域,我知道我的 git 经验水平不足以帮助学生。长期以来,我已经习惯于从命令行使用 git,更不用说我曾花大量时间阅读实现细节了——这就导致在教学的过程中,我根本不记得不理解 git 是什么感觉。

我认为,如果学生们学会使用 GUI 工具来使用 git,就可以享受到更好的服务,至少一开始是这样,但这非常不利于开发。有人可能会说,GUI 工具并没有公开 git 的所有功能。但你知道吗,命令行界面也没有公开。至少在使用 GUI 时,用户可以看到按钮和提交的可视化图,帮助他们了解 git 都有哪些用途。

编辑器

我喜欢使用 Emacs 和 vim,但我不推荐学生使用这两款工具。因为学生需要付出很多努力,才能学会使用这两款工具的基本功能,更不用说学习如何让这些编辑器发挥真正的力量了。

在我的课程上,学生们使用的是 VS Code,这也是一款非常强大的编辑器,但学生们并不知道如何利用它。当我告诉学生们可以使用 Cmd-p 或 Ctrl-p 跳转到文件时,他们大受震撼,但在我看来这只不过是 VS Code 的基础操作。

与大多数专家工具一样,文本编辑器编程可以为专家提供更强大的功能,但初学者来说不太容易上手。

React

React 教学周总是很艰难。以前,我们学习的是基于类的 React,那时的教学就非常别扭,因为学生必须学习 ES6 的类语法,其中包含一大堆奇怪的语法。学习这些很难,但 Hook 似乎更难。

我很喜欢基于 Hook 的 React,因为我曾通过 Clojurescript 使用 React(最初使用的是 Om,现在使用 reagent/re-frame)。然而,对于还没有习惯函数式编程风格的人来说,就需要做很多功课了。

使用纯 Javascript 进行函数式编程需要特别小心,因为这门语言根本无法帮助你避免突变。更糟糕的是,React 也根本没有任何措施来避免你犯错。

学生很难学会正确使用基于 Hook 的 React,因为即使用“错误”的方式,似乎也能正常工作,比如直接改变状态变量或进行不安全的状态更新(例如在设置新值的时候使用旧的状态值)。学生写了一堆代码,看着似乎没问题,还可以运行,没有错误或警告,但如果之后他们添加一些其他更改,就会导致程序以很奇怪的方式出错,比如更新莫名其妙地丢失,重新渲染没有完成,然后学生也不知道为什么。

不过至少 React 还有一些入门教程 create-react-app,如果他们在学习 React 之前必须学习使用 webpack、babel 等,那么就真的不可能学会了。尽管这样,他们也会遇到一些奇怪的问题。最打击人的是自动构建停止工作,学生们修改代码,但就是不起作用,因为实际上他们的代码根本没有运行。

数量庞大

如果学生只需要学习其中的一两个工具,倒也还好。所有学科都有需要学习的工具和实践,这些工具和实践提供了一定程度上的辅助作用。

然而,对于编程,你需要学习的新知识非常多,薅牛毛(Yak Shaving)一词诞生于编程界而非机械师,这是有原因的。人们在学习编程时,有无数令人费解的工具令他们头昏脑胀,很容易产生疲劳,变得非常沮丧:当所做的一切只会招致更多麻烦时,每个人都会感到沮丧,所以你只需让代码跑起来,不要深入研究背后的原因或如何更有效地完成任务。

我们应该做什么?

我一直认为,真正有用的课程不一定要教大家学编程,而是让大家学会如何像程序员一样使用计算机。很多时候,这才是我们需要培养的最厉害的技能:不是算法思维,而是对如何使用计算机有深入了解。

人们需要成为专家才能使用基本工作,作为软件开发人员,这算不算是我们的失败之处?我不知道。

许多任务本身就很复杂,但我们肯定能找到方法降低难度。我只是担心,程序员会为了寻找某种成就感不想让编程变得太简单。他们当初付出大量努力来学习如何使用这些工具,如果这些工具变得更容易使用,可能会让他们觉得曾经所有的努力都是白费。

我想这可能是一代人的变化,随着如今人们开始学习使用 Glitch 这样的工具编写代码,也许将来他们无法忍受如今这些笨拙工具,自然就能诞生更好的工具。如今的开发人员似乎更喜欢用户友好的东西(解释性语言、图形工具),尽管仍有很多人主张回归到“更简单”的做事方式,比如使用 C 而不是 “高级语言”,反对语法高亮显示等。

目前,我正在尝试一些事情:

▶ 安慰学生们,遇到奇怪工具问题时耗费大量时间并不罕见,这也不是他们的错。

▶ 尽我最大的努力慢慢向学生介绍新的特性和功能,不要一下子给他们灌输太多知识。

▶ 不要执着于用“正确”的做事方式,例如 “真正的程序员只在命令行中使用 git”。

但这些措施治标不治本,我们怎样才能让编程课程专心教授编程呢?或者说,有这种可能性吗?无论如何,我认为如果我们认识到这是一个问题,就应该尝试为了下一代程序员而努力改进。

毕竟,梦想还是要有的……

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230414A01SBS00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券