《左耳听风》学习笔记


一、程序员如何用技术变现

(一)一些学习经验

  1. 要去经历大多数人经历不到的,要把学习时间花在那些比较难的地方。
  2. 要写文章就要写没有人写过的,或是别人写过,但我能写得更好的。
  3. 更重要的是,技术和知识完全是可以变现的。

(二)如何保持竞争力

一个是技术和技能的领先,二是对技术本质和趋势的敏感度。

(三)如何让自己的技能变现

1.千里之行,积于跬步

掌握大多数人不能掌握的技能或技术,需要你更多地学习,并要有更多的别人没有的经验和经历。

2.关注有价值的东西

  • 关于市场需求。你要看清市场,就需要看看各个公司都在做什么,他们的难题是什么。
  • 关于技术趋势。要看一个新的技术是否顺应技术发展趋势,你需要将一些老技术的本质吃得很透。

因此,在学习技术的过程一定要多问自己两个问题:

  • 一,这个技术解决什么问题?为什么别的同类技术做不到?
  • 二,为什么是这样解决的?有没有更好的方式?

另外,还有一个简单的判断方法,如果一个新的技术顺应技术发展趋势,那么在这个新的技术出现时,后面一定会有大型的商业公司支持,这类公司支持得越多,就说明你越需要关注。

3.找到能体现价值的地方

  • 在一家高速发展的公司中,技术人员的价值可以达到最大化。
  • 在一家大公司中,技术架构和业务已经定型,基本上没有什么太多的事可以做的。而且对于已经发展起来的大公司来说,往往稳定的重要性超过了创新。
  • 而刚起步的公司,业务还没有跑顺,公司的主要精力会放在业务拓展上,这个时候也不太需要高精尖的技术,所以,技术人员的价值也体现不出来。
  • 比较好的成长路径是,先进入大公司学习大公司的技术和成功的经验方法,然后再找到高速成长的公司,这样你就可以实现自己更多的价值。

4.动手能力很重要

  • 在解决任何一个具体问题的时候,有没有动手能力就成为了关键。
  • 代码里全是细节,细节是魔鬼,只有了解了细节,你才能提出更好或是更靠谱、可以落地的解决方案。而不是一些笼统和模糊的东西。

5.关注技术付费点

技术付费点基本体现在两个地方:

  • 能帮别人”挣钱”的地方;
  • 能帮别人”省钱”的地方。

6.提升自己的能力和经历

  • 参与知名的开源项目。
  • 成为公司核心项目的开发人员。

7.找到有价值的信息源

  • 如果你的信息来自朋友圈、微博、知乎、百度或是今日头条,那么我觉得你完蛋了。这些渠道有价值的信息不多。
  • 用好 Google,比如你在 Google 搜索引擎里输入 “XXX Best Practice”,或是 “Best programming resource”……你就会找到很多。

8.输出观点和价值观

9.朋友圈很重要

优质的朋友圈基本上都有这样的特性:

  • 这些人都比较有想法、有观点,经验也比较丰富;
  • 这些人涉猎的面比较广;
  • 这些人都有或多或少的成功;
  • 这些人都是喜欢折腾喜欢搞事的人;
  • 这些人都对现状有些不满,并想做一些改变;
  • 这些人都有一定的影响力。

最后有个关键的问题是,物以类聚,人以群分。如果你不做到这些,你怎么能进入到这样的朋友圈呢?

总之,就一句话,会挣钱的人一定是会投资的人。我一直认为,最宝贵的财富并不是钱,而是你的时间,时间比钱更宝贵,因为钱你不用还在那里,而时间你不用就浪费掉了。你把你的时间投资在哪些地方,就意味着你未来会走什么样的路。所以,利用好你的时间,投到一些有意义的地方吧。

(四)如何技术变现套路总结(来自评论)

  1. 程序员用手艺、技术养活自己,不依靠公司;
  2. 提高工作效率,去研究那些难的,公司内外的核心技术;
  3. 注重输出,输出技术、价值观,帮助更多的人,提高影响力。

二、何为技术领导力

(一)人类社会的发展阶段

  1. 野蛮开采。这个阶段的主要特点是资源过多,只需要开采就好了。
  2. 资源整合。在这个阶段,资源已经被不同的人给占有了,但是需要对资源整合优化,提高利用率。这时通过管理手段就能实现。
  3. 精耕细作。这个阶段基本上是对第二阶段的精细化运作,并且通过科学的手段来达到。
  4. 发明创造。在这个阶段,人们利用已有不足的资源来创造更好的资源,并替代已有的马上要枯竭的资源。这就需要采用高科技来达到了。

这也是为什么像亚马逊、Facebook 这样的公司,最终都会去发展自己的核心技术,提高自己的技术领导力,从早期的业务型公司转变成为技术型公司的原因。那些本来技术很好的公司,比如雅虎、百度,在发展到一定程度时,将自己定位成了一个广告公司,然后开始变味、走下坡路。

(二)几次工业革命改变本质

  1. 关键技术。蒸汽机、电、化工、原子能、炼钢、计算机,如果只看这些东西的话,似乎没什么用。但这些核心技术的突破,可以让我们建造很多更牛的工具,而这些工具能让人类干出以前干不出来的事。
  2. 自动化。这其中最重要的事就是自动化。三次革命中最重要的事就是用机器来自动化。通信、交通、军事、教育、金融等各个领域都是在拼命地自动化,以提高效率——用更低的成本来完成更多的事。
  3. 解放生产力。把人从劳动密集型的工作中解放出来,去做更高层次的知识密集型的工作。说得难听一点,就是取代人类,让人失业。值得注意的是,今天的 AI 在开始取代人类的知识密集型的工作……

(三)技术领导力

