Git 骚操作

跳到之前的分支

1
git checkout -

查看历史

1
2
3
4
5
6
7
8
# 每个提交在一行内显示
git log --oneline

# 在所有提交日志中搜索包含「homepage」的提交
git log --all --grep='homepage'

# 获取某人的提交日志
git log --author="Maxence"

修正

比方说想在提交 fed14a4c 加上一些内容。

git 提交分支

git 提交分支

1
2
3
4
5
6
git add .
git commit --fixup HEAD~1
# 或者也可以用提交的哈希值(fed14a4c)替换 HEAD~1

git rebase -i HEAD~3 --autosquash
# 保存并退出文件(VI 中输入 `:wq`)

从远程分支检出新的本地分支

1
git checkout origin/aa aa

MapStruct 简易教程

使用场景

我们经常会遇到 DO 和 DTO 以及 DTO 和 VO 之间的转换,一般我们的做法是使用 BeanUtil.copy 然后对于一些特殊的字段进行 Set 。但是这样做有几个痛点:

  1. 其实这个过程很没有技术含量,基本都是 CV 操作
  2. 在业务代码中做这种类型转换的业务无关代码,让代码显得比较杂乱
  3. 如果是几万的 beanList 的拷贝会有性能问题
  4. 希望能抽出工具类但是好像也不太合适,每个都是一个工具类,而且对于复杂的转换垃圾代码太多
  5. 希望能够通过简单的注解或者 xml 配置完成这些操作

解法

Map-struct 就是这样一个基于注解的编译后置处理器,让你写一些简单的注解满足数据转换的需求,类似于 lombok 是编译时期完成的,也没有什么性能问题。

安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<properties>  
<org.mapstruct.version>1.3.0.Final</org.mapstruct.version>
</properties>

<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
<scope>provided</scope>
</dependency>

使用

@mapper

  1. 当我们使用 componentModel = "spring" 意味着我们可以使用 spring 进行依赖注入

  2. componentModel= "default":默认,可以通过 Mappers.getMapper(Class) 方式获取实例对象

@mappings 和 @mapping

  1. @Mapping(source = “birthday”, target = “birth”)
  2. 带有时间格式化的 @Mapping(source = “birthday”, target = “birthDateFormat”, dateFormat = “yyyy-MM-dd HH:mm:ss”)
  3. Java 代码格式化 @Mapping(target = “birthExpressionFormat”, expression = “java(org.apache.commons.lang3.time.DateFormatUtils.format(person.getBirthday(),"yyyy-MM-dd HH:mm:ss"))”)
  4. 忽略字段 @Mapping(target = “email”, ignore = true)

简单的 Demo

DO

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table
public class Worker implements Serializable {
private static final long serialVersionUID = 629213888727713294L;
@Id
@GeneratedValue
private Long id;
private String name;
private String email;
@JsonIgnore
private String password;
private String type;
}

VO

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WorkerVO {
private Long id;
private String name;
private String email;
private String password;
private String type;
private String token;
}



转换 Mapper

1
2
3
4
5
6
7
8
@Mapper(componentModel = "spring")
public interface UserMapper {

@Mappings(
@Mapping(source = "worker.password",target = "token")
)
public WorkerVO convert(Worker worker);
}

Logback 日志框架详解

配置 pattern

符号 功能 性能损耗
%c 打印全类名
%n 换行,一定要在 pattern 的最后加上不然展示的就是一行了
%ex 打印出异常: 1. %ex{full} 全部异常堆栈 2. %ex{short} 最上面一层堆栈
%d{MM-dd HH:mm:ss} 格式化时间
%level 打印日志级别
%m 打印方法名称

举个简单的例子:

1
2
3
4
5
6
7
8
9
10
<property name="CONSOLE_LOG_PATTERN" value="%d{MM-dd HH:mm:ss} |-%level  %c#%m - %msg %ex{full}%n"/>

<!-- ConsoleAppender 控制台输出日志 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<target>System.out</target>
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset class="java.nio.charset.Charset">UTF-8</charset>
</encoder>
</appender>

可参考连接:

JavaWeb 基础

Spring

