MIT Course 6.006: Introduction to Algorithms

What I did:

I successfully completed all the readings, lectures, homework assignments, and projects for MIT’s Introduction to Algorithms (the fall 2011 version of 6.006) course. I’ve included examples and brief explanations of my work below to give an idea of the types of things I’ve learned. All of my programming work and my final solutions to the homework assignments can be found on my GitHub.

I’ve included some examples of my work below:

Code I wrote for content aware resizing of images. The basic idea here is you can resize images without cropping or losing content. The code shows my bottom-up dynamic programing implementation of deciding which seam (vertical path from the bottom to the top, example shown in red), would be the least noticeable if removed.

original image

image being resized via my algorithm

resized image

This program uses data from the National Highway Planning Network to find the shortest path from a source to a destination in the form of driving directions. This is similar to how Google Maps and other navigation software products work. Here is the code I wrote to implement Dijkstra’s algorithm, which performs the search and returns the results very quickly, as one must sort though a large amount of data to find the shortest path for a cross country trip.

Here I implemented interval subsequence hashing using a modified python dictionary I wrote to quickly compare DNA sequences (represented as series of letters). Included are my results, comparing the DNA sequences of two humans, a human and a chimp, and a human and a dog.

I dramatically improved the speed of image decryption software written for a theoretical extreme multi-core chip that is limited to only performing arithmetic operations on 8-bit or 16-bit unsigned integers. I’ve shown my straight forward arithmetic operations which perform better than that prewritten asymptotically efficient algorithms when inputs are 64 digits or less. I’ve also included an example of the type of extremely sensitive data that can be decrypted using this technology.

This is my implementation of a bidirectional search which provides the fastest (smallest number of moves) solution to an arbitrarily arranged 2×2 Rubik’s Cube (pocket cube) in <5 seconds.

This is a selected example of the written portion of a problem set, and my (neatly typed up) solutions. Although it is much easier to show and understand the value of some of the software projects I worked on in this course, it’s important to demonstrate that 6.006 is a very theory heavy course, and foundational understanding is emphasized much more than practical programming skills. I enjoy theory and figuring out creative proofs to (seemingly) difficult problems was one of my favorite parts of this course.

Here is a theory heavy problem that I found to be particularly difficult. The problem assumes that you are a newly hired employee at a competitor of Facebook and asks for an algorithm for suggesting potential friends. More specifically it requests that the algorithm find the strength (computed as the product of all edge-ranks, within users that are less than k degrees of separation apart), between a given user s and every other user v to whom s is connected, in O(kE+V) time (this is a graph theory problem). This solution required the creativity to recognize that maximizing a sum (the strength) of a product (the edge ranks) is equivalent to minimizing the sum over the log of 1/(the product). This converts the problem to be a shortest path problem for all paths shorter than k in length.

What I just described is technical, but the reason I chose this problem is to demonstrate that this MIT course teaches students to think creatively and challenges students to think outside of the box. A cookie cutter application of an algorithm from our algorithms textbook doesn’t suffice. The course teaches more about how to reframe real world problems so we can map them to previously solved problems and apply the solutions, which I believe is the most valuable skill one can learn in almost any domain.

This is another example of a proof that I found to be particularly valuable, but also built on the most important skill of this course, reframing problems and modifying solutions so you can use resources of previously solved problems (in this field these are called algorithms) and apply them to novel problems. In this particular problem I am writing pseudocode to develop more basic arithmetic operations for the theoretical chip from the image decryption problem.

How I did it:

