I think some of those should be mandatory for CS programs. From my own experience:
writing: it makes a huge difference to me if some open-source project I'm supposed to be using has good documentation or not, and there are a lot that don't. Poorly written specifications are also a huge waste of everyone's time. Of course you need the right kind of writing class to make a difference here.
Linear algebra: there are different ways to teach this; the prove-stuff-from-first-principles approach which I agree is more suited to mathematicians, and the here's how you use matrices for real stuff which I used a lot in my last job. The moment graphics become involved, it's a big topic.
Prob/stat: this really depends what field you're in but for machine learning it's essential, and that's quite hot right now. I mean this in the sense of understanding what's going on and being able to interpret results, not in the sense of being able to copy a tensorflow command from stack exchange.
public speaking: if you want to rise in the organisation, or just get your ideas heard at team meetings, then it's not a complete waste of time. There are lots of more important factors, but being able to get a point across well is a small factor in your favour.
discrete mathematics: there's only a little bit of this that you'll actually need, but I got from lowly intern into proper projects at one company because I fixed a bug that had been causing random weirdness for ages at the company and it turns out someone implemented Java .equals() in a non-transitive way for one domain class and that was messing with the ORM.
The problem with a lot of universities is they want to teach CS in a way that turns out CS researchers (or at least grad students), which is an overlapping but not the same skill set as good developers.