当前位置: 首页 > news >正文

华为开发后端实习体验总结帖(详细)

目录

  • 1. 前言
  • 2. 学习路径
    • 2.1. 了解所属小组的业务:
    • 2.2 整个项目跑起来:
    • 2.3 使用调试工具访问项目数据:
    • 2.4 项目运行涉及知识点汇总
      • 2.4.1 项目文件中的常见注解
      • 2.4.2 项目分层说明
      • 2.4.3 项目配置环境
    • 2.5 找到一个功能,查看源码操作:
    • 2.6 例子:如何实现一项功能:
    • 2.7 服务间如何进行方法调用
    • 2.8 项目框架的学习
    • 2.9 通过业务需求进行实战
      • 2.9.1 实战内容
      • 2.9.2 开发人员代码进行自测试
      • 2.9.3 需求从提出到落实步骤说明
    • 2.10 接口编写经验总结
  • 3. 实习体会总结

1. 前言

实习时间:在华为消费者BG软件部实习了两个月,作为一名后端开发工程师,对我帮助非常大,也让我接触了实战中会遇到的问题,与我自己独自练习有很大不同。
实习总结:在这两个月里,组内气氛融洽,组内同事都对提供了很多的帮助,故想记录一下这两个月的所学,也为以后打算实习的同学有个参考,提供些许帮助。

2. 学习路径

来公司之后,我们可能对公司项目一无所知,为了尽快熟悉业务,让自己能够上手,我推荐以下学习的步骤(如果我之前知道,可能效率就能更高些了)

2.1. 了解所属小组的业务:

1)新员工项目指导书:新员工项目指导书:刚开始的时候,一定要仔细看小组的新员工项目指导书,里面详细介绍了公司的业务。知道所属业务,能够使得自己大致掌握工作的内容方向,也为后面开发做铺垫。

2)介绍:我所在的项目组为鸿蒙智联开发者平台,为智能设备厂商进行智能产品的认证,嵌入到华为鸿蒙系统中使用。建立一个自助的可循环生态系统,使得大多数智能产品能够自助接入。

3)遇到的问题:业务信息了解个整体就可以,不用太细,可以在具体业务开发的时候再详细了解(当时项目介绍部分大篇幅在说认证的流程,我以为很重要,看了大半天,弄得比较细,但是后面发现我用到的不多),可以后续边学边了解

2.2 整个项目跑起来:

1)重要:组长当时和我强调,但是我不太会,中间也出错很多,花了很多时间,技巧是:先自己看教程,有问题还是多问,让别人帮着跑通项目程序。

2)介绍:我的项目有三个大文件,分别是platformService,UserService和PlatformAPI。不同项目大致也有类似三个服务。

(1)PlatformService实现平台的主要功能,里面有很多小服务;

(2)UserService里面包含一个服务,主要是与用户相关的功能,增删改查用户的信息。

(3)PlatformAPI:这个是网关,请求先通过网关,进行过滤鉴权等操作,后面才会转发给各个自服务。

3)遇到的问题:由于对项目安装不熟悉,所以最初花了很多时间在软件安装上面,后面还是在组长的帮助下跑通项目。最开始就要掌握:从CodeHub上面把代码克隆下来,然后能够自己配置文件,还有Maven的一些属性,使得能够跑通项目。

2.3 使用调试工具访问项目数据:

1)目的:这一步骤主要是验证,项目是否正常运行,能够得到想要的结果。

2)调试工具:我用的是PostMan,还是非常好用的。通过输入URL能够访问服务的请求,输出得到结果。操作简单,可自行查阅。

3)调试方法:调试的时候,有两种访问方式:跳过网关和不跳过;(网关的目的主要是实施一些与业务无关的操作,比如登录,鉴权,过滤。)

