4006-998-758
新闻动态

大模型时代,程序员的技能哪些重要、哪些不再重要?

2023-06-16

大模型时代,程序员的技能哪些重要、哪些不再重要?

中智凯灵 2023-06-14 18:21 发表于北京

大模型时代,程序员的技能哪些重要、哪些不再重要?(图2)

作者简介:张刚,软件工程博士、资深技术专家、CCF 软件工程委员会执行委员、贝尔实验室杰出工程师。先后任职于阿尔卡特朗讯、上海理工大学和阿里巴巴。20 余年软件开发、架构设计和技术领导者的成功经验,先进软件工程方法与实践的持续探索者和积极传播者。著有《软件设计:从专业到卓越》,在豆瓣得分9.9 ,非常罕见的高分,太厉害了。

大模型时代,程序员的技能哪些重要、哪些不再重要?(图3)

Part.1

大模型时代,程序员的技能哪些重要、哪些不再重要?(图4)
“程序员”的工作,还是不是“写程序”?
曾经,“程序员”的职责是非常明确的:编写和调试代码,让应用程序正常工作。在这个意义上,胜任“程序员”的工作其实并不是太难:
掌握计算机和软件的基本原理、至少一门编程语言,以及若干流行的框架,就可以上手了。
但是专业的“程序员”并不仅止步与此。
软件的长期维护特征和与生俱来的复杂性,使得高效、高质量地编写可长期维护的软件是非常困难的。所以,专业能力,例如编写高内聚、低耦合的代码、掌握演进式设计的能力等,是“专业程序员”,更确切的说,是“软件工程师”的一个更为重要的能力要求。
坦率地说,今天的许多程序员,未必都能达到“专业”程序员的要求。只不过,在软件行业对人才的巨量需求面前,“不那么专业”并不是一个严重的问题。
大模型时代的到来,或许将从根本上改变这一现状。我在过去的几个月中,可以轻松上手不同的前端框架(基于typescript),使用go语言和python语言,了解机器学习算法,了解云原始基础设施,学习各种组件和框架的使用,似乎它们并不比我已经使用了十几年的C语、Java语言有啥区别。语言、框架和基础设施的经验,似乎不再重要。全栈,曾经是一个非常遥远的目标,今天已经唾手可得。
大模型时代的到来,让程序员的效率也有了本质的提升。基于ChatGPT和GitHub copliot,我可以直接要求ChatGPT编写swagger接口文件,连续按几次Tab键就可以写好大多数的服务端代码,差不多一个小时能完成过去需要几天才能完成的工作。





大模型时代,正在催生“超级个体”。这些超级个体效率极高,熟练使用各种工具,快速交付业务价值。


Part.2

大模型时代,什么才是“软件工程师”的真正能力?

我曾经在去年出版的《软件设计:从专业到卓越》一书中,列举了“专业的软件工程师”应该掌握的一组关键技能,以及这些能力之间的关系,我称它们为“精益软件设计实践”,如下图:

大模型时代,程序员的技能哪些重要、哪些不再重要?(图5)我把它们概括为一个根本挑战、两大核心价值、三大设计原则和对应的软件设计实践。其中:






一个根本挑战是软件与生俱来的复杂性。
两大核心价值指的是软件开发的当前业务价值(满足业务需求)和长期资产价值(复用和演进)。
三大设计原则是分而治之、持续演进和内建质量。‍

在此基础上,上图还列出了彼此互为支撑的软件设计实践,分别为高质量需求、领域模型、由外而内的开发、设计分解、接口和契约、测试先行,以及演进式设计和内建质量中包含的系列软件实践,具体包括契约式设计、防御式编程、代码评审、结对编程、简单设计、测试驱动开发、重构和持续集成

在我看来,上述这样的一个能力体系是一名“软件工程师”在“编程能力”之上的更重要的工程技能。不过,我没能在那个时刻预计到大模型时代的到来。从GPT4发布到现在,我一直在使用GPT-4和copliot在工作,通过这3个月的尝试,我觉得可以写一下自己的理解了。