回顾几次工业革命改变本质,我们可以看到的技术领导力是:

  • 尊重技术,追求核心基础技术。
  • 追逐自动化的高效率的工具和技术,同时避免无效率的组织架构和管理。
  • 解放生产力,追逐人效的提高。开发抽象和高质量的可以重用的技术组件。
  • 坚持高于社会主流的技术标准和要求。

(四)如何拥有技术领导力

作为一个软件工程师怎样才算是拥有”技术领导力”:

  • 能够发现问题。能够发现现有方案的问题。
  • 能够提供解决问题的思路和方案,并能比较这些方案的优缺点。
  • 能够做出正确的技术决定。用什么样的技术、什么解决方案、怎样实现来完成一个项目。
  • 能够用更优雅,更简单,更容易的方式来解决问题。
  • 能够提高代码或软件的扩展性、重用性和可维护性。
  • 能够用正确的方式管理团队。所谓正确的方式,一方面是,让正确的人做正确的事,并发挥每个人的潜力;另一方面是,可以提高团队的生产力和人效,找到最有价值的需求,用最少的成本实现之。并且,可以不断地提高自身和团队的标准。
  • 创新能力。能够使用新的方法新的方式解决问题,追逐新的工具和技术。

总结一下,就是:

  • 扎实的基础技术;
  • 非同一般的学习能力;
  • 坚持做正确的事;
  • 不断提高对自己的要求标准;

三、如何才能拥有技术领导力

(一)、吃透基础技术

基础技术是各种上层技术共同的基础。吃透基础技术是为了更好地理解程序的运行原理,并基于这些基础技术进化出更优化的产品。

基础技术主要分成两个部分:编程和系统。

编程部分

  • C语言
  • 编程范式
  • 算法和数据结构

系统部分

  • 计算机系统原理
  • 操作系统原理和基础
  • 网络基础
  • 数据库原理
  • 分布式技术架构

(二)、提高学习能力

所谓学习能力,就是能够很快地学习新技术,又能在关键技术上深入的能力。只有在掌握了上述的基础原理之上,你才能拥有好的学习能力。如何提高呢?

  • 学习的信息源。信息源很重要,有好的信息源就可以更快速地获取有价值的信息,并提升学习效率。常见的信息源有 Google 等搜索引擎,Stack Overflow、Quora 等社区,图书,API 文档,论文和博客等。
  • 与高手交流。程序员可以通过技术社区以及参加技术会议与高手交流,也可以通过参加开源项目来和高手切磋。
  • 举一反三的思考。比如,了解了操作系统的缓存和网页缓存以后,你要思考其相同点和不同点。
  • 不怕困难的态度。
  • 开放的心态。实现一个目的通常有多种办法。带有开放的心态,不拘泥于一个平台、一种语言,往往能带来更多思考,也能得到更好的结果。而且,能在不同的方法和方案间做比较,比较它们的优缺点,那么你会知道在什么样的场景下用什么样的方案,你就会比一般人能够有更全面和更完整的思路。

(三)、坚持做正确的事

做正确的事,比用正确的方式做事更重要,因为这样才始终会向目的地靠拢。哪些是正确的事呢?

  • 提高效率的事。你要学习和掌握良好的时间管理方式,管理好自己的时间,能显著提高自己的效率。
  • 自动化的事。程序员要充分利用自己的职业特质,当看见有可以自动化的步骤时,编写程序来自动化操作,可以显著提高效率。
  • 掌握前沿技术的事。掌握前沿的技术,有利于拓展自己的眼界,也有利于找到更好的工作。需要注意的是,有些技术虽然当下很火,但未必前沿,而是因为它比较易学易用,或者性价比高。由于学习一门技术需要花费不少时间,你应该选择自己最感兴趣的,有的放矢地去学习。
  • 知识密集型的事。知识密集型是相对于劳动密集型来说的。基本上,劳动密集型的事都能通过程序和机器来完成,而知识密集型的事却仍需要人来完成,所以人的价值此时就显现出来了。
  • 技术驱动的事。不仅是指用程序驱动的事,而且还包括一切技术改变生活的事。比如自动驾驶、火星登陆等。就算自己一时用不着,你也要了解这些,以便将来这些技术来临时能适应它们。

(四)、高标准要求自己

只有不断地提高标准,你才可能越走越高,所以,要以高标准要求自己,不断地反思、总结和审视自己,才能够提升自己。

  • Google 的自我评分卡。
  • 敏锐的技术嗅觉。这是一个相对综合的能力,你需要充分利用信息源,GET 到新的技术动态,并通过参与技术社区的讨论,丰富自己了解技术的角度。
  • 强调实践,学以致用。学习知识,一定要实际用一用,可以是工作中的项目,也可以是自己的项目,不仅有利于吸收理解,更有利于深入到技术的本质。并可以与现有技术对比一下,同样的问题,用新技术解决有什么不同,带来了哪些优势,还有哪些有待改进的地方。
  • Lead by Example。永远在编程。不写代码,你就对技术细节不敏感,你无法做出可以实践的技术决策和方案。

四、如何成为一个大家愿意追随的 Leader

(一)、Leader 和 Boss 的不同

再或者用通俗的话说,Leader 是大家跟我一起上,而 Boss 则是大家给我上,一个在团队的前面,一个在团队的后面。

