Both Java and C++ are still widely used (but of course they both matured in the meantime). As many others pointed out in this thread, it's true you don't need a degree to learn how to program, but let's not exaggerate that a degree is completely useless. Learning about state machines, operating systems, and NP problems is totally useful, and self-taught programmers usually skip these topics.
I completely disagree with this. I've hired several developers with a college education and little to no work experience, they knew NOTHING when put in front of a real system. They didn't even know how to approach it, how to understand existing codebase (one of if not the biggest skills you need as a developer), how to add to it. I or others had to hold their hand for the first year or so while they learn how to actually apply skills.
On the other hand, folks with work experience can come in and go. They know how to get started on an existing codebase (which is never documented, if you have a ticket like "Add a checkbox to X form that performs Y operation when checked", you need to be able to take a codebase and find out where that goes. That can't be taught.
Beyond that, I find people who learned on their own are actually much more involved in their own learning. They are the ones that stay up on new technology coming out, probably have their own open source projects that they do, etc.
Everyone needs to know what a state machine is... It's very simple, but it's not a physical machine. It's a design paradigm: you break up a job into a series of discreet steps and you use a "step" or "status" field to move it along. This allows you to isolate failure and recovery to a single step versus the full gambit, or for example if a mount was hung failing jobs you can fix the mount and then set all those jobs back to the status whose handler used said mount. I work with people today with 4 year degrees who don't know what a state machine is... sad.
Operating systems -- generally people who are teaching themselves are already going to be on Linux and teaching themselves how it works. I feel like people who only do college for their pre-job training are more likely to use windows or mac and not really know what's going on behind the scenes.
I've never in my life needed to use any knowledge of NP or P=NP or anything like that. I'm not sure what you mean by that but it's not clear to me.
I mean fuck, I was already working professionally for years by the time I went to college. I already knew all the shit, I would get marked down because the TA's didn't understand shit like pointer math. I used to write my programs, then put bugs in them and sell the buggy versions to girls on my floor. They would get higher grades than I would... total bullshit. I don't want to go into my college experience too much because :powerlevel::powerlevel::powerlevel: but my professional experience is that a CS degree is fairly useless. I could consider a 4 year degree equivalent to 1 year experience on a resume... As someone self-taught's first job you're taking a risk that they know anything at all, unless they have code samples. If they've held at least 1 job for more than a few months you know they actually know their shit. A college graduate though, their first gig is going to be basically teaching them how to program. It's not taught by people who know what they are doing (they wouldn't be teaching it if they knew it well) and not in any way that translates to real-world work. I mean for fucks sake, my CS 203(?) course I believe it was, we were learning for loops in C. So literally we had a program on the projector:
int main(int argc, char* argv[])
{
int numbottles;
for(numbottles = 100; numbottles > 0; numbottles--)
{
printf("%d bottles of beer on the wall, %d bottles of beer. Take one down, pass it around, %d bottles of beer on the wall.\n", numbottles, numbottles, numbottles - 1);
if ( numbottles % 6 == 0)
{
puts("Fizz");
}
else if ( numbottles % 20 == 0 && numbottles % 4 == 0 )
{
puts("Buzz");
}
else
{
puts("Fizz-Buzz");
}
}
return 0;
}
And we spent the entire class not watching this program execute, but singing the song as a class. That's right, we sang the full "100 bottles of beer on the wall" with an extra fizz/buzz portion we would yell out after. And then laugh because it was so zany LOLOLOL who knew computer science could be so fun???? That's what the lady teaching it thought at least.
Anyway, enough :deviant:
I also hear a lot of people talk about knowing how to sort or do math to program... that's not true. All that stuff is already implemented better than you could ever implement it (been going on 30-40 years of eyes optimizing it). You may have a domain problem that you need to use math, like one product I worked on included a huge graphing and statistical analysis portion, I had to copy equations in there and know basic algebra in order to split them up into lines and loops (for series). I've done weight-and-balance work where I needed to calculate a large vehicle's fuel and weight (the more fuel it has the heavier it is and the less gas mileage, so it changes) but it's not like I'm deriving any new formulas. Matrix math would help to understand when doing video encoding/decoding, again it's all domain specific but a short primer is enough to get up to speed on it, you don't need several years of courses. And I've had to learn and forget hundreds of formulas working with scientists on various research, testing, and modeling things. I don't have to solve them, I just need to be able to break the formula down, i.e. understand order of operations and call the math functions.
And don't tell me "if you knew the math you'd be better at it" or whatever. I know all the calculuses, linear algebras, discreet math and structures, all that shit. discreet structures and logic is the closest to anything I've had to directly use (because it goes over binary logic operators OR, AND, XOR, NOT, etc. but I knew that years before I took that course.)