一些开发人员认为,这是一种不好的做法,应该在源文件(即
// Don't upgrade SDK Version x.y.z, see ticket 1234
)或项目级别README
文件中进行标注。其他人则认为,由于提交历史记录是项目文档的一部分,因此对于此类信息而言,它是可接受的位置,因为无论如何我们都应该阅读它。 应使用提交历史记录将关键信息传达给其他开发人员,还是应将此类信息复制到其他位置(例如项目
README
)或相关源文件中的注释?#1 楼
如果我打算升级到第三方SDK的较新版本,那么我最后要看的是源代码管理系统的历史。如果您的产品使用的是SDK的2.0版,并且有人有兴趣升级到3.0,我认为认为他们应该及时在源代码控制系统中倒退以查找是不合理的。这不是一个好主意。
这里,我们有一个团队Wiki,其中包含一些页面,其中包含每个开发人员都可以阅读的有趣信息(编码约定,如何设置开发环境来构建产品,您需要哪些第三方的东西)安装等)。这是一个适合警告不要升级第三方库的地方。
评论
实际上,提交历史就是项目的历史。就像在Wiki编辑的历史中而不是在实际页面本身中具有关键信息那样愚蠢一样。历史(无论是代码还是Wiki)仅供参考,以供您参考以前发生的情况,而不是现在应该发生的情况。
– Ordous
14年7月29日在16:38
如果可能,对于虚构的SDK,我将添加一个专门设计为在V2下通过而在V3下失败并带有明确的assert语句的单元测试,其中给出了不升级到V3的理由。提交历史记录是说明为什么要对代码审阅者进行此更改而不是记录最佳实践的好地方。
– Klors
2014年7月29日在22:58
@Klors,只要您不局限于单元测试的最繁琐的定义,并且拒绝执行其他类型的自动化测试,则该测试基于检查文件系统/ etc的库名称(如果其版本已编码) )或文件本身的哈希/校验和可用于向想要更新库的任何人抛出危险信号,即使在新版本的缺陷难以/不可能在测试中捕获的情况下也是如此。 (例如,多线程竞争条件)
–丹在火光中摆弄
14年7月30日在15:18
@Klors我在想同样的事情,但是在我看来,单元测试应该说明在v3上使用v2的原因,这样,如果单元测试通过v4,就不会有不需要v2的单元测试。原因。
–马修
2014年7月30日19:20在
另一个不使用提交历史记录的原因:提交历史记录是永久记录。如果不升级的原因消失了,则提交历史记录仍将包含不升级的警告,这可能会造成混淆。您需要在某个地方保留最新的此类需求列表,以便开发人员不必再次检查一切是否仍然相关。
–法律
2014年7月31日在7:16
#2 楼
应该在提交历史记录中注明,但是放置通知的绝对最佳位置是在定义依赖项的相同位置。例如,如果您有一个声明您的工件依赖项的maven .pom文件,我将执行以下操作:<!-- Do not change the SDK version because it causes Foo crashes. For more detail see Issue #123 -->
在
<dependency>
行的正上方。问题123将包含有关崩溃的详细信息,您导致崩溃的更新版本,然后可能应将其重新添加到待办事项列表中,以供日后再次使用-可能还有一个更新的版本解决此问题。通过自动编辑故障单,或者自己手动,它将向团队发送电子邮件以立即告知他们当前的问题,并且通过进入跟踪器,人们可以稍后再次找到它。
原因将其与依赖项声明放在一起是因为任何想要更改版本的人都会在他们想要更改它的时刻看到它,并了解为什么不应该这样做。
我不会在源代码中发表评论代码,因为我可以轻松地描绘出有人检查您的依赖项并开始升级它们的情况。他们不需要为每个TODO注释而去搜索代码库。
链接到问题单可以使好奇的开发人员知道它是如何失败的,并可能在以后重新访问。没有它,它可能会变得相当静态并且永远不会再次更新。
评论
我同意:关键信息的最佳位置是“在尽可能多的地方”。也许是pom.xml或等效的项目文件,自述文件等,但是提交历史仍然很不错。如果我要升级库,则可以查看现有版本的历史记录,以查看其更新时间以及有关提交者所遇到问题的任何注释。但是我不想翻查历史来收集所有文档。这是一个很好的补充资源。
–user22815
2014年7月30日在22:18
#3 楼
重要的和非直觉的信息应该记录下来,以便人们在考虑信息时会去寻找。对于我所从事的团队和项目,我将回撤带有评论的内容关于新版本失败的原因。如果新版本得到修复,我会添加积压的故事来重试升级。我会在链接库的构建系统/构建脚本中添加注释。
回滚将为将来的开发人员在查看项目的历史记录时提供上下文。积压的故事使此升级成为该项目的积极组成部分。构建系统注释恰好是在库最终更新时需要进行更改的地方。
我不会在代码中注释它,也不会将其添加到自述文件中。考虑尝试升级的开发人员不会关注这些内容。如果您确实将其添加到此处,则最终解决了库问题并完成升级后,您将需要删除它。通常会忘记这一步:产生与项目相反的注释。
如果您的项目具有不同的设置或流程,则答案可能会有所不同。我认为关键是要正确处理信息,以便开发人员在进行升级工作时看到信息。这样,如果升级的时间不合适,开发人员将看到它并停止,并且当时间合适时,开发人员将看到它并删除注释,以免将来的开发人员感到困惑。
评论
是的,注释需要放在更改的“路径中”。因此,从技术上讲,没有看到警告就无法执行操作。这很像安全控制。
–dss539
2014年7月29日在19:40
为建议+1提供建议,以在您的问题跟踪器中为升级创建故事/票证,并设置为“保留”,并说明为何无法完成。问题跟踪器是您真正可以合理要求人们在进行某些工作之前先查看的地方。
–安德鲁·斯宾塞(Andrew Spencer)
2014年7月30日9:57
+1引用Jeff Attwood(尽管他谈论的是,“用户”):“下次您设计[X]时,请考虑[客户]近视。您可能会对[客户]的近视感到惊讶。认真思考将它们直接放置在它们前面,这些东西不仅可见而且不可避免,否则它们可能根本看不到。” blog.codinghorror.com/treating-user-myopia
– heltonbiker
14年7月31日在18:48
#4 楼
我想通过在回答中强调他的重要思想来给予马修的评论更多的关注。有一个您不想升级SDK的原因,并且应该在单元测试中捕获该原因。不是检查修订版本号,而是实际的根本原因。例如,说新版本中有一个错误。编写一个检查该错误的单元测试。如果他们以后在SDK中修复了该错误,则升级将顺利进行。如果有不兼容的API更改,请编写测试以检查您的代码是否支持新API或SDK是否支持旧API。与单元测试相比,这更多的是集成测试,但仍然应该可行。
我的公司每天产生50多个提交,而我们的规模还不算很大。即使每个开发人员都阅读了每条提交消息(坦率地说他们没有读),我们需要记录的提交历史的全部原因是因为人们不记得了。除非有问题,否则人们不会再回头阅读历史记录。而且,他们没有理由怀疑到目前为止尚未发生的升级问题。
通过所有方式发送电子邮件以防止近期内重复工作,并注意它在您的构建脚本和自述文件或勘误表中。但是,特别是如果新版本的问题很细微并且需要花费大量时间进行故障排除,则需要一种使其变得明显的方法。这意味着单元测试。
评论
这是一个真实的答案。在单元测试中捕获失败可防止发生不良升级。期。
–德克·贝斯特(Dirk Bester)
2014年12月21日在1:09
#5 楼
我将问题重播为“是否仅通过提交消息将发现的关键信息传达给团队的其他成员?”因为我认为很明显不,您不应该这样做。我努力交流很多(根据我的经验,大多数开发团队都需要努力),并且我当然会尽一切努力避免造成陷阱或让他们撒谎。如果通过票证触发了导致此类发现的一系列操作,那么我将更新票证(并确保应该知道此事的人员具有可见性),我可能会面对面提及(希望至少能使人对“ Gee,我想Damon说了一些有关更新该内容的想法”感到)恼),并且我当然会在包含SDK的那一点上在代码中留下评论,以便没人能更新它而没有机会看到它。我可能还会看看是否也可以将其塞入我们的开发Wiki上的某个位置,尽管这样做的目的更多是为了将来的员工,而不是当前的团队。
与之相比只花了几分钟的时间遇到和发现问题所花费的时间。我当然不会决定将其作为文档中使用最少的低信号部分之一,而留给我们。
评论
+1只有真正的关键字。如果将信息存储在其他更合适的位置中,则将信息存储在提交消息中当然也不会造成损害。它确实达到了OP,因为提交日志是唯一可用的文档。
– JensG
2014年7月31日上午10:32
#6 楼
它应该在提交历史记录中,但不仅应该在提交历史记录中,想象一下您雇用了一名新开发人员。您是否希望新开发人员阅读项目过去10年中的所有提交消息,因为其中有几个对理解您的代码库至关重要?第二种情况,而不是代码更改,是否要提交“文档”提交,以便您可以按照“来自修订版5432的提交消息现在不正确”的行添加提交消息,这是当前情况。“
#7 楼
我不确定您的团队如何沟通,但我认为最有效的表达方式是先发送并发送电子邮件至团队的电子邮件组,标为“紧急”,并在正文中写上伙计们,我们不能使用SDK v xyz,因为它会导致Foo缓冲区溢出并且Bar服务将崩溃。坚持使用x.y.y版本。
这就是我们在这里所做的,这是在其中发布消息的最可靠方法。如果您真的想挑剔(如果您的电子邮件系统允许),请在电子邮件中索取“已读回执”。
一旦您告诉了整个团队,就应该放置更详细的文档进入团队Wiki。具体取决于您的文档结构。如果您有专门针对您的应用程序“依赖关系和需求”的部分,那将是添加它的好地方。
记录此类问题的另一个地方可能是源代码本身,尽管可能并不总是有效。如果仅在一个或两个明显的地方引用了
SDK version ...
,则可以包括有关不升级的注意事项。源代码管理中的文件历史记录可能很长,并且取决于开发人员,可能会有多个条目每天。某个已经休假一周的人可能没有时间阅读一周的提交历史记录。 README文件是一个更好的地方,因为它位于中心位置,人们可能更倾向于阅读它,但是您不能确保每个人都会真正阅读README。好吧,我想他们可能会发现他们已经改变了...
评论
我喜欢电子邮件组的想法。我工作的太多地方都依赖于单个地址,并且事情不会传递给新成员。
– JeffO
2014年7月29日14:39
如果有人加入您的团队会怎样?谁负责向他们提供这种伪制度知识?
– ABMagil
2014年7月29日在15:20
@ABMagil:信息进入维基。团队新手通常在一些介绍性页面上从那里开始。然后,当他们有特定的问题时(他们总是这样做),他们会遇到特定的人(他们有时间帮助新开发人员)。对于我们来说,它可能最终会在“ ApplicationX开发人员设置指南”中显示为注意:请勿使用SDK版本。 x.y.z因为...但是最初的通讯应该是电子邮件。
–FrustratedWithFormsDesigner
2014年7月29日在15:28
-1电子邮件不能很好地用作文档
– BlueRaja-Danny Pflughoeft
14年7月29日在19:14
@ BlueRaja-DannyPflughoeft:电子邮件提供了一种简单易用的方法,可以让团队中的每个人立即知道在使用特定版本的特定库时发现了问题,并且不应使用该版本。如前所述,长期文档最好在团队的Wiki或其他某种知识库中完成。
–FrustratedWithFormsDesigner
2014年7月29日在19:18
#8 楼
像这样的东西应该放在提交注释中,但是也会从其他地方受益。谁决定升级,谁都需要有事实。该人可能不在源代码管理中。如果有人会在SO上阅读有关此问题的信息而从未将其放入代码库中怎么办?
需要有关此第三方SDK的某种文档。
它解决什么问题?
为什么这个特殊的SDK?
选择了什么?
需要考虑哪些因素:版本,升级,测试等。
谁来做这个决定?
你遇到这样的情况它的版本控制中,您应该建议每个人都尽可能使用此信息。只有您的团队才能决定某人将在任何文档,源代码控制或错误跟踪器中进行搜索的地方,以获取有关该主题的尽可能多的信息。否则,您会忘记,总有人会这样做,如果它慢跑了某人的记忆并迅速将其回滚,您将很幸运。
#9 楼
我认为这种情况有两个基本问题,可能是三个。不需要的SDK升级使其成为源代码,可能会对产品产生负面影响。
:进行了不必要的升级的贡献者不知道以前是否做出不升级的特定决定。
,我认为其中第一个是最严重的。如果不需要的SDK升级可以将其纳入代码中,那么其他问题也可以解决。
有人建议添加一个单元测试用例,如果检测到升级,该用例将失败。虽然它将阻止升级的发生,但我认为这是一条危险的道路,随着时间的流逝会导致熔岩流。似乎不可避免地会在将来的某个时刻对SDK进行升级,以引入新功能或错误修正,或者是因为不再支持旧版本。试想一下,当这样的单元测试失败时,会发生令人头疼甚至是争论的事情。
我认为最通用的解决方案是调整开发过程。对于git,请使用拉取请求过程。对于Subversion和较旧的工具,请使用branch和diff。但是,有一些过程可以使高级开发人员在将这些问题纳入代码库之前就将其捕获并影响其他开发人员。
如果您的情况已使用了拉取请求过程,并且拉取请求狭窄且具体,不会浪费太多时间。将会提交升级SDK的请求请求,并拒绝提供不希望升级的评论。没有其他人会受到影响,并且现在就无需还原SDK升级。
但是要直接回答最初的问题,我同意其他人的看法,希望所有开发人员都可以完整阅读全部内容。代码的修订历史记录,发行说明等,这样的通知浪费了宝贵的时间。简短的团队电子邮件有什么问题?
可能的第三个问题:为什么首先不希望升级?显然,至少有一个开发人员认为升级将是一件好事。有很多好的理由推迟升级,但也有很多不好的理由。注意避免产生熔岩流(不必要的向后兼容代码)和货物崇拜(“我们无法升级,但我不知道为什么”)反模式!
评论
最终导致此问题的是SDK升级(次要版本号而不是主要版本号),但最终导致此问题出现的原因是,这种说法在团体中已经出现了一段时间。
– rjzii
2014年7月31日在20:02
为什么拉取请求被拒绝了?负责该决定的人应该如何发现(或记住)版本限制?
– Ben Voigt
14年7月31日在21:39
@BenVoigt好吧,要么团队负责人知道限制,要么没人记得它,而遇到问题后又重新发现了这个限制。无论哪种方式,使用请求请求,都不会责怪这个新进的开发人员,因为老年人会在允许更改之前批准更改。
–wberry
14年7月31日在21:54
@wberry:或者另一位高级开发人员处理了知道版本限制的那人的请求请求。除非所有拉动请求都必须得到所有开发人员的批准,否则这似乎是对资源的浪费。
– Ben Voigt
2014年7月31日在22:02
#10 楼
历史是放置数据的好地方,这些数据供有意识地在寻找数据的读者使用,并且对应该存放的位置有大致的了解。放置必须提供给用户而不是进行搜索的数据是一个非常糟糕的地方。历史是相对未排序的文本非常大的主体。它们通常旨在为开发人员提供有关更改内容以及更改原因的详细信息。除非有人知道他们在寻找什么,否则这可能是信息过载。
如果用户不知道他们在寻找什么,则信息会很快被埋在数百个提交日志中,而他们却没有修剪前面的一堆信息的工具。
评论
这更像是评论而不是答案。请参阅:如何回答
– gna
2014年7月31日下午0:41
好点,我扩展了它。希望这更好地满足StackExchange的标准。
–Cort Ammon
2014年7月31日在22:07
我认为这个答案最能解决问题的话题。提交历史记录对于保存信息很有用,如果有人知道他们应该在找笔记。如果没有理由检查给定行的“怪”,例如是否包含SDK,则不会阅读该文档。
–塞斯·巴丁(Seth Battin)
2014年8月2日在16:53
#11 楼
我要说的是,将这种类型的信息添加到提交历史记录中是可以的,但是仍然需要对其进行正确记录。我们最近开始使用合流(按Atlassian)。它可搜索,您可以将某些页面设置为收藏夹等。其他一些工具可能是evernote或Google文档中的公共笔记本。
#12 楼
在扩展Karl的答案时,我将采用一种方法,该方法在签入过程本身中会自动强制执行限制。您需要不需要开发人员采取任何积极行动的内容,例如阅读doc / wiki / README,并且不能被秘密地覆盖。在签入中执行规则的签入策略。例如,您可以定义一个策略来评估配置文件中具有挂起的签入版本的策略,如果该版本不等于x.y.z,则该策略将失败。这些规则实际上阻止开发人员执行签入,并可以提供描述性消息。这些策略可以被覆盖,但是有可能在发生这种情况时生成警报。替代方法可以是gate-checkins失败,它将通过某种形式的单元测试直接或间接地评估SDK版本,正如Karl所提到的。
我很欣赏这个答案非常以TFS为中心,但是可能适用于您的情况的版本控制/ CI系统(如果不是TFS)也存在类似的功能。
#13 楼
与公认的答案相反,我坚持认为提交消息是有价值的(主要)信息来源。让我们扮演释放协调员的角色。您有责任更新当前的PROD版本,从而为公司赢得或损失大量金钱。这是一种推测:我从未担任过该职位。
您检查您的Jira,Confluence,Artifactory,销售指标等。但是您还检查了最后的合并提交。您在脑海中
grep
,I could have broken X
(是,对)
评论
听起来您的项目存在非常严重的沟通问题。您是否需要新员工来查看整个提交历史记录?
新员工不应在没有特定指导的情况下浏览代码库并更改依赖关系。
@Midnotion因此,在从新员工到主要开发人员的过程中,您需要花一些时间来浏览整个提交历史记录?令人着迷。
将关键信息仅放在提交历史记录中仍然不是一个好主意。