目录

  • 1 靠谱的程序员
  • 2 解决问题的能力
    • 2.1 快速的定位
    • 2.2 深入分析
    • 2.3 取舍解决
  • 3 团队协作能力
    • 3.1 第一种模式:润滑剂模式
    • 3.2 第二种模式:全责模式
    • 3.3 第三种模式:混合模式
  • 4 自我驱动能力

1 靠谱的程序员

复盘一下近几年开发的历程,虽然说资历较浅,但是也要不断的自我反省和进步,从本质上来说,程序员的一个职业素养或者说优秀的程序员,简单来说就是两个字,靠谱

那你是否靠谱?决定了offer能否发放给你,你不会对我们的企业或者团队会有致命的一些伤害。那因此什么是代表的是你是一个靠谱的程序员,我们如何去展现你的一个职业素养呢?那首先我将我那么多年的面试经验以及企业的用人标准,浓缩了一下所谓的一个靠谱的程序员所必须具备的三大素养,那分别是解决问题的能力,以及团队协作的能力,外加自我驱动的能力,那我们接下来就要分别结合这样的一个三点的能力,来为大家展示什么是一个靠谱的程序员。

2 解决问题的能力

那接下来我们首先来看一下三大素养之一的一个解决问题的能力。那首先我们需要定义清楚什么样的程序员是有一个好的解决问题的能力。

经常我们在面试的时候讲,我们要体现我们的软性素质,或者我们的面试官要求考察出面试者的一个软性素质,那我们是否有这样的一个标准,还是说我们可以结合一些主观的判断去判断这个人是否拥有好的解决问题的能力。

那如果说一旦有这些模糊或者清晰的标准去做判断,自然我们的程序员同学就可以在平时去训练自己这样的一个解决问题方式的一个思维方式,使得你能够在面试的过程当中凸显你的解决问题的能力。那首先我们来看一下什么叫好的解决问题的能力,

我在这边主要总结了三个要素,分别是快速定位深入分析取舍解决

那我们怎么去理解这样的三句话呢?那面试官在进行考察问题的时候,经常会以问题的方式去做考察点,比如说如果说线上发生了一个集群崩溃这样的一个问题,你会如何解决?

那从这样一个问题当中,我们可以逐步的去挖掘我们的程序员候选人同学他解决问题的一个能力和思路是怎么样的。

2.1 快速的定位

我们首先当线上也好,或者平时的工作当中也好,遇到了一些问题的话,我们需要去根据一些条件做一些快速的问题的出差和排查,比如说。如果说我们要去定位一些线上的问题,我们如何去快速的找出差错呢?

我们在线上,都会去根据一些业务的要求去配置一些报警,那我们可以根据这些报警的一个内容快速的去找出一些内容。比如说我们的接口耗时是否有明显的增加,哪些接口的耗时增加了我们的数据库的一个sql语句的慢,哪些慢sql导致了数据库的耗时的一个严重,我们的网络耗时是否增加,网卡的流量是否被打满,我们是否发生了JVM的out of memory的异常,或者jcc非常的频繁,那这些对应的所有的这些问题点都可以监控埋点的方式预先植入到我们的系统当中,以使得我们的系统在出现大规模的问题的时候可以。快速的去做一轮初筛,方便我们快速的去定位一些问题,然后等我们有了一些快速的一个初筛,大致的一个判断之后,没有时间再去深入的去做一些问题的查询,因为为什么?
我们的线上的集群已经出现了一个大规模的问题,一个优秀的程序员在线上出现问题的时候,第一个想到的并不是说我怎么去深入的分析这个问题,而是说我有没有什么快速的方式可以去做产线止血,防止问题的扩散,或者对用户的体验造成极为不利的一个品牌影响。

