一个很长的引记

《不知代码 —程序员的进阶之路》中提到:软技能是一个比较模糊的范围,可以包含但是不受限于下面这些能力:

  1. 表达能力;
  2. 自我营销能力;
  3. 与他人沟通能力;
  4. 说服他人的能力;
  5. 组织能力;
  6. 培训指导他人的能力;

如果要总结上面这些「软技能」的共同之处,那就是,这些技能都是和「人」打交道,而不是和电脑、逻辑、程序打交道,所以,「软技能」的核心,就是和人打交道的能力。

一说到和人打交道,就不得不提「情商」这个概念。情商高的人软技能就一定高吗?其实未必,一个人可以情商很高,但是一到演讲的时候就情绪紧张,情商更多的是一个人的为人处世态度,并不完全代表技能,有一些和人打交道的技能,比如演讲能力,依然需要训练才能获得。

所以,情商高只是基础,软技能依然需要训练。

程序员这个职业,因为长时间和电脑打交道,而且和电脑打交道就能够获得工资,所以往往会让人产生错觉,以为不需要培养和人打交道的能力。

其实啊,软件开发还是和人打交道的艺术,且不说产品经理、项目经理和程序员之间的沟通是和人打交道,程序员之间的交流也是和人打交道。前面我说过,要成为更高阶的程序员,你的「影响力」就要扩大,而你所影响的,就是人类啊,所以和人打交道的能力是必修课。

在这里,我们不需要把「软技能」神秘化,我们可以明确程序员需要提高的软技能方面,请努力做到下面这些方面。

  1. 每一个知识点,能够解释得不懂计算机的人也能够理解,你不一定需要让对方和你一样精通,但是你可以用比喻的方法让对方理解。
  2. 你能够通过演讲,把自己的理念传播出去,为什么要这么做、怎么做,你能够通过半小时到一小时的演讲说清楚。
  3. 你能够让团队成员和你交流如沐春风,可以有观点不一样,但是不要红脸吵架。在和人交流的过程中,请记住卡耐基教诲我们的一句话:「每一个人都希望自己是重要的。」记住这一点,让每一个人都感觉自己重要,你就可以做到每一个人和你的交流都很愉快。

如果你做到了上面三点,你的软技能已经强过绝大部分程序员,足够让你成为资深级别以上的程序员。

「程墨老师」:在微软工作的时候,有一次一个工号在 100 之内的资深员工来给我们做培训,培训内容覆盖了硬技能和软技能。关于硬技能部分,参加培训的员工都没有任何问题,但是当他介绍软技能培养的时候,大家就觉得难以把握了,于是,我就问了这位资深前辈一个很具体的问题:「如果我只能做一件事来提高自己的软技能,那这一件事应该是什么?」

这位前辈说:「你觉得你日常所能接触到的人里,谁的软技能最高?」

我想了想,说:「我们部门的架构师吧。」

这位前辈又问我:「为什么你觉得他的软技能最高?」

我说:「因为他情商高,说话风趣,再复杂痛苦的事情他也能理清楚,所有人都说和他说话总是很愉快。」

然后这位前辈就给出建议:「那你就和这个架构师约一个两个月以后的一对一会议,一个人是肯定会接受两个月之后的会议的,然后你就通过和他的接触,学习他的做事方式,向他看齐。」

后来我按照这位的方式做了,发现这一招真的非常好使,当有了一个明确的榜样去学习之后,看似虚无缥缈的软技能也变得非常具体易学了。

可见,虽然「软技能」比较软,难以量化衡量,但是,也有一个对个人来说可以「量化」的培养方法,这个方法也非常简单:找到你接触范围内的「软技能」的榜样,然后努力让自己变成他那个样子。这个榜样,可能是一个口才很棒的领导,也能是一个情商超高的项目经理,重要的是你认可他就是你几年后想要成为的层次,你就可以和他多交流接触,看他平时都看些什么书,看他平时有什么编程习惯,看他怎么和别人交流,看他平时怎么处理问题,即使你只学会他的十之四五的本事,你很快会发现自己已改头换面,成为大不一样的人,这时候,你的眼界更高,就可以设立一个新的榜样,迈向一个新的台阶。

