Fork me on GitHub
雨正来【一路奔跑的人】


  • 首页

  • 归档

  • 分类

  • 标签

  • top

  • 关于

  • 搜索

01环境搭建

发表于 2019-06-23 | 分类于 ubuntu18.04 | | 阅读次数:
| 字数统计: 602

环境搭建

更换成国内的源

首先修改 /etc/apt/sources.list 文件,在文件开头增加

##中科大源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//科大
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
//阿里
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
//清华
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse

之后别忘记执行

1
2
sudo apt-get update
sudo apt-get upgrade

“Linux Uprising” 团队维护一个 PPA 存储库,其中包含适用于所有当前 Ubuntu 版本的 Oracle Java 10 安装程序。
请注意,由于授权,PPA 不包含 Java 二进制文件。 PPA 中的包自动从 Oracle Web 服务器下载并安装 Oracle JDK11

  1. 通过 Ctrl + Alt + T 或通过从应用启动器搜索 “终端” 打开终端。 打开时,运行命令添加 PPA:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    sudo add-apt-repository ppa:linuxuprising/java
    sudo apt-get install oracle-java10-installer
    ```
    配置环境变量:

    ``` shell
    sudo gedit ~/.bashrc
    sudo vim ~/.bashrc
    export JAVA_HOME=/usr/lib/jvm/java-8-oracle
    export JRE_HOME=/usr/lib/jvm/java-8-oracle/jre
    export PATH=${JAVA_HOME}/bin:$PATH
    source ~/.bashrc
    sudo vim /etc /soduers
    //修改成和root一样的权限
    ALL=(ALL:ALL) ALL

export PATH=/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin

阅读全文 »

工作日常

发表于 2019-06-19 | | 阅读次数:
| 字数统计: 400


新版本代金券已经开始开发了,鉴于之前其他人就犯过导入数据的问题,所以一定要吸取他们教训。
今天在梳理怎么迁移数据时候,因为之前代金券使用的范围是多个分类,之前他们设计表结构时候是拿中间表去设计的,
但是新版中我们只是做成了一个text字段,那么迁移数据时候可能需要程序还要处理数据。今天突然看了下mysql是否有函数,可以把表中同一个代金券的所能使用的类别范围用一条sql查询出来。去查询mysql和google 发现可以实现,这样就不用在程序中进行处理了。
1
2
3
4
5
6
7
8
9
10
11
GROUP_CONCAT(expr)

This function returns a string result with the concatenated non-NULL values from a group. It returns NULL if there are no non-NULL values. The full syntax is as follows:
GROUP_CONCAT([DISTINCT] expr [,expr ...]
[ORDER BY {unsigned_integer | col_name | expr}
[ASC | DESC] [,col_name ...]]
[SEPARATOR str_val])
mysql> SELECT student_name,
GROUP_CONCAT(test_score)
FROM student
GROUP BY student_name;

默认的话是拿逗号进行分割的

阅读全文 »

checkstyle 使用

发表于 2019-06-14 | | 阅读次数:
| 字数统计: 2k

CheckStyle使用


pom.xml 配置 插件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<configLocation>checkStyle.xml</configLocation>
<encoding>UTF-8</encoding>
</configuration>
<executions>
<execution>
<id>validate</id>
<phase>validate</phase>
<configuration>
<consoleOutput>true</consoleOutput>
<failsOnError>true</failsOnError>
<includeTestSourceDirectory>true</includeTestSourceDirectory>
</configuration>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>


<reporting>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<configLocation>checkstyle.xml</configLocation>
</configuration>
</plugin>
</plugins>

</reporting>

最后增加下checkstyle.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
"-//Puppy Crawl//DTD Check Configuration 1.3//EN"
"http://www.puppycrawl.com/dtds/configuration_1_3.dtd">

<module name="Checker">

<!-- 检查文件是否以一个空行结束 -->
<module name="NewlineAtEndOfFile"/>

<!-- 文件长度不超过1500行 -->
<module name="FileLength">
<property name="max" value="1500"/>
</module>

<!-- 每个java文件一个语法树 -->
<module name="TreeWalker">
<!-- import检查-->
<!-- 检查是否从非法的包中导入了类 -->
<module name="IllegalImport"/>
<!-- 检查是否导入了多余的包 -->
<module name="RedundantImport"/>
<!-- 没用的import检查,比如:1.没有被用到2.重复的3.import java.lang的4.import 与该类在同一个package的 -->
<module name="UnusedImports" />

