黑客雇佣平台(如何处理黑平台不出款)当我十三岁开始上高中的时候,我读了ESR写的这篇博客文章:如何成为一名黑客。这篇文章让我了解了程序员们一起在互联网上构建东西的社区,这让我很兴奋。我试着开始着手安装Fedora Core 4,最终安装成功了Ubuntu 6.06,通过这一过程,我自己学到了很多关于故障排除的知识,并且努力尝试着让系统真正工作起来。这个过程对于培养帮助我获得现在这份工作的技能至关重要。我读了关于Python的书,写了一些小程序,然后决定学习计算机科学,了解计算机是如何工作的。在我不确定自己将来想做什么的时候,这对我来说是一个相当有影响力的文章。 在布法罗郊区长大的我,在纽约可能感到相当孤独。虽然我很幸运,我父亲在大学里因为好玩而编写了一个Apple II程序(所以我应该有一些编程背景/黑客精神),但他对更现代的软件开发知之甚少。我喜欢电脑,也喜欢玩电脑,但我不知道什么是计算机可以做到的,甚至不知道在哪里可以了解更多计算机知识。当搜索空间如此之大,并且有许多未知的信息时,你甚至很难找到好的信息来源来学习。有能力选择好的信息来源需要一些现有的知识,如果没有经验丰富的人的指导,这可能会很困难。我认为,现在互联网更发达,情况可能会更好,但在某种程度上说,现在比过去可能更加困难,因为有更多的选择需要筛选。 16年后,我想写我自己的版本的《如何成为一名黑客》,来对ESR的原著进行补充,这一定是件很有趣的事。我想在这篇文章加入那些我在13岁时想读到的一些东西,并且重点关注那些我觉得很有帮助的其他内容。现在很多关于编程及其相关主题的文章都在拼命鼓噪,试图说服你采用特定的编程语言、框架、操作系统、或者特定的编程方法。本文在这些方面着墨不多,尽管我也提出了一些建议,但它们只是一些温和的观点。本文的主要目标是填补那些在ESR的原始文章未曾触及而我非常想了解的空白(所以你应该先读ESR的那篇文章)。 要学习的东西有很多 记得在刚开始的时候,我读过一些文章和书,但对其中的很多行业术语不甚理解 - 这很正常。随着你接触到了更多的事情,并深入到每一件你不理解的事情中去,那些一开始看起来不可理解的事情会慢慢变得可以理解。保持继续阅读并且挺过这段艰难时期是很好的方法,当你不理解的时候就去查找,当你可以提问的时候就去问问题(ESR也有一篇关于如何问好问题的文章)。 每个人都会在某个时候第一次学到一些东西,然后这些东西就会慢慢地积累起来,直到你掌握了那些基本知识为止。我记得一开始我不懂任何细节(比如:我不知道如何在终端中输入命令来运行它们,或者cd代表"change directory")。你从接触中获得这些知识,你玩得越多,你接触得就越多,你积累的知识和经验也就越多。如果你有幸生活在一个地区有一群对软件感兴趣的人,你就能够更快地学习。 不要害怕你不理解的事情 学习一些复杂的新事物开始时往往会感到困难 - 如果感觉很容易,那么它可能是你已经知道的东西,或者它可能不是真正考验你的知识(阅读如何解决一个物理问题并认为"它很合理",比你自己用刚刚学会的工具解决一个问题要容易得多)。感觉吃力是个好现象 - 这意味着你真的在学习,集中精力一直坚持做下去,当你感觉变好的时候你的学习就会变得更容易。 我认为,一个新人在这方面甚至有一点优势:当你积累了一点经验后,只做你已经知道怎么做的事情,而不是学习新的东西,会让你感觉容易和舒适。这会导致你陷入一个停滞期,在那里你只是重复做你已经知道怎么做的事情,就像一个人只能用吉他弹一首歌,并且他总是弹同一首歌一样。对于一个新人来说,一切都很难,但这样做不应该是一个新人真正的选择。 第一次学习一些复杂的东西应该会感觉有点痛苦 - 你应该习惯这种感觉,因为这是件好事,意味着你在成长。不要因此觉得自己不够聪明而被吓跑了。因为有太多东西要学,有太多不同的途径要走(仅就计算机科学来说,就有很多东西,像计算机图形学、计算机安全、机器学习、算法、移动、网络、基础设施等等分支),所以有一个让自己成长并走出舒适区去学习新事物的心态是至关重要的。 学习编程 - 边做边学 仅仅通过阅读一本关于编程的书来学习编程,就像仅仅通过阅读一本关于跳伞的书来学习跳伞一样。你可能需要读一本书(而且在开始的时候你需要用它作为一个起点),但是除非你同时也在写一些小程序,否则你从中得到的有限。木匠通过建造东西来使技术变得更熟练,作家通过撰写文章来使文笔变得更优美,而程序员则通过编写代码来提高编码水平。这并不意味着你不应该读书,也不意味着一本好书不能给你带来价值。但是仅仅这样做会很容易让你陷入一个误区:你只是在那里读关于编程的书而不是自己做任何事情,会让你觉得读起来容易,做起来也容易。然而,当你真正开始编程的时候,你会发现凭空想象出来一些程序是很困难的。 我同意ESR的观点,Python是一种很好的作为编程起点的语言,而且有一个很好的学习网站,名为苦学Python,专门针对初学者,并在教学过程中使用一些练习。 一开始,你会觉得语法很难理解,当你开始学习的时候,很多时间都花在了语法上。因为每种编程语言都有不同的语法,它们看起来非常不同。当你开始掌握语法后,你更多的精力就会放在关于如何解决问题和使用什么数据结构的通用知识上。最终,你对于使用常见的数据结构已经相当娴熟,然后你的重点将会转向更高层次的抽象和更通用的设计或基础架构,这些设计或基础架构使得软件开发更易于在规模上管理或在将来更易于更改。 在掌握了一门编程语言的语法并且能够编写简单的程序之后,学习数据结构是最重要的下一步。Cracking the Coding Interview这本书对一些核心的数据结构有很详细的描述(并且还附带有一些示例问题)。令人困惑的是,不同的语言在实现相同的数据结构时往往有不同的名称(比如,Python称哈希表(hash table)为‘字典( dictionary)’),但大多数语言都会实现一些核心数据结构,即使它们都有一个不同的名称。 故障排除或调试也是一项核心编程技能 - 大多数编程时间实际上都是在调试,因此,如果你喜欢调试代码,这可能是一个好现象。当你不得不到处搜索以试图理解某件事情,或者当你正在阅读的文档不起作用,或者当你在环境中遇到一些意外错误时,不要气馁 ,记住这是正常的,而且这也不是你能力低下的反映。 大多数软件都不工作,而且经常有未记录的error、bug和一些难以纠正的琐碎问题。例如,Github上的大多数开源项目都有某种构建系统,用于处理将软件配置为运行的问题。这将执行诸如拉入依赖项(需要与之配合工作的其他代码)之类的操作,以及执行任何必要的命令来实际运行它。如果你要在Github上下载一个有趣的项目并尝试运行它,你可能会在这个过程中遇到很多意外的错误,而这些错误通常没有文档记录。 运行时遇到这些错误并且将问题解决是很正常的事情,经验丰富的程序员也必须处理这些问题(如果幸运的话,我们以前也见过这种类型的问题)。我见过有人遇到这样的错误,并且认为自己做错了什么,但实际上错不是你,而是编程就是这样的过程。围绕着构建系统并试图使其更好,有很多相互竞争的工具甚至行业(这可能会使初学者更加困惑,因为没有真正的标准化,并且配置软件使之运行的正确方法也因为编程环境和语言的不同而各不相同)。 计算机实际上是如何工作的? 我记得那时我很沮丧,因为我很难找到关于计算机实际工作方式的信息。我能找到的关于计算机的一切都是用毫无用处的过于简单的类比(比如,磁盘是"存放文件的柜子"),我找不到任何我可以阅读并且帮助我真正理解计算机是如何工作的,并且如果把我转移到过去,我就能真正解释如何构建出一个计算机的东西。这些是比软件更具体的电子或计算机工程,它们在帮助理解硬件方面仍然有很多价值(这很有趣!)。 我愿意推荐的最好的书是Charles Petzold撰写的《Code》。它引导你从电子位开始,一直到布尔逻辑和电路设计的历史,再到简单电路的实际图形,以及如何将位存储在内存中。这是知识依照发现的历史背景一步步地介绍给你,直到构建出一个真正的小CPU。Charles Petzold还学习了一些汇编和基本的计算机图形学。他是一个逻辑非常清楚的作家和老师,所以这本书的细节具备令人惊讶的可读性。 关于计算机的更多的历史背景,我推荐Mitchell Waldrop的《梦幻机器》和Steven Levy的《黑客》。书中的叙述性的故事使学习和记忆更容易,我认为这些发现的背景有助于学习事物的实际工作方式。 软件工具:代码编辑器,编程环境 工具是有趣的,了解你的工具是件好事,但是你可以永远定制一些东西,争论一些无关紧要的小细节。当你刚开始的时候,定制工具是一个有趣的学习方式,但是我看到人们花了大量的时间在这个上面,与实际编写解决问题的程序或者学习更多的通用编程技巧相比,它产生的价值相对较小(关于这点的一本很好的书是设计数据密集型应用程序)。过于专注于定制工具会束缚你前进的脚步。 不要太担心Vim或Emacs之类的工具,也不要太担心你正在使用何种操作系统 -你可以在任何地方学习这些核心技能(这是我与ESR原始文章的最大分歧)。也就是说,玩Linux对我来说是一个非常有价值的学习故障排除的方法 - 主要是因为我的Linux没有很好地工作,我不得不花上几个小时来尝试让无线互联网正常工作,让笔记本电脑成功挂起,甚至让用户界面出现(现在情况稍微好一点)。 我开始尝试安装Gentoo(实际上从未成功)。这种故障排除技巧对于我获得现在的工作非常有帮助,所以如果你喜欢玩不同的操作系统,我肯定会鼓励你,我只是不认为这是必要的。不过,在macOS或Linux上学习可能更容易,因为大多数现有的工具都是针对这些环境,而且大多数程序员都在使用这两种工具中的一种。 值得一提的另外一个特定工具是版本控制,特别是git。花点时间熟悉其基本知识是值得的,但它可能是在你编程一段时间之后才需要关注的东西。 不要没完没了地研究 在开始一个项目之前,进行没完没了地"研究"会导致项目容易拖延 - 阅读和探索可用的选项(研究)会很有趣,花一点时间做一点这样的事情会很好,但你也可能永远被困在这样的事情中。当有疑问的时候,只需选择一个已经开始了一段时间并且最受欢迎的项目。使用这个项目,如果它很受欢迎,它可能有一个像样的社区,你可以向它学习,如果它存在一段时间,它可能会更稳定(或者至少它会更充实,不太可能被抛弃)。 计算机科学 我真的很喜欢学习计算机科学,并且认为这可能仍然是获得最大机会的最佳途径(尤其是如果你像我一样住在郊区,周围没有很多软件人员的话)。如果可能的话,我认为尝试学习最好的计算机科学课程是很好的。网上也有很多好的课程,但是如果你的生活和我高中时一样,在家里很难真正利用这些。 编程面试 如果说学习是获得好成绩的天然解决方案,那么做好一个酷项目编程就是在编程面试中表现出色的天然解决方案。要想在竞争激烈的公司的编程面试中处于有利地位,你需要对leetcode网站上和Cracking the Coding Interview这本书中提到的编程问题非常熟悉。编程面试需要大量的实践,并且它是一个可以让自身能力得以发展的独特技能。 你可以获得一个完整的计算机科学学位,但仍然不知道如何编程。你也可以获得一个计算机科学学位,但仍然不能通过编程面试(这两个可能是默认情况)。学会编程,学会在编程面试中做得更好,你需要自己集中精力在这些方面。计算机科学学位可能有助于一些方向和重点项目(Lambda School可能更适合培养编程人员,也许最终会更适合),但你必须自己掌握很多这方面的知识。 角色和职位 除了"软件工程师"之外,还有很多不同的角色。SRE(网站可靠性工程师)关注代码运行的基础设施,并为其编写软件。内部工具和devops开发人员专注于自动化软件构建和测试所需的所有工具(阅读The Phoenix Project,了解一个有趣的故事来说明这一点)。除此之外,有些角色和用户有密集的交互,如开发者支持工程师(developer support engineer)帮助用户处理API、解决bug或配置问题)。还有些角色重点关注游戏引擎,有些角色重点关注虚拟现实或计算机图形。有些角色则关注编写新的计算机语言和新的编译器。 在所有这些角色中,根据使用的产品和使用的为解决新问题而创建的新工具的不同,有更多的专业化。计算机安全也是一个有趣的领域,对此领域我所知不多,并且我认为ESR在他的文章中对此是持轻视态度的,但我认为它也是一个很难开始的地方,因为它需要对事物是如何工作的已知理解的基础上才能知道事物是如何被打破的。我记得我很早就开始读Hacking: The Art of Exploitation这本书,但当时我对这个领域还是一知半解。 当然,你也可以创办自己的公司,建立自己的创始人角色。 还有很多东西要学(再来一次) 一辈子是很长的一段时间,而专业化并不是永远的,所以要深入到不同的事物中去。你可以接触很多新事物,一路玩得开心。 奖励:社区 ESR在他的文章中谈到加入一个本地Linux用户组,但是至少对我来说,当我读到他的文章的时候,这是不现实的,一方面是因为这个用户组真的没有那么多人,另一方面是因为我太小了不能开车,我自己也没法那么容易地到达任何地方。有一些在线社区我觉得很有趣,如果换在那时我想我也会觉得很有趣。 Hacker News:Ycombinator的新闻网站(海湾地区的创业孵化器)。对它的评价有好有坏,但好处在于它确实很好,很多业内人士都在那里出现。Paul Graham和Jessica Livingston是Ycombinator的创始人,Paul写了很多有趣的文章。 Twitter:很大程度上取决于你在关注谁,但如果你想的话,它可以成为一个好地方。很难知道你应该从谁开始关注,但你可以看看我从谁开始关注。 Less Wrong:不是注重编程的社区,但是理性社区和编程社区之间有相当多的重叠,我喜欢那里的很多文章,这肯定是我在发现如何成为黑客的同时,希望找到的东西。这里有一个我非常喜欢的例子:Disputing Definitions 欢迎联系我 我有更多的文章和书,都链接在我自己网站的about网页上。 我记得在我读到他的文章时,ESR回复了我发给他的一封关于让iPod在Fedora Core 4工作的邮件,我很确定Richard Stallman也回复了我当时发的一些邮件。我觉得那样做对初学者来说很好。本着以他们为榜样的精神,如果你愿意的话,请随时向我提出任何具体的问题。