4) 跳过网关运行项目:
(1)访问url:本机ip:子服务端口号/服务中接口的路径?入参
(2)例子:127.0.0.1:8086/v1/community/list?pages=1
(3)参数输入:一般如果是get请求,入参放在url后面,如果是post请求,就放在url后面或者Body里面(如果输入一个实体类,那么只要把用到的成员变量放进去即可)

5) 通过网关运行项目:那么就需要传入cookie和token进行权限验证。(额外打开网关服务项目文件)
(1)访问url:本机ip:网关端口号/integration/服务名/服务中接口的路径
(2)例子:127.0.0.1:9210/integration/ProductyService/v1/community/list?pages=1
(3)加入网关之后,需要获取Cookie和token信息,放入Headers里
(4)其他入参:与不通过网关一致,url后面或者Body里面。

2.4 项目运行涉及知识点汇总

2.4.1 项目文件中的常见注解

(1)@RestController : 注解的作用为输出显示为json数据格式,而非视图
(2)@RequestMapping:是一个用来处理请求地址映射的注解,可以作用在类或者方法上面,用在类上,表示该类中的所有响应请求的方法都是以该地址作为父路径的。
(3)@Validated:数据校验注解,对类进行标注
(4)@Value()获取配置文件中的属性值。配置文件具有访问顺序::classpath:/具有最低的访问权限。配置文件使用的是application-local.yml文件中的,可以在Maven右边配置中进行选择。
(5)@RpcReference:调用了三个其他服务,其中中间一个没有找到。(已经在代码库里面找到这个文件了)
-. 是CSE提供的用于rpc调用的注解。通过这个注解可以实现通过rpc的方式调用别的微服务,而不用感知要调用的微服务在哪里,address是什么。
-. 有点类似于@Autowired。注解包含两个参数:microserviceName指向服务名字,schemaId指向具体业务名字。
-. 其他服务中,如果一个业务层想成为一个远程过程调用,就需要在文件夹中新建文件rpc.privider,里面写好需要进行远程调用的程序即可,需要加上注解:@RpcSchema。
(6)@Operate:自定义注解:规定资源和操作类型

2.4.2 项目分层说明

(1)Dao:数据访问层,同Mapper层(在resource),一张表就对应一个Dao层,对其进行处理。
(2)Service:业务层,基于Dao层,能够对功能进行实现;通常里面会有impl,即如果在业务层里面添加实现接口,对应在impl里面实现。通过接口和实现的模式,可以让实现类能够完成指定的功能。
(3)Controller:表现层,基于Service层。
(4)Util:工具层,封装一些与业务没有耦合的方法,方便调用
(5)Entity:实体类,即一些表的定义都是在这里,封装表等内部的数据情况。一表一实体。
(6)Rpc.provider:远程过程调用层,定义一些本服务可能会被远程调用的服务,并设置为rpc,其他服务后面直接调用就可以用了。
(设定:在本服务的一些类上加上标注:@RpcSchema,就可以申明为rpc类了)
(调用:@RpcReference(microserviceName =A, schemaId =B),包含两个参数,一个是服务的名字,一个是实例化的具体rpc类的名字 )
(7)Enums:枚举层,就是针对一些表格,通过用一些符号表示特殊的意义。

2.4.3 项目配置环境

Local:本地环境,用于开发人员自己本地开发使用。项目在本地运行都要在local环境中。
Dev:开发者环境,开发人员把项目部署上线,运行调试的环境
Sit:系统集成测试环境(内测),测试人员进行测试的环境
Uat:用户验收测试环境,非常接近于用户使用的环境,在做上线之前需要在这个环境内运行。

2.5 找到一个功能,查看源码操作:

1)当学习完前三步,已经能够独立操作一个项目了,后面就是对项目的原理进行了解了

2)可以找组长沟通,找一个熟悉的业务,如果你来做,会打算怎么做,然后对照项目中的代码,看看别人怎么写的。

3)在这一步,主要了解如何实现一个功能:Dao层,Service层,Controller层如何进行书写,是否需要新建Util实体类和Enum枚举类。

