悄咪咪提升团队幸福感 & Surprise!

前言

本文的灵感是在几个月之前工做不忙(摸鱼)时想到的,总是本身一我的往前冲冲冲也没啥意思,须要想一点办法,来提升团队的效率,提升团队的幸福感(效率起来了,单位时间内代码写的更多,那不就幸福啦 😜),通过几个月的摸索,总结出了几个小点,若是你们有更好的方式,欢迎一块儿讨论~html

<br/>mysql

永久解决不知道是什么版本

我司的产品主要分为Saas端和私有平台,分别部署在公网和客户的私有环境,先来讲说私有环境的问题:不知道真正部署的项目版本,说来很好笑,运维同窗在部署的时候确定是记录过各个客户的代码版本的,但也就是这么好笑,有时候就是会弄错,多是因为升级流程不够完善,或者工做失误等等,总之,想个办法解决。nginx

<br/>git

人靠不住,但还有代码。Git已经成为代码管理的事实标准,这就很少说了,即然人管理很差版本,那仍是从Git自己入手吧,悄咪咪的给全部项目依赖(POM.XML)增长一个插件:程序员

<!-- Git Version插件 -->
<plugin>
    <groupId>pl.project13.maven</groupId>
    <artifactId>git-commit-id-plugin</artifactId>
    <version>4.0.0</version>
    <executions>
        <execution>
            <id>get-the-git-infos</id>
            <phase>initialize</phase>
            <goals>
                <goal>revision</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <dotGitDirectory>${project.basedir}/.git</dotGitDirectory>
        <verbose>false</verbose>
        <dateFormat>yyyy-MM-dd HH:mm:ss</dateFormat>
        <prefix>git</prefix>
        <generateGitPropertiesFile>true</generateGitPropertiesFile>
        <generateGitPropertiesFilename>${project.build.outputDirectory}/${project.name}.build.json</generateGitPropertiesFilename>
        <format>json</format>
        <gitDescribe>
            <skip>false</skip>
            <always>false</always>
            <dirty>-dirty</dirty>
        </gitDescribe>
    </configuration>
</plugin>

插件将会在每次构建时生成一个版本相关文件,内容以下:github

{
  "git.branch" : "master",
  "git.build.host" : "Kerwin",
  "git.build.time" : "2020-08-12 23:24:59",
  "git.build.user.email" : "34807944+kkzhilu@users.noreply.github.com",
  "git.build.user.name" : "kkzhilu",
  "git.build.version" : "1.0.0-SNAPSHOT",
  "git.closest.tag.commit.count" : "",
  "git.closest.tag.name" : "",
  "git.commit.id" : "4981afb5dfeee6f835dcf9a7a135083d8e973090",
  "git.commit.id.abbrev" : "4981afb",
  "git.commit.id.describe" : "4981afb",
  "git.commit.id.describe-short" : "4981afb",
  "git.commit.message.full" : "Commit git-version",
  "git.commit.message.short" : "Commit git-version",
  "git.commit.time" : "2020-08-04 18:18:47",
  "git.commit.user.email" : "34807944+kkzhilu@users.noreply.github.com",
  "git.commit.user.name" : "kexianming",
  "git.dirty" : "false",
  "git.local.branch.ahead" : "0",
  "git.local.branch.behind" : "0",
  "git.remote.origin.url" : "https://github.com/kkzhilu/KerwinBoots.git",
  "git.tags" : "",
  "git.total.commit.count" : "9"
}

插件名字叫:git-commit-id-plugin,至于细节使用就本身去搜索啦,它能够实现的效果即在每次打包时生成相应的Git相关信息,这样不管运维同窗是否把代码升错,咱们均可以知道代码究竟是什么版本web

之后终于听不到同事之间由于代码版本扯皮的事情了🤪算法

<br/>spring

永久解决没打日志怎么办的问题

回到刚刚说的Saas端生产环境,因为各类缘由,咱们团队常常须要维护不是本身写的项目,不少时候一些细节逻辑彻底摸不着头脑,并且没有日志,最要命的是在测试环境还不复现,肿么办?sql

<br/>

之前的解决方案是各类喊人,而后硬看代码寻找上下文,尽量的找到蛛丝马迹,总之效率很是感人,处理的慢了就是一个事故,全员挨批评,咋办呢?我就一直在寻找这种问题的解决办法,终于我发现了一个神器:Arthas

<br/>

用过这个工具的人就知道它有多强大,阿里出品,官方文档连接:https://arthas.gitee.io/comma...

咱们能够经过其提供的部分命令,如:tt获取方法执行数据的时空隧道,它能够记录下指定方法每次调用的入参和返回信息,想一想它的帮助有多大,记录每个方法的入参和出参,若是真赶上没日志的状况,知道这些信息其实配合代码就能够很快定位问题了,因此,听过没用过的朋友,都去试试吧,真的很无敌。

