学习编程需要自律

很多人都想拥有更好的身材。为了实现这一目标,他们既可以通过节食,也可以借助锻炼。对于这两种情况,他们今后的任务相当简单。节食通常意味着计算卡路里(虽然有很多方法)并且长期坚持。锻炼通常意味着做一些心肺运动(走路,跑步,游泳,骑自行车等)并且定期进行。

即使是非常简单明确的目标,对于大多数人来说,都将非常困难。相对而言,观看电视、上网冲浪、小憩一下、玩电子游戏以及其它许多事情,反倒比节食或者锻炼容易许多。

相比之下,学习编程则要困难得多。在一定程度上,学习编程与学习外语极为相似。你也许可以学着说一门外语,尽管并不完美或者不完全正确,但是通常情况下,你都能侥幸过关(听众往往弥补了你的语法错误)。然而,你在编程上却不能如法炮制,因为语法精确性要求极其严格。任何一个局部的打字错误,都可能导致整个程序无法运行,而且很多时候,你还无法找到趁手的工具帮助你诊断和解决这一问题。

我们把这种情况与学习投篮比较一下。当你学习投篮时,你清楚地知道你的目标就是将球投进篮筐中。你投出的球一旦偏离目标,你马上就可以看到,目标与偏差常常清晰可见。对你而言,修正这一错误或许并非那么一目了然(你可能需要一些你还不了解的技巧),但是,即使是一名初学者,也能看出一个人是否射中了篮筐,然后告诉他这次投篮是否成功。

需要选择的东西太多

当你参与一项体育运动时,该项目规则和形式也许几十年都没有变化了。但是编程这件事,从另一个角度来看,则是一个持续移动的目标。新手甚至不知道,现在 Java 的版本为什么是 1.8(意思是 Java 语言的第八个版本)。

如果你在 1990 年代中期从事 Web 开发工作,你也许会用 Perl 语言进行 cgi-bin 脚本编程。如果你身处 1990 年代后期,你可能会采用 Java Servlet Pages 技术。如果你在 2000 年代中期学习 Web 开发,也许你会用到 Rails。如果你喜欢 Python,也许你会用到 Django。如果你五年前才开始接触编程,或许你正在摆弄 Angular、Backbone、Ember 或者 React。在这之前,也许还有 jQuery。

几乎每一天都有人想知道,他们究竟应该学习哪一门编程语言?他们担心错误的选择很可能将他们引向平庸。实际上,无所作为才是问题产生的真正根源。

配置就是一团乱麻

现在,Java IDE 的功能已经相当完备。方法提示、语法错误以及其它特性等。编辑器功能非常出色,代码调试也很不错。然而除此之外,其它一些事情却让我们极其痛苦。你的 IDE 难道可以告诉你,你的 pom.xml 文件是否正确设置?或者你的 Java 版本是否匹配?以及如何修复这些错误?大多数这类配置问题都会涉及烦人的手工调试。

如果你把文件放错了目录,没有任何信息提示你正确的位置应该在哪里。我认为 Spring 过度依赖注解简直就是一个糟糕的设计,因为它改变了 Java 原有的工作模式,致使那些学过 Java 编程的人突然无法理解,为什么一个注解应该放置在那个位置,以及这样做将会起到什么样的作用。

更普遍的情况是,所有围绕代码编写的事情都不友好

如果所有错误都能够被正确捕获和解释的话,我相信你一定会非常高兴。设想一下,你将 pom.xml 文件放在一个目录中,你怎么知道这个目录就是放置这一文件的正确所在呢?我在这个目录中没有找到 server.xml 文件,那么这个文件究竟应该在哪里呢?等等... 诸如此类的问题。

数据库真令人讨厌

数据库的工作方式已经存在很长一段时间了。就我个人而言,我宁愿将其看成一组 Java 对象,这样的话,我就可以批量处理它们。但是多年之后,我们还是会在 SQL 语句上遇到困难。所以,我们使用 ORM 试图简化这方面的工作,但是这样做似乎帮助不大,因为每一个数据库厂家更喜欢不同的做事方式。

不只是编程

一般情况下,你必须学会一些其它的技能,尤其是在 Web 开发领域。这些技能包括了 HTML、CSS、JavaScript、版本控制、错误跟踪、多种不同语言的编译及构建工具、各种基于不同浏览器的调试工具、数据库管理、服务器安全、电子邮件等等。这个意思就是说,仅仅学习和使用 Java(或者 Python)语言是远远不够的。

文档资料过时陈旧且难以使用

一段时间以来,Spring 几乎做什么都要用到 XML,现在反而转向了更传统的纯 Java 方式。那些基于 XML 的教程现在有什么变化吗?它们还在那里。难道不能用 Java 把它们重写一遍吗?不可能,这些资料只是一些简单的例子。截止到目前为止,我们搞不清楚为什么 Spring 当初选择一种有着无数选项的复杂设计。

或者,你也可以安装 Python 或者 Ruby。但是不管怎样,每过几年,编程界的一些做事方式就会发生变化。我应该使用 rvm 吗?或者某种类型的 gem?或者其它什么东西?

缺乏清晰的学习路径

大多数编程学习资源更喜欢于给你提供一系列的链接。当然,相对于设计一套教学或者学习大纲,这种资源制作方式更简单、更容易,但是,你也将因此遭受到各种教学法或者学习方式的折磨。

学生大都好高骛远

一般情况下,初学者都会被告知,他们应该自己构思一些项目。但实际上,他们什么也想不出来。然而,当有人要求他们做一些特定的项目时,他们又不感兴趣。

这看起来就好象是,你正在一次聚会的路上。你询问你的朋友们,他们喜欢在哪里就餐,他们说“任何地方都行”,然而,当你快速整理出一个清单之后,他们逐个否决了每一个选项。

学生们想要拖拖拽拽,而且他们喜欢视频教程,他们希望自己要做的项目应该是那种最复杂的 Web 应用,尽管事实上,Youtube 和 Facebook 上有数以百计的人比他们更有经验、更为聪明。

玩转刽子手猜字游戏的关键就在于选择合适的难度,因为后面还有很多更高难度的关口正在等着你们呢。

你需要掌握很多专业术语

是的,这是真的。在 C 语言中,static 表示什么意思?在 Java 语言中又是什么意思?overriding 与 overloading 的区别是什么?构造函数(constructor)与析构函数(destructor)的差异在哪里?什么是垃圾回收机制(garbage collection)?动态(dynamic)与静态(static)的不同之处是什么?一个 RESTful service 究竟是什么意思?

很难获得帮助

很多时候,这是因为初学者无法清晰地表达和描述他们的问题,或者人们觉得,有些初学者根本没有认真用 Google 查找。这就是为什么对于一些人来说,参加一门课程反倒是更好的选择,因为至少你可以与你的助教交流,或者与这门课的教授直接对话,或者询问其他同学。当你只身一人独自折腾的时候,你很容易遭遇困难并陷入窘境。

学习编程需要自律

最后,我觉得学习编程需要具备一种特殊的自律。在一定程度上,这种自律不同于健身或者节食,你应该在解决问题上练就一种更聪明的自律能力。如果你一旦陷入困境而不能自拔,你最好询问那些愿意给你提供帮助的人,或者,暂时将此问题搁置在一旁。

作者:CodeTinkerer

原文:Why learning to program is tough

感谢:Qingniu 帮助审阅并完成校对。