首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >cellphonedb 及其可视化

cellphonedb 及其可视化

作者头像
生信技能树jimmy
发布于 2020-12-15 08:07:27
发布于 2020-12-15 08:07:27
6.4K00
代码可运行
举报
文章被收录于专栏:单细胞天地单细胞天地
运行总次数:0
代码可运行

作者 | 周运来

正文

在单细胞数据分析过程中,上游的拆库定量,中游的分群注释,目前的门槛是很低的了。但是解析细胞类型异质性不应止于这些,还可以看细胞群之间的通讯。当然,这方面我们介绍过CellChat:细胞间相互作用分析利器。CellChat是以信号通路为单位来计算细胞间交流状态的,很多同学用cellphonedb来做基于配受体对的细胞间交流。今天,我们就来用经典的pbmc3k数据跑一下cellphonedb,并尝试可视化。

先放一张想象图:

来自文章:Single-cell transcriptomics reveals regulators underlying immune cell diversity and immune subtypes associated with prognosis in nasopharyngeal carcinoma

照例,请出我们的pbmc3k数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
library(Seurat)
library(SeuratData)
pbmc3k

An object of class Seurat 
13714 features across 2700 samples within 1 assay 
Active assay: RNA (13714 features, 0 variable features)

head(pbmc3k@meta.data)
               orig.ident nCount_RNA nFeature_RNA seurat_annotations
AAACATACAACCAC     pbmc3k       2419          779       Memory CD4 T
AAACATTGAGCTAC     pbmc3k       4903         1352                  B
AAACATTGATCAGC     pbmc3k       3147         1129       Memory CD4 T
AAACCGTGCTTCCG     pbmc3k       2639          960         CD14+ Mono
AAACCGTGTATGCG     pbmc3k        980          521                 NK
AAACGCACTGGTAC     pbmc3k       2163          781       Memory CD4 T

可以看出已经注释好了的,接下来我们写出跑cellphonedb的文件:表达谱和细胞分组文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 write.table(as.matrix(pbmc3k@assays$RNA@data), 'cellphonedb_count.txt', sep='\t', quote=F)
 meta_data <- cbind(rownames(pbmc3k@meta.data), pbmc3k@meta.data[,'seurat_annotations', drop=F])  
meta_data <- as.matrix(meta_data)
  meta_dat[is.na(meta_data)] = "Unkown" #  细胞类型中不能有NA

 write.table(meta_data, 'cellphonedb_meta.txt', sep='\t', quote=F, row.names=F)

假设诸君已经安装好cellphonedb ,并加入环境变量了,我们可以这样跑:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cellphonedb method statistical_analysis  cellphonedb_meta.txt  cellphonedb_count.txt      --counts-data=gene_name  # 如果是直接写出基因名的加这个参数,转化为基因ID的话不用加。

#cellphonedb 自己的绘图
cellphonedb plot dot_plot 
cellphonedb plot heatmap_plot cellphonedb_meta.txt   

cellphonedb 结果文件需要挨个打开看看,不要只看名字。更多细节可以看官网的介绍,记住,官网对你是开放的。

https://www.cellphonedb.org/documentation

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ree out/
out/
├── count_network.txt  # 绘制网络图文件
├── deconvoluted.txt
├── heatmap_count.pdf
├── heatmap_log_count.pdf
├── interaction_count.txt
├── means.txt # 绘制点图文件
├── plot.pdf
├── pvalues.txt  # 绘制点图文件 
└── significant_means.txt

下面在R中对结果进行可视化演练,主要是网络图和点图。点图我们知道ggplot的同学都不陌生了,就是网络图一看就让人头大,好在之前你们家运来小哥哥抄完了网络数据的统计分析:R语言实战一书,算是知道些皮毛,可以在这里用上啦。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pbmc='D:\\SingleCell\\out\\' ##  outs 文件放在这里了。

library(psych)
library(qgraph)
library(igraph)

netf<- "count_network.txt"
mynet <- read.delim(paste0(pbmc,"count_network.txt"), check.names = FALSE)
head(mynet)
        SOURCE       TARGET count
