如何成为黑客

2020-06-01 19:41:41

当我13岁开始上高中时,我读到了ESR的博客文章:如何成为黑客。我很兴奋地了解到程序员社区一起在互联网上构建东西,这让我尝试安装Fedora Core4,并最终安装Ubuntu 6.06,通过它,我学到了很多关于自己排除故障并试图让事情真正正常工作的知识。这最终对培养技能至关重要,这些技能帮助我获得了现在的工作。我读了关于Python的书,写了一些琐碎的程序,于是决定学习计算机科学,了解计算机的实际工作原理。在我不确定自己想做什么的时候,这是一个很有影响力的帖子。

在布法罗郊区长大的纽约可能相当与世隔绝-虽然我很幸运,我父亲在大学里编写了一台Apple II作为娱乐(所以有一些背景/黑客精神),但他对更现代的软件开发知之甚少。我喜欢电脑,也喜欢玩电脑,但我不太知道什么是可能的,甚至不知道到哪里去了解更多。当搜索空间如此之大,有许多未知的未知因素时,甚至很难找到好的信息来源来学习。能够选择好的信息源需要一些现有的知识,如果没有经验丰富的人的指导,这可能是困难的。我认为现在情况可能更好了,因为互联网更发达了,但在某些方面,现在比那时有更多的选择可供选择。

16年后,我觉得写一本自己版本的“如何成为黑客”来补充ESR的原著会很有趣:这本书我在13岁的时候就想读一读,集中在其他一些我也会觉得有帮助的方面。许多关于编程和相关话题的帖子都在鼓噪,试图说服你采用一种特定的编程语言、框架、操作系统或特定的做事方式。这篇文章做得较少,虽然我提出了一些建议,但它是一个更温和的观点。它的目标是填补我想在ESR的原始帖子之后读到的利基(所以你应该先读那篇)。

一开始,我记得我读过一些文章和书籍,但不懂很多行话--这是很正常的。起初看起来难以理解的事情,随着你接触到更多的东西,慢慢地变得可以理解,并深入了解每一件你不理解的事情。保持阅读和精力充沛地阅读是很好的,在你不理解的时候查找它们,当你可以的时候问问题(ESR也有一个关于如何问好问题的很好的帖子)。

每个人都会在某个时候第一次学到一些东西,然后事情就会慢慢积累起来,直到你对基础知识更加熟悉。我记得我不理解一些小细节(比如不知道在终端中输入命令来运行它们,或者CD代表“更改目录”)。你从暴露中学到了这些东西,你玩得越多,你接触到的东西就越多,积累的经验也就越多。如果您足够幸运地住在一个有一群人对软件感兴趣的地区,您将能够更快地学习。

学习复杂的新东西一开始往往感觉很困难--如果感觉很容易,那可能是你已经知道的东西,或者你可能并不是真的在测试你的知识(读到如何解决物理问题并认为“这是有意义的”要比用你刚刚读到的工具自己解决问题容易得多)。挣扎可能是个好兆头--这意味着你真的在学习,通过专注于做类似类型的事情,当你变得更好的时候,事情就会变得更容易。

我认为完全陌生的人甚至还有一点优势:当我积累了一点经验后,只做我已经知道怎么做的事情就会变得容易和舒适,而不是学习新的东西。这可能会导致你陷入一种停滞不前的状态,在那里你只能重复做你已经知道怎么做的事情,就像一个人只能用吉他弹一首歌,而且总是只弹这一首歌。对于一个新人来说,每件事都很难,所以这不是一个真正的选择。

第一次学习复杂的东西应该会觉得有点痛苦--你应该习惯这种感觉,因为这是一件好事,意味着你在成长。别让它把你吓跑了,因为你认为自己不够聪明。因为有这么多东西要学,有很多不同的途径可供学习(仅在计算机中就有计算机图形学、安全、机器学习、算法、移动、网络、基础设施等),拥有一种允许自己成长并走出舒适区学习新事物的心态是至关重要的。

仅仅通过阅读一本关于编程的书来学习编程就像只通过阅读一本关于跳伞的书来学习跳伞一样。您可能需要阅读这本书(在开始时,您将需要从它开始)-但它不会坚持下去,除非您同时还在编写小程序。木匠通过造东西变得更好,作家通过写东西变得更好,程序员通过编程变得更好。这并不是说你不应该读书,或者好书不是特别有价值(它们是非常有价值的),而是很容易落入这样的陷阱,你读关于编程的书却没有实际做任何事情,因为读起来比做起来更容易,而且当你刚开始的时候,很难想出一些可以在真空中编程的东西。

