当前位置: 首页 > news >正文

知识工程视角下的软件研发

知识工程

在我们的工作中存在两类知识:显式知识(explicit knowledge)不可言说的知识(tacit knowledge)

所谓显式知识就是能够直接表达且在人群中分享的知识。比如,地球的周长、水的密度、三角形面积公式等等。
不可言说的知识是指那些不易用言语表达或形式化的知识,它通常是个人经验、直觉或技能的一部分,与个人的认知和学习过程紧密相关。

不可言说知识通常更为重要
例如,在一个软件开发团队中,不可言说的知识可能包括特定的编码实践、项目管理的非正式流程、代码审查的潜规则,甚至是如何有效地与特定同事沟通的技巧。这些知识通常不在任何手册中,但对于新成员快速融入团队、提高工作效率和质量至关重要。

不可言说知识的传递

当代知识管理理论认为,社会化活动(Socialization)是传递不可言说知识的不二法门。
社会化活动最常见的形式是启动-反馈循环(kickoff-feedback cycle)。在启动阶段(Kick off) 时传递知识,在反馈(feedback)时检查知识是否被吸收并且转化成为实际的产出物。反馈中还要包含针对思维过程的反馈,或是知识消费者对思维过程的自省。
另一种特殊的社会化活动是训练法。也就是将不可言说知识转化为教程、dojo、或者挑战练习等方式。通过一系列启动-反馈循环,持续且稳定地完成不可言说知识的传递。
对于软件架构,一个最常见的错误是,架构师通常只会提供架构文档,以说明当前架构的现状,但很少为架构提供教程或使用手册。也就缺乏针对在不同场景下,如何应用架构中的概念解决问题的指引。缺乏训练法,架构中的不可言说知识就无法持续稳定地传播。这是很多架构腐化或是无法落地的根因。

与知识消费有关认知行为模式

所谓认知模式,就是指人利用知识进行决策时,采取的行为模式。我们可以使用Cynefin框架理解不同知识消费和传递中产生的不同认知行为模式。
根据2020版Cynefin框架的定义,这五个领域分别是:清晰(Clear)庞杂(Complicated)复杂(Complex)混乱(Chaotic)困惑(Aporetic/Confused)。利用这五个领域,可以帮助我们更准确地评估情况,并做出适当的反应。

首先是清晰(Clear)的认知行为模式。这种行为模式也被称作已知(Known)或显然(Obvious)模式。当处于清晰模式时,要解决的问题是稳定且具有清晰的因果关系。每个人都能轻易辨别,正确答案往往不言自明,无可争议。处在清晰模式时,认知行为表现为:感知(sense)- 归类(categorize)- 响应(Respond)

庞杂(Complicated)的认知行为模式也叫专家模式。庞杂模式与清晰模式不同,它可能包含多个正确答案,尽管因果之间存在明确的关系,但并非每个人都能看清。当处在庞杂模式时,对于要解决的问题,解决方法目前并不明确,在寻找解决方案的过程中,经验与分析能力发挥关键作用。这种方法并不容易,往往需要专业知识。因而被称作专家模式。
在庞杂模式下,认知行为表现是感知(sense)- 分析(Analysis)- 响应(Respond)

复杂认知行为模式是反思模式,它表现为:探测(Probe)- 感知(Sense)- 响应(Respond)。只能通过探测收集必要的信息,再通过反思感知,最后采取必要响应,调整之前的方案。
当处在复杂模式时,对于要解决的问题,并不知晓是否能够解决。无论前期做多少准备,都不能确保存在解决方案,而是需要依赖反思改进。因此复杂模式也被称作“未知的未知数”

最后是混乱模式,某种程度上说,这是个反模式。它表现为:行动(Act)- 感知(Sense)- 响应(Respond)。混乱模式的主要目的是通过快速行动重新建立秩序,尽快回到前面三种模式当中。因而混乱模式不是基于知识的反应,而是应激式的反应。

软件工程

对于软件,真正的产品是软件中所包含的知识,软件自身仅仅是知识的载体。