bean 属性注入方式

  1. 通过 setter 方法,直接使用 property 标签;p 标签,1. 导入 p 空间 2. 使用 p:属性 = ‘xx’

    1. 使用 property 是会进行自动 的类型转换,起作用的就是 PropertyExtend。

    2. 如果要对属性赋值为 null 的话,我们不能使用 name ,value ,必须将类型写在标签体里面

    1. 如果注入的是一个对象的话那么需要用 ref 引用
    2. 如果我们需要注入一个新对象,而不是 ioc 中原有的那么我们就在 property 标签中写一个 bean 标签,然后不需要 id 就可以,注意内部 bean 不会被放到 ioc 中
    3. list ,在 porperty 中写 list 标签,然后里面写对应的元素即可,如果是对象就用 bean,或者使用 ref 标签引用外部对象。
    4. map ,使用 map 标签,然后里面写 entry 标签 key - > value / value-ref ,同样的如果不写 value 可以在 entry 中写一个 bean 作为内部 bean 引用
    5. value 标签其实就是基本类型了
    6. props 标签就是对应了 java 中 property 对象,里面使用 prop 标签
    7. 使用 util 命名空间,帮我们创建一些集合,而且被放到 ioc 中,方便其他的地方可以引用,比如 <util:map> <util:list>
    8. 级联属性(属性的属性的属性 …) <property name = ‘a.b.c’ value = ‘xx’> 注意级联属性的时候可以修改 ioc 中的 bean 的属性
    9. 属性继承,如果创建两个同样 class 下的 bean 我们可以通过 bean 的 parent 属性来继承一个 bean 的属性值,父 bean 如果设置了 abstract=true 那么这个 bean 只能被继承不能从 ioc 中获取
  2. 通过构造器,使用 constructor-arg 标签 name , value ,如果不指定 name那么按照顺序

依赖注入

  1. dependce-on = “a,b,c” 这个并不能说谁依赖谁 而是只能改变 bean 的创建顺序

bean 的作用域

  1. prototype 多实例,不在容器启动的时候创建而是在获取的时候被创建
  2. singleton 单利,在容器启动之前就创建好,任何时候获取都是获取创建好的
  3. request 每次请求的时候创建
  4. session 同一个会话一个 bean

工厂创建 bean:

  1. 静态工厂,不需要创建工厂对象,直接调用静态方法
    • 在创建 bean 的时候 class 写工厂的全类名,然后 factory-method 写对应的静态的方法名
  2. 实例工厂,创建一个工厂对象,然后调用对应的方法
    • 先配置实例工厂,就是配置一个工厂 bean 也就是说的 factory-bean
    • 然后在配置我们需要的 bean,class 写我们目标 bean 的 class,然后需要配置 factory-bean 和 factory-method 两个属性
    • 如果们继承了spring 中的 FactoryBean 接口 然后我们在配置 class 的时候配置这个 类,也不需要配置其他的一些东西直接出来就是我们需要的 bean,spring 就默认自动的调用工厂方法创建实例
    • 但是注意实现了 factorybean 接口的工厂不管你是单实例还是多实例他都是不在启动时创建而是在调用时创建

生命周期方法

  1. init-method ,destory-method 分别是容器启动的时候和容器关闭的时候调用 这是单实例的情况,注意初始化方法是在创建实例之后才调用的,也就是 new 之后,但是此时 bean 并没有完全创建出来因为还没有走完生命周期
  2. 如果是多实例的时候在获取的时候回调用 init 永远不会调用 destory 需要自己管理生命周期。

bean 后置处理器

  1. 需要实现 BeanPostProcessor 然后实现两个方法,分别是在 init 之前和之后调用的两个方法
  2. 注意实现了 beanPostProcessor 的类需要被放到 ioc 容器中

引用外部属性文件 properties 文件

  1. 使用 context:property-placeholder 标签,使用 location 指定属性文件的位置
  2. 使用 ${xx} 获取属性
  3. 注意:不要使用 username 这个 key,因为这个是 spring 中的一个关键字,他是系统用户名
  4. 注意:在使用 ${xx} 时候前后左右不要有空格,如果的话会将这个变量连接一个空格

基于 xml 的自动装配

  1. 在 bean 标签上写 autowire = ‘xx’ , 具体类型有 :
  2. byName [按照 id 和属性名进行匹配]
  3. byType 按照类型,如果发现有多个那么会抛异常
  4. default 不进行自动装配
  5. constructor 按照构造器进行赋值,如果按照 constructor 进行装配有一个匹配过程,首先使用类型匹配,如果匹配的时候有多个结果不会抛异常而是通过 id 进行装配

