本文强调了掌握计算机科学基础的重要性,利用武术比喻说明基础训练如何为高效实践打下坚实基础。作者认为,关注底层原理与模式转化(如信息编码)会使开发者在任何技术领域中都能更快上手。文章中提到,精通基础知识能够加速学习新知识,而非仅仅依赖于外部框架和工具。通过深化对计算机科学原理的理解,工程师们能够更自信地应对复杂问题,并在竞争激烈的技术环境中脱颖而出。
我就不跟你唠叨那些传统的理由为什么你应该学习和实践所谓的“基本功”。
我知道,反转一个 LinkedList 和编写安全且允许高效 gas 使用的 智能合约 之间似乎没有关系。
你可能从来没有在生产环境中需要实现一个运行在 log(n) 时间复杂度的算法。
即使你需要,你也只不过是导入了一个库。而且你几乎肯定没有调试过一个编译器或者给操作系统添加过一个系统调用。为 UDP 数据包编写一个缓冲区?天哪!
但无论如何,你还是应该学习这些科目。
让我给你讲一个故事。
当我还是个孩子的时候,我记得在练习武术时感到“受到限制”。
在空手道课程中,我们不允许进行对练,直到我们能够用完美的技术击打沙包(并本能地挡住攻击)。在柔术中,我们不允许进行摔跤,直到我们掌握了摔倒和基本投掷(摔倒技术)。
一半的练习时间用于心肺锻炼和步法练习,这些与打人似乎没有明显的关系。
这真让人沮丧。当教练最终允许我们击打同学的头部时,我记得感到松了一口气。我认为这种暴力并不是吸引人的地方,而是不会在大家面前被分配到初学者组的感觉。做一些被标注为“初学者”的练习在公开场合似乎让人反感。
回想起来,这种限制背后的智慧是显而易见的:如果你直接投入到一场打斗中,挥动着手臂,你的学习效率不会像直接钻研基本功那样高效。
对练如果利用现有的习惯会更加有效,而不是从头开始发展技术。当另一个同学在你面前挥动拳时,你还要考虑正确的技术,这使得技能的发展变得更加缓慢。
实际的对练不过是基础技能的总和:良好的步法、良好的打击、良好的防守,以及不会喘不过气来。
打基础不仅仅是武术的事情。竞技棋手和围棋选手并不会将所有时间花在下棋上。相反,他们通过特殊场景的问题书来学习,通过这些场景来教授类似的模式,例如中局、赌注、牺牲等等——在本文中我们称之为基础。
软件工程也差不多。
有一种巨大的诱惑,推动大家直接跳入距离终端应用程序一步的技术。
机器学习?学习 TensorFlow!区块链? 学习 Solidity!
(那些误导性地承诺工程师如果学习这些技术会有更高薪水的教育者,是这个问题的一部分)。
直接跳入 TensorFlow 或 Solidity 不会 让你成为一个有效的机器学习或区块链工程师。你将面对太多的基础技能,一次性处理。你就像一个新来的武术学员,挥舞着手臂,在 45 秒后就气喘吁吁。你可能偶尔会打中,但你始终是一个有限的从业者。
首先掌握基础,并且经常回顾它们。
计算机科学中的每一个问题,无论所属域如何,都是一串比特进,进行一些操作,然后输出一串比特。
每。一个。问题。
这些比特的解释是特定于领域的,但它们都是比特序列的变换。
推理这些比特串变换的科学叫做计算机科学。
让我来说明这种抽象如何适用于开发中的一切。
区块链的状态被建模为一串比特(每个人的余额以及智能合约的状态)。你将该状态与另一串比特(一个交易)结合,放入一个变换中,得到一串新的比特:区块链的新状态。
机器学习也是一样的。数据 + 模型(都是比特串)会产生一串新的比特(训练模型)。在这个领域,我们语义上将数据解释为“jpegs”,模型解释为“网络文件”,变换为“训练”,但它们仍然只是比特串和变换。
渲染一个网站是将 API 的 JSON 转换为网页 HTML 的过程。比特串输入,另一串比特串输出。这些比 JSON 和 HTML 更高层的抽象,但在底层,相同的比特串变换正在发生。
对这些比特串的语义解析方式有很多有意义的文献记录,你可以严格学习它们。
有一些基本定理描述了可以做什么和不可以做什么的比特串变换,无论在哪个领域:
你明白要点了吗?
推理比特串操作能让你在计算机科学的任何专业中变得优秀。你并不是真正地在移动 1 和 0,而是在基于对 1 和 0 的解释应用强大的抽象。而这些抽象是数十年研究的成果,出自一些历史上最杰出的思考者之手。你确实站在了巨人的肩膀上。
这些抽象类别落入被称为“密码学”、“信息理论”、“编译器”、“网络”、“虚拟机”等等的集群中。你知道,这些主题似乎不值得学习,因为已经有现成的工具。
让我们再回到武术的比喻。你可能会看到一些黑带展现出令人印象深刻的对练,但在底层,这实际上只是步法、打击、防守和不至于耗尽气力。相同的现象也驱动了编程忍者们施展的令人惊叹的壮举。其实就是将基础流利地执行。
你在计算机科学中的每一个动作都在将一串代表某物的比特变成另一串代表其它事物的比特。(或者如果你是黑客,识别什么输入会导致不理想的输出)。
你通过提高你对比特串建模与变换的总体能力来变得更好,而不是通过编写第十个 NFT 铸造网站。
你掌握的抽象和范式越多,你在计算机科学和开发的任何领域中的能力就越强。
这听起来像是我在为科技公司进行 45 分钟的白板面试辩护。这样做是有价值的,我在为这个原则辩护,但并不是典型的实现。
我们要求学生在加入 RareSkills 区块链训练营之前,必须通过一项简单到中等难度的数据结构和算法测试。不同的是,他们有超过传统的 45 分钟来完成这个测试。
我诚实地承认,要求一个人用白板在 45 分钟内解决数据结构问题相当残酷。但是,根本解决不了这些问题的人,确实不是合格的程序员,不应该信任其创建持有数百万美元的智能合约。你会感到惊讶,参加测试的申请人中有 30% 甚至不能解决一个单独的问题(而且“Fizz Buzz”的变体就是一个问题)。
我稍后会重访这一点,但虽然数据结构与算法是计算机科学基础的重要方面,可能甚至是最重要的一部分,但它们并不是计算机科学中唯一重要的部分。
雇主们普遍知道基础比应用更重要,即使大多数人不明确表达这一点。
会有人指出,“但杰弗瑞,大多数职位描述都说他们想要有两年 React 的经验,一年 Solidity 的经验,有 Kubernetes 的生产经验,等等。这显然是我应该优化的方向!”
如果你还没有注意到,大多数职位描述都相当不切实际。
我们来做一些基本的数学。假设有 12 个真正重要的框架和语言。一个普通的开发者在 5 年的职业生涯中,最多能真正掌握其中 4 个。开发者学会雇主想要的这 12 个中的同样 4 个的概率是 1/495。
(那就是 4/12 3/11 2/10 * 1/9 或 C(12, 4))
软件职位描述往往像是一个普通人希望约到一位常春藤盟校学历的超级模特,同时她还得是《福布斯》30位30岁以下杰出人物之一。祝你好运。你的机会是 0.2%。公平地说,许多软件工程师的预期也不现实。将软件工程师和职位匹配就像传统的约会一样麻烦。无论如何,我说太多了。
尽管与职位要求匹配的几率很低,但人们仍然能够匹配。雇主为什么会雇用那些不完全符合职位描述的人?(或者,为什么人们会和不符合所有要求的伴侣约会?对不起,我又偏题了,但这很形象)。
是因为他们能够看到开发者在计算机科学中的广泛技能,并能够将其应用到公司所需的东西上。(回到约会,大家都是因为看到另一方具备了解决问题的内涵特征而合作,而不是因为他们拥有那些“好伴侣”应有的特征)。
我并不是说公司会雇用从未构建过前端应用程序的人来担任高级前端职位。但我就是说,在我们划分为“前端、后端、智能合约、基础设施”等广泛类别之间,聪明的雇主更关心一般能力而非框架经验。
问题不是招聘广告在误导你,而是英语和主导软件开发的美国文化在准确表达…方面存在一个缺口。
“在一个比聪明更具体,但比大量记忆事实更一般的领域内的广泛能力——某人懂得这一点,‘ 它 ’是一套重要的元技能,适用于需要本周解决的事项,并且眼下很可能下个月需要解决……而当他们解决问题时,他们清楚与解决方案相伴的领域内的副作用,以及这些副作用如何可能渗透到其他领域。”
哇,这是非常冗长。
(如果我很有文化,想炫耀一下,我会说与 {日语、法语、印地语,或其他非英语语言} 相对应的词,但可惜的是,我并不太有文化,即使我财富曾拥有这种背景,但其他语言中存在的这个词并没有解决实时需要的问题)。
我们还有另一个困难:如“基础”、“第一原则”和“基本技能”等词汇都会被理解为“初学者材料”。用线性代数的术语来说,我们没有一个词或俚语可以指自然知识空间的基础向量,而不暗示学习这些内容的人是初学者。(看看,我可没有放过展示我线性代数知识的机会)。
尽管术语上有缺口,但武术教练和技术招聘经理直观上理解这一概念。但因为他们缺少合适的语言表达,他们通常使用像“运动员”、“经验丰富”或“学习能力强”这样的误导性术语。
好吧,我们确实有“专家”和“精通”这样的词,但这些词已被那些声称能通过教授一些当下热门框架的魔术技巧来授予你“专业知识”的教育者稀释和滥用。
即便你使用所请求的框架已有五年,如果你所做的只是盲目地复制在线教程,那也不会有太大帮助。你的短板通常会在面试阶段暴露出来。所以“工作年限”作为关键因素的观点就落空了?雇主希望你理解如何运作框架,而不仅仅是了解如何与它们的 API 接口。
所有框架都归结于基础。它们将你通过 API 提供的比特串接收过来,并作为状态变化或查询结果返回另一串比特串。它们在我之前列出的基础领域中进行相同类型的基本数据转换。
想要掌握这些框架?你知道我接下来要说什么!
所以学习基础,而不是框架。这就是成为一个能够迅速学习任何框架的人——甚至能够自己创建框架的方式。这正是雇主们真正想要的,即使当前的语言没有让他们简洁地表达这种渴望。
因为“基础”听起来像“初学者”(即,你应该先在角落里拳打沙包一百次,然后才能与比你更有水平的人一起练习),我将某些计算机科学概念称为“ 常青 ”和“ 高杠杆 ”:“ 常青 ”是因为它不会过时,而“ 高杠杆 ”是因为它加速相关知识的获取。
学习另一种语言,比如 Rust,当然会对你有所帮助。
但学习编译原理将会帮助你更快地学习 任何 语言。
学习 CPU 架构和机器码的运作将帮助你优化 任何 区块链上的智能合约。
请注意,这种效果并非反向适用。学习另一种语言并不会教你很多关于编译器的知识。但学习编译原理将帮助你进行编程语言的学习。因此,传统上称之为“基础”,尽管在这个上下文中,我更喜欢叫它“高杠杆”。
学习数据结构和算法的运作将帮助你更好地理解大型代码库,因为你可以将架构分解成合理的块,而不是一个变量一个变量地解析。此外,经过多种方式进行比特串建模和转换的过程,意味着当你在“现实世界”中编码时,良好的解决方案会更快地呈现给你。最后,你也会明白框架以这种方式建模数据的原因,这将帮助你更快地学习新框架,并保持领先于竞争对手。
“但是杰弗瑞!这需要我一年的时间才能学会这些东西,到那时我在区块链上就会过时了!”
这就是“常青”的部分!
猜猜看?即便今天学习当前材料,你在一年的区块链领域也会过时。你将永远处于过时状态。关键在于在过时的信息中更好地导航,而不是自己处于竞争劣势,装备自己更快学习的能力。
宇宙中指导信息编码和转变的法则并不会过时。
深度优先搜索(Depth-first search)已经存在超过 一个世纪,至今仍然相关。基数排序(在众多应用中比快速排序更快速)同样可以追溯到一个世纪前。图灵机,所有计算理论的基础,概念化于80年前。密码学所依赖的假设也没有改变。它归结为加密文本(再次强调,它是一个比特串)是否“根据正式定义看上去随机”。
计算机科学本质上就是比特序列的操作。一直以来都是。支配它的规则是永恒的。
保持最新意味着迅速搞懂最新的聪明人是如何重新组合现有知识的。
重大创新在底层都非常渐进。只是这些重大创新增加了几个关键变量,导致高度不成正比的结果:
比特币仅仅将数字签名与工作量证明(在比特币发明时都是数十年历史的概念)结合起来。以太坊取了比特币的执行核心并使其具备图灵完备性。Chat GPT 则吸取了自注意力变换器(到那时已经四年)并将其扩大,同时添加了一些硬编码的业务规则。
“创新”通常只是对关键变量的意外增量,且产生了不对称的结果(换句话说,仔细重新组合和改进某件事,直到产生不同或良好的结果)。如果你深入理解每当出现新创新时增量的内容,你将以狂想的速度掌握这项新技术。
这是一个秘密。做一些疯狂的事情,比如从零开始构建一个编译器,或者从数学基础实现一个非平凡的加密算法。这种项目将比展示你构建了猫分类器或第100个带质押功能的 NFT 市场吸引更多潜在雇主的关注。
一个项目仅展现了你如何按照教程去执行。另一个项目则展示了你能够迎头赶上难题,并处理可能出现的各种问题,即使这些问题并没有出现在职位描述中。
信不信由你,Solidity 编译器中是有 BUG 的。雇主更倾向于雇佣一个在问题出现时不知所措的工程师,还是一个能够注意到问题、深入编译器源代码、在 GitHub 上提出问题,并重新设计 Solidity 代码以规避该问题的工程师?第一个工程师的 GitHub 上可能有十几个 DeFi 质押应用程序,但这与能够探索问题背后深层原因的工程师相比显得微不足道。
现在我明白了:在初学阶段,很难看出递归翻转二进制树与编写高效智能合约之间的关系。
这感觉就像当我学习武术时:“为什么我们在做开合跳,而应该踢人呢?这两者之间的联系似乎如此遥远!”
我可以告诉你,扎扎实实地打基础使我在接触到这一概念后不到两年就能够领导一家大公司的机器学习部门,并在全职做区块链不到一年后创建了Udemy唯一的专家级 Solidity 课程。无论接下来出现什么热潮领域,我都将比 98% 的工程师更快地学习。
为什么?因为每项技术都是从同样的第一原则出发,从头开始构建,只是组合的方式不同。
你掌握的第一原则越多,你就越能快速学习计算机科学的新子领域,因为你不再是从头学习。相反,你只是将已经掌握的信息进行组合。
基础知识在很大程度上比 leetcode 更广泛。我不是指因为你能够移动数组中的两个指针,就能迅速掌握软件开发的任何领域。学习数据结构和算法在某种程度上具有递减回报(尽管我认为大多数工程师并没有达到那个拐点)。
Leetcode 并不会考察你的网络、语言理论、信息泄漏、虚拟机、操作系统、编译器等知识。这并不在讨论的范围之内,但在高层次上,软技能是非常重要的。我不想忽略这一点。但我们希望同样基本技能的情况下,技术成熟程度更高的工程师将脱颖而出。
如果你有良好的接触机会,能够识别出相应的模式,通过不断应对问题,也依旧产生出对基础的直觉。然而,直接学习基本概念将总是比盲目尝试随机学习更加高效。你可能并没有运气像那位员工工程师一样。
于计算机科学而言,所有切入的数据就像是进入某个箱子再出来的另一串比特。在复杂性理论中你会学习到。所有这些领域都是将抽象和有用的解释应用于比特串的方式。你知道的抽象越多,你就是越强大的开发人员。
如果你完全是编码的新手(如果你正在阅读这篇文章,可能你并不算,但我仍然会保留这一部分),我认为严格意义上说,先学习基础并不是绝对必要。我看到许多计算机科学本科生经历与我年轻的武术学员相似的经历。学习没有理解为什么重要的材料并不是最优的。如果你有一个老师能激励你对掌握第一原则充满信心,那真是太好了,但不是每个人都有这种奢侈。
我认为一个合理的学习旅程可以如下所示。这就是那些自学成功的工程师或 web2 训练营毕业生所经历的学习旅程。
刚开始 → 教程地狱 → 从实践中学习 → 精通基础。
一名成功的四年制计算机科学学生的学习旅程可能看起来是:
掌握基础 → 从实践中学习 → 回顾基础。
如果你仍在努力做到构建功能应用的基础知识,可以推迟对基础性话题的学习。但不要对构建功能应用感到安逸,因为如果不掌握基础,你将面临停滞不前的局面。
是的,tutorial hell 确实存在,而解决这个问题的办法就是勇敢去建立东西。
但一旦你走出 tutorial hell,下一步不应该是继续构建应用,而是编写培养一般计算机科学技能的项目。
如果你无法构建应用,你是不会得到报酬的。但是如果没有基础知识,你也不会获得渴望的工作,更不用说获得渴望的 晋升,除非你具备所需的基础技能。
我不主张每个雇主都应该做一个 leetcode 风格的测试,或者是类似考察我之前提到的基础的测验。如果你只在构建相对简单的应用,那么只测试工程师的这方面能力是合情合理的。然而,本文的主要受众是希望提升自己职业生涯的工程师(这就是 RareSkills 的目标)。职业晋升不会来自于反复构建同一项应用的一种变体。
我们所做的一切软件开发都可以看作是比特的豪华解释和变换。数据变换是一项可以通过刻意练习直接开发的技能。你学习的计算机科学领域越广泛,你就能带来的专业词汇越大。最优秀的工程师会故意培养这些技能。普通的开发者直接开始使用框架。框架会过时。信息编码和操作的基本定理则不会。
你与那些比你多赚 10 万美元的工程师之间的差异,并不是某种语言或框架的掌握,而是对框架组件的理解。这些组件直接取决于计算机科学的基础。
偏离大路。
学习并实践那些看似无用的令人生畏的主题。
这不仅是长久以来的捷径。
这就是唯一的方法。
感谢阅读这篇文章。如你所见,我对开发者教育充满热情。这就是我创建 RareSkills 的原因。目的是以正确的方式教授区块链开发。因此,请查看我们的 区块链训练营。我们提供从零基础到专业 Solidity 开发者的课程。
我们的一半学生已在智能合约开发领域就业,所以我们远比任何普通训练营更具深度。因为我们非常强调基础知识,你所学习的内容在区块链之外的领域也将会是相关的。
最初发表于 2023 年 2 月 8 日
- 原文链接: rareskills.io/post/maste...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!