浅论自学成才的程序员如何提高自我_java

策划 | 刘燕作者 | Matthew MacDonald译者 | Sambodhi编辑 | LindaAI 前线导读:有事者,事竟成;破釜沉舟,百二秦关终归楚;苦心人,天不负;卧薪尝胆,三千越甲可吞吴。这句话,古今往来不知道激励了多少寒门学子。在今天,这句话用在那些自学成才的程序员身上,也是极其合适的。你知道吗?有很多著名的程序员,其实并不是科班出身,而是靠自学成才的半路出家的“野生程序员”,比如 Bill Gates。如果你不是科班出身的程序员,而是靠自学成才的,那么该如何提高自身呢?今天,我们来听听过来人 Matthew MacDonald 分享的心得和经验。

更多优质内容请关注微信公众号“AI 前线”(ID:ai-front)

如果你是自学成才的程序员,可能会遇到一些盲点,本文为你介绍了如何查漏补缺的方法。

如果你是一名开发人员,你可能会有一个如何走上编程之路的故事,但我并不是指你第一次是如何学会编写代码的故事,尽管这个故事可能与本文要讲的内容有所重叠。我的意思是,当你第一次决定用逻辑和软件指令来解决一个新问题的时候;当你决定将代码作为永久有用的工具放入你的工具箱的时候;事情转变的那一刻,你决定成为一名真正的程序员。

我的编程之路,与大约 三分之一 的专职程序员一样,并没有正式的计算机科学学位。但我从小就喜欢鼓捣电脑,是传奇的 QuickBasic 和 VB 伴着我长大的,而这些爱好在当时,仍然是一种新奇的事物。我知道,不管我最终是否会进入计算机领域,这个巨大的 米色盒子(译注:所谓的米色盒子,就是个人电脑主机,当时主机体积比今天大得多)将会以某种形式,永远成为我生活的一部分。但在我上大学的时候,我更感兴趣的是学习那些我自认为并没有机会自学的课程,比如粒子物理。

但也许这并不是一个坏主意,因为,我确实找到了一条通往专业编程的道路。当我在一个不那么有趣的岗位上工作时,我就利用空闲时间来学习和考取证书。不久之后,我就进入了一个全新的领域,并突然为之着迷,比如密码学、网络协议和数据库优化等。当然,我也开始编写程序来填补我在公司工作中的空缺,比如报告工具、订购工具,以及可以完成本不该做某些事情的软件,比如依赖不稳定的 ActiveX 控件。不久之后,.NET 出现了,我遇到了一些 非常聪明的人,并且难得有机会重塑自己,并重置了 Microsoft 出色的平台。剩下的就是历史了。

作为一名自学成才的程序员,我很清楚我的基础并不完美。当然,也有未受过正规教育而自学成才的 软件传奇人物 和 黑客天才。但是,如果你不是神童,而是一个普通人的话,那么自学技能就会伴随着一个巨大的星号”(*)。有差距,也有盲点。对于许多自学成才的程序员来说,他们很难确定自己到底缺少了哪些知识或技能。因此,我写下本文的初衷,就是为那些自学成才的开发人员提供提高技能的快速指南。

你不知道哪些事情你还不知道

自学编程最大的局限性就是,你不知道哪些事情你还不知道。是的,无知确实会发生在任何人身上,哪怕他拥有博士学位。但是,由于自学成才的程序员会坚持不懈地专注于实际目标,如建立网站,让应用程序运行,将数据从 A 点传到 B 点,因此,他们更容易跳过那些看上去 “没什么大用”的理论内容。

以下是一些来自计算机科学核心的话题,而自学成才的程序员往往会绕过这些话题:   

  • 算法。 因为编程语言实现了它们自己的排序和搜索,所以自学成才的程序员总是倾向于学习如何使用它们,而不是去了解它们的工作原理。

  • 计算理论。 这是关于计算机如何解决问题,以及编程语言如何构建的一门科学。从有限状态机到 Λ 演算,在这一类中,有一大堆重量级的主题。

  • 纯数学。 传统的计算机科学涉及范围广泛的重要数学主题,包括线性代数、微积分、概率论和统计学。

  • 大〇符号法(Big O notation)。 这个改编自数学领域的工具,让开发人员能够描述并比较不同算法的整体性能。

当然这并不是说,自学成才的程序员就不能自己学习这些课程了。只是,当有另一个新的 JavaScript 框架需要解决的时候,你就很难将自己投入到理论中去。而且,由于自学成才的程序员专注于实践项目和工作代码,他们甚至可能没有意识到实际代码表面下的理论“冰山“。

缩小计算机科学理论差距

虽然计算机科学理论可能不会有立竿见影的效果,但它还是有其他好处的,只不过没有那么明显罢了。实际上,前面列表中所有看似深奥的主题,在适当的时候可能都是至关重要的:   

  • 算法。 有时候,默认选择并非最佳选择。如果你有更深刻的理解,你就会知道什么时候该走出老路,或者如何解决一个不寻常的问题。

