程序员的软技能

除了写代码之外

“软技能”这个说法,是来自我几年前看过的一本叫《软技能—程序之外的生存指南》的书。这本书讲的东西还蛮多蛮杂的,其中令我印象最深是关于自我营销、时间管理和投资的部份。从前,我会把自己的日常当成是一种单线的打怪升级,觉得只要不停地提升自己的技术就好了,但看完这本书以后,我会觉得,自己的生活是一种多线的经营。尽管我不是完全同意书里的所有观点,但它的确给了我不少的启发,让我开始关注技术以外的东西。

其实我还蛮喜欢“软技能”这个说法的,与它对应的就是“硬技能”,对于我们程序员来讲,“硬技能”就是我们的赖以生存的技术能力了。刚工作的头几年,我在知乎上写了不少回答,描写了计算机基础知识对于程序员的重要性,时至今日我依然觉得基础知识的重要性是无与伦比的,怎么强调都不为过。当然留下这些回答也有一定的时代背景,当时还是互联网时代的红利期,大量的人涌入程序员这个职业,这种盲目从长远来看是害人害己的,不过现在互联网行业的红利已经过去了,在用人规模缩减的大背景下,应该不需要再专门强调这个了,毕竟基础知识不扎实的人,应该也被淘汰了。可以很负责任的说,技术能力其实是比“软技能”重要的,作为程序员的上限和下限都是直接由它决定的,所以这篇文章尽管主要讲的是“软技能”,但其实所有的一切都是建立在有相当深厚的“硬技能”的前提下的。

随着年龄的增长,我越发感觉“软技能”的重要性。一来是因为对于一个普通人来说,技术的精进虽然是无止境的,但随着年龄和经验的增长,增速是会减缓的,加上技术金字塔顶层的人,都是有极高天赋的,普通人要登顶,是很难很难的,性价比也很低;二是,人生不只有技术的,正常人一般至少都会结婚生子、瞻仰父母,还有不少人会有一些自己其他的兴趣爱好,“软技能”可以让我们更多方面地经营自己,而不是成为一个只会学习技术、使用技术的机器人。

业务领域知识也很重要

我会成为技术大牛吗

“我会成为技术大牛吗?”这应该是每一个初出茅庐的程序员都会问自己的一个问题,很多真心热爱写代码的程序员,应该对这个问题的答案一开始都是“会!”,包括我自己。但经过多年的学习与工作以后,现在我对这个问题的回答,已经变成“不会!”。当然,不是我不想,毕竟这也是我刚从事程序员这份工作的梦想,也为之花了很多很多的心血,不过我也有自知之明,我只是一个天赋一般的普通人,技术大牛这种拼天赋的赛道,就不是我能玩得转的。

技术大牛从来是生产力的代名词,知乎上有个问题问题,“一个好的程序员是不是能顶100个水货程序员?”,虽然一般情况下有点夸张,但对于技术大牛来说,可能还不止100个,毕竟有些难题,想不到就是想不到,堆多少个人都是想不到的,只能靠有天赋的人探索出来答案。但现实情况是,这个行业其实并不需要这么多大牛。得益于程序员乐于奉献的精神,全世界许许多多大牛在经营着很多优秀的开源项目,导致了哪怕一家公司没有大牛,依然可以享受大牛设计的解决方案,这就导致了,大部份的企业其实都不需要技术大牛的坐镇,只有那些头部的企业,遇到了非常苛刻的场景,比如超高的并发、海量的数据、极高的稳定性要求,才需要真正的技术大牛。

所以,当技术能力达到一定水平以后,努力成为技术大牛的边界收益就逐步减少了。一来有天赋成为技术大牛的人是少数的,二来社会上对技术大牛的需求也是偏少的。一个无论供给还是需求都比较少的领域,注定就不是大多数人能玩得起的领域。如果纯凭热爱,不求功利地追求,那是一个美好的梦想,但如果功利地看,对普通人来说这就是一件性价比很低的事情了。

懂业务其实很重要