SPEL

  1. 使用 #{12*12} 做计算
  2. 使用 #{aa.name+” “} 获取属性做拼接
  3. 调用静态方法 #{T(全类名).静态方法名(参数)}
  4. 调用非静态方法 #{obj.method(params)}

包扫描

  1. 使用 <compont-scan base-package = ‘’ >
  2. 但是如果需要使用这种注解扫描必须使用 aop 包不然会报错
  3. 过滤包扫描,对于一些包不进行扫描 <context:exclude-filter type=’xx’ expression=’xx’>
    1. type 可以是注解,annotation,assignable 全类名 (前面两个常用,后面基本不使用),aspectj j 表达式,custom 自己写代码,regex正则
  4. 只扫描 <context:inculde-filter type=’xx’ expression=’xx’>
  5. 上面两个必须要写到 component-scan 标签里面

classpath 变量

classpath 和 classpath* 区别:

  1. classpath:只会到你的class路径中查找找文件;
  2. classpath*:不仅包含class路径,还包括jar文件中(class路径)进行查找.

src路径下的文件在编译后会放到WEB-INF/classes路径下。默认的classpath是在这里。直接放到WEB-INF下的话,是不在classpath下的。

Spring 文档阅读笔记(一)

Spring 文档阅读笔记 一

1.2 概览

1.2.1 配置元数据

元数据配置就是能够让你明白如何进行应用开发,容器的实例化,配置,以及应用中对象的组织

传统配置元数据的方式就是使用 xml,在我们大部分的章节中会介绍一些关键的概念和 Ioc 容器的特性

当然目前不仅仅支持 xml ,目前推荐的是 Java 代码的方式以及注解方式:

2.3 使用场景

2.3.2 日志

spring的强依赖是是 JCL (Jakarta Commons Logging API ) 以及他的实现 commons-logging (JCL的标准实现)。更加确切的说他是在spring-core 中被依赖的。

现在选择的话 spring 并不会使用 JCL 而是 slf4j 有两种方案关闭 common-logging:

  1. spring-core模块排除依赖(因为它是唯一的显式依赖)commons-logging的模块

  2. 或者依赖于一个特定的commons-logging依赖,用一个空jar替换这个依赖(更多细节可以在SLF4J FAQ中找到)。

排除包之后还需要将 jcl 的调用连接到 slf4j 上,并且添加 slf4j 的具体实现:

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
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.0.0.BUILD-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.5.8</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.5.8</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.5.8</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
</dependency>
</dependencies>

Spring 源码分析 - IOC (一)

Spring 源码分析 - IOC (一)

一、IOC 启动概览

整个调试过程基于注解驱动的 Spring Freamwork 5.x 源码

整个启动大致的流程可以分为设置 bean 工厂注册 beanDefinitions启动容器 三部分。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
/*
调用无参的构造方法,无参的构造方法会调用父类的无参构造方法 主要的工作是 this.beanFactory = new DefaultListableBeanFactory();
也就是创建 bean 工厂
*/
this();
/*
主要工作为注册我们的主类,也就是我们传递进来的 Class,以及注册一些 Spring 的核心功能类到 beanDefinitions 中
*/
register(annotatedClasses);
/*
核心的方法,启动容器
*/
refresh();
}

二、this 调用

看一下在 Spring Doc 中对 @Order 和 @Primary 的说明

image-20200130100724512

image-20200128192319412

获取环境,如果非 Web 情况下默认就是 StandardEnvironment

1
2
3
4
5
6
7
8
9
10
11
12
/**
* Get the Environment from the given registry if possible, otherwise return a new
* StandardEnvironment.
* 这个环境说的是一般为 servlet eg: StandardServletEnvironment 或者是 non web eg: StandardEnvironment
*/
private static Environment getOrCreateEnvironment(BeanDefinitionRegistry registry) {
Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
if (registry instanceof EnvironmentCapable) {
return ((EnvironmentCapable) registry).getEnvironment();
}
return new StandardEnvironment();
}

这个 Env 中包含了系统变量和Java 的环境变量,上面是java 系统变量,下面是环境变量:

image-20200128173025589

另外就是属性解析器:

image-20200128172928874

视频拍摄技巧杂记

切镜

1.跳切

人的动作不断的跳动,然后中间有一结是没有了 这就是被跳切了

2.贴合切

