I'm somewhat "self-taught". I majored in straightforward "pure" math, with emphasis on real analysis and abstract algebra, but I did take graph theory, numerical analysis, and so forth - and the professors did include a lab component that involved writing substantial amounts of code... so I'm not completely self-taught.
That said, I feel that there is a gap because I didn't major in CS.
Although I had to read a textbook on Data Structures and Algorithms on my own, I don't feel like this is a particularly glaring gap. Interestingly, my math coursework did cover a lot of the stuff at the end of the algorithms book, since I'd taken graph theory, linear and non-linear optimization, numerical analysis. But I had to learn the basic data structures (trees, hashes, lists) on my own. While it took some work to learn this, it came naturally enough, because I consider data structures and algorithms to be very similar to math. You could study this stuff without a computer and get a decent understanding of it.
The big gap in my knowledge is more around compilers, operating systems, and that elusive border between software and hardware. I never took compiler design, and I think that languages are still a dark art to me because of it. I think I also would have benefitted from doing some very low level programming (when I was in college, "C" was still considered a "high level" language, but at least I had to struggle with memory management). Also, a lot of data structures that are optimized to interact with memory or hardware are still pretty much a mystery to me. Obviously, without this knowledge, my understanding of operating systems is going to be pretty limited.
Right on the same page with you. Mathematician by training, programmer by youthful joy of building games and ELIZAs in QBasic, with some MATLAB/Python in college. Lucky both things caught my interest when they did, it's made breaking into Machine Learning awfully accessible as a post-university career.
That said, I feel that there is a gap because I didn't major in CS.
Although I had to read a textbook on Data Structures and Algorithms on my own, I don't feel like this is a particularly glaring gap. Interestingly, my math coursework did cover a lot of the stuff at the end of the algorithms book, since I'd taken graph theory, linear and non-linear optimization, numerical analysis. But I had to learn the basic data structures (trees, hashes, lists) on my own. While it took some work to learn this, it came naturally enough, because I consider data structures and algorithms to be very similar to math. You could study this stuff without a computer and get a decent understanding of it.
The big gap in my knowledge is more around compilers, operating systems, and that elusive border between software and hardware. I never took compiler design, and I think that languages are still a dark art to me because of it. I think I also would have benefitted from doing some very low level programming (when I was in college, "C" was still considered a "high level" language, but at least I had to struggle with memory management). Also, a lot of data structures that are optimized to interact with memory or hardware are still pretty much a mystery to me. Obviously, without this knowledge, my understanding of operating systems is going to be pretty limited.