Pros
The software process adds a lot of rigor. Most changes require pre-merge and post-merge verification - often on real hardware with simulations in the loop if applicable - and verification steps have to be approved by at least one other person, not just the code itself. Very interdisciplinary - on the software team you may be working with the battery team one day, and working the avionics hardware team and guidance navigation and control (GNC) another. I've learned so much about how spacecraft actually get built and tested by working with the other groups. Everyone is also happy to really explain how their system actually works so you can build a picture of what your code is going to do during tests or flight. Super fast-paced and intellectually honest environment in my division. Everyone on every team is encouraged to question requirements, designs, and test coverage right up until launch, and I've always seen my and other's concerns taken seriously and actually acted upon. Work flexibility - my manager has never minded me working from home or taking time off, even with very short notice. I've never felt pressured to work longer hours than I was working of my own accord. The feeling of seeing a system you helped develop/test work successfully in space.
Cons
In flight software at least on the vehicles I work on, it can often be hard to test your code because our CI system is custom and breaks relatively frequently. When standing up new hardware-in-the-loop testbeds, the testbeds often have issues themselves too, which can cause further difficulties. Work hours can be long, especially before big tests or a launch. I don't find this too bad personally, but I am pretty young and my last job was a much more intense/unhealthy work environment than SpaceX, so I'm probably an outlier in terms of feelings about the work hours.