为什么要写这篇文章?|博客文章分享

头图 | CSDN从视觉中国付费下载

出品 | CSDN(ID:CSDNnews)

以下为译文:

为什么写这篇文章?

当我 13 岁开始上高中时,我阅读了 ESR 的这篇博文:如何成为一名黑客 (~esr/faqs/hacker-howto.html)。这篇文章让我对一起在互联网上构建事物的程序员社区感到兴奋。我尝试开始安装 Fedora Core 4 并最终成功安装了 Ubuntu 6.06,通过这个过程,我学到了很多关于自己故障排除和尝试让系统真正工作的知识。这个过程对于培养帮助我获得现在工作的技能至关重要。我阅读了 Python,编写了一些小程序,并决定学习计算机科学以了解计算机的工作原理。当我不确定自己将来想做什么时,这对我来说是一篇很有影响力的文章。

我在布法罗郊区长大,在纽约会感到很孤独。虽然我很幸运,我父亲在大学里为了好玩而编写了一个 Apple II 程序(所以我应该有一些编程背景/黑客精神),但他对更现代的软件开发知之甚少。我喜欢电脑,也喜欢和它们一起玩,但我不知道电脑能做什么,甚至不知道在哪里可以了解更多关于它的信息。当搜索空间如此之大,并且有很多未知信息时,你甚至很难找到好的信息来源来学习。有能力选择好的信息来源需要一些现有的知识,如果没有经验丰富的人的指导,这可能会很困难。我认为现在互联网更加发达,情况可能会更好,但在某种程度上它

16 年后,我想写我自己版本的 How to Be a Hacker 来补充原始的 ESR 书,一定很有趣。我想在这篇文章中添加一些我 13 岁时想读的东西,并专注于其他我认为有帮助的东西。有很多关于编程和相关主题的文章试图说服你采用特定的编程语言、框架、操作系统或特定的编程方法。本文并未涵盖其中的许多领域,虽然我也提出了一些建议,但它们只是中庸之道。本文的主要目的是填补我真正想知道的那些在原始 ESR 文章中没有涉及的空白(所以你应该先阅读 ESR 文章)。

有很多东西要学

我记得当我刚开始的时候,我阅读文章和书籍,但不了解其中的很多行业术语——这很正常。起初看起来难以理解的事情,随着你接触到更多的东西,深入到你不理解的每一件事上,就会慢慢变得可以理解。这是继续阅读和度过这段艰难时期的好方法,当你不明白的时候查一下,并在可能的时候提出问题(ESR 也有一篇关于如何提出好问题的文章)。

每个人都会在某个时候第一次学习一些东西,然后慢慢积累,直到你掌握了基础知识。我记得一开始我不了解任何细节(例如:我不知道如何在终端中输入命令来运行它们,或者 cd 用于“更改目录”)。你从曝光中获得这些知识,你玩的越多,你得到的曝光就越多,你积累的知识和经验也就越多。如果你有幸与一群对软件感兴趣的人生活在一个地区,那么你将能够学得更快。

不要害怕你不理解的事情

学习新的和复杂的东西一开始通常很困难——如果感觉很容易,那么它可能是你已经知道的东西,或者它可能不会真正测试你的知识(阅读如何解决物理问题并认为“它是有意义的””,比使用刚刚学到的工具自己解决问题要容易得多)。感到吃力是一个好兆头——这意味着你真的在学习,一直专注于做,当你感觉好些时,你的学习会变得更容易。

我认为新手在这里甚至有一点优势:当你获得一点经验时,做你已经知道的事情会更容易,更舒服,而不是学习新东西。这可能会导致您陷入停滞期,您只是重复您已经知道如何做的事情,就像一个人只能在吉他上弹一首歌曲,而他总是弹同一首歌曲。对于新人来说,这一切都很难,但对于新人来说,这样做不应该是一个真正的选择。

第一次学习复杂的东西应该会感到有点痛苦——你应该习惯它,因为这是一件好事,意味着你正在成长。不要因为认为自己不够聪明而被吓跑。因为有很多东西要学习,有很多不同的路径要走(仅在计算机科学中,就有很多东西,比如计算机图形学、计算机安全、机器学习、算法、移动、网络、基础设施等分支),所以有让自己成长并走出舒适区学习新事物的心态至关重要。

学习编程 – 边做边学

