同事写的让我内心五味杂陈的代码

程序员晋级必看:Pull Request你真的会用吗?99%的人都踩过这些坑! 本文深入剖析Pull Request的使用技巧与常见误区,从基础概念到高级实践,涵盖PR描述写作、团队沟通、工作流程等核心要点,旨在帮助程序员提升代码协作能力和职业竞争力。 阅读详情

👉 这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料: 

fad0e4e0df3936cecbc87820f303212e.gif

👉这是一个或许对你有用的开源项目

国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。

功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号等等功能:

  • Boot 地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro

  • Cloud 地址:https://gitee.com/zhijiantianya/yudao-cloud

  • 视频教程:https://doc.iocoder.cn

来源:juejin.cn/post/
7294844864020430902


看到这样的代码,内心五味杂陈......

那天下午,看到了令我终生难忘的代码,那一刻破防了......

🔊 本文记录那些年的 Java 代码轶事

ヾ(•ω•`)🫥 故事还得从半年前数据隔离的那个事情说起......

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

历史背景

数据隔离

预发,灰度,线上环境共用一个数据库。每一张表有一个 env 字段,环境不同值不同。特别说明:env 字段即环境字段。如下图所示:

bbba00a13eba91f8d4a690e5f2ee1fa9.jpeg

隔离之前

🖌️插曲:一开始只有 1 个核心表有 env 字段,其他表均无该字段;有一天预发环境的操作影响到客户线上的数据。为了彻底隔离,剩余的二十几个表均要添加上环境隔离字段。

「当时二十几张表已经大量生产数据,隔离需要做好兼容过渡,保障数据安全。」

隔离改造

其他表历史数据很难做区分,于是新增加的字段 env 初始化 all ,表示预发线上都能访问。以此达到历史数据的兼容。

每一个环境都有一个自己独立标志;从 application.properties 中读该字段;最终到数据库执行的语句如下:

SELECT XXX FROM tableName WHERE env = ${环境字段值} and ${condition}

隔离方案

「最拉胯的做法:每一张表涉及到的 DO、Mapper、XML等挨个添加 env 字段。但我指定不能这么干!!!」

64d8a027b82296341a7c2c9bfd4937ec.jpeg

具体方案:自定义 mybatis 拦截器进行统一处理。通过这个方案可以解决以下几个问题:

  • 业务代码不用修改,包括 DO、Mapper、XML等。只修改 mybatis 拦截的逻辑。

  • 挨个添加补充字段,工程量很多,出错概率极高

  • 后续扩展容易

最终落地

在 mybatis 拦截器中, 通过改写 SQL。新增时填充环境字段值,查询时添加环境字段条件。真正实现改一处即可。考虑历史数据过渡,将 env = ${当前环境} 修改成 env in (${当前环境},'all')

SELECT xxx FROM ${tableName} WHERE env in (${当前环境},'all') AND ${其他条件}

具体实现逻辑如下图所示:

2e5d8ae373a9ef2e116e386b2398484b.jpeg
  1. 其中 env 字段是从 application.properties 配置获取,全局唯一,只要环境不同,env 值不同

  2. 借助 JSqlParser 开源工具,改写 sql 语句,修改重新填充、查询拼接条件即可。链接https://github.com/JSQLParser/JSqlParser

思路:自定义拦截器,填充环境参数,修改 sql 语句,下面是部分代码示例:

@Intercepts(
        {@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})}
)
@Component
public class EnvIsolationInterceptor implements Interceptor {
    ......
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        ......
        if (SqlCommandType.INSERT == sqlCommandType) {
            try {
                // 重写 sql 执行语句,填充环境参数等
                insertMethodProcess(invocation, boundSql);
            } catch (Exception exception) {
                log.error("parser insert sql exception, boundSql is:" + JSON.toJSONString(boundSql), exception);
                throw exception;
            }
        }

        return invocation.proceed();
    }
}

一气呵成,完美上线。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

发展演变

业务需求

「随着业务发展,出现了以下需求:」

  • 上下游合作,我们的 PRC 接口在匹配环境上与他们有差异,需要改造

SELECT * FROM ${tableName} WHERE bizId = ${bizId} and env in (?,'all')
  • 有一些环境的数据相互相共享,比如预发和灰度等

  • 开发人员的部分后面,希望在预发能纠正线上数据等

初步沟通

这个需求的落地交给了来了快两年的小鲜肉。在开始做之前,他也问我该怎么做;我简单说了一些想法,比如可以跳过环境字段检查,不拼接条件;或者拼接所有条件,这样都能查询;亦或者看一下能不能注解来标志特定方法,你想一想如何实现......

(●ˇ∀ˇ●)年纪大了需要给年轻人机会。

勤劳能干

小鲜肉,没多久就实现了。不过有一天下午他遇到了麻烦。他填充的环境字段取出来为 null,看来很久没找到原因,让我帮他看看。(不久前也还教过他 Arthas 如何使用呢,这种问题应该不在话下吧🤔)

具体实现

大致逻辑:在需要跳过环境条件判断的方法前后做硬编码处理,同环切面逻辑, 一加一删。填充颜色部分为小鲜肉的改造逻辑。

ad3a77eb187157e27ea9bfb8289fccd1.jpeg

大概逻辑就是:将 env 字段填充所有环境。条件过滤的忽略的目的。

SELECT * FROM ${tableName} WHERE env in ('pre','gray','online','all') AND ${其他条件}

错误原因

经过排查是因为 API 里面有多处对 threadLoal 进行处理的逻辑,方法之间存在调用。简化举例:A 和 B 方法都是独立的方法, A 在调用 B 的过程,B 结束时把上下文环境字段删除, A 在获取时得到 null。具体如下:

0a6e041b0b83eb6214610dc7ee71c989.jpeg

五味杂陈

当我看到代码的一瞬间,彻底破防了......

1117940b5c7cd0c414d0b38fd0f7394c.jpeg

「queryProject 方法里面调用 findProjectWithOutEnv, 在两个方法中,都有填充处理 env 的代码。」

遍地开花

然而,这三行代码,随处可见,在业务代码中遍地开花.......

// 1. 变量保存 oriFilterEnv
String oriFilterEnv = UserHolder.getUser().getFilterEnv();

// 2. 设置值到应用上下文
UserHolder.getUser().setFilterEnv(globalConfigDTO.getAllEnv());

//....... 业务代码 ....

// 3. 结束复原
UserHolder.getUser().setFilterEnv(oriFilterEnv);
3bebc0659c6139384a41f075374e8f60.jpeg

改了个遍,很勤劳👍......

灵魂开问

「难道真的就只能这么做吗,当然还有......」

  • 开闭原则符合了吗

  • 改漏了应该办呢

  • 其他人遇到跳过的检查的场景也加这样的代码吗

  • 业务代码和功能代码分离了吗

  • 填充到应用上下文对象 user 合适吗

  • .......

「大量魔法值,单行字符超500,方法长度拖几个屏幕也都睁一眼闭一只眼了,但整这一出,还是破防......」

内心涌动😥,我觉得要重构一下。

重构一下

困难之处

「在 mybatis intercept 中不能直接精准地获取到 service 层的接口调用。只能通过栈帧查询到调用链。」

问题列表

  • 尽量不要修改已有方法,保证不影响原有逻辑;

  • 尽量不要在业务方法中修改功能代码;关注点分离;

  • 尽量最小改动,修改一处即可实现逻辑;

  • 改造后复用能力,而不是依葫芦画瓢地添加这种代码

实现分析

  1. 用独立的 ThreadLocal,不与当前用户信息上下文混合使用

  2. 注解+APO,通过注解参数解析,达到目标功能

  3. 对于方法之间的调用或者循环调用,要考虑优化

「同一份代码,在多个环境运行,不管如何,一定要考虑线上数据安全性。」

使用案例

改造后的使用案例如下,案例说明:「project 表在预发环境校验跳过」 。

@InvokeChainSkipEnvRule(skipEnvList = {"pre"}, skipTableList = {"project"})
@SneakyThrows
@GetMapping("/importSignedUserData")
@InvokeChainSkipEnvRule(skipEnvList = {"pre"}, skipTableList = {"project"})
public void importSignedUserData(
    ......
    HttpServletRequest request,
    HttpServletResponse response) {
    ......
}

「在使用的调用入口处添加注解。」

具体实现

  1. 方法上标记注解, 注解参数定义规则

  2. 切面读取方法上面的注解规则,并传递到应用上下文

  3. 拦截器从应用上下文读取规则进行规则判断

e8c50d71ba5cd833d8a14e8a86c3bb51.jpeg

注解代码

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface InvokeChainSkipEnvRule {

    /**
     * 是否跳过环境。 默认 true,不推荐设置 false
     *
     * @return
     */
    boolean isKip() default true;

    /**
     * 赋值则判断规则,否则不判断
     *
     * @return
     */
    String[] skipEnvList() default {};

    /**
     * 赋值则判断规则,否则不判断
     *
     * @return
     */
    String[] skipTableList() default {};
}

不足之处

  1. 整个链路上的这个表操作都会跳过,颗粒度还是比较粗

  2. 注解只能在入口处使用,公共方法调用尽量避免

🤔那还要不要完善一下,还有什么没有考虑到的点呢?拿起手机看到快12点的那一刻,我还是选择先回家了......

总结思考

隔离总结

这是一个很好参考案例:在应用中既做了数据隔离,也做了数据共享。通过自定义拦截器做数据隔离,通过自定注解切面实现数据共享。

编码总结

「同样的代码写两次就应该考虑重构了」

  • 尽量修改一个地方,不要写这种边边角角的代码

  • 善用自定义注解,解决这种通用逻辑

  • 可以妥协,但是要有底线

  • ......

场景总结

「简单梳理,自定义注解 + AOP 的场景」

d70e7b4e6dbd1ff694946f9c01b411ce.png

自定义注解很灵活,应用场景广泛,可以多多挖掘。

反思总结

  • 如果一开始就做好技术方案或者直接使用不同的数据库

  • 是否可以拒绝那个所谓的需求

  • 先有设计再有编码,别瞎搞

最后感想

在这个只讲业务结果,不讲技术氛围的环境里,突然有一些伤感;身体已经开始吃不消了,好像也过了那个对技术较真死抠的年纪;突然一想,这么做的意义又有多大呢?


欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,“长按”或“扫描”下方二维码噢:

72c6807b4aa15f6d0cda3ba571e4c220.png

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

a45fdb462218a29fddeed17f3579a2ba.png

fd36c2536a469df9e1105462843411d9.pngdc87ec44ed8a6803dede29634af58a25.pngfda42f85f8c3f6a125b8fe86bec2a8bd.png63268238de3616e25bcfa47d71601c95.png

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
【SpringBoot 3.x 第12节】还在为SpringBoot 3.x消息队列集成头疼?三大主流方案让你一次搞定! 🏆本文收录于《滚雪球学Spring Boot》,专门攻坚指数提升,2025 年国内最系统+最强(更新中)。    本专栏致力打造最硬核 Spring Boot 从零基础到进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。 如果想快速定位学习,可以看这篇【SpringBoot教程导航帖】,你想学习的都被收集在内,快速投入学习!!两不误。 阅读详情

相关推荐

学术规范与论文写作(雨课堂)研究生 全部答案

1:如何造就优秀的学术论文 论文语法判断题 :全部是错的 2:如何撰写学术论文 3: SCI论文写作经验分享 4:论文写作与投稿技巧 5:学术伦理道德 答案仅供参考,研究生生活不易,大家如果有时间的话,还是可以学习学习的,毕竟老师讲的不错。加油,希望读研的每一个人都能顺利毕业! ...

Always-Learning 13万+

同事写的让我内心五味杂陈的代码。。。

程序员的成长之路互联网/程序员/技术/资料共享关注阅读本文大概需要 7 分钟。来自:juejin.cn/post/7294844864020430902看到这样的代码,内心五味杂陈......那天下午,看到了令我终生难忘的代码,那一刻破防了......???? 本文记录那些年的 Java 代码轶事ヾ(•ω•`)???? 故事还得从半年前数据隔离的那个事情说起......历史背景数据隔离预发,灰度,线上环境共...

