心流状态的魔力:专注与幸福感提升指南

同之前写的 GTD 和 四象限法则实践 说的那样,我比较缺少一种专注度,以及效率。想起来最开始有过进入心流状态的体验,那就是在打游戏的时候,或者看小说的时候一旦沉迷在游戏或者小说中,那么就会进入到心流的状态,会忘记时间。 如果你曾经如此专注于一项任务,以至于忘记了时间,那么你就经历了心流。但是处于心流状态不仅仅是让一天过得更快。它对你的生活、健康、生产力和幸福感有积极的影响。 要理解是什么让心流状态如此神奇,你需要理解它是什么以及它是如何工作的。了解更多关于心流背后的科学以及如何忘乎所以。 定义 心流理论(英语:Flow),亦译神驰、沉浸,是1975年由奇克森特米哈伊·米哈伊所提出的心理学概念。其描述人类一种完全沉浸(专注)和完全投入于活动本身的心智状态的振奋状态。在适当的条件下,心流状态可以变成催眠或欣喜若狂的恍惚状态。一些科学家已将心流本身理解为一种恍惚。 触发心流 明白了心流是如何产生的,有助于我们进入到心流状态。 米哈里·契克森认为,使心流发生的活动有以下特点: 我们倾向去从事的活动 我们会专注一致的活动 注意力投入在当前活动 动作与意识的合并 反省自我意识的丧失 有清楚目标的活动 有立即回馈的活动 我们对环境与动作有主控感–挑战与技能之间达成平衡 在从事活动时我们的忧虑感消失 主观的时间感改变–例如可以从事很长的时间而不感觉时间的消逝 以上项目不必同时全部存在才能使心流产生。但米哈里·契克森也提出一些方式使得一群人可以在一起工作使得每个个体都能达到心流的状态。这种工作群体的特点包括了: 创意的空间排列 游戏场的设计 平行而有组织的聚焦 目标群组聚焦 现存某项工作的改善(原型化) 以视觉化增进效能 参与者的差别是随机的 在心流中,你会觉得你可以永远做你正在做的事情。没有一种体验会导致心流。它可能发生在你阅读、写作、绘画、跑步或园艺时。 虽然没有一个活动能保证创造心流,但人们经历的心流状态有一些共同的特征。并非所有这些都总是存在的。但是,存在的因素越多,你就越有可能体验到心流。 心流状态的特征 当人们处于心流状态,可能会出现四个特征: 自动运转:事情做起来顺手不需多加思考,身体自动发挥。 时间流逝:处于心流状态中,不会在意时间的流逝,直到回到正常状态后,才会注意到已经过了多长时间。 不觉他物:专注投入事物之中,导致不易察觉像是饥饿、手机震动等感觉与刺激。 感到愉悦:在事情完成后,感受到愉悦、满足、成就感等正向情绪。 心流状态是一种被一项有趣的任务所吸引的体验,你的注意力完全被它吸引住了,你通常会失去时间感、自我意识以及任何与手头任务无关的东西。 心流状态的十大特征 注意焦点(Attentional focus) 在心流中,无论你在做什么,你都会全神贯注。你没有在想别的事情。必须有人工作来吸引你的注意力,或者打断你手头的工作。 挑战(Challenge) 活动必须有适当的难度。太简单了,而且不够吸引人。太有挑战性了,你根本无法进入。 目标导向(Goal-oriented) 要激发心流,活动必须有一定的指向性,不一定要宏大–你可以玩电子游戏或给图片上色。但是为了引导你的注意力,你必须有一些东西来引导你的注意力。 反馈(Feedback) 在活动中有能量的交换。有没有花几个小时在电脑或手机上玩那些益智游戏?他们全神贯注是因为他们能给你给予即时的反馈。你赢了一场比赛,完成了一关,或者赢得了一颗星星–这会让你继续玩下去,因为你觉得自己做得很好。 个人控制(Personal control) 如果你觉得活动或情况超出了你的控制,你将很难进入心流状态。作为一个旁观者,很难拥有心流状态所特有的精神专注和参与感。 永恒(Timelessness)...

February 13, 2024 · 1 分钟 · 127 字 · 熊鑫伟,我

GTD与四象限法则实践

