
#32 overallEvergreen
Algorithms, Part II
Coursera
11 recommenders · 12 threads · recommended in 8 years, 2013–2026 · score 16.2
Algorithms, Part II is the second half of Princeton's Algorithms MOOC on Coursera, taught by Robert Sedgewick, covering graphs, shortest paths, maximum flow, and related algorithms with programming assignments. Commenters describe it as a free audit-able course.
Commenters call Sedgewick's Algorithms I/II courses top-notch and very useful for interview prep, praising the assignments and the instructor's clarity.
Algorithms & Data Structuresintermediatefreeinteractive MOOC#algorithms#graphs#data structures#sedgewick#coursera
Recommendations by year
20062026
I’ll sort of second this by saying that Sedgewick’s Algorithms I/II courses on Coursera are top-notch and completely free. He is a truly thoughtful educator.
Completing those courses was probably the most useful thing I did when prepping for interviews as part of a career change 6 years ago.
I would second the Coursera course(s), which is one of the best MOOCs I've ever taken (Algorithms 1 & 2 from Princeton).
Watch the videos, then read the relevant section of the text book, and don't miss the assignments which were fantastic ways to learn about the nuances of writing efficient algorithms and data structures.
If only every programming MOOC put that much effort into their autograders...
This is the third assignment in Princeton’s Algorithms II course on Coursera - highly recommended!
The Odersky Scala course was pretty cool. It gave me a basic understanding of monoids and monads that has stuck with me. Robert Sedgewick's courses were very good. Learned a lot about graphs.
My personal favourite is Sedgewick & Wayne's _Algorithms_.
https://algs4.cs.princeton.edu/home/
You can even find an excellent two-part MOOC on Coursera:
https://www.coursera.org/learn/algorithms-part1
https://www.coursera.org/learn/algorithms-part2
Maybe it's not the "purest" class or book, but it's engaging and it lets you understand how algos work AND how to use them in practice.
Seam carving is the second assignment of Algorithms Part II. I also highly recommend Princeton's Algorithms course on Coursera.
I did not run into any trouble with Sedgewick's course. His coding assignments are the most elegant and comprehensive I have seen which leave virtually no room for ambiguity. But they are challenging indeed.
The tests are your feedback. When a test fails you need to figure out why the test is failing and what's wrong with your code or if you understood the requirements incorrectly.
I absolutely enjoyed his courses and finished both of them with all the assignments. His assignments are not something you can knock out in an hour. It usually took me at least 3-4 hours to complete any assignment sometimes even more than that.
I also did Roughgarden's course and loved it. He is an awesome teacher. Both Sedgewick's and Roughgarden's courses are very good but they have different approaches. I found Roughgarden's coding assignment a lot easier than Sedgewick's.
Make use of the course forum. If something is not clear ask questions on the forum. Though I found that Sedgewick's requirements specification are very comprehensive and unambiguous. In fact while doing the course I wished software requirements on the job were anywhere close to that comprehensive in real life.
Focusing on a limited set of resources in a way that exercises your problem-solving skills would be the key. Here is one plan:
1) Select a category such as "stacks and queues" from the Cracking coding interview (CCI) book and read all the questions. This will give you a sense of the type of questions being asked.
2) Sign up for the algorithms 1 and 2 courses (https://www.coursera.org/learn/algorithms-part1, https://www.coursera.org/learn/algorithms-part2) in the audit mode(free). Pick the correct modules such as "stacks" and "queues" and watch all the videos.
3) Come back to the questions in the book CCI and try to solve the problems yourself. If you get stuck, look at the solutions for hints but still try to do them yourself.
4) Do the same for all major topics such as strings, linked lists, recursion etc.
Unfortunately, you are not going to remember all of you've learned. You need spaced-repetition so repeat the above method 2-3 times for each topic.
Once you have the foundation, you will be able to tackle the harder questions that you may find somewhere else or in the interview.
Or the newer book with Java code.
https://www.amazon.com/Algorithms-4th-Robert-Sedgewick/dp/03...
Robert Sedgewick also has fantastic algorithms courses on Coursera.
Agree. Sedgewick's book is great especially because of the implementation. I'd also highly recommend his lectures on Coursera - Algorithms Part I and II. He explains the working of algorithms with animation, which makes it really easy to understand the algorithms.
Take this with a grain of salt. There is no right way or the only way.
- Learn complete web development. Use something like CodeAcademy/Udacity to learn the complementary skills you need. My guess is since you know Html/css and Java, you are better off learning Javascript as well. Nodejs / advanced Java might be a good fit.
- Learn some of the theoretical fundamentals. This might not be of immediate need for freelancing, but you should almost always be honing your fundamentals. Take up the core computer science courses on Coursera - Algorithms (1,2), Programming Languages, Basic Math (linear algebra, graph theory etc) are some must haves. This can be a longer term goal and plan it beyond 6 months.
- Sharpen your skills with coding exercises. Do some of the stuff on InterviewStreet and other such sites. Being able to solve small problems effectively and time bound, is very important skills. You should practice hard for the first 6 months I think.
- Know your domain. Being a web freelancer means you might have to be full stack. Being able to write the client and server side with ease. You might want to be good at some specific domains - like building sites for X, Y, Z (you can build your own reusable code). Then expand. Looking at stuff at elance is an easy start.
Its doable in 6 months. IMO don't stop learning.
Coursera, no doubt. I took 2 courses with Tim Roughgarden; they were awesome. And I just finished 2 more with Sedgewick. If you can find the Sedgewick courses, I recommend picking up his book (actually, I recommend it anyway) - Algorithms, Sedgewick & Wayne, 3rd ed.
It's a good question, but has multiple components.
The first, and IMHO most important component of your question, is how to improve your actual written code. A few ideas:
~ Pair programming with an experienced programmer, if possible. If not, try to work on a project (even an open source one) with someone who is an experienced software developer and who does comprehensive code reviews. Code reviews from articulate, experienced developers are an excellent way to learn.
~ Write lots of code. Write code in new areas unrelated to your job. Try to find some small project or projects to do. Once you're done, reflect on what you've done and what you could do better next time.
~ Read books like Clean Code. It might also be wise to pick up a book on design patterns, particularly if you'll be working much in object-oriented languages like Java, C#, or C++.
~ Always read source code when possible. Using a new tool at work? If it's open source, go check out the code. Starting a new project? Go find similar projects on Github and browse the code. You could also find some well-known open source projects and read through their code. A good book for ideas on which open source projects to focus on is called The Architecure of Open Source Projects (there are two volumes, shown at the bottom of this page: http://aosabook.org/en/index.html)
~ Learn other programming paradigms, such as functional programming (maybe learn Haskell, or Scheme) or logic programming (learn Prolog). You may never use such languages in your work, but languages in other paradigms will provide you with both a better understanding of computation, and a bag full of useful techniques and ideas for your working language(s).
The next component is how to improve your understanding of data structures, algorithms, and other topics rooted in theoretical computer science.
~ Consider doing problems from sites like leetcode.com and hackerrank.com.
~ The book _Algorithms_ by Robert Sedgewick and Kevin Wayne is very good, as is their free two-part course algorithms and data structures offered on Coursera (https://www.coursera.org/learn/algorithms-part1).
~ Work all the way through the online book Structure and Interpretation of Computer Programs (https://mitpress.mit.edu/sites/default/files/sicp/full-text/...). It will not only touch on a number of important theoretical computer science topics, but you'll also get some good exposure to functional programming.
Finally, to learn commonly used technologies you see on HN, such as Docker or Kubernetes, you'll just need to get your hands dirty:
~ Rent a $5 server on Digital Ocean, or set up a home server, running a Linux distro like Debian or Ubuntu (which often makes installation easier), and start experimenting with them.
~ Continue following HN and reading about new technologies and programming languages.
~ Realize that it's critical for software developers to constantly learn new technologies. Otherwise, they very often become unemployable after a decade or two. HOWEVER, it's also critical that devs exercise restraint and good judgment when selecting technologies for important projects. For such projects, it's usually better to choose languages and technologies that have a proven record and that you personally have a good understanding of, over some new technology that's getting a lot of attention on HN.
With respect to all three of these components, it's a very good idea to maintain a blog and write about your experiences and projects. A blog will serve to not only consolidate your new knowledge, but also to improve your writing and help your career (a good technical blog will be a strong positive signal toward potential employers).
Don't worry about not having a traditional education in computer science. Lots of excellent senior devs I've worked with have no formal training in computer science. As long as you're motivated to constantly learn new languages, technologies, and techniques, and master the ones you already know, then few people will care (or even know) whether or not you have a CS degree.
I was mostly self-taught when I entered the industry. Years later, I now work for one of the bigger companies in Silicon Valley.
I want to preface this by saying that you do not need to be a CS expert to get started in software engineering. Do not buy into the hype. Sure, you'll need to know a few basics, but there are plenty of successful engineers out there who majored in quantitative / logical fields, who definitely do not know the equivalent of a CS degree's curriculum, and they're doing just fine. Indeed, there are a few successful engineers who didn't even go to college.
So the deep CS background is optional, but the following is not: are you the kind of person who enjoys and is good at solving puzzles? Will you persist after hours of bashing your head against the wall? You must have this character trait to succeed as a software engineer.
Assuming you have it, you should start with web development in Python / Django:
- The ecosystem is mature and beginner-friendly, meaning you can dip your toes in the water by using well-built, well-documented libraries that the community has put together over thousands of man-hours.
- The results of your programming will be concrete -- you can interact with the product, and find bugs, as a layperson.
- You can program something basic without any CS training. The libraries you will use to build your web apps will be leveraging plenty of CS concepts, but these concepts will be hidden away from you.
To learn Python syntax, there are a lot of different ways a beginner can go. I would recommend Code Combat for a complete newbie: https://codecombat.com/.
Once you have the basics of Python down, look for tutorials on the internet for building web apps in Django. Build simple web apps until you:
- Know how to think in Python.
- Understand the basics of relational databases and SQL.
- Understand the basics of HTTP / HTML / CSS.
Then, read a book on code craftsmanship, like "Clean Code," and reflect on how ugly the code is in your first few web apps. In the professional world, you'll be expected to adhere to standards of cleanliness and code organization, so refactor at least one of your web apps using the principles that you've learned from the book.
Only after you've determined that you can handle the above, you can start exploring the basics of CS. Harvard's CS50 is a lovely course, but there are more practical courses, for your purposes, on Coursera - namely Algorithms courses. I would recommend Princeton's Algorithms courses by Wayne and Sedgewick. Their courses are a bit less theoretical than the equivalent Coursera courses from Stanford, which is a good thing for someone in your position. I remember Sedgewick's instruction being very clear, yet rigorous. I believe the course requires you to learn basic Java, but given the programming experience you've built up to this point, you should be ready to dip your toes into compiled languages.
---
This entire process can take as little as a few months depending on how sharp and motivated you are, and it's only a first step. At this point, you can continue your CS education if you're really interested in the field. But if you're looking to land a job ASAP, you're better off building up your portfolio, and making sure you really understand the basics of data structures and algorithms.
Furthermore, you should network at coding meetups. Look for a potential manager who is willing to work with a relative newbie such as yourself. I was lucky enough to find one early in my career, and it helped me immensely.
You could try taking coursera algorithm classes intro Nd advanced. Yes the same book for official courses.
What do you want to learn? Programming or CS? CS is more than just programming, and CS theory is more than just Algorithms & Data Structures.
If you want to learn about Algorithms and Data Structures and you have a strong math background, then CLRS is the book to get: http://www.amazon.com/Introduction-Algorithms-Thomas-H-Corme...
An undergraduate CS curriculum will mostly cover the parts I-VI of the book (that's around 768 pages) plus a few chapters from the "Selected Topics Chapter" (we covered Linear Programming and String Matching). Mind you, this book is very theoretical, and all algorithms are given in pseudocode, so if you don't know any programming language, you might have to go with a an algorithms textbook that is more practical. In my DS course we had to implement a Red-Black tree and a binomial heap in Java, and in my Algorithms course we only wrote pseudocode.
Maybe Sedgewick's (Knuth was his PhD advisor!) "Algorithms (4th ed)" will be a better choice for a beginner, as it shows you algorithm implementations in Java: http://www.amazon.com/Algorithms-4th-Edition-Robert-Sedgewic... (If you decide to go this route, you might as well take his two Algorithms courses on Coursera, they will really help).
There are also a bunch of Python-based introductions to computer science which have a broader focus than just teaching specific data structures and algorithms. Some of them emphasize proper program design, debugging and problem solving. I haven't read any of them, so I can't vouch for them, but here are a few of the more popular ones:
* http://www.amazon.com/Introduction-Computation-Programming-U...
This book was written to go along with John's edX course: https://www.edx.org/course/mitx/mitx-6-00-1x-introduction-co...
* http://www.amazon.com/Python-Programming-Introduction-Comput...
Oh and btw, there's also the Theory of Computation, which is a major part of CS theory. Here are a few MOOCs and recommended books on the subject:
MOOCS:
* https://www.coursera.org/course/automata
* https://www.udacity.com/course/cs313
Books:
* http://www.amazon.com/Introduction-Theory-Computation-Michae...
Sipser's book is probably the best introduction to the theory of computation, and I believe its last chapter deals with Complexity theory as well.
* http://www.amazon.com/The-Nature-Computation-Cristopher-Moor...
I loved this book very much. It has a very informal and conversational style (don't let it fool you, the problem sets can be HARD).
* http://www.amazon.com/Computational-Complexity-A-Modern-Appr...
Once you are familiar with some computation models, its time to study computational complexity and this is one of the best books on the subjects. It is used both for graduate and undergraduate courses.
I'm a second year Computer Science student now, so hopefully I can give you a few ideas.
Along with Intro to CS, maths for CS is pretty important. You said you have a strong math knowledge - probably stronger than mine, so I'll just point out that you want discrete maths. If you're comfortable with discrete structures - sets, trees, graphs, logic, recursions, not to worry. This course looks pretty solid if you want a look, http://www.saylor.org/courses/CS202/
You said algorithms don't worry you, but how much work have you done there? You want to know data structures - and methods for designing algorithms. Take a look here, https://class.coursera.org/algo-004/lecture/index and here, https://class.coursera.org/algo2-002/lecture/index, to see how comfortable you are with that content.
After that, I can't say I'm an expert in Linux. Maybe it would be a good idea to take a course in computer architecture - you get a much better understanding of what's really going on. I haven't taken either, but you could consider http://www.coursebuffet.com/course/87/260-Computer-Architect... or http://www.coursebuffet.com/course/289/260-Computer-Architec....
If you want theory on computer networks, this course looks good https://www.coursera.org/course/comnetworks.
More practically, it really depends what you're doing. An OS course will probably introduce you to sockets and networking in C, but you're probably not using C - it's probably a matter of learning some APIs for whatever you're writing in.
Also if you're deploying web services, Coursera have a startup engineering course, https://www.coursera.org/course/startup, some of that could be helpful? It looks like they use Amazon Web Services for deployment though, so if it's something you want to learn yourself I'm not too sure sorry.
Sorry that's a bit long winded, if you have any questions feel free to ask :)