<!-- 注释检查 -->
<!-- 检查构造函数的javadoc -->
<!-- <module name="JavadocType">-->
<!-- <property name="allowUnknownTags" value="true"/>-->
<!-- <message key="javadoc.missing" value="类注释:缺少Javadoc注释。"/>-->
<!-- </module>-->

<!-- 命名检查 -->
<!-- 局部的final变量,包括catch中的参数的检查 -->
<module name="LocalFinalVariableName" />
<!-- 局部的非final型的变量,包括catch中的参数的检查 -->
<module name="LocalVariableName" />
<!-- 包名的检查(只允许小写字母),默认^[a-z]+(\.[a-zA-Z_][a-zA-Z_0-9_]*)*$ -->
<!-- <module name="PackageName">-->
<!-- <property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$" />-->
<!-- <message key="name.invalidPattern" value="包名 ''{0}'' 要符合 ''{1}''格式."/>-->
<!-- </module>-->
<!-- 仅仅是static型的变量(不包括static final型)的检查 -->
<module name="StaticVariableName" />
<!-- Class或Interface名检查,默认^[A-Z][a-zA-Z0-9]*$-->
<module name="TypeName">
<property name="severity" value="warning"/>
<message key="name.invalidPattern" value="名称 ''{0}'' 要符合 ''{1}''格式."/>
</module>
<!-- 非static型变量的检查 -->
<module name="MemberName" />
<!-- 方法名的检查 -->
<module name="MethodName" />
<!-- 方法的参数名 -->
<module name="ParameterName " />
<!-- 常量名的检查(只允许大写),默认^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$ -->
<module name="ConstantName" />

<!-- 定义检查 -->
<!-- 检查数组类型定义的样式 -->
<module name="ArrayTypeStyle"/>
<!-- 检查long型定义是否有大写的“L” -->
<module name="UpperEll"/>

<!-- 长度检查 -->
<!-- 每行不超过140个字符 -->
<module name="LineLength">
<property name="max" value="140" />
</module>
<!-- 方法不超过50行 -->
<module name="MethodLength">
<property name="tokens" value="METHOD_DEF" />
<property name="max" value="50" />
</module>
<!-- 方法的参数个数不超过5个。 并且不对构造方法进行检查-->
<module name="ParameterNumber">
<property name="max" value="5" />
<property name="ignoreOverriddenMethods" value="true"/>
<property name="tokens" value="METHOD_DEF" />
</module>

<!-- 空格检查-->
<!-- 方法名后跟左圆括号"(" -->
<module name="MethodParamPad" />
<!-- 在类型转换时,不允许左圆括号右边有空格,也不允许与右圆括号左边有空格 -->
<module name="TypecastParenPad" />
<!-- 检查在某个特定关键字之后应保留空格 -->
<module name="NoWhitespaceAfter"/>
<!-- 检查在某个特定关键字之前应保留空格 -->
<module name="NoWhitespaceBefore"/>
<!-- 操作符换行策略检查 -->
<module name="OperatorWrap"/>
<!-- 圆括号空白 -->
<module name="ParenPad"/>
<!-- 检查分隔符是否在空白之后 -->
<module name="WhitespaceAfter"/>
<!-- 检查分隔符周围是否有空白 -->
<module name="WhitespaceAround"/>

<!-- 修饰符检查 -->
<!-- 检查修饰符的顺序是否遵照java语言规范,默认public、protected、private、abstract、static、final、transient、volatile、synchronized、native、strictfp -->
<module name="ModifierOrder"/>
<!-- 检查接口和annotation中是否有多余修饰符,如接口方法不必使用public -->
<module name="RedundantModifier"/>

<!-- 代码块检查 -->
<!-- 检查是否有嵌套代码块 -->
<module name="AvoidNestedBlocks"/>
<!-- 检查是否有空代码块 -->
<module name="EmptyBlock"/>
<!-- 检查左大括号位置 -->
<module name="LeftCurly"/>
<!-- 检查代码块是否缺失{} -->
<module name="NeedBraces"/>
<!-- 检查右大括号位置 -->
<module name="RightCurly"/>

