Is it recommended to format the computer and start fresh after upgrading?
Noone I know does this.
I do this every 1-2 major OS releases. Copying from backup gives you a cool total defrag for system and user files, and cleans up all the BS that has accumulated (config files, stuff no longer need, use, etc).
I have a script that installs all my settings, brew packages, etc, even App Store apps, from external backup disk -- I'm up and running in 2-3 hours after the base install.
Any chance you have this script on GitHub/somewhere public?
I don't have it polished enough for that, but the gist (no pun intended) is:
I keep all my documents in a single folder called ~/AAA (so it lists on top) with subfolders like /WORK, /PHOTOS /CODE (e.g. /CODE/GO), /MUSIC etc, so I can just rsync that and be totally backuped.
Inside ~/AAA I also have a folder called SYSTEM_FILES, where I keep stuff like bashrc, vim directory etc. My ~/.bashrc etc are just symlinks to ~/AAA/SYSTEM_FILES/bashrc.
So I start with a script that rsyncs the AAA folder from the backup disk to ~ on the Mac, and then creates the appropriate symlinks for .bashrc, .vimrc etc.
Now all my documents are on my Mac and I have a working shell.
Then the script does:
# install brew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
# a number of brew related installs
brew install rsync
brew install mercurial
brew install watchman
brew install binutils
..
# some brew-driven font installs
brew tap caskroom/fonts
brew cask install font-roboto-mono
..
# install various linter-related stuff for my ST3
brew install -g node
sudo npm install -g eslint
sudo npm install -g eslint-plugin-import
sudo npm install -g eslint-plugin-react
sudo npm install -g babel-eslint
pip install flake8
pip install requests
..
# install various big packages from casks
brew cask install vagrant
# install mas -- a mac app store cli client
brew install mas
# use a wrapper script that extracts mas ids from the apps I want
~/mas_install.py Pixelmator
~/mas_install.py Skitch
~/mas_install.py Evernote
...
# use a shell script to copy .bashrc and co
# create symbolic links etc
~/prepare_environment.sh
# configure the Mac with various "defaults" options
defaults write NSGlobalDomain AppleShowAllExtensions -bool false
...
# finally the script sets up Mail.app, copies my Sublime Text packages to the ~/Library/Application Support etc.