GTD 和 四象限法则实践 过年的时间,有很多时候都在思考,一年的成长中,除去很多的优点,还发现了很多的缺点,其中总结缺点有下面的一些: 不会主动的去思考所做事情的优先级 自己更擅长主动解决事情 不够专注去完成某一个TODO 每次当我回顾自己所做的事情时,虽然数量众多,但总感觉缺少清晰的判断和深思熟虑。有时候,我可能会因为某个任务在那一刻看起来很重要,或者出于条件反射而去做,而没有真正地评估其优先级或重要性。这种做法不仅影响了我的工作效率,也让我错过了深入思考和策划的机会,这是我在未来一年中需要改进的地方。 我之前看过一些关于时间管理的书籍,甚至是 GTD。若你是效率控,必定久仰GTD大名,它算的上时间管理界的逼格代表。但是复杂难懂,不好上手。 这篇文章,我将会从之前学过的 GTD 知识,以及自己的部分实践和思考,总结出来的 GTD 模式,自己的时间管理方法,以及四象限。 GTD 是什么 既然想用GTD,那得知道它有何用。时间管理、提高效率,一提GTD就这两词。显然,这两词太抽象。多数人认为,GTD能充分利用一天时间做更多事,部分人认为GTD能治疗拖延症,更有人把GTD作为提醒器,对抗遗忘。 这些确为GTD所及之事,但非核心卖点。Kindle能压泡面,但便携阅读和护眼才是它的核心卖点。用就要用它的核心卖点,否则会显得本末倒置。没有人为了压泡面买Kindle,不是吗? GTD的核心卖点是节省脑力。有些人事多人忙,一天还没过完,精力已耗竭,打不起精神完成更多工作。David Allen 认为用大脑来记忆是浪费,完全可用第三方纸笔或软件等代替,待需处理此事之时,再进入大脑,而非一直盘踞在脑海中。心无旁骛能提高当下效率,还可节省精力,应付更多工作。 由此可见,GTD的前提是“你很忙”。假如你不忙,只是时间利用率不高,爱拖延,爱磨蹭,GTD不是不能用,但也要明白,它并不是为这种情况设计的。 GTD的作用原理 做任何事,都遵循客观的五个步骤:收集、判断、整理、复查、执行。以「家中请客设宴」为例: 收集:询问有几位客人赴约,分别喜欢吃什么。 判断:判断客人的喜好,哪些能满足,哪些不能满足,需要多少份食物。 整理:记下准备做的菜,准备买的食材。 复查:检查还有何遗漏之处。 执行:设宴之日,按预想好的操作即可。 GTD理论认为,人的精力有限,一旦脑力跟不上,就会混乱,可通过合理分配脑力以优化五个步骤:前四步准备充分,第五步傻瓜执行。 GTD则要求忘记前因后果,因为早已用纸笔或软件记录。 GTD理论认为,前期充分准备,执行便可心无旁骛,更轻松,也更专注,提高效率是自然之事。 五个步骤的优化方法 收集:设置生肉库 你需要一个生肉库来代替大脑记忆,将所有待处理的信息记录其中。其他GTD的文章,会称之为工作篮、收件箱等。但我觉得生肉库更形象,因为收集的全是原始信息,像没字幕的原版片,是生肉,待加工。 五步骤中的第一步:收集 生肉库可实体可虚拟。存放促销单的盒子、记事本,这是实体生肉库。手机上的APP、电脑文件夹、邮件收件箱等,这是虚拟生肉库。根据实际情况,可设置1-2个生肉库,勿多勿少,适用最好。 不仅仅把“准备做的事”记入生肉库,而是记入一切待处理的信息。这和其他待办清单有很大区别。 收集阶段如何避免崩坏 所有信息统统放入生肉库,一个不落。如果生肉库中只是部分信息,你就无法完全依赖它,你知道他不完整,还需要用脑记。如此一来,变成两头兼顾,搞得更为费脑而不是省脑。 领导让你采购5样商品,你在清单上记了3样。你无法对照清单买完就走,只能在超市里拼命回想。当你一旦想起,会直奔货架,若再掏出纸笔完善购物清单,明显多此一举。这就是为什么有些人用GTD觉得更麻烦,而不是更轻松。 不要超过2秒。根据我的实践经验,单条收集时间超过2秒,代表收集方法太麻烦,麻烦的事定不能长久。请避免以下三种情况: 不合理的生肉库:扫码送红包的促销单,放盒子里即可,不用拍成照片存印象笔记。 做多余的事:常见于用APP做生肉库。周三14点开会,如此记录即可。不用设定时间提醒,分类,标注重点等等。这是后面的事,不要在收集阶段做。 执念:常见于手账控。记个信息要画花,要贴纸,要换颜色,不然对不起美美的手账。热情一过就懒的搞。 定期清空生肉库。 注意是清空不是清理。生肉库必须定期空无一物,我为了避免堆积每日清空。但这的清空不代表完成,而是把“生肉”从生肉库里移出,进入下一环节。 判断:为“生肉”打标签 收集的后一步是判断。所谓判断,是指对“生肉”作定性。定性的方法是依次提问,再根据答案给“生肉”打标签。 收集阶段要求不超过2秒,原始信息基本一扫而过。为了正确判断,有必要再次阅读,看清楚后进入Q2。 Q1: 这是什么? 收集阶段要求不超过2秒,原始信息基本一扫而过。为了正确判断,有必要再次阅读,看清楚后进入Q2。 Q2: 现阶段是否执行?...