Before I analyze what I did, I’ll give a raw explanation of what I actually did. I completed this MIT Course in my free time by using an evolving version of the learning method I developed and found success with in college. The method breaks learning a college course into three phases, which are listed below, along with the actions I took to complete those phases.

  • Coverage (5%)
    • I listened to all the lectures at 3x speed, speed read the assigned reading (chapters of the textbook and additional reading assignments) for the course (in <5 hours) (here is how I did it). The purpose of this section is to see the forest before I start investigating individual trees. The entire course material is covered up front for multiple reasons. First, because textbooks are used primarily as (incredibly valuable) reference tools, and it is much easier to find what you’re searching for if you’ve seen it before, even if you didn’t realize what you were initially looking at. Covering the course in full without any deep dives emphasizes the scope of the course more than the details. When learning anything it’s important to understand what’s actually important so it can receive the appropriate attention. If I stopped when I struggled to understand each algorithm (the majority of the readings and lectures), I may have wasted hours memorizing them, but after completing my coverage phase and standing back from the course I realized that the purpose was not to teach us specific algorithms, but to teach us how to reframe problems so that we can use algorithms that others before us have developed. This clarity helps me focus on the important details of the course instead of all of them, ensuring that my time is spent more effectively. Also, reading and listening are forms of passive learning, which can only take you so far. My experiences have convinced me that real skill building, deep understanding, and internalization comes from active learning (phases 2 and 3). Since I find passive learning to be somewhat shallow, but still helpful in the initial phases, I feel that it is important to give it a sense of closure early so I don’t waste extra hours rereading paragraphs and re-listening to lectures because I don’t feel I fully “understand” them. The truth is I can only gain a false sense of understanding, (which is more dangerous than knowing you don’t know) from anything other than the actual application of the knowledge. Instead I quickly move through this section, capping the time, with the expectation that I will understand almost nothing, but that the exercise will give me a sense of what’s out there, what I haven’t learned yet, and what I can expect to gain a deeper understanding of through my active, intensive, next phase.
  • Practice (80%)
    • I completed every problem set and project sequentially using my adaptive set method. I wrote down every problem set number on a different line of a piece of paper (my mega adaptive set), and beside each problem set number I wrote down the number of each problem on the associated problem set.

      my mega adaptive set

      I started on the first problem set, attempting each problem and subproblem individually and discretely to the best of my ability, and providing a falsifiable answer, which I then immediately compared to the official course solutions. If my solution was correct I crossed the problem number off my mega adaptive set, and neatly wrote up my solution to be used as an “official solution”. If my solution was incorrect I circled the problem on my mega adaptive set, compared my attempted solution with the official solution line-by-line, identifying where exactly I went wrong, correcting my mistakes, and completing my incorrect solution using the official solution as a guide. Then I threw away my corrected, attempted solution, and moved on to the next problem on my set. Once I reach the end of the problem set (I call each of these a run-through) I circle the problem set number if there are circled problems remaining on the problem set. I then attempt another run-though of the problem set, where I repeat the process described above, but only for the circled problems. It is important to note that I do not attempt a circled problem within 24 hours of circling (unsuccessfully attempting) it. This is to ensure that solutions are not memorized and that I’ve actually learned the important concepts and tools necessary for solving the problem. Once all the problems have been crossed off a certain problem set, I cross of the problem set number and move on to the next one. Since this is an algorithms course, I thought it would be fun to rewrite my practice set method in algorithm form.

  • Synthesis (15%)
    • I identified (in this case singular) the most important core principle underlying the content of the course. This principle is as follows; To solve a non-trivial problem, reframe it such that it resembles a previously solved or trivial problem (although this reframing is typically non-trivial), and apply the known solution. I believe that statement, an algorithm resource (the course textbook or the internet), and practice solving problems using the stated method forms a basis for this course.
    • I went through my coursework and selected the solutions and projects I felt were most representative of what I accomplished and what I learned throughout the course. I paired these solutions with brief descriptions, so readers of all technical backgrounds can very quickly gain an insight into what I actually did. I believe it is important to show your work in a way such that it is beneficial to you. An A on a transcript can only communicate one point of information. It is important to take ownership of your work so that it takes it from something you did for a course, to something you made and can be proud of. This creates a virtuous cycle, because knowing you want something to display, whether as a selected project on your resumé, an item in your portfolio, or as a part of an article on your learning blog ;), motivates you to make something special, something you can be proud of. This nicely presented work helps you feel better about your work, and the experience with your learning project, which motivates you to do more, build more, and make more presentable and interesting projects in the future. I am in the process of learning this first hand, despite preaching about the importance of showing your work so that you can take credit and benefit from it for the past few years. The selected projects on this page are more visual and understandable than on my last course write-up, which was a major step up from me completely skipping this phase on my last two MIT courses. During a recent job search I had official offers for Software Development positions extended to me because of my last synthesis article, and how it showed my knowledge of the field, my learning methods, and my ambition. I did not expect my last article to help me get a job. If I did, I would have sent it to potential employers. Instead I just left a link to my blog on my resumé because I believe it is an important part of my personality, and hiring managers later told me how my Graduate Unschool articles strongly influenced their decisions to extend offers to me. I’m not writing these to get a special job, or prove anything to anyone else, I’m writing these synthesis articles to complete my learning process. Everything else is a free bonus for showing my work in public.
    • The purpose of the synthesis phase is to teach the material of the course in a way that is helpful and more concise than the original course material. This is how knowledge progresses, somebody learns something, then represents it publicly in a way that is easier to understand. Imagine how long it would take to complete a simple high school math test if you had to derive everything from fundamental axioms. Imagine if every time you wanted to use a computer you had to invent it from scratch without any sort of guide. When Newton talks about standing on the shoulders of giants this is what he means. Our ancestors built the intellectual world around us though absorbing, mastering, and representing knowledge in a form that is easier/faster to learn. Your duty is to do the same. You don’t need to discover a useful math theorem or invent a piece of technology to be a part of this process, all you need to do is learn something, synthesize it, and make your synthesis publicly available. Read a book and share what you learned from it, write a how to article on something you can do whether it’s simple or complicated, help those that you know and those that you will never meet learn what you know faster than you did. That’s the real secret to accelerated learning, we can all accelerate each other’s learning.

