阅读视图

发现新文章,点击刷新页面。
🔲 ☆

高效沟通(四):沟通技术

上篇文章中我分享了一些常用的沟通方式:尊重、倾听和情绪控制,并给出了几个我认为很不错的沟通技巧,比如:引起对方的兴趣;过滤信息,简明扼要地表达;用数据和实例说话。这篇文章中,我来分享几个关键的沟通技术,相信掌握了这几大沟通法宝,你的沟通水平会大幅提升。

逻辑

你的逻辑能力一定要强。因为中国人从小就不学逻辑学,所以讲话不注重逻辑,而我们理科生尤其是学过数学的程序员是懂逻辑的,所以,对于我们程序员来说,我们是可以用缜密逻辑疯狂地碾压别人的。

逻辑是一门科学,也是一门数学。谁是谁的充分条件、必要条件或充要条件,以及有没有关联关系,有没有因果关系等,这些东西你要做到心中有数,当对方的表达中出现逻辑错误时,你可以随时指出来。比如,这两个事儿没有因果关系,我们不要把它们放在一起谈。

有一次,我就跟一家公司的产品团队 PK 了一下。这家公司的产品有一个视频下载功能,但他们统计数据发现,有大约 40% 的用户下载到一半就取消下载操作了。于是他们就想提高用户的下载体验,解决办法是模仿微信的绿色进度条的做法:让进度条的 90% 嗖地过去,然后最后的 10% 则对应实际剩下的下载进度。

我们通过逻辑分析,不难发现这样做是不能赢得用户的。他们的逻辑是:“用户看到已经下载 90% 了,然后会想那 10% 很快就能下载好,所以会愿意多等一会儿。而不是下载 10% 就让用户等了半天,那他就不想等了。”这里的前置条件是用进度条欺骗用户,后置条件是用户愿意等待下载。

但是不是进度条这样设计了以后,用户就真的愿意等到下载完成呢?不是的。不需要试验,我们脑补一下,当我们的微信打不开网页,或者打开速度超过我们的心理忍受限度时,无论那个进度条是多少,我们都不会等的。有这么一个逻辑在这里卡着。

基于这种逻辑,我跟他们说,这种进度条设计会导致更低的下载率。因为视频通常比较大,下载的总时间是很长的,绝大多数用户对这个速度是没有概念的。打开网页的时间是很短的,90% 的网页在 3、4 秒内就打开了,只有少数偶尔需要 5 秒到 10 秒才能打开(因为移动网络的问题)。

这时,我可以通过这种“就快完”的手段把用户多留下来一会儿。但是,视频下载无论怎样优化,至少需要半分钟,才能下载下来。此时,如果进度条不能反映真实进度的话,用户对总的打开时间是没有合理预期的,90% 的进度提前到了,剩下的 10% 花那么久,很容易让人认为是下载卡死了,从而放弃,乃至在多次重试无果后对应用和平台都失去兴趣。

所以,这样的进度条设计只是用户愿意等一小下(15 秒以内)的充分条件(还不一定是必要条件),并不是用户愿意等待直到视频下载完成的充分条件或必要条件。

在这样的逻辑面前,产品经理立马取消了这个功能的排期,说还需要想一想。你看,你可以用你的一些逻辑推理去分析问题的前因后果和条件,然后用这个条件来说服他。

在逻辑层面说服对方,是一种非常高级的手段,就像懂微积分的人来解数学题一样,那些不懂微积分的只有被碾压的份儿了。

信息

信息要全面、准确。这里重点提一下 X/Y 问题。X/Y 问题是一件非常讨厌的事情。有时候我们拿着 Y 问题去找别人,问到一半才知道,我们原来要问的是 X 问题。

Stack Overflow 上有个问题,问的是“怎么截取一个字符串的最后三位?”大家给了一堆答案。突然有个人问:“你为什么要截取字符串的后三位?”他说:“我要找文件的扩展名”。实际上,文件的扩展名不一定是 3 个字符,而且有专门的函数干这个事儿,不需要自己写。这里,取文件的扩展名,这叫 X,取文件名的最后 3 个字符,这叫 Y。他想知道 X,但不知道该怎么说,于是就说成了 Y,导致别人都去解决一个不存在的问题。这叫 X/Y Problem。

我可以告诉你,这个世界上到处都是 X/Y 问题。有些公司找我说,我们要做分布式架构,我们要做大中台,我们要做线下线上融合……这些问题都是 Y 问题。我都要反问,你为什么要做分布式架构?为了大规模营销,为了稳定性,还是为了加快开发速度?做大中台,你是为了什么? 是为了打通各个业务线,为了快速开发,还是为了技术输出?等等。要解的真实问题才是 X 问题,手段都是 Y 问题。只有你真正了解了 X 问题,你才能真正明白整个事。

当你了解了 X 问题后,你就要到源头,来质疑或是改良他的 Y 问题,甚至提出 Z 方案,而对方会陷入被动,被你牵着鼻子转。

维度

我们想一下,人与人不同都是细节上的不同,比如:身高、体重、手机号等,人与人的相同点都是在宏观上相同,比如:国籍,性别……这告诉我们,如果你要找不同就要到细节上去,如果你要找共同,就要到大局上去。

所以,在和人争论时,如果要反驳,那一定是低维度反驳,越细节越好。而在说服对方时,则要在高维度说服对方,越宏观越好,比如从公司的大目标出发。高维度讲究的是求同存异。你跟别人相同的东西一定是高维度的,这就是大同,而你跟别人不同的一定是非常细节的东西。大同的东西,更容易让人产生共鸣,从而容易达成默契和共识。

因此,能够站在更高的维度来沟通是我们需要努力的目标。我们经常会听到类似的话:“哎呀,大家都没有恶意。我们虽然争论成这样,但是大家都是为公司好,只不过我们的路径不对。”或者“我们的目标是一样的,但是我们的方式不一样。”能感觉到吧?气氛一下子就缓和了好多。

站在更高的维度上讨论问题,可以让你有大局观,对方就会显得很小气,导致对方也会不好意思,于是就会出现“六尺巷”的故事中所描述的那种场景。

共同

这里讲的是共情,共享,共利,共识以及换位思考。如果你能站在对方的角度思考问题,那么你所想的问题以及所想沟通的内容,一定会跟只想自己有很大不同。同时,你会神奇地发现,换位思考能帮助你更为全面地理解并解决问题。

寻找“共同”的过程,其实也可以理解成为化“敌”为“友”的过程。我们不妨想象一下,沟通双方剑拔弩张,随时一触即发的情况,和沟通双方有共同的目标一起思考和解决问题的状态,哪种更能获得更好的结果。而共同该怎样找,跟我们在维度中提及的很相似,就是从高维度,寻找共同之处。

首先是共情,跟对方相互分享各自的情感,这是一种拉近距离最有效的手段,然后是相互共享自己的观点,在观点中寻求双方共同的利益点,然后不断地循环,一点一点地达成共识。

三本书

此外,我还想强调一点,无论干什么,你一定要有一个非常犀利的观点,也就是金句。如何得到这些金句呢?一定要多看书。你到那些公众号或者知乎里面看一些抖机灵的内容是没有用的。抖机灵的金句没有用。一定要是有思想深度的金句,才有力量。推荐你看三本书《清醒思考的艺术》、《简单逻辑学》和《重来》。

我是先被《重来》洗脑了,这本书帮我开拓了眼界,打破了我既有的思维模式,让我反思过去习以为常的每一件事。同时书中给出了实用、可操作的建议,让我头一次从心底感受到,原来世界还可以如此不同。

然后,我看了《清醒思考的艺术》,这本书作者以显微镜般的观察发现人们常犯的 52 个思维错误,并一一列出。帮人们认识到错误的思维是如何发生,从而避免掉入思维陷阱中。看这本书的过程中,我能明显感觉到自己的思维方式在被重新构造。

随后是《简单逻辑学》。逻辑学是很枯燥的,但这本书的作者以其简练而又充满趣味的笔触,将逻辑学活化为一种艺术,从它的基本原理,到论证,到非逻辑思维的根源,再到 28 种就发生在人们身边的非逻辑思维形式,带领我们进入这个精彩无比的逻辑世界,体会妙趣横生的思维交锋,跨过无处不在的逻辑陷阱,让人沉醉其中,欲罢不能。

这三本书对我影响很大,也建议你好好读读,能改善你的思维,炼就你的火眼金睛。你会发现自己跟和别人不在一个频道上,你能看到事物更多的侧面,在阐述观点时,会比别人更加深刻、犀利和有见地。一些金句也会在你跟人互动交流时,随机地冒出来。你自己都能明显感觉到自己的气场要比其他人足。

小结

总结一下今天的内容。我们讲了沟通的四大关键技术:逻辑、信息、维度和共同

有逻辑的表达,更容易说服对方。信息全面准确,更有利于让沟通的双方清楚定位问题,从而更高效地解决问题。

维度是个很有趣的事儿,有的时候要站在高维度去碾压对方;有的时候要站在低维度去碾压对方。如何把握这个度很重要。如果站在客户的角度,最好用高维度。但如果站在技术细节的角度,这是低维度。高维度容易拉拢对方,而在低维度更容易说服对方。只不过低维度容易爆发冲突,要恰当地控制好度。

最后一点是共同,其实寻找共同的过程就是化“敌”为“友”的过程,帮助大家在共赢的大思路和环境下,共同思考问题的解,从而实现高效沟通。此外,我强调了金句的重要性,以及如何获得这些金句。答案是没有捷径可走,唯有多读书,多思考,才能慢慢获得。

来源:《左耳听风专栏:高效沟通》

🔲 ☆

高效沟通(三):沟通方式及技巧

沟通方式

好的沟通方式有很多种,我主要介绍最常用的三种:尊重、倾听和情绪控制

尊重

尊重对方在高效沟通中非常重要,也是一个很关键的前提。这里你需要记住以下两个原则。

  • 我可以不同意你,但是会捍卫你说话的权利。即便在你不认同对方观点的情况下,也要尊重对方的表达,认真聆听,这个时候有可能你会发现不一样的东西,从而改变自己最初不准确的认知。

  • 赢得对方的尊重需要先尊重对方。在你对他人表现出足够的尊重之后,同时你也能够赢得对方的尊重,他会更乐于跟你交谈,而且交流的内容也会更为细致和深入,从而实现良好的沟通效果。此外,在这样的背景下,当你和对方出现观点不一致的情况时,对方也会更乐于聆听你,并顺着你的思路去思考。