良月柒 167

Autodesk全家桶怎么选?AutoCAD、Revit、Fusion 360等7款软件超全对比指南

本文深入对比了Autodesk旗下七款核心软件(AutoCAD、Revit、Inventor、Fusion 360、Maya、3ds Max、Forge)的核心定位与适用场景。针对建筑、制造、创意设计等不同专业需求,提供精准的选型指南,帮助用户根据自身工作流(如二维绘图、BIM协同、产品开发、影视动画)选择最匹配的工具,避免资源浪费并提升效率。

stone的博客 434

同事写的代码,太垃圾!破防了......内心五味杂陈

点击关注公众号:互联网架构师,后台回复2T获取2TB学习资源!上一篇:2T架构师学习资料干货分享大家好,我是互联网架构师!工作六年,看到这样的代码,内心五味杂陈......那天下午,看到了令我终生难忘的代码,那一刻破防了......ヾ(•ω•`)???? 故事还得从半年前数据隔离的那个事情说起......一、历史背景1.1 数据隔离预发,灰度,线上环境共用一个数据库。每一张表有一个 env 字段,环境...

emprere的博客 213

YOLOv11改进策略【Head】| AFPN渐进式自适应特征金字塔,增加针对小目标的检测头(附模块详解和完整配置步骤)

一、本文介绍 本文利用AFPN对YOLOv11的网络模型进行优化提升。AFPN采用渐近式融合及自适应空间融合操作。通过渐近式架构,逐步整合不同层级特征,有效避免非相邻层级间因语义差距过大导致的信息丢失或降级问题,确保在多尺度特征融合过程中既能保留高层语义信息,又能融入低层细节特征。本文将AFPN应用于YOLOv11中,并配置了针对小目标的检测头,能显著增强模型对不同尺度目标的检测能力,使其在复杂场景下更聚焦于目标物体特征,减少背景等无关信息的影响。 专栏目录:YOLOv11改进目录一览 | 涉及卷积层、

Limiiiing的博客 2718

YOLOv11旋转目标检测详解:从原理到实战的全面指南

本文介绍了YOLOv11旋转目标检测技术的核心概念、架构设计与应用场景。传统目标检测使用水平边界框(AABB)存在背景噪声大、定位精度低等问题,而旋转边界框(OBB)通过引入角度参数显著提升了检测精度,在遥感、OCR、工业质检等领域具有独特优势。YOLOv11-OBB采用改进的多尺度检测层、CSPDarknet53骨干网络和双通道角度输出机制,在保持实时性的同时实现精确的旋转目标检测。实验表明,该方法在DOTA数据集上达到81.3%的mAP,相比传统方法提升显著,特别适合处理具有旋转特性或高宽比悬殊的目标。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 305

工作六年,看到这样的代码,内心五味杂陈...

点击关注公众号:互联网架构师,后台回复2T获取2TB学习资源!上一篇:8种 专坑 同事的SQL写法,来试试吧大家好,我是互联网架构师!在掘金看到一篇文章,让我产生了想要分享的欲望。讲述的是面对同一个需求,一个工作经验不到两年的小鲜肉和一个工作六年的老司机给出的两个不同技术方案的实现落地。先是小鲜肉写了一版实现,然后老司机在审查代码的时候觉得应该有更优雅的落地解决方案,于是又按照自己的思路重构了一...

emprere的博客 95

深入剖析RK3588系统休眠唤醒机制及驱动适配秘籍

本文深入探讨了RK3588嵌入式系统的休眠唤醒机制及驱动适配技术。首先分析了系统支持的两种休眠模式(Freeze浅度睡眠和Mem深度睡眠)及四种唤醒方式(GPIO中断、蓝牙事件、外设活动和定时器唤醒)的工作原理。重点介绍了驱动适配的三个关键环节:设备树配置要点、驱动代码实现与优化方法,以及驱动与内核电源管理的协同机制。通过GPIO按键唤醒和蓝牙唤醒两个实际案例,展示了具体实现过程并提供了常见问题的解决方案。文章为开发者提供了全面的技术参考,有助于优化系统功耗管理和响应性能,对嵌入式系统开发具有重要指导意义。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 434

同事写的代码,太垃圾!破大防了......

本文系转载,原文作者:uzong。原文地址:https://juejin.cn/post/7294844864020430902工作六年,看到这样的代码,内心五味杂陈......那天下午,看到了令我终生难忘的代码,那一刻破防了......ヾ(•ω•`)???? 故事还得从半年前数据隔离的那个事情说起......一、历史背景1.1 数据隔离预发,灰度,线上环境共用一个数据库。每一张表有一个 env 字段,...