在平时的面试里,其实我面试过很多一心专注于技术,但对业务了解甚少的程序员。受益于过去二十年国内互联网行业的大爆发,的确越来越多的程序员可以专注技术了。一来是因为互联网行业把产品经理这个岗位带火了,导致了很多程序员觉得业务逻辑是产品经理的事情,我只要按照产品经理说的实现需求就好了;二来是因为to C业务普遍没有to B业务的业务逻辑复杂,又需要快速迭代,所以花太多时间对业务前瞻性做考量是一件性价比很低的事情。

不过随着国内互联网行业的增量见底,连一向以做to c生意著称的腾讯,也要卷to b这个利润率非常低的领域了。其实软件行业的大头,一直在to b领域,前人总结出来的各种软件领域的方法论,其实一直都是为to b,甚至说得跟直白一点,是为了作为乙方向甲方提供软件服务而总结出来的。正式因为业务逻辑非常复杂,业务的不同模块和不同流程有非常紧密的关联,所以才出现了领域驱动建模(DDD),这不仅能让作为软件开发者的我们能把业务逻辑梳理清楚,同时也能有助于我们把我们的设计向客户说清楚。也是因为一般来说,客户是没法一次性把需求说清楚的,甚至更多的时候不做出来一个demo,客户也是不知道自己要什么的,所以才有了敏捷开发,让客户可以及早看到软件的效果,形成一个标的物让客户进一步思考需求是什么,也让我们改动的成本尽可能小。

上面举例的两个方法论,其实学习这套框架都很简单,但在实际项目中运用,确是非常困难。领域驱动建模的难点在于对业务领域的理解,只有对业务领域有足够的理解,才能快速识别出领域边界、业务实体和实体间的关系,同时在模型设计里加入对业务变化的前瞻性设计。而敏捷开发管理的对象是人,尽管业界有像Scrum这种已经很具体的敏捷开发最佳实践,但人不是机器,人都是有七情六欲的,不安套路出牌才是人的常态,按部就班地按Scrum里的指引一步一步往下走,并不能保证项目能成功。

因此,无论是业务建模还是项目管理,经验就显得尤为重要了。我们程序员经常会抱怨技术迭代得太快,十年前的技术早就没人使用了,新技术跟小年轻又拉不开差距。的确,技术的发展日新月异,作为程序老手,在具体的组件或框架的使用方面,除了肯跟比小年轻学习得快一点以外,其实优势并不大。真正能让程序老手与小年轻拉开差距的方面,是对特定业务领域能找到高效的解决方案。同时,不少项目的主程序员,也会兼任一部份项目管理的工作。做项目管理,光教条式地按PMP的步骤一步一步做,肯定是不行的,对人性的了解是项目管理的基础,这也是需要时间积累和沉淀的。

我就不说那些技术大牛了,那种拼天赋式的解决问题的能力,是我们普通人无法祈求的。对于我们普通人,唯有一步一个脚印地积累对业务领域的理解,对业务领域内各个角色需求的剖析,才能积累出来我们独一无二的经验,从而提高我们的不可替代性。

你不是一个人在战斗

普通的我们没有英雄主义的资本

我们都很希望自己能成为英雄,像Linus或者尤雨溪一样,一个人可以带领一个开源项目,像叱咤风云的元帅一样指挥着一个生态发展。可惜我们都是普通的程序员,虽然不至于像螺丝钉一样说换就换,但不在一个团队里,可能我们能做出来的也就一个玩具,一点价值都没有。因此,团队协作对我们程序员来说是很重要,但是在实际工作中,缺乏团队协作能力的人比比皆是。

可能有人会觉得很奇怪,为什么我会这么说呢?明明其实乐意协作的人是很多的,程序员是一个很单纯的群体,一般分配下来的工作都能努力地完成,有问题请教的时候也能毫无保留的分享。其实,我说的缺乏团队协作能力,不是说缺乏劝退协作的意愿,而是缺乏团队协作的技巧。在我看来,团队协作做大的技巧是沟通的技巧,是否有良好的沟通能力,直接影响着团队协作的效率和体验。下面的内容,我想聊聊这么多年里,我对沟通的理解。当然我也不是这方面的专家,其实很多关于对沟通的理解,除了结合了我自己的经验,最底层的理论支持,是来自《沟通的艺术》这本书的。

先思考再表达