具体来说,这两者的不同点如下:

  • Boss 是驱动员工,Leader 是指导员工。

    在面对项目的时候,Boss 制定时间计划,并且推动(push)和鞭策员工完成工作,而 Leader 则是和员工一起讨论工作细节,指导员工关注工作的重点,和员工一起规划出(work out)工作的方向和计划,并且在工作中和员工一起解决细节难题,帮助员工完成工作。

  • Boss制造畏惧,Leader制造热情。

    Boss 在工作中是用工作职位级别压人,用你的绩效考核来制造威慑,让员工畏惧他,从而推行工作。而 Leader 是通过描绘远景,制造激动人心的目标来鼓舞和触发团队的热情和斗志。

  • Boss面对错误喜欢使用人事惩罚的手段,而Leader面对错误喜欢寻找解决问题的技术或管理方法。

    惩罚员工和解决问题完全是两码事,Boss因为并不懂技术也并不懂问题的细节,所以他们只能使用惩罚这样的手段,而Leader通常是喜欢解决问题的技术型人才,所以,他们会深入技术细节,从技术上找到既治标又治本的技术方案或管理方式。

  • Boss 只是知道怎么做,而 Leader 则是展示怎么做。

    一个好 Leader 的最大特点就是 Lead by Example,以身作则,用身教而不是言传。而 Boss 只是在说教,总是在大道理上说的一套又一套,但从来不管技术细节。

  • Boss 是用人,而 Leader 是发展人。

    Boss 不关心人的发展,把人当成劳动力。而 Leader 则会看到人的潜力和特长,通过授权、指导和给员工制定成长计划让员工成长,从而发展员工。所以,我们通常可以看到 Boss 总是说自己的员工有这个问题有那个问题,而 Leader 总是说,如何让员工成长以解决员工个人的各种问题。

  • Boss 从团队收割成绩,而 Leader 则是给予团队成绩。

    Boss 通常都会把团队的成绩占为己有,虽然 Boss 会说这是团队的功劳,但基本上是一句带过。而 Leader 则是让团队成功,让团队的成员站在台前,自己甘当绿叶和铺路石。Leader 知道只有团队的每个人成功了,团队才会成功,所以,Leader 会帮助团队中的每个人更好更流畅地走向成功。

  • Boss 喜欢命令和控制( Command + Control ),而 Leader 喜欢沟通和协作( Communication + Cooperation )。

    Boss 喜欢通过命令来控制员工的行为,从而实现团队的有效运转,而 Leader 喜欢通过沟通和协作来增加员工的参与感,从而让员工觉得这是自己的事,愿意为之付出。

  • Boss 喜欢说”给我上”,而 Leader 喜欢说”跟我上”。

    Boss 总是躲在团队后面,让团队冲锋陷阵,而 Leader 总是冲在前面用自己的行动领着团队浴血奋战。

(二)、如何成为众人愿意追随的 Leader

  • 帮人解决问题。

    团队或身边大多数人都在问:”这个问题怎么办?”,而你总是能站出来告诉大家该怎么办。

  • 被人依赖。

    团队或身边大多数人在做比较关键的决定时,都会来找你咨询意见和想法。

要有能够做到上面的要求,你需要有技术领导力。有没有技术领导力(Leadership),是成为一个 Leader 非常关键的因素。因为人们想要跟随的人通常都是比自己强比自己出色的人,或是能够跟他学到东西,能够跟他成长的人。

但是,有了技术领导力可能并不够,下面是我罗列的一些比较关键的除了技术领导力之外的一个 Leader 需要的素质:

  • 赢得他人的信任。

    对于信任来说,并不完全是别人相信你能做到某个事,还有别人愿意向你打开心扉,和你说他心里面最柔软的东西。而后者才是真正的信任。

  • 开放的心态 + 倾向性的价值观。

    1. 对于新生事物要有开放的心态,对于每个人的观点都有开放的心态,但并不是要认同所有的观点和事情,成为一个油腔滑调的人。

    2. 就价值观来说,还是需要有倾向性的,比如,我就倾向于不加班的文化,倾向于全栈,倾向于按职责分工而不是按技能分工,倾向于做一个 Leader 而不是 Boss,倾向于技术是第一生产力,倾向于 OKR 而不是 KPI……

我的这些倾向性可以让别人更清楚地知道我是一个什么样的人,而不会对我琢磨不透,一会东一会西只会让人觉得你太油了,反而会产生距离感和厌恶感。我认为,倾向性的价值观是别人是否可以跟随你的一个基础。

  • Lead by Example。

    1. 用自己的行为来向大家展示你的 Leadership。这就是说,你需要给大家做示范。很多时候,道理人人都知道,但未必人人都会做,知易行难,以身示范,一个示例会比讲一万遍道理都管用。
    2. 所以我认为,对于软件开发来说,不写代码的架构师是根本不靠谱的。要做一个有人愿意跟随的技术 Leader,你需要终身写代码,也就是所谓的 ABC – Always Be Coding。这样,你会得到更多的实际经验,能够非常明白一个技术方案的优缺点,实现复杂度,知道什么是 Best Practice,你的方案才会更具执行力和实践性。当有了执行力,你就会获得更多的成就,而这些成就反过来会让更多的人来跟随你。
  • 能够抓住重点,看透事物的本质。

    作为一个 Leader,能够抓住主要矛盾,看清事物的本质,给出清楚的观点或方向,简化复杂的事情,传道解惑、开启民智,让人豁然开朗、醍醐灌顶,才会让人追随之。

  • 描绘令人激动的方向,提供令人向住的环境。

    一个好的 Leader 一定会把每个人心中最真善美的东西呼唤出来,并且还能让人相信这是有机会有可能做到的。

  • 甘当铺路石,为他人创造机会。

    别人愿意跟随你,愿意和你共事,有一部分原因是你能够给别人带来更多的可能性和机会,别人觉得和你在一起能够成长,能够进步,你能够带着大家到达更远的地方。帮助别人其实就是帮助自己,成就他人其实也是在成就自己,这就像一个好的足球队一样,球队中的人都互相给队友创造机会,整个团队成功了,球队的每个人也就成功了。作为一个好的 Leader,你一定要在团队中创造好这样的文化和风气。