HollisChuang's Blog 333

LLM评测框架Ragas:测试RAG的性能出现TimeoutError()的解决办法(Ragas+langchain+ollama)

无奈之下,自己找到了一个解决办法,在ragas支持的llm类库中加了一个如下的类,支持ollama、langchian_ollama使用ragas测试报错的问题。可以将如上的库放到你的ragas的系统库的llms目录下,然后修改__init__.py如下。最近用ragas测试rag的性能,发现老出现TimeoutError()的错误。这是一个临时的解决办法,具体等待官方给出最终的解决方案。后来发现官方也没有尽快支持的计划。然后就可以用如下代码进行一些验证。

Criss@陈磊 666

TC3XX - MCAL知识点(三):MCU EB-tresos配置说明及代码浅析

AURIX 2G Tc3xx的配置相较AURIX 1G Tc2xx来讲简化了许多,但是依赖于数据手册的理解来讲整个MCU功能做了较大增强,此处先简单的介绍一下,本文前期先补充介绍一下英飞凌手册的阅读规则,因为后面的文章会基于此文的一些缩写进行截图寄存器之类的。MCU在AUTOSAR架构里面的图示如下MCU驱动程序负责配置SCU、GTM、CCU6、GPT12和STM外设。驱动程序提供由AUTOSAR指定的运行时服务。