所以可以说,尊重对方并赢得对方尊重的沟通方式,通常会进行得比较深入,沟通效果也会很不错。

注意,尊重并不代表要低三下四、随声附和,做一个墙头草可以让别人很容易和你相处,但要赢得对方的尊重,这还远远不够,你一定要和对方有观点上的交互,甚至是碰撞。沟通的目的不是为了附和对方,而是产生一种更完整更全面的认知。只有当双方都愿意接受不同的观点时,此时的沟通才会迸发出更多的火花,而这一切都需要发生在相互尊重的基础之上。

倾听

《沟通的艺术》一书中将“倾听”定位为至少与“说”同等重要的沟通形式,足以见其重要性。作者认为,倾听与听或者听到有很大不同,它是解读别人所说信息的过程,包含听到、专注、理解、回应和记忆五大元素。

上面的说法有点高大上,我们还是实在一点。我们之所以要倾听,就是因为倾听可以让我们获得更多信息,对对方有更多的了解。倾听能让对方感觉到自己被尊重,所以才会跟你分享更多的信息。这其实是沟通中的高级技巧,因为当你掌握了对方很多信息时,你就可以了解这个人,也就对你越有利。所以,面试的时候,一般来说会面试的面试官基本上都不多说话,都是在听你讲,你讲的越多,他就了解你越多。那些电视里访谈类节目中的主持人都是很厉害的倾听高手,因为他们要挖到被采访人更多的信息。

你一定要学会倾听,掌握到更多的信息,因为掌握不了足够的信息就会信息不对称,信息不对称就会做出错误的假设。尤其是在谈判的时候,你觉得他的利益点是这个,而实际上他的利益点可能是另外一个。所以,倾听其实不仅仅只是听,还要思考,要思考更深层的原因,不要被表象所迷惑,才会有更高效率的沟通,这才有助于你做出正确的决定。

情绪控制

能否控制好自己的情绪对于沟通效果来说至关重要。如果动不动就生气或者心怀戒心,通常会令沟通很难进行,更不用说实现高效沟通。如果能控制好自己的情绪,时刻保持理性思考,这不仅会使所沟通问题得到顺利解决,而且能给对方留下好的印象,进而形成良好的人际关系。我们都会说某个人的 EQ 比较高,并不是说这个人很会说话,很会说话、有随机应变能力的人通常都是 IQ 高,EQ 高的人一般都是可以控制自己情绪的人。

具体该怎样做呢?我建议遵循以下两个原则。

  • 不要过早或者过度打岔和反驳。倾听对方,即便有不同意见,也要耐心地听对方说完,不要打岔或反驳。断章取义是件非常可怕的事儿,因为当你听对方完整讲述完之后,很多时候会改变自己在聆听过程中的某些想法或者看法。此外,打断别人说话,是很不礼貌的事儿,次数多了,会给对方留下坏印象。

  • 求同存异,冷静客观。每个人的知识储备不同,生长环境不同,经历和性格等也不同,所以看待和理解问题时,自然会有很大差异。所以,要懂得尊重这些差异,客观公正地思考问题,并给出相应的建议和看法。

切莫在冲动之下,说出很多一些过分或过激的话,因为言语的力量是巨大的,杀伤力有时难以预估。举一个有些极端的例子。假如你和铁哥们儿吵架了,对方一气之下,打了你两拳,你很有可能过两天就忘记了。但是如果对方说了几句伤你心的话,这种伤心则有可能会持续很久很久,甚至你们可能会因此而绝交。

人是有情感的动物,并不是所有的人都能够控制得住自己的情绪的,尤其是血气方刚的年轻人。有时候,我会自己告诫自己,情绪是自己的,不是别人的,不应该被别人 hack 了。所以,无论发生什么事,自己才是自己心情的主人,而不是别人。话虽这样说,但是要做到并不容易。有时候,我也不能很好控制我的情绪,到今天都还不行,这也是我要用一生去成长的事……

沟通技巧

掌握了上面的沟通方式,下面来看几个我经常用的沟通技巧。

引起对方的兴趣

第一是引起对方的兴趣。如果对方没有兴趣的话,那么他是不愿意跟你沟通的。但你要怎样引起对方的兴趣呢?我现在也在创业。我出去跟客户谈,我技术好,是没有用的。只有利益,才能引起对方的兴趣。

举一个真实的例子,为了找一家银行谈合作,我找了一堆关系,给我介绍了某个银行的副行长。见面的时候我的着装有些随意,而周围的人都穿着衬衫和西裤,很正式。估计要不是别人介绍的,他一眼都不想看我,几句话就能把我打发了。

他一开始就问我:你是谁?你们公司叫什么名字?没听说过。注册资本多少?哎呀几十万呀……我被这几个问题搞得非常地狼狈和不堪,完全不知道该怎么往下继续。在这样的情况下,如果你是我你会怎么办呢?该怎样吸引他的兴趣呢?

真实情况是我只用了 20 分钟时间就搞定了这件事。我分享一下,我是怎么做到的。

首先,我见他之前做了一些功课,收集了一些信息。银行和金融业,今年下半年整个形势都是很糟糕的,银行贷款都办不了。国家货币在紧缩,还有 P2P 这些乱七八糟的事儿。于是,我就跟他说,我这边有一个客户,这个客户的现金流比较大,一天的流水大概是 3-5 个亿……

还没等我讲完,他就打断了我,立马说:哦?!请坐,那个谁,过来倒点儿水……当一个人对你有兴趣了以后,后面的事就比较好谈了。当然,我并不是在忽悠他,我做的技术项目本来就是为大规模并发的场景而生的,所以,能用得上这些技术的用户基本上来说都是有一定的业务量的,也是有相应的现金流的……

直达主题,强化观点

第二是直达主题,强化观点。要做到这点,你需要做的是过滤信息,简明扼要地表达。信息不要空泛笼统,而要可以准确执行。亚马逊要求员工都有一个技能叫做 deal with ambiguity。ambiguity 就是歧义的、模糊的,不知道怎么执行的。工程师的情结通常是我写出来的代码 1 就是 1,0 就是 0。

但很多时候产品需求都是很模糊的。而且很多时候,整个世界都是模糊的、有歧义的。有的人这么说,有的人那么说。你都不知道自己该信谁。所以亚马逊要求员工有一个能力就是,你一定要有把模糊的理解变成准确理解的能力,因为如果不这样,你是写不出代码来的。

这种过滤掉无用或者非关键信息的能力很重要。确定自己的目标,学会抓重点,知道自己要什么和不要什么,这样你要的才会更鲜明。当一些事情变得简明和鲜明起来时,你才会表现出有力量的观点和话语。而这些被强化过的观点和话语,只需要一句,就会在对方脑子里形成一个小爆点,要么击中了对方的软处(扎心),要么会让对方产生深度思考。只有这样,你的信息才算是真正地传达过去,并在对方的脑子里生根发芽,这就是所谓的影响力!

要有这样的能力,你需要通过反复练习来获得。在表达之前,要想明白自己表达的目的是什么,先组织一下自己要表达的内容,然后结合自己的表达目的反思这些信息中,哪些是有用信息,哪些是无用信息。留下有用信息之后,思考是否有更加简单明了的表达方式,是不是可以一句话就行。当你开始把大量的信息提炼浓缩成“金句”的时候,你就真正开始成为沟通的高手了。

这里有个小技巧是换位思考,假设你自己获取到这样的信息会怎样理解和执行,甚至可以尝试多维度来理解,自己跟自己“互搏”,逐渐修正,直到令自己满意。这个过程需要花不少心思,也需要长时间的坚持和锻炼。你要对自己有信心。

基于数据和事实

第三是用数据和事实说话。你跟别人沟通,要尽量少说“可能、也许、我觉得就这样”等字眼,你最好通过数据和证据,通过权威的引用和证词,通过相关的实例和亲身的事例来让你的观点有不可被辩驳不可被质疑的特性。当你的信息出现了这样的特性时,接收信息的人,基本上来说,就会无条件地相信。别人会无条件地相信你说的话,你想想这是一种多么牛的沟能方式!

我记得我在亚马逊的时候,产品经理整天在数据仓库里做各种的统计和分析,然后拿着数据来说服老板和开发人员开一个新的项目。当那些数据和事实放在你面前时,你真的是只有认命的份儿了。

所以,在很多时候,我们要在沟通之前注意收集相关的数据和事实,多做一些沟通相关的功课,你的沟通会更有效率。基本上来说,数据、事实、证据和权威是沟通中的大规模杀伤性武器!

小结

总结一下今天的内容。简单来说,在沟通过程中,你要牢记三大沟通方式:尊重对方、倾听对方和情绪控制,从今天开始,你就可以在和别人沟通的时候刻意练习这几大沟通方式了。然后我还和你分享了几个对我帮助很大的沟通技巧。

  • 一是沟通之前,你要想方设法引起对方的兴趣,这里面你要思考对方最关注什么,你可以帮到他什么。

  • 二是直达主题,强化观点,要做到这一点,你需要过滤信息,简明扼要地表达。也就是说你要明确自己的沟通目的,然后围绕目的不断迭代自己的表达内容。同时,你可以用换位思考法来进一步确保自己的表达能够准确无误传递给对方。

  • 三是用数据和实例说话。沟通的时候,你应该尽量少用“可能”、“也许”之类不确定的话术,转而使用数据和实例等确定性的语言来夯实你的观点,当然,这中间你要学会如何积累“实例”。 这三样东西不仅可以帮你解决绝大多数问题,而且可以把你的沟通变得简单粗暴、直接有效。

采用这样的方式和技巧,我想你基本上可以解决 80%-90% 以上的沟通问题了。还是那句话,我能做到的,你一定也可以。加油!

来源:《左耳听风专栏:高效沟通》

🔲 ☆

如何做好时间管理

我一直说,时间是人生中最宝贵的财富,今天我就来跟你聊聊时间管理方面的话题。

