开源贡献者往往充满激情——他们愿意为项目奉献一切,这也自然会囊括相当一部分个性化因素。我们将共同了解贡献者中的几大不同性格类型、他们的目标所在,并如何在追求质朴与追求完美的pull请求之间做好取舍工作。在各类开源性格类型当中,您最认同哪一种呢?比如泛用型、专用型、完美主义者、概念论者、冒险主义者,还是拘泥传统者?
在团队当中工作必然要面临着成员们对于特定议题的争论,这当然并不是什么坏事。不同的意见有助于确保每位成员的思路都能得到讨论,同时确定问题来源并将重点集中在手头任务的核心矛盾身上。
然而,这一切在开源世界中却并没那么简单。开源贡献者往往充满激情——他们愿意为项目奉献一切,这也自然会囊括相当一部分个性化因素。这种情况虽然在其他领域也有出现,但开源贡献者显然更热衷于利用自己工作之余的宝贵时间做点自己真正想做的事。
为开源企业工作则会带来一种更加扭曲的心态组合:从业者需要在工作管理要求与项目前进方向之间找到平衡点。这很可能造就一种极具挑战性的环境,特别是考虑到面对贡献型项目时,企业本身往往并不一定能主导一切。
在今天的文章中,我们将共同了解贡献者中的几大不同性格类型、他们的目标所在,并如何在追求质朴与追求完美的pull请求之间做好取舍工作。虽然很 多朋友可能发现自己身兼多种性格类型的特质,但这些特质往往围绕着一类中心。要实现妥善管理,诀窍在于找出贡献者们的真正目标,并判断其能否与项目方向保 持一致。
1.泛用型 / 专用型
这种特性集中在项目如何在各类状态下正常起效。
泛用型性格的人希望确保项目能够在各项状态下全部正常起效。这往往要求贡献者采取非常广泛的审视角度。任何针对代码的变更通常都会涉及字符串变更与 变量替换、新增抽象层或者将某些功能以插件形式体现——这一切都将使得项目更具定制化特性与泛用能力。尽管这类方式并没有什么问题(事实上,我本人就是典 型的泛用型性格),但这意味着代码的复杂性会显著提高——可能导致编写时间延长且难于符合既定要求。
在另一方面,专用型则专门针对特定用例。这类贡献者往往乐于强调现有代码成果并不需要处理其他某些用例,而且倾向于对变量进行硬编码并利用现有代码 实现目标,而直接忽略其在其他状态下的可用性。专用型性格特别适合完成某种具体的任务,因为其通常能够实现优化程度更高的解决方案。
着眼于这两种思路对注释以及pull请求加以权衡并非易事。我个人的体验是,人们倾向于编写专用型代码,但却提供泛用型注释。人们在评论当中很少会 提到“现有代码太过泛用”,而更多是在抱怨其专用型倾向太强。总结来讲:具体取向要依托于项目的发展预期。泛用型性格的贡献者希望打造出一款瑞士军刀性质 的工具,而专用型性格的贡献者则希望其成为一把手术刀。
2.完美主义者 / 概念论者
这类特性专注项目是否符合标准与实践惯例。面对任何一项任务,在与相关工作团队进行讨论时,对于最终成效的判断都是有所差异的:有些人希望保证其完美符合现有标准,而有些人则认为取中位水平即可,另一部分则乐于通过我们前所未闻的方式加以实现。
其中完美主义者会对语法进行吹毛求疵般的挑剔。他们会强调称,完成任务的唯一途径就是按部就班、严格遵循规则。他们会指出,如果想让项目取得成功, 就必须按照他们的既定思路来推进。说实话,他们的观点通常都是正确的。他们也会深入查看我们的代码,并从中发现性能问题。即使是只需要运行三次的循环,他 们也会提出建议以确保它们能够拥有更快的运行速度。这帮完美主义者希望让代码成果成为一种艺术品。他们热爱优雅、高度优化且符合标准的代码。
在另一方面,概念论者则更关注如何让代码库中的组成部分切实生效。在“保证生效、加以改进、提高速度”这一循环当中,他们始终停留在“保证生效”阶 段,而且对于完美主义者们对于现有方案水平的抱怨之声充耳不闻。当然,这种坚持将能够生效作为最终标准的思维也让概念论者同始终坚持代码艺术化的完美主义 者们爆发出激烈的冲突。
对二者加以平衡本身也很讲究技巧——这取决于概念论者们的具体提议。有时候,时间周期可能是一项非常重要的因素,这意味着代码达不到完美主义者提出 的标准并不一定是坏事。毕竟有时候快速上线显得更加重要。这意味着对概念性代码的验证将成为必然,贡献者并没有时间或者其它资源将其提升到完美的高度。另 外,完美主义者的主张往往令概念论者头痛不已,因为前者对于完善编码规则的坚持在后者看来只是一种强迫症。不过在可读性方面,在绝大多数情况下完美主义者 编写的代码更容易阅读与维护。总结来讲,我们需要考量时间的限制以及现有资源规模,从而考虑如何更好地解决未来可能出现的问题。完美主义者希望自己的刀刃 尽可能锐利、耀眼,而概念论者则乐于利用一切刀具——甚至是某些只是看起来像刀具的东西——完成任务。
3.冒险主义者 / 拘泥传统者
在谈到解决问题时,不少人乐于将其视为尝试新事物的好机会。冒险主义者们就属于这类人。无所畏惧、着眼未来的冒险主义者们总是希望使用最新的技术方 案、最新的语法成果以及最具想象力的文件说明方式。他们希望项目能够持续前进并全程为其护航,不过他们同时亦有着雄心与壮志帮助其超越极限并尝试新鲜手 段。为什么不呢?这才带劲!这些冒险主义者们通常会利用自己闻所未闻的代码库,例如mustardandcheese或者protactinum,外加各 类技术名词。当然,一旦出了问题或者是发现代码库不够成熟,那么我们该让谁来负责?没错,说的就是你们,冒险主义者们!
另一方面,拘泥传统者们则希望坚持使用久经考验且备受信赖的固有技术。这并不是说拘泥传统者一定沉闷无趣,他们只是更乐于利用自己已经掌握的知识获得可预测的结果。他们希望确保一切正常运转,同时使用他们过去一年或者过去数年中已经涉及过的技术方案。
要在二者之间取得平衡,同样难度颇高。最重要的问题在于,我们能够拿出多少时间用于解决由新型库/工具/代码所带来的潜在问题。冒险主义者们通常会 把新鲜技术的引入形容为“双赢”作法。不过拘泥传统者往往对此抱有审慎的态度。总结来讲:大家是否有时间学习这些新型技术?团队中的其他成员是否认同这种 冒险?由此带来的收益是否确实高于相关学习曲线?冒险主义者们希望使用没人用过的钼钢合金刀片,而拘泥传统者则坚持使用传统材料制成的老牌刀具。
总结陈词
这篇文章的主旨当然不是要挑起群众内部矛盾,或者是把技术从业者硬性分类,显然也不是要告诉大家该如何看待上述各种性格的贡献者。我们只是想探讨代 码编写环境下各位工作成员的常见心态类型。其实这种状况在非代码编写环境下也很常见。各位不妨将上述分类看作一种工具,并利用它通过特定贡献者提供的注释 与代码来判断他们属于哪种性格类别。
当然,我们不可能永远只具备其中的某一项特质。其中总是会有一定程度的交集,而这交集往往取决于他们当前正在从事的项目、手头的可支配时间、以及对 技术的理解水平的变化。就个人而言,我认为自己是个相当极端的泛用型/完美主义者,并在冒险与传统方面采取中立态度。了解这些特质能够帮助大家了解别人如 何看待我们的代码与注释,同意利用这些素材判断其他人的取向。
在开源世界当中,这些特质往往表现得更加夸张。当人们把自己的时间与精力投入到开源项目当中,每个人都在真心付出并希望自己的声音能够得到尊重。所 以,在下一次编写评论或者注释时,请尝试从这些性格特征出发理解为什么现有成果会表现出这种状态。立足于完美主义角度者打倒概念论者毫无意见,提出各类冒 险型建议也会让传统型贡献者无所适从——总而言之,在不同观点间寻求平衡点才是明智之举。