为啥我觉得应该谨慎使用Lombok

Lombok是一款非常实用Java工具,可用来帮助开发人员消除Java的冗长代码,尤其是对于简单的Java对象(POJO)。它通过注释实现这一目的。 如果大家对于Lombok比较了解的话,可以先跳过这一段,直接往后看,如果不是很熟悉的话,可以简单了解一下。 想在项目中使用Lombok,需要三个步骤: 一、IDE中安装Lombok插件 目前Lombok支持多种IDE,其中包括主流的Eclips、Intellji IDEA、Myeclipse等都是支持的。 在IDEA中安装方式如下: 二、导入相关依赖 Lombok 支持使用多重构建工具进行导入依赖,目前主要支持maven、gardle、ant等均支持。 如使用maven导入方式如下: 1 2 3 4 5 6 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> <scope>provided</scope> </dependency> 三、代码中使用注解 Lombok精简代码的方式主要是通过注解来实现,其中常用的有@Data、@Getter/@Setter、@Builder、@NonNull等。 如使用@Data注解,即可简单的定义一个Java Bean: 1 2 3 4 5 6 7 import lombok.Data; @Data public class Menu { private String shopId; private String skuMenuId; private String skuName; } 使用@Data注解在类上,相当于同时使用了@ToString、@EqualsAndHashCode、@Getter、@Setter和@RequiredArgsConstrutor这些注解,对于POJO类十分有用。 即自动帮忙给例子中的Menu类中定义了toString、Getter、Setter等方法。 通过上面的例子,大家可以发现,我们是好用@Data注解大大减少了代码量,使代码非常简洁。这也是很多开发者热衷于使用Lombok的主要原因。 另外,关于Lombok的使用,不同人有不同的看法,因为很多人都使用过Lombok,对于他的优点都比较了解,所以接下来我们重点说一下Lombok的使用会带来哪些问题。 Lombok有什么坏处? 强X队友 因为Lombok的使用要求开发者一定要在IDE中安装对应的插件。 如果未安装插件的话,使用IDE打开一个基于Lombok的项目的话会提示找不到方法等错误。导致项目编译失败。 也就是说,如果项目组中有一个人使用了Lombok,那么其他人就必须也要安装IDE插件。否则就没办法协同开发。 ...

March 22, 2026 · 2 min · santu

交易主链路提供风控决策要求RT 5ms的技术方案