关于时间管理,以前在外企工作时,受过一个专门的培训,我在工作中也总结过自己的方式。时间管理是非常重要的,因为时间过得实在是太快了,快得让你有点受不了,而看似忙碌的我们似乎在这一年中也没有做太多事,尤其是让自己能成长的事情。

有那么一句话是这么说,老天很公平,给了所有人同样多的时间,而有的人能够把时间用好,有的人则没有把时间用好。日积月累,人和人的差距就越来越大了。

之前的文章和你讲过,我在工作强度很大的情况下依然可以找到时间来学习和提升自己,主要是对学习的渴望程度很大。今天想和你谈一下,除了自己对某件事情的热情外,我们该怎么管理好自己的时间。

不过,说实话,在安排时间方面,我成长于一个相对于今天算是比较好的环境,举几个例子。

  • 那个年代,没有智能手机,工作中也不用实时聊天工具。而现在,很多公司都会有若干个聊天群,所有人都可以把信息发给所有的人,而不管这个事是否与你相关。但这些信息无法像邮件那样根据邮件标题聚合,或是通过设置规则自动分类……于是你工作在了一个信息杂乱无章的环境里,而且还在不断地被人打扰,不断地被打断。

  • 那个年代,别人要来找我开会,需要先给我发会议邀请,而且发会议邀请的时候,会找我日历上空闲的时间段来订会议。所以,我可以把很多工作安排在我的日历上,通过邮箱(Outlook 或是 Gmail 都有这样的功能)共享出去。这样,别人都会自觉地不在我有安排的时间段来找我。

而今天,我看到很多公司直接在微信上联系。你要是回复慢了,电话直接打过来,直接叫你去开会。不像我那个年代,老板临时给员工开会也要问一下员工有没有时间,但现在的工作环境连问都不问,直接一句,你来一下。

  • 那个年代,工作被非常有计划地安排。还记得在路透工作的时候,管理者们都说,你工作时如果有 70% 的时间能花在项目开发上,算是很高效了,一般来说,正常值也就是 50% 左右。在亚马逊的时候,每次开会都会把会议要讨论的事打印出来,前 10 分钟大家都在读文档,然后直接讨论,基本上会议都保持在半小时左右。

这可能是外企的好处吧,从上到下都知道时间管理是很重要的事,所以,从管理层到执行层都会想方设法帮助程序员专注地做好开发工作。包括尽可能的不开会,不开长会,需求和设计都是要论证很久才会决定做不做,项目管理会帮你把你处理额外工作的时间也算进去,还会把你在学习上花的时间也计算进去。所以,时间在整个组织上能够被有效地管理和安排着。完全不像今天国内的互联网公司。

所以,我以前管理自己的时间还是比较容易的,然而,现在人的工作环境的确是非常不利于管理。不过,我还是想在这里谈一下如何管理自己的时间,希望对你有帮助。

主动管理

无论什么事情,如果你发现你持续处于被动的状态下,那么你一定要停下来想一想如何把被动变为主动。因为在被动的方式下工作,你是不可能做好工作的,无论什么事。我是一个非常不喜欢被动的人,所以,对于任何被动状态,我都要“反转控制”,想尽一切方式变成主动。

如果你发现你的时间老是被别人打断,那么你就要告诉大家,我什么时间段在做什么事,请大家不要打扰我。我以前在国外看到有个老外就在自己的工位上挂了一个条幅,上面写着“正在努力写代码中,请勿打断……”而我在亚马逊工作时,亚马逊也允许员工想沉浸于工作时不用来公司而是可以在家办公(work from home)。我在阿里的时候有时候也怕被人打断,所以,我会跑到别的楼里找个空的工位工作。

在今天,我觉得你也可以这么干,你可以在群里事先告诉大家,我在几点到几点要无间断地做某个事,这个期间不会看任何微信或是钉钉的群聊,也不会接任何的电话,请大家不要来打扰我。而且还可以学习一下那个我见过的老外,在自己的工位上挂一个不要打扰我的条幅。人肉 Mute 掉所有的打扰。

另外,可以仿照一下以前在 Outlook 里设置工作日程的方式,把你的工作安排预先设置到一个可以共享的日历上,然后分享给大家,让大家了解你的日程。这样,可以让你的同事和老板能事先有个谱儿,而不至于想打断你就打断你。

你甚至可以要求你的同事,重要的事,不要发微信,而是要发邮件,因为微信会有很大概率看不到。这样一来,你就再也不用在一大堆聊天信息中做人肉的大数据挖掘,来找到和你有关的信息。

信息管理真的非常重要,因为将信息做好分类,才方便检索,方便你通过自己的优先级来处理信息。而目前看来,这些只有邮件才能够更好地完成(邮件可以帮你通过邮件标题聚合,你可以设置很多规则来自动化分类邮件,还可以帮你设置自动化回复)。

换句话说,你要主动管理的不是你的时间,而是管理你的同事,管理你的信息

学会说“不”

上面说了如何主动地管理你的时间。但是,那只是能让你有大块可以专注于工作的时间。然而,这并不能帮助你解决时间不够的问题。比如,现在的很多公司总是把工作安排得非常紧,今天提的需求,恨不得明天就上线,这也就是为什么今天加班的严重程度比我那个时候还更为严重。我认为,现在的很多公司已经不尊重科学和客观规律了,如果让他来管理孕妇,我觉得他们恨不得要把 10 个月的产期缩短成 2 个月。

所以,在这种情况下,你要学会对某些事说“不”,甚至是要学习对老板说不。这其实是一种“向上管理”的能力。

以前在外企接受到的管理方面的培训,有这么一条“Never Say No”——永不说不。的确是这样,说“不”会让人产生距离和不信任。所以,真是这样的,永远不要说不。但是,你明明做不到,还不能说不,这应该怎么办呢?这里面的诀窍如下。

  1. 当你面对做不到的需求时,你不要说这个需求做不到。尤其是,你不要马上说做不到,你要先想一下,这样让别人觉得你是想做的,但是,在认真思考过后,你觉得做不到,并且给出一个你觉得做得到的方案。这里的诀窍是——给出另一个你可以做到的方案,而不是把对方的方案直接回绝掉

  2. 当你面对过于复杂的需求时,你不要说不。你要反问一下,为什么要这样做?这样做的目的是什么?当了解完目的以后,你可以给出一个自己的方案,或是和对方讨论一个性价比更好的方案。你可以回复说,这个需求好复杂,我们能不能先干这个,再做那个,这样会更经济一些。这里的诀窍是——我不说我不能完全满足你,但我说我可以部分满足你

  3. 当你面对时间完全不够的需求时,你也不要说不。既然对方把压力给你,你要想办法把这个压力还回去,或是让对方来和你一同分担这个压力。

这个时候,我惯用的方式是给回三个选择:a. 我可以加班加点完成,但是我不保证好的质量,有 bug 你得认,而且事后你要给我 1 个月的时间还债。b. 我可以加班加点,还能保证质量,但我没办法完成这么多需求,能不能减少一些?c. 我可以保质保量地完成所有的需求,但是,能不能多给我 2 周时间?

这里的诀窍是——我不能说不,但是我要有条件地说是。而且,我要把你给我的压力再反过来还给你,看似我给了需求方选择,实际上,我掌握了主动

这就是学会说“不”的方法。说白了,你要学会在“积极主动的态度下对于不合理的事讨价还价”。只有学会了说“不”,你才能够控制好你的时间

加班和开会

国内的公司和国外公司还有一个很不同的事情,就是大量的加班和大量冗长的会议。我见过很多国内的公司,无论大公司还是小的创业公司,都是这个样子的。老实说,我对这个事情也能理解也不能理解。一方面,我能理解为什么会有这么多的加班和会议,主要原因还是管理者在管理上只会使用低级的通过劳动密集型的方式来做事。

另一方面,我不能理解的是,国外公司的加班和会议长度根本不像国内的公司,人家做的也比中国的公司好得多。在国内的公司,老板们看到团队在拼命加班,会很高兴,而在国外的公司,老板看到团队在拼命加班,会觉得这个团队一定是哪里出了问题,老板会比较焦虑。

那么,对于身处于这样环境中的我们,应该怎样管理好自己的时间,或是为自己争取时间呢?老实说,在恶劣的环境中优雅的行动,基本上是一件不可能的事情。我也经历过这样的事,我也没有太好的办法。不过,我还是可以跟你分享几个我的实践方式。

对于加班的事,除了像上面说的那样,学会如何说“不”外,我发现很多时候造成加班的原因是一个恶性循环。也就是说,因为加班干出来了质量不好的软件,于是线上故障很多,要花时间处理,而后面的需求也过来了,发现复杂代码的扩展性很差,越干越慢,越干越烂,越干故障越多。于是,你会被抱怨得越来越多。

这里,我觉得,如果怎么做都要受伤害,那么两害相权取其轻。你要学会比较是项目延期的伤害大,还是线上故障的伤害大,是先苦后甜好,还是积压问题好,聪明的你应该能做出正确的判断。

对于开会,我觉得今天大多数的会都开错了。在会上抛出问题,还是开放性的问题,然后公说公有理,婆说婆有理,任大家自由发挥,各种跑题跑偏,最后还没有任何的答案。开会,不是讨论问题,而是讨论方案,开会不是要有议题,而是要有议案

所以,作为与会者,如果你发现没有议案,大家海了去说,那么你有两种选择,跳出来帮大家理一理,或者也可以说一下,如果会上讨论不清,要不先线下讨论,有了方案再来评审。也许在一些会上你不敢这么干,但是有些会你是可以这么干的。能影响的这些都能为你争取到很多时间。

好了,总结一下。今天我主要跟你分享了几个能为自己争取更多时间的方法,比如主动管理时间、学会说“不”,以及面对高强度的加班和冗长的会议时,该如何应对和解决等。因为我认为,只有将使用时间的主动权掌握在自己手上,才能更好地利用时间,才能更为高效率的工作。所以,这是时间管理中非常关键的事!


前面我们讨论了如何争取到自己可以控制的时间。当我们争取到这些可以自己控制的时间后,我们就进入到了另外一个话题——如何利用好自己的时间。对此,我有下面的这些心得和方法,如果你有更好的方法,也欢迎告诉我。