五、时间管理:同扭曲时间的事儿抗争

(一)、主动管理

无论什么事情,如果你发现你持续处于被动的状态下,那么你一定要停下来想一想如何把被动变为主动。因为在被动的方式下工作,你是不可能做好工作的,无论什么事。

你要主动管理的不是你的时间,而是管理你的同事,管理你的信息。

(二)、学会说”不”

  • 当你面对做不到的需求时,你不要说这个需求做不到,尤其是,你不要马上说做不到。

    你要先想一下,这样让别人觉得你是想做的,但是,在认真思考过后,你觉得做不到,并且给出一个你觉得能做到的方案。这里的诀窍是——给出另一个你可以做到的方案,而不是把对方的方案直接回绝掉。

  • 当你面对过于复杂的需求时,你不要说不。

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

  • 当你面对时间完全不够的需求时,你也不要说不。

    既然对方把压力给你,你要想办法把这个压力还回去,或是让对方来和你一同分担这个压力。

惯用的方式是给回三个选择:

  • 我可以加班加点完成,但是我不保证好的质量,有 bug 你得认,而且事后你要给我 1 个月的时间还债。
  • 我可以加班加点,还能保证质量,但我没办法完成这么多需求,能不能减少一些?
  • 我可以保质保量地完成所有的需求,但是,能不能多给我 2 周时间?

(三)、加班和开会

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

开会,不是讨论问题,而是讨论方案,开会不是要有议题,而是要有议案。


六、时间管理:如何利用好自己的时间

(一)、投资自己的时间

  • 花时间学习基础知识,花时间读文档。

    系统地学习一门技术是非常关键的,所以这个时间是值得投资的。

  • 花时间在解放自己生产力的事上。

    在自动化、可配置、可重用、可扩展上要多花时间。花时间在解放自己的事上是最有意义的了。

  • 花时间在让自己成长的事上。

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

  • 花时间在建立高效的环境上。

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

(二)、规划自己的时间

  • 定义好优先级。

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

  • 最短作业优先。

    对于相同优先级的事,我个人喜欢的是”最短作业优先”的调度算法。

  • 想清楚再做。

    对于一些没想清楚的事,或是自己不太有信心的事,还是先看看有没有已有的成熟解决方案,或是找更牛的人来给你把把关,帮你出出主意,看看有没有更好、更简单的方式。

  • 关注长期利益规划。

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

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

(三)、用好自己的时间

  • 将军赶路不追小兔

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

  • 形成习惯。

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

  • 形成正反馈。

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

  • 反思和举一反三。

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


七、程序员面试攻略:面试前的准备

(一)、怎样写简历

我们知道真正的好简历是要用自己的经历去写的。

写简历的最佳实践——用自己的经历聊,而不是用文字写。

基本上来说,简历上的信息不要写太多,信息太多相当于没有信息,不要单纯地罗列,要突出自己的长处和技能。一般来说,简历需要包括以下几项内容:

  • 自我简介。

    用最简单的话来说明自己的情况,不超过 200 字。比如:10+ 年的软件开发经验(说明你的主业),4+ 年的团队 leader 经验(说明你的领导力),擅长高可用高性能的分布式架构(说明你的专业和专攻),多年互联网和金融行业背景(说明你的行业背景),任职于 XXX 公司的 XX 职位(说明你的职业),负责 XXX 平台或系统(说明你的业务场景)……

  • 个人信息。

    1. 基本信息。电子邮箱建议用 Gmail,千万不要用 QQ 邮箱,要让人感觉职业化一些。
    2. 个人网站。如果你有个人主页、博客、GitHub 或是 Stack Overflow,请一定附上,这是加分项。如果个人主页或博客有独立域名,那更好,这会给人一种你爱动手做事的感觉。页面也要干净有美感,这样会让人感觉你有品味。
    3. 网站内容。一般来说这些项都会被面试官点看浏览,所以,里面的内容你需要小心组织和呈现,千万不要造假。另外,除了技术上的一些知识总结(不要太初级,要有深度的、原理型的、刨根问底型的文章),你也可以秀一秀自己的技术价值观(比如,对代码整洁的追求,对一些技术热点事件的看法),这会让你更容易获得面试官的好感。面试官的好感很重要。
    4. 作品展。如果你有一些作品展现,会更好。当然,对于前端程序员来说,这是比较容易的。而对于后端程序员来说,这会比较难一些,只能展示一下自己的 GitHub 了。如果你有一些比较不错的证书或奖项(如微软的认证、Oracle 的认证),也可以展示一下。

对应于你的简历,如果能和应聘职位的需求看齐有相类似的描述,这样可以快速地让人觉得你和要应聘的职位很匹配。

  • 工作经历和教育经历。

    1. 列一下你的工作经历。每份工作完成的主要项目(不要列一大堆项目,挑重要的),主要突出项目的难度、规模、挑战、职责,以及获得的认可和荣誉。
    2. 工作经历和教育经历,主要是对上述的个人技能的印证。不要东拉西扯,要紧紧地围绕着你的技能、特长和亮点来展开。

一般来说,你简历中的内容最好控制在两页 A4 纸以内,最好有中英文版,简历不要是 Word 版的,最好是 PDF 版,然后简历的格式和风格请参考 LinkedIn 上的(在 微软的 Office 模板网站 上也能找到一些不错的简历模板)。简历的内容不要太多,内容太多,重点就不明显了。写简历的目的是呈现自己的特长、亮点和特点。只要你能呈现出 2-3 个亮点和特长,就可以吸引到人了。

