一个好的开发人员如何避免创build低总线命中率的代码?
替代文字http://www.metrocouncil.org/Directions/transit/images_transit/GoToBus.jpg
看看上面的图片。 这可能是一个程序员会被公交车撞上。 根据维基百科 ,在软件开发中,一个软件项目的“公交因素”(或“公交因素”)是
一个人对信息集中度的不正确测量,或者很less人。 公交系数是指如果发生交通瘫痪的重要开发商的总数,例如被公共汽车撞倒,则将该项目置于无法继续进行的混乱状态。
乘坐巴士可能会有许多不同的forms。 这可能是一个人从事新工作,生孩子,改变自己的生活方式或生活状态,影响也会有同样的效果。
或者换句话说:如果一段代码的原始开发者被公交车撞上了,你就被搞砸了。
所以,我的问题是: 一个优秀的开发人员如何避免创build低总线命中率的代码?
而且,谁负责确保开发人员能够保留一些代码,能够理解它呢?
失去一个关键的团队成员经常发生 ,无论是暂时的或永久的。 无论是长时间吃午餐,还是stream感在办公室里,或者程序员想要在同一家公司内担任变革angular色,或是经历一段痛苦的离婚,或者是为了环游世界,或是受到了悲剧的伤害,球队突然而意外的变化的前景是不可避免的。
优秀开发人员的一个特点是,他们努力通过让自己不那么重要来减less团队的“公交因素”。 当你对自己的工作感到不安时,这很难做到。 一个好的经理创造安全的人需要放松这种事情。
实践 ,大致按优先顺序:
-
良好的代码意味着你的意图是写在代码中,并消除了秘密。
-
彻底的unit testing既可以作为一种文件,也可以作为一个安全网,当一个秘密持有人不可用时。 (也就是说,它们是可validation的文档。)
-
结对编程 ,尤其是混杂配对 ,将把知识传播给开发团队,揭露秘密。
-
发货通常意味着,即使发生了什么事情,您的客户已经拥有了最近的工作产品,而且如果发生故障,您已知有数量可以回滚。
-
在评论和其他地方的文件存储了无法在代码中expression的想法和意图。 然而,文件制作昂贵,消耗昂贵,维护费用昂贵,而且往往被忽略,所以其他项目是优选的。
我会说代码有很好的unit testing 。 对于join项目的replace开发人员来说,知道他们的变化不会破坏系统的其他部分,这一点很重要。
维护最困难的部分海事组织不知道软件是做什么或如何做:它知道软件应该做什么。
如果我知道 …
-
软件应该是什么(即function规范…我不一定需要devise规范)
-
如何构build,如何运行和(从function规格说明)如何testing现有的软件
那么这是最重要的事情 其他文档(例如描述软件如何实现function规范的“devise”)也可能很好,但是它比较可选,不如上面那么重要。
大多数开发者会通过说“代码中的注释,命名的标识符,源代码控制等等来回答你的问题。 …但是我认为更重要的是“作为一名开发者,如果你正在编写没有书面function规范的软件,那么写一些function规范来跟随你的软件。 即使在有人试图维护软件之前,FS也是有用的:对于想要知道如何testing软件的QA来说,这将是有用的。
而且,谁负责确保开发人员能够保留一些代码,能够理解它呢?
通常,这是新开发人员的团队领导(即已知道现有代码的高级程序员); 但如果经理不知道(如果没有这样的团队领导),那么他可能是一个经理(产品或项目经理,或“释放工程师”),如果该经理知道在哪里可以find该软件的function规范和构build指令。
定期同行代码审查帮助。 这意味着至less有一个其他人必须查看每一行代码,并且在要求的情况下应该要求对其进行修改。
我一直努力为简洁而努力,这将有助于未来的开发人员。 但是,有些情况下,你不得不写一些稍微钝的代码。 在这种情况下,如果不是一个完整的解释,我将这个团队聚集在一起,持续30分钟,以完成代码工作的高级思想。
一套unit testing还可以帮助其他开发人员对改变代码有信心,因为他们知道什么时候改变了系统的一部分。 如果编写得好,他们还可以解释系统的各个部分是如何通过命名而不是纯粹通过代码来实现的。
当我在本科期间在我的大学学习程序员的时候,我的巴士命中系统(Bus Hit Factor)必须得到密切的pipe理。 我在做重大项目,但是我在那里工作直到我gradle的那一天。 在这一点上,部门的其他程序员将不得不拿起我的项目,并从那里pipe理它。 我用文件桶pipe理这个。
从那个工作开始的那一天起,我尽我所能使我的规格,代码和其他文档尽可能保持最新和清洁,以便任何有能力的同事在几天之内就可以对我的工作有一个很好的理解(有或没有我的帮助)。 我的每个项目都有相应的Confluence Wiki,我将保留所有文档,图表,规范和其他开发人员都知道的小技巧。
这也有助于,如果你有一个良好的干净的编码风格。 如果你的代码是有道理的,并且容易上手,其他程序员应该能够在你发生不幸的车祸后把它拿起来。
在组织中应该总是有重复的知识。
就像你总是支持你的硬盘(右键???),你不希望一个人成为重要信息的唯一拥有者。 减轻这个的一个方法是让程序员一起工作 。
你提到的“公共汽车”问题,更实际的是, “如果乔离开/决定退出”的因素。 一般来说,就业是随意的,任何人都可以随时离开。
一个有弹性的组织不能依靠拥有所有重要知识的单一开发者。
源代码pipe理和经过深思熟虑和评论的代码是关键。
负责确保这一切的人员确实不是每个与代码有关的人。 开发经理和首席执行官是应该密切关注的人,但执行pipe理必须制定相应的政策来支持他们,并拥有可用的资源,以确保可能有多个知识重叠的人。
结对编程可以将这种风险降低到相当高的程度。 如果你不能做到这一点(我们中许多人没有奢侈的配对每个项目),你可以随时安排定期的同行评审,并logging你的代码,而不是logging在最后。
debugging很难。 因此,如果你尽可能巧妙地进行编码,那么你将会太愚蠢的去debugging代码。
- 简单的代码提高了可维护性
- 代码审查控制简单
- 项目经理负责
c2维基曾经有一篇名为“不要信任一个月的房间里的开发人员”的文章 。 参考是用“实施系统,弗雷德,六个星期”等项目来计划项目计划,其中项目pipe理由诸如“弗雷德怎么样?我们还可以工作六周? 弗雷德说:“是的,我认为我们在那里80%。”
一个健康的公交车号码是避免“一个月的房间里的开发商”综合症的文化的副作用。 我认为这不仅仅是一个技术问题,而是一个文化问题 – 公交车号码是一个组织的属性,而不是一个代码库 – 而且标准必须从上到下进行设置。 这种文化的特点包括:
- 共同理解的组织目标和业务stream程,使开发者拥有非技术性的决策视angular,而且他们有一个与非技术性利益相关者讨论利弊的框架。
- 具体的目标设定和可validation的进度指标 ,避免抽象的名词,如每个人都有自己的意义的“系统”,口头报告“几乎完成”或“80%完成”理解为意味着没有任何可见的方式,警钟正在如果没有开发人员的客观进展(新的testing通过,新的演示版本等)几天后就closures。
- 审计和问责 :你不仅负责做你的工作,你有责任把它交给你的同事。 被要求提供账户并不是一种批评,而是一种支持手段,也是一种将你的知识“签入”组织的方式。
- 好奇心, 愿意支持同事 。 由于其他开发商不愿意帮助他们的公交车撞车脆弱的同事,以免受到同事庞大的责任和传统的维护工作的困扰,公交车号码问题往往更加恶化。
- 提出问题和疑惑的非正式渠道 (例如,同事共同吃午饭),正式的logging和升级问题的过程。
按照重要性(显然这是我自己的意见):
- 明确命名的对象,variables和函数名称
- 清除评论
- 源代码pipe理
- 代码评论
- 合理的错误跟踪软件,与发生了什么实际笔记。
- 必要时提供文件(但只在必要的地方;太多只是难以find你需要的东西)
那个负责人呢? 当然是你。
通过遵循整个团队推动整个代码库“拥有”的敏捷开发stream程。
写得好的代码可能是最佳的解决scheme。 通过写得很好,我的意思是说明简洁,variables和方法名称有意义,系统devise良好。 而且非常重要的是 – 这样做不应该损害开发者当前的stream程。
对于当前的编码器和未来的编码器来说,大量的文档都是一个障碍。
forms化的stream程(如unit testing)是当前开发速度的障碍(除非内部编码人员是stream程的支持者)。
一支军队以最慢的游行者的步伐前进。 将另外一个程序员与一个非常有效率的人结合在一起会减慢他们的速度。 很less有一家商店有超过1个超级编码器。
公司里的每个人都是解决scheme的一部分,或者是问题的一部分。
如果有人被公共汽车撞倒了,而且你没有被搞砸,那就意味着这个人是一个问题的一部分。 你不想扩大你公司的问题范围,只是为了保持公交车的命中率不增长。
反之亦然 – 如果某个有用的人被公共汽车撞倒了,无论如何,你总是被搞砸了。 迟到的人对公司的贡献越多,就越是被搞砸了。
巴士撞击因子并非只存在于软件开发中,而是一般业务风险。
所以答案是:不要指望纯粹的业务风险可以用一些技术,工具或方法来神奇地解决。 想想wanilla业务101.估计风险,估计减轻成本,比较数字,采取相应的行动。
我现在有这个问题。 基本上这个截止date是疯狂的,没有其他开发者留下的加速时间。
我认为解决scheme是从一开始就有一个以上的开发者devise系统。 总是。 三名开发者更好(我知道这是Google最喜欢的团队规模)。 通过这种方式,不止一个人从这个系统的核心知道这个系统,知道它是如何工作的,为什么它是这样devise的。
你可以说“但是小公司的资源怎么样?” 太糟糕了,如果你有两个开发人员和三个同时开发的项目,两个开发人员都应该在三者之间穿梭,交换想法并分担工作量,尽pipe这种穿梭是非常昂贵和低效的。 但长期来看,整个团队将成为代码各个部分的专家实体。
否则,在某种程度上,完全不熟悉代码的人将会进入并破坏它,当然也是最好的意图。 在这里,你走了,一个完美的系统,甚至可能是一个公司的皇冠上的gem,下山。 噗。
遵循pipe理编码风格,惯例和总体底层技术架构的devise模式。 这样每个人都以同样的方式进行编码,所以如果有新来的人必须遵循devise模式。
这可能会让创作人员感到烦恼(因为灵活性受损),但它确保了一致的代码基础,并且还促进了一致的alignmentunit testing。
总结一下:
-
devise模式确保每个开发人员都符合模式(甚至可以在Visual Studio团队基础中使用代码策略规则来执行这些规则)
-
unit testing覆盖了80%以上的代码覆盖率(这也为testing驱动开发铺平了道路)
我发现这个博客条目 ,其中包含一些有趣的观点:
- 保持简单:保持stream程尽可能简单(但并不简单!)。 这确保了stream程易于维护,因此易于教给别人。 简单通常归结为两件事情:a)使用正确的工具进行正确的工作; b)使用最直接的方式来实现所需要的。 我看到了几个不适当的技术或使用技术不必要地复杂的过程。 为了详细说明后者,过程经常被过度devise,除了展示过程创build者的聪明之外,没有别的原因。 避免不惜一切代价创buildRube Goldbergstream程! 一个重要的,简单的相关因素(从公共汽车的angular度来看)是使用团队中一个以上人所熟悉的技术。 这从一开始就build立在高公交系数上。
- 文档,文档,文档:这是一件不容易的事情,但是人们仍然认为他们可以逃避“先行事后logging”。事后做的文档往往不是很有用,因为作者忘记了包含一些很多?)小细节,当然,这些细节在麻烦的时候变成了关键的细节。 过程文件应包含哪些内容? 足以帮助人们弄清楚什么,如何,在哪里,什么时候做什么, 它如何运行; 它在哪里(服务器等); 以及运行的时间和频率。 该文档还应包含一些基本的故障排除信息以及对相关手册部分的参考。 另一个重要的一点是保持文档与stream程同步,即在stream程修改时更新所有相关文档。 这是至关重要的,因为当公交系数为1的过程的所有者下车时,过程文件是您唯一的指导。
- 关于风格的一小部分也许是为了 – 过程文档应该坚持清晰,简洁和易理解的3C。 是的,可以用三种方式来写,尽pipe这在我的写作中并不明显。 鼓励人们拿起辅助技能:前两点涉及过程和文档。 然而,最终是让事情发生的人。 尽pipedevise良好,logging的stream程,如果团队没有技能冗余,仍然可以有一个低公交系数。 当数据库pipe理员(DBA)进入(或由某个总线运行)时,谁会照顾数据库? 如果有人在基本的DBA任务中进行了交叉培训,则不需要问这个问题。 团队中的每个人尽可能至less有一项中等技能,使他们能够为其他人提供服务。
带有注释的更改日志的源代码控制可能是一个关键组件。
通过不编码孤立。 和你的团队中的其他人讨论你正在编写的代码。 有代码评论。 实施解决问题的共同策略。 如果你和队里的其他人一样,你的公交车命中率就会很低。
但是,如果你是一个单独的开发人员,这里的其他几个职位已经涵盖了编码标准,文档等的想法。
该项目应该很容易检查和设置。 在我们公司里,所有的项目都是CVS和Eclipse以及Maven,所以在Checkout之后,你会做“maven eclipse”,而且你都准备好了。
从那里开始,你需要一个好的开发者手册(不是500页的文档,只是让你走的要领)。 开发手册指向不同的文件,开发人员可以find有关devise和其他资料的信息。
一个错误跟踪系统是必须的,并且对错误的描述是必须的。
尝试评论你的代码,并保持javadoc最新。
良好的unit testing也有帮助。 尽量保持unit testing一个简单的套件,在那里你可以运行它们,而不必configuration各种东西。
希望这可以帮助。
只要有不止一个好的开发者…
我认为这应该改写。 一个好的单开发者不应该关心公交系数。 如果他的项目死了,好吧。 另一方面,一个好的团队应该有一个非常低的公交系数。
作为一名优秀的开发人员,您不应该关心您的公交车撞击事故。 重要的是你决定什么时候在公共汽车前面跑步,而不是你的雇主。