February 12, 2024 · 3 分钟 · 555 字 · 熊鑫伟,我

Go 源码里的这些 go: 指令 && go 自动化工具

Go 源码里的这些 go: 指令 && go 自动化工具 开发人员有很强的自动化重复性任务的倾向,这也适用于编写代码。 样板代码可能包括设置基本文件结构、初始化变量、定义函数或导入库或模块等操作。 在某些情况下,包提供样板代码作为开发人员构建的起点,通常是在代码行为配置之后生成。 尽管样板代码对于应用程序功能可能是必要的和有价值的,但它也可能是浪费和冗余的。出于这个原因,有许多工具可以最小化样板代码。 go generate 是Go编程语言的命令行工具,允许自动生成代码。您可以使用 go generate 为您的项目生成易于修改的特定代码,使该工具在减少样板文件方面功能强大。 go generate 这个命令通常用于在编译前自动生成代码。它可以用来创建那些重复性高或者模式化的代码,从而节省时间和减少错误。想想看,这在哪些情况下会特别有用呢?🤔 比如说下面有一个简单的例子,在代码中: //go:generate echo Hello, cubxxw ! 在这个例子中,当我们运行 go generate 命令时,它将执行注释中指定的命令。在这个例子里,它会打印出 “Hello, cubxxw !"。 因此,元编程(metaprogramming)的主题是一个开发和研究的热门领域,可以追溯到 1960 年代的 Lisp。元编程中一个特别有用的领域是代码生成(code-generation)。支持宏的语言内置了此功能;其他语言扩展了现有功能以支持这一点。 go:generate 在我们之前的讨论中,我们已经介绍了 “Go Generate” 命令的基础知识。现在,我们将深入探讨一些更具体的用例和实践技巧。🚀 让我们从一些术语开始。go generate 工作方式主要由三个参与者之间协调进行的: Generator:是由 go generate 调用的程序或脚本。在任何给定的项目中,可以调用多个生成器,可以多次调用单个生成器等。 Magic comments:是 .go 文件中以特殊方式格式化的注释,用于指定调用哪个生成器以及如何调用。任何以文本 //go:generate 行开头的注释都是合法的。 go generate : 是 Go 工具,它读取 Go 源文件、查找和解析 magic comments 并运行指定的生成器。 需要强调的是,以上是 Go 为代码生成提供的自动化的全部范围。对于其他任何事情,开发人员可以自由使用适合他们的任何工作流程。例如,go generate 应该始终由开发人员手动运行; 它永远不会自动调用(比如不会作为 go build 的一部分)。此外,由于我们通常使用 Go 将二进制文件发送给用户或执行环境,因此很容易理解 go generate 仅在开发期间运行(可能就在运行 go build 之前);Go 程序的用户不会知道哪部分代码是生成的以及如何生成的。(实际上,很多时候会在生成的文件开头加上注释,这是生成的,请别手动修改。)...

January 25, 2024 · 5 分钟 · 973 字 · 熊鑫伟,我

Go 语言中的并发类型检查与跨平台开发

