Code management has gone a lot of changes over the lifetime of Puppet. In earlier versions of Puppet, code management was largely left to individual users. Most users started by simply editing code directly on the Puppet Master. One organization that I worked for created Yum RPMs for every module, allowing us to roll back and forth between individual modules on multiple Puppet Masters, prior to the introduction of Puppet environments. Many users stored their Puppet code in Git or subversion and checked the code out to directories in the Puppet Master.
Each of these models comes with significant overhead management, and two solutions have risen to the top of the Puppet community during the transition from Puppet 2 to Puppet 3: Puppet Librarian and r10k. Puppet Librarian manages code like a Ruby bundle file, bringing in all the listed modules and dependencies with...