我同意ESR的观点,即Python是一种很好的入门语言,有一个很好的在线网站,名为“艰难地学习Python”,它主要面向初学者,并在教学过程中使用练习。

刚开始的时候,语法很难理解,当你学习的时候,很多时间都花在了这一点上。因为每种编程语言都有不同的语法,所以它们看起来非常不同。然后,您将开始掌握语法,更多的是关于如何解决问题以及使用什么数据结构的一般结构。最终,您会熟悉常见的数据结构,然后讨论转向更高级别的抽象和更通用的设计或基础设施,这些设计或基础设施使事情更易于大规模管理或在未来更容易更改。

在掌握一门语言的语法并能够编写简单的程序之后,学习数据结构是最重要的下一步。有几个核心数据结构在破解编码访谈书(以及示例问题)中有相当详细的描述。令人困惑的是,对于相同数据结构的实现,语言往往有不同的名称(例如,Python将哈希表称为“字典”),但是大多数语言都会有一些核心数据结构的实现,即使它们有唯一的名称。

故障排除或调试也是一项核心编程技能-大多数编程实际上都是在调试,所以如果您喜欢调试问题,这可能是一个好兆头。当您不得不四处搜索以尝试和理解某些东西时,或者当您正在阅读的文档不起作用时,或者当您在环境中遇到一些意外错误时,不要灰心丧气-这是正常的(这不是您能力的反映)。

大多数软件都不能工作,而且经常有未记录在案的错误、错误和很难纠正的小细节。例如,Github上的大多数开放源码项目都会有某种构建系统来处理软件配置以运行的问题。这将做一些事情,比如拉入依赖项(它工作所需的其他代码),以及执行任何必要的命令以实际使其运行。如果您要在Github上下载一个有趣的项目并尝试运行它,您可能会在此过程中遇到意外错误,这些错误通常没有文档记录。

运行这些错误并解决问题是正常的,也是有经验的程序员必须处理的事情(如果幸运的话,我们以前刚刚看到过这种类型的问题)。我见过人们犯这样的错误,认为他们做错了什么,但这不是你的错--事情就是这样。围绕构建系统和试图使它们变得更好(这可能会使初学者更加困惑,因为没有真正的标准化,配置软件运行的正确方式取决于编程环境和语言),有很多竞争工具甚至行业。

我记得当时很沮丧,因为很难找到关于计算机实际工作原理的信息。我寻找的每一件事都只是用无用的过于简单化的类比谈论计算机(磁盘是“存放文件的文件柜”),但我实际上读不到任何东西来理解事物的真正工作原理,所以如果被转移到过去,我将能够真正解释如何建造一个计算机。具体地说,这更多的是电气或计算机工程,而不是软件,但了解硬件方面仍然有很大的价值(而且很有趣!)

我推荐的最好的书是查尔斯·佩佐德的“密码”。它将带您了解基础知识,从电比特开始,一直到布尔逻辑和电路设计的历史--使用简单电路的实际图纸,以及如何在内存中存储比特。这是建立在发现的历史上下文中的,直到您构建了一个小型CPU。他还从事一些组装和基本的计算机制图工作。作者是一位非常清晰的作家和教师,所以这本书的细节可读性令人惊讶。

如果想了解更多的历史背景,我会推荐M·米切尔·沃尔德普的“梦幻机器”和史蒂文·利维的“黑客”。叙事性故事使学习和记忆事物变得更容易,我认为这些发现的背景有助于了解事物的实际运作方式。

工具很有趣,了解您的工具也很好,但是您可能永远都在定制东西和争论不太重要的小细节。当您刚开始学习时,定制工具可能是一种有趣的学习方式,但是我看到人们在这上面花费了大量的时间,因为与实际编写解决问题的程序或者只是更多地了解一般的编程技巧相比,它产生的价值相对较少(目前设计数据密集型应用程序是一本很好的样例书),但是我看到人们在这方面花费了大量的时间,因为与实际编写程序来解决问题或只是更多地了解编程技巧相比,它产生的价值相对较少。我认为过于专注于定制工具可能会阻碍您的发展。

不要过于担心Vim或Emacs,或者你使用的是哪种操作系统--你可以在任何地方学习到核心技能(这是我与ESR的帖子最大的不同之处)。尽管如此,玩Linux对我来说是一个非常有价值的学习故障排除的方式-很大程度上是因为它工作得不是很好,我不得不花几个小时做一些事情,比如试图让无线互联网正常工作,让笔记本电脑成功挂起,甚至让UI显示出来(现在情况有点好了)。