OpenIM 跨平台源代码类型检查工具 开始 问题 在 OpenIM 的自动化道路中,涉及到越来越全面的自动化设计和测试,在这个过程中,我遇到了一个问题,于是完成了从 go 语言类型检测再到集成本地以及 CI 的全套体验。 问题是这个 issue:https://github.com/openimsdk/open-im-server/issues/1807 我们的 Go 代码在 32 位系统(linux/386)上运行时遇到了整数溢出问题。出现这个问题的原因是 Go 中的 int 类型随体系结构的不同而大小不同:在 32 位系统上相当于 int32,而在 64 位系统上相当于 int64。 恰好在 64 位机器上正常运行,但是在 32 位机器上会出现溢出的问题,于是想着去做一套检测的工具,来解决各个平台的类型检测。 第一部分:Go 语言基础回顾 在深入探讨代码之前,让我们回顾一下 Go 语言的一些基本概念,特别是包管理、并发编程和类型系统。这些概念是理解和使用 Go 语言进行有效编程的基础。 包管理 包的概念 Go 语言中的每一个文件都属于一个包,包是多个 Go 文件的集合。 包用于组织代码,防止命名冲突,并提高代码复用性。 导入包 使用 import 语句来导入其他包。 可以导入标准库包、第三方包,或自定义包。 创建自定义包 在项目中创建一个新的目录,该目录下的 Go 文件属于同一个包。 包名通常与目录名相同,但不是强制性的。 并发编程 Goroutine Go 语言的并发单元称为 goroutine。 使用 go 关键字来启动一个新的 goroutine。 Goroutine 比线程更轻量,能有效利用多核处理器。 Channel Channel 是用于在 goroutines 之间传递消息的管道。 可以是带缓冲的或无缓冲的。 通过 channel 进行数据传递可以避免竞态条件。 类型系统 类型声明 Go 是一种静态类型语言,每个变量都有一个明确的类型。 支持基本类型(如 int, float, bool),复合类型(如 struct, slice),以及用户定义的类型。 接口 接口类型是一种抽象类型,它指定了一组方法,但不实现这些方法。 任何具有这些方法的类型都可以实现该接口。 接口提供了一种方式来指定对象的行为。 类型断言和反射 类型断言用于检查接口值的动态类型。 反射是一种检查、修改变量类型和值的方法。 类型声明 在 Go 语言中,类型声明是定义新类型的方式。Go 支持多种类型,包括基本类型(如 int、float64、bool)、复合类型(如 array、slice、map、struct),以及接口类型。通过类型声明,你可以创建自定义的类型,这对于编写清晰、易于维护的代码非常重要。...

January 24, 2024 · 15 分钟 · 3176 字 · 熊鑫伟,我

向量数据库的学习

今天学习 rust ,发现 rust 是非常适合编写数据库的语言,找到了一个宝藏的项目 tikv,它的 github 项目地址是 https://github.com/tikv/tikv,是一个非常活跃的项目,但是我今天的主题是 AI 领域的向量数据库,话不多说,我们马上开始吧。 先决条件 0.1 基础知识介绍:了解向量数据库的基本定义及其与传统数据库的区别。 0.2 数据结构基础:学习向量和其他基本数据结构,如何在数据库中表示和操作这些结构。 0.3 线性代数入门:介绍向量运算,包括向量加法、减法和点乘。 0.4 相似性度量:了解如何计算向量间的相似度,例如余弦相似性。 0.5 数据库索引基础:介绍数据库索引的基本概念,特别是在向量数据库中的应用。 0.6 搜索算法初步:学习基础的搜索算法,理解如何在大型数据集中进行有效的搜索。 0.7 应用案例研究:研究向量数据库在不同领域(如推荐系统、图像识别)中的应用。 主要课程 1.1 向量数据库深入:探索向量数据库的高级特性和优势。 1.2 算法探究:深入了解在向量数据库中使用的关键算法,包括索引和搜索算法。 1.3 数据库设计:学习如何设计和实现一个有效的向量数据库架构。 1.4 集成机器学习:了解如何将向量数据库与机器学习模型集成,以提高性能和功能。 1.5 实际案例分析:通过分析实际案例来加深对向量数据库应用的理解。 1.6 高级数学概念:深入学习相关的高级数学概念,如高维空间的向量表示和操作。 1.7 项目实践:开展一个小型项目,实践向量数据库的设计和应用。 1.8 回顾和评估:复习所学内容,并通过评估来测试理解和应用。 0.1 基础知识介绍 向量数据库是一种特殊类型的数据库,它们使用数学向量来表示和存储数据。这与传统数据库有很大的不同,传统数据库通常使用表格和行来组织数据。 向量数据库的定义 💡 向量数据库是如何工作的? 在向量数据库中,数据以向量的形式进行存储和处理,因此需要将原始的非向量型数据转化为向量表示。数据向量化是指将非向量型的数据转换为向量形式的过程。通过数据向量化,实现了在向量数据库中进行高效的相似性计算和查询。此外,向量数据库使用不同的检索算法来加速向量相似性搜索,如 KD-Tree、 VP-Tree、 LSH 以及 倒排索引 等。在实际应用中,需要根据具体场景进行算法的选择和参数的调优,具体选择哪种算法取决于数据集的特征、数据量和查询需求,以及对搜索准确性和效率的要求。 它们是如何使用向量来存储和处理数据的? 向量数据库使用数学向量来存储和处理数据,这与传统的数据库存储方式有显著不同。这里的关键步骤和概念包括: 数据转换为向量 🔄 在向量数据库中,数据首先被转换为数学向量的形式。例如,文本数据可以通过自然语言处理技术转换为向量,图像数据可以通过深度学习模型转化为向量。 向量表示 📈 每个数据项都被表示为一个向量,这个向量在多维空间中有其特定的位置和方向。这些向量通常在高维空间中,每个维度代表数据的一个特征。 相似性搜索 🔍 向量数据库的一个关键功能是相似性搜索。它通过比较数据项的向量之间的距离(例如,使用余弦相似性)来找到相似的项。这对于处理复杂查询和大数据集特别有效。 索引和检索 📚 向量数据库使用高效的索引机制来快速检索和访问数据。这些索引帮助数据库快速定位查询中涉及的向量,从而加快搜索速度。 机器学习集成 🤖 许多向量数据库可以与机器学习模型紧密集成。这允许数据库不仅存储数据,还可以通过模型直接处理和分析数据,从而提供更高级的数据处理和分析能力。 通过使用向量来表示和处理数据,向量数据库能够处理更复杂、更丰富的数据类型,同时提供更快的搜索和检索性能。这使它们在如今的数据驱动世界中变得越来越重要。...

