软件工程师的核心竞争力是什么

 软件工程师是软件项目重要的组成人员,从设计、编码调试、维护,都需要软件工程师参与,那你知道软件工程师的核心竞争力是什么?

曾经我在知乎上问过“软件工程师的核心竞争力是什么”?网友给出了很多答案:技术、代码、天赋激情、经验、想象力......

我思考过这些答案,觉得答案挺好,但是还没有突出核心竞争力,没有展现软件工程师的特点。

例如技术和代码的能力,这个是属于基础能力;天赋和激情哪个行业都需要,何况天赋不是决定性的因素。经验也很重要,但不能说明太多问题,也许有三年开发经验的程序员只是把一年的经验重复了三次罢了;想象力我觉得更适合搞艺术和科研的,因为他们需要通过想象力在未知的领域去探索,而我们软件工程师是利用已有的知识去打造产品。

    我觉得软件工程师的核心竞争力,不是单一能力的体现,而应该是多种能力和价值的综合体,学习能力、解决问题能力和影响力构成了软件工程师的核心竞争力。

学习能力

    软件工程师最基本的要求就是技术和代码,招聘网站上公司对招聘软件工程师的要求都是能掌握一门或多门编程语言,熟练使用工具和框架。但熟练掌握编程语言和看框架还不能构成核心竞争力,现在技术更新换代很快,也许我们现在熟悉的语言或框架过几年就没有市场了,还需要学习新的技术。

    所以我觉得,编程语言、框架、工具还不能构成软件工程师的核心竞争力,能够快速学习掌握新的技术的能力才是软件工程师最基础的核心竞争力。

解决问题的能力

    技术学习了要会用才会产生价值,那软件工程师如何运用学习到的技术呢?我们可以先看看软件工程师的日常的主要工作以及需要什么样的能力去解决:

  1. 实现功能需求------需要先分析需求、然后抽象设计、实现
  2. 定位修复bug------改bug最大的挑战就是重现问题,也就是发现问题、分析问题、解决问题
  3. 重构代码、优化性能------此最难的在于发现代码问题在哪,发现性能瓶颈,寻找解决方案,最后解决

也就是说,软件工程师的日常开发工作的核心还是在发现问题、分析问题和解决问题,我们可以统称为解决问题的能力。软件工程师水平高低恰恰就是在解决问题的能力上面。

发现问题

    以前我们需要做一个抽奖系统,负责的程序员设计了技术方案让我审查,从功能来看是没有问题,但是在安全方面却欠妥。

    比如用户用工具模拟用户操作反复点,这不是就能提高中奖概率,他说可以在前段增加重复点击限制,那我又说如果通过抓包工具模拟发送数据包,不也是能绕过你的前段检查么,这个就需要服务端增加uid的检查了。

    同样一个抽奖系统需求,新手程序员看到的是如何实现功能,有经验的程序员会发现可能存在的安全隐患,未雨绸缪,把可能的安全问题消除掉,这就是发现问题的能力体现。

分析问题

    生产环境发生故障,新手程序员通过分析把问题解决修复了,就觉得没事了,有经验的程序员会在修复后进一步分析故障产生的深层次原因,后续怎么预防类似故障再次发生,会总结出故障报告供后续经验分享。

    分析问题不是简简单单分析问题的表面,还需要去分析问题深层次的原因,以及思考预防同类问题的原理。

解决问题

    发现问题和分析问题后,解决问题相对会容易一些,有的时候知道问题在哪,但是不知道怎么解决也是让人很苦恼的事情。

    工作中,有些新手程序员会问我linux某个命令怎么用,API怎么用,我通常不会直接告诉他答案,因为我可能也不知道具体用法,就算知道了我告诉他一次了,下一次他也不会自己解决,我会反问他:

  1. 查过命令手册、官方文档么
  2. 有没有百度、谷歌过,很过问题别人都遇到过,也提供了解决方案,例如StackOverflow就是一个很好的地方
  3. 关键字是否再次提取优化,有的时候关键字的不合适会导致搜索出的答案不满足期望,可以尝试用英文关键字google搜索

我也遇到过很多次程序员请求别人问题时,没人回复,并不是没有人愿意帮忙,而是他的问题没有描述清楚,别人就很难知道他想表达的意思和要解决的问题。我这里建议大家《提问的智慧(How  To Ask Questions The Smart Way)》这篇文章。

这样的发现问题、分析问题和解决问题的能力才是程序员的能力才是核心竞争力

影响力

    解决问题的能力的确是软件工程师很重要的一种能力的体现,但是还不能完全体现出软件工程师的核心竞争力。

    为什么很多程序员的技术水平、解决问题能力相差无几,但有的升值加薪的机会就很多?有的不需要自己去找好工作,总有好工作主动来找他?这其中的差别,就是在于他们的影响力不同。

    有些程序员做事情认真靠谱,在公司形成好的口碑和印象里,大家愿意与之共事;有的乐于助人,分享自己的经验,和别人亦师亦友,在团队有很高的威望;有的有独特的项目、公司或行业经历比如阿里巴巴大厂的几年架构师经验,在业界有知名度;有的写自己的技术博客,做技术讲座,成了技术大V,在技术圈子有一定的影响力;这些影响力不是一朝一夕形成的,但却是一个软件工程师最核心的价值体现。

    我们需要通过一点点技术成长积累,一个个成功项目的积累,一篇篇技术文章分享的积累,一次次分享经验的积累,而形成足够的影响力。

    所以综合来说,软件工程师的最核心竞争力是

  1. 最底层、最基础的是学习能力,通过学习能力,快速掌握新的技术
  2. 中间层就是解决问题的能力,利用学习到的技术去发现问题、分析问题和解决问题
  3. 最上层就是影响力,核心竞争力的综合体现

下图的金字塔图,我们称之为软件工程师的竞争力金字塔:

https://static001.geekbang.org/resource/image/e7/fe/e7bb173f82cb83fb8a631150357154fe.jpg

    我们需要注意,三层缺一不可,我们必须打好基础,才会让我们竞争力持久而不是昙花一现。

    软件工程师竞争力金字塔的意义

    我们需要训练自己的学习能力,日常工作中实现一个个功能,做一个个项目的过程都是在锻炼和提升我们的能力,工作中不但要把自己的事情做好,还要能够帮助别人成长,最大化的利用好所在平台和行业的经历,转变成我们的经验和影响力,工作之外也多分享自己的经验,打造自己的品牌。

    我们可以通过如下问题考察软件工程师的能力:

  1. “项目中遇到过哪些复杂的问题”
  2. “都是怎么去解决的”

通过问题的答复,我们可以继续深入,“当时是怎么考虑安全性问题的?”“如果访问量增加一倍,会有什么影响?”从回答问题中我们就可以对他的能力有个初步了解。

最后我们还可以考察他的学习能力:

  1. “最喜欢的编程语言是什么”
  2. “如何学习这门语言的”
  3. “如何学习一门新的编程语言”

作为软件工程师,我们就需要自下而上,锻炼自己的学习能力,积累解决问题的经验,工作过程中形成影响力,一点点去构建自己的核心竞争力。

猜你喜欢

转载自blog.csdn.net/yangrendong/article/details/89703724