Two ways to create a course

For me, there are two main ways to create a course.

Method 1: Cluster important concepts first and then come up with meaningful assignments.

I usually use this method when I create a course on topics I don't yet know.

In this process, I try to identify what are the "must to knows", "nice to knows" and "no need to knows".  Sometimes, I know this intuitively based on similar technologies I know or sometimes if I don't know, I ask other experienced developers to go through all the concepts in the documentations and highlight which are really important.  Typically only about 10% of the concepts taught in the documentations are in the must to know buckets.

For a brand new course, I usually ignore the latter 2 buckets and solely focus on the "must to knows" first.  The "nice to knows" I can add easily once the must to knows are really nailed and assignments for the must to knows are really nailed.  Typically, I know this will require several iterations with real class and seeing students go through the course, so I intentionally focus initially just on the "must to knows".

Then, I try to picture how these concepts could be presented in the most simple manner possible and start create a course outline.  Then I start writing the course context.  As I write, I try to be concise and try to only teach the most important items.  Anything that needs to be emphasized, I make a note in the course to create a video later.  Then I rearrange the concepts, edit contents, and see how a group of concepts could be presented in the simplest manner possible.  After tweaking the orders, I think of key assignments that could really help students master these concepts in the most efficient way possible.  I add these assignments and I review the course again to see how the student's UX journey would be like based on this new order.  I make changes to optimize not only the learning but also the UX.  If the assignment seems too easy, then I replace it (as this reduces the student's learning).  If the assignment is really hard, I ask whether that assignment is really needed and if not, replace the assignment.  If the assignment is hard but needed, I ask if I could teach certain concepts more easily to help students learn.  Overall, I try to group concepts into less than 20 minute chunks and have these followed by series of assignments.   The course goes through lots of iterations and as I try to organize the course to be simple, I also pray for inspirations.  When inspirations come, I try to act immediately and change the course order or assignment order or add new concepts or remove some sections to optimize the learning and UX journey of the students.

As I do this, I probably spend 50% of the time or more on thinking how to create effective assignments.  I try to avoid assignments where the students don't really have to connect that many dots (as this is a waste of time).  I try to build enough repetitions but not too much repetitions where students are feeling like they are wasting their time.

Method 2: Start with the end in mind.  Come up with assignments first and then add concepts next.

For topics, I am already familiar with, I start the opposite way.  I outline what are the things I expect my developers to be able to do with these technologies and what concepts I expect them to understand.

For example, when I don't have enough time to create a full course, but where I want to get feedback on whether my approach is right, I create a course outline such as this

Sample Course Outline for TDD and CI course (note that it's assignment heavy and concepts are not explained yet)

Part 1: TDD

  1. Study what Test Driven Development is (spend no more than 1 hour).  Answer the following questions:
    1. What is TDD and why is this important?
    2. What are the main benefits of TDD?  What are the main disadvantages of  TDD?
    3. Which projects should use TDD?  Which projects should not use TDD?
  2. Learn and get familiar with PHP Unit, a popular unit test framework for PHP (spend no more than 2 hours)
    1. Understand how to set it up
    2. Understand the syntaxes
    3. How how to run multiple test cases (test files) in the terminal/command-prompt
  3. Assignment (Unit Tests)
    1. Look at the first 10 challenges at Hacker Hero: Basic Algorithm course.  This time, you would solve it using PHP but do it using TDD approach.  Remember to create test cases first and make sure test cases don’t pass first.  Then write the function.  For each challenge, create a separate file containing the test cases.  Then demonstrate how you could either individually run the test file or run all of them at once.  Once you did this, write a short reflection on how this approach compared with the non TDD approach.  How do you think this would help in the real world environment?
  4. Learn how test cases can be built within CodeIgniter.  A good starting point may be https://codeigniter.com/userguide3/libraries/unit_testing.html.  Spend no more than an hour learning about this topic and move right to assignments.
  5. Assignment (Model and Controller Test Cases)
    1. Pick any of the MVC assignment you’ve completed.  Pick two methods in a model.  Write at least 3 test cases for each of the model method (meaning you should have at least 6 test cases written).
    2. Pick two methods in a controller (one that renders a view file and one that processes POST data but redirects).  Write as many test cases as needed to test if the controller method is working the way it should.  Write at least 3 test cases for each of the controller method.  
    3. If writing these test cases are not intuitive yet, write a few additional tests for different methods in the model or the controller.
  6. Learn how Selenium works and how to write test cases in PHP.  Also get familiar with Selenium IDE (a browser extension you can use to generate test cases).  Spend no more than 1 hour learning about the topic, then move straight into assignments.
    1. For the User Dashboard assignment, write tests to see if the site is working the way it should.  Remember to write test cases using Selenium to verify that
      1. User is able to login successfully
      2. User is not able to login successfully with invalid credentials
      3. User is successfully able to register
      4. User is successfully able to log off
      5. User can successfully post a message after logging in
      6. User is NOT able to post a message if they are not logged in
      7. Any other core functionalities that you think can be added as test cases
    2. For some of the key Ajax assignments, using Selenium write test cases to verify that the features of Ajax are working properly.
  7. Now, from what you’ve learned, re-do the wall assignment (including building the full login and registration) but this time, do it with the TDD approach where you build test cases first before you build out each feature.  Measure how long this takes you (with TDD).  Notice how this can be beneficial as well as while you notice how much longer this approach takes you with TDD.

Part 2: Continuous Integration

  1. Study about continuous integration (spend no more than an hour). Answer the following questions:
    1. What is this?
    2. What are the benefits of continuous integration?
    3. What are the disadvantages of this?
    4. What are popular tools used for continuous integration?
    5. What is continuous deployment and how is this different from continuous integration?
  2. Study how GitHub supports continuous integration.
  3. Using GitHub, set up continuous integration workflow.  Also see if GitHub supports so that whenever a code is merged, it can automatically run the test cases and reject the merge if the test cases do not pass.  Similarly, see if GitHub also support so that whenever a pull request is submitted by another user, the continuous integration can be set up and reject the pull request if the test cases are not passed.  Be prepared to show how you’ve set up this continuous integration and be prepared to demo a pull request or a merge being rejected.
  4. Get familiar with Jenkins.  Demonstrate how Jenkins can be used for setting up a continuous integration workflow.  Be able to answer the following questions:
    1. What is Jenkins?
    2. Who should use Jenkins?
    3. When should Jenkins not be used?
    4. How would you use Jenkins to set up a continuous integration workflow?

For each of these tasks, take notes on how long it took you to master these concepts and also reflect on what articles/resources would have helped you learn these concepts a lot faster and better internalize them.

Next