独孤木专栏Delayed Project(中)

博客讲述了项目管理中常见的拖延与逃避问题。有人在被询问项目进度和上线时间时,拒绝明确承诺,用场面话拖延;有人在项目出现问题时,找借口、提不合理要求后辞职逃避。最后项目常找菜鸟或好好先生接手,导致项目状况更差。
拒绝任何明确的承诺
在某次的project review meeting上。
乔安娜:布鲁斯,你觉得我们什么时候可以上线?
布鲁斯:关于这个问题,我需要跟我们team member仔细评估讨论之后,才可以回答你。
下次的project review meeting。
乔安娜:布鲁斯,你跟你的小组讨论过了吗?你觉得我们什么时候可以上线?
布鲁斯:关于这个问题,我目前还在做work breakdown。
乔安娜:那什么时候你才会给我答案?
布鲁斯:下次开会告诉你。
下次的project review meeting。
乔安娜:布鲁斯,你觉得我们什么时候可以上线?
布鲁斯:如果一切进行顺利的话…
乔安娜打断:什么叫做『一切进行顺利的话』?你到底确不确定你要提出来的schedule?
布鲁斯:这里面变量很多,有很多不可预知的risk…
乔安娜打断:那你把你的risk都列出来。
布鲁斯:我不知道耶,如果这样的话,我想我还需要跟开发团队讨论过以后,才有办法提供risk list。况且即使我把所有的risk列出来,还有一些我们原先没有预期的risk可能会发生?
乔安娜快气死了:那你到底什么时候可以告诉我们最新的schedule?
布鲁斯:下次开会告诉你。
乔安娜想,神啊,救救我吧。…
这种策略其实很简单。每一句话都是由『If then else』组成。千万不要给任何承诺,或是确定的意见。回答得越虚无缥缈,高深莫测,别人越难抓你语病。如果问你的意见,不是要回家请问专家学者,就是要组成委员会,经过审慎评估研究之后,才可以回答。你完全没有个人的看法。这个做法我们在政坛上常常看到。例如:
记者气喘如牛地说:市长,市长,我们的摄影记者背着摄影机有点跟不上你健步如飞的轻盈步伐,这样会没办法捕捉你穿著运动短裤以及性感小背心跑步的英姿。你可不可以跑慢一点?
市长:关于这个问题呢,我目前保持着开放的心理,没有什么特定的想法。我想邀集几位专家学者,组成一个跑步速度特别委员会,经过他们从各个角度,仔细小心地审慎评估,多方面地全盘考量以后,一定会给大家一个周延的答复。
记者还在喘,心想,不会吧,你就跑慢一点,干嘛还要搞个委员会?让我再问一次:市长,那以你现在的心情来说,你到底会不会跑慢一点?
市长:我想如果他们的结论一出来,我一定会参考他们的意见,做出最有利于我们市民大众的决定。
记者还在喘,因为还是追不上:可不可以有更明确的答案?我们已经快要追不上了。
市长:如果大家对于这个问题有这么高度的兴趣,我想我一定会在最短的时间内,给大家一个满意的答案,不然就会辜负大家对于我的爱护。谢谢大家。
接着市长就咻地一下子就跑掉了。留下不知道在哪里的专家学者委员会,以及快要缺氧的记者朋友。
说话的艺术很重要。当你不确定什么时候可以完成,也没有办法确定该到的资源都可以support时,就只好装死,给一些看起来虚无缥缈的承诺。以及空洞的场面话。只要你的官位够大,硬撑到底,其实客户是拿你一点办法都没有。下面是一个模板,请参酌使用。
我们公司非常重视这个问题,CEO已经指示要尽我们最大的努力,来展示我们的诚意。为了表示我们的慎重,我们已经组成了一个特别委员会,由我本人亲自主持,我们会daily来review我们的进度,并且会努力在最短的时间内,实时地update给诸位。我想我们一定会通力合作,在最短的时间内,发挥最大的可能。务必要让已经落后的进度,可以顺利地赶上,甚至是超前。如果有帮助的话,我想我还会运用我们大陆地区的人力,来加速这个案子的开发。
好吧,场面话讲个几次还行。用多了,容易被轰出来。所以一定要配合其它的方法来进行。不过偶尔说个几次场面话来拖个几个礼拜,其实还蛮管用的。
会采取这种步骤的人呢,我们可以说他们是从不轻诺,因为他们根本就不打算许下任何承诺。事实上还有人会称呼他们『重然诺,讲信用。』我个人则是认为,这只是在换个方向来躲避问题而已。我总觉得逃避问题,只是假装问题不存在,并没有办法让整个项目获得什么实质上的改善。对于整个project的schedule来说,也没有什么正面的效益。唯一可以达成的效果,就是延缓真相爆发的时间点。
逃命
逃命其实是逃避问题的极致表现。对很多人来说,当他发现项目已经病入膏肓时,此时与其和项目一起向下沉沦,过着暗无天日的加班生活,不如不管这个项目的死活,赶快找好下一个工作,等到事情快要爆发,找个机会跟主管起冲突,接着双手一撒,就可以拍拍屁股走人。
如果你平日就是个温良恭俭让的翩翩君子,对于怎么跟主管起冲突,觉得十分棘手,或许你可以参考下面的例子。
在超级市场里头,有个小男孩倒在地上不停地哭喊,双手双脚则是不断地胡乱挥舞,他的爸爸则只能够在旁边尴尬地陪着笑脸,一边闪躲旁人异样的眼光。走近一听,小男孩嘴中大声哭喊的是:『我不管,我不管,我就是要买这台玩具汽车啦…』
二十年后,这个小男孩当了项目经理。为了让你比较容易理解他的性格,我就借用一个典型的人物。我们就姑且叫他韦小宝吧。
话说小宝混了很久,他已经有很长的时间没有去理他手头上的项目了。眼见着此时,最大客户神龙集团的四十二章经全文检索系统,已经要delay了。在某次内部的project status report meeting上,他发难了。
小宝:下个礼拜一就已经是这个project implementation phase的deadline。我刚刚才听说,我们现在落后的进度,大概要再一个月才赶得上。
吉娜:什么?!小宝,那你之前为什么都没有提出来?
小宝:我也不知道。我原本以为是来得及的。你也知道,胖头陀那个家伙一向独来独往,又沉默寡言,我哪知道会有这么大的问题?
吉娜快气死了,那我养你干嘛?现在不急着发火,先耐住性子:那你有什么backup plan?
小宝:归根究底,这都是因为本来打算进来一起coding的瘦头陀没有进来,才会变成这样。要不就是让瘦头陀一起进来,两个人一起拼拼看。我想瘦头陀如果可以一整个礼拜都进来,他们两个师兄弟联手一定所向无敌。我们应该有机会可以赶上落后的进度。
吉娜:可是瘦头陀现在还陷在东珠公司的项目里啊。这件事情早就跟你讲过啦,不然瘦头陀怎么不会去帮你忙?
小宝:那我就没有办法了,这是你自己要问我的backup plan是什么,我唯一的plan就是这样,你要负责support我,我没有办法manage这么多变量。如果你也没有办法,那我不管了,你自己去跟洪总裁解释吧。
吉娜只好无可奈何的说:好吧。我来想办法。
过了一个礼拜。
小宝:看来公司一点都不在乎神龙集团这个案子。
吉娜对于这样的指控,感到十分的震惊:哪有这回事?我不是已经把瘦头陀调过去了吗?
小宝:他上个礼拜五还跑去东珠公司开会。就是因为这样子,神龙集团的这个案子才会delay。
吉娜解释:我临时调他过去,已经被东珠公司的毛总经理给骂到臭头了,有事情一定要瘦头陀出席,不过就是去开个会嘛。
小宝大声说:那是你的事情,我管不到也不敢管,我们这个案子已经这么紧急了,我都说过一定要瘦头陀整整支持一个礼拜了,居然还抽他去别的公司开会。我们最需要resource的时候,还让他分心去做别的案子?分明公司就是不想让我们可以准时deliver。既然公司这么不重视这个案子,我也不想管了。我要辞职。
吉娜忍住脾气:小宝,怎么可以说公司不支持你呢?我已经这样全心全意地支持你,为了这个案子,我都一直被CEO点名起来罚站了,你怎么可以在这个时候抽手不管。喂,你不能这样子,做事情虎头蛇尾,这样传出去对你的名声不好听啊。
小宝:那是我的问题,不用你管。这样吧,我就做到这个礼拜五,赶快找人来跟我交接吧。
(作者注:如果你不认识韦小宝,你该看看金庸先生所着的『鹿鼎记』。)
要吵架其实蛮简单的,先要一些要不到的资源,例如『我们这个案子现在这么紧急,需要超人二十四小时陪着加班。』或是尝试违背物理定律:『从现在开始,每一天都要有加倍的生产量,工作一天就应该要有四十八个小时的生产量。』提出太夸张的request,resource当然是要不到啦。接着就找个开会的机会大喊大叫:『都是因为你们没有团队精神,不愿意牺牲奉献,又不愿意提供足够的协助,所以这个案子才会delay。』然后加一句:『既然公司都不愿意支持这个案子,我也不想管了。』桌子一拍,就可以顺利拂袖而去。
这个策略最重要的重点在于讲话务必大声,即使主管已经把门关起来,还是要让整个公司的人都听到你的咆哮、不满以及委屈,这样才能达到如雷贯耳的效果。不了解的人,还会以为你个性刚正不阿,做事情颇具原则。
一旦有人祭出这种撒手锏,这时候就会看到所有可能接手的人,个个不是告老托病,就是谦称资质驽钝。如果你企图用权势威逼就范,通常就会被人以离职相胁。
小宝离职后,公司头一次召开部门会议。
吉娜:大家都知道,神龙集团的四十二章经项目现在需要有一个新的PM。有没有谁自告奋勇的?
会场上一片静默。
吉娜:布鲁斯?
布鲁斯:你们都知道,正文集团的案子,我现在正在忙着UAT。怎么有可能可以支持神龙集团的案子?
吉娜:马龙,你呢?
马龙:这应该留给年轻人去表现。我年纪大了,老骨头恐怕顶不住这票年轻人。
吉娜:哎呀,大家都知道你是老当益壮,一定没问题的。这样吧,就麻烦你了。
马龙:唉,如果真要我接的话,就只好告老还乡了。我也差不多到了该退休的年纪了。
强森:咦!我听说RD部门,下个礼拜不是会有一个叫做艾尔的新人吗?我听说他以前做过PM。
马龙就好象溺水的人,忽然看到一块大木头:是啊,听说他是台大毕业的高材生喔,年纪轻,体力一定很好。
布鲁斯:我看这种有为的青年,一定要让他好好地磨炼一下。多接受一些挑战,一定会对他的将来很有帮助。
吉娜心想,这真是一语惊醒梦中人。有个菜鸟可以当替死鬼,我干嘛还要来这边求爷爷告奶奶的:这个建议很好。我会跟RD部门的乔丹商量借将。
吉娜跟乔丹商量了很久,终于说动乔丹,让他愿意放人。
一周后,艾尔on board了,吉娜把他叫进她的办公室:艾尔,我看过你的履历了,你以前的表现非常地优异。
艾尔谦虚地说:您过奖了。
吉娜:没有,绝对没有。这么优秀的人才到了我们公司,绝对是公司之福。
艾尔:哪里哪里。
吉娜:我想你是个很优秀的人才,不过公司里面的其它人,可能还没有办法了解这一点。现在有个机会,让你可以在我们公司里面可以建立起属于你自己的credit。我也希望可以让你在工作上,有所成长而提升。
艾尔:是什么样的机会呢?
吉娜:我想让你有个当PM的机会。你现在是senior engineer,看过你的履历以后,我想你应该具备担任PM的实力。接下来就看你有没有勇气接受这样的挑战了…
于是乎,经过了吉娜吹捧之后,艾尔被灌了不少迷汤。于是乎,有点飘飘然,又非常具有企图心跟责任感的艾尔到了神龙集团,这才发现目前整个project team都on site。他心想,应该先跟team member聊聊天。结果刚好让他发现一个站在engineer后头看人写程序的人。
艾尔:我是新来的PM。你是我们公司的员工吗?啊,你是神龙集团的经理喔。抱歉抱歉,新人上任还要请你多多指教…
几番角力加上众人装死的结果,通常不是找个菜鸟经理,就是找个好好先生,再不就是从项目团队里面找一个替死鬼。真的找不到其它的人,高阶主管就只好勉为其难,自己下海。除非运气好,刚好遇到一个真命天子,功力远胜过前任项目经理,否则这种临危受命的事情一旦发生,毕竟新人上任对于项目各种繁杂的事情,短时间内一定没有办法好好掌握,一个原本已经delay的project,就会每况愈下。
<think>我们被要求回答关于Java中Delayed接口和DelayQueue的使用及原理。根据提供的引用内容,我们可以总结出以下关键点: 1. Delayed接口是用于表示具有延迟时间的对象,它继承自Comparable接口。 2. Delayed接口要求实现两个方法:getDelay(TimeUnit unit)和compareTo(Delayed o)。 3. DelayQueue是一个无界的阻塞队列,用于存放实现了Delayed接口的对象,只有延迟期满的元素才能被取出。 4. 队列中的元素根据其剩余的延迟时间进行排序,延迟时间最短的排在队列头部。 我们将从以下几个方面进行回答: 一、Delayed接口概述 二、DelayQueue的基本原理 三、DelayQueue的使用方法(包括代码示例) 四、适用场景 五、注意事项 同时,我们将按照要求使用LaTeX格式标记行内数学表达式(虽然本问题中数学表达式较少,但如果有比较时间等表达式会使用),独立公式单独成段。 最后,生成相关问题。 注意:引用内容在回答中引用的地方需要添加引用标识,如[^1]。 </think> ### Java中Delayed接口及DelayQueue的使用与原理 #### 一、Delayed接口概述 `Delayed`是Java并发包(`java.util.concurrent`)中的接口,用于表示具有延迟时间的对象。其核心方法为: ```java public interface Delayed extends Comparable<Delayed> { long getDelay(TimeUnit unit); // 返回剩余延迟时间 } ``` 实现该接口的类必须定义`getDelay()`方法(计算当前时间到触发时间的剩余时长)和`compareTo()`方法(定义元素排序规则)[^2][^3]。 #### 二、DelayQueue原理 1. **数据结构** - 基于优先级队列(`PriorityQueue`)实现的无界阻塞队列 - 内部使用`ReentrantLock`保证线程安全 - 元素按剩余延迟时间排序:延迟最短(即将到期)的元素在队列头部[^3][^4] 2. **工作流程** - **入队**:插入元素时根据`compareTo()`排序 - **出队**: - 检查队头元素的`getDelay()`返回值 - 若返回值≤0(表示到期),则取出元素 - 若未到期,线程阻塞等待至到期时间[^5] 3. **排序规则** 通过`compareTo()`实现优先级排序: ```java public int compareTo(Delayed o) { return Long.compare(this.getDelay(NANOSECONDS), o.getDelay(NANOSECONDS)); } ``` #### 三、使用示例(定时任务调度) ```java // 1. 实现Delayed接口 class DelayedTask implements Delayed { private final String taskName; private final long triggerTime; // 触发时间戳(纳秒) public DelayedTask(String taskName, long delayInMillis) { this.taskName = taskName; this.triggerTime = System.nanoTime() + TimeUnit.NANOSECONDS.convert(delayInMillis, TimeUnit.MILLISECONDS); } @Override public long getDelay(TimeUnit unit) { return unit.convert(triggerTime - System.nanoTime(), TimeUnit.NANOSECONDS); } @Override public int compareTo(Delayed o) { return Long.compare(triggerTime, ((DelayedTask) o).triggerTime); } } // 2. 使用DelayQueue public static void main(String[] args) throws InterruptedException { DelayQueue<DelayedTask> queue = new DelayQueue<>(); queue.put(new DelayedTask("Task1", 3000)); // 3秒后执行 queue.put(new DelayedTask("Task2", 1000)); // 1秒后执行 while (!queue.isEmpty()) { DelayedTask task = queue.take(); // 阻塞直到有任务到期 System.out.println("执行任务: " + task.taskName); } } ``` **输出**: ``` 执行任务: Task2 // 1秒后输出 执行任务: Task1 // 3秒后输出 ``` #### 四、适用场景 1. **定时任务调度**:如订单超时取消、缓存过期清理[^1][^5] 2. **重试机制**:失败任务按指数退避延迟重试 3. **游戏开发**:技能冷却时间管理 4. **分布式系统**:轻量级延迟消息队列(需注意宕机任务丢失问题)[^5] #### 五、注意事项 1. **线程安全**:`DelayQueue`是线程安全的,多线程环境下可直接使用 2. **内存管理**:长时间未触发的元素可能导致内存占用增长 3. **宕机恢复**:JVM重启会导致队列数据丢失,需结合持久化方案(如Redis、MQ)[^5] 4. **时间精度**:`System.nanoTime()`提供纳秒级精度,但实际调度受系统时钟影响 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值