投资自己的时间

其实,时间就像金钱一样,你得学会投资时间。把时间投资在有价值有意义的地方,你就会有更多的时间。

  • 花时间学习基础知识,花时间读文档。在参加工作的这近 20 年来,我发现,很多程序员把时间都浪费在了查错上。究其根本原因就是基础知识不完整,没有好好地把技术相关的用户文档读完整就仓促上手做事。其实只要把基础打扎实,认真读一下文档,你会省出很多很多的时间。系统地学习一门技术是非常关键的,所以这个时间是值得投资的

  • 花时间在解放自己生产力的事上。在自动化、可配置、可重用、可扩展上要多花时间。对于软件开发来说,能自动化的事,就算多花点时间也要自动化,因为下次就不用花时间了。让自己的软件模块可以更灵活地配置和扩展,这样如果有需求变更或是有新需求的时候,可以不用改代码,就算要改代码也很容易。

这里,可能很多人会说不要过度设计,我对这个观点既同意,也反对。的确,过度设计不好,但是只要是能在未来能节省时间的,宁可这个项目延期,我也会做的。花时间在解放自己的事上是最有意义的了

  • 花时间在让自己成长的事上。注意,晋升并不代表成长,成长不应该只看在一个公司内,而是要看在行业内,在行业内的成长才是真正的成长。所以,把时间花在能让自己成长,能让自己有更强的竞争力,能让自己有更大的视野,能让自己有更多可能性的事情上。这样的时间投资才是有价值的。

  • 花时间在建立高效的环境上。我相信你和我会有一样的一个习惯,那就“工欲善其事,必先利其器”。我们程序员在做事之前都喜欢把自己的工作环境整理到自己喜欢的状态下。比如使用趁手的开发工具,使用趁手的设备。

这里,我想把这个事扩大一下,花些时间在影响你身边的人上,比如你的同事,你的产品经理,你的老板,去影响他们,让他们理解你,让他们配合你来建立更好的流程和管理方法。在这个方向上花时间也是很值得的。

规划自己的时间

定义好优先级。无论你写不写出来,你一定都会有一个自己的 to-do list。有 to-do list 并不是什么高深的事。更重要的是,你要知道什么事是重要的,什么事是紧急的,什么事重要但不紧急,什么事又重要又紧急。这有利于你划分优先级。

最短作业优先。对于相同优先级的事,我个人喜欢的是“最短作业优先”的调度算法。理由是,先把可以快速做完的事做完,看到 to-do list 上划掉一个任务,看到任何的数据在减少,对于自己也好,对于老板也好。老板可以看到你的工作进度飞快,一方面有利于为后面复杂的工作争取更多的时间(老板只有在你有 Deliver 的时候才愿意给你更多的时间),另一方面,看到任务列表的减少会让你的心态更为积极。

而反过来,你花太多的时间在长作业上,长作业通常很容易出现“意外情况”让你花更多的时间,但此时你发现还有很多别的事没有做,这会让你产生焦虑感,产生更多的压力,进而导致更慢的生产效率。

想清楚再做。我发现很多时候,我们没有想清楚就开干了,边干边想,这样的工作方式其实很糟糕。你会发现,如果你没有想清楚,你总是要对已完成的工作进行返工,返工好几次,其实是非常浪费时间的。所以,对于一些没想清楚的事,或是自己不太有信心的事,还是先看看有没有已有的成熟解决方案,或是找更牛的人来给你把把关,帮你出出主意,看看有没有更好、更简单的方式。

关注长期利益规划。要多关注长远可以节省多少时间,而不是当前会花费多少时间。长期成本会比短期成本大得多。所以,宁可在短期延期,也不要透支未来。这里的逻辑是,工作上的事你永远也做不完的,长痛不如短痛。

我一年要做 10 个项目,我宁可第 1 或第 2 个项目被老板骂,但是我可以赢得后面 8 个项目,从后面 8 个项目上把之前失去的找回来。而如果反过来的话,我虽然一开始得到了老板的信任,但是后面越来越玩不动,最终搬起一块大石头砸了自己的脚。而且,不关注长远利益的人,基本上来说也是很难有成长的。

也就是说,你要学会规划自己的行动计划,不是短期的,而是一个中长期的。我个人建议是按季度来规划,这个季度做什么,达到什么目标,一年往前走四步,而不是只考虑眼下

用好自己的时间

将军赶路不追小兔。这个世界有太多的东西会让我们分心和跑偏。能专注地把时间投入到一个有价值的事上是非常重要的。确定自己的目标,专注达到这个目标,而不是分心。将军的目标是要攻城,而不是追兔子。所以,你要学会过滤掉与自己目标无关的事,不要让那些无关的事控制自己。

比如,不要让别人来影响自己的心情,心情被影响了,你一下就会什么都不想干了。做自己心情的主人,不要让别人 hack 了你的心情。再比如,知道哪些是自己可以控制的事,哪些是自己控制不了的事,在自己能控制的地方花时间。

再比如,知道哪些是更有效的路径,是花时间改变别人,还是花时间去寻找志同道合的人。不与不如自己的人争论,也不要尝试花时间去叫醒那些装睡的人,这些都是非常浪费时间的事。多花时间在有产出的事上,少花时间在说服别人的事上。

形成习惯。再好的方法,如果没有形成习惯,不能在实际的工作和生活中解决实际问题,都将成为空谈。如果你是个追求上进的人,我相信一定看过很多时间管理方法的文章和书籍,并且看的时候还会有些振奋,内心有时还会不自觉地想,“嗯,嗯!这个方法不错,正是我需要的,可以解决我的问题……”但很多时候都坚持不了几天就抛之脑后了。

所以,在讲述完如何争取时间,及如何使用时间之后,我想分享一下如何将这些时间管理方法形成习惯,因为我坚信:“做”比“做好”更重要。养成一个好习惯通常需要 30 天左右的时间,尤其在最初的几天就更为重要了。这时,不妨将文章中提到的方法和几个要点,写在某本书或者笔记本的扉页上,方便查看,时刻提醒自己。

而且,你可以结合自己的实践情况,适当做出调整。我的方法是我根据自己的情况总结的,不一定完全适合你,你完全可以基于我说的几个原则,发掘其他更适合自己的方法,这样才能更有利于形成习惯,对你更有帮助。

形成正反馈。在前面的文章中,我提到过,要有正反馈,也就是成就感,有助于完成一些看似难以完成的事儿。比如,我们说过,学习是逆人性的事儿,但如果在学习过程中不断地有正反馈,就更利于我们坚持下去。要让自己有正反馈,那就需要把时间花在有价值的地方,比如,解决自己和他人的痛点,这样你会收获别人的赞扬和鼓励。

反思和举一反三。可以尝试每周末花上点时间思考一下,本周做了哪些事儿?时间安排是否合理?还有哪些可以优化提高的地方?有点儿类似于我们常说的“复盘”。然后思考一下,下周的主要任务是什么?并根据优先级规划一下完成这些任务的顺序,也就是做一些下周的工作规划。

这样每周都能及时得到自己做时间管理之后的反馈,并有助于持续优化。通常坚持做时间管理一段时间以后,你都能在每次复盘时得到正反馈,这是有利于我们形成时间管理的习惯的。但我这里也想强调一点,我们也要允许偶尔的“负反馈”,因为人的状态总是会有高潮和低谷的,控制好一个合理的度就可以了。

人最宝贵的财富就是时间,把时间用在刀刃上,必将让你的人生有更多收获。

其他

写了这么多,还是让你来开心一下吧。下面这个图是我在某国内互联网公司工作的时候和我老板的聊天记录。是的,就只有这些信息,每次看到这个聊天记录时,我都会有一种莫明的喜感。结合这篇文章的主题,也给你开心开心。

img

来源:《左耳听风专栏:时间管理》

🔲 ☆

高效沟通(一):Talk和Code同等重要

Talk is cheap,show me the code,是我们技术人常说的一句话,也是技术社区中经常用的一句话。这句话的意思是,那些光说不练的人说一句是很简单的,而写代码的人则会为一句话付出很多很多的精力,其表明,一个看上去再简单的东西,用一行一行的代码实现起来,并能让其运转起来也是一件很复杂很辛苦的事。说得容易,做起来难!

这句话是 Linus 说的,也是我引入到中文社区的,然而,逐渐地,大众对这句话的解读开始有点变味了,走向了另外一个极端——他们觉得代码才是最重要的,甚至其中有些人开始觉得真正的技术人员是只用代码说话的!

似乎,这个世界上总是会有一些人,当他们看到一个观点的时候,在他们的脑袋里只有两个答案,一个是 true,如果不是 true,那就是 false。就好像只要一个人犯了个错误,这个人就是一个不折不扣的大坏蛋,如果一个人是个好人,那他要在所有的地方都是优秀完美的。

对于技术人员来说,其实,Talk 和 Code 是同样重要的, Talk 是人对人说的话,而 Code 也不仅仅只是人对机器说的话,也更是另外一种人对人说的话(因为 Code 需要易读和易维护,就需要让人读懂)。可见,无论是 Code 还是 Talk 其实都是要和人交流的,Code 是间接交流,Talk 则是直接交流。在公司中工作,需要了解公司的意图,与团队一起做项目,调研客户的需求,设计出用户易操作的界面……你会慢慢地发现,其实,Talk 并不 cheap,而 Code 才是其中比较 cheap 的(注:这是站在了另外一个角度)。

一个好的程序员,需要有好的学习能力,这样你才能成为技术专家,但是,你还要有好的沟通能力,不然,你的技术能力完全发挥不出来。就像一棵大树一样,学习能力能让你的根越扎越深,无论遇到什么狂风暴雨,你都可以屹立不倒,而沟通能力则是树杆和枝叶,它们能让你伸展到更高更远的天空。

所以,与人沟通是一项非常重要的软技能,我们应该刻意训练和培养自己这方面的能力。今天我们就来聊聊“技术人如何高效沟通”这一话题。我会分享很多我的工作经验,以及我这么多年来积累和总结的一些沟通技巧。它们在我的工作和生活中都起到了至关重要的作用,希望同样能给你一些启发。