硬技能

一个非常具体的例子,团队里代码质量很差,三天两头线上出 bug,搞得开发团队一方面有新功能的开发压力,一方面还要抽时间去修线上 bug,这时候团队肯定会有怨言的。

这时候,只会提出问题的人,只会抱怨:「项目一团糟,都不知道怎么办了。」「大家都没有干劲,这样下去肯定要散。」「bug 越改越多,都不知道为什么还要改。」

好的问题当然是解决问题的一半,但是,如果单纯地提出问题,甚至是以消极态度提出问题,那就只是添乱。

成为能够解决问题的人

能够提出解决办法的人,会说:「我们把团队分为两组,一组集中精力开发新功能,另一组专心修复线上的 bug。」「我们的代码分支管理可以踩进 gitflow 的流程,避免代码提价混乱。」「我们需要研究分析一下重复出现的 bug 的类别,针对最多出现的类别进行改进。」

上面的「解决问题的方法」只是一些例子,重点就是,这些方法是针对实际问题的对策,能够帮助团队渡过难关。能够提出解决办法并且实施,不光是对自己能力的锻炼,更重要的是,真正解决问题的人能够获得组织的青睐,获得更多的晋升机会。

循序渐进,成为专家

在确定了学习方法、学习态度之后,「硬技能」的培养就是要花时间去反复训练,没有任何捷径,下面是一些直接的提高硬技能的方法:

  1. 当你加入一个新项目时,从 fix 一个 bug 入手开始工作,因为你的同事未必有时间帮你过一遍代码,而你找得到的文档往往都是过时或者错误的,而 fix 一个 bug 是最快速的能让你熟悉一个项目代码的方法。
  2. 当你学习一门新的语言时,用这种语言编一个你每天都会用的程序,比如一个「待办任务列表」(Todo List),或者做一个弹珠小游戏,写这样的程序的好处是需求非常清晰,因为你已经见过类似功能无数次了,你不用纠结需求(虽然实际工作中你依然要纠结),你可以心无旁骛地应用你的编程语言。
  3. 如果有时间,你写过的程序,都重新写一遍,你会发现第二次写的会和第一次大不一样,越是不一样,越说明你在这期间进步大。
  4. 每天花一两个小时来学习工作之外的技术,如果工作紧张腾不出这个时间,那就每周末腾出几个小时来学习。
  5. 不要浪费时间和别人争论语言或者框架的优劣,把争论的时间用在实际上手编程上,你不会后悔。
  6. 无论如何,给自己定一个目标,每个月不能生产少于 1000 行代码,这里说的是新写的代码,不是修改别人的代码。
  7. 当你积累了多年的工作经验,对某一个领域非常熟悉的时候,可以考虑扩展自己的广度,成为其他领域的专家,这是让你扩展影响力的必经之路。

软技能

各种软技能的修炼,最终都要面对一个问题——如何获得「良好的人际关系 晋升 」。
我们这个行业有一句话叫作「唯一不会发生变化的,就是变化」,所谓计划跟不上变化,因为技术发展很快,需求变化也很多,程序员潜意识里就会觉得长期规划没有意义,所以他们很自然会逃避这个话题,很不幸,这也导致他们犯了最严重的软技能错误。

目标与计划

要克服这一点,并不难,你要做的是找一个放松的环境,不受外界干扰,想象一下五年到七年之后你希望达到什么目标,注意,只需要考虑你「希望」达到什么目标,不必考虑自己「能不能」达到这个目标。然后,你就根据这个大目标制定阶段性的小目标,一个宏大的目标看起来遥不可及,但是每一个小目标都是可以短期实现的。每隔一段时间,都要重新审视一下自己的小目标,看一看哪些实现了,哪些还没有按期完成哪些已经不适用了,还有哪些之前忽略的方面,需要添加成为自己新的小目标。每一个小目标,都是为了大目标而努力,用不了多少,你就会发现自己向大目标前进了很多。

规划需要是动态的