如果简历上的经历和技术亮点不足的话,那么你可以在简历的版式和形式的制作上花些心思,以及在简历的自我描述中加上一些”虚”的东西。

比如”工作态度积极,不分份内和份外的事,只要对公司和个人有利,都会努力做好;勤奋踏实,热爱学习,喜欢做一个全栈工程师;善于发现问题,并解决问题……”表示我虽然现在的经历和技能不足以打动你,但是我的态度端正,潜力巨大,你不能错过……

(二)、技术知识准备

一般来说,你的简历上写什么,面试官就会问什么,所以,不要打自己的脸,精通就是精通,熟悉就是熟悉,了解就是了解。然后对于你列出来的这些技术,你一定要把其最基本的技术细节给掌握了。你不见得要记住所有的知识点,但是 80% 以上的关键知识点,你多少得知道吧。面试官一般也会逐步加大问题的难度和深度,看看你到底在哪个层次上。所以,你还是需要系统地看看书,才能应对面试官的问题。比如:

  • 你写上了 Java,那么 Java 的基本语法都要了解,并发编程、NIO、JVM 等,你多少要有点儿了解,Spring、Netty 这些框架也要了解。
  • 你写上了 Go,那么至少得把官网上的 Effective Go 给看了。
  • 你写上了 Redis,那么除了 Redis 的数据结构,Redis 的性能优化、高可用配置、分布式锁什么的,你多少也要把官网上的那几篇文章读一读。
  • 你写上了面向对象,那么怎么着也得把《设计模式》中的 23 个模式了解一下。
  • 你写上了分布式架构,那么 CAP 理论、微服务架构、弹力设计、Spring Cloud、Cloud Native 这些架构就要做到心里有数。
  • 你写上网络编程,那么 TCP/IP 的三次握手,四次挥手,两端的状态变化你得知道吧,Socket 编程的那几个系统调用,还有 select、poll、epoll 这些异步 IO 多路复用的东西,你得知道。

(三)、算法题准备

面试前去LeetCode练练。Top 20 的动态规划题的列表

(四)、工作项目准备

无论什么公司的面试,都会让你说一个你做过的项目,或是你过去解决过的一个难题。 一般来说,会有下面这样的几个经典的面试问题:

  1. 说一个你做过的最自豪的项目,或是最近做过的一个项目。
  2. 说一个你解决过的最难的技术问题,或是最有技术含量的问题。
  3. 说一个你最痛苦的项目,或最艰难的项目。
  4. 说一个犯过的最大的技术错误,或是引发的技术故障。

对于上面这四个问题:第一个问题,主要是想看看你过去工作中做过的最高级的事是什么,还有你的兴趣点和兴奋点是什么;第二和第三个问题,主要是想看看你解决难题的能力,以及面对压力和困难时的心态;第四个问题,主要是想了解一下你面对错误时的态度,还要了解你是否会对错误有所总结和改进。

怎样准备这样的题,我这里有几个提示:

  • 要有框架。

    讲故事要学会使用 STAR 。Situation - 在什么样的环境和背景下,Task - 你要干什么样的事,Action - 你采取了什么样的行动和努力,Result - 最终得到了什么样的效果。这是整个语言组织的框架,不要冗长啰嗦。

  • 要有细节。

    没有细节的故事听起来就很假,所以,其中要有很多细节。因为是技术方面的,所以,一定要有很多技术细节。

  • 要有感情。

    讲这些故事一定要带感情。要让面试官感受到你的热情、骄傲、坚韧和顽强。一定要是真实的,只有真实的事才会有真实的感情。

  • 要有思考。

    只有细节和故事还不够,还要有自己的思考和得失总结,以及后续的改进。

对此,如果你想有一个比较好的面试回答效果,这不是你能临时准备出来的,工夫都是花在平时的。而训练这方面能力的最好方式就是在工作中写文档 ,在工作之余写博客。 只有写得多了,写得好了,你这样的能力才能训练出来。


八、程序员面试攻略:面试中的技巧

(一)、形象和谈吐

  • 着装让人感到干净、整洁。
  • 保持微笑,表现得热情、开朗和幽默。
  • 说话的时候,要看着对方,一方面这是对对方的尊重和礼貌,另一方面,这也是一种自信。
  • 面试官问的问题,你要给出充足的细节,千万不要让面试官不断地追问,那样就被动了。

(二)、答不出来

面试中有一些问题很难,但是不要放弃,要不断尝试。很多时候,面试官并不期待你能在很短的时候内解出一道难题,他只是想看一下你遇到难题时的态度和思维方式。如果你能证明给面试官看,你解决问题的方向和方法是正确的,就算是没有找到答案,也是很不错的。因为只要方向走对了,剩下的就是时间问题了。

如果实在解不出来,或是被问了不懂的知识性问题,那么就直接说不懂就好了。记下来,回去多看多练,下次记住了就好。

另外,对于没有答上来的问题,有的人会在面试后请教一下面试官。但是我觉得更好的方式是,问面试官要个他的邮箱或微信,回去后,努力搞懂,举一反三,然后写个东西再发回去。这样做是有可能让你起死回生的。多少可以暗示对方:”你看,我有不懂的,但是我能下工夫很快就搞懂了,你看我的学习能力还不错哦。你就不再考虑一下了吗?”

