长缨在手,何日缚苍龙。
疫情久久不去,半年时光眼见就没了,感叹间又无可奈何。
久居在家,花草为伴,唯祈亲友平安,静候云开日出雨过天晴。

总结不是公司的要求,而是个人前进的阶梯。

要谈刚过去的这一年的进步,有必要先回顾个人非常感兴趣的三大技术方向:

  • 微服务
  • 大数据
  • 人工智能

之前有望进军区块链,可惜碰到的区块链公司太穷。
人生苦短,肯定不能去做没有钱途的事啊,所以现在对区块链没有兴趣了。

有人会说,你不应该谈谈帮助公司取得的成就、业绩等等吗?那些是另一个维度的事情了,暂时不表。
只谈有进步的事,大致如下:

1)继续微服务实践,在某家公司负责微服务系统平台。

现在人人都能对微服务谈天说地指手画脚,其实千奇百怪各有不同。
这家公司软件模块划分得不错,比上一家更为合理(你看得没错,我在不同公司都负责过JAVA微服务),功能也更全面,唯一的不足是spring cloud搭上了dubbo,我认为这是一大败笔,dubbo可以休矣。
整体而言如能确保小程序员们理解现在的架构,那么问题就不大,不过要做到这点也不容易,毕竟他们的经验是相当相当地欠缺啊。
目前我已经离开这家公司,这段经历加深了对于dubbo的理解,这是个架构中的反模式。

2)工作流

这个比较专业一点,DDD设计导向,比较有意思,两家公司在用。

3)大数据

这是新公司的事,大功告成估计还要归到今年的成绩里面,我超一流的学习能力又要开始启用了。

4) K8S

虽然K8S已经一统江湖,但是不懂的人依然很多。
下半年仔细研究了CNI,大二层果然大。

5) 版本管理

我在2月份的进步录中写过我对于软件版本管理的思考,主要是因为之前那家公司的分支太多了,后来跟负责深圳那块的谈过。
很多人都知道正确的方法,但是却没有付诸行动,这是谁的责任呢?

6) 数据库

为了配合数据库国产化,精心编写了数据库自动适配器,难度不大,节约了一群攻城狮的时间(此处应该有雷鸣般的掌声)。
当然这个事情顺利进行的关键还有深圳和西安研发同事的支持,不然注入各个分散的微服务也是一件很麻烦的事情。
离职那天下午老板又夸我国产化干得漂亮,其实吧,这对我没那么重要,重要的是我解决的分库分表问题,有难度有挑战,普通人无能为力。

7) 吊打面试官

我有十几年担任技术面试官的经验,所以我会从不同角度审视不同的人,包括面试官。
不知道为什么,越来越多的人不但不会因为技术上的无知而感到耻辱,反而敢于当面显摆自己的无知。
有人问我2010之前怎么没在写微服务,我说:“一个人年纪再大,大不过他爸,不好意思,你自己去补历史吧。”没有一个脏字。

哈哈,有意思的一年过去了,期待2022年我能取得更大的辉煌。

  • 专利号: CN106130874B 融合多通信方式的企业一体化信息处理方法
  • 专利号: CN103595560A 一种用于无线路由器自动配置的方法
  • 专利号: CN102780610B 网关QoS保障方法及分组交换网络系统
  • 专利号: CN102143414B EPON中局端设备与终端设备间实现网络连接测试的方法
  • 计算机数值模拟冲击载荷下应力波的传播过程 西北工业大学

个人介绍:

定居上海徐汇,久浸Linux,擅长云平台,深谙团队管理之道,余者无数不足道。

Oriole

Dream Begins

统一的java接口版本管理模块。

本方案常见于Spring项目,属于软件系统中的高级方法,

是本人利用半夜创作的个人开源项目,与企业无关。

效果

用法

依赖

1
2
3
4
5
<dependency>
<roupId>top.zhouxiaoxiang</groupId>
<artifactId>oriole</artifactId>
<version>1.1.1</version>
</dependency>

控制器

1
2
3
4
5
6
7
8
9
@RestController
@RequestMapping
@V(2)
public class DemoController {
@GetMapping
public String get() {
return "";
}
}

访问接口

  • 支持的版本

http://localhost:8080/v2/

  • 不支持的版本

http://localhost:8080/v1/


業界で比較的成熟したソリューションである統合Javaインターフェイスバージョン管理モジュール。

デーモン

手順

pom.xmlの内に下記を追記する。