在我日常接触到的很多人里面,有相当一部份的人跟别人沟通,特别是遇到问题需要找别人帮忙的时候,完全是基于条件反射去行动的。可能很多程序新手在刚接触一门新技术的时候,跑的程序都会报错,这个时候,我们是遇到问题就开始慌了,然后扯着身边有经验的同事或者朋友先问了再说?还是先自己初步定位下原因,查找下资料,然后整理下思路再去请教别人呢?

我曾经很多次被人就拋了一个问题过来:“我的程序报错了,可以帮我看下吗?”,然后也没有其他的补充,我需要先向对方提问,对方回答了我一个接一个的问题,然后我才能开始解决他的问题。这其实是一个效率非常低的过程,哪怕是在同一个办公室里,如果忙起来的话,这种沟通方式也会浪费双方不少时间,那加入更进一步的远程办公呢?疫情期间不少公司也被迫地体验了远程办公,很多公司都没能把这套机制建立起来。抛开老板们的焦虑以外,有多少可能性是因为大家都习惯了这种低效的沟通模式,当大家都没法面对面沟通的时候,这种沟通模式的低效就被放大了呢?

在觉得需要沟通之前,把找别人的冲动先压一压,把想要沟通的内容先在脑子里过一下,是有很多好处的。一是经过一番思考以后,如果问题解决了,那就可以不必沟通了,省掉了一次沟通的成本;二来,经过思考的沟通,可以快速进入主题,减少前期为了对齐问题而浪费掉的沟通成本。就算是觉得他人的时间是不值钱的,那我们至少应该觉得自己的时间是值钱的,在沟通前多思考,多考虑如果能高效地把要沟通的问题沟通清楚,这样也可以为我们自己节省到很多的时间成本。

从他人的角度出发

沟通前的思考,第一步肯定是思考自己的问题是什么,想要沟通的内容是什么,这是作为沟通的输入,那作为沟通的输出,我们又可以做些什么呢?《沟通的艺术》这本书给了我一个很好的答案,就是懂得站在对方的角度去思考。但是对方的性格一般不会跟我一样,他接收到的信息也不会跟我一样,思考方式也不会跟我一样,要让我去猜他是怎么想的,其实是一件很难的事情。真是因为这是一件非常难,同时也是一件非常需要技巧的事情,所以市面上有很多教人如何沟通的书籍,这里我也不展开聊这个话题了,毕竟我也不是这方面的专家。我更想表达的是,我们在沟通前和沟通的过程中,要时时刻刻地记得,我们与他人沟通,是为了能让我们的想法传达到对方那里,无论对方是否认同我们的观点,至少要让对方知道我们想要表达的是啥。时刻保持着这种想法,我们自然会懂得需要站在对方的角度思考问题,从而让我们的观点跟容易传达给对方。

在这里也想展开一个与沟通无关的,但与站在他人角度思考有强相关的话题,就是“谈判”。尽管作为程序员的我,很不喜欢跟其他人谈判,现实上我几乎每天都得与客户、与产品经理、与其他程序员谈判。在谈判学了,了解对方也是一个非常重要的部分,对如何了解谈判对手也有一个非常成熟的方案论。可见懂得从他人的立场思考问题,尽管是一件很困难的事情,但值得我们花精力去学习和练习。

写文档并不浪费时间

前几年的我,跟很多人一样,并不喜欢写文档,跟其他人的沟通更喜欢通过口头讲述。直到近几年自己的能力渐长,有机会带团队开发项目,需要跟很多技术经验没有我丰富的团队成员密切协作,才逐渐觉得,写文档是一件非常重要的事情。

随着需要沟通的事情越来越多、越来越复杂,我越来越多地需要把自己的想法准确地传递给其他人。众所周知,只要涉及人与人之前的信息传递,信息都会有丢失的,而我觉得在复杂的信息面前,口头沟通丢失的信息量是很多的。一个很重要的原因是,口头沟通就像一个单向流动的河流,一旦话说出去了,其实我们很少会回过头来思考我们的表达是否准确,有没有漏的内容,表达的方式对方是否能接受等等。