4)对上一部分不了解的,一定要找文章看一下,一个功能是如何实现的。简要说明:如果需要对数据库操作,书写Dao层,写明方法,然后再resource层mapper的. xml文件中书写sql语句实现;在Service层书写一些方法,通过使用Dao层的方法,完成一写指定功能;最后在Controller层,利用若干个个Service层的方法,完成整体的逻辑,并且提供接口进行外部访问。

2.6 例子:如何实现一项功能:

例子:我想实现一个功能:在网页上显示一个对白名单的操作页面,能够对白名单进行增删改查。

Util层:我需要新增一个白名单表的实体类,白名单表中有哪些信息可以查询。

Dao层:数据持久层,书写对数据库的操作方法,我需要对白名单进行增删改查四个操作,所以书写四个函数。然后书写对应的Mapper文件,在里面书写sql语句进行增删改查功能实现。

Service层:书写增删改查四个方法,比如对于删除,首先我需要判断是否存在这个元素,才能进行判断,所以我再删除要先要调用Dao层的查询方法,查询是否为空,不为空,再调用Dao层的删除方法。Service层的方法,可以同时使用多个Dao层方法。

Controller层:书写四个请求:增删改查。比如还是删除操作,在这一层就需要先鉴权了,可能不是每个用户都拥有删除的操作,先鉴权,然后再调用Service中的删除方法,这里又进一步在Service层多了些内容。

** 综上**,上面只是一个很简单的需求,但是开发的顺序就是这样,越底层,考虑的内容更少,越向上,考虑的东西就更多。

2.7 服务间如何进行方法调用

1)目的:当我们书写方法的时候,不同服务可能都会用到同一个方法,为了实现代码的复用,可以采用方法的调用。

2)调用方式:服务与服务之间相互调用
(1):http的调用:需要配置各种文件,很麻烦:https://server//path//…
(2):RPC:cse://server//path…,这个方便了一些,但是需要时在同一个注册中心,同一个APPID里面(每一个配置环境对应一个APPID)
(3):APIjar包:即在开发每一个服务的时候,开发出对应的API包,之后能够供其他服务进行方便的调用,就像调用本地的方法一样。

3)下面主要介绍服务间的通信方法:RPC和RESTful API
4)RPC:远程过程调用
(1)定义:一种通过网络从远程计算机上请求服务,而不需要了解底层网络技术的协议,可以实现像调用本地方法一样调用其他服务方法。RPC是一种技术代名词,可以采用Http协议,也可以采用TCP/IP协议,通过动态代理实现像在本地调用一样。
(2)优缺点:调用简单,清晰,透明,不用像 rest 一样复杂,就像调用本地方法一样简单;低延时,高性能,自带负载均衡;耦合性强,定制化程度更高,适合公司内部使用。
5)RPC:实战中调用步骤
(1)在原有的服务里面新建一个文件夹rpc,里面放两个文件(最好放在子服务-api中)

接口放在api中,实现类放在service中
接口的实现类,需要额外添加一个注解;@RpcSchema(schemaId = “w3RpcServiceProvider”)
(2)在需要调用rpc的service上面进行书写服务注入
@RpcReference(schemaId = “w3RpcServiceProvider”, microserviceName = “NotificationCenter”)
private W3RpcService w3RpcService
(3) 在需要调用rpc的pom中添加
-. 添加rpc原服务的jar包

项目名字

子服务名

${project.version}

6)REST:
(1)定义:REST 是一种使用 HTTP 协议的进程间通信机制,一般使用 Json 来传递数据;可以使用自定义的URL进行服务调用,而不用关心服务的具体地址。
(2)优缺点:通用性更强,定制化程度小,效率会比RPC低些。

2.8 项目框架的学习

1)总结:学习完上面的,至少对如何运行项目,项目之间服务的架构,还有如何编写程序实现功能的逻辑,接下来需要了解更深一些,可以去获知项目使用的框架。