那因此我们是不是有一些快速止血的一个方案,比如说我们出山出来某一些接口有问题,我们可以做一些熔断的降级的策略,或者我们发现我们是因为大规模的流量导致整个的一个集群负载能力达不到我们的要求,是否可以做一些快速限流的一个策略,又或者说当我们发生了JVM的out of memory的时候,做一些快速的重启策略,就能够快速的使我们的系统恢复到一个比较可以接受的一个状态下,然后第三步需要做一些验证性的一个尝试。在经历了这些快速止血的策略堆上去之后,我们要验证一下问题是否得到缓解,或者是否问题得以完全的一个消除。因此我们需要做一些验证性的尝试,确认我们的这些快速止血的手段是恢复了我们的一个问题。那虽然说我们要求了大家做这样的一些模板化的一个操作,但是在实际产线当中发生大规模的一个集群崩溃的问题,往往是很难追踪,很难查询的。本质上来说,我们集群在经历了一个N多的开发的一个堆叠,以及我们的一个分布式微服务的扩散拆分之后,往往会造成许多级联的一个问题,比如说我、ABCDE5个服务互相级联调用,那这个时候如果说最后的源头是一这个服务产生的问题,在ABCD各个服务上面都会有不一样程度的一个表现,这样的话使得我们问题的分析和定位变得非常的困难。即便我们最终定位到了一服务本身的一个问题,在经历了一服务本身问题的消除之后,我们也难确保在问题发生期间,ABCD服务不会被诱发出其他自身的一些问题。因此我们整个的一个级联问题是最难解决的,这个就要求我们在做系统设计的时候,对边界的一个划分非常的重要,我们必须得明确我们的ABCDE系统互相工作职责的一个边界。