书写却能给予我们后悔的机会,就像我在写这篇文章的时候,我会经常回过头来看看自己前面写的文件,看看是否可以进一步优化,以保证我写的东西能更清晰、更容易被他人接受。我们大部分人都不是那种才思敏捷的人,写文档可以给我们一个慢慢思考地机会,正所谓磨刀不误砍柴工,尽管花时间写一篇文档,有时候可能比开一次会更花时间,但如果能把信息准确地传递,这是值得的,由于信息传递有问题导致的错误或返工,可能会付出更大的成本。

丰富的人生

人生分成很多个不同的阶段,不同阶段的主要任务也是不一样的。“成长”一词,对于程序员来说不仅仅是技术能力的提升,还有完美地完成当前人生阶段的任务,从而顺利地进入人生的下一阶段。我不会把我的人生阶段与年龄挂钩,有没有进入人生的下一阶段,更多是体现在我们对于生活的看法和生活的关注点是不是已经改变了。

成长期

处于成长期人生阶段的程序员,我认为核心任务还是提升自己的技术能力。这个阶段横跨的大致范围是从开始学习编程,一直到形成了一套属于自己的对于编程的方法论,后续学习新知识也可以使用这套方法论快速学习为止。可以理解为这是一个逐步形成属于自己的对于编程领域的世界观的过程。在这个阶段里,我们学习技术的边界收益是很大的,几乎每天都能明显地看到自己的进步。

在这个阶段里,我几乎把所有的精力都用在学习技术知识上了。一来是因为像前文说的,这是一个学习边界收益很大的阶段,每时每刻都能体会到学习的快乐,让人欲罢不能;二来这个阶段的我也算是心无旁骛,父母身体还算硬朗,无需我担心,自己也是单身一人,有充足的时间和精力学习新知识。在我看来,这个阶段就应该全身心地投入到提升自己技术上,毕竟技术水平才是我们程序员的根基,正如前面说的,没有扎实的“硬技能”,其实“软技能”也无从谈起。

成熟期

成熟期也差不多是我现在所处的阶段了,对于技术领域的世界观已经基本形成,有一套属于自己专有的方法论,对于新知识也很少有兴奋感了,毕竟已经见怪不怪了。这个阶段的我,人生的关注点也逐步从单线程变成多线程了。需要关心父母的健康,有属于自己的家庭需要照顾,也就是常说的上有老下有小;事业上从原来的是需要关注事,把代码写好,慢慢转变为需要关注人,把项目带好。尽管生活和工作上需要关注的事情越来越多,但技术也不能丢,毕竟计算机领域的新知识也在不断涌现,为了能跟上时间,还是必须抽出一定时间学习。

无论我们愿不愿意,大部份作为普通人的我们,都得经历结婚生子、父母老去,甚至还有公司裁员,所以对于我们大部份人,技术终将不会永远是我们人生的主流。我觉得我是幸运的,在成长期能为我的技术能力打下坚实基础,使得进入成熟期以后,尽管技术进步速度已经放缓了,也不至于恐慌。在我身边不乏有在成长期缺少积累,进入成熟期后跟不上时代的人。同时我觉得自己幸运的另一方面,是进入成熟期以后,能够放下对技术的执念,懂得从不同角度审视自己的人生,从而不会为未来感到迷茫。

工作之余

刚出来工作的年轻人,无论是为了表现,还是为了学习,都不乏全身心投入工作的人,这种人在我们80、90后可能会比较多,幸运的是新生代的00后似乎没有这种干劲了。其实我在工作中从来都没有全身心投入过的,年轻的时候会有意识地腾出时间来学习,现在又了家庭就更不可能全身心投入工作了。其实全身心投入工作的性价比是很低的,靠工作学习也会很容易触碰到上限,毕竟在工作中能学到的也只能是身边同事的经验,想要更进一步,还得从业余中学习额外的知识。

我们首先是个人,然后才是个程序员,无论是工作还是写代码,永远只会是我们生活的一部份,不会是全部。在我看来,人生最宝贵的其实是家人和健康,在学习技术之余,多关注自己的家庭,多学运动,多养生,多学习理财,首先成为一个优秀的人,才能成为一个优秀的程序员。

  • 12
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值