1 Memory CD4 T Memory CD4 T     3
2 Memory CD4 T            B    10
3 Memory CD4 T   CD14+ Mono    14
4 Memory CD4 T           NK    15
5 Memory CD4 T        CD8 T     6
6 Memory CD4 T  Naive CD4 T     3

net<- graph_from_data_frame(mynet)

plot(net)

读入网络数据,构建网络,并绘制最简单的一张网络图:

为了给这个网络图的边点mapping上不同的属性我们引入一串颜色。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
allcolour=c("#DC143C","#0000FF","#20B2AA","#FFA500","#9370DB",
            "#98FB98","#F08080","#1E90FF","#7CFC00","#FFFF00",
            "#808000","#FF00FF","#FA8072","#7B68EE","#9400D3",
            "#800080","#A0522D","#D2B48C","#D2691E","#87CEEB",
            "#40E0D0","#5F9EA0","#FF1493",
            "#FFE4B5","#8A2BE2","#228B22","#E9967A","#4682B4",
            "#32CD32","#F0E68C","#FFFFE0","#EE82EE","#FF6347",
            "#6A5ACD","#9932CC","#8B008B","#8B4513","#DEB887")

karate_groups <- cluster_optimal(net)
coords <- layout_in_circle(net, order =
                             order(membership(karate_groups)))  # 设置网络布局

E(net)$width  <- E(net)$count/10  # 边点权重(粗细)
plot(net, edge.arrow.size=.1, 
     edge.curved=0,
     vertex.color=allcolour,
     vertex.frame.color="#555555",
     vertex.label.color="black",
     layout = coords,
     vertex.label.cex=.7) 

经过以上一番修饰后,我们得到的网络图如下:

但是边的颜色和点的颜色还是对应不上,我们来修改一番边的属性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
net2 <- net  # 复制一份备用

for (i in 1: length(unique(mynet$SOURCE)) ){
  E(net)[map(unique(mynet$SOURCE),function(x) {
    get.edge.ids(net,vp = c(unique(mynet$SOURCE)[i],x))
  })%>% unlist()]$color <- allcolour[i]
}  # 这波操作谁有更好的解决方案? 

plot(net, edge.arrow.size=.1, 
     edge.curved=0,
     vertex.color=allcolour,
     vertex.frame.color="#555555",
     vertex.label.color="black",
     layout = coords,
     vertex.label.cex=.7) 

至此,文章开头的第一张图就复现出来了。我们观察到由于箭头是双向的,所以两个细胞类型之间的线条会被后来画上去的覆盖掉(开头那张网络图也有这个问题吗?),这里我们把线条做成曲线:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plot(net, edge.arrow.size=.1, 
     edge.curved=0.2, # 只是调了这个参数
     vertex.color=allcolour,
     vertex.frame.color="#555555",
     vertex.label.color="black",
     layout = coords,
     vertex.label.cex=.7) 

这下清晰很多了。

接下来,我们来绘制第二组类型贝壳一样的网络图。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dev.off()
length(unique(mynet$SOURCE)) # 查看需要绘制多少张图,以方便布局
par(mfrow=c(2,5), mar=c(.3,.3,.3,.3))

for (i in 1: length(unique(mynet$SOURCE)) ){
  net1<-net2
  E(net1)[map(unique(mynet$SOURCE),function(x) {
    get.edge.ids(net,vp = c(unique(mynet$SOURCE)[i],x))
  })%>% unlist()]$color <- allcolour[i]

  plot(net1, edge.arrow.size=.1, 
       edge.curved=0.4,
       vertex.color=allcolour,
       vertex.frame.color="#555555",
       vertex.label.color="black",
       layout = coords,
       vertex.label.cex=1) 

}

这样是不是清晰了许多呢?

但是,细胞间通讯的频数(count)并没有绘制在图上,略显不足,这就补上吧。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dev.off()
length(unique(mynet$SOURCE))
par(mfrow=c(2,5), mar=c(.3,.3,.3,.3))