从知识传递的过程来理解软件工程

  • 从宏观过程来看,软件研发的过程是一个对于业务知识学习的过程,是复杂认知行为模式。
  • 进入到交付过程之前,我们需要将业务知识转化为软件功能需求,这是目标解决方案的应用,是一个不可言说知识应用的过程,是庞杂认知行为模式。
  • 架构知识也可以看作是从技术视角出发的解决方案。按照架构构造软件的过程,是一个不可言说知识应用的过程,是庞杂认知行为模式。
  • 在软件构造过程中,功能性和非功能性质量保障措施会带来不同的认知行为模式。

理解了软件工程中的知识传递,与它们带来的不同认知行为模式,我们自然可以评价不同的研发方法带来效率的差别。我们工作中常用的方法,可能是低效的,而看起来奇怪的方法可能是高效的。
比如,Debug实际是低效的复杂认知行为模式,探测(打断点)- 感知(通过断点周围的数据和调用栈,寻找问题成因)- 响应(定位问题)。
Debug实际表示我们并不知道代码到底是如何运转的,正在学习当前代码库。而看起来奇怪的测试驱动开发(Test Driven Development)则是庞杂认知行为模式。

认知分歧

在团队中,对于同一个问题,有的人处在庞杂认知模式,而另外一些人则处在复杂的认知模式中。我们还是以软件开发中的架构知识为例,对于架构师而言,应用某个架构实现功能,是处在庞杂认知模式。他可以按照架构的要求,对需求进行进一步分解,从而在架构的指导下,完成功能。而对于新加入团队的成员而言,可能处于复杂认知模式,也就是需要先实现功能,再根据组员或架构师的反馈,逐步修改代码以符合架构的要求。
对于团队而言,效率的根源在于知识传递的效率,即知识传递的准确性,一致性和及时性,这些极大地影响着团队的效率。

知识过程下的软件研发实践

  1. 软件开发绝大部分活动都应该处于有序的状态(清晰或庞杂),严格控制无序状态的成本。

这里需要强调的一个概念就是有序和无序,我们将认知行为模式分为有序——清晰和庞杂,以及无序——复杂和混沌两类。比较这两类认知行为模式就会发现,有序的行为模式是感知(sense)在先,而无序的行为模式则是行动在先,感知在后。对应到复杂的行为模式就是探测-感知,对应到混沌就是行为-感知。
这意味着什么呢?这意味着当我们处于有序的认知行为模式时,我们对于要解决的问题是有定义的,可能对于解决方案不太了解。而处于无序的认知行为时,我们甚至不清楚要解决的问题是什么。

那为什么要严格控制无序状态的成本呢?这是因为,当我们处于无序的活动时,不仅仅成本很高,而且时间不可控。仔细想一想无序的两个行为模式,无论是复杂还是混沌,实际上都缺乏对于待解决问题的理解。本质上讲,我们就是不会,不能胜任,我们就是在学习。学就要分学得会和学不会两种情况了。这意味着,我们可能无法完成要解决的问题。
那么站在管理的角度上来看,任何无序的认知活动,实际都是项目风险,不光是质量风险,更是进度风险。于是对于这类活动最常见的管理方式,就是卡住时间——给予一定的时间,如果无法解决,那么就要立即止损
止损的方式包括换人、寻找外援等等。我想大家都有过看起来简单,实际是大坑,最后造成项目严重延期的经历。这实际上告诉我们,当我们处在无序认知的时候,不要相信自己的判断,理想的做法就是及时止损。

  1. 结对编程(Pair Programming)
    结对编程可以促进实时讨论和交流,从而使得不可言说知识更容易被理解和吸收。一名程序员可以向另一名程序员解释他的思维过程、选择和决策背后的逻辑,从而使得不可言说知识得以更清晰地传达。
    结对编程还可以通过反馈机制来加深程序员对不可言说知识的理解和掌握。当一名程序员使用不可言说知识时,另一名程序员可以提出问题、提供反馈和建议,从而帮助他们更好地理解和应用这些知识。最终有效地拉齐认知分歧。

