作者简介:张刚,软件工程博士、资深技术专家、CCF 软件工程委员会执行委员、贝尔实验室杰出工程师。先后任职于阿尔卡特朗讯、上海理工大学和阿里巴巴。20 余年软件开发、架构设计和技术领导者的成功经验,先进软件工程方法与实践的持续探索者和积极传播者。著有《软件设计:从专业到卓越》,在豆瓣得分9.9 ,非常罕见的高分,太厉害了。
Part.1
Part.2
我曾经在去年出版的《软件设计:从专业到卓越》一书中,列举了“专业的软件工程师”应该掌握的一组关键技能,以及这些能力之间的关系,我称它们为“精益软件设计实践”,如下图:
我把它们概括为一个根本挑战、两大核心价值、三大设计原则和对应的软件设计实践。其中:
在此基础上,上图还列出了彼此互为支撑的软件设计实践,分别为高质量需求、领域模型、由外而内的开发、设计分解、接口和契约、测试先行,以及演进式设计和内建质量中包含的系列软件实践,具体包括契约式设计、防御式编程、代码评审、结对编程、简单设计、测试驱动开发、重构和持续集成。
在我看来,上述这样的一个能力体系是一名“软件工程师”在“编程能力”之上的更重要的工程技能。不过,我没能在那个时刻预计到大模型时代的到来。从GPT4发布到现在,我一直在使用GPT-4和copliot在工作,通过这3个月的尝试,我觉得可以写一下自己的理解了。
让我们首先从问题出发:软件开发的复杂性问题。
Part.3
Part.4
有句话叫“好的开始是成功的一半”。需求分析其实从来就是一个极度重要的问题。需求分析从澄清业务目标、到设计需求方案,到明确业务规则,都需要非常结构化的方法。
人工智能能够在需求分析领域提供不小的帮助。类似于ChatGPT这样的大模型,已经阅读了这个世界上的大多数文字素材,所以它知识很广博。甚至已经有一些基于大模型的需求分析辅助工具,可以帮助我们编写看起来很不错的需求文档。
但是人工智能没法解决的问题,是目标的定义和特定业务的问题。这也是优秀的产品经理的价值所在。本文不展开产品经理的话题,但是它是不是也是优秀的开发工程师的更好机会呢?我的看法是:是的。由于大模型的出现,软件开发的生产力将会大幅上升,全栈已经可以不仅仅是技术域的全栈了,而是可以向前延伸到需求和业务领域的全栈。所以,如果你本来就是一名优秀的开发工程师,我的看法是:绝好的机会来了。
“善用人工智能辅助”仍然是有门槛的。这时候,结构化的需求分析能力,就会变得非常重要。关于这个问题,我推荐何勉老师的“需求分析金字塔”给大家:
金字塔的每个层次都还包含了很多关键实践。这些实践本身很重要,我也看到了许多由于人工智能的引入带来的新的实践方法的机会,本文写不下这部分内容,我们后续专门展开。
Part.5
Part.6
分而治之是我们简化复杂性的重要手段。通过将大问题分解成高内聚、低耦合的小问题,把大问题模块化,然后定义清楚它们之间的边界,逐一解决,各个击破。同时由于模块化,我们还可以复用之前已经完成的工作,提高效率,避免重复劳动。
在人工智能时代,这一点变得更加重要。其实人工智能是可以帮助我们更好地做模块化的,但是它仍然需要人类工程师的指引和协作。你现在就好比是人工智能的老板,它是你的下手。作为老板,如果你自身对好的模块化理解很到位,自然助手也很高效。如果强大的人工智能面对的是个没事品味的“老板”,结果自然可想而知....
模块化的意义还远不止如此。其实类似于langchain等技术方案,已经为我们展示了在大模型时代的一些更好的服务协同和服务能力组装的方式。
Part.7
演进式设计,问题不变,方式值得重新思考
可变更性是软件的根本特征,持续演进能力,正如自然界的进化一样,都是本质。
涉及到演进式设计的实践太多,我们无法逐一论述,选我认为重要的,直接给一些结论吧。如果认为结论需要更多论证,请大家评论区留言。
重构:重构在过去是一个极为重要的敏捷实践。这一点看Martin Fowler的经典著作《重构》的流行度就可以知道。重构在大模型时代,在契约明确的情况下,这个实践很可能会有重大变化。换句话说,当重写的成本极低,而且可靠性极高的情况下,小步重构的手法和重要性可能不再重要。
自动化测试:自动化测试是契约的保障,重要性不会降低。
测试驱动开发:经典的测试驱动开发方法会发生变化。更可能的方向:一个是人类用测试表达契约,然后人工智能负责实现。另外,给大家报告一下,作为测试驱动开发的积极实践者,我最近使用测试驱动开发写代码的频率其实降低了。
结对编程:一个好消息,如果你过去就认同结对编程的理念,也熟悉结对编程的方法,现在你一定是如鱼得水,因为你有了一个知识非常渊博的编程助手。
持续集成:更为重要,因为业务变化会更快。
整洁代码:最近的体会是,人工智能帮我写出来的代码,比我看到的“专业的人类程序员”写出来的,好太多。整洁代码,作为软件开发的入门级实践,或许真的已经不再需要了。相比过去推广起来的困难,训练一个学习能力更强的机器助手,其实容易得多。
...
Part.8
但是,作为技能,语言和框架的重要性未必降低,学习难度大幅下降了。基本的状态就是,对一名有一定积累的程序员——随便什么语言,在AI的帮助下都可以轻松编写和阅读!写起来也快多了,现在已经是Tab-Tab-Tab了,也许,过不了多久,就真的很少动手亲自写了,大多数工作,都是人工智能代劳。
如果你本来就是语言和框架的专职维护者的人除外。
(最后呼应一下文章开头:作者的著作在豆瓣的评分)
作者:张刚
来源:演进式设计
版权申明:内容仅供分享学习,版权归原创者所有
未完待续
如果想要了解更多关于软件研发行业内最新资讯与顶尖案例,请关注即将于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;">