我特别想对技术人员强调一下我的观点:有效的沟通是事业成功的必要条件。不管你的目标是成为一名卓越的管理者,还是成为某个领域的技术牛人,你都应该提高自己的沟通能力。

沟通的原理和问题

想要获得高效的沟通,我们首先需要知道,什么是沟通以及其背后的原理。简单来说,沟通是指运用语言、文字或一些特定的非语言行为(面部表情、肢体动作等),把自己的想法、要求、信息等内容传递给对方。而沟通的原理跟计算机之间的通信有些类似。我在大脑里面将要表达的内容根据通信协议(比如中文)进行编码,发送出来,你接收到中文信息,但它表达的是什么意思呢?这时就需要去解码。

然而,我们日常生活中经常出现的一种情况是,我这句话是这个意思,但却被对方理解为其他意思,即“说者无心,听者有意”。究其原因,其实是因为我们每个人的编码器和解码器完全不匹配造成的,这也是沟通中经常出现的问题。

img

那我们该怎样解决这个问题呢?我们来想象一下,在计算机世界中,遇到这个问题都是怎样解决呢?也就是出现编码器和解码器不一样的情况,怎么办?我们通常可以通过一些约定来解决这个问题。对应到沟通这个场景下,“约定”仍然是个好办法。我在一些国外公司工作过,基本上入职之后的第一件事都是,被告知公司里面有很多术语,在描述对应的事物时要用统一的术语。就好像江湖中的黑话一样,这就是我们的通讯协议的标准化,这样可以简化很多沟通的成本。

此外,反馈也是个很好的方式,你把你理解的东西说给我听。如果有偏差,我再给你解释一下,直到双方达成共识。这就好像 TCP 协议一样,为了保证对方收到了,就需要接收方发出确认包。因为发送方和接收方的解码器不一样,所以,接收方把其解码的信息再编码后传回来,发送方这边再解码看看是不是同样的数据,于是就可以保证编码器和解码器中的信息是一致的了。这又叫“双工通信”(你看,我开始用到术语了,文科生听不懂了,嘿嘿),不要小看“双工”这事儿,它是有效沟通的前提。反之,则会有鸡同鸭讲、对牛弹琴的意味了。

当然,就算是我们统一术语并且有反馈机制,人与人的沟通依然还是有很多的问题。最大的一个问题就是,我们的成长背景不一样,经历不一样,知识储备不一样,所以对相同事物的理解难免会存在一定的偏差。

日常沟通可能还好一点,但涉及到一些专业领域中术语的表达,沟通不畅的问题会变得更为严重。比如,我在讲一些计算机术语,而那些没有计算机方面知识储备的人,是完全听不懂的。即便他能听懂我说的每一个字,但还是理解不了我在说什么。所以,这个世界上有一些“教 6 岁孩子学习 XXX”的文章,这种方式其实就是想把一些高级的知识通过低级知识来表达出来,以便可以让小孩子都能听懂,也就是所谓的科普。相信我,如果你能做到这点,你一定是这个行业的专家级人物了。

就像那本相当经典的图书《从一到无穷大》,其实它在讲的是高阶物理知识,其中有非常难以理解的爱因斯坦相对论,然而这本书却被作者写成了中学生都可以读懂的科普书。能把深奥的物理知识写得这么通俗易懂,只有真正的专家才可以做到。这本书的作者是:乔治·伽莫夫(George Gamow)美籍俄裔物理学家、宇宙学家、科普作家,热大爆炸宇宙学模型的创立者,也是最早提出遗传密码模型的人。

信息在传递中的损失也不容忽视。相信很多人都玩过一个类似“传话”的游戏:一个人将一句话偷偷说给站在队首的人听,然后他把自己听到的内容传给第二个人,依次传下去,直到队尾。最后由队尾的人大声说出听到的内容。很多时候这个最终的结果都会令人哭笑不得,因为在传递的过程中,最初的信息已经完全变了样子。

因为,每一次信息的传递都是由不同的编码器和解码器完成的,而传递信息所使用的协议(人类的语言)是很难准确地携带所有的信息的,所以每一次编码和解码都会有信息的丢失和失真。还有一些人会在其中有意无意地“加油添醋”,甚至加入“谣言”,导致整个信息传递过程被黑!

与之对应的,如果一个公司层级越深,那么执行力一定越差。为什么呢?因为老大的“旨意”一层一层往下传递,传到最下面其实信息早就变了样儿。基本的模式都是,我听我的领导讲了,自己理解了一下,然后对下面的人讲。经常会出现这样的情况,最高层老板讲,我要的是这个,但最终员工交付的却是另外一个东西。信息传递的渠道越多,损失也会越大。所以,会有下面这张经典的图。

img

另一方面,在职场里,出于各种各样的原因,有些领导不想直接把自己上级的话对自己下属去讲。一方面,要把其变成下属能理解的语言去讲,他们觉得这样会更有效率,下属不用管公司或是别人要什么,只管好自己要干什么就好。

而另一方面也有政治上的原因,他们把一些信息阻断了,甚至修改了,以此来达到控制别人的目的。通常来说,只要有等级存在,职场中的管理层就会对上粉过饰非,对下盘剥利诱,这就是职场的生存法则,尤其是大公司更是这样。所以,公司大了后,如果管理跟不上,听之任之,上层和下层脱节基本上来说是必然的。

对我而言,不管以前做公司管理层,还是现在经营自己的公司,我一直都秉承的原则是,将信息源头的信息原模原样分享出去,而不是我“嚼过的”。因为,我认为后者的信息损失会非常大,而且产生的不良后果也会很大。真正的团队管理,不应该屏蔽信息,信息应该是公开透明的,因为我相信团队成熟到可以面对各种信息,并且是可以一起找解一起找出路的。

小结

总结一下今天的内容。在文章伊始我先强调了我的观点,Talk 和 code 同样重要,有效的沟通是你事业成功的必要条件。随后介绍了何为沟通及其背后的原理。我认为,沟通原理跟计算机世界中的通信原理有些类似。由于编码器和解码器的不同,会造成理解的偏差。这个问题可以通过约定和反馈来解决,也就是要先达成共识,然后基于共识来进行沟通。最后我阐述了一些沟通问题,以及应对这些问题的方法。

来源:《左耳听风专栏:高效沟通》

🔲 ⭐

简化kubectl常用命令

在k8s集群使用和运维中,每天都需要输入大量 kubectl 常用命令,其实我们可以通过定义 alias 别名和函数简化 kubectl 命令,比如使用k代替kubectl,po代替pods,svc代替services,kgpon代替kubectl get po -n [命名空间+资源名](以参数传入),并且添加kubectl命令自动补全,将这些别名和函数添加到 Shell 配置文件(如 ~/.bashrc、~/.zshrc)中,方便日常使用。以下脚本可以登陆到linux shell环境执行,结合这些别名和函数,可以大幅提高操作 Kubernetes 的效率,以后就可以轻松愉快地使用 kubectl 命令啦

# 在 bash 中设置当前 shell 的自动补全
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc

# 在 zsh 中设置当前 shell 的自动补全
# source <(kubectl completion zsh)  
# echo '[[ $commands[kubectl] ]] && source <(kubectl completion zsh)' >> ~/.zshrc
# zshrc添加将 .bashrc 改为 .zshrc

# 添加简化命令,单引号包裹 EOF,禁止所有变量解析
cat >> ~/.bashrc << 'EOF' 

# 基础别名
alias k='kubectl'                     # 用 k 代替 kubectl
alias kg='kubectl get'                # 快速 get 资源
alias kd='kubectl describe'           # 快速 describe 资源
alias kdel='kubectl delete'           # 快速 delete 资源
alias ka='kubectl apply -f'           # 快速 apply 文件
alias ke='kubectl edit'               # 快速 edit 资源
alias kex='kubectl explain'           # 快速 explain 资源
alias kl='kubectl logs'               # 快速查看日志
alias klf='kubectl logs -f'           # 实时查看 Pod 日志
alias kx='kubectl exec -it'           # 快速进入 Pod 的 Shell
alias kw='kubectl get --watch'        # 实时监控资源变化
alias kt='kubectl top'                # 查看资源使用情况
alias kr='kubectl rollout'            # 更新资源
alias ks='kubectl scale'              # 资源扩缩容
alias kcp='kubectl cp'                # 快速 cp 文件
alias kco='kubectl config'            # 快速 config 资源
alias kcd='kubectl cordon'            # 节点不可调度
alias kucd='kubectl uncordon'         # 节点可调度
alias kapi='kubectl api-resources'    # 列出支持的资源类型
alias kcl='kubectl cluster-info'      # 显示主控节点和服务的地址
alias kh='kubectl get --v=7'          # 显示资源请求的HTTP信息


# 资源类型别名
alias kgpo='kubectl get pods'         # pods
alias kgno='kubectl get nodes'        # nodes
alias kgns='kubectl get namespaces'   # namespaces
alias kgcs='kubectl get cs'           # ComponentStatus
alias kgep='kubectl get ep'           # endpoints
alias kgsvc='kubectl get services'    # services
alias kgdep='kubectl get deployments' # deployments
alias kgrs='kubectl get replicasets'  # replicasets
alias kging='kubectl get ingress'     # ingress
alias kgcm='kubectl get configmaps'   # configmaps
alias kgsec='kubectl get secrets'     # secrets
alias kgsa='kubectl get sa'           # serviceaccounts
alias kgpv='kubectl get pv'           # persistentvolumes
alias kgpvc='kubectl get pvc'         # persistentvolumeclaims
alias kgsc='kubectl get sc'           # storageclasses
alias kgsts='kubectl get sts'         # StatefulSet
alias kgds='kubectl get ds'           # DaemonSet
alias kgev='kubectl get events'       # events
alias kgjo='kubectl get jobs'         # jobs


# 查看资源描述(需替换 <resource-name>)
alias kdpo='kubectl describe pod'
alias kdno='kubectl describe nodes'
alias kdde='kubectl describe deployment'
alias kdst='kubectl describe sts'
alias kdds='kubectl describe ds'
alias kdsv='kubectl describe svc'
alias kdcm='kubectl describe cm'
alias kdse='kubectl describe secrets'
alias kdsa='kubectl describe sa'
alias kdpv='kubectl describe pv'
alias kdpvc='kubectl describe pvc'
alias kdsc='kubectl describe sc'
alias kding='kubectl describe ingress'
alias kdjo='kubectl describe jobs'