January 20, 2024 · 5 分钟 · 954 字 · 熊鑫伟,我

OpenIM:构建高效的版本控制和测试工作流程

OpenIM 构建高效的版本控制和测试流程 开源项目的成功与否在很大程度上取决于其质量管理和协作流程。在 OpenIM 开源社区中,项目管理和测试流程的规范性至关重要,以确保代码的质量和稳定性。本文将简要介绍我们的测试方案、分支管理和质量控制策略,以及如何应用于 main 分支、PR 测试分支和稳定的 release 分支,以满足开发者、测试人员和社区管理者的需求。除此之外,还将介绍OpenIM开源社区的规范、测试方案和项目管理策略,旨在提供清晰的指导,以确保项目的稳定性和可持续性。 分支管理与版本控制 对于 OpenIM 来说分支的版本管理策略是尤其重要的,这里面设计到两块,一块是 OpenIM 的部署分支策略,一个是镜像版本策略,这两块分别参考下面的文章: 分支以及 tag 的版本策略 镜像的版本策略 总的来说: 在OpenIM社区中,main 分支被视为稳定版本的代表。所有代码必须经过严格的代码审查和测试,确保其质量和稳定性,然后才能合并到 main 分支中。 release 分支用于发布稳定版本。在 openim-docker 以及 openim-k8s 中使用的镜像版本也都是 release-v3.* 。在 release 分支上的任何更改都应该是针对已知问题的修复或功能的精心策划的添加。测试工作应重点关注于 release 分支,以确保发布版本的可靠性。 测试方案 Main 分支测试 在 main 分支上进行的测试应覆盖核心功能和关键路径,以确保基本功能的稳定性。测试工作应包括单元测试、集成测试和端到端测试。这部分所有的工作全部交给自动化去做,而不需要测试干预。 Release 分支测试 对于三种仓库,分别是 https://github.com/openimsdk/open-im-server 仓库,https://github.com/openimsdk/chat 仓库,https://github.com/openimsdk/openim-sdk-core 仓库。 在 release 分支上进行的测试要求更严格。测试团队应深入测试所有功能,并着重检查先前已知的问题是否已解决。确保在发布前没有潜在的问题。 这里的 PR 合并规则: 以 这个PR 为例: 首先是 PR 标题,PR 标题 fix pageFindUser ,首先,我们知道 git commit 信息包括是三种:...

January 15, 2024 · 2 分钟 · 304 字 · 熊鑫伟,我

AI元年: 2024年的新兴挑战与趋势