2)项目框架问题

(1)项目使用的底层框架是什么?SpringBoot

(2)微服务是什么,为什么需要使用微服务?最简单是为了开发更加高效,专注于一个点

(3)微服务框架有哪些?华为内部使用的是什么?华为使用的是CSE

(4)CSE与Spring Cloud的区别是什么?CSE性能更高,功能更全。

2.9 通过业务需求进行实战

2.9.1 实战内容

1)上面都是了解只是,看别人怎么写代码;

2)真正想上手,还是得自己实现一定的需求,进行实战。

3)这其中就包括如何使用Git对项目进行管理,如何对所写代码进行测试(接口测试与业务功能测试)

4)还包括一个需求如何从提出到落实

2.9.2 开发人员代码进行自测试

1)对Service实现类测试:这个主要通过Spring Boot的测试方法来实现
(1)框架使用:JUnit+AssertJ
(2)活用注解:@BeforeClass,@Before;@AfterClass,@After
(3)测试用例代码三段式:Give:基本数据参数;When:调用被测试方法;Then:结果的输出
2)Controller接口的测试:主要使用Postman进行完成(因为是前后端分离的)
(1) url:路径
(2) type:类型,Get/Post/Put等
(3) header:消息头,主要说明一些数据格式(Content-Type,Token,Cookie)
(4) Body:消息体,主要输post输入参数放在这
(5) param:消息,主要是get中在url的参数会解析放在这

2.9.3 需求从提出到落实步骤说明

(1)确定需求:首先是客户经理或者开发测试人员提出需求:可以是未涉及的功能,也可以是性能的提升。
(2)纳入版本计划:开版本讨论会,确定需求编入该版本。
(3)串讲:开发人员对所需要实现的需求进行实现逻辑讲解,这其中包含前端和后端开发人员,设计一个可行的实现方案,同时与需求提出人员进行比对,查验开发人员与需求提出人员对需求的理解是否一致。
(4)反串讲:开发人员再详细讲解具体实现逻辑,测试人员根据开发逻辑,进而提出测试的逻辑。
(5)开发:开发人员进行开发,代码书写完,需要进行自测试,然后提交给测试人员之前需要demoshow(即展示基本逻辑是否能够实现);demoshow通过之后提交测试
(6)测试:测试人员根据不同的情况,对接口进行访问,查找出可能会出错的地方。
(7)代码合并:一个需求就这么结束了

2.10 接口编写经验总结

1)遇到错误总结:在编写接口实现功能的时候,为了使得代码清晰,也方便后期的维护,有一定的规范性,我遇到的问题总结如下:
(1)关键日志输出:对关键数据进行日志行的输出,方便查看运行情况
(2)常量定义:代码中出现数字或者字符串,用常量表示,且全为大小,下划线分割
(3)类复用:重复代码定义为类,方便继承
(4)解释说明:一定要说清楚方法的目的,输入参数与输出参数的具体意义。
(5)版权注释:在文件顶部,注释版权许可信息
(6)删除无意义行:代码编写是,可能会引入多余参数或注入,后续没有用到,需要统一删除,精简代码。
2)接口编写规范注意项总结
(1)接口参数校验:对输入,输出参数进行校验
(2)接口兼容性:不能直接删除老接口,要进行兼容
(3)接口扩容性:接口不应该局限于一种功能,应该可以拓展为多种类似功能
(4)第三方接口调用注意:考虑超时,异常和重试次数,方便自己的逻辑。
(5)日志打印:关键代码位置,日志打印好,方便查看运行情况
(6)接口功能单向:接口能够实现的功能单一,不能进行杂糅,与可拓展性不冲突
(7)可变参数配置化:一些经常会变动的数据,作为一个配置类进行数据配置,适用不同范围
(8)接口实现:SQL的优化
(9)接口状态与错误:接口运行成功返回值,运行失败,返回对应的错误码和描述,不能直接抛出异常信息。
(10)接口的异常处理:
(11)优化程序逻辑
(12)接口的安全:隐私信息的脱敏;不能随意访问,采用token机制
(13)接口定义:清晰易懂,命名规范