(三)、尖锐问题

  • 你为什么要离开现在的公司?

    一般来说,永远不要说之前公司的坏话。说客观原因。

  • 说一下你的缺点?

    1. 真实的回答。
    2. 最后还要补一句,我知道我的缺点,我也在努力改正,我正在通过什么样的方式改正。这非常关键,因为这基本上是面试官最喜欢看到的答案了,就是你不仅能正视自己的缺点,而且还能不断地改正。
  • 说一下你的优点?

    1. 真实的回答。优点是需要用证据来说明的。
    2. 比如,我通常的回答是,我的优点就是学习能力强,因为我掌握的技术面很广,而且,我什么样的技术都学,比如最新的 Cloud Native 技术。作为后端人员我还学前端方面的技术如 React.js 和 Vue.js,这一切都来源于我扎实的基础知识……
    3. 回答这个问题的时候,一般都会反衬出你的价值观,HR 就是想了解你的价值观。比如,我比较踏实,我想把技术一直做到老。再比如,我有韧性,我受过哪些挫折、失败、不公、无奈和无助,我没有当逃兵……
  • 你为什么换工作换得这么勤?

    1. 给出合理的解释,以消除用人方的疑惑。
    2. 一方面,你还是需要诚恳一点儿,另一方面,你在解释时需要承认频繁换工作也不是自己想的,自己何尝不想在一份工作上干得时间长一点儿。无奈,要么是公司有变化,要么就是自己没选好。一方面表达自己也厌倦了频繁换工作这种事,另一方面,你要把这个话题引到另外一个方向上——什么样的工作自己可以干很久?自己所期望的工作内容和工作环境是什么样的?这样就转而去谈你所向往的工作内容和环境了,并再表达一下在这样的工作环境下,是可以很长时间做下去的,并愿意和公司一起发展。
    3. 但是,先不要说得太理想了,不然,用人方也会觉得自己是做不到的。正确的说法是,自己并不担心公司有各种各样的问题,只要有一起扛事的队友一起拼搏,这才是最关键的。
  • 你在一家公司呆了接近 10 年为什么没有做到管理层?你又是怎么保持竞争力的?

    1. 一般来说,不想做管理的程序员也挺多的,在技术的方向上勤勤恳恳深耕细作,会是一个非常难得的优秀工程师。专注于技术,不分心,不断地在技术上的深度和广度上钻研,这就是保持竞争力最好的方式。
  • 你工作满 5 年了,为什么还不是一个高级程序员?

    1. 对于国外的顶尖公司来说,如果你有 5 年的工作经验,但还不能胜任高级程序员(Amazon 的 SDE2)的职位,那么你这个人就基本会被 pass 掉了,包括在职的员工也是一样的。
    2. 国内的公司可能会问你这个问题,对此,我个人认为比较好的回答是要分几方面来谈。一方面,过去因为什么原因耽误了些时间(环境因素、客观条件因素),另一方面,要表示同样也有主观因素,不然显得有点找借口的感觉,不诚恳。
    3. 接下来,要表明自己心里面也比较慌(表明自己不用别人提醒可以自己意识到自己的问题),所以,近一年来一直在学习,罗列一下学过哪些东西,最好还有学习目标和学习计划(表明自己除了有意识外,还有行动)。当然,厉害的面试官会不断地追问你一些细节,以此来确定你没有说假话,对此,你要有充足的准备。
  • 你为什么换了一个方向?你觉得你有什么优势?

    1. 这个问题其实并不难回答,实话实说就好了。但是不要让招聘方感受到你浮燥的内心,或是朝三暮四的性格,更不要让人感觉到你像”小猫钓鱼”那样一边不行又来搞另一边。
    2. 我觉得回答这个问题有两种方式:一种是非常自信的回答——“我从来没有改变我的方向,因为种种原因,我没能得到我想要的方向,虽然现在很残酷,但是我一直都没有放弃我的方向,我一直都在努力学习……”如果你要这么回答了,你就要真的是这样的,在新的方向有所研究和建树,不然会被识破的。
    3. 另一种回答则常规一点,首先说明一下,自己的兴趣爱好,为什么这个方向要比之前的那个方向更适合自己。可以用几个例子来说明,但其中要有一些细节,比如,自己试过这个新方向 ,发现干得比原来那边更好,更容易出成绩,自己的兴奋点更大,所以觉得新方向更适合自己。然后,承认换一个方向短期内并没有优势。但是,因为自己的某某特质,比如,学习能力强、勤奋、聪明等特质,未来一定是可以胜任的。
    4. 但是,你要用证据证明你的学习能力强,你比一般人勤奋,比一般人聪明。不然如果对方追问下去,会让你破绽百出的。总之,回答这样的问题,需要一定的证据作为补充,而且还要伴随着以降职降薪为代价。所以,一般来说,选定方向最好不要再变了,如果一定要变的话,你也要有必胜的信心和先下后上的心态,而且这些信心和心态要让招聘方看到。
  • 对于技术的热情或初心体现在你生活和工作中的哪里?

    1. 你要小心回答,而且是要带感情的,但一定要是真实的。
    2. 总结一下,对技术的热情或初心,需要表现在这么几个特质上:执着、坚持、坚韧、不服输、担当、不妥协、不浮燥……我说一句,我相信每个人或多或少都会有这些特质,这是你的亮点,要小心呵护。不然,你跟一条咸鱼就没什么两样了。

(四)、结尾问题

  • 如果你面得比较好

    1. 这个时候可以问几个尖锐的问题,这样有利于后面谈 offer 和岗位(抓住机会反转被动为主动)。比如:
    2. 你们公司有多少一线开发经理还在写代码?你们的一线经理都没有时间来写代码了,不知道细节怎么做好管理?另外是不是说明你们公司有大量的内耗?
    3. 任何公司都有好的有不好的,你能不能分享一下你最喜欢这个公司的地方和最不喜欢的地方?
  • 如果你面得一般

    1. 这个时候你也可以问些加分的问题。
    2. 比如:目前贵公司或是贵团队最需要解决什么样的问题?我能帮贵公司做些什么?能不能给我一些资料我先了解一下,这样我后面如果能进来,就能上手更快一些了。因为你面得一般的话,面试官会比较犹豫和纠结,此时你需要让面试官不要犹豫,所以,你可以表现得更加热情和主动一点。你看,竟然一副通过面试明天就要上班的”无耻嘴脸”也会为你加点分的……(哈哈哈)
  • 如果你面得很不行,基本挂掉了

    这个时候,也要问问题。但最好问一下面试官对你的评价,并且让他指出你的不足和需要改进的地方。面试本来就是一次经历和一次学习,你也可以把其当作是一种受教育的过程。所以,不要放过自己可以成长的机会。通过面试官给你的评价,你日后就知道自己需要努力的地方和方向了。这是多好的一件事儿啊。


