原文: A Cautionary Tale of Learning to Code. My own.

我曾经是一个普通的上班族,平时穿西装、坐办公室、但心中有一个模糊的创业想法。我不甘心平庸,所以想学编程,实现自己内心的想法。

我无意中听说有人花了一个小时来吹嘘他是如何轻松地通过 Ruby 来自动化他的工作流,我想:真的这么牛吗?回到家,打开电脑,搜索 Ruby,仅仅花了15 秒,我就决定开始学 Ruby 了。

一周以后,我参加了人生第一次黑客空间会议,每个人谈论着不同的语言,例如:Scala、Clojure、Go。我的世界突然被打开了,心想有太多东西需要学习了,我一口气借了三本编程书籍,结果最终每本书只看了前面的 50 页。

2

大部分技术书籍都强调自己适合零基础的人阅读,事实上却先假设你掌握了大量基础知识。

我的一个朋友听说我在学编程,他建议我应该先学好 Emacs,并给了我他的配置文件。我花了几个小时学习 Lisp 的基础语法,以便我能进一步配置 Emacs。

然后有些路过的人看到我在用 EMACS,他们问我:你知道 Vim 比 Emacs 更牛吗?我想:真的吗?于是我开始记忆大量的 Vim 快捷键。

3-3
大多数关于文本编辑器的争论被工程师们称为宗教战争,这些争论更多是基于历史差异而不是实际价值

当时,我心里甚至认为:打字的速度越快,编程的速度也就越快。还因此买了一个程序员专属的、编程最有效率的键盘:Dvorak 键盘。

4-3
你能数出在最初的Qwerty位置有多少字母和符号吗? 我给你一个提示,总共是 9 个,而标准键盘只有 6 个

有一天,我终于可以让我的上网本成功地启动Linux,我每分钟可以输入超过 10 个单词,我还通过书籍和 Udacity 的课程学习了 Python。

经过了 7 个月的艰苦自学和参加编程活动,我终于找到了人生的第一份软件工程师工作。

在 CTO 对我的面试中,我告诉他我学过的所有工具以及我使用的深奥配置。CTO 点点头,礼貌地听着。当我夸完自己知识的广博后,他跟我只说了一句客气话。他说: 你可以用很多方法做很多事情,但只有很少的方法是有意义的 。说完,他递给我一台破旧的MacBook,然后我就开始干活了。

当时,公司决定用 Ruby on Rails 来构建产品,团队里的人都支持这个决定,而且大部分原始代码仍然完好无损。所有的工程师都使用 MacBook,因为它既可靠,又和他们在生产环境中使用的 Ubuntu 很类似。

这一次,再也没有开发工具之争,每个人都只使用 RubyMine,它是一个强大的集成开发环境(IDE),并有一个合理的默认配置。这意味着任何一个工程师都可以坐在其他工程师的身旁,立即开始结对编程,而不需要将自己切换到同事的开发环境中。这一事实本身就解决了两名开发人员在尝试协作时感到的许多尴尬和无意识的抗拒。

公司对我不了解 Ruby on Rails 并不在意。由于我已经长期专注于学习 Python 和 Django,并赢得了黑客马拉松,他们认为我肯定能学好 Rails。

刚开始的几周很艰难,不仅仅是因为我进入了一个新团队,要掌握新的语言、框架和代码库。更是因为我清楚地看到自己,一路走来,都是以一种让人无法忍受的受虐方式来学习编程。

我曾经花了几个月的时间独自坐在图书馆或咖啡馆里,盲目地从命令行中安装工具,调试Linux驱动程序的问题,并且埋头于一些琐碎的事情,比如遗漏的括号。

我曾经涉猎了所有能想到的在线编程课程,并参加了无数的 Mooc 课程。在前五个月中,由于不停地遭受痛苦和打击,我几次差点放弃。

这使我清楚地意识到: 编程是一场西西弗斯式的斗争

我确信,我遇到的那些看似正常的程序员实际上都不是寻常的人,他们经历过学习编程的痛苦,受过挫折的打击。

