我们开发者喜欢新事物,大多数人都是早期adopter。当某个新技术出现时,我们会急于尝试,查看教程,做”Hello World”示例。这种感觉很好,因为我们学到了新东西。
问题在于,我们行业中的大部分知识生命周期很短。大多数框架在2到5年之间达到顶峰。当你真正精通某项技术时,它可能已经成为遗留系统了。
随着AI代码生成器的兴起,这个过程加速了。人们在使用从未真正学透的技术进行”氛围编程”。
另一方面,那些投资于基础知识的人可以快速适应新技术,因为他们理解底层原理。所以,与其急于学习本月的新框架,我们应该花更多时间学习那些不会改变的东西。
框架的生命周期确实很短
如果你在这个行业待的时间足够长,你会看到许多流行框架的兴起、巅峰和衰落,整个过程只需几年时间。还记得GWT、Apache Tapestry、Backbone.js或Knockout.js这些框架吗?它们在当时非常流行。
Stack Overflow对JavaScript框架流量的分析清楚地显示了这一趋势。崛起、达到顶峰、然后逐渐衰落,整个过程只需几年。2011年左右,Backbone、Knockout和Ember是”当红”框架。到2015年,Angular 1.x不再受支持,Angular 2.0要求开发者重写应用程序。
技术寿命也有层次结构:编程语言的选择可以持续10年以上,数据库7-10年,后端框架3-5年,而前端框架大约只有18个月。
代码半衰期的数据也证实了这一点。Erik Bernhardsson分析了26个以上的开源项目,计算出的中位半衰期为3.33年。前端框架如Angular处于这个范围的极短端,只有0.32年,而Linux的数字是6.6年。越往技术栈上层走,生命周期就越短。
基础知识为什么重要
当你理解基础知识时,你就理解了各种框架和编程语言运作的原理和概念。这帮助你在编程中变得适应性强、灵活,可以使用各种技术,或者当你使用的框架无法实现某些功能时能够应对。
编程语言各不相同,但设计缺陷在所有语言中都是相似的。糟糕的命名在所有语言中都是糟糕的。框架不同,但设计模式相似。技术栈不同,但并发、数据结构、分布式系统和整洁架构的原理是相似的。
对基础知识的良好理解帮助你更高效地使用这些框架,因为你知道如何让这些框架适合你的需求。你不只是在跟随教程,而是理解底层发生了什么。
举个例子,假设有一个允许用户上传/分享图片的Web应用程序。也许你用流行的Web框架(如Ruby on Rails)快速编写了它,一开始运行良好。但随着用户群的增长,你遇到了性能问题。现在该怎么办?找出根本原因并不容易,你需要了解代码如何在基础设施上运行,那里发生了什么,如何读取日志等。懂得基础知识的开发者可以识别这样的瓶颈并提出解决方案,比如使用CDN、优化图片分享、添加合适的缓存、使用不同类型的存储等。
解决方案不是来自文档或代码助手,而是来自对事物如何运作的深刻理解。
AI放大了基础知识的价值,也暴露了基础知识的缺失
据估计,如今AI工具生成了所有代码的41%,你可能会认为基础知识不那么重要了。为什么要费心了解底层,如果AI可以写代码的话?
因为AI写代码,但你要承担责任。
AI编码助手擅长语法、样板代码和模式建议。但它们不擅长理解上下文。它们不会参加高级领导团队讨论成本与性能的会议。它们不理解客户服务系统必须设计为五个9的可用性,而内部仪表板可以容忍停机时间。它们无法在有人说应用程序必须快时读懂言外之意,实际上他们的意思是”让它便宜”。它们无法把这些点连接起来。
统计数据也显示了风险:48%的AI生成代码存在高安全漏洞风险,在没有适当审查的情况下,AI生成代码中发现缺陷的可能性是1.7倍。只有33%的开发者完全信任AI生成的代码。这意味着大多数AI代码需要像初级开发者代码一样的审查。必须有人足够理解它,才能发现错误。
因此,调试、审查和验证AI代码已成为关键技能,没有坚实的基础你做不到这些!
没有基础知识,调试AI编写的代码几乎是不可能的。你无法解释为什么程序能工作,程序何时会失败,甚至无法调整程序以适应未知场景。你的AI助手可能会帮忙,但它也可能把你引向错误的方向,修复的代价会太高。
AI时代最有价值的开发者不是那些能生成最好提示词的人,而是知道底层发生了什么的人。能够接受AI的输出并改进它,使其能抵御长期失败的人。
没有基础知识的AI是一种负担。
成为专家型通才
程序开发的每一次重大进步都遵循相同的模式。早期的汇编语言程序员被告知编译器的存在会让他们落后。相反,编译器使他们能够在更高的抽象层次上开发。运维工程师被告知云计算会让他们的职业消失。相反,它催生了新项目、新公司和工程工作的爆发。
AI也是如此。降低进入门槛并不会消除对技能的需求,反而会增加需求。随着AI做越来越多的代码工作,留给人类的工作越来越少,但都是硬核工作:理解系统、做架构决策、权衡取舍、表达意图。
这可以用杰文斯悖论很好地解释。1865年,经济学家威廉·杰文斯观察到一个有趣的现象:随着蒸汽机燃烧煤炭的效率提高,煤炭消费量上升了。为什么?效率释放了新的用例。突然间,煤炭对之前负担不起的行业来说在经济上变得可行。
这种效应现在在科技行业显现。随着AI token成本下降10倍,使用量上升了100倍。公司现在每个任务使用更多token,因为他们能负担得起更高的准确性。
正如Werner Vogels在他的文章《文艺复兴开发者的黎明》中所指出的,在这个AI增强的世界中表现出色的开发者必须将自己重塑为通才。他们意识到系统是活生生的、动态的环境,不断变化,影响服务、API、数据库、基础设施和人际互动。他们是所生产内容的主人,在质量、安全和意图方面。他们在AI无法协助的领域也很有知识。
我们需要通过提高好奇心、系统思维、系统设计、架构、沟通技能、主人翁意识、商业敏锐度等来成为专家型通才。此外,我们需要擅长代码验证和审查,因为当AI犯错时,我们需要知道如何处理。
“专家型通才”可以被认为是能够走进一个混乱的新问题,快速理解系统,识别正确的杠杆,并在没有手把手指导的情况下解决问题的工程师。不是万事通,而是在所有重要领域都有深度的高能动性连接者。
学习的80/20法则
那么,你应该如何安排学习时间来实现这一目标?有一个强大的启发式方法可以考虑:80%的学习时间应该花在基础主题上,20%花在框架、库和工具上。
为什么?因为你可能最终会在工作中学习所有这些框架,处理实际问题。没有人会在工作中教你分布式计算模式、整洁代码和良好的系统设计。这些都要靠你自己。
当你开始学习某样东西时,想想林迪效应如何影响它。这个效应指出,某样东西使用的时间越长,它继续被使用的可能性就越大。C、SQL、HTTP和REST已经有几十年的历史了,但仍然无处不在。那个炙手可热的新框架可能两年内就会消失。所以不要急于学习每一个新工具。
记住,时间是你最好的过滤器。投资于可以跨工作、团队和领域迁移的基础知识。让炒作沉淀下来。能够存活下来的才值得学习。
值得投资的基础知识
- 算法:解决问题的基础。无论你是否在编写排序算法,都应该始终注意权衡时间和空间复杂度。
- 数据结构:了解何时使用哈希表、树、队列等,就像编写能工作的代码和编写能良好工作的代码之间的区别。
- 软件设计与架构:MVC、微服务与单体、SOLID原则等模式,以及整洁、模块化的代码指导如何组织系统。
- 设计模式:框架来来去去,但观察者、策略和工厂等模式似乎无处不在。一旦你认识到这些,它们似乎遍布所有框架。
- 分布式计算模式:在微服务和云原生应用时代,了解CAP定理、最终一致性和容错性至关重要。
- 测试:了解编写好测试的方方面面、测试金字塔的概念和TDD,让你有勇气重构和更改代码而不必担心。
- 系统设计:这项技能的最大价值从高级工程师级别开始,不容低估。
- 整洁代码:编写其他人(以及未来的你)能够理解的代码。这项技能是在职业生涯中最能复利积累的。
经典书籍推荐
如果你真的想投资于基础知识,以下书籍经受住了时间的考验:
- 《程序员修炼之道》(The Pragmatic Programmer)
- 《代码大全》(Code Complete 2)
- 《设计数据密集型应用》(Designing Data-Intensive Applications)
- 《设计模式》(Design Patterns: Elements of Reusable Object-Oriented Software)
- 《算法导论》(Introduction to Algorithms)
- 《整洁代码》(Clean Code)
总结
下次当你想花周末时间学习最新”热门”框架时,退一步问问自己:五年后这还会相关吗?
框架来来去去,JavaScript有一个过度拥挤的框架墓地。AI正在以分钟为单位生成代码,虽然一些开发者被限制在严格按照特定框架规则编程,但他们很快就会被超越。不是被AI超越,而是被那些掌握底层原理的其他开发者超越。
学习框架是必要的,因为要交付产品。但真正的内核应该是基础知识。这是跨公司、团队和数十年都能迁移的东西。它们不会过期。在AI为你编写代码的时代,基础知识是让你具备适应性和韧性的唯一东西。
记住,框架会来来去去,但良好设计的底层原理永远存在。专注于基础知识。它们不会过期,而且会让学习新工具变得容易得多。