for (i in 1: length(unique(mynet$SOURCE)) ){
  net1<-net2

  E(net1)$count <- ""
  E(net1)[map(unique(mynet$SOURCE),function(x) {
    get.edge.ids(net,vp = c(unique(mynet$SOURCE)[i],x))
  })%>% unlist()]$count  <- E(net2)[map(unique(mynet$SOURCE),function(x) {
    get.edge.ids(net,vp = c(unique(mynet$SOURCE)[i],x))
  })%>% unlist()]$count  # 故技重施

  E(net1)[map(unique(mynet$SOURCE),function(x) {
    get.edge.ids(net,vp = c(unique(mynet$SOURCE)[i],x))
  })%>% unlist()]$color <- allcolour[i]

  plot(net1, edge.arrow.size=.1, 
       edge.curved=0.4,
       edge.label = E(net1)$count, # 绘制边的权重
       vertex.color=allcolour,
       vertex.frame.color="#555555",
       vertex.label.color="black",
       layout = coords,
       vertex.label.cex=1
  ) 

}

需要再做一些调整就可以啦。

找两条边验证一下对应关系。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mynet %>% filter(SOURCE  == 'B',TARGET == 'DC')
  SOURCE TARGET count
1      B     DC    18

 mynet %>% filter(SOURCE  == 'Memory CD4 T',TARGET == 'B')
        SOURCE TARGET count
1 Memory CD4 T      B    10

用ggplot2 绘制点图,关键是把两张表合并到一起。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mypvals <- read.delim(paste0(pbmc,"pvalues.txt"), check.names = FALSE)
mymeans <- read.delim(paste0(pbmc,"means.txt"), check.names = FALSE)

# 这些基因list很有意思啊,建议保存
chemokines <- grep("^CXC|CCL|CCR|CX3|XCL|XCR", mymeans$interacting_pair,value = T)
chemokines <- grep("^CXC|CCL|CCR|CX3|XCL|XCR", mymeans$interacting_pair,value = T)
th1 <- grep("IL2|IL12|IL18|IL27|IFNG|IL10|TNF$|TNF |LTA|LTB|STAT1|CCR5|CXCR3|IL12RB1|IFNGR1|TBX21|STAT4", 
            mymeans$interacting_pair,value = T)
th2 <- grep("IL4|IL5|IL25|IL10|IL13|AREG|STAT6|GATA3|IL4R", 
            mymeans$interacting_pair,value = T)
th17 <- grep("IL21|IL22|IL24|IL26|IL17A|IL17A|IL17F|IL17RA|IL10|RORC|RORA|STAT3|CCR4|CCR6|IL23RA|TGFB", 
             mymeans$interacting_pair,value = T)
treg <- grep("IL35|IL10|FOXP3|IL2RA|TGFB", mymeans$interacting_pair,value = T)
costimulatory <- grep("CD86|CD80|CD48|LILRB2|LILRB4|TNF|CD2|ICAM|SLAM|LT[AB]|NECTIN2|CD40|CD70|CD27|CD28|CD58|TSLP|PVR|CD44|CD55|CD[1-9]", 
                      mymeans$interacting_pair,value = T)
coinhibitory <- grep("SIRP|CD47|ICOS|TIGIT|CTLA4|PDCD1|CD274|LAG3|HAVCR|VSIR", 
                     mymeans$interacting_pair,value = T)
niche <- grep("CSF", mymeans$interacting_pair,value = T)

mymeans %>% dplyr::filter(interacting_pair %in% costimulatory)%>%
  dplyr::select("interacting_pair",starts_with("NK"),ends_with("NK"))  %>%  
  reshape2::melt() -> meansdf

colnames(meansdf)<- c("interacting_pair","CC","means")

mypvals %>% dplyr::filter(interacting_pair %in% costimulatory)%>%
  dplyr::select("interacting_pair",starts_with("NK"),ends_with("NK"))%>%  
  reshape2::melt()-> pvalsdf

colnames(pvalsdf)<- c("interacting_pair","CC","pvals")
pvalsdf$joinlab<- paste0(pvalsdf$interacting_pair,"_",pvalsdf$CC)
meansdf$joinlab<- paste0(meansdf$interacting_pair,"_",meansdf$CC)
pldf <- merge(pvalsdf,meansdf,by = "joinlab")

summary((filter(pldf,means >1))$means)