5
这张照片是我在一个星期六的早晨,在公司自拍的。那天,我早早地起床、还穿了西装,郑重其事地告诉自己:我要开始写代码了。我还发了一条 Facebook 日志:我的新办公桌,就是我的餐桌。每天8点上班,6 点下班,只在中途休息的时候才会起身,其他时候,我一直坐在电脑前。提示:图中可以隐约看到一个不锈钢饭盆

与我的同事相比,他们很少遇到语法错误,因为他们的 IDE 首先发现了语法错误。如果他们遇到的问题,不能快速地通过阅读文档和谷歌搜索来解决的话,他们只需要互相发送即时消息,请求帮助调试。然后他们就会随意地迁到彼此的桌旁,开始结对编程。

在他们之间,不存在什么自尊和自大,仅仅是成人间的建设性对话。

团队还致力于开发自己的工具,在业余项目和黑客马拉松中,开发人员会尝试使用新技术。

但在公司的代码库里,他们对新技术持保守态度。和一味追逐新技术相比,他们更关注的是如何更好地利用现有技术。

你可以在 ThoughtBot 这样的地方看到同样的理念,这里的每个人都坚持使用一个小型但有效的工具链(例如:Rails、Vim、Postgres 和 Redis)。通过专注于极少的关键工具,他们的工程师成为了能够轻松互操作的专家。

既然软件工程师团队专注于一个小型的工具链就可以获得超高的生产效率,那学习编程的人难道不是也应该专注于一个小型的工具链吗?

在线学习机构和编程训练营都是这样认为的,但作为一个个体,我们每个人面临这么多的选择,真的很难决定学什么。

我知道,因为我曾经就是那只在十字路口兜圈子、不停更换目标的饿狗。

每个曾经迷茫、无助的年轻人都在内心深处不停地问自己: 这个世界那么大,我究竟应该往哪里走

这个问题从来就没有确定的答案,如果你没有找到让自己内心激动不已的目标,那就不要停、继续找。如果找到了,就不要轻易更换自己的目标。

一个优秀的程序员,他应该是 T 型人才,在许多领域都有浅显的知识,但至少在一个领域有深入的知识。

我遇到很多像我一样,突然下定决心转行学编程的人。他们很多因为各种原因放弃了成为程序员的梦想,我不希望这种事发生在你身上。

你需要专注

6

我在这里看到了新手一直在犯的几大错误:

1、频繁地转换语言或框架,自欺欺人地认为自己可以精通所有语言或框架。

2、用奇异的工具来个性化他们的开发环境,而不是更常规的工具,常规的工具可以在与他人协作时更轻松便捷。

3、尝试学习 Docker 和 Famo.us 这样的工具。新东西总是令人兴奋的,即使他们还没有掌握更基本的技术。

如果必须用一个词来总结我对新手的所有建议,那就是: 专注

计算机的世界纷繁复杂,精彩纷呈。你最需要做的就是: 做决定

1、根据你的兴趣来选择一种软件开发类型作为你的职业: Web、Mobile、Game、Embedded。

我推荐 Web,因为它很灵活,而且有大量的工作需求和学习资源。

如果你对 Web 开发以外的东西更有兴趣,那么就把这篇博文放到一边,用谷歌搜索:getting started in Mobile/Game/Embedded development,然后就全力以赴吧!

2、选择一种语言:JavaScript、Ruby、Python。

每一种语言都有其优点,它们都可以用来构建 Web 应用程序(Node.js、Rails 和 Django)。除非你有强烈的偏好,否则我推荐 JavaScript,因为它是最流行的语言。

3、选择一门在线课程进行学习。

如果你更喜欢 JavaScript,那么就选择 freeCodeCamp。如果你更喜欢 Ruby ,那么就选择 The Odin Project。相信那些亲手设计课程的老师的智慧,按照推荐的顺序来完成,不要随意跳过。

一旦你做出了这三个决定,前进的道路就清晰多了。忽略围绕新工具、新语言、新框架的炒作,保持头脑清醒。通过每天完成一部分课程来保持动力,即使每天只有半小时。这样,每天都能看到自己的进步,你就会更有信心,更相信自己今天做的决定。

请记住:只要有耐心,任何心智健全的人都可以成为一名出色的程序员,包括你自己。