I've made a pretty good living as a self-taught programmer, but when I find that I discuss some low-level fundamental topics with my peers who have a CS degree, holes appear in my knowledge. I'm a big picture (architecture) guy, so for a long time this hasn't bothered me, but lately I've wondered if there is an approach I can take that will help me learn these fundamentals without going back to school? Are there books, websites or videos that you can recommend that would give me a ground-up perspective as opposed to a learn it as you need it mentality?
This ought to keep you busy for a couple of weeks:
Course # Course Title 6.00SC Introduction to Computer Science and Programming (Spring 2011) Undergraduate 6.00 Introduction to Computer Science and Programming (Fall 2008) 6.01SC Introduction to Electrical Engineering and Computer Science I 6.001 Structure and Interpretation of Computer Programs 6.002 Circuits and Electronics 6.003 Signals and Systems 6.004 Computation Structures 6.005 Elements of Software Construction (Fall 2011) 6.005 Elements of Software Construction (Fall 2008) 6.006 Introduction to Algorithms (Fall 2011) 6.006 Introduction to Algorithms (Spring 2008) 6.007 Electromagnetic Energy: From Motors to Lasers 6.011 Introduction to Communication, Control, and Signal Processing (Spring 2010) 6.011 Introduction to Communication, Control, and Signal Processing (Spring 2004) 6.012 Microelectronic Devices and Circuits (Spring 2009) 6.012 Microelectronic Devices and Circuits (Fall 2009) 6.012 Microelectronic Devices and Circuits (Fall 2005) 6.013 Electromagnetics and Applications (Spring 2009) 6.013 Electromagnetics and Applications (Fall 2005) 6.021J Quantitative Physiology: Cells and Tissues (Fall 2004) 6.022J Quantitative Physiology: Organ Transport Systems 6.023J Fields, Forces and Flows in Biological Systems 6.024J Molecular, Cellular, and Tissue Biomechanics 6.025J Introduction to Bioengineering (BE.010J) 6.033 Computer System Engineering 6.034 Artificial Intelligence (Fall 2010) 6.034 Artificial Intelligence (Spring 2005) 6.035 Computer Language Engineering 6.035 Computer Language Engineering (SMA 5502) 6.041 Probabilistic Systems Analysis and Applied Probability (Fall 2010) 6.041 Probabilistic Systems Analysis and Applied Probability (Spring 2006) 6.042J Mathematics for Computer Science (Spring 2010) 6.042J Mathematics for Computer Science (Fall 2010) 6.042J Mathematics for Computer Science (Spring 2005) 6.042J Mathematics for Computer Science (Fall 2005) 6.045J Automata, Computability, and Complexity 6.046J Introduction to Algorithms (SMA 5503) 6.047 Computational Biology: Genomes, Networks, Evolution (Fall 2008) 6.050J Information and Entropy 6.055J The Art of Approximation in Science and Engineering 6.061 Introduction to Electric Power Systems (Spring 2011) 6.071J Introduction to Electronics, Signals, and Measurement 6.079 Introduction to Convex Optimization (Fall 2009) 6.07J Projects in Microscale Engineering for the Life Sciences 6.080 Great Ideas in Theoretical Computer Science (Spring 2008) 6.087 Practical Programming in C 6.088 Introduction to C Memory Management and C++ Object-Oriented Programming 6.089 Great Ideas in Theoretical Computer Science (Spring 2008) 6.090 Building Programming Experience: A Lead-In to 6.001 6.091 Hands-On Introduction to Electrical Engineering Lab Skills 6.092 Introduction to Programming in Java 6.092 Java Preparation for 6.170 6.092 Bioinformatics and Proteomics 6.094 Introduction to MATLAB 6.096 Introduction to C++ 6.096 Algorithms for Computational Biology 6.097 Fundamentals of Photonics: Quantum Electronics (Spring 2006) 6.099 Street-Fighting Mathematics 6.101 Introductory Analog Electronics Laboratory 6.111 Introductory Digital Systems Laboratory (Spring 2006) 6.111 Introductory Digital Systems Laboratory (Fall 2002) 6.152J Micro/Nano Processing Technology 6.161 Modern Optics Project Laboratory (Fall 2005) 6.163 Strobe Project Laboratory 6.170 Laboratory in Software Engineering 6.171 Software Engineering for Web Applications 6.172 Performance Engineering of Software Systems 6.186 Mobile Autonomous Systems Laboratory 6.189 A Gentle Introduction to Programming Using Python (January IAP 2011) 6.189 A Gentle Introduction to Programming Using Python (January IAP 2008) 6.189 Multicore Programming Primer 6.207J Networks 6.270 Autonomous Robot Design Competition 6.338J Parallel Computing 6.370 Robocraft Programming Competition 6.431 Probabilistic Systems Analysis and Applied Probability (Fall 2010) 6.521J Quantitative Physiology: Cells and Tissues (Fall 2004) 6.637 Modern Optics Project Laboratory (Fall 2005) 6.701 Introduction to Nanoelectronics (Spring 2010) 6.801 Machine Vision (Fall 2004) 6.803 The Human Intelligence Enterprise (Spring 2006) 6.803 The Human Intelligence Enterprise (Spring 2002) 6.804J Computational Cognitive Science 6.805 Ethics and the Law on the Electronic Frontier (Fall 2005) 6.806 Ethics and the Law on the Electronic Frontier (Fall 2005) 6.813 User Interface Design and Implementation (Spring 2011) 6.814 Database Systems (Fall 2010) 6.830 Database Systems (Fall 2010) 6.831 User Interface Design and Implementation (Spring 2011) 6.837 Computer Graphics 6.857 Network and Computer Security 6.901 Inventions and Patents 6.911 Transcribing Prosodic Structure of Spoken Utterances with ToBI 6.912 Introduction to Copyright Law 6.930 Management in Engineering 6.974 Fundamentals of Photonics: Quantum Electronics (Spring 2006) 6.976 NextLab I: Designing Mobile Technologies for the Next Billion Users 6.S096 Introduction to C and C++ 6.231 Dynamic Programming and Stochastic Control 6.241J Dynamic Systems and Control 6.243J Dynamics of Nonlinear Systems 6.245 Multivariable Control Systems 6.251J Introduction to Mathematical Programming 6.252J Nonlinear Programming (Spring 2004) 6.252J Nonlinear Programming (Spring 2003) 6.253 Convex Analysis and Optimization 6.254 Game Theory with Engineering Applications 6.255J Optimization Methods 6.262 Discrete Stochastic Processes 6.263J Data Communication Networks 6.264J Queues: Theory and Applications 6.281J Logistical and Transportation Planning Methods (Fall 2006) 6.281J Logistical and Transportation Planning Methods (Fall 2004) 6.301 Solid-State Circuits 6.302 Feedback Systems 6.331 Advanced Circuit Techniques 6.334 Power Electronics 6.336J Introduction to Numerical Simulation (SMA 5211) 6.337J Introduction to Numerical Methods 6.339J Numerical Methods for Partial Differential Equations (SMA 5212) 6.341 Discrete-Time Signal Processing 6.345 Automatic Speech Recognition 6.374 Analysis and Design of Digital Integrated Circuits 6.431 Probabilistic Systems Analysis and Applied Probability (Spring 2006) 6.432 Stochastic Processes, Detection, and Estimation 6.435 System Identification 6.436J Fundamentals of Probability 6.441 Information Theory 6.443J Quantum Information Science 6.450 Principles of Digital Communication I 6.450 Principles of Digital Communications I 6.451 Principles of Digital Communication II 6.452 Principles of Wireless Communications 6.453 Quantum Optical Communication 6.524J Molecular, Cellular and Tissue Biomechanics (BE.410J) 6.541J Speech Communication 6.542J Laboratory on the Physiology, Acoustics, and Perception of Speech 6.543J The Lexicon and Its Features 6.551J Acoustics of Speech and Hearing 6.555J Biomedical Signal and Image Processing 6.561J Fields, Forces, and Flows in Biological Systems (BE.430J) 6.581J Foundations of Algorithms and Computational Techniques in Systems Biology 6.630 Electromagnetics 6.632 Electromagnetic Wave Theory 6.635 Advanced Electromagnetism 6.637 Optical Signals, Devices, and Systems 6.641 Electromagnetic Fields, Forces, and Motion (Spring 2009) 6.641 Electromagnetic Fields, Forces, and Motion (Spring 2005) 6.642 Continuum Electromechanics 6.651J Introduction to Plasma Physics I (Fall 2006) 6.651J Introduction to Plasma Physics I (Fall 2003) 6.661 Receivers, Antennas, and Signals 6.685 Electric Machines 6.690 Introduction to Electric Power Systems (Spring 2011) 6.691 Seminar in Electric Power Systems 6.695 Engineering, Economics and Regulation of the Electric Power Sector (Spring 2010) 6.719 Introduction to Nanoelectronics (Spring 2010) 6.720J Integrated Microelectronic Devices 6.728 Applied Quantum and Statistical Physics 6.730 Physics for Solid-State Applications 6.763 Applied Superconductivity 6.772 Compound Semiconductor Devices 6.774 Physics of Microfabrication: Front End Processing 6.776 High Speed Communication Circuits 6.777J Design and Fabrication of Microelectromechanical Devices 6.780 Semiconductor Manufacturing 6.780J Control of Manufacturing Processes (SMA 6303) 6.781J Submicrometer and Nanometer Technology 6.821 Programming Languages 6.823 Computer System Architecture 6.824 Distributed Computer Systems Engineering 6.825 Techniques in Artificial Intelligence (SMA 5504) 6.826 Principles of Computer Systems 6.827 Multithreaded Parallelism: Languages and Compilers 6.828 Operating System Engineering 6.829 Computer Networks 6.832 Underactuated Robotics 6.833 The Human Intelligence Enterprise (Spring 2006) 6.833 The Human Intelligence Enterprise (Spring 2002) 6.834J Cognitive Robotics 6.838 Algorithms for Computer Animation 6.840J Theory of Computation 6.841J Advanced Complexity Theory 6.844 Computability Theory of and with Scheme 6.845 Quantum Complexity Theory 6.851 Advanced Data Structures 6.852J Distributed Algorithms 6.854J Advanced Algorithms (Fall 2008) 6.854J Advanced Algorithms (Fall 2005) 6.855J Network Optimization 6.856J Randomized Algorithms 6.859J Integer Programming and Combinatorial Optimization 6.863J Natural Language and the Computer Representation of Knowledge 6.864 Advanced Natural Language Processing 6.866 Machine Vision (Fall 2004) 6.867 Machine Learning 6.868J The Society of Mind 6.871 Knowledge-Based Applications Systems 6.872 Biomedical Computing 6.872J Medical Computing 6.873J Medical Decision Support (Fall 2005) 6.873J Medical Decision Support (Spring 2003) 6.874J Computational Functional Genomics 6.875 Cryptography and Cryptanalysis 6.876J Advanced Topics in Cryptography 6.877J Computational Evolutionary Biology (Fall 2005) 6.878 Computational Biology: Genomes, Networks, Evolution (Fall 2008) 6.881 Representation and Modeling for Image Analysis 6.883 Pervasive Human Centric Computing (SMA 5508) 6.883 Program Analysis 6.884 Complex Digital Systems 6.891 Computational Evolutionary Biology (Fall 2004) 6.892 Computational Models of Discourse 6.895 Essential Coding Theory 6.895 Theory of Parallel Systems (SMA 5509) 6.896 Theory of Parallel Hardware (SMA 5511) 6.897 Selected Topics in Cryptography 6.931 Development of Inventions and Creative Ideas 6.933J The Structure of Engineering Revolutions 6.938 Engineering Risk-Benefit Analysis 6.945 Adventures in Advanced Symbolic Programming 6.946J Classical Mechanics: A Computational Approach 6.971 Biomedical Devices Design Laboratory 6.972 Algebraic Techniques and Semidefinite Optimization 6.973 Communication System Design 6.973 Organic Optoelectronics 6.974 Engineering, Economics and Regulation of the Electric Power Sector (Spring 2010) 6.975 Introduction to Convex Optimization (Fall 2009) 6.976 High Speed Communication Circuits and Systems 6.977 Ultrafast Optics 6.977 Semiconductor Optoelectronics: Theory and Design 6.978J Communications and Information Policy 6.982J Teaching College-Level Science and Engineering (Fall 2012) 6.982J Teaching College-Level Science and Engineering (Spring 2009)
Since I learned a lot from books, I tend to think in terms of books.
There are a number of good books for learning about the basics of the craft of programming. At the top of the list, I'd put:
- Code Complete, 2nd Edn
It is largely language-agnostic, and it explains the why's and wherefore's very approachably, and covers a lot of ground in its pages.
I like a few other general books - my background gives me a strong Unix bias:
- The Practice of Programming
- The Art of UNIX Programming
Although Knuth's "The Art of Computer Programming" is in many ways excellent, it is also a daunting set of books to read.
You could usefully look at some of the books about algorithms - there are many.
After that, it depends on where your main areas of interest and professional duties lie. What is appropriate depends on where you need to specialize. You might want to look at "An Introduction to Database Systems" by C J Date, as a general background on relational databases.
Other possible contenders:
- Design Patterns
- Clean Code
In a somewhat different vein, "Software Fundamentals: The Collected Papers by David L Parnas" is an interesting read - but probably not at the top of your priority list.
If you just went through the Structure and Interpretation of Computer Programs book, and did the exercises, you'd have a pretty solid foundation.
Here is a list of the most famous online academic level learning portals (check computer science category) :
please note that courses there are thought by top world universities like MIT,Stanford,... and you can have a certificate for passing courses after entering real mid-term, final exams and for sure submit homeworks ;)
it might keep you busy for couple of years :)
For MIT OpenCourseWare edx might be the successor as MIT has many classes there !
In General there is a trend now from universities on giving high quality academic courses online for free or very low cost. check this wikipedia entry.
There are several books & topics I consider to be very good. There are a ton of others, but these will get you a long way towards a solid CS education. I've seen other books on these topics, and these - IMO - provide the depth needed for a thoughtful consideration of the matter, at a professional level.
Russel & Norvig's AI: A Modern Approach
Money & Harris's Digital Design.
Hopcroft & Ullman's Introduction to Automata Theory
Aho, Ullman, Sethi's Compilers, aka "The Dragon Book"
None of these books are nice friendly quick-digesting Apress or O'Reilly books. That is not their purpose. They don't really come with lots of code (exception is Digital Design, which is for sophmores, not seniors), but usually come with a fair amount of math. Difficulty of understanding goes up exponentially when moving into the deeper things.