让我们首先从问题出发:软件开发的复杂性问题。

Part.3

软件开发的复杂性没有消失
简单的说,一个好消息,一个坏消息。
所有关于软件开发“复杂性”的讨论,都可以回溯到布鲁克斯在《没有银弹》一文中关于软件开发的本质困难的论证。布鲁克斯从以下四个方面论证了软件开发的本质困难:复杂性、符合性、可变更性、和不可见性。具体来说:
  • 复杂性:业务领域本身就是复杂的,软件是服务于业务的,因此无论如何优化工程方法,软件开发都不可能比业务更简单。也正因为如此,软件开发才会有如此多的挑战。
  • 符合性:软件系统不是孤立系统,它需要和客观世界、其他系统、人类规范等等打交道。不幸的是,这些标准和规范本质上没啥规律,就是“遵守”。
  • 可变更性:软件天生就是为变更而存在的,因此它必须能够适应变化。但是,如果缺乏好的工程实践, 可变更其实并不容易做到。
  • 不可见性:软件是信息,而不是物理实体,这使得它的理解和维护变得尤其困难。更糟糕的是,每一行代码都包含了信息....
大模型时代,上述4个根本困难改变了吗?
我的理解是:
  • 业务的复杂性问题不减反增。大模型必然加速人工智能应用的到来,业务场景将大幅扩展。同时,由于软件开发的成本降低(大量AI助手的应用), 软件将更加无处不在,业务连接更为广泛,这些都将扩大业务的复杂性。
  • 符合性问题更为突出。更多的连接和交互会带来更多的边界, 虽然人工智能会这边界的兼容性上有所作为,但是其实会对管控提出更高的要求。
  • 可变更性依然存在,解法会有升级:软件天生就是“软”的,这个没法改变。不过,大模型会对“如何变更”带来全新的方法。也就是说,这个问题仍然在,但是解法会不太一样了。
  • 不可见性有望得到根本改变:其实真正的“不可见”并不是信息实体导致的,而是我们人脑对复杂问题理解的能力导致的。计算机的记忆力比人类强很多,现在有了人工智能的理解力的加持,或许,不可见在未来不再是一个根本问题。
总结一下的话,就是1个坏消息和1个好消息。





一个坏消息:大模型时代的到来,复杂性没有降低,而且还会增加。
一个好消息:大模型时代的到来,我们的武器变强了,有了更多应对手段。‍

大模型时代,程序员的技能哪些重要、哪些不再重要?(图6)

Part.4

大模型时代,程序员的技能哪些重要、哪些不再重要?(图7)
需求分析能力将更为重要

有句话叫“好的开始是成功的一半”。需求分析其实从来就是一个极度重要的问题。需求分析从澄清业务目标、到设计需求方案,到明确业务规则,都需要非常结构化的方法。

人工智能能够在需求分析领域提供不小的帮助。类似于ChatGPT这样的大模型,已经阅读了这个世界上的大多数文字素材,所以它知识很广博。甚至已经有一些基于大模型的需求分析辅助工具,可以帮助我们编写看起来很不错的需求文档。






所以,如果善用人工智能辅助,需求分析的效率和质量都会有本质提升。

但是人工智能没法解决的问题,是目标的定义和特定业务的问题。这也是优秀的产品经理的价值所在。本文不展开产品经理的话题,但是它是不是也是优秀的开发工程师的更好机会呢?我的看法是:是的。由于大模型的出现,软件开发的生产力将会大幅上升,全栈已经可以不仅仅是技术域的全栈了,而是可以向前延伸到需求和业务领域的全栈。所以,如果你本来就是一名优秀的开发工程师,我的看法是:绝好的机会来了。

“善用人工智能辅助”仍然是有门槛的。这时候,结构化的需求分析能力,就会变得非常重要。关于这个问题,我推荐何勉老师的“需求分析金字塔”给大家:

金字塔的每个层次都还包含了很多关键实践。这些实践本身很重要,我也看到了许多由于人工智能的引入带来的新的实践方法的机会,本文写不下这部分内容,我们后续专门展开。

Part.5

