Classes that require code to be executed during the startup of the extension must implement IExtensionActivationService
Object management
Timers/Timeouts
All timers/timeouts (setTimeout/setInterval) must be cleared in the dispose method of the class
This ensure we do not have any dangling timeouts preventing the process from gracefully exiting.
Async Methods
Async must be awaited where possible.
If awaiting on async methods is not required or not possible always use ignoreErrors to ensure we do not leave any dangling promises (i.e. promises where we do not handle exceptions).
Note: Not doing so could (in a future version of Node.js) crash the entire process.
Miscellaneous
Write code to be testable
Localization
All messages displayed to the user must be localized.