最近领导提到到一个话题:做得好更好死得更快。然后周末大雨闲在家里总结了关于程序员悖论的思考。
一、前言:扁鹊三兄弟的故事
有一天魏文王就问扁鹊,让他评价自己兄弟三个的医术高低。
扁鹊说:大哥医术最好,二哥医术次之,自己医术最差。
魏文王不理解,很纳闷,就问扁鹊:既然你的医术不是最高,那为什么你的名字却是最大?
扁鹊回答:
我大哥治病专攻“未病”,往往是在病情刚开始还没发作的时候,就及时将源头控制住并根治,因为病情初期痛苦少,持续时间短,所以知道的人不多;
二哥则擅长治疗早期的病情,关注的人也少,知道的人也不多。
而扁鹊自己治疗的患者,往往都是疑难杂症,甚至是重症患者,治疗繁琐,治疗时间长,病人痛苦,周围人关注多,所以自然而然的名气也就大了。
二、什么是程序员悖论?
有人总结了如下的程序员悖论:你架构做得好,代码易读易扩展,随便谁都能接手。你是可有可无的人。 你架构一团糟,代码除了你自己没人敢碰。你是公司的重要人物,项目没你就垮了。 你代码写得好,没什么 bug ,天天不加班。你是工作态度不积极的人。 你代码写得不好,bug 成堆,天天加班。你是公司的骨干。 这正好印证了一句古话:曲突徙薪亡恩泽,焦头烂额为上客。
业内总结出有四种程序员:
·第一种,技术出色,代码逻辑严密,bug极少。别人一周的工作他三天就完成了,领导认为他工作不饱和,于是把他开除了。
·第二种,代码规范,注释详尽。其他程序员接手他的代码,能够快速上手。领导认为他的工作谁都能胜任,于是换了一个工资较低的员工接替了他的工作。
·第三种,代码写得很差,bug繁多。每天加班加点,帮助项目渡过难关,很快就被领导提拔了。
·第四种,从不写注释,代码只有自己看得懂,其他人无法理解,项目少的他难以生存,但升职加薪却极为顺利。
这种悖论是一种常见的现象,反映了我们对程序员的期望和现实之间的矛盾。这种矛盾体现在不同的表现形式中,如架构、代码质量、工作态度等方面,因此成为程序员悖论。
架构设计
如果你设计出了一个好的架构,代码易读易扩展,架构文档全面, 本来是一件高大尚的事。但是,如果你离开了公司或者调换了部门,你留下的代码会变得容易维护,而新来的人会很容易地接手你的工作。这时,你成为了可有可无的人。这并不是说你的工作没有价值,而是说你的工作让团队的工作更容易了,没有人会对此感到惊讶或者感激。因此,你可能会感到自己的工作价值受到了低估。是不是感觉“飞鸟尽,良弓藏;狡兔死,走狗烹;敌国灭,谋臣亡”。当一个人失去了利用价值,就会被干掉或者被替换掉的下场。
代码质量
如果你的代码写得好,bug 很少,那么你会比其他人更轻松愉快地工作,几乎没有加班的压力。但是,这也意味着你的工作质量不再是一个问题,因此你可能会被认为是不积极的人。这也许是因为你的表现被认为是理所当然的,这往往会让人感到不公平。
反之,我们来看代码质量的另一个方面:如果你的代码写得不好,bug 成堆,你可能会被要求加班,以解决这些问题。这也许会让你感到不满,但实际上你可能是公司的骨干。你的工作质量虽然不是最好的,但你的团队认为你的贡献是不可或缺的,因为你能够解决最困难的问题。这意味着你的价值被高估了,但同时也意味着你的工作非常重要。
综合架构和代码质量
我们来看架构和代码质量的另一个方面。如果你的架构一团糟,代码除了你自己没人敢碰,那么你可能是公司的重要人物。如果你离开公司或者调换部门,你留下的代码可能会导致整个项目垮掉。这意味着你的价值也被高估了,但是这同时也是一个很大的责任。你需要确保自己的代码是高质量的,并且能够容易地被其他人理解和修改。否则,你可能会承担更大的责任。
三、不要抱怨你现在傻逼的系统
有没有类似经历:
1.入职3个月内,喷,这么大的系统,上亿pv的系统居然这么做的,这么做的,我提出那么做,那么做,你们都不鸟我,推翻我,哎 你们都是傻逼。
2.入职半年,咦,好像他们说的有道理啊,如果按我那么做,就会出现那些问题,那些问题。。。
3.入职一年,哦,只能这么做,这么做,你一个新来的,知道个屁啊,还那么做那么做
4. 入职两年,噢,这么做,这么做有好处,有坏处,可以再此基础上那么做那么做
傻逼的系统
傻逼的系统一般的特征:框架落后,代码混乱复杂,文档缺失,功能冗余重复造轮子等等。
存在即合理, 这么傻逼的系统还运行这么久,说明它价值的重要性。我们要感谢以前的挖了很多坑,埋好各种雷的人:
1、解决问题,加快能力成长。
2、证明你的能力,和老板谈心聊薪水。
如果一个系统代码质量很高,几乎没有bug,那还要你架构师/高级资深的程序员干嘛呢?
学会体现自己的价值
一些多年大厂出来的感受:如果系统bug不多,领导就觉得你做的事情没有挑战和难度,是不是感觉写代码是也一种艺术。
曾经有个技术大拿这么说: 当一个程序员,花了很多时间在底层,架构,这些方面的时候,后面写出的代码质量就会挺高的,而且出bug的时候也少。这样的代码和程序员,在我们这里是不行的。 因为,这体现不出你的价值。 最优秀的程序员呢,就是在底层搭建的时候,弄一些不疼不痒的问题,后面的代码出了bug,你可以去摸鱼,去改,而且还能体现你的价值。 你看,这程序员就是厉害,有问题就能解决! 而那些把底层弄得很好的,一天到晚没啥事干,天天就知道上班摸鱼~ 这是真事,而且是某大公司的技术总监。 唉。。。。。。
当电脑没有病毒了,安全软件公司就没有存在的价值。
当没有了违法犯罪份子,jing察就没有存在的价值。
四、如何展示程序员的价值
不要做没人知道的努力而是更高级的展示你的价值,善于总结,把平时零碎、表面、肤浅的感性认识升级为全面、系统、本质的理性认知。
需要技术向多人展示,而不是通过修改大量Bug。因此我们要注重平时工作的沉积,思考,以及总结能力。简而言之,就是把我们所做的事情,抽象总结出创新的方法论,向领导和其他人展示分享。
1、总结方法论提出创新解决方案,说明优秀架构设计的价值,用数据说明技术带来效率提升,达到降本增效。
我们要明白一点,绝大多数新技术,都源自现有技术的重新组合。无论从前端还是后端,无论是过时还是被炒得很热,无论是云计算还是SAAS等,其本质技术都来自于此前已经存在的技术,都要求具备良好的算法和数据结构,在此基础上不断衍生出许多新技术。我们需要真正掌握和理解已有的技术,根据业务需要,去组合出更好的原创解决方案。如果要打破技术重组,那就需要我们去理解很多技术背后的原理和系统。
- 勇于挑战和承担疑难技术点攻关,将问题集中化解决,提供平台化解决方案以及选型决策。
- 定期做总结归纳以此分析问题,解决问题。
- 发现各类型问题(不仅仅是技术),通过规范,演讲,绘图等方式解决隐患。
2、努力提升语言表达能力,多写技术文章,展示技术能力。
学习提高语言表达能力之前,学习底层元知识:
1)、建议学习知识体系如何构建:
构建知识体系(3):建立体系6个步骤_知识架构建立推进过程中‘
2)、提高思考力,主要包括:逻辑思维、本质思考力、升维思考力、结构化思考力、系统思考力、批判性思维、元认知。架构师成长之路(5)--架构师具备的思维
主要的手段:
1)勤读书,阅读优秀的技术文章,积累更多的专业术语和知识,提高语言素养和专业水平。
2)写文章,写作是提高语言表达能力的有效方法之一,公司内部发布技术文章,文档,也可以写博客。通过不断的写作练习,组织语言,逐渐提高自己的语言表达能力。
3)技术分享:多写ppt分享,参加技术会议或者组织内部的技术交流, 向他人展示技术知识和经验。
3、推进需求治理赋能业务,做对公司最有价值的事情
建立以价值为导向的需求治理机制,把有限的开发资源,投入到更有价值的项目上。
技术人员要成为最懂业务的技术大牛,用系统性思维帮助业务方更有效的解决业务问题,把技术资源投入到公司最有价值的项目上,让技术成为公司的核心资产,帮助公司建立壁垒,驱动业务的快速发展,在激烈的市场竞争中胜出!
五、程序员如何做到不可替代
不论是公司还是个人,其实都有他的“核心竞争力”。一般说来,这个“核心竞争力”就叫“不可替代性”。程序员要做到不可替代,有人说是提高自己的技术壁垒,那全是卖课的在那扯淡。技术壁垒真正有人做到估计0.1%,其他99.9%的人不行。
虽然底层技术没变,但是技术整合而产生的新技术更新迭代特别快,掌握的那几门技术过两年就用不上了。
其实真正的不可替代性一定是你拥有的东西,别人是接触不到的。
1、参与重要的项目别人参与不了的: 一般是王者段位的985博士参与导师的项目,这种项目别人根本参与不了,掌握了实实在在的技术。
2、积累和掌握一定IT顶级人脉:这个要求情商不能低,在行业随时随地都能混得开。
3、熟悉盈利业务的项目都祖传代码:只有你知道怎么修改,那你也是不可或缺的,这是看运气了。比如某个核心产品,是你挑大梁完成的,并一直坚持维护的,这就是一种“不可替代性”,公司不是找不到高手来替换你,而是任何替换你的举动,都会导致更大的成本开支,那么,你就是安全的。
但是在企业管理中,有个很重要的原则,就是绝对不允许任何人任何事,具有“不可替代性”。我们架构设计原则也一直强调N+1设计(开发的系统在发生故障时,至少有一个冗余的实例), 即不允许存在单点。
归根到底还是一句话,做好自己,做好每件事,提高自己的能力:
扎实的技术功底:需要掌握广泛的技术知识,并且能够在特定领域中深入挖掘和学习。这可以通过经验和不断学习来获得。
解决问题的能力:程序员的工作就是解决问题,需要具备快速定位问题、分析问题的能力,同时还需要善于寻找解决问题的方法和思路,这样才能在工作中快速解决问题。
持续学习并精进:不可替代的程序员需要不断学习和进步,保持对新技术和趋势的敏感度,并能够将其应用于实践中。这需要有自我驱动力和自我学习的能力。