职业规划的目标是可以改变的,比如,你早年可能以成为技术总监为职业目标,但是经过几年管理的经历之后,你发现自己不适合做管理工作,而且环境允许你在技术上继续深入,你可以把目标变化为架构师方向。这代表你之前的目标是错误的或者努力是白费吗?当然不是,在你的努力过程中,你所获得的技能和领悟,都会进入你的血肉中,在不知不觉中改变你的做事方式,即使你换了目标,这些技能和领悟依然会帮助你朝新的方向前进。

处理人际关系

处理人际关系,是软技能的另一个重要方面。作为一个软件开工程师,虽然你的工作产出是可以运行的代码,但是写代码不应该是你工作的全部,你的工作中很大一部分是和人打交道。

和人打交道,并不难,只需要记住一个最核心的原则,那就是:每个人都希望自己很重要。这也是卡耐基的名著《人性的弱点》中的核心观点,认识到「每个人都希望自己很重要」,就知道换位思考,让别人感觉到自己有意义从而有满足感,如果每个人通过和你交往都能获得满足感,那他们肯定愿意帮助你

承担责任

承担责任,是获得晋升的重要法宝,你的责任越大,你也就越不可或缺。在工作中,没人愿意涉足的领域是搜寻机会的最好地方。当然,这和大部分程序员的想法是相悖的,大部分程序员都觉得,最热门的工作才值得去拼去抢,没人愿意做的事情,就会被认为是没有价值的,其实,只要经营得好,冷门也很容易成为热门。

作者举了一个很好的例子,简洁承担责任的一个方法是成为团队里其他人的导师,自愿帮助新人加速成长,为所有需要的人提供帮助。如果能做到这一点,很快你就会发现你是团队里最有影响力的人。

做得好,不如说得好,这个道理大家都知道,你的工作,一定要要让你的领导知道,也要让团队知道。简单说来,你可以做到这些:每天记录自己做了些什么,汇总成周报,发给领导和团队;主动提供演讲和培训给团队;在会议上发表意见。

自我营销

一般人听到「营销」这个词,脑子里复现的场景就是营销人员急功近利不择手段地给其他人洗脑,事实上,这个世界上的确是有大批无良营销人员为了一己私利而不断兜售新的骗局。

不过,换一个角度来看,既然这世界上有那么多骗子在营销,作为一个踏踏实实的正直从业者,为什么要眼睁睁看着劣币淘汰良币呢?没有理由让这个世界充斥着虚假浮夸的营销啊!如果你本身就很优秀,加上适当的营销,那就是如虎添翼。

业界总有一些夸张的故事来描述营销,比如如何把冰块卖给爱斯基摩人,这就容易让人觉得营销就是不择手段把东西卖给别人,即使对方并不需要也要说服他们买下来。 营销当然不是吹牛和洗脑,真正的营销首先是实现价值,然后要求回报。

营销的核心在于将一些人所需要的、所期待的产品或者服务,与产品或服务本身连接起来。对于我们自己,要做的是「自我营销」,「自我营销」也就是把希望得到你提供的产品或者服务的人和你自己连接起来。

个人营销,就是要打造个人品牌。品牌并不只是商标,品牌是对产品或者服务的一整套预期。而个人品牌,就是别人说到你的时候,觉得你这个人怎么样,预期你会做什么事,能把事情做成什么样。我们绝大部分人不会有像比尔·盖茨那样显赫的个人品牌,但是,在一个小众范围内,你可以做到让自己成为数一数二的人物。

作者是创业者,他根据自己的经历提出了打造个人品牌的一些建议,比如:写博客、利用社交媒体、演讲和培训、著书立说。这些方法当然可以提高个人品牌,我自己也写博客,也在知乎上活跃回答问题,也写了技术书籍,不过,我要说的是,对于大部分程序员来说,并不是只有做到这些才有出路。实际上,我觉得作者在书中的另一个观点更实际,那就是在「小众范围内打造个人品牌」。比如,你能建立的个人品牌不大可能是「中国最杰出的程序员」,但是你可以做到「网页可视化方向的突出贡献者」,甚至更小一点,「某某公司范围内最靠谱的开发者」,对你一样有价值。

面试与内推