pldf%>% filter(means >1) %>% 
  ggplot(aes(CC.x,interacting_pair.x) )+ 
  geom_point(aes(color=means,size=-log10(pvals+0.0001)) ) +
  scale_size_continuous(range = c(1,3))+
  scale_color_gradient2(high="red",mid = "yellow",low ="darkblue",midpoint = 25  )+ theme_bw()+ 
  theme(axis.text.x = element_text(angle = -45,hjust = -0.1,vjust = 0.8)) 

这部分写的略显臃肿,勉强可用吧。

番外篇:在不能用--counts-data=gene_name时,我们可以如何转化基因ID呢。这里提供一种思路:用Seurat读两次数据,一次是基因SYMBOL,一次是ENTREZID(cellranger提供的便利)。方法是从10X的输出中直接读取带有ENTREZID的矩阵,如下从这个矩阵中匹配出目标矩阵。

读入数据的时候gene.column = 1默认为2(SYMBOL)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Read10X(
  data.dir = NULL,
  gene.column = 1,
  unique.features = TRUE,
  strip.suffix = FALSE
)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
seurat2cellphonedb<- function(seosym,seo,groups,group1,celltype){
  Idents(seo) <- groups
  myseogroup <- subset(seo,idents =group1)
  myseogroup1 <-  subset(seosym,cells=colnames(myseogroup ))
  count_raw <- myseogroup1@assays$RNA@counts
  count_norm <- apply(count_raw, 2, function(x) (x/sum(x))*10000)
  write.table(count_norm, paste0(group1,"_cellphonedb_count.txt"), sep='\t', quote=F)
  meta_data <- cbind(rownames(myseogroup@meta.data),myseogroup@meta.data[,celltype, drop=F])
  write.table(meta_data, paste0(group1,'_cellphonedb_meta.txt'), sep='\t', quote=F, row.names=F)
}

$cellphonedb method statistical_analysis   cseocellphonedb_meta.txt  C_cellphonedb_count.txt

$cellphonedb plot dot_plot
$cellphonedb plot heatmap_plot yourmeta.txt

References

