下载APP
关闭
讲堂
客户端下载
兑换中心
企业版
渠道合作
推荐作者

27 | 软件工程师的核心竞争力是什么?(上)

2019-04-30 宝玉
软件工程之美
进入课程

讲述:宝玉

时长14:37大小13.39M

你好,我是宝玉。软件工程师,是软件项目重要的人员组成,从设计到编码实现以及上线后的运行维护,都需要软件工程师的参与。所以大家都很关心的一个问题是:软件工程师的核心竞争力是什么?

软件工程师的核心竞争力

其实我在微博上问过“软件工程师的核心竞争力是什么?”这个问题,得到很多答案:技术、代码、天赋和激情、经验、想象力……

我思考过这些答案,觉得很多答案挺好,但是不够突出核心竞争力,或者没有突出软件工程师的特点。

比如说技术和代码的能力,属于基础能力,而不属于核心竞争力;天赋和激情其实放哪个职业都可以这么说,何况天赋也不是决定性因素,聪明人不是好程序员的例子也很多;

经验是很重要,但是不能说明太多问题,有些号称有三年开发经验的程序员不过是把一年的经验重复了三次罢了;想象力是很重要,但我觉得更适合科学家或者艺术家,因为他们要通过想象力在未知的领域去探索,而工程师更多是利用已有的知识去打造产品,想象力算不上核心竞争力。

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

学习能力

对于软件工程师来说,最基本的要求是技术和代码。如果你看招聘网站上招聘软件工程师的要求,都需要能掌握一门或者多门编程语言,会熟练使用工具、框架。

但熟练掌握一门编程语言、框架,还不能构成核心竞争力。因为现在技术更新迭代很快,现在你熟悉的语言或者框架,可能过几年就没有太大的市场了,需要学习新的技术。

这点做前端的同学一定深有体会,比如说前几年 jQuery 很火,你好不容易精通了,过两年又要改用 Angularjs,而现在则是 React、Vue 的天下了。而且光会这些框架还不够,还要学习使用配套的打包工具,而这些工具也一直在推陈出新,每次更新升级,都需要重新学习。

就算是编程语言,时间周期能稍微长一点,但也没有谁能保证一门语言就可以一直很火。我早些年对 Asp.Net 的掌握程度已经到了技术专家级别,后来公司要转型做移动应用,就必须要去学习 Objective-C,否则就得换个公司才行。

出国留学后要重新找工作,这时候 Asp.Net 和 Objective-C 的工作机会很少,但是前端工作机会多,我就需要去学习前端,才能有更多的工作机会。

所以我觉得,编程语言、框架、工具,这些都不是软件工程师的核心竞争力,能快速学习掌握编程语言、框架、工具的学习能力才是软件工程师最基础的核心竞争力。

解决问题的能力

为什么我说学习能力只能算是基础的核心竞争力呢?因为技术学了是要用才能产生价值的。学的好不代表用的好,所以你看很多 Leetcode 上刷题分很高的同学,让他去实现一个需求,代码可能还是会写的一团糟。

那么软件工程师怎么运用学到的技术呢?我们可以先看看软件工程师的日常工作,有哪些主要工作以及需要什么样的能力去解决:

  1. 实现功能需求——需要先分析需求,然后抽象设计,最后实现;
  2. 修复 Bug——改 Bug 最大的挑战其实是重现问题,也就是发现问题,然后再分析问题,最后解决问题;
  3. 重构代码、优化性能——对代码重构,优化性能,最难的地方其实在于发现代码问题在哪,发现性能的瓶颈,后面再去寻找解决方案,最后再解决。

也就是说,软件工程师这些日常开发工作的核心还是在发现问题、分析问题和解决问题,在这里我统称为解决问题的能力。这几个能力看起来没什么稀奇,但是要仔细分析,其实软件工程师的水平高低,恰恰就体现在解决问题的能力上面。

发现问题

若干年前我们要做一个抽奖系统,负责这个任务的程序员设计了技术方案让我审查,他的方案从功能方面是没问题的,但在安全方面却欠考虑。

我就问他如果有人用个工具模拟用户操作反复点,岂不是可以不停参加抽奖,极大提高中奖概率?于是他说那可以在前端增加限制重复点击。我说如果通过抓包工具反复直接发送数据包,不还是一样可以绕过你前端的检查吗?

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

  • 分析问题

软件工程师经常遇到的一个问题就是生产环境发生故障,新手程序员通过分析也能把问题修复,但修复完了就觉得没事了。而有经验的程序员,会在恢复后还会进一步分析故障产生的深层次原因,以及以后可以怎么预防类似的故障再次发生。

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

  • 解决问题

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

在工作中,就经常有新手程序员跑来找我请教问题,比如说遇到一个 API 不会用。这时候我通常不会直接告诉他答案,因为我可能也不知道某个 API 的用法,就算我知道,告诉他这一次了,他下一次还是不会自己去解决。