1
2
3
4
5
<dependency>
<groupId>top.zhouxiaoxiang</groupId>
<artifactId>oriole</artifactId>
<version>1.1.1</version>
</dependency>

コントローラのクラス

3行目の@V(2) アノテーションを利用する。

コントローラーは単純化ブール値 true を返します。

1
2
3
4
5
6
7
8
9
@RestController
@RequestMapping
@V(2)
public class DemoController {
@GetMapping
public Boolean get() {
return true;
}
}

実行して確認する

これで「http://localhost:8080/v2/」にアクセスすると「true」が表示されます。

また上記の場合は「http://localhost:8080/v1/」にアクセスするとBad Requestエラーが発生します。

  • 正しいバージョン

http://localhost:8080/v2/

  • 間違ったバージョン

http://localhost:8080/v1/


A unified java api version management module of SpringCloud-based microservices.

Demo

Usage

pom.xml

1
2
3
4
5
<dependency>
<groupId>top.zhouxiaoxiang</groupId>
<artifactId>oriole</artifactId>
<version>1.1.1</version>
</dependency>

controller

1
2
3
4
5
6
7
8
9
@RestController
@RequestMapping
@V(2)
public class DemoController {
@GetMapping
public Boolean get() {
return true;
}
}
  • right

http://localhost:8080/v2/

  • wrong

http://localhost:8080/v1/

  • 独立编写Java多租户路由组件,代码无侵入,使用简单;
  • 查清了sharding-jdbc分库分表一个隐蔽的BUG,所有使用该组件的公司应该都存在这个问题,除非没有正式使用;
  • 修复Mybatis封装DTO到PO的BUG,封装有时也是灾难的源头;
  • 捋了一把Mybatis的四大核心组件;
  • 思考公司各个微服务之间依赖版本混乱的问题,应该是对私库过度倚重所致,加之软件修改没有保持向后兼容;
  • 重新思考了GIT分支管理的最佳实践;
  • 吸收K8S的企业应用技术,探明了与原生的联系和区别;
  • 提供分布式事务的方案和代码;
  • 训练神经网络模型,保持python的手感;

其实还是蛮复杂的。
看图

故事

我很喜欢苹果笔记本和IDEA的组合,轻快流畅还省电,缺点很少,就一个字:贵。

我以为集团里面大家都一样,后来有位同事请我帮他处理问题,我根本用不惯他的系统,视觉效果很差,反应慢得像只老王八,这才发现原来我还是享受优待的少数人。

苹果笔记本好用,Homebrew功不可没,有了它,基本上所有的软件都可以一行命令完事。它的作者Max Howell相当有趣,这里是他6年前(2015年11月6日)的一个帖子:

Google: 90% of our engineers use the software you wrote(Homebrew), but you can't invert a binary tree on a whiteboard so fuck off.

说的是他去面试当今全球第一的科技公司Google,结果铩羽而归,结论我稍微翻译如下:

我们90%的工程师用你写的软件Homebrew,而你竟不能手写二叉树反转程序,所以滚吧。

当时我很震惊:Google对员工真慷慨,至少90%的工程师都用苹果。

然后我觉得Google确实是技术型的公司,跟很多公司不一样。

很多公司是什么样子?我经历过不同的公司,见识过很多人,讲一个真实的经历,是某个公司的CTO问为什么在简历里面放我的github,我在解释之前,问他知道github是什么吗,他说不知道。

不知道github的CTO?我呸。

反转二叉树


public Node invert(Node root) {
    if (root == null) {
        return null;
    }

    // 转换左子树
    Node left = invert(root.left);

    // 转换右子树
    Node right = invert(root.right);

    // 左右对调
    root.left = right;
    root.right = left;

    return root;
}

一连串的问题

Mybatis查询条件的处理流程

为了解开公司封装代码查询错误之谜,只能深入虎穴一探究竟。
结果是封装代码对于查询用法考虑不周,加上一个无参策略即可。

每个公司基本都会对框架提供封装,封得住还好,封不住问题就大了。

Sharding-JDBC连接中断

常见的8小时断开问题,不过,常见的解法都没用。
需要计算好检查和重连时间,避免累加到8小时之后。

版本之乱

微服务项目太多,之间的版本关联太强,牵一发而动全身。
编译了一个项目,基本上所有的基础项目都要编一遍。
还好有所有项目的代码,只负责一个项目的人怎么办?

思考

做好技术只是完善自我,做好技术管理才是影响公司的大事。