领域模型:非常关键!
在我看来, 在软件开发领域,再也没有一个其他问题,和领域模型一样重要但是却容易被忽略了。要不是沾了微服务和DDD的光,我相信到现在为止,很多技术人员也未必知道领域模型。
领域模型反映了一个领域中的关键概念及其之间的关系,是我们对现实世界的简化和思维映射,其实也是对布鲁克斯关于软件开发的本质复杂性的直接回应。没有好的领域模型, 软件开发势必是混乱的。只不过,由于造成软件开发效能损失的方面实在是太多了, 而由于很多人根本就不知道很多问题居然是因为缺乏好的领域模型导致的, 更加没法归因到它上面而已。
大模型时代,程序员的技能哪些重要、哪些不再重要?(图8)在大模型时代,软件开发必然会加速,而且需要人类和人工智能有效协同。那么,这时候“是否能很好地利用领域模型“就会成为一个重要的效率分水岭。用一个容易理解的比方,工具就像放大镜一样, 会放大不同能力的人和组织的差距。
当然,大模型时代的领域模型,如何定义,如何维护,这个是一个非常值得探讨的话题.......

Part.6

模块化、接口和契约,非常重要相信
凡是试验过使用ChatGPT编写代码的伙伴们都注意到了, ChatGPT对于小规模程序手到擒来,对于大规模的程序,如果直接让它编写,基本上没法工作。背后的原因很容易理解:





人类需要对复杂的问题分而治之,其实人工智能也是如此。

分而治之是我们简化复杂性的重要手段。通过将大问题分解成高内聚、低耦合的小问题,把大问题模块化,然后定义清楚它们之间的边界,逐一解决,各个击破。同时由于模块化,我们还可以复用之前已经完成的工作,提高效率,避免重复劳动。

在人工智能时代,这一点变得更加重要。其实人工智能是可以帮助我们更好地做模块化的,但是它仍然需要人类工程师的指引和协作。你现在就好比是人工智能的老板,它是你的下手。作为老板,如果你自身对好的模块化理解很到位,自然助手也很高效。如果强大的人工智能面对的是个没事品味的“老板”,结果自然可想而知....

模块化的意义还远不止如此。其实类似于langchain等技术方案,已经为我们展示了在大模型时代的一些更好的服务协同和服务能力组装的方式。






高质量的模块化、接口和契约,对于如何能发挥人工智能的架构能力,是一个特别值得重要的问题。

Part.7

演进式设计,问题不变,方式值得重新思考

可变更性是软件的根本特征,持续演进能力,正如自然界的进化一样,都是本质。

大模型时代,程序员的技能哪些重要、哪些不再重要?(图9)涉及到演进式设计的实践太多,我们无法逐一论述,选我认为重要的,直接给一些结论吧。如果认为结论需要更多论证,请大家评论区留言。

  • 重构:重构在过去是一个极为重要的敏捷实践。这一点看Martin Fowler的经典著作《重构》的流行度就可以知道。重构在大模型时代,在契约明确的情况下,这个实践很可能会有重大变化。换句话说,当重写的成本极低,而且可靠性极高的情况下,小步重构的手法和重要性可能不再重要。

  • 自动化测试:自动化测试是契约的保障,重要性不会降低。

  • 测试驱动开发:经典的测试驱动开发方法会发生变化。更可能的方向:一个是人类用测试表达契约,然后人工智能负责实现。另外,给大家报告一下,作为测试驱动开发的积极实践者,我最近使用测试驱动开发写代码的频率其实降低了。

  • 结对编程:一个好消息,如果你过去就认同结对编程的理念,也熟悉结对编程的方法,现在你一定是如鱼得水,因为你有了一个知识非常渊博的编程助手。

  • 持续集成:更为重要,因为业务变化会更快。

  • 整洁代码:最近的体会是,人工智能帮我写出来的代码,比我看到的“专业的人类程序员”写出来的,好太多。整洁代码,作为软件开发的入门级实践,或许真的已经不再需要了。相比过去推广起来的困难,训练一个学习能力更强的机器助手,其实容易得多。

  • ...

