软件工程师的核心竞争力
原文链接:https://blog.****.net/rendong_yang/article/details/89703724
软件工程师的核心竞争力,不是单一能力的体现,而应该是多种能力和价值的综合体,学习能力、解决问题能力和影响力构成了软件工程师的核心竞争力。
1、学习能力
软件工程师最基本的要求就是技术和代码,招聘网站上公司对招聘软件工程师的要求都是能掌握一门或多门编程语言,熟练使用工具和框架。但熟练掌握编程语言和看框架还不能构成核心竞争力,现在技术更新换代很快,也许我们现在熟悉的语言或框架过几年就没有市场了,还需要学习新的技术。
所以,编程语言、框架、工具还不能构成软件工程师的核心竞争力,能够【快速学习】掌握新的技术的能力,才是软件工程师最基础的【核心竞争力】。
2、解决问题的能力
学习了技术要会用才会产生价值。软件工程师的日常的主要工作和解决问题需要的能力:
序号 | 主要工作 | 需要的能力 |
---|---|---|
1 | 实现功能需求 | 先分析需求,然后抽象设计、实现 |
2 | 定位修复bug | 改bug最大的挑战就是重现问题,也就是发现问题、分析问题、解决问题 |
3 | 重构代码、优化性能 | 最难的在于发现代码问题在哪,发现性能瓶颈,寻找解决方案,最后解决 |
也就是说,软件工程师的日常开发工作的核心还是在发现问题、分析问题和解决问题,我们可以统称为解决问题的能力。软件工程师水平高低恰恰就是在解决问题的能力上面。
2.1 发现问题
新手程序员看到的是如何实现功能,有经验的程序员会发现可能存在的安全隐患,未雨绸缪,把可能的安全问题消除掉,这就是发现问题的能力体现。
2.2 分析问题
生产环境发生故障,新手程序员通过分析把问题解决修复了,就觉得没事了,有经验的程序员会在修复后进一步分析故障产生的深层次原因,后续怎么预防类似故障再次发生,会总结出故障报告供后续经验分享。
分析问题不是简简单单分析问题的表面,还需要去分析问题深层次的原因,以及思考预防同类问题的原理。
2.3 解决问题
发现问题和分析问题后,解决问题相对会容易一些,有的时候知道问题在哪,但是不知道怎么解决也是让人很苦恼的事情。
遇到过很多次程序员请求别人问题时,没人回复,并不是没有人愿意帮忙,而是他的问题没有描述清楚,别人就很难知道他想表达的意思和要解决的问题。建议大家《提问的智慧(How To Ask Questions The Smart Way)》这篇文章。
这样的发现问题、分析问题和解决问题的能力才是程序员的能力,才是【核心竞争力】。
3、影响力
解决问题的能力的确是软件工程师很重要的一种能力的体现,但是还不能完全体现出软件工程师的核心竞争力。
为什么很多程序员的技术水平、解决问题能力相差无几,但有的升值加薪的机会就很多?有的不需要自己去找好工作,总有好工作主动来找他?这其中的差别,就是在于他们的影响力不同。
1、有些程序员做事情认真靠谱,在公司形成好的口碑和印象里,大家愿意与之共事;
2、有的乐于助人,分享自己的经验,和别人亦师亦友,在团队有很高的威望;
3、有的有独特的项目、公司或行业经历比如阿里巴巴大厂的几年架构师经验,在业界有知名度;
4、有的写自己的技术博客,做技术讲座,成了技术大V,在技术圈子有一定的影响力。
这些影响力不是一朝一夕形成的,但却是一个软件工程师最核心的价值体现。
我们需要通过一点点技术成长积累,一个个成功项目的积累,一篇篇技术文章分享的积累,一次次分享经验的积累,而形成足够的影响力。
所以综合来说,软件工程师的最核心竞争力是:
序号 | 层次 | 内容 |
---|---|---|
1 | 最底层、最基础 | 学习能力,通过学习能力,快速掌握新的技术 |
2 | 中间层 | 解决问题的能力,利用学习到的技术去 发现问题、分析问题和解决问题 |
3 | 最上层 | 影响力,核心竞争力的综合体现 |
下图的金字塔图,我们称之为软件工程师的竞争力金字塔:
提高软件工程师的核心竞争力:
1、提升学习能力
学习能力是软件工程师最基础的能力,直接决定了我们掌握技术的速度。现实中,有些程序员掌握新技术的能力就是快,因为他们已经构建了自己的开发知识体系,绝大部分东西在他的知识体系里已经有了存储,不需要去学习,只需要去学习新知识独有的东西就好了。
构建自己的知识体系:
1.1 首先需要在一个技术领域深耕
每个人的精力是有限的,一开始专注在某个技术领域容易在短时间内取得成绩,同时也是建立起了最初的知识体系,为未来的知识森林种下第一颗大树。如果我们一开始就是广泛涉猎多个领域,又没有掌握好的话,就相当于我们种的只是一片知识的灌木,最终只能收获像灌木丛的知识体系。
1.2 只有一个领域的知识真正吃透,才能有效地共享到别的领域,构成知识领域的森林
要在某一个领域的技术达到一定深度,通常需要三年以上的时间,熬过此阶段,我们就会在此技术领域获得一定成就,不仅仅收获知识树,还能收获技术上的自信,才能相信自己在其他技术领域也会取得同样的成就。
1.3 相近领域逐步横向拓展
当我们在一个技术领域达到一定深度后,可以开始横向扩展,最好是往相近的领域扩展,因为这样我们可以共享之前的知识,容易快速迭代。
当然横向构建知识体系,不是一个轻松的过程,因为之前领域取得的成就会让我们变得舒适而不愿去挑战学习心得知识,但只要我们迈过这道坎,掌握了新领域的知识,会感觉整个知识体系一下子扩展很多。
2、提高解决问题的能力
第1步:明确问题
解决问题,最重要的一步就是明确问题是什么,这个跟做项目的需求分析一样,搞清楚目标是什么,才能有的放矢。同时也需要透过现象看本质,明确问题背后是不是还有其他问题。
第2步:拆分和定位问题
一个复杂的问题只有经过拆分,才好找到本质的问题。.
第3步:提出解决方案并总结
通过总结,我们可以提升解决问题的经验。尤其在解决完问题后,想一想如何预防以后类似问题的发生。如果我们每次解决完问题后,还能提出一个预防问题发生的方案,大家会对我们印象很深刻。
3、提升影响力
提升自己的影响力,我们大多会忽略去做,但是影响力却是程序员核心竞争力的最顶层,也是软件工程师能力的综合体现。当我们意识到影响力是有价值有意义的事情后,怎么去做反而没那么难。
3.1 在某个领域做出了足够牛的成绩
有些程序员能在某个技术领域做到一定高度,达到了常人难以达到的成绩,比如PHP开发组核心成员的鸟哥慧新宸,写Vue框架的尤雨溪,前端的Winter,做到他们这样,基本上是需要实力、机缘和坚持。
3.2 做事情超出预期
在软件项目中,作为程序员,每个人都会对我们有预期,项目经理希望我们如期完成项目,产品经理希望我们完成需求,别的程序员希望我们代码质量好;新手程序员,大家希望代码不要有太多问题,高级程序员,大家希望我们不但要写好程序,还要能带带新人。
我们如果能做事情超出预期,就会让别人对我们刮目相看,进而形成口碑。例如上面的,我们解决完一个问题,还能想到怎么预防问题再次发生的方案,很显然超出了他人对我们的预期了。
可以看看《程序员也可以懂一点期望值管理》这篇文章,降低别人对你的期望,然后努力做出高于期望的事情。
3.3 帮助他人就是帮助自己
我们不能认为教会别人是教会徒弟饿死师傅,其实教会别人最大收获的恰恰是自己。程序员的经验,很大部分来自于解决问题时积累的经验,工作中遇到的问题其实是很有限的,但如果帮助别人解决问题,其实是放大了我们的工作经验,也是形成影响力最简单有效的途径。
3.4 分享就是学习和打造影响力
写博客,就是交朋友,帮助思考、学习。所以,在学习中通过分享,在教中学,当然分享的形式多种多样,除了博客,公司内部的讲座也是不错的分享途径。
总结:
软件工程师的核心竞争力,体现在学习能力、解决问题能力和影响力三个方面。
序号 | 方面 | 内容 |
---|---|---|
1 | 提升学习能力 | 构建好自己的知识体系,需要在一个技术领域深耕,然后往相近的领域逐步横向拓展 |
2 | 提升解决问题的能力 | 形成自己的方法论,去发现问题,分析问题和解决问题 |
3 | 提升自己的影响力 | 在一个领域深入打造自己独特的有价值的能力,让自己做事情能超出别人的预期,同时乐于分享和帮助别人 |