title: Would it benefit the maintainability of a code base to split a single complex application into separate applications?
body: <p>I am the primary developer on a Rails application that allows customers to manage artist portfolio websites. There are four very different types of behavior that the system entails:</p>
  
  <ul>
  <li><strong>Admin</strong> behavior, which allows logged-in users to manage the content of
  their portfolios </li>
  <li><strong>Portfolio Display</strong> behavior, which renders users'
  portfolios to general visitors </li>
  <li><strong>Conversion Funnel</strong> behavior, which
  displays information about the service and entices new users to sign
  up </li>
  <li><strong>Super Admin</strong> behavior, which displays statistics about the other
  three behaviors to the service owners</li>
  </ul>
  
  <p>Currently, these four sets of behaviors are broken up into namespaced controllers—but they all share the same models. I am wondering, since the four parts of the system share virtually no behavior, if there would be any benefit to splitting the application up into four separate applications or engines (and extracting any shared behavior into gems.) </p>
  
  <p>As examples, the part of the system that deals with user statistics doesn't need to "know about" rendering YouTube embeds in portfolios, the part of the system that deals with displaying portfolios doesn't need to "know about" A/B testing, and the part of the system that deals with signing up new users doesn't need to "know about" much else besides signing up new users. </p>
  
  <p>Additionally, a specific problem that I'd like to address is that I'd like for an inexperienced team member to be able to contribute a little bit of code to the part of the site that deals with signing up new users. It wouldn't be the end of the world if a bug or two got pushed to production in that part of the site but it's extremely important to not allows bugs in production in the part of the system that displays users' portfolios.</p>
  
  <p>So, in terms of the maintainability and legibility of the codebase, would it make sense to separate these four components into separate applications? To what extent would doing so simply entail pushing complexity into a different layer of the system without eliminating it? Is this type of separation better accomplished by creating more cleanly decoupled classes and modules?</p>
  
  <p>Thanks much!</p>