I Appreaciate that Upgrade gnereally is a standard process however the 2018 version is different than the others prior.
What are the key points to cover a 2015 upgrade to 2018. Should I focus on try to move code to Extensions or more to event / Subscriber model ? Has someone a brief guide and experience ?
From my experience, and having a few heavily customized solutions out there, I would still do it the "smooth" way.
If you have modified standard table triggers, try to move your code to the beginning or the end of that trigger.This allows you to move the code to event subscribers.Keep your code with your fields and controls (I removed almost all code from there when Extensions v1 came out, it turns out to become a nightmare to move all code to codenits, especially when you have to buy them). This way you will have the chance to "transform" your customizations into an extension v2.
Try to get rid of all code modifications in all procedures in all standard objects (as far as possible) and move that code to subscribers in your own codeunits.The less modified code you have at the end, the better.
After this, try to identify customizations which are "granular", meaning that you identify all fields controls and business logic which solves a specific problem or enables a specific functionality.
When you identify such a granular customization, make a small extension from it and remove the code from the C/Side environment.You also need some code which moves the fields and tables from the customization to the extension.Remove the code from standard, install that extension and the accompanied data conversion routines and go on to the next granule.
This way you will clean up your solutions one by one, and it gives you the chance to reuse these "granules" easily with other customers.