仅仅通过阅读一本关于编程的书来学习编程就像仅仅通过阅读一本关于跳伞的书来学习跳伞。您可能需要阅读一本书(并且您需要从一开始就将其作为起点),但除非您同时编写小程序,否则您从中获得的东西是有限的。木匠通过建造东西变得更加熟练,作家通过写文章变得更加优雅,程序员通过编写代码变得更擅长编码。这并不意味着你不应该阅读,或者一本好书不能给你带来价值。但仅仅这样做很容易让你产生一个误解:你只是在那里读一本关于编程的书,而不是自己做任何事情,让人觉得它很容易阅读,也很容易做。然而,当你真正开始编程时,

我同意 ESR 的观点,Python 是一门很好的编程语言,还有一个很棒的学习网站,叫做 Learn Python by Hardship,它面向初学者,在教学过程中使用了一些练习。

一开始你会发现语法很难理解,当你开始学习的时候,很多时间都花在了语法上。因为每种编程语言都有不同的语法,所以它们看起来非常不同。当您开始掌握语法时,您将更多地关注有关如何解决问题以及使用哪些数据结构的一般知识。最终,您将相当擅长使用通用数据结构,然后您的注意力将转移到更高级别的抽象和更通用的设计或基础架构上,从而使软件开发更易于大规模或大规模管理。以后更容易改变。

在掌握了一门编程语言的语法并能够编写简单的程序之后,学习数据结构是接下来最重要的一步。《Cracking the Coding Interview》一书详细描述了一些核心数据结构(还包括一些示例问题)。令人困惑的是,不同的语言往往有不同的名称来实现相同的数据结构(例如,Python 将哈希表称为“字典”),但大多数语言都实现了一些核心数据结构,即使它们都有不同的名称.

故障排除或调试也是一项核心编程技能——你的大部分编程时间实际上是在调试,所以如果你喜欢调试你的代码,那可能是一个好兆头。当你必须四处寻找试图理解某事时,或者当你正在阅读的文档不起作用时,或者当你在你的环境中遇到一些意想不到的错误时,不要灰心,记住这是正常的,这也不是反射你的无能。

大多数软件都无法运行,并且经常存在未记录的错误、错误和难以纠正的琐碎问题。例如,Github 上的大多数开源项目都有某种构建系统来处理配置软件以运行。这将执行诸如引入依赖项(需要使用它的附加代码)之类的事情,以及执行任何必要的命令来实际运行它。如果您要在 Github 上下载一个有趣的项目并尝试运行它,那么您可能会在此过程中遇到很多意外错误,这些错误通常没有文档记录。

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

计算机实际上是如何工作的?

我记得当时很沮丧,因为我很难找到有关计算机实际工作方式的信息。我能找到的关于计算机的所有东西都使用了无用的过于简单的类比(例如,磁盘是“文件的壁橱”),我找不到任何能帮助我真正理解计算机工作原理的东西,如果你把我转移到过去,我真的可以解释如何构建计算机。这些是比软件更具体的电气或计算机工程,它们在帮助理解硬件方面仍然具有很大的价值(这很有趣!)。

我推荐的最好的书是 Charles Petzold 的 Code。它指导您从电子位,通过布尔逻辑和电路设计的历史,到简单电路的实际图形,以及位如何存储在内存中。这是根据发现的历史背景一步一步介绍给大家的知识,直到造出一个非常小的CPU。Charles Petzold 还学习了一些组装和基本的计算机图形学。他是一个非常有逻辑的作家和老师,所以这本书的细节令人惊讶地可读。

有关计算机的更多历史背景,我推荐 Mitchell Waldrop 的 The Dream Machines 和 Steven Levy 的 The Hackers。书中的叙述故事使学习和记忆更容易,我认为这些发现的背景有助于了解事物的实际运作方式。

图片[1]-为什么要写这篇文章?|博客文章分享-老王博客

软件工具:代码编辑器、编程环境

工具很有趣,了解你的工具是件好事,但你总是可以定制一些东西,并为无关紧要的小细节争论不休。自定义工具是刚起步时学习的一种有趣方式,但我见过人们在这方面花费大量时间,而且它产生的价值相对较小(这方面的一本好书是 Designing Data – 密集型应用程序)。过多地关注自定义工具会阻碍您。

不要太担心 Vim 或 Emacs 之类的工具,也不要太担心你使用的是什么操作系统——你可以在任何地方学习这些核心技能(这是我对 ESR 原始文章的最大分歧)。也就是说,玩 Linux 对我来说是学习如何进行故障排除的一种非常有价值的方式——主要是因为我的 Linux 运行不佳,我不得不花费数小时试图让无线互联网正常工作,让笔记本电脑成功挂起,甚至得到了出现的用户界面(现在好一点了)。

