简历说明

This commit is contained in:
Estom
2021-09-14 16:58:57 +08:00
parent 05a6a86266
commit 711e08af26
6 changed files with 103 additions and 129 deletions

View File

@@ -1,69 +1,71 @@
# 简历说明
* [ ] 需要在面试开始前,花一天时间对简历说明进行整理
* [ ] 项目和实习经历再熟悉。必须重新阅读一边原先的文档。
## 1 教育经历
你好。我叫殷康龙,现就读于北京航空航天大学计算机学院,主要研究联邦学习在恶意软件检测领域的应用。本科就读于西北工业大学软件与微电子学院,主修软件工程。
在学校主要学习了数据结构与算法、C++程序设计、JavaEE企业级开发、面向对象程序设计、编译原理等课程综合测评成绩在250人中排名第8。
在学校主要学习了C++程序设计、数据结构与算法、面向对象程序设计综合测评成绩在250人中排名第8。
## 2 校园经历
在学校里积极参加社团和活动。曾任软微学院科创部干事,参与组织一行代码大赛和程序设计比赛。曾任西工大新闻中心副部长,负责开发新文中心的功能网站,培训技术人员,维护西工大官方微信
在学校里积极参加社团和活动。曾任软微学院科创部干事,组织一行代码大赛和程序设计比赛。曾任西工大新闻中心副部长,负责开发新文中心的功能网站,培训技术人员。
## 3 主要成果
* 两次学校一等奖学金,一次华为奖学金,一次国家励志奖学金,一次电子工业出版社助学金,“优秀共青团员”称号
* 2016-2017年连续两届FIRA机器人世界杯SimuRoSot项目国际特等奖冠军Air Challenge项目国际一等奖亚军
* 2017中国机器人大赛空中机器人-无人机大战水果项目一等奖
* 2019年获得国家级大学生创新项目《基于超宽带定位技术的无人机目标追踪系统》和《基于网络爬虫和数据分析的高校信息整合系统》优秀结题
* 获得《面向学生的校园信息交流系统V1.0》《基于scrapy框架的校园信息爬虫系统》《基于网络爬虫和数据分析的高校信息整合系统》计算机软件著作权
* 校一等奖学金,华为奖学金,国家励志奖学金,电子工业出版社助学金,“优秀共青团员”称号,优秀学生称号
* 2016-2017年连续两届FIRA机器人世界杯SimuRoSot项目国际特等奖冠军Air Challenge项目国际一等奖亚军
* 2017中国机器人大赛无人机大战水果项目一等奖
* 2019年获得两个国家级大创项目优秀结题、三个计算机软件著作权
## 4 项目经历
> 项目概述、主要工作、最终成果
### 竞技策略开发——仿真5VS5SimuRosot
* 项目概述15个人的开发团队长期开发项目C++、JAVA主要用于参加5V5 simurosot的国内比赛和国外比赛。工程主要采用分层架构
* 项目概述15个人的开发团队长期开发项目C++。基于simurosot机器人仿真平台国内比赛和国外有相关比赛。工程主要采用分层架构
* 第一层是运动模型,包括球的运动模型和轮式机器人的运动模型。控制机器人的轮速,完成前进、后退、旋转等基本动作。
* 第二层是跑位动作,给定目标点,机器人通过基本动作,完成避障行为,以最快的速度到达目标点。
* 第三层是击球动作,在跑位的基础上,考虑球的运动状态,完成击球过程。
* 第四层是策略控制,用于协调多个机器人,完成统一目标的动作。进行角色选择,前场包括sender、defender、helper等角色。然后目标计算分别计算每个机器人的目标点选择机器人的运动方法。最后是策略切换控制为了增强策略的稳定性还包括策略的进入和退出控制。
* 第三层是击球动作,在跑位的基础上,根据球的运动状态、击球者的运动状态、击球的目标方向等,完成击球过程。直接撞击、旋转甩球,
* 第四层是策略控制,用于协调多个机器人,完成统一目标的动作。进行角色选择,前场包括sender、defender、helper等角色。然后目标计算分别计算每个机器人的目标点选择机器人的运动方法。最后是策略切换控制为了增强策略的稳定性还包括策略的进入和退出控制。
* 第五层是策略选择,包括态势评估,通过过去和当前的机器人和球的状态完成一系列态势分析,选择进入前场、后场、边路、底线等不同的策略中。
* 另外还有一些辅助模块,包括日志模块,保存策略数据和运动数据,用于比赛复现和问题排查。态势预测模块,根据过去和当前的状态,预测未来一段时间内的态势,根据运动规律,计算未来球的位置
* 用到了一些基本的设置模式,像单例模式(小球的控制句柄、态势评估类的对象和态势预测的对象)、策略模式(给定统一接口)
* 主要工作1负责开发前场的相关策略分成很多子策略选择模块优势前场、保守前场、边路前场、角色选择和策略切换控制角色的稳定性进入退出分开控制。、目标计算模块保持相对的阵型减少阵型的抖动、移动跑位模块、射门模块。使用PID控制方法对机器人控制增强了前场的稳定性。
* 主要工作2使用JAVA为团队开发了数据测试平台实现了对数据仿真、策略测试、可视化。搭建团队开发的SVN版本控制系统方便整个团队项目开发和维护。开发测试平台主要使用java swing开发跨平台图形界面提供了一系列GUI组件。主要包括数据导入模块、动态演示模块、数据显示模块。使用java io random_accessfile读取并解析file文件。使用java thread实现数据加载与数据展示的并行过程。通过事件监听与响应机制实现对数据仿真动态演示过程的控制包括仿真速度调节和仿真进度调节。使用javadoc生成标准的java文档供后续开发使用方便开发维护。
* 辅助模块,包括日志模块。态势预测模块
* 设计模式:单例模式(小球的控制句柄、态势评估类的对象和态势预测的对象)、策略模式(不同策略、统一接口)
* 存在问题:策略的稳定性(最难的)。设置不同的严格的进入条件、宽松的退出条件控制反转每个策略类提供自己的进入退出条件和执行内容然后注册成为一个策略树由运行控制中心负责执行策略树上的分支。IF-ELSE爆炸将条件判断与条件执行分开、switchcase
* 主要工作
* 负责开发前场的相关策略构建子策略优势前场、保守前场、边路前场、角色选择和策略切换控制角色的稳定性进入退出分开控制。、目标计算模块保持相对的阵型减少阵型的抖动、移动跑位模块、射门模块。使用PID控制方法对机器人控制增强了前场的稳定性。通过面向对象的方法对代码进行重构。
* 主要工作使用JAVA为团队开发了数据测试平台实现了对数据仿真、策略测试、可视化。开发测试平台主要使用java swing开发跨平台图形界面提供了一系列GUI组件。主要包括数据导入模块、动态演示模块、数据显示模块。使用java io random_accessfile读取并解析file文件。使用java thread实现数据加载与数据展示的并行过程。通过事件监听与响应机制实现对数据仿真动态演示过程的控制包括仿真速度调节和仿真进度调节。使用javadoc生成标准的java文档供后续开发使用方便开发维护。
* 最终成果暑假期间带领团队前往日照参加了2017中国机器人大赛前往台湾 参加了FIRA机器人世界杯取得多项冠军。
### 基于网络爬虫和数据分析的高校信息整合系统
* 项目概述5个人Python、MySQL。带领团队申请了《基于超宽带定位技术的无人机目标追踪系统》《基于网络爬虫和数据分析的高校信息整合系统》两个国家级大创项目,后者主要是利用爬虫综合网络信息搭建web服务器对数据进行二次处理使用机器学习算法提供面向用户提供文章推荐功能、标签云索引功能和分类浏览功能面向信息发布者提供了热点倾向功能、数据分析功能。
* 项目概述5个人Python、MySQL。利用爬虫综合网络信息搭建web服务器对数据进行二次处理使用机器学习算法提供面向用户提供文章推荐功能、标签云索引功能和分类浏览功能面向信息发布者提供了热点倾向功能、数据分析功能。
* 主要工作项目架构、服务器搭建包括爬虫模块数据解析模块xpath、URL获取与去重模块、服务器模块MySQL数据库设计、Json数据封装、Android客户端数据请求模块HTTP请求、数据展示、数据处理模块。通过Scrapy完成网络信息爬虫构建了Mysql数据库使用Django后端框架和Bootstrap前端框架开发了项目网站使用大数据的算法对信息分析处理并将整个项目部署到腾讯云提供的CentOS服务器上。使用Github进行代码管理。
![](image/2021-04-06-21-18-56.png)
* 关键技术scrapy框架介绍。使用request模块进行爬虫通过调度去缓存下一条URL控制网站访问的频率使用xpath解析数据内容并将数据存储到mysql数据库中。
> * 1Scrapy引擎打开向爬虫模块请求其需要爬取的起始URLs
> * 2Scrapy引擎从爬虫模块那里获取到需要爬取的起始URLs将它们放入调度器模块作为待爬取的URL Requests
> * 3Scrapy 引擎向调度器模块发出请求获取下一个待爬取页面的URL
> * 4调度器模块返回下一个待爬取页面的URL给Scrapy 引擎Scrapy 引擎则将该 URL 经下载中间件模块(请求方向)转发给下载器;
> * 5当下载器模块完成页面下载后会生成一个该页面所对应的 HTTP Response并将其经下载中间件响应方向发送给Scrapy 引擎;
> * 6Scrapy 引擎从下载器模块处接收到HTTP Response 后,会将其经爬虫中间件模块(输入方向)发送给爬虫模块处理;
> * 7爬虫模块处理接收到的 HTTP Response并返回从中爬取到的Items及需要跟进的新的 URLs 给 Scrapy 引擎;
> * 8Scrapy 引擎将爬虫模块返回的Items 转发给数据流水线模块同时将爬虫模块返回的URLs 转发给调度器;
> * 9以上 2~8 的过程会一直重复执行,直到调度器模块中没有 URL Requests 时Scrapy 引擎关闭,爬虫停止。
![](image/2021-04-06-21-06-32.png)
* 关键技术Django框架。使用Apache服务器处理http请求。Django框架MVCmodel-view-control的代码架构模式。从数据库中获取数据封装成json格式最后将响应的数据传递给android客户端。
![](image/2021-04-06-21-17-24.png)
![](image/2021-04-06-21-58-13.png)
* 关键技术:数据处理算法。
* 标签计算算法jieba分词统计词频TF-IDF算法进行词频统计去除无关词汇字词的重要性随着它在文件中出现的次数成正比增加但同时会随着它在语料库中出现的频率成反比下降
* 分类算法:学科竞赛、科研信息、行政信息、招生信息、招聘就业、校园活动、升学留学、生活娱乐这八类,使用朴素贝叶斯分类器进行分类。(基于贝叶斯公式,可以试图讲解贝叶斯公式)
* 混合推荐算法:基于协同过滤算法提取项目的基本特征(人,文章的特征,通过人阅读的其他文章给出特征,通过相似的人看的其他电影打上相似的标签)。系统采用的KNN算法目的在于匹配项目中K个相似度最高的项目,作为预测推荐输出到用具接口
* 关键技术:* 标签计算算法jieba分词统计词频TF-IDF算法进行词频统计去除无关词汇字词的重要性随着它在文件中出现的次数成正比增加但同时会随着它在语料库中出现的频率成反比下降。
* 词频 (term frequency, TF) 指的是某一个给定的词语在该文件中出现的次数。逆向文件频率 (inverse document frequency, IDF)
![](image/2021-09-13-12-26-27.png)
* IDF的主要思想是如果包含词条t的文档越少, IDF越大则说明词条具有很好的类别区分能力。某一特定词语的IDF可以由总文件数目除以包含该词语之文件的数目再将得到的商取对数得到
![](image/2021-09-13-12-26-42.png)
* 标签云算法某一特定文件内的高词语频率以及该词语在整个文件集合中的低文件频率可以产生出高权重的TF-IDF。因此TF-IDF倾向于过滤掉常见的词语保留重要的词语
![](image/2021-09-13-12-27-24.png)
* 关键技术:分类算法:学科竞赛、科研信息、行政信息、招生信息、招聘就业、校园活动、升学留学、生活娱乐这八类,使用朴素贝叶斯分类器进行分类。贝叶斯分类,一个事件出现在各个类别中的概率不同。可以通过贝叶斯公式得到,出现概率最大的类别作为其类别。
```
提取所有文档中的词条并进行去重
获取文档的所有类别
计算每个类别中的文档数目
对每篇训练文档:
对每个类别:
如果词条出现在文档中-->增加该词条的计数值for循环或者矩阵相加
增加所有词条的计数值(此类别下词条总数)
对每个类别:
对每个词条:
将该词条的数目除以总词条数目得到的条件概率P(词条|类别)
返回该文档属于每个类别的条件概率P(类别|文档的所有词条)
```
* 关键技术:推荐算法:系统采用的KNN算法目的在于匹配项目中K个相似度最高的项目,用户浏览的历史文章,生成用户关联的词向量。
* 最终成果:两个国家级大创项目均获得优秀结题。
@@ -73,7 +75,66 @@
* 主要工作主要是在Android平台DJ无人机的地面站android手机开发使用Java多线程和Socket编程实现无人机之间的通信连接。主要通过UDP网络通信、心跳测试保持连接、回调处理等方式实现线程通信。在加密通信过程中使用C++开发加密仿真环境。使用nodejs+electron对通信过程进行可视化。使用网页技术HTML、CSS、JavaScript做前端使用C++做为本地的后端。通过封装C++通信的代码提供C++通信接口供nodejs调用。代码的封装接口提供
* 主要成果:完成实验室项目验收。
### TensorFlowIO优化
## 实习经历
### 电子钱包JavaEE企业及开发项目
* 项目概述:在中科金财上市公司参与电子钱包项目的实习。
* 主要负责使用Java从合作方获取并解析数据使用MyBatis存储到MySQL数据库中并使用Redis做一级数据缓存。使用Spring框架提供信息访问的服务。
* 关键技术Spring框架应用实践
* 本项目后端的主要开发框架是基于java的Spring框架。Spring框架主要依赖与两个重要的特性——控制反转和依赖注入。控制反转IOC即控制权的转移将我们创建对象的方式反转了,以前对象的创建是由我们开发人员自己维护,包括依赖关系也是自己注入。使用了spring之后对象的创建以及依赖关系可以由spring完成创建以及注入反转控制就是反转了对象的创建方式从我们自己创建反转给了程序创建。依赖注入DIspring这个容器中替你管理着一系列的类前提是你需要将这些类交给spring容器进行管理然后在你需要的时候不是自己去定义而是直接向spring容器索取当spring容器知道你的需求之后就会去它所管理的组件中进行查找然后直接给你所需要的组件。
* 在实践过程中使用静态工厂方法创建了一系列的java Bean对象通过配置XML文件将对象注入到具体执行的类当中。Spring框架本身还保证了事务的原子性、一致性、隔离性和持久性。为了使Spring boot应用能够快速加载配置使用YAML文件快速配置Spring项目的依赖。YAML支持对象、数组、字面量三种数据结构。同时Spring boot通过大量的注解实现配置的绑定和容器的注入。
* 在开发前端的时候开发框架主要使用了基于nodejs的vuejs框架用于获取并渲染数据到前端页面。使用bootstrap作为模板构建基于H5的应用页面能够动态自适应页面的大小并将页面扁平化。
* 关键技术:数据存储技术
* 在开发过程中主要使用MySQL关系型数据库存储数据使用Redis非关系型数据库做数据缓存使用Spring-MyBatis框架封装对数据库的增删查改操作。数据操作主要包括两部分第一部分是从远程接口请求数据存储到关系型数据库中。第二部分是从关系型数据库中访问数据返回前端渲染到页面上。对于第二部分需要Redis做一级缓存为了加快数据访问。为了能够进行事务管理MySQL的数据库引擎选择InnoDB。所有的表都保存在同一个数据文件中。
* 使用Spring访问数据库的时候选择了比较流行的MyBatis框架。MyBatis是一个半自动化的 ORM 框架,支持定制化 SQL、存储过程以及高级映射。支持将数据库查出的数据映射到POJO实体类上而实体到数据库的映射则需要我们自己编写SQL语句实现
* 为了提升用户的体验加快前端的访问速度解决MySQL数据库存储和访问的瓶颈。使用Redis数据库提供了以及数据缓存。使得系统能够快速相应用户的数据存储和访问操作。redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。
### 字节跳动财经业务部
* 项目概述:实现担保交易的系统。
* 主要负责财经退款业务。完成支付营销预计算、分账后退款等业务需求。基于Kite框架设计实现多个微服务的接口和逻辑进行项目管理、版本控制、联调测试、报警处理等工作。
* 当时负责支付营销预计算和分账后退款两个业务涉及担保退款guarantee_refund(单纯的路由和参数校验)、退款请求ecrefund(查询校验请求参数构造ectrade的不同类型的退款请求参数请求计费系统得到支付营销的值)、财经tp_ectrade(各种支付、退款的主要业务逻辑)微服务。担保退款业务负责接收来自其他应用的退款请求,查询数据库中的订单,校验请求的准确性,同时通过幂等校验对重复的请求进行处理。
* 退款请求业务,接收担保退款微服务的请求,对请求进一步校验,根据订单状态、支付状态、业务方的需求将退款业务划分为不同的退款方式(急速退款、普通退款、分账后退款、超售后退款等),然后执行不同的退款逻辑。
* 微服务的技术选型服务注册与发现机制consul、敏捷开发流程devops、远程调用方式thrift、服务监控平台Grafana、数据分析平台Hive、链路系统跟踪平台、服务网关Gateway等。实现一系列微服务开发、部署、运维任务。
* 关键技术:支付与退款业务逻辑
* 在担保交易系统中,总的业务流可以分为四个部分:支付、分账、退款、提现。
* 支付:当用户付款后(自有支付、第三方支付),不能立即存到商家的账户中,需要暂存到商家的待结算户中,防止出现资金安全问题。
* 分账:当用户点击确认收款后,资金从商家的待结算户,分账到商家账户和其他分账方的账户(达人带货分账、平台营销分账等),其中还涉及到平台的营销问题。
* 退款:当用户发起退款是,会根据不同的情况,走完全不同的退款流程,主要包括普通退款、分账前退款、分账后退款、超售后退款和急速退款。
* 提现:商户从现金户中提款到自己的银行账户。
* 针对退款:每一种退款都实现了统一的接口,需要校验大量的请求参数和订单内容,保证请求和订单的一致性,需要调用电商接口,计算每一个分账方的分账金额,根据分账方的分分钟金额校验账单系统中的分账单,针对每一个分账单,生成分账的退款单,然后请求支付核心,将商家待结算户中的金额退给用户。如果已经部分分账,需要将所有分账的金额退到商家现金户,推进分账进程,然后从商家的现金户,将金额退还给支付账户,并将平台补贴金额退回。每次退款过程前,需要事先请求计算支付营销金额,如果保证金额正确才可以进行后续的退款,否则返回退款失败。
* 关键技术:订单模型。订单子系统,实现后端订单的数据流图。
* 业务方可能会产生多种类型的订单,例如在购物的时候,会生成支付单、商户单、商品单等。
* 退款的时候根据退款创建的时间不同,可能产生各种类型的退款单,通过区分是否在售后内或者超售后,是否满足优质用户的急速退款条件,订单是否已经分账,产生不同类型的退款单。在财经部分,根据业务方的需求,建立财经部分的订单系统,该系统主要融合了业务方订单和支付方订单。财经部分订单包括商品单、支付单、分账单、补贴单、退款单等。退款中会生成退款单包括多种类型,如退款子单、急速退款单、退分账单、退补贴单、退税单等。由于支付场景负责,各种订单的准确性必须要有保证。
* 关键技术:资金安全
* 财经部分最重要的是对金额和流水的保证。建立了从上到下的对账系统,通过流水信息、数据库信息、日志信息等,进行不间断的对账,保证了交易金额的准确性。杜绝发生严重的金融风险。同时增强开发人员的金融管控意识。防止出现资金安全问题。
* 基于kite的微服务技术
* 将后端拆解为多个独立的微服务,并行建设发展。很好地保证了各个模块的独立性,提高了开发效率,同时又由于微服务的弹性部署方式,使得系统的鲁棒性增强,服务的效率增高。
* 微服务一种软件开发技术,服务是细粒度的,协议是轻量级的。使得应用系统具备快速响应、灵活部署、敏捷交付、持续演进的特性成为可能。微服务是由以单一应用程序构成的小服务,自己拥有自己的行程与轻量化处理,服务依业务功能设计,以全自动的方式部署,同时服务会使用最小的规模的集中管理能力,服务可以用不同的编程语言与数据库等组件实现 。
* 微服务架构与敏捷研发流程一脉相承。微服务是将一个完整的系统分割成若干微小的、具备独立性的功能单元每个功能单元是可以具备一个实际意义的小功能集。各个功能单元之间尽量是解耦或松耦合的可以实现独立开发而不依赖其他功能单元。而敏捷保证微服务架构能够更好地适应需求的变化保持团队的高效沟通敏捷利用小型工作增量、频繁迭代与原型设计等手段可以使我们摆脱大规模单体软件开发的风险。微服务架构更多地从技术的角度提升开发和运维的效率而敏捷方法论贯穿了软件工程的整个流程它重视流程、沟通、协作。可以说敏捷在管理流程上是对微服务架构落地的有益补充和保障。微服务的开发大致遵循DevOps的流程和原则一个软件从零开始到最终交付大概包括以下几个阶段规划、编码、构建、测试、发布、部署和维护。DevOps是一组过程、方法与系统的统称用于促进开发、技术运营和质量保障QA部门之间的沟通、协作与整合。通过自动化流程来使得软件整体过程更加快捷和可靠。用于实现敏捷开发的目标。
* 微服务主要面临的问题主要是故障的排查通过多方考虑建立了微服务的故障排查系统。首先是微服务的监控系统指标接口实时监控流量的运转尽量能够快速的发现存在的潜在问题包括一些设定的报警规则如网络流量异常、内存占用异常、数据库链接异常、响应延迟异常、qps导致某个节点不堪重负等。让各个组件提供报告自己当前状态的接口metrics接口这个接口输出的数据格式应该是一致的。然后部署一个指标采集器组件定时从这些接口获取并保持组件状态同时提供查询服务。最后还需要一个UI从指标采集器查询各项指标绘制监控界面或者根据阈值发出告警。我们最终使用RedisExporter和MySQLExporter这两个组件分别提供了Redis缓存和MySQL数据库的指标接口。微服务则根据各个服务的业务逻辑实现自定义的指标接口。然后采用Prometheus作为指标采集器Grafana配置监控界面和邮件告警。
* 通过链路跟踪系统定位问题出现的位置。使用Zipkin工具实现链路的跟踪过程实现每一个节点的日志收集。为了能够快速的实现日志分析使用ELK日志分析组件。包括一个日志搜索引擎、日志收集存储器和UI组件。为了能够控制微服务的访问权限进行服务治理搭建了一套网关系统。在调用者和被调用者中间加一层网关每次调用时进行权限校验。另外网关也可以作为一个提供服务接口文档的平台。能够进行各个微服务的接口管理通过页面访问和调试微服务。
* 微服务的注册和发现系统。每当有新的微服务或者微服务的某个新节点出现的时候,完成服务信息发布、存活检测、客户端负载均衡等任务。各个应用服务在启动时自动将自己注册到服务发现服务上。并且应用服务启动后会实时(定期)从服务发现服务同步各个应用服务的地址列表到本地。服务发现服务也会定期检查应用服务的健康状态,去掉不健康的实例地址。服务发现系统还会进行服务之间的负载均衡,防止某一个服务流量过大,称为微服务链路上的流量瓶颈。
## 5 个人能力
1. C++后端开发、熟悉Java/Go/Python/Nodejs、了解Mysql数据库/Redis数据库相关的知识
2. 主要关于项目开发中某一方面的知识经验总结
* 网络编程(各种语言的实现方法。异步并发,并发通信方式。)
* web开发自己所开发过的web网站。主要用到的框架和技术。
* 并发编程(各种语言实现并发编程的手段和方式,例如协程、多线程、多进程等)
## 6 个人性格
1. 生活上,乐观开朗,心里素质较强。喜欢积极的应对生活中的困难。待人友善,团结合作,有较强的领导能力、组织能力和团队精神。勤奋好学,思维敏捷。
2. 工作上,具有良好的专业能力,基础知识扎实,自学能力强。参与了多个项目的开发过程,具有丰富的项目开发经验。对软件工程领域的知识有很高的热情,希望通过自己的努力,创作完美的作品。
### 补充项目TensorFlowIO优化
* 项目概述分析TensorFlow源代码对源代码进行修改重新编译。使用mmap方法优化TensorFlow数据加载过程中的IO操作。
* 主要工作阅读源代码分析TensorFlow架构使用多线程以流的方式读取多个文件。mmap封装大文件读取过程。编译并测试TensorFlow最后的优化效果。
@@ -95,89 +156,3 @@
5. 重新编译
* 最终成果:毕业答辩顺利完成。
## 实习经历
### 电子钱包JavaEE企业及开发项目
* 项目概述:在中科金财上市公司参与电子钱包项目的实习。
* 主要负责使用Java从合作方获取并解析数据使用MyBatis存储到MySQL数据库中并使用Redis做一级数据缓存。使用Spring框架提供信息访问的服务。
* 2.4 Spring框架应用实践
* 本项目后端的主要开发框架是基于java的Spring框架。Spring框架主要依赖与两个重要的特性——控制反转和依赖注入。控制反转IOC即控制权的转移将我们创建对象的方式反转了,以前对象的创建是由我们开发人员自己维护,包括依赖关系也是自己注入。使用了spring之后对象的创建以及依赖关系可以由spring完成创建以及注入反转控制就是反转了对象的创建方式从我们自己创建反转给了程序创建。依赖注入DIspring这个容器中替你管理着一系列的类前提是你需要将这些类交给spring容器进行管理然后在你需要的时候不是自己去定义而是直接向spring容器索取当spring容器知道你的需求之后就会去它所管理的组件中进行查找然后直接给你所需要的组件。
* 基于这两种思想实现的Spring容器有许多好处如降低组件之间的耦合度实现软件各层之间的解耦。可以使容器提供众多服务如事务管理消息服务处理等等。当我们使用容器管理事务时开发人员就不需要手工 控制事务也不需要处理复杂的事务传播。容器提供单例模式支持开发人员不需要自己编写实现代码。容器提供了AOP技术利用它很容易实现如权限拦截运行期监控等功能。容器提供众多的辅佐类使这些类可以加快应用的开发。Spring作为一个容器可以管理对象的生命周期、对象与对象之间的依赖关系。可以通过配置文件来定义对象以及设置与其他对象的依赖关系。
* 在实践过程中使用静态工厂方法创建了一系列的java Bean对象通过配置XML文件将对象注入到具体执行的类当中。Spring框架本身还保证了事务的原子性、一致性、隔离性和持久性。Spring boot是Spring体系下为了快速创建应用而提供的一套脚手架服务用于快速创建网络应用。Spring AOP框架基于代理模式同时运行时可配置AOP框架主要针对模块之间的交叉关注点进行模块化。通过maven工具简单的创建Spring boot应用通过starter中整合了该场景下各种可能用到的依赖只需要在Maven中引入starter依赖框架就能自动扫描到要加载的信息并启动相应的默认配置。Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,其本身就是 Spring 框架的一部分,可以与 Spring 无缝集成,性能方面具有先天的优越性,是当今业界最主流的 Web 开发框架之一。Spring boot创建一款开源框架它提供了 spring-boot-starter-web来为 Web 开发予以支持。spring-boot-starter-web为我们提供了嵌入的Servlet容器以及Spring MVC的依赖并为Spring MVC提供了大量自动配置可以适用于大多数 Web 开发场景。
* 为了使Spring boot应用能够快速加载配置使用YAML文件快速配置Spring项目的依赖。使用YAML作为属性配置文件YAML语法使用缩进表示层级关系对大小写敏感。YAML支持对象、数组、字面量三种数据结构。同时Spring boot通过大量的注解实现配置的绑定和容器的注入。
* 在部署过程中主要使用了WebJarsWebJars可以将Web前端资源JSCSS 等打成一个个的Jar包然后将这些Jar包部署到Maven中央仓库中进行统一管理当 Spring Boot项目中需要引入Web前端资源时只需将所需资源的pom依赖导入到项目中即可。
* 在开发前端的时候开发框架主要使用了基于nodejs的vuejs框架用于获取并渲染数据到前端页面。使用bootstrap作为模板构建基于H5的应用页面能够动态自适应页面的大小并将页面扁平化。
* 2.5 数据存储技术
* 在开发过程中主要使用MySQL关系型数据库存储数据使用Redis非关系型数据库做数据缓存使用Spring-MyBatis框架封装对数据库的增删查改操作。数据操作主要包括两部分第一部分是从远程接口请求数据存储到关系型数据库中。第二部分是从关系型数据库中访问数据返回前端渲染到页面上。对于第二部分需要Redis做一级缓存为了加快数据访问。
* 为了能够进行事务管理MySQL的数据库引擎选择InnoDB。所有的表都保存在同一个数据文件中InnoDB表的大小只受限于操作系统文件的大小一般为2GB。需要更多的内存和存储会在内存中简历专用的缓冲池用于高速缓冲数据和索引。索引和数据紧密捆绑索引无压缩所以体积相对比较大。InnoDB引擎支持外键和索引支持事务管理和数据库锁。能够保证数据库事务的原子性、一致性等在三级锁协议下能够保证数据库的串行化访问。MySQL的数据类型主要包括三种数值类型、字符串类型和时间日期类型。在设计过程中要特别注意符合BNF范式保证子段不可分且不存在冗余。
* 主要在数据库中创建了各种各样的表格,包括商品表(商品名称、类型、编号、价格、供应商、数量等子段)、订单表(订单类型、订单编号、父订单编号、支付单号、创建时间、当前状态、用户、商户、税费等子段)、用户表(用户名称、用户编号、平台金额、用户身份等子段)。每一张表格代表多个独立的实体,多个表格之间通过外键进行关联。
* 为了加快数据的访问速度在MySQL的数据表上创建了各种类型的索引。MySQL中常用的索引结构有B+树索引和哈希索引两种。目前建表用的B+树索引就是BTREE索引。在MySQL中MyISAM和InnoDB两种存储引擎都不支持哈希索引。只有HEAP/MEMORY引擎才能显示支持哈希索引。所以主要包括五种类型唯一索引、主键索引、外键索引、普通索引复合索引。通过建立索引能够有效的加快访问速度。B+树是一个平衡的多叉树从根节点到每个叶子节点的高度差值不超过1而且同层级的节点间有指针相互链接。在B+树上的常规检索从根节点到叶子节点的搜索效率基本相当不会出现大幅波动而且基于索引的顺序扫描时也可以利用双向指针快速左右移动效率非常高MySQL 由连接池、SQL 接口、解析器、优化器、缓存、存储引擎等组成,可以分为三层,即 MySQL Server 层、存储引擎层和文件系统层。MySQL Server 层又包括连接层和 SQL 层。
* 使用Spring访问数据库的时候需要手动创建SQL语句或者通过Spring提供的jdbc链接数据库根据orm映射规则自己封装数据库语句。我们在开发的时候选择了比较流行的MyBatis框架。MyBatis是一个半自动化的 ORM 框架,支持定制化 SQL、存储过程以及高级映射。支持将数据库查出的数据映射到POJO实体类上而实体到数据库的映射则需要我们自己编写SQL语句实现相较于Hibernate 这种完全自动化的框架Mybatis 更加灵活我们可以根据自身的需求编写sql语句来实现复杂的数据库操作。支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。它消除 了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和 Java 的 POJOs映射成数据库中的记录。利用动态语句的特性方便快速的拼接访问数据库的SQL语句。
* Mybatis的功能架构分为三层。API接口层提供给外部使用的接口API开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。数据处理层负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。基础支撑层负责最基础的功能支撑包括连接管理、事务管理、配置加载和缓存处理这些都是共用的东西将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
* 我们首先需要在Spring框架中导入Mybatis的配置在Spring Boot的配置文件中进行配置指定mapper.xml的位置、实体类的位置、是否开启驼峰命名法等。然后配置数据库链接的信息。在MySQL数据库中创建了多张表并创建了mapper文件建立sql语句到java环境的映射用来访问MySQL数据库。然后在配置文件中注册数据库访问xml在Spring的java文件中引用该配置完成对数据库的访问。
* 为了提升用户的体验加快前端的访问速度解决MySQL数据库存储和访问的瓶颈。使用Redis数据库提供了以及数据缓存。使得系统能够快速相应用户的数据存储和访问操作。redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。与MySQL关系型数据库不同它没有持久话的文件是暂存在内存中的数据库没有固定的表结构。Redis数据库作为缓存数据库有许多优势。Redis主要用于以下两种场景高性能场景需要执行耗时特别久且结果不频繁变动的 SQL就特别适合将运行结果放入Redis缓存。后面的请求就去缓存中读取使得请求能够迅速响应高并发场景在大并发的情况下所有的请求直接访问数据库数据库会出现连接异常。这个时候就需要使用 Redis 做一个缓冲操作,让请求先访问到 Redis然后逐步同步到关系型数据库中。
* Redis支持丰富的数据类型包括stringlistsetsorted sethash。主要由以下几种底层数据类型实现动态字符串类型保存字符串的长度、字符串的每个元、buf 数组中未使用的字节数量,能够动态的增加长度,并减少重新分配内存的次数;双向链表,通过多个节点结构就可以组成双向链表。字典又称为符号表或者关联数组、或映射,是一种用于保存键值对的抽象数据结构。跳跃表是一种有序数据结构,它通过在每个节点中维持多个指向其它节点的指针,从而达到快速访问节点的目的。
* Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制使得从数据库在任何地方同步树时可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。Redis以内存作为数据存储介质所以读写数据的效率极高远远超过数据库。以设置和获取一个256字节字符串为例它的读取速度可高达110000次/s写速度高达81000次/s。它速度快因为数据存在内存中类似于HashMapHashMap的优势就是查找和操作的时间复杂度都是O(1)。支持事务操作都是原子性。可用于缓存、消息、设置过期时间。Redis利用队列技术将并发访问变为串行访问消除了传统数据库串行控制的开销。为了解决读写分离模型的缺陷可以将数据分片模型应用进来。可以将每个节点看成都是独立的master然后通过业务实现数据分片。
* Redis有多种持久化方法RDB方式在指定的时间间隔内将内存中的数据集快照写入到磁盘。AOF方式以日志的形式记录服务器处理的每一个操作服务器启动之初读取文件重新构建数据库。
* Redis的底层架构决定了它的性能优势。内部实现采用epoll机制和简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件然后利用epoll的多路复用特性 降低IO过程的延迟。
### 字节跳动财经业务部
* 项目概述:实现担保交易的系统。
* 主要负责财经退款业务。完成支付营销预计算、分账后退款等业务需求。基于Kite框架设计实现多个微服务的接口和逻辑进行项目管理、版本控制、联调测试、报警处理等工作。
* 基于gRpc的微服务技术
* 在开发后期为了能够更好的适应项目夸大的需求公司制定新的发展计划基于grpc重构后端框架将后端拆解为多个独立的微服务并行建设发展。很好地保证了各个模块的独立性提高了开发效率同时又由于微服务的弹性部署方式使得系统的鲁棒性增强服务的效率增高。
* 微服务一种软件开发技术面向服务的体系结构SOA架构样式的一种变体将应用程序构造为一组松散耦合的服务。在微服务体系结构中服务是细粒度的协议是轻量级的。使得应用系统具备快速响应、灵活部署、敏捷交付、持续演进的特性成为可能。微服务是由以单一应用程序构成的小服务自己拥有自己的行程与轻量化处理服务依业务功能设计以全自动的方式部署同时服务会使用最小的规模的集中管理能力服务可以用不同的编程语言与数据库等组件实现 。
* 微服务架构与敏捷研发流程一脉相承。微服务是将一个完整的系统分割成若干微小的、具备独立性的功能单元每个功能单元是可以具备一个实际意义的小功能集。各个功能单元之间尽量是解耦或松耦合的可以实现独立开发而不依赖其他功能单元。而敏捷保证微服务架构能够更好地适应需求的变化保持团队的高效沟通敏捷利用小型工作增量、频繁迭代与原型设计等手段可以使我们摆脱大规模单体软件开发的风险。微服务架构更多地从技术的角度提升开发和运维的效率而敏捷方法论贯穿了软件工程的整个流程它重视流程、沟通、协作。可以说敏捷在管理流程上是对微服务架构落地的有益补充和保障。微服务的开发大致遵循DevOps的流程和原则一个软件从零开始到最终交付大概包括以下几个阶段规划、编码、构建、测试、发布、部署和维护。DevOps是一组过程、方法与系统的统称用于促进开发、技术运营和质量保障QA部门之间的沟通、协作与整合。通过自动化流程来使得软件整体过程更加快捷和可靠。用于实现敏捷开发的目标。
* 我们研究了微服务主要面临的问题主要是故障的排查通过多方考虑建立了微服务的故障排查系统。首先是微服务的监控系统指标接口实时监控流量的运转尽量能够快速的发现存在的潜在问题包括一些设定的报警规则如网络流量异常、内存占用异常、数据库链接异常、响应延迟异常、qps导致某个节点不堪重负等。让各个组件提供报告自己当前状态的接口metrics接口这个接口输出的数据格式应该是一致的。然后部署一个指标采集器组件定时从这些接口获取并保持组件状态同时提供查询服务。最后还需要一个UI从指标采集器查询各项指标绘制监控界面或者根据阈值发出告警。我们最终使用RedisExporter和MySQLExporter这两个组件分别提供了Redis缓存和MySQL数据库的指标接口。微服务则根据各个服务的业务逻辑实现自定义的指标接口。然后采用Prometheus作为指标采集器Grafana配置监控界面和邮件告警。
* 然后是通过链路跟踪系统定位问题出现的位置。使用Zipkin工具实现链路的跟踪过程实现每一个节点的日志收集。为了能够快速的实现日志分析使用ELK日志分析组件。包括一个日志搜索引擎、日志收集存储器和UI组件。为了能够控制微服务的访问权限进行服务治理搭建了一套网关系统。在调用者和被调用者中间加一层网关每次调用时进行权限校验。另外网关也可以作为一个提供服务接口文档的平台。能够进行各个微服务的接口管理通过页面访问和调试微服务。
* 由于微服务的扩充速度比较快速,最终搭建了一个微服务的注册和发现系统。每当有新的微服务或者微服务的某个新节点出现的时候,完成服务信息发布、存活检测、客户端负载均衡等任务。各个应用服务在启动时自动将自己注册到服务发现服务上。并且应用服务启动后会实时(定期)从服务发现服务同步各个应用服务的地址列表到本地。服务发现服务也会定期检查应用服务的健康状态,去掉不健康的实例地址。服务发现系统还会进行服务之间的负载均衡,防止某一个服务流量过大,称为微服务链路上的流量瓶颈。
* 在实现微服务系统的时候,还考虑了大量的其他安全性可靠性内容。包括建立链路上的熔断机制,当多次访问一个服务失败时,应熔断,标记该服务已停止工作,直接返回错误。直至该服务恢复正常后再重新建立连接。建立了微服务的多级测试系统,服务本地的单元测试,整个服务的测试,端到端测试(覆盖这个服务调用链的测试)。
* 在构建微服务系统的核心关键技术是gRpc。gRPC是由Google公司开源的一款高性能的远程过程调用(RPC)框架可以在任何环境下运行。该框架提供了负载均衡跟踪智能监控身份验证等功能可以实现系统间的高效连接。另外在分布式系统中gRpc框架也有有广泛应用实现移动端、浏览器等和服务器的连接。gRPC支持多种语言的实现因此gRPC支持客户端与服务器在多种语言环境中部署运行和互相调用。gRPC使用ProtoBuf来定义服务ProtoBuf是由Google开发的一种数据序列化协议类似于XML、JSON、hessian。ProtoBuf能够将数据进行序列化并广泛应用在数据存储、通信协议等方面。压缩和传输效率高语法简单表达力强。
* gRPC 的协议设计上使用了HTTP2。HTTP2 提供了连接多路复用、双向流、服务器推送、请求优先级、首部压缩等机制。可以节省带宽、降低TCP链接次数、节省CPU帮助移动设备延长电池寿命等。gRPC主流分布式方案有以下三个etcd, zookeeper, consul最终选择使用consul实现服务的注册与负载均衡的实现。
* 我们通过proto文件定义了数据结构和服务接口。可以通过流模式实现服务器和客户端的调用。集成了TLS验证方法用于识别客户端和服务器增强通信的安全性。使用SSL/TLS协议对通信连接进行安全加密是通过非对称加密的方式来实现的。在加密过程中客户端想要向服务器发起链接首先会先向服务端请求要加密的公钥。获取到公钥后客户端使用公钥将信息进行加密服务端接收到加密信息使用私钥对信息进行解密并进行其他后续处理完成整个信道加密并实现数据传输的过程。客户端调用服务时客户端gRPC库使用协议缓冲区并编组(marshal)远程过程调用该调用随后通过HTTP2来发送。在服务器端请求解组(un-marshalled),使用协议缓冲区执行相应的过程调用。响应遵循从服务器到客户端的类似的执行流程。
* 支付与退款逻辑处理
* 作为电子钱包财经部分的核心业务,其最大的困难点在于业务场景的理解和负责业务需求的实现,技术上的难点通过之前的分析已经实现了。
* 首先最大的难点是建立后端的订单子系统实现后端订单的数据流图。业务方可能会产生多种类型的订单例如在购物的时候会生成shop单、商户单、商品单退款的时候根据退款创建的时间不同可能产生各种类型的退款单通过区分是否在售后内或者超售后是否满足优质用户的急速退款条件订单是否已经分账产生不同类型的退款单。在财经部分根据业务方的需求建立财经部分的订单系统该系统主要融合了业务方订单和支付方订单。业务方订单包括shop单、sku单、商品单等财经部分订单包括四种主要的类型商品单、支付单、分账单、退分账单、补贴单、推补贴单、退款单等。退款中会生成退款单包括多种类型如退款子单、急速退款单、退分账单、退补贴单、退税单等。由于支付场景负责各种订单的准确性必须要有保证。
* 财经部分最重要的是对金额和流水的保证。建立了从上到下的对账系统通过流水信息、数据库信息、日志信息等进行不间断的对账保证了交易金额的准确性。杜绝发生严重的金融风险。同时增强开发人员的金融管控意识。防止出现资金安全问题。在技术上使用GO语言重构了后端的微服务包括一系列配套的微服务工具的应用。如上一节提到的微服务的技术选型服务注册与发现机制consul、敏捷开发流程devops、远程调用方式thrift、服务监控平台Grafana、数据分析平台Hive、链路系统跟踪平台、服务网关Gateway等。实现一系列微服务开发、部署、运维任务。
* 在担保交易系统中,总的业务流可以分为四个部分:支付、分账、退款、提现。当用户付款后(自有支付、第三方支付),不能立即存到商家的账户中,需要暂存到商家的待结算户中,防止出现资金安全问题。当用户点击确认收款后,资金从商家的待结算户,分账到商家账户和其他分账方的账户(达人带货分账、平台营销分账等),其中还涉及到平台的营销问题。当用户发起退款是,会根据不同的情况,走完全不同的退款流程,主要包括普通退款、分账前退款、分账后退款、超售后退款和急速退款。其中每一种业务都被划分为一个独立的微服务,可能部署在不同的虚拟机上,存在大量远程调用过程。
* 当时负责支付营销预计算和分账后退款两个业务,涉及担保退款、退款请求、财经核心微服务,整个服务链包括十几个业务,我负责其中的三个。担保退款业务负责接收来自其他应用的退款请求,查询数据库中的订单,校验请求的准确性,同时通过幂等校验对重复的请求进行处理。退款请求业务,接收担保退款微服务的请求,对请求进一步校验,根据订单状态、支付状态、业务方的需求将退款业务划分为不同的退款方式(急速退款、普通退款、分账后退款、超售后退款等),然后执行不同的退款逻辑。每一种退款都实现了统一的接口,需要校验大量的请求参数和订单内容,保证请求和订单的一致性,需要调用电商接口,计算每一个分账方的分账金额,根据分账方的分分钟金额校验账单系统中的分账单,针对每一个分账单,生成分账的退款单,然后请求支付核心,将商家待结算户中的金额退给用户。如果已经部分分账,需要将所有分账的金额退到商家现金户,推进分账进程,然后从商家的现金户,将金额退还给支付账户,并将平台补贴金额退回。每次退款过程前,需要事先请求计算支付营销金额,如果保证金额正确才可以进行后续的退款,否则返回退款失败。
## 5 个人能力
1. C++后端开发、Java/Go/Python/Nodejs后端开发、Mysql数据库
2. 主要关于项目开发中某一方面的知识经验总结
* 网络编程(各种语言的实现方法。异步并发,并发通信方式。)
* web开发自己所开发过的web网站。主要用到的框架和技术。
* 并行编程(各种语言实现并发编程的手段和方式,例如协程、多线程、多进程等)
## 6 个人性格
1. 乐观开朗,心里素质较强,喜欢积极的应对生活中的困难。待人友善,团结合作,有较强的领导能力、组织能力和团队精神。勤奋好学,思维敏捷,自学能力强。
2. 具有良好的专业能力,基础知识扎实。参与了多个项目的开发过程,具有丰富的项目开发经验。对软件工程领域的知识有很高的热情,希望通过自己的努力,创作完美的作品。
## 7 补充项目
### ~~补充项目——软件与微电子学院学生信息系统。PHPweb开发~~(----丢失)
* 项目概述20个人组成的团队PHP、MySQL。系统主要包括任务管理系统、证书认证系统、请销假平台、项目管理、活动会议记录、党建系统、文件管理系统、就业记录等子系统。使用PHP作为后端开发脚本使用MVCyii框架进行开发。
* 主要工作构建数据库。使用yii框架实现请销假平台包括表单管理和MySQL数据库访问。yii框架是MVC结构。由controller处理逻辑内容model封装数据库访问view视图作为界面用来渲染数据发送到前端。
![](image/2021-04-06-20-19-05.png)
* 最终成果:开发完成暑期项目实践,项目成功验收。
### ~~补充项目——企业级开发JavaEE项目考试系统~~(√上传)
> 因为是java项目等日后学完java再写
### ~~补充项目——windows通信编程。多人聊天室~~(√上传)
* 项目概述:单人项目开发。
* 主要工作MFC开发界面、windows网络通信。
* 主要成果:课设。

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@@ -10,6 +10,9 @@ struct TreeNode{
TreeNode* left;//左子树
TreeNode* right;//右子树
TreeNode* parent;//可以不用
// TreeNode(int v){
// val=v;
// }
};
class BinaryTree{
//TreeNode* root;//二叉树的根节点
@@ -35,8 +38,6 @@ public:
int j=0;
TreeNode* temp;
while(!que.empty()){
if(que.front()==nullptr){
que.pop();
cout<<"\t";
@@ -61,8 +62,6 @@ public:
cout<<node->val<<" ";
}
//前序遍历
void pre_order(TreeNode*node){
if(node == nullptr){
@@ -106,7 +105,7 @@ public:
que.pop();
}
}
// 区分层次的层序遍历
// 之字形区分层次的层序遍历
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> vec;
queue<TreeNode*> que[2];