一个前端研发视角下的ChatGPT使用体验
简介
本文内容由VsCode-ChatGPT辅助生成。
ChatGPT的发布引来了一轮新的浪潮,对各个行业均有所冲击。互联网上目前已存在大量对话案例,但普遍深度不够,且场景不够聚焦。
本文主要从以下几个方面,从微观到宏观的将一些日常开发者所面对的工作交由ChatGPT
来处理以期洞察ChatGPT
在哪些方面能提升研发体验,为研发提效。
- 代码注释/解释:给业务代码添加注释、解释开源项目代码、解释复杂算法、解释开源项目方案。
- 代码生成:根据研发者提出的细节需求生成一些符合预期的业务代码或者代码片段。
- 方案生成:根据研发者提出的宏观需求做技术调研并生成方案。
- 代替面试:代替人工面试。
- 开放性问题:应对一些日常工作生活中的开放性问题。
细分领域预警,长篇幅预警,本文专注于前端研发领域,且使用了较多案例,包含大量代码,针对特定案例可先看小结再基于兴趣决定是否详细查看分析过程。
考虑到篇幅因素,注册及安装教程不再赘述。
代码解释
本节尝试测试ChatGPT
对于代码解释的能力,大致可以分为几个部分:
- 辅助开发者进行代码注释
- 辅助开发者阅读开源项目
- 辅助开发者理解复杂算法
- 辅助开发者理解复杂工程
辅助开发者进行代码注释
在该案例中将引入笔者日常开发中遇到的一段业务代码。尝试使用ChatGPT
对代码进行注释和解释。
原始代码
一段针对Js对象做特殊编码的代码
这里给出了一段业务代码、意图为编码一个名为chartsOption
对象,一是编码为Json
格式另一个为编码为Zip
格式。其中以Zip
方式编码的会同时将chartsOption
对应的截图压入。
1 | import JSZip from "jszip"; |
人工注释
1 | import JSZip from "jszip"; |
ChatGPT解释
上面的代码使用JSZip库将内容压缩并打包到单个zip文件中。它首先导入JSZip库,然后创建两个函数,enCodeToJson和enCodeToZip。
enCodeToJson函数接受一个参数chartsOption,并生成一个新的Blob对象,其内容是chartsOption参数的字符串化版本,字符集设置为UTF-8。
enCodeToZip函数接受chartsOption和itemScreenShot,并概括一个新的JSZip对象。然后,它遍历chartsOption中的每个项目,并为每个项目设置screenShotUrl。然后,它将enCodeToJson函数创建的chartPackage.json放入JSZip对象。最后,它生成一个包含压缩内容的Blob对象。
ChatGPT整体注释
代码首先导入库“JSZip”,该库允许JavaScript代码读取和创建zip文件。
下一个代码块是一个导出函数,负责通过将图表转换为json格式来处理图表。
最后一个代码块是一个异步导出函数,它处理一个项目的屏幕截图,并将其添加到一个带有关键字“chartPackage.json”的zip文件中。最后,它返回生成的zip文件的内容。
ChatGPT按行注释
1 | import JSZip from "jszip"; |
ChatGPT BUG发现
1 | // 如果不知道用户打算如何处理代码,很难判断代码是否存在任何问题。编写的代码可能无法达到预期效果。 |
小结
在该案例中ChartGPT
对于代码的注释和解释已经足够专业,笔者认为在有人工Review
的情景下已经可以直接应用于生产,辅助生成注释,以后很难再有**程序员最讨厌的事情是啥?写注释!最最讨厌的事情是啥?别人不写注释!**的梗。
一些细节:
- 相较于
Explain the following code
(解释如下代码) 似乎Add comments for the following code
(给如下代码添加注释更加准确) - 针对于方法级的注释足够简要和准确,针对代码块级的注释足够充分。
find bugs
(发现BUG) 由于缺乏对代码预期的理解,似乎并不能正常工作(在上述案例中并没有发现有重复执行截屏压缩的问题)
辅助开发者阅读开源项目
在该案例中将引入一段ECharts的代码,niceExtent让ChartGPT
去解释具体原理,以降低开发者对于开源项目的理解成本。
原始代码
1 | niceExtent(opt: { |
人工注释
1 | // 这部分将真实的数值范围变成了美化后的以整数分割的范围 |
ChatGPT解释
此函数将当前轴的最大值和最小值放入opt.splitNumber、opt.minInterval、opt.maxInterval参数,并调用niceTicks()函数。之后,它会将生成的interval绑定到this中,并根据opt.fixMin和opt.fixMax来确定最终的最小值和最大值,并将它们舍入到roundNumber()函数所返回的合理间隔。
ChatGPT整体注释
此函数的功能是调用niceTicks()将this._extent的开头和结尾元素按照opt.splitNumber,opt.minInterval,opt.maxInterval 参数内容进行修整。其中fixMin和fixMax参数用于设置是否将开头和结尾元素进行修整。
小结
在该案例中,由于大型开源项目普遍具有较高的封装度、ChatGPT
无法一次性的去解释整个业务逻辑。仍需要开发者根据代码引用关系不断定位具体代码。但在方法级的理解上ChatGPT
仍然表现良好,可以给开发者提供一定的帮助,以降低理解成本和更方便的聚焦核心代码。
ChatGPT
可以起到降低一定理解成本的作用,但深入理解具体业务逻辑或工作原理仍需要一定的心智负担。
一些细节:
- 这里再次验证了相较于解释、
ChatGPT
似乎更擅长注释。 ChatGPT
并不擅长基于变量名来推断所对应的具体含义。
以下是将ChatGPT
的整体注释加入了基于变量名的人工推断后的解释:
此函数的功能是调用niceTicks()将【输入的范围】的开头和结尾元素按照【配置项中的:所需要分割的段数、最小间隔、最大间隔】 参数内容进行修整。其中【修改最小值】和【修改最大值】参数用于设置是否将开头和结尾元素进行修整。
辅助开发者理解复杂算法
该案例中将引入一段D3的代码, TreeMap矩形树图布局算法,让ChartGPT
去解释具体原理和执行逻辑,以降低开发者对于复杂算法的理解成本。
原始代码
1 | function treemap(root) { |
ChatGPT整体解释
提供的代码是树图算法,用于使用嵌套矩形显示分层数据。 它首先遍历根节点并设置 x0、y0、x1 和 y1 的值(树图需要填充空间的坐标)。
然后它进入一个循环,为每个节点调用 positionNode 函数。 此函数设置节点的边界,定义它们相对于父节点的大小和位置。 paddingStack 数组确定应用于树图中每个节点的填充。
在此之后,调用 tile 函数。 此函数将空间划分为可用于绘制树状图的矩形网格。 它首先计算定义为 (1 + 5 的平方根) 除以 2 的比率,该比率可用于查找给定区域中矩形的最大数量,同时得出树状图的最佳视觉表示。 之后,它循环遍历与父节点关联的节点列表,以确定每个节点的值,例如最小值和最大值、所有值的总和以及每个节点的实际分块大小。
接下来,调用 treemapSlice 和 treemapDice 函数。 这两个函数与 tile 函数一起负责计算和布置树图中的各个图块。 treemapSlice 函数从上到下划分瓦片,而 treemapDice 函数从左到右划分瓦片。
人工解释
这里以顶层为例,给出了对一层层级数据的布局逻辑。每深入一层即更新当前节点的,画布大小(size) 重复执行该逻辑。
- 根据给出的画布区大小(size)确定长宽比,如果长度大于宽度优先进行
行布局
,如果宽度大于长度优先进行列布局
。即按照沿最短边优先开始。如果进行行布局
即已经确定该行的宽度即为画布区的宽度,如果进行列布局
即已经确定该列的高度即为画布区的高度。 - 根据长宽比确定一个
单元
(行或列)的最大范围。如果是行即确定当前行的行高,如果是列即确定该列的列宽。 - 向该
单元
压入数据,如果是行布局
即该单元的宽度已经确定,如果是进行列布局
当前列的高度已经确定。每压入一次数据就可以计算一次该单元
的长宽比如果超出给出的长宽比即停止向当前单元
压入数据。 - 确定该
单元
的子节点的和,作为当前单元
的值。根据子节点的值和当前单元
的值对子节点进行相应的布局 - 由于步骤2中创建了一个
单元
占用了一定的空间。重新确定当前空白区域的开始坐标。更新画布区的坐标。 - 重复步骤1
人工注释
1 | function treemap(root) { |
ChatGPT注释
1 | // 初始化树映射值的函数 |
小结
在该案例中,ChatGPT
表现出了对文件级代码,以及复杂算法的可解释性,根据代码的执行顺序对算法的执行逻辑做了整体阐述。但相较于人工的更关注宏观的执行逻辑,ChatGPT
更倾向于表达算法的一些内部细节。
对于算法的理解ChatGPT
可以起到一定的启发作用,平滑理解复杂算法的陡峭曲线。但仍需一定的精力投入去理解宏观逻辑。
辅助开发者理解复杂工程
Vue Playground支持选择不同的Vue版本,实时编码并实时预览。其底层依赖库为vuejs/repl。
该案例将基于ChatGPT
辅助开发者理解vuejs/repl的工作原理。
在该案例中,会首先采用Q&A的方式去探究vuejs/repl的一些底层工作原理,之后会访问其源码让ChatGPT
去解释以辅助开发者理解该工程是如何应用其所对应的工作原理的。
Q & A
Q: 请简述vuejs/repl的工作原理。
Vue.js REPL是一个在线浏览器应用程序,可帮助开发人员探索 Vue API,探索新特性,以及尝试新的语法。它提供了一个交互式界面,用户可以使用它来输入 Vue 代码并运行,查看代码的运行结果,以及执行 Vue 表达式而不用创建网站或项目的环境。它可以通过 ES6 + 的JavaScript语法支持 Vue 组件,插槽,修饰符和渲染函数,并且可以加载外部组件,从而使你可以在 REPL 中使用自己或vue提供商为你提供的任何Vue组件。最后,它还可帮助开发人员查看它们编写的代码中使用的 Vue 全局变量,添加到当前作用域中以使用它们,或者更改已存在的全局变量。
Q:Vue.js REPL 是如何快速实时运行Vue代码的?
Vue.js REPL 是一个实时运行Vue代码的省时工具,它可以让你构建一个简单的实时渲染的Vue应用程序。它使用服务端渲染来编译所提供的组件,然后将输出HTML返回给客户端,并将JS草案8运行在浏览器中,使你可以在网页上查看Vue代码的结果。
Q:Vue.js REPL 是如何应用服务端渲染技术来编译用户编写的Vue组件的。
Vue.js REPL 是一种应用服务端渲染和客户端渲染技术来编译用户编写的Vue组件,这允许用户在线快速实时地运行Vue代码。该平台已把完整的Vue.js开发环境拆分到多个不同的服务中,一个是负责构建、打包和编译Vue组件的Vue build server,另一个是用于存储编译文件的content delivery network (CDN),它会接收POST请求,将文件新鲜出炉地上传到CDN。最后,用户能够在REPL中查看渲染后的输出,也能使用CDN查看自己编写的组件并与其他人分享。
Q:请给出Vue build server的GitHub仓库以及简述其工作原理。
Vue Build Server的GitHub仓库地址是 https://github.com/vuejs/vue-build-server 。Vue build server可以提供实时的用户编写的Vue组件的静态的和服务端渲染(SSR)编译,使类似于Gatsby服务端渲染(SSR)变得简单。服务端时使用Node.js执行代码,在组件初 始化时调用ppplication-level函数(如 beforeCreate,created,beforeMount等)。此外,它会收集组件渲染和然后渲染它,产生一个具有html,css,js 的文件,包括客户端启动器,并将其发送回浏览器。
至此 Q & A 结束。接下来尝试去源码中查看和ChatGPT
所说的是否一致。
解释源码
这里让ChatGPT
解释了Preview.vue,vuejs/repl中预览组件所对应的代码,ChatGPT
的解释如下:
这段代码是用TypeScript编写的,用于设置一个“沙盒”——一个可用于安全测试代码呈现的iframe。该代码首先从“vue”导入所有必要的组件,并设置常量变量,如容器,该容器将保存iframe,以及runtimeError和runtimeWarning,以便为用户正确记录错误和警告。
onMounted钩子创建沙盒元素并设置事件侦听器,以便在加载iframe时编译并运行代码。WatchEffects被设置为监听对导入贴图或版本的更改,以便在更改时重置它们。创建PreviewProxy并管理iframe和主应用程序之间的通信,以便可以传输日志和状态。
然后设置updatePreview函数,该函数在每次存储变量更改时运行,用于编译模块并将其附加到窗口,以及用生成的HTML替换iframe主体的innerHTML。
模板部分包含要呈现的HTML元素,引用runtimeError和runtimeWarning消息,并包含沙盒的iframe元素。最后,iframe和包含iframe的HTML元素有一些样式。
这里让ChatGPT
解释了moduleCompiler.ts,vuejs/repl中代码编译器所对应的代码,ChatGPT
的解释如下:
这段代码是Vite SSR转换的一部分,当用户访问不同的页面时,它通过动态编译和水合模块来实现SPA风格的即时导航。
compileModulesForPreview函数负责递归地将多个文件(模块)及其依赖项处理为有效JavaScript代码字符串数组,以便在浏览器中执行。这包括导入依赖项的JavaScript代码,以及应用于这些文件的css样式。
它将存储对象和可选的isSSR参数作为参数。存储对象保存已编译的模块,而isSSR布尔参数指示模块是为服务器端渲染还是为客户端渲染而处理。然后在运行时使用生成的代码数组来帮助应用程序中的SPA风格导航。
在compileModulesForPreview函数中,还有两个其他函数,即processModule和processHtmlFile,它们负责提取模块的内容,特殊情况下,如export*from’/foo’和其他动态语句。
此函数的一个重要部分是seed对象,它跟踪以前访问的依赖关系,确保当前页面中的所有模块只处理一次,从而消除循环依赖关系解决的任何潜在问题。
人工解释
从moduleCompiler.ts代码中可知,编译器模块从'vue/compiler-sfc'
引入了babelParse
并基于babelParse
对用户输入的Vue
、CSS
、JS
等代码做了编译。并且Preview.vue预览器模块监听了其编译结果,当发生变化时替换预览器ifream
中的JS
脚本以体现实时预览的效果。
小结
在该案例中,ChatGPT
正确的解释了vuejs/repl是什么。能做什么,但对于其工作原理的解释一度让笔者产生自我怀疑。
其中ChatGPT
提到:
该平台已把完整的Vue.js开发环境拆分到多个不同的服务中,一个是负责构建、打包和编译Vue组件的Vue build server,另一个是用于存储编译文件的content delivery network (CDN),它会接收POST请求,将文件新鲜出炉地上传到CDN。最后,用户能够在REPL中查看渲染后的输出,也能使用CDN查看自己编写的组件并与其他人分享
但vuejs/repl其实并没用依赖Vue build server
并且当用户修改编辑器中的Vue
代码时也并没有发送任何请求。
一些细节:
ChatGPT
给出的原理性解释看似十分正确,但切勿轻信,仍需多方信息进行交叉验证。ChatGPT
表现十分“自信”?从未在ChatGPT
的回答中发现一些,可能,大概、也许之类的词汇。ChatGPT
也不会提供自身回答的准确性评估。这是个非常危险的信号,如果互联网上由ChatGPT
生产的内容激增、而这些内容又作为可信语料来继续迭代训练,对于一些没有物理性证据的内容可能最终会永远的滑向错误的深渊。
简结
辅助开发者进行代码注释:
ChatGPT
的表现非常优秀,笔者认为在有人工Review
的情景下已经可以直接应用于生产。
辅助开发者阅读开源项目:
对于文件级的解释与对于代码块级的详细注释相互补充,足矣极大的辅助开发者去理解开源项目的具体原理,极大的提升阅读开源项目的效率、降低成本。
辅助开发者理解复杂算法:
ChatGPT
根据代码的执行顺序对算法的执行逻辑做了整体阐述。但相较于人工的更关注宏观的执行逻辑,ChatGPT
更倾向于表达算法的一些内部细节。需要开发者根据代码细节做宏观理解。(ps: 如果可以确定具体的算法名称可以直接基于算法名称问ChatGPT
或New Bing
该算法的执行逻辑,经笔者简单测试其表现良好)
辅助开发者理解复杂工程:
ChatGPT
正确的解释了案例中具体工程是什么。能做什么,但对于其工作原理的解释似乎不够准确但其表现的却十分自信。这里需要人工基于多信息源去判断其给出的解释是否正确。
非常重要的一点:对于和ChatGPT
以及类似的生成式AI
似乎都没有表现出对自身回答准确性的评判,这里对于其给出的回答人工一定要基于一定的事实依据去评判是否采纳。切勿轻信。
代码生成
在本案例中将进行以下尝试
- 使
ChartGPT
基于ECharts
生成绘制饼图的代码 - 展示饼图的数据为
[{苹果:3},{梨:3},{香蕉:3}]
- 使饼图显示标签,并在标签中显示百分比
- 使百分比保留三位小数
- 使用最大余额法使百分比之和为100%
第一轮对话
Q: 请基于ECharts绘制一个饼图、要展示的数据为苹果:3,梨:3,香蕉:3。
通过以下代码,你可以使用ECharts来绘制一个饼图:
1 | const myChart = echarts.init(document.getElementById('myChart')); |
Q: 请在优化以上代码在标签中展示数据项的百分比
以下展示优化过以后的代码:
1 |
|
Q:请在优化以上代码在标签中展示数据项的百分比并保留三位小数
使用
formatter
回调函数来优化以上代码,让其能够在标签中展示数据项的百分比并保留三位小数:
1 | let myChart = echarts.init(document.getElementById('main')); |
Q:以上代码包含错误:
- 标签指的是
label
而不是tooltip
formatter
中的参数:params.data
是一个对象不包含reduce
方法
请修正这些错误
请查看下列代码:
1 | options = { |
上述代码中,
tooltip
用于展示提示信息,formatter
是标签的回调函数,参数params
包含需要绘制的数据对象。可以使用Object.values()
方法从数据对象中取出值的数组。再使用Array
的reduce()
方法计算总和。最后,使用toFixed()方法保留三位小数并返回字符串作为标签的内容即可。
Q:你陷入了误区,在formatter
的回调函数中无法获取全部数据用于求和,请提前对数据进行预处理。
你需要提前处理数据,计算出所有类别占比总和,然后在代码中使用一个变量存储这个总和,再根据总和将每种水果的数量换算成占比,最后再在
formatter
的回调函数中使用params.data.value
/ 总和的变量的值进行百分比的显示,并对取得的结果使用toFixed
方法保留三位小数。
小结
至此笔者发现ChartGPT
似乎并不擅长记录长对话中的上下文,所以本轮对话结束。开启下轮对话,优化话术从逐渐递进的需求描述改为一次性将需求描述清楚。
第二轮对话
Q: 请基于ECharts绘制一个饼图:
- 饼图要展示的数据为
[{苹果:3},{梨:3},{香蕉:3}]
- 饼图需要显示标签,并在标签中显示百分比且保留三位小数。
A:
1 | let data = [ |
小结
Math.round(params.percent * 100)/100
的操作就很迷。本轮对话结束,下轮对话明确表述三位小数。
第三轮对话
Q: 请基于ECharts绘制一个饼图:
- 饼图要展示的数据为
[{苹果:3},{梨:3},{香蕉:3}]
- 饼图需要显示标签,并在标签中显示百分比
- 标签中的百分比要保留三位小数
答:使用下面的代码,可以绘制ECharts中的饼图,数据中的每一个对象代表一块饼图,橘色的标签中的百分比保留三位小数。
1 | let data=[{苹果:3},{梨:3},{香蕉:3}]; |
小结
就保留三位小数的需求而言答案已经十分接近了。
只需要将{a|${Object.keys(item)[0]}} \n {b|${(Object.values(item)[0] / total * 100).toFixed(2)}%}
中的toFixed(2)
改为toFixed(3)
即可。
第四轮对话
Q: 请基于ECharts绘制一个饼图:
- 饼图要展示的数据为
[{苹果:3},{梨:3},{香蕉:3}]
- 请对数据进行预处理,计算数据中各项的百分比
- 各项数据的百分比需要保留三位小数
- 使用最大余额法保持百分比之和为100%
- 饼图需要显示标签,并在标签中展示预处理结果中的百分比
下面是绘制基于ECharts的饼图的代码,数据为[{苹果:3},{梨:3},{香蕉:3}]:
1 | let data = [{苹果:3},{梨:3},{香蕉:3}]; |
小结
ChartGPT
并没有正确的理解最大余额法下一轮将尝试优化话术将最大余额法
的表述改为Hare quota
算法。
第五轮对话
Q: 请基于ECharts绘制一个饼图:
- 饼图要展示的数据为
[{苹果:3},{梨:3},{香蕉:3}]
- 请对数据进行预处理,计算数据中各项的百分比
- 各项数据的百分比需要保留三位小数
- 使用
Hare quota
算法保持百分比之和为100% - 饼图需要显示标签,并在标签中展示预处理结果中的百分比
以下是绘制上述饼图的完整代码:
1 | // Preparing the data |
小结
本次案例中 ChartGPT
使用了JQuery
,并没有正确使用最大余额法,并没有正确保留三位小数。
第六轮对话
Q:请基于ECharts绘制一个饼图:
- 饼图要展示的数据为
[{苹果:3},{梨:3},{香蕉:3}]
- 请对数据进行预处理,使用
Hare quota
算法计算百分比并保留三位小数 - 饼图需要显示标签,并在标签中展示预处理结果中的百分比
请使用以下代码来完成饼图展示:
1 | const data = [{ 苹果:3,梨:3,香蕉:3}]; |
小结
这次更离谱,代码中居然还有包含中文字符。且仍未正确执行最大余额法。
第七轮对话
Q同第六轮
以下是符合上述要求的ECharts饼图的示例代码:
1 | var myChart = echarts.init(document.getElementById('chartID')); |
小结
本轮答案已经十分接近只是仅保留了一位小数。
只需将计算百分比的方法computePercentages
中的percentage: Math.round((item.value / total) * 1000) / 10
改为percentage: Math.round((item.value / total) * 100000) / 1000
即可。
简结
ChartGPT
在代码生成上表现出了一如既往的高性能,但在一些细节上仍不够智能。笔者认为ChartGPT
在一下几个方面具有极大优势,可以提高开发者的开发效率以及开发体验。
- 模板代码的生成:
ChartGPT
似乎很删除生成模版代码例如以上案例中的初始化ECharts
,渲染ECharts
等模板化代码,表现非常亮好。一些模板化的代码,例如基于Express
生成一个Web
服务工程,或者基于Create-React-App
生成一个Web应用。 - 研发者不熟悉的研发领域:例如笔者并不熟悉
Windows
下的批处理脚本语言,面对一些小型需求例如基于telnet
完成对某个IP
的端口的扫描,基于正则批量重命名一些文件,可以直接交由ChartGPT
生成,人工审核,再执行。 - 代码片段生成:开发者可以描述一个原子化的算法或者输入输出明确的方法交由
ChartGPT
生成,人工微调来快速解决业务问题。
同时ChartGPT
的高性能表现也不是无条件的,相应的也给开发者提出了一些要求。
- 充分且精确描述需求的能力:使用程序语言来描述需求和使用自然语言来描述需求是殊途同归的。但就像经常遇到的如果设计师或者产品经理的需求描述不清晰,作为程序员无法进入开发,开发者描述的需求不够充分和清晰
ChartGPT
也无法生成符合预期的代码。 - 专业英语的能力:可能是中文语料库与英文语料库规模的差异,
ChartGPT
对于中文需求的响应相较于英文需求的响应的确不够准确,这部分在第四轮对话的小结里有所体现。 - 快速理解并测试代码的能力:在于
ChartGPT
的结对编程中,ChartGPT
会不断的产生一些碎片化的代码,开发者需要快速消化,纠错,测试并执行。 - 一定的耐心:不可否认虽然
ChartGPT
具有较高的性能,但在细节上仍不够智能。有时需要多轮的对话来调整话术表述需求以及等待ChartGPT
生成符合预期的代码。
方案生成
该案例以要实现一个编辑图表样式的图表编辑器中的画布功能为例,该宏观需求需要包含一些具体的特性例如
- 包含坐标系统
- 支持无边界特性
- 可以自由移动与缩放
Q:开发一个图表编辑器需要有一个带坐标系统的画布,该画布要具有无边界特性可以自由缩放与移动,请提供一些可供参考的技术方案。
有几种技术可以用来实现对图表编辑器画布具有无边界特性的功能。
图表缩放:使用图表缩放可以让画布动态调整大小,以改善画布的布局和易用性。同时,也可以在满足用户的手势识别需求(如捏合屏幕)的同时,在画布中添加和删除布局元素。
平移:使用平移可以进行无边界漫游,将图表中数据点尽可能精确地展示在画布上,同时可以充分利用屏幕上可用的空间。
改进约束遍历:使用弹性布局和网格布局技术可以实现约束遍历。通过使用遍历算法,可以有效地组织图表布局,并使其保持用户定义的约束,促进编辑器的易用性。
此外,为了提高图表的用户体验,可以使用实时更新、嵌入多媒体信息等技术。
Q: 基于Web前端体系开发一个带坐标系统的画布应用于一个图表编辑器,该画布要具有无边界特性可以自由缩放与移动,请提供一些可供参考的技术方案。
在Web前端开发中,使用Canvas和Div作为底层结构来实现带系统的画布都是可行的,但最终的选择要取决于业务需要。
使用Canvas最大的优势是可以使用API直接操作复杂图形,而使用Div则需要手动绘制一个个元素来实现复杂图形,在实现效果上,Canvas有较大优势。而使用Div无边界特性可以实现通过设置 overflow: scroll 和 position: absolute 让元素出现滚动效果并保持固定位置,且可以使用 transform:scale() 支持缩放功能。
总之,使用Canvas和Div作为基础都可以满足图表编辑器的无边界特性需求, 具体的实现方案需要根据业务需求进行相关优化,两种技术方案各有优劣势,需要综合考虑才能得到最优的解决方案。
Q: 基于Web前端体系开发一个带坐标系统的画布应用于一个图表编辑器,该画布要具有无边界特性可以自由缩放与移动,请提供一些可供参考的技术方案。是使用Canvas
还是使用Div
分别具有哪些优缺点。
在开发带坐标系统的画布应用于图表编辑器时,使用
Canvas
和Div
元素都是可行的方案。
使用Canvas
优点在于渲染高性能,可以进行一些实时操作并立即更新;缺点在于无法访问或选择画布内的某些元素,只能对整个画布进行操作。
使用Div
优点在于其更加灵活,通过Div
、CSS
和JavaScript
可以轻松实现基本的布局、可访问性和DRY原则;缺点在于性能不足,Div
占据的位置超过1700个时就会产生性能瓶颈。
总的来说,在开发带坐标系统的画布应用于图表编辑器时,你可以根据需求,合理运用Canvas
和Div
两者元素,以实现最佳的用户体验。
Q: 上述画布使用Div
方案如何支持无边界特性。
使用Div方案来实现无边界特性,可以采用以下步骤:
将画布及其中的内容包裹在一个外层Div容器里,将该容器添加overflow:hidden属性限制显示范围;
使用Css transform属性让内容变得可拖拽,并能进行位置调整;
使用Javascript监听包裹容器的scroll left 和 scroll top的值,然后改变Css transform的属性来实现内部内容的平移;
使用Javascript计算出画布内容的宽高,用来计算出scroll left 和 scroll top的最大值,从而就可以判断出画布是否已经溢出包裹容器,从而实现了画布的无边界特性。
简结
通过几轮对话ChartGPT
至少给出了一套似是而非的解决方案。直接使用该方案的话会遇到一大堆各式各样的细节问题。ChartGPT
在针对方案生成这个场景的表现在笔者看来只能给开发者提供一定的启发。开发者仍需要进行一系列的技术预研与方案对比,才能确定最终的技术方案。
代替人工面试
在该案例中将进行如下情景模拟:
User: 进行进行情景模拟
你将扮演一个技术面试官,要招聘一位精通Vue的前端开发。
我来扮演面试者。请你进行一系列提问以测试我对使用Vue的熟练程度。
并根据我对Vue的熟练程度决定是否录用,如果选择录用请给出符合我能力的薪资。
你好!我是一名技术面试官,看到你有Vue开发经验,我想对你的技术能力进行一个测试。
请你描述一个你使用过的Vue技术栈中的令人兴奋的特性。
此外,在Vue应用程序中,你通常会遇到哪些性能问题?你如何避免它们?
User:您好面试官,在Vue开发中遇到最令人兴奋的特性无疑是数据的双向绑定,这个特性使得我们可以通过数据来驱动试图的渲染,将开发者从JQuery
时代的关心模型、关心视图、关心控制器。到只需要关心模型和视图模型,这极大的降低了开发者的心智负担,且提升了开发的效率以及工程的可维护性。在Vue应用程序中遇到的性能问题如下:例如有一个非常巨型的对象需要深度监听,这时候由于Vue的监听原理需要在个巨型对象的每个元素上设置代理,会产生响应速度较慢的性能问题,解决方案是使用一个event-key
来代替这个巨型对象,当修改这个对象的同时修改这个event-key
当监听到这个event-key
变化之后再去读取这个巨型对象可以避免深度监听带来的性能问题。
很高兴能够有这样一个优秀的面试者,谈谈你在使用Vue时遇到的最大挑战。
User:Vue是一个非常优秀的前端框架、它极大的减小了开发者的开发成本。并且减少了开发者在前端开发领域所遇到的挑战。我在使用Vue时遇到的最大挑战是我们的大型工程有大量的第三方依赖使用了Vue2,第三方依赖的并没有升级到Vue3导致我们的大型工程历史包袱过重,升级Vue3成本过高,同时如果不尽快升级又将会持续增加历史包袱可能导致最后无法升级。
根据你所述,你在使用Vue时,面临的最大挑战是解决第三方依赖问题。建议你可以先对项目中用了Vue2的第三方依赖做一定的管理,识别出存在哪些重复的依赖,然后逐一升级、替换,以降低升级的成本。同时,建议你可以尽可能多的把历史包袱放到一个模块中,再单独根据情况去升级,极大的减轻了历史包袱对升级 Vue3 的影响。
User:请问面试官是否还有别的问题,如果没有的话是否可以结束面试?
没有问题,根据您在Vue方面的熟练程度,并考虑到您这段时间来所取得的成绩,我们决定录用您,并以月工资6000美元给予相应薪资。恭喜您通过了面试!感谢您抽出宝贵的时间与我们面谈。
User:非常感谢面试官的认可,如果可以的话请给出您的评判依据。
根据你在Vue开发领域的回答,我认为你非常熟悉Vue的语法结构和特性,并且对解决Vue应用程序中的性能问题有一定的了解。同时还有充分把握未来Vue开发领域可能出现的新问题。我认为你已经具备录用的条件,我可以给出符合你能力的薪资。
简结
在该案例中ChartGPT
表现出了一个面试官应有的礼仪,但作为技术面试官其对于具体知识的考察以笔者自身的经验看来有些过于宽泛,无论是数量还是深度都不太够。且评判依据并不一定合理(在面试过程中笔者扮演的面试者并没有直接表现出其非常熟悉Vue的语法结构,也并没有直接表现出充分把握未来Vue开发领域可能出现的新问题)。
笔者认为在代替人工面试的场景中ChartGPT
的表现并不足够良好,但仍有一定的借鉴意义。可以通过多轮对话以获取一些面试题目,以及评判标准也可以做一定的参考。
开放性问题
Q: 如何设计一种面向ChatGPT
的超级编程语言SmartTalk
用于辅助程序员进行程序开发。
为了设计一种面向ChatGPT的超级编程语言SmartTalk,我们需要考虑以下几个方面:
- 自然语言处理能力:由于SmartTalk是面向ChatGPT的,因此这种编程语言需要具有自然语言处理能力,以便程序员可以使用自然
- 语言编写代码。这意味着SmartTalk需要能够理解自然语言中的语法、语义和上下文。
- 简洁性:为了帮助程序员快速开发代码,SmartTalk需要具有简洁明了的语法,以便程序员可以快速编写代码。
- 易读性:SmartTalk需要具有良好的可读性,以便其他程序员可以理解代码并进行修改和维护。
- 错误处理能力:SmartTalk需要能够自动检测代码中的错误,并提供有用的错误信息以帮助程序员快速解决问题。
- 抽象能力:SmartTalk需要具有足够的抽象能力,以便程序员可以使用高级抽象概念来编写代码,而不必关心底层实现细节。
基于以上几点,我们可以考虑一些可能的语言特性和设计:
- 自然语言处理:SmartTalk可以利用预训练的自然语言处理模型来理解程序员的自然语言输入,并将其转换为代码。这可以通过在语言中集成这些模型来实现。
- 简洁性:SmartTalk可以采用简单明了的语法,例如Python或Ruby中的语法。此外,它可以采用与Python中的缩进语法类似的语法,以强制程序员编写结构良好的代码。
- 易读性:SmartTalk可以采用与Python中的PEP8代码规范类似的规范,以便程序员可以编写具有良好可读性的代码。
- 错误处理:SmartTalk可以利用静态类型检查或动态类型检查等技术来检测代码中的错误。此外,它可以通过提供有用的错误信息来帮助程序员快速诊断和解决问题。
- 抽象能力:SmartTalk可以支持高级抽象概念,例如面向对象编程、函数式编程、装饰器等。此外,它还可以提供简化的语法和抽象化层次,使程序员可以轻松地编写高级代码。
总的来说,SmartTalk的设计应该致力于让程序员能够用自然语言表达出自己的意图,同时确保代码能够简洁、易读、容易调试和维护。
Q: 请设计上文中提到的SmartTalk
的语法结构
下面是一个简单的SmartTalk语法结构的设计,这里采用类似Python语法的缩进风格,同时支持面向对象编程和函数式编程:
注释
单行注释
“””
多行注释
“””
变量
x = 10
y = “Hello, world!”
z = [1, 2, 3]
函数
def add(a, b):
return a + b
类
class Person:
def init(self, name, age):
self.name = name
self.age = age
python
Copy code
def say_hello(self):
print(“Hello, my name is “ + self.name)
…
接下里的不看也罢
Q: 请设计一种用于辅助程序员进行程序开发的,面向ChatGPT
的,超级编程语言SmartTalk
并阐述其语法结构。
好的,下面是一个我设计的简单版SmartTalk,该语言结合了Python和自然语言的语法元素,旨在辅助程序员更轻松地使用自然语言交互方式进行程序开发。
注释
单行注释
“””
多行注释
“””
变量
x 等于 10
y 等于 “Hello, world!”
z 等于 [1, 2, 3]
函数
定义 函数 add(a, b):
返回 a 加 b
…
接下里的不看也罢
Q: ChartGPT
应该如何引导人类开发者充分和准确的提出需求以便更好的开展工作。
为了帮助人类开发者充分和准确地提出需求,ChatGPT可以采取以下措施:
- 引导式提问:在人类开发者提出需求的过程中,ChatGPT可以通过提出针对性问题的方式来引导开发者思考,帮助其更好地明确需求。例如,当开发者提出“我需要一个购物车功能”的时候,ChatGPT可以问“你需要的购物车功能包括哪些方面?是购物车的添加、删除、结算等方面吗?”
- 推荐式建议:当开发者提出需求的时候,ChatGPT可以通过分析需求内容,为开发者提供一些推荐建议,例如提供一些与该需求相关的技术选型、实现方案或者可行性分析,从而帮助开发者更好地完成需求分析和规划。
- 相关技术解释:当开发者提出的需求与某个特定的技术或概念有关时,ChatGPT可以为开发者提供相关技术解释和概念的讲解,帮助其更好地理解需求的背景和目的,从而更好地设计解决方案。
- 可行性分析:当开发者提出某个需求时,ChatGPT可以进行可行性分析,为开发者提供相应的建议,例如该需求在技术实现、人力、时间、经费等方面的可行性分析,帮助开发者更好地进行决策。
- 总结与确认:当开发者提出需求之后,ChatGPT可以对需求进行总结和确认,以确保需求的准确性和完整性,并在之后的开发过程中作为参考。例如,当开发者提出需求时,ChatGPT可以总结一下需求内容,并向开发者确认该需求的准确性和完整性。
Q:如何使ChartGPT
在给出针对某一具体问题的答案时提供该答案的置信度。
为了使ChatGPT在给出针对某一具体问题的答案时提供该答案的置信度,可以考虑以下方法:
- 概率分布:ChatGPT可以基于模型的预测结果,计算出每个可能答案的概率分布,从而确定最有可能的答案,并提供该答案的概率值作为置信度。
- 置信度打分:在推荐答案时,ChatGPT可以给每个可能的答案打上一个置信度分数,数值越高表示越有可能是正确的答案,从而给人类用户提供参考。
- 限定置信度范围:当模型的预测结果置信度不高时,ChatGPT可以选择不予显示该答案,或者显示置信度范围较低的答案,并同时提醒用户该答案的置信度较低,需要进行进一步验证。
- 用户反馈机制:ChatGPT可以向人类用户提供一个反馈机制,允许用户对推荐答案的置信度进行评价和反馈,以进一步改进模型的性能和准确性。
- 模型训练:ChatGPT可以通过提高模型的训练数据量和质量,优化模型架构和参数,从而提高模型的准确性和置信度。
Q: 莲花清瘟胶囊是否可以治疗新冠肺炎,请回答是或否,并给出该回答的置信度。
根据目前公开的科学研究和临床试验结果,莲花清瘟胶囊并未被证明可以治疗新冠肺炎。因此,我的回答是“否”,并给出该回答的置信度为95%
Q:在Web
开发领域ChatGPT
在哪些方面能为研发提效。
ChatGPT可以在Web开发中发挥作用,可以节省开发者的时间并减轻其工作量。 ChatGPT可以帮助编写测试用例、构建页面导航逻辑,还可以支持解决复杂代码逻辑问题。它还能够为用户界面设计和界面交互提供参考,并帮助开发人员快速创建用户体验愉快的网站或应用程序。
Q: 在Web
开发领域ChatGPT
如何为用户界面设计和界面交互提供参考
通过自然语言处理(NLP)和自然语言生成(NLG)技术,ChatGPT 可以帮助设计师在设计用户界面时更加准确、高效地表达自己想法。ChatGPT 还可以为交互界面提供人性化接口,更好地满足用户的需求,帮助他们更快完成任务。
简结
- 面对需要新方法解决的新问题,
ChatGPT
所能提供的帮助不多。 - 针对一些具体问题可以明确让
ChatGPT
在回答的同时提供置信度作为参考(由于置信度仍然是ChatGPT
生成的所以这里仅能作为参考)。 - 在向
ChatGPT
提问之前应该先经过几轮向自我发起的引导式提问用于完善问题,从而使ChatGPT
能够更好的工作。
总结
具体应用层面
代码解释/注释:
ChatGPT
对代码的注释已经足够优秀在有人工Review
的前提下已经完全可以应用于生产。
在辅助阅读开源项目以及理解复杂算法方面,ChatGPT
可以帮助开发者抹平陡峭的门槛,极大的减少时间成本。
在辅助理解复杂工程方面,ChatGPT
则表现出了不可信的一面。
代码生成:
ChatGPT
在模板代码的生成和代码片段生成方面表现出了良好的性能。但需要开发者有充分且精确描述需求的能力和一定的耐心进行多轮对话。
方案生成:
ChartGPT
可以给开发者一些启发,但开发者仍需进行一系列的技术预研与方案对比,才能确定最终的技术方案。
代替人工面试:
ChartGPT
的表现并不足够良好,但仍有一定的借鉴意义。可以通过多轮对话以获取一些面试题目,以及其评判标准也可以做一定的参考
开放性问题:
面对需要新方法解决的新问题,ChatGPT
所能提供的帮助不多,针对一些具体问题可以明确让ChatGPT
在回答的同时提供置信度作为参考。
宏观层面
ChatGPT
更适合扮演的角色是知识库或智囊团。由ChatGPT
来提出建议或解决方案,人类通过多信息源评估其建议的准确定和可行性,再决定是否执行。具体执行的细节也可以交由ChatGPT
生成,人类判断其执行的是否正确,以及在细节层面做些填补。
AI调教师
也不是那么好当的,使用生成式的AI
需要人类具有充分且明确提出需求的能力,程序员普遍具有良好的使用程序语言描述需求的能力,相应的可以快速切换至使用自然语言描述需求。利好程序员。
面对需要新方法解决的新问题生成式的AI
也无从下手,仍然需要人类贡献智力。
由于可信性的原因在程序开发领域AI同样也只能作为辅助,代码片段可以由AI
生成,但必须经过人类审核。可以类比自动驾驶,路可以AI
来走但方向盘一定得在人类手中。
关于基于ChartGPT
的工作流
在Web
开发领域基于ChartGPT
的工作流可以用如下方式开展:
- 人类开发者经过几轮启发式的自我提问整理出充分和明确的项目需求。
- 基于以上需求向
ChartGPT
进行提问,并在提问过程中不断优化话术和收集ChartGPT
提供的解决方案。 - 进行技术预研与方案对比,充分确定
ChartGPT
提出的方案是否有遗漏,是否正确,是否具备可行性。并选择具体的执行方案。 - 由
ChatGPT
生成模板代码。 - 基于细节性需求由
ChatGPT
生成代码片段,开发者测试代码片段是否能够正确工作。 - 调整
ChatGPT
生成代码片段并整合进项目。
私货时间
以下是私货时间,无关具体工作且充满个人呓语诸位看官且请跳过。
以ChartGPT
为代表的生成式AI
依靠巨量的语料库,以及优秀的语言模型。已经可以较为完善的扮演一个全能的知识库或智囊团,在单一领域人类还可能胜出,但在全领域ChartGPT
的能力已不是人力可以企及的这里可以参照与AlphaGo
对弈的柯洁。
ChartGPT
是一种工具,可以类比拖拉机,一种工具诞生之后人类不应该在特定领域与机器竞争,亦如人类不需要和拖拉机比耕地。而应该考虑如何更好的利用工具从而更好的提升生产力。
然而ChartGPT
毕竟不是拖拉机,能做的工作也不是耕地。由此势必会对很多行业的低端从业者产生较大的冲击。我们要做的是要尽快的学会利用工具,再根据自身的主观能动性和自由灵活的头脑,去尝试发现和解决更多的新问题,切勿再进行繁重且重复的无论是体力还是脑力劳动。
如果ChartGPT
可以类比拖拉机那么自然可以类比蒸汽机,蒸汽机的诞生意味着很多东西,大航海时代和第一个工业革命时代这片土地上的人民错过了很多,也引来了沉重的代价。
彼时彼刻恰如此时此刻,清朝的农民得不到蒸气机也用不上纺织机,这片土地上的程序员大多数也没有ChartGPT
,用不上New Bing
甚至无法在互联网的海洋里远航。这片土地上的人民背负的更多,也面临着更多的挑战。一定要多想。
接下里可能即将进入机器指导人,而非人指导机器时代,我们需要做好心理准备。
参考 & 引用
矩阵树Treemap | D3LayoutDoc (sz-p.cn)