# 常用组合别名

# 查看所有命名空间的 Pods
alias kgpoa='kubectl get pods -A'

# 查看 Pods 并显示附加信息(如 IP、节点)
alias kgpow='kubectl get pods -owide'

# 查看 Nodes 并显示附加信息(如 IP、节点)
alias kgnow='kubectl get nodes -owide'

# 资源操作:$1对应命名空间、$2对应资源名称;y → yaml,n → namespace,默认输出格式为yaml
OUTPUT="-oyaml"

# kubectl get resources
kgpon() { kubectl get po -n "$@"; }
kgpoy() { kgpon "$@" $OUTPUT; }

kgden() { kubectl get deploy -n "$@"; }
kgdey() { kgden "$@" $OUTPUT; }

kgstn() { kubectl get sts -n "$@"; }
kgsty() { kgstn "$@" $OUTPUT; }

kgsvn() { kubectl get svc -n "$@"; }
kgsvy() { kgsvn "$@" $OUTPUT; }

kgdsn() { kubectl get ds -n "$@"; }
kgdsy() { kgdsn "$@" $OUTPUT; }

kgcmn() { kubectl get ds -n "$@"; }
kgcmy() { kgcmn "$@" $OUTPUT; }

kgsen() { kubectl get secrets -n "$@"; }
kgsey() { kgsen "$@" $OUTPUT; }

kgsan() { kubectl get sa -n "$@"; }
kgsay() { kgsan "$@" $OUTPUT; }

kgpvn() { kubectl get pv -n "$@"; }
kgpvy() { kgpvn "$@" $OUTPUT; }

kgpvcn() { kubectl get pvc -n "$@"; }
kgpvcy() { kgpvcn "$@" $OUTPUT; }

kgscn() { kubectl get sc -n "$@"; }
kgscy() { kgscn "$@" $OUTPUT; }

kgingn() { kubectl get ingress -n "$@"; }
kgingy() { kgingn "$@" $OUTPUT; }

kgevn() { kubectl get events -n "$@"; }
kgevy() { kgevn "$@" $OUTPUT; }

kgjon() { kubectl get jobs -n "$@"; }
kgjoy() { kgjon "$@" $OUTPUT; }

# kubectl describe resources
kdpon() { kubectl describe po -n "$@"; }
kdden() { kubectl describe deploy -n "$@"; }
kdstn() { kubectl describe sts -n "$@"; }
kdsvn() { kubectl describe svc -n "$@"; }
kddsn() { kubectl describe ds -n "$@"; }
kdcmn() { kubectl describe cm -n "$@"; }
kdsen() { kubectl describe secrets -n "$@"; }
kdsan() { kubectl describe sa -n "$@"; }
kdpvn() { kubectl describe pv -n "$@"; }
kdpvcn() { kubectl describe pvc -n "$@"; }
kdscn() { kubectl describe sc -n "$@"; }
kdingn() { kubectl describe ingress -n "$@"; }
kdjon() { kubectl describe jobs -n "$@"; }

# kubectl edit resources
kepon() { kubectl edit po -n "$@"; }
keden() { kubectl edit deploy -n "$@"; }
kestn() { kubectl edit sts -n "$@"; }
kesvn() { kubectl edit svc -n "$@"; }
kedsn() { kubectl edit ds -n "$@"; }
kecmn() { kubectl edit cm -n "$@"; }
kesen() { kubectl edit secrets -n "$@"; }
kesan() { kubectl edit sa -n "$@"; }
kepvn() { kubectl edit pv -n "$@"; }
kepvcn() { kubectl edit pvc -n "$@"; }
kescn() { kubectl edit sc -n "$@"; }
keingn() { kubectl edit ingress -n "$@"; }
kejon() { kubectl edit jobs -n "$@"; }

# 进入 Pod 的 Shell
kxsh() { kubectl exec -it -n "$@" -- /bin/sh; }
kxbs() { kubectl exec -it -n "$@" -- /bin/bash; }

# 查看 Pod 的日志
klpn() { kubectl logs -n "$@"; }
klfpn() { klpn "$@" -f; }
klppn() { klpn "$@" -p; }

# 删除 Pod
kdelp() { kubectl delete po -n "$@"; }

# 强制删除 Pod
krmfp() { kubectl delete po -n "$@" --force --grace-period=0; }

# 上下文和命名空间切换
alias kuse='kubectl config use-context'      # 切换集群
alias kns='kubectl config set-context --current --namespace' # 切换命名空间

# 生成 Pod 的临时调试副本(类似 docker exec)
alias kdebug='kubectl debug -it --image=busybox'

# 转发本地端口到 Pod(需替换参数)
alias kpf='kubectl port-forward pod/<pod-name>'


complete -o default -F __start_kubectl k
EOF

source ~/.bashrc

使用示例:

# 输入参数:$@对应整个输入参数,$1对应命名空间、$2对应资源名称,其余缩写命令使用方法与示例(Pods)类似

# 查看所有命名空间的 Pods
kgpoa                   → kubectl get pods -A
kgpow -A                → kubectl get pods -owide -A

# 查看指定命名空间的 Pods
k get po -n namespace   → kubectl get pods -n namespace
kg po -n namespace
kgpo -n namespace
kgpon namespace
kgpon namespace -owide  → kubectl get pods -n namespace -owide

# 查看指定命名空间的 Pod
kgpon namespace podname → kubectl get pods -n namespace podname
kgpoy namespace podname → kubectl get pods -n namespace podname -oyaml
kdpon namespace podname → kubectl describe pods -n namespace podname
kepon namespace podname → kubectl edit pods -n namespace podname

# 进入 Pod 的 Shell
kxsh namespace podname  → kubectl exec -it -n namespace podname -- /bin/sh
kxbs namespace podname  → kubectl exec -it -n namespace podname -- /bin/bash

# 查看 Pod 的日志
klpn namespace podname  → kubectl logs -n namespace podname
klfpn namespace podname → kubectl logs -n namespace podname -f
klppn namespace podname → kubectl logs -n namespace podname --previous

# 删除 Pod
kdelp namespace podname → kubectl delete pods -n namespace podname
krmfp namespace podname → kubectl delete pods -n namespace podname --force --grace-period=0

注意事项

  • 如果别名冲突(如 k 被其他工具占用),可替换为其他名称(如 kb)。

  • 删除资源时务必确认资源名称,避免误操作。

  • 编辑系统级配置文件前建议先备份:cp ~/.bashrc{,.bak}

  • 检察语法错误:bash -n ~/.bashrc

  • 检查别名或函数是否成功定义:type kg、type kgpon


参考:

🔲 ⭐

高效学习(一):端正学习态度

在开始这一系列文章之前,我想说,如果你想从我这里得到一些速成的方法,那么你就不用往下看了,学习是不可能速成的。这里只有一些方法和技巧,是我这么多年来行之有效的,分享出来也许对你有帮助。一方面,可能会让你学得更多和更累,另一方面,可能会让你学得更系统、更全面。总之,学习是一件“逆人性”的事,就像锻炼身体一样,需要人持续付出,会让人感到痛苦,并随时想找理由放弃

大部分人都认为自己爱学习,但是:

  • 他们都是只有意识没有行动,他们是动力不足的人。

  • 他们都不知道自己该学什么,他们缺乏方向和目标。

  • 他们都不具备自主学习的能力,没有正确的方法和技能。

  • 更要命的是,他们缺乏实践和坚持。

如果你去研究一下古今中外的成功人士,就会发现,他们基本上都是非常自律的,也都是非常热爱学习的。他们可以沉得下心来不断地学习,在学习中不断地思考、探索和实践。

所以,如果你不能克服自己 DNA 中的弱点,不能端正自己的态度,不能自律,不能坚持,不能举一反三,不能不断追问等,那么,无论有多好的方法,你都不可能学好。所以,有正确的态度很重要。

然后,我会在后面给你一些方法和相关的技能,让你可以真正实际操作起来。

主动学习和被动学习

1946 年,美国学者埃德加·戴尔(Edgar Dale)提出了「学习金字塔」(Cone of Learning)的理论。之后,美国缅因州国家训练实验室也做了相同的实验,并发布了「学习金字塔」报告。

1624128302678

人的学习分为「被动学习」和「主动学习」两个层次。

  • 被动学习:如听讲、阅读、视听、演示,学习内容的平均留存率为 5%、10%、20% 和 30%。

  • 主动学习:如通过讨论、实践、教授给他人,会将原来被动学习的内容留存率从 5% 提升到 50%、75% 和 90%。

这个模型很好地展示了不同学习深度和层次之间的对比。

我们可以看到,你听别人讲,或是自己看书,或是让别人演示给你,这些都不能让你真正获得学习能力,因为你是在被别人灌输,在听别人说。

只有你开始自己思考,开始自己总结和归纳,开始找人交流讨论,开始践行,并开始对外输出,你才会掌握到真正的学习能力。

举个大家都懂的例子,那就是学习英文,我们从小就是在开始学习英文了,很多人英文成绩可以考得很好,语法也可以不错。然而,哪天真正要和外国人交流的时候,却发现自己的英文能力渣得不要不要的,只会回答:Fine. Thank you, and you? 这就是浅度学习的结果。

我的英文能力也是一样的,直到有一天进到外企,外企请了个外教每周来公司三次和我们练英文,我的英文能力才有一点点进步,然而,还是不够。后来有一天,公司的客户抱怨我们的一线客服处理问题太慢,问我们在后台做开发的人有谁去一线支持客户,我举手了。于是我接了半年来自日本、新加坡、德国、法国、英国等多个国家的客户电话和邮件。

在这期间,我的英文能力直线上升,速度快得不得了。一方面是我要把自己知道的讲给客户听,另一方面要跟客户有交流,所以我学得更努力,也更有效果。主要是日本人和德国人给了我足够的信心,这两个国家的人可能是这世界上最严谨的人,他们非常喜欢打破沙锅问到底,而且他们的英文也不怎么好,但是他们都用很慢的语速来和我交流,一方面是怕他们自己说不好,另一方面是也希望我用慢速的话和他们说。于是,大家都在一种慢速的环境下说英文,把每个单词的音都发准了,这使我提高了英文能力。