一个公司脱离了草莽阶段之后,就应该在体系上进行投入,着力于正规化的建设,避免不断交学费。

人员规划

  • 技术带头人(技术背景是前提)
  • 开发人员
  • 测试人员
  • 运维人员

项目规划

根据公司业务和人员特点,选择瀑布开发还是敏捷开发。
要求组织者必须有实际的经验,能及时发现和纠正问题。

文档规划

  • 需求说明文档
  • 需求评审文档
  • 软件架构文档
  • 数据库设计文档
  • 测试用例
  • 测试报告
  • 软件部署文档
  • 服务器使用规范

技术规划

  • 软件代码规范
  • 软件发布规范
  • 软件设计文档

万王之王传奇录第一回 不测风云

天下事,
看不清时以为假,
看得清时以为真,
真真假假分不清,
恍恍惚惚几十年,
若放弃,人生戛然而止,
若坚持,某时可能豁然开朗。

一代大家司马光曾经赞洛阳:

洛阳春日最繁华,
红绿荫中十万家。

洛阳城,以牡丹出名是从隋唐开始,然而早在东汉初年,天下平定、四海罢兵之时,作为帝国京师,已是繁花似锦美不胜收,车水马龙络绎不绝。

班超此时三十有余,任职政府文秘,抄抄公文,悠闲度日,日复一日,年复一年,虽然并不富裕,尚能应付一人吃喝。

十载春秋一晃而过,其父突然一病不起撒手人寰,其母年事已高生活贫苦,班超想起父亲生前才华横溢,深得先帝赞誉,本可飞黄腾达,但却一心修史,唯有两袖清风,现在家中已是负债累累,不免心如刀割,然而不忍老母难受,于是独自跑到父亲墓前仰天大哭,一时天昏地暗风雨交加,倒在地上竟然昏睡过去。

经过此事,班超每每工作期间,常会发出一声叹息,喃喃自语道:“人生在世,当带三尺之剑,立不世之功。”众人都是习文之人,听见莫不暗笑,以为他精神受了刺激,只当是胡言乱语,全不放在心上。

洛阳城北,黄河之滨,有北邙山,横亘数百里,连绵起伏,共三十三峰,以翠云峰最高,峰顶松柏森森,绿荫葱葱,据说道祖曾于此修炼,又因常年云雾缭绕,世人传言此间有仙人出没。

从翠云峰凭栏北望,可见滔滔黄河奔腾不息,班超很喜欢这里,面对苍茫大地,用尽全力大声喊道:“人生在世,当带三尺之剑,立不世之功。”山川回音激荡不停,让他很是满意,却不料身后有人道:“孺子可教也。”

回身一看,是一老道,仙风道骨,手执佛尘,班超诧异之余,拱手道:“道长有何指教?”

“我观你面相不凡,千秋功业已在眼前。”

“面相不凡?千秋功业?”班超虽然一脸惊讶,心中不禁大喜,赶紧向前一步,“道长此话从何谈起?愿闻其详。”

老道一甩佛尘,不紧不慢地说道:“我看你下巴如燕,脖颈如虎,飞能食肉,万里可称侯。此等面相断非凡人,多加努力,不要枉付此生。”

他年岁虽高,却声如洪钟,字字如雷贯耳,听得很是真切,班超不由得想起早年间的一段往事,先帝刘秀年轻时身为平民无人赏识,独有南阳术士蔡少公见过一面后说“刘秀当为天子”,此时正巧国师刘歆改名为刘秀,于是大家不约而同,认定蔡少公所言必指国师,不料刘秀却半笑不笑地说:“如何断定不是我呢?”众人哄堂大笑。后来的结果是:国师刘歆惨死,平民刘秀荣登大位。由此面相一说越传越神,由不得人不信。只是刘秀起兵之时,正值王莽篡位导致民怨沸腾战乱四起,正所谓乱世出英雄,本朝又有遗训“非刘氏而王者,天下共击之,若无功上所不置而侯者,天下共诛之”,刘秀上得天时兼有皇族血缘,当上天子也在情理之中,然而时过境迁,现在国泰民安四海升平,高官厚禄尽是功臣后代囊中之物,自己区区一介书生,又如何能够出人头地?


后记

小说第一回在头条和简书都有发布,记录到主页只是为了让更多人看到而已,作者均系本人无疑。
背景放在遥远的东汉,距今已有千百余年,那时那景,你我皆不可知,不过,相信有生活经验的人读下来,总有一处会让你发出会心的一笑,唯此我愿足矣。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×