为什么他的技术平平却是我的顶头上司?想了很长时间,深有感触

前几天,一位朋友的弟弟小刘非要找我聊聊,碍于情面,我见了他,小伙子诉苦说:我在单位写代码已经三个年头了,基本上算是一个技术骨干了,待遇也算不错,但是为什么自己的技术不错,但总不能得到提升呢?自己的项目经理技术水平一般,却是自己的顶头上司?很是郁闷!

 

  本来想批评他几句,但想想自己当年不也是这样吗?我知道你是一个勤奋的、上进的、优秀的程序员,这一点非常欣赏你!我当年也和你一样,你一定也有过这样的经历:为了搞定一个问题,本来计划凌晨0点钟搞定,然后睡觉,然而等你把这个问题搞定,舒了一口气,却发现天明了,自己很有成就感!

 

  你的上司也没有注意你充满血丝的眼睛,而是非常平淡地问:昨天那个问题搞定了吗?你的激情与成就感瞬间就消失了!

 

  如果领导这样说:那是个棘手的问题,是不是又熬了一个通宵啊,辛苦了,要注意身体啊,搞定了吗?

  

  你可能感觉心里热呼呼的,虽然很辛苦,你也可能会说:不辛苦,费了些周折,搞定了!

 

  两种不同的说法,但实际问题本身都是一样的,这只是领导艺术问题。如果你的领导是科班出身,知道那个技术难题的份量自然好说,如果他不懂技术,而且也不会对你“察眼观色”,自然不会有后面的说法。我可能会是后一种,为什么呢?因为我是技术出身,我懂其中的份量和你的技术水平。

 

  我如果问:廉颇、蔺相如谁更重要?你一定会说都重要,因为我们学过“将相和”。而到了自己就容易当局者迷了。我给你讲一个发生在我身边的事吧。

 

  你哥可能给你说过,他们的大BOSS几次请我去管理技术,也就是技术老总了,而他们单位的项目经理小于你也见过,最早和你一样的想法,有一次见我,他请教我:我的技术也不错,是大家公认的,怎么项目经理都不让我干,为什么?能不能你给我们老总美言几句?

 

  我笑了笑说:如果我真的来你们单位当技术总监,你是不是也不服啊,我也几年不在一线了。

 

  他说:不敢,我们老板都敬重的人!我只是觉得您不是我们单位的人,我把您当作老师兼前辈才这样请教。

 

  我说:说实话,写那些代码可能我真的不如你,这是事实。你记不记得上一次你们给部里面开发的“某某管理系统(涉及到一些具体的问题,请允许我用某某)”,是不是差一点你们项目部六个人要返工,可能会是2-3个月的工期,最后返工了吗?

 

  小于:没有啊,老板从北京回来笑迷迷的对我们说,大家不用返工了,验收通过了。

 

  我说:因为整个系统的需求是我做的,你们没有返工,我找“甲方”修改了流程和改革了一点东西。我和你们老板我们两个人用了半小时,省去了你们两三个月,这就是为什么你们的老板愿意请我的原因。如果是你,可能很敬业的用三个月返工,也达到了对方的满意,但成本是不是太高了点。

 

  你想进步,实在是可喜可贺,但是你要注意我们一般都会经历四个阶段:

 

   第一阶段:每个士兵为了不被敌人杀死,总是在拼命练射击,拼刺刀;这个时候也是最无聊的时候.这是最初学代码的阶段。在大学校里,那是一个练刺刀、瞄准的场所(不排除个别优秀的大学生,学生时代已经很厉害了),原以为自己的毕业设计是优,在社会上已经可以有了用武之地,到了工作岗位才知道自己的那点功夫实在不值一提。(练兵场——准程序员)

  第二阶段:老战士带新兵去开始一场真正的战役,发现第一阶段不好好练的,常常成了先驱,让新兵有了新的认识,于是活命的拼命再补。在软件企业三个月得到质的提升,这是很多人感觉在企业的三个月似乎顶上大学三、四年,因为这个时候你面临着进到软件企业这个门槛,还是被永久的离开这个行业。从三个月到三年时间左右,你可能会成为一名优秀的士兵,也可能成为一个混日子的兵痞!(优秀的士兵!——程序员)

 

  第三阶段:你升成一个团、营长,独立带营战斗,这个时候,可能是司令部让你拿下一个高地,你不再考虑一个人战斗,而是团队作战,这是软件企业应该就是一个小项目经理或者小组长。单位又分了新人,你成了前辈,你要指导他们,慢慢领导开始培养你的团队能力,你发现你的技术好,冲在前面,是很重要,新来的小兄弟很佩服你,但是如果不懂的协调,由于“水桶原理”,有一个拖后腿的,你的整个项目进度都延期了,你还得替他完成,所以只知道往前冲是不够的,还是照顾整体项目的进度,感觉学的软件工程和项目管理似乎有点用途了。(优秀的团长!——项目组长或项目经理)


  第四阶段:再往后,师、军长阶段,你才开始研究兵法,然后再升到师、军长以后,开始考虑战略,这时你应该是技术总监了。我也只能与你谈到这里,更高的就是大老板了!(优秀的将军——技术总监)

 

  最后记住一点,除了他是靠关系、拍马屁之外,他能在你的位置之上,一定有他的过人之处。小于,现在不也是项目经理了吗?我们永远要用谦虚、虚怀若谷的心态对待工作!

 

  我相信,不久,你也会成为第二个小余!

 

  小刘:我懂了!真的谢谢你!我知道我该如何做了!