后面再跟一些口音很奇葩的老外(比如印度人和法国人)说英文的时候,我就会让他们说慢点,以便我适应他们的口音。几年后,我到了另外一家外国公司工作,需要跟一些口音非常重的印度人和非洲人说英文,我都能听懂,着实把我身边的同事们都震住了。这就是深度学习的最好的例子,要践行!

所以,学习不是努力读更多的书,盲目追求阅读的速度和数量,这会让人产生低层次的勤奋和成长的感觉,这只是在使蛮力。要思辨,要践行,要总结和归纳,否则,你只是在机械地重复某件事,而不会有质的成长的。

浅度学习和深度学习

老实说,对于当前这个社会:

  • 大多数人的信息渠道都被微信朋友圈、微博、知乎、今日头条、抖音占据着。这些信息渠道中有营养的信息少之又少。

  • 大多数公司都是实行类似于 996 这样的加班文化,在透支和消耗着下一代年轻人,让他们成长不起来。

  • 因为国内互联网访问不通畅,加上英文水平受限,所以,大多数人根本没法获取到国外的第一手信息。

  • 快餐文化盛行,绝大多数人都急于速成,心态比较浮燥,对事物不求甚解。

所以,你看,在这种环境下,你根本不需要努力的。你只需要踏实一点,像以前那样看书,看英文资料,你只需要正常学习,根本不用努力,就可以超过你身边的绝大多数人。

我们整个世界进入了前所未有的信息爆炸时代,人们担忧的不再是无知识可学,而是有学不完的知识。而且时代的节奏变得越来越快,你可能再也不像 20 年前,可以沉着优雅平和地泡上一杯茶,坐在一个远离喧嚣的环境下,认认真真地看本书。这个时代,你再也不会有大块大块的时间,你的时间都被打成碎片了,不知不觉你也成为了快餐文化的拥趸……

在这样一个时代下,种种迹象表明,快速、简单、轻松的方式给人带来的快感更强烈,而高层次的思考、思辨和逻辑则被这些频度高的快餐信息感所弱化。于是,商家们看到了其中的商机,看到了如何在这样的时代里怎么治愈这些人在学习上的焦虑,他们在想方设法地用一些手段推出各种代读、领读和听读类产品,让人们可以在短时间内体会到轻松获取知识的快感,并产生勤奋好学和成长的幻觉(老实说,像我这种付费专栏或是得到等知识付费产品基本上就是类似的产物)。

这些所谓的“快餐文化”可以让你有短暂的满足感,但是无法让你有更深层次的思考和把知识转换成自己的技能的有效路径,因为那些都是需要大量时间和精力的付出,不符合现代人的生活节奏。人们开始在朋友圈、公众号、得到等这样的地方进行学习,导致他们越学越焦虑,越学越浮燥,越学越不会思考。于是,他们成了“什么都懂,但依然过不好这一生”的状态。

只要你注意观察,就会发现,少数的精英人士,他们在训练自己获取知识的能力,他们到源头查看第一手的资料,然后,深度钻研,并通过自己的思考后,生产更好的内容。而绝大部分受众享受轻度学习,消费内容。

你有没有发现,在知识的领域也有阶层之分,那些长期在底层知识阶层的人,需要等着高层的人来喂养,他们长期陷于各种谣言和不准确的信息环境中,于是就导致错误或幼稚的认知,并习惯于那些不费劲儿的轻度学习方式,从而一点点地丧失了深度学习的独立思考能力,从而再也没有能力打破知识阶层的限制,被困在认知底层翻不了身。

可见深度学习十分重要,但应该怎样进行深度学习呢?下面几点是关键。

  • 高质量的信息源和第一手的知识

  • 把知识连成地图,将自己的理解反述出来

  • 不断地反思和思辨,与不同年龄段的人讨论

  • 举一反三,并践行之,把知识转换成技能

换言之,学习有三个步骤。

  • 知识采集。信息源是非常重要的,获取信息源头、破解表面信息的内在本质、多方数据印证,是这个步骤的关键。

  • 知识缝合。所谓缝合就是把信息组织起来,成为结构体的知识。这里,连接记忆,逻辑推理,知识梳理是很重要的三部分。

  • 技能转换。通过举一反三、实践和练习,以及传授教导,把知识转化成自己的技能。这种技能可以让你进入更高的阶层。

我觉得这是任何人都是可以做到的,就是看你想不想做了。

此外,在正式开始讲如何学习之前,让我先说一些关于学习的观点,这是在为后面的那些学习方法和技巧做提纲挈领的铺垫。

学习是为了找到方法

学习不仅仅是为了找到答案,而更是为了找到方法。很多时候,尤其是中国的学生,他们在整个学生时代都喜欢死记硬背,因为他们只有一个 KPI,那就是在考试中取得好成绩,所以,死记硬背或题海战术成了他们的学习习惯。然而,在知识的海洋中,答案太多了,你是记不住那么多答案的。

只有掌握解题的思路和方法,你才算得上拥有解决问题的能力。所有的练习,所有的答案,其实都是在引导你去寻找一种“以不变应万变”的方法或能力。在这种能力下,你不需要知道答案,因为你可以用这种方法很快找到答案,找到解,甚至可以通过这样的方式找到最优解或最优雅的答案。

这就好像,你要去登一座山,一种方法是通过别人修好的路爬上去,一种是通过自己的技能找到路(或是自己修一条路)爬上去。也就是说,需要有路才爬得上山的人,和没有路能造路的人相比,后者的能力就会比前者大得多得多。所以,学习是为了找到通往答案的路径和方法,是为了拥有无师自通的能力

学习是为了找到原理

学习不仅仅是为了知道,而更是为了思考和理解。在学习的过程中,我们不是为了知道某个事的表面是什么,而是要通过表象去探索其内在的本质和原理。真正的学习,从来都不是很轻松的,而是那种你知道得越多,你的问题就会越多,你的问题越多,你就会思考得越多,你思考得越多,你就会越觉得自己知道得少,于是你就会想要了解更多。如此循环,是这么一种螺旋上升上下求索的状态。

但是,这种循环,会在你理解了某个关键知识点后一下子把所有的知识全部融会贯通,让你赫然开朗,此时的那种感觉是非常美妙而难以言语的。在学习的过程中,我们要不断地问自己,这个技术出现的初衷是什么?是要解决什么样的问题?为什么那个问题要用这种方法解?为什么不能用别的方法解?为什么不能简单一些?……

这些问题都会驱使你像一个侦探一样去探索背后的事实和真相,并在不断的思考中一点一点地理解整个事情的内在本质、逻辑和原理。一旦理解和掌握了这些本质的东西,你就会发现,整个复杂多变的世界在变得越来越简单。你就好像找到了所有问题的最终答案似的,一通百通了

学习是为了了解自己

学习不仅仅是为了开拓眼界,而更是为了找到自己的未知,为了了解自己。英文中有句话叫:You do not know what you do not know,可以翻译为:你不知道你不知道的东西。也就是说,你永远不会去学习你不知道其存在的东西。就好像你永远 Google 不出来你不知道的事,因为对于你不知道的事,你不知道用什么样的关键词,你不知道关键词,你就找不到你想要的知识。

这个世界上有很多东西是你不知道的,所以,学习可以让你知道自己不知道的东西。只有当我们知道有自己不知道的东西,我们才会知道我们要学什么。所以,我们要多走出去,与不同的人交流,与比自己聪明的人共事,你才会知道自己的短板和缺失,才会反过来审视和分析自己,从而明白如何提升自己。

山外有山,楼外有楼,人活着最怕的就是坐井观天,自以为是。因为这样一来,你的大脑会封闭起来,你会开始不接受新的东西,你的发展也就到了天花板。开拓眼界的目的就是发现自己的不足和上升空间,从而才能让自己成长

学习是为了改变自己

学习不仅仅是为了成长,而更是为了改变自己。很多时候,我们觉得学习是为了自己的成长,但是其实,学习是为了改变自己,然后才能获得成长。为什么这么说呢?我们知道,人都是有直觉的,但如果人的直觉真的靠谱,那么我们就不需要学习了。而学习就是为了告诉我们,我们的很多直觉或是思维方式是不对的,不好的,不科学的。

只有做出了改变后,我们才能够获得更好的成长。你可以回顾一下自己的成长经历,哪一次你有质的成长时,不是因为你突然间开窍了,开始用一种更有效率、更科学、更系统的方式做事,然后让你达到了更高的地方。不是吗?当你学习了乘法以后,在很多场景下,就不需要用加法来统计了,你可以使用乘法来数数,效率提升百倍。

当你有一天知道了逻辑中的充要条件或是因果关系后,你会发现使用这样的方式来思考问题时,你比以往更接近问题的真相。学习是为了改变自己的思考方式,改变自己的思维方式,改变自己与生俱来的那些垃圾和低效的算法。总之,学习让我们改变自己,行动和践行,反思和改善,从而获得成长

小结

总结一下今天的内容。首先,学习是一件“逆人性”的事,就像锻炼身体一样,需要人持续付出,但会让人痛苦,并随时可能找理由放弃。如果你不能克服自己 DNA 中的弱点,不能端正自己的态度,不能自律,不能坚持,不能举一反三,不能不断追问等,那么,无论有多好的方法,你都不可能学好。因此,有正确的态度很重要。

此外,还要拥有正确的学习观念:学习不仅仅是为了找到答案,而更是为了找到方法;学习不仅仅是为了知道,而更是为了思考和理解;学习不仅仅是为了开拓眼界,而更是为了找到自己的未知,为了了解自己;学习不仅仅是为了成长,而更是为了改变自己,改变自己的思考方式,改变自己的思维方式,改变自己与生俱来的那些垃圾和低效的算法。

端正的学习态度和正确的学习观念,是高效学习的第一步,拥有这两者一定可以让你事半功倍。然后就是要总结和掌握高效学习的方法,这是我们下篇文章中将要分享的内容。敬请期待。

来源:《左耳听风专栏:高效学习》


参考:主动学习与被动学习