Part.8

语言和框架
这几天我产生了一个念头——或许,ChatGPT产生在今天,而不是10年前,真的是命中注定——今天我们有了非常丰富的适合各种场景的编程语言,有了丰富的编程框架,有了类似于k8s这样的平台,人工智能在编程领域才有用武之地啊。如果没有这些,那么,靠AI自己创造语言,自己搭建平台吗?这个难度就太大了。





或许,我们这一代程序员,真的只是通向未来人工智能的BootLoader....

但是,作为技能,语言和框架的重要性未必降低,学习难度大幅下降了。基本的状态就是,对一名有一定积累的程序员——随便什么语言,在AI的帮助下都可以轻松编写和阅读!写起来也快多了,现在已经是Tab-Tab-Tab了,也许,过不了多久,就真的很少动手亲自写了,大多数工作,都是人工智能代劳。






作为建议:扩大对设计能力的投资,降低对语言和框架的投资。

如果你本来就是语言和框架的专职维护者的人除外。

(最后呼应一下文章开头:作者的著作在豆瓣的评分)

作者:张刚

来源:演进式设计

版权申明:内容仅供分享学习,版权归原创者所有




大模型时代,程序员的技能哪些重要、哪些不再重要?(图10)

未完待续

大模型时代,程序员的技能哪些重要、哪些不再重要?(图11)

如果想要了解更多关于软件研发行业内最新资讯与顶尖案例,请关注即将于7月21-22日在北京举办的K+全球软件研发行业创新峰会,本届峰会以“智数未来,连接共生”为主题,整合国际前沿技术实践,致力于打造最高效和前沿的技术交流平台,构建多元融合的科技发展创新生态圈;以及8月18-19日在北京举办的AI+软件研发数字峰会(AI+ Software Development Digital Summit,简称AiDD峰会),AiDD峰会旨在帮助更多企业借助AI技术,使计算机能够更深入地认知现实世界,推动软件研发全面进入数字化时代。

非常期待您的报名与加入! 


点这里↓↓↓记得关注标星哦~