所以我会反问他:

  • “查过官方文档吗?”——基本上大部分 API 在官方文档都有说明的;
  • “有没有去搜索过?”——很多问题已经有人遇到过,而且还把解决方案都贴出来了,比如 StackOverflow 就是个很好的地方;
  • “用的什么关键字?”——很多时候没找到结果就是因为关键字没选好,比如用中文关键字很难搜索出匹配的技术帖子,改成英文使用谷歌就可以找到更多更合适的结果;

还有的问题确实不是通过搜索能解决的,需要去寻求其他组或者外部专业人士的帮助。就算是问问题这种小事,一样都能体现程序员的水平。

比如我就遇到过很多次有程序员去请教别人问题,但是都没人回复的,并不是没有人愿意帮忙他,而是他基本的问题都没有描述清楚,从他的问题很难知道表达的意思和要解决的问题。这时候我通常会建议他先去看看《提问的智慧(How To Ask Questions The Smart Way)》这篇文章。

这样的发现问题、分析问题和解决问题的能力,就是软件工程师的进阶核心竞争力。

影响力

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

为什么大部分程序员的技术水平、解决问题能力差不多,而有的升职加薪的机会更多?有的不需要去找工作,总有工作来找他们?这其中的差别,就在于他们的影响力不同。

有些程序员,做事情认真靠谱,做出来的结果让人放心,这样久而久之,就在公司形成了口碑和影响力,大家愿意与之共事。

有些程序员,乐于帮助其他人,分享自己的经验,跟一些新手程序员是亦师亦友的关系,在团队里有很高的威望。

有些程序员,有独特的项目、公司或者行业经历,比如在阿里巴巴这样的大厂有多年架构师经验,在业界有一定知名度。

有些程序员,写自己的技术博客,出去做技术讲座,成了技术大 v,在技术圈子里面有一定的名气和影响力。

这样的影响力不是一朝一夕能形成的,但却是一个软件工程师最核心的价值体现。

你需要通过一点点技术成长的积累,需要通过一个个成功项目的积累,需要通过一篇篇技术文章分享的积累,需要通过一次次帮助其他人成长的积累。而一旦形成足够的影响力,就会变成软件工程师职场发展最牢固的护城河。

所以综合来说,软件工程师最核心的竞争力其实分三层:

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

学习能力、解决问题能力和影响力一起构成了软件工程师的核心竞争力,就像下面这个金字塔图一样,我称之为软件工程师竞争力金字塔。

但必须要注意,这三层缺一不可,你不能光去追求影响力而不踏踏实实学习和做事,也不能光去做事而不学习。必须要踏实地、一层层地打好基础,这样才能让你的竞争力是持久的,而不是昙花一现。

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

如果你是软件工程师,了解了软件工程师竞争力金字塔,你就可以自下而上,更有针对性地培养、提高软件工程师的核心竞争力。

不是把自己绑死在一门技术或者一个框架上,而是训练自己的学习能力,让自己可以拥有快速学习掌握新技术的能力。

日常工作不仅仅是实现一个个的功能,做一个个的项目,而是在这个过程中,去锻炼和提升你发现问题、分析问题和解决问题的能力。这样才能最大化的你的工作经验,而不是机械重复没有积累。

在工作中,不仅是把事情做成,还要把事情做好;不仅是自己成长,还要帮助其他人成长;最大化的利用好所在平台和行业的经历,转变成你的经验和影响力。工作之外,也多分享,打造自己的品牌。

这样你就可以一点点搭建出来属于你的竞争力金字塔,构建出自己的核心竞争力。

如果你是要招聘优秀的软件工程师,了解了软件工程师竞争力金字塔,你可以自上而下,更容易筛选出来优秀的软件工程师。

首先你可以通过内部推荐,优先找那些口碑好,做事情认真靠谱的软件工程师。然后你可以考察他解决问题的能力。比如说你可以问他:

  • “项目中遇过的哪些复杂的问题?”
  • “是怎么样去解决的?”

通过对问题的答复,再深入问一些细节问题,例如:“你当时是怎么考虑安全性问题的?”“如果访问量增加一倍,会有什么影响?”等等。你就可以对他解决问题的能力有个初步了解了。

最后你还可以考察一下学习能力。比如你可以问他:

  • “最喜欢的编程语言是什么?”
  • “你是如何学习这门语言的?”
  • “如果让你学一门新的语言,你打算怎么学?”

这样你也可以对他的学习能力有一个大致了解。

总结

由于篇幅限制,我将文章分成了上下两篇。上篇主要分析了软件工程师的核心竞争力,也就是学习能力、解决问题能力和影响力。我会在下篇中,为你讲具体怎么做,才能有效提升软件工程师的核心竞争力。