将人物的一个动作和另外一个细节动作相贴合 比如一开始人走过来 然后细节到 脚上 最后又到人走到镜头跟前。中间的细节部分就是我们的表现主体的一个时间和空间的位移 。

3.离切

和贴合切一样,但是不一样的是中间的细节转换成另外一个表现主体的一个画面,比如移动到一个鸟上。

相机的基本参数调整

  1. 对于曝光,我们可以使用曝光直方图来进行曝光检测,直方图的横向就是 0-255 纵向就是像素个数。我们最完美的曝光是能够让直方图均匀分布,并且两遍的位置都处于差点过爆差点欠爆的状态。除此之外外我们还可以使用斑马纹,对于过爆的地方就会显示出斑马条纹,提醒我们进行曝光减了。我们的曝光规则并不是宁欠勿过,而是宁右勿左。
  2. 对于光圈就是我们镜头里面的几个小扇叶,我们看到的 f1.4 f2 这类的参数就是光圈了,这个数值越大表示光圈越小,那么越小的话就意味更少的进量光整个画面也会更加的暗。因此我们可以通过调节光圈拍摄暗场景。同时光圈还决定了景深,光圈越大景深越浅,那么我们对焦点前后清晰区间就更小。会产生一个背景虚化的效果。但是注意光圈太大太小都不好。另外为什么是 f1.4 的下一档 f 2 因为光圈的计算公式是 光圈 F 值=焦距/光圈直径 而透光面积是 pi x r2 所以是和平方的倒数一致 ,那么 1.4x1.4 =1.9 2*2=4 所以是两档的区别
  3. 视频和拍照的快门速度,这个东西一般都是 1/50 这个东西因为在交流电的光下如果你的快门速度超过或者小于他就会导致频闪,可以调高快门获得额外的曝光,避免频闪就可以使用自然光或者打光
  4. ISO 他就是放大电路的值,所以会将所有的值放大,那么噪点自然就有了,而我们需要注意的就是这个东西并不是越低越好,也不是越高越好,因为有一个默认的 ISO 值,在默认的情况下他的画面是最纯净的,通常拍摄夜景的时候会把 ISO 放在光圈快门之后来获得最纯净的画面。

PR 技巧

基本的工具

  1. 波纹剪辑工具 B,在剪辑前一段素材的时候能够看到后一段素材第一帧的样子
  2. 滚动编辑工具和波纹剪辑工具类似 N ,但是影响的是两段素材,也就是增加第一段长度后面第二端也在减少,相当于把第二段删掉了一些
  3. 比率拉伸工具就是快慢镜头,快慢放一个东西
  4. 内滑:保证时间线长度不变 ,被鼠标选中的素材长度不变但是这个素材两侧的素材的入点和出点被改变
  5. 外滑:保证鼠标选中的这个素材的出点和入点不变素材在上边滑动 也就是说截取的素材的总长度是固定的就是素材需要展示的片段不一样而已

视频导入导出格式

PR 批处理技巧

  1. 对于效果的重复应用可以 ctrl+c 赋值效果,然后到 master 上粘贴效果 那么对于同一个素材的所有的片段都会被加上统一效果

  2. 对于一些效果我们希望给到另外一些素材,注意跨素材的方式上面的技巧就不适用了,我们使用 ctrl+c 复制,然后使用 ctrl+alt+v 粘贴效果

  3. 对于音频则是可以多个轨道批处理,首先选择音轨混合器image-20191027224627607立体声子轨道,然后需要的一起调整的轨道放到一个子混合里面直接调整子混合就 ok 了

    image-20191027224715219

快捷键

添加视频&音频转场 shift+D
单独添加视频转场 Ctrl+D
单独添加音频转 Ctrl+shift+D
切分素材 Ctrl+K
波纹剪辑 Q&W
延长剪辑至时间轴 Shift+Q&W
匹配帧 F
Shift+R 反向匹配帧
(反斜杠) 快速缩放
ctrl+(反斜杠) 隐藏项目栏
lt+方向键 移动素材(需要激活轨道)
Alt+Shift+方向键 快速移动素材
I/O 设置工作区 ;删除选区
’ 抽取片段
ctrl+加减号 缩放轨道宽度
shift+加减号 扩展/缩小所有轨道宽度
shift+123 快速切换窗口

Luts

