祁宁:社区问答是激荡企业高级智慧的头脑风暴 | 开发者说
在祁宁家里,有一套完整的赛车模拟器,他甚至还请人到国外代购了最新的 VR 设备。作为沉浸式赛车游戏发烧友,除了享受速度与激情带来的愉悦感,祁宁在玩的过程中更多的是思考如何将技术能力进行产品化的问题。
Answer.dev 就是将技术问答社区能力提炼而成的产品,也是祁宁深度思考的一个成果。
开源问答社区软件 Answer.dev 于 2022 年 10 月 24 日在 GitHub 上线,发布后就在 GitHub Tending 上持续霸榜了一周左右,不到一个月就拿到了逾 4,000 个 Star,四个月内收获的 Star 数更是超过 6,300 个。
需要补充说明的是,Star 数是 GitHub 上最直接的热度指标,意味着该开源项目对开发者的吸引和关注程度,体现了该项目的流行程度。
Answer.dev 在 GitHub 上的受欢迎程度,远远超出了其创始人祁宁的预期。在国内开发者的印象中,祁宁更为人熟知的身份是 SegmentFault 思否(下称「思否」)联合创始人兼 CTO——同样为人所熟悉的还有他的网名昵称 joyqi 。创办于 2012 年的思否,是目前中文领域最大的编程问答交流社区平台,累计注册开发者用户近 700 万。在思否 10 余年的发展中,祁宁积累了大量问答社区领域的经验和资源。
近年来,不少 B 端企业用户向祁宁提出需求:能否帮助搭建企业自己的问答社区,或者协助建设类似思否这样的企业社区。当时,囿于商业运营条件等限制,祁宁和思否团队很难去响应这样的需求,只能提议对方在思否建一个专区或子站。但实际上,企业的需求此时并没有被完全满足,因为客户希望能自定义社区内容,自主掌控数据,而不是「寄居」于一个公共社区之下。
于是,祁宁和思否团队一直都在思考:能不能将思否在问答社区领域多年沉淀下来的能力完全开放出来呢?最好的状态就是做成一个开源项目让所有人都能使用,也就是将思否的技术问答社区形态转化为一个软件产品。
直到 2022 年 5 月,研发管理平台 ONES 完成对思否的收购后,祁宁及思否团队得以将输出问答社区能力的「夙愿」变成现实。「ONES 是一家对市场和商业化都有深刻理解的软件公司,对于将问答社区能力产品化,ONES 给予了思否很多灵感。」祁宁说,开发 Answer.dev 相当于颠覆了思否的商业模式——之前思否是一个社区公司,主要通过广告服务来盈利;如今,思否变成了一家开源商业公司和软件公司,提供的是软件产品,「我们开始用社区来驱动开发,跟我们此前的驱动方式完全不一样。」
然而,祁宁又说:「思否和 Answer.dev 两者最终要做的事情其实没区别,归根到底还是做一个社区。」在他看来,开发 Answer.dev 的目标是把社区当作一个产品来使用,具体就是,一个商业软件公司把自己的代码免费让其他人使用。建立一个真正以开发者为中心的开源社区,用社区的力量去推动项目开发,这是思否和 Answer.dev 共同的目标和使命。
Answer.dev 于 2022 年 5 月正式立项,6 月初启动。为了赶在 10 月 24 日发布(「1024」被公认为是中国程序员节),9 月底就必须得交付内部预览版,所以,该项目的开发实际上只有不到三个月的时间。
在如此紧张的期限内,祁宁及其团队相继迎接了产品设计、技术选型、团队磨合以及研发管理等挑战,准时在「1024」发布了 Answer.dev 开源软件。尽管 Answer.dev 已经发布了一段时间,但祁宁并不止步于此,而是继续思考人工智能对问答社区软件的影响,以及探索如何融合和接入相关人工智能的应用——最近,祁宁的爸爸买了一款智能手表,但面对复杂的操作使用说明书一筹莫展,只好致电儿子祁宁求助。「未来人工智能可以天然地解决这个问题,哪怕是老人家也可以轻松地玩转各种电子产品。」祁宁如此畅想。
ONES:苏格拉底说:「人类最高级的智慧就是向自己或别人提问。」除了苏格拉底,莎士比亚、爱因斯坦、乔布斯等名人都擅长通过提问来寻找答案以追求创新,那么企业该如何利用 Answer.dev 来建立自己的问答社区,并沉淀高级智慧呢?
祁宁:
首先,Answer.dev 是易用的。我们的目标是:非专业人士或非程序员们也可以非常轻松地将它运行起来——当然,这可以是在我们的指导协助下或在文档的帮助下。目前,市面上的部分社区软件或开源产品,在运行时需要一些很专业的知识,比如配置、技术名词等。但在 Answer.dev 中,我们想面向的是一个更广大的人群,所以在产品设计及文档设计之初,我们更多考虑的是:如果用户是一个非专业人士,怎样才能很好地上手这个项目。
其次,Answer.dev 是一款开源软件。我们之前做互联网产品的创业,可能只会发布一个最终的产品,直接给用户用,或发布给特定的商业用户。而开源项目的话,就会把该项目的直接源代码开放出来,让所有程序员都可以看到源代码,然后可以参与到我们的项目中来。
最后,在设计之初,我们就将 Answer.dev 定位为一个国际化的项目。我们以国际化的标准来开发这个项目,包括后续的文档以及在代码中的注释,都是执行的国际化标准,其目的是希望它的受众足够广,各个国家和地区的程序员都可以以同样的标准参与进项目里,而不仅仅是面向中文的用户和开发者。
ONES:Answer.dev 的开发实际上只有不到三个月的时间。如何在这么短的时间内完成一个全新的项目开发?高效率的秘诀是什么?
祁宁:
据以往的开发流程,研发队伍通常会按照产品说明做项目研发。但对于 Answer.dev 这个项目,在研发的过程中会不断地迭代,在中间设置很多持续交付的节点。因此,按照这样的特点,我们对产品的交付流程做了改进。
正是基于这样的交付流程,我们采用了 ONES 研发管理平台。
首先,将功能模块全部按功能维度拆分,变成一个个子任务。也就是说,通过 ONES 平台整理项目,分批次地提取其中一部分的功能模块,按照功能组别将任务拆分成子任务,继而逐项落实,最后再监控其工时及完成情况。ONES 对项目进度状态的跟踪是很全面的。
然后,按周来设立里程碑——项目的启动为第一周,第二周是正式开始开发,接着,将周设为持续交付的节点,每个节点交付一部分功能模块。「1024」的前夜就是第 11 周的「最终节点」,该任务开发阶段的任务即终结,后面会进入产品迭代的过程。
期间,如果本周功能模块最终验证完成,那这一周的任务就完成了,还可在 ONES 上查看整体交付的百分比进度。我们每周会做定期检视,了解这周交付的内容有哪些问题,是否需要调整;如果需要调整,就规划到下一周的任务中去,这是个持续迭代的过程。
此外,ONES 对于各个角色及任务分配都很清晰,例如关注者、处理者、参与者等,各司其职,体现了高效协同的特点。
当然,每周任务进行时,我们必须紧盯总目标,才不会在每周执行时逐渐迷失、将总目标丢失,或做成了另外的项目。在任务排期或任务分配时,我们会以总目标为最高优先级来安排工作。
ONES:Answer.dev 项目采用的是前后端分离的方案,前端使用的是 React 技术栈,后端则是使用 Golang 编写。于此,你是如何进行技术选型的?对未来的技术趋势,你有哪些思考?
祁宁:
之前,思否的后端主要开发语言是 PHP,而 ONES 是 Golang。ONES 并购思否后,出于技术协同、系统互通的考虑,我们还是决定用同一套语言进行开发。
无论 Golang 还是 React,两者都已经是业界特定领域认可的标准。彼此在各自的领域都很稳定,从人才储备到各种工具链的建设上,都相当完善。当然,前端的技术变化可能更快一点,但是我觉得,相对来说,前端技术更新迭代不是那么麻烦,因为它其实是跟着用户的需求走的。
业界的先进技术,我们每个开发者都需要去定期跟踪。ChatGPT 横空出世,可以预见人工智能的发展会有很多颠覆,包括它的交互模式。例如,以后用户的界面会更加简单,人们直接和计算机交流,不需要太多的按钮或者复杂的界面。
ONES:你是如何理解以 ChatGPT 为起点的人工智能普及浪潮?
祁宁:
根据人们对 ChatGPT 的使用反馈,我们看到了人工智能的巨大潜力所在。ChatGPT 是计算机第一次在交互上能够对人的话语进行分析,并且能够理解更准确的指令,继而作出更准确的回应。
之前的工业革命是解放人的体力,让人不需要再用手工去做重复的体力劳动,而像 ChatGPT 这样的人工智能,解放的是人的思维。如今,我们从小学就开始学习知识,学习的时间很长,要学到 20 多岁甚至 30 多岁,才能开始做一些前沿性的研究。那么,当未来人工智能普及后,有没有可能将知识直接移植到我们大脑中来呢?就算不能,能否实现制作一个「知识共享的大脑」呢?这样一来,我们人类就不需要去耗能记住很多知识,需要的时候就直接取出来;而是把精力放在更多有创造性的东西——也就是解放了思维。
人工智能更深层次的应用被开发出来后,应该会推动社会的发展。但也不排除会带来一定程度的不确定性,因为人工智能或许会影响人类的思想,也可能会把我们社会带到一个不可知的地方去——我们人类对此不能掉以轻心。
相关文章:

