
笔者在带团队的六年中发现,程序员们在职场都有一个共同的困扰:“好像写代码都没什么问题了,日常工作基本上都是应付业务需求的开发,好像找不到其他的更大的附加价值了,我应该找一些什么样的发力点才能让我的价值更突出呢?” 。笔者以为,这就是典型的硬技能当下「看似」没有什么问题了,瓶颈卡在了软技能上。所以开篇做个小分享,聊聊程序员的软技能。
注意:今天讲的软技能 ≠ 心灵鸡汤,都是实实在在要学的技能。也不代表笔者精通了这些软技能,也是自己的个人心得与学习梳理,与大家做个分享,一起学习。
所谓软技能,就是相对于「硬技能」而言的技能,对于程序员来说,「硬技能」就是计算机专业技术能力,软技能则是专业之外的所有技能,包括职业规划能力、处理人际关系能力、专业态度、做事的方式和方法等。
《哈佛商业评论》的一项研究指出:对 2000 家公司调查后发现,比起硬技能,公司更看重员工的通用能力(这里的通用能力 = 硬技能 + 软技能)。所以说,软技能的重要性一点也不比硬技能低。
笔者认为,很多初入职场的同学有一个非常错误的观点就是:「软技能好像也没那么重要,貌似是可有可无的,程序员就应该更注重硬实力,硬实力才是我们吃饭的手艺」。很多时候,我们的硬实力(技术水平)已经完全能够胜任每一个编码需求,我们向上发展的瓶颈,可能恰好就是那一些看起来虚无缥缈却无比重要的「软技能」。
硬技能通常比软技能更容易定义和评估,但软技能更多涉及行为或思想,也就是个性特征和认知能力,它更难评估。但是它们不管在任何行业、工种都适用,不管什么行业,什么工种,都能随身携带,学好可以受益终身。
比如时间管理、沟通、学习方法、工作方法、价值观、大局观、人际交往、逻辑思考、领导力等等,这些加起来可能几天都说不完。这里面很多软技能是因人而异的,比如学习方法、领导力等,所以今天的分享主要举例一些笔者认为非常重要、每一个人都要知道且运用到工作中的八种软技能。
有一本书叫做《软技能—代码之外的生存指南》不知道大家都看过没?这本书最先提到的软技能就是人际交往,这是程序员们软技能上最缺失的。
程序员遇到的所有的需求都来自于人、使用软件的是人、上下游沟通的是人,而埋头写下能够让计算机执行的代码只是我们工作目的中的一个环节而已。写一手好的代码是我们的基本技能,但是过于埋头写好代码却忽略了人与人之间的连接,这往往会带来更大的问题,比如信任感、亲切感的丢失对工作协同的影响。与人打交道是我们的基本职场技能,这跟我们上学时的语数外是一样的,一旦偏科严重,想考一个好成绩就很难了。当然了,除非你是「北大韦神」这种神级人物,自带光芒。
《能力陷阱》一书中,有一段话记忆深刻:「许多人认为,人际网络本质是虚伪的,认为是在“利用别人”,认为带有目的性的人际交往让自己变得“虚伪”、“不干净”、“像舔狗”,从而拒绝在舒适区域以外建立人际关系。」,大家觉得这段话对吗?其实是不对的,当你抱着双赢的思维去沟通,就不会有这种负担了。
《能力陷阱》中还有一个非常核心的观点:大意就是「当一个人擅长解决某一场景的问题的时候,时间越久也许越离不开这个场景,也许这一生就定格在这个场景里面出不来了,可能一辈子都是个程序员。」特别是对于管理者来说,管理者要做一个连接器,自己部门跟外部部门之间的连接器,走出去是走出「能力陷阱」的第一步。
LinkedIn 的创始人德·霍夫曼发现,当你在职业上要寻求帮助时,最远不会超过三度,即我们通常只需要通过两个人就能与其他人取得联系。但是我们并未能很好地利用这些关系,因为我们大多数人都没有意识到我们的人际关系网络力量到底有多强大。
阿里侠客行管理者培训里有一句很经典的话:「脸皮薄容易耽误事」。
有一本非常畅销的书叫做《别独自用餐》,核心观点也是论证社交的重要性,如何建立自己的人脉圈子,如果你不知道如何建立自己的人脉圈子,不防重工作日的午餐开始,试着主动约人吃饭。一段时间以后,你会发现自己的圈子以及获取的信息跟以往有很大的不同。
记得之前听到过一个公司的段子:“公司的大佬,如果人不在工位或会议中,那一定在园区的咖啡厅”。层级越高,资源、信息的共享就变得尤其重要。把用餐时间利用起来,是一个很好的点子。
学会倾听、关注他人感受,具备同理心。在跟人打交道或沟通之前,换位思考一下,如果你是对方想听到什么或看到什么,时常锻炼换位思考的思维,时间长了会发现非常有用。如果不知道对方是如何思考的,那就不要说话,倾听即可。
举个例子:我们常常会为了视觉还原问题而烦恼,设计同学找到我们解决像素级别问题的时候,我们往往是不是会烦躁,功能都开发不完,哪有精力去还原视觉,常常就会不耐烦的沟通,这个时候换位思考一下,他的设计作品最后做出来不是他想要的,他自己会不会有落差,这是他的工作职责,我们只需要站在他的角度思考,给他一个合适的解决时间即可。
在我们工作中,我认为换位思考就是要有「服务思维」,处处设身处地、为别人着想。
结构化思维是一种从无序到有序、从混乱到清晰的思维能力,可以帮助我们快速加工处理繁杂的信息,提炼要点,从而更加清晰的表达。这个话题很大,我们只说关键的两个点:
有研究证明:人类短期记忆的容量大概在 7 个左右,范围是 5 到 9 个,所以尽量不要超过 7 个概念或项目。这在演讲或沟通中也非常重要。
大脑容易记住有逻辑关系的事物,逻辑关系分为纵向逻辑关系和横向逻辑关系
纵向逻辑关系
演绎逻辑:线性的,最终会为了得出一个由逻辑词“因此”引发的结论,比如因果关系
归纳逻辑:将一组具有共同点的事实、思想或观点归类分组,并概括其共同性/论点,比如不同的群体
横向逻辑关系
时间顺序:比如按照事务发展的时间线划分
空间顺序:比如按照地点空间来划分
程度顺序:比如重要的,不重要的来划分
金字塔原理: 麦肯锡 40 年经典培训教材《金字塔原理》,每个职场人都必须看,强烈推荐,就不多介绍了。
很多时候我们都知道 What 和 How,但是不知道 Why(或者说没有仔细思考 Why),就容易陷入到成长瓶颈。黄金圈法则也是一个经典的学习的三部曲。① What,是什么、② How,如何实现、③ Why,为什么是这样(而不是另外的样子呢?)。
举几个例子:
我们接到一个功能需求,先思考可能的本质(为什么有这个需求),再去思考怎么做。别停留在 What(一个产品需求)、How(怎么做)而没有 Why。
我们知道一个技术框架怎么用,做什么用的,但是知道它底层原理和为什么这么设计的人并不多。
我们要做架构迁移,比如一路向北,要做 Pouch 容器迁移 ASI,有做凌霄独立化部署,有没有去理解背后的 Why,为什么要去做这件事情。
记得 刚带团队上侠客行课程的时候,老师说过一句话至今记忆犹新:「向上沟通要有胆量,平行沟通要有肺腑,向下沟通要有心肝」。这句话背后的思考我已经记不得太多,只能重新理解一下:
通常我们对上级沟通方面有几个常见的误区,比如:
和上级能不聊就不聊
他太忙了,我可能会打扰他
我只要做好上级交代给我的事情就好了
有事他会来找我的
拿捏不好该不该和上级聊的分寸和尺度
我很难领会到上级的意图
这些其实就是一种安慰自己的「逃避」做法。前面讲的,「脸皮薄容易耽误事」,这句经典的话也可以放到这里。
双赢思维:沟通的目的能够对对方是有意义的,而不是站在主观的利益上去沟通
放下面子:你不服我、我不服你,相互避让、多一事不如少一事的态度是横向沟通最大的障碍
向下沟通要有心肝
要有视人为人的态度,员工不是机器,是需要情感输入的
不能对人不对事,不能围绕人的某个标签来做事的评判
批评员工要有讲究,要对事不对人,批评事,不要打击人,更不能给人贴标签。之前看到过一个如何批评员工的 AID 批评三步法(也称为发展性反馈)。
ACT:指出具体的言行上的问题,而不是人的问题
Impact:指出该问题带来的影响
Desired outcome:期待的结果,以及探讨取得结果的行动
在日常沟通中,「暴力沟通」其实无处不在,比如:“你这个做的不太好”、“这让我很不满意”、“这个需求实现不了”、“你不爱我了吗” 、“你懂我意思吗?”,等等让人很难回复的对话。思考一下,这些话都有什么样的问题?
《非暴力沟通》一书中提到了经典的表达框架:
观察 - -----> 感受 -----> 需要 -----> 请求
对应的还有一个倾听框架:
倾听 - -----> 体会 -----> 反馈
更多细节参考《非暴力沟通》一书,每个职场人必读,强力推荐,就不再文中多赘述了。
重要的事情说三点,比如三个论据、三个论点、三个观点、三个好处等等(最简单的结构化表达)
先说结论,再说过程和原因,然后再说结论,这也是用好「三点」这个好的结构化工具
说清楚 What、How、Why(黄金圈法则),笔者遇到过好多类似的对话都是不带 Why 的,这让人感觉无法回答的对话,比如:
英布,申请一个紧急发布,麻烦审批下,X 业务线上有个 bug!(具体是什么 bug ,带来什么影响?)
英布,X 项目比较赶,这周末可能要申请下加班!(哪个项目不赶,为什么你的这么特殊?)
英布,有没有资源支持下 X 需求?(没有资源的原因是什么?)
这个问题,X 老板说下周一定要上(老板有没有说为什么,为什么是下周?)
只讲 How 或 What 不讲 Why,是一个非常典型的表达问题。
“理解了 Why,才有可能做到知行合一”。—刘润《底层逻辑》
举例:下面两段话,你看得懂吗?
“对于现在这个业务,暂时还没有跑通一个模型,毕竟基础业务逻辑没有形成闭环,更别说做成生态了,我们还在夯实基础的阶段,好好打磨一下我们的产品,最终形成一套组合拳打法,才能有效赋能生态圈,最终反哺整个经济体。”
“ 过去我们主要依靠推荐技术赋予的信息分发能力、跨端联动多个产品自研,实现深度共建,形成组合拳,打造内容生态闭环,以此赋能客户用户创造价值。未来我们要增加横向不同场景价值,延长服务链路。同时纵深满足用户需求,借助人类年龄的自然势能,在小中青多个年龄用户深度渗透…… ”
互联网黑话、空洞大词,以及各种让人听不懂的专业术语,这些在前几年已经在互联网社区备受诟病了,我们记住说话尽量接地气就好。
每个人都有自己的口头禅,很多时候无意识的就会说出来,如果觉得自己有口头禅,不防思考下,口头禅会不会有一些「暴力」因素,比如以下左边这些,都可以有更好的改进:
“我*、***” ---> “ null ”
“你懂我意思吗?” ----> “不知道我表达清楚了没...”
“我和你说实话” ----> “我内心真实的想法是...、我的直觉是....”
“我之前就说过 xxx” ----> “之前我们有过一次这样的沟通,结论是...”
“你这个逻辑不对” ----> “我的观点跟你不一样,我认为应该是这样的,...”
“我觉得你应该” ----> “我的建议是....”
良好的写作能力,这对于程序员这个高学历群体来说都不是问题,但是我发现很多同学写出来的文章、设计文档等都没有一个良好的结构以及排版,良好的结构和排版可以让人读起来更愉悦和易理解,强烈大家按照《中文排版指北》来排版。
写文章之前先列出大纲,语雀右侧的大纲或思维导图都很是很好的工具。自己先读完大纲换位思考下看看是否易懂,好的骨架可以牵着读者的思路走,推荐《金字塔原理》这本书。
很多同学,写周报或月报的时候大部分都是流水,这是最典型的「应付型」报告。笔者认为,周月报有两层意义:自己梳理和总结,让其他人看到自己的思考和总结,如果全部都是流水账,就失去了总结的意义了。总之就是:「没有思考的周报是没有灵魂的」。
一线演员与歌手的硬实力真的比酒吧歌手和十八线配角强吗?明星发微博只是想分享自己的动态吗?笔者认为核心是要:「提升影响力」。
之前看过两种不同的职场影响力类型,职权影响力与非职权影响力,分别由不同的因素组成:
职权影响力:
传统因素:下级对于上级有一种天然的服从感,层级高比层级低的天然有影响力
职位因素:从组织架构的角度,由于更高级别职位的人有一种敬畏和遵从感
资历因素:有资历的人,在人们的眼中是更值得敬重的,比如新员工对老员工的尊敬
非职权影响力:以下几个都会影响他人的「非职权」因素
人品和品格
历史表现
专业能力
亲和力
因为「职权影响力」需要时间的积累,所以对于大多数需要提升影响力的人来说,「非职权影响力」更需要关注。
ATA(阿里内部技术社区):把思考和成果都记录和沉淀下来,分享给更多的人
分享会:多参与分享会,不论大小,都是提升影响力的机会,但切记要在不影响工作进程的条件下
技术会议
碎片化讨论:碎片化讨论有助于即时思考的表达,但不要为了发声而发声
群发(团队/部门/阿里云前端联盟)
周报/月报中附带宣传
认识的同行/同事(大牛、翰林院推荐等)
找技术运营推广(F2E 大群/ATA )
不知道大家发现没有,层级高的同学演讲能力通常都不会差,而好的演讲水平不是天生的,需要我们不断地进行学习和训练,一场好的演讲通常由一下几部分组成:
提前了解听众的诉求:针对面向的群体类型,以及听众的诉求来设计这一次的演讲
好的开场是成功的一半:开场可以来一些小互动以及调研等等,把听众的思绪带进到分享主题里来
好的内容结构:参考「结构化思维」的内容
PPT 只是配角:把结构内容呈现到 PPT 上,切记不要把一个好的演讲全部归功到 PPT 上
把控好整体节奏:思考如何让听众跟着你的思路走,一旦跟不上,就算不上号的演讲
趣味性的互动:合适的情况下可以来一些互动,避免单向输入带来的乏味
肢体语言:好的肢体语言可以让演讲更生动
声音控制:流利的表达、抑扬顿挫的表达会让人更能接受你的信息
收尾时强调重点:跟写文章的中心思想类似,把听众的思绪拉倒中心思想上来
有一个演讲法则称为“10-20-30”法则,具体来说就是幻灯片不要超过 10 张、演讲时间不要超过 20 分钟、字体大小不要小于 30 号。
在工作中我们基本上都会遇到团队内部协同、跨团队协同、以及跨部门协同的情况,特别是到了一定的层级,做项目管理、团队管理之后,协同与领导能力更为重要,我们也称为「借人成事」的能力。这里我们要学习很多协同领导相关的能力,比如:
项目管理(预期、过程、质量、风险):项目管理也是一个比较专业,每个程序员必学
开好会:当需要协同的角色越多,开会的效率就变得尤其重要,在大厂有多少程序员的时间是花在了开会上,这部分建议参考集团内部的《高效会议指南》
复好盘:柳传志在《我的复盘方法论》中说到:在这些年管理工作和自我成长中,「复盘」是最令我受益的工具之一,可见复盘对人成长的重要性,这里推荐一本书叫做 《复盘+:把经验转化为能力》
做到事事有回应、件件有着落、凡事有交代:做一个靠谱的职场人,三个最重要的要素
诚信:说到做到,提升信任感
保持正能量:多传递一些正能量,谣言与八卦在职场中常常被人津津乐道,但往往也会影响我们的职业发展
严于律己,宽以待人:领导者必备
领导力方面,重点推荐《冯唐. 成事》一书
人的一生中不可能不会遇到压力和挫折,抗压能力的高低,会影响我们的生活与工作,抗压能力越高,我们越容易适应当下的环境,所以说,提高抗压能力是非常有必要的,这里可以给一些提升抗压能力的建议,也是我个人在工作之外会经常保持的习惯:
培养兴趣爱好:把兴趣爱好作为自己的灵魂伴侣
有三五好友可以交流与倾诉:遇到压力和挫折的时候,身边如果有人能够相互鼓励,压力会小很多
保证充足的睡眠:很多时候,我们遇到压力和挫折的时候会失眠,但我们尽量在挫折不出现的时候就保证充足的睡眠的习惯,压力来的时候不至于影响太大,压力越大越无法入睡,会进入一个恶性循环。(这里没有理论做支撑,自己的感受)
保持运动习惯:保持对自己兴趣的运动习惯,和三五好友打球,充足睡眠自然来
笔者以为,这八种基础软技能在程序员的工作中相比其他软技能都更为重要,希望能够对你有一些启发。人生职业的道路上还有非常多的软技能,比如养生、理财、素质、价值观等等,下次有机会在一起探讨,谢谢!
作者|英布
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我想用ruby编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
如何检查Ruby文件是否是通过“require”或“load”导入的,而不是简单地从命令行执行的?例如:foo.rb的内容:puts"Hello"bar.rb的内容require'foo'输出:$./foo.rbHello$./bar.rbHello基本上,我想调用bar.rb以不执行puts调用。 最佳答案 将foo.rb改为:if__FILE__==$0puts"Hello"end检查__FILE__-当前ruby文件的名称-与$0-正在运行的脚本的名称。 关于ruby-检查是否
是否可以在应用程序中包含的gem代码中知道应用程序的Rails文件系统根目录?这是gem来源的示例:moduleMyGemdefself.included(base)putsRails.root#returnnilendendActionController::Base.send:include,MyGem谢谢,抱歉我的英语不好 最佳答案 我发现解决类似问题的解决方案是使用railtie初始化程序包含我的模块。所以,在你的/lib/mygem/railtie.rbmoduleMyGemclassRailtie使用此代码,您的模块将在
前言作为一名程序员,自己的本质工作就是做程序开发,那么程序开发的时候最直接的体现就是代码,检验一个程序员技术水平的一个核心环节就是开发时候的代码能力。众所周知,程序开发的水平提升是一个循序渐进的过程,每一位程序员都是从“菜鸟”变成“大神”的,所以程序员在程序开发过程中的代码能力也是根据平时开发中的业务实践来积累和提升的。提高代码能力核心要素程序员要想提高自身代码能力,尤其是新晋程序员的代码能力有很大的提升空间的时候,需要针对性的去提高自己的代码能力。提高代码能力其实有几个比较关键的点,只要把握住这些方面,就能很好的、快速的提高自己的一部分代码能力。1、多去阅读开源项目,如有机会可以亲自参与开源