I totally missed this thread, and having reread the other one and finally read this one, I think I should respond.
Word wrote:Since a few friends of mine study computer science, I wonder if one can become just as good at programming without studying it at university or a similar institution*, given that one invests about the same amount of time and effort, but only uses internet resources?
As far as "only uses Internet resources", I'm saying "no". I don't think studying at a university is required, but as sinewav pointed out, you have to spend time with other programmers at some point and just talk shop. The more often you do it, the better you get. Also, there are numerous articles out there (internet and print) and books and stuff that are probably worth more than you'll get from a university course, but you'll have to read, understand, and remember the content in a way that's more difficult than just taking a class.
Personally, I'm not truly self-taught at anything. I took a grand total of 6.5 years of music in public schools starting back in the fourth grade. I had learned to sing and to play the clarinet from teachers before I ever touched guitar. Likewise, as much as I was self-taught as a programmer starting around age 8 or so, I took a semester-long BASIC class when I quit the high school band that straightened up and shored up everything I'd learned. I followed that up with a year of Pascal. I haven't taken a programming class since then, but I would be lying if I said I never had any formal training.
So, if you have a semester to burn taking a basic skills programming class (preferably one using Python), it would be time well-spent. You'll get quite the jump off.
Conversely, my older son (16) has been learning programming through a combination of hands-on at-school activities, personal interest activities, and his old dad teaching him stuff. He's not taking any formal training but is still getting actual training.
What kind of knowledge substantially improves your general programming skills (Lucifer suggested algebra would do that, but is there a lot of other stuff?)?
Literally everything you learn.
More seriously, anything that involves breaking something down into parts and understanding the parts will be really helpful. For example, becoming a mechanic did a lot for me in terms of how to put programs together. But there's so much to programming, it really is something of an art form. A unique sort of art, similar to engineering (hence the job title "Software Engineer"), but an art nonetheless. So, like with any art form, studying other art forms will help you. Your archaeological experience will help you. Applying the scientific method is crucial to problem-solving in general. Studying music theory will help you. Anytime you get down to the nuts and bolts of a topic, device, machine, etc, you learn something that helps you become a better programmer.
Most of what you learn is how other people solved the problems they had, or in the case of studying the arts, how other people put together their message using the same tools you have available to you.
Troubleshooting anything, including a computer program, involves a certain amount of forensic-type thinking. You have to reconstruct what the program was doing at certain points in order to figure out why it behaved as it did, or crashed, or whatever happened that you're troubleshooting. So, your work in archaeology will directly apply in terms of mindset while troubleshooting.
Do you have to know how all the technical components of a computer work, or are some of them more "important" than others (since I'm not really interested in tweaking technical features of a PC, just making use of them - though I can see that a computer perhaps doesn't care about that difference)?
Lots of programmers don't know any of that crap. That's why they call the IT department to fix their computers just like anybody else in the company does. And I'm willing to venture that the vast majority of code written wouldn't be improved by having knowledge of how computers work.
Games, however, are fundamentally different from the vast majority of code that gets written. You do need to know how the monitor renders, how the video card functions, why video card memory matters, how the sound card produces sound (even to the point of knowing how speakers, microphones, and amplifiers work), etc. When you get to where you're optimizing code, knowing how the CPU caches work tells you what you need to know to break your code down into bits where the CPU can use it's cache-only cycles to work on your game. (Yes, I can explain that, if you need it, but it's outside the scope of this post

)
In multimedia work, you need to know how movies are made, how they become digital, how video codecs work, as well as all the aforementioned sound stuff.
I think sinewav provided the best possible example of why you need to know this stuff in his app. So he's not the most experienced coder (or at least, wasn't when he started on that app), but he knew the problems that he needed to solve and had enough knowledge of how the hardware worked as well as how sound and music work that he knew what he needed to do to make the app. The programming part was just figuring out how to tell the computer what to do with all of that information in his head.
*I asked one of these friends already and he was like "of course, EVERYTHING we learn is important and greatly helps our programming skills, and we learn all the foundations!" but I like to think they're mostly justifying that they get a college degree for something they could probably just as well teach themselves at home, if they wanted to...(I also read Lucifer's reply in that thread, but wasn't sure in how far it was meant tongue-in-cheek)
I was both completely serious and completely tongue-in-cheek.