在边界之上,容错设计,那什么叫容错设计?Google这家公司之所以伟大,出现问题的一个频次相较于其他互联网公司更小,并不是在于说它整个的一个系统设计有多么的复杂,而是因为它本质上来说,内部的系统设计都是基于容错设计的。我发起一行代码的调用,非常明确的可以知道说在未来的某一天,这一行代码可能会因为外部环境,比如网络,数据库,硬盘,甚至于代码自身或者说编译器自身会产生一些问题,因此我需要对我写下的这行代码做充分的一个容错设计,这样的话才能保证说当这行代码被外部的因素干扰导致问题的时候,可以快速的去做修复。`那因此我们其实做问题的快速定位的这些报警、止血措施,验证手段,本质上来说。

是需要去融入在我们平时的一个系统开发当中的,我写下每一行代码都需要完美地去实现,当我这行代码出问题的时候,我如何报警上来体现在哪一类问题上?当我这行代码发生问题的时候,我如何做快速的一个止血降级?当我这行代码出现问题的时候,我能够以什么样的方式去做尝试的一个恢复那?因此快速定位问题本质上来说是以我们所有的代码都需要在容错设计的前提下才能够达到的。试想一下,如果说你在解决问题的时候,什么线索都提供不了,什么内容都查询不到,甚至于连行日志都没有,那你是没有办法快速的定位问题的。

好,那讲完了这个快速定位问题之后,接下来要去深入的分析一下我们的一个具体的原因。虽然说看似我们的问题被定位了,然后我们故障得以缓解或者解决,那我们需要去能够有时间在产线上止血的情况下,可以有时间去深入分析我这个问题的一个具体原因是什么?

2.2 深入分析

比如说是不是我对应的这条查询的数据量太大了,是不是有慢sql,或者说我刚刚经历了一个什么样的发布,发布的代码有没有bug,或者说是不是我的接口被人恶意攻击,被刷了。那因此整个的这样的一个深入分析的一个具体原因,他深入分析都是为了去找到问题出现的触发条件,也就是本来我线上运行的好好的一个代码,突然出现了一些问题,一定是有触发条件的,可能是因为发布引起的代码变更,也可能是一些用户或者后台的一些操作导致了原本数据产生了一个变革和问题,又或者是产线上面被恶意用户给攻击了,那最后可以去总结一些原因。我们分析定位总结到一些问题的一个具体深度的一个原因,那最后我们需要去取舍的解决,也就是说我们需要去在问题的一个深入分析的一个原因基础上。做一个我们用什么样的方案可以解决什么样的问题,那这样的方案还会不会引入别的什么样的问题,我们后续该如何改进,那这本质上是一个方案取舍解决的一个问题。

2.3 取舍解决

我们所有的方案并不可能做到100%完美,都会牺牲某一步来得到成全。

就像我们分布式系统当中的cap原理,永远都是三个角只能选取两个,因此整个解决问题的一个最最困难的地方往往是我们没有一个100%对的一个标准答案,都会遇到各种各样的一个问题,哪怕方案是十分完美的,也会跟我们的时间和人力成本产生冲突。因此解决问题最后的一步,我们需要有充分的判断来做取舍,我放弃这个成全那个,来满足我最后的一个方案的一个解决落地。

3 团队协作能力

首先我们还是要有一个明确的清晰的定义,主要整个的团队协作不同于我们历史上面所讲的一些,比如说开发链条的时候,你需要积极的参与以及积极的定位自己的问题,我们更多的抽象成了三种模式,首先第一个你的协作模式是否OK,第二个你的冲突解决的能力是否OK,第三个你主导项目的能力是否OK。以上三个都能够做的很好,你才能教你具备了一个完整的一个团队协作的好的能力。首先我们来看一下协作模式。

在整个的一个互联网大厂过程当中,我们由于微服务架构引入的一个特性,大家各司其职,因此我们在协作模式上面也需要得以升级,因为有可能跟你对接的并不一定仅仅只是你的上下游,而是会关联很多很多的人,因此我们在写作模式上面主要会分为这样的三种模式。

3.1 第一种模式:润滑剂模式

我把它定义为润滑剂模式,什么是润滑剂模式呢?就相当于是说在你整个的写作过程当中,你这个人是非常的nice,你是一个正面向上的人,并且无论是否是你的问题,你都乐于正面向上的去对对方做互帮互助,即便是对方做错了,你也不会去牵着别人。这种样子的一个润滑剂模式的一个合作态度,往往在企业内部会被定义为老好人类型。

并不一定否认,老好人类型本质上来说也不算是一个特别差的一个特质,但是在整个的一个互联网企业的一个运作过程当中,这样的一个润滑剂模式并不一定被所有的公司所认可。那也就是说,如果说你采取了润滑剂模式去做事情的话,许多整个团队内部的一些问题,或者协作上的一些问题不容易被高层关注。因为你做了太多本不应该属于你职责范畴内的一些事情,并且你因为是一个老好人的特性,很多人都有可能将对应的不应该属于你的工作范畴内的一些事情强压给你,

3.2 第二种模式:全责模式

第二种模式,也就是全责模式。就像微服务架构体系一样,我们在写作的时候需要去明确对应大家的一个边界,我们需要做一些大公无私的问题,就是你的问题是我的问题才是我的问题。在这样的一个协作模式下,整个的一个企业的流水线会变成一个规章制度下的一个冷冰冰的机器。在这样的一个合作模式下面,我们对应的整个的一个合作双方的一个关系,也虽然说是比较紧密,是比较配合的,但是本质上来说,如果说出了问题,就会采取互相推脱的方式,这也是近年来许多互联网大厂内部的一个内卷的一个主要原因。那因此我在这边详细推荐大家,如果说在面试的过程当中,我们需要采取混合的模式,也就是说你可以跟你的面试官去介绍你的一个协作模式上面,你期望的一个比较好的协作模式。首先我们每一个系统也好,或者每一个人也好,都需要有自己的一个明确的一个职责和边界,但是在合作模式上面,我们却可以不用太过于强调这个职责和凭借,我们仍然需要以正面向上,非常包容的一个态度去接受大家的一些问题,然后可以适当的去做对应的一个提点和提醒,但是我们的整个的一个合作态度还是正面向上的。

3.3 第三种模式:混合模式

我主推的一个混合模式的一个协作模式的方法。

我们一般来说,我们遇到冲突都需要一个积极的一个态度去解决,我们在明确职责范畴的一个对应的一个框架的前提下,互相体谅,共同改进、进步。我们面试官经常会问,如果说你遇到了一个不顺心的事情,你会不会和别人吵架。

首先我们需要有一个明确的职责边界定义对应的这个问题到底是属于哪一方的。无论这个问题定下来是属于哪一方,只要明确的职责边界,我们都需要一个体谅、包容的态度去帮助对方去解决这个问题,而不是让冲突任意的一个升级,甚至于演化到大打出手的这样一个局面,最后也是非常重要的,我们除了营造一些良好的合作氛围之外。

那怎么决定你是一个具备很好的团队协作能力的一个人呢?

那我们刚才所讲的协作模式也好,还有就是冲突解决也好,本质上来说你和那个人是一个平行的关系,但是我们现在企业大厂当中更看重的是你是否有主导项目这样的一个能力。主导项目的能力本质上来说也会被划分为团队协作能力的一个关键。因为我们在大厂内部需要有许多串联流程这样的一个人,比如说架构师需要去串联整个微服务系统的一个系统架构,我或者说我们的项目经理需要去对整个项目负责。在大公司内部非常赞成或者愿意培养一些能够具备主导项目这样的能力的人,因为他本身是技术出身,可有架构设计的能力和经验,而且他又能够在团队的一个协调过程当中起到非常好的作用,那因此主管也非常乐于去提拔曾经主导过项目这样的一个人。你如何去主导你的项目呢?首先我们这样的有一个虚拟的项目团队,共同为了某一个目标去完成这样一个项目,因此我们在团队协作的过程当中,首先是需要去明确我们的这个目标,我们的这个项目的交付时间点是什么样的,什么样的交付质量才是OK的,什么时候去做交付。

然后第二个,我们要有明确的一个职责分工,A做什么,B做什么,都体现在架构设计和细节设计的过程当中,我们都各司其职的知道对方能提供给我什么样的能力,我能提供给对方什么样的能力,以一种背靠背的方式去做合作。然后你作为主导项目的人,你需要有一些过程管理和结果导向,我们可以追寻对应的过程,通过晨会或者日会这样的一个方式去追过程,并且在最终拿到一些项目关键结果的一个结果内容。最后我们需要组织大家去做一些复盘改进,帮助我们在接下来的项目的过程当中能够做到更好。

这个就是我们主导项目第一个能力。总结一下,做为一个团队一员,我们如何来证明自己具备团队协作的一个能力?首先我们要明确我们协作模式是处于职责明确边界,但是整个就处于积极向上的做,那我们在冲突解决的时候,要在明确边界的一个框架下面去做明确的职责划分,并且以一些乐观向上的良好的心态去解决我们的一个冲突。那最后如果说你要能够得到充足的成长,你需要有这样的一些能力和机会去主导你的项目。

4 自我驱动能力

我们首先来定义一下什么是好的自我驱动能力,我们面试者通常觉得自我驱动能力就是一个自我学习的能力,也就是说我平时看什么样的书,学了什么样的东西,我的技术提升了怎么样,毋庸置疑这是一个最基本的条件,那我在这边因此将主动学习作为了第一点,但是除了主动学习之外,我们还需要有积极承担和自我迭代的一个能力。那首先我们还是来先看一下主动学习,主要是面试官会问你平时在学什么东西吗?这种样子其实就是在问你是否有一个主动学习的能力。

比如说我可以简单的说,我最近在看书,zooKeeper相关的一些源代码和对应的官方文档,并且尝试下载玩了一下,我有什么收获是不是可以分享一下,这样的话面试官就可以觉得你是一个主动好学的人,自然你的潜力就会被定义为高。首先,主动学习主要包括了告诉面试官你最近主动学习了什么,有什么样的收获,是否可以简单的分享一下。

然后我们来看一下第二个,也就是积极承担。我们刚才所讲到在做团队协作模式的时候,需要去明确整个团队协作的一个边界,但是往往在高速发展的业务的一些互联网的大厂内,边界的一个建立的一个制度往往是跟不上业务的发展的,因为我们在快速业务发展的过程当中,往往会产生许多的一些工作量,这个工作量在边界模糊的一个场景下面,往往是a做,B做都可以。这个时候对于模糊的一个边界地带,我们怎么去解决呢?

现在在互联网的大厂内,许多的boss更希望关注的是在团队内部,你需要去在模糊的边界能够有积极承担责任的一个能力和特质,并且可以拿到结果。什么意思呢?在团队内部a做也可以,B做也可以,它是一个模糊地带,如果说你在你的面试官或者你的老板面前可以主动站出来,去多承担一些对应的任务,并且能够将对应的这些任务转化为你的一个工作的成果,那自然你在未来被授予机会的一个可能就更大,你在面试官眼中,你的一个加分项也就更突出,那因此一个自我驱动的一个能力,本质上来说可以分解为你在模糊边界地带可以积极的去承担一些额外的一个责任。

最后我们有一个叫自我迭代的能力,我们经常在互联网大厂当中被定一个叫复盘比如说我们在产业上发现了一些问题,最后我们需要一个复盘来定责,定期复盘往往会被人认为是一个承担责任并且做惩罚这样的一个代名词。其实我在这边说的一个复盘并不是指的是这样的一个产生问题,故障的一个复盘,而是说我是不是在每次的一个工作任务结束之后,无论做得好还是不好,都需要经历一些自我迭代的复盘。我再比如说我做了某一个a系统的一个设计工作,并且落地之后发现了一些什么样的问题,那我经历过一些复盘,写了一些文档,并且在组内分享给了大家,防止大家做踩坑。并且对我自己的一个能力也有了一些质的提升。因此,整个的一个自我迭代的一个复盘能力,往往也是会被定义为自我驱动能力的一部分。

如何成为一个优秀的程序员?相关推荐

  1. 如何成为一个优秀的程序员

    本文给出了十五个评定软件开发人员的标准,可以帮助程序员朋友从一个好的程序员成为一个优秀的程序员,和大家共飨! 怎样评定一名软件开发人员?这是一个颇为奇怪的问题.现在已经有了很多的理论和形式来做这件事, ...

  2. 【知乎】怎么成为一个优秀的程序员,而不是一个优秀的码农?

    怎么成为一个优秀的程序员,而不是一个优秀的码农? 9 条评论 分享 默认排序按时间排序 98 个回答 3844赞同反对,不会显示你的姓名 萧井陌 微信公众号:炼瓜研究所 技术社区 - 3844 人赞同 ...

  3. 如何成为一个优秀的程序员_如何成为一名优秀的程序员

    如何成为一个优秀的程序员 by Amy M Haddad 通过艾米·M·哈达德(Amy M Haddad) 如何成为一名优秀的程序员 (How to be a great programmer) Wh ...

  4. 想成为一个优秀的程序员,首先做到这5点

    我经常把程序员比喻成为篮球队员,为什么呢?在篮球场上虽然都是为最终得分努力,但每个人分工不同,大家是根据自己的特点和优势负责不同的位置,比如大前锋,中锋,控球后卫等.而一个人再厉害,没有团队协同是打不 ...

  5. 精通C语言Java怎么样_作为一个优秀的程序员,真的需要精通C语言吗?

    从事嵌入式开发多年,使用C语言开发已经超过十个年头,除了C语言还用C++,java,python做过项目,程序员的优秀编程语言仅仅占据一部分,而且也不会只是针对C语言,现在很多的编程高手也不懂的C语言 ...

  6. 怎样做一个优秀的程序员?这10个问题ChatGPT这样说 ……

    本文目录 1 怎样做一个优秀的程序员? 2 怎样成为优秀的架构师? 3 怎样写容易阅读的代码? 4 怎样做项目管理? 5 怎样学习计算机程序设计? 6 怎样提升个人影响力? 7 怎样提升认知? 8 程 ...

  7. 一个优秀的程序员应该如何提高工作效率?

    当我们评价一个程序员是否优秀时,要从多个方面进行评估. 专业技能.专业知识.创造力.经验,这些都是重要的因素.当然,还有他们的工作态度.工作效率和工作质量.如果程序员的工作是没有效率的,那就意味着他们 ...

  8. 你在成长为一个优秀的程序员吗

    在软件开发过程中,你经历的每件事情都会潜移默化地影响着你.随着时间的流逝,年纪的增长,对于程序开发技术(相同/或者相关能力)以及自身的理解也会不断沉淀,这些最终也会帮助你达成目标--成为一名优秀的程序 ...

  9. 编程学习了解:一个优秀的程序员必备的五点能力,你都满足了吗?

    与30年前相比,现在互联网时代的程序员已经有了很多细分的研发方向,比如前端.后端.算法.桌面软件.人工智能等等,不同的细分方向,也都有不同的要求.但不论选择什么方向,一名优秀的程序员都应具备下面这五点 ...

最新文章

  1. system , DOS 命令
  2. 程序员的奋斗史(三十五)——人在囧途之应聘篇(五)
  3. 2019蚂蚁金服面试总结(Java方向)
  4. jquery中的ajax方法(备忘)
  5. 金融情报挖掘:面向公开文本的期货事件聚合与传导因素分析
  6. 大学计算机要学什么内容,大学计算机课程学习路线应该是怎么样的呢?
  7. php post获取dvi,如何利用http来发送post请求
  8. java逗号的转义字符是,Java是否有'@'字符来转义字符串引号?
  9. Linux---线程池的实现
  10. 随笔(3)——智慧医养融合:从智能交互到交互智能
  11. STC单片机串口输出ADXL335角度值
  12. PowerPoint2003制作抛物线动画的方法
  13. 2021-09-10 QTdesigner 介绍入门 布局
  14. 汉语拼音—韦氏拼音对照表
  15. 游戏 蒸汽之城开发经验
  16. pta中c语言编程问题答案,pta题库答案_浙大远程教育2015秋 程序设计基础C 求PTA实验代码题库liujiahai-C答案_淘题吧...
  17. 六步绘制漂亮思维导图简单画法
  18. 求解n个二进制数之间的最小码距
  19. EasyCVR添加萤石云SDK接入的设计与开发流程
  20. Android项目120项

热门文章

  1. Java中对excle的一些操作
  2. linux查看磁带机端口,linux、unix下使用磁带机的常用命令
  3. LoRaWAN介绍13 SX1301
  4. 例题8-6 两性亲分子 UVa 1606
  5. 使用iterm2查看日志时屏幕持续滚动将老内容冲掉的设置
  6. java-final关键字修饰变量
  7. 【数值分析】插值法:拉格朗日插值、牛顿插值
  8. DataStage问题汇总
  9. python下载详细教程
  10. 单目深度估计 | Learning Depth from Monocular Videos using Direct Methods 学习笔记