缩小差距阅读 Algorithms in a Nutshell(《果壳中的算法》http://shop.oreilly.com/product/9780596516246.do),这是我最喜欢的一本书,或者你可以去可汗学院( Khan Academy)转一转。    

  • 计算理论。 大多数程序员永远不会去构建自己的编程语言(虽然 你可以这么做)。但是计算理论为你提供了抽象概念,帮助你理解不同语言之间的联系。如果你需要从过程式编程语言转到函数式语言,那么你就会感到掌握计算理论后,完成这一过程特别方便。

缩小差距这个是很难自学的领域之一,但你可以通过免费的虚拟教室来学习很多东西。Neso 学院就有我最喜欢的关于这一主题的 系列讲座(https://www.youtube.com/playlist?list=PLBlnK6fEyqRgp46KUv4ZY69yXmpwKOIev),有 100 多个小视频。这些讲座讲得很深入,但每期只需十分钟就能看完。   

  • 纯数学。 许多程序员在生活中,甚至到退休的时候,连一行高等数学都没有接触过。但是,如果你正在从事机器学习、自然语言处理、数据分析或软件开发前言的十几个其他主题中的任何一个,那么硬数学还是必不可少的。

缩小差距如果你已准备好动手,可以从非常容易理解的 A Programmer’s Introduction to Mathematics(《程序员数学指南》https://pimbook.org/)这本书开始,这是随你付的下载版本。

译注: 随你付,Pay what you want (PWYW)是卖家按所望付费 —— 有时也含免费 —— 的定价策略。商品或设最低价和 / 或指导建议价,买家也能出更高价购买。   

  • 大〇符号法。 要成为一名高效的开发人员,一定要有一种可以用来与同行交流的速记工具。虽然你不会经常使用大〇符号法(也许永远不会用上),但如果你需要讨论如何优化复杂的分布式系统,它可能就会派上用场了。

缩小差距: 大〇符号法很好学。你可以在 这里(https://rob-bell.net/2009/06/a-beginners-guide-to-big-o-notation/) 找到一个不错的概述。

我为你提供一些好建议。如果你是自学成才的程序员,那就抽点时间(比如 5%)去研究更多的理论性课题。就用上面列表中的链接即可。就算你在日常工作中用不着这些知识,但它也能拓宽你的视野,培养你的好奇心,并帮助你理解计算机科学中一些更深层次的奥秘。毕竟,正如每个经验丰富的程序员都知道的那样:除非你去使用理论,否则你永远不会去使用。

你的信心何在?

规划计算机教育的最重要好处,可能并不在于你学到了哪些关于计算机科学的知识,而是在于你学会了如何看待自己。

无论是自学成才的程序员,还是受过正规教育的程序员,当他们刚进入职场时,都会存在知识差距。但是,自学成才的程序员更可能会感受到一种挥之不去的恐惧:担心他们的技能不完整或不合理。他们还担心,有些事情他们应该知道,但却从来没有通过 Google 搜索核实过。他们还担心其他语言和计算理论的核心知识。还有一件令人惊讶的事是,他们居然还担心发音的问题,认为用错误的方式来讲述编码器行话时会暴露出他们是 “江湖骗子”。通常强调的词汇包括技术(SQL、ECMAScript、JSON、Wasm)、技术术语(贝叶斯、元组),甚至是符号(#!、或  “hashbang”。)。

然而,自我怀疑并不全是坏事,毕竟,它可以驱使你去寻找新的知识不是?但是,当你需要向客户、同事或潜在雇主表明自己是程序员时,这些不安全感可能会伤害到你。

解决这些问题的最好办法就是参与尽可能多的对话。你不可能研究软件开发的每一条途径,但你可以通过与尽可能多的不同类型的程序员打交道来拓宽你的视野。下面,我提供了一些建议:   

  • 参加当地聚会。 这些聚会没有黑客马拉松那么令人生畏(尽管这些也很棒),而且你还会发现,经验丰富的程序员出人意料地如此渴望社交和分享他们的知识。

  • 参加会议。 如果你能负担得起,没有什么比围绕你感兴趣的主题组织的面对面会议更能抓住新技术的兴奋点了。这就好比软件框架下的快速约会一样。你还可以通过 “感受房间的温度”。(译注:指参加会议之类)学到很多东西——换句话说,对演讲和研讨会的反应可以帮助你判断哪些技术背后有社区热情,哪些新项目可能会蓬勃发展。

  • 加入开源项目。 这个门槛就更高了:你必须真正地编写代码,而不仅仅是喝咖啡和听音乐,但带来的回报是巨大的。在结构化的环境中,哪怕是一个简单的项目,与其他程序员进行交互,也能够训练你从十几个不同的角度来看待一段代码。

作为附带的好处,人脉关系网对你职业前景的好处远超于建立一个最好的投资组合网站。

所有编程都趋向于自学

对专职程序员的调查表明,自学成才的程序员始终是少数。但换一种方式来提个问题,情况就不同了。

例如,以 Hacker Rank 的调查为例,它发现了这么一种现象:自学成才和只在学校接受教育的开发人员,在所有程序员中所占比例都略低于三分之一。但是,将正规学习和自学结合起来的开发人员的比例反而超过了这两者,占到了近 38%。

浅论自学成才的程序员如何提高自我_java_02

这并不奇怪。在瞬息万变的软件开发世界中,每个程序员都离淘汰只有几步之遥。最成功的程序员,都是那些能够不断自学的人。

正规的计算机科学教育是一种优势。但自我提高的能力也是必不可少的。

这就是自学成才的程序员的收获。这并不是说,有正规计算机科学教育背景的程序员就没有自学的能力。但自学成才的程序员已经面临着一场严峻的考验:他们一无所有,就一头扎进去,拥有的只是好奇心和赤裸裸的野心,就学会了他们需要的东西。这项技能,将会为你的整个职业生涯带来回报。