🔲 ⭐

程序员面试攻略(三):面试风格

国内公司和国外公司在面试风格上完全不一样,所以,这里我们也需要了解一下不同风格的面试方法,这样有利于你准备。

说句实话,国内的公司是比较好面的,国外的公司是比较难面的。从职位招聘信息上你就可以看出来,国内的公司包括知名公司更多的是面试在表面上。因为国内公司招的基本上都是马上能来干活的,所以,问的更多的是一些技术知识上的东西。

准备这些知识性的东西,本质上来说跟准备考试没什么两样,恶补一下相关知识就好了。然后讲一个项目,项目中他们也不怎么追问细节,面试的过程中,也不需要写代码,也不需要解决一个难题,所以,容易蒙混过关。

国外的知名公司就没有那么容易了,真是全方位的考察,你的表达能力、沟通能力、思维方式、解题思路、代码风格、算法和数据结构、设计和架构能力、解决难题的能力……这是很难靠恶补就可以过关的,没有踏踏实实的沉淀、钻研和思考,你是很难过关的。

国内公司

对于在基层干活的程序员来说,国内的公司,小公司不说了,诸如 BAT 这样的公司,基本上来说,都是比较好面的。一般来说,都会问你一些技术知识,比如:Java 语言的一些特性啊,会不会用 Spring 和 Netty 啊,JVM 怎么配置怎么调试啊,并发编程是怎么玩的……

这些问题基本上来说都是知识性的问题,都是可以 Google 的,通过查手册查文档就可以知道的。所以,这些问题是很容易准备的,只要你老老实实地看几本我在《程序员练级攻略》里推荐的书就好了。当然,还是有很多人连这些基本的问题都回答不上来,这只能怪自己了。

回答完这些知识性的问题,就是项目经历描述了。你可以随便讲你做过的项目,把这个项目用到的一些技术架构都说清楚就好了,还有怎么上线的,怎么运维的,怎么加班的,怎么苦逼的,怎么带人的,怎么管理项目的。面试官也很少追问技术细节,因为可能面试官自己都不懂(哈哈)。

只要你按照我前面说的那个讲项目的方式来,面试官一看你用到的技术栈和我这边的很类似,他就开始想要你了。当然,国内的公司更多的是缺劳动力,所以,只要你能让他们感到你很能吃苦耐劳、任劳任愿,而且能很快上手干活就好了。

然后就是 HR 和老板的面试了,HR 和老板不懂技术,也不会问你技术问题,他们主要是看看你的性格和态度等。只要你表现能吃苦耐劳,踏实肯干,如果还有一点 “ 灵性 “(脑子转得快,与人好沟通,一来一回有问有答,性格外向点儿),在国内的面试你是很容易通过的。

基本上来说,国内公司喜欢快进快出,也就是说,不在面试上花太多的精力,进来就干活,不行就开掉,基本上是找工人找劳动力的玩法,也不关心员工的成长。所以,面试过程基本上来说,都是围绕你干什么,我这边这些事你会不会干,你会不会加班、能不能吃苦耐劳,听不听话等这样的内容进行的。

当然,对于架构师或是高级别的技术人员,又是另一种面试方式,这在国内的大公司中得分两种。

  • 一种是业务型部门的高级技术人员,基本上来说,不会再问你一些技术的细节,只会问你一些架构方面、项目管理方面,以及技术方面的事,或者一些业务架构上的事情。相对来说,业务或应用方面的架构师和高级工程师需要对业务和行业比较了解,有丰富的业务项目经验就好了,技术上倒不需要有多深的知识。我觉得,在一个行业呆久了,只要你对业务有思考,再加上有技术把持,基本上来说,只要平时多读一些不错的业务上的想法,还是比较好过的(因为不会问及细节问题)。

  • 另一种是偏技术部门的架构师和高级工程师,比如核心基础技术,或是云计算之类的。那就会问你很多技术细节上的东西了,而且问得还很深,需要你有相应的项目经验,或是开源社区里的工作经验。你需要有过相当的经历才有可能面过。但是,回过头来说,就算是这样的岗位,本质上还是会回到面知识型问题的方法,所以,无非就是你能钻研的知识深一点儿罢了。知识是死的,只要你努力,你总有一天能学会的。

总体来说,与国外公司相比,国内的公司不管是哪个层级上的面试都是比较好通过的。

国外公司

国外的公司我面过的不多,只面过,Amazon、Google、Microsoft、Facebook 这几个大公司,还有一些小公司就不在这里说了。这几个大公司中,Facebook 是相对比较好面的,Google 是相对最难面的。这些公司的面试最近都有改观,不再以算法为主要面试手段了,但还是会多多少少面你算法方面的题目。而且,无论初级还是高级的技术人员的面试都还是有点难的,因为这些公司的招聘标准是要招超过现有团队同等级别 50% 以上的人。这就要求团队成员只能越来越好,最终导致标准越来越高。

一般来说,会有两轮电话面试,一轮是工程师面写代码,主要是算法相关的代码,然后可能还是工程师再面一轮技术,或是经理电话面一轮,主要想了解一下你目前的工作职责还有你的一些长处和喜好,包括你的一些想法什么的。如果没有什么问题,你就会进入到 in-house 面试。

in-house 面试一般要面一天,最少 5 轮,3 轮和技术相关(包括代码、算法、设计、架构、Problem solving),1 轮是经理 (包括做过的项目、解决问题的能力、学习能力、思考方式……),1 轮是 HR(包括性格、喜好、薪水……)。老实说,这种车轮战的面试,如果你之前没玩过,是第一次上,那么会非常不习惯。一天面下来,你会累死。当然,习惯了你就会觉得没什么问题,所以还是要多练习。

国外的公司面试时一定会让你写代码,无论你面多高级的职位,只要是技术岗,基本上都会让你写代码。你千万不要把代码写得跟面条一样,至少要分模块函数,把函数接口定义得清楚点儿,代码逻辑也要简洁清楚(有大量的 if-else 嵌套的一定不是好代码),变量命名也要好一点儿。写代码的过程中如果有觉得不好的要打上 //TODO:refactor me 之类的注释,这样会是一个好的编码习惯。一般写完代码后,面试官会问如下几个问题。

  • 讲解一下你的代码。这主要是跟你一起 Review 代码,一般会考你的表达能力。最好用一到两个 case 来讲解一下代码会更好。

  • 分析一下代码的时间和空间复杂度。

  • 优化代码,包括代码中的 Bug 以及更高性能的算法。

在这个过程中,面试官除了要答案以外,也会了解你的思维方式或是做事方式。

注意,有些很有经验的面试官会从一个很简单的编码题开始,然后不断地加需求,或是改需求。一旦你发现这个事的时候,我给你的建议是不要马上实现新的需求,而是停下来,和面试官讨论需求,感觉一下未来可能的需求变化,然后开始重构代码,抽象该抽象的代码,将接口和实现分离,把程序逻辑和业务功能分离。

这里,你需要使用很多编码技巧甚至一些设计模式。如果你让面试官看到你是在 Case-by-Case 地写代码,那你就完蛋了。基本上来说,如果你平时写代码不是这样的习惯,在这个过程中你是无法装的,你会被搞得原形毕露的。

在设计和架构中,一般会涉及面向对象方面、数据库设计方面和系统架构方面的内容。系统架构方面的内容问得也很多,基本上都在问一些和高并发、高可用、高性能和大规模分布式相关的架构。但是,在你解题前,你一定要问清楚需求,不要仓促 jump into conclusion。先调研需求,最好再问一下,为什么要做这个需求?做这个需求的意义是什么?

当你了解完需求后,你还可以挑战一下,如果是这个需求的话,为什么不用另外一种方式或架构?这些问题,都是加分项。搞清楚需求后,你要开始设计系统了。设计系统时,你不要只是拍脑袋,还需要做一点容量计算。如果数据不完整,你直接跟面试官说清楚就好了,有数据上的支持会让你更好地设计好你的架构,而且,这会是非常大的加分项。

另外,在设计系统时,还要考虑到系统未来的扩展性,也就是未来如果又加入一些别的东西进来,或是量变得很大了,你的系统是否可以容易地进行功能扩展或性能扩展。这个架构问题,如果你没有足够丰富的经验,或是严谨的思考,并不容易做得出来。

Problem Solving 是一些国外公司尤其是 Amazon 最喜欢面的一个环节了。国外的这些大公司都认为他们要解决的问题是没有人解决过的,所以他们需要的人才也是能解决自己从来没有见过的问题的人。一般来说,面试官会给你一个你从来没有见过的问题,而且是很难的问题,很明显是一个只有工程师才能解的问题。

比如,用最简单的方式统计一条公路上向两个方向开出的汽车(比如在公路路面上放两个压力传感器什么的),或是让你设计一个自动化的学校排座系统,能够让性格接近的人坐在自己身边等。一般来说,他也不指望你能在一个小时的面试中找到问题的最优解,主要看你的解题思路。另一方面,面试官也会和你一起来解(有可能面试官自己也不知道答案),这样他想感觉一下,和你一起工作,一起解难题是个什么样的体验。

总之,面试国外的公司不是你在短期就能准备的,尤其是面一些高级别的技术职位,还是比较难的。基本上来说,你脑子要转得快,智商也要比较高,还要在日常受过比较好的软件开发或是工程架构上的训练,平时还要很系统、很工程地做事,用正确且严谨的方式做事。不然,你一定是面不过的。

小结

总结一下今天的内容。我认为,国内外公司的面试风格有很大不同。国内的公司是比较好面的,国外的公司相对难面一些。国内公司包括知名公司要招的基本上都是马上能来干活的,所以,面试中问的更多的是一些技术知识上的东西。比较好准备,恶补一下相关知识就好了。不怎么追问细节,也不需要写代码,也不需要解决一个难题,容易蒙混过关。

国外知名公司则对面试者进行全方位的考察,你的表达能力、沟通能力、思维方式、解题思路、代码风格、算法和数据结构、设计和架构能力、解决难题的能力……这些是很难靠恶补就能过关的。因此,我针对这两种不同的面试风格,给出了相应的面试流程,以及应对技巧。

来源:《左耳听风专栏:程序员面试攻略》

❌