这句话激励了古往今来的许多贫困生。今天,这句话用在那些自学成才的程序员身上也极为贴切。你知道吗?有很多知名的程序员并不是科班出身,而是自学成才的“野程序员”,比如比尔·盖茨。如果你不是专业出身的程序员,而是自学成才,如何提升自己?今天,让我们来听一听身在其中的马修·麦克唐纳分享的感想和经历。如果你是一个自学成才的程序员,你可能会遇到一些盲点。本文介绍如何检查和填补空白。如果您是一名开发人员,您可能有一个关于如何开始编程的故事,但我并不是说您是如何第一次学习编码的,尽管这个故事可能与本文的主题相关。重叠。我的意思是,当你第一次决定使用逻辑和软件指令来解决一个新问题时;当您决定将代码作为永久有用的工具放入工具箱时;决定成为一名真正的程序员。像大约三分之一的全职程序员一样,我的编程之路没有正式的计算机科学学位。但我是在鼓捣电脑长大的,伴随着传说中的QuickBasic和VB长大的,这些爱好在当时还是新鲜事物。我知道,无论我是否最终从事计算机行业,这个巨大的米色盒子都将以某种形式永远成为我生活的一部分。一部分。但是当我上大学的时候,我更感兴趣的是那些我认为我没有机会自学的科目,比如粒子物理学。但也许这不是一个坏主意,因为,好吧,我确实找到了通往专业编程的道路。当我在一个不太有趣的职位上工作时,我利用空闲时间学习并获得证书。没过多久,我就进入了一个全新的领域,一下子就着迷了,比如密码学、网络协议、数据库优化。当然,我也开始编写程序来填补我在公司工作中的空白,例如报告工具、订购工具和做不该做的事情的软件,比如依赖不稳定的ActiveX控件。不久之后,.NET出现了,我遇到了一些非常聪明的人,我有了难得的机会重塑自我,重新设置微软的精彩平台。剩下的就是历史了。作为一个自学成才的程序员,我很清楚我的基础并不完美。当然,也有没有受过正规教育的自学成才的软件传奇和黑客天才。但如果你不是神童,而是一个普通人,那么自学技能就带有一个巨大的“星号”(*)。有差距和盲点。对于许多自学成才的程序员来说,很难确定他们缺少哪些知识或技能。因此,我写这篇文章的初衷是为自学成才的开发者提供一个快速提升技能的指南。WhatYouDon'tKnowYouDon'tKnow自学编程最大的局限在于不知道自己不知道什么。是的,无知可能发生在任何人身上,即使是博士学位。但是由于自学成才的程序员坚持不懈地专注于构建网站、运行应用程序以及从A点到B点获取数据等实际目标,因此他们更容易跳过看似“愚蠢”的任务。”理论内容。这里有一些来自计算机科学核心的主题,自学成才的程序员往往会绕过:算法。因为编程语言实现了自己的排序和搜索,所以自学成才的程序员总是倾向于学习如何使用它们,而不是比了解它们是如何工作的。计算理论。它是关于计算机如何解决问题以及如何构建编程语言的科学。从有限状态机到Λ演算,这一类别中有一大堆重量级的主题。纯数学。传统的计算机科学涵盖了广泛的重要数学主题,包括线性代数、微积分、概率论和统计学。大〇表示法(BigOnotation)。这个工具,改编自数学领域,允许开发人员描述和比较不同算法的综合表现。当然,这并不是说自学程序员不能自学这些课程。只是很难当有另一个新的JavaScript框架需要处理时,让自己投入到理论中。而且,由于自学成才的程序员专注于动手项目和工作代码,他们甚至可能没有意识到实际代码表面下的理论“冰山”。缩小计算机科学理论差距虽然计算机科学理论可能不会立竿见影,但它确实有其他好处,尽管不太明显。事实上,在适当的时候,前面列表中所有看似深奥的主题都可能变得至关重要:算法。有时默认选择并不是最佳选择。如果你有更深刻的理解,你就会知道什么时候该走开,或者如何解决一个不寻常的问题。BridgingtheGap:ReadAlgorithmsinaNutshell(《果壳中的算法》http://shop.oreilly.com/product/9780596516246.do),这是我最喜欢的书之一,也可以去可汗学院转一转。计算理论。大多数程序员永远不会构建自己的编程语言(尽管您可以)。但是计算理论为您提供了抽象概念,可以帮助您理解不同语言之间的联系。如果您需要从过程编程语言切换到函数式编程语言,一旦掌握了计算理论,您会发现这样做特别方便。弥合差距:这是可能难以自学的领域之一,但您可以通过免费的虚拟教室学到很多东西。NesoAcademy有我最喜欢的关于这个主题的讲座系列(https://www.youtube.com/playlist?list=PLBlnK6fEyqRgp46KUv4ZY69yXmpwKOIev),其中包含100多个短视频。讲座很深入,但每期只需十分钟即可阅读。纯数学。许多程序员一生中从未接触过高等数学,甚至在退休后也从未接触过。但是,如果您正在从事机器学习、自然语言处理、数据分析或软件开发前十几个其他主题中的任何一个,硬数学仍然是必须的。ClosingtheGap:如果你准备好亲自动手,请从非常容易获得的《程序员的数学入门》(《程序员数学指南》https://pimbook.org/)开始,这是一种按需付费的下载方式.释义:Paywhatyouwant(PWYW)是一种定价策略,其中卖家为他们想要的东西付费——有时是免费的。产品可能会设定最低价格和/或指导性建议价格,买家也可以支付更高的价格购买。大〇符法。要成为一名高效的开发人员,拥有一个可以用来与同行交流的速记工具是必不可少的。虽然您不会经常使用大〇表示法(可能永远不会),但如果您需要讨论如何优化复杂的分布式系统,它可能会派上用场。弥合差距:大〇记法简单易学。您可以在此处找到一个很好的概述(https://rob-bell.net/2009/06/a-beginners-guide-to-big-o-notation/)。我有一些好的建议给你。如果你是一个自学成才的程序员,花一些时间(比如5%)来研究更多的理论主题。只需使用上面列表中的链接。即使您在日常工作中不需要这些知识,它也会开阔您的视野,培养您的好奇心,并帮助您了解计算机科学的一些更深层次的奥秘。毕竟,正如每个经验丰富的程序员都知道的那样:除非你使用理论,否则你永远不会使用它。你的信心在哪里?也许计划计算机教育的最重要的好处不在于您了解计算机科学的内容,而在于您如何看待自己。无论是自学成才还是正规教育的程序员,刚进入职场时,都会存在知识鸿沟。但自学成才的程序员更容易心有余悸:害怕自己的技能不完整或不合理。他们还担心有些事情他们应该知道但从未用谷歌搜索检查过。他们还担心其他语言和计算理论的核心知识。同样令人惊讶的是,他们担心发音,认为以错误的方式告诉编码员行话会使他们暴露为江湖骗子。经常强调的词包括技术(SQL、ECMAScript、JSON、Wasm)、技术术语(贝叶斯、元组),甚至符号(#!,或“hashbang”)。然而,自我怀疑并不全是坏事,毕竟它可以驱使你去寻求新知识,不是吗?但是,当您需要向客户、同事或潜在雇主表明自己是程序员时,这些不安全感可能会伤害您。解决这些问题的最佳方法是尽可能多地进行对话。您无法研究软件开发的每条途径,但可以通过与尽可能多的不同类型的程序员互动来拓宽视野。下面,我提供一些建议:参加当地的聚会。这些聚会不像编程马拉松那么吓人(尽管它们也很棒),而且您还会发现经验丰富的程序员出奇地渴望社交和分享他们的知识。参加会议。如果您负担得起,没有什么比围绕您感兴趣的主题组织的面对面会议更能捕捉到新技术带来的兴奋了。这就像软件框架中的快速约会。也可以通过“感受房间的温度”来“感受房间的温度”。(译注:指参加会议等)学到很多——换句话说,对演讲和研讨会的回应可以帮助你判断哪些技术背后有社区热情,哪些新项目可能蓬勃发展。加入开源项目。门槛更高:你必须实际编码,而不仅仅是喝咖啡和听音乐,但回报是巨大的。即使在结构化环境中的一个简单项目中与其他程序员进行交互,也可以训练您从十几个不同的角度查看一段代码。作为一个附带的好处,网络对你的职业前景的影响远远超过建立一个同类最佳的投资组合网站。所有编程都倾向于自学成才对专业程序员的调查表明,自学成才的程序员仍然是少数。但是如果换一种方式来提问,情况就不一样了。例如,以HackerRank调查为例,该调查发现自学和仅在学校学习的开发人员占所有程序员的比例略低于三分之一。而正规学习和自学相结合的开发者比例超过两者,占比接近38%。这并不奇怪。在瞬息万变的软件开发世界中,每一个程序员都离被淘汰只有一步之遥。最成功的程序员是那些能够不断自学的人。正规的计算机科学教育是一个优势。但自我提升的能力也是必不可少的。这就是自学成才的程序员的回报。这并不是说受过正规计算机科学教育的程序员不能自学。但是自学成才的程序员面临着严峻的考验:他们一无所有,带着好奇心和赤裸裸的野心投入其中,并学习他们需要的东西。这项技能将在您的整个职业生涯中得到回报。关于作者:MatthewMacDonald,教师,程序员,重书作者。
