软件工程师应该具备哪些职业素养?

49 阅读9分钟

文章首发微信公众号:非典型程序猿

mp.weixin.qq.com/s/45NmA6CZk…

198895729-ddf2dfc0-b9f6-4a4f-83bc-3c32d297330d.gif

我们先从工程能力模型谈起,作为一名合格的软件工程师,首先从能力模型上评价每条指标都应该至少处于及格线(6 分),优秀的软件工程师每条指标更应该达到 8 分水准(满分 10 分计)。

我们评价一个软件工程师是否合格可以从技术能力、诚信与道德行为、项目管理能力、团队合作能力、沟通能力、创新能力和学习能力这七个维度来看待。

一、技术能力

技术能力是程序员的看家之本,技术能力不足其它能力再强,单从敲代码这个角度,就不太胜任了。

1. 基础知识

具备扎实的计算机基础,包括计算机组成原理、计算机网络、操作系统、算法与数据结构和编译原理相关知识。

2. 程序语言

学会几门编程语言(平时经常使用的,比如 Python、C、Java、C++、Swift 等)。编程语言是工具,对编程语言没有太大的执念,非要说 PHP 是最好的语言,就显得有点钻牛角尖。

3. 程序架构

熟悉常用的程序架构,比如 MVC、MVP 和 MVVM 等。能够按照实际需求合理的使用程序架构,比如 Android 一锤子 Demo,想都不用想直接 MVC 开怼,方便快捷,适合才是硬道理。掌握常用的设计模式(单例模式、工厂模式、策略模式、适配器模式和建造者模式等)。灵活的把设计模式应用到软件中,而不是机械的死搬硬套,不管是否合适为了应用设计模式而应用。

4. 开发工具

可以在开发中灵活使用开发工具(包括环境配置、断点、代码搜索、快捷键、程序编译和打包等)。也不见得非要执拗 VIM 是最好的编辑器,只要用的顺手、效率高,直接 TXT 开怼也没问题。另外版本控制工具也是必须会用的,比如 Git。最后,还有各种辅助开发的常用工具也要会使用,比如代码比较工具、十六进制查看工具等。

5. AI 使用能力

当下也要学会使用 AI 大模型和 AI IDE 编程,拥抱先进生产力避免被淘汰,程序之事不决问 AI。

6. 重构能力

经常重构自己的代码。审视自己的代码,能看出以前写的代码不好的地方。

怎么证明自己的代码结构良好,可维护性高,那就是很容易扩展修改。怎么证明自己的代码容易修改,一样的道理“梭哈”一把看看,是不是随便改,秀出来!可以采用 TDD 的方式开发软件,让自动化测试把关重构质量。

7. 英语阅读能力

具备优秀的英语阅读能力,毕竟很多文档都是英文的(现在机翻很强大,这一条作用再递减)。尤其一些国外的新技术都是英文文档,不看英文文档,离新技术又远了一步。

8. 其他

开发高质量的软件是我们的追求,甚至应该知道软件出 BUG 是我们的代码设计不良造成的,而不是寄希望于测试找 BUG,更多的是从源头少产生 BUG。

知道瀑布式开发和敏捷开发的区别,也了解测试驱动开发在干什么,懂得单元测试的重要性,知道集成测试是做什么。

二、诚信与道德行为

诚信与道德行为是底线,诚信是立足的根本。诚信一般指实事求是、诚实、守信、不欺骗、不弄虚作假、言行与思想一致。在英语中,诚信(integrity)除了“正直、诚实、不搞欺骗、权术、虚伪和各种肤浅的手法”等含义外,还有“坚定地按照道德、艺术或其他价值准则办事”的意思 。诚信是人类社会的基本道德准则,也是科学的生命。

我们承诺的一些事就要办成,这也是有责任心的表现。没人喜欢和不诚信的人打交道。广义的来看,公司的一些流程规章我们要执行到位,比如要求我们按时上库、检视代码,那就要按照要求去做。没做出来的功能用假数据糊弄,这就是弄虚作假,还真有程序员这么干,这实际上是害群之马。永远相信群众里大部分都是好人,但群众中也藏着坏人。

三、项目管理能力

程序员也需要一定的项目管理能力,合理评估自己的工时、工期,自己做的功能是否会延期。是否需要及时向上级求助,管理好自己的项目优先级,推动自己的上游,按时达成目标节点。当目标存在冲突是及时预警和各方沟通提前沟通,寻求解决方案。

程序员需参与制定项目目标,将大目标拆解为小任务,明确个人和团队任务优先级与时间表。如在敏捷开发中,参与迭代规划,将用户故事拆解为具体开发任务,估算工作量,规划工作进度。

程序员要定期汇报任务进展,通过每日站会或进度报告,使团队掌握整体情况。同时,灵活应对需求变更或突发问题,及时调整任务计划,确保项目顺利推进。

同时,程序员抗压能力要强,吃苦耐劳肯加班,遇到搞不定的问题先冷静分析,或许睡一觉问题答案就出现了。吓得吃不下饭、觉睡不好,对身体的消耗就太大了。顶住压力,就胜利了一半。心态好才是真的好,才能管理好自己的开发任务,保质保量完成。具备良好的身体素质,毕竟久坐憋尿容易肾结石、腰突和颈椎病等,需要适当的运动调节,为大强度的脑力劳动提供有力支撑,让自己的目标节点更可控。

四、团队合作能力

如今早已不是单打独斗的年代了,一个稍微大型的项目软件工程师肯定不止一个,除了和内部的同行合作,整个项目组也是一个团队,和项目组内部的各成员合作高效的完成任务是我们希望看到的结果。少一些“扯皮拉筋”、少一些推诿指责、少一些背后投诉。

程序员应积极分享技术心得和解决方案,促进团队共同成长。如定期组织技术交流会,分享新技术、新框架,或在团队内部建立知识库,将个人经验转化为团队财富。程序员要熟练使用版本控制工具进行代码管理与协作,确保多人开发时代码合并顺畅、冲突及时解决。

五、沟通能力

学会和产品经理、项目经理、质量和测试等人员打交道,不合理的需求、不合理的 BUG,要学会说不!代价我们不能承受,还要满口答应,那对自己就是不负责任。同样,我们也可以站在用户的角度思考问题,和产品“掰扯掰扯”。

经常汇报工作,和直接上级形成良好的沟通机制。学会汇报工作,就会赢得上级的好感。没有人不喜欢积极主动的人!但很多程序员这一点做的非常差,不主动、不汇报,需要“轮训”才能知道一些情况。

我们需要和人打交道,每天有大量的时间用在沟通上,不论是会上的信息对齐,还是和测试、产品“扯皮拉筋”。更有甚者表达不清楚自己想要表达的内容,让其他人理解上不在一个频道上。不是说让程序员都“巧舌如簧”,但要学会表达自己的诉求,学会如何推销自己,这都是让自己在职场上能够“混”的游刃有余的必备技能。

六、创新能力

创新能力对程序员非常重要,程序员属于高强度脑力劳动者,工作不仅仅是“搬砖”,还要自身的一些创新性解决想法并实践。所以不论是应对复杂问题的创新性思维,还是面对产品迭代的微创新,都是解决问题的优秀方法。另外适应技术变革,让自己立于技术潮头也能让我们的产出保持创新性。最后,创新性可以提升团队的竞争力。

1. 解决复杂问题

在面对复杂技术难题时,现有方法可能无法有效解决。创新能力促使程序员突破传统思维,探索新途径,找到高效解决方案。

2. 适应技术变革

软件开发技术快速更新,创新能力助程序员敏锐洞察新技术潜力,及时学习应用,保持技术领先。如人工智能兴起,具备创新思维的程序员能率先将其融入开发,开拓新应用。

3. 提升团队竞争力

在团队合作中,程序员的创新能力为项目注入创意,推动技术优化和功能创新,增强团队竞争力。

七、学习能力

良好的学习能力。应对新的知识,可以快速学习,毕竟不是所有需求都能在你现有的知识库中找到解决方案,那就需要快速学习新知识,扩充知识版图,快速解决问题。自学能力是每个程序员必备的,快速高效的学习解决实际问题是工作上切实需要的。