下次同事有难时,你就用这个工具去帮他,他说不定会请你吃顿饭🍗

<br/>

永久解决哪里耗时这么长的问题

这个问题是因为以前同事重写了一块业务逻辑,结果线上展示层耗时大概30s,oh,天哪!在测试环境明明是一瞬间的,咋办?

形成这种问题的缘由,确定是SQL写的很差,或者业务处理哪里作了不少没必要要的动做(咱们没有灰度测试),可是生产环境又不能随便动,也不能断点调试,从日志也只能看到耗时很长,可是慢在哪里不知道。

<br/>

当一个方法里面通过了N个内部方法后,你不知道究竟是哪个致使这么长的耗时,当没法复现的时候怎么办呢?其实仍是利用上面的那个工具Arthas,仍是同样的命令tt,它不只能够记录入参和出参信息,还能够记录每个方法的耗时,多么的强大。

<br/>

因此我是为了再次提醒,这些功能只是Arthas的一点皮毛,我们要学会合理使用开源工具

<br/>

注释没法表达流程图效果的解决方案

注释是文字,难以表达如流程图通常的效果,因此该怎么办呢?我找到了两种解决方案,目前在项目中使用效果很是之好,第一钟是利用ASCII注释工具,该工具的地址:http://asciiflow.com/

效果以下:

注释以下:

+-------------------------------+
|                               |
|  +-------------------------+  |
|  |                         |  |
|  |           Demo          |  |
|  |                         |  |
|  |                         |  |
|  +------------+------------+  |
|               |               |
|               |               |
|               |               |
|               |               |
|               |               |
|               |               |
|               |               |
|               |               |
|               |               |
|               +------> False  |
|               |               |
|               |               |
|    True   <---+               |
|                               |
+-------------------------------+

这玩意画出来的图是能够直接复制成文本的,控制好尺寸就能够解决大部分状况,也能够想象以前网上有一些很奇葩的注释是否是就是用这个工具或者一样的原理画出来的,附上一副以前文章缺的一张图:

上亿数据怎么玩深度分页?兼容MySQL + ES + MongoDB:https://juejin.im/post/685003...

这篇文章写完的时候,我本身方案的图还没画好,因此不少朋友问我用id实现不了什么的,此次就顺便展现一下个人方案