背景 我在淘天集团的金融风控技术团队,我们需要支撑某个金融产品,在下单核心链路上进行风控的决策,但是上游给我们的RT只有5ms。我们之前的决策链路还是比较复杂的,上下游包含了多个系统,想要抗住这5ms的RT基本上是不可能的。 为了实现这个要求,我们单独做了一个前置决策,专门用来支持交易核心链路上的金融产品的风险防控及价格咨询。为了尽可能的提升性能,我们在过程中做了很多事情。最近业务已经上线了,也做了压测,基本满足了要求。于是总结一下本次的技术改造过程。 压测数据 机器:4台 QPS:600(更新:同样的配置,后来我压到了3000,完全扛得住) RT:2.38ms CPU:2.95% MEM:29% LOAD:0.05-0.25 调用链路 技术方案 整体的技术方案,主要做了这么多事情:独立部署+单元化架构+内存决策+多级缓存+异步日志+批量读取+数据预读 独立部署+单元化架构 单独创建一个应用,做单元化部署,避免和其他业务之间互相影响,可以快速迭代进行发布。 ✅什么是单元化架构? 前置决策:包含风控、定价等金融决策功能。 同单元网络延迟:同机房0.2ms,跨机房0.8ms 内存决策 放弃原来的链路,改为内部自决策。数据从缓存读取,决策在内存进行。不外调,不外查。 多级缓存 本地缓存:Caffeine 保存最近的决策因子——名单值 Tair客户端本地缓存:tair local cache 热点检测,针对热点数据做本地缓存 Tair分布式缓存 分布式缓存,做缓存数据持久化及一致性保障 代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 @Override public DecisionContext initContext(List<RiskAdmitRequest> riskAdmitRequests, String localCacheNamespace, int remoteCacheNamespace) { DecisionContext decisionContext = new DecisionContext(); //初始化上下文 decisionContext.setLocalCacheNamespace(localCacheNamespace); decisionContext.setRemoteCacheNamespace(remoteCacheNamespace); DecisionConfig decisionConfig = decisionConfigProperties.getDecisionConfig(localCacheNamespace); //key添加 enrichKeys(decisionContext, riskAdmitRequests, decisionConfig); //从本地缓存中查询 fetchLocalCache(decisionContext); //从分布式缓存中查询 fetchRemoteCache(decisionContext); if (logger.isInfoEnabled()) { logger.info(decisionContext.printLog()); } return decisionContext; } 缓存更新方案 离线数仓直接通过定时任务写数据到tair缓存中。(这里用了内部工具,就不展开说了) ...

March 22, 2026 · 3 min · santu

什么是隐私计算?

最近一段时间,我除了写业务代码之外,还整了个新鲜玩意,那就是参与搞了一下隐私计算相关的事情。 现在有空了,刚好总结一下。因为隐私计算可能对于很多工程开发朋友来说很陌生,所以,**我这篇文章主要是给大家科普一下,让大家知道有这么个技术以及现在的主要方向。**这里面不会有太多的算法内容和底层原理,相信大家应该都能看得懂。 随着移动互联网、云计算、物联网等信息技术的蓬勃发展,世界进入了数据爆炸的"大数据时代"。在各行各业,数据都发挥着至关重要的作用,越来越多的场景需要多方数据的流通和共享。如我们所在的金融部门,则需要借助外部金融数据,结合我们的场景业务数据进行联合建模,实现联合风控、数字营销、智能反诈、精准获客等。 所以,站在这个历史节点上,在数据合作、共享方面,横亘在我们面前的有几个重要的问题需要解决: 1、“数据孤岛“现象普遍存在;数据流通安全性风险高; 2、数据合规监管日趋严格;隐私泄露导致信任鸿沟; 其中,随着个人信息保护法在2021年11月的推出,监管问题更是我们亟待解决的。 但是近几年,随着电子商务法、数据安全法、《个人信息保护法》等一系列法律法规的推出,使得我们不得不重视个人隐私的问题。 虽然个人信息的保护越来越严格,但是,从很多的法规中我们可以解读出来,其实,大的形式上,官方还是比较支持我们合规的进行数据的利用和开发的。 那么,如何解决这些问题呢? 其实,从《个保法》中我们可以找到一些切入口,根据中对个人信息的定义是这样的: 以电子或者其他方式记录的与已识别或者可识别的自然人有关的各种信息,不包括匿名化处理后的信息。 可见,如果我们能够对个人信息进行去标识化和匿名化处理,那么,就可以利用这些信息了。 所以,很多相关的技术也就诞生了,这些技术主要解决的就是通过数据可用不可见的方式帮助我们进行跨机构间的数据协同。这类技术,统称为隐私计算技术。 隐私保护计算经过很多年的发展,在具体的落地实现的技术上,主要有三个主流的方向: 1、基于密码学的多方安全计算(MPC) 2、基于可信硬件的可信执行环境(TEE) 3、基于混合技术方案的联邦学习(FL) 想要实现去标识化和匿名化,主要的方式就是让原始的用户数据无法被识别。 其中多方安全计算主要是基于密码学的方式,把数据进行加密处理,这样我们就可以使用加密后的数据进行算法建模了。 另外,可信执行环境是一种基于硬件的数据,大概就是把数据放到一个硬件中,只在这个硬件内部使用,外部无法直接读取。 还有一种技术那就是混合了多种方案的技术,那就是联邦学习。 其中联邦学习因为其不依赖硬件、可以解决复杂的算法建模问题等优势,虽然相比其他方案存在着一定的效率问题,但是随着技术的发展,如何突破性能瓶颈,达到实用性、安全性的平衡,并进一步提升安全性,这些问题终将被解决。所以,这项技术被认为是"人工智能的最后一公里"、“下一代人工智能协同算法和协作网络的基础”。 联邦学习 联邦学习(Federated Learning)是一种新兴的人工智能基础技术,在 2016 年由谷歌最先提出,原本用于解决安卓手机终端用户在本地更新模型的问题,其设计目标是在保障大数据交换时的信息安全、保护终端数据和个人数据隐私、保证合法合规的前提下,在多参与方或多计算结点之间开展高效率的机器学习。 我们把每个参与共同建模的企业称为参与方,根据多参与方之间数据分布的不同,把联邦学习分为三类:横向联邦学习、纵向联邦学习和联邦迁移学习。 横向联邦学习的本质是样本的联合,适用于参与者间业态相同但触达客户不同,即特征重叠多,用户重叠少时的场景,比如不同地区的银行间,他们的业务相似(特征相似),但用户不同(样本不同)。主要解决样本不足的问题。 纵向联邦学习的本质是特征的联合,适用于用户重叠多,特征重叠少的场景,比如同一地区的商超和银行,他们触达的用户都为该地区的居民(样本相同),但业务不同(特征不同)。主要解决特征不足的问题。 因为我们这面主要是金融业务,隐私计算的应用场景是基于联邦学习和外部银行、机构等做联合风控,多头借贷等金融业务。所以我们基本上是想用我们具有的用户的电商数据、和外部机构具有的信贷数据、征信数据等进行纵向连邦学习。 纵向联邦学习的主要流程如下: 第一步:加密样本对齐。是在系统级做这件事,因此在企业感知层面不会暴露非交叉用户。 第二步:对齐样本进行模型加密训练: step1:由第三方C向A和B发送公钥,用来加密需要传输的数据; step2:A和B分别计算和自己相关的特征中间结果,并加密交互,用来求得各自梯度和损失; step3:A和B分别计算各自加密后的梯度并添加掩码发送给C,同时B计算加密后的损失发送给C; step4:C解密梯度和损失后回传给A和B,A、B去除掩码并更新模型。 FATE 框架 因为目前关于联邦学习的技术,很多大厂都有在投入,其中阿里、蚂蚁、字节、腾讯等都很多成功的案例。 我们此次在进行联邦学习相关调研的时候,有不同的同事分别调研不同的框架。我这面主要负责基于开源的框架进行调研。 因为关于联邦学习,最重要的还是解决数据的安全性问题,目前看来,很多外部机构,对于开源的框架接受度更高一些。市面上也有很多联邦学习框架,如微众银行开源的FATE、字节开源的FedLearner、百度开源的PaddleFL等。其中 FATE 被使用的最广泛,被认为是联邦学习的样板项目。 FATE (Federated AI Technology Enabler) 是微众银行AI部门发起的开源项目,为联邦学习生态系统提供了可靠的安全计算框架。FATE项目使用多方安全计算 (MPC) 以及同态加密 (HE) 技术构建底层安全计算协议,以此支持不同种类的机器学习的安全计算,包括逻辑回归、基于树的算法、深度学习和迁移学习等。 FATE 有4种部署方式,分别是基于Docker-Compose的部署、Standalone部署、Native的集群部署、基于KubeFATE的部署。 基于Docker-Compose:快速体验一下FATE,跑的模型和数据在单台机器就够了,部署起来比较简单。 Standalone单机部署:只是想开发算法,而开发机器性能又不高。 基于KubeFATE:对FATE的使用需求因数据集和模型变大,需要扩容,并且里面有数据需要维护一个FATE集群,则考虑使用基于KubeFATE在Kubernetes集群的部署方案。 Native的集群部署:一般是在特殊原因下才会用,如内部无法部署Kubernetes,或者需要对FATE的部署进行自己的二次开发等。 为了快速验证,我们此次部署主要是采用了基于Docker-Compose和基于KubeFATE两种部署方式。部署过程中还是遇到了很多的问题的。 关于这两种部署方式的部署过程以及一些问题的解决,不是本文的重点,我把他们单独放到我的博客中了,大家如果感兴趣可以去我的博客中阅读。 下面这张就是 FATE 的一个部署架构图: ...

March 22, 2026 · 1 min · santu

大厂程序员能力模型

其实最近两年自己一直在做面试官,也面试过很多优秀的人,心里大概有一个标准,知道什么样的人才是我们想要的人。 但是这个标准我一直都没有仔细的去思考过,刚好最近有时间,我好好的思考了一下,根据我的理解,谈一谈我认为的大厂程序员的人才画像是怎样的。 我觉得大厂需要的人才大概需要具备这几方面的能力: 1、软件开发能力 2、架构设计能力 3、项目管理能力 4、线上运维能力 5、业务理解能力 6、学习能力 7、影响力 8、目标导向 比如,我们到阿里巴巴的招聘网站上,随便找几个工程师岗位,看一下岗位要求:   这些岗位描述和要求里面的内容,基本都能和以上几个能力对应的上: 负责平台核心功能、公共模块的规划及架构设计,包括系统架构设计、接口规范制定、技术文档、单元测试的编写等; —–> **架构设计能力** 业务模型理解和抽象能力突出,参与科学决策、数字兴业、数字治理等相关系统的架构设计,承担核心模块的代码编写 。 —–> **架构设计能力** 业务理解和建模能力突出,能独立完成系统(或核心模块)的设计、开发和系统维护;—–> **业务理解能力** 扎实的Java/JEE知识基础和功底(重点包括包括JVM、类装载机制、多线程并发、IO、网络等),有比较优秀的动手能力;—–> **软件开发能力** 扎实的Java编程基础,理解io、反射、多线程、集合等,清楚JVM的原理;—–> **软件开发能力** 熟练掌握主流JAVA框架,并且能了解到它的原理和机制;熟悉MySQL/Oracle数据库中的一种或多种,有一定的SQL性能优化经验;—–> **软件开发能力** 良好的面向对象设计能力,对互联网高并发、高可用和高复用有一定的理解和实践,熟悉分布式技术(包括缓存、消息系统、热部署、JMX等)优先; —–> **软件开发能力** 具有比较强的问题分析和处理能力,有比较优秀的动手能力,热衷技术,精益求精; —–> **线上运维能力** 有强烈的责任心,抗压能力强; —–> **目标导向** 保障数字乡村业务系统的稳定性和项目质量,参与平台核心系统的架构设计。—–> **项目管理能力** 业务理解和学习能力强,善于与商业/合作伙伴交流,有很好的适应和沟通能力,具备责任心、耐心、细心的品质;—–>**业务理解能力** 、**学习能力** 以上的岗位描述中,对于一些能力的描述都是使用了一些形容词或者程度副词,如突出的、扎实的、比较优秀的、熟悉、熟练掌握、比较强的、有强烈的、强、善于、很好的等。 那么,到底什么样算是优秀?做到什么程度又酸是扎实、熟练能?又要怎么做才能达到突出呢? 接下来我们就以阿里的P6这个层级为例,来说一说以上这些能力大概需要达到什么样的标准。 软件开发能力 对于一个程序员来说,软件开发能力当然是一个最最基础的能力了,很多面试主要考察的也都是软件开发能力。 那么,到底需要掌握哪些知识,才能达到阿里的P6的标准呢? 在回答这个问题之前,我看了很多大厂的招聘要求,并且回顾了一下以往面试时自己对于候选人的要求,大概总结出一些我认为比较重要的知识点。 可以说,如果以下这些知识点,候选人不能完全掌握的话,面试挂掉的概率很大。 1、Java基础。这个是最最基本的,像集合类、IO、反射这些常见的内容一定要做到如数家珍。 2、并发编程。这个也是面试很看重的知识点,对于线程安全问题、相关关键字的用法及原理、并发包等知识也要掌握。 3、JVM相关。这部分几乎是面试必考!JVM内存结构、GC相关的、调优、类加载等等这些的原理都要有了解的。 4、框架相关。目前主流的一些框架一定要了解的,如Spring等开源框架, 要知道用法及重要特性的原理、 4、分布式相关。这是大厂比较看重的一点了,对于分布式理论知识、缓存、消息、RPC等工具的用法和原理有了解的话,面试会轻松很多。 5、高并发、高性能方面知识。这部分也是挺重要的。 6、数据库相关知识。如Mysql的一些知识、锁、隔离级别、事务、索引等等。 7、数据结构与算法。这部分很多公司喜欢问一些算法题。 那么,具体如何衡量自己的知识面和深度是否足够呢,有一个简单的办法,那就是打开我之前总结的《Java工程师成神之路》,从头到尾浏览一下知识点列表。如果你能满足以下要求,那么说明你已经基本达到了: 基础篇。掌握70% 底层篇。掌握60% 进阶篇。掌握50% 高级篇。掌握30% 那么,你的知识面的广度以及深度的话,我认为算是达到了一个相对符合标准的程度。 架构设计能力 很多人会认为,我只是一个做开发的,又不是架构师,为什么要求我有架构能力呢? 这一点其实也能理解,因为一个P6在公司内部的定位应该是一个系统或者一个域的Owner,他需要负责这个系统和这个域的系统设计,那么就需要具备一定的架构设计能力,这样才能设计出合理的系统。 要想设计出好的架构,我觉得需要几个方面: ...

March 22, 2026 · 1 min · santu

2023网易技术分享

这是我在网易做的一次技术分享,PPT 分享给大家~ 那些年踩坑.pptx

March 22, 2026 · 1 min · santu

为啥我不建议使用@Transactional事务

事务管理在系统开发中是不可缺少的一部分,Spring提供了很好事务管理机制,主要分为编程式事务和声明式事务两种。 关于事务的基础知识,如什么是事务,数据库事务以及Spring事务的ACID、隔离级别、传播机制、行为等,就不在这篇文章中详细介绍了。默认大家都有一定的了解。 本文,作者会先简单介绍下什么是声明式事务和编程式事务,再说一下为什么我不建议使用声明式事务。 编程式事务 基于底层的API,如PlatformTransactionManager、TransactionDefinition 和 TransactionTemplate 等核心接口,开发者完全可以通过编程的方式来进行事务管理。 编程式事务方式需要是开发者在代码中手动的管理事务的开启、提交、回滚等操作。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 public void test() { TransactionDefinition def = new DefaultTransactionDefinition(); TransactionStatus status = transactionManager.getTransaction(def); try { // 事务操作 // 事务提交 transactionManager.commit(status); } catch (DataAccessException e) { // 事务提交 transactionManager.rollback(status); throw e; } } 如以上代码,开发者可以通过API自己控制事务。 ...

March 22, 2026 · 1 min · santu

大厂对学历的要求是什么?

很多人会比较关心大厂招聘对学历有没有要求,一般的要求都是怎样的。今天就简单说一说。 其实目前对于很多大厂来说,对学历都是有要求的,毕竟现在大厂有一定的竞争优势,通过学历可以筛选掉一部分人。 虽然学历不好的人当中也有很多非常优秀的。但是相比之下学历高的人优秀的比例会更高一些,所以很多大厂的HR们为了节约时间和成本都会对学历有一定的要求。通过这一硬性指标做一层筛选。 目前来看,大部分公司都要求至少有本科学历,对于专科学历,就很难通过第一轮筛选。 另外,本科和研究生,对于大厂来说一般没有明确要求,也没有太大的差别。 但是,大厂还是比较看中候选人的毕业学校的,如果是985/211,那一定是会有更多的机会的,甚至有些岗位只要985/211,虽然招聘信息不会注明这一点,但是在收到简历以后,都会筛选一波。 有些人认为是不是只有应届生才会被要求有好的学历,其实并不是,现在很多社招也都有这方面要求了。 虽然有可能会因此错过一些人才,但是这样做更高效,而且大厂有自信通过这种方式也能找到学历好,有能力的人才。 所以,目前来看,大厂或多或少都会看重学历,最低要求本科,985/211优先。 而且,据我所知,有些公司的有些部门,要求会更加严格,比如: 1、第一学历要好,专升本的不考虑。 2、研究生要全日制的,在职的不考虑。 当然,这都是一小部分的。 但是,也不要认为学历不好就完全没机会了。其实我有很多同学,他们现在的分布在各大一线互联网公司,所有大家可以叫的上名字的,我都有很多同班、同届的同学在。 如字节、快手、拼多多、百度、腾讯、滴滴、知乎…..真的是太多了。所以,学历虽然挺重要,但是也不是完全就无解的。

March 22, 2026 · 1 min · santu

阿里的简历多久可以投递一次?次数多了有没有影响?可以同时进行吗?

阿里的面试可以多个部门同时进行吗? 以前不行,现在集团拆成1+6+N后,各个子集团之间可以同时投递了。如同时投阿里云、淘天、本地生活、以及蚂蚁等。 但是同一个集团下面的多个部门还是不行的,比如淘天下面的淘宝、天猫、咸鱼等。 因为同一个集团内的面试是要走系统流程的,系统上面有严格的控制,一个人在同一时间只能在一个面试流程中,没办法同时面试多个部门。 阿里的简历多久可以投递一次? 据我所知,同一个人在一个月内最多被内部推荐的次数是有限制的,好像是5次左右。 但是除内推外其他形式的应聘应该是没有限制的。 只要没有在流程中,就可以重新投递。 投递之后,如果面试未通过,只要上一个岗位结束了面试流程,就可以继续进行下一次的面试。中间不需要有间隔。 是不是面试越多,成功几率越大? 很多人找工作的时候,会疯狂的海投很多岗位,认为面试次数越多,成功的几率越大? 其实并不完全是这样的。 对于很多大厂来说,所有的面试都是要通过系统进行的,而每一次面试记录都会在系统中被记录下来。 这些面试记录大部分都会包含面试官的评价,详细的甚至面试问的问题都会有。 所以,如果你没有准备好,同时间投递多个岗位,如果有过几次失败的经历了,后面再成功的概率就极低了。 面试没过,又被系统捞起来了,我该怎么办? 有些人投递了简历之后,被一个部门面试后没有通过,过段时间有人打电话过来询问是否再进行面试,这是什么情况?要不要面试? 这其实是被"捞起来"了,就是说面试没通过,简历会进入人才库,员工可以通过人才库搜索找到自己心怡的人员,进行重新发起面试。 首先,捞起来面试的话,也是一次新的面试,面试记录上面也会充分体现出来,和普通的投递没啥区别。 所以,如果你第一次面试没过,并且你觉得自己还差的挺远的,那么当你被捞起来之后,我建议你直接拒绝。 可以说暂不考虑新的职位,或者说没有换工作意向等。 这时候系统上同样会有响应的标注,这样在短期内,就不会被再次捞起来了。 什么时候准备好了,再重新投递就行了。 阿里的一次面试不过,对后续面试有没有影响? 这个问题前面也大概提到了 肯定是有影响的,很多时候,面试官收到一份简历,会首先查看历史面试记录,如果有非常不好的评价,那么基本就直接Pass了。 所以,强烈建议一定要做好准备之后再开始投递简历以及面试,不要抱着试试看的心理。

March 22, 2026 · 1 min · santu

留言给博主