面试,就是推销自己的最好机会,一个自我营销做得好的程序员,在面试的时候,必定无往不利。

说到面试这个获得更好工作机会的必经之路,首先要明白一个要诀:内部推荐的渠道永远要比对外招聘更加靠谱。因为,内部推荐相当于内部员工的背书,是一种人品保证,人力资源部门和用人部门都会优先考虑内部推荐的候选人。

如果你心仪一家公司,可是这家公司里一个人都不认识,那么怎么办呢?你依然可以通过互联网建立和公司内部人员的联系,在知乎、微博这样的社交网络上,不难发现乐于助人的同行,和他们建立联系,获得一份内部推荐机会,只要愿意迈出这一步就可以做到。

当获得面试机会之后,一定要清楚,决定面试成败的往往是技术之外的软技能,在这里,我可以教你一个软技能,可以最直接地提高你的面试成功率,这技巧就是:永远保持一个正能量的态度。你可能对某个技术问题了解得不是很深,甚至根本不会,但是不要表现得急躁、不耐烦或者生气。正确的方法是以正面态度来应对,你可以向面试官咨询提示,计算给不出答案,也可以尽力用自己的语言描述一遍这个问题,展现出你想要解决问题的愿望,相信我,这样一定会给你的面试结果加分,我自己就经历过这样的面试。

硬实力与价值观要跟上

也有反例,有的程序员做了很好的个人营销,却在面试中失败,我和几个朋友曾经面试过一个网红程序员,最后大家一致决定不录用这个网红,因为他在面试中并没有展现出正能量的态度,这和所谓的「名望」形成太大的反差。所以,还是要重复一下营销的本质,营销的本质是要能够展现价值,而不只是追求简单的名声。

与领导交流 汇报与反馈

有很多程序员害羞,不愿意或者不敢发表个人观点,这一点在就职于美国企业的中国程序员身上体现得淋漓尽致,因为中国人更加害羞,和有事没事都要说两句的印度程序员相比,中国程序员普遍都很吃亏。还有,定时和老板做一对一汇报,就算日常和领导直接接触机会不多,每周或者每个月都要和领导做闭门交流,让领导知道你的成绩,同时也要了解领导的思想动态。这并不是所谓的「拍马屁」,这是和领导紧密合作,为了更好的工作成果,也为了自己更好的生活而努力。

如何自学

软件世界发展很快,几乎每天都有新技术出现。同样,每天都有你之前学习的东西变得毫无意义。你在大学里所受的教育,能够给你一个坚实的基础,作为你在工作中起步的推力板,但是,你不要指望在毕业拿到学位之后就可以停止学习,恰恰相反,你需要持续地学习才能让自己更有竞争力。

当然,毕业之后,一个人的成长很大程度上是依赖于自学,很自然,自学就是程序员必须掌握的技能,这可能是最重要的「软技能」,因为这是持续获得其他一切技能的技能。

十步学习法

《软技能》的作者总结了「十步学习法」,我这里将十步总结为两个阶段。

全局 目标 范围 资源 计划

「十步学习法」的第一个阶段,有六个步骤,包括:「了解全局、确定范围、定义目标、寻找资源、创建学习计划、筛选资源」。其实都是大家耳熟能详的学习方法,不过,还是要强调一下「筛选资源」这一步,因为很多程序员对学习材料是来者不拒的,看到什么都想要学,虽然好学是一个好品质,但是,每个人的时间和精力都是有限的,要利用好有限的时间和精力,产生最大的回报,就不要浪费时间学习根本用不上的东西。

了解全局其实是初步学习的过程,在确定要学之后则需要明确学习目标并制定计划,这个时候需要按照各资源的优先级,合理安排学习路线。

深度学习 使用 掌握 教授

「十步学习法」的第二个阶段,包括的步骤有:「开始学习、浅尝辄止;动手操作、边玩边学;全满掌握、学以致用;乐为人师、融会贯通」。第二阶段和第一个阶段有一个显著差别,那就是,在学习某项技能的历程中,第一阶段只是计划,只需要做一次,但是第二阶段则需要重复进行,来回往复,才能有深刻的体验,因为,除非你是天才,不然你不大可能一次就学会学好。 上面所说的「十步学习法」,说起来容易,做起来也不是很难,但是学习真正的诀窍,还是在这「十步学习法」之外,那就是导师的作用。