【无人机】基于改进粒子群算法的无人机路径规划研究[和遗传算法、粒子群算法进行比较](Matlab代码实现)内容概要:本文围绕基于改进粒子群算法的无人机路径规划展开研究,重点探讨了在复杂环境中利用改进粒子群算法(PSO)实现无人机三维路径规划的方法,并将其与遗传算法(GA)、标准粒子群算法等传统优化算法进行对比分析。研究内容涵盖路径规划的多目标优化、避障策略、航路点约束以及算法收敛性和寻优能力的评估,所有实验均通过Matlab代码实现,提供了完整的仿真验证流程。文章还提到了多种智能优化算法在无人机路径规划中的应用比较,突出了改进PSO在收敛速度和全局寻优方面的优势。; 适合人群:具备一定Matlab编程基础和优化算法知识的研究生、科研人员及从事无人机路径规划、智能优化算法研究的相关技术人员。; 使用场景及目标:①用于无人机在复杂地形或动态环境下的三维路径规划仿真研究;②比较不同智能优化算法(如PSO、GA、蚁群算法、RRT等)在路径规划中的性能差异;③为多目标优化问题提供算法选型和改进思路。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注算法的参数设置、适应度函数设计及路径约束处理方式,同时可参考文中提到的多种算法对比思路,拓展到其他智能优化算法的研究与改进中。
在Java开中,一些看似简单的代码片段可能隐藏着严重的潜在问题,这些问题可能在短期内不会暴露,但一旦生,往往会造成难以排查的后果。以下是一些常见的简单但容易引问题的Java代码示例。 ### 3.1 单例模式中的双重检查锁定问题 在实现单例模式时,为了提高性能,开者常使用双重检查锁定(Double-Checked Locking)模式。然而,如果不正确使用 `volatile` 关键字,可能会导致线程安全问题。 ```java public class LazySingleTon { private static LazySingleTon instance = null; private LazySingleTon(){} public static LazySingleTon getInstance() { if(instance == null){ synchronized (LazySingleTon.class){ if(instance == null){ instance = new LazySingleTon(); } } } return instance; } } ``` 在上述代码中,`instance` 没有使用 `volatile` 修饰,这可能导致指令重排序的问题,从而导致某些线程看到一个未完全构造的实例。为了防止这种问题的生,应该使用 `volatile` 来修饰 `instance` 变量[^4]。 ### 3.2 使用 `ConcurrentHashMap` 时的复合操作问题 虽然 `ConcurrentHashMap` 是线程安全的集合类,但在执行一些复合操作时,仍然需要额外的同步机制来保证原子性。 ```java public class Cache<K, V> { private final ConcurrentHashMap<K, V> cache = new ConcurrentHashMap<>(); public V get(K key) { return cache.get(key); } public void put(K key, V value) { cache.put(key, value); } // 复合操作需要保证原子性 public V putIfAbsent(K key, V value) { V existing = cache.get(key); if (existing == null) { existing = value; cache.put(key, value); } return existing; } } ``` 在上述代码中,`putIfAbsent` 方法是一个复合操作,包含检查和更新两个步骤。由于 `ConcurrentHashMap` 不保证复合操作的原子性,多个线程同时调用该方法可能会导致数据不一致的问题。因此,应该使用 `ConcurrentHashMap` 提供的原子方法 `putIfAbsent` 来替代自定义实现[^5]。 ### 3.3 ABA 问题 在使用 `CAS`(Compare and Set)操作时,可能会遇到 ABA 问题。这个问题指的是一个值从 A 变成 B,又变回 A,此时 `CAS` 操作会认为该值没有生变化,但实际上中间已经生了修改。 ```java AtomicReference<Integer> atomicReference = new AtomicReference<>(1); new Thread(() -> { atomicReference.compareAndSet(1, 2); atomicReference.compareAndSet(2, 1); }).start(); new Thread(() -> { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } boolean success = atomicReference.compareAndSet(1, 3); System.out.println("CAS success: " + success); }).start(); ``` 在上述代码中,第一个线程将 `atomicReference` 的值从 1 改为 2,然后再改回 1。第二个线程在执行 `CAS` 操作时会成功,因为它无法感知到中间的变化。为了解决这个问题,可以使用 `AtomicStampedReference` 来为每次修改添加版本号,从而区分值是否真正生变化[^3]。 ### 3.4 类型转换问题 在进行类型转换时,如果不进行类型检查,可能会导致 `ClassCastException`。 ```java Object obj = "Hello"; Integer i = (Integer) obj; // 抛出 ClassCastException ``` 在上述代码中,`obj` 是一个 `String` 类型的对象,尝试将其强制转换为 `Integer` 类型会导致运行时异常。为了避免此类问题,可以在转换前使用 `instanceof` 进行类型检查。 ```java if (obj instanceof Integer) { Integer i = (Integer) obj; } ``` ### 3.5 异常处理不当 在捕获异常时,如果直接捕获 `Exception` 或 `Throwable`,而没有进行适当的处理,可能会掩盖潜在的问题。 ```java try { // 可能抛出异常的代码 } catch (Exception e) { // 忽略异常 } ``` 在上述代码中,所有异常都被捕获并忽略,导致问题无法及时现。正确的做法是捕获特定的异常,并记录日志或采取适当的恢复措施。 ```java try { // 可能抛出异常的代码 } catch (IOException e) { e.printStackTrace(); } ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值