Upgrade status generates a report that serves as a sort of checklist to help you determine whether or not your site is ready to be upgraded to Drupal 9. It packs a lot of useful information into a single report. It's worth taking the time to install it on a copy of your Drupal 8 site and seeing what it has to say.
Starting with Drupal 8 and continuing in Drupal 9, Drupal has been refactored to use an object-oriented architecture and has adopted Symfony components as 3rd-party dependencies, along with many other changes.
Drupal 7 module and theme developers setting out to update their code to the latest version of Drupal can benefit a lot from mapping what they already know about Drupal 7 to the way that they accomplish the same thing in the latest version of Drupal. This generally involves picking a Drupal 7 pattern and then browsing through change records, and using tools like Drupal Module Upgrader to help identify the Drupal 8 (and 9) equivalent.
We also recommend taking the time to familiarize yourself with Drupal features like events, plugins, and services -- at least enough to recognize which pattern is appropriate for different types of problems. This will help you spot instances where there either isn't a direct Drupal 7 to 8+ path, or where Drupal might provide an updated way of accomplishing something.
- Update a custom Drupal 7 module so that it works with the latest version of Drupal
- Convert a PHPTemplate (.tpl.php) file to Twig (.html.twig)
- Test your site's modules for Drupal 9 readiness
Beware of any tutorials or documentation showing before/after comparisons with Drupal 7 code from before Drupal 8 was released. Drupal APIs continued to change up until it was released, though many of these older tutorials are still accurate. We recommend spending some time learning current best practices so that when you encounter specific solutions you'll have a better chance to correctly gauge their accuracy.
Drupal check, and Drupal rector, are two useful command line tools you can use to help jump start the process of updating your Drupal 8 code to ensure it's compatible with Drupal 9. This post includes some notes about the process I went through while testing them out on some of the Drupalize.Me code base.