<!-- 代码检查 -->
<!-- 检查空的代码段 -->
<module name="EmptyStatement"/>
<!-- 检查在重写了equals方法后是否重写了hashCode方法 -->
<module name="EqualsHashCode"/>
<!-- 检查局部变量或参数是否隐藏了类中的变量 -->
<module name="HiddenField">
<property name="tokens" value="VARIABLE_DEF"/>
</module>
<!-- 检查子表达式中是否有赋值操作 -->
<module name="InnerAssignment"/>
<!-- 检查switch语句是否有default -->
<module name="MissingSwitchDefault"/>
<!-- 检查是否有过度复杂的布尔表达式 -->
<module name="SimplifyBooleanExpression"/>
<!-- 检查是否有过于复杂的布尔返回代码段 -->
<module name="SimplifyBooleanReturn"/>

<!-- 类设计检查 -->
<!-- 检查类是否为扩展设计l -->
<!-- 检查只有private构造函数的类是否声明为final -->
<module name="FinalClass"/>
<!-- 检查接口是否仅定义类型 -->
<module name="InterfaceIsType"/>
<!-- 检查类成员的可见度 检查类成员的可见性。只有static final 成员是public的
除非在本检查的protectedAllowed和packagedAllowed属性中进行了设置-->
<module name="VisibilityModifier">
<property name="packageAllowed" value="true"/>
<property name="protectedAllowed" value="true"/>
</module>

<!-- 语法 -->
<!-- String的比较不能用!= 和 == -->
<module name="StringLiteralEquality"/>
<!-- 限制for循环最多嵌套2层 -->
<module name="NestedForDepth">
<property name="max" value="2"/>
</module>
<!-- if最多嵌套3层 -->
<module name="NestedIfDepth">
<property name="max" value="3"/>
</module>
<!-- 检查未被注释的main方法,排除以Appllication结尾命名的类 -->
<!-- <module name="UncommentedMain">-->
<!-- <property name="excludedClasses" value=".*[Application,Test]$"/>-->
<!-- </module>-->
<!-- 禁止使用System.out.println -->
<module name="Regexp">
<property name="format" value="System\.out\.println"/>
<property name="illegalPattern" value="true"/>
</module>
<!-- return个数 3个-->
<module name="ReturnCount">
<property name="max" value="3"/>
</module>
<!--try catch 异常处理数量 3-->
<module name="NestedTryDepth ">
<property name="max" value="3"/>
</module>
<!-- clone方法必须调用了super.clone() -->
<module name="SuperClone" />
<!-- finalize 必须调用了super.finalize() -->
<module name="SuperFinalize" />
</module>
</module>


SonarQube 后续有机会再使用sonarQube ,checkstyle 都过不去,哎!

阅读全文 »

[object Object]

发表于 2019-05-19 | | 阅读次数:
| 字数统计: 702

我建议 Elasticsearch 为第一优先级。需要掌握的内容如下。

(1)掌握 Elasticsearch 的基本概念,主要包括:

索引(index)

类型(type)

映射(mapping)

文档(document)

倒排索引原理

文档打分机制

集群(cluster)—— 单节点、集群安装与部署

健康状态(red/yellow/green)

数据存储

数据类型(long/date/text、keyword/nested 等)

数据展示(结合 Head 插件的基础可视化)

……

(2)掌握 Elasitcsearch 的基本操作,主要包括:

新增(insert)

删除(delete/deletebyquery)

修改(update/updatebyquery)

查找(search)

精确匹配检索(term、terms、range、exists)

模糊匹配检索(wildcard、prefix、negix 正则)

分词全文检索(match/match_phrase 等)

多条件 bool 检索(must/must_not/should 多重组合)

分词(英文分词、拼音分词、中文分词)

高亮

分页查询

指定关键词返回

批量操作 bulk

scroll 查询

reindex 操作

……

(3)掌握 Elasticsearch 高级操作,主要包括:

聚合统计(数量聚合、最大值、最小值、平均值、求和等聚合操作)

图像化展示(hisgram 按照日期等聚合)

聚合后分页

父子文档

数组类型

nested 嵌套类型

ES 插件错误排查(集群问题、检索问题、性能问题)

ES 性能调优(配置调优、集群调优等)

……

(4)掌握 Elasticsearch Java/Python 等 API,主要包括:

Elasticsearch 原生自带 API、JEST、Springboot 等 API 选型

Elasticsearch 多条件 bool 复杂检索 API

Elasticsearch 分页 API