这个东西的全名是 LookUpTable 也就是将画面中的颜色批量的替换成另外的颜色,Luts 大致分为两类,矫正 Luts 和风格 Luts ,一般我们会在添加 Luts 之前对画面的颜色进行调整,这样的效果是会被 Luts 再进行二次的映射,所以总的效果是在 Luts 的风格之下的。那么另外的就是如果在 Luts 之后调整就很容易突破 Luts 的限定,所以根据需求在添加 Luts 前后进行颜色风格的调整。

一般的我们可以建立一个控制调整图层来应用 Luts 然后整个的格调是统一的,然后我们分着对每一部分进行调整。

还有我们需要将所有的 Luts 导入到 PR 中避免每次都需要一个个选择。我们直接在 PR 中就可以预览我们的 Luts

最后我们调整好的 Luts 还可以直接导出 cube 然后给其他人用。

脱机文件

在我们的文件名在系统中修改了以后 pr 找不到对应的文件,然后就显示脱机,我们可以使用查找然后手动关联这些更改后的文件。

多个素材顺序自动插入

首先选择多个素材,然后点击自动序列匹配

无间隔删除

shift+delete 删除素材以后后面的素材会跟上来

提升和提取

提升就是把这段选中的出入点之间的素材删除掉,后面的素材不跟上来

提取则是删除并且后面的素材跟上

注意一点就是我们所有的操作在只会被应用到指定的轨道上面,如果那个轨道没有被激活则不会对他生效。

在我们选择提升的时候提升操作只会被作用域我们激活的视频或者音频轨道,例如这里只激活了音频关闭了视频。

假如我们使用提取的话就不一样了,视频和音频都会被干掉抽出,因为这个时候视频音频同步锁定的。我们取消视频和音频的同步锁定就好了。可以看到后面有因为去掉了音频的时间差。

插入素材

我们按住 ctrl 键+ 拖入素材素材会被插入到以前的素材中,而不会覆盖以前的素材

滚动条放大

选择一个面板使用 +/- 可以放大滚动条和缩小

使用 ctrl+ +/- 可以放大视频轨道

使用连续预览视频就可以看到更多的帧照片了。

默认插入素材的轨道

在最左边有两个 a 和 v 只能激活一个视频一个音频所以这个就是插入的时候默认的一个轨道

子剪辑

可以理解为素材中截取一段作为一个新的素材,我们选择入点和出点然后直接拖动到素材箱中就生成了一个子剪辑,但是这个的子剪辑名字所有的信息和原素材一样,而且在时间线上可以看到他有一个小三角也就是他的长度被限定了,我们希望生成子剪辑的时候限定一下名称和是否裁剪可以按 ctrl+拖动素材

取消修建的话在时间线上我们可以修改出入点的位置然后拖动而选中后就不行了,被裁减后的视频会有一个小三脚

标记

在时间线上打的标记就在时间线上然后在素材监视器中的标记就是素材上的。都可以用 M 来做标记

可以切换到标记面板直接查看我们标记点详细信息

九月份 Review:「遇见一群有意思的人」

​ 在车上看着路边飘扬着的红旗,才意识到九月就要结束了。这一个月发生了很多难过、开心和有趣的事情,想通过这篇文章总结一下,或者说记录这些美好,以后的某一天再看这篇文章依旧能够嘴角上扬。

应接不暇的需求

​ 从入职到九月将近一个月的时间,这一个月基本在熟悉流程用了一两个需求熟悉开发流程和集团中间件。接下来就是 99 大促双11 需求的支持和稳定性保障。

​ 这次 99大促章鱼狂欢城,是我第一次作为开发参与 S 级大促系统开发和稳定性保障,整个过程充满了挑战和艰辛,同时暴漏出自身大量的问题和不足,在技术、业务、思考方式等方面都有不同程度的纰漏和待改进的点。

技术

​ 每次大促都是排期短需求多,所以对于开发速度上有很高的要求,并且对于频繁变化的需求也要有相应的心里准备和代码框架设计,对可能变化的节点预测,留出足够的扩展点。

关于轮子

​ 在这次开发过程中有很明显的感触到如果很多代码不做抽象,下次需要用到相似的功能只能拷贝以前的代码做修改,代码中会出现大量的冗余,而且必须要一行行的理解别人的代码,有时候会觉得还不如自己写来的省事。但是注意一旦意识到这部分本来是可复用、可抽象、可被封装,那么这部分代码一定要有充分的设计,让这部分轮子具有较好的扩展性、健壮性以及易用性,否则你只是在逼迫下一个人必须造轮子,下一个看到你代码的人就是你现在的处境。既然花了时间投入到轮子的开发就应该产出优质的通用的代码。

