In 2017 I started out using Truffle, but found that I prefer the hands-on nature of using solc directly. Honestly I haven't really kept up with Truffle developments, but back then the "migrations" approach was more a hindrance to most of what I wanted to do than a genuine help.
Stuff where it would have been extremely useful (like deploying a swarm of interdependent contracts), we ran into the obstacles of severe lack of in-depth documentation, and the migration utility straight out refusing to do what we tried to make it do. :)
For about six months in 2018, we used a modified docker container of the Parity client, in single-node PoA mode. Back then Parity had a built-in gui, it was absolute heaven for dev testing. Then the whole thing broke on multiple fronts. :)
Honestly, I think I'll be going back to a node repl connected to the RPC port. Back then we used web3, now I think I'll whip up an ethers.js flavor. :P It would have been nice to have a GUI.