我从尝试安装Gentoo开始(实际上从未成功)。这种故障排除技能对我得到现在的工作真的很有帮助,所以如果你玩不同的操作系统很有趣,我肯定会鼓励你这样做,我只是不认为这是一种要求。不过,在MacOS或Linux上学习可能更容易,因为大多数现有工具都是针对这些环境的,并且大多数程序员都在使用这两种环境中的一种。

值得一提的是版本控制,特别是git。花一些时间熟悉基础知识是值得的,但在您进行了一段时间的编程之前,可能不会专注于此。

在开始一个项目之前,通过永远“研究”选项来拖延是很容易的-阅读和探索哪些是可用的是很有趣的,这样做一点也是好的,但你也可能永远被困在这一点上。当有疑问时,只需选择最受欢迎的已存在一段时间的项目,并使用该项目即可。如果它很受欢迎,它可能有一个体面的社区可以让你学习,如果它存在了一段时间,它可能会更稳定(或者至少它会更充实,不太可能被抛弃)。

我真的很喜欢学习计算机科学,我认为这可能仍然是获得最多机会的最好方式(特别是如果你像我一样住在郊区,周围没有很多软件人员)。如果可能的话,我认为尝试参加你能参加的最好的CS课程可能是件好事。网上也有很多好的课程,但如果你的生活就像我的高中生活一样,在家里就很难真正利用这一点。

如果学习是获得好成绩的天真解决方案,那么从事酷的编程项目就是在编程面试中取得好成绩的天真解决方案。要在竞争激烈的公司安排面试,你需要非常熟悉leetcode和破解编码面试手册上的问题。编程面试需要大量的练习,这是一项需要自身和自身发展的独特技能。

你可以通过整个CS学位,但仍然不知道如何编程-你也可以获得CS学位,但仍然不能进行编程面试(这两种情况可能都是默认情况)。学会编程,学会在编程面试中做得很好,需要你自己集中时间。CS在一些方向和集中的项目上提供帮助(Lambda School可能在编程方面做得更好,而且可能在总体上会做得更好),但您必须自己掌握大量这些知识。

除了“软件工程师”,还有很多不同类型的角色。SRE(Site Reliability Engineer,站点可靠性工程师)更多地关注运行代码的基础设施,并为此编写软件。有一些内部工具和devops-devs专注于自动化软件构建和测试所需的所有工具(阅读Phoenix Project可以获得一个有趣的故事来说明这一点)。还有一些角色更多地与用户交互,比如开发人员支持工程师(帮助用户处理API并处理错误或配置问题)。有些人专注于游戏引擎,有些人专注于VR或计算机图形学。有些人编写新的计算机语言和新的编译器。

根据所使用的产品和为解决新问题而创建的新工具,这些角色中的每一个都有更多的专门化。计算机安全也是一个有趣的领域,我对此了解不多,我认为ESR在他的帖子中对此过于不屑一顾,但这也是一个很难开始的地方,因为它需要对事物如何工作的大量现有理解才能知道事物如何被打破。我记得我很早就拿起了这本书,但当时我知道的还不够多,无法真正理解它:黑客:剥削的艺术。

当然,你也可以创办自己的公司,以这种方式打造自己作为创始人的角色。

一生是一段很长的时间,而专业不是永远的,所以潜心于不同的事情--尝试许多新事物,并在此过程中享受乐趣。

ESR谈到要加入当地的Linux用户组,但至少对我来说,当我读到他的帖子时,这是不现实的,因为他们真的不是很多,而且我自己也不能那么容易到达任何地方,因为我太小了,不能开车。现在有一些我觉得有趣的在线社区,我想那时我也会觉得有趣。

黑客新闻:YCombinator的新闻网站(旧金山湾区的创业孵化器)。评论可能会被击中或错过,但好的评论真的很好,很多业内人士都在那里闲逛。保罗·格雷厄姆(Paul Graham)和杰西卡·利文斯顿(Jessica Livingston)是YComposator的创始人,保罗写了很多有趣的文章。

Twitter:这在很大程度上取决于你关注的是谁,但如果你想成为一个很棒的地方,它也可以是一个很棒的地方。开始时很难知道该追随谁,但你可以看看我关注的每一个人。

不那么错误:不是专注于编程,但是在理性社区和编程社区之间有相当多的重叠,我喜欢那里的很多文章,这绝对是我在发现如何成为黑客的同时就想找到的东西。这里有一个我很喜欢的例子帖子:定义之争。

我记得大约在我读到理查德·斯塔尔曼的帖子的时候,ESR回复了我发送的一些关于让iPod在Fedora Core4中工作的电子邮件,我非常肯定理查德·斯塔尔曼也回复了我在那个时候发送的一些电子邮件。我觉得那很不错。本着继续这样做的精神,如果你愿意,请随时向我提出具体的问题。