[This question was originally asked on Stack Overflow, but recommended to move the question here.]I can't find anything quite like the question I'm about to ask, so please forgive me if there's something just like it already, please feel free to point me in the right direction. It'll take a bit of background explaining too, please forgive me for that.[backstory]Basically, I graduated from University about 18 months ago with a degree in Business Information Systems and Japanese. The Japanese took up half of the degree so the BIS was only joint. I only learned PHP in terms of languages and basically no computing theory - everything was vocational (Networking, programming basics, CMS development, Office and VBA and then loads of Business theory courses).Since this, I decided to teach myself C# and ASP.Net and try to get a position as a programmer. I created an online shop style website and a small CRM application in Windows Forms to both teach myself and build a portfolio, and luckily I managed to snag a developer position.Bad side? I'm the only developer at my company. Now don't get me wrong, in the last year I've learned loads and loads, I did some devpt. before Uni so knew the basics anyway, but it was very much a learning from books job - every night.Now then... I am now at a point where I'm building software on a regular basis, making good judgements for time scales, and have even been told my code and methodology are good by other professionals that have been in the game longer than me, and they have offered me jobs.[/backstory]What this whole thing boils down to, is that I now want to study up on the topics I'll have missed by not doing CS. More importantly, could you recommend books / free online courses? I want to learn about Computer Science theory, not just better coding.Thank you!
What should I study to 'learn' Comp Sci?
education
The key here is to try to absorb the concepts, rather than the specifics. For example, rather than learning Java, learn about the Virtual Machine that it brings to the table and how that differs from, e.g. the C# CLR.The kind of topics you want to cover are (in no particular order):Algorithms. How does Bubble Sort compare with QuickSort (QS not always fastest), what is a binary search, etc.Compilers. All modern programming languages have some concept of being compiled from source to bytecode or machine code. It helps to understand how to write efficient code if you know the pain the compiler goes through. Some processor architecture theory may help your understanding - see the Andrew Tanenbaum book.Scale. There are some differences between programming for e.g. a supercomputer versus a phone, even though they may both run the same OS. Find out the differences and challenges, for example, why/behaviour when malloc() fails.Concurrency. With multiple cores, desktop PCs can now actually be running different pieces of code simultaneously. This causes all sorts of issues - locking, race conditions, starvation, etc. Debugging. Get good with tools or instrumenting code to work out how best to fix stuff when it goes wrong, particularly when it's live and you can't reboot/restartDatabases. It doesn't matter which database, but an understanding of database organisation and how they work helps. The introductory chapters to most Database books give a good overview - pages, rows, locking, optimism, indices, execution plans, etc.SDLC. Learn the Requirements > Specifications > Design > Code > Build > Test > Commit > QA > Deploy > Maintain lifecycle, regardless of actual project methodology. Methodologies. Look at traditional BUFD, Waterfall, Agile, Scrum, XP, etc.Tools. Other than an editor and compiler, there are lots of tools used in SE practices, from code generators to static analysis.Functional vs Procedural. More and more functional programming constructs are making their way into procedural languages lately - with good reason. Go find out why Lisp/Prolog/Haskell are still in use and how things like F# are taking the concepts forward.There are a ton of resources out there - MSDN's Channel 9, Yahoo!/Google videos, YouTube, VideoJug, etc. If you want to actually keep up with a Comp Sci person, then take a look at any university's course prospectus, to get an idea for what topics they cover in their CS course. Personally, I'd pay more attention to the Software Engineering courses than Computer Science as you have a history of programming but perhaps don't need to learn micro electronics to understand them (in the UK, CS = programming + hardware, SE = programming + theory).