当前位置: 首页 > 科技观察

拯救强迫症:组织良好的代码库让世界变得不同!

时间:2023-03-16 21:11:54 科技观察

本文转载自公众号《读书芯》(ID:AI_Discovery)假设你刚加入新公司的新团队,想开始从事编码库的工作。您将面临的第一个问题是:将团队项目的源文件添加到哪里?好问题。新团队拥有三个用于添加文件的源目录。您需要知道您要使用哪一个,团队成员正在使用哪个以及哪些文件需要重构。多年来,SlackiOS团队在编码库方面做得更好。我们来这个团队是因为我们几次想构建一些源文件,但是缺乏编码库的架构模式,也因为这几年开发者越来越多。我们有来自顶层的大约13000个文件(并且还在增加),大约27个顶层目录,Objective-C和Swift文件的混合,以及大约40名iOS开发人员在一个monorepo中工作。SlackiOSXcodeFileHierarchy2017这些是所有文件层次结构状态的真实图片。新员工不断抱怨进入编码库,而我们已经习惯了操纵这些混乱的目录,以至于忘记了最初的痛苦。我们有无数的源代码目录(具体是iOS、SlackCocoaSDK和Slack目录),确定目录需要很长时间,然后再决定如何添加文件。此外,我们决定向编码库添加新工具,但Xcode项目的当前状态不能很好地支持新添加的工具。因此,我和一群iOS开发人员决定开始制定以下几条规则:让任何开发人员(无论新老)都能快速轻松地添加新文件。按照我们在目录中的设计模式工具可以自行维护新的和干净的文件夹这将是一个两步过程:首先将顶级目录移动到一个连贯的顺序(主要目标目录、扩展目录、框架等),以及然后是大任务——源文件夹的形成。顶级目录的移动没有??争议,也不难做到。几个开发人员一起工作可能需要数周时间。在第一步中,我们学到了一些可以在后期使用的技巧——错过处理大动作的高峰时间,始终合并master,及时浏览评论。合并冲突并不是这个过程中唯一棘手的事情,我们实际上可以更好地消除与xcodegen的冲突,大部分冲突都在项目文件中。我们还希望保留git历史记录,并能够始终一目了然地看到git和finder中的文件。但我们倾向于更简单的方法,让每个人都参与进来,将文件拖放到主页。SlackiOSXcodeHierarchy2017(左)和2018(右)从这张2018年9月的图可以看出,我们已经能够成功建立顶层目录,这样每个目录都是适用的,都是顶层目录.构建源文件现在是处理iOS、SlackCocoaSDK和Slack中的源文件并将它们全部移动到App或Source的时候了。老实说,我被这部分吓坏了。我们需要有一个清晰的模型,让团队中的所有开发人员都参与进来,需要易于移动的规则和工具,并且工程师可以清楚地看到他们是否犯了错误。来源:unsplash笔者对层级结构模式进行了大量考察,发现关于文件夹形成的文章非常少。Uber在这篇文章(https://eng.uber.com/ios-monorepo/)中介绍了他们是如何进入单一存储库的。这阐明了我们如何将代码库划分为小模块(尺寸更小)。最后,作者为团队提供了三种选择:Functionalconstructiontheme(基于架构的组织)Ontology(基于关系或类似分组的组织)团队将首先关注高级功能,然后在主题或功能目录中进行MVVM+C。这是新结构中的一个文件夹:/FeatureFolder/Coordinators/Models/Tests/Functional/Mocks/Unit/ViewModels/Views移动源文件是一个冗长而繁琐的项目。处理合并冲突很烦人,搜索文件命名空间以查看将所有功能文件拖到一个目录中是否比最初想象的更难记住,并且大多数被移动的文件不适合您开始使用规则设置的文件夹.幸运的是,有勇士挺身而出,迈出了一大步——将iOS、SlackCocoaSDK、Slack移至App/Source。2020年1月层次结构文件夹的屏幕截图:SlackXcodeFileHierarchy2020在移动这三个大型源目录时,我们发现Danger规则会阻止向这些目录添加文件,因此我们开始使用我们的新模式。Danger是持续集成系统中使用的一个工具,可以在提交后进行自动检查,并向PRS发送警告和错误信息。这是它的样子:has_slack_directory_additions=!git.added_files.grep(/Slack/).empty?has_slackcocoasdk_directory_additions=!git.added_files.grep(/SlackCocoaSDK/).empty?has_ios_directory_additions=!git.added_files.grep(/iOS/).empty?ifhas_slack_directory_additions||has_slackcocoasdk_directory_additions||has_ios_directory_additionsfail('ThisPR将新文件引入到为添加新文件而关闭的目录中。请使用Adding-a-file-to-Slack-sticky-aiOS...”>Adding-a-file-to-Slack-sticky-aiOS...”>Adding随从Linter到这里还没完,我们还需要把新源码目录App/Source的内容搬过来。以下是“文件夹管理”过程的一些规则:不要在文件夹名称中留下额外的空格(像Bazel这样的工具不能很好地工作)不要颠倒文件顺序,比如“Helper”或“Utility”协同定位测试(如果测试与源代码位于同一功能目录中,找到测试的更简单方法是什么?)对文件和文件夹进行排序!(谁不喜欢按字母顺序排序?!)确保文件在文件夹中并且文件要与适当的目标顶级目录相关联。资料来源:Unsplash有一条规则确实需要同地测试,所以我们选择Danger规则。任何添加新文件的新PR都不能添加到App/Tests。大致如下:has_slack_directory_additions=!git.added_files.grep(/Slack/).empty?has_slackcocoasdk_directory_additions=!git.added_files.grep(/SlackCocoaSDK/).empty?has_ios_directory_additions=!git.added_files.grep(/iOS/)。empty?ifhas_slack_directory_additions||has_slackcocoasdk_directory_additions||has_ios_directory_additionsfail('ThisPRisintroducingnewfilesintodirectoriesthatareclosedforaddingnewfiles.PleaseaddfilestoApp/SourceusingthenewconventionfoundinAddingafiletoSlackiOS',sticky:false)end文件夹组创建一个Slack渠道,供人们在不确定是否添加文件时咨询。关于在何处添加文件的困惑比您想象的要多,即使是小动作也可能是个大麻烦。在更优秀的iOS团队的支持下,我们已经取得了长足的进步,但未来还有更多。这不是一个人能做好的工作,需要编码库工作链上的每一个人配合。您需要更好的团队,不仅要移动文件,还要完善规则并添加更多工具。让更多人参与意味着许多人将从中学习,然后能够教其他人如何将文件添加到他们的编码库工作中。成功和幸福的秘诀很简单:如果你像我们一样有一个monorepo,组建一个团队并制定严格而快速的规则。规则可以被打破,你有机会与任何开发者讨论,你需要一个核心团队来创建支持规则的工具,让文件形成更自然。核心成员也可以花一些时间思考寻找最佳的文件结构来服务于团队组织或工作模式。来源:unsplash当开发人员了解在何处添加文件,如何加快开发速度,并让自己在代码库的工作环境中更加舒适时,世界将会不同。SwiftLint、Danger和本机脚本等工具将为您提供帮助。但需要提醒的一点是,首先你需要了解工具的用处,这通常需要动动手指。使用这些工具,一起参与,并像处理任何其他对公司不利的问题一样处理它。这是一个超级有价值的东西,它会让大家更容易找到或添加文件,也有助于开发者理解编码库的架构模式。什么是幸福?是一个组织严密的代码库,是全体成员的思考和智慧,是经验和学习的双赢。这就是幸福!