祁宁:社区问答是激荡企业高级智慧的头脑风暴 | 开发者说
在祁宁家里,有一套完整的赛车模拟器,他甚至还请人到国外代购了最新的 VR 设备。作为沉浸式赛车游戏发烧友,除了享受速度与激情带来的愉悦感,祁宁在玩的过程中更多的是思考如何将技术能力进行产品化的问题。 Answer.dev 就是将技术…...

linux安装
1. 准备前说明 本文采用的是CentOS6.8,64位的,虚拟机时VMvare,采用的是双网卡方式。至于双网卡的作用和nat,桥接和hostonly模式请参见我的另一篇文章。安装回环网卡&安装Linux前准备 2. 废话不多说,开始了 ◆打…...

【Go编程语言】 Go语言基础语法
Go语言基础语法 文章目录 Go语言基础语法一、注释1.单行注释2.多行注释 二、变量1.变量的定义2.变量的初始化3.理解变量(内存地址)4.变量交换5.匿名变量6.变量的作用域 三、常量1.常量的定义: const2.iota(特殊常量) 四…...

洗稿用什么软件-洗稿软件免费
洗稿文章的主要优势 洗稿文章的主要优势在于提高文章的质量和效率。以下是洗稿文章的几个主要优势: 优化结构和语言 洗稿可以删除冗余、无用和重复的内容,同时对文章的结构和语言进行优化,提高文章的可读性和吸引力。这可以使文章更加专业…...
网络请求发送
私人博客 许小墨のBlog —— 菜鸡博客直通车 系列文章完整版,配图更多,CSDN博文图片需要手动上传,因此文章配图较少,看不懂的可以去菜鸡博客参考一下配图! 系列文章目录 前端系列文章——传送门 后端系列文章——传送…...