我开始尝试安装 Gentoo(实际上从来没有工作过)。这种故障排除技术对我获得现在的工作非常有帮助,所以如果你喜欢玩不同的操作系统,我肯定会鼓励你,我只是认为没有必要。不过,在 macOS 或 Linux 上学习可能更容易,因为大多数现有工具都是针对这些环境的,而且大多数程序员都使用这两种环境中的一种。

另一个值得一提的具体工具是版本控制,尤其是 git。花时间熟悉基础知识是值得的,但这可能只是在您编程一段时间后才需要注意的事情。

不要无休止地研究

在开始一个项目之前进行无休止的“研究”可能会导致项目拖延——阅读和探索可用的选项(研究)可能很有趣,花一点时间做这样的事情很好,但你也可能永远不会陷入困境像这样。如有疑问,只需选择一个已经存在一段时间并且最受欢迎的项目。使用这个项目,如果它很受欢迎,它可能有一个不错的社区,你可以从中学习,如果它存在一段时间,它可能会更稳定(或者至少它更加充实并且不太可能被放弃)。

计算机科学

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

编程面试

如果学习是获得好成绩的自然解决方案,那么做一个很酷的项目编程是在编码面试中取得好成绩的自然解决方案。为了在竞争激烈的公司进行编码面试,你需要非常熟悉 leetcode 网站和《Cracking the Coding Interview》一书中提出的编码问题。编码面试需要大量的练习,这是一项可以让你发展的独特技能。

您可以获得完整的计算机科学学位,但仍然不知道如何编程。你也可以在获得计算机科学学位的情况下仍然未能通过编程面试(这两个可能是默认设置)。学习编码,学习在编码面试中做得更好,你需要自己专注于这些事情。计算机科学学位可能有助于一些方向和重点项目(Lambda School 可能最终更适合开发程序员),但你必须自己掌握很多这方面的知识。

角色和职位

除了“软件工程师”之外,还有许多不同的角色。SRE(站点可靠性工程师)专注于代码运行的基础设施,并为其编写软件。内部工具和 devops 开发人员专注于自动化软件构建和测试所需的所有工具(请阅读 The Phoenix 项目以了解说明这一点的有趣故事)。除此之外,一些角色与用户有密集的交互,例如开发人员支持工程师(帮助用户解决 API、错误或配置问题的开发人员支持工程师)。也有专注于游戏引擎的角色,也有专注于虚拟现实或计算机图形的角色。一些角色专注于编写新的计算机语言和新的编译器。

在所有这些角色中,根据所使用的产品和用于解决新问题的新工具,有更多的专业化。计算机安全也是一个有趣的领域,我不太了解,我认为 ESR 在他的文章中淡化了它,但我认为这也是一个很难开始的地方,因为它需要知道如何破坏事物是基于对事物如何运作的已知理解。我记得我很早就开始阅读《黑客:剥削的艺术》,但当时我对该领域知之甚少。

当然,你也可以创办自己的公司,确立自己的创始人角色。

有很多东西要学(再次)

一辈子很长,专业不是永远,所以要深入不同的事情。您可以接触到很多新事物,并在此过程中获得乐趣。

奖励:社区

ESR 在他的文章中谈到了加入一个本地 Linux 用户组,但至少对我来说,当我阅读他的文章时,这并不现实,一方面是因为这个用户组真的没有那么多人,另一方面是因为我我太年轻了,不能开车,我自己也不能那么容易地去任何地方。有一些在线社区我觉得很有趣,我想我当时会觉得很有趣。

Hacker News:Ycombinator 的新闻网站(湾区的创业孵化器)。它的评论褒贬不一,但好在它真的很好要成为黑客需掌握多少语言,而且有很多业内人士都在。Paul Graham 和 Jessica Livingston 是 Ycombinator 的创始人,Paul 写过很多有趣的文章。

Twitter:很大程度上取决于你在关注谁,但如果你愿意,它可能是一个好地方。很难知道你应该开始关注谁要成为黑客需掌握多少语言,但你可以看到我从哪里开始。

少错:不是一个以编程为重点的社区,但理性社区和编程社区之间有相当多的重叠,我喜欢那里的很多文章,这绝对是我希望在发现如何做的时候找到的东西成为一名黑客。这是我非常喜欢的一个例子:Disputing Definitions

欢迎联系我

我有更多的文章和书籍,都链接在我自己网站的关于页面上。

我记得当我阅读他的文章时,ESR 回复了我发给他的关于让 iPod 在 Fedora Core 4 上运行的电子邮件,我很确定 Richard Stallman 当时回复了我的一些电子邮件。我认为这样做对初学者来说很好。本着以他们为榜样的精神,如果您愿意,请随时问我任何具体问题。

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论