What I learned about learning:

  • If you have two goals, it is simpler and faster to complete them sequentially and discretely, rather than simultaneously
  • This learning method applies to the application of this learning method.
    • Right now I recognize that the synthesis phase is a major weakness for me, but re-covering my old synthesis section notes, practicing writing the last two articles, and showing others how to write a synthesis article is helping me evolve the synthesis phase, as well as improving my skills at it.
  • It makes sense to pause one goal for the completion of another, if you think it improves the sequencing.
    • I paused this course twice, once for 6.0042j (which I was closer to finishing) and once for the web developer bootcamp (whose completion was more urgent).
  • Start with a naive solution, then iterate towards improvement/Ignore the temptation of the ideal solution
  • Make your synthesis articles visually appealing
    • You can feel more proud of your work
    • Visually appealing articles are much more easily and quickly communicated. With a visual representation an outsider can gain a much better understanding of what you did in 30 seconds than if you just left a giant block of text with a few complicated math problems sprinkled in.
  • One doesn’t count to 1000
    • I had to make the transition from counting my hours to making this a major part of my lifestyle. At first I was tallying off every hour I completed towards my 1000 hour goal. I made mini goals to hit so many hours a day, week, month, but I was always behind. Once I decided that this was important to me and dedicated sacred hours to this, I stopped counting completely and realized that I would easily overshoot my goal. If you hope to make significant progress on a big project you need to stop counting away the minutes to completion and make it a part of your life. Take detours here and there, fall in love, but make it a part of your lifestyle, that way you won’t need to count or remember. Instead you use the habits, taught and synthesized from your past self, to propel you current self forward.

MIT Course 6.042j: Mathematics for Computer Science

What I did:

As a part of my software engineering course for my Graduate Unschool project, I completed the fall 2005 version of MIT’s 6.042j course, Mathematics for Computer Science. This means I read all of the course materials (textbook/lecture notes/solved problems and examples), successfully solved every problem of every homework assignment (equivalent to a perfect homework score), and synthesized the course into it’s essential elements, shown below. All of my completed solutions and my course synthesis can be found here. I’ve also included a few examples of my solutions so you can see what types of problems I solved, also below. If you want to read more about the learning process, scroll past the examples of my work.

The foundational knowledge and tools I learned/used while taking 6.042j.

Examples of my work

part 1

part 2

How I did it:

The learning method I’ve paired with the software engineering course is essentially an evolution of the learning method I developed and used in college. It is heavily based off of the core concept of Deliberate (or possibly Directed in my case) Practice, and I am evolving it by trying new techniques I found from Scott H. Young’s learning methods, more literature on Deliberate Practice, and other experimental tweaks. Below is an overview of the phases I broke the course into. These phases were completed in discrete chunks:

  • Coverage (5%)
    • I speed read all of the textbooks, and course notes (I try to do this in ~5 hours).
  • Practice (80%)
    • I make each individual problem set into an adaptive set. I then attempt each problem as if it were a normal homework assignment (using the PDF version of the book and in-class examples heavily for references) and make my best attempt at a solution. After completing my solution attempt, I immediately compare it to the official course solutions. If my solution is correct, I cross the problem off my adaptive set and move to the next unsolved problem. If my solution is incorrect, I compare my attempt with the solution, identify exactly where I went wrong, circle the problem, and move forward to the next unsolved problem. When I work my way to the end of the problem set (I call this a run-through), I start again on the problem set, this time going through the circled problems in order (being careful to not attempt the same problem in the same 24 hour period to avoid memorization). I continue to run through the problem set until I have crossed off every problem, then I group my solutions together and move on to the next problem set.
  • Synthesis (15%)
    • I identify every major concept and problem solving tool I used while completing the problem sets and put them in a list. I prune the list so that it only contains essential information, but I also ensure that nothing essential is missing so that the list spans the course (think of it as a basis for the course). I then write this into a one-page synthesis sheet so that the entire course’s information is organized in one place (this is useful so others can learn the course faster in the future, so you can refresh yourself quickly, and it could be used as a crib sheet).