梦想技术家 2876

以后程序出问题,可以甩锅给AI了

这些代码来自于一个 GitHub 仓库,目的就是为了让 AI 拿去训练,然后给使用者程序中加后门,具体是主动投喂给GPT的,还是GPT自己主动吃的,不得而知,总之,就是恰好被GPT训练用了,然后有用户碰到类似的需求,正好就拿到了带后门的代码,然后就被骗了。但是这个人否认是他加的这行代码,钱包也不是他自己的,最后甩锅给了 AI,说是AI加上去的,自己没发现,Code Review 时也没发现。说是AI干的,这确实是属于甩锅了。AI时代,写代码是方便读了,但是万一AI被利用了,写出的代码安全性就成了大问题。

Java后端技术 462

ESP32设备驱动-MLX90393磁场传感器驱动

MLX90393 磁场传感器可以在运行时重新编程为不同的模式和不同的设置。 该传感器使用 Melexis 专有的 Triaxis® 技术提供与沿 XYZ 轴感应的磁通密度成比例的 16 位输出,还提供温度输出信号。 这些数字值可通过 I2C 和 SPI 获得,其中 MLX90393 是总线上的从设备。

视觉与物联智能 2357

那个连“快速排序”都写不利索的兄弟,拿下了我梦寐以求的offer