寻找导师

当你离开学校之后,再想要寻找那样很多人聚在一起学习的氛围,肯定是不现实的。但是,你可以创造一个小范围的学习氛围,那就是寻找导师,在你和导师之间建立这种激励和指导的氛围。

找导师,一般人们首先会联想到工作中的领导。虽然你的领导了解你的工作,甚至也会给你一些学习上的建议,但是,你不要把目光局限在直系领导身上,更何况没有人规定你只能有一个导师。你的导师,最好了解你从事的行业,但是和你没有任何利益关系,这样他才能给予最中肯、最客观的建议。从这个意义上说,你最好从其他部门中寻找导师,而且可以有不只一个导师。如果你时间充裕,完全可以寻找多个不同背景不同知识领域的导师,这样你就能接触不同方面的观点,让你的思想更有多样性。

选什么人当导师

那么,选什么人当导师呢?方法其实很简单,看一看你能够接触范围内的同事或者同行,他们中哪些人身上有你值得学习的闪光点,这些闪光点可能是某方面专业技术很突出,或者是拥有更多的行业经验,只要你觉得可以学到很多的对象,都可以成为你的导师。要注意,并不是说只有各方面都比你强的人能当导师,任何人都有可以学习之处。网球天王费德勒的教练网球也没有他打得那么好,但并不影响他的教练给予费德勒相当有价值的指导。你所要做的,就是确定自己需要在什么方面提高,并挑选出最有可能给你这方面指导和帮助的人。

建立关系

当你确定导师之后,就要和导师建立个人关系,时不时去请教,建立信任感。相信我,每一个人都希望自己显得重要,只要你尊重对方,对方都会乐于给予帮助。不过,在这里,程序员很容易犯一个错误,这也是我的亲身经历教会我的:某些程序员很好学,找导师了解一件事情该怎么做,然后导师给予了他很有经验的建议,矫正了程序员以前的错误做法,可是,这些程序员真正做事的时候,却完全忘掉了导师的建议,依然按照以前的方法去做,当导师知道这样的结果的时候,你说会怎么想呢?

尊重导师

要知道,每个人的时间都是宝贵的,你和导师之间的关系,并不是付费咨询的关系,导师回答你的问题,可是分文不取,是看你是一个可造之材才给予帮助,结果,你当面听,背后就忘,那导师怎么会觉得辅导你还有意义呢?同样的时间,他完全可以去辅导其他人,哪怕是睡个觉休息一下,也会比和一个说什么都不听的人更有价值。

所以,尊重导师,并不只是语言上客气,而是要在行动上真正认可导师的帮助。如果你的观点和导师的建议不一致,或者说你只是想尝试导师建议之外的方法,那你要及时和导师沟通,说明自己的本意,避免误会。当然,如果你觉得导师给予的建议本身就是错误的,那么,他已经不适合做你的导师了,你应该去寻找新的导师。

拥有导师对你非常有帮助,而让自己成为别人的导师,那就是好上加好。当你的水平达到一定程度,就不要只满足于从导师那里获得输入,而是要改变角色,成为导师,输出自己的知识、技能和影响力。

成为导师

成为导师,不只是反馈社会,帮助别人,其实对你自身也有巨大的帮助。在传授知识给别人的过程中,你有机会重新审视一遍这些知识,摩擦出新的火花,这对你的认识是一个加深的过程。更重要的是,有朝一日,你的徒弟可能会超过你,获得更大的成就,这样,你就可以获得更为广阔的人脉关系。想想一下,一个公司的 CTO 曾经是你的学徒,那将会对你的个人品牌有多大的帮助。

总结

我们首先了解了什么叫软技能,了解应该如何训练自己的软技能,然后,我们讲述了个人如何做 承担责任 自我营销,再然后,我们介绍了最重要的软技能基础——自学能力,最后介绍了通过社交、寻找导师去提升自己,并在有实力之后成为导师。