There’s a lot more that goes into finishing an MIT computer science course in your free time than a just a learning method, and how I finished this course is very different than how I started because I constantly experimented with my approach and integrated what worked into my habits. I started in September 2015 after successfully completing MIT courses 6.01 and 6.02 back to back in two weeks each, with a huge plan for how I would complete all of the MIT courses on my list in just six months. I decided to experiment with taking courses simultaneously because it was what I was familiar with (traditional school), and I thought the spacing and connections would help. I’m glad I tried that because I realized that I was very wrong.

Attempting two courses at once divided my focus, and pushed the finish line further back (it should take twice as long to finish two courses if completed simultaneously) which made it more difficult to make progress because I’d experience decision fatigue when deciding what task I was going to attempt each day, and it made what was once a bite-sized achievable short term goal, completing one course, into an overwhelming project, causing me to procrastinate, fall behind, feel guilty, and become avoidant of my work.

Eventually I stopped working on Graduate Unschool completely. I went from regularly spending 6 hours a day 6 days a week making serious progress to going months without programming, forgetting where I stood in each course, and asking myself if I was ever going to follow through on my original intentions. Sporadically I’d have short intense spurts where I’d stay up all night making a new plan and plugging away at problems, but that energy would wear off, and I’d go back to my intellectual drought of pretending Graduate Unschool either didn’t exist or was a relic of my naive past.

Then one day, somewhere between a financial rock bottom and a personal career renaissance I reconnected myself with the original intentions of the Software Engineering Course. I found myself easily slipping into flow states while programming, loving it again, and wanting to get better and pursue a career in developing software, and although I didn’t have a formal education in computer science, I believed that this would fill in the gaps in my knowledge and signal to employers that I truly did “know my stuff”. I started ramping up my skills again, challenging myself everyday, and I eventually found a job as a software developer where I have been working for around seven months now. Just as I’d hoped, my job had me programming everyday, and consistently learning all sides of software development. My secondary intentions for the software course had been fulfilled, and I hadn’t even made it very far through my personal plan. I realized that it was very likely that I could continue to have a career in software without ever completing another MIT problem set or practice interview question. I also realized that I cared deeply about developing hard skills, I loved programming, and more importantly pursuing excellence and improving my programming skills as I started developing software full time. Through some introspection I found that I truly enjoyed the MIT Computer Science courses, and that completing them was important to me even after I’d successfully completed the career transition I originally thought the courses would help me with. With purified intentions, and a serious break from any disciplined self-learning routine, I made a little bit of progress everyday, built some healthy habits, finished this course, and most importantly gained insights into the learning process. My synthesis sheet clearly shows what I learned about math while taking 6.042j. Here’s what I learned about the learning process itself.

