在最近的聊天中,我听到了这样一句话:
优秀的高级开发者应该能够使用任何语言进行编程。
作为一个在多个技术栈中摸爬滚打多年的人,这让我开始思考。语言灵活性是高级工程师的核心特质吗?还是深度专业化更加有价值?
在我近18年的职业生涯中,使用了多种语言,细细数来有 C#、Java、JavaScript/TypeScript、C++、Ruby、PHP、Python、Perl 和 ActionScript。
我还尝试过其它不太出名的语言。我不是那种喜欢炫耀的人,也不是一个精通多语言的编程高手。这只是在这个行业待得够久才会遇到的情况。
早在1999年,安德鲁·亨特和大卫·托马斯就在《程序员修炼之道》一书中建议开发人员“每年至少学习一门新语言”。
我认为这有点过头了,因为我们不应该陷入过度逼迫自己的陷阱,但是……这不仅仅是为了充实我们的简历,更是为了拓展我们的思维。不同的语言体现了不同的解决问题的方法,无论你日常使用什么语言,接触这些方法都能丰富我们的工具箱。
如果没有这种经验,我们最终可能会“自食其果”,看不到其他选择。例如,我曾多次目睹这种情况,后端开发人员为了避免接触 JavaScript 而构建复杂的变通方案,却没有意识到这样做只会让他们的生活更加艰难,而不是更轻松。
嘿,我也有过类似的经历,我曾经讨厌 JavaScript,更讨厌 TypeScript,后来被迫用 Perl 写代码,就离开了这个项目。不过,我还是转变了,并踏上了属于自己的旅程。
回想起来,每次学习一门新语言,我都会为我的主力技术栈带来新的见解。我坚信,精通不止一门你最喜欢的语言,就能打开通往新思维的大门。
在某些情况下,使用新语言是有意义的:
当特定业务问题需要时。有时,特定服务会受益于使用特定语言编写。例如,在使用 Node.js 并需要 CPU 密集型操作(例如 TypeScript 迁移)时,为该特定组件使用性能更佳的语言就是个明智之举。
说到它对招聘和留住人才的帮助,我有几个客户从 C#/Java 迁移到了 Node.js,因为他们发现这样更容易招聘开发人员。他们构建的系统实际上并不需要 C#/Java 带来的繁琐复杂;除了熟悉之外,没有任何商业优势。
当它开启新的职业机会时。我个人曾经受益于更新我的 Java 技能。我的大多数客户都使用 Java,因此这项投资在我的咨询工作中获得了丰厚的回报。有些语言也正在变得过时。它们仍然需要,但市场正在萎缩(Cobol,加油!)。
但说实话,并非所有技术实验都适合投入生产。关键问题是这样的,
“我们可以用 X 写这个吗?”
但
“谁来长期维护这个X代码?”
我曾经处理过一个用 F# 编写的定价算法模块。虽然我其实很喜欢 F#,但在当时的情况下,这个决定并不合理。我接手后的首批决定之一就是用 C# 痛苦地重写它。虽然边际效益并没有抵消团队其他成员的认知负担,但这却是典型的简历驱动设计。公司在重写上花了不少钱,但这仍然比雇佣或教新人用 F# 来维护要便宜得多。
在另一个案例中,一个团队引入了 Python 微服务,因为他们认为这样开发速度会更快。结果却发现速度更慢,导致再次重写。该公司甚至没有意识到,他们支付的费用是用于学习实验和后续清理,而不是实际的功能。
这些失败通常是因为人们没有提出尖锐的问题:
这一变化的实际商业驱动力是什么?
在团队学习新知识期间,花费 3-6 个月的时间降低生产力是否值得?
如果编码冠军离开,谁来维护这个准则?
即使出于良好的意图,混合技术也会带来维护挑战。不同技术的小型集成可能会带来业务关键风险。一旦关键人员离职,原本只需 15 分钟就能解决的问题可能会变成数周的调查。
这就是为什么这样的决定通常需要比内部团队更高层次的咨询和确认。
回到我们英语课堂的例子。我们学习英语是为了能够沟通,在项目中学习,而不是仅仅局限于母语项目和资源。我们应该同时学习后端和前端技术栈以及前端,这样才不会限制自己。我们仍然可以专注于其中之一,但你应该能够端到端地交付一个功能,从其他人那里获得一些帮助,而不是等待他们。
架构决策会产生深远的影响。如果你没有亲身实践过自己推荐的技术,又如何真正理解它们的利弊呢?你不能根据博客文章和会议演讲,而是要靠实际经验来做决定。
我认识的一些优秀架构师即使不是全职,也仍然会定期在生产系统上编写代码。他们用不同的语言进行原型设计,构建概念验证,并偶尔深入代码库以了解痛点。他们意识到保持技术敏锐是工作的一部分。
如果没有对多种语言和生态系统的实践知识,你如何评估一项新技术何时合适,何时只会增加不必要的复杂性?你如何区分合理的技术顾虑和简单的变革阻力?
停止学习新技术的架构师,很快就会脱离现代发展的现实,他们的团队也会因此受到影响。
对于稳定、长期的项目:保持技术一致性通常比引入新语言更重要
对于面临特定技术挑战的团队:有针对性地使用专门的语言可能值得投资
对于每个人来说:拥有一个评估何时引入新技术的流程至关重要
一个关键的业务问题经常被忽视:引入一门新语言的真正驱动力是什么?团队学习新知识时,是否值得花费 3-6 个月的时间,导致生产力下降?有时值得,但通常不值得。
问题不应该是
“我们可以用 X 写这个吗?”
但,
“谁来长期维护这个X代码?”
也许最重要的是,要时刻保持谦逊,认识到何时将问题强行纳入自己喜欢的解决方案中,而不是为眼前的挑战找到正确的方法。
归根结底,编程语言是工具,而不是身份。
我认识的优秀开发者不会称自己为“Java 程序员”或“JavaScript 程序员”;他们是解决问题的高手,会使用合适的工具来完成工作,无论是他们已经使用了十年的工具,还是上个月才开始学习的工具。
那么,你是什么样的想法?欢迎留言。
作者:Oskar Dudycz
编译:场长
来源:架构周刊
https://www.architecture-weekly.com/p/why-we-should-learn-multiple-programming
本文为 @ 场长 创作并授权 21CTO 发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。