Skip to content

Latest commit

 

History

History
128 lines (73 loc) · 6.21 KB

File metadata and controls

128 lines (73 loc) · 6.21 KB

Learning Algorithms and Data Structures

What?

This repo is a collection of different algorithms, data structures, and random problem sets that I worked on during my job search for a software engineer position.

Why?

I created this repo while I was studying the 6006 Intro. to Algorithms course. The purpose of it was to implement what I learned in the course and have a place for others to review my work.

A very wise relative of mine said that I've had "a top-down" approach in software development, and I needed to "go lower" to understand the technology I'm working with. At the time, I just got out of college and managed to jam my foot in the door by getting hired at a very small software development company.

I quickly fell in love with development and I excelled in leveraging frameworks and architecting large business solutions. But after some time, I wanted to move forward with my career by joining a larger company. The issue was that it was difficult to compete with kids coming out of school with a C.S. degree. I needed to bring myself up-to-speed.

Building this repo and running through the course helped me with interviews a lot, especially technical ones. Since I didn't go to school for computer science and I was too cheap to go back and get my masters, (for now?) this repo helped me build a foundation for a career in computer science.

How?

I leveraged as much resources as I can (under a tight budget of course) and used the following in tandem with 6006 Intro. to Algorithms:

by Thomas H. Cormen , Charles E. Leiserson, Ronald L. Rivest, Clifford Stein

by Gayle Laakmann McDowell

Thoughts and Opinions

The Course

Description:

This course provides an introduction to mathematical modeling of computational problems. It covers the common algorithms, algorithmic paradigms, and data structures used to solve these problems. The course emphasizes the relationship between algorithms and programming, and introduces basic performance measures and analysis techniques for these problems.

The professors of this course used python as their language of choice. I chose to use Java because it's more verbose, and it's easy to setup and debug. Also, I wanted to learn a relatively stronger and statically typed language since I've been a PHP developer for the entirety of my professional career.

Problems Along The Way and Their solutions

I knew I needed to learn algorithms and data structures, but at the beginning it seemed like there wasn't a clear direction. As I researched, I noticed that there was a seemingly endless amount of resources (a good problem) to pick from. I needed to draw up a plan of action in order to have a smooth "learning experience."

At first I figured I'd draw up a rough draft of a syllabus and just follow it. Problem was, I had no idea what I needed to learn. Then I came across a forum that recommended I use MIT open courseware. Problem solved; now I had a clear path.

The next issue was all the prerequisites. The trick was to immediately do research the second I hit a brick wall on something. It was kind of a lazy approach, as opposed to actually taking the course prerequisite classes. But I wanted to get a job and start making money, so I didn’t have time for that.

Now that I had a formula, I needed to focus on speed. Generally speaking, a college course is taken (typically alongside several other courses) over a period of 3 months or so. I set a goal to finish in a month. All I needed to do was tackle one class a day, for 6 days a week. I got lazy some days, and I ended up taking on 2 classes a day every once in awhile.

Along the way I posted everything I learned to github. Eventually I finished in a month and a half, which was longer than I wanted, but close enough.

Then I needed to get a job, which I did, and now I’m working as a software engineer in NYC.

Recommendations

  • DON'T STRESS!

Crashing information is easy once you have a plan of action.

  • Draw up a plan.

Seriously, take 4, or 5 hours (or more!) and really draw out a plan. Don't get lazy with this one; really think about it.

  • Google often.

Research was the key to memorizing and understanding the material. You have to google EVERYTHING you don't know. Don't skip it!

  • Focus on concepts.

Stay at a "high level," You don't need to know all the little details. Little details will surface once you get the idea of the topic you're studying.

  • Take notes.

Take notes like you did in school. It helps, and you can review them later.

  • Don't be too optimistic.

Essentially, don't set impossible goals. When you fail, it's discouraging. If you're off by a bit it's ok.

  • Don't take everything so literally.

The course is going to assign you stupid homework and the book asks you to do all the practice questions. I personally didn't do any of them, but I'm not telling you not to do them. Do it if you think it'll help. Otherwise...

  • Assign yourself homework.

You're not getting away with this one. For every class, there was (at least) one homework assignment that I gave to myself. This was the most important part because all the code in this repo was from the "homework" I assigned myself.

  • Lastly, chill out.

You're fine. Just learn this stuff and get on with your life. It's mostly for the interviews, but it will be useful in very specific situations.