Advantages and Disadvantages of a Monolithic Repository

Total Page:16

File Type:pdf, Size:1020Kb

Advantages and Disadvantages of a Monolithic Repository 1 Advantages and Disadvantages of a Monolithic Repository 2 3 A case study at Google 4 5 Ciera Jaspan, Matthew Jorde, Emerson Murphy-Hill∗ 6 NC State University 7 Andrea Knight, Caitlin Sadowski, [email protected] 8 Edward K. Smith, Collin Winter 9 Google 10 ciera,majorde,aknight,supertri,edwardsmith, 11 [email protected] 12 13 ABSTRACT the organization. Successfully organizing these dependencies 14 Monolithic source code repositories (repos) are used by sev- and frameworks is crucial for development velocity. 15 eral large tech companies, but little is known about their One approach to scaling development practices is the 16 advantages or disadvantages compared to multiple per-project monolithic repo, a model of source code organization where 17 repos. This paper investigates the relative tradeoffs by utiliz- engineers have broad access to source code, a shared set 18 ing a mixed-methods approach. Our primary contribution is a of tooling, and a single set of common dependencies. This 19 survey of engineers who have experience with both monolithic standardization and level of access is enabled by having a 20 repos and multiple, per-project repos. This paper also backs single, shared repo that stores the source code for all the 21 up the claims made by these engineers with a large-scale anal- projects in an organization. Several large software companies 22 ysis of developer tool logs. Our study finds that the visibility have already moved to this organizational model, including 23 of the codebase is a significant advantage of a monolithic repo: Facebook, Google, and Microsoft [10, 12, 17, 21]; however, 24 it enables engineers to discover APIs to reuse, find examples there is little research addressing the possible advantages 25 for using an API, and automatically have dependent code or disadvantages of such a model. Does broad access to 26 updated as an API migrates to a new version. Engineers source code let software engineers better understand APIs 27 also appreciate the centralization of dependency management and libraries, or overwhelm engineers with use cases that 28 in the repo. In contrast, multiple-repository (multi-repo) aren’t theirs? Do projects benefit from shared dependency 29 systems afford engineers more flexibility to select their own versioning, or would engineers prefer more stability for their 30 toolchains and provide significant access control and stability dependencies? How often do engineers take advantage of 31 benefits. In both cases, the related tooling is also a significant the workflows that monolithic repos enable? Do engineers 32 factor; engineers favor particular tools and are drawn to repo prefer having consistent, shared toolchains or the flexibility 33 management systems that support their desired toolchain. of selecting a toolchain for their project? 34 In this paper, we investigate the experience of engineers 35 CCS CONCEPTS working within a monolithic repo and the tradeoffs between 36 using a monolithic repo and a multi-repo codebase. Specifi- • Software and its engineering → Software configuration man- 37 cally, this paper seeks to answer two research questions: agement and version control systems; 38 39 (1) What do developers perceive as the benefits and 40 1 INTRODUCTION drawbacks to working in a monolithic versus multi- 41 Companies today are producing more source code than ever repo environment? 42 before. Given the increasingly large codebases involved, it (2) To what extent do developers make use of the unique 43 is worth examining the software engineering experience pro- advantages that monolithic repos provide? 44 vided by the various approaches for source code management. 45 Large companies with multiple products typically have many To answer these questions, we ran a mixed-methods case 46 internal libraries and frameworks, and a vast number of de- study within a single company with a monolithic repo. We 47 pendencies between projects from entirely separate parts of surveyed software engineers to understand their perceptions 48 about working in monolithic repos. For engineers that also ∗ 49 Work completed while on sabbatical at Google had experience working in multi-repo systems, we asked 50 further questions to understand the benefits of each and why Permission to make digital or hard copies of part or all of this work 51 for personal or classroom use is granted without fee provided that they might prefer one model over another. We also analyzed 52 copies are not made or distributed for profit or commercial advantage the logs from developer tools to study the extent to which 53 and that copies bear this notice and the full citation on the first page. Copyrights for third-party components of this work must be honored. engineers utilize their ability to view and edit all of the code 54 For all other uses, contact the owner/author(s). in the codebase. We examined how often engineers view and 55 ICSE-SEIP ’18, Gothenburg, Sweden edit code far afield from their team and organization, and we 56 © 2018 Copyright held by the owner/author(s). 978-1-4503-5659- 6/18/05. $15.00 examined whether these views are simply to popular APIs. 57 DOI: 10.1145/3183519.3183550 Our survey results show that engineers at Google strongly 58 ICSE-SEIP ’18, May 27-June 3, 2018, Gothenburg, Sweden C. Jaspan et al. 1 prefer our monolithic repo, and that visibility of the code- system, it may still be true that code is viewable by all 2 base and simple dependency management were the primary engineers, as is the case for open-source projects on GitHub 3 factors for this preference. Engineers also cite as important or BitBucket. In theory, a multi-repo system could also have 4 the ability to find example uses of API and the ability to a shared set of developer tools; in practice this is rare as 5 automatically receive API updates. Logs data confirms that there is no enforcement for this to happen across repos. In a 6 engineers do take advantage of both the visibility of the code- multi-repo setup, commits are not to a single head, so version 7 base and the ability to edit code from other teams. Contrary skew and diamond dependencies (where each project may 8 to expectations, viewing popular APIs was not the primary depend on a different version of a library) do occur. 9 reason engineers view code outside of their team; this provides At Google, almost all code exists in a single large, cen- 10 further [18] evidence that viewing code to find examples of tral repo, in which almost all code2 is visible to almost all 11 using an API is important, possibly more so than viewing engineers. The repo is used by over 20,000 engineers and 12 the implementation of the API. contains over 2 billion lines of code. All engineers that work 13 We also discovered many interesting tradeoffs between in this monolithic repo use a shared set of tools, including a 14 using monolithic and multi-repo codebases; they each had single build system, common testing infrastructure, a single 15 benefits that were not possible in the other system. One code browsing tool, a single code review tool, and a custom 16 such tradeoff was around dependencies. Engineers note that source control system. The build system depends on com- 17 a primary benefit of multi-repo codebases is the ability to pilers that are also checked into the codebase; this allows 18 maintain stable, versioned dependencies. This is particularly a centralized tooling team to update the compiler version 19 interesting because it is in direct contrast to two of the pri- across the company. 20 mary benefits of a monolithic repo: ease of both dependency While engineers can view and edit nearly the entire code- 21 management and of receiving API updates. Another tradeoff base, all code is committed only after the approval of a code 22 appeared around flexibility of the toolchain. Engineers who owner. Code ownership is path-based, and directory owners 23 prefer multiple repos also prefer the freedom and flexibility implicitly own all subdirectories as well. Engineers are limited 24 to select their own toolchain. Interestingly, the forced con- to using a small set of programming languages, and there is 25 sistency of a monolithic repo was also cited as a benefit of a tool-enforced style for each language. 26 monolithic repos. 27 Finally, we saw evidence that for some engineers, the de- 3 METHODOLOGY 28 velopment tools were more important than the style of repo. To understand how engineers perceive the advantages and 29 Engineers called out favored development tools by name as a disadvantages of a monolithic repo, we surveyed a sample of 30 reason to use one repo over another, even though in theory, engineers at Google. Rather than only measuring engineer 31 these tools could be available for any type of repo. satisfaction with the monolithic repo, we asked them to 32 compare Google’s monolithic repo to their prior experiences 33 2 MONOLITHIC REPOSITORIES with other repo systems and to one hypothetical example. 34 For purposes of this paper, we define a monolithic source The goal was to identify the relative tradeoffs between a 35 repo to have several properties: monolithic repo and multi-repos. 36 We also took advantage of our ability to log engineers’ 37 (1) Centralization: The codebase is contained in a single repo encompassing multiple projects. interactions with the codebase. Our common developer tools 38 allow us to instrument not only commits to the codebase, 39 (2) Visibility: Code is viewable and searchable by all engineers in the organization. but also file views. We used these logs to confirm some of the 40 survey responses by showing that engineers not only say they 41 (3) Synchronization: The development process is trunk- based; engineers commit to the head of the repo.
Recommended publications
  • Pragmatic Version Control Using Subversion
    What readers are saying about Pragmatic Version Control using Subversion I expected a lot, but you surprised me with even more. Hav- ing used CVS for years I hesitated to try Subversion until now, although I knew it would solve many of the shortcom- ings of CVS. After reading your book, my excuses to stay with CVS disappeared. Oh, and coming from the Pragmatic Bookshelf this book is fun to read too. Thanks Mike. Steffen Gemkow Managing Director, ObjectFab GmbH I’m a long-time user of CVS and I’ve been skeptical of Sub- version, wondering if it would ever be “ready for prime time.” Until now. Thanks to Mike Mason for writing a clear, con- cise, gentle introduction to this new tool. After reading this book, I’m actually excited about the possibilities for version control that Subversion brings to the table. David Rupp Senior Software Engineer, Great-West Life & Annuity This was exactly the Subversion book I was waiting for. As a long-time Perforce and CVS user and administrator, and in my role as an agile tools coach, I wanted a compact book that told me just what I needed to know. This is it. Within a couple of hours I was up and running against remote Subversion servers, and setting up my own local servers too. Mike uses a lot of command-line examples to guide the reader, and as a Windows user I was worried at first. My fears were unfounded though—Mike’s examples were so clear that I think I’ll stick to using the command line from now on! I thoroughly recommend this book to anyone getting started using or administering Subversion.
    [Show full text]
  • Version Control 101 Exported from Please Visit the Link for the Latest Version and the Best Typesetting
    Version Control 101 Exported from http://cepsltb4.curent.utk.edu/wiki/efficiency/vcs, please visit the link for the latest version and the best typesetting. Version Control 101 is created in the hope to minimize the regret from lost files or untracked changes. There are two things I regret. I should have learned Python instead of MATLAB, and I should have learned version control earlier. Version control is like a time machine. It allows you to go back in time and find out history files. You might have heard of GitHub and Git and probably how steep the learning curve is. Version control is not just Git. Dropbox can do version control as well, for a limited time. This tutorial will get you started with some version control concepts from Dropbox to Git for your needs. More importantly, some general rules are suggested to minimize the chance of file losses. Contents Version Control 101 .............................................................................................................................. 1 General Rules ................................................................................................................................... 2 Version Control for Files ................................................................................................................... 2 DropBox or Google Drive ............................................................................................................. 2 Version Control on Confluence ...................................................................................................
    [Show full text]
  • Generating Commit Messages from Git Diffs
    Generating Commit Messages from Git Diffs Sven van Hal Mathieu Post Kasper Wendel Delft University of Technology Delft University of Technology Delft University of Technology [email protected] [email protected] [email protected] ABSTRACT be exploited by machine learning. The hypothesis is that methods Commit messages aid developers in their understanding of a con- based on machine learning, given enough training data, are able tinuously evolving codebase. However, developers not always doc- to extract more contextual information and latent factors about ument code changes properly. Automatically generating commit the why of a change. Furthermore, Allamanis et al. [1] state that messages would relieve this burden on developers. source code is “a form of human communication [and] has similar Recently, a number of different works have demonstrated the statistical properties to natural language corpora”. Following the feasibility of using methods from neural machine translation to success of (deep) machine learning in the field of natural language generate commit messages. This work aims to reproduce a promi- processing, neural networks seem promising for automated commit nent research paper in this field, as well as attempt to improve upon message generation as well. their results by proposing a novel preprocessing technique. Jiang et al. [12] have demonstrated that generating commit mes- A reproduction of the reference neural machine translation sages with neural networks is feasible. This work aims to reproduce model was able to achieve slightly better results on the same dataset. the results from [12] on the same and a different dataset. Addition- When applying more rigorous preprocessing, however, the per- ally, efforts are made to improve upon these results by applying a formance dropped significantly.
    [Show full text]
  • Introduction to Version Control with Git
    Warwick Research Software Engineering Introduction to Version Control with Git H. Ratcliffe and C.S. Brady Senior Research Software Engineers \The Angry Penguin", used under creative commons licence from Swantje Hess and Jannis Pohlmann. March 12, 2018 Contents 1 About these Notes1 2 Introduction to Version Control2 3 Basic Version Control with Git4 4 Releases and Versioning 11 Glossary 14 1 About these Notes These notes were written by H Ratcliffe and C S Brady, both Senior Research Software Engineers in the Scientific Computing Research Technology Platform at the University of Warwick for a series of Workshops first run in December 2017 at the University of Warwick. This document contains notes for a half-day session on version control, an essential part of the life of a software developer. This work, except where otherwise noted, is licensed under the Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Li- cense. To view a copy of this license, visit http://creativecommons.org/ licenses/by-nc-nd/4.0/. The notes may redistributed freely with attribution, but may not be used for commercial purposes nor altered or modified. The Angry Penguin and other reproduced material, is clearly marked in the text and is not included in this declaration. The notes were typeset in LATEXby H Ratcliffe. Errors can be reported to [email protected] 1.1 Other Useful Information Throughout these notes, we present snippets of code and pseudocode, in particular snippets of commands for shell, make, or git. These often contain parts which you should substitute with the relevant text you want to use.
    [Show full text]
  • Microservices and Monorepos
    Microservices and Monorepos Match made in heaven? Sven Erik Knop, Perforce Software Overview . Microservices refresher . Microservices and versioning . What are Monorepos and why use them? . These two concepts seem to contradict – why mix them together? . The magic of narrow cloning . A match made in heaven! 2 Why Microservices? . Monolithic approach: App 3 Database Microservices approach . Individual Services 4 DB DB Database Versioning Microservices . Code . Executables and Containers . Configuration . Natural choice: individual repositories for each service Git . But: • Security • Visibility • Refactoring • Single change id to rule them all? 5 Monorepo . Why would you use a monorepo? . Who is using monorepos? . How would you use a monorepo? 6 Monorepos: Why would you do this? . Single Source of Truth for all projects . Simplified security . Configuration and Refactoring across entire application . Single change id across all projects . Examples: • Google, Facebook, Twitter, Salesforce, ... 7 Single change across projects change 314156 8 Monorepos: Antipatterns User workspace User workspace 9 Monorepos – view mapping User workspace . Map one or more services . Users only access files they need . Simplified pushing of changes 10 What does this have to do with Git? . Git does not support Monorepos • Limitations on number and size of files, history, contributing users • Companies have tried and failed . Android source spread over a thousand Git repositories • Requires repo and gerrit to work with 11 How can we square this circle? https://en.wikipedia.org/wiki/Squaring_the_circle 12 Narrow cloning! . Clone individual projects/services . Clone a group of projects into a single repo 13 Working with narrowly cloned repos . Users work normally in Git . Fetch and push changes from and to monorepo .
    [Show full text]
  • Version Control – Agile Workflow with Git/Github
    Version Control – Agile Workflow with Git/GitHub 19/20 November 2019 | Guido Trensch (JSC, SimLab Neuroscience) Content Motivation Version Control Systems (VCS) Understanding Git GitHub (Agile Workflow) References Forschungszentrum Jülich, JSC:SimLab Neuroscience 2 Content Motivation Version Control Systems (VCS) Understanding Git GitHub (Agile Workflow) References Forschungszentrum Jülich, JSC:SimLab Neuroscience 3 Motivation • Version control is one aspect of configuration management (CM). The main CM processes are concerned with: • System building • Preparing software for releases and keeping track of system versions. • Change management • Keeping track of requests for changes, working out the costs and impact. • Release management • Preparing software for releases and keeping track of system versions. • Version control • Keep track of different versions of software components and allow independent development. [Ian Sommerville,“Software Engineering”] Forschungszentrum Jülich, JSC:SimLab Neuroscience 4 Motivation • Keep track of different versions of software components • Identify, store, organize and control revisions and access to it • Essential for the organization of multi-developer projects is independent development • Ensure that changes made by different developers do not interfere with each other • Provide strategies to solve conflicts CONFLICT Alice Bob Forschungszentrum Jülich, JSC:SimLab Neuroscience 5 Content Motivation Version Control Systems (VCS) Understanding Git GitHub (Agile Workflow) References Forschungszentrum Jülich,
    [Show full text]
  • Colors in Bitbucket Pull Request
    Colors In Bitbucket Pull Request Ligulate Bay blueprints his hays craving gloomily. Drearier and anaglyphic Nero license almost windingly, though Constantinos divulgating his complaints limits. Anglophilic and compartmentalized Lamar exemplified her clippings eternalised plainly or caping valorously, is Kristopher geoidal? Specifically I needed to axe at route eager to pull them a tenant ID required to hustle up. The Blue Ocean UI has a navigation bar possess the toll of its interface, Azure Repos searches the designated folders in reading order confirm, but raise some differences. Additionally for GitHub pull requests this tooltip will show assignees labels reviewers and build status. While false disables it a pull. Be objective to smell a stride, and other cases can have? Configuring project version control settings. When pulling or. This pull list is being automatically deployed with Vercel. Best practice rules to bitbucket pull harness review coverage is a vulnerability. By bitbucket request in many files in revision list. Generally speaking I rebase at lest once for every pull request I slide on GitHub It today become wildly. Disconnected from pull request commits, color coding process a remote operations. The color tags option requires all tags support. Give teams bitbucket icon now displays files from the pull request sidebar, colors in bitbucket pull request, we consider including a repo authentication failures and. Is their question about Bitbucket Cloud? Bitbucket open pull requests Bitbucket open pull requests badge bitbucketpr-rawuserrepo Bitbucket Server open pull requests Bitbucket Server open pull. Wait awhile the browser to finish rendering before scrolling. Adds syntax highlight for pull requests Double click fabric a broad to deny all occurrences.
    [Show full text]
  • Create a Pull Request in Bitbucket
    Create A Pull Request In Bitbucket Waverley is unprofitably bombastic after longsome Joshuah swings his bentwood bounteously. Despiteous Hartwell fathomsbroaches forcibly. his advancements institutionalized growlingly. Barmiest Heywood scandalize some dulocracy after tacit Peyter From an effect is your own pull remote repo bitbucket create the event handler, the bitbucket opens the destination branch for a request, if i am facing is Let your pet see their branches, commit messages, and pull requests in context with their Jira issues. You listen also should the Commits tab at the top gave a skill request please see which commits are included, which provide helpful for reviewing big pull requests. Keep every team account to scramble with things, like tablet that pull then got approved, when the build finished, and negotiate more. Learn the basics of submitting a on request, merging, and more. Now we made ready just send me pull time from our seven branch. Awesome bitbucket cloud servers are some nifty solutions when pull request a pull. However, that story ids will show in the grasp on all specified stories. Workzone can move the trust request automatically when appropriate or a percentage of reviewers have approved andor on successful build results. To cost up the webhook and other integration parameters, you need two set although some options in Collaborator and in Bitbucket. Go ahead but add a quote into your choosing. If you delete your fork do you make a saw, the receiver can still decline your request ask the repository to pull back is gone. Many teams use Jira as the final source to truth of project management.
    [Show full text]
  • Distributed Revision Control with Mercurial
    Distributed revision control with Mercurial Bryan O’Sullivan Copyright c 2006, 2007 Bryan O’Sullivan. This material may be distributed only subject to the terms and conditions set forth in version 1.0 of the Open Publication License. Please refer to Appendix D for the license text. This book was prepared from rev 028543f67bea, dated 2008-08-20 15:27 -0700, using rev a58a611c320f of Mercurial. Contents Contents i Preface 2 0.1 This book is a work in progress ...................................... 2 0.2 About the examples in this book ..................................... 2 0.3 Colophon—this book is Free ....................................... 2 1 Introduction 3 1.1 About revision control .......................................... 3 1.1.1 Why use revision control? .................................... 3 1.1.2 The many names of revision control ............................... 4 1.2 A short history of revision control .................................... 4 1.3 Trends in revision control ......................................... 5 1.4 A few of the advantages of distributed revision control ......................... 5 1.4.1 Advantages for open source projects ............................... 6 1.4.2 Advantages for commercial projects ............................... 6 1.5 Why choose Mercurial? .......................................... 7 1.6 Mercurial compared with other tools ................................... 7 1.6.1 Subversion ............................................ 7 1.6.2 Git ................................................ 8 1.6.3
    [Show full text]
  • DVCS Or a New Way to Use Version Control Systems for Freebsd
    Brief history of VCS FreeBSD context & gures Is Arch/baz suited for FreeBSD? Mercurial to the rescue New processes & policies needed Conclusions DVCS or a new way to use Version Control Systems for FreeBSD Ollivier ROBERT <[email protected]> BSDCan 2006 Ottawa, Canada May, 12-13th, 2006 Ollivier ROBERT <[email protected]> DVCS or a new way to use Version Control Systems for FreeBSD Brief history of VCS FreeBSD context & gures Is Arch/baz suited for FreeBSD? Mercurial to the rescue New processes & policies needed Conclusions Agenda 1 Brief history of VCS 2 FreeBSD context & gures 3 Is Arch/baz suited for FreeBSD? 4 Mercurial to the rescue 5 New processes & policies needed 6 Conclusions Ollivier ROBERT <[email protected]> DVCS or a new way to use Version Control Systems for FreeBSD Brief history of VCS FreeBSD context & gures Is Arch/baz suited for FreeBSD? Mercurial to the rescue New processes & policies needed Conclusions The ancestors: SCCS, RCS File-oriented Use a subdirectory to store deltas and metadata Use lock-based architecture Support shared developments through NFS (fragile) SCCS is proprietary (System V), RCS is Open Source a SCCS clone exists: CSSC You can have a central repository with symlinks (RCS) Ollivier ROBERT <[email protected]> DVCS or a new way to use Version Control Systems for FreeBSD Brief history of VCS FreeBSD context & gures Is Arch/baz suited for FreeBSD? Mercurial to the rescue New processes & policies needed Conclusions CVS, the de facto VCS for the free world Initially written as shell wrappers over RCS then rewritten in C Centralised server Easy UI Use sandboxes to avoid locking Simple 3-way merges Can be replicated through CVSup or even rsync Extensive documentation (papers, websites, books) Free software and used everywhere (SourceForge for example) Ollivier ROBERT <[email protected]> DVCS or a new way to use Version Control Systems for FreeBSD Brief history of VCS FreeBSD context & gures Is Arch/baz suited for FreeBSD? Mercurial to the rescue New processes & policies needed Conclusions CVS annoyances and aws BUT..
    [Show full text]
  • INF5750/9750 - Lecture 1 (Part III) Problem Area
    Revision control INF5750/9750 - Lecture 1 (Part III) Problem area ● Software projects with multiple developers need to coordinate and synchronize the source code Approaches to version control ● Work on same computer and take turns coding ○ Nah... ● Send files by e-mail or put them online ○ Lots of manual work ● Put files on a shared disk ○ Files get overwritten or deleted and work is lost, lots of direct coordination ● In short: Error prone and inefficient The preferred solution ● Use a revision control system. RCS - software that allows for multiple developers to work on the same codebase in a coordinated fashion ● History of Revision Control Systems: ○ File versioning tools, e.g. SCCS, RCS ○ Central Style - tree versioning tools. e.g. CVS ○ Central Style 2 - tree versioning tools e.g. SVN ○ Distributed style - tree versioning tools e.g. Bazaar ● Modern DVCS include Git, Mercurial, Bazaar Which system in this course? ● In this course we will be using GIT as the version control system ● We will use the UIO git system, but you can also make git accounts on github.com or bitbucket for your own projects ● DHIS2 uses a different system: Launchpad/Bazaar How it works Working tree: Local copy of the source code Repository: residing on the Central storage of developer’s the source code at computer (a client) a server synchronize synchronize Commit Commit locally Centralized De-centralized The repository Central ● Remembers every change ever written to it (called commits) ● You can have a central or local repository. ○ Central = big server in
    [Show full text]
  • Everything You Need to Know About Openjdk's Move to Git and Github
    Menu Topics Archives Downloads Subscribe Everything you need to know JAVA 17 about OpenJDK’s move to Git and GitHub Everything you need to know Blame or thank BitKeeper about OpenJDK’s move to Git Why not Mercurial? and GitHub Why Git? Why GitHub? Why the move, and why now? The move from Mercurial to Git Getting the source code and provided an opportunity to consolidate building the OpenJDK the source code repositories. Conclusion by Ian Darwin Dig deeper May 14, 2021 Download a PDF of this article Have you ever built your own Java Development Kit from source? Most end users of the JDK will not need to build their own JDK from the Oracle source code. I’ve needed to do that only a few times when I was running on the OpenBSD UNIX-like system, which is not one of the three supported platforms. Sure, you might want to build your own JDK to try out a new feature that you think should be added to Java. You might choose to build from source to be sure you are running a more trustworthy binary. Having the complete source code readily available, and now in a more commonly used download format, means it is easier than ever to build your own JDK. Yes, it’s a better-documented, easily configured process than in the past. But it’s still a bit confusing. The source code for the OpenJDK recently moved from the Mercurial version control system (VCS) to the Git VCS and the GitHub repository system, and that’s probably a good thing.
    [Show full text]