相关文章:

知识工程视角下的软件研发

知识工程 在我们的工作中存在两类知识:显式知识(explicit knowledge)、不可言说的知识(tacit knowledge)。 所谓显式知识就是能够直接表达且在人群中分享的知识。比如,地球的周长、水的密度、三角形面积公…...

深度学习------权重衰退

目录 使用均方范数作为硬性限制使用均方范数作为柔性限制演示最优解的影响参数更新法则总结高纬线性回归多项式的权重衰退从零开始实现初始化模型参数定义L2范数惩罚定义训练代码实现忽略正则化直接训练使用权重衰减从零开始代码实现 多项式的权重衰退的简洁实现简洁函数代码简…...

【算法】退火算法 Simulated Annealing

退火算法(Simulated Annealing, SA)是一种基于热力学模拟的优化算法,用于求解全局优化问题。它通过模拟物理退火过程来寻找全局最优解。以下是退火算法的基本原理和步骤: 一、基本原理 退火算法的灵感来源于金属在高温下缓慢冷却…...

深入理解 Git `git add -p` 命令中的交互选项

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119@qq.com] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? 专栏导…...

HTML JavaScript 闪光涟漪

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>闪光涟漪</title><style>.ripple-conta…...

FastAPI之Depends

文章目录 基本概念基本用法复杂场景中的 Depends数据库会话管理处理请求用户嵌套依赖全局依赖 作用域与生命周期可选依赖类依赖总结 基本概念 在 FastAPI 中&#xff0c;依赖可以是&#xff1a; 一个函数&#xff0c;它的返回值会被传递给视图函数作为参数。可以被其他依赖函…...

AttributeError: module ‘jwt‘ has no attribute ‘decode‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

C++——C++11

前言&#xff1a;本篇文章将分享一些C11版本所产生的一些新的技术以及对老版本的优化。 目录 一.C11简介 二.统一的列表初始化 1.{}初始化 2.std::initializer_list 三.右值引用和移动语义 1.左值引用和右值引用 2.两者的比较 &#xff08;1&#xff09;左值引用 &#…...

day12 多线程

目录 1.概念相关 1.1什么是线程 1.2什么是多线程 2.创建线程 2.1方式一&#xff1a;继承Thread类 2.1.1实现步骤 2.1.2优缺点 2.1.3注意事项 2.2方式二&#xff1a;实现Runnable接口 2.2.1实现步骤 2.2.2优缺点 2.2.3匿名内部类写法 2.3方式三&#xff1a;实现cal…...

DeferredResult 是如何实现异步处理请求的

最近遇到了一个问题&#xff0c;我们的一个接口需要去轮询另一个第三方接口&#xff0c;导致这个接口占用了太多工作线程&#xff0c;这些工作线程长时间 running&#xff0c;我们需要解决这个问题。 于是&#xff0c;我们的方案是&#xff1a;用 DeferredResult 实现接口异步。…...

VUE3——001(03)、开发环境配置(node.js/mvn/java/ngix/tomact/vue3)

嫌麻烦的请下载安装包&#xff0c;有点强迫&#xff08;懒的&#xff09;可以看看。 解释&#xff1a;安装目录&#xff0c;即软件安装所在目录&#xff0c;如 node.js 我装在 D:\AppFolder\nodejs 系统变量修改 path增加 安装目录 在系统变量 p…...

TCP/IP_TCP协议

目录 一、TCP协议 1.1 确认应答 1.2 超时重传 1.3 连接管理 1.4 TCP状态 1.5 滑动窗口 1.6 流量控制 1.7 拥塞控制 1.8 延迟应答 1.9 捎带应答 1.10 粘包问题 1.11 异常情况 二、TCP/UDP对比 总结 一、TCP协议 TCP 协议和 UDP 协议是处于传输层的协议。 【TCP协…...

鸿蒙应用框架开发【简单时钟】 UI框架