2024年1月6日大语言模型分享会 模型的局限: 深度学习 预训练模型 大语言模型 大语言模型的涌现能力: Link: 大语言模型进化之谜:涌现现象的挑战与争议_AI_张俊林_InfoQ精选文章 大语言模型的特点趋势的转变: 大语言比人更懂人类的习惯。 使用 RLHF 训练 使用人类习惯的方式交互 大语言模型的发展脉络: 开源模型越来越多,比例越来越大。 预训练模型依旧是非常多的,但是微调的比例越来越高 如何学习大语言模型 模型结构的配置 大语言模型的微调 使用技巧 自己训练模型 不一定要只是单一的数据,也可以是数据的混合(包括自己提供的业务文档或者代码) 训练的数据来源: 当处理和准备用于机器学习模型训练的数据时,确保数据的质量、安全性、和去重非常重要。这里有一些关键步骤和方法,可以帮助你实现这一目标: 质量过滤(Quality Filtering): 确保数据准确无误:移除或修正任何错误的、不完整的或者是不准确的数据。 保证数据的一致性:确保所有的数据遵循同样的格式和标准。 数据去重(Data Deduplication): 识别和移除重复数据:使用算法或者工具来识别完全相同或高度相似的数据项,并将其合并或删除。 对于文本数据,可以使用哈希算法或者基于内容的去重方法。 隐私去除(Privacy Removal): 确保数据中不含有任何个人可识别信息(PII),如姓名、地址、电话号码等。 在某些情况下,可以使用数据脱敏技术,如匿名化或伪匿名化,来保护用户隐私。 分词(Tokenization): 对于文本数据,分词是将连续文本分割成更小单元(如单词、短语或字符)的过程。 分词的方法依赖于特定语言的语法和词汇结构。对于中文,可能需要特定的分词工具,因为中文是一个无空格分隔的语言。 解码器结构 “causal decoder"和"prefix decoder"是两种不同的解码器结构,它们在处理序列数据,尤其是在文本生成任务中扮演着重要角色。下面是这两种解码器的对比: Causal Decoder (因果解码器) 定义和应用: 因果解码器,如在GPT系列模型中所使用的,是一种单向解码器。 它在生成文本时,仅考虑已经生成的或给定的前文(即,它只看到左侧的上下文)。 工作原理: 在处理每个新词时,因果解码器仅使用前面的词作为上下文。 这种模式模拟了人类自然语言的生成方式,即基于已知信息顺序地产生新信息。 用途: 适用于文本生成任务,如故事叙述、自动写作、聊天机器人等。 特点: 保证了生成的文本是连贯的,并且在逻辑上遵循了之前的上下文。 不能回看或考虑未来的词汇或句子结构。 Prefix Decoder (前缀解码器) 定义和应用: 前缀解码器是一种可以同时考虑前文和后文的解码器,类似于BERT中的masked language model(MLM)。 它在处理数据时,可以同时考虑序列中的前缀和后缀信息。 工作原理: 在处理每个词时,前缀解码器使用前面的词和后面的一些占位符或掩码作为上下文。 这种方式使得解码器在生成某个词时,可以考虑到整个序列的结构。 用途: 常用于需要双向上下文理解的任务,如文本填空、句子完善、语言模型训练等。 特点: 能够在生成文本时考虑到更全面的上下文信息。 更适合于理解整个句子或段落的结构和含义。 模型结构的优化 模型结构优化一直以来都是比较fancy的工作,优秀的模型结构设计,可以大大提高模型参数的效率,甚至小模型效果可以超过大模型。本文我们以XLNet、ALBERT、ELECTRA为例进行分析。虽然他们也可以认为是预训练任务优化和模型轻量化方面的工作,但鉴于模型结构创新力度很大,我们还是在模型结构优化这个版块来分析他们。...

January 14, 2024 · 3 分钟 · 574 字 · Xinwei Xiong, Me

对开源商业化的思考 & 全球流量大会(GTC)学习以及总结

