当前位置: 首页 > 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钩子来连接…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

yaml读取写入常见错误 (‘cannot represent an object‘, 117)

错误一&#xff1a;yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因&#xff0c;后面把yaml.safe_dump直接替换成yaml.dump&#xff0c;确实能保存&#xff0c;但出现乱码&#xff1a; 放弃yaml.dump&#xff0c;又切…...

DAY 45 超大力王爱学Python

来自超大力王的友情提示&#xff1a;在用tensordoard的时候一定一定要用绝对位置&#xff0c;例如&#xff1a;tensorboard --logdir"D:\代码\archive (1)\runs\cifar10_mlp_experiment_2" 不然读取不了数据 知识点回顾&#xff1a; tensorboard的发展历史和原理tens…...