学习Rust有一段时间了,闲暇之余断断续续造了一些轮子。通过这一系列的练习和模仿,我对如何学习一门新的编程语言有了一些新的感悟。这篇文章讲的方法不是捷径,也不是7天的精通,而是继续傻着学。在我看来,前者的介绍过于简单,只是告诉你做什么,而没有告诉你怎么做。后者太难了,对于大多数人来说,想做这样的事情几乎是不可能的。至于这篇文章的难度,则介于两者之间。至于是不是在中间,就不好说了。难度因人而异,因时而异。随着对编程和计算机的理解越来越深,原本难度适中的事情,会因为做了而变得容易;而原本复杂的事情,如果我们还没有去做,那我们可能还会觉得还是挺复杂的。为什么要学习一门新的编程语言?工作多年,我们依然和同事朋友讨论:商业永恒,技术永远在变。因此,成为业务专家更容易,更可持续,而成为技术专家则更难,需要不断提高。很难选择,因为我们不是火星人,我们没有上帝的视角。因此,要成为一名技术专家,就需要不断接触新事物,接受一些新概念。其中一种模式就是人们常说的:每年学一门新语言。从个人的角度来看,这是一个非常SMART(具体、可衡量、可实现、相关、有时限)的目标。因此,它还是有一些好处的:保持学习的习惯。技术热情加香油。学习不同的编程模式。扩大职业机会和前景。另外,从专业鸡汤的角度来说,就是:机会是留给有机会的人的。如果你学习了一门新的编程语言,以后有相关的机会你更容易接触到。如果你把学习一门新的编程语言当成内卷、奋斗之类很火的说辞,那我无话可说。有的人真的很“拼”,有的人想知道各种有趣的事情。在我看来,学习一门新的编程语言与上面的豪言壮语无关——没有竞争,只是加个赛道而已,哈哈。寻找语言学习的高效路径在上面,我提到的第一篇文章《学习的艺术——如何学好一门技术、语言》对我今天来说已经是浪费时间了——重复劳动。文中提到的方法无非就是造重复的轮子,重写旧的应用。这种方法和30天练习不同的项目,只是在特定场景和特定目标下练习。废产品。随着我们的成长,生活和工作中的一些事情会占用我们更多的时间。虽然,我还没有被这些问题困扰,但我已经有了一个又一个的解决方案。但是,我相信你们都会有这些疑问。简单来说,就是要学好一门编程语言,不要重复劳动。所以,可行的办法就是学习新的语言,在新的编程语言中寻找新的轮子。像《『如何同时学会两门编程语言?』》这样的东西是一个很好的方法,但对大多数人来说有点困难。不过从个人角度来说,如果选择从一个XML解析和JSON解析入手,可能并没有那么难。然而,它却在反复造轮子。扯了这么一圈废话,其实我们的结论是:在语言合适的场景下,造一个合适的轮子——这可能意味着一定的时间成本。比如用JavaScript处理非关系型数据,用Go开发跨平台命令行工具,用Rust开发WASM应用等等。Efficientpaths在尝试了一系列造轮子的努力之后,我有了模型的第一个版本(基于Rust语言)。我暂时分了四个路径:工程实现。即在使用该语言开发应用程序时需要哪些实践。应用程序开发。了解开发一个完整的应用程序所需的知识体系。框架设计。如何使用该语言进行各种抽象设计。语言练习。要么用它来编写解析器,要么用它来解析语言。领域特定编程/场景编程。也就是为语言找到合适的场景。作为第一个版本,这个路径不一定能满足你的需求,但随着我们不断完善,最终会形成一个更完整的路径。工程实现从工程实现的角度来说,我们需要掌握的是一些基本的编程能力:1.自动化测试。比如单元测试、集成测试等,帮助我们开发出高质量的应用,节省调试时间。TDD(测试驱动开发)。同上。从个人角度来说,如果掌握了TDD的技巧,就可以写出高质量的代码。测试覆盖率。持续集成。真正的软件开发需要持续集成,这也是我们学习编程语言需要掌握的工程技能。建立管理。为帮助我们构建值得信赖的软件的语言寻找构建系统。比如我们在使用Rust开发应用时,可以使用GitHub+TravisCI来完成对持续集成的理解;结合Justfile/Makefile等,完成自动化构建。应用程序开发应用程序开发是基于真实项目的角度来完成语言练习。这些内容包括:自动部署。主要用于学习如何在实际项目中提交效率。容器化部署。分层架构。如何合理划分项目的目标结构,常见的有两种方式:MVC架构。传统的三层架构干净的架构。基于抽象形式设计的架构DevOps系统。根据需要提供从需求到上线过程的完整支持。如:应用性能监控。日志。不同的语言之间可能会有一些差异,但最终都需要提供一致的接口,或者采用一致的接口。例如,对于数据库访问,使用的接口是一致的;要提供RESTfulAPI,还需要为消费者提供一致的API。框架设计框架设计是基于造轮子的需求场景的路径。它包含:抽象。语言如何抽象来支持OO。不支持面向对象。如何使用RustTrait之类的东西来完成类似的事情与语言无关。如何做跨语言设计支持。如:与语言无关的数据格式。模块化开发。如何完成跨团队、跨业务模块的代码和服务共享。包管理/依赖管理。比如如何构建并发布到产品仓库,实现复用。框架设计在理论上稍微复杂一些。至于有没有必要,就看你想学到什么程度了。LanguagePracticeLanguagepractice是?模式下的路径,比较陡峭。为其他语言/DSL编写解析器。用另一种语言为该语言编写解析器。使用此语言来解析语言。嗯,是不是很有趣。从场景的角度来说,当我们拿到一个语言的AST之后,我们可以尝试做一些高端的东西。比如自动重构,架构可视化等,我是用Coca做的。领域特定编程领域特定编程是在语言擅长的场景中做语言擅长的事情。例如,Rust中的跨平台WASM跨终端运行应用程序。系统级编程结合了系统接口,例如获取用户输入和修改输出。由我们来识别场景并知道什么时候是正确的场合。其他人没有灵丹妙药,如果有灵丹妙药,就不需要人类了。本文转载自微信公众号「Phodal」,可关注下方二维码。转载本文请联系Phodal公众号。