What I learned about learning:

  • Attempting two courses or topics at once divides your focus and slows progress and motivation for both. It is faster and better to start one thing, focus on it, finish it, and move forward.
  • Setting up a feedback system where you can see your progress everyday is extremely helpful and motivating. Including a mechanism where your progress measures and acknowledges both efforts and results seriously accelerates your learning. You’ll know exactly what to do when starting everyday, where to go, and when something is difficult and takes multiple attempts before you make any tangible results progress, you’re rewarding the important part of learning a difficult concept, the unseen internal progress that can only be made from serious attempts (both successful and unsuccessful).
  • Avoid large gaps away from your work. Taking a ~ 1 year gap in the middle of this course seriously set me back. It took tens of hours to figure out exactly where I had left off, what work I had already completed, and what remained. Even after straightening all of that out I had to complete a serious amount of redundant work, either because I’d lost a problem, or because I didn’t recognize a solution until I had already redone it.
  • Make frequent progress, however small. My recommendation is to improve your desired skill 1% everyday.
  • Increment the intensity of your approach to avoid overwhelming yourself and creating a system you’re likely to quit or burn out in. My recommendation is to start by completing one pomodoro (25 minute chunk of uninterrupted work) each day at the same time (since consistency matters), so it becomes a part of your lifestyle. At first you will feel resistance, but once it becomes a habit (meaning it no longer takes willpower to complete your pomodoro), you can consider adding another pomodoro, and repeating the habit incrementing process. If, after completing your regular pomodoros, you want to continue, feel free to keep working, but it’s important to realize that 25 minutes today and 25 minutes tomorrow will serve you better in the long term than 5 hours today and feeling too exhausted to start tomorrow.
  • Stream of consciousness work journaling helps your progress feel more meaningful, keeps you focused, and gives you a catalogue of your actions for you to analyze and learn from in the future. At the beginning of every session I write the date, every action I’m taking as I take it, and often what’s going through my head and what I’m feeling as I work. I keep my journaling short, personal, honest, and quick (~20 words per hour, I spend about a minute an hour total on the journal, so it’s not distracting. Instead I note my distractions in the journal so that I can move forward with my work.)
    • Here's an example of my stream of consciousness journal.

      Here’s an example of my stream of consciousness journal.

  • Document your work and keep it well organized.
  • Close your loops. I’ve already recognized the importance of keeping the phases of each course discreet, and in the process of completing this course I’ve realized it’s important to keep the courses discrete as well. This means finish one task before moving on to the next one. The only reason I’m typing out this synthesis (and not avoiding it like I did for the first two software engineering courses), is because I forced myself to complete all phases of 6.042j before continuing on 6.006. Once you’re finished with one task it clears up space in your mind that you can use to fully focus on the next task.
  • Give yourself credit for the work that you do. If someone want to visualize what I learned while completing 6.042j I can send them this page. Find a way to demonstrate your skills so you can benefit from your work.
  • Build your skills through iteration. You’ll be intimidated when approaching new things. Throw perfectionism out the window, finish something quickly, stop avoiding it, don’t fall behind on any of the pieces, get it out there, get feedback on how you can improve a few specific pieces of it (but again, just upgrade it, make it just a little better than your last one, don’t try to accomplish too much in a single iteration), and make it a little better next time. This is how you get better at anything. It takes patience and humility.
  • Break very difficult problems into digestible chunks. Sometimes concepts are so complicated you won’t be able to successfully complete it in your first attempt, and you won’t be able to even completely understand or internalize the solution on your first attempt (meaning you’ll get your second attempt wrong as well). Find your saturation point, find a piece of the solution that you can easily understand today, maybe one concept, maybe one problem solving mechanism, and briefly focus on that while analyzing the solution. Quickly write how it works, then when you reattempt the problem later, start by focusing on what you’ve internalized in this process. Now that you’ve chunked out a piece of the solution, the remainder will be less intimidating. Try the now truncated problem again, and you’ll be surprised how quickly you progress. Learn the problem, solution, and problem solving mechanisms in smaller pieces so you spend less time feeling stuck.
  • How to attempt problems you know you are unlikely to succeed at: Give it your best attempt. Don’t take too long (pomodoros come in handy for this). Make sure it’s a complete solution that can be turned in and be graded (you want to know where you’re going wrong, and why your assumptions were wrong). Don’t leave anything out that was asked for. Set yourself up for success, even if it is unlikely, because then you can close the gap between a successful solution and what you did more quickly/easily. It’s easy to fall into one of two unproductive traps: wasting multiple days attempting to figure something out that is too far outside of your current skill level, and giving up whenever you are uncertain and relying on the solutions to guide you. Instead of focusing on solving problems, instead focus on using problems to measure and push the limits of your skills. If you can’t solve it today, see how far you can get today, then focus on solving it tomorrow, and move forward.

Graduate Unschool Progress Report: Week of 8/15/2016