学习能力,就是你学习并掌握一门技术、框架和工具的能力。好的学习能力,能帮助软件工程师在技术日新月异的今天,快速跟上技术发展的步伐。

解决问题的能力,就是发现问题、分析问题和解决问题的能力。解决问题的能力,是软件工程师非常重要的能力,帮助软件工程师在日常工作中高效完成工作,创造价值。影响力则是软件工程师价值的综合体现。

如果你是软件工程师,那么就需要自下而上,训练自己的学习能力,积累解决问题的经验,工作的过程中形成影响力,一点点去构建自己的核心竞争力。如果你要招聘或筛选优秀的软件工程师,则需要自上而下,选择那些口碑好有影响力的,能帮你解决问题的,有很好学习能力的人。

课后思考

你对于软件工程师的核心竞争力是怎么看的?有哪些是你认为有价值的能力?欢迎在留言区与我分享讨论。

感谢阅读,如果你觉得这篇文章对你有一些启发,也欢迎把它分享给你的朋友。

© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
上一篇
26 | 持续交付:如何做到随时发布新版本到生产环境?
下一篇
28 | 软件工程师的核心竞争力是什么?(下)
 写留言

精选留言(12)

  • bearlu
    2019-04-30
    3
    我个人觉得除了技术能力,还要培养其他方面的能力也是很重要,有时候思考如果我不做程序员,我还能做些什么?努力培养综合素质。

    作者回复: 是的,技术之外的能力也很重要,比如沟通能力、产品能力等,而且和技术还可以互补。

  • hua168
    2019-04-30
    2
    技术和思想一样重要,思想可以引导技术水平的提升,学习技术可以体会其中的思想。
    形而上者谓之道,形而下者谓之器。道在器中,以道御器。
    展开

    作者回复: 赞,谢谢分享!

  • 庄小P
    2019-04-30
    1
    一直有在思考自己的核心竞争力是什么?因为核心竞争力是你区别于其他人的一个法宝!现在是做算法研究的,不是leetcode那些哈,之前研究雷达在无人驾驶中的一些应用,然后网上没找到解决方案,论文也没几篇可以拿来参考!跟老师说这怎么做,老师说研究生就要学会探索未知东西!总感觉被忽悠了,不过确实,现在做的东西一大堆在网上都找不到答案,相比于自己本科的学习,感觉自己在研究生思考的机会多了(我也不想的,这谁顶得住😨😨)!
    前一个月开始在知乎上写一些分享,看到粉丝从几个变成100多个,还有读者来信,内心还是很开心的!!!
    展开

    作者回复: 加油,只要坚持多分享,肯定会越来越好!

  • Charles
    2019-04-30
    1
    讲的太好了,期待下篇。

    通篇边听边看下来,从似懂非懂到老师的系统化总结出竞争力金字塔,感觉自己对竞争力的理解和努力方向更明确了,感谢!

    顺带总结下自己:
    1. 学习能力,在自己熟悉的领域(后端),去学习一门新语言或框架之类的,感觉还好,也能适应过来,但是如果跨度比较大就会很吃力,比如区块链、人工智能、大数据之类,自己可能也清楚这个应该是基础不够扎实

    2. 解决问题的能力,自我感觉还好,可能相对项目规模较小,基本用一些“土”办法就解决掉了,和大厂可能没法比

    3. 影响力,主要停留在帮助人的层面,积累了一些口碑,像老师这样系统性的整理出知识去分享很欠缺

    另外一个我理解的还有一个竞争力,老师好像没提到,就是沟通、口头和文字表达能力,身边很多人相对比较闷,喜欢埋头做事 ,这个好像不利于整个项目或自身的发展



    展开

    作者回复: 谢谢分享
    竞争力也可以算是影响力,埋头做事结果就是影响力要低一些。

  • Felix
    2019-04-30
    1
    经济基础决定上层建筑,我认为的核心竞争力是一个人的软素质(做事态度)和方法论(做事方法)
    软素质:
    1.自驱动意识
    2.沟通协调,刨根问底
    3.经常自省
    4.敢于担责
    5.ownership
    方法论:
    1.二八原则
    2.时间管理四象限
    3.SOP
    4.ARCI
    5.敏捷迭代
    展开

    作者回复: 谢谢分享🤝

  • kirogiyi
    2019-04-30
    1
    竞争力金字塔、金三角理论,指明了我们技术和管理方向上需要具备的能力和素养,使我们的眼光和格局也会得到很大的提升,有种高屋建瓴的感觉。

    很多做技术的人,工作到一定阶段的时候,会发现遇到不可逾越的瓶颈,除了重复的工作,技术和能力上没有多大的提升,做事的心思越来越散乱,埋怨公司没给平台没给成长空间,特别焦虑,考虑换行什么的。最近公司有一小伙子,不善言谈,技术人形象,初级软件工程师,觉得软件行业太苦了,要换工作做销售(钱多),我只能叹息一下,不作过多表示,因为墨菲定律会告诉我们一些不需要去改变的事实。

    宝玉老师讲述的发现问题、分析问题、解决问题、学习能力,不止存在于软件行业,其他行业同样适用。程序语言、技术框架等等都是有保质期的,一旦过了保质期就废掉了,得重来,“耗电”得很,这就是计算机技术学也学不完的原因。换句话讲,这是真正“码农”的思想,永远在技术的包围中转圈,无法突出重围。而发现问题、分析问题等能力,只要持续不间断的去改善,保质期就是无限的,还不怎么“耗电”。

    现在我有一种感觉,计算机技术也不是那么难,也不存在学得完学不完的问题,至少比以前轻松得多,不过多去专注于技术细节,而去专注于方法和理论、眼界和格局,以及提升自己的层次,逐渐发现很多东西都有它的捷径和本质。
    展开

    作者回复: 感谢总结分享!
    是的,多站在大局上看问题,多学习方法论,多思考,多实践,多总结

  • 上善若水
    2019-04-30
    1
    这篇关于软件工程师的核心竞争力的文章让我大有所获,工作也有十几年了,一直在学习,学习能力毋庸置疑,解决问题的能力也不错,但是总觉得自己缺少点什么,原来就是少了影响力,接下来就是需要学习这个作者的思路,如何提高自己的影响力,让好公司、好工作来找自己。

    作者回复: 加油,下一篇也会给一些如何提升影响力的建议。但最关键还是要意识到这个问题

  • 纯洁的憎恶
    2019-04-30
    1
    软件工程师的核心竞争力:学习能力,解决问题的能力,口碑信用和影响力。这三点在很多领域中也都具有共性。

    作者回复: 是的,往上走相通的就越来越多了

  • 纯洁的憎恶
    2019-05-09
    快速学习能力、解决问题能力、影响力,不只是软件工程师的核心竞争力,更是这个时代个体的核心竞争力。通过高效学习和实践,持续产出发现、分析、解决各种问题的能力,解决问题能力借助影响力网络的放大,距离成功也就不远了。

    作者回复: 👍是的,现在网络给了很多人放大影响力的机会。但学习能力和解决问题的能力还是属于很基础的,打好基础才能让影响力更持久!

  • 纯洁的憎恶
    2019-05-09
    先单点突破,在横向拓展。

    我有个疑惑。我现在在央企从事采购和物资管理工作,技术不技术、管理不管理、行政不行政的,我不太确定单点突破的方向。

    作者回复: 这个问题我觉得首先是你个人的职业规划的问题,你是否有打算在技术方向深入发展,或者只打算泛泛拓展知识面,还是想管理或者其他方面发展。

    如果你是想技术方向发展,想在技术上单点突破,那么首先需要自己选定一个技术方向,web也好、iOS也好、安卓开发也好,每一种都有前途,但最好选择和对你未来职业发展有帮助的,这样才好坚持,才能尽早进入正循环。真不知道选啥,就先选流行的,好过在纠结中浪费了时间。

    技术的学习,在做中学是最好的,也是必不可少的。

    如果能在工作之内学习自然是最好的途径,但是大多数时候工作并不能给你创造这样的机会,那么你就需要考虑工作之外的学习途径了。

    尤其是公司不忙,可以考虑做一点side project,是很好的锻炼途径。比如对我来说,当年业余时间参与了一个Asp.Net的开源项目Community Server的本地化工作,对我技术成长帮助很大。还有我自己做过一个网站,也有不少用户,业余时间维护这个网站也给我很多技术上的成长。

    所以你可以考虑是不是有你选择的技术方向的项目可以在业余时间参与的,开源的或者自己做一个产品,都是不错的选择。

  • 果然如此
    2019-05-07
    学习、解决、影响,总结的很精辟,可以套用到很多领域(我小学数学还可以,善用数学公式套用法,呵呵)
    我也用.net,java也用,Python写过对某新闻客户端自动点击换取积分小实验(修改的自动跳一跳源码)、白露引擎写过微信小游戏、js、Android、php、asp、c、汇编、……
    另外,程序逻辑思想能套用很多领域,
    展开

    作者回复: 确实,其实很多道理都是相通的,在一个领域适用也能应用于其他领域,所以我觉得程序员这个行业,只要是真能构建好知识结构,年龄大并不是障碍,反而是优势。

  • nigel
    2019-05-02
    就学习能力而言,“祭海先河,尤务本原之学”,重要的是对基础知识的掌握。就像侯捷先生说的“基础的东西不易变,不易变的可重用”。

    作者回复: 👍赞,说的很有道理。

    像数据结构、算法、面向对象、设计模式、包括软件工程都属于软件开发的基础知识

收藏