但有意思的是,我后来发现那个乱码只会在每个月最后一天的凌晨出现,是因为对方银行有一个定时批量对账的任务,在那个时间点会切到一个备用服务器,而备用服务器的字符集配置不一样。而那个室友写的代码,有些地方会留着一行注释:“这个方案是三个月前想到的,当时因为要赶618大促用了最简单的if-else,后来流量稳定了才重构的。我想让他知道,这里的每一个决策都不是随意的,而是当时在某个特定约束下做的最优选择。那一刻我突然懂了,面试官真正想找的,不是一个“什么都会”的天才,而是一个“知道自己为什么要这样写”的工程师。

IT学习小镇 246

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

我的教师生涯

在我十几年的职业生涯中,曾经在一家北大青鸟培训中心做过半年多的教师。 虽然对同行称我"刘老师",我有过一个开玩笑的解释, 但是其实这段经历才是这个称呼的由来。 作为程序员,不是总有机会上讲台,所以一直想给自已做个总结。但是我实在太懒。居然四年以后才动手。 有亲友曾经说我适合当老师,因为讲起话来滔滔不绝,又精通各路掌故。自已当初去求职,也有过类似的动机, 觉得终于可以施展身手。确实,讲到某段内容

追寻真理之美 1万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

我用Spring Boot随手封装了一个万能的 Excel 导出工具,传什么都能导出!

往期热门文章: 1、MyBatis的10种精妙用法,真是妙啊! 2、同事写的让我内心五味杂陈的代码 3、再见 Guava !Spring Boot 拥抱本地缓存之王 Caffeine 4、如何搭建一台永久运行的个人服务器? 5、灵魂画手图解 Spring 循环依赖作者:小目标青年链接:https://blog.youkuaiyun.com/qq_35387940/article/details/129062...

Java后端技术 210

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

字节跳动后端开发实习----技术面

字节跳动后端面试:自我介绍+项目深挖+基础知识+算法编程

fu十一的主页 883

ife 零基础学院 day 1 - 我为什么想学前端

与前端结缘   我是后端研发,毕业四年,用了四年C#,一开始写ASP.NET,有时会在asp页面写简单的js和html,做点css样式调整。当时的感触是前端调试太费劲了,因为没有js、html、css基础,出点样式或者js的问题,能难为很久。2014那会儿前端的概念还不清晰,当时所在的公司设置的职位也没有前端工程师,那会儿叫美工和切图。当时负责美工和切图的姐姐,原来的工作是文字编辑,换成现在的说法...