解决方案之二,利用MarkDown的原生画图功能,我不知道要发布文章的平台支不支持,因此用截图来代替了(Typora支持

不知道的同窗搜一下,MarkDown绘图语法,拿一个适合的改就行了,不必专门去学,放到代码里看看效果:

有一个小Tips,使用IDEA的时候,利用鼠标滚动键能够按块复制,这样一来能够直接复制到指定的注释内容,而后把它复制到任何一个正常的MarkDown工具里,就能够展现流程图了,简直不要太完美,想测试的朋友能够复制如下代码去一些工具里试试,须要设置代码种类为:mermaid

sequenceDiagram
    Note over Boot: 启动类
    Note over PDFThread: 线程类
    Note over PDFWorker: 执行类
      Boot->>PDFThread: Boot类启动线程
    PDFThread->>PDFWorker: 线程类调用真正工做Worker
    loop 队列处理
        PDFThread->PDFThread: 考虑成功与失败状况处理方案
    end
    
    PDFWorker-->>PDFThread: Worker响应执行结果
    Note right of PDFWorker: 注意参数校验 <br/>文件格式校验

你将来的同事维护代码的时候会爱上你,若是是女生,可能还会嫁给你🧡

幻想有一天你老大跑过来问你,你这写的注释都是些什么玩意,而后你一复制一粘贴,一张图就出来了!下次涨薪会没有你?

(反正我涨了,还很多😎)

<br/>

PS:我考虑写一个支持直接复制而后渲染成流程图的IDEA插件,若是有现成的请联系我,就省的我去写了,嘿嘿✌

<br/>

垃圾SQL的解决方案

咱们公司没有专门的DBA,因此SQL语句的质量只掌握在开发和开发组长的手上,有时候事情多,或者不细心,或者模块不是很重要就容易粗心,到了生产环境出大问题,针对这种状况的解决方案依然是寻找工具,好比,我盯上了小米的`Soar

项目地址:https://github.com/XiaoMi/soar

官方的介绍:

  • 跨平台支持
  • 目前只支持 MySQL 语法族协议的 SQL 优化
  • 支持基于启发式算法的语句优化
  • 支持复杂查询的多列索引优化(UPDATE、INSERT、DELETE、SELECT)

贴个图片展现一下效果:

这款工具能够进行对SQL进行打分,同时提供一些建议,它的能力上限咱们尚未摸索出来,可是下限仍是能够确定的,所以以后只须要关注索引是否正确使用,其余的就交给这个工具吧,低于90分,就改!

PS:这个开源项目推荐使用docker安装,简单粗暴无脑省时间,命令以下:

# 安装镜像
docker pull becivells/soar-web

# 运行
docker run -d --name Soar-web -p 5077:5077 becivells/soar-web

想着有个工具会检查SQL质量了,是否是写的时候也认真多啦,幸福感提示满满,哈哈~😁

<br/>

懒得写文档的解决方案

方案设计的文档不可能由工具去写,可是简单的数据库字段映射,或者接口文档总不须要开发去写吧?也是同样摸索摸索,找到了几个不太适合可是靠边的开源项目,如:

apidoc:https://github.com/apidoc/apidoc

RESTful web API Documentation Generator.

<br/>

JApiDocs:https://github.com/YeDaxia/JA...

A magical api documentation generator without annotation for springboot.

<br/>

APIAuto:https://github.com/TommyLemon...

机器学习测试、自动生成代码、自动静态检查、自动生成文档与注释等,作最早进的接口管理工具

<br/>

由于每一个项目的状况不一样,可是我又不想作大的改动,因此只能说是靠边,不能百分百适合,但有了这些开源项目,我就能够改写其中的代码,让它适应当前项目的注释方案等等,老是,能节省至关一部分的编写文档的时间

<br/>

重复性代码的解决方案

这个的确是个大坑,谁让我们是CRUD程序员呢,常常须要写重复性至关高,可是又有一点不一样的代码,这里个人解决方案是利用模板 + 更合适的工具解决,若是只是数据库操做层重复代码多,咱们彻底能够利用mybatis-plus工具减小重复代码,又或者写出公共的操做层减小重复代码。

<br/>

当用工具完不成的时候,我就会用上模板了,好比直接我写过一个简单的开源项目:

好像很厉害的生成器!一秒钟搞定一个项目:https://juejin.im/post/684490...

核心思路和要求以下:

  • 基于数据库获取原始数据
  • 基于模板 + 原始数据生成可运行的SpringBoot项目,支持界面 + 基本增删改查
  • 提供拓展式接口,能够实现不修改代码生成全新的文件

<br/>

那利用这种思路,其实彻底能够写一套更开放的代码生成模板,好比根据传递的JSON报文去解析数据,根据传递的模板去生成数据,这样的话又能够解决至关大一部分的重复工具,你,值得拥有。

PS:同理,其实数据库字段映射文档也能够用这种方式,只须要一秒钟,简直不要太舒服🤷‍♂️

<br/>

重复性的操做用脚本代码

这个其实你们都有意识,可是有时候就是感受可能用的很少,真要用起来的时候又没功夫去写脚本,好比进入一个docker容器,若是用命令行的话,至少要经历两步代码,十几秒的时间,若是写一个脚本呢,之后进入容器只须要一秒钟,因此我给团队写了很多这种脚本,其实我一开始也不会,反正就复制来一个改一改就行,以下是进入docker容器

#使用说明,用来提示输入参数
usage() {
    echo "Usage: sh 执行脚本.sh [rpcapp|tomcat|nginx|mysql]"
    exit 1
}

rpcapp(){
  DOCKER_ID=$(docker ps | grep "rpcapp" | awk '{print $1}')
  docker exec -it $DOCKER_ID bash
}

tomcat(){
  DOCKER_ID=$(docker ps | grep "tomcat" | awk '{print $1}')
  docker exec -it $DOCKER_ID bash
}

nginx(){
  DOCKER_ID=$(docker ps | grep "nginx" | awk '{print $1}')
  docker exec -it $DOCKER_ID bash
}

mysql(){
  DOCKER_ID=$(docker ps | grep "mysql" | awk '{print $1}')
  docker exec -it $DOCKER_ID bash
}

#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
  "rpcapp")
    rpcapp
    ;;
  "tomcat")
    tomcat
    ;;
  "nginx")
    nginx
    ;;
  "mysql")
    mysql
    ;;
  *)
    usage
    ;;
esac

<br/>

从网上找了找,又找到一个开源项目用以记录经常使用的脚本

useful-scripts:https://github.com/oldratlee/...

能自动的就不要每次都手写啦,节约时间去摸鱼不快乐吗👏

<br/>

最后

这但是我这么久以来总结的时间管理神器,节省的时间拿去摸鱼学习,循环促进效率和能力,造成良性正反馈

这还不值得来个赞👍👍👍吗?嘿嘿~

另外能够搜索公众号「 是Kerwin啊」,一块儿进步!

也能够查看Kerwin的GitHub主页,关注一个小白程序员的进步,这货最近在折腾Go~

相关文章
相关标签/搜索