引言:深圳福田会展中心的全球视野 2023年12月6日,在深圳福田会展中心,GTC 2023 全球流量大会如火如荼地展开。这场盛会汇集了来自全球的技术精英,共同探索互联网行业的前沿动态和未来发展趋势。身为参与者,我有幸深入这场融合科技与商业的交流盛会,特别是“聚焦开源,扩展出海新领航”这一议题,让我收获颇丰,印象深刻。 大会聚焦于全球化的多元话题,包括出海市场的选择、广告推广策略等,与我此前参加的专注于日本市场出海活动的公司非常相似。然而,这次大会让我首次深入接触开源社区,不仅结识了众多开源界的领袖和布道者,也与许多杰出的开发者交流了心得。通过这些交流,我不仅学习到了许多新知识,还在思想上得到了升华。 在这篇博客中,我将对这次独特的经历进行深入的反思和总结,分享我在开源和全球化交汇中的洞见和学习。 对于 OpenIM 来说,我们现阶段正在全力准备奔向海外市场,希望打开国界,将 OpenIM 好用而且免费的开源核心功能贡献给全世界开发者。 开源项目天生就是分布式协作的,这是一种松散的结构。以 OpenIM 的开发者为例,我们现在有很多贡献者,开发者,虽然社区有双周会,但是还是很难和人或者同事有深层次的交流。 但对于开源商业公司而言,并不能简单的使用这种远程工作模式。在商业公司中,协作会更加的密切,而且对时效性的要求更高,当面沟通更能保证信息传递的完整性,这是远程工作难以替代的。当然,远程工作也有自己的优势,那就是吸引全球的人才。 所以,开源商业公司采用远程协作并没有问题,但一定要保证沟通的足够充分,拉平信息: 要视频沟通,文字只作为最终的记录。视频是沟通过程中信息丢失比较少的方式,是远程工作交流的首选方式。千万不要用文字来讨论非技术问题,这会带来巨大的信息差和误解。 保证沟通的尊重和善意。在开源项目中,大家因为没有雇佣关系,都是无偿做贡献,所以在异步沟通时特别强调尊重和善意;而在商业公司的远程办公时,因为缺少同事之间的沟通、吐槽和心理按摩,就更要注意沟通的尊重。 定期线下见面,增加相互之间的了解和信任。 另外一点,长期的远程协作,对于参与的工程师来说,除了需要很高的自律和自我管理的要求外,也要注意工作和生活的隔离,保持正常的社交活动和运动健身,否则很容易与社会脱节。 之前和 Apache APISIX 的某个小姐姐聊天,她说的一句话感触很深。也有很多适应不了远程工作的同事一一离去,这也是一个适者生存的达尔文法则。 关于 OpenIM 的远程工作,以及企业的文化,强烈推荐阅读下面的博客: Englist Version 中文版本 出海挑战:中国互联网企业的全球化之旅 中国互联网企业在全球化道路上的探索充满挑战与机遇。从初涉海外市场的尝试到在竞争激烈的国际环境中求生存,它们不断在新的市场环境中寻找增长点。这一过程中,企业需要超越传统的商业模式,适应多元文化和不同的市场需求。 首先,来到了第一个话题,为什么要去做海外社区? 和很多的开源社区的布道者和专家沟通交流,然后反思,我深信建立一个活跃的海外社区是开源项目成功的关键。在全球化的今天,开源不仅是关于代码的分享,更是一种文化和思想的交流。通过建立海外社区,我们不仅能将技术带到世界的每个角落,还能促进不同文化背景下的思想碰撞和创新。 人性化地讲,建立海外社区意味着建立更广泛的连接和共鸣。每一位开源贡献者,不论身处何地,都希望他们的声音被听见,他们的贡献被认可。海外社区提供了一个平台,让来自世界各地的开发者能够参与到项目中来,分享他们独特的视角和经验。这种多元化的参与不仅丰富了项目本身,还激发了更多创新的火花。 同时,海外社区的建立也是对开源精神的一种致敬。开源精神强调的是开放、协作和共享,而这些价值观在全球范围内都是通用的。当我们向海外扩展时,我们不仅在分享代码,更在传播这种包容和合作的精神。 此外,对于开源项目而言,海外社区的建立还意味着更广阔的市场和使用场景。不同的地区和文化背景下,用户对技术的需求和应用方式可能截然不同。这些多样性的输入是项目发展不可或缺的,它们有助于项目更全面地成长,更好地服务于全球用户。 我从大一开始接触 Github ,这个成功打开我通往未来的钥匙。 从2020年左右我开始接触开源,觉得开源比业务代码更有意义。因为开源不仅有技术积累,而且能把你学到的东西分享给其他人,一起成长,所以开源对程序员来说是一个双赢的事。 最开始的时候,我通过学习做笔记,分享笔记到 GitHub ,到后面做项目,参与到一些顶级的开源项目中来,然后慢慢的追求精益。整个过程,我很清晰的看到自己的成长。 甚至我的代码,就像 Git 或者 区块链的默克尔树结构,一步步的串起来记录,每当一个时间段,看到以前的 PR ,满满的都是回忆和尴尬 … 同样,我也是一个云原生的爱好者。 在如今这个时代,开源已经成为了一个不可逆的潮流,尤其是在云原生的领域。以微软为例,他们在 Github 上的开源项目贡献位居全球前列,这充分体现了他们对开源的全面拥抱。在云原生时代,如果你不拥抱开源,不利用开源组件去构建和优化你的核心系统,很可能会在激烈的市场竞争中落后。云原生技术的迅猛发展要求企业和开发者必须快速适应新技术和方法论,而开源社区正是这种创新和合作的孵化器。在这个时代,开源不仅仅是技术选择,更是一种必要的战略思维。 开源社区国际化选择:第一站,启航 美国:开源发展的领头羊 美国仍然是全球最大的开发者社区,拥有超过2000万的开发者,过去一年增长了21%。美国的开源社区历史悠久且成熟,是全球开源活动的重要推动者。 亚太地区:快速增长的新星 亚太地区,尤其是印度、日本和新加坡,正经历着显著的开源社区增长。印度的开发者社区增长尤为显著,预计到2027年将超过美国,成为全球最大的开源社区。 非洲:充满潜力的新兴市场 非洲各地区,尤其是尼日利亚、加纳和肯尼亚,也在迅速发展成为技术公司的新兴枢纽。这些地区的开发者数量每年都在显著增长。 南美洲:稳健增长的活跃区域 南美洲的开发者社区,特别是在阿根廷和巴西,也在持续增长,与亚太和非洲的增长速度相仿。 欧洲:稳定增长的成熟市场 欧洲的开源社区虽然增长速度较美国慢,但在西班牙、德国和英国等国家仍保持稳定增长。...