Elasticsearch 高亮 API

Elasticsearch 聚合 API

Elasticsearch 相关 JSON 数据解析

……

(5)Elasticsearch 结合场景开发实战,主要包括:

数据可视化(Kibana、Grafana 等 其中 Grafana 比较适合监控类场景)

通过 logstash/beats 等导入数据

Elasticsearch 和 Kafka 结合的应用场景

Elasticsearch 和 Mongo 结合的应用场景

Elasticsearch 和 Hadoop 结合的应用场景

结合业务需求的定制化应用场景(日志分析、文档检索、全文检索、金融等各行业检索)

……

建议的第二学习优先级为 Kibana。需要掌握的内容如下。

Kibana 安装与部署

ES 节点数据同步到 Kibana

Kibana Dev Tools 开发工具熟练使用

Kibana 图像化组合展示

将 Kibana 图像化展示效果图应用到自己的开发环境中

……

第三学习优先级为 Logstash。需要掌握的内容如下。

Logstash 的安装与部署

Logstash 将本地文件导入 ES

logstashinputjdbc 插件(5.X 后无需安装)将 MySQL/Oracle 等关系型数据库数据导入 ES,全量导入和增量导入实现。

logstashinputmongo 插件将 Mongo 数据导入 ES

logstashinputkafaka 插件将 Kafak 数据导入 ES

logstashoutput* 插件将 ES 数据导入不同的数据库和实时数据流中

……

第四学习优先级为 Beats。需要掌握的内容如下。

不同类型的 Beats 安装与部署

将业务数据通过 Beats 导入 ES

……

阅读全文 »

[object Object]

发表于 2019-05-16 | | 阅读次数:
| 字数统计: 420

阅读全文 »

redis常用命令

发表于 2019-05-15 | 分类于 nosql-缓存-redis | | 阅读次数:
| 字数统计: 1.3k

redis常用命令

expire key second
应用场景:

  • 限时的相关的业务
  • 网站数据缓存
  • 手机验证码
  • 限制web访客的限制次数
    redis 分配默认是预分配冗余空间的,例如len是字符串长度,实际分配为大于len ,字符串小于1m时候扩容是加倍空间,大于1m时候扩容是增加1m,最多存储512m .
    最佳实践 项目中对key进行命名统一规范 user:name 或者 user:1:lucky user:2: lee

String 类型

set key value
setnx key value
get key value
getset key value
strlen key
incr key value
incrby key value
decr key value
decrby key value
setex key value 设置key 并过期时间为秒
psetex key value设置key 并过期时间为毫秒
mset key value1 key2 value2
mget key key2

应用场景 
  1. 存储json字符串或者图片,因为string是二进制安全的不存在解码问题
    1. 计数器
    2. incr 是原子性的操作,能保证多线程并发问题
      阅读全文 »

redis 缓存mysql 一致方案

发表于 2019-05-13 | 分类于 nosql-缓存-redis | | 阅读次数:
| 字数统计: 31
解毒redis 持久化

一致性解决方案 讲的很详细
另外如果想要保持实时性,可以参考 阿里的canal

阅读全文 »

重要组件服务网关

发表于 2019-05-11 | 分类于 微服务 | | 阅读次数:
| 字数统计: 587
重要组件服务网关

掌握网关几个重点


微服务中网关都有哪些可以选择?

原始的SpringCloud 体系中最常使用的有 zuul 、Consul 、gateway ,本文主要先复习zuul 都有哪些重点!

zuul 首先是做什么的?

  • 负责请求路由和路由过滤功能

    负责将外部的请求转发到具体的微服务实例上,对外实现统一标准的入口;服务过滤实现一些验证和服务聚合;

    ##zuul 有哪些核心的原理?
    核心原理就是实现了一系列的Filter ,四个重要的元素
    1
    2
    3
    4
    5
    6
    7
    8
    //路由类型
    String filterType();
    //filter 顺序 越小优先级越大 默认实现 有 -3
    int filterOrder();
    //是否应该过滤
    boolean shouldFilter();
    //过滤的具体方法
    Object run();
  • filterType
    • pre:可以在请求被路由之前调用。
    • routing:在路由请求时候被调用。
    • post:在 routing 和 error 过滤器之后被调用。
    • error:处理请求时发生错误时被调用。
  • filterOrder:通过 int 值来定义过滤器的执行顺序,数值越小优先级越高。
  • shouldFilter:返回一个 boolean 类型来判断该过滤器是否要执行。我们可以通过此方法来指定过滤器的有效范围。
  • run:过滤器的具体逻辑。在该函数中,我们可以实现自定义的过滤逻辑,来确定是否要拦截当前的请求,不对其进行后续的路由,或是在请求路由返回结果之后,对处理结果做一些加工等。

    zuul 如何应用?都能扩展什么功能?

  • 服务鉴权
  • 限流
  • 根据业务编写自定义的过滤器实现定制化业务逻辑处理

    zuul 都有哪些坑?

    zuul eagr-load 模式配置
    zuul.ribbon.eager-load.enabled=true
    没有单独的参数进行配置,我们可以通过 zuul.ignored-services=* 来忽略所有的默认路由,让所有路由配置均维护在配置文件中,以达到网关启动的时候就默认初始化好各个路由转发的负载均衡对象。

