专栏名称: 沉默王二
技术文通俗易懂,吹水文风趣幽默。学 Java,认准二哥的网站 javabetter.cn
51好读  ›  专栏  ›  沉默王二

同事年底绩效是C,提离职领导死活不让走,后来领导私下说:他走了,就没人背这个绩效了。

沉默王二  · 公众号  ·  · 2025-01-22 14:04

主要观点总结

本文讲述了一篇关于职场现象与实现热部署功能的文章。文章从同事年底绩效C引发的思考,讨论了职场上的不公平待遇和背锅现象,并分享了如何拒绝模糊的KPI、保护自己的方法。此外,文章还介绍了如何实现热部署功能,包括使用文件监控机制和自定义类加载器的思路,并提醒读者在职场中要注意保护自己的权益和学习成长。

关键观点总结

关键观点1: 职场现象与背锅现象

文章通过同事年底绩效C的事件,揭示了职场上的不公平待遇和背锅现象,强调了保护自己的重要性。

关键观点2: 如何拒绝模糊的KPI和保护自己

文章给出了拒绝模糊的KPI和保护自己的建议,包括清楚自己的职责范围、及时做好会议记录和备份等。

关键观点3: 实现热部署功能的思路

文章介绍了实现热部署功能的思路,包括使用文件监控机制(如Java NIO的WatchService)来监控文件变化,并创建一个自定义类加载器来加载新的类文件。

关键观点4: 友情提示和其他学习资源推荐

文章还推荐了其他学习资源,如IntelliJ IDEA的热部署功能、LiveReload插件等,并介绍了作者的编程星球社区和座右铭。


正文

大家好,我是二哥呀。

微信看一看中刷到这样一篇标题的文章:

同事年底绩效是C,提离职领导死活不让走,后来领导私下说:他走了,就没人背这个绩效了。

感慨颇多,有些领导真的是脸上一套背后一套,表面上对你依依不舍(让你觉得自己是嫡系),心里面不知道藏了多少小心机。

“他走了,就没人背这个绩效了。”

这句话一出口,妥妥地揭示了一种畸形的职场现象: 绩效C,往往不代表能力差,而是“背锅侠”的属性

很多公司为了激发员工的工作效率,或者变相给员工上强度,让你自己卷自己,就会通过绩效来对你进行考核。

实际上,绩效分布比例呈现出严重的双括号分布“<>”,极少数 A,绝大多数B,剩下的 C。

C 的背后,不仅仅是差评,更像是团队里不得不分配的一个结果。

总要有人承担公司定下来的 KPI。

如果你接二连三背 C 的绩效就要思考了,是不是因为自己抗压能力太强,不会怼领导?

有时候,要巧妙地给领导甩一甩脸色,让他知道,你不是那么好欺负的。

职场上,往往最吃亏的,就是不会表达自己想法的人。

怎么破?

第一,拒绝模糊的 KPI,要清楚自己的职责范围 ,别让所有的问题,都模糊化落到自己身上。

第二,会议纪要、邮件备份,甚至聊天记录都要及时做好留存 ,有时候口头传达的一些东西,沟通的时候没办法确认清楚,做之前一定要形成文字版,然后发给领导再确认一遍。

尤其是跨部门对接时,留档案尤其重要。

因为当部分发生利益冲突的时候,没有做好证据,很有可能会背锅。

第三,绩效打 C 后,一定要找领导沟通清楚 ,为什么会出现这种不公,不要隐忍不发。

明明自己没有出什么差错,凭什么?

会哭的孩子有奶吃。

职场里,C绩效有时候不意味着失败,反而可能说明你是团队不可或缺的“问题收尾者”。当然,这锅也不能老背,得让领导知道:你能背,但你也有别的价值,不能被标签化。

别忘了, 做事靠谱≠背锅理所当然 ,适当表达、适当保护自己,才是真正的职场智慧!

三分恶面渣逆袭

JVM 篇第二版已经发布了,终于又搞定一件事。粗略统计了一下,2.3 万字 113 张手绘图,真的很用心在做这件事,有帮助的小伙伴可以传个口碑。

Java 基础篇、集合框架篇、JVM 篇

点击屏幕左下方的【 关注 】按钮,带走她,这份在 GitHub 上星标 13000+ 的面渣逆袭 PDF,听说可以吊打面试官(dog)。

53.你觉得应该怎么实现一个热部署功能?

热部署是指在不重启服务器的情况下,动态加载、更新或卸载应用程序的组件,比如类、配置文件等。

需要在类加载器的基础上,实现类的重新加载。

我的思路是:

第一步,使用文件监控机制,如 Java NIO 的 WatchService 来监控类文件或配置文件的变化。当监控到文件变更时,触发热部署流程。

class FileWatcher {

    public static void watchDirectoryPath(Path path) {
        // 检查路径是否是有效目录
        if (!isDirectory(path)) {
            System.err.println("Provided path is not a directory: " + path);
            return;
        }

        System.out.println("Starting to watch path: " + path);

        // 获取文件系统的 WatchService
        try (WatchService watchService = path.getFileSystem().newWatchService()) {
            // 注册目录监听服务,监听创建、修改和删除事件
            path.register(watchService, ENTRY_CREATE, ENTRY_MODIFY, ENTRY_DELETE);

            while (true) {
                WatchKey key;
                try {
                    // 阻塞直到有事件发生
                    key = watchService.take();
                } catch (InterruptedException e) {
                    System.out.println("WatchService interrupted, stopping directory watch.");
                    Thread.currentThread().interrupt();
                    break;
                }

                // 处理事件
                for (WatchEvent> event : key.pollEvents()) {
                    processEvent(event);
                }

                // 重置 key,如果失败则退出
                if (!key.reset()) {
                    System.out.println("WatchKey no longer valid. Exiting watch loop.");
                    break;
                }
            }
        } catch (IOException e) {
            System.err.println("An error occurred while setting up the WatchService: " + e.getMessage());
            e.printStackTrace();
        }
    }

    private static boolean isDirectory(Path path) {
        return Files.isDirectory(path, LinkOption.NOFOLLOW_LINKS);
    }

    private static void processEvent(WatchEvent> event) {
        WatchEvent.Kind> kind = event.kind();

        // 处理事件类型
        if (kind == OVERFLOW) {
            System.out.println("Event overflow occurred. Some events might have been lost.");
            return;
        }

        @SuppressWarnings("unchecked")
        Path fileName = ((WatchEvent) event).context();
        System.out.println("Event: " + kind.name() + ", File affected: " + fileName);
    }

    public static void main(String[] args) {
        // 设置监控路径为当前目录
        Path pathToWatch = Paths.get(".");
        watchDirectoryPath(pathToWatch);
    }
}

第二步,创建一个自定义类加载器,继承 java.lang.ClassLoader ,并重写 findClass() 方法,用来加载新的类文件。

class HotSwapClassLoader extends ClassLoader {
    public HotSwapClassLoader() {
        super(ClassLoader.getSystemClassLoader());
    }

    @Override
    protected Class> findClass(String name) throws ClassNotFoundException {
        // 加载指定路径下的类文件字节码
        byte[] classBytes = loadClassData(name);
        if






请到「今天看啥」查看全文