Can you study software engineering by yourself?
Sep 21, 2014
Originally posted on Quora
Yes and for your benefit I've completely laid out an outline of how to do it below
I absolutely believe that studying Computer Science on your own is something anyone is capable of.
While I don't believe it is easy by any standards, I believe it is achievable. The first steps always tend to be the hardest but if you are willing and determined I believe that once you get over the first hump of learning the programming fundamentals you will be able to learn a lot on your own. I mean practically all needed higher educational course material is available online for free. All you have to do is know what to look for.
Note: While I believe this is very possible on your own, I would recommend trying to find at least one other person to learn with. This can be very helpful because you'll have someone to help keep you motivated and bounce idea's off of. If one of you gets ahead, have the other teach. This is also a great learning exercise. If you can teach it well and simply that means you have a pretty firm grasp on the concept. If you find it hard to explain in simple terms you probably don't know the material well enough.*
You can even go to almost an esteemed college's webpage, find their requirements for completing their Computer Science degree, and then look for equivalent free online courses at places like Coursera, Codeademy, MIT OpenCourseware, Khan Academy, edX, Stanford Online, Treehouse, or Lynda (although the last two cost money), etc. Believe it or not you can even get these things online called books. Reading these stone age things will be very beneficial to you as well.
I am writing this answer because I thought I would try and and do the hard part for you! Below is a list of all you have to do to simply get started.
1. Google search for any esteemed college's Computer Science Undergraduate Requirements curriculum
2. Break down what need to learn from their page
3. Find free sources to learn from online that match those requirements
5. Repeat #3 and #4 continuously
You know what I'm feeling generous. I'm going show you exactly where to start. I took the liberty of looking up the a couple university CS requirement pages online:
- B.S. in Computer Science - Carnegie Mellon.
- B.S. in Computer Science - Berkeley
- B.S. in Computer Science - UCLA
- B.S. in Computer Science - MIT
- B.S. in Computer Science - UNC
These were just a few I was able to find within two minutes. Lets look take a look at all the requirements now.
Below is a listing of many computer science courses that are considered fundamental to acquiring a degree.
Foundations of Programming and Software Construction – Topics range from debugging, testing, test-case generation, state machines, abstract data types, design patterns, object-oriented programming fundamentals, concurrency, parsing, threads, etc. These are all advanced topics. A lot of the links above go over these fundamentals. The key is to always be coding! Constantly code more and more to wrap your head around these topics. Look for more online problems or questions that you can try and build. Remember that frustration is extremely common and expected at this stage. You can do it though! It's important to note that these two first sections will take a lot more time than you probably think and the important thing is to just keep on trucking! Structure and Interpretation of Computer Programs is the MIT course that follows the intro MIT course listed above. A lot of the links above extend into this area. Introduction to Programming in Java is another MIT course emphasizing Java instead of Python.
Note: Alright by now you should have the basics of programming down. You should probably look into proper code documentation/commenting, version control, and best practices right now if you haven't done so already. A tip I would provide is maybe search for a good company's code style guide. This is a standard that a lot of companies code has to abide by for clarity and readability. I would look at a big company's style guide, Google has theirs up for view online. Google Java Style,Google Python Style. This all includes rules for indentation, line length, declarations, formatting, etc. Try and have a consistent style by now.
Computer Organization – Basic topics on how everything works at a lower level (Lower level is not pejorative it simply means it's closer to the hardware) . From learning about registers, transistors, gates, circuits, assembly language coding, pipelining, arithmetic, I/O, memory hierarchies, etc. Computation Structures from MIT, is a good overall source. Computer Organization and Design, is a decent book. You don't have to go super in depth into this course if you don't want to, it's just nice to have a good idea how the organization of your machine is put together.
Algorithms and Data Structures – Extremely important software engineering courses. These tend to be the subject of what a lot of interviewers will ask questions about. You must learn everything from linked lists, stacks, queues, sorting, trees, graphs, etc. Learn these inside and out and go code. Algorithms at Khan Academy, is a great source and Khan partnered with the brilliant Tom Cormen and Devin Balkcom. You should get the CLRS Introduction to Algorithms book to read as you work through the Khan course. It will probably be the only algorithms book you will ever need. Introduction to Algorithms at MIT for a full course, and then you could follow up with this Design and Analysis of Algorithms course. HackerRank is a great place to see where you're at with all of these skills. You should use HackerRank as soon as you've started understanding most advanced algorithms.
Congrats once you've reached this point in the list, with a expert comprehension of all the above fields, you are now likely to be eligible for a job. This doesn't mean that if you understand all the above topics you'll get a job, it means that you know all these topics like the back of your hand then you can go and build entire applications from the ground up at this point. You still have to learn a lot more on your own in order to get something you probably want but at this point you should be in a pretty good position. If you've reached this point and not experimented with Version Control you have made a mistake. Go out right now and make a github account. Push all your best code onto your account then when you're done, program even more projects. Remember your ABC's (Always Be Coding). You should be able to create scalable applications that you can push at this point. Go out and build something! It can be anything. It doesn't even have to be something that anyone uses. It's only for you. I would actually recommend simply looking over this entire MIT electrical Engineering and Computer Science page at this point. It lists a lot of courses that you can focus on an attempt to tackle on your own. I've taken the liberty of adding some subjects for you to focus on below.
Operating Systems – This is a great course that builds on top of Computer Organization. You'll go one level up to the kernel and learn all about resource management and process synchronization. This is very intense stuff and you should learn the C language in order to fully understand how a program works within the kernel. Operating System Engineering MIT course. Semphores will give you a headache, but if you can implement a basic producer/consumer system in an interview your interviewer will be extremely impressed.
Compilers – Once you have taken this course and all the courses listed above. There should be very few blind spots in computer science for you now. By reaching this point you should know most of what there is to know about the entire makeup of computer science. You should be able to get a job now and all the courses I've listed below are more or less supplements to your overall knowledge as a programmer. Coursera usually offers a compiler course. I would recommend finding a good book as well that corresponds to what you would want to build a compiler in. Computer Language Engineerinat MIT.
Networking – This focuses on explaining how the Internet works, ranging from how bits are modulated on wires and in wireless to application-level protocols like HTTP. It'll explain the principles of how to design networks and network protocols. MIT course for Networking.
Databases – Basic database foundations. SQL is a good place to start. Coursera has a good on demand course for this as well at the time of this writing.
Engineering Lab – This is a course offered at a lot of universities. However you'll get the same from building actual applications yourself from scratch as you'll get from taking a course like this. Laboratory in Software Engineering is the MIT course for Java development.
Programming Languages – This teaches the principles of functional, imperative, and logic programming languages. Topics involve meta-circular interpreters, semantics (operational and denotational), type systems (polymorphism, inference, and abstract types), object oriented programming, modules, and multiprocessing Programming Languages at MIT.
Artificial Intelligence – Robots will kill us all one day! Artificial Intelligence.
Graphics – How to process and create images. Topics include transformations, lighting, and raytracing Computer Graphics.
Cryptography – Cyphers, key exchanges, encryption, secure computation, public key protocols, etc. Cryptography and Cryptanalysis
Mobile Development – This is an excellent tool to have in your toolkit. Android and iOS are basically your only options. Android is easier to get started since it's in Java and you don't need a Mac. iOS however has an excellent community and Swift is probably the most beautiful language I've ever seen. Lynda, has great tutorials for both but it costs a small monthly fee. You can also find many free lessons online but I have not been able to find many that stand out as excellent material to help get you started. I recommend using their free trial period and then learning as much as you can within that period in order to get the skills you need to continue on your own.
I'm sure I'll edit more courses in here on another day.
All the math based requirements for practically any higher level institution will require these courses below. While you may not want a profession that is very math heavy, it is important to take these courses. Taking these courses teaches you how to actually think efficiently. Lessons for practically all of these math courses can be found at Khan Academy or MIT Open Courseware. I've also taken the time to order these in the order of importance in a general sense.
Multivariable Calculus – This is upper level calculus. Pre-Requisites to this level are algebra, trigonometry, geometry, and lower levels of calculus. Calculus: Early Transcendentals: James Stewart
Discrete – This, in my opinion, is the an excellent mathematical discipline for any computer scientist to know. The Concrete Mathematics book by Knuth is a great supplement. This course probably takes the highest priority than all the other mathematics courses on this list. Mathematics for Computer Science is an MIT course.
Probability – Basically statistics on steroids. This is a very important course if you're thinking about getting into Data Science. I would use Khan Academy and this book.
Differential Equations – I've seen this course be considered as optional for many top level universities. But it is still a good course to take. Once again just check Khan and MIT.
These are some good general education courses that I believe can indirectly help you in life and in computer science. They are not really needed to learn computer science, but having some basic knowledge of these fields can keep you cultured with a well rounded education.
- Oral Communication – Believe it or not you actually have to be able to communicate to your colleagues. You can be an amazing programmer, but if you are not capable of getting along with people your surrounded by everyday a lot of people will not hire you.
- Anything you've always been interested in
That's it! If you take the above points, go out, and actually apply yourself, you'll be capable of learning computer science. Good luck!
Note: I am by no means saying that earning a degree is a bad thing. I am actually a student right now and while I know I would be able to complete my education on my own, college is a driving and supporting environment that helps me. A degree is also standing proof that you at least have a small amount of knowledge of computer science. This opens the door to a lot of places then if you didn't have a degree.
Also learning on your own can be a very difficult thing for most people. Many people need college for the environment to help drive them to be successful. So can you learn computer science on your own? Yes, absolutely but that doesn't mean it is going to be easy.
Final list of my favorite resources:Go back to home