December 7, 2023 · 3 分钟 · 477 字 · 熊鑫伟,我

GitOps 实践理论:Kubernetes 部署策略深入解析

今天我们来看看 kubernetes 和 gitops 的理论实践 命令介绍 首先我们来看看 kubectl 支持的子命名,方便我们使用: kubectl apply - 应用一个或多个资源的定义。通常用于部署应用程序或更新资源。 kubectl get - 显示一个或多个资源的信息。这是查看 Kubernetes 集群中资源状态的常用命令。 kubectl describe - 显示一个或多个资源的详细信息,如事件、状态和配置。 kubectl delete - 删除 Kubernetes 集群中的资源。 kubectl exec - 在集群中的容器里执行命令。 kubectl logs - 打印容器的日志。 kubectl create - 从文件或标准输入中创建一个或多个资源。 kubectl edit - 编辑集群中的资源。这将打开一个编辑器来修改资源的配置。 kubectl port-forward - 将本地端口转发到集群中的 Pod。 kubectl run - 在集群中运行一个指定的镜像。 kubectl scale - 调整资源(如 Deployment、ReplicaSet)的副本数量。 kubectl rollout - 管理资源的部署,如查看状态、暂停、恢复或回滚更新。 除了上面的命令,Kubernetes 中的 kubectl 还支持注解: kubectl annotate 命令用于给 Kubernetes 集群中的资源添加或更新注解(annotations)。注解是一种附加信息,可以用于存储非识别性的元数据。它们通常用于管理工具、库和客户端以存储辅助信息,例如描述、版本信息等。...

November 25, 2023 · 10 分钟 · 2034 字 · 熊鑫伟,我

管理后台和监控的部署与设计

OpenIM 提供了多种灵活的部署选项,适用于不同的环境和需求。以下是这些部署方案的简化和优化描述: 源码部署: 普通源码部署:使用 nohup 方式进行部署。这是一种基础的部署方法,适合于开发和测试环境。详情参见:普通源码部署指南。 生产级部署:采用 system 方式,更适合于生产环境。这种方法提供了更高的稳定性和可靠性。详情参见:生产级部署指南。 集群部署: Kubernetes 部署:提供两种方式,包括通过 helm 和 sealos 进行部署。这适用于需要高可用性和可扩展性的环境。具体方法请参考:Kubernetes 部署指南。 Docker 部署: 普通 Docker 方式:适用于快速部署和小型项目。详细信息请见:Docker 部署指南。 Docker Compose 方式:提供了更便捷的服务管理和配置,适合于复杂的多容器应用。 接下来,我们将逐一介绍这些部署方法的具体步骤、监控和管理后台的配置,以及使用技巧,帮助您根据自己的需求选择最合适的部署方案。 源码 & Docker 部署 源码部署 openim-server 和 openim-chat ,其他的组件都是通过 Docker 部署。 docker 部署则通过 https://github.com/openimsdk/openim-docker 仓库一键部署所有的组件。 部署的配置文件,可以阅读 https://github.com/openimsdk/open-im-server/blob/main/scripts/install/environment.sh 文档了解如何学习以及熟悉各个环境变量。 对于 Prometheus 来说,默认是没有开启 Prometheus 的,如果需要开启的话,需要在 make init 之前设置环境变量: export PROMETHEUS_ENABLE=true # 默认是 false 然后执行:...

November 15, 2023 · 3 分钟 · 453 字 · 熊新伟,我