人才培养、版权课程设计与输出、人才培养体系设计与开发等一系列的人力资本专业服务。本平台致力于为企业提供人才培养方面的内容分享。" data-from="2" data-is_biz_ban="0" data-origin_num="82" data-isban="0" data-biz_account_status="0" data-index="0" style="color: initial; font: initial; font-feature-settings: initial; font-kerning: initial; font-optical-sizing: initial; font-palette: initial; font-synthesis: initial; font-variation-settings: initial; forced-color-adjust: initial; text-orientation: initial; text-rendering: initial; -webkit-font-smoothing: initial; -webkit-locale: initial; -webkit-text-orientation: initial; -webkit-writing-mode: initial; writing-mode: initial; zoom: initial; accent-color: initial; place-content: initial; place-items: initial; place-self: initial; alignment-baseline: initial; animation: initial; app-region: initial; appearance: initial; aspect-ratio: initial; backdrop-filter: initial; backface-visibility: initial; background: initial; background-blend-mode: initial; baseline-shift: initial; block-size: initial; border-block: initial; border: initial; border-radius: initial; border-collapse: initial; border-end-end-radius: initial; border-end-start-radius: initial; border-inline: initial; border-start-end-radius: initial; border-start-start-radius: initial; inset: initial; box-shadow: initial; break-after: initial; break-before: initial; break-inside: initial; buffered-rendering: initial; caption-side: initial; caret-color: initial; clear: initial; clip: initial; clip-path: initial; clip-rule: initial; color-interpolation: initial; color-interpolation-filters: initial; color-rendering: initial; color-scheme: initial; columns: initial; column-fill: initial; gap: initial; column-rule: initial; column-span: initial; contain: initial; contain-intrinsic-block-size: initial; contain-intrinsic-size: initial; contain-intrinsic-inline-size: initial; container: initial; content: initial; content-visibility: initial; counter-increment: initial; counter-reset: initial; counter-set: initial; cursor: initial; cx: initial; cy: initial; d: initial; display: initial; dominant-baseline: initial; empty-cells: initial; fill: initial; fill-opacity: initial; fill-rule: initial; filter: initial; flex: initial; flex-flow: initial; float: initial; flood-color: initial; flood-opacity: initial; grid: initial; grid-area: initial; height: initial; hyphenate-character: initial; hyphens: initial; image-orientation: initial; image-rendering: initial; inline-size: initial; inset-block: initial; inset-inline: initial; isolation: initial; letter-spacing: initial; lighting-color: initial; line-break: initial; list-style: initial; margin-block: initial; margin: 0px; margin-inline: initial; marker: initial; mask: initial; mask-type: initial; max-block-size: initial; max-height: initial; max-inline-size: initial; max-width: 100%; min-block-size: initial; min-height: initial; min-inline-size: initial; min-width: initial; mix-blend-mode: initial; object-fit: initial; object-position: initial; object-view-box: initial; offset: initial; opacity: initial; order: initial; orphans: initial; outline: 0px; outline-offset: initial; overflow-anchor: initial; overflow-clip-margin: initial; overflow: initial; overscroll-behavior-block: initial; overscroll-behavior-inline: initial; overscroll-behavior: initial; padding-block: initial; padding: 0px; padding-inline: initial; page: initial; page-orientation: initial; paint-order: initial; perspective: initial; perspective-origin: initial; pointer-events: auto; position: initial; quotes: initial; r: initial; resize: initial; rotate: initial; ruby-position: initial; rx: initial; ry: initial; scale: initial; scroll-behavior: initial; scroll-margin-block: initial; scroll-margin: initial; scroll-margin-inline: initial; scroll-padding-block: initial; scroll-padding: initial; scroll-padding-inline: initial; scroll-snap-align: initial; scroll-snap-stop: initial; scroll-snap-type: initial; scrollbar-gutter: initial; shape-image-threshold: initial; shape-margin: initial; shape-outside: initial; shape-rendering: initial; size: initial; speak: initial; stop-color: initial; stop-opacity: initial; stroke: initial; stroke-dasharray: initial; stroke-dashoffset: initial; stroke-linecap: initial; stroke-linejoin: initial; stroke-miterlimit: initial; stroke-opacity: initial; stroke-width: initial; tab-size: initial; table-layout: initial; text-align: initial; text-align-last: initial; text-anchor: initial; text-combine-upright: initial; text-decoration-line: initial; text-decoration-skip-ink: initial; text-emphasis: initial; text-emphasis-position: initial; text-indent: initial; text-overflow: initial; text-shadow: initial; text-size-adjust: inherit; text-transform: initial; text-underline-offset: initial; text-underline-position: initial; touch-action: initial; transform: initial; transform-box: initial; transform-origin: initial; transform-style: initial; transition: initial; translate: initial; user-select: initial; vector-effect: initial; vertical-align: initial; visibility: initial; border-spacing: initial; -webkit-box-align: initial; -webkit-box-decoration-break: initial; -webkit-box-direction: initial; -webkit-box-flex: initial; -webkit-box-ordinal-group: initial; -webkit-box-orient: initial; -webkit-box-pack: initial; -webkit-box-reflect: initial; -webkit-highlight: initial; -webkit-line-break: initial; -webkit-line-clamp: initial; -webkit-mask-box-image: initial; -webkit-mask: initial; -webkit-mask-composite: initial; -webkit-print-color-adjust: initial; -webkit-rtl-ordering: initial; -webkit-ruby-position: initial; -webkit-tap-highlight-color: initial; -webkit-text-combine: initial; -webkit-text-decorations-in-effect: initial; -webkit-text-fill-color: initial; -webkit-text-security: initial; -webkit-text-stroke: initial; -webkit-user-drag: initial; -webkit-user-modify: initial; white-space: initial; widows: initial; width: initial; will-change: initial; word-break: initial; word-spacing: initial; x: initial; y: initial; z-index: initial; box-sizing: border-box !important; overflow-wrap: break-word !important;">


大模型时代,程序员的技能哪些重要、哪些不再重要?(图13)


返回列表