如果你是程序员,那么在你写程序前应有一个明确的目标。这个目标可能是你的老板提的,可能是你的客户提的,也可能是你自己的想法。如果是别人的想法,你希望最好能写成明确的需求文档,正常逻辑和异常逻辑都能事先考虑清楚,而不是在写程序过程中反复沟通确认,甚至最后还要返工。你还希望尽早知道这个功能要服务的用户群体是谁,解决用户哪方面的痛点,想要达成怎样的业务效果,预期能带来多少收入。
现在你使用ChatGPT作为你的助手,它需要你下达命令。
假如你是公司的资深程序员,你的老板给你安排了一项任务:做一个H5页面,把公司采集的微博数据中当天讨论量最大的10条微博展示出来。
你的思路是:微博数据之前已经做了采集,并存在数据库中,每条微博讨论量数据也接近实时更新,首先要写一个程序来计算讨论量Top10的微博,然后写一个API查询Top10的微博列表。前端需要写一个列表页和一个内容详情页,非常简单。
然后你打算把这件事交给ChatGPT,你可以试着这么问,看看它怎么说。
做一个H5页面,把公司采集的微博数据中当天讨论量最大10条微博展示出来。
好的,以下是一个简单的实现思路。
1. 获取微博数据:从公司采集的微博数据中,筛选出当天的微博数据。
2. 计算讨论量:将获取的微博数据按照转发数、评论数、点赞数等指标进行排序,得到当天讨论量最大的10条微博。
3. 设计H5页面:使用HTML、CSS和JavaScript等前端技术,设计并实现一个简洁、美观的H5页面,用于展示当天讨论量最大的10条微博。可以使用一些现成的前端框架和组件库,如Bootstrap、jQuery等,来加快开发进度。
4. 展示微博数据:将计算得到的当天讨论量最大的10条微博数据,按照一定的布局方式展示在H5页面上,包括微博文本内容、转发数、评论数、点赞数等信息。可以使用一些现成的UI组件,如列表组件、卡片组件等。
5. 实时更新数据:为了保证展示的数据实时性,可以使用定时器定时获取最新的微博数据并进行计算,然后更新H5页面中展示的微博列表。
总之,这个任务需要一些前端开发和数据处理的技能,如果您不熟悉这些技术,可以考虑寻求专业的开发团队的帮助。
ChatGPT好像是猜到了你的想法,把你刚才心中所想的又复述了一遍,并且更有条理,但这并不是你想要的答案。
你想要ChatGPT帮你写代码。这样就得细化一下需求,把任务拆分成前端代码和后台代码。
前端需要一个列表页,列表页长什么样?老板好像没有说。所以首先要跟老板确认,明确页面的风格、展示元素,以及内容详情页的细节。你现在不仅是程序员,还得是懂业务、懂老板想法并且会写代码的产品经理,需求文档就需要由你来写了。
比起写需求文档,你可能更愿意写代码。能不能不写文档,而是让ChatGPT来完成?ChatGPT见多识广,应该看过微博热搜列表页。于是你又提了一个Prompt:
仿照微博热搜列表页,写一个HTML页面。
好的,以下是一个简单的实现思路。
1. 设计页面结构:仿照微博热搜列表页,设计一个简单的页面结构,包括一个顶部导航栏、一个热搜列表、一个底部的分页控件等。
2. 使用HTML和CSS实现页面布局:根据设计好的页面结构,使用HTML和CSS实现页面布局。可以使用一些现成的UI框架和组件库,如Bootstrap、Semantic UI等,来加快开发进度。
3. 使用JavaScript实现数据绑定:使用JavaScript从后端获取热搜数据,并将数据绑定到HTML页面的热搜列表中。可以使用一些现成的JavaScript框架和库,如jQuery、Vue.js等,来简化数据绑定和DOM操作。
4. 实现分页功能:使用JavaScript实现热搜列表的分页功能,当用户点击分页控件时,根据当前页码获取对应的热搜数据,并重新渲染热搜列表。
5. 美化页面样式:使用CSS美化页面样式,包括颜色、字体、边框等方面。可以参考微博热搜列表页的样式,或者根据自己的需求进行设计。
总之,这个任务需要一些前端开发的技能,如果您不熟悉这些技术,可以考虑寻求专业的开发团队的帮助。
你想让ChatGPT帮你写代码,但它一直在写思路。所以要明确一下ChatGPT的角色,再细化下它的具体任务,就像产品经理写需求那样,最好把页面都有哪些元素都描述清楚。
于是,你改进了一版Prompt:
现在你是一个程序员,你要写一段完整可运行的HTML+CSS+JavaScript代码。这段代码要实现一个功能,这个功能是一个微博标题列表页,每一条是一个标题,标题后面带上一个数字,这个数字表示这条微博的评论数。页面风格请参考微博热搜列表页。
好的,以下是一个简单的实现示例:
这个示例使用jQuery库来简化DOM操作和事件绑定。当页面加载时,先模拟后端返回的热搜数据,然后计算总页数,渲染热搜列表和分页控件。当用户单击分页控件时,根据当前页码重新渲染热搜列表和分页控件。
注意:此例输出的代码比较长,这里只选取了一小段,省略的部分用“/***部分输出内容省略***/”来表示。
不同的代码块使用```进行包裹,其中```html、```css、```javascript分别包裹了HTML、CSS以及JavaScript的代码块。
代码存成页面,展示效果如图2-1所示。
图2-1 ChatGPT的第一版列表页效果
页面主体功能确实符合你的描述,有列表、评论,还有微博内容的样例。但样式有点苍白,显然没有达到要求。你想到了以下几个改进点,于是又更新了一版Prompt:
现在你是一个程序员,你要写一段完整可运行的HTML+CSS+JavaScript代码。这段代码要实现一个功能:
1. 这个功能是一个列表页,每一条是一个标题,标题后面带上一个数字,这个数字表示这条微博的评论数。
2. 页面固定展示10条标题,不需要翻页。
3. 每个标题前面加上序号,从1到10。其中:1、2、3用红色字体,剩余序号用橙色字体。
4. 标题字体不需要加粗。
5. 页面顶部不展示微博标题列表页文字,而是换成一个Banner图,Banner的高度大约占屏幕的四分之一,Banner请给个样例图,为暖色调的。
6. 点击每一条微博,可跳转到详情页,详情页具体后面再写。
7. 去掉底部版权信息区域。
8. 页面风格请参考微博热搜列表页。
好的,以下是一个简单的实现示例:
这个示例使用jQuery库来简化DOM操作和事件绑定。当页面加载时,使用模拟数据渲染微博列表。通过CSS设置序号的颜色和标题的样式,以及鼠标悬停时的效果。当用户单击微博列表项时,可以跳转到详情页,具体实现可以根据需求再进行编写。
效果如图2-2所示。
图2-2 增加了样式要求后的页面效果
这样看来,只要不断明确细化需求,ChatGPT输出的结果就能无限逼近你的目标。
不过,你可能也发现了,把需求描述清晰也不是那么容易,即便是一个现成的简单页面,也会遗漏掉很多的细节。但是经过一轮轮的迭代和反馈后,你不仅能快速发现自己的疏漏,还能快速验证很多想法。
通过对比第一版的Prompt和最后一版的Prompt,我们就能看出差异。所以,什么是清晰、明确的Prompt?就是充满细节描述的Prompt。
有了前端页面,接下来还有后台。后台需要按互动量对微博排序的程序,以及一个查询列表可供页面调用的接口。
按互动量排序,这么大的数据量,是实时排,还是按天排?参考微博热搜是每分钟排一次。假设待排序的微博有1亿条,让ChatGPT帮忙分析一下,这种数据量级用什么方案能满足要求。
你现在是后台架构师,请帮我设计一个后台技术方案,包括使用的算法、需要的服务器CPU和内存资源,以及程序源代码,能满足以下功能:
1. 对于数据库中的所有微博,希望按互动量字段从大到小取出前10条。
2. 前10条微博,需要每分钟更新一次。
3. 微博总数量有1亿条,存储在分布式数据库中。
4. 每条记录包括4个字段:微博ID、微博标题、微博详情URL、互动量。
好的,以下是一个简单的方案:
1. 数据库选择MySQL或PostgreSQL,可以使用分布式数据库方案,如MySQL Cluster或PostgreSQL Cluster。对于微博数量较大的情况,可以考虑使用索引或分区表来优化查询速度。
2. 使用Redis作为缓存数据库,将前10条微博的数据缓存到Redis中。可以使用sorted set数据结构来存储微博,以互动量作为score,每分钟更新一次。
3. 使用分布式存储系统,如Hadoop或Ceph,来存储1亿条微博数据。数据可以进行分片存储,以便扩展存储容量和提高读写性能。
4. 对于程序源代码,可以使用Java或Python编写。使用ORM框架,如Hibernate或SQLAlchemy,来简化数据库操作。使用Redis客户端库,如Jedis或redis-py,来连接Redis数据库。使用分布式文件系统客户端库,如Hadoop FS或PyCeph,来连接分布式存储系统。
以下是一个简单的Java程序示例:
这个示例查询前10条微博数据,然后将数据存储到Redis的sorted set中。使用Jedis客户端库来连接Redis数据库。可以通过定时任务来每分钟更新Redis中的数据。
对于分布式数据库和分布式存储系统的具体方案,需要根据实际情况进行选择和设计。同时,需要考虑数据安全性和可靠性等因素。
ChatGPT不仅给出了方案,还编写了代码。它给出的方案是:使用MySQL Cluster对互动量(interact_count)建立索引,然后按照互动量排序取最高的前10个。排序后,把结果缓存在Redis中,用户的请求访问不会落在MySQL数据库上,这样可以提升系统并发查询的能力。
作为资深程序员,还要关心这里面潜在的性能问题。通过常识判断,如果数据库只有1亿条数据,索引排序取前10条在性能上是没有问题的。当然也可以问一下ChatGPT:
MySQL Cluster对1亿条记录使用ORDER BY操作的性能如何?
MySQL Cluster对于大规模的数据集合排序操作的性能会受到一定影响,因为它的数据存储和查询是基于分片的,各个分片之间需要进行数据同步,这会增加排序操作的时间。此外,MySQL Cluster也不支持所有类型的排序,特别是对于大型数据集合的排序,应该尽量避免使用ORDER BY这样的操作。
针对这个问题,我们可以考虑以下几种优化方案:
1. 使用索引来优化查询性能。对于互动量这个字段,可以在数据库中建立索引,以便加快查询速度。
2. 缓存热门数据。可以使用Redis等缓存数据库来缓存热门数据,如前10条微博,以加快读取速度。
3. 分批查询。可以将1亿条记录分批查询,每次查询一定数量的记录,然后进行归并排序,以减少单次查询的数据量,同时避免了单次查询数据量过大的问题。
4. 分布式排序。可以使用分布式排序算法,如MapReduce算法,将排序操作分布到多个节点上进行,以减少单个节点的负载。
5. 预处理数据。可以在每次写入数据时,先进行排序操作,将数据按照互动量排序后再写入数据库,以便加快后续查询的速度。
需要注意的是,对于大规模数据集合的排序操作要谨慎使用,尽量减少排序操作的频率和数据量,以保证系统的性能和可用性。
ChatGPT的回复有点答非所问,可以加上一些限定条件,再问一下:
如果对interact_count建立了索引,对于1亿条记录,每条记录长度不超过1000字节,执行下面这句SQL查询:
SELECT id,title,url,interact_count FROM weibo ORDER BY interact_count DESC LIMIT 10
5个节点的MySQL Cluster执行需要多长时间?请精确到毫秒。
MySQL Cluster执行该SQL查询的时间,取决于以下几个因素。
1. 数据分布:如果数据均匀分布在5个节点上,那么每个节点需要扫描的数据量为1亿/5=2千万条记录,否则需要考虑数据迁移的开销。
2. 索引类型:如果对interact_count字段建立了B+树索引,那么查询的效率会比较高,否则需要全表扫描。
3. 磁盘和网络带宽:如果数据量比较大,需要从磁盘中读取数据,并且需要在节点之间传输数据,那么磁盘和网络带宽也会影响查询的速度。
4. 集群负载:如果MySQL Cluster同时处理多个查询请求,那么查询的响应时间可能会受到其他请求的影响。
综上所述,无法准确预测MySQL Cluster执行该SQL查询的时间,需要根据具体的环境和配置进行测试和优化。但是,如果数据均匀分布在5个节点上,对interact_count建立了B+树索引,磁盘和网络带宽较好,集群负载较轻,那么查询的时间可能在几百毫秒到几秒之间。
随着问题的明确和细化,ChatGPT的回答也能更精准地命中你的意图。
最后,还剩下查询列表的接口,表述如下。
请写一个RESTful API,负责给前端页面调用,查询互动量前10的微博。从上面我们设计的Redis中查询出互动量前10的微博。其中有几个字段要返回给前端页面:微博标题、微博内容URL、微博互动量。
下面是一个基本的RESTful API示例,使用Python Flask框架和Redis数据库,查询Redis中互动量前10的微博信息,并返回标题、URL和互动量给前端页面。
这个API使用GET方法,访问路径为/weibo/top10。在Redis中使用zrevrange命令查询weibo:interact_count有序集合中互动量前10的微博ID和互动量,然后遍历查询每个微博的详细信息,并将标题、URL和互动量存入一个列表中。最后将这个列表转换成JSON格式,并返回给前端页面。
ChatGPT回复的代码用的是Python,可你的公司用的是Java,你希望在原有的Spring Boot框架上来写。
请在Spring Boot框架上写一个RESTful API,负责给前端页面调用,查询互动量前10的微博。
从上面我们设计的Redis中查询出互动量前10的微博。其中有几个字段要返回给前端页面:微博标题、微博内容URL,微博互动量。
下面是一个基本的Spring Boot RESTful API示例,使用Java和Jedis库连接Redis,查询Redis中互动量前10的微博信息,并返回标题、URL和互动量给前端页面。
首先需要在pom.xml文件中添加Jedis依赖:
然后创建一个控制器类WeiboController,并添加一个GET方法getTop10Weibo(),代码如下:
这个控制器类使用@RestController注解,表示返回的是JSON数据。在getTop10Weibo()方法中,使用Jedis库连接Redis,查询weibo:interact_count有序集合中互动量前10的微博ID,然后遍历查询每个微博的详细信息,并将标题、URL和互动量存入一个Map对象中。最后将这个Map对象存入一个列表中,并返回给前端页面。
启动应用后,访问路径为/weibo/top10,将返回一个JSON格式的互动量前10的微博信息列表。
这样,前端、后台都齐全了。剩下的自己做些微调,就能交付1.0版本了。
怎么样,ChatGPT是不是特别“靠谱”,事事有回应,件件有着落,哪怕到了晚上也能陪你随时加班。
当然在这个过程中,并不是你发一条简单的命令就能得到理想的结果。ChatGPT虽然懂的多,但大概率不能一次就明白你的需求。在与它的交互过程中,你会发现哪些需求点还需要明确,哪些背景还需要交代,哪些数据和案例还需要补充。最终,你打磨后的Prompt是一份完整的需求文档,而ChatGPT按照你的需求一步一步地把任务给完成了。
另外,在这个过程中,你从一个干活的角色转变成了设计解决方案的角色。这种身份和视角的转变,会产生积极的效果。