Building the world in less than 7 days
As a result of the fact that the BSD base system is developed as a single unit, you can easily get the entire source tree for the entire base system. And because of the way it's designed, you can execute a single command at the top level to compile everything. For most of us, that's the normal way to upgrade; you update your source tree to the absolute latest (with a few hours, of course) changes made by anybody, compile it, install the new binaries, and you're done. Miller time.
Of course, you might not necessarily want the latest. You could grab the sources from last week, say. And normally, you do the whole rebuild process in four steps. You start with a make buildworld which compiles all of userland, then a make buildkernel which compiles the kernel. Then you take a deep breath and make installkernel to install the new kernel, and make installworld to install the new userland. Each step is automated by a target in the Makefile.
Of course, I'm leaving out tons of detail here. Things like describing the kernel config, merging system config files, cleaning up includes... all those gritty details. If you want to read about that, check the FreeBSD handbook, specifically the sections on updating and building and configuring your kernel, or the various other forms of documentation available. But those sort of things become second nature after you do them a few times. Really, the process of updating your system boils down to those four commands. I find it a lot easier than having to resolve cross-dependencies and changed library versions and such across a zillion binary packages.
This information is mostly based on FreeBSD. NetBSD uses a different model for doing the system builds. OpenBSD tends to be much more in favor of reinstalls, at least for major version changes.
Well, that sure was easy. But, what about all those add-on packages? How do we manage those? Let's talk about installing and upgrading ports.