3. 实习体会总结

在华为实习两个月,虽然不是很长,但是让我切切实实体会到未来工作的日常。没来之前听说华为内部加班特别厉害,但是来了才知道,得分部门,分时段,所以还是只有亲身体会才知道。
组内氛围很好,主管与同事之间也都非常热情帮助我,虽然有时一些问题确实很简单,但是还是耐心讲解,也让我从一个小白,逐渐能够独立完成一些任务。
在实习过程中,自我感觉有以下几点是非常重要的,我之后也会坚定贯彻下去:
1)不要拒绝思考一些东西,留出一部分时间思考是非常重要的思想。
2)时刻别忘记自己因为什么而出发,在每一个小的阶段都非常重要
(1)阶段性询问自己,为什么现在在做这件事,做事情的意义在哪里?
(2)根据上一步的结果,及时调整计划走向(总结归纳)
(3)每天留给自己一些安静思考的时间,巩固一天所学,用讲述的方式讲给自己听。
3) 如何快速理解一个全新的大的项目?
(1):从上到下去理解项目(上指局部,下指自我业务源码,先大后小)
(2):遇到问题,自己先解决,带着自己查阅的资料,不会再问身边的同事,进行快速了解;一定要有自己思考的时间,不可不思考直接询问,这样印象也不会深刻。

相关文章:

  • 认真研究ConcurrentHashMap中的元素统计策略
  • TinyRenderer学习笔记--Lesson 3、4
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • Hive的独立安装
  • Smobiler 窗体
  • Android用户切换系统语言后,回到App,App重新加载导致的一些问题[android:configChanges=“layoutDirection“]
  • Django部署深度学习项目-1
  • JS-sort
  • Callable接口(类似于Runnable)
  • CentOS环境下安装Nacos
  • 金仓数据库 KingbaseES 插件参考手册 S (2)
  • 营销软文的结尾怎样写?营销软文结尾怎样去设计?
  • 2022河南萌新联赛第(七)场:南阳理工学院 B 龍
  • 我做了几年的Android应用层开发,为什么还要去学习安卓系统知识?
  • [暑假]Vue框架里面 一些属性和配置项的作用
  • 【css3】浏览器内核及其兼容性
  • Java到底能干嘛?
  • JS 面试题总结
  • PAT A1017 优先队列
  • spring boot下thymeleaf全局静态变量配置
  • vue-cli在webpack的配置文件探究
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • Vue小说阅读器(仿追书神器)
  • 电商搜索引擎的架构设计和性能优化
  • 白色的风信子
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​Spring Boot 分片上传文件
  • !!Dom4j 学习笔记
  • ###C语言程序设计-----C语言学习(6)#
  • #NOIP 2014#Day.2 T3 解方程
  • (day6) 319. 灯泡开关
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (转)LINQ之路
  • (转)程序员技术练级攻略
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .NET Core WebAPI中封装Swagger配置
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NET/C# 使用反射注册事件
  • .NET微信公众号开发-2.0创建自定义菜单
  • .project文件
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • [2013][note]通过石墨烯调谐用于开关、传感的动态可重构Fano超——
  • [ABP实战开源项目]---ABP实时服务-通知系统.发布模式
  • [Angular 基础] - 指令(directives)
  • [C/C++] -- 二叉树
  • [cocos creator]EditBox,editing-return事件,清空输入框
  • [i.MX]飞思卡尔IMX6处理器的GPIO-IOMUX_PAD说明
  • [LeetCode]Pow(x,n)
  • [MT8766][Android12] 增加应用安装白名单或者黑名单
  • [mvc] 简单的forms认证
  • [NOI2020统一省选 A] 组合数问题 (推式子)
  • [noip模拟]计蒜姬BFS