​ 举个简单的例子,对于常常使用的 Excel 导出,我们通常会将 MapList 或者 BeanList 作为数据源,那么对于 BeanList 这种规整的结构使用注解驱动最合适不过了,后续的使用只需在 Bean 上写对应的注解。而 MapList 应该也有对应的工具将数据和列名绑定,最后我们只需要关心列信息。但事实上很多人都有使用到导出 Excel 功能,但是这些代码都分散在各个业务代码当中,一方面破坏了业务流程的完整性,另外没有可复用性。

代码规范

​ 看了项目中的很多代码,很少有人能写出自表达的代码,一方面是因为历史包袱,前面没有设计,而业务快速迭代导致后人只能加判断条件在原有代码上堆叠。另一方面需求多任务重时间紧,所以没有抽象只想着尽快实现功能尽快上线。而后者常常就是导致前者出现的原因。

​ 在互联网公司,快速迭代是最基本的要求,毕竟国内互联网公司不像外企对代码质量进行严格把控,项目时间也拖的很长。行业现状很难会有变化,而开发人员在短期内很难把自身水准提升到能写出自表达代码,所以目前最行至有效的解法是 注释 + 规范 对于复杂的业务逻辑尽量多用一些注释进行说明业务框架和思路,另外严格遵守 《阿里巴巴编码规范》中提到的点,保持代码风格统一。

效率

​ 在编码过程中,经常为了快速响应需求解决问题,看完 PRD 就开始 coding ,往往后来会发现这样一味的堆代码会导致很多问题变得难解,或者写出来的代码质量很差,有种拆东墙补西墙的感觉。

​ 所以理解和思考完需求后的第一件事应该是打草稿,画出业务流图,设计业务框架,明晰如何组织包和类,对于流程中的核心点算法如何实现,可以采用哪些设计模式明晰业务结构,可以使用哪些轮子简化开发等等……

​ 然后进行快速编码阶段,编码需要保证精力集中,避免因为被打断出现思维断线造成的 bug ,编码结束后使用静态检查工具,扫描可能存在的问题。尽量一次编码跑通,不要反复修改,减少部署系统所花费的时间。

后期规划

​ 看的代码太少,只有看的多了才会知道好代码是什么样子,才会明白原来这些地方有更好的设计。后面保持阅读优秀的二方包和集团中间件。目前只看了 Pandora 源码,总结成了 ATA ,后面计划整理 DiamondMateQ 源码,整理笔记。另外再看一遍 Pandora 主要看框架的设计,而非流程。

​ 以前的好习惯不能丢,对于出现的错误要勤于记录,错误原因 -> 排查思路 -> 耗时 -> 排查经验 -> 避免方案 给思维打补丁,让自己逻辑更缜密,对于一些常见报错,快速 troubleshooting 。 可以把这写问题记录都放到 csdn 上,形成自己的问题引擎。

​ 要保持对开源项目的接触和学习,来集团以后感觉和外部的技术脱节了,99 % 技术都是集团内部中间件,很少使用到新技术,保持对新技术的学习保持对技术的敏感度。

个人博客 好久没更新了 ,最新的一篇是在入职前写的,最近忙了也变懒了。保持输出,技术,思考,感想。保持每个月两篇博客。

业务

平台业务

​ 对于招商部分的业务不够了解,本来的预期是熟悉营销工作台中常见的功能,对于其中的一些专有名词也要熟知含义,理解系统中的业务层次,画出大致的结构图。重要的是每部分业务应该自己创建测试然后尝试跑通一个流程,并且要和代码对应上,这是一个长期的工作内容,因为把这个系统搞清楚是一件比较困难的事情,系统的复杂度和人员参与度都太高,以及额外的 DTS Job ,只能先一点点的摸索着部分业务和代码,归纳总结系统架构,熟悉大家的代码风格,和已经存在的轮子,至少要有些印象避免重复的轮子。

数据中心

​ 最近将近两个月的时间一直在做数据中心的建设工作,主要对阿里表格活动现场重写,还有双十一数据看板。为了以后更多的数据产品的出现应该有更详细的框架设计,沉淀系统快速响应能力,配置化能力,自动化能力。另外需要与前端打通,产出更多的业务组件与约定。

只见树木,不见森林