九、高效学习:端正学习态度

(一)、主动学习和被动学习

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

  • 被动学习:如听讲、阅读、视听、演示,学习内容的平均留存率为 5%、10%、20% 和 30%。
  • 主动学习:如通过讨论、实践、教授给他人,会将原来被动学习的内容留存率从 5% 提升到 50%、75% 和 90%。

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

(二)、浅度学习和深度学习

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

  • 大多数人的信息渠道都被微信朋友圈、微博、知乎、今日头条、抖音占据着。这些信息渠道中有营养的信息少之又少。
  • 大多数公司都是实行类似于 996 这样的加班文化,在透支和消耗着下一代年轻人,让他们成长不起来。
  • 因为国内互联网访问不通畅,加上英文水平受限,所以,大多数人根本没法获取到国外的第一手信息。
  • 快餐文化盛行,绝大多数人都急于速成,心态比较浮燥,对事物不求甚解。

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

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

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

  • 高质量的信息源和第一手的知识。
  • 把知识连成地图,将自己的理解反述出来。
  • 不断地反思和思辨,与不同年龄段的人讨论。
  • 举一反三,并践行之,把知识转换成技能。

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

  • 知识采集。信息源是非常重要的,获取信息源头、破解表面信息的内在本质、多方数据印证,是这个步骤的关键。
  • 知识缝合。所谓缝合就是把信息组织起来,成为结构体的知识。这里,连接记忆,逻辑推理,知识梳理是很重要的三部分。
  • 技能转换。通过举一反三、实践和练习,以及传授教导,把知识转化成自己的技能。这种技能可以让你进入更高的阶层。

(三)、学习是为了找到方法

学习不仅仅是为了找到答案,而更是为了找到方法。

只有掌握解题的思路和方法,你才算得上拥有解决问题的能力。所有的练习,所有的答案,其实都是在引导你去寻找一种”以不变应万变”的方法或能力。

学习是为了找到通往答案的路径和方法,是为了拥有无师自通的能力。

(四)、学习是为了找到原理

学习不仅仅是为了知道,而更是为了思考和理解。 在学习的过程中,我们不是为了知道某个事的表面是什么,而是要通过表象去探索其内在的本质和原理。

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

(五)、学习是为了了解自己

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

开拓眼界的目的就是发现自己的不足和上升空间,从而才能让自己成长。

(六)、学习是为了改变自己

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

学习是为了改变自己的思考方式,改变自己的思维方式,改变自己与生俱来的那些垃圾和低效的算法。总之,学习让我们改变自己,行动和践行,反思和改善,从而获得成长。


十、高效学习:源头、原理和知识地图

(一)、挑选知识和信息源

信息源要有下面几个特质:

  • 应该是第一手资料,不是被别人理解过、消化过的二手资料。尤其对于知识性的东西来说,更是这样。应该是原汁原味的,不应该是被添油加醋的。
  • 应该是有佐证、有数据、有引用的,或是有权威人士或大公司生产系统背书的资料。应该是被时间和实践检验过的,或是小心求证过的,不是拍脑袋野路子或是道听途说出来的资料。
  • 应该是加入了一些自己的经验和思考,可以引发人深思的,是所谓信息的密集很大的文章。

(二)、注重基础和原理

基础知识和原理性的东西和技术,都是经历过长时间的考验的,所以,这些基础技术也有很多人类历史上的智慧结晶,会给你很多启示和帮助。 比如:TCP 协议的状态机,可以让你明白,如果你要设计一个异步通信协议,状态机是一件多么重要的事,还有 TCP 拥塞控制中的方式,让你知道,设计一个以响应时间来限流的中件间是什么样的。

(三)、使用知识图

联想记忆法。比如,在学习 C++ 的时候,面对《C++ Primer》这种厚得不行的书,我就使用联想记忆法。

我把 C++ 分成三部分:

  • 第一部分是 C++ 是用来解决 C 语言的问题的,那么 C 语言有什么问题呢?指针、宏、错误处理、数据拷贝…… C++ 用什么技术来解决这些问题呢?
  • 第二部分是 C++ 的面向对象特性:封装、继承、多态。封装,让我想到了构造函数、析构函数等。构造函数让我想到了初始化列表,想到了默认构造函数,想到了拷贝构造函数,想到了 new……多态,让我想到了虚函数,想到了 RTTI,RTTI 让我想到了 dynamic_cast 和 typeid 等。
  • 第三部分是 C++ 的泛型编程。我想到了 template,想到了操作符重载,想到了函数对象,想到 STL,想到数据容器,想到了 iterator,想到了通用算法,等等。

于是,我通过”顺藤摸瓜”的方式,从知识树的主干开始做广度或是深度遍历,于是我就得到了一整棵的知识树。这种”顺藤摸瓜”的记忆方式让我记住了很多知识。最重要的是,当出现一些我不知道的知识点时,我就会往这棵知识树上挂,而这样一来,也使得我的学习更为系统和全面。