简单时钟 介绍 本示例通过使用ohos.display接口以及Canvas组件来实现一个简单的时钟应用。 效果预览 使用说明 1.界面通过setInterval实现周期性实时刷新时间&#xff0c;使用Canvas绘制时钟&#xff0c;指针旋转角度通过计算得出。 例如&#xff1a;"2 * Math.PI / …...

MySQL是如何实现数据排序的

MySQL是如何实现数据排序的 MySQL实现数据排序主要依赖于其内部的排序和索引机制。当执行包含ORDER BY子句的SQL查询时&#xff0c;MySQL会采用以下一种或多种策略来对数据进行排序 索引排序 如果ORDER BY子句中的列是表的一个索引&#xff08;或索引的一部分&#xff09;&a…...

【测试架构师修炼之道】读书笔记

六大质量属性 效率性能 测试类型&#xff1a;六种-XX属性转化为XX测试 产品测试车轮图 一个软件测试者要从哪些方面(测试类型)用哪些方法(测试方法)去测试产品(质量属性)的关系图 全面性与深度 稳定性测试&#xff1a;多并复异 性能测试&#xff1a; 系统能够正确处理新业…...

C++ Functor仿函数

Functor 对象模拟函数 把类对象&#xff0c;像函数名一样使用。 仿函数(functor)&#xff0c;就是使一个类的使用看上去像一个函数。其实现就是类中实现 一个 operator()&#xff0c;这个类就有了类似函数的行为&#xff0c;就是一个仿函数类了。 operator() 语法格式 clas…...

【EI会议征稿通知】第五届大数据、人工智能与软件工程国际研讨会(ICBASE 2024)

重要信息 会议官网&#xff1a;www.icbase.org&#xff08;查看详情&#xff09; 中文主页&#xff1a;【往届会后3个月检索】第五届大数据、人工智能与软件工程国际研讨会&#xff08;ICBASE 2024&#xff09;_艾思科蓝_学术一站式服务平台 会议时间&#xff1a;2024年9月2…...

微信小程序多端框架实现app内自动升级

多端框架生成的app&#xff0c;如果实现app内自动升级&#xff1f; 一、Android 实现app自动升级&#xff0c;华为应用市场 1、获取 应用市场地址 下载地址 2、在微信开放平台进行配置 应用下载地址&#xff1a;应用市场点击分享&#xff0c;里面有一个复制连接功能 应用市…...

C# Log4Net应用

1 需求分析 日志记录是程序开发中必不可少的环节,对于bug调试和后期项目维护都十分重要.其中Log4net是C#环境下广泛使用的日志记录库,功能十分强大.本教程提供的日志记录需求如下 1&#xff0c;日志文件统一保存到项目启动目录下的logs文件夹 2&#xff0c;以天为单位进行日志…...

pytest8.x版本 中文使用文档-------32.示例:使用自定义目录收集器

默认情况下&#xff0c;pytest 使用pytest.Package来收集包含 __init__.py 文件的目录&#xff0c;使用 pytest.Dir来收集其他目录。如果你想要自定义目录的收集方式&#xff0c;你可以编写自己的pytest.Directory 收集器&#xff0c;并使用 pytest_collect_directory钩子来连接…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)

+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...

【深尚想】TPS54618CQRTERQ1汽车级同步降压转换器电源芯片全面解析

1. 元器件定义与技术特点 TPS54618CQRTERQ1 是德州仪器&#xff08;TI&#xff09;推出的一款 汽车级同步降压转换器&#xff08;DC-DC开关稳压器&#xff09;&#xff0c;属于高性能电源管理芯片。核心特性包括&#xff1a; 输入电压范围&#xff1a;2.95V–6V&#xff0c;输…...

未授权访问事件频发,我们应当如何应对?

在当下&#xff0c;数据已成为企业和组织的核心资产&#xff0c;是推动业务发展、决策制定以及创新的关键驱动力。然而&#xff0c;未授权访问这一隐匿的安全威胁&#xff0c;正如同高悬的达摩克利斯之剑&#xff0c;时刻威胁着数据的安全&#xff0c;一旦触发&#xff0c;便可…...