​ 大部分时间都被埋没在需求和修复问题中,很难看到自己所负责模块的全貌,对于部分熟悉但却不明白这部分的所处的位置和意义,这也是因为对于整体业务不够熟悉对平台的现状不能很好的把握导致的。这部分欠缺很难在短时间内得到填补,需要长时间沉淀和对业务的持续思考,才会有质的变化。

​ 看书对形成电商思维和框架是一种简单而行之有效的方式,多看看马老师写的书,多关注电商领域的行业动态。

百年阿里

紧张&期待

​ 很明白自己不太善于沟通,所以对这次百阿之旅带着紧张,对于快融入团队并不是很有信心。但是也很期待,期待够能突破自己,发现自己新的可能,简单来说变得更 Open ,认识一些小伙伴。令人欣喜的是,这份期待没有被辜负~

缘分

​ 缘分真的是一个很神奇的东西,一群来自不同城市、不同部门、不同年龄的人组成了这么温暖、团结、活力的 1227 百阿班。很幸运来到 1227 ,很幸运来到 三生万物 ,很幸运遇到你们,遇见新的自己 ~

​ 感谢百阿让我遇到这么一群,有趣的、热情的、可爱的、灵动的、温情脉脉的人。

破冰

​ 一圈自我介绍后,其实我一个人名都没记住,虽然当时每个人自我介绍完后我都会重复好几遍,重复着重复着就忘了~原谅我的烂记性不是不想记住你们!!!不过最后认人名 PK 环节,我可是能叫出全班人的名字,得瑟一下。

​ 印象比较深刻的是五个小游戏任务,大家在互相还不熟悉的情况下能够做到相互信任、团结一致、互相帮助,用智慧和合作共同创造价值,取得成果。很多环节很辛苦也充满了困难,但我们在短时间内形成的超强凝聚力和执行力,让团队势如破竹,朝着目标冲刺。在这个过程中出现了很多小彩蛋,在 “达芬奇密码” 环节大家看完规则你一句我一句着的说着游戏规则,我还没听懂规则是啥,天相突然跳出来说了一个听起来很牛逼的调度算法,目瞪狗呆。又是一个算法怪兽,规则看完调度算法就出来了,感觉智商受到了降维打击…..

​ 由于算法对于调度者依赖性太高,对调度内存是一个很大的考验,为了保险起见我们采用了两趟遍历,虽然中间出了小插曲,导致牌序混乱。大家都一脸懵逼的时候,天相挺身而出力挽狂澜,终于体会到什么叫做:“此时此刻,非我莫属!”

游戏任务
十只脚落地
安全部门合影

凝聚

经过第一天的破冰,第二天大家慢慢开始变得熟悉起来,尤其是在这次的土话的探寻中,团队更加凝聚。第一次见到阿里土话是在公司的大屏上:“此时此刻,非我莫属” 这是我记得最清楚的一句,也是最感动我的一句。

因为信任,所以简单。整个探寻任务从分工到执行只在很短的时间,没有过多的担心某个环节出问题了怎么办?某些子任务完不成怎么办?我们相信大家都能够把自己的那一部分做的很精彩,都很自觉的专注于自己的部分,相信伙伴,一切变得简单起来。

一点多才开始剪视频,又感受了一把速度与激情,有一种五点前赶发布的感觉。既要冷静又要快速响应,在大家的共同努力下,开讲前视频渲染结束。

晚上一起去庆功呀~ 5号食堂!

结束后,弦柱在群里说了一句,“今天聊的很开心,好像又回到了学生时代!”对的!就是这种感觉,好放松~

变化

昨天还在一块团队任务,马上就要因为另外的任务分开。“拥抱变化” ,变化来的如此之快。在弦柱的带领下我们完成了对飞猪业务的探寻,让我重新认识了飞猪,她的历史,现状,困难与机遇。对于从来没接触过的 OTA 也有初步的了解。

在这个团队最大的感受就是有活力,因为我们的队长 — 弦柱(未来的杭州市旅游局局长) 就是一个很有活力的人!对团队也非常认真负责,带着我们去飞猪部门探索,采访!准备演讲到凌晨两点多,辛苦啦~

夜谈

对这个环节印象也非常深刻,每一个人的分享都好像是一本十分值的回味的书,透过他们的讲述读到不同的精彩故事。通过他们的精彩看到自身的不足,通过他们的失落看到逆境中的坚韧,每个人的经历都很有意思,可惜时间不够不然肯定整整一晚都在谈心交流。