这种画知识图的方式可以让你从一个技术最重要最主干的地方出发开始遍历所有的技术细节,也就是画地图的方式。如果你不想在知识的海洋中迷路,你需要有一份地图,所以,学习并不是为了要记忆那些知识点,而是为了要找到一个知识的地图,你在这个地图上能通过关键路径找到你想要的答案。


十一、高效学习:深度,归纳和坚持实践

(一)、系统地学习

当然学习一门技术时,Go 语言也好,Docker 也好,我都有一个学习模板。只有把这个学习模板中的内容都填实了,我才罢休。这个模板如下:

  1. 这个技术出现的背景、初衷和要达到什么样的目标或是要解决什么样的问题。

    这个问题非常关键,也就是说,你在学习一个技术的时候,需要知道这个技术的成因和目标,也就是这个技术的灵魂。如果不知道这些的话,那么你会看不懂这个技术的一些设计理念。

  2. 这个技术的优势和劣势分别是什么,或者说,这个技术的 trade-off 是什么。

    任何技术都有其好坏,在解决一个问题的时候,也会带来新的问题。另外,一般来说,任何设计都有 trade-off(要什么和不要什么),所以,你要清楚这个技术的优势和劣势,以及带来的挑战。

  3. 这个技术适用的场景。

    任何技术都有其适用的场景,离开了这个场景,这个技术可能会有很多槽点,所以学习技术不但要知道这个技术是什么,还要知道其适用的场景。没有任何一个技术是普适的。注意,所谓场景一般分别两个,一个是业务场景,一个是技术场景。

  4. 技术的组成部分和关键点。

    这是技术的核心思想和核心组件了,也是这个技术的灵魂所在了。学习技术的核心部分是快速掌握的关键。

  5. 技术的底层原理和关键实现。

    任何一个技术都有其底层的关键基础技术,这些关键技术很有可能也是其它技术的关键基础技术。所以,学习这些关键的基础底层技术,可以让你未来很快地掌握其它技术。可以参看我在 CoolShell 上写的 Docker 底层技术那一系列文章。

  6. 已有的实现和它之间的对比。

    一般来说,任何一个技术都会有不同的实现,不同的实现都会有不同的侧重。学习不同的实现,可以让你得到不同的想法和思路,对于开阔思维,深入细节是非常重要的。

(二)、举一反三

我觉得一个人的举一反三能力,可以分解成如下三种基本能力:

  1. 联想能力。

    这种能力的锻炼需要你平时就在不停地思考同一个事物的不同的用法,或是联想与之有关的其他事物。对于软件开发和技术学习也一样。

  2. 抽象能力。

    抽象能力是举一反三的基本技能。平时你解决问题的时候,如果你能对这个问题进行抽象,你就可以获得更多的表现形式。抽象能力需要找到解决问题的通用模型,比如数学就是对现实世界的一种抽象。只要我们能把现实世界的各种问题建立成数据模型(如,建立各种维度的向量),我们就可以用数学来求解,这也是机器学习的本质。

  3. 自省能力。

    所谓自省能力就是自己找自己的难看。当你得到一个解的时候,要站在自己的对立面来找这个解的漏洞。有点像左右手互博。这种自己和自己辩论的能力又叫思辨能力。将自己分裂成正反方,左右方,甚至多方,站在不同的立场上来和自己辩论,从而做到不漏过一个 case,从而获得完整全面的问题分析能力。

在这方面,我对自己的训练如下:

  • 对于一个场景,制造出各种不同的问题或难题。
  • 对于一个问题,努力寻找尽可能多的解,并比较这些解的优劣。
  • 对于一个解,努力寻找各种不同的测试案例,以图让其健壮。

(三)、总结和归纳

对自己的知识进行总结和归纳是提高学习能力的一个非常重要的手段。这是把一个复杂问题用简单的语言来描述的能力。也就是说,我们把学到的东西用自己的语言和理解重新组织并表达出来,本质上是对信息进行消化和再加工的过程,这个过程可能会有信息损失,但也可能会有新信息加入,本质上是信息重构的过程。

不过,我们需要注意的是,如果只学了部分知识或者还没有学透,就开始对知识进行总结归纳,那么总结归纳出来的知识结构也只能是混乱和幼稚的。因此, 学习的开始阶段,可以不急于总结归纳,不急于下判断,做结论,而应该保留部分知识的不确定性,保持对知识的开放状态。 当对整个知识的理解更深入,自己站的位置更高以后,总结和归纳才会更有条理。总结归纳更多是在复习中对知识的回顾和重组,而不是一边学习一边就总结归纳。

我们来总结一下做总结归纳的方法:把你看到和学习到的信息,归整好,排列好,关联好,总之把信息碎片给结构化掉,然后在结构化的信息中,找到规律,找到相通之处,找到共同之处,进行简化、归纳和总结,最终形成一种套路,一种模式,一种通用方法。

要训练自己这方面的能力,你需要多看一些经典的方法论图书,看看别人是怎样总结和归纳知识的。你可以在一开始模仿并把自己的理解的知识给写出来,写博客会是一种很好的方式。另外一种更好的方式是讲一遍给别人听。总之,你需要把你总结归纳的知识公开出来,给别人看,接受别人的批评和反馈,这样你才能成长得更快。其实,我也在锻炼这样的能力。

(四)、实践出真知

所谓实践出真知,也就是学以致用,不然只是纸上谈兵,误国误民。只有实践过,你才能对学到的东西有更深的体会。

多写多用。

(五)、坚持不懈

一方面你要把你的坚持形成成果晒出来,让别人来给你点赞,另一方面,你还要把坚持变成一种习惯,就像吃饭喝水一样,你感觉不到太多的成本付出。只有做到这两点,你才能够真正坚持。


文章作者: Kiba Amor
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 Kiba Amor !
  目录