[1] 细胞配受体通识以及常见细胞分泌信号通路: https://www.jianshu.com/p/df4721d29a91 [2] CellChat:细胞间相互作用分析利器: https://www.jianshu.com/p/da145cff3d41 [3] CellChat:细胞间相互作用在线内容: https://www.jianshu.com/p/e5ff8140f388 [4] Cell-Cell Interaction Database|| 单细胞配受体库你还在文章的附录里找吗?: https://www.jianshu.com/p/49613adce465 [5] celltalker:单细胞转录组配受体分析: https://www.jianshu.com/p/2c2f94b4f072 [6] Network在单细胞转录组数据分析中的应用: https://www.jianshu.com/p/23e46ad14a3e [7] CellChat:细胞间相互作用分析利器: https://www.jianshu.com/p/da145cff3d41 [8] Single-cell transcriptomics reveals regulators underlying immune cell diversity and immune subtypes associated with prognosis in nasopharyngeal carcinoma:https://www.nature.com/articles/s41422-020-0374-x#Abs1 [9] https://www.cellphonedb.org/documentation [10] 网络数据的统计分析:R语言实战: https://www.jianshu.com/nb/47898774 [11] https://www.cellphonedb.org/faq-and-troubleshooting [12] https://github.com/Teichlab/cellphonedb/blob/master/cellphonedb/src/plotters/R/plot_heatmaps.R [13] https://github.com/zktuong/ktplots/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 单细胞天地 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
软件工程:敏捷管理组织的探索之路
在当今快速变化的商业环境中,敏捷管理已成为企业追求高效和灵活的关键策略。作为软件开发领域的一种革命性实践,敏捷方法论已经超越了其最初的应用范围,影响了整个企业管理领域。我们将探讨敏捷管理组织的概念、实施策略、面临的挑战以及成功案例,以期为追求卓越的企业和个人提供启示。
运维开发王义杰
2024/01/21
1880
软件工程:敏捷管理组织的探索之路
Scrum总结
每周五都是总结的时候,不过这次因为五一假期,所以有了些调整,在周三的阿里认证后回顾公开课要到8号了。由于VIP的课程这次讲的东西比较多,所以也配合的拆成了两段,Scrum和用户故事。
TestOps
2022/04/07
2980
Scrum总结
《硝烟中的Scrum和XP》第13章 我们怎样结合使用Scrum和XP
第13章 我们怎样结合使用Scrum和XP Scrum注重的是管理和组织实践,而XP关注的是实际的编程实践。这就是为什么它们可以很好地协同工作——它们解决的是不同领域的问题,可以互为补充,相得益彰 ---- 结对编辑 结对编程可以提高代码质量 结对编程可以让团队的精力更加集中。(比如坐在你后面的那个人会提醒你,“嘿,这个东西真的是这个sprint必需的吗?”) 令人惊奇的是,很多强烈掏结对编程的开发人员根本就没有尝试过,而一旦尝试之后就会迅速喜欢上它 结对编程令人精疲力竭,不能全天都这样做 常常更换结对是有
yeedomliu
2020/04/14
9470
「敏捷测试」敏捷方法论:理解敏捷测试的完整指南
事实上,根据VersionOne的敏捷状态报告,截至2018年,97%的组织以某种形式实践敏捷。 然而,受访者表示,这种采用在其组织中并不总是很普遍,这意味着在采用和成熟方面还有很长的路要走。
架构师研究会
2019/06/18
1.2K0
敏捷开发并非一味的追求交付速度
自2001年《敏捷宣言》发布以来,敏捷开发(Agile Development)逐渐成为软件工程领域的主流方法论。然而,许多人对敏捷开发的认知仍停留在“快速交付”、“压缩时间”的层面,甚至将其等同于“加班赶工”或“牺牲质量的短期冲刺”。
JanYork_简昀
2025/05/20
1690
敏捷开发并非一味的追求交付速度
手机淘宝:多团队开发一个产品如何保持敏捷
Scrum等敏捷开发框架,最初都是为5到9人的小团队设计的。通过保持专注和合理利用新技术,在相当长的时间里小团队仍然可以支撑业务发展。
DevOps时代
2019/09/04
7300
手机淘宝:多团队开发一个产品如何保持敏捷
【敏捷2.8】Scrum 典型开发过程
总算来到了 Scrum 的最后一篇文章,前面的超长文章有没有吓到大家。如果你没记住它们也没关系,看完今天这篇简单的文章内容之后,我们再回去看它们就简单易懂了。当然,如果是要准备 PMI-ACP 考试的同学,那还是尽量回去好好记住它们吧。
硬核项目经理
2021/12/20
5650
【敏捷2.8】Scrum 典型开发过程
一只猪的 Scrum 开发经历
Scrum 是一种方法论,有很多术语、定义、规则。 本文不是讲 Scrum 理论,而是从应用的角度,讲述我自身 Scrum 实践的经验体会。理论运用到实践中时,一定会有所变化。本文中根据我切身经历,对
CSDN技术头条
2018/03/26
1.6K0
一只猪的 Scrum 开发经历
Scrum学习,革自己的命,让别人说去
越是大公司,流程越落后,越僵化。大公司成功的原因在于积累丰厚,打个不好的比喻就是地主家有余粮,冬天不容易饿死。但是地主的儿子不见得比穷人的儿子有能力。 一、Scrum是什么 Scrum 是一个用于开发和维持复杂产品的框架 ,是一个增量的、迭代的开发过程。在这个框架中,整个开发过程由若干个短的迭代周期组成,一个短的迭代周期称为一个Sprint,每个Sprint的建议长度是2到4周(互联网产品研发可以使用1周的Sprint)。在Scrum中,使用产品Backlog来管理产品的需求,产品backlog是一个按照商
大数据和云计算技术
2018/03/08
6440
Scrum学习,革自己的命,让别人说去
什么是敏捷软件开发?
Scrum是一个框架,在这个框架中,人们可以解决复杂的适应性问题,同时高效、创造性地交付最高价值的产品。它用于管理软件项目、产品或应用程序开发。它的重点是自适应产品开发策略,其中跨职能团队作为一个单位,在2-4周内(Sprint)达到一个共同的目标。它由价值、工件、角色、仪式、规则和最佳实践组成。
增强现实核心技术产业联盟
2020/06/12
1.5K0
什么是敏捷软件开发?
敏捷开发:拥抱变化,持续交付价值的艺术
在快速变化的技术和市场环境中,软件开发项目面临着前所未有的挑战。传统的瀑布模型,尽管在某些情况下仍然有效,但往往因为其僵化和缺乏灵活性而受到批评。敏捷开发,作为一种新兴的软件开发方法论,应运而生,旨在解决这些问题,提供一种更加灵活、响应快速的开发方式。
正在走向自律
2024/12/18
2880
敏捷开发:拥抱变化,持续交付价值的艺术
什么是敏捷框架 Scrum 中的 “3355”?
接触过敏捷的我们,一定对Scrum都不陌生,Scrum是众多轻量级敏捷框架中应用最广泛的一种。
DevOps时代
2019/03/08
10.6K0
什么是敏捷框架 Scrum 中的 “3355”?
07.【Kevin聊敏捷】敏捷项目管理之Scrum
Scrum不是敏捷,它只是实现敏捷管理的方法之一。敏捷项目管理方法还有:极限编程(XP),水晶(Crystal),Kanban,特性驱动开发(FDD)、动态系统开发(DSDM)、轻量级RUP、测试驱动开发(TDD)等,他们各有各的特点,也可以组合着使用。Scrum是一个全球普遍使用的敏捷管理方法,简而简之是一种综合增量和迭代的产品交付方法。
开心的Kevin
2019/05/22
1.4K0
07.【Kevin聊敏捷】敏捷项目管理之Scrum
【敏捷2.5】其它敏捷框架
你们一定想知道为什么不接着讲 Scrum 呀?干嘛中间横插一脚。好东西嘛,当然要留到最后,所以我在这里也就卖个关子,先陪着大家一起来学习一下其它好玩的敏捷框架,或许你能发现不一样的东西哦!
硬核项目经理
2021/11/26
6730
Scrum Master如何做?
Scrum是基于敏捷(Agile)思想的开发框架,用于迭代式增量软件开发过程,它基于经验型流程控制理论。
PM吃瓜
2023/03/02
4900
Scrum Master如何做?
敏捷开发--scrum
1.  请简述一下什么是敏捷开发(Agile Development),以及什么是持续集成。 敏捷开发是一种以人为核心、迭代、循序渐进的开发方法。在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态。、 持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的
smy
2018/04/03
2K0
【审视】Scrum Master的检查清单
一般情况下,一个Scrum Master如果更多的是做组织会议、确保时间盒以及对流程中的障碍快速响应等事项的话,可以同时引导2-3个团队。在这种情况下,团队会在降低问题发生率的基础上提高一定的绩效。
敏捷开发
2022/04/26
5370
【审视】Scrum Master的检查清单
如何实现Scrum敏捷转型?
随着敏捷项目管理模式在国内的流行,各流派敏捷实践培训风起云涌,Scrum框架的相关实践和案例最多,也最为国内推崇。然而在实际应用中,我们会遇到怎么样的阻碍?如何突破这些阻碍,让客户满意,提升客户交付价值?
砖家认证
2020/05/14
9770
技术分享 | 想测试入门就必须要懂的软件开发流程
从事软件测试行业,每天面对的被测对象都是软件。如果想要更好的去完成测试工作,首先需要对被测对象,也就是对软件要有基本的了解。
用户9652437
2022/04/18
4660
敏捷和Scrum之间的区别
当一个新人进入项目管理领域时,在这个充满挑战和专业化的行业中,通过他们可能遇到的陌生术语和流程似乎令人生畏。事实上,项目经理的任务是作为项目管理团队的成员来管理项目的各个方面,代表各种任务和职责。在管理项目的整个过程中,项目经理有责任制定一种系统的方法来规划和执行他们所监督的项目,包括所有必需的辅助计划。选择正确的项目管理方法对于指导您的工作和确保项目成功至关重要。有许多方法可以在项目管理中使用,但敏捷和Scrum是两种最常见的方法。
jack.yang
2025/04/05
2870
敏捷和Scrum之间的区别
推荐阅读
相关推荐
软件工程:敏捷管理组织的探索之路
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档