不得不说十分佩服 泰伯,一个敢闯、敢拼、敢探索。知道自己想要什么,追求的是什么,并且付诸于行动,很少人能有这种想法和魄力。放一张大佬的照片,像不像香港扛把子 , haha~

公益

公益真的是一件帮助他人幸福自己的事情,在这个过程中能认识到自己的价值,也能为他人创造价值。公益能够感染身边的人,让更多的人以一颗柔软的心来对待这个世界。有很多同学反映在做公益的过程看到很多许多人的善举,就像马老师所说的要时刻保持爱,对社会、对自然、对身边的人,爱的力量小而强大。做一个内心温暖而强大的人。

公益后的 “总裁局” 也是让人十分放松和开心,好久没和这么多人一起开开心心吃吃喝喝玩玩了。

阿里

这就是阿里,以前我们会说:“这是阿里”,但是现在我们会告诉别人:“这就是阿里!”。因为现在的我们是一个不追求大,不追求强,我们追求成为一家活102年,截止到2036年,服务20亿消费者,创造1亿就业机会,帮助1000万家中小企业盈利的好公司。

对于新六脉神剑价值观,并不是为了改变我们的想法,或是束缚我们,而是在这个共识下选择同路人。价值观并非口号而是我们看到不论是少年阿里还是成年后的他一直都在用实际

另外对于年轻人,保持自己的好恶和棱角很重要,每个人都拥有对机会的选择权!

在阿里必须要遵守规则,在自身利益和公司里冲突的时候以公司利益优先,保证公司数据安全,不要做触碰公司红线的事情。

“活着”

来到阿里的第一年最重要的是 “活下来” ,因为作为一个新人很难融入到节奏走么快,业务难度这么高,新人培训少的团体。我们最重要的不是说想着如何实现集团的大目标,保证自己能够活下来,landing — 技术落地,业务落地。要明白自己生存在一个什么样的环境,去了解这个环境,适应这个环境。

而三到五年的沉淀,才能真正成为一个真正的阿里人,这个时候就需要面对更过的变化和更快的节奏,多从自身去思考问题。

伙伴

感谢在这次遇到的优秀的小伙伴们,因为我相信 无论我遇见谁,他/她都是我生命该出现的人,绝非偶然,他/她一定会教会你一些什么。

属七:感谢我的小天使,看得出来你是一个温暖的、热爱生活的人。从礼物的包装上,看得出你花了不少心思,真的非常感动。尤其是你的赠言充满了鼓励与期待,谢谢!你的字写的真的很棒~

弦柱(局长):阳光、帅气、自信、具有少年感。跟他待在一块感觉自己又回到了大学校园,轻松愉悦!

余征:认真、严肃、细致。短短几个月就减掉 1/3 的体重的毅力,令人钦佩。

泰伯:敢闯、敢拼、有想法。看起来是一个很严肃的大佬,其实是很好相处的大佬!感谢鼓励陪伴!

拾月:博学、美丽、有气质。第一眼就被气场震撼到了,除了气质还有博学多识!

星吟:自律、美丽、脑洞大。每次不鸣则已,一鸣惊人,一句吐槽能让我笑一两分钟,苹果肌要坏掉了~

珺兮:聪明、文静、可爱。都是应届生相似点还蛮多的,也能说到一块去。可爱!有趣!

天相:自信、认真、有责任、有主见。令我印象深刻的不用一次性杯子盛可乐,因为不环保!!!

迪奇:聪明、好奇心、冷幽默。我们的数据中台,反应快,技术强,感觉内心也很萌哈哈,我们技术人的楷模。

久谙:幽默、有趣、情商高。思维太活跃了,想象力也超级棒,一句话带动全场气氛!

山魏:认真、戏精、沉稳、可靠。因为角色投入一炮而红,红遍大江南北!但是也非常的可靠,做事认真、结果导向~

顺序不分先后 ,按照 “总裁饭局” 次序,希望下次再相见,我们还能按照这个顺序坐在一起,聊天喝酒!

优秀的人大多会玩儿,幽默,会来事儿,正是因为这些特质,能够吸引并凝聚一波人,作为一个不太说话的程序员,应该培养锻炼自己让自己变的活跃,open!这次百阿是一个良好的开端。感谢认识你们,真的很开心~