CourseWhat Was my Goal?What I did...What I learned...How Can I Improve my Approach?Potential Next Steps...
SWE•Attempt 2 6.0042j problems from ps3 √•Attempted 3-3c, 3-4a,b,f
•Attempted & solved 3-3b, 3-4c
•One way to prove maximal is proof by contradiction assuming an element > the maximal element
•DAGs are described by their sets of vertices & edges
•Listen to classical music/OSTs to focus on solving math problems/proofs
•Save longer problems for the beginning of sessions so I'm not interrupted mid-problem
•Attempt problems more aggressively even when I'm completely unsure of what to do
•Attempt 3-4f (6.0042j)
•Work through circled problems on ps3
SOLO•Read & highlight IWT through Ch 7 X•Read and highlighted actionable advice from Ch 4-6•How to set up automatic transfers across financial accounts•Spend one long session knocking out the entire book so I can do more meaningful work•Finish highlighting the book
VSK8•Finish the 10x results podcast √
•Make a vert learning plan X
•Skate the 10ft bowl in McKinney X
•Finished listening to and taking notes on the podcast
•Turned my notes into action steps
•You can deconstruct something by asking why repeatedly and searching for untested assumptions•Do all future note taking with pencil and paper•Do a 5 minute discovery journal on "Why can't I do a 2ft b/s air?"
•Analyze the results for untested assumptions
•Make a learning plan for learning backside airs
•Skate the 10ft pool in McKinney
APPD•Spend 30 min focused on APPD √
•Complete 1% of BF √ (2% complete now)
•Completed 1% of BF•How to compile in XCode•Use the correct BF website•Complete the next BF exercise
Overall•Spend 30 min/day focused on GU everyday X•Spent ≥ 30 minutes on GU 6/7 days•The more I regularly I spend time on GU, the easier it becomes to get started everyday
•Once I knock out my minimum requirement I feel energized and excited to keep going, usually after switching courses
•Work on GU every single day, no matter what. This way it is no longer is a choice, just a part of my life•Work on GU everyday, even if it's only for 5 minutes

Notes: After reading How to Fail at Almost Everything and Still Win Big I’m testing the system of making progress on Graduate Unschool a no-exceptions daily habit. This is what made my 1% a day course work so well in the past, uninterrupted consistency, and I know once I go a few weeks without missing a day this project will require significantly less willpower.

Residue of my progress this week

Residue of my progress this week

Graduate Unschool Progress Report: Week of 8/8/2016