weixin_34297300的博客 71

一个现代化轻量级的跨平台 Redis 桌面客户端,支持 Mac、Windows 和 Linux

往期热门文章: 1、能用到“退休”的 600条 Linux 命令,可以解决日常99%的问题~ 2、工作六年,看到这样的代码,内心五味杂陈... 3、拒绝写重复代码,试试这套开源的 SpringBoot 组件 4、一次生产事故,来来回回搞了一个月,人麻了! 5、面试官:Git 如何撤回已 Push 的代码?问倒一大片。。。今天给大家推荐的这个开源项目是一个现代化轻量级的跨平台 Redis 桌面客户...

Java后端技术 385

中国程序员独立开发9年、最受欢迎的开源Redis客户端——被Redis公司收购了!...

往期热门文章: 1、我在代码里面故意留个漏洞,违法吗? 2、一个现代化轻量级的跨平台 Redis 桌面客户端,支持 Mac、Windows 和 Linux 3、能用到“退休”的 600条 Linux 命令,可以解决日常99%的问题~ 4、工作六年,看到这样的代码,内心五味杂陈... 5、拒绝写重复代码,试试这套开源的 SpringBoot 组件ioredis 作者 @Luin 宣布该项目已被 R...

Java后端技术 253

第二十九章:人生转折与新的起点

2019 年 8 月,炽热的阳光毫无保留地倾洒在深圳这座充满活力的城市,街头巷尾弥漫着一股燥热的气息。小冷拖着沉重的行李箱,脚步略显踌躇地走在熟悉又陌生的街道上,内心五味杂陈。几个月前,他还在大连与小伊共同编织着未来的美梦,而如今,他却孤身一人回到深圳,准备加入华为,开启一段未知的职业生涯。他抬头望向那湛蓝得有些刺眼的天空,深吸一口气,试图将内心的迷茫与不安都统统咽下,期待着新工作能成为他生活的转折点,同时也渴望忙碌能让他暂时忘却与小伊之间逐渐冷却的感情。 初入华为,小冷就被这里紧张而又充满激情的工作氛围所

Adversity reveals genius; fortune conceals it. 931

程序员最大的悲哀是什么?

程序员的悲哀,很多时候不是技术本身的问题,而是我们在这个快速变化的行业里,失去了对自己的掌控。我们被技术的潮流裹挟,被商业的逻辑绑架,被年龄的焦虑折磨。但我想说的是,我们不应该被这些悲哀定义。我们是程序员,我们是创造者,我们是改变世界的人。我们的代码在改变着人们的生活,我们的产品在推动着社会的进步。这些悲哀,是我们成长路上的必经之路。重要的是,我们要从中学到什么,我们要如何变得更强大。作为一个过来人,我想告诉那些还在迷茫中的程序员:不要被这些悲哀击倒,要从中汲取力量。

码到成功 576

面试官问我 ,try catch 应该在 for 循环里面还是外面?

往期热门文章: 1、为什么不建议在 Docker 中跑 MySQL? 2、推荐一款功能强大的商城系统:Javashop,适合二次开发,100%开源! 3、ObjectMapper,别再像个二货一样一直new了! 4、我用Spring Boot随手封装了一个万能的 Excel 导出工具,传什么都能导出! 5、MyBatis的10种精妙用法,真是妙啊! 5、同事写的让我内心五味杂陈的代码前言有个老哥...

Java后端技术 120

反思

10年8月进了一家外包公司,开始从事我的java工程师工作。 15年6月经项目经理介绍来进了一家互联网创业公司。 16年2月因为投资人不愿再砸钱,团队宣布解散,于是我面临着找工作的问题。 花了一个星期时间找工作,面试了将近8家企业,都没有拿到offer,这对于我一个工作6年来的java工程师来说,打击是沉痛的。 印象最深刻的是当时面试的一家小的创业公司,面试官比我小两岁,面完后我听到他在外...

weixin_30379531的博客 87

面试官:我们深入聊聊Java虚拟机吧

面试官:我们深入聊聊Java虚拟机吧

真正的大师永远怀着一颗学徒的心 1335
上一篇: Java 21 新特性的实践,确实很丝滑!
下一篇: 平替XShell,分享一款功能强大、跨平台、免费的 SSH 客户端:PortX
公众号-芋道源码
博客等级 码龄10年 1636粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值