微信小程序开发
文章目录 1 开发准备工作2 小程序开发工具使用3 初始化项目4 index页静态搭建5 数据绑定5.1 初始化数据5.2 使用数据5.3 修改数据 6 数据绑定---小程序,Vue,React7 事件绑定7.1 事件分类7.2 绑定事件7.3 向事件对象传参7.4 补充:事件流的三个…...

number类型超出16位的问题(前端、后端处理)
目录 1、前端解决方案 1.1 甩链接 1.2 接口返回数据过程中将数据处理为字符串(过过嘴瘾) 1.3 对返回的json字符串进行数据预处理代码如下 2、后端解决方案 2.1 toString、String、 、new String() 自己悟、就是要改的地方多。 2.2拦截器 (可能超出…...

【高并发】网络模式
I/O 多路复用 多线程创建 服务器的主进程负责监听客户的连接,一旦与客户端连接完成,accept() 函数就会返回一个「已连接 Socket」,这时就通过 fork() 函数创建一个子进程,实际上就把父进程所有相关的东西都复制一份,…...

springboot+dubbo+zookeeper 项目实战
现在有一段代码再前台,后台系统中都存在,都需要这段代码,存在这种情况,我们可以选择将这段代码提取出来作为一个服务,让前台和后台系统作为消费者远程调用这段代码,提高了代码的复用性。 springboot集成dub…...

PHP学习笔记第一天
前言 作者简介:不知名白帽,网络安全学习者。 博客主页:不知名白帽的博客_CSDN博客-网络安全,CTF,内网渗透领域博主 网络安全交流社区:https://bbs.csdn.net/forums/angluoanquan 目录 PHP语法 基本的PHP语法 PHP的数据类型 PH…...

案例研究|萤石网络通过JumpServer解决安全运维难题
杭州萤石网络股份有限公司(以下简称为萤石网络)于2015年在杭州成立,是安全智能生活主流品牌,核心产品包括智能家居摄像头、智能门锁、智能服务机器人等。2021年,萤石网络家用摄像头占国内出货量市场份额的25%ÿ…...

即时聊天app开发-即时通讯app开发方案分析
如今,即时聊天APP层出不穷,它已经成为人们日常生活中密不可分的社交工具。如今,即时聊天APP不仅是聊天工具,也是企业营销的利器。我们经常可以在聊天主页上看到一些广告。如有必要,用户可以直接点击广告了解详情。即时…...
js为什么会阻塞渲染, 什么是异步?
javaScript 是单线程执行的语言,它的执行机制是基于事件循环模型的。当 JavaScript 执行代码时,如果遇到阻塞(如执行时间较长的代码、同步的网络请求、计算密集型操作等),则会阻塞 JavaScript 引擎的执行,直…...

Nuvoton NK-980IOT开发板 u-boot 编译
前言 最近搭建了 Nuvoton NK-980IOT开发板 的开发编译环境,记录一下 u-boot 的 编译流程 Nuvoton NK-980IOT开发板 资源还是比较的丰富的,可以用于 嵌入式Linux 或者 RT-Thread 的学习开发 开发板上电比较的容易,两根 USB 线即可࿰…...
OpenCL使用CL_MEM_USE_HOST_PTR存储器对象属性与存储器映射
随着OpenCL的普及,现在有越来越多的移动设备以及平板、超级本等都支持OpenCL异构计算。而这些设备与桌面计算机、服务器相比而言性能不是占主要因素的,反而能耗更受人关注。因此,这些移动设备上的GPU与CPU基本都是在同一芯片上(So…...

浅谈osgEarth操控器类的createLocalCoordFrame函数如何将局部坐标系的点转为世界坐标系下的Martix(ENU坐标)
在osgEarth操控器类的EarthManipulator中的如下函数: void EarthManipulator::setLookAt(const osg::Vec3d& center,double azim,double pitch,double range,const osg::Vec3d& posOffset) {setCenter( center );.... //…...
PHP程序员和Python程序员的职业前景怎么样?我来聊聊自己的体会
大家好,今天我们来聊一下程序员这个职业的特点。在讲这个话题之前,我先说一下我自己的情况:我在福州和深圳做了8年左右的程序员,然后回到老家,在家里面为福州的一个公司做远程开发。目前已经在老家做了将近3年。 今天…...

【MATLAB图像处理实用案例详解(8)】—— 图像数字水印算法
目录 一、背景意义二、基本原理三、算法介绍3.1 数字水印嵌入3.2 数字水印提取 四、程序实现 一、背景意义 数字水印技术作为信息隐藏技术的一个重要分支,是将信息(水印)隐藏于数字图像、视频、音频及文本文档等数字媒体中,从而实现隐秘传输、存储、标注…...

最全的免费SSL证书申请方式
在SSL广泛普及的今天,申请一张免费的SSL证书是一件非常容易的事情。这里为大家总结当前阶段(2023年)拥有一张免费SSL证书的方式。首推的方式为来此加密网站,文章后面会有详细的介绍。 下面介绍几种获取免费SSL证书的方式,大家可以根据自己的…...

Ceph入门到精通-CrushMap算法概述
下面是伪代码object到osd的伪代码 locator =object_name obj_hash =hash(locator) pg =obj_hash %num_pg OSDs_for_pg =crush(pg) # returns a list of OSDs primary =osds_for_pg[0] replicas =osds_for_pg[1:] defcrush(pg): all_osds=[osd.0,osd.1,osd.2,...] resu…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...