CourseWhat Was my Goal?What I did...What I learned...How Can I Improve my Approach?Potential Next Steps...
SWE•Work for 30 minutes √
•Attempt a problem from 6.0042j √
•Start LoS √
•Attempted 3-2b (format problem set #-problem #)
•Read 1/3 of LoS's intro to rapid learning
•Attempted & solved 3-2c
•Spent ~1.5hrs focused on SWE
•A topological sort on a partial order x is a total ordering y s.t. a x b => a y b
•Construct topological sorts starting with the min & max, then fill in every element from the set
•Make connections to everyday life to accelerate learning
•Dilworth's Lemma: For every t, every partially ordered set with n elements has either a chain of size ≥ t or an antichain of size ≥ n/t
•Continue moving forward (it's going well)Attempt 3-3c (6.0042j)
SOLO•Spend 30 minutes focused on SOLO √
•Read & synthesize actionable advice from IWT for 30 minutes √
•Read and highlighted actionable advice from halfway through Ch 2- most of Ch4 in IWT•The purposes of using retirement accounts (IRA, 401k) are the tax benefits & special matches from employers
•Gradual habit changes are more sustianable
•Speed read the book faster•Finish highlighting Ch 4
VSK8•Spend 30 min focused on VSK8 √•Listened to 'How to 10x results', took relevant notes for my deconstruction phase•Constantly testing assumptions is what allows you to find learning hacks•Listen to the podcast at my workspace, not on the couch•Finish the podcast. Follow insights in my notes.
•Make a learning plan for learning backside airs
•Skate the 10ft pool in McKinney
APPD•Spend 30 min focused on APPD √
•Complete 1% of the bitFountain app course (BF) X
•Completed the opening & closing panes exercise on BF•How to perform the basic text editor display functions on XCode•Start XCode before journaling (long start up time)•The next BF exercise
Overall•Spend 30 min of focused time on GU everyday X•Spent ≥ 30 minutes on GU 4/7 days
•Spent ≥ 3.5 hrs (= 30 min X 7) on GU over the week
•Started & maintained a daily GU work journal & a daily progress report
•The journaling & daily progress reports make me feel more focused•Use fun activities to get me started (MIT problems/SOLO work)
•Batch together tasks with large start up times (APPD)
•Spend Sundays making these progress reports (I'm writing this on Tuesday)
•Decide on my weekly goals ahead of time
•Spend 30min/day focused on GU everyday

Notes: Although I’m still not working very much I feel like I’m starting to actually make real progress. It’s been 6 months since I’ve correctly solved a problem from an MIT problem set, which is really motivating. I realize that I’ve been procrastinating on days where I’ve planned to work on the app development or skateboarding courses, and that I really look forward to working on software engineering and the solopreneurship courses. I’ve been spreading my time equally over all the courses so far, but as I try to solidify the habit of dedicating 30 minutes each day to Graduate Unschool I might want to focus on the activities I’m most excited about until the time commitment becomes a natural part of my life.

My big win of the week. The powerset is partially ordered by the "subset of" relation.

My big win of the week. The powerset is partially ordered by the “subset of” relation.

Graduate Unschool Progress Report: Week of 8/1/2016

CourseWhat Was my Goal?What I did...What did I learn?How Can I Improve my Approach?Potential Next Steps...
SWEWork for 30 minutes √Decided on objectives & course materialsWhat I'll be doing and whyAttempt an MIT problem and read/experiment with the 'Learning on Steroids' online course (LoS)Start LoS. Attempt a problem from MIT's 6.0042j course
VSK8Spend 30 minutes skating vert √Learned to skate my new vert board. Attempted to skate transition again. Filmed my starting point bs airVert skills atrophy quicklyHave a plan so I don't get confused or discouraged when I get to the skateparkStructure the learning approach using Tim Ferriss' 'How to 10x Your Results, One Tiny Tweak at a Time' podcast.
SOLOWork for 30 minutes √Decided on mini-courses and objectives. Clarified the learning method.Action is the underlying learning method. What I'll be doing and the underlying method. A course a week is not a goal, action matters.Compile all actionable tips into a journal. Cross them off as I complete themSynthesize 'I Will Teach You to be Rich' (IWT) into an actionable list
APPDWork for 30 minutes XNothingForce myself to start and complete the smallest possible section of the app course I'm takingGet 1% further in my online app developer course
OverallSpend 30 minutes a day XPublished 'Unquitting Unschool'. Made structural changesThe hardest part is getting started. Once I start the 30 minutes flies by, but now my willpower is mostly exhausted with starting.Make a progress report format (this). Keep a general Graduate Unschool journal. Update progress report fields every time I workSpend 30 minutes a day of focused on Graduate Unschool (GU) everyday

Notes: I feel like I didn’t make as much progress as I would have liked, but I made more progress than last week, and I identified a few changes I can make to improve next week. I understand this is not impressive, but right now it’s about sticking to my plans and moving forward, not impressing anyone.

The peak of the highest backside air I could land. The starting point for the vert skateboarding course.

The peak of the highest backside air I could land. My starting point for the vert skateboarding course.

Unquitting (Graduate) Unschool

This is a follow-up to my first post on this blog, the announcement of my Graduate Unschool project. I am writing this not with the excitement, enthusiasm, and optimism that shines through my original post, but instead with a lump in my throat, a knot in my stomach, and a deep sense of shame and embarrassment. I’ve tried to write other articles for the past few months, but I always felt somewhat dishonest for not addressing what’s going on with the largest and most ambitious project I’ve ever attempted (the sole thing I intended to base this website around) especially because it went so differently than I originally planned or expected. This is the article not the article I wanted to write. This is article I needed to write.

First, a little background on what I attempted. A year ago I decided that instead of attending graduate school I would create my own graduate school, make the courses up, hold myself accountable, and be extremely transparent about the process. I always seek to take on more and more, and after feeling bored and unchallenged at the end of my college experience, I decide to make this the most intense and difficult endeavor I’ve ever attempted. I designed five different courses, each with a unique and extremely difficult end goal, and each paired with a different learning method. The purpose of the project was to simultaneously learn about the topics I was most interested in, and to test and develop new learning methods, making the focus of the project primarily on learning how to learn. Below I have listed the course topics, goals, and learning methods, as well as where I currently stand with them.

Course Topic

Learning Method

End Goal

Current Standing

Software Engineering

Recursive Learning/ Deliberate Practice

Complete 9 MIT CS Courses, 150 Programming Puzzles from CtCI, and develop 2 board game AI Systems

Completed 2/9 MIT Courses, 2/10 problem sets on 6.0042j, 4/7 problem sets on 6.006, and <10 CtCI puzzles. No progress on board game AI.

Vert Skateboarding


Land a 1-2 foot high Caballerial on a ramp taller than 12 feet

Landed a 1 ft backside early grab in an 8 foot bowl

Solopreneurship (Solo-Entrepreneurship)

One Course of Action each Week

Complete 26 “homework assignments” based on self-improvement media. Create 26 actionable one pagers

4/26 one pagers (~15%)

App Development


Build an iPhone app and distribute it through the AppStore

Very Little Progress

Secret Course (Social Skills)

1% Improvement a Day

Improve my social skills by 515%


I gave myself a hard deadline of six months for the project, and intentionally chose goals and benchmarks that I believed would be completely impossible to accomplish in that time frame. I chose to do this because I saw getting close to perfect scores on tests and in college classes as a sign that I wasn’t pushing myself enough, that what I was attempting was too easy for me. Success to me has never been defined by how well I’ve performed, but instead whether or not I tried my absolute best, gave everything I had, and put my whole heart into it. Graduate Unschool was set up so that I could leave everything on the table and still potentially come up short.

Here’s what ended up actually happening. I was misled by my passion to start early. I became achievement focused instead of process focused and funneled my energy towards accomplishing the end goals instead of learning as much as possible. I stopped living in the present; I moved from wanting “to do” to wanting to “have done” my tasks (I didn’t want to sit down and do another MIT problem set, but I wanted to have completed the software engineering degree). I never expected anyone to follow, care about, or even read my progress and articles, (before announcing Graduate Unschool I’d spent almost a year blogging, and had never had more than three people read a single article), but when I realized that more people than I regularly have social contact with were keeping up with the project, I felt a pressure to perform. A pressure to not fail. Instead of trying my best simply to move forward everyday, I took my impossible goals seriously. I worked myself to complete frustration and exhaustion for a few weeks, then burned out. I felt guilty about my failure. I avoided the project. I made unsuccessful plans to catch up in secret, and I found myself with a guilt driven avoidance of the topics and learning methods I’d originally wanted to focus my life around.

Looking back it’s easy for me to speculate as to why this went so wildly different than I planned: I never even explored the learning methods because I was so caught up in accomplishing things, I was neither public nor transparent about any of it, but I’m ready to move forward and learn from this failed learning project.

I’ve given this a lot of thought and the truth is, I still care, I still want to learn, and I think I have partially purified my intentions. I’m going to take what I’ve learned from this past year and use it to approach the project in a healthier, more adaptive way. Instead of having harsh deadlines to fall behind and beat myself up about, I’m implementing the most powerful learning method I encountered during the project, consistently improving 1% a day, across the project as a whole. This keeps me grounded, it’s achievable without being easy, and moves me forward fast (at an exponential growth rate) without becoming overwhelming. I’m going to shift the focus off of myself and the end goals, and refocus it on learning about the learning process, and what new insights I gain as I progress through the project each week. This means I will no longer have to toil, writing a giant self indulgent article about my emotional state every time I give a Graduate Unschool update. Instead I will be posting weekly progress reports, regardless of how much progress I end up making that week, so that I can actually be public and transparent without becoming ego-protectant and narcissistic, as I’m afraid I became last time. Finally, there will be structural changes made to every course and the project in general, but these changes will be adaptive. They will happen as I move through the courses and learn more. I’d rather start moving in the right direction today than wait until I devise the perfect plan to start.

There was so much about college that I loved. The moments where I finally figured something out and dropped whatever I was doing to test it. The long hours of complete engagement in the problem solving process. The days where I unexpectedly acquired a new skill. The idea that there was always something left to learn. Graduating college was the truly disappointing part, but I think it’s because I was in it for the journey, not the destination. When I arrived I wondered why did I do all this work? Was this a giant waste of time? Did I even want this? I think I finally understand the answers to these questions. I did the work because I enjoyed doing the work. Time that you spend engaged and working on yourself is never a waste, even if it doesn’t turn out the way you expect it to. No, I never wanted to arrive anywhere, I was just enjoying the journey.

My learning journey will never end, and Graduate Unschool should be about making the journey as enjoyable and engaging as possible. I need to love what I’m doing everyday and not want it to end because even when I reach my foolishly intense end goals I don’t want to stop learning. This time I never want to arrive. I want to spend the rest of my life as a student. I want to hold true to the tagline of this website, learning full time, but I want to make it clear that the goal is to learn, not to learn full time for a couple of years then retire. I want to learn how to learn so that I can learn more. This is my manifesto for a lower pressure, healthier approach to my creative projects and my life in general. Consistency over intensity. Purpose over passion. Iteration over perfection. Humility over ego. Honesty over silence. Doing over being. Wanting over needing. Working over talking. Giving over expecting. The present over the future. Loving over infatuation. Unquitting unschool.

"When we lose we have a choice: Are we going to make this a lose-lose situation for ourselves.... Or will it be a lose ... and then win?" - Ryan Holiday

“When we lose we have a choice: Are we going to make this a lose-lose situation for ourselves…. Or will it be a lose … and then win?” – Ryan Holiday