路由匹配规则时候要保证有序性,请采用YAML格式,因为拓展的功能ext 也是在/user-service下,这样会导致匹配顺序问题。

1
2
3
4
5
6
7
8
zuul:
routes:
user-service-ext:
path: /user-service/ext/**
serviceId: user-service-ext
user-service:
path: /user-service/**
serviceId: user-service

  • 阅读全文 »

大厂敏捷都有哪些方法

发表于 2019-05-09 | 分类于 编程 | | 阅读次数:
| 字数统计: 1.1k
敏捷开发


文章都来自于学习极客时间《软件工程之美》

大型公司都在用哪些敏捷的方法?

回溯本质,不论什么方法归根都要解决一个问题就是怎么更好的进行管理和指导软件开发工作。其实最后用到所谓的方法论或者行之有效的方法就是“分而治之” 。 大项目拆分成N个小项目、大服务拆分小服务、大团队拆分小团队 、小项目拆分多个模块。
公司的管理也是这样的例子,总经理—部门经理—组长—组员!大趋势所需,现在微服务、容器化等技术越来越流行敏捷更流行吧!
参考学习下 敏捷开发的根本矛盾是什么?从业十余年的工程师在思考

敏捷开发相关的主要流程规范

毕竟要有一套行之有效的方法论,指导我们去进行相关事务的落实工作。那么我们看看都有哪些关于敏捷开发的流程?

  1. 一切工作任务围绕 Ticket 开展

    最早是甘特图,相信很多大龄的貌似多多少少接触过,而敏捷是则是看板board,记得几年前在一家公司,总监曾就职隶属于老美的App Annie,当时就采用了scrum 敏捷的一些流程,现在回忆起来有点感慨,但是没做多久!

    阅读全文 »

敏捷开发

发表于 2019-04-29 | 分类于 编程 | | 阅读次数:
| 字数统计: 729

敏捷开发

其实都是在从方法论、工具等方面解释敏捷开发。
我将基于 Scrum 和极限编程的实践,来对比一下敏捷开发模型和瀑布模型的差异。

  1. 敏捷开发是怎么做需求分析的?
    可能就是总结出一个小故事,写在看板上或者卡片上,有时候甚至就一句话,在sprint 冲刺的环节去确认具体的需求。

    比如 :作为用户,要有登录功能,能访问我们的web网页,但是要求开发人员有良好的沟通能力和对需求的理解能力。

  2. 敏捷开发是怎么做架构设计的?
    每个 Sprint 只做一部分需求,所以是一种渐进式的架构设计,当 前 Sprint 只做适合当前需求的架构设计。必然会产生一些技术债。那么必要的时候一定要进行定期重构。但是个人理解,有的时候重构是一个很大的问题!!!!
  3. 敏捷开发怎么保证项目质量的?
    敏捷开发的 Sprint 中,并没有专门的测试阶段,这就依赖于开发功能的同时,要编写单元测试和集成测试代码,用自动化的方式辅助完成测试。 这个时候需要开发人员要有一定的能力,并不是每个人都能写好单元测试和自动化辅助测试的。
    阅读全文 »
123…7
lancecong

lancecong

68 日志
9 分类
32 标签
点下试试
  • 😆 网易云音乐 😆
  • Coldplay Official Website
  • 获取 Elon Musk 的新闻
  • 尼古拉·特斯拉:发明了现代世界的人
© 2017 — 2020 lancecong
微信扫一扫,call me !
0%