提交 28b811f5 编写于 作者: 沉默王二's avatar 沉默王二 💬

安卓

上级 06d65a9c
......@@ -46,7 +46,7 @@
# 学习路线
> 除了 Java 学习路线,还有 C语言、C++、Python、Go 语言、操作系统、前端、数据结构与算法、蓝桥杯、大数据等硬核学习路线,欢迎收藏品鉴!
> 除了 Java 学习路线,还有 C语言、C++、Python、Go 语言、操作系统、前端、数据结构与算法、蓝桥杯、大数据、Android等硬核学习路线,欢迎收藏品鉴!
* [Java学习路线一条龙版(建议收藏🔥)](docs/xuexiluxian/java/yitiaolong.md)
* [Java并发编程学习路线(建议收藏🔥)](docs/xuexiluxian/java/thread.md)
......@@ -60,6 +60,7 @@
* [算法和数据结构学习路线(建议收藏🔥)](docs/xuexiluxian/algorithm.md)
* [蓝桥杯学习路线(建议收藏🔥)](docs/xuexiluxian/lanqiaobei.md)
* [大数据学习路线(建议收藏🔥)](docs/xuexiluxian/bigdata.md)
* [Android 安卓学习路线(建议收藏🔥)](docs/xuexiluxian/android.md)
# 面渣逆袭
......
......@@ -34,6 +34,7 @@ export const sidebarConfig = sidebar({
"algorithm",
"lanqiaobei",
"bigdata",
"android",
],
"/sidebar/sanfene/": [
"javase.md",
......
......@@ -63,7 +63,7 @@ head:
## 学习路线
除了 Java 学习路线,还有 C语言、C++、Python、Go 语言、操作系统、前端、数据结构与算法、蓝桥杯、大数据等硬核学习路线,欢迎收藏品鉴!
除了 Java 学习路线,还有 C语言、C++、Python、Go 语言、操作系统、前端、数据结构与算法、蓝桥杯、大数据、Android等硬核学习路线,欢迎收藏品鉴!
* [Java学习路线一条龙版(建议收藏🔥)](xuexiluxian/java/yitiaolong.md)
* [Java并发编程学习路线(建议收藏🔥)](xuexiluxian/java/thread.md)
......@@ -77,6 +77,7 @@ head:
* [算法和数据结构学习路线(建议收藏🔥)](xuexiluxian/algorithm.md)
* [蓝桥杯学习路线(建议收藏🔥)](xuexiluxian/lanqiaobei.md)
* [大数据学习路线(建议收藏🔥)](xuexiluxian/bigdata.md)
* [Android 安卓学习路线(建议收藏🔥)](xuexiluxian/android.md)
## 面渣逆袭
......
---
title: 大厂的优惠券系统是如何设计的?
shortTitle: 大厂的优惠券系统是如何设计的?
author: JavaEdge
category:
- 微信公众号
---
## 1 Scenario 场景
电商大厂常见促销手段:
* 优惠券
* 拼团
* 砍价
* 老带新
### **1.1 优惠券的种类**
* 满减券
* 直减券
* 折扣券
### **1.2 优惠券系统的核心流程**
#### **1.2.1 发券**
发券的方式:同步发送 or 异步发送
#### **1.2.2 领券**
* 谁能领?
所有用户 or 指定的用户
* 领取上限
一个优惠券最多能领取多少张?
* 领取方式
用户主动领取 or 自动发放被动领取
#### **1.2.3 用券**
* 作用范围
商品、商户、类目
* 计算方式
是否互斥、是否达到门槛等
### **1.3 需求拆解**
#### **1.3.1 商家侧**
* 创建优惠券
* 发送优惠券
#### **1.3.2 用户侧**
* 领取优惠券
* 下单
* 使用优惠券
* 支付
## **2 Service 服务**
### **2.1 服务结构设计**
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-daadyhqjtsrhsjd-cdf44a4a-f648-49f0-bebe-686c4a66d2fd.jpg)
### **2.2 优惠券系统设计技术难点**
* 券的分布式事务,使用券的过程会出现的分布式问题分析?
* 如何防止超发?
* 如何大批量给用户发券?
* 如何限制券的使用条件?
* 如何防止用户重复领券?
## 3 Storage存储
### **3.1 表单设计**
#### **券批次(券模板),coupon\_batch**
指一批优惠券的抽象、模板,包含优惠券的大部分属性。
如商家创建了一批优惠券,共1000张,使用时间为2022-11-11 00:00:00 ~ 2022-11-11 23:59:59,规定只有数码类目商品才能使用,满100减50。
#### **券**
发放到用户的一个实体,已与用户绑定。
如将某批次的优惠券中的一张发送给某个用户,此时优惠券属于用户。
#### **规则**
优惠券的使用有规则和条件限制,比如满100减50券,需要达到门槛金额100元才能使用。
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-daadyhqjtsrhsjd-638df6ed-12f8-4a20-8c58-89051bc9376a.jpg)
**券批次表 coupon\_batch**
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-daadyhqjtsrhsjd-c4d8f639-328b-42b9-94b0-5e15b8eee784.jpg)
**规则表 rule:**
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-daadyhqjtsrhsjd-b2383938-ffbc-4686-808c-908ab11e4b2b.jpg)
**规则内容:**
```
{
threshold: 5.01 // 使用门槛
amount: 5 // 优惠金额
use_range: 3 // 使用范围,0—全场,1—商家,2—类别,3—商品
commodity_id: 10 // 商品 id
receive_count: 1 // 每个用户可以领取的数量
is_mutex: true // 是否互斥,true 表示互斥,false 表示不互斥
receive_started_at: 2020-11-1 00:08:00 // 领取开始时间
receive_ended_at: 2020-11-6 00:08:00 // 领取结束时间
use_started_at: 2020-11-1 00:00:00 // 使用开始时间
use_ended_at: 2020-11-11 11:59:59 // 使用结束时间
}
```
**优惠券表 coupon:**
```
create table t_coupon
(
coupon_id int null comment '券ID,主键',
user_id int null comment '用户ID',
batch_id int null comment '批次ID',
status int null comment '0-未使用、1-已使用、2-已过期、3-冻结',
order_id varchar(255) null comment '对应订单ID',
received_time datetime null comment '领取时间',
validat_time datetime null comment '有效日期',
used_time datetime null comment '使用时间'
);
```
### **3.2 建券**
**1、新建规则**
```
INSERT INTO rule (name, type, rule_content)
VALUES(“满减规则”, 0, '{
threshold: 100
amount: 10
......
}');
```
**2、新建优惠券批次**
```
INSERT INTO coupon\_batch (coupon\_name, rule\_id, total\_count )
VALUES(“劳斯莱斯5元代金券”, 1010, 10000);
```
### **3.3 发券**
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-daadyhqjtsrhsjd-066459b1-1271-468e-9e45-c409b6298144.jpg)
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-daadyhqjtsrhsjd-a448c453-8b50-4af8-a913-bda03a6c6f97.jpg)
##### **如何给大量用户发券?**
异步发送!
##### **触达系统**
* 短信、邮件
可通过调用第三方接口的方式实现
* 站内信
通过数据库插入记录来实现
**信息表 message**
```
create table t_message
(
id int null comment '信息ID',
send_id int null comment '发送者id',
rec_id int null comment '接受者id',
content vachar(255) comment '站内信内容',
is_read int null comment '是否已读',
send_time datetime comment '发送时间'
)
comment '信息表';
```
先考虑用户量很少的情况,商家要给所有人发站内信,则先遍历用户表,再按照用户表中的所有用户依次将站内信插入到 message 表中。这样,如果有100个用户,则群发一条站内信要执行100个插入操作。
#### **系统用户数增加到w级**
发一条站内信,就得重复插入上万条数据。而且这上万条数据的 content 一样!假设一条站内信占100K,发一次站内信就要消耗十几M。对此,可将原来的表拆成两个表:
**信息表 message**
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-daadyhqjtsrhsjd-19c6ce5d-8e83-4552-902d-5d28cd17a7be.jpg)
**信息内容表 message\_content**
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-daadyhqjtsrhsjd-e04b414f-6b41-4882-8324-208715b52284.jpg)
#### **发一封站内信的步骤**
1. 往 message\_content 插入站内信的内容
2. 在 message 表中,给所有用户插入一条记录,标识有一封站内信
#### **千w级用户数**
这就有【非活跃用户】的问题,假设注册用户一千万,根据二八原则,其中活跃用户占20%。若采用上面拆成两个表的情况,发一封“站内信”,得执行一千万个插入操作。可能剩下80%用户基本都不会再登录,其实只需对其中20%用户插入数据。
**信息表 message:**
```
create table t_message
(
id int null comment '信息 ID',
# send_id int null comment '发送者 id', 去除该字段
rec_id int null comment '接受者 id',
message_id int null comment '外键,信息内容',
is_read int null comment '是否已读'
)
comment '信息表';
create table t_message_content
(
id int null comment '信息内容id',
send_id int null comment '发送者id',
content varchar(255) null comment '内容',
send_time datetime null comment '发送时间'
);
```
#### **用户侧操作**
登录后,首先查询 message\_content 中的那些没有在 message 中有记录的数据,表示是未读的站内信。在查阅站内信的内容时,再将相关的记录插入 message。
#### **系统侧操作**
发站内信时:
* 只在 message\_content 插入站内信的主体内容
* message 不插入记录
#### **给 10W 用户发券**
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-daadyhqjtsrhsjd-e6134270-a52f-4579-a200-e0c0e4c13c82.jpg)
有什么问题?重复消费,导致超发!
1. 运营提供满足条件的用户文件,上传到发券管理后台并选择要发送的优惠券
2. 管理服务器根据【用户ID】、【券批次ID】生成消息,发送到MQ
3. 优惠券服务器消费消息
```
# 记住使用事务哦!
INSERT INTO coupon (user_id, coupon_id,batch_id)
VALUES(1001, 66889, 1111);
UPDATE coupon_batch SET total_count = total_count - 1,
assign_count = assign_count + 1
WHERE batch_id = 1111 AND total_count > 0;
```
### **3.4 领券**
#### 步骤
1. 校验优惠券余量
```
SELECT total_count FROM coupon_batch
WHERE batch_id = 1111;
```
2. 新增优惠券用户表,扣减余量
```
# 注意事务!
INSERT INTO coupon (user_id, coupon_id,batch_id)
VALUES(1001, 66889, 1111);
UPDATE coupon_batch SET total_count = total_count - 1,
assign_count = assign_count + 1
WHERE batch_id = 1111 AND total_count > 0;
```
用户领券过程中,其实也会出现类似秒杀场景。秒杀场景下会有哪些问题,如何解决?
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-daadyhqjtsrhsjd-8367d61b-2a12-4225-9fc2-586a1baac77d.jpg)
#### **用户重复领取或多领**
Redis 数据校验!
1. 领券前,先查缓存
```
# 判断成员元素是否是集合的成员
```
```
SISMEMBER KEY VALUE
SISMEMBER batch_id:1111:user_id 1001
```
2. 领券
3. 领券后,更新缓存
```
# 将一或多个成员元素加入到集合中,已经存在于集合的成员元素将被忽略
SADD KEY VALUE1......VALUEN
SADD batch_id:1111:user_id 1001
```
## **3.5 用券**
何时校验优惠券使用规则?
1. 确认订单(√)
2. 提交订单
3. 立即付款
确认订单页,对优惠券进行校验:
* 判断是否过期
* 判断适用范围
* 判断是否达到门槛
* 判断是否互斥
### **返回可用券**
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-daadyhqjtsrhsjd-182ea6b8-4702-4f01-b3dd-f9636815863f.jpg)
```
SELECT batch_id FROM coupon WHERE user_id = 1001 AND status = 0;
SELECT rule_id FROM coupon_batch WHERE batch_id = 1111;
SELECT name, type, rule_content FROM rule WHERE rule_id = 1010;
```
### 选择可用券,并返回结果
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-daadyhqjtsrhsjd-3d50a63e-2c1a-413b-9143-f808dcc4e0da.jpg)
### **同时操作多个服务,如何保证一致性?**
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-daadyhqjtsrhsjd-3b30f2df-fd77-4265-b655-31a82028505e.jpg)
### **表设计**
**优惠券操作记录表 Coupon\_opt\_record**
```
create table t_coupon_opt_record
(
user_id int null comment '用户id',
coupon_id int null comment '优惠券id',
operating int null comment '操作,0-锁定、1-核销、2-解锁',
operated_at datetime null comment '操作时间'
);
```
TCC,Try-Confirm-Cancel,目前分布式事务主流解决方案。
1. 阶段一:Try
对资源进行冻结,预留业务资源
创建订单时,将优惠券状态改为 “冻结”
2. 阶段二:Confirm
确认执行业务操作,做真正提交,将第一步Try中冻结的资源,真正扣减
订单支付成功,将优惠券状态改为 “已使用”
3. 阶段三:Cancel
取消执行业务操作,取消Try阶段预留的业务资源
支付失败/超时或订单关闭情况,将优惠券状态改为 “未使用”
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-daadyhqjtsrhsjd-c6a77fdf-4f4d-4082-92a7-c2cd11aba686.jpg)
## 4 Scale 扩展
### **4.1 快过期券提醒**
#### **定时扫券表**
缺点:扫描数据量太大,随着历史数据越来越多,会影响线上主业务,最终导致慢SQL。
#### **延时消息**
缺点:有些券的有效时间太长了(30天)以上,有可能造成大量 MQ 积压
#### **新增通知表**
优点:扫描的数据量小,效率高。删除无用的已通知的数据记录
##### **通知信息表(notify\_msg)设计**
```
create table t_notify_msg
(
id bigint auto_increment comment '自增主键',
coupon_id bigint null comment '券id',
user_id bigint null comment '用户id',
notify_day varchar(255) null comment '需要执行通知的日期',
notify_type int null comment '通知类型,1-过期提醒',
notif_time timestamp null comment '通知的时间,在该时间戳所在天内通知',
status int null comment '通知状态,0-初始状态、1-成功、2-失败',
constraint t_notify_msg_id_uindex
unique (id)
);
alter table t_notify_msg
add primary key (id);
```
**过期券提**
1. 在创建优惠券的时候就将需要提醒的记录插入提醒表中notify\_msg
2. 把用户ID+批次ID+通知日期作为唯一索引,防止同一个批次有重复的记录通知,保证每天只会被通知一次
3. 建立notify\_time,通知时间索引,每日的通知扫描通过该索引列查询,通过索引列来提高查询效率
4. 通知完成后该表中的数据变失去了意义,通过定时任务将该数据删除
### **4.2 数据库层面优化 - 索引**
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-daadyhqjtsrhsjd-9e10c3cb-d0af-4b0e-a2f9-3da2fe7e72f1.jpg)
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-daadyhqjtsrhsjd-8df5b954-9e5a-445d-882f-f91616fee662.jpg)
### **4.3 发券接口,限流保护**
#### **前端限流**
点击一次后,按钮短时间内置灰
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-daadyhqjtsrhsjd-d2d8684d-9488-4543-9b2b-8e7559c8e625.jpg)
#### **后端限流**
部分请求直接跳转到【繁忙页】
>参考链接:[https://mp.weixin.qq.com/s/r9lgiOwV5cw8XmfCBUTcUA](https://mp.weixin.qq.com/s/r9lgiOwV5cw8XmfCBUTcUA),出处:JavaEdge,整理:沉默王二
此差异已折叠。
---
title: 银行开发岗求职攻略
shortTitle: 银行开发岗求职攻略
description: ~~
author: 后端技术小牛说
category:
- 微信公众号
head:
---
## 写在前面
大家好,我是小牛,微软程序员一名。好久没更新了,最近秋招开启,先接着来发一波新的八股文背诵版系列,增加了一些今年看到的新题。
大家可以关注下方公众号,回复关键词:interviewtop 获取题库pdf版。
同时,我们根据题库,也开发了互联网题库在线网站:也有不少热心的网友贡献了面试经历。题库还处于更新中,欢迎大家访问。http://interviewtop.top。同时,我的公众号也会发一点广告,负担一下服务器成本,希望大家谅解。
![](https://mmbiz.qpic.cn/mmbiz_jpg/4pX70FGa4OQpIGhW6MYXnLHHKDwkR5WQIUmOeMxShuHqPtEmQvKw4wf9IHJNxjoxFJ7f7FlcIHFeJiazx76IsEg/640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1)
目前题库覆盖公司有:各类银行科技岗,百度,阿里,字节,腾讯,美团,快手,网易,华为,shopee,京东。
![](https://mmbiz.qpic.cn/mmbiz_jpg/4pX70FGa4OQpIGhW6MYXnLHHKDwkR5WQtIBH50ywOg7cTU5XmUfHcPI8hicqfEsIvdk2gQetA8BHCXQ6aFm24Cw/640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1)
题库包括:计算网络,操作系统,数据库,Redis,Java基础,Java多线程,Java虚拟机,设计模式,数据结构与算法。
![](https://mmbiz.qpic.cn/mmbiz_jpg/4pX70FGa4OQpIGhW6MYXnLHHKDwkR5WQ5gCAsNZ1JTNCE1bPV6eMWhmIPHNwnuVC67OOVcGaSLTJX3ReiaoXzibw/640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1)
大家可以进入网站搜索大厂对应题库的高频面试题。
## 写在前面
今年秋招,各大厂HC骤减,又因为当年疫情的扩招,导致今年招聘格外艰辛,不少朋友目前现在手里还是没有offer。今天就分享一下我当年写的一篇关于银行IT求职岗的文章,希望能对读者朋友们带来帮助。
## 国有行
国有行的笔试都是行测(语言理解、逻辑推理、资料分析、数学运算、银行基础、时政)+计算机基础(Java、数据库、c语言、计算机网络等)+英语(单选、阅读理解、选词填空)+性格测试(有的行会单独进行性格测试),总的来说时间比较紧张,没有过多思考的时间,所以得保证正确率去做,可以提前多练练相关的题目。基本笔试通过,面试问题都不大,认真准备都是可以通过的。国有行总的来说加班还行,基本都有双休,但每个月会有一次投产所以肯定会加班,其他时间据了解相对来说强度一般。国有行对学历比较看重。
## 商业银行
商业银行相对国有行对编程的要求高一些,需要做好准备。商业类银行一般也更喜欢招男生。
商业类银行
浙商银行(base:西安、杭州) 浙商子公司为易企银,一般都是进子公司易企银,总行招的较少
笔试:较简单,单选(计网、数据库、Java之类的)+问答(关于金融行业的)
面试:(很迷,玄学;比较看重学历)
1-2面,线下的话只有一面10-15分钟基本就是项目相关加基础;线上两面:一面简单自我介绍,二面就项目基础
宁波银行(base:宁波) 波行的金融科技岗
笔试:单选+多选,给的时间很充足可以慢慢做,还是有点难的,设计spring框架,前端;但基本都能过
面试:四面,一面技术面10分钟左右;二面才艺展示(很迷);三面行政面就是类似HR面问为啥来波行之类的;四面终面:选词进行两分钟的演讲 流程真的太慢太慢了,可能银行的通病吧。。。
浦发银行(浦发基本已子公司化) 笔试:有两场分别是在线机考+在线笔试,在线机考:选择20道+3 道编程,难度不大;在线笔试:英语+行测之类的
面试:就一面,首先是2分钟的演讲,给定材料思考一分钟进行2分钟即兴演讲;10-15分钟项目+Java基础
上海银行 笔试:先面试再笔试
面试:一面:技术面,我遇到的面试官死扣各种细节,不过也是基础知识,属于银行面试中对技术要求比较高的,面试通过再发笔试,然后会面谈,聊一些基本情况和意愿等,接下来就是递交资料,会根据成绩筛人,有挂科不行,75分以下科目过多也不行。
招商银行(分行) 笔试:武汉分行是首先一轮行测题,二面通过后技术笔试(基本都是牛客原题)
面试:宣讲会进行的一面,类似hr面;线下二面(结构化群面);线下三面(群面,关于一个问题抢答自己的想法)
招商银行信用卡中心 该部门个人感觉和互联网公司差不多
笔试:类似互联网公司笔试,牛客网有真题
面试:一轮电话面,一轮线下面试。招行的招聘团会在全国各地跑,通过电话面的同学会被安排去就近城市面试。面试的话,技术主管和hr在一块,一起面试。
招银网络科技(子公司) 可能是最早招聘的公司,六月就招聘了
笔试:类似互联网公司笔试
面试:两轮技术面,一轮线下面试。招行的招聘团会在全国各地跑,通过电话面的同学会被安排去就近城市面试。面试的话,技术主管和hr在一块,一起面试。
## 国有行
农行 总行直属机构软件中心(base:北京、上海、西安、广州、武汉)
笔试:英语+行测(选择题时间很紧张,做不完啊。。)+3道编程(时间过于充裕)+性格测试
面试:根据笔试成绩分批次进行的面试,笔试面试成绩各占50%。大部分地区是单面,武汉报的人多是两人一起面试,对比实在过于明显,技术问题比较基础,但是会比较深入问细节,要多加准备。
工商银行 总行直属机构软件中心(base:北京、上海、西安、珠海、成都)
笔试:英语+行测之类的
面试:因为是来学校进行宣讲+面试,一面,如果面试通过只要笔试通过就可体检走后续流程;若面试未通过就正常走网上流程笔试完通过继续面试;面试10-15分钟,很简单就是项目+基础随便问问
中国银行 总行直属机构软件中心(base:北京、上海、西安、合肥)
笔试:英语(题量贼大,跟考四六级一样,35分钟三个阅读理解好像)+行测之类的
面试:一面,面试体验真不好哦,等一早上候场等待会收手机,坐着等被叫号,面试15分钟差不多,也是给一段材料随便演讲2分钟,然后问简历项目
交通银行 总行直属机构软件中心(base:北京、上海)
笔试:三小时行测,有两道编程
面试:一面是技术面,问题不多,较基础;终面类似hr面,也涉及了一点点点技术问题,难度不大
邮储 总行直属机构软件中心(base:北京、上海、西安、合肥、成都)
笔试:英语+行测之类的
面试:一面线上无领导小组讨论,给一个问题的不同解决方案按重要性进行排序 二面10分钟技术加HR面问的都蛮基础的
## 政策性银行
农业发展银行 珠海研发基地(与北京一样属于总行编制,北京招运维和信息安全岗,招聘人数少,竞争激烈,想要北京户口可以试试;珠海主要招开发岗,2020年开始扩招,招聘人数多,竞争暂时不激烈,适合家在南方的同学)
笔试:第一轮是行测,it岗还多第二轮技术笔试(十道选择,6道sql,4道编程,题量太大)
面试:要求去珠海线下面试,面试只有一轮技术面,范围大,随机提问,难度不大,比较基础,但是正好触到知识盲区就很倒霉了,然后立即进行hr面,半天结束面试流程,但是出通知会很慢,银行的通病了。
希望大家都能成功上岸,加油!
>参考链接:[https://mp.weixin.qq.com/s/LBLsM4MW2KMCtaMr3hZcwQ](https://mp.weixin.qq.com/s/LBLsM4MW2KMCtaMr3hZcwQ),出处:后端技术小牛说,整理:沉默王二
......@@ -266,5 +266,11 @@ B 站上浙江大学的一个数据结构课非常不错,很系统很经典。
祝顺利!
---------
最近整理了一份牛逼的学习资料,包括但不限于Java基础部分(JVM、Java集合框架、多线程),还囊括了 **数据库、计算机网络、算法与数据结构、设计模式、框架类Spring、Netty、微服务(Dubbo,消息队列) 网关** 等等等等……详情戳:[可以说是2022年全网最全的学习和找工作的PDF资源了](https://tobebetterjavaer.com/pdf/programmer-111.html)
关注二哥的原创公众号 **沉默王二**,回复**111** 即可免费领取。
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/xingbiaogongzhonghao.png)
---
title: Android 安卓学习路线(建议收藏🔥)
shortTitle: Android 开发者学习路线
description: Android 安卓学习路线(建议收藏🔥)
category:
- 学习路线
tag:
- 学习路线
head:
- - meta
- name: keywords
content: Android,Performance,AndroidPerformance,性能,优化,性能优化,Perf,Flutter,Linux,AndroidFramework,Framework,Android Performance,Flutter,Kotlin,Memory,内存,流畅性,卡顿,响应速度,Jank,Smooth,Android Framework,ANR,Crash,Dalvik,ART,Jetpack,Compose
---
有球友问二哥有没有安卓方面的学习路线,虽然二哥不是一名专业的安卓工程师,曾经也装模作样的学过一段时间的安卓,买过郭霖的《[第一行代码安卓](https://github.com/itwanger/JavaBooks#android)》,目前应该已经出到第三版了,在业界还是挺有名望的。
虽然不是专业的安卓工程师,但给球友提供一份靠谱的学习路线,二哥还是有这个实力的,知道哪里好哪里坏,如果你是新手,那么下面的内容可以帮助你找到学习的线路;如果你是老手,这篇文章列出的内容也可以帮助你查漏补缺。如果各位有什么其他的建议,欢迎留言交流。
# 推荐资料
- 1、[第一行代码 Android(书籍)](https://github.com/itwanger/JavaBooks#android)
- 2、[Android Tech And Perf(博客)](https://www.androidperformance.com/)
- 3、[2022 最新 Android 基础教程,从开发入门到项目实战(视频)](https://www.bilibili.com/video/BV19U4y1R7zV)
- 4、[关注 Android Jetpack开发:原理解析与应用实战(书籍,二哥写过推荐序)](https://e.jd.com/30816230.html)
- 5、[Flutter实战入门(书籍,二哥写过推荐序)](https://e.jd.com/30622790.html)
# [](#Programming "Programming")Programming
## [](#Java "Java")Java
Java 是 Android App 开发默认的语言, Android Framework 也是默认使用 Java 语言,熟练掌握 Java 语言是 Android 开发者的必备技能。
希望深入 Java 虚拟机的同学,也可以参考下面两本书:
1. 周志明的[《深入理解Java虚拟机(第3版)》](https://book.douban.com/subject/34907497/)
2. 邓老师的 [《深入理解Android Java 虚拟机 ART》](https://book.douban.com/subject/33390277/)
## [](#Kotlin "Kotlin")Kotlin
Google 几年前就开始走 “Kotlin First” 的路线,目前很多官方的文档和 Demo 都是使用 Kotlin 语言作为默认,Kotlin 的重要性不言而喻。
Google 官方也出了个[“Refactoring to Kotlin”](https://clmirror.storage.googleapis.com/codelabs/java-to-kotlin-zh/index.html#0)的教程,其介绍如下:
> 此 Codelab 的适用对象为任何使用 Java 并考虑将其项目迁移到 Kotlin 的开发者。我们将从数个 Java 类入手,引导您使用 IDE 将它们转换为 Kotlin。接着,我们会审视转换后的代码,研究如何加以改善,使其更符合使用习惯,同时避免常见错误
## [](#Flutter "Flutter")Flutter
[Flutter](https://github.com/flutter/flutter) 作为 Google 的亲儿子,其官方的扶持力度大家有目共睹。
Flutter 的发展大家可以看一下 Gityuan 的这一篇[Flutter 跨平台演进及架构开篇](http://gityuan.com/flutter/),目前字节跳动的多个 App 已经接入 Flutter 进行混合开发。
# [](#Android-Studio "Android Studio")Android Studio
## [](#Android-Studio-IDE-Overview "Android Studio IDE Overview")Android Studio IDE Overview
Android Studio 作为 Android 默认的开发者工具,目前的版本更新已经解决了诸多之前的性能问题,虽然目前对硬件资源的要求仍然比较高,但是一旦你接受了这个设定,真香预警!
AS 主要需要熟悉下面几点
1. AS 快捷键
2. AS 插件
3. AS Profile (内存、CPU、IO、NetWork)
## [](#Project-Structure-—-Java-Kotlin-Flutter-XML-gradle-files "Project Structure — Java/Kotlin/Flutter, XML, .gradle files")Project Structure — Java/Kotlin/Flutter, XML, .gradle files
熟悉各种项目的目录结构,资源文件、Gradle 文件
# [](#Android-基础知识 "Android 基础知识")Android 基础知识
## [](#四大组件 "四大组件")四大组件
这部分不必做过多的解释,下面列出的就是大家熟悉的 Android 四大组件,Android 开发的基础
1. Activity — Activity Lifecycle, Tasks & Back Stack
2. Service
3. Broadcast Receiver
4. Content Provider
## [](#Intents "Intents")Intents
1. Types of Intent - Implicit, Explicit
2. Intent Filter
## [](#Static-User-Interface "Static User Interface")Static User Interface
1. View — Button, ImageView, TextView, EditText, and etc :这是开发中会遇到的常用的组件,许多复杂的布局都是用简单基础的 View 组合而成
2. ViewGroup - LinearLayout, RelativeLayout, FrameLayout:三大传统布局,适用于不同的场合
3. ConstraintLayout : Google 新推的布局,目前已经取代 RelativeLayout 成为默认的 App 布局,具体使用可以参考[官方文档](https://developer.android.google.cn/reference/android/support/constraint/ConstraintLayout?hl=zh-cn)
## [](#Dynamic-User-Interface "Dynamic User Interface")Dynamic User Interface
1. RecyclerView - 列表类的布局首选控件,性能相对 ListView 要好一些,功能也比 ListView 要多一些
2. ViewPager
3. Spinner
## [](#CustomView "CustomView")CustomView
Android 默认的布局很多时候都没法满足设计的需求,这时候就需要自定义 View,你需要掌握下面几个知识点的使用
1. Canvas
2. Bitmap
3. Paint
## [](#UI-Resources "UI Resources")UI Resources
相比 HardCode,使用资源文件会让代码的可修改性更高
1. Drawables
2. String
3. Styles
## [](#Fragments "Fragments")Fragments
许多人提倡 App 使用 单 Activity + 多个 Fragment 的组合,可见 Fragment 在开发中的重要性,但是 Fragment 的管理又是一门技术,Fragment 的坑,只能在实际开发中慢慢填平了,不过下面的 Fragment 基础还是要牢固
1. Fragment Lifecycle
2. Fragment Manager
## [](#Support-User-Interface "Support User Interface")Support User Interface
这里列的同样是一些功能组件,需要知道这是什么东西,基本的用法
1. ProgressBar - 进度条
2. Dialogs - 弹框
3. Toast & Snackbar - 提示
## [](#Storage "Storage")Storage
App 开发不免要和文件打交道,文件的读写、存储都是必不可少的,下面列出了几种 Android 中存储相关的知识点
1. Shared Preferences - 适合存储字段
2. File Systems - 文件存储
3. Database — RoomDB - 数据库存储,RoomDB 是 Google 新推出的数据库解决方案(在 AndroidX 中),具体使用可以参考[官方文档](https://developer.android.google.cn/reference/androidx/room/RoomDatabase.html)
## [](#Build "Build")Build
Android App 默认使用 Gradle 进行编译,关于 Gradle 的使用必须要熟悉,以及如何区分开发版本和 Release 版本,以及国内特有的多渠道打包技术、以及 ASM 等
1. Gradle
2. Debug / Release Configuration
3. 多渠道打包
4. ASM
## [](#Threading "Threading")Threading
理解 Thread 非常重要,Android App 只有一个主线程,其余的我们称之为工作线程,我们的很多工作需要再工作线程和主线程直接切换,如何高效创建和释放线程、线程池、线程间通信、Message-Looper-Handler 模型这些知识点都要了熟于心,另外进阶的话 Binder 通信也是需要掌握的知识
1. Threads
2. Handler / Looper / Message / MessageQueue
3. AIDL / Binder
# [](#Debugging "Debugging")Debugging
这里列举了一些 Debug 的基本手段,实际开发中遇到具体问题的时候一般都会用到,不过有的可能入手难度要高一些,需要花时间去掌握。Debug 工具除了下面这几个还有很多
1. Memory profiling - MAT,AS Memory Profile
2. Logging - Log 包含非常丰富的信息,可以帮助我们还原现场
3. Systrace - Systrace 工具可以查看一段时间内手机系统各个进程的运行状态,具体使用可以参考我博客的 [Systrace 系列教程](https://www.androidperformance.com/2019/05/28/Android-Systrace-About/)
4. Exceptions - 各种异常,保证程序的健壮性
5. Error Handling - Error 是必须要解决的问题,一般会导致 App 直接闪退,需要非常重视
# [](#Memory-Leak "Memory Leak")Memory Leak
内存泄漏是一个很大的专题,包括 Java 内容泄漏和 Native 内存泄漏,涉及的知识点非常多,可以单独拿出来做一个大的知识栈。一般来说, Java 内存泄漏会比较好检测和修复,但是 Native 内存泄漏就会比较难。
1. Detecting and Fixing Memory Leaks - 内存泄漏检测和修复,是一个比较大的工程,可以参考 LeakCanary、Matrix 等开源工具
2. Context - 使用不当会造成该释放的对象没有释放造成内存泄漏
3. Native Memory Leaks
# [](#3rd-Party-Library "3rd Party Library")3rd Party Library
经典的第三方类库,可以大幅节约我们的开发时间
1. Image Loading - Glide, Picasso
2. Dependency Injection - Dagger
3. Networking - Fast Android Networking Library, Retrofit
4. MultiThreading - RxJava, Coroutines
# [](#Data-Format "Data Format")Data Format
常见的一些数据保存流格式
1. JSON — GSON
2. Flat Buffer
3. Protocol Buffer
# [](#Android-Jetpack "Android Jetpack")Android Jetpack
[Jetpack](https://developer.android.google.cn/jetpack?hl=zh-cn) 是 Google 推出的一套库、工具和指南,可帮助开发者更轻松地编写优质应用。这些组件可帮助您遵循最佳做法、让您摆脱编写样板代码的工作并简化复杂任务,以便您将精力集中放在所需的代码上。Jetpack 包含与平台 API 解除捆绑的 androidx.\* 软件包库。这意味着,它可以提供向后兼容性,且比 Android 平台的更新频率更高,以此确保您始终可以获取最新且最好的 Jetpack 组件版本。
这部分推荐一个读者的书《[关注 Android Jetpack开发:原理解析与应用实战](https://e.jd.com/30816230.html)》,二哥为此写过推荐语,封面可见。
1. Foundation Components — AppCompat, Android KTX, Multidex
2. Architecture Components — LiveData, ViewModel, DataBinding, Paging, Work Manager, Navigation
3. Behaviour Components - Download Manager, Media Playback, Notification, Permissions, Preference, Sharing, Slice
4. UI Component - Animation & Transition, Android Auto, Emoji, Palette, Android TV, Android Wear
# [](#Architecture "Architecture")Architecture
传统的开发架构,没有绝对的哪个好哪个不好,只有哪个适合哪个不适合,下面三种你都应该知道并有一定的了解
1. MVVM - MVVM 是 Model-View-ViewModel的简写。它本质上就是 MVC 的改进版。MVVM 就是将其中的 View 的状态和行为抽象化,让我们将视图 UI 和业务逻辑分开
2. MVI ?
3. MVP - MVP 从更早的 MVC 框架演变过来,与 MVC 有一定的相似性:Controller/Presenter 负责逻辑的处理,Model 提供数据,View 负责显示
# [](#Unit-Testing "Unit Testing")Unit Testing
1. Local Unit Testing
2. Instrumentation Testing
# [](#Firebase "Firebase")Firebase
Firebase 国内很多开发者用不到,这里简单看一下即可(说不定哪天国内就可以用了呢)
1. FCM
2. Crashlytics
3. Analytics
4. Remote Config
5. App Indexing
6. Dynamic Link
# [](#Security "Security")Security
安全方面接触毕竟多的应该是加密、解密、混淆等,毕竟用户数据安全大于一切,不重视这个欧盟会教你做人
1. Encrypt / Decrypt
2. Proguard
3. R8
# [](#App-Release "App Release")App Release
应用发布相关的知识,国内还得加上多渠道打包、插件化
1. .keystore file
2. App Bundle
3. Playstore
4. 多渠道打包
5. 插件化
# [](#Keep-Learning-and-Improving "Keep Learning and Improving")Keep Learning and Improving
作为一个有进取心的 Android 开发者,拥有自己的技术栈和规划非常重要,技术栈确保你有足够的市场竞争力,从而形成护城河;技术规划则可以给你一个明确的学习目标。卸载抖音、微博、斗鱼、游戏吧,做好一年的规划,**Keep Learning and Improving** ,共勉
如果你苦于没有好的时间管理方法,可以参考这个视频[我是怎么做周计划 | 生产力提升 | 我的方法](https://www.bilibili.com/video/av79348217),这个是我熟悉的一个大佬的工作学习方法实践,推荐给大家
> 凡是预则立,不预则废,年度计划太长,日计划又太短。实践下来发现以周为单位做时间管理(时间管理)最靠谱,既考虑了短期又考虑了长期,可以使自己长期坚持做某事,也有一定的时间长度用来甄有价值的事情。
---------
最近整理了一份牛逼的学习资料,包括但不限于Java基础部分(JVM、Java集合框架、多线程),还囊括了 **数据库、计算机网络、算法与数据结构、设计模式、框架类Spring、Netty、微服务(Dubbo,消息队列) 网关** 等等等等……详情戳:[可以说是2022年全网最全的学习和找工作的PDF资源了](https://tobebetterjavaer.com/pdf/programmer-111.html)
关注二哥的原创公众号 **沉默王二**,回复**111** 即可免费领取。
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/xingbiaogongzhonghao.png)
......@@ -202,4 +202,13 @@ Flume + Kafka,在实时流式日志的处理非常常见,后面再通过 Spa
再总结一份大数据学习指南的思维导图吧。
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/xuexiluxian/bigdata-99b69697-4804-4113-907b-fbe14ac36964.png)
\ No newline at end of file
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/xuexiluxian/bigdata-99b69697-4804-4113-907b-fbe14ac36964.png)
---------
最近整理了一份牛逼的学习资料,包括但不限于Java基础部分(JVM、Java集合框架、多线程),还囊括了 **数据库、计算机网络、算法与数据结构、设计模式、框架类Spring、Netty、微服务(Dubbo,消息队列) 网关** 等等等等……详情戳:[可以说是2022年全网最全的学习和找工作的PDF资源了](https://tobebetterjavaer.com/pdf/programmer-111.html)
关注二哥的原创公众号 **沉默王二**,回复**111** 即可免费领取。
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/xingbiaogongzhonghao.png)
\ No newline at end of file
......@@ -248,6 +248,12 @@ C语言有两个关键部分:
*没有什么使我停留——除了目的,纵然岸旁有玫瑰、有绿荫、有宁静的港湾,我是不系之舟*
---------
最近整理了一份牛逼的学习资料,包括但不限于Java基础部分(JVM、Java集合框架、多线程),还囊括了 **数据库、计算机网络、算法与数据结构、设计模式、框架类Spring、Netty、微服务(Dubbo,消息队列) 网关** 等等等等……详情戳:[可以说是2022年全网最全的学习和找工作的PDF资源了](https://tobebetterjavaer.com/pdf/programmer-111.html)
关注二哥的原创公众号 **沉默王二**,回复**111** 即可免费领取。
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/xingbiaogongzhonghao.png)
......
......@@ -219,4 +219,11 @@ Go 这边没有 Java 那么卷,岗位的薪资却也比较客观。如果能
从个人职场发展来看,多一条腿走路,也更稳。。
---------
最近整理了一份牛逼的学习资料,包括但不限于Java基础部分(JVM、Java集合框架、多线程),还囊括了 **数据库、计算机网络、算法与数据结构、设计模式、框架类Spring、Netty、微服务(Dubbo,消息队列) 网关** 等等等等……详情戳:[可以说是2022年全网最全的学习和找工作的PDF资源了](https://tobebetterjavaer.com/pdf/programmer-111.html)
关注二哥的原创公众号 **沉默王二**,回复**111** 即可免费领取。
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/xingbiaogongzhonghao.png)
......@@ -209,4 +209,11 @@ JVM 相关的知识已经成为面试必考的科目了,但老实讲,JVM 相
**Java 虚拟机虽然难学,但如果你能坚持学下去,内功自然而然就提升了一大截**
---------
最近整理了一份牛逼的学习资料,包括但不限于Java基础部分(JVM、Java集合框架、多线程),还囊括了 **数据库、计算机网络、算法与数据结构、设计模式、框架类Spring、Netty、微服务(Dubbo,消息队列) 网关** 等等等等……详情戳:[可以说是2022年全网最全的学习和找工作的PDF资源了](https://tobebetterjavaer.com/pdf/programmer-111.html)
关注二哥的原创公众号 **沉默王二**,回复**111** 即可免费领取。
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/xingbiaogongzhonghao.png)
......@@ -213,4 +213,11 @@ Java 提供的并发组件,大致可以分为两类:
**Java 并发编程虽然难学,会涉及到操作系统、CPU、内存等偏基础方面的内容,但如果你能坚持学下去,内功自然而然就提升了一大截**
---------
最近整理了一份牛逼的学习资料,包括但不限于Java基础部分(JVM、Java集合框架、多线程),还囊括了 **数据库、计算机网络、算法与数据结构、设计模式、框架类Spring、Netty、微服务(Dubbo,消息队列) 网关** 等等等等……详情戳:[可以说是2022年全网最全的学习和找工作的PDF资源了](https://tobebetterjavaer.com/pdf/programmer-111.html)
关注二哥的原创公众号 **沉默王二**,回复**111** 即可免费领取。
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/xingbiaogongzhonghao.png)
......@@ -307,4 +307,11 @@ B 站上浙江大学的一个数据结构课非常不错,很系统很经典。
**这么硬核,别忘记点赞鼓励下哟,如果你身边也有学习 Java 的小伙伴,可以把这篇文章分享给他**~
---------
最近整理了一份牛逼的学习资料,包括但不限于Java基础部分(JVM、Java集合框架、多线程),还囊括了 **数据库、计算机网络、算法与数据结构、设计模式、框架类Spring、Netty、微服务(Dubbo,消息队列) 网关** 等等等等……详情戳:[可以说是2022年全网最全的学习和找工作的PDF资源了](https://tobebetterjavaer.com/pdf/programmer-111.html)
关注二哥的原创公众号 **沉默王二**,回复**111** 即可免费领取。
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/xingbiaogongzhonghao.png)
......@@ -183,4 +183,12 @@ linux-0.11 的学习推荐《Linux 内核完全注释》,该书对 linux-0.11
记住一点,**动手很重要,动手做 lab 很重要**
---------
最近整理了一份牛逼的学习资料,包括但不限于Java基础部分(JVM、Java集合框架、多线程),还囊括了 **数据库、计算机网络、算法与数据结构、设计模式、框架类Spring、Netty、微服务(Dubbo,消息队列) 网关** 等等等等……详情戳:[可以说是2022年全网最全的学习和找工作的PDF资源了](https://tobebetterjavaer.com/pdf/programmer-111.html)
关注二哥的原创公众号 **沉默王二**,回复**111** 即可免费领取。
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/xingbiaogongzhonghao.png)
......@@ -88,4 +88,12 @@ B 站也就是哔哩哔哩,是国内最大的二次元视频网站之一。作
- Python编程:从入门到实践
- PYTHON自然语言处理【中文版】
---------
最近整理了一份牛逼的学习资料,包括但不限于Java基础部分(JVM、Java集合框架、多线程),还囊括了 **数据库、计算机网络、算法与数据结构、设计模式、框架类Spring、Netty、微服务(Dubbo,消息队列) 网关** 等等等等……详情戳:[可以说是2022年全网最全的学习和找工作的PDF资源了](https://tobebetterjavaer.com/pdf/programmer-111.html)
关注二哥的原创公众号 **沉默王二**,回复**111** 即可免费领取。
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/xingbiaogongzhonghao.png)
......@@ -151,4 +151,11 @@ head:
- JavaScript异步编程
- JavaScript语言精粹
---------
最近整理了一份牛逼的学习资料,包括但不限于Java基础部分(JVM、Java集合框架、多线程),还囊括了 **数据库、计算机网络、算法与数据结构、设计模式、框架类Spring、Netty、微服务(Dubbo,消息队列) 网关** 等等等等……详情戳:[可以说是2022年全网最全的学习和找工作的PDF资源了](https://tobebetterjavaer.com/pdf/programmer-111.html)
关注二哥的原创公众号 **沉默王二**,回复**111** 即可免费领取。
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/xingbiaogongzhonghao.png)
---
title: Java、C语言、C++、Python、Go 语言、操作系统、前端、算法和数据结构、蓝桥杯、大数据学习路线🔥
title: Java、C语言、C++、Python、Go 语言、操作系统、前端、算法和数据结构、蓝桥杯、大数据、Android学习路线🔥
shortTitle: 编程学习路线
category:
- 学习路线
tag:
- 学习路线
description: Java、C语言、C++、Python、Go 语言、操作系统、前端、算法和数据结构、蓝桥杯、大数据等硬核学习路线,欢迎收藏品鉴!
description: Java、C语言、C++、Python、Go 语言、操作系统、前端、算法和数据结构、蓝桥杯、大数据、Android等硬核学习路线,欢迎收藏品鉴!
head:
- - meta
- name: keywords
content: CS,学习路线,编程,计算机专业,程序员,Java,C语言,Python,C++,前端,Go 语言,数据结构,算法,蓝桥杯,大数据,操作系统
content: CS,学习路线,编程,计算机专业,程序员,Java,C语言,Python,C++,前端,Go 语言,数据结构,算法,蓝桥杯,大数据,操作系统,安卓,android
---
......@@ -25,4 +25,5 @@ head:
* [算法和数据结构学习路线(建议收藏🔥)](algorithm.md)
* [蓝桥杯学习路线(建议收藏🔥)](lanqiaobei.md)
* [大数据学习路线(建议收藏🔥)](bigdata.md)
* [Android 安卓学习路线(建议收藏🔥)](android.md)
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册