静态类型是完美主义者的选择
Static Types Are for Perfectionists
如果你正在做游戏,你应该接受治疗。 Mike Acton 在 Wizardology podcast 中如是说。
在本文中,我反思了自己的职业偏好,并将它们追溯到我的童年经历。我认为,文化和成长环境比理性论证更能塑造我们对技术的根本信念。最后,我总结了这个观点的两个含义:一是必须接受他人的偏好而不加评判,二是找到一个能奖励你的风格的环境非常重要。
技术之镜
也许我下棋风格与我童年性格完全同步,是我游戏中最重要的因素。 Josh Waitzkin, "The Art of Learning"
在我的大部分编程生涯中,我都认为我的技术偏好是理性的,并且反映了软件开发的现实。我以为那些不同意我观点的人还没有看到真相,还没有感受到痛苦。给他们时间和相关的经验,他们就会得出同样的结论:
- 静态类型语言是进行严肃软件开发的唯一途径。
- 程序员必须理解并对他们的系统有一个扎实的心理模型。
- 依赖是邪恶的。它们会使基础设施和部署复杂化,并从长远来看会减慢开发速度。
几年前,在读了半个图书馆的关于个人发展和心理学的书籍后,我意识到我的早期岁月对我的人际关系、价值观和核心信念产生了多么深刻的影响。特别是我成长岁月的以下两个特点尤为突出:
- 犯错代价高昂。打破东西或在学校取得坏成绩可能会导致惩罚。因此,我的大脑想要避免(或至少隐藏)错误。它要求完美。
- 即使向父母寻求帮助,也常常会导致羞辱。因此,我变得反依赖。寻求或接受帮助感觉令人生畏。我宁愿读无数本关于心理学的书,也不愿与治疗师交谈。
我很快意识到我的技术偏好反映了我的日常行为。因此,我的早期条件反射比客观评估更能解释我的选择:
- 我喜欢编译型语言,因为它们可以帮助我避免错误。我对错误的厌恶引导了我对类型系统、编译器和形式方法的兴趣。这些工具让我感到安全。那是一种温暖而模糊的感觉。 几乎没有经验证据 表明强大的类型系统会导致更好的程序。
- 充分理解我的程序可以减少我对工具和人员的依赖。它还可以帮助我修复错误,因为我可以在我的脑海中模拟系统的行为。
- 消除依赖关系可以给我一种控制感,并提高迭代速度。如果我的代码需要调整,我可以进行调整,而无需其他人参与或等待上游修复。此外,将所有代码放在一个地方使编程工具更加可靠。
我的条件反射能帮助我编写更好的程序吗?也许吧。我注意到,我对理解的痴迷导致程序很少出现错误,这些错误大多不是来自内部不一致,而是来自对执行环境的不正确假设。对依赖的厌恶加快了构建、打包和交付的速度。
我喜欢我的方法_因为_它产生了更好的程序吗?可能不是。我可以整天对它进行合理化,但最终,它归结为感觉。花一个小时与编译器作斗争,以编写一个第一次运行就能工作的程序,感觉棒极了。花二十分钟起草一个 Python 脚本,再花二十分钟挤出运行时错误……感觉就不一样了。
我遇到过许多编程方法与我截然相反的人。他们把东西拼凑在一起,进行试验,并引入庞大的框架。当他们的程序似乎可以工作时,他们就停止担心并继续前进。只要我们不在同一个系统上工作,我对他们的方式没有任何问题。从长远来看,这些构建者可能会比我为世界带来更多的价值。他们恐惧更少,尝试更多。
真实性螺旋
初学者的心中充满可能性,而专家的心中却鲜有。 Shunryu Suzuki, "Zen Mind, Beginner's Mind: Informal Talks on Zen Meditation and Practice"
当然,我进入这个行业时并不是一个完全成型的孤独的抱怨者。我的观点在我的职业生涯中发生了显着的变化,并且还在继续变化。
我的第一个程序是 Turbo Pascal 中的物理模拟和小型游戏。它们枯燥且非常直接。我会通过单独绘制特定偏移量的像素来创建动画。我唯一的依赖是标准库。
当我成为 Enterprise Java 世界的一名初级工程师时,我对干净的代码着迷。我读了每一本关于代码组织的书,在我的代码中塞满了设计模式,并掌握了臃肿的框架。
接触到新的想法和编程语言使我意识到,我所认为的良好设计中的大多数都是不必要的。它们没有为解决方案做出贡献,而是造成了意外的复杂性和膨胀。我不需要编写可扩展的代码。我可以从最简单的版本开始,并在问题发生变化时重写它。正如 tef 所说,代码应该易于删除,而不是易于理解。
我花了十多年的时间才提炼出一种与我产生共鸣的编程风格。我现在很少关心抽象的干净代码约定,而是使用我的美学和感觉作为指导。这种倾向有时会导致沟通问题:我经常_觉得_一种设计是可取的,但无法确切地解释原因。
像所有艺术家一样,程序员在螺旋中成长。初学者试图以他们所知的最直接的方式来实现目标。他们编写的每一行代码都有其目的。然后他们学习范式和“良好实践”并模仿它们。他们接受必须以特定方式完成事情,因为这是该行业的规则。这条路会让他们误入歧途,但这是成长所必需的。他们通过重新连接现实并返回到他们的 初学者心态 来摆脱这种状态。他们的代码再次变得简单而有目的。约定逐渐消失,他们的工作变得更加真实。
⊕ 程序员在螺旋中成长。初学者凭直觉思考,但缺乏表达自己的语言。当他们获得知识并模仿他人时,他们在真实性空间中偏离了他们的核心。最终,他们学会了清晰地看待事物并变得更加真实。
日本武术概念 shuhari 描述了掌握的三个阶段;它很好地映射到真实性螺旋:
- 在_shu_阶段,练习者学习基础知识,记住动作并遵守规则。那是螺旋上的上升曲线。
- 在_ha_阶段,练习者开始通过打破规则并与现实联系起来进行创新。那是螺旋上的向后趋势。
- 在_ri_阶段,练习者超越了形式并自然地执行动作。到此阶段,螺旋接近真实的核心。
如果您对技术的看法与其他生活领域的根本信念不符,则您的螺旋可能尚未完成其周期。
找到你的位置
只有通过最大化你的优势才能取得卓越成就,而永远无法通过修复你的弱点来实现。 Marcus Buckingham
假设我说服你,你的技术偏好主要来自你的教养和文化。这意味着什么?我至少可以想到两个。
首先,我们应该停止给那些不认同我们偏好的人贴标签和指责。使用内存不安全的语言不是一种道德犯罪,而对动态类型的偏好并不能说明程序员的智力。类型理论的鼓吹者应该放弃他们的道德和智力优越感,并接受他们像行业中的其他人一样需要治疗(如果不是更多)。
⊕ 自我意识的睡眠会产生优雅的数学结构。来源:Jay Cummings。
其次,我们应该更多地关注技术的感觉,并将这些感觉纳入我们的职业选择中。
环境在生产力和工作满意度方面起着至关重要的作用。我亲身经历了这一点,因为我的生产力在我的职业生涯中不断波动。我在 Yandex.Maps 感到宾至如归,并且非常高效,我的经理对我的工作感到满意。当我加入 Google 时,我感觉自己是庞大机器中的一个齿轮。我的动力和生产力直线下降;我发现很难集中精力并推进我的项目。加入 dfinity 并从头开始构建东西是令人兴奋和刺激的;我在那里的四年半是我一生中最高效的时期。我以为这段经历彻底改变了我,并给了我翅膀。我以为我可以处理我遇到的任何事情。然而,在我离开 dfinity 并加入一家规模过大的创业公司后,我的生产力消失了。在短短几个月内,我感到精疲力竭和无用。然后我意识到,在我的经历之间我并没有发生太大的变化。我的环境对我的动机和生产力的影响远大于我的过往业绩。我需要合适的项目和合适的团队才能发挥良好的作用。 大多数生产力书籍,包括 Getting Things Done 和 The 12 Week Year,都向你保证,他们的系统将让你成为一台生产力机器,无论生活如何。他们撒谎了。
合适的环境并不能让一切变得容易。你仍然会经常感到沮丧,并且会面临挑战。但是,克服这些挑战会感觉像是在成长,而不是一种拖累。因此,了解是什么让你兴奋,并找到一个你所属的地方(而不是_你认为你应该属于_的地方)会让你更快乐。
结语
Haskell 在 20 年后仍将被使用,因为总会有人在寻找一种富有成效的方式来将他们的自闭症武器化。 @effectfully
不幸的是,我找不到任何可以反驳或证实我的轶事观察的研究。如果您是从事心理学和计算机科学交叉领域的研究人员,请考虑调查童年经历和神经多样性对技术偏好的影响。 作为一个频繁的 ZuriHac 嘉宾,我的印象是核心编译语言社区中神经多样性的人群比例异常之大。 我迫不及待地想阅读你的论文!
如果你喜欢这篇文章,请考虑收听 CoRecursive 播客的 Leaving Stripe 剧集。在这一集中,Jon de la Motte 分享了他与精神健康的斗争,并将他的职业选择与他的家庭动态联系起来。
我正在等待我的第一次治疗预约。不要犹豫,也预订一个吧。
相关文章
- Good names form Galois connections
- Debug like Feynman, test like Faraday
- If composers were hackers
- ONNX introduction
- Effective design docs
←3000 days of Duolingo
ONNX introduction→
©Roman Kashitsyn Source Code