杂谈 - 从单链表更新到10x程序员的迷思
不知道从什么时候开始,"10x程序员"悄悄地成为了衡量一个程序员的试金石。今天我们就来聊聊10x程序员,以及作者对10x程序员的理解。
作为一个硬核的技术频道,我们将从一个基本操作——单链表——作为引子,来聊一聊"有品位"的程序员的特质。之后我们再来谈谈"10x程序员"的迷思,以及为什么这一概念会被一些思xin想huai单bu纯gui的老板/领导作为压榨程序员的借口。
下面,让我们先来看看计算机101——链表操作!
单链表的删除
需求:给定一个单链表L以及目标节点D,在链表L中将节点D删除。如下图:
链表节点结构——
// 节点结构
struct Node {
int value;
struct Node* next;
};
typedef struct Node Node;
// 链表结构
struct List {
Node* head;
};
typedef struct List List;
这里省略链表的元数据信息,因为本文重点进行链表节点的操作。
需求很简单,使用范围很广,CS101经典数据结构,看起来十分简单,让我们来实现它!
CS101版本
让我们来看看《C语言程序设计-谭浩强》的实现(不小心暴露了年龄😄)。
void remove(List *l, Node *node)
{
Node *cur = l->head, *previous = NULL;
while (cur != node) {
previous = cur;
cur = cur->next;
}
if (previous) {
previous->next = cur->next;
} else {
l->head = cur->next;
}
}
我们用cur存储当前节点,用previous存储当前节点的前驱节点。首先遍历当前链表,直至找到待删除节点。此时我们需要判断目标节点的位置——
情况1: 当前节点有前驱和后继,那么就将前驱节点指向后继节点;
情况2: 如果当前节点没有前驱,说明需要删除的是第一个节点,那么需要将链表的头节点指向当前节点的下一节点;
情况3: 如果当前节点没有后继,同情况1。
考虑周全,完结撒花,小伙伴可以洗洗睡啦。然而这段代码在Linus看来是一段"没有品味(not in good taste)"的代码。下面让我们来看看有品位的代码——
有品位的单链表删除
When the algorithm is nicely arranged, that special case can be handled with the same code than all other cases. After that, the check for that special case can be removed. - Linus Torvalds
好的算法设计可以所有的情况,换句话说,可以省去为处理"特殊情况"的代码。 - 林纳斯·托瓦兹
来不及解释了,先上代码——
void remove(List *l, Node *node)
{
Node **cur = &l->head;
while ((*cur) != node) {
cur = &(*cur)->next;
}
*cur = node->next;
}
乍一看,代码少了一半。让我们来看看这段代码都做了什么?
首先,cur是一个指向指针的指针,这个指针的地址是l->head这个指针的地址。可以认为现在的cur是在头节点上面再套一层box,这个box的值是head这个指针的地址,这个值和链表l所指向的首节点的位置相同。
在循环内部,我们同样对链表进行遍历,唯一的不同点在于这里我们要对cur进行两层解析。
在最后一行,最出彩的来了!在这里我们将cur的值(还是一个指针)置为目标节点的下一个节点的指针。cur表示的是当前的位置指针,注意这里的位置并不是指的原链表内的位置,而是给每一个节点设置了一个高维指针,不管链表怎么变,这个高维的指针顺序不会变。那么这时给cur赋值其实只是替换掉当前该高维box位置的值,不管这个box里面是什么都没有影响。
简而言之,这就像给链表做了一个降维打击,站在更高的维度审视链表,而不在意链表结构本身。
市场驱动下的10x程序员
看了以上的"有品位"的代码,大家对10x程序员有没有新的认识?大家觉得Linus是10X程序员么?
在聊10x程序员之前,让我们先来看看其定义——
在编程界的传说中,一个10x程序员可以完成普通程序员十倍的工作量。 所谓普通程序员,可以想象是一个擅长他/她的工作,但没有10x 程序员那样神奇能力的人。 一个任务越是「目标导向」,潜在的10x 程序员就越有空间利用她/他的能力以比别人少很多的努力达到目标。
一个10x程序员可以完成普通程序员十倍的工作量,甚至百倍。这个定义实在太吸引人了——以一当十(我要打十个😄)——以至于老板们跃跃欲试,开始寻找和培养10x程序员们。然而老板们之所以为老板,就在于他们的行动力和结果导向。在此方法论引导下,我们看到了越来越多的"结果导向"的10x程序员——10倍工作量,10倍的代码量,10倍的产出,10倍的工时——最终产生了10倍的加班汪,然而工资么。。。说多了都是泪。。。甚至还有些培训机构开设了诸如"10x程序员工作法"的培训课程,里面乱入一些软件工程的基本概念和心灵鸡汤。市场被这些所谓的"10x程序员"搅的惨不忍睹,而程序员也只能打碎了牙往肚子里咽。。。
那么到底有没有所谓的10x程序员?笔者认为是有的。下面就来聊一聊笔者心中的10x程序员。
这里需要说明,在此我们只谈"程序员"以及这一行业相关的部分,不包括跟软件和编码无关的事情,比如软件工程或者心灵鸡汤(当然它们也很重要)。
真正的10x程序员
Bad programmers worry about the code. Good programmers worry about data structures and their relationships - Linus Torvalds
一般的程序员忙于代码,好的程序员忙于数据结构以及其间的关系。 - 林纳斯·托瓦兹
回到上一篇开头的问题,Linus算是10x程序员么?笔者认为是的,我认为他甚至是100x程序员。然而看看本章开头他对链表操作的执着,他非但没有10x的产出,从代码量的角度,他的代码贡献甚至有时是负值(从10行代码缩减到5行)。尤其在维护Linux社区的中后期,他很少有代码产出,经常在社区中对别人的代码"品头论足"。为什么笔者认为他是10x程序员?10x程序员的标准到底是什么?优美的架构设计?清晰的代码结构?高效的编码框架?还是程序可以方便的维护和扩展?
如果大家认真的思考了上面的问题,去思考心中的10x程序员的标准,那么恭喜你!你落入了笔者的陷阱😄 笔者认为,脱离了上下文的"10x程序员"是没有意义的,同时10x也不是一个确定的系数,更应该视为"10乘以x"!
为什么这样说呢?我们还是以Linus为例子。他对代码"品位"的喜好和零容忍,成就了他在linux社区的地位(当然骂人不算lol)。然而,如果我们抛开社区本身,他所有的品质可能并不会那么闪闪发光,甚至在有些市场导向的企业中有可能还会起到副作用。比如如下场景,如果用维护Linux的精神来生产企业程序,请各位看官自行脑补画面:
老板:"听说秒杀功能开发完成了?下个冲刺发布秒杀功能没有问题吧?" Ls:"代码写的太差了,支持3亿QPS竟然需要2000台节点。我还在code review和修改中。" 老板:"如果裁剪一些功能,能不能按时上线?" Ls:"裁剪多少需求,烂代码也要修改完才行!" 老板:"这个功能月底一定要上线!客户的钱都已经收了!" Ls:"看情况吧。。。" 老板(内心):"一根筋的程序员。。。" Ls(内心):"没品位的资本家。。。"
所以说,没有上下文的10x程序员都是耍流氓。下次再有老板借着高效的10x程序员为借口变相要求你加班,希望读者脑中立马反应过来——这是一个坑——并优雅的让老板阅读本文😄
尤其在最近读了《不拘一格:网飞的自由与责任工作法》之后,更加意识到上下文以及环境对一个程序员有多重要(后面会专门为此书写一个书评)。在网飞,所有的员工与老板共享有关公司的任何信息,比如订阅数,公司财报(甚至比华尔街知道的还要早)等等。员工只有了解所有上下文信息,才有可能做出正确的决定。如果员工所接受的信息比经理的少,那么凭什么要求员工做出正确的决定以及担负相应的责任?
有了完整的上下文,才能拥有获得10x程序员的基础。在此基础之上,还需要有相应的自由空间来发挥程序员的创造力。在网飞,小到团建聚餐,大到千万的项目,都不需要层层审批。只要对应执行人觉得没问题,就可以不用审批,直接干!没错,如果你觉得这是该做的事儿,那么就去干吧!因为对于程序员这个职业,创新才是第一生产力。而充分的自由才能孵化出创新!也只有通过创新,才能诞生真正的10x程序员从而真正的创造10x+的价值,
最后总结一下,10x程序员是有的,但是在市场盲目的追求10x程序员的时候,我们需要停下来想一想我们有没有给10x程序员对应的环境——透明的信息以及自由的空间——才能使得"x"大于一,得到10x+的程序员!相反的,如果在一个不透明的封闭环境,x只会越来越小,最终的结果可能比一还要小。
小结
本文从一个单链表的删除操作说起,聊到了"有品位"的代码和程序员,进而谈了谈目前市场时所谓的"10x程序员"和笔者所认为的"10x程序员"。最后借由网飞的文化提出了"10x程序员"中的x并不是倍数,而是一个参数,只有信息透明和自由的环境才能造就真正的10x程序员。
最后的最后,给之后的书评做个引子——
最高的工资 + 透明的信息 + 极大的自由 -> 自组织的智力密集型组织 -> 无限的发展和价值