Soft Skills Programmers Need

Soft Skills

程序员都需要哪些软技能

在某问答网站看到了一个非常很有意思的问题:程序员都需要哪些软技能?前段时间正好看完了一本神书,稍微归纳出一些不成熟的想法:

  • 持续学习意愿
  • 口头表达和写作能力
  • 建立合理预期的能力
  • 管理事务复杂度的能力
  • 个人品牌建设的能力
  • 财务管理能力

下面一一叙述。

持续学习意愿

其实这都不能算软技能了,明明就是吃饭的家伙。持续学习的意愿低的话,自身的进步会非常有限。

举个最普遍的例子:小明在工作中遇到个新问题

假如小明自学能力和意愿较低,会更倾向用旧知识解决工作中遇到的新问题。特定的知识一般适合解决特定的问题,因此用已有的知识费力地完成,不一定是最优解。做完项目,没有什么成长,心里有气——怎么这些破事都忘我头上堆。

假如小明自学意愿强烈,可能就会考虑这个问题是否有别人遇到过,是否有成熟方法或者框架解决。有的话调研一下,看看能不能借鉴或者复用。做完项目,时间花得少,技能点还多点了一堆。

两种不同的习惯经过几年积攒下来,差别甚大。
一个人是实打实的n年工作经验,一个人是1年工作经验 + n-1年重复劳动。

口头表达和写作能力

简单来说,表达就是要把一件事情说明白。能力高低基本取决于两个因素:思维能力和表述思维结论的能力。

思维能力帮助我们把事情的关系在脑中理顺理清,让我们得到对事物的总体印象。思维能力强的人可以滔滔不绝,能力差的人可能就没什么能说的。所以我平时也会观察哪些人的语速快一些,这些人很可能是比较聪明的人。为什么?脑子得跟得上嘴啊。

表述思维的能力帮助我们把结论尽可能完整地传达给受众。除了要换位思考考虑对方的背景和接受能力以外,一个很重要的方法是少用代词,将代词都具体化,这样理解的成本会变低,受众可以更顺畅地接收信息并作出反馈。

任意一个能力有短板,都会在开口的时候暴露。例如跟产品同学讨(si)论(bi)出现你在github上提issue,别人压根听不懂,总结一个事情逻辑乱七八糟。最后落下一个「沟通能力需要提高的名声」。

想方设法去进行技术分享对提高表达和写作能力大有裨益。

插个题外话:关于「什么是最重要的语言」这个问题,一直有一个无可争议的解:英语。至少在程序员界。

建立合理预期的能力

这里的预期并非特指别人的预期,还包含对自己的预期。

他人的预期是个非常神秘的意象,结合我们谜一般的自尊心,非常能激发程序员的斗志,但有极可能把自己拉进一个又一个大坑(逾期交付、深夜加班)里。这种坑除了能够影响自己的信誉,影响其他人的进度安排以外,并不会带来任何好处。因此虽然我们推崇「Fake it till you make it」,但并不是说任何乱七八糟的任务我们都应该笑着扛下来然后玩命做出来。

以上的预期都需要时间慢慢树立和校正。即使是资深的程序员,更多的时候都容易高估自己。因此一个推荐方法是建立监控,每天早上看看预期需要做哪些事情,然后看看每天做了多少事情,是不是按照你的预估来的,慢慢就会得到一个对自己能力的合理认知。

管理事务复杂度的能力

程序员的一项核心工作就是降低复杂度,这样才能将更多的精力放在其他有意义的事情上。

有三个简单的技巧可以协助程序员管理身边事务的复杂度:自动化、一致性、优先级。

自动化:其实这个能力对于程序员来讲是最容易的。有任务需要做重复3次或以上,就应该把他自动化起来。举几个耳熟能详的例子:登录远程主机是不是都配好了SSH做免密码登录?线上系统的严重错误是自己通过监控推送报警还是每天检查一遍?每天老板要看的统计数据是每天手工查一遍拼一封邮件还是到点自动查询自动发送?这些事情每一件都只需要花很少的时间,但是假如每天都要花时间在这些琐碎的任务上,很难得到一个流畅的工作状态。

一致性:假如对于某项工作,我们的处理方式始终如一,我们就更容易享受这种一致性带来的红利,举几个例子:

  1. 以前写python都用vim手写,那个年代youcompleteme这种补全神器还没出来,而且函数名称写错也不会有提示,因此我经常会纠结这个函数名我之前是不是定义成这样的。还要翻来覆去的看好几遍。后来好好看了一下编程风格,所有函数的取名都根据编程风格来,这种情况下,我可以保证两次命名同一个函数会命名成同样的,调用的时候也是如此。
  2. 还是命令行,做git diff的时候,总是把基准放在左边,要提交的放在右边。有些时候其他同学在主持code review,两者的顺序时不时就颠倒一下,看起来就容易心烦意乱了。

优先级:一大堆事情过来了,除了老板吩咐的高优先级的事情,我该先做哪些事情?知乎上的采铜大大有过一个非常精辟的回答:做收益半衰期高的事情。简而言之就是做有长期正面影响的事情。例如花半个小时打上一局游戏,能在短期内满足我们娱乐的欲望,但难对我们有长远正面的影响。假如能够意识到这一点并切实执行,说不定假如花半小时去提高职业相关技能,可能就能受用很久。

个人品牌建设的能力

个人品牌建设是一件不会在短期内能看到明显收益的事情,但从长远看来,比很多其他东西都重要(收益半衰期)。适当地营销自己,会默默地改变你的曝光率和知名度,更容易和他人取得合作的机会。

例如以下的事情可以抽空做:

  • 持续地写博客文章
  • 总结好自己的技术能力和经历
  • 录制技术教程
  • 公开演讲

不要太担心质量,文章会越写越好,前提是你一直在写,而且有经过自己思考的内容。

有了一点积累以后甚至可以更进一步,写书。现在也已经不是传统的年代了,只要内容有料,很容易就能够成书并散播出去。GitBook 就是一个非常好的平台。

财务知识和识别忽悠

虽然程序员的收入也不少,但是人生阅历和社会经验,比起老板和CEO,都是鸡毛蒜皮。一不小心就会掉进哪些以为保护着自己的陷阱之中,所以学一点财务知识也非常重要。这里有两个可能很多人搞不清的概念:期权和VIE。

总结

程序员需要的软技能比大部分职业都多太多了……