成为任何语言的危险人物的9步计划
无论任职期限如何,学习一门新语言就像攀登一座新山。新的挑战、陌生的领域,以及一个等待你去探索的社群,都等待着你!
学习一门新语言的原因有很多,包括(但不限于):
- 您刚刚开始编程。
- 您对一门新语言有个人兴趣。
- 工作或学习需要你学习一门新的语言。
- 您希望构建一种需要另一种语言或以另一种语言最好支持的新技术。
在今天的帖子中,我们将讨论我在不断投入语言学习艺术的过程中学到的一些经验教训。
我有什么资格成为这方面的专家?
我当然不认为自己是这个领域的专家,也不认为自己对所有投入生产的语言都同样精通。我只是因为一些我认为与其他人息息相关的原因,不得不学习各种语言而已。
到目前为止,我的语言学习历程是这样的:
- 从大学开始,我被要求在不同阶段(取决于专业)学习 Java、Python、C、C#、C++、R、Assembly 和 Haskell。学习这些语言并非出于个人选择,而是出于学习要求。
- 我在大学期间的第一份工作是 iOS 开发。这份工作最初需要学习 Objective-C,后来又学习了 Swift。
- 我大学毕业后的第一份工作是 Web 开发。那时候,这意味着我必须掌握 JavaScript 和 PHP 语言。这份工作持续了好几年。
- 在 Culture Amp 开始我目前的工作时,我有时不得不用 Ruby、Elixir、Elm、ReasonML 和 Kotlin 来编写代码。现在或许也该说一下,这些都不是我的强项,但在我短暂的任职期间,它们确实是必需的。
- 我个人对学习 Golang 和 Rust 很感兴趣,因为,让我们面对现实吧,Rust 非常棒,而 Golang 很容易上手,对于我个人项目中的一些 Web 服务器工作来说,它是一个很好的替代方案。
以上内容不包括我在此过程中必须学习的其他 DSL 或语言超集(即 TypeScript)。
为了避免任何人感觉自己像个冒名顶替者,我觉得此时还需要披露一些重要的事情:
- 我并非编程高手。我对各种语言的掌握程度参差不齐。有些语言在我看来仍然非常弱,但是为了某个特定项目或短期内完成某件事,我掌握了相当多的语言。
- 我坚信“用进废退”的道理。我早期或许在 Objective-C 这样的语言上花了不少时间,但如果你现在让我写一个“Hello, World!”的例子,我首先会去谷歌搜索或者翻阅我的笔记。没错,如果你以前学过,可以很快地重新学起来,但记忆是会出错的,没有人会把醒着的每一刻都花在练习那些不再使用的语言上——尤其是在生活有那么多美好事物可以享受的时候。
起初,我是一个努力学习一门语言的人。现在,我已经是一个能够按照特定的模式去理解一门语言的人了。
希望这些课程能够对您的旅程有所帮助。
全心全意遵循帕累托原则
这第一个技巧只是我学习一门新语言时最核心的原则。正如我们最好的朋友维基百科所解释的那样:
帕累托原则(也称为 80/20 规则、关键少数定律或因素稀疏原则)指出,对于许多事件而言,大约 80% 的结果来自 20% 的原因。
当谈到学习语言时,我将这一原则解释为“掌握一门语言的 20% 就相当于实现了你希望用该语言实现的目标的 80%。”
这意味着你不必成为一门新语言的专家。如果你想成为小组里的下一位专家,那太好了。我认识一些在各自领域非常优秀的人。
我个人很喜欢这句箴言:“样样精通,样样松散,但往往胜过样样精通”。在编程的过程中,你会发现并非每种语言都能做到所有的事情。
我确实认为有两种语言可以为您做很多事情,但我会在最后谈到这一点。
把首要原则放在首位
虽然这篇文章不会深入探讨第一原则,但它应该是您用来理解语言设计选择的核心。
以下是我的开发者笔记网站中值得思考的一些原则:
- SOLID - 单一职责原则、开放-封闭原则、里氏替换原则、接口隔离原则、依赖倒置原则
- KISS——保持简单愚蠢
- DRY-不要重复自己
- YAGNI——你不需要它
- 组合 > 继承
- 关注点分离
- 避免过早优化
- 重构 重构 重构
- 干净的代码 > 聪明的代码
- 奥卡姆剃刀——收益大于成本吗?
- 最小惊讶原则——命名不应该让人对其功能感到意外
- 迪米特法则——在各个类别之间划分责任
虽然我不会在这里深入探讨它们,但它们绝对值得一读,并且值得你亲自挑战它们。
熟悉该语言的文档
“给我六个小时砍倒一棵树,我会花前四个小时磨斧头。”
亚伯拉罕·林肯曾说过这样的话,这无疑是非常明智的建议。在深入学习一门语言之前,先熟悉一下该语言的官方资源。
不要对引文中提到的“六个小时中的四个小时”想太多——这并不是说要花几个小时去阅读文档。而是要学习如何找到更多关于标准库的信息,以及诸如操作字符串和数组之类的方法。
当你涉足其中时,它将为下一步提供极其方便的帮助。
如果您是 Mac 用户,请考虑投资Dash。它是我的首选资源,尤其是在刚开始学习一门语言时,并且与 VSCode 等一些 IDE 有很好的集成。
学习基础知识并练习、练习、再练习
当我提到“基线”时,我指的是每种语言都共有的一些核心思想:
- 声明变量和常量
- 数据类型
- 功能
- 评论
- 控制流
- 数据结构
- 字符串/数组/对象操作的常用方法和函数
- 正则表达式
你任职越久,就越容易发现一些常见的模式,并因此沾沾自喜。这绝对是你最不想看到的情况。虽然else/if
a 的 和 变体switch
可能很容易掌握,但在实践中运用这些关键词和结构的细微变体则完全是另一回事。
我特别强调第六点到第八点。第六点和第七点对于起床和上班至关重要。你可能已经理解了,但几乎所有东西都存储在某种对象/映射/数组数据结构中。学习如何存储这些数据结构,然后运用语言方法遍历和操作这些数据结构,是关键所在,而理解文档的上一步将对你大有裨益。
至于正则表达式,它可能是程序员工具箱中最被低估的工具。尤其是在字符串识别或替换方面。RegExp 是一款非常棒的工具(尤其是在编程考试中),值得你探索所选语言中“RegExp 的使用方法”。
为了加快基线的学习,我将使用两个令人难以置信的工具来练习:语言 REPL(读取-评估-打印-循环)和用于练习算法的在线资源。
使用 REPL
使用 REPL 语言是熟悉数据类型和简单操作的好方法。当我需要快速检查记忆中关于某件事的操作方法,或者在工作中将一个简短的示例应用到更复杂的场景之前进行评估时,我总会使用它。
REPL 是您快速开始理解数据类型和简单、简短方法等内容的最佳帮手。
使用在线资源练习算法
至于快速练习和使用我提到的常用方法、数据结构和正则表达式,我个人发现最好的方法是使用在线学习资源和编码测试。
您可以在本地获取许多在线网站或问题集来帮助您练习:
我个人会把HackerRank作为我的首选。为什么?因为虽然测试对不同语言的支持程度会有所不同,但我发现它对我目前的工作支持程度最高,而且能够用不同的语言重复相同的测试,是理解如何用不同语言编写算法实现的好方法。
Exercism.io允许你将编码测试下载到本地,这太棒了。Exercism 也提供可下载的测试套件,所以这是一个很好的机会,让你能够接触到你所选语言的单元测试……这也引出了我的下一个观点。
尽早并经常学习测试
能够编写有效的测试是一项通用技能,并且可以从你之前学习过的语言中借鉴测试范式。一旦你掌握了一些语言基础知识,就应该尽早开始学习该语言的单元测试。
这也是一个很好的方法来检查你对目前所学知识的理解程度。这是一个学习和理解错误处理的好时机,并且真正检查你是否理解了数据类型及其局限性!
例如,如果你正在编写一个uint8
在 Rust 中返回 (0-255) 的简单函数,请为该函数编写测试,看看当你传递错误的数据类型或强制该函数返回负数或大于 255 的数时会发生什么。这可能吗?如果不可能,为什么?
当你尝试用 JavaScript、Ruby 或 Python 等动态语言做类似的事情时会发生什么?你有没有遇到过这些极端情况?
能够编写单元测试还能让你放慢速度,专注于你正在编写的代码,并真正理解语言的怪癖。当出现意想不到的失败时,你会庆幸自己花时间去了解原因。
至于经常——一旦你理解了如何编写单元测试,就尽可能多地编写它们。
到了这个阶段,你已经攻克了基础中非常重要的一部分,你会对自己的成就感到无比惊讶!是不是有点疯狂?
现在的下一步是如此重要,但我也觉得在发布此类帖子时,有些事情总是被忽视。
了解你的语言的包管理如何工作
Bundler、Cargo、Yarn、NPM、Cocoapods、PipEnv、NuGet、Gradle、Hex。这些有什么共同点?它们都是在不同语言生态系统中安装和管理软件包的关键工具。
如果您在作为开发人员期间使用过其中一种,您就会意识到它们在您的各种项目中发挥着至关重要的作用。
我将简短地介绍本节内容,但请先了解一下您的语言有哪些包管理工具。
最低限度是学习如何安装和管理这些依赖项,但我建议您在这里学习如何发布和分发您自己的包。
我还强烈建议你查看一些资源,它们能引导你找到该语言最热门的项目和包。比如 JSON/YAML 解析库、流行的服务器、流行的实用程序库等等。这会为下一步提供一个很好的铺垫。
查看该语言的 Awesome GitHub 仓库
原始的awesome 代码库是一个绝佳的资源,可以找到不同语言和技术的相关 awesome 代码库。“编程语言”部分是一个宝库,里面有各种语言的链接,资源丰富。
我将旅程的这一部分放在这里,因为这是您真正欣赏其中的一些内容并开始创建自己的应用程序的时候。
这些链接可以包括(但不限于):
- 应用
- 开发工具
- 图书馆
- 博客
- 资源
- 播客
- 值得关注的人
这是查找您不知道自己正在寻找的资源、查找可以从中学习当前最佳实践的项目以及启发您开始编写自己的项目的好方法。
这让我想到了最后一点(也是最精彩的一点):
构建你自己的 X
现在是时候运用你迄今为止学到的所有知识并开始完成一些项目了。
在寻找创意和项目构建方面, “构建你自己的 x”代码库绝对是个宝藏。我强烈建议你去看看这个代码库,看看里面都有哪些东西——它可以提供一些示例,教你如何构建自己的区块链和数据库。
所提供的示例可能针对特定语言,但它仍然是一种令人难以置信的资源。
就我个人而言,学习一门新语言时,我通常会尝试完成三个项目。这三个项目要么是我学习这门语言的核心原因,要么是绩效评估时的“X”因素——而且它们都不是极其复杂的项目。
构建 CLI 工具
学习如何用你的语言将参数和标志传递给脚本,这一点被严重低估了。我做过的最好的工作就是编写简单的 CLI 工具,以提升我工作过的团队的开发者体验。
我为项目构建的 CLI 工具包括:
- 网络爬虫机器人
- PDF渲染器
- 发票生成器
- 代码生成器
- 通过 CLI 进行交互式新闻
- 基础设施建设/拆除
学习如何有效地编写 CLI 工具是一项被低估的超能力。
学习如何读取/写入文件
这无疑是我大学期间最被低估的技能。在我的编程入门课上,他们居然只花了不到五分钟就讲解了这门技能,而且还给出了一个编写简单.txt
文件的滑稽例子。
我当时根本没想到,这么多年过去了,它竟然成了我几乎每次晋升的动力。能够解析、操作和重写文件,将使你能够运用无代码/低代码解决方案,并获得直接的版税级别的尊重。
构建 Web 服务器
这也许是你学习这门语言的最初原因,但无论如何它都是关键。
即使您没有构建一个成熟的 REST Web 服务器,编写一个简单的 RPC 也可以让您远程运行脚本并远程自动执行许多操作,让您感觉如释重负。
结语
以上并不是语言掌握的完整列表——它只是我过去几年遵循的模式,并取得了巨大的成功。
还有一些我没有涉及的重要元素:找到最好的书籍来阅读,社区推荐的最佳在线课程等。
我发现其他人已经明白这些事情很重要,或者已经将其纳入到他们的旅程中。
我个人认为,当你达到能够批判性地理解和跟进深入研究语言和特定框架的水平时,最好接触这些书籍和在线课程。
希望这些技巧能够帮助您踏上征服语言的下一段旅程!
我还有遗漏什么吗?还有其他技巧和窍门可以分享给其他人吗?快来分享吧!
编辑(2020年7月6日): Daniel在评论中提出了一个非常重要的观点,我却忽略了!一定要,一定要,一定要尽早补充一点,学习有效的调试。虽然我忘了,但你最终一定会意识到你需要了解这一点。
编辑(2020年7月7日): bgk889在评论中指出,我没有提到两种能够实现巨大功能的语言。真是个大问题!这两种语言是 JavaScript 和 Python。在这两种语言中,你能够在很多不同的领域进行开发,而且它们都很容易上手。当我高度赞扬它们时,请注意,我并不是说它们是项目的最佳选择(或正确选择)。当我自己开发小型项目或发布小型产品时,它们非常棒!我使用 JavaScript 进行 Web 开发、服务器端工作、移动开发、命令行工具和构建机器人(尤其是那些需要无头浏览的机器人),而使用 Python 进行数据科学、机器学习和物联网项目。它们提供的“效率”是启动速度和易用性。这两种语言在这方面都非常好,我的植物浇水系统也得益于它们。
资源和进一步阅读
图片来源:Dlanor S
原帖发布于我的博客。关注我的推特@dennisokeeffe92 ,了解更多隐藏的精彩内容。
文章来源:https://dev.to/okeeffed/the-9-step-plan-for-becoming-dangeous-in-any-language-3ikj