<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kevin Heis</title>
    <description>The latest articles on DEV Community by Kevin Heis (@heiskr).</description>
    <link>https://dev.to/heiskr</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F216321%2Fab89e569-4f77-4c2a-801c-e4d6c66b3fb1.jpeg</url>
      <title>DEV Community: Kevin Heis</title>
      <link>https://dev.to/heiskr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/heiskr"/>
    <language>en</language>
    <item>
      <title>Why I’m Building Sagefy</title>
      <dc:creator>Kevin Heis</dc:creator>
      <pubDate>Wed, 21 Aug 2019 22:55:56 +0000</pubDate>
      <link>https://dev.to/heiskr/why-i-m-building-sagefy-2jfp</link>
      <guid>https://dev.to/heiskr/why-i-m-building-sagefy-2jfp</guid>
      <description>&lt;h2&gt;
  
  
  The challenge
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The greatest opportunity for technology is human learning.&lt;/strong&gt; By elevating ourselves, we can accelerate our progress and growth. I’m hoping &lt;a href="https://sagefy.org" rel="noopener noreferrer"&gt;Sagefy&lt;/a&gt; shows a different way we can think about learning with technology.&lt;/p&gt;

&lt;p&gt;The most important challenge we can address for learning is &lt;strong&gt;ensuring we adapt the content to the learner’s current state of knowledge and skills, as well as their learning goals.&lt;/strong&gt; Learners waste time and effort when the content doesn’t tightly fit their prior knowledge. If the content references things the learner doesn’t know yet, or if the content repeats information the learner already knows well… that wastes time and effort and lowers motivation. And if the content is outside of the learning goal, the learner loses focus.&lt;/p&gt;

&lt;p&gt;Also, we want to make sure that the learner &lt;em&gt;isn’t restricted by topic&lt;/em&gt;. Many of our current educational tools make knowledge pay-to-play. We also rely heavily on experts to create selected (limited) content for learners. And where there are open systems with more varied and deep content, the learner doesn’t have a clear path to follow.&lt;/p&gt;

&lt;p&gt;We have every reason to want every single person to pursue knowledge in the most time-and-effort efficient means possible. And we want to encourage each person to pursue their interests as deeply as possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Sagefy&amp;nbsp;is
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://sagefy.org" rel="noopener noreferrer"&gt;&lt;strong&gt;Sagefy&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;is an open-content adaptive learning system.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Open_content" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;Open-content&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt; means anyone can view, share, create, and edit content. Wikipedia is probably the most well-known example. Open-content means that Sagefy can grow quickly and reach learning subjects not regularly reached by current educational technology.&lt;/p&gt;

&lt;p&gt;&lt;a href="/images/why-2.png" class="article-body-image-wrapper"&gt;&lt;img src="/images/why-2.png" alt="An example of the flow of consensus-based decision making. [https://upload.wikimedia.org/wikipedia/commons/e/ed/Consensus-flowchart.png](https://upload.wikimedia.org/wikipedia/commons/e/ed/Consensus-flowchart.png)"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Like most open-content systems, Sagefy works based on a &lt;a href="https://en.wikipedia.org/wiki/Consensus_decision-making" rel="noopener noreferrer"&gt;&lt;strong&gt;consensus-based decision&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;making process&lt;/strong&gt;. Consensus-based decision making means that instead of relying on a single expert to create content or approve changes, a large community of learners can create the content themselves. Consensus-based systems tend to produce content as high of quality as experts, but in a much larger scale.&lt;/p&gt;

&lt;p&gt;&lt;a href="/images/why-3.png" class="article-body-image-wrapper"&gt;&lt;img src="/images/why-3.png" alt="In an adaptive learning system, instead of a structured course, the material will adjust and flow based on learner knowledge."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An &lt;a href="https://en.wikipedia.org/wiki/Adaptive_learning" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;adaptive learning&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt; system tries to optimize the learning experience based on what the learner already knows and what the learner’s goal is. So instead of a planned and structured course of content, Sagefy presents small pieces of content &lt;em&gt;based on the learner’s responses&lt;/em&gt;. By basing the experience on prior knowledge and goals, Sagefy hopes to get the most out of the time and effort spent learning any topic of the learner’s choosing.&lt;/p&gt;

&lt;p&gt;We can ensure the content matches the learner’s knowledge and goals by…&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Assessing the learner’s current knowledge.&lt;/li&gt;
&lt;li&gt;Skipping content the learner already knows well.&lt;/li&gt;
&lt;li&gt;Backing up when the learner doesn’t know a prerequisite.&lt;/li&gt;
&lt;li&gt;Repeating content when the learner needs review.&lt;/li&gt;
&lt;li&gt;Staying focused on content specific to the learner’s goals.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the time being, I am targeting Sagefy at &lt;em&gt;independent adult learners&lt;/em&gt;. This target audience makes Sagefy simpler by not dealing with practical concerns of institutional integration. Younger learners tend to be in a classroom setting, which comes with expectations and challenges that would make Sagefy more difficult to build. Some of these challenges include participation requirements, preset curriculum requirements, testing and grades, mitigating cheating, and instructor analytics. Adult learners in institutional settings faces similar practical challenges as well. By focusing on intrinsically motivated learners, I skip, at least initially, many of the more practical concerns of the more traditional classroom and training scenarios.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sagefy is completely&lt;/em&gt; &lt;a href="https://github.com/heiskr/sagefy/" rel="noopener noreferrer"&gt;&lt;em&gt;open-source&lt;/em&gt;&lt;/a&gt; &lt;em&gt;and freely available.&lt;/em&gt; My motivation is to share knowledge more broadly, more effectively, and with more focus. I’m not interested in making a profit. Money is simply a resource. By removing the concerns of profit, I can focus on making Sagefy the best platform I can imagine for learning.&lt;/p&gt;

&lt;p&gt;The combination of &lt;em&gt;open-content&lt;/em&gt;, &lt;em&gt;adaptive&lt;/em&gt;, and &lt;em&gt;free&lt;/em&gt; positions Sagefy in a way no other learning technology is. This combination means Sagefy can reach a wide variety of learners, all while attempting to provide an in-depth and effective learning experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Sagefy&amp;nbsp;works
&lt;/h2&gt;

&lt;p&gt;&lt;a href="/images/why-4.png" class="article-body-image-wrapper"&gt;&lt;img src="/images/why-4.png" alt="The three types of entities in&amp;nbsp;Sagefy."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;The types of things in Sagefy.&lt;/em&gt;&lt;/strong&gt; There are three types of entities in Sagefy: cards, units, and subjects.&lt;/p&gt;

&lt;p&gt;&lt;a href="/images/why-5.png" class="article-body-image-wrapper"&gt;&lt;img src="/images/why-5.png" alt="A card in a single learning activity. In this example, this is a multiple choice question&amp;nbsp;card."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Card&lt;/strong&gt;. A card is a single learning activity. Examples include a short video, a multiple choice question, or a single math problem. An example question would be, “What is the median of 5, 7, and 10?” Cards are the smallest entity in the Sagefy data structure. A card always belongs to a single unit.&lt;/p&gt;

&lt;p&gt;&lt;a href="/images/why-6.png" class="article-body-image-wrapper"&gt;&lt;img src="/images/why-6.png" alt="Many cards belong to a single&amp;nbsp;unit."&gt;&lt;/a&gt;&lt;a href="/images/why-7.png" class="article-body-image-wrapper"&gt;&lt;img src="/images/why-7.png" alt="A unit represents a single learning goal. In this example, the unit is “describe the differences between mean, median, and&amp;nbsp;mode.”"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unit&lt;/strong&gt;. A unit is a single learning goal. A unit is similar to a short lesson. An example would be, “describe the differences between mean, median, and mode.” A unit is the medium size entity in the Sagefy data structure. A single unit has many cards. A unit can require other units before it. A unit belongs to many subjects.&lt;/p&gt;

&lt;p&gt;&lt;a href="/images/why-8.png" class="article-body-image-wrapper"&gt;&lt;img src="/images/why-8.png" alt="Units can require other&amp;nbsp;units."&gt;&lt;/a&gt;&lt;a href="/images/why-9.png" class="article-body-image-wrapper"&gt;&lt;img src="/images/why-9.png" alt="Many units belong to many subjects."&gt;&lt;/a&gt;&lt;a href="/images/why-10.png" class="article-body-image-wrapper"&gt;&lt;img src="/images/why-10.png" alt="A subject is a combination of units and other subjects. A collection of units on central tendency might make up one subject, which is part of a larger subject on descriptive statistics."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Subject&lt;/strong&gt;. A subject is a collection of units and other subjects. Subjects are like classes or courses, anything from like a short workshop to an entire degree program. Examples could be, “measures of central tendency”, “descriptive statistics”, or “first statistics course”. A subject is the large size in the Sagefy system. A subject contains many units and other subjects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;The learner’s experience.&lt;/em&gt;&lt;/strong&gt; For the learner, Sagefy is a simple, focused flow that allows for some choice in the process.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; After signing up, the learner finds a subject the learner would like to learn.&lt;/li&gt;
&lt;li&gt; Then, once starting the subject, the learner will see the tree of units that represent their progress to the learning goal.&lt;/li&gt;
&lt;li&gt; Next, the learner can choose a unit, with one choice recommended automatically.&lt;/li&gt;
&lt;li&gt; The learner engages with the content, in the form of videos, audio, written pages, multiple choice questions, short answers… until the learner has learned the unit.&lt;/li&gt;
&lt;li&gt; Finally, the learner continues to choose units and learn them until the overall learning goal is complete.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="/images/why-11.png" class="article-body-image-wrapper"&gt;&lt;img src="/images/why-11.png" alt="Choosing the “An Introduction to Electronic Music — Foundation” subject."&gt;&lt;/a&gt;&lt;a href="/images/why-12.png" class="article-body-image-wrapper"&gt;&lt;img src="/images/why-12.png" alt="The learner’s progress towards the subject, in the form of a tree of&amp;nbsp;units."&gt;&lt;/a&gt;&lt;a href="/images/why-13.png" class="article-body-image-wrapper"&gt;&lt;img src="/images/why-13.png" alt="The learner chooses a&amp;nbsp;unit."&gt;&lt;/a&gt;&lt;a href="/images/why-14.png" class="article-body-image-wrapper"&gt;&lt;img src="/images/why-14.png" alt="The learner engages with the content until the learner has learned the unit. Sagefy shows the learner’s progress in a bar across the bottom of the&amp;nbsp;screen."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;The content creation process.&lt;/em&gt;&lt;/strong&gt; Most open-content sites advertise “anyone can edit.” And it’s a true statement. However, that doesn’t mean you should expect to go to Wikipedia, make changes on a popular page, and still see those changes still there even one minute later. There’s an implied process instead:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Go to the talk page, and describe the changes you’d like to make.&lt;/li&gt;
&lt;li&gt; Build a consensus with those who work on that content to make the change.&lt;/li&gt;
&lt;li&gt; Resolve any dissenting opinions.&lt;/li&gt;
&lt;li&gt; Make your content change.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Discussion is an inherit part of any consensus-driven process. So for Sagefy, rather than allowing direct editing, the content process requires discussion. And where else to post other than in the topic itself?&lt;/p&gt;

&lt;p&gt;So to create a new unit, let’s say “describe the differences between mean, median, and mode”, the process in Sagefy would look like:&lt;/p&gt;

&lt;p&gt;&lt;a href="/images/why-15.png" class="article-body-image-wrapper"&gt;&lt;img src="/images/why-15.png" alt="An outdated screenshot. A proposal with enough votes approving will update the entity automatically, focusing the content creation process on discussion. You can also see Sagefy is still rough around the&amp;nbsp;edges."&gt;&lt;/a&gt;&lt;a href="/images/why-16.png" class="article-body-image-wrapper"&gt;&lt;img src="/images/why-16.png" alt="An outdated screenshot. When you create a topic or post, you can choose between a regular post, a proposal, or a&amp;nbsp;vote."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Go to the discussion section of the relevant subject, and make a type of post called a &lt;em&gt;proposal&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt; Describe the content you’d like to add by filling out the form. (So there’s no overhead.)&lt;/li&gt;
&lt;li&gt; Summon enough people to agree with your proposal. They can do so using the &lt;em&gt;vote&lt;/em&gt; post type.&lt;/li&gt;
&lt;li&gt; If someone has voted down your proposal, you can work with them to resolve differences or try to create a different proposal instead.&lt;/li&gt;
&lt;li&gt; When there are enough approving votes and almost no down votes left, the change will automatically occur. (&lt;a href="https://github.com/heiskr/sagefy/wiki/Planning%3A-Contributor-Ratings" rel="noopener noreferrer"&gt;I have documented the specific math&lt;/a&gt;.)&lt;/li&gt;
&lt;li&gt; Sagefy keeps a history of all changes made and proposed to every card, unit, and subject.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Because Sagefy is an adaptive learning system, content creators get statistical indicators of how different content performs with real learners. Hopefully, these statistics will help us to improve content and experiment to find teaching opportunities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;The adaptive learning process.&lt;/em&gt;&lt;/strong&gt; We know that &lt;a href="http://www.npr.org/sections/health-shots/2015/09/08/438592588/one-tutor-one-student-better-math-scores-less-fear" rel="noopener noreferrer"&gt;one-on-one learning&lt;/a&gt; tends to have the highest effectiveness. Why? Because there’s an immediate feedback from the learner to the mentor. Does the learner already know the subject? Skip ahead. Missing something? Let’s back up. Bored? Let’s switch to something else. This interaction is easy to do one-on-one, but basically impossible when there’s multiple learners per mentor. Technology, however, makes this interaction widely scalable.&lt;/p&gt;

&lt;p&gt;If you’re interested in getting into specific of what I’ve built so far and planned, &lt;a href="https://github.com/heiskr/sagefy/wiki/Planning%3A-Sequencer" rel="noopener noreferrer"&gt;I have that documented&lt;/a&gt;. I’ve tried to come up with something simple, easy to calculate, and fast on a server, while also general enough to work for a wide variety of topics. I hope someone smarter than me comes along and finds a much better way to do it than I have, but what I have is enough to get started with showing the concept.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sagefy’s ideas
&lt;/h2&gt;

&lt;p&gt;After spending a few years reading of reading books and articles on educational research, I’ve come to the conclusion there are seven main ideas that come up repeatedly:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Do one thing at a time.&lt;/li&gt;
&lt;li&gt; Set and adapt to goals.&lt;/li&gt;
&lt;li&gt; Adapt to the learner’s prior knowledge.&lt;/li&gt;
&lt;li&gt; Build the graph.&lt;/li&gt;
&lt;li&gt; Dive deep, going beyond rote memorization.&lt;/li&gt;
&lt;li&gt; Connect the learning experience with real-life examples.&lt;/li&gt;
&lt;li&gt; Get learners to learn together.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="/images/why-17.png" class="article-body-image-wrapper"&gt;&lt;img src="/images/why-17.png" alt="“Do one thing at a time.” Sagefy tucks away other options behind a menu, so the learner can solely focus on the single task at the&amp;nbsp;time."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do one thing at a time.&lt;/strong&gt; &lt;a href="http://www.apa.org/monitor/oct01/multitask.aspx" rel="noopener noreferrer"&gt;Multitasking is a well established myth&lt;/a&gt;. When we think we’re multitasking, instead what we are really doing is rapidly context-switching. Multitasking increases the time to complete individual tasks. We also can’t really learn more than one concept at a time, either. It’s better to focus on learning one concept, or one integration of concepts, at a single time. “Do one thing” also means cutting clutter and tucking away everything that isn’t the task at hand, creating focus.&lt;/p&gt;

&lt;p&gt;&lt;a href="/images/why-18.png" class="article-body-image-wrapper"&gt;&lt;img src="/images/why-18.png" alt="Sagefy shows how the content creators organized the information, in the form of a tree of unit requirements."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Set and adhere to goals.&lt;/strong&gt; Focus comes up again. When we present content to the learner outside of their goal, the learner loses motivation. Sometimes we do this mistakenly, other times we do this out of passion for the subject. Either way, by clearly articulating the goal the learner, the learner knows what parts of the content are primary, and which parts are supplementary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Adapt to the learner’s prior knowledge.&lt;/strong&gt; This idea is the one Sagefy focuses on the most. I’ve iterated this idea quite a bit throughout this article so far. If we task a learner with material they don’t have the prerequisite knowledge for, there’s no place to fit the new information in to. If the learner already knows the material, the learner gets bored and loses motivation. By optimizing for prior knowledge, we can reduce the time and effort it takes to learn new things. &lt;a href="https://www.nap.edu/read/9853/chapter/6#78" rel="noopener noreferrer"&gt;Here’s&lt;/a&gt; &lt;a href="http://rer.sagepub.com/content/69/2/145.abstract" rel="noopener noreferrer"&gt;some&lt;/a&gt; &lt;a href="http://onlinelibrary.wiley.com/doi/10.1002/tea.3660160403/pdf" rel="noopener noreferrer"&gt;research&lt;/a&gt; &lt;a href="https://www.nap.edu/read/10019/chapter/6#83" rel="noopener noreferrer"&gt;resources&lt;/a&gt; for further investigation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build the graph.&lt;/strong&gt; Our learning system works not by just absorbing new material, but by connecting existing knowledge to new knowledge. Because of this, its critical to show how new information fits into the learner’s existing schema of what they are learning. Without this organizational map, learners can have difficulty storing the new information effectively.&lt;/p&gt;

&lt;p&gt;&lt;a href="/images/why-19.png" class="article-body-image-wrapper"&gt;&lt;img src="/images/why-19.png" alt="By showing the goal to the learner, we help create focus and motivation."&gt;&lt;/a&gt;&lt;a href="/images/why-20.png" class="article-body-image-wrapper"&gt;&lt;img src="/images/why-20.png" alt="A variety of card types allows for content creators to both ‘dive deep’ and connect with real-life examples."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dive deep, going beyond rote memorization.&lt;/strong&gt; It would be silly to expect that someone who just memorized the names of the different joints in the body to then immediately perform knee surgery. Knowing the information isn’t enough. We also need to know how the information relates to other information, as well as how to apply that information to a variety of contexts. Those are separate pieces of knowledge. And its also not enough to expect learners to have something memorized for life after the first time they see the information. The learner needs to review information regularly to keep the memory strong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Connect the learning experience with real-life examples.&lt;/strong&gt; How many of us have been in a math class where the teacher goes very deep in abstractions, proofs, etc. without explaining how the concept is relevant? That’s the counter of this principle. When we show the learner the relevance of the material and also make connections to something tangible they already know, the learner integrates the material into their memory more quickly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Get learners to learn together.&lt;/strong&gt; By learning together, we can avoid gaps in knowledge. Also, we can work with someone at a similar level of prior knowledge to form knowledge, especially about how we can apply that knowledge to different contexts and different understandings. Of the ideas here, this idea has the most nuance. A learner with little prior knowledge would normally benefit from individual study before joining a group of learners. I haven’t figured out a good way to integrate social learning into Sagefy other than working together to create content. But, social learning is a topic I’d like to pursue more in the future.&lt;/p&gt;

&lt;p&gt;There’s not widespread dissent on any of these points, though there are some nuances. Despite the repetition of these points throughout the literature, many of our current learning systems fail to take full advantage of these ideas.&lt;/p&gt;

&lt;h2&gt;
  
  
  What makes Sagefy different
&lt;/h2&gt;

&lt;p&gt;In this section, I’ll talk about some of the existing learning systems and how Sagefy would compare to them.&lt;/p&gt;

&lt;p&gt;&lt;a href="/images/why-21.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="/images/why-21.jpeg" alt="The classroom suffers from both a lack of scale and adaptability. [https://commons.wikimedia.org/wiki/File:Andrew_Classroom_De_La_Salle_University.jpeg](https://commons.wikimedia.org/wiki/File:Andrew_Classroom_De_La_Salle_University.jpeg)"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Classroom" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;Classroom learning&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&lt;em&gt;.&lt;/em&gt;&lt;/strong&gt; When we think of education, the classroom comes to mind first. The classroom can be a wonderful place to learn, to interact with other learners, and engage the content fully. The best classes motivate and inspire. Unfortunately, many classes don’t meet this bar. With so many learners, it is very difficult to create a system where the the system adapts the content tightly to the learner’s knowledge and goals. The classroom isn’t a free thing by any means, either, limiting its reach. Some teachers do a wonderful job of staying focused, showing examples, showing organization, getting learners to learn together, and going deep with the materials. But not all do. Probably not most.&lt;/p&gt;

&lt;p&gt;&lt;a href="/images/why-22.png" class="article-body-image-wrapper"&gt;&lt;img src="/images/why-22.png" alt="A screenshot of Moodle, an open-source learning management system. Designed to support in person classes, but sometimes used to teach a course by itself. [https://commons.wikimedia.org/wiki/File:1_MyHomeExample.png](https://commons.wikimedia.org/wiki/File:1_MyHomeExample.png)"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Learning_management_system" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;Learning management systems&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&lt;em&gt;.&lt;/em&gt;&lt;/strong&gt; Learning management systems, or LMSs, are the most common educational technology used. Schools probably use &lt;a href="http://www.blackboard.com/" rel="noopener noreferrer"&gt;Blackboard&lt;/a&gt; most frequently. The intention of the technology is to support or replace the classroom experience. The LMS’s features are almost completely driven around the classroom model. So most of the same issues with the classroom would apply to LMS, including both scale and adaptability. Most LMSs are not adaptive. &lt;a href="https://www.smartsparrow.com/" rel="noopener noreferrer"&gt;SmartSparrow&lt;/a&gt; is one example of an LMS that is.&lt;/p&gt;

&lt;p&gt;&lt;a href="/images/why-23.png" class="article-body-image-wrapper"&gt;&lt;img src="/images/why-23.png" alt="A screenshot from Cognitive Tutor, a current adaptive learning system. The interactions it can produce are surprisingly rich and detailed. That said, it takes a long time to produce content for the system. [https://www.carnegielearning.com/learning-solutions/software/cognitive-tutor/](https://www.carnegielearning.com/learning-solutions/software/cognitive-tutor/)"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Adaptive_learning" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;Current adaptive learning systems&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&lt;em&gt;.&lt;/em&gt;&lt;/strong&gt; Current adaptive learning systems pair adaptive learning algorithms with expert created content. Usually, these systems support either classroom education or training. The adaptive ability, paired with the ability to create highly customized content for the given subject, means these systems currently provide some of the best in class experiences for learners. That said, making an adaptive learning system takes time and effort. I’m not aware of any of these systems that support open-content or are free for public use. I’m also not aware of any that deal with the groups of learners scenario. Some examples of this are &lt;a href="https://www.carnegielearning.com/learning-solutions/software/cognitive-tutor/" rel="noopener noreferrer"&gt;Cognitive Tutor&lt;/a&gt;, &lt;a href="https://www.aleks.com/" rel="noopener noreferrer"&gt;Aleks&lt;/a&gt;, &lt;a href="https://www.mheducation.com/highered/platforms/learnsmart.html" rel="noopener noreferrer"&gt;LearnSmart&lt;/a&gt;, and &lt;a href="https://www.knewton.com/" rel="noopener noreferrer"&gt;Knewton&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="/images/why-24.png" class="article-body-image-wrapper"&gt;&lt;img src="/images/why-24.png" alt="Screenshot from Khan Academy, a massively open online course. Here we see a ‘blackboard’ style video explanation. Some of this content is best in class. [https://commons.wikimedia.org/wiki/File:Khan_Academy_%282012%29._Transfer_Pricing_and_Tax_Havens.webm](https://commons.wikimedia.org/wiki/File:Khan_Academy_%282012%29._Transfer_Pricing_and_Tax_Havens.webm)"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Massive_open_online_course" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;Massive open online courses&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&lt;em&gt;.&lt;/em&gt;&lt;/strong&gt; Massively open online courses provide a LMS type of experience for free or low cost to a large audience. A few examples are &lt;a href="https://www.khanacademy.org/" rel="noopener noreferrer"&gt;Khan Academy&lt;/a&gt;, &lt;a href="https://www.coursera.org/" rel="noopener noreferrer"&gt;Coursera&lt;/a&gt;, &lt;a href="https://www.duolingo.com/" rel="noopener noreferrer"&gt;Duolingo&lt;/a&gt;, and &lt;a href="https://www.edx.org/" rel="noopener noreferrer"&gt;EdX&lt;/a&gt;. MOOCs scale widely, but still rely on expert created content and generally are not very adaptive. Some have some adaptive or adaptive-like features, like quizzes or practice questions that change in difficulty. Most MOOCs have the same disadvantages as LMSs. The quality varies widely; some of the content is best in class, some of it is thrown together.&lt;/p&gt;

&lt;p&gt;There’s a few examples of MOOC-like platforms that do things a little differently. Udacity involves more practice, which is a plus, but still along the same lines. Duolingo focuses on languages, and uses gamification techniques. Khan Academy has a beautiful tree of knowledge, showing prerequisites easily, and again integrating practice heavily into the system. A few of the alternative MOOCs focus on problem-based learning instead of lecture-based.&lt;/p&gt;

&lt;p&gt;&lt;a href="/images/why-25.png" class="article-body-image-wrapper"&gt;&lt;img src="/images/why-25.png" alt="A screenshot of Anki, a flash card system based on spaced repetition. [https://commons.wikimedia.org/wiki/Category:Anki#/media/File:Anki.png](https://commons.wikimedia.org/wiki/Category:Anki#/media/File:Anki.png)"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/List_of_flashcard_software" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;Flash card systems&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&lt;em&gt;.&lt;/em&gt;&lt;/strong&gt; Flash cards systems are super common. Usually, these are learner created content, and provided for free. Some of these have some adaptive qualities, like &lt;a href="https://en.wikipedia.org/wiki/Spaced_repetition" rel="noopener noreferrer"&gt;spaced repetition&lt;/a&gt;. Spaced repetition means that a learner will review the material after 1 day, then 3 days, then 7 days, and so on, until the material is strongly stored in long-term memory. Flash card system though don’t go beyond memorization. A few examples of these systems are &lt;a href="http://ankisrs.net/" rel="noopener noreferrer"&gt;Anki&lt;/a&gt; and &lt;a href="https://www.supermemo.com/" rel="noopener noreferrer"&gt;SuperMemo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="/images/why-26.png" class="article-body-image-wrapper"&gt;&lt;img src="/images/why-26.png" alt="A screenshot from Wikipedia, the largest open-content system that exists. [https://commons.wikimedia.org/wiki/Wikipedia#/media/File:Www.wikipedia.org_screenshot_2013.png](https://commons.wikimedia.org/wiki/Wikipedia#/media/File:Www.wikipedia.org_screenshot_2013.png)"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Open_content" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;Open content systems&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&lt;em&gt;.&lt;/em&gt;&lt;/strong&gt; Current open content systems provide deep, high quality content on a variety of topics. However, they do not have adaptive qualities generally. The most common and largest example is &lt;a href="https://www.wikipedia.org/" rel="noopener noreferrer"&gt;Wikipedia&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The backstory of&amp;nbsp;Sagefy
&lt;/h2&gt;

&lt;p&gt;Like most people, I considered the means of learning while attending school. As a technologist, I often considered how I would do things differently, or how to optimize the experience. For every wonderful, inspiring, enriching, and useful course I’ve taken over my life, there have been at least three or four that weren’t. During my time in graduate school, I also had the opportunity of getting to work on &lt;a href="https://library.uoregon.edu/cmet" rel="noopener noreferrer"&gt;educational websites for the University of Oregon&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;After finishing school, it became clear immediately to me how many of my peers were struggling. All of us have been through 17 or more years of the education system. 17 years of largely forgotten material. 17 years of preparing to be adults in this society. Many of my peers still, about seven or eight years later, work either as baristas at Starbucks or clerks at the Apple store. I’m sorry, but no one is buying a house on $40k a year when there’s also $30k in student loans. I know, first world problems. I’ve been lucky to find myself in a career track in software, especially given that my degrees are in art and music.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It takes about 17 years in the education system to become considered a contributing adult in our&amp;nbsp;society.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;17 years is just too long. 17 years is too long to become a contributing adult. Our expectations of how learning should work and what really works are so far out of sync. (I’m not saying Sagefy is &lt;em&gt;the&lt;/em&gt; solution to that, just that we need to be having the conversation.)&lt;/p&gt;

&lt;p&gt;There was a time in my life, about 2012 or so, I got hooked on watching &lt;a href="https://www.ted.com/" rel="noopener noreferrer"&gt;TED videos&lt;/a&gt;. Yes, yes, a great deal of it is the same inspirational fluff on repeat. Some of it &lt;em&gt;is&lt;/em&gt; unique, however. During that time, my life had put me in this place and position. I was just following the course in front of me. And I started to ask myself, what do I really want to do? &lt;em&gt;What’s the best thing I can contribute?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;There’s so many huge challenges in front of us, more than any other time in human history. Global warming, energy, water, technological change, population growth, healthcare, debt. Just a few examples. I will never be a environmental scientist, a politician, a mathematician, a neuroscientist, or a rocket engineer. I’m not equipped to meet any specific challenge. &lt;strong&gt;But the greatest investment we can make is on learning.&lt;/strong&gt; If I can’t solve it, I can help someone who can.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I asked myself what the best thing I can contribute would be. I came to the answer that the best investment is on learning.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I started reading on learning science. It naturally fit into my knowledge and skills with user experience research. First, I started mostly with some &lt;a href="https://www.amazon.com/dp/0716786540" rel="noopener noreferrer"&gt;really&lt;/a&gt; &lt;a href="https://www.amazon.com/dp/0470484101" rel="noopener noreferrer"&gt;great&lt;/a&gt; &lt;a href="https://www.amazon.com/dp/0787988448" rel="noopener noreferrer"&gt;books&lt;/a&gt;. From there, I started to get into published articles, both academic and journalistic, about learning science. I started to form ideas of the best learning system I could imagine.&lt;/p&gt;

&lt;p&gt;&lt;a href="/images/why-27.png" class="article-body-image-wrapper"&gt;&lt;img src="/images/why-27.png" alt="An early wireframe from&amp;nbsp;Sagefy."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My friend Noah came for a visit for a few days in early 2013. I talked about my reading and my ideas. He asked me, &lt;em&gt;“why don’t you just build it?”&lt;/em&gt; At first it didn’t seem possible. But I started thinking about it. I started thinking about the &lt;a href="https://en.wikipedia.org/wiki/Minimum_viable_product" rel="noopener noreferrer"&gt;MVP&lt;/a&gt;. And even though I’m no expert at any specific part of it, I knew enough to put something together. I started working on Sagefy that April.&lt;/p&gt;

&lt;p&gt;&lt;a href="/images/why-28.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="/images/why-28.jpeg" alt="The equations for Bayesian Knowledge Tracing. It is simpler than it looks. P(L) is probability learned, P(S) is probability of “slip”, or making a mistake, and P(G) is probability of “guess”. P(T) is probability of “transit”, or how likely the learner learned the content from this material. From [https://www.researchgate.net/publication/249424313_Individualized_Bayesian_Knowledge_Tracing_Models](https://www.researchgate.net/publication/249424313_Individualized_Bayesian_Knowledge_Tracing_Models)"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I already knew how to build a web API and a web UI. So as I started &lt;a href="https://github.com/heiskr/sagefy/wiki/Planning" rel="noopener noreferrer"&gt;planning&lt;/a&gt; and working on those, I researched the algorithms side. I’ve taken quite a few online courses on different platforms, one of which being Ryan Baker’s &lt;a href="http://www.columbia.edu/~rsb2162/bigdataeducation.html" rel="noopener noreferrer"&gt;Big Data and Education&lt;/a&gt; course. Particularly, I understood the &lt;a href="https://www.youtube.com/watch?v=_7CtthPZJ70" rel="noopener noreferrer"&gt;Bayesian Knowledge Tracing&lt;/a&gt; section and saw a perfect fit for what I was trying to build. Now, an MVP &lt;a href="https://sagefy.org" rel="noopener noreferrer"&gt;exists and is live&lt;/a&gt;, ready for use.&lt;/p&gt;

&lt;p&gt;I realized after building the MVP that no one would understand what I built with no content. So the last few months, I’ve been building a small &lt;a href="https://sagefy.org/sets/CgDRJPfzJuTR916HdmosA3A8" rel="noopener noreferrer"&gt;course on Electronic Music,&lt;/a&gt; the area of my masters. The first few units are live.&lt;/p&gt;

&lt;h2&gt;
  
  
  The future of&amp;nbsp;Sagefy
&lt;/h2&gt;

&lt;p&gt;I realize, as much as anyone, that Sagefy &lt;em&gt;most likely won’t succeed&lt;/em&gt;. I’m okay with that. There’s so many things that can go wrong, and more importantly, so many right things that may not happen. Lack of interest, difficulty gaining a user base, challenges with creating content, or improving the adaptive algorithms… there’s many challenges ahead. My biggest hope is that, even if Sagefy isn’t successful, that Sagefy may &lt;em&gt;inspire a conversation&lt;/em&gt; about learning in this technological era. Sagefy doesn’t have to be big or successful, but &lt;em&gt;some system&lt;/em&gt; does need to be successful. &lt;em&gt;The opportunity is too great to ignore.&lt;/em&gt; For me, the best thing I can do is get some ideas out there about how to account for how people really learn in a learning system. Even if I fail, I can demonstrate that an alternative is both possible and realistic. Of course, if Sagefy does succeed, even better.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I hope that someday, Sagefy will become a place where anyone can come to learn anything, regardless of what they already know.&lt;/strong&gt; And then, be able to achieve their learning goal as quickly as possible. Whether its something small, or an entire degree program, Sagefy will have all the information available in a format realistic with how people learn. I realize some subjects we can only teach in person, but there’s so many subjects that &lt;em&gt;we could&lt;/em&gt; teach online that we don’t currently.&lt;/p&gt;

&lt;p&gt;I foresee a time too where some organizations, like schools, corporations, non-profits, and governments, would want to run their own instances of Sagefy for educational or training purposes. My current financial vision is Sagefy would be &lt;em&gt;donation supported&lt;/em&gt; for the public facing instance, and that support services would be available for private installations.&lt;/p&gt;

&lt;p&gt;If you’d like to know more about Sagefy, &lt;a href="https://sagefy.org" rel="noopener noreferrer"&gt;visit today&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Choosing an Open-Source License</title>
      <dc:creator>Kevin Heis</dc:creator>
      <pubDate>Wed, 21 Aug 2019 22:54:27 +0000</pubDate>
      <link>https://dev.to/heiskr/choosing-an-open-source-license-46k2</link>
      <guid>https://dev.to/heiskr/choosing-an-open-source-license-46k2</guid>
      <description>&lt;p&gt;I have to start this article by saying &lt;strong&gt;I’m not a lawyer&lt;/strong&gt;, and nothing in this article is legal advice. If you are looking for a legal recommendation, ask an attorney.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Sagefy is open&amp;nbsp;source
&lt;/h2&gt;

&lt;p&gt;When I started &lt;a href="https://sagefy.org"&gt;&lt;strong&gt;Sagefy&lt;/strong&gt;&lt;/a&gt; back in April of 2013, I wanted to build a system where &lt;a href="https://dev.to%7B%%20post_url%202016-09-14-why-i-m-building-sagefy%20%%7D"&gt;&lt;strong&gt;anyone can learn anything&lt;/strong&gt;&lt;/a&gt;. Where learning is accessible to every learner. Where the experience is completely &lt;em&gt;adapted&lt;/em&gt; to the learner’s goals and prior knowledge. Accelerating human learning is the best investment we can make.&lt;/p&gt;

&lt;p&gt;I knew I wanted to go &lt;strong&gt;open source&lt;/strong&gt;. Open source software has permanence, collaborative environment, and freedom from the profit motive. My passion for accelerating human learning needs the open source perspective. &lt;em&gt;Financial incentives overwhelm education.&lt;/em&gt; The open source mindset and my objectives fit perfectly. I’m a true believer in the &lt;a href="http://www.catb.org/esr/writings/cathedral-bazaar/"&gt;power of open source software&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with picking a&amp;nbsp;license
&lt;/h2&gt;

&lt;p&gt;In short, the first decision is &lt;em&gt;if you want to develop your project in&lt;/em&gt; &lt;strong&gt;&lt;em&gt;open source&lt;/em&gt;&lt;/strong&gt;. For Sagefy, I wanted to go in the open source direction.&lt;/p&gt;

&lt;p&gt;Software engineers often default to create their personal projects on &lt;a href="https://github.com/"&gt;Github&lt;/a&gt; in public. Yet, tech companies almost always default to building proprietary systems. It’s a strange conflict. The reason for the conflict is between the values of entrepreneurship and the values of the open web.&lt;/p&gt;

&lt;p&gt;Once you’ve decided to go open source, the next decision is: &lt;strong&gt;choosing a license&lt;/strong&gt;. For Sagefy, this decision was a more difficult process. The Open Source Initiative &lt;em&gt;lists&lt;/em&gt; &lt;a href="https://opensource.org/licenses/alphabetical"&gt;&lt;em&gt;78 acceptable open source licenses&lt;/em&gt;&lt;/a&gt; &lt;em&gt;currently&lt;/em&gt;. And that’s only for the code! For content, there’s even more options. Each of these licenses look similar on the surface, but the differences are astronomical. Different values, different concerns, different strategies, different implications, different compatibility.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I first chose AGPL3 for Sagefy.&lt;/em&gt; I didn’t know much about the different licenses. I knew I was creating a web service, and AGPL3 covered this use case. I popped the license in, and didn’t think much about the issue for a few months.&lt;/p&gt;

&lt;h2&gt;
  
  
  Most popular&amp;nbsp;licenses
&lt;/h2&gt;

&lt;p&gt;The first consideration in choosing a license is to &lt;strong&gt;go with a popular license&lt;/strong&gt;. With a popular license, people know what the license means. People know what the restrictions are, and know how to interact with the project. With less common licenses, its more work for contributors to understand the rules. An uncommon license may deter contributors and adoption. Furthermore, popular licenses are popular for good reason: &lt;em&gt;the community vetted them&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;So which licenses are the most popular? It’s difficult to say because there’s so many different ways to measure. GitHub is about as neutral and as large as we can get. According to their &lt;a href="https://github.com/blog/1964-open-source-license-usage-on-github-com"&gt;2015 blog post,&lt;/a&gt; the &lt;strong&gt;MIT license&lt;/strong&gt; is by far the front runner with &lt;em&gt;44% of all licenses&lt;/em&gt;. That’s not surprising to anyone in the open source world. The MIT license is permissive and compatible.&lt;/p&gt;

&lt;p&gt;The next two most common are &lt;strong&gt;GPL2&lt;/strong&gt; and &lt;strong&gt;Apache 2&lt;/strong&gt;. Apache 2 is popular with corporations. Corporations see Apache 2 as a more formal version of the compatible MIT license. GPL2 has a history with Linux. Other popular licenses are &lt;strong&gt;GPL3&lt;/strong&gt; and &lt;strong&gt;BSD 3-clause&lt;/strong&gt;. &lt;em&gt;Unlicense&lt;/em&gt;, &lt;em&gt;BSD 2-clause&lt;/em&gt;, &lt;em&gt;LGPL3&lt;/em&gt;, and &lt;em&gt;AGPL3&lt;/em&gt; round out the top. Each of those last four are about 1–2% of all licenses each.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reviewing license options, conflicting values,&amp;nbsp;impacts
&lt;/h2&gt;

&lt;p&gt;I further researched about setting up an open-source project. I realized I knew little about the differences between the licenses. So here’s my non-lawyer take on them. Please note I am &lt;strong&gt;NOT A LAWYER&lt;/strong&gt;. &lt;em&gt;And this is not legal advice&lt;/em&gt;. If you have questions, you should talk with an intellectual property attorney.&lt;/p&gt;

&lt;h3&gt;
  
  
  The permissive licenses: MIT, Apache 2, BSD 2-clause, BSD 3-clause, and Unlicense
&lt;/h3&gt;

&lt;p&gt;If I want a super permissive license or have no idea what I want, &lt;strong&gt;I pick MIT&lt;/strong&gt;. If I am concerned about patents, contributor agreements, or trademarks, &lt;strong&gt;I choose Apache 2&lt;/strong&gt;. Be aware if you pick Apache 2, other open source projects under GPL2 may be reluctant to use your project.&lt;/p&gt;

&lt;p&gt;The &lt;a href="http://choosealicense.com/licenses/mit/"&gt;&lt;strong&gt;MIT license&lt;/strong&gt;&lt;/a&gt; is short. The MIT license appeals to the ideal of minimalism. The MIT license pretty much just says:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can &lt;em&gt;do almost anything&lt;/em&gt; you want with this code.&lt;/li&gt;
&lt;li&gt;You have to &lt;em&gt;include the license&lt;/em&gt; if you redistribute this code.&lt;/li&gt;
&lt;li&gt;The author waives any warranties. &lt;em&gt;You’re on your own&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The MIT license is by far the most common for a reason: it’s &lt;em&gt;simple&lt;/em&gt; and &lt;em&gt;easy to understand&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://choosealicense.com/licenses/apache-2.0/"&gt;&lt;strong&gt;Apache 2&lt;/strong&gt;&lt;/a&gt; is often used for large projects and corporate backed projects. Despite being many times the length of the MIT license, the Apache license is similar. The length includes definitions of legal terms to avoid ambiguities. Apache 2 adds the following to the scope of the MIT license:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The authors are allowing you to use &lt;em&gt;patents&lt;/em&gt; related to the code.&lt;/li&gt;
&lt;li&gt;If you redistribute the code, you need to &lt;em&gt;state what changes&lt;/em&gt; you’ve made.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Contributor works&lt;/em&gt; in the project are under the same license.&lt;/li&gt;
&lt;li&gt;You can’t use the authors’ &lt;em&gt;trademarks&lt;/em&gt; as your own.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Unfortunately patents are a major problem in the software world currently. That’s the main draw of the Apache 2 license. Protecting trademarks are within most corporate interests. And it’s not clear if open source projects need &lt;a href="https://en.wikipedia.org/wiki/Contributor_License_Agreement"&gt;Contributor License Agreements&lt;/a&gt;. Apache 2 addresses these concerns.&lt;/p&gt;

&lt;p&gt;There’s an unfortunate dark side to the Apache 2 license. &lt;em&gt;GPL2 licensed projects may not be able to consume your project&lt;/em&gt;. The GPL*&lt;em&gt;&lt;em&gt;3&lt;/em&gt;&lt;/em&gt;* licenses are all okay with consuming Apache 2 code. There’s disagreement between different groups about if Apache 2 and GPL*&lt;em&gt;&lt;em&gt;2&lt;/em&gt;&lt;/em&gt;* are compatible. I don’t agree there’s a compatibility issue. The &lt;a href="https://www.gnu.org/licenses/license-list.html#apache2"&gt;position of the Free Software Foundation&lt;/a&gt; is there is a compatibility issue.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://opensource.org/licenses/BSD-2-Clause"&gt;&lt;strong&gt;BSD 2-clause&lt;/strong&gt;&lt;/a&gt; is like the MIT license. As a non-lawyer, I can’t tell the difference, if there is any. The &lt;a href="https://opensource.org/licenses/BSD-3-Clause"&gt;&lt;strong&gt;BSD 3-clause&lt;/strong&gt;&lt;/a&gt; adds a third clause. If the original authors don’t endorse your work, you can’t pretend the original authors do. Granted, in real life, I don’t think you can’t make that claim regardless. The 2-clause is actually the younger form. I don’t see much reason to use the 3-clause over the 2-clause. I can’t say I would ever use either BSD license over the MIT license.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://choosealicense.com/licenses/unlicense/"&gt;&lt;strong&gt;Unlicense&lt;/strong&gt;&lt;/a&gt;, which despite its name is a license and is like the MIT license as well. To the scope of the MIT license, the Unlicense includes the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;em&gt;public domain&lt;/em&gt; release statement.&lt;/li&gt;
&lt;li&gt;Nothing says you &lt;em&gt;need&lt;/em&gt; to include the original license.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I can’t imagine there’s much of a practical difference between MIT and Unlicense. &lt;em&gt;Again, speaking as not-a-lawyer&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The copyleft licenses: GPL2, GPL3, LGPL3,&amp;nbsp;AGPL3
&lt;/h3&gt;

&lt;p&gt;The split here comes down to values. If you want anyone to use your software — a person, an organization, a business, whatever — then permissive licenses are the way to go. But, if you want derivatives &lt;em&gt;to stay completely in the realm of open source&lt;/em&gt;, &lt;strong&gt;GPL&lt;/strong&gt; may be the right way to go for you. If you choose a copyleft license, many companies will be &lt;em&gt;reluctant&lt;/em&gt; to use your software. &lt;em&gt;The essence of a copyleft license is derivative works must use the same license.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html"&gt;&lt;strong&gt;GPL2&lt;/strong&gt;&lt;/a&gt; is the license of Linux. The bullet points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can &lt;em&gt;do almost anything&lt;/em&gt; you want with this code.&lt;/li&gt;
&lt;li&gt;You must &lt;em&gt;include the original license&lt;/em&gt; in forks.&lt;/li&gt;
&lt;li&gt;Copyleft: Derivatives must be &lt;em&gt;under the same license&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;No warranties. &lt;em&gt;You’re on your own&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At a glance, just from these items the main difference from MIT is the &lt;em&gt;copyleft part&lt;/em&gt;. The full license does get a bit more technical about specific legal situations.&lt;/p&gt;

&lt;p&gt;The &lt;a href="http://www.informationweek.com/the-torvalds-transcript-why-i-absolutely-love-gpl-version-2/d/d-id/1053128?"&gt;first author of Linux feels&lt;/a&gt; this license is the best for his work. His reason is something like: “there should only be &lt;em&gt;one true&lt;/em&gt; open source license and not a variety of them.” Many large projects use GPL2 instead of GPL3 for this reason.&lt;/p&gt;

&lt;p&gt;I agree the decision can be &lt;em&gt;difficult to figure out which license&lt;/em&gt; is the right one for a given project. But on further examination, different teams value different things. And that’s okay.&lt;/p&gt;

&lt;p&gt;The &lt;a href="http://choosealicense.com/licenses/gpl-3.0/"&gt;&lt;strong&gt;GPL3&lt;/strong&gt;&lt;/a&gt; reads like the GPL2 license. GPL3 addresses patents, &lt;a href="https://en.wikipedia.org/wiki/Digital_rights_management"&gt;digital rights management,&lt;/a&gt; compatibility with other licenses, and license violations. GPL3 code is able to consume Apache 2 projects. If you want alignment with other projects already doing so, use GPL2. Otherwise, I can’t say I find a compelling reason to use GPL2 over GPL3.&lt;/p&gt;

&lt;p&gt;The &lt;a href="http://choosealicense.com/licenses/lgpl-3.0/"&gt;&lt;strong&gt;LGPL3&lt;/strong&gt;&lt;/a&gt; softens some of the copyleft of the plain GPL3. You can “&lt;em&gt;link&lt;/em&gt;” to the project without the copyleft coming into play. We can debate what linking means, but you are giving an “out” to the copyleft provision. The &lt;a href="http://choosealicense.com/licenses/agpl-3.0/"&gt;&lt;strong&gt;AGPL3&lt;/strong&gt;&lt;/a&gt; tightens those restrictions: using the project “&lt;em&gt;over a network&lt;/em&gt;” triggers copyleft.&lt;/p&gt;

&lt;p&gt;GitHub created the website &lt;a href="http://choosealicense.com/"&gt;http://choosealicense.com/&lt;/a&gt;. This website puts the top 3 licenses as the MIT License, Apache 2, and GPL3. That’s a good representation.&lt;/p&gt;

&lt;p&gt;This article doesn’t describe all 78 open source licenses. But &lt;em&gt;maybe&lt;/em&gt; one of the other licenses is a better fit for your project. That’s up to you.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Criteria
&lt;/h2&gt;

&lt;p&gt;I would start out a new project with the following criteria:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do I want &lt;em&gt;copyleft&lt;/em&gt;?&lt;/li&gt;
&lt;li&gt;—&amp;nbsp;…and do I care about over &lt;em&gt;network&lt;/em&gt; use? &lt;strong&gt;AGPL3&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;—&amp;nbsp;…do I want alignment with other projects? &lt;strong&gt;GPL2&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;— &lt;em&gt;Else&lt;/em&gt;, &lt;strong&gt;GPL3&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Else…&lt;/li&gt;
&lt;li&gt;—Do I worry about patents, contributor license agreements, or protecting my brand? Am I not concerned about GPL2 projects? &lt;strong&gt;Apache 2&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;— Else&lt;/em&gt;, &lt;strong&gt;MIT&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These would be my criteria. I’m not making a recommendation here. If you need a recommendation, then you need to speak with an attorney.&lt;/p&gt;

&lt;h2&gt;
  
  
  Chosen license: Apache&amp;nbsp;2.0
&lt;/h2&gt;

&lt;p&gt;I chose to change Sagefy from AGPL3 to Apache 2.0. I was the only contributor up to that point. I had no concern of getting other contributors to agree to the license change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do you want copyleft?&lt;/strong&gt; That decision makes the biggest difference. I want anyone who wants to use Sagefy to be able to do so. I want schools, other organizations, and corporations to set up their own instances. The copyleft provision makes people nervous. I’m amused no one second guesses using &lt;em&gt;Linux&lt;/em&gt; or &lt;em&gt;Wordpress — they’re both GPL2.&lt;/em&gt; But for other projects, people worry.&lt;/p&gt;

&lt;p&gt;Getting more people to use your project means you’ll get contributions more quickly. You won’t get the same percentage out in the public. 100% for copyleft, less than 100% for permissive. But do you want 100% of a smaller number, or less than 100% of a larger number? Different projects answer differently.&lt;/p&gt;

&lt;p&gt;That decision would have led me to MIT by default. For Sagefy, there’s &lt;em&gt;benefit&lt;/em&gt; to gaining the extra provisions from Apache 2.0. I have no real concern about GPL2 licensed software consuming Sagefy. &lt;em&gt;Not&lt;/em&gt; that I would have a problem with a GPL2 project using Sagefy, just I don’t see that scenario as a likely use case.&lt;/p&gt;

&lt;h2&gt;
  
  
  The future
&lt;/h2&gt;

&lt;p&gt;Sagefy will most likely stay with Apache 2. If there were to make any change at this point, the most likely would be to the MIT license. I don’t know of any lawsuits with the MIT license specific to patents, contributor license agreements, or trademarks. Perhaps Apache 2 isn’t necessary. &lt;em&gt;Yet, as the questions remain open, that’s the environment we’re in&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The law constantly changes.&lt;/strong&gt; Both in the body of the law and in the interpretation of the law. Because the law changes, so too will open source licenses. I wish we could have the ultimate, one single true open source license. The &lt;strong&gt;MIT license&lt;/strong&gt; is the closest thing we have currently. &lt;em&gt;But the law will change, and new licenses will adapt to those requirements.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When you’re first making an open source project, choosing a license can be &lt;em&gt;overwhelming&lt;/em&gt;. Decide if copyleft is the right decision for your project. If you do want &lt;em&gt;copyleft&lt;/em&gt;, you need to decide how strong you want the copyleft. If you don’t want copyleft, you can choose between: a &lt;em&gt;simple&lt;/em&gt; permissive license, or an &lt;em&gt;aware&lt;/em&gt; permissive license.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Any license you choose&lt;/em&gt;, open source software is changing the world faster than anything else. &lt;strong&gt;Come on in!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you’d like to know more about Sagefy, &lt;a href="https://sagefy.org"&gt;visit today&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to build an adaptive learning system</title>
      <dc:creator>Kevin Heis</dc:creator>
      <pubDate>Tue, 20 Aug 2019 00:00:00 +0000</pubDate>
      <link>https://dev.to/heiskr/how-to-build-an-adaptive-learning-system-4nm1</link>
      <guid>https://dev.to/heiskr/how-to-build-an-adaptive-learning-system-4nm1</guid>
      <description>&lt;p&gt;Have you ever started a course, but thought it was too slow? Or too difficult? Wish you could make it go faster? Felt like you didn't get enough practice to master the content? Adaptive learning systems seek to address these challenges.&lt;/p&gt;

&lt;p&gt;In this article, I’ll go over what adaptive learning systems are. I cover some background on why adaptive learning systems have the structure they do. I’ll introduce a few adaptive learning systems. Then, I talk about the four elements. And how you can architect an adaptive learning system. We’ll wrap up with evaluating the pros and cons of adaptive learning.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is an adaptive learning system?
&lt;/h2&gt;

&lt;p&gt;An adaptive learning system is software where algorithms optimize the content to adjust for the learner’s goals and current state of knowledge.&lt;/p&gt;

&lt;p&gt;In a traditional e-learning course, you will linearly follow the path an instructor creates. You watch videos, read articles, take quizzes, and practice interactive modules in a predetermined ordered. An adaptive learning system will contain the same types of materials. But the order will change for each learner. The system decides which content to show the learner based on two things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the learner’s &lt;strong&gt;goal&lt;/strong&gt; is only a subset of the content, the system can limit the content.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;prior knowledge&lt;/strong&gt; also comes into play. If the system determines the current path is too easy, the system can speed up to more challenging material. If the system finds out the current path is too difficult, the system may… intervene and review prerequisite content, reduce the challenge, or slow down the pace.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some related topics include intelligent tutors, adaptive testing, psychometrics, personalized learning, and smart teaching. Many of these topics share algorithms and structures with adaptive learning systems.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--27PXwauS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/adaptive-2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--27PXwauS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/adaptive-2.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Knowledge is a graph: neuroscience
&lt;/h2&gt;

&lt;p&gt;I’m going to start with a little background. This will create context for why adaptive learning systems have the four elements below. The point for this is &lt;em&gt;knowledge is a graph&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The human brain has 86 billion neurons. Every neuron has dendrites, a soma, and an axon.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0ztEy41z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Blausen_0657_MultipolarNeuron.png/1200px-Blausen_0657_MultipolarNeuron.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0ztEy41z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Blausen_0657_MultipolarNeuron.png/1200px-Blausen_0657_MultipolarNeuron.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;dendrites&lt;/strong&gt; are the &lt;em&gt;input&lt;/em&gt;. The edges of the dendrites receive neurotransmitters from the synapse. The synapse is a gap between two neurons.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;soma&lt;/strong&gt; is the &lt;em&gt;throughput&lt;/em&gt;. The soma – which contains the cell nucleus – routes the input from the dendrites.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;axon&lt;/strong&gt; is the &lt;em&gt;output&lt;/em&gt;. The axon transmits an action potential – an electrical signal – to the axon terminals. A myelin sheath covers the axon to protect the signal. The axon terminals release neurotranmitters into the synapse.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Information your brain receives and processes corresponds with a neural pathway. Your brain with &lt;em&gt;myelinate&lt;/em&gt; that pathway – strengthen the myelin around the axon to support electrical signals. Because of the strengthened myelin, this path will be more likely to fire in the future. In other words, you learn.&lt;/p&gt;

&lt;p&gt;Even in the smallest scale, our brain is a massive graph of connected neurons. We learn and optimize by making some paths more likely to connect than other paths.&lt;/p&gt;

&lt;h2&gt;
  
  
  Knowledge is a graph: learning science
&lt;/h2&gt;

&lt;p&gt;The strongest predictor of how we perform in a learning environment is our prior knowledge. What we already know before we start the learning experience. A notable psychology paper – 1999 Dochy, Segers, and Buehl – found prior knowledge is 81% of outcome differences between learners. Reviewing prior knowledge before showing new information impacts learning outcomes. And connecting new knowledge to prior knowledge while teaching can have a big impact too. (See &lt;a href="https://dev.to/stories/eight-big-ideas-of-learning"&gt;Eight Ideas&lt;/a&gt; for sources.)&lt;/p&gt;

&lt;p&gt;The most famous psychology paper is 1956 “The Magical Number Seven, Plus or Minus Two” by George Miller. The paper suggests that humans have a limited working memory. Miller found for simple numbers, a human could work with about seven items at once. Later researchers found for more complex information, that limit is closer to four.&lt;/p&gt;

&lt;p&gt;Some psychologists suggest of these “four slots”, for us to learn, at least one or two must be prior knowledge. How much prior knowledge we can “load up” into one of the four slots depends on the strength of the connections in the graph. When we have both prior knowledge and new knowledge in our working memory, we associate the information. And we strengthen the connection between the two. Trying to learn new information without connecting to prior knowledge limits the strength of the memory.&lt;/p&gt;

&lt;p&gt;In short, we learn by connecting prior knowledge to new information. And those connections form a large, endless graph of knowledge.&lt;/p&gt;

&lt;h2&gt;
  
  
  A few important adaptive learning systems
&lt;/h2&gt;

&lt;p&gt;This section is more context, but optional. I’m not writing an thorough article about the history of these systems, but here’s some bullets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One of the earliest implementations was the &lt;a href="https://en.wikipedia.org/wiki/Teaching_machine"&gt;Skinner teaching machine&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;During the 1960s and 1970s, there were several attempts at computerized instructional systems. Costs and slower machines limited the success of these systems.&lt;/li&gt;
&lt;li&gt;During the late 70s and early 80s, &lt;a href="https://en.wikipedia.org/wiki/Item_response_theory"&gt;Item Response Theory&lt;/a&gt; enabled test makers to start work on computerized adaptive testing.&lt;/li&gt;
&lt;li&gt;An early and influential computerized system was the Lisp tutor, also known as LISPITS (1983) at Carnegie Mellon University.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/SuperMemo"&gt;SuperMemo&lt;/a&gt;, released in 1985, incorporated spaced learning into a computerized system.&lt;/li&gt;
&lt;li&gt;Also in 1985 came paper for &lt;a href="https://en.wikipedia.org/wiki/Knowledge_space"&gt;Knowledge Spaces&lt;/a&gt;, which forms the foundations of one of the four elements.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/ALEKS"&gt;ALEKS Math tutor&lt;/a&gt; came out in 1994, heavily promoting its use of knowledge spaces.&lt;/li&gt;
&lt;li&gt;In 1995, Corbett and Anderson published “Knowledge tracing”, forming the foundation for &lt;a href="https://en.wikipedia.org/wiki/Bayesian_Knowledge_Tracing"&gt;Bayesian knowledge tracing&lt;/a&gt; models.&lt;/li&gt;
&lt;li&gt;Some important software includes &lt;a href="https://en.wikipedia.org/wiki/AutoTutor"&gt;AutoTutor&lt;/a&gt;, &lt;a href="https://en.wikipedia.org/wiki/ACT-R"&gt;ACT-R&lt;/a&gt;, and &lt;a href="http://ctat.pact.cs.cmu.edu/"&gt;Cognitive Tutor Authoring Tools&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/Knewton"&gt;Knewton&lt;/a&gt; is an example of contemporary adaptive learning systems. Kaplan and Pearson both use Knewton to provide adaptive learning experiences.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The four elements
&lt;/h2&gt;

&lt;p&gt;Most adaptive learning systems today have these four elements. The terms change and so do their scope. But you will almost always find all four elements.&lt;/p&gt;

&lt;p&gt;These elements are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;expert&lt;/strong&gt; – a graphical model of the “ideal” state, of everything the person could learn using this system.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;learner&lt;/strong&gt; – a model of the learner’s current state, which shows how likely the learner is to know each of the nodes in the expert graph.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;tutor&lt;/strong&gt; – the algorithms that determines what content to show and when. The expert model and the learner model inform the tutor. The tutor seeks to optimize content for relevance, challenge, and efficiency.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;interface&lt;/strong&gt; – which is how to display the learning experience to the learner. In many adaptive learning experience, the interface changes based on the learner model and the tutor’s goals.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s go into each element.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eujoUCqA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/adaptive-3.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eujoUCqA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/adaptive-3.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The expert — the big graph of everything
&lt;/h3&gt;

&lt;p&gt;The expert model is a large, connected graph of everything you want the learners to know. As the name suggests, you have an expert on the topic – or experts on topics – create the model. This model is static. The expert model only changes when the scope of learning outcomes change. Or when problems and opportunities to refine the adaptive learning system arises. Most of the work of the expert model is at the beginning of building a new learning experience. The adaptive learning system will access the expert model to compare the learner’s current state with the expert model. The system will also access the expert model to determine which learning experience to focus on next.&lt;/p&gt;

&lt;p&gt;Usually, a team of experts will define the scope of learning outcomes. Each node in the expert model should have the following attributes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A name&lt;/li&gt;
&lt;li&gt;A short description, which indicates which skills are under test and what is outside the scope&lt;/li&gt;
&lt;li&gt;A list of prerequisite nodes – these form the “edges” of the graph. These prerequisites cannot form a “cycle” – a loop of nodes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Expert models perform better when each node is small and narrowly defined. For example, each skill in Bloom’s taxonomy – recognition, understanding, application, analysis, synthesis, and evaluation – could each be its own node in the expert model. The combination of two underlying skills should also be a separate node.&lt;/p&gt;

&lt;p&gt;There is an endless number of formats you could use to create an expert model, such as XML, JSON, CSV, or YAML. It can help to be able to display the expert model graphically for review.&lt;/p&gt;

&lt;p&gt;Some systems will automatically generate an expert model by querying experts in a series of questions, like a wizard. Others will cluster existing learning content, using algorithms like k-means clustering. You may want to review the &lt;a href="https://en.wikipedia.org/wiki/Knowledge_space"&gt;wikipedia article on Knowledge spaces&lt;/a&gt; for a more mathematical description.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--E8GhG5JI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/adaptive-4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--E8GhG5JI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/adaptive-4.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The learner — where you are versus where you want to be
&lt;/h3&gt;

&lt;p&gt;The learner element is a model of the learner’s current state of ability. So for each given node in the expert graph, the learner model has a probability associated with it: 1-99%. The system updates this graph every time the learner performs an activity. If a learner answers a question correctly, the probability increases. If the learner answers incorrectly, the probability decreases. Each learner has their own learner model. So each time there’s a new learner in the system, there’s a new learner model. Later, the tutor will use the learner model to decide how to order the learning content.&lt;/p&gt;

&lt;p&gt;There’s many algorithms for updating the learner model. Knowledge spaces suggest that as a learner develops a skill, the probabilities for related skills should also adjust. Some adaptive learning systems use simple heuristic models for updating skill probabilities. In item response theory, the probability updates along a sigmoid curve. In Bayesian knowledge tracing, this curve has a more conservative shape. Each model tends to account for these factors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Before the learner does anything, what do we estimate the probability to be?&lt;/li&gt;
&lt;li&gt;How likely is a learner to guess the right answer if they don’t know the skill?&lt;/li&gt;
&lt;li&gt;How likely is a learner to slip up even if they know the skill?&lt;/li&gt;
&lt;li&gt;How likely is the learner to have “learned” the skill after seeing the item?&lt;/li&gt;
&lt;li&gt;How likely does this activity categorize the learner as skilled or unskilled?&lt;/li&gt;
&lt;li&gt;How difficult will this item be for this particular learner?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For both item response theory and Bayesian knowledge tracing, you’ll need a means to estimate these parameters. This is one of the most rapidly developing areas in adaptive learning systems, so I can’t make any specific recommendations yet. There’s also researchers creating models with classic machine learning, such as neural networks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--q5yJj9yA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/adaptive-5.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--q5yJj9yA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/adaptive-5.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The tutor — what to show when
&lt;/h3&gt;

&lt;p&gt;The tutor chooses which order to select the activities the learner will engage. After each update to the learner model, the tutor will update the path it will take to optimize for that learner. The goal of the tutor is to get the learner to a complete expert graph in the smallest amount of time. Some systems allow learners to focus only on some areas while ignoring the rest. As the learner model is unique per learner, so too is the paths the tutor will take. While the expert and learner elements are data with some algorithms, the tutor is algorithms with some data.&lt;/p&gt;

&lt;p&gt;The tutor may decide both which skills to focus on and which activities to have the learner perform. For the skills to focus on, the tutor will often choose skills with the largest impact on the larger graph. This often means focusing on more elementary skills before more advanced skills. For activities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The tutor will try to choose the most relevant activities to the learner&lt;/li&gt;
&lt;li&gt;The tutor will choose activities that are challenging, but not too difficult for the learner.&lt;/li&gt;
&lt;li&gt;The tutor will try to choose activities in a way that reduce the total time towards mastery.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Simple adaptive learning tutors may choose activities within a skill at random. Item response theory based tutors emphasize choosing activities that are challenging. In Bayesian knowledge tracing models the market has many different tutor algorithms. Researchers have focused more on the expert and learner elements. So we don’t know what produces the best learning outcomes for the tutor element.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pranzJxZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/adaptive-6.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pranzJxZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/adaptive-6.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The interface — how to show it
&lt;/h3&gt;

&lt;p&gt;Some adaptive learning systems will change the user interface. As the learner is less familiar with a skill, the interface would reduce and focus more on the task at hand. As learner ability grows, more of the full interface comes together. Some call this process “scaffolding”.&lt;/p&gt;

&lt;p&gt;In some systems, learners may ask for and receive hints. When to offer hints and the depth of those hints can adjust based on learner ability.&lt;/p&gt;

&lt;p&gt;There’s also some other questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do you display the expert graph to the learner?&lt;/li&gt;
&lt;li&gt;Do you display their progress on all skills? How?&lt;/li&gt;
&lt;li&gt;Do you display their progress on specific skills? How?&lt;/li&gt;
&lt;li&gt;Does the learner get choices in learning content? Or does the system decide everything?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Depending on the needs of the system, some of these items may impact learning outcomes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UlEEYiiQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/adaptive-7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UlEEYiiQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/adaptive-7.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How do we know if adaptive learning is any good?
&lt;/h2&gt;

&lt;p&gt;As these systems come from academia, we have a significant amount of data and history with each system.&lt;/p&gt;

&lt;p&gt;Human individual tutoring has the strongest learning outcomes. This is a common finding in educational research. So far, no computerized adaptive learning system has outperformed human one-on-one tutoring.&lt;/p&gt;

&lt;p&gt;Researchers have investigated classroom learning alone, computerized adaptive learning alone, as well as combined classroom and adaptive learning. A &lt;a href="https://www.researchgate.net/publication/277636218_Effectiveness_of_Intelligent_Tutoring_Systems_A_Meta-Analytic_Review"&gt;2016 paper “Effectiveness of Intelligent Tutoring Systems”&lt;/a&gt; provides a meta analysis of these studies. Adaptive learning systems usually outperform traditional classroom learning. Combined with classroom learning, adaptive learning systems create a positive effect, but there are some limitations.&lt;/p&gt;

&lt;p&gt;Adaptive systems do particularly well with instant feedback and ensuring skill mastery. Investigators note some areas for improvement:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The cost of developing content for these systems is high.&lt;/li&gt;
&lt;li&gt;These systems often can’t contextualize learning the way a human can.&lt;/li&gt;
&lt;li&gt;Adaptive learning systems can feel more challenging, which can reduce learner motivation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Wrap up
&lt;/h2&gt;

&lt;p&gt;Welp, I’ve nerded out now. I’ve covered what adaptive learning systems are. I’ve provided some context for the design of these systems. A touch of history. I’ve covered the four major elements: the expert, the learner, the tutor, and the interface. Hopefully it wasn’t too technical.&lt;/p&gt;

&lt;p&gt;Obligatory end-of-article call-to-action: &lt;a href="https://sagefy.org"&gt;Check out Sagefy&lt;/a&gt;, the open-content adaptive learning system I’m working on.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>A New Sagefy</title>
      <dc:creator>Kevin Heis</dc:creator>
      <pubDate>Wed, 31 Jul 2019 00:00:00 +0000</pubDate>
      <link>https://dev.to/heiskr/a-new-sagefy-3na4</link>
      <guid>https://dev.to/heiskr/a-new-sagefy-3na4</guid>
      <description>&lt;p&gt;In this post, I’m going to talk about what Sagefy is. Where Sagefy was in October last year. And why and how I changed Sagefy in the time since. I wanted to share how this big change went down. And document the changes for my future self.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Sagefy
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://sagefy.org"&gt;&lt;strong&gt;Sagefy&lt;/strong&gt;&lt;/a&gt; is an &lt;em&gt;&lt;a href="https://en.wikipedia.org/wiki/Open_content"&gt;open-content&lt;/a&gt; &lt;a href="https://en.wikipedia.org/wiki/Adaptive_learning"&gt;adaptive learning&lt;/a&gt;&lt;/em&gt; platform. Anyone can learn anything, and Sagefy adapts the content to the learner’s knowledge and goals. Sagefy is open-content, meaning anyone can view, create, edit, and share learning content. Sagefy is adaptive, meaning as you learn, Sagefy changes which learning activities it picks to fit your needs. Sagefy is open-source and freely available.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Sagefy was in October 2018
&lt;/h2&gt;

&lt;p&gt;I’ve been working on Sagefy &lt;a href="https://dev.to/stories/why-i-m-building-sagefy"&gt;since April 2013&lt;/a&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;A 2017 image of the homepage.&lt;/th&gt;
&lt;th&gt;A 2018 image of the choose unit page.&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NSQNpf0s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/1221423/62233948-7c0d2c00-b37e-11e9-84eb-bfcb6dced7c5.png" alt="x"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LveuvVWS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/1221423/62233951-7c0d2c00-b37e-11e9-9d5f-88c5a87f05cc.png" alt="x"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Sagefy in October 2018 had lots of features. It was quite capable. Despite being operational for a few years, there was litle human traffic to the site each day. There was about one account sign up per day. And in this version, as users needed accounts for most parts of the site, sign ups were a decent indicator of use. Which is to say, not much use at all.&lt;/p&gt;

&lt;p&gt;I’m a fan of usability testing and user interviews. Sagefy has had many of each. The feedback I got was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I don’t want to make an account to try it out.&lt;/li&gt;
&lt;li&gt;It doesn’t have the learning content that I want.&lt;/li&gt;
&lt;li&gt;I don’t understand what units and subjects are. (At the time there were 3 types of things: cards, units, and subjects.)&lt;/li&gt;
&lt;li&gt;I don’t understand how to make content. (And this was after several iterations of the content creation parts of the site.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Additionally, referral traffic was very low. Some of the technical choices made it difficult to optimize for search engines.&lt;/p&gt;

&lt;p&gt;On the technical side, I had an isomorphic rendering – JavaScript on client and server – with a small virtual-dom library. I had a Python server running REST endpoints with lots of raw SQL and home-built code. And endpoint logic to manage and update in several places with each change. Lots of endpoint logic. And I had three databases, &lt;a href="https://www.postgresql.org/"&gt;PostgresQL&lt;/a&gt;, &lt;a href="https://redis.io/"&gt;Redis&lt;/a&gt;, and &lt;a href="https://www.elastic.co/"&gt;Elasticsearch&lt;/a&gt;. All sitting behind an &lt;a href="https://www.nginx.com/"&gt;Nginx&lt;/a&gt; instance. Test builds were slow, but thorough. In later iterations I was using &lt;a href="https://www.docker.com/get-started"&gt;Docker and Docker Compose&lt;/a&gt;. This was all gravy, don’t get me wrong. It worked, and performed reasonably well. But change wasn’t always easy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I wanted to change Sagefy
&lt;/h2&gt;

&lt;p&gt;I decided in October 2018 it was time for a bigger change. I’m the first to argue for aggressive refactoring instead of rewriting a whole application. But as Sagefy is a side project, and with low traffic. The risks were lower with a rewrite. I also spent quite a bit of time the prior months trying to iterate the architecture to support anonymous – not logged in – users learning and making content. It was a ton of work, with no obvious end in sight.&lt;/p&gt;

&lt;p&gt;So with “fuck it, I’m going to rewrite Sagefy” being where I was, here were my goals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make Sagefy work with or without an account.&lt;/li&gt;
&lt;li&gt;Make it easier to make new content.&lt;/li&gt;
&lt;li&gt;Find a way to get lots of content quickly.&lt;/li&gt;
&lt;li&gt;Focus on leading people to the site with content that will get links and search engine traffic.&lt;/li&gt;
&lt;li&gt;Reducing the number of concepts and features.&lt;/li&gt;
&lt;li&gt;Figure out how to write way less code to make changes faster, so I can adapt to user feedback faster.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How the Sagefy changed
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Mocks
&lt;/h3&gt;

&lt;p&gt;My first action was to create some mocks for Sagefy. I wanted to figure out where I was going. I wanted to iterate fast.&lt;/p&gt;

&lt;p&gt;I did these in plain HTML, with the world’s most basic CSS sheet. I know HTML better than any design tool at this point. I used no CSS classes, only the standard tags with light inline styling. I published them on GitHub Pages for hosting. And I wanted to get feedback early, before any real technical investment.&lt;/p&gt;

&lt;p&gt;I started with the home page and subject pages, as those are the two pages that will start the user experience. I focused on flows rather than features. Ensuring the user always has a clear next action to take. I also wanted to make sure when people end up in “null states”, there’s something for them to do. For example, today when you search for a subject in Sagefy and you can’t find anything: it prompts you to go ahead and make a new subject. While keeping the above goals and mind. And editing. Lots of editing out features and capabilities. I focused on the main goal: to let anyone learn anything they want, adapted and free.&lt;/p&gt;

&lt;p&gt;I requested review and feedback from my email list, and I had 3 users take the time to investigate, review, and provide feedback. (Thank you!) Every point was valid and helped focus the mocks even further. I had some former colleagues and friends review the mocks as well. With the mocks being basic HTML and CSS, I could iterate with each round of feedback fast.&lt;/p&gt;

&lt;h3&gt;
  
  
  Database and GraphQL service
&lt;/h3&gt;

&lt;p&gt;The thought of having to rebuild everything the way it was in V1 was overwhelming. So much code! The thought occurred to me: I only want to define a schema that describe the whole application. And then from the schema come to life. That’s about the least amount of code you can write and make something reasonably useful.&lt;/p&gt;

&lt;p&gt;I looked at some tools on GitHub that were trying to be exactly that… but the finished products were not amazing. Many of these tools were using advanced PostgresQL features to define their schemas. Then I started seeing tools that made entire APIs from the PostgresQL schema: &lt;a href="https://hasura.io/"&gt;Hasura&lt;/a&gt;, &lt;a href="http://postgrest.org/en/v5.2/"&gt;PostgREST&lt;/a&gt;, and where I am now, which is &lt;a href="https://www.graphile.org/postgraphile/"&gt;Postgraphile&lt;/a&gt;. When I read the &lt;a href="https://www.graphile.org/postgraphile/postgresql-schema-design/"&gt;schema design doc&lt;/a&gt; on Postgraphile’s website, I felt immediately this would work. The business logic is entirely encoded in Postgres – including authentication and access control. PostgresQL is in practice the only major database that could pull something like this off. Postgraphile makes a GraphQL endpoint automatically from this. I found this appealing. I like both REST and GraphQL. But GraphQL would mean iterating later would often mean &lt;em&gt;no&lt;/em&gt; schema change and &lt;em&gt;no&lt;/em&gt; new service code for new features. It was ideal.&lt;/p&gt;

&lt;p&gt;Another advantage would be cutting down from three databases to one. Postgres and JWTs would handle everything Redis did to manage authentication and caching. Postgres can also do full text searching at nearly the speed of Elasticsearch.&lt;/p&gt;

&lt;p&gt;I foolishly decided to try to write the entire database schema up front. This was going on while the mocks were iterating too. My first pass was a draft. I tried to think through the business logic. And I tried to figure out how it would work in PostgresQL and Postgraphile. My second pass was simply trying to make it valid SQL code that the database wouldn’t error trying to load up. I got through that.&lt;/p&gt;

&lt;p&gt;Then I tried loading up Postgraphile for the first time against the database. It actually worked. But the schema it generated didn’t make sense to me in a lot of ways. I made some assumptions about how Postgraphile worked, that didn’t turn out to be true. Postgraphile actually does quite a bit more than I thought it would. It predicted lots of little things too, like wanting names to in underscores in PGSQL but camelcase in GraphQL.&lt;/p&gt;

&lt;h3&gt;
  
  
  February 2019
&lt;/h3&gt;

&lt;p&gt;I realized finishing the whole site and then launching it was never going to happen. It would be too much work. I should have known better, but I was eager. With so little usage, I decided to hard pull the plug on V1 and start over. I redeployed the site with only a home page. Some static text about what Sagefy is, a few links, and an email newsletter sign up.&lt;/p&gt;

&lt;h3&gt;
  
  
  Serving HTML
&lt;/h3&gt;

&lt;p&gt;I focused on front-end code for a long time. I hate fighting the browser. I love the browser. I wanted to go along with how the browser wants to do things instead of trying to force to go a certain way. This would mean less code and faster iteration.&lt;/p&gt;

&lt;p&gt;For the first V2 deployment, I only had the client side running. I decided on JavaScript again for the HTML server. Postgraphile itself is in JavaScript, and its the language I know best. Sure, its a weird, messy language. But its the most popular programming language. So lots of people know it. And the packages available are amazing. And performance-wise, its nearly in the range of Go or Java. Without having to deal with lower level issues, like pointers or verbose static typing.&lt;/p&gt;

&lt;p&gt;For my templating language… I chose &lt;a href="https://reactjs.org"&gt;React&lt;/a&gt;. I figured to get started, I would do a simple, server-sends-all-the-HTML sort of site. There’s no front end, browser facing JavaScript at all. I know React super well, and there’s tons of other people that do too. Its tooling is excellent, and so is the &lt;a href="https://www.npmjs.com/package/eslint-plugin-react"&gt;ESLint plugin&lt;/a&gt; for it. There’s low risk of injection or having an extra close tag. And performance wise, React on the server is about as fast as any other JavaScript HTML templating library. I figured eventually if I wanted to do isomorphic again, it would be easy to convert. That hasn’t happened though. I’ve been able to build everything with plain old HTML and no JavaScript running in the browser.&lt;/p&gt;

&lt;p&gt;I did the mocks with the idea that I would make a more designed looking site based on them. But instead, I kept the bare-minimum CSS sheet I had. I converted it to its &lt;a href="https://github.com/heiskr/drab.css"&gt;own repository&lt;/a&gt; so I could reuse it throughout Sagefy’s docs and my personal site too. I also took out my inline styles and made them into a handful of tiny utilities, like centering text or inlining lists. This approach makes change super easy. I use basic HTML tags. I don’t have to remember a bunch of classes to make the site look decent. Lots of the popular style libraries avoid changes on basic HTML tags to try to be neutral. By having an opinion, I can dramatically reduce how much CSS there is to manage. The site looks consistent without me trying much at all. I can change things so easily, because the site is so basic. And the performance is of course amazing. No custom fonts to load either.&lt;/p&gt;

&lt;h3&gt;
  
  
  Feature-by-feature
&lt;/h3&gt;

&lt;p&gt;After that initial page was up, I rebuilt the site feature by feature. The whole technical stack was working.&lt;/p&gt;

&lt;p&gt;The first feature I did was restoring accounts, so that people could sign up, log in, and log out again. This was the first feature because everything else later would depend on the authentication model.&lt;/p&gt;

&lt;p&gt;Each feature had a pattern.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First, I write the database migration. I’m using a simple &lt;a href="https://github.com/amacneil/dbmate"&gt;Go tool&lt;/a&gt; to manage database migrations. The tool operates on straight up raw SQL, no other languages required to use it. The database migrations were easiest to do first in the PostgresQL command line REPL. Then once I get them working I formalize them into a migration.&lt;/li&gt;
&lt;li&gt;After that, I’d use the &lt;a href="https://github.com/graphql/graphiql"&gt;GraphiQL&lt;/a&gt; instance that comes with Postgraphile to write the GraphQL query. This was to ensure the database did what I thought it would.&lt;/li&gt;
&lt;li&gt;Once the query was working, it was on to the client. I start with the &lt;a href="https://expressjs.com/"&gt;Express&lt;/a&gt; endpoint, making the appropriate calls to to GraphQL server and handling the result.&lt;/li&gt;
&lt;li&gt;Then I’d write the page in basic HTML with React.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As of this writing, I’ve avoiding DRYing the client code up too quickly. So there’s still lots of copy-paste code. I’ve learned over the years to wait a little on getting DRY. If you abstract too early, then the abstraction needed won’t be as obvious.&lt;/p&gt;

&lt;p&gt;This pattern worked for every feature afterwards. And its very little code for the amount of capability it has. Most of the working code is either in PostgresQL … which SQL can do an amazing amount with little code … or in Express endpoints, which I want to work to reduce that even more and rely on PostgresQL instead.&lt;/p&gt;

&lt;p&gt;Then the feature order was…&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;After the basic account flows existed, I prioritized getting subjects on the site. I used some samples I paid people to make on mechanical turk a few years ago.&lt;/li&gt;
&lt;li&gt;Searching for subjects.&lt;/li&gt;
&lt;li&gt;Being able to add those subjects to your account.&lt;/li&gt;
&lt;li&gt;Create a new subject… whether you have an account or not.&lt;/li&gt;
&lt;li&gt;Uploading the cards I had from the previous version.&lt;/li&gt;
&lt;li&gt;Creating the learning experience again. I used a simplified Bayesian model with statically set parameters to get something out the door.&lt;/li&gt;
&lt;li&gt;Creating cards for subjects, and prompting users to make cards when a subject doesn’t have any or enough.&lt;/li&gt;
&lt;li&gt;Optimizing pages for search engine indexing and linking.&lt;/li&gt;
&lt;li&gt;Created talk pages for cards and subjects.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(&lt;a href="https://docs.sagefy.org/updates-list"&gt;If you want to read more about it…&lt;/a&gt;)&lt;/p&gt;

&lt;h3&gt;
  
  
  Content
&lt;/h3&gt;

&lt;p&gt;At this point, I addressed many of the goals already:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sagefy works with or without an account.&lt;/li&gt;
&lt;li&gt;Its easy to make new content, and Sagefy prompts users to make content when appropriate.&lt;/li&gt;
&lt;li&gt;Reduced the number of concepts and features: units were gone, as well as many of the database tables that supported V1 features. Units are now subjects with no child subjects, so now there’s only two types of things in the system.&lt;/li&gt;
&lt;li&gt;Way higher search engine optimization and social media linking capabilities.&lt;/li&gt;
&lt;li&gt;Way less code to make changes faster, making new features very fast to finish and iterate.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The big one I didn’t have yet was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Users can’t find the content they want.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I got a little “creative”. I used the &lt;a href="https://en.wikipedia.org/wiki/Library_of_Congress"&gt;Library of Congress&lt;/a&gt; system to create a list of subjects and their parent/child relationships. I used the Library of Congress due to its thoroughness. The Library of Congress system is much more systematic than Dewey decimel or other systems. Wikipedia isn’t quite a structured so there’s both not as many but too many subjects at the same time. Then with that list, I used &lt;a href="https://en.wikipedia.org/wiki/Amazon_Mechanical_Turk"&gt;Amazon Mechanical Turk&lt;/a&gt;. Again, maybe not my favorite system but with almost no budget, you make compromises. I had the workers pull some basic information about each topic: a definition, a few subtopics, a few scholars in the area, and why you’d want to learn about the topic. The results are pretty good. And I got those uploaded to the site, which means Sagefy as 1500+ new subjects.&lt;/p&gt;

&lt;p&gt;But the subjects were all empty. I didn’t want to rely on Mechanical Turk again. It would have been too expensive to go down that road for cards anyway. So I learned some natural language processing. I made a small Python script to search Wikipedia to find the matching page for the subject, summarize it, make multiple choice questions. And then also called other APIs to get a YouTube and a Vimeo video. The quality is pretty variable, but its better than nothing for sure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Remaining features
&lt;/h3&gt;

&lt;p&gt;Now that there was some content to get indexed and draw more people to the site, I went back to wrap up the remaining features in the mocks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Editing subjects and cards&lt;/li&gt;
&lt;li&gt;History pages for subjects and cards&lt;/li&gt;
&lt;li&gt;Site wide search&lt;/li&gt;
&lt;li&gt;Viewing contributions on the dashboard&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where Sagefy is in July 2019
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;1. Search for a subject&lt;/th&gt;
&lt;th&gt;2. Find your subject&lt;/th&gt;
&lt;th&gt;3. Choose the next step&lt;/th&gt;
&lt;th&gt;4. Learn!&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---hXiXSlV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/1221423/55904606-186bb280-5b85-11e9-8c67-0d8baefefd2c.png" alt="x"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VEH9KMBM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/1221423/55904604-186bb280-5b85-11e9-9fee-12eb71f753dd.png" alt="x"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SCse_uzg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/1221423/55904603-186bb280-5b85-11e9-95ff-cbcc3e924b17.png" alt="x"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---ZTkdebq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/1221423/55904605-186bb280-5b85-11e9-97b0-0cab850c3056.png" alt="x"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Sagefy has every feature that was in the mocks. It’s got lots of content, covering almost every significant academic subject. And some cards in each subject as well. The quality of the content is highly variable. Sagefy is available to all users – with or without an account. And available to search engines and linkable. Every day the traffic is growing.&lt;/p&gt;

&lt;p&gt;I’m satisfied with the change. I’m happy I did a rewrite, even though its usually a bad strategy. I’m happy I focused on user feedback instead of dreaming. I’m glad I started with very basic mocks. And even though its sort of compromising, focusing on search engines and social media linking does produce results. It took some time to figure out how to do this with the least amount of code, but it was time well spent.&lt;/p&gt;

&lt;p&gt;If I were to do it again, I would do even more usability testing and feedback rounds. I would not try writing the whole database schema up front. Instead I would start from day one going feature-by-feature, flow-by-flow. Its so easy to change if you make a mistake, especially at small traffic. And finally, I would have created content earlier, to get more traffic earlier on while I was building features. Instead of the reverse. Content is what gets people to your site, after all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Sagefy will go from here
&lt;/h2&gt;

&lt;p&gt;I have no idea :) Now seems like a good time to pull back a little on the project. Observe how it does in the wild for a few weeks. After that, I’m going to go back to usability testing and interviews. And look over traffic data. This will help me to find out where the next biggest opportunities are. Sagefy is far from perfect for sure. The content could be much better, and the code could use some refactoring and automated tests. But I know when those new opportunities come, its going to be much easier and faster to change. And hopefully I won’t need another rewrite for a long time :)&lt;/p&gt;

&lt;p&gt;Obligatory end-of-article call-to-action:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://sagefy.org"&gt;Visit Sagefy&lt;/a&gt;. Feedback is welcome!&lt;/li&gt;
&lt;li&gt;For more information, &lt;a href="https://youtu.be/Gi99QbiSuWs"&gt;watch this 3 minute YouTube video&lt;/a&gt; or &lt;a href="https://docs.sagefy.org"&gt;read the docs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Want to help? &lt;a href="https://docs.sagefy.org/want-to-help"&gt;Check out our “Want to Help?” doc.&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Sign up for &lt;a href="https://sgfy.xyz/updates"&gt;updates&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Reach out to Sagefy on &lt;a href="https://twitter.com/sagefyorg"&gt;Twitter&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>How I Write React/Redux Projects in 2018</title>
      <dc:creator>Kevin Heis</dc:creator>
      <pubDate>Thu, 30 Aug 2018 00:00:00 +0000</pubDate>
      <link>https://dev.to/heiskr/how-i-write-react-redux-projects-in-2018-3i1</link>
      <guid>https://dev.to/heiskr/how-i-write-react-redux-projects-in-2018-3i1</guid>
      <description>&lt;p&gt;I’ve been in JavaScript development for about thirteen years. I’ve been through &lt;a href="http://prototypejs.org/"&gt;Prototype.js&lt;/a&gt;, &lt;a href="https://yuilibrary.com/"&gt;YUI&lt;/a&gt;, &lt;a href="https://mootools.net/"&gt;MooTools&lt;/a&gt;, &lt;a href="https://jquery.com/"&gt;jQuery&lt;/a&gt;, &lt;a href="http://backbonejs.org/"&gt;Backbone&lt;/a&gt;, &lt;a href="https://angular.io/"&gt;Angular&lt;/a&gt;, and now &lt;a href="https://reactjs.org/"&gt;React&lt;/a&gt; (and countless other libraries and tools). I’ve been mostly working on React/&lt;a href="https://redux.js.org/"&gt;Redux&lt;/a&gt; browser projects for the last four years on a variety of projects.&lt;/p&gt;

&lt;p&gt;This article documents the &lt;strong&gt;strategies&lt;/strong&gt; I use when building browser projects in React/Redux. These practices are the result of: Lots of trial and error. Reaching consensus in various teams. And observing where problems tend to happen. I assume here you’ve at least read the official &lt;a href="https://reactjs.org/docs/hello-world.html"&gt;&lt;strong&gt;React docs&lt;/strong&gt;&lt;/a&gt; and &lt;a href="https://redux.js.org/introduction/motivation"&gt;&lt;strong&gt;Redux docs&lt;/strong&gt;&lt;/a&gt;. If you haven’t yet, do that first.&lt;/p&gt;

&lt;p&gt;Nothing in here is a rule; these are &lt;strong&gt;high-level guides&lt;/strong&gt;. Take what’s relevant to you and &lt;em&gt;ignore&lt;/em&gt; the rest. Every project has its exceptions. Some projects, React/Redux would be &lt;a href="http://youmightnotneedjs.com/"&gt;overkill&lt;/a&gt;. (I love a plain HTML site.) Or the project requirements are too specific, and React/Redux would get in the way. I don’t love everything about this system. But for a majority of web projects, React/Redux is a decent default.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;“in 2018”&lt;/strong&gt; part is relevant. Every few months there’s a shiny way of doing things. I’m sure the 2019 version of this article would be quite a bit different.&lt;/p&gt;

&lt;p&gt;Please don’t use this guide to try to override a team consensus. I’ve never seen a project fail due to technical choices; but I’ve definitely seen a project fail when the team couldn’t work together.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why React &amp;amp; Redux
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why use React?&lt;/strong&gt; There is a sea of options for web browser projects. A few of the key benefits of React:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React is the most &lt;strong&gt;popular&lt;/strong&gt; option now by far. The largest number of new projects use React. React will continue to have support for at least another 5 years or so. Popularity also means its easy to get help, and there’s a large system of tools supporting React.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://vuejs.org/"&gt;Vue&lt;/a&gt; is growing in popularity. Vue uses a similar model to React. Maybe in a few years Vue will become React’s successor, but my guess is React’s successor doesn’t exist yet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-way data flow&lt;/strong&gt; is a vast improvement over previous systems. The closer to follow this model, the easier the code is to work with.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;virtual DOM&lt;/strong&gt; is a performance benefit. It’s an even larger maintenance benefit.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are many other virtual DOMs… some are smaller in filesize, some are faster. But React is mature, and those other gains are small in comparison to what you get with React’s maturity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why use Redux?&lt;/strong&gt; There’s many options here too for state management.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Redux is &lt;strong&gt;small&lt;/strong&gt; and easy to understand.&lt;/li&gt;
&lt;li&gt;Redux is the most &lt;strong&gt;popular&lt;/strong&gt; system for state management right now.&lt;/li&gt;
&lt;li&gt;Redux helps keep your changes to state &lt;strong&gt;pure&lt;/strong&gt; , making changes easier to follow and understand.&lt;/li&gt;
&lt;li&gt;Flux, React’s original state management system, gets complicated quickly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Many other options exist for state managment, &lt;a href="https://mobx.js.org/"&gt;MobX&lt;/a&gt; likely the most popular. Redux has a problem with &lt;strong&gt;boilerplate&lt;/strong&gt;. Most of the other options have specific ways of addressing this boilerplate. The other options might make sense for your project. My bet is that there will never be a true consensus on the best way to reduce Redux’s boilerplate. Redux is a general solution. And about as specific as we can get while making sure it will work in a variety of situations.&lt;/p&gt;

&lt;p&gt;Tiny projects are better off only using React’s component state on the highest component in the tree. You can switch to Redux or another system later.&lt;/p&gt;

&lt;p&gt;There’s some other libraries I recommend using. You need &lt;code&gt;react-dom&lt;/code&gt; for web projects if you are using React. &lt;a href="https://github.com/reduxjs/react-redux"&gt;&lt;code&gt;react-redux&lt;/code&gt;&lt;/a&gt; is a tiny library that gives a little more guidance on how to integrate React and Redux together. For projects that have more than one route, &lt;a href="https://reacttraining.com/react-router/"&gt;&lt;code&gt;react-router&lt;/code&gt;&lt;/a&gt; with &lt;code&gt;react-router-dom&lt;/code&gt; is the most popular option. They aren’t perfect, and have changed a great deal in a short time. That said, they’ve come to a good pattern for routing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--t4tUl_HP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/react-2.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--t4tUl_HP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/react-2.jpeg" alt="The React/Redux flow, from youtu.be/hiaqhI62zZs"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Overarching Principles
&lt;/h2&gt;

&lt;p&gt;There’s a few principles I’ve developed over the years working on these projects. These principles can help avoid problems. That said, there’s never an ‘always-right answer.’&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do the boring way first.&lt;/strong&gt; There’s so many tools and libraries out there in JavaScript world. My general advice is see if you can meet the requirement with a basic function. Do that until you’ve demonstrated that won’t work. If you can use something already built into the browser, try that first. If its specific to React or Redux, try it the way the authors suggest until you know that doesn’t work for your project. (And if you can build your project without JS… don’t assume you need JS at all!)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Functions &amp;gt; Classes&lt;/strong&gt;. I’m not a functional programming purist. Sometimes mutable data models the problem perfectly. Classes are great for situations where you will need multiple copies of some type of data, and each instance has its own properties. But unless you know you need mutable data or a class in the situation, pure functions are the better default. Functions are simpler to compose, easier to test, and quicker to read.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it"&gt;&lt;strong&gt;YAGNI&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;&amp;gt;&lt;/strong&gt; &lt;a href="https://en.wikipedia.org/wiki/Don%27t_repeat_yourself"&gt;&lt;strong&gt;DRY&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;.&lt;/strong&gt; Duplicate code is usually bad. But duplicate code isn’t as bad as having overly abstracted code, or wrongly abstracted code. I’ve taken the approach of letting some duplication slide until the pattern is obvious. Most bad abstractions come from trying to be DRY before the pattern is obvious. A little patience is valuable. And sometimes, if there’s little differences each time, you may be better off leaving it ‘wet.’&lt;/p&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Single_source_of_truth"&gt;&lt;strong&gt;Single-source of truth&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;&amp;gt; DRY.&lt;/strong&gt; Redux gives you a single state to work with. Having your Redux state be the single source of truth is more important than being DRY. There will be times you have to decide between having a single source of truth or obeying DRY. Take the single source of truth approach. As long as you have a single source of truth, the pain of not being fully DRY is bearable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Base → Everything Else → Index.&lt;/strong&gt; Index is often used as the ‘root’ file name for a directory. I’ve seen cases where other files in the directory depend on index. And others where index consumes the other files. The latter is less problematic. For shared values and functions, I will store them in a “base” file. My other files consume the base file. Then the index file consumes all the other files.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wDK10YdI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/react-3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wDK10YdI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/react-3.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Be consistent with names.&lt;/strong&gt; JavaScript defaults to camel-case names. Unless you have a good reason to, stick with camel-case as much as possible. You want the name of things to be as consistent as possible. The component, its styles, its filename, its CSS class name, its associated selectors… should all use the same name. It’s confusing when they don’t line up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuring Local Development
&lt;/h2&gt;

&lt;p&gt;Almost goes without saying to use &lt;strong&gt;Git&lt;/strong&gt; for version control from day one.&lt;/p&gt;

&lt;p&gt;I would start with &lt;a href="https://github.com/facebook/create-react-app"&gt;&lt;code&gt;**create-react-app**&lt;/code&gt;&lt;/a&gt;. Unless you have no company boilerplate or other configuration you need to start with. The authors of CRA work on React as well. CRA is an easy way to get started. And there’s an easy opt-out mechanism if your project needs it later. Having seen many boilerplate systems over the years, CRA is the nicest I’ve seen. &lt;a href="https://github.com/zeit/next.js/"&gt;&lt;code&gt;next.js&lt;/code&gt;&lt;/a&gt; might make sense for your project too. If you aren’t using a boilerplate, you’ll need to install and configure &lt;a href="https://babeljs.io/"&gt;Babel&lt;/a&gt; and &lt;a href="https://webpack.js.org/"&gt;Webpack&lt;/a&gt; yourself.&lt;/p&gt;

&lt;p&gt;Other than a quick demo project, I would recommend using &lt;a href="https://eslint.org/"&gt;&lt;code&gt;**eslint**&lt;/code&gt;&lt;/a&gt;. The static analysis tools that come with &lt;code&gt;eslint&lt;/code&gt; rival most statically typed languages. I usually opt for the &lt;a href="https://www.npmjs.com/package/eslint-config-airbnb"&gt;AirBnB ruleset &lt;/a&gt;— full for React projects, base otherwise. And I also add in the &lt;a href="https://prettier.io/"&gt;&lt;code&gt;prettier&lt;/code&gt;&lt;/a&gt; exceptions. There’s other configurations out there too that might work better for your project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "extends": ["airbnb", "prettier", "prettier/react"],
  "env": {
    "node": true,
    "browser": true,
    "jest": true
  },
  "parserOptions": {
    "ecmaVersion": 6,
    "sourceType": "module",
    "ecmaFeatures": {
      "jsx": true
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Speaking of &lt;code&gt;**prettier**&lt;/code&gt; ** …** much better than arguing with teammates about code style. And it reduces the number of lint warnings you have to deal with. I’ve been using semi-colon free style. In practice semi-colon style makes almost no difference either way.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;semi: false
singleQuote: true
trailingComma: es5
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Even if you aren’t using React/Redux, I would recommend using &lt;a href="https://www.npmjs.com/package/lodash.get"&gt;&lt;code&gt;**lodash.get**&lt;/code&gt;&lt;/a&gt; &lt;strong&gt;.&lt;/strong&gt; Heavily. Branch coverage in JavaScript can become a real problem. Having to write and test every possible branch will make your tests much more brittle. JavaScript usually operates in an environment where almost anything can happen. There are rarely any guarantees. &lt;code&gt;lodash.get&lt;/code&gt; is one of the tools to help deal with that reality.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// before lodash.get
const userEmail = state &amp;amp;&amp;amp;
                  state.users &amp;amp;&amp;amp;
                  state.users[userId] &amp;amp;&amp;amp;
                  state.users[userId].email ||
                  ''

// after lodash.get
const userEmail = get(state, ['users', userId, 'email'], '')
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;There’s many &lt;strong&gt;styling&lt;/strong&gt; tool options today. In recent years I’ve worked with &lt;a href="https://sass-lang.com/"&gt;&lt;code&gt;sass&lt;/code&gt;&lt;/a&gt;, &lt;a href="http://stylus-lang.com/"&gt;&lt;code&gt;stylus&lt;/code&gt;&lt;/a&gt;, and &lt;a href="https://github.com/threepointone/glamor"&gt;&lt;code&gt;glamor&lt;/code&gt;&lt;/a&gt; the most. Every project has different requirements here so I can’t make a general recommendation. If you are starting a new project, I would drop in &lt;a href="https://necolas.github.io/normalize.css/"&gt;&lt;code&gt;normalize.css&lt;/code&gt;&lt;/a&gt; and then have a single CSS file. You can change to something else when the file becomes too large. You could also look at a full CSS system like &lt;a href="https://tachyons.io/"&gt;tachyons&lt;/a&gt; or &lt;a href="https://getbootstrap.com/"&gt;Bootstrap&lt;/a&gt; if your project doesn’t have too specific design requirements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Localization&lt;/strong&gt; isn’t a solved problem. The browser built-in &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl"&gt;&lt;code&gt;window.Intl&lt;/code&gt;&lt;/a&gt; can get you pretty far by itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Directory Structure
&lt;/h2&gt;

&lt;p&gt;My &lt;strong&gt;directory structure&lt;/strong&gt; will look something like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;README.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;package.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;client.js&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;server.js&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;state/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;data/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;services/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;middleware/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;selectors/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;views/components/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;views/containers/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;views/routes/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;constants/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;helpers/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;images/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Root Files
&lt;/h2&gt;

&lt;p&gt;Every project should have a &lt;a href="https://en.wikipedia.org/wiki/README"&gt;&lt;strong&gt;README&lt;/strong&gt;&lt;/a&gt;. Your README serves two purposes: a) documentation for developers and b) marketing. I would suggest your README contains at a least…&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The name of the project.&lt;/li&gt;
&lt;li&gt;A short description. (Who is using this, what are they doing with it, why are they using this.)&lt;/li&gt;
&lt;li&gt;A screenshot, if that’s relevant.&lt;/li&gt;
&lt;li&gt;The build status of the master branch.&lt;/li&gt;
&lt;li&gt;Links to documentation of the tools and APIs your project consumes.&lt;/li&gt;
&lt;li&gt;A list of the directories in the project, and what their intended purpose is.&lt;/li&gt;
&lt;li&gt;A list of top level &lt;code&gt;npm&lt;/code&gt;/&lt;code&gt;yarn&lt;/code&gt; commands and what they do.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your boilerplate may or may not include a &lt;a href="https://docs.npmjs.com/files/package.json"&gt;&lt;code&gt;**package.json**&lt;/code&gt;&lt;/a&gt; for you to use. The JS community used to do Grunt and then later Gulp. But now there seems to be a consensus to use the &lt;code&gt;scripts&lt;/code&gt; section of &lt;code&gt;package.json.&lt;/code&gt; You’ll have development, build, and test commands. &lt;code&gt;package.json&lt;/code&gt; now also serves as your home for tooling configuration. I could write a whole article about only this one file, so for this article that’s all I’m going to say about &lt;code&gt;package.json&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "name": "messages",
  "scripts": {
    "build": "# ...",
    "start": "# ...",
    "test": "# ...",
  },
  "jest": {
    ...
  },
  "dependencies": {
    ...
  },
  "devDependencies": {
    ...
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;If your project is client side only — has no &lt;a href="https://en.wikipedia.org/wiki/Search_engine_optimization"&gt;SEO&lt;/a&gt; requirements — then a single &lt;code&gt;client.js&lt;/code&gt; entry to your application will be fine. Otherwise, you’ll need a &lt;code&gt;**client.js**&lt;/code&gt; and a &lt;code&gt;**server.js**&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;**client.js**&lt;/code&gt; will each be responsible for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating your Redux store,&lt;/li&gt;
&lt;li&gt;Integrating your Redux middleware, and&lt;/li&gt;
&lt;li&gt;Binding your store to React with &lt;a href="https://github.com/reduxjs/react-redux/blob/master/docs/api.md#provider-store"&gt;&lt;code&gt;Provider&lt;/code&gt;&lt;/a&gt; from &lt;code&gt;react-redux&lt;/code&gt;, and&lt;/li&gt;
&lt;li&gt;Binding ReactDOM to your actual DOM.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are using React Router, then &lt;a href="https://reacttraining.com/react-router/web/api/BrowserRouter"&gt;BrowserRouter&lt;/a&gt; will be in this file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const store = createStore(reducer, applyMiddleware(logger))

document.addEventListener('DOMContentLoaded', () =&amp;gt; {
  const container = document.querySelector('#react-root')
  ReactDOM.render(
    &amp;lt;Provider store={store}&amp;gt;
      &amp;lt;Router&amp;gt;
        &amp;lt;Messages /&amp;gt;
      &amp;lt;/Router&amp;gt;
    &amp;lt;/Provider&amp;gt;,
    container
  )
})
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;em&gt;(All code samples in this article are for demonstration. They do not have everything needed for a production experience.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Your &lt;code&gt;**server.js**&lt;/code&gt; file will need to&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a new Redux store &lt;em&gt;on each request&lt;/em&gt;, which again means binding middleware to the store.&lt;/li&gt;
&lt;li&gt;You’ll need to make any necessary service calls here to generate your Redux state.&lt;/li&gt;
&lt;li&gt;If you are using React Router, then &lt;a href="https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/api/StaticRouter.md"&gt;StaticRouter&lt;/a&gt; will be in this file.&lt;/li&gt;
&lt;li&gt;You’ll also need your base HTML markup.&lt;/li&gt;
&lt;li&gt;Then you’ll put the finished state and initial React HTML,— rendered with &lt;a href="https://reactjs.org/docs/react-dom-server.html"&gt;&lt;code&gt;react-dom/server&lt;/code&gt;&lt;/a&gt; — into your HTML template.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For actually handling requests, I would recommend &lt;a href="https://expressjs.com/"&gt;Express&lt;/a&gt;. &lt;strong&gt;Express&lt;/strong&gt; is easy to use and well supported, and perfect for this sort of situation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const app = express()

const html = `
&amp;lt;!doctype html&amp;gt;
&amp;lt;meta charset="utf-8"&amp;gt;
&amp;lt;meta name="viewport" content="width=device-width, initial-scale=1"&amp;gt;
&amp;lt;title&amp;gt;Messages&amp;lt;/title&amp;gt;
&amp;lt;link rel="stylesheet" href="/index.css"&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div id="react-root"&amp;gt;{innerHtml}&amp;lt;/div&amp;gt;
&amp;lt;script&amp;gt;window.preload={state}&amp;lt;/script&amp;gt;
&amp;lt;script src="https://cdn.polyfill.io/v2/polyfill.min.js"&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src="/index2.js"&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
`

app.get(/.*/, (request, response) =&amp;gt; {
  const store = createStore(reducer, applyMiddleware(logger))
  // once the store is filled of data, then...
  const myContext = {}
  const innerHtml = ReactDOMServer.renderToString(
    &amp;lt;Provider store={store}&amp;gt;
      &amp;lt;Router location={request.url} context={myContext}&amp;gt;
        &amp;lt;Messages /&amp;gt;
      &amp;lt;/Router&amp;gt;
    &amp;lt;/Provider&amp;gt;
  )
  if (myContext.url) {
    response.redirect(myContext.url)
  } else {
    response.status(200).send(
      html.replace('{innerHtml}', innerHtml)
          .replace('{state}', JSON.stringify(store.getState()))
  }
})

app.listen(3000, () =&amp;gt; {
  console.log('serving app realness')
})
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Server-side rendering&lt;/strong&gt; React/Redux is difficult, and more than I can describe in this article. There’s lots that can go wrong with server-side rendering. If you don’t need to do server-side rendering, I wouldn’t. Otherwise, there’s several articles on Medium about how to approach server-side rendering with React. The rule is you need to create everything &lt;em&gt;per request&lt;/em&gt;… unless you are caching.&lt;/p&gt;

&lt;p&gt;If you have any &lt;strong&gt;configuration&lt;/strong&gt; that you need to have in both the server and client, such as API endpoint URLs or image base paths, I would have that in &lt;code&gt;server.js&lt;/code&gt;. Expose it through the HTML document to the browser with an inline script tag. That way, all your configuration stays in one place.&lt;/p&gt;

&lt;p&gt;If your needs start to expand on the server-side, I would recommend using the &lt;a href="https://expressjs.com/en/guide/using-middleware.html"&gt;Express middleware&lt;/a&gt; pattern. This can help keep your code small and modular on the server-side.&lt;/p&gt;

&lt;p&gt;Cross-browser support has been easier the last few years, but there’s still &lt;a href="https://kangax.github.io/compat-table/es6/"&gt;difficulty&lt;/a&gt; to know what features each browser is going to support. &lt;a href="https://polyfill.io/v2/docs/"&gt;&lt;strong&gt;polyfill.io&lt;/strong&gt;&lt;/a&gt; is an easy way to resolve that issue. You add one script tag to your HTML before your own scripts, and you’re done. Highly recommended.&lt;/p&gt;

&lt;h2&gt;
  
  
  State
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;state&lt;/strong&gt; is the heart of your React/Redux project. If you master your Redux state, the rest of your application will flow from there. If you get it wrong, you’ll spend lots of time downstream trying to correct the issues.&lt;/p&gt;

&lt;p&gt;Think of your Redux state as you would a SQL database. There are three main guides:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;No duplicate data.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No derivative data.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Be as flat as possible.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The easiest way I know to abide by these three guides is to write out a state schema. You could have a single file in your &lt;code&gt;state/&lt;/code&gt; directory that describes the keys and default values for your entire state tree. You also add comments to describe what the fields are. And if you wanted to go a little extra, you can also add validation rules to your state schema, though I don’t think that’s usually necessary.&lt;/p&gt;

&lt;p&gt;If you have the same fields in two different collections, then you should separate out the shared fields into their own collection. This avoids &lt;strong&gt;duplicate&lt;/strong&gt; data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Derivative&lt;/strong&gt; data is data you could figure out from one or more other pieces of data you already have. For example, if you have a &lt;code&gt;firstName&lt;/code&gt; field, and a &lt;code&gt;lastName&lt;/code&gt; field, you don’t need a &lt;code&gt;fullName&lt;/code&gt; field.&lt;/p&gt;

&lt;p&gt;When you have nested data, it’s harder to work with later on. As long as you aren’t creating duplicate or derivative data, you want to &lt;strong&gt;flatten&lt;/strong&gt; your schema as much as possible.&lt;/p&gt;

&lt;p&gt;The way I structure my state is like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;module.exports = {
  global: {
    userId: '',
  },
  users: {
    '[id]': {
      name: '',
      email: '',
    },
  },
  messages: {
    '[id]': {
      toUser: '',
      fromUser: '',
      content: '',
    },
  },
  requests: {
    '[id]': {
      endpoint: '',
      success: false,
      failed: false,
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;My state tree has two types: &lt;strong&gt;fields&lt;/strong&gt; and &lt;strong&gt;collections&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I have a &lt;code&gt;global&lt;/code&gt; section with my flat &lt;strong&gt;fields&lt;/strong&gt; of my state. They only exist on a single level. These fields don’t belong to a collection. Often they are identifiers.&lt;/p&gt;

&lt;p&gt;Then I’ll have my &lt;strong&gt;collections&lt;/strong&gt;. Each collection is an object of objects, stored by an identifier. The collections should be mostly flat data. If you have a collection that owns another collection, those should be two separate collections. And joined by an identifier. Think like how you would model relations in a SQL database, and that is the pattern you want to follow. If a collection doesn’t have a natural identifier, you’ll need to generate them with something like &lt;a href="https://en.wikipedia.org/wiki/Universally_unique_identifier"&gt;UUIDs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@talkol"&gt;Tal Kol&lt;/a&gt; has &lt;a href="https://hackernoon.com/avoiding-accidental-complexity-when-structuring-your-app-state-6e6d22ad5e2a"&gt;two&lt;/a&gt; &lt;a href="https://hackernoon.com/redux-step-by-step-a-simple-and-robust-workflow-for-real-life-apps-1fdf7df46092"&gt;great&lt;/a&gt; articles going further into state tree design. I would recommend reading those. As long as you are following the three rules above, you can model your state in any way that makes sense to you.&lt;/p&gt;

&lt;p&gt;Your state schema can also serve as your &lt;em&gt;default state&lt;/em&gt;. You only need a function that will empty out the collections into plain objects. Then you can use that to start up your Redux store in &lt;code&gt;client.js&lt;/code&gt; and &lt;code&gt;server.js&lt;/code&gt;. The more you integrate your state schema with your code, the more likely it will stay accurate.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function createDefaultState(schema) {
  return Object.keys(schema).reduce(
    (sum, key) =&amp;gt; {
      sum[key] = isCollection(sum[key]) ? {} : schema[key]
      return sum
    },
    {}
  )
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;For writing your &lt;a href="https://redux.js.org/basics/reducers"&gt;&lt;strong&gt;reducers&lt;/strong&gt;&lt;/a&gt;, there’s been a growing consensus around the &lt;a href="https://github.com/erikras/ducks-modular-redux"&gt;duck pattern&lt;/a&gt; and &lt;a href="https://github.com/redux-utilities/flux-standard-action"&gt;Flux Standard Actions&lt;/a&gt;. I would recommend using those. And your top level reducer can be Redux’s &lt;a href="https://redux.js.org/api/combinereducers"&gt;&lt;code&gt;combineReducers&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I’ve worked on projects where every field and collection had its own unique set of actions. I’ve also worked on projects where the same set of actions were available on each field and collection, and all worked the same way. The &lt;strong&gt;consistent&lt;/strong&gt; approach is easier to work with. For each of my “global”, flat fields, I will have two actions: &lt;em&gt;set&lt;/em&gt; and &lt;em&gt;reset.&lt;/em&gt; The set can work with any value, and &lt;em&gt;reset&lt;/em&gt; will return the value back to the default. For my collections, I have seven action types: &lt;em&gt;add one&lt;/em&gt;, &lt;em&gt;add many&lt;/em&gt;, &lt;em&gt;update one&lt;/em&gt;, &lt;em&gt;update many&lt;/em&gt;, &lt;em&gt;remove one&lt;/em&gt;, &lt;em&gt;remove many&lt;/em&gt;, &lt;em&gt;reset&lt;/em&gt;. And across collections, these all work exactly the same way. I like to have exactly those seven, so I always know what each collection can do without looking up my reducer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// state/global.js
function globalReducer(state, action) {
  if (action.type === SET_USER_ID) {
    return { ...state, userId: action.payload }
  }
  if (action.type === RESET_USER_ID) {
    return { ...state, userId: schema.global.userId }
  }
  return state
}

// state/users.js
function usersReducer(state, action) {
  if (action.type === ADD_USER) {
    return { ...state, [action.payload.id]: action.payload }
  }
  // ... ADD_USERS, UPDATE_USER, UPDATE_USERS, ...
  // ... REMOVE_USER, REMOVE_USERS ...
  if (action.type === RESET_USERS) {
    return {}
  }
  return state
}

// state/index.js
const reducer = combineReducers({
  global,
  users,
  messages,
})
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;I make all my action creators the same way, using this sort of function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const createAction = type =&amp;gt; (payload, meta) =&amp;gt;
  ({ type, payload, meta })

const setUserId = createAction(SET_USER_ID)

dispatch(setUserId('abcd1234'))
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;If you choose to have consistent actions, you will see the vast &lt;strong&gt;boilerplate&lt;/strong&gt; that Redux generates. I would wait a bit until the pattern is completely clear before trying to DRY it up, and even then a little at a time.&lt;/p&gt;

&lt;p&gt;Side note: I haven’t had any positive experiences with &lt;a href="https://facebook.github.io/immutable-js/"&gt;&lt;code&gt;immutable.js&lt;/code&gt;&lt;/a&gt;. Keeping mental track of plain versus immutable data was hard for a single contributor. And impossible for a team. If you’re thinking about that approach, &lt;a href="https://github.com/mweststrate/immer"&gt;&lt;code&gt;immer&lt;/code&gt;&lt;/a&gt; seems a bit more reasonable.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Update/Edit 2018 Oct 10:&lt;/em&gt; Check out &lt;a href="https://github.com/reduxjs/redux-starter-kit"&gt;Redux Starter Kit&lt;/a&gt; and my &lt;a href="https://github.com/heiskr/redux-schemad"&gt;Redux Schemad&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test Data
&lt;/h2&gt;

&lt;p&gt;Having good &lt;strong&gt;test data&lt;/strong&gt; is the most efficient way to speed up development time for almost any project. I can’t recommend it enough. You can use test data for fast local development. You’ll also have a much easier time writing unit tests.&lt;/p&gt;

&lt;p&gt;In my projects, I have a directory of &lt;code&gt;data/&lt;/code&gt; with two types: (a) fully written out test Redux &lt;strong&gt;states&lt;/strong&gt; and (b) example &lt;strong&gt;responses&lt;/strong&gt; from all the endpoints I’m going to use.&lt;/p&gt;

&lt;p&gt;I will have at least four Redux test states.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;An ‘ &lt;strong&gt;everything&lt;/strong&gt; ’ state, that shows as many possible combinations of things as possible.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;null&lt;/strong&gt; or zero state, which would be what the user first has when they arrive.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;loading&lt;/strong&gt; state, that shows what the page looks like while services are loading, and&lt;/li&gt;
&lt;li&gt;An &lt;strong&gt;error&lt;/strong&gt; state, to show what happens when each service has an error.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As your project becomes more complex, you’ll likely need more states of each of these as well as other types of test states.&lt;/p&gt;

&lt;p&gt;I like to have an easy way to load up each of test state and render the &lt;em&gt;React tree on the test state&lt;/em&gt;. A good way to do this is using a query string parameter. This will make developing the React side of your project very fast. And unit testing your views as well.&lt;/p&gt;

&lt;p&gt;I like having at least one sample of each endpoint I will use in the project. These samples will make formatting service responses and the corresponding unit tests very easy. You could also use your sample service responses to validate the real services match your expected data format. I’ve seen some make mock services based on the sample service responses as well. Mock services are not necessary for most projects, but mock services are an option.&lt;/p&gt;

&lt;h2&gt;
  
  
  Services
&lt;/h2&gt;

&lt;p&gt;There’s lots of ways to make &lt;strong&gt;network requests&lt;/strong&gt;. For one, straight up &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest"&gt;&lt;code&gt;XMLHttpRequest&lt;/code&gt;&lt;/a&gt; might work for you. Otherwise, I’ve seen a growing consensus about the browser built-in, Promise-based &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API"&gt;&lt;code&gt;window.fetch&lt;/code&gt;&lt;/a&gt;. If you need to server-side rendering, you can find a package to get &lt;code&gt;fetch&lt;/code&gt; to also run on the server. (On &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function"&gt;&lt;code&gt;async&lt;/code&gt;&lt;/a&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function"&gt;/&lt;/a&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function"&gt;&lt;code&gt;await&lt;/code&gt;&lt;/a&gt;: Until there’s more browser support, it transpiles heavy… I wouldn’t use it in the browser yet.)&lt;/p&gt;

&lt;p&gt;In my services directory, I would have either one file per family of endpoints (&lt;code&gt;GET&lt;/code&gt;/&lt;code&gt;POST&lt;/code&gt;/&lt;code&gt;PUT&lt;/code&gt;/&lt;code&gt;DELETE&lt;/code&gt;). Or I would do one file per endpoint, if there is one than one service with several endpoints.&lt;/p&gt;

&lt;p&gt;For each endpoint, I have three functions. The top level is the actual service call. Which I name the function something like &lt;code&gt;getMessage&lt;/code&gt;, &lt;code&gt;listMessages&lt;/code&gt;, &lt;code&gt;postMessage&lt;/code&gt;, &lt;code&gt;putMessage&lt;/code&gt;, or &lt;code&gt;deleteMessage.&lt;/code&gt; The format is &lt;code&gt;{method}{noun}&lt;/code&gt;. The pattern here is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Format&lt;/strong&gt; state data to the parameters of the &lt;strong&gt;request&lt;/strong&gt; (optional).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update&lt;/strong&gt; the state to record I’m making a &lt;strong&gt;request&lt;/strong&gt; to this service.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make&lt;/strong&gt; the request, then…&lt;/li&gt;
&lt;li&gt;If the request succeeded, &lt;strong&gt;format&lt;/strong&gt; the &lt;strong&gt;response.&lt;/strong&gt; Then dispatch an action to &lt;strong&gt;update&lt;/strong&gt; the state with the formatted data from the response.&lt;/li&gt;
&lt;li&gt;Either way, &lt;strong&gt;update&lt;/strong&gt; the &lt;strong&gt;request&lt;/strong&gt; in the state to record the request finished.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function getMessages(dispatch, getState) {
  const params = formatGetMessagesRequest(getState())
  const id = uuid4()
  dispatch(addRequest({ id, endpoint: GET_MESSAGES }))
  return fetch('/messages', params)
    .then(response =&amp;gt; response.json())
    .then((response) =&amp;gt; {
      const payload = formatGetMessagesResponse(response)
      dispatch(addMessages(payload))
      dispatch(updateRequest({ id, success: true }))
    })
    .catch(() =&amp;gt; {
      dispatch(updateRequest({ id, failed: true }))
    })
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Formatting the request and formatting the response can get verbose. So I will split those out into separate functions. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I have a highest function, &lt;code&gt;getMessage&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;I have a function called &lt;code&gt;formatGetMessageRequest&lt;/code&gt;. That &lt;em&gt;takes&lt;/em&gt; the Redux &lt;strong&gt;state&lt;/strong&gt; and other parameters. And &lt;em&gt;returns&lt;/em&gt; an object of formatted &lt;strong&gt;parameters&lt;/strong&gt; to make the request. The format I use is &lt;code&gt;format{method}{noun}Request&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;I have function called &lt;code&gt;formatGetMessageResponse&lt;/code&gt;. That &lt;em&gt;takes&lt;/em&gt; an API &lt;strong&gt;response&lt;/strong&gt;. And &lt;em&gt;returns&lt;/em&gt; the formatted response to match my &lt;strong&gt;state.&lt;/strong&gt; That way I can dispatch actions to update my Redux state. The format I use is &lt;code&gt;format{method}{noun}Response&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function formatGetMessagesRequest(state) {
  return {
    headers,
    body: {
      userId: get(state, 'global.userId'),
    },
  }
}

function formatGetMessagesResponse(response) {
  return get(response, 'messages', []).map(message =&amp;gt; ({
    toUser: get(message, 'toUser', ''),
    fromUser: get(message, 'fromUser', ''),
    content: get(message, 'content', ''),
  }))
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;I’ve seen some use &lt;a href="https://github.com/paularmstrong/normalizr"&gt;Normalizr&lt;/a&gt; to handle the formatting more systematically. I haven’t run into a project where I needed a tool to handle this, but that’s an option too.&lt;/p&gt;

&lt;p&gt;Making service requests will likely be the &lt;em&gt;messiest&lt;/em&gt; part of your project. As long as you expect service calls to be a little messy, you’ll be much happier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Redux Middleware
&lt;/h2&gt;

&lt;p&gt;So now you have a state tree, and you have service functions. But how do you know &lt;strong&gt;when&lt;/strong&gt; to call your services? Or send analytics events?&lt;/p&gt;

&lt;p&gt;Some developers use lifecycle methods in React — &lt;code&gt;componentDidMount&lt;/code&gt; — with local component state. If you’ve already decided your project is complex enough to use Redux, &lt;em&gt;I would recommend against doing this&lt;/em&gt;. React’s lifecycle methods and local component state are, well… state. And you already have your state in Redux. So if you use the lifecycle methods or local component state, you are violating the ‘single source of truth’ principle. As a result, its going to be much harder to determine what your project is doing or why you’re seeing the results you are seeing. Especially when you are on a team of people, if there’s state all over the place, its going to be difficult to get everything to work together.&lt;/p&gt;

&lt;p&gt;The better solution is to use Redux to &lt;strong&gt;store&lt;/strong&gt; all your necessary state for both the services and views. And to use Redux &lt;strong&gt;middleware&lt;/strong&gt; to make state changes based on other state changes.&lt;/p&gt;

&lt;p&gt;There’s some exceptions when you want to use React’s local component state and lifecycle methods:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You are building a &lt;strong&gt;reusable component&lt;/strong&gt; for other projects to consume. Other projects may or may not use Redux. Even if a project is using Redux, they won’t use Redux the same way.&lt;/li&gt;
&lt;li&gt;You have a demonstrated need to optimize the &lt;strong&gt;performance&lt;/strong&gt; of a particular component.&lt;/li&gt;
&lt;li&gt;Putting all the state for the particular component in Redux and Redux middleware would require lots of &lt;strong&gt;non-obvious work&lt;/strong&gt;. I’ve seen this with tooltips and scroll behaviors, for example.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’re not in one of these three categories, I would stick to Redux and Redux middleware for all your state management needs.&lt;/p&gt;

&lt;p&gt;So how do we write Redux middleware? Sometimes the direct approach is best. Redux’s authors chose middleware to use the &lt;a href="https://en.wikipedia.org/wiki/Currying"&gt;currying&lt;/a&gt; pattern, so I recommend being familiar with currying.&lt;/p&gt;

&lt;p&gt;There’s two primary ways to think about cascading state changes. One way is to listen to actions as we dispatch them, and call functions that match. &lt;a href="https://redux-saga.js.org/"&gt;&lt;code&gt;redux-saga&lt;/code&gt;&lt;/a&gt;, a popular library, falls into this category.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const serviceMiddleware = store =&amp;gt; next =&amp;gt; action =&amp;gt; {
  const result = next(action)
  if (action.type === GET_MESSAGES) {
    getMessages(store.dispatch, store.getState)
  }
  return result
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The other approach is you dispatch a function that dispatches other actions for you. &lt;code&gt;redux-thunk&lt;/code&gt; falls into this category. As do most other “async” libraries for Redux.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const thunkMiddleware = store =&amp;gt; next =&amp;gt; action =&amp;gt; {
  if (typeof action === 'function') {
    return action(store.dispatch, store.getState)
  }
  return next(action)
}

dispatch((dispatch, getState) =&amp;gt; {
  getMessages().then(() =&amp;gt; {
    dispatch(setMessagesFetched(true))
  })
})
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Lots of projects are using &lt;a href="https://github.com/reduxjs/redux-thunk"&gt;&lt;code&gt;redux-thunk&lt;/code&gt;&lt;/a&gt;. When you dispatch a function instead of a plain object, the middleware calls the function. The function has access to store methods &lt;code&gt;getState&lt;/code&gt; and &lt;code&gt;dispatch&lt;/code&gt;. The access is what &lt;code&gt;redux-thunk&lt;/code&gt; provides. Otherwise, it provides no guidance on how to make these state changes. For a single contributor, this is fine. For a team, this may be problematic.&lt;/p&gt;

&lt;p&gt;I’ve seen both approaches — ‘listen then do’ and ‘do many’ — work. I have a preference for the “listen then do” approach. My reasons are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can keep almost all state management out of your &lt;strong&gt;views&lt;/strong&gt;. Views only know how to dispatch plain actions and nothing else.&lt;/li&gt;
&lt;li&gt;You end up with lots of little, easy to &lt;strong&gt;test&lt;/strong&gt; functions instead of big functions that are harder to test.&lt;/li&gt;
&lt;li&gt;It’s easier to keep your state changes in one place. As a result, its easier to see the &lt;strong&gt;flow&lt;/strong&gt; of changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My own approach is to use my &lt;a href="https://github.com/heiskr/redux-listen"&gt;&lt;code&gt;redux-listen&lt;/code&gt;&lt;/a&gt; library. That said, it isn’t popular by any means. I find &lt;code&gt;redux-saga&lt;/code&gt; heavy for most projects, and &lt;code&gt;redux-thunk&lt;/code&gt; provides too little guidance. You can also easily write your own Redux middleware that makes sense for your project. I can’t make a general recommendation here, other than it depends on the project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Selectors
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_CxdqR17--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/react-4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_CxdqR17--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/react-4.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You now have a beautifully written state with no duplicate or derivative data. At some point, you need to take the data in your state and render out your view. That said, the format your state is in is probably not the format you want in your views.&lt;/p&gt;

&lt;p&gt;The first thing developers often do is all the formatting in the view.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function Messages(state) {
  return (
    &amp;lt;div id="Messages"&amp;gt;
      { Object.keys(state.messages).map(messageId =&amp;gt; (
        &amp;lt;ul&amp;gt;
          &amp;lt;li&amp;gt;From: {state.users[state.messages[messageId].fromUser].name}&amp;lt;/li&amp;gt;
          &amp;lt;li&amp;gt;{state.messages[messageId].content}&amp;lt;/li&amp;gt;
        &amp;lt;/ul&amp;gt;
      )) }
    &amp;lt;/div&amp;gt;
  )
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Soon though, the view has so much formatting and logic its hard to read or reason about. The next step is to use &lt;a href="https://redux.js.org/basics/usagewithreact"&gt;&lt;code&gt;connect&lt;/code&gt;&lt;/a&gt; from &lt;code&gt;react-redux&lt;/code&gt; and have a &lt;code&gt;mapStateToProps&lt;/code&gt; function. &lt;code&gt;mapStateToProps&lt;/code&gt; takes the full state and returns an object that will be the props for the view. You can move your data reformatting into &lt;code&gt;mapStateToProps&lt;/code&gt;. Now you have an easy-to-read view and a separate formatting function.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function Messages({ messages }) {
  return (
    &amp;lt;div id="Messages"&amp;gt;
      { messages.map(message =&amp;gt; (
        &amp;lt;ul&amp;gt;
          &amp;lt;li&amp;gt;From: {fromUserName]}&amp;lt;/li&amp;gt;
          &amp;lt;li&amp;gt;{content}&amp;lt;/li&amp;gt;
        &amp;lt;/ul&amp;gt;
      )) }
    &amp;lt;/div&amp;gt;
  )
}

function mapStateToProps(state) {
  return {
    messages: Object.keys(state.messages).map(messageId =&amp;gt; ({
      fromUserName: state.users[state.messages[messageId].fromUser].name,
      content: state.messages[messageId].content,
    }))
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;However, the new problem you’ll have is you have many &lt;code&gt;mapStateToProps&lt;/code&gt; functions that have duplicate formatting and logic. The solution to that problem is to use &lt;strong&gt;selectors&lt;/strong&gt;. A selector is a function that takes a state and returns a derived value, e.g. &lt;code&gt;state =&amp;gt; value&lt;/code&gt;. You can combine selectors as well. Most developers will start all their selectors with the word &lt;code&gt;get&lt;/code&gt;. You can call these selectors in your &lt;code&gt;mapStateToProps&lt;/code&gt; and now you have a view with almost no formatting or logic in it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function getMessagesNaive(state) {
  return get(state, 'messages', {})
}

function getMessagesArray(state) {
  const naive = getMessagesNaive(state)
  return Object.keys(naive).map(id =&amp;gt; { ...naive[id], id })
}

function getMessages(state) {
  const users = getUsers(state)
  const messages = getMessagesArray(state)
  return messages.map(message =&amp;gt; ({
    ...message,
    fromUserName: get(users, [message.fromUser, 'name'])
  }))
}

function mapStateToProps(state) {
  return {
    messages: getMessages(state),
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;If you want, you can use the &lt;a href="https://github.com/reduxjs/reselect"&gt;&lt;code&gt;reselect&lt;/code&gt;&lt;/a&gt; library to help compose selectors together. You don’t have to use this library, but I recommend at minimum reading its README to grasp the pattern. Once you have lots of selectors, the library will be more useful to you.&lt;/p&gt;

&lt;p&gt;Here’s the list of things you want to take out of your view and put in either &lt;code&gt;mapStateToProps&lt;/code&gt; or a selector:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.length&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;+&lt;/code&gt;, &lt;code&gt;-&lt;/code&gt;, &lt;code&gt;*&lt;/code&gt;, &lt;code&gt;\&lt;/code&gt;, &lt;code&gt;%&lt;/code&gt;, &lt;code&gt;**&lt;/code&gt;, &lt;code&gt;in&lt;/code&gt;, &lt;code&gt;&amp;lt;&lt;/code&gt;, &lt;code&gt;&amp;gt;&lt;/code&gt;, &lt;code&gt;≤&lt;/code&gt;, &lt;code&gt;≥&lt;/code&gt;, &lt;code&gt;==&lt;/code&gt;, &lt;code&gt;!=&lt;/code&gt;, &lt;code&gt;===&lt;/code&gt;, &lt;code&gt;!==&lt;/code&gt;, &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt;, &lt;code&gt;||&lt;/code&gt;, &lt;code&gt;?:&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Any function that determines logic, like &lt;code&gt;RegExp.test&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Any function that re-formats data, like &lt;code&gt;map&lt;/code&gt; or &lt;code&gt;filter&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;… and sometimes &lt;code&gt;!&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For functions that only do like number formatting or localization, I would leave those in the view.&lt;/p&gt;

&lt;p&gt;The “sometimes !” comment is that you want to name any boolean values positive. So don’t use &lt;code&gt;not&lt;/code&gt;, &lt;code&gt;un-&lt;/code&gt;, &lt;code&gt;hide&lt;/code&gt;, or anything &lt;a href="https://softwareengineering.stackexchange.com/questions/196830/boolean-method-naming-affirmative-vs-negative"&gt;negative&lt;/a&gt; in a boolean name. For example, &lt;code&gt;!hideSection&lt;/code&gt; is confusing.&lt;/p&gt;

&lt;p&gt;(The name selector is somewhat problematic, as a Redux/Redux selector is not the same as an HTML/CSS selector. It’s an overloaded term for browser development.)&lt;/p&gt;

&lt;p&gt;I recommend grouping your selectors by route. So you’ll have a “base” file of selectors across routes. A selector file per route. And an “index” selector file that can combine selectors from the different routes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Views: Pages, Containers, &amp;amp; Components
&lt;/h2&gt;

&lt;p&gt;You’re now finally at the part of the application that uses React! If you’ve set up everything similarly so far, then this part is a breeze.&lt;/p&gt;

&lt;p&gt;To repeat: I would recommend if you are using Redux, almost always write &lt;a href="https://reactjs.org/blog/2015/09/10/react-v0.14-rc1.html"&gt;&lt;strong&gt;stateless functional components&lt;/strong&gt;&lt;/a&gt;. (See the three exceptions in the “middleware” section.) If you are not in one of those three exceptions, then I would recommend writing simple, props-only functions across the board. That way, all your state information is in Redux and Redux middleware. You have a single source of truth. And your project becomes very predictable and easy to see why you’re getting the view you’re seeing at any time.&lt;/p&gt;

&lt;p&gt;You can start with all your views in one, flat directory. As your project grows, I like to split them into three types of views:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Components&lt;/strong&gt; : Simple, functional, props-only components. We haven’t attached to state or routes directly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Containers&lt;/strong&gt; : Components we’ve attached to state, but not directly to a route. (Note: If you have several route, you might not have any containers!)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Routes&lt;/strong&gt; : Components we’ve attached to a route, and likely also the state directly. (If you are not using a router, then you’ll likely only have one route.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Routes can consume any view. Containers can consume any containers and components. And components can only consume other components.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function Component(props) { return &amp;lt;div /&amp;gt; }

function Container(props) { return &amp;lt;div /&amp;gt; }
const mapStateToProps = state =&amp;gt; ({})
export default connect(mapStateToProps)(Container)

function Route(props) { return &amp;lt;div /&amp;gt; }
const mapStateToProps = state =&amp;gt; ({})
export default connect(mapStateToProps)(Route)
// ... a higher-level file
&amp;lt;Route path="/messages" component={Route} /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;code&gt;react-redux&lt;/code&gt; will come into play on containers and routes. You want to use &lt;code&gt;connect&lt;/code&gt; and &lt;code&gt;mapStateToProps&lt;/code&gt; to connect your state to your view. That keeps that stuff out of the view function itself. &lt;a href="https://github.com/reduxjs/react-redux/blob/master/docs/api.md"&gt;&lt;code&gt;mapDispatchToProps&lt;/code&gt;&lt;/a&gt; will help you bind your action creators to your store. In some places, I’ve also had to create a &lt;code&gt;mapPropsToProps&lt;/code&gt; to keep my selectors, logic, and formatting out the view.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://reactjs.org/docs/introducing-jsx.html"&gt;&lt;strong&gt;JSX&lt;/strong&gt;&lt;/a&gt; is the most controversial part of React. I would recommend using JSX. I don’t love the mixture of HTML and JS. It’s always felt weird to me, even years later. But most other projects are going to use JSX. And the tooling around JSX is spectacular. You get quite a bit for low effort by using JSX. I wish the authors of React chose a straight up JavaScript way to handle templating. But that decision is in the past now.&lt;/p&gt;

&lt;p&gt;I’ve been on projects that attempted to use form libraries with either only React or with both React and Redux. Unless your form is basic, I would recommend against using a specialized form library. Form libraries often add lots of overhead for little benefits. I would stick to how the authors of React suggest doing &lt;a href="https://reactjs.org/docs/forms.html"&gt;&lt;strong&gt;controlled component forms&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;.&lt;/strong&gt; Wait to DRY up anything until you have a clear pattern of duplication.&lt;/p&gt;

&lt;h2&gt;
  
  
  Auxiliaries: Constants, Helpers, &amp;amp; Images
&lt;/h2&gt;

&lt;p&gt;My projects have auxiliary directories in them: constants, helpers, and images. Sometimes there are more auxiliary directories too.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Constants&lt;/strong&gt; help you to avoid &lt;a href="https://en.wikipedia.org/wiki/Magic_string"&gt;magic strings&lt;/a&gt;. Constants encode the potential values your project will have. If you use constants instead of magic strings, &lt;code&gt;eslint&lt;/code&gt; can help you out quite a bit when its time to refactor. Highly recommended.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Helpers&lt;/strong&gt; are one off functions that don’t fit into other parts of the pattern. They are always specific to your project. I would recommend before creating any helper, check if there is a package in &lt;code&gt;npm&lt;/code&gt; land you can use. Especially &lt;code&gt;lodash&lt;/code&gt;. (A hint with lodash… you can install each function instead of the whole thing. That saves filesize in the browser.) I would try to keep to as few helpers as you can get away with, but nothing less.&lt;/p&gt;

&lt;p&gt;For projects that need it, I’ll have a directory of &lt;strong&gt;images&lt;/strong&gt;. Not much to say about images other than: &lt;em&gt;optimize your images&lt;/em&gt;. You’ll get more performance improvement from optimizing images than anything else. Try using SVG, reducing the number of colors, and using &lt;a href="https://imageoptim.com/mac"&gt;ImageOptim&lt;/a&gt;. If you only have a small number of images that are vector-y, base64 encode them. This will save on the number of network requests. There’s plenty of articles about saving on size with images.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tests
&lt;/h2&gt;

&lt;p&gt;I’ve used Jasmine, Mocha/Chai/Sinon, and Jest. There’s more similar than not. If you already have one, I wouldn’t switch. That said, for new projects I recommend &lt;strong&gt;Jest&lt;/strong&gt;. It’s the easiest to set up and get started with, and has everything you need for unit testing built in.&lt;/p&gt;

&lt;p&gt;Jest’s killer feature is &lt;a href="https://jestjs.io/docs/en/snapshot-testing"&gt;&lt;strong&gt;snapshot testing&lt;/strong&gt;&lt;/a&gt;. Instead of having to assert every value of an object, or JSX nodes, you can write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;expect(result).toMatchSnapshot()
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The first time you run that test, it will make a snapshot of the result. If you run the test later and it isn’t the same, you’ll see where the two snapshots differ. If you want to update the snapshot, you can do so on the command line easily.&lt;/p&gt;

&lt;p&gt;I can’t recommend using snapshot testing enough. In particular, here’s some places you definitely want to use snapshot testing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The results of your reducers in &lt;code&gt;state/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The request and result formatters in &lt;code&gt;services/&lt;/code&gt; (If you have good test data, these can be one line tests!)&lt;/li&gt;
&lt;li&gt;You can snapshot a mocked &lt;code&gt;dispatch&lt;/code&gt; in your service calls. And it’ll record the arguments and returns each time we call the mocked function!&lt;/li&gt;
&lt;li&gt;Anytime you use &lt;code&gt;getState&lt;/code&gt; in your &lt;code&gt;middleware/&lt;/code&gt;. And the mocking and snapshot-ing &lt;code&gt;dispatch&lt;/code&gt; trick works here too!&lt;/li&gt;
&lt;li&gt;Most of your &lt;code&gt;selector/&lt;/code&gt; tests can be a single line, if you use your test data and snapshot testing together.&lt;/li&gt;
&lt;li&gt;Most of your &lt;code&gt;view/&lt;/code&gt; tests can also be a single line, if you use your test data and snapshot testing together. You can have one test for &lt;code&gt;mapStateToProps.&lt;/code&gt; And another test for the view that combines it all together.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Reducer test assertion
expect(
  messagesReducer(allState.messages, addMessage(payload))
).toMatchSnapshot()

// Request formatter assertion
expect(formatGetMessagesRequest(allState)).toMatchSnapshot()

// Response formatter assertion
expect(formatGetMessageResponse(getMessagesSample)).toMatchSnapshot()

// Service assertion
const dispatch = jest.fn()
const getState = () =&amp;gt; allState
await getMessages(dispatch, getState)
expect(dispatch).toMatchSnapshot()

// Selector assertion
expect(getUsers(allState)).toMatchSnapshot()

// View assertions
expect(mapStateToProps(allState)).toMatchSnapshot()
expect(
  Messages(mapStateToProps(allState))
).toMatchSnapshot()
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;With simple functions, test data, and snapshot testing, your unit tests almost write themselves.&lt;/p&gt;

&lt;p&gt;For other tests, you’ll want to use Jest’s &lt;a href="https://jestjs.io/docs/en/mock-functions"&gt;&lt;strong&gt;mock&lt;/strong&gt;&lt;/a&gt; capability. If you aren’t familiar with how mock internals, I have a &lt;a href="https://www.youtube.com/watch?v=wUxmVL998FU"&gt;video&lt;/a&gt; showing how they work. Jest’s system can handle about 90% of typical mocking needs. You can mock both individual functions and entire modules. Sometimes, the old school way works fine too:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;test('updates correctly', () =&amp;gt; {
  const prevLocation = window.location
  location = { href: 'https://example.com' }
  expect(something).toBe(another)
  window.location = prevLocation
})
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;One of the most frequent things to mock is &lt;a href="https://github.com/facebook/jest/issues/2234"&gt;time&lt;/a&gt;. Especially with snapshots, you want your tests to run deterministic.&lt;/p&gt;

&lt;p&gt;Another strategy I use is to use &lt;code&gt;call&lt;/code&gt; and &lt;code&gt;apply&lt;/code&gt; to override the &lt;code&gt;this&lt;/code&gt; context. This strategy gets around lots of otherwise tricky test cases.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;test('componentDidMount', () =&amp;gt; {
  const myThis = {}
  const result = Component.prototype.componentDidMount.call(myThis)
  expect(result).toMatchSnapshot()
})
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Given snapshot testing, I’ve found getting to 100% unit test &lt;strong&gt;coverage&lt;/strong&gt; very easy. If it were more difficult, I wouldn’t recommend 100% coverage for most projects. But in this combination, that goal is practical most of the time. If there’s ever a case you can’t cover, you can always put it in a file by itself and configure Jest to ignore that file.&lt;/p&gt;

&lt;p&gt;You can do one of:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create one big test directory at the root level.&lt;/li&gt;
&lt;li&gt;Create a test directory in each main directory you have.&lt;/li&gt;
&lt;li&gt;Create a test file sitting right next to each file.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I have a preference for 3. There’s twice as many files in each folder, but it’s easier to work with the files as you’re developing that way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrap Up
&lt;/h2&gt;

&lt;p&gt;I can’t cover everything needed to build a React/Redux project in one article. I’ve covered some of the patterns I’ve seen over the years. These are the ways I avoid the most common problems I’ve experienced. I haven’t covered to approach writing styles in this article. Or setting up the tooling required to support a production experience.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A personal note&lt;/em&gt;: I hope one day the browsers have efficient DOM element updating built. Something like…&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rootElement.updateNodes(newDetachedDomTree)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This would cut the need for many of the tools I mention in this article. When a library gets popular enough, the browsers later get a way to do the same thing natively. I hope that happens here too.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;To reiterate&lt;/em&gt;: Take what’s relevant to you and ignore the rest. Every project has its exceptions. You might not need JS, or React/Redux! This article is for 2018. If you are reading this any later, the community will have likely already changed some of this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thanks for reading.&lt;/strong&gt; &lt;em&gt;Feedback is welcome!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You can visit my side project &lt;a href="https://sagefy.org/"&gt;&lt;strong&gt;Sagefy&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>A Checklist to Make Your Own Learning Plan</title>
      <dc:creator>Kevin Heis</dc:creator>
      <pubDate>Mon, 27 Aug 2018 00:00:00 +0000</pubDate>
      <link>https://dev.to/heiskr/a-checklist-to-make-your-own-learning-plan-1c57</link>
      <guid>https://dev.to/heiskr/a-checklist-to-make-your-own-learning-plan-1c57</guid>
      <description>&lt;p&gt;I published my &lt;a href="https://dev.to/stories/eight-big-ideas-of-learning-tl-dr-edition"&gt;&lt;strong&gt;Eight Big Ideas of Learning&lt;/strong&gt;&lt;/a&gt; article (also &lt;a href="https://dev.to/stories/eight-big-ideas-of-learning"&gt;full version&lt;/a&gt;) about a month ago. The article attracted broad interest. Several people asked me how to act on those ideas.&lt;/p&gt;

&lt;p&gt;If you’re an independent learner like me, you’re &lt;strong&gt;creating&lt;/strong&gt; your own &lt;strong&gt;plan&lt;/strong&gt; and also &lt;strong&gt;following&lt;/strong&gt; that plan. It’s easy to feel overwhelmed. Let’s make it easier. Here’s some &lt;strong&gt;steps&lt;/strong&gt; you can follow to create and follow your own research-backed learning plan!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The numbers in brackets refer to the sections in the&lt;/em&gt; &lt;a href="https://dev.to/stories/eight-big-ideas-of-learning-tl-dr-edition"&gt;&lt;em&gt;Ideas&lt;/em&gt;&lt;/a&gt; &lt;em&gt;article. Check that out if you need more clarification. You don’t need to do all of these things to learn effectively. Take what’s relevant and ignore the rest.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Before you start learning the subject
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;☐ &lt;strong&gt;Why&lt;/strong&gt; do you want to learn this subject? Think &lt;em&gt;autonomy&lt;/em&gt;, &lt;em&gt;mastery&lt;/em&gt; and &lt;em&gt;purpose&lt;/em&gt;. Write it down somewhere you will see regularly. [7.1]&lt;/li&gt;
&lt;li&gt;☐ Learn the subject’s &lt;strong&gt;organization&lt;/strong&gt;. &lt;a href="https://en.wikipedia.org/wiki/Concept_map"&gt;Draw it out.&lt;/a&gt; You can try to find diagrams with Google image search, or use a Table of Contents from a popular book on the subject. [4.1]&lt;/li&gt;
&lt;li&gt;☐ Determine a way to visualize your &lt;strong&gt;progress&lt;/strong&gt; as you learn. Place it somewhere you will often see. [2.3]&lt;/li&gt;
&lt;li&gt;☐ &lt;strong&gt;Assess&lt;/strong&gt; what you already know. A few ideas: Find an online test, try some practice problems from a book, or ask an expert. [3.1]&lt;/li&gt;
&lt;li&gt;☐ Use a tool to help you &lt;strong&gt;track&lt;/strong&gt; what you need to do when. This could be a website, a To-do app, or even a paper checklist.&lt;/li&gt;
&lt;li&gt;☐ Break down what you want to learn into small &lt;strong&gt;tasks&lt;/strong&gt; of 30 minutes to an hour in duration. Set small and specific goals for each session. [2.1]&lt;/li&gt;
&lt;li&gt;☐ Set goals with Bloom’s taxonomy in mind. Go &lt;strong&gt;beyond&lt;/strong&gt; recognizing information. Add practice problems. Try miniature projects. Do comparison exercises. Try pattern exercises. Graph out concepts. Present arguments about what you’re learning. [2.2/6.2]&lt;/li&gt;
&lt;li&gt;☐ Find a way to allow &lt;strong&gt;choices&lt;/strong&gt; while you learn. You want choices for both content and format. Maybe on a given day you have the choice of one of three topics. Or one of three ways to learn the same topic, like a book, video, or activity. [5]&lt;/li&gt;
&lt;li&gt;☐ Set your schedule with plenty of time for &lt;strong&gt;practice&lt;/strong&gt; and spaced &lt;strong&gt;repetition&lt;/strong&gt;. You should plan to revisit each unit at least two or three times, spaced out as you learn. [6.1/6.4]&lt;/li&gt;
&lt;li&gt;☐ Find a way to get either expert or peer &lt;strong&gt;feedback&lt;/strong&gt; as you learn. That could mean finding someone you already know to give weekly feedback. Or finding an online forum. This person or community can also help you &lt;strong&gt;stick&lt;/strong&gt; to your plan. [8.1/8.3]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cf4BTt-V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/chk-2.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cf4BTt-V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/chk-2.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Before you start a learning session
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;☐ Find a quiet, calm, and clean learning &lt;strong&gt;environment&lt;/strong&gt;. Remove distractions. It won’t be perfect, and that’s okay. [1.3]&lt;/li&gt;
&lt;li&gt;☐ Only learn &lt;strong&gt;one&lt;/strong&gt; thing at a time. If you are thinking about trying more than one thing at a time, don’t. If the session feels too large, break it down into smaller parts. [1.1/1.2]&lt;/li&gt;
&lt;li&gt;☐ Review the &lt;strong&gt;organization&lt;/strong&gt; of what you are about to learn. How does this fit into the subject? [4.1]&lt;/li&gt;
&lt;li&gt;☐ What &lt;strong&gt;problem&lt;/strong&gt; does this information or idea solve? Figure that out early. [7.2]&lt;/li&gt;
&lt;li&gt;☐ Determine the &lt;strong&gt;main ideas&lt;/strong&gt; of what you are about to learn. You could review section headers in a book, or a summary of the content. [4.2]&lt;/li&gt;
&lt;li&gt;☐ Review related prior knowledge. What do you &lt;strong&gt;already know&lt;/strong&gt; that relates to what you are about to learn? [3.3]&lt;/li&gt;
&lt;li&gt;☐ Make a &lt;strong&gt;choice&lt;/strong&gt; about the content or format before learning. [5]&lt;/li&gt;
&lt;li&gt;☐ Limit your session to about &lt;em&gt;30 minutes to an hour&lt;/em&gt;. Take frequent breaks!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qI8vHhr_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/chk-3.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qI8vHhr_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/chk-3.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  While you learn
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;☐ Tie back &lt;em&gt;details&lt;/em&gt; with the &lt;strong&gt;main ideas&lt;/strong&gt;. [4.2]&lt;/li&gt;
&lt;li&gt;☐ As you learn, &lt;strong&gt;connect&lt;/strong&gt; what you are learning to what you &lt;em&gt;already know&lt;/em&gt;. [3.3]&lt;/li&gt;
&lt;li&gt;☐ Stay in the &lt;strong&gt;middle&lt;/strong&gt; of challenge. If too &lt;em&gt;difficult&lt;/em&gt;, review what you already know and break down what you are learning. If too &lt;em&gt;easy&lt;/em&gt;, skip ahead. [1.2/3.2]&lt;/li&gt;
&lt;li&gt;☐ &lt;strong&gt;Scaffold&lt;/strong&gt;. Solve easier problems before trying harder ones. Do isolated exercises before trying to create a full project. [3.2]&lt;/li&gt;
&lt;li&gt;☐ Find &lt;strong&gt;examples&lt;/strong&gt;. You could find a video demonstrating the idea. [7.3]&lt;/li&gt;
&lt;li&gt;☐ Test your organizational knowledge. &lt;strong&gt;Draw&lt;/strong&gt; out the relationships between the concepts. [4.3]&lt;/li&gt;
&lt;li&gt;☐ Get &lt;strong&gt;feedback&lt;/strong&gt;. Use your expert or peer to help make sure your learning is on task. Clear up any misconceptions and use this person to test what you’ve learned. [8.1]&lt;/li&gt;
&lt;li&gt;☐ When you feel you’ve learned the content, update your &lt;strong&gt;progress&lt;/strong&gt; visualization. [2.3]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ytq_BAeU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/chk-4.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ytq_BAeU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/chk-4.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  To review weekly
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;☐ Revisit your reason for &lt;strong&gt;why&lt;/strong&gt; you want to learn this subject. [7.1]&lt;/li&gt;
&lt;li&gt;☐ Update your model of the &lt;strong&gt;organization&lt;/strong&gt; of subject and your &lt;strong&gt;progress&lt;/strong&gt; tracking. [4.1/2.3]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ask meta-cognitive questions [6.3]…&lt;/strong&gt; (There is no right answer to these. Just asking is enough.)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;☐ Do I have a &lt;em&gt;strategy&lt;/em&gt;? Is my strategy successful? [6.3]&lt;/li&gt;
&lt;li&gt;☐ Am I &lt;em&gt;focused&lt;/em&gt; while learning? Can I improve my focus? [1]&lt;/li&gt;
&lt;li&gt;☐ Is this the right &lt;em&gt;difficulty&lt;/em&gt; for me? [3]&lt;/li&gt;
&lt;li&gt;☐ Are the &lt;em&gt;choices&lt;/em&gt; I’m making effective? Do my choices have a limited number of options? Do my choices have clear default options? [5]&lt;/li&gt;
&lt;li&gt;☐ Am I getting enough &lt;em&gt;practice&lt;/em&gt; time? Am I &lt;em&gt;spacing&lt;/em&gt; my practice? [6.1/6.4]&lt;/li&gt;
&lt;li&gt;☐ Am I getting effective &lt;em&gt;feedback&lt;/em&gt;? I am building &lt;em&gt;trust&lt;/em&gt; with my expert/peer? [8.1/8.2]&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Wrap Up
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Learning is hard&lt;/em&gt;, and learning alone can be difficult. It can be difficult to stay motivated and keep going towards your goal. If you follow some of the ideas on this list, you can learn more easily, more deeply, and more quickly.&lt;/p&gt;

&lt;p&gt;See the &lt;a href="https://dev.to/stories/eight-big-ideas-of-learning"&gt;full article&lt;/a&gt; for more resources. &lt;strong&gt;Thanks for reading&lt;/strong&gt;! &lt;em&gt;Feedback is welcome.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you’d like to know more about Sagefy, &lt;a href="https://sagefy.org"&gt;visit today&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Eight Big Ideas of Learning</title>
      <dc:creator>Kevin Heis</dc:creator>
      <pubDate>Mon, 09 Jul 2018 00:00:00 +0000</pubDate>
      <link>https://dev.to/heiskr/eight-big-ideas-of-learning-e85</link>
      <guid>https://dev.to/heiskr/eight-big-ideas-of-learning-e85</guid>
      <description>&lt;p&gt;I’ll admit it: &lt;em&gt;I’m a huge nerd&lt;/em&gt;. One of my favorite subjects is &lt;strong&gt;learning how to learn&lt;/strong&gt;. I’ve read and studied on learning science for many years. And I’ve built my own learning platform, &lt;a href="https://sagefy.org"&gt;Sagefy&lt;/a&gt;. That said, I’m no expert — enjoy this outsider’s take on the literature.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In this article, I’m going to sum up what I’ve learned about learning.&lt;/strong&gt; There’s an entire field of study devoted to the subject, so I can’t include everything. But these eight points epitomize the research. (If this article is too long for you, check out my &lt;a href="https://dev.to/stories/eight-big-ideas-of-learning-tl-dr-edition"&gt;10 minute TL;DR version&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you’re a learner too&lt;/strong&gt; , &lt;em&gt;this article is for you&lt;/em&gt;. Maybe you’re a student, a teacher, or a lifelong learner like me. Education researchers usually write these from the perspective of a classroom teacher. I am writing from the perspective of an individual, independent learner. These ideas can apply to a classroom, online learning, and everyday life lessons. And come back and review these ideas every now and again… you might find a new perspective you didn’t expect. I always do.&lt;/p&gt;

&lt;p&gt;I believe in &lt;strong&gt;evidence&lt;/strong&gt;. Research isn’t perfect. But research is better than the alternative. We all develop theories of learning throughout schooling and working. But not all these theories have evidence to back them up. Take “learning styles” — the theory that each person has a type of learning, like auditory or visual. The idea is pervasive in institutional education. Yet, the theory of “learning styles” &lt;a href="https://digest.bps.org.uk/2018/04/03/another-nail-in-the-coffin-for-learning-styles-students-did-not-benefit-from-studying-according-to-their-supposed-learning-style/"&gt;does not have evidence&lt;/a&gt; to support it. &lt;a href="https://www.ncbi.nlm.nih.gov/pubmed/18361632"&gt;Feedback from learners&lt;/a&gt; about their preferences is another illusion. Instead, we need to focus on &lt;a href="https://files.eric.ed.gov/fulltext/ED498555.pdf"&gt;&lt;em&gt;learning results&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It’s not always easy to pull research into &lt;strong&gt;applicable techniques&lt;/strong&gt;. Articles like this attempt to bridge the gap. These ideas are not new or unique. I am not the first person to say any of these things. While this specific list and order is unique, every idea in this article comes from other sources. I will link where possible.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://sagefy.org"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TdwoG53O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/big-2.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If my background interests you:&lt;/em&gt; &lt;a href="https://sagefy.org"&gt;&lt;strong&gt;Sagefy&lt;/strong&gt;&lt;/a&gt; is the project I’m building on these ideas. Sagefy is an open-content adaptive learning system. &lt;em&gt;Open-content&lt;/em&gt; means anyone can create and update learning content, like Wikipedia. &lt;em&gt;Adaptive learning&lt;/em&gt; means the content changes based on the learner’s prior knowledge. The combination means anyone can learn almost anything, regardless of their prior knowledge. To learn more about Sagefy, check out this &lt;a href="https://dev.to/stories/why-i-m-building-sagefy"&gt;in-depth article&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The greatest opportunity for technology is human learning.&lt;/strong&gt; We accelerate our progress by using our tools to accelerate our knowledge. We must avoid technology for technology’s sake alone. Technological advances often do not living up to their possibilities. &lt;a href="https://www.amazon.com/Teachers-Machines-Classroom-Technology-Since/dp/080772792X"&gt;The history of ed-tech&lt;/a&gt; shows technology deviating from learning principles. We avoid unnecessary technological clutter by focusing on core principles. I want this article to be a reference for myself as I build and grow Sagefy.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--inwoI973--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/big-3.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--inwoI973--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/big-3.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Idea 1: Do One Thing at a Time
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;“&lt;/strong&gt; Do one thing at a time” is a long way to say: &lt;strong&gt;&lt;em&gt;focus&lt;/em&gt;&lt;/strong&gt;. Remove distractions. Drop unneeded interfaces. Silence background chatter. Don’t multitask: it doesn’t work. Only focus on one lesson of one subject at a time. When we focus, we get more out of the energy we put into learning.&lt;/p&gt;

&lt;p&gt;Attempting to learn three new ideas at the same time to solve one problem is going to slow you down. Instead, isolate and learn each idea, and then integrate the ideas to solve the problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;1.1 Account for the limits of working memory.&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Our brain has about &lt;a href="https://www.nature.com/scitable/blog/brain-metrics/are_there_really_as_many"&gt;86 billion neurons&lt;/a&gt;. Our long term memory &lt;a href="http://www.cs.colorado.edu/~mozer/Teaching/syllabi/7782/readings/Landauer1986.pdf"&gt;appears to be limitless&lt;/a&gt;. Our reality is that we cannot remember everything in our long-term memory at one time. What we remember in the current moment, we call &lt;strong&gt;working memory&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.psych.utoronto.ca/users/peterson/psy430s2001/Miller%20GA%20Magical%20Seven%20Psych%20Review%201955.pdf"&gt;George Miller in 1956&lt;/a&gt; found working memory limited to seven items, plus or minus two. Decades later, researchers found our brain limits working memory to &lt;strong&gt;four items&lt;/strong&gt;. This rule applies for anything beyond rote memorization. See Broadbent in 1975, &lt;a href="http://psycnet.apa.org/record/1995-04539-001"&gt;Baddeley in 1994&lt;/a&gt;, and &lt;a href="http://memory.psych.missouri.edu/doc/articles/2001/Cowan%20BBS%202001.pdf"&gt;Cowen in 2001&lt;/a&gt;. IQ measurements generally &lt;a href="https://www.ncbi.nlm.nih.gov/pubmed/20018296"&gt;do not impact&lt;/a&gt; working memory limits.&lt;/p&gt;

&lt;p&gt;We learn by &lt;em&gt;connecting new information to previous known information&lt;/em&gt;. (As we’ll come back to in an upcoming section (3.3).) Your current knowledge takes one to three items. That means you likely only have &lt;strong&gt;one or two items&lt;/strong&gt; left for new knowledge. Much of the rest of the points in this article deal with the limits of working memory.&lt;/p&gt;

&lt;p&gt;In summary, &lt;strong&gt;&lt;em&gt;be realistic&lt;/em&gt;&lt;/strong&gt; about how much information you can put into your working memory. It’s less than you expect.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;1.2 Do one activity at a time. Avoid multitasking.&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Humans are &lt;a href="http://www.pnas.org/content/106/37/15583"&gt;&lt;strong&gt;terrible at multitasking&lt;/strong&gt;&lt;/a&gt;. One study by &lt;a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.476.4112&amp;amp;rep=rep1&amp;amp;type=pdf"&gt;Clark, Ayres and Sweller in 2005&lt;/a&gt; asked learners to learn both spreadsheet software and related mathematics at the same time. The learners felt overwhelmed. Another &lt;a href="https://www.researchgate.net/publication/48829040_When_Learning_Is_Just_a_Click_Away_Does_Simple_User_Interaction_Foster_Deeper_Understanding_of_Multimedia_Messages"&gt;2001 study by Mayer and Chandler&lt;/a&gt; found learners overwhelmed learning an entire interface at once. Learners were more successful learning the interface sequentially.&lt;/p&gt;

&lt;p&gt;An entire field of study, &lt;a href="https://en.wikipedia.org/wiki/Capacity_theory"&gt;capacity theory&lt;/a&gt;, has explored the idea of how much one can learn at the same time. Many researchers use the &lt;a href="https://en.wikipedia.org/wiki/Wisconsin_Card_Sorting_Test"&gt;Wisconsin Card Sorting Testing&lt;/a&gt; to show we can’t multitask while learning something new.&lt;/p&gt;

&lt;p&gt;The gist is that trying to learn more than one thing at a time is counterproductive. Instead, it’s much better to try to &lt;strong&gt;learn one thing at a time&lt;/strong&gt; instead of many things at once. Learn one thing, take a break, learn the next thing, take a break, and so on. If you’re feeling overwhelmed, break down what you’re learning into different steps. Then, bring it all together at the end.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;1.3 Cut noise: distractions, extra choices, tangents, extra inputs…&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;A &lt;a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.454.4263&amp;amp;rep=rep1&amp;amp;type=pdf"&gt;1996 Mayer et al&lt;/a&gt; study found summarizing a lesson, and reducing information, increased learning. A &lt;a href="https://pdfs.semanticscholar.org/cb1c/9c2bc3703eb49bf7a7f9d3550725671a4a26.pdf"&gt;1998 Harp and Mayer&lt;/a&gt; study found that adding interesting bits of information reduced learning. A &lt;a href="http://visuallearningresearch.wiki.educ.msu.edu/file/view/Mayer,%20Heiser,%20%26%20Lonn%20%282001%29.pdf"&gt;2001 Mayer&lt;/a&gt; study found increasing the amount of information in a lesson decreased retention. A &lt;a href="https://www.researchgate.net/publication/220041451_Learning_from_text_with_diagrams_Promoting_mental_model_development_and_inference_generation_Journal_of_Educational_Psychology_98_182-197"&gt;2006 Butcher study&lt;/a&gt; found simple diagrams work better for learning than realistic diagrams. Finally, a &lt;a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC1821121/"&gt;2007 Mason et al study&lt;/a&gt; found wandering minds were not as capable on performing on tasks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Noise&lt;/strong&gt; can come in many forms. &lt;em&gt;Noise detracts from learning&lt;/em&gt;. There’s auditory or visual noise. There’s noise as extra choices in the learning interface. And there’s noise in the form of tangents of information. For example, one of my goals for Sagefy is to reduce interface noise to keep the focus on learning. Find a quiet, comfortable place to learn where nothing will distract you. Disable social media, put the phone on quiet, close the browser tabs. Get rid of extraneous thoughts, worries, and planning. &lt;em&gt;Allow yourself to focus on learning one thing at a time.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VvcOmXtC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/big-4.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VvcOmXtC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/big-4.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Idea 2: Set &amp;amp; Adhere to Goals
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Define small and achievable&lt;/em&gt; &lt;strong&gt;&lt;em&gt;goals&lt;/em&gt;&lt;/strong&gt;. Then as you learn, check against those goals. Setting specific goals gives the opportunity for frequent wins, which keeps you learning.&lt;/p&gt;

&lt;p&gt;If your goal is too large or ill-defined, you’ll have difficulty focusing and lose motivation. You’ll deal with the constant question, “what’s next?” and spend more time on figuring out what to do than actually learning. By setting small and achievable goals, you keep learning.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.1 Define small and achievable goals.
&lt;/h3&gt;

&lt;p&gt;There are many goal frameworks such as &lt;a href="https://en.wikipedia.org/wiki/SMART_criteria"&gt;SMART&lt;/a&gt;. What the frameworks all seem to share is making goals that are both &lt;strong&gt;&lt;em&gt;small&lt;/em&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;em&gt;achievable&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Goals and learning are one of the most studied &lt;em&gt;relationships&lt;/em&gt; in educational science. A &lt;a href="http://psycnet.apa.org/record/1979-27820-001"&gt;pivotal study in 1979 by Rothkopf and Billington&lt;/a&gt; asked students to set small goals before they started reading. This improved reading comprehension. A &lt;a href="https://selfdeterminationtheory.org/SDT/documents/2000_DeciRyan_PIWhatWhy.pdf"&gt;2000 paper by Deci and Ryan&lt;/a&gt; finds goals are a fundamental psychological need. A &lt;a href="http://www-2.rotman.utoronto.ca/facbios/file/09%20-%20Locke%20&amp;amp;%20Latham%202002%20AP.pdf"&gt;summary article in 2002 by Locke and Latham&lt;/a&gt; goes into the long history of the research of setting goals in learning. The researchers showed setting goals — specific, challenging, and achievable — improves learning. A &lt;a href="http://home.uchicago.edu/ourminsky/Goal-Gradient_Illusionary_Goal_Progress.pdf"&gt;2006 paper by Kivetz, Urminsky, and Zheng&lt;/a&gt; found setting small goals increased desired behavior. A &lt;a href="http://psycnet.apa.org/record/2010-12776-001"&gt;2010 paper by Koo and Fishbach&lt;/a&gt; found focusing on remaining tasks — not completed tasks — delivered higher results. In &lt;a href="https://graphics8.nytimes.com/images/blogs/freakonomics/pdf/DeliberatePractice%28PsychologicalReview%29.pdf"&gt;Ericsson’s deliberate practice model&lt;/a&gt;, deliberate practice requires frequently setting goals. The other aspects are focus (1.3), feedback (8.1), and appropriate level of challenge (3.2).&lt;/p&gt;

&lt;p&gt;You should start each learning session with a &lt;strong&gt;small and specific goal&lt;/strong&gt;. For example, learning all of calculus is huge and not achievable in one session. Instead, set a goal of solving 20 practice problems for the derivative power rule. That &lt;em&gt;is&lt;/em&gt; both &lt;em&gt;small&lt;/em&gt; and &lt;em&gt;achievable&lt;/em&gt;. Often, the more specific the goal, the more achievable the goal is. Losing motivation while learning is common. Setting small and achievable goals helps us to stay motivated. And setting goals helps us to also live up to &lt;em&gt;Idea 1: Do One Thing at a Time&lt;/em&gt; by helping us to determine our focus.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2 Set goals for both knowledge and skills.
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Bloom%27s_taxonomy"&gt;Bloom’s 1956 taxonomy&lt;/a&gt; defines six types of learning activities. &lt;strong&gt;Knowledge, comprehension, application, analysis, synthesis, and evaluation&lt;/strong&gt;. (Also see &lt;a href="https://www.depauw.edu/files/resources/krathwohl.pdf"&gt;Krathwohl’s 2002 revision&lt;/a&gt;.) If we only set goals for knowledge, we miss the opportunity to develop the other parts. For example, a &lt;a href="https://www.researchgate.net/publication/222438655_Self-Explanations_How_Students_Study_and_Use_Examples_in_Learning_to_Solve_Problems"&gt;1989 Chi et al study&lt;/a&gt; found that stronger learners explain what they’ve learned in their own words.&lt;/p&gt;

&lt;p&gt;One of the most common sayings is learning has no value unless you can &lt;strong&gt;apply&lt;/strong&gt; what you’ve learned. So we need to make sure the goals we set go &lt;em&gt;beyond&lt;/em&gt; memorization of facts. Challenge yourself to relate data points to each other. Work on projects that apply the knowledge. Do comparison exercises. Spend time identifying patterns in the knowledge. Present arguments based on what you’ve learned. Going beyond knowledge is important. (We’ll revisit this aspect further in section 6.2.)&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3 Habitually review your progress against your goals.
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.amazon.com/Drive-Surprising-Truth-About-Motivates/dp/1594484805"&gt;Daniel Pink’s Drive&lt;/a&gt; shows &lt;strong&gt;&lt;em&gt;intrinsic motivation&lt;/em&gt;&lt;/strong&gt; is more powerful than extrinsic motivation. Extrinsic motivation is reward and punishment. Pink identifies three main principles of intrinsic motivation. &lt;strong&gt;Autonomy&lt;/strong&gt; (see Idea 5), &lt;strong&gt;mastery&lt;/strong&gt; (see Idea 6), and &lt;strong&gt;purpose&lt;/strong&gt; (see Idea 7). Checking our progress against our goals grows our sense of mastery. That in turn builds intrinsic motivation.&lt;/p&gt;

&lt;p&gt;In Sagefy, as you learn you get to see your progress of how many units you’ve mastered in the subject. And as you go through learning activities, a simple bar shows your progress to mastering the unit.&lt;/p&gt;

&lt;p&gt;As you learn, create a way to &lt;strong&gt;visualize&lt;/strong&gt; your progress against your goals. That reminder can help keep you motivated towards learning.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ytfj_OuT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/big-5.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ytfj_OuT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/big-5.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Idea 3: Adapt to Prior Knowledge
&lt;/h2&gt;

&lt;p&gt;The strongest predictor of how much we will learn is &lt;strong&gt;&lt;em&gt;what we already know&lt;/em&gt;&lt;/strong&gt;. &lt;em&gt;Prior knowledge&lt;/em&gt; is how much we know going into a learning experience. Adapt the learning experience to prior knowledge. When the learning activity pushes us to the right level of challenge, we make the most of our time learning.&lt;/p&gt;

&lt;p&gt;If the content is too easy, we get bored. If the content is too difficult, we get frustrated. Our understanding becomes vague. Either way, we lose motivation. By staying in the in-between zone, we get the most of our learning effort and keep with it for longer.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.1 Assess prior knowledge first. Focus on areas of weakness.
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.researchgate.net/publication/249797493_The_Relation_Between_Assessment_Practices_and_Outcomes_of_Studies_The_Case_of_Research_on_Prior_Knowledge"&gt;Dochy, Segers, and Buehl in 1999&lt;/a&gt; found &lt;em&gt;81%&lt;/em&gt; of the difference between learning rates in different learners is prior knowledge. In &lt;a href="https://visible-learning.org/hattie-ranking-influences-effect-sizes-learning-achievement/"&gt;Hattie’s massive ranking of learning factors&lt;/a&gt;, prior knowledge has an effect size of 0.94. Prior knowledge is also the underlying effect of two even stronger factors. Prior knowledge has the &lt;em&gt;largest&lt;/em&gt; impact on how much we learn.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Formative_assessment"&gt;&lt;strong&gt;&lt;em&gt;Formative assessment&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt; is the idea that we should start by testing our knowledge first. Then, we continue to use assessment to learn. &lt;a href="https://en.wikipedia.org/wiki/Summative_assessment"&gt;Summative assessment&lt;/a&gt; is only at the end. A &lt;a href="https://www.nytimes.com/2014/09/07/magazine/why-flunking-exams-is-actually-a-good-thing.html"&gt;NY Times article&lt;/a&gt; highlights the value of formative assessments. In an influential &lt;a href="https://msu.edu/~ema/802/Ch6-Memory/2/BransfordJohnson72.pdf"&gt;1972 Bransford and Johnson article&lt;/a&gt;, formative assessment activated prior knowledge. The result was that formative assessment is a learning tool itself. A &lt;a href="http://drbrogdon03.pbworks.com/w/file/fetch/55230203/Using%20Tests%20to%20Teach.pdf"&gt;Wininger study&lt;/a&gt; tried using assessment both before and during learning activities. This elevated learner comprehension.&lt;/p&gt;

&lt;p&gt;We often decide to pick a book or a course for a topic without considering what we already know first. Industrialized education unfortunately suggests all learners are starting from the same place. If you want to learn how to play piano without knowing how to read sheet music, you are in for a difficult journey. Instead, &lt;em&gt;find a means to&lt;/em&gt; &lt;strong&gt;&lt;em&gt;assess&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;what you already know&lt;/em&gt;— and what you need to work on —  &lt;strong&gt;before&lt;/strong&gt; you start learning. And, use assessment as you learn to identify areas of weakness and build up in those areas first.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2 Stay in the middle and adjust the challenge. Scaffold.
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fwAy3-Lv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/big-6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fwAy3-Lv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/big-6.png" alt="“Flow” is a function of prior skill and challenge."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mihaly Csikszentmihalyi’s most famous work is &lt;a href="https://www.amazon.com/Flow-Psychology-Experience-Perennial-Classics/dp/0061339202"&gt;Flow&lt;/a&gt;. &lt;a href="https://en.wikipedia.org/wiki/Flow_%28psychology%29"&gt;Flow&lt;/a&gt; is a psychological concept of being &lt;strong&gt;completely engaged&lt;/strong&gt; with an activity. We are in “learning flow” when our level of skill and the level of challenge match. Sometimes our prior skill level and the level of challenge don’t align. Then we are anxious or bored. John Caroll’s &lt;a href="http://www.instructionaldesign.org/theories/minimalism/"&gt;Minimalism&lt;/a&gt; framework also promotes matching the challenge to the learner’s skill level. We can trace this idea back to &lt;a href="https://static1.squarespace.com/static/57309137ab48de6f423b3eec/t/588a1a9846c3c4746d0816d6/1485445785596/Atkinson1957.pdf"&gt;Atkinson’s 1957 article&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;One of the ways to help match prior knowledge and challenge level is to use scaffolding. &lt;a href="https://en.wikipedia.org/wiki/Instructional_scaffolding"&gt;&lt;strong&gt;&lt;em&gt;Scaffolding&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt; is the idea of putting on training wheels. At first, provide lots of learning support. Then, remove those supports as the learner’s skill &lt;em&gt;develops&lt;/em&gt;. A review by &lt;a href="https://www.sesp.northwestern.edu/docs/publications/78857602544049eb20ee68.pdf"&gt;Reiser&lt;/a&gt; shows scaffolding is an old and effective technique.&lt;/p&gt;

&lt;p&gt;In Sagefy, I measure and update how strong the learner knows the material with each activity. I show the learner activities to choose from and engage with based on those measurements.&lt;/p&gt;

&lt;p&gt;We want to avoid learning experiences that are &lt;em&gt;too easy&lt;/em&gt; or &lt;em&gt;too difficult&lt;/em&gt;. Too easy, and we get bored and waste time and effort on things we already know. Too difficult, and we get frustrated and start to shut down. We want to &lt;strong&gt;stay in the middle&lt;/strong&gt;. Sometimes that means breaking down what we are learning into smaller parts first. That might mean reviewing prerequisite knowledge. We can also scaffold ourselves. Start with simple applications of knowledge, and slowly increase the complexity.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3.3 Connect new information with existing knowledge.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;In 1980, &lt;a href="http://reasoninglab.psych.ucla.edu/KH%20pdfs/Gick-Holyoak%281980%29Analogical%20Problem%20Solving.pdf"&gt;Gick and Holyoak&lt;/a&gt; asked learners to make analogies connecting their prior knowledge to new knowledge. This improved recall. A &lt;a href="http://psycnet.apa.org/record/1991-17537-001"&gt;1991 study by Martin and Pressley&lt;/a&gt; had students explain how what they already knew applies to new information. This had a dramatic impact on learning. A 1992 review of prior knowledge by &lt;a href="http://www.hostos.cuny.edu/MTRJ/HTRT/Encouraging%20mindful%20use%20of%20prior%20knowledge.pdf"&gt;Pressley et al&lt;/a&gt; looks into the history of prior knowledge. The authors conclude &lt;em&gt;we learn by connecting new information with prior knowledge&lt;/em&gt;. A &lt;a href="https://www.researchgate.net/publication/256096544_Reasoning_about_sampling_distributions"&gt;2004 chapter by Chance, DelMas, and Garfield&lt;/a&gt; arrives at similar conclusions.&lt;/p&gt;

&lt;p&gt;Before learning something new, &lt;em&gt;start&lt;/em&gt; by &lt;strong&gt;reviewing&lt;/strong&gt; related information you already know. Otherwise, you lower the chance to associate those two pieces of knowledge. You reduce your ability to recall the new information when relevant. For example: you are going into a lesson about choosing effective typefaces. You could start by reviewing the different categories of typefaces. &lt;strong&gt;Connecting&lt;/strong&gt; what you already know to what you want to learn is one of the best ways to accelerate your own learning.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qZtymBIt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/big-7.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qZtymBIt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/big-7.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Idea 4: Build the Graph
&lt;/h2&gt;

&lt;p&gt;Our memory system works by forming &lt;strong&gt;&lt;em&gt;relationships&lt;/em&gt;&lt;/strong&gt; between data. Mastery is the result of a &lt;em&gt;large, deeply-connected graph&lt;/em&gt;. We link new information with information we already know. When we focus on organizational knowledge, as we learn we have mental places to put the knowledge.&lt;/p&gt;

&lt;p&gt;When we don’t know how experts organize the knowledge before we dig in, we don’t connect the knowledge. Learning becomes mechanical. By learning how to organize the information first, we can quickly &lt;em&gt;connect information&lt;/em&gt;. We can use our prior knowledge more. And we get more out of each piece of the graph.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.1 Learn how to organize the subject before getting specific.
&lt;/h3&gt;

&lt;p&gt;One heavily cited work in educational research is &lt;a href="https://www.scribd.com/document/149011474/De-Groot-Thought-and-Choice-in-Chess-1965-2nd-Ed-1978-241x2s-OCR-Chessbook"&gt;DeGroot’s 1965 “Thought and Choice in Chess.”&lt;/a&gt; In this work, DeGroot shows the differences between beginner and expert chess players. &lt;a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.601.2724&amp;amp;rep=rep1&amp;amp;type=pdf"&gt;Chase and Simon’s 1973 study&lt;/a&gt; expands on that work. In that study, beginner and expert chess players differ in &lt;strong&gt;organizational knowledge&lt;/strong&gt;. A &lt;a href="https://web.stanford.edu/~gbower/1969/hierarchical_retrieval_schemes.pdf"&gt;1969 study by Bower et al&lt;/a&gt; presented hierarchies of words to learners instead of unorganized lists. This elevated recall. In &lt;a href="https://www.researchgate.net/publication/232954018_Effects_of_Knowledge_Organization_on_Task_Performance"&gt;Reif and Eylon’s 1984 study&lt;/a&gt; of a physics lesson, researchers presented organization first. This improved test performance. Another &lt;a href="https://pdfs.semanticscholar.org/16ef/4cc3a80ee7ba8f59e0a55b2ef134c31e18b3.pdf"&gt;Chi et al&lt;/a&gt; study found similar conclusions.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Learn&lt;/em&gt; the subject’s &lt;strong&gt;organization&lt;/strong&gt; &lt;em&gt;before&lt;/em&gt; you begin to learn something new. That could mean reviewing the Table of Contents in a book before reading it. Or reading the section headings before reading the full text. Review maps and diagrams of how to organize the information. This organizational task can help give structure to your learning plan. Organizational knowledge also helps you to connect appropriate prior knowledge (3.3). And set goals (2.1). And as you learn, you’ll know how the information relates to other areas within the subject.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.2 Work top-down.
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Top-down_and_bottom-up_design"&gt;&lt;strong&gt;&lt;em&gt;Top-down learning&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt; means learning the organization and main ideas &lt;em&gt;first&lt;/em&gt;. Then dive into each of those solo. Get &lt;em&gt;deeper&lt;/em&gt; as you move further along. Bottom-up learning means learning each component in isolation, then combining the knowledge only at the end.&lt;/p&gt;

&lt;p&gt;A &lt;a href="http://www.cogsci.rpi.edu/~rsun/sun.cog02-toh.pdf"&gt;2002 Sun and Zhang study&lt;/a&gt; tried top-down processing and bottom-up processing on the “Tower of Hanoi” problem. The top-down approach was more effective. A &lt;a href="http://www.nsta.org/publications/news/story.aspx?id=53144"&gt;2006 article by Lovrich&lt;/a&gt; finds use cases for both forms, but generally top-down is more effective. Finally, a &lt;a href="https://tccl.arcc.albany.edu/knilt/images/6/6a/Lim_etal_ETR%26D_2009.pdf"&gt;2008 study by Lim, Reiser, and Olina&lt;/a&gt; surveyed the whole task first, then drilled down. That was more effective than teaching individual parts then combining at the end.&lt;/p&gt;

&lt;p&gt;We know that the brain limits working memory (section 1.1). One strategy to deal with this limit is chunking. &lt;strong&gt;&lt;em&gt;Chunking&lt;/em&gt;&lt;/strong&gt; means to &lt;em&gt;group&lt;/em&gt; several similar items together. Chunking is one strategy to add a top-down workflow to your learning. A &lt;a href="http://psycnet.apa.org/record/1981-11874-001"&gt;1980 study from Ericsson, Chase, and Faloon&lt;/a&gt; shows chunking nears expert performance for memorizing numbers.&lt;/p&gt;

&lt;p&gt;As you learn, try to figure out what the &lt;strong&gt;main idea&lt;/strong&gt; of the lesson is. Then, try to find ways to &lt;em&gt;tie&lt;/em&gt; back in each point with the main idea.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.3 Test your organizational knowledge.
&lt;/h3&gt;

&lt;p&gt;A &lt;a href="http://digitalcollections.library.cmu.edu/awweb/awarchive?type=file&amp;amp;item=33846"&gt;1977 Hinsley, Hayes, and Simon study&lt;/a&gt; asked students to categorize algebra problems. When students had correct categories, they more often arrived at the correct answer. Having students practice &lt;em&gt;categorizing&lt;/em&gt; problems improved performance. A &lt;a href="https://www.tandfonline.com/doi/abs/10.1207/s15327809jls0101_4"&gt;Chi &amp;amp; VahLehn 1991&lt;/a&gt; asked learners to explain and include organizational knowledge. The explanations with organizational knowledge were more effective.&lt;/p&gt;

&lt;p&gt;As you learn, find ways to &lt;strong&gt;&lt;em&gt;test&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;your organizational knowledge&lt;/em&gt;. For example: you could pick out a passage in a text. Then, figure out where that knowledge fits into your schema of the subject. Or you could use an existing diagram and fill in the gaps. You could also try &lt;a href="https://en.wikipedia.org/wiki/Concept_map"&gt;&lt;em&gt;concept mapping&lt;/em&gt;&lt;/a&gt;; drawing out a map to structure the subject. When you understand the organization, you learn faster and keep the knowledge.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HzG859cu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/big-8.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HzG859cu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/big-8.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Idea 5: Empower Choice
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Autonomy&lt;/strong&gt; is &lt;a href="https://en.wikipedia.org/wiki/Self-determination_theory"&gt;one of the “three” major intrinsic motivators&lt;/a&gt;. &lt;em&gt;Choice&lt;/em&gt; fuels autonomy. When we take ownership of our learning through choice, we are more motivated to stick with it. For example, choice can be choosing between one of three units to learn next. Or one of five different formats to learn the same lesson.&lt;/p&gt;

&lt;p&gt;If someone forces learning on us, we resent the requirement. Our focus becomes our resentment, not learning. Too many choices can break down our ability to learn too. We focus on making choices instead of learning. And most of us are terrible at making good choices when there are a vast number of options. Instead, the right amount of choice as we learn keeps us motivated and focused on learning.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.1 Create a system that often allows for choices, in both content and format.
&lt;/h3&gt;

&lt;p&gt;Sheena Iyengar is a prominent researcher in the field of the psychology of choice. She is the author of &lt;a href="https://sheenaiyengar.com/the-art-of-choosing/"&gt;“The Art of Choosing.”&lt;/a&gt; In the book, Iyengar accounts for our &lt;em&gt;fundamental desire&lt;/em&gt; for control. The sense of having control can lead to some irrational behavior. Choices can also be motivating as a form of &lt;em&gt;ownership&lt;/em&gt;. In a 1989 chapter in “&lt;a href="https://www.taylorfrancis.com/books/9781317510222/chapters/10.4324%2F9781315717517-8"&gt;Goal Concepts…,”&lt;/a&gt; Bandura finds goals we set &lt;em&gt;ourselves&lt;/em&gt; are stronger than goals &lt;em&gt;others&lt;/em&gt; set for us.&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://files.eric.ed.gov/fulltext/ED408935.pdf"&gt;Schankenberg’s 1997 dissertation&lt;/a&gt;, she found learners &lt;strong&gt;practiced more&lt;/strong&gt; when allowed to make choices. The extra practice improved outcomes (also see the more often cited &lt;a href="https://www.researchgate.net/publication/225566283_Learner_Control_Over_Full_and_Lean_Computer-Based_Instruction_Under_Differing_Ability_Levels"&gt;2000 republishing&lt;/a&gt;). She also found learners reported higher motivation and satisfaction from the course. A &lt;a href="https://www.researchgate.net/publication/226801979_Learner_control_in_animated_multimedia_instructions"&gt;2010 Tabbers and de Koeijer&lt;/a&gt; study also found when learners had choice, learners spent more time on instructional material. And as a result had higher transfer.&lt;/p&gt;

&lt;p&gt;As you create a learning plan for yourself or others, think about ways to include &lt;strong&gt;simple choices&lt;/strong&gt;. For example, you can choose one of three activities for the same information. Or it could be the format is the same, but you can choose which of four things you would like to learn next. Your learning plan for yourself might look more like a graph instead of a list. That way, given the day you can choose which part to work on next instead of feeling forced into the next step.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.2 Cut unnecessary choices and reduce the number of options.
&lt;/h3&gt;

&lt;p&gt;Choice can &lt;strong&gt;overwhelm&lt;/strong&gt;. A &lt;a href="https://faculty.washington.edu/jdb/345/345%20Articles/Iyengar%20%26%20Lepper%20%282000%29.pdf"&gt;2000 study by Iyengar and Lepper&lt;/a&gt; looked at the number of options per choice. A limited number of choices improved results and motivation.&lt;/p&gt;

&lt;p&gt;Learner choice is likely the most controversial subject in educational research. A &lt;a href="https://pdfs.semanticscholar.org/56bc/839d69abce1710a37e848cfdd2e90e73a3b3.pdf"&gt;paper by Lunts&lt;/a&gt; reviews the research. And finds &lt;em&gt;mixed&lt;/em&gt; results based on &lt;em&gt;context&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Choice is powerful. Often &lt;em&gt;too&lt;/em&gt; powerful. We need to be careful to not overwhelm ourselves with too much choice. Again, the &lt;strong&gt;purpose&lt;/strong&gt; of choice is to create a sense of &lt;em&gt;autonomy&lt;/em&gt; and control to drive motivation. The purpose of choice in learning is &lt;em&gt;not&lt;/em&gt; optimization.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.3 Create a recommended default choice.
&lt;/h3&gt;

&lt;p&gt;A learner’s own &lt;strong&gt;perception&lt;/strong&gt; of ability is often inaccurate. A &lt;a href="https://ac.els-cdn.com/S1877042810002259/1-s2.0-S1877042810002259-main.pdf?_tid=ff23d126-3643-496b-a040-3104e9d0a5af&amp;amp;acdnat=1530473578_15dca9401cc5b87539bca00c4380d808"&gt;2010 Zabrucky review&lt;/a&gt; highlights this common result in research. &lt;a href="https://pdfs.semanticscholar.org/eeb3/cf9f4c38107b976f379d1bbb549e48a853c5.pdf"&gt;Jee, Wiley, and Griffin&lt;/a&gt; found learner assessment of ability low for both novices and experts. In a &lt;a href="https://www.researchgate.net/publication/8395777_How_Can_I_Know_What_I_Don%27t_Know_Poor_Self_Assessment_in_a_Well-Defined_Domain"&gt;2004 study by Eva, Cunnington, Reiter, and Norman,&lt;/a&gt; past performance predicts results more than learner predictions.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Avoid&lt;/em&gt; putting yourself or another learner in a position to make a poor choice. Avoid choices that require learner &lt;em&gt;self-assessment&lt;/em&gt; to make an informed choice. One way to avoid these situations is to offer choice with a small number of options. And present a &lt;a href="https://en.wikipedia.org/wiki/Default_effect"&gt;&lt;strong&gt;default choice&lt;/strong&gt;&lt;/a&gt; if the learner wants to move on without choosing. You want choice to be about the feeling of control and autonomy, not about optimization.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ba_mcUv_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/big-9.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ba_mcUv_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/big-9.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Idea 6: Dive Deep
&lt;/h2&gt;

&lt;p&gt;Rote memorization is not enough. We must &lt;strong&gt;apply&lt;/strong&gt; knowledge to create results. When we learn not only &lt;em&gt;what&lt;/em&gt;, but also &lt;em&gt;how&lt;/em&gt; and &lt;em&gt;why&lt;/em&gt;, we empower ourselves to &lt;strong&gt;use&lt;/strong&gt; the knowledge we gain. Asking the questions “how” and “why” deepens what we know.&lt;/p&gt;

&lt;p&gt;Rote memorization is boring. No one enjoys learning that way. We forget knowledge we learn by memorizing. Instead, we need to focus on &lt;em&gt;how&lt;/em&gt; the knowledge works and &lt;em&gt;why&lt;/em&gt; the knowledge is relevant. And these are separate goals than “the what”! Diving deep means learning is more interesting and we keep the knowledge for longer. Diving deep means we can apply what we learn and make a real &lt;em&gt;impact&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  6.1 Practice.
&lt;/h3&gt;

&lt;p&gt;Getting enough &lt;strong&gt;practice&lt;/strong&gt; is important for skill development. That may sound obvious. But, in school we get this idea that we will learn something by only &lt;a href="https://www.washingtonpost.com/news/answer-sheet/wp/2014/10/24/teacher-spends-two-days-as-a-student-and-is-shocked-at-what-she-learned/?utm_term=.b765c5fc161a"&gt;hearing a teacher recite the information&lt;/a&gt;. We also have strong &lt;em&gt;misconceptions&lt;/em&gt; about how much practice we need.&lt;/p&gt;

&lt;p&gt;One interesting idea here is the &lt;a href="https://en.wikipedia.org/wiki/Power_law_of_practice"&gt;Power Law of Practice&lt;/a&gt;. Decades of studies have found a power correlation between practice and skill efficiency. In &lt;a href="http://nautil.us/issue/17/big-bangs/how-i-rewired-my-brain-to-become-fluent-in-math-rd"&gt;“How I Rewired My Brain to Become Fluent in Math”&lt;/a&gt;, Barbara Oakley discusses the importance of &lt;em&gt;mastering the fundamentals&lt;/em&gt;. She does this through deep practice before moving on to more difficult subjects. A &lt;a href="https://www.researchgate.net/publication/232562324_The_role_of_practice_in_the_development_of_performing_musicians"&gt;1996 study by Sloboda et al&lt;/a&gt; found that the amount of practice was an even stronger indicator of results than prior ability. A &lt;a href="https://pdfs.semanticscholar.org/40da/2a40a94fa1a32108566c52988b2fd78bbe74.pdf"&gt;1998 study by Healy et al&lt;/a&gt; found practice needs to have &lt;em&gt;variety&lt;/em&gt; that resembles real application. A &lt;a href="https://www.researchgate.net/publication/227626155_Learning_a_Spatial_Skill_for_Surgery_How_the_Contributions_of_Abilities_Change_With_Practice"&gt;2006 study by Keehner et al&lt;/a&gt; found practice reduces ability differences in learners over time. The &lt;a href="https://www.state.gov/m/fsi/sls/c78549.htm"&gt;Foreign Language Institute&lt;/a&gt; believes it takes 600–2,200 hours of practice to reach moderate skill with a language. The &lt;a href="https://www.languagetesting.com/how-long-does-it-take/"&gt;Language Testing Institute&lt;/a&gt; reports a similar range.&lt;/p&gt;

&lt;p&gt;You need to build more &lt;strong&gt;practice&lt;/strong&gt; in your learning plan than you might guess.&lt;/p&gt;

&lt;h3&gt;
  
  
  6.2 Go beyond rote: explain, apply, analyze, and synthesize.
&lt;/h3&gt;

&lt;p&gt;As I mentioned in 2.2, &lt;a href="https://en.wikipedia.org/wiki/Bloom%27s_taxonomy"&gt;Bloom’s taxonomy&lt;/a&gt; identified six core skills. Knowledge, comprehension, application, analysis, synthesis, and evaluation. &lt;a href="http://wixtedlab.ucsd.edu/publications/Psych%20218/Craik_Lockhart_1972.pdf"&gt;Craik and Lockhart’s 1972 memory framework&lt;/a&gt; shows we need a variety of tasks to build applicable knowledge. A &lt;a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.470.2718&amp;amp;rep=rep1&amp;amp;type=pdf"&gt;1997 Schnieder and Shiffrin paper&lt;/a&gt; looks at this as well. The authors find what makes fixed and flexible expertise different is the &lt;em&gt;variation&lt;/em&gt; of practice. &lt;a href="http://pact.cs.cmu.edu/pubs/Koedinger%20&amp;amp;%20Anderson%2098.pdf"&gt;Koedinger &amp;amp; Anderson’s 1998&lt;/a&gt; paper shows learns with higher and performance when practicing a variety of tasks. We find similar messages in &lt;a href="http://psycnet.apa.org/record/1995-98417-000"&gt;McKeough, Lupart, &amp;amp; Marini’s 1995 “Teaching for transfer”&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As you create and update your learning plan, make sure to include a &lt;strong&gt;variety&lt;/strong&gt; of practice. Include exercises that need not only recognition or recall of information. Include exercises that have you to &lt;em&gt;explain, apply, analyze, and synthesize&lt;/em&gt; knowledge.&lt;/p&gt;

&lt;h3&gt;
  
  
  6.3 Build metacognition.
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Metacognition"&gt;&lt;strong&gt;Metacognition&lt;/strong&gt;&lt;/a&gt; — in context of learning — is the ability to evaluate your own learning strategies… and adapt your strategies as you go. Metacognition is a major topic in educational research. There’s way more than I will include in this article, but I’m going to touch on the basics.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.learning-theories.com/metacognition-flavell.html"&gt;Flavell’s 1976 “Metacognitive aspects of problem solving”&lt;/a&gt; is an early approach of the subject. He identifies motivation and regulation as key metacognitive capabilities. Several studies have confirmed learners with higher metacognitive ability learn better. A few examples: &lt;a href="https://people.ucsc.edu/~gwells/Files/Courses_Folder/ED%20261%20Papers/Palincsar%20Reciprocal%20Teaching.pdf"&gt;Palincsar &amp;amp; Brown 1984&lt;/a&gt;, &lt;a href="https://pdfs.semanticscholar.org/a895/bbb467b1df55b0b238bddbff04f125ee1971.pdf"&gt;Scardamalia Bereiter &amp;amp; Steinbach 1984,&lt;/a&gt; and &lt;a href="http://akademikpersonel.kocaeli.edu.tr/yasemin.katranci/sci/yasemin.katranci17.01.2013_12.51.07sci.pdf"&gt;Sengul &amp;amp; Katranci 2012&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As you are learning, every few hours or so, &lt;em&gt;ask yourself a few questions&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Am I &lt;em&gt;focused&lt;/em&gt; on learning? How could I improve my focus?&lt;/li&gt;
&lt;li&gt;What should I be paying &lt;em&gt;attention&lt;/em&gt; to?&lt;/li&gt;
&lt;li&gt;Have I done something similar &lt;em&gt;before&lt;/em&gt;? Have I experienced something related before?&lt;/li&gt;
&lt;li&gt;How well do I understand this? How &lt;em&gt;difficult&lt;/em&gt; is this for me right now?&lt;/li&gt;
&lt;li&gt;Do I understand how to &lt;em&gt;organize&lt;/em&gt; this knowledge?&lt;/li&gt;
&lt;li&gt;Do I have a &lt;em&gt;strategy&lt;/em&gt;? Is my strategy successful? How many different approaches did I try?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ask these sorts of questions often. These questions improve your metacognitive ability. And lead you to stronger learning results.&lt;/p&gt;

&lt;h3&gt;
  
  
  6.4 Space your practice.
&lt;/h3&gt;

&lt;p&gt;One of the oldest studies in educational science is &lt;a href="http://nwkpsych.rutgers.edu/~jose/courses/578_mem_learn/2012/readings/Ebbinghaus_1885.pdf"&gt;Ebbinghaus, 1885&lt;/a&gt;. Ebbinghaus generalizes retention of knowledge to a curve. The &lt;em&gt;stronger&lt;/em&gt; the memory, the &lt;em&gt;longer&lt;/em&gt; we keep the memory. And the more spaced repetitions of the event, the stronger the memory. &lt;a href="https://www.researchgate.net/publication/245319288_The_Influence_of_Length_and_Frequency_of_Training_Session_on_the_Rate_of_Learning_to_Type"&gt;Baddeley &amp;amp; Longman in a 1978&lt;/a&gt; found typists who spread out their practice had stronger outcomes. &lt;a href="https://www.gwern.net/docs/spacedrepetition/1987-bahrick.pdf"&gt;Bahrick and Phelps found in 1987&lt;/a&gt; that Spanish learners who spread out their practice had much stronger retention. &lt;a href="https://files.eric.ed.gov/fulltext/ED427772.pdf"&gt;Caple’s 1996 paper&lt;/a&gt; shows spaced practice improves learning and retention.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spread&lt;/strong&gt; out your practice rather than cramming. As the memory becomes stronger, you can go longer times without review. Create a &lt;em&gt;system&lt;/em&gt; for yourself, some sort of reminder, to review your knowledge as you learn.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vj_pxiA---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/big-10.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vj_pxiA---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/big-10.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Idea 7: Make It Real
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Purpose&lt;/strong&gt; is another &lt;a href="https://en.wikipedia.org/wiki/Self-determination_theory"&gt;major intrinsic motivator&lt;/a&gt;. We need to know not only why the knowledge is important to the subject. We also need to know why the knowledge is important &lt;strong&gt;to us&lt;/strong&gt;. Real-life connection and examples gives the knowledge purpose.&lt;/p&gt;

&lt;p&gt;When we remove knowledge from our experiences, we can’t see why we should learn. Instead, review “why should I care?” With this, we can keep our motivation going. And make it easier to apply the knowledge later.&lt;/p&gt;

&lt;h3&gt;
  
  
  7.1 Check your own reasons for learning.
&lt;/h3&gt;

&lt;p&gt;Purpose is one of &lt;a href="https://www.amazon.com/Drive-Surprising-Truth-About-Motivates/dp/1594484805"&gt;Pink’s three intrinsic motivators&lt;/a&gt;. A &lt;a href="http://Robbins"&gt;2004 Robbins et al study&lt;/a&gt; looks at learning goals. The study finds goals aligned with &lt;em&gt;intrinsic motivations&lt;/em&gt; improve of college outcomes. A &lt;a href="https://selfdeterminationtheory.org/SDT/documents/2004_VansteenkisteSimonsLensSoenensMatosLacante_LessisMore.pdf"&gt;2004 Vansteenkiste et al study&lt;/a&gt; also says goals with underlying intrinsic motivation are stronger. A &lt;a href="http://outreach.mines.edu/cont_ed/Eng-Edu/eccles.pdf"&gt;2002 review of research by Eccles and Wigfield&lt;/a&gt; comes to again similar conclusions.&lt;/p&gt;

&lt;p&gt;Before you learn, &lt;em&gt;write&lt;/em&gt; down why you want to learn the subject. Focus on &lt;strong&gt;&lt;em&gt;intrinsic motivation&lt;/em&gt;&lt;/strong&gt;. Yes, extrinsic goals — like getting a job — can be a meaningful goal. But also focus on what that means for you: &lt;em&gt;autonomy, mastery, and purpose&lt;/em&gt;. Does getting that promotion mean more autonomy in your day-to-day work? Is that course going to help you help others in some way? Go for &lt;em&gt;deeper&lt;/em&gt; purposes.&lt;/p&gt;

&lt;p&gt;As you learn, &lt;strong&gt;remind&lt;/strong&gt; yourself of that goal every now and again. And make sure you &lt;em&gt;connect&lt;/em&gt; the day’s goal with the bigger picture. It’ll keep you motivated to stay learning!&lt;/p&gt;

&lt;h3&gt;
  
  
  7.2 Connect material with real-life problems.
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Think: problem → solution.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One early theory in learning science is &lt;a href="https://en.wikipedia.org/wiki/Democracy_and_Education"&gt;Dewey’s 1916 Democracy and Education&lt;/a&gt;. His main thesis is that the mind does not form on its own, but as a social function. This thesis leads to the idea of &lt;strong&gt;&lt;em&gt;learning by doing &lt;/em&gt;&lt;/strong&gt; — when we learn in a real context, we deeply learn. When we see what we are learning is real we connect with the material deeper. A &lt;a href="http://psycnet.apa.org/record/2001-14062-003"&gt;2000 Köhler et al study&lt;/a&gt; finds images of concrete nouns stimulated more than textual forms. &lt;a href="https://en.wikipedia.org/wiki/Problem-based_learning"&gt;Problem-based learning&lt;/a&gt; is common in health sciences. PBL means focusing on the problem, and learn to find the solution. A &lt;a href="https://docs.lib.purdue.edu/cgi/viewcontent.cgi?article=1605&amp;amp;context=ijpbl"&gt;2016 review by Jin and Bridges&lt;/a&gt; finds mixed results in this new area of learning research. But learner motivation is higher when we connect the material to real problems. A &lt;a href="https://www.wired.com/2013/10/free-thinkers/all/&amp;amp;src=longreads/"&gt;2013 Wired article&lt;/a&gt; and &lt;a href="https://www.nytimes.com/2014/07/27/magazine/why-do-americans-stink-at-math.html"&gt;2014 NYTimes article&lt;/a&gt; shares this idea in story form.&lt;/p&gt;

&lt;p&gt;As you learn, try to &lt;strong&gt;connect&lt;/strong&gt; what you are learning to something &lt;em&gt;real&lt;/em&gt; to you. An easy way to do this is to ask, “What problem does this solve?” The problem &lt;strong&gt;&lt;em&gt;is&lt;/em&gt;&lt;/strong&gt; the context.&lt;/p&gt;

&lt;h3&gt;
  
  
  7.3 Learn from examples. Use audio, images, video, and interactive.
&lt;/h3&gt;

&lt;p&gt;Listening to lectures and reading textbooks is common. But we know from the research that an &lt;strong&gt;example&lt;/strong&gt; is so much clearer. Examples can be in &lt;em&gt;visual, auditory, or interactive&lt;/em&gt; form. A &lt;a href="https://www.researchgate.net/publication/232947228_The_Use_of_Worked_Examples_as_a_Substitute_for_Problem_Solving_in_Learning_Algebra"&gt;1985 Sweller and Cooper experiment&lt;/a&gt; looked at algebra student performance. The study found swapping some textual description with &lt;a href="https://en.wikipedia.org/wiki/Worked-example_effect"&gt;worked examples&lt;/a&gt; is more effective. A &lt;a href="http://einstein.pslc.cs.cmu.edu/research/wiki/images/e/e9/1996_Marcus.pdf"&gt;1996 Marcus et al study&lt;/a&gt; finds examples lead to stronger understanding of instructions than text alone. Even describing the visual aspects can lead to improved results, as found in a &lt;a href="https://libres.uncg.edu/ir/uncg/f/W_Kealy_Concreteness_1997.pdf"&gt;1997 Kealy et al study&lt;/a&gt;. A &lt;a href="http://Clement"&gt;1980 Clement study&lt;/a&gt; found diagrams to be an effective way to combat misconceptions. A &lt;a href="http://Robertson"&gt;1997 review by Robertson&lt;/a&gt; finds most learners imitate examples as an early strategy. Diagrams are powerful, as a &lt;a href="https://pdfs.semanticscholar.org/b7bd/d9331ed1ecbc931ccaf50c091cd0bb8b71b7.pdf"&gt;1987 Larkin and Simon review&lt;/a&gt; finds. A &lt;a href="https://ueeval.ucr.edu/teaching_practices_inventory/AtkinsonDerryRenklWortham_2000.pdf"&gt;2000 review by Atkinson et al&lt;/a&gt; provides guidelines for using examples in learning.&lt;/p&gt;

&lt;p&gt;Include &lt;strong&gt;examples&lt;/strong&gt; in a &lt;em&gt;variety&lt;/em&gt; of formats in your learning plan. If you get stuck, search for an example using an image or video search engine. Or create your own diagram to help with your own understanding!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Z_XyWsfs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/big-11.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Z_XyWsfs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/big-11.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Idea 8: Learn Together
&lt;/h2&gt;

&lt;p&gt;When we learn with other people, we can accelerate both our own learning and others’ learning. We can &lt;em&gt;share ideas&lt;/em&gt;. Challenge each other’s misunderstandings. And provide and gain feedback.&lt;/p&gt;

&lt;p&gt;When we learn alone, we get stuck more often. With no feedback, we miss the opportunity to correct our weaknesses. Without peer accountability, we can let the rest of life take priority over learning. &lt;strong&gt;Learning together&lt;/strong&gt; changes what we learn, when we learn, and how often we learn.&lt;/p&gt;

&lt;p&gt;One our key learning drivers is &lt;em&gt;mimicking&lt;/em&gt; successful behaviors of others. In &lt;a href="http://static1.1.sqspcdn.com/static/f/1329369/17269672/1332457526840/learningbehavior+123+292-296.pdf?token=k1e7OAlnS3345f9L1oEEMSsWITc%3D"&gt;Galef and Wigmore’s 1983 article&lt;/a&gt;, rats imitated the successful behavior of demonstrator rats. We’re social creatures and learn together.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cirt.gcu.edu/teaching3/tips/groupwork"&gt;Not all peer learning and group learning is successful&lt;/a&gt;. We need to be careful in how we interact as we learn together to keep things positive and constructive.&lt;/p&gt;

&lt;h3&gt;
  
  
  8.1 Invite and offer feedback.
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Feedback&lt;/strong&gt; is a powerful and heavily researched topic in educational science. Scientists studied the nuances of asking for and inviting feedback.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.researchgate.net/publication/222448724_Skill_acquisition_and_the_LISP_Tutor"&gt;Anderson, Corbett, and Conrad in a 1989 study&lt;/a&gt; studied computer programming teaching software. The authors found feedback kept learners in the software longer. And improved learning results. &lt;a href="https://visible-learning.org/hattie-ranking-influences-effect-sizes-learning-achievement/"&gt;Hattie&lt;/a&gt; places feedback high several times, with a direct effect size of 0.7. &lt;a href="http://education.qld.gov.au/staff/development/performance/resources/readings/power-feedback.pdf"&gt;Hattie and Temperly’s&lt;/a&gt; own review of feedback in 2007 gets into the nuance. But, the authors find &lt;em&gt;regular&lt;/em&gt; and &lt;em&gt;timely&lt;/em&gt; feedback improves motivation and learning outcomes. The more &lt;em&gt;focused&lt;/em&gt; and &lt;em&gt;task-specific&lt;/em&gt; the feedback is, the better the results. &lt;a href="https://www.ets.org/Media/Research/pdf/RR-07-11.pdf"&gt;Shute’s 2007 research-based guidelines&lt;/a&gt; on feedback find similar conclusions.&lt;/p&gt;

&lt;p&gt;Feedback &lt;em&gt;isn’t automatic&lt;/em&gt;. Unfortunately as humans we’re prone to the &lt;a href="http://public.gettysburg.edu/~bmeier/Camp%20Psych/Journal%20Articles/Latane%20&amp;amp;%20Darley%20%281970%29%20-%20The%20Unresponsive%20Bystander.pdf"&gt;bystander effect&lt;/a&gt;. We believe someone else will take action. And the more people that are available the less likely we are to take action. So we shouldn’t expect others to provide feedback. We need to &lt;strong&gt;ask&lt;/strong&gt; for it.&lt;/p&gt;

&lt;p&gt;In summary, we need to both &lt;strong&gt;ask for&lt;/strong&gt; and &lt;strong&gt;offer feedback&lt;/strong&gt;. Feedback should be timely. Feedback should be as tailored as possible. When you are learning, see if you can find someone who can offer you feedback as you learn. And you can learn as much by offering feedback to others too.&lt;/p&gt;

&lt;h3&gt;
  
  
  8.2 Be honest and forthcoming.
&lt;/h3&gt;

&lt;p&gt;In &lt;a href="https://www.amazon.com/Motivating-Humans-Emotions-Personal-Beliefs/dp/0803945299"&gt;Ford’s 1992 “Motivating Humans”&lt;/a&gt;, Ford describes supportive and unsupportive environments. Learners have stronger outcomes in supportive environments. &lt;a href="http://red6747.pbworks.com/f/Questioning+the+Author+Beck+1996.pdf"&gt;Beck et al’s 1996 “Questioning the Author”&lt;/a&gt; informed learners about teaching strategy. When learners knew of the strategy engagement increased. In a &lt;a href="https://www.tandfonline.com/doi/abs/10.1080/00220671.1994.9944822"&gt;2010 Ritchie and Thorkildsen study,&lt;/a&gt; researchers compared learners who knew about the teaching strategy to those who didn’t. The researchers found when learners knew, the learners had higher performance.&lt;/p&gt;

&lt;p&gt;We learn better when we are &lt;em&gt;honest&lt;/em&gt; and &lt;em&gt;forthcoming&lt;/em&gt; with each other. When others are honest with us, our &lt;strong&gt;trust&lt;/strong&gt; in them grows. We’re more willing to let down our shield and let in what they know.&lt;/p&gt;

&lt;h3&gt;
  
  
  8.3 Hold each other accountable.
&lt;/h3&gt;

&lt;p&gt;A &lt;a href="https://scholarworks.bgsu.edu/cgi/viewcontent.cgi?article=1106&amp;amp;context=honorsprojects"&gt;2014 Russell study&lt;/a&gt; found accountable peer groups performed stronger than self-accountability. &lt;a href="https://hbr.org/2014/05/the-best-teams-hold-themselves-accountable"&gt;An article in Harvard Business Review by Grenny&lt;/a&gt; looked at teams that rely on peer accountability. …rather than accountability coming from leaders. The peer accountability teams have higher performance.&lt;/p&gt;

&lt;p&gt;When we hold each other &lt;strong&gt;accountable&lt;/strong&gt; for learning, we’re more likely to stick with it and finish our goals. One strategy you can try is to find a &lt;a href="https://en.wikipedia.org/wiki/Accountability_partner"&gt;‘study buddy’&lt;/a&gt; and have regular, recurring check-ups.&lt;/p&gt;

&lt;h3&gt;
  
  
  8.4 Build &lt;a href="https://en.wikipedia.org/wiki/Consensus_decision-making"&gt;consensus&lt;/a&gt;.
&lt;/h3&gt;

&lt;p&gt;In a &lt;a href="https://www.ncbi.nlm.nih.gov/pubmed/12510142"&gt;2002 De Grave et al study&lt;/a&gt;, researchers viewed groups with members reporting “unequal participation” and “lack of cohesion.” Those groups did not deliver learning outcomes. A &lt;a href="https://www.researchgate.net/publication/51738975_Mere_Belonging_The_Power_of_Social_Connections"&gt;2012 Walton et al study&lt;/a&gt; asked members to believe another group member shared the same birthday. This improved learning outcomes.&lt;/p&gt;

&lt;p&gt;We are social creatures, and we are social learners. When learning with others, &lt;strong&gt;consensus&lt;/strong&gt; can drive learning results. The sense of belonging and alignment can help us to learn faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrap Up
&lt;/h2&gt;

&lt;p&gt;I wrote this article from the perspective of the individual, independent learner. But these ideas apply to the classroom and to training as well!&lt;/p&gt;

&lt;p&gt;Think about ways to create an &lt;strong&gt;environment&lt;/strong&gt; where these ideas can flourish. You could even &lt;a href="https://drive.google.com/file/d/1r9LypX9p65C-zRPDrt2axkUWgkUHgGC_/view?usp=sharing"&gt;&lt;em&gt;print out this list&lt;/em&gt;&lt;/a&gt; and hang it on a wall or another place you’ll see it often.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Update&lt;/em&gt;: Wondering how to act on these ideas? Check out my “&lt;a href="https://dev.to/stories/a-checklist-to-make-your-own-learning-plan"&gt;Checklist” article&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thanks for reading!&lt;/strong&gt; Feedback on this article is welcome. I intend this article to be a living document. Did you find some new research to support or contradict one of these ideas? Or something could be clearer or more applicable? Let me know by writing a response!&lt;/p&gt;

&lt;h2&gt;
  
  
  Links for Further Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.wiley.com/en-us/How+Learning+Works%3A+Seven+Research+Based+Principles+for+Smart+Teaching-p-9780470484104"&gt;How Learning Works: Seven Research-Based Principles&lt;/a&gt; by Ambrose, Bridges, DiPietro, Lovett, &amp;amp; Norman&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.amazon.com/Building-Expertise-Cognitive-Performance-Improvement/dp/0787988448"&gt;Building Expertise: Cognitive Methods for Training and Performance&lt;/a&gt; by Ruth Clark&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.coursera.org/learn/learning-how-to-learn"&gt;Learning How to Learn&lt;/a&gt; by Barbara Oakley (Also see her &lt;a href="http://www.math.toronto.edu/nhoell/10rules-of-studying.pdf"&gt;Top 10 List&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.nap.edu/read/9853/chapter/1"&gt;How People Learn&lt;/a&gt; by Bransford, Brown, Cocking, &amp;amp; Pellegrino&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://peakthebook.com/index.html"&gt;Peak: Secrets from the New Science of Expertise&lt;/a&gt; by Ericsson and Pool&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.amazon.com/Drive-Surprising-Truth-About-Motivates/dp/1594484805"&gt;Drive&lt;/a&gt; by Pink&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kaplan.com/wp-content/uploads/2016/01/Kaplan-Way_Checklist_Summary_Sheet.pdf"&gt;Kaplan Checklist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learningdesignprinciples.com/"&gt;Pearson Learning Design Principles&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’d like to know more about Sagefy, &lt;a href="https://sagefy.org"&gt;visit today&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Eight Big Ideas of Learning [TL;DR Edition]</title>
      <dc:creator>Kevin Heis</dc:creator>
      <pubDate>Mon, 09 Jul 2018 00:00:00 +0000</pubDate>
      <link>https://dev.to/heiskr/eight-big-ideas-of-learning-tl-dr-edition-167h</link>
      <guid>https://dev.to/heiskr/eight-big-ideas-of-learning-tl-dr-edition-167h</guid>
      <description>&lt;p&gt;This article is a summary of &lt;a href="https://dev.to/stories/eight-big-ideas-of-learning"&gt;another article&lt;/a&gt; I wrote. Check it out if you want more details!&lt;/p&gt;

&lt;p&gt;One of my favorite subjects is &lt;strong&gt;learning how to learn&lt;/strong&gt;. I’ve read and studied on learning science for many years. That said, I’m no expert — enjoy this outsider’s take on the literature. In this article, I sum up what I’ve learned about learning in eight points. &lt;strong&gt;If you’re a learner too&lt;/strong&gt; , &lt;em&gt;this article is for you&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If my background interests you:&lt;/em&gt; &lt;a href="https://sagefy.org"&gt;&lt;strong&gt;Sagefy&lt;/strong&gt;&lt;/a&gt; is the project I’m building on these ideas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--u5DP5MOS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/eight-2.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--u5DP5MOS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/eight-2.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Idea 1: Do One Thing at a Time
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;“&lt;/strong&gt; Do one thing at a time” is a long way to say: &lt;strong&gt;&lt;em&gt;focus&lt;/em&gt;&lt;/strong&gt;. Remove distractions. Drop unneeded interfaces. Silence background chatter. Don’t multitask: it doesn’t work. Only focus on one lesson of one subject at a time. When we focus, we get more out of the energy we put into learning. Isolate and learn each idea, and then integrate the ideas to solve the problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.1 Account for the limits of working memory.
&lt;/h3&gt;

&lt;p&gt;What we remember in the current moment, we call &lt;strong&gt;working memory&lt;/strong&gt;. Our brain limits working memory to &lt;strong&gt;four items&lt;/strong&gt;. We learn by &lt;em&gt;connecting new information to previous known information&lt;/em&gt;. In summary, &lt;strong&gt;&lt;em&gt;be realistic&lt;/em&gt;&lt;/strong&gt; about how much information you can put into your working memory. It’s less than you expect.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.2 Do one activity at a time. Avoid multitasking.
&lt;/h3&gt;

&lt;p&gt;Humans are &lt;strong&gt;terrible at multitasking&lt;/strong&gt;. Trying to learn more than one thing at a time is counterproductive. Instead, it’s much better to try to &lt;strong&gt;learn one thing at a time&lt;/strong&gt; instead of many things at once. If you’re feeling overwhelmed, break down what you’re learning into different steps. Then, bring it all together at the end.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.3 Cut noise: distractions, extra choices, tangents, extra inputs…
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Noise&lt;/strong&gt; can come in many forms. &lt;em&gt;Noise detracts from learning&lt;/em&gt;. Find a quiet, comfortable place to learn where nothing will distract you. Disable social media, put the phone on quiet, close the browser tabs. Get rid of extraneous thoughts, worries, and planning. &lt;em&gt;Allow yourself to focus on learning one thing at a time.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JWhbdZnw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/eight-3.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JWhbdZnw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/eight-3.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Idea 2: Set &amp;amp; Adhere to Goals
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Define small and achievable&lt;/em&gt; &lt;strong&gt;&lt;em&gt;goals&lt;/em&gt;&lt;/strong&gt;. Then as you learn, check against those goals. Setting specific goals gives the opportunity for frequent wins, which keeps you learning. If your goal is too large or ill-defined, you’ll deal with the constant question, “what’s next?” and spend more time on figuring out what to do than actually learning. By setting small and achievable goals, you keep learning.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.1 Define small and achievable goals.
&lt;/h3&gt;

&lt;p&gt;You should start each learning session with a &lt;strong&gt;small and specific goal&lt;/strong&gt;. Often, the more specific the goal, the more achievable the goal is. Losing motivation while learning is common. Setting small and achievable goals helps us to stay motivated.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2 Set goals for both knowledge and skills.
&lt;/h3&gt;

&lt;p&gt;One of the most common sayings is learning has no value unless you can &lt;strong&gt;apply&lt;/strong&gt; what you’ve learned. So we need to make sure the goals we set go &lt;em&gt;beyond&lt;/em&gt; memorization of facts. Challenge yourself to relate data points to each other. Work on projects that apply the knowledge. Do comparison exercises. Spend time identifying patterns in the knowledge. Present arguments based on what you’ve learned.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3 Habitually review your progress against your goals.
&lt;/h3&gt;

&lt;p&gt;Checking our progress against our goals grows our sense of &lt;strong&gt;mastery&lt;/strong&gt; , one of the three powerful intrinsic motivators. That in turn builds intrinsic motivation. As you learn, create a way to &lt;strong&gt;visualize&lt;/strong&gt; your progress against your goals. That reminder can help keep you motivated towards learning.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lZ-OfWfZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/eight-4.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lZ-OfWfZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/eight-4.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Idea 3: Adapt to Prior Knowledge
&lt;/h2&gt;

&lt;p&gt;The strongest predictor of how much we will learn is &lt;strong&gt;&lt;em&gt;what we already know&lt;/em&gt;&lt;/strong&gt;. &lt;em&gt;Prior knowledge&lt;/em&gt; is how much we know going into a learning experience. Adapt the learning experience to prior knowledge. If the content is too easy, we get bored. If the content is too difficult, we get frustrated. By staying in the in-between zone, we get the most of our learning effort and keep with it for longer.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.1 Assess prior knowledge first. Focus on areas of weakness.
&lt;/h3&gt;

&lt;p&gt;We often decide to pick a book or a course for a topic without considering what we already know first. If you want to learn how to play piano without knowing how to read sheet music, you are in for a difficult journey. Instead, &lt;em&gt;find a means to&lt;/em&gt; &lt;strong&gt;&lt;em&gt;assess&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;what you already know&lt;/em&gt;— and what you need to work on —  &lt;strong&gt;before&lt;/strong&gt; you start learning. And, use assessment as you learn to identify areas of weakness and build up in those areas first.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2 Stay in the middle and adjust the challenge. Scaffold.
&lt;/h3&gt;

&lt;p&gt;We want to avoid learning experiences that are &lt;em&gt;too easy&lt;/em&gt; or &lt;em&gt;too difficult&lt;/em&gt;. Too easy, and we get bored and waste time and effort on things we already know. Too difficult, and we get frustrated and start to shut down. We want to &lt;strong&gt;stay in the middle&lt;/strong&gt;. Sometimes that means breaking down what we are learning into smaller parts first. That might mean reviewing prerequisite knowledge. Start with simple, and slowly increase the complexity.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.3 Connect new information with existing knowledge.
&lt;/h3&gt;

&lt;p&gt;Before learning something new, &lt;em&gt;start&lt;/em&gt; by &lt;strong&gt;reviewing&lt;/strong&gt; related information you already know. For example: you are going into a lesson about choosing effective typefaces. You could start by reviewing the different categories of typefaces. &lt;strong&gt;Connect&lt;/strong&gt; what you already know to what you want to learn.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--V0jWNy7z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/eight-5.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--V0jWNy7z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/eight-5.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Idea 4: Build the Graph
&lt;/h2&gt;

&lt;p&gt;Our memory system works by forming &lt;strong&gt;&lt;em&gt;relationships&lt;/em&gt;&lt;/strong&gt; between data. Mastery is the result of a &lt;em&gt;large, deeply-connected graph&lt;/em&gt;. We link new information with information we already know. By learning how to organize the information first, we can quickly &lt;em&gt;connect information&lt;/em&gt;. We can use our prior knowledge more. And we get more out of each piece of the graph.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.1 Learn how to organize the subject before getting specific.
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Learn&lt;/em&gt; the subject’s &lt;strong&gt;organization&lt;/strong&gt; &lt;em&gt;before&lt;/em&gt; you begin to learn something new. That could mean reviewing the Table of Contents in a book before reading it. Or reading the section headings before reading the full text. Review maps and diagrams of how to organize the information. As you learn, you’ll know how the information relates to other areas within the subject.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.2 Work top-down.
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Learn&lt;/em&gt;&lt;/strong&gt; the organization and main ideas &lt;em&gt;first&lt;/em&gt;. Then dive into each of those solo. Get &lt;em&gt;deeper&lt;/em&gt; as you move further along. As you learn, try to figure out what the &lt;strong&gt;main idea&lt;/strong&gt; of the lesson is. Then, try to find ways to &lt;em&gt;tie&lt;/em&gt; back in each point with the main idea.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.3 Test your organizational knowledge.
&lt;/h3&gt;

&lt;p&gt;As you learn, find ways to &lt;strong&gt;&lt;em&gt;test&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;your organizational knowledge&lt;/em&gt;. Try &lt;a href="https://en.wikipedia.org/wiki/Concept_map"&gt;&lt;em&gt;concept mapping&lt;/em&gt;&lt;/a&gt;; drawing out a map to structure the subject. When you understand the organization, you learn faster and keep the knowledge.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jKrGsam7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/eight-6.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jKrGsam7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/eight-6.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Idea 5: Empower Choice
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Autonomy&lt;/strong&gt; is one of the “three” major intrinsic motivators. &lt;em&gt;Choice&lt;/em&gt; fuels autonomy. When we take ownership of our learning through choice, we are more motivated to stick with it. If someone forces learning on us, we resent the requirement. Our focus becomes our resentment, not learning. Too many choices can break down our ability to learn too. Instead, the right amount of choice as we learn keeps us motivated and focused on learning.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.1 Create a system that often allows for choices, in both content and format.
&lt;/h3&gt;

&lt;p&gt;As you create a learning plan for yourself or others, think about ways to include &lt;strong&gt;simple choices&lt;/strong&gt;. For example, you can choose one of three activities for the same information. Your learning plan for yourself might look more like a graph instead of a list. That way, given the day you can choose which part to work on next instead of feeling forced into the next step.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.2 Cut unnecessary choices and reduce the number of options.
&lt;/h3&gt;

&lt;p&gt;Choice is powerful. Often too powerful. We need to be careful to not overwhelm ourselves with too much choice. The &lt;strong&gt;purpose&lt;/strong&gt; of choice is to create a sense of autonomy and control to drive motivation. The purpose of choice in learning is &lt;em&gt;not&lt;/em&gt; optimization.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.3 Create a recommended default choice.
&lt;/h3&gt;

&lt;p&gt;A learner’s own &lt;strong&gt;perception&lt;/strong&gt; of ability is often inaccurate. &lt;em&gt;Avoid&lt;/em&gt; putting yourself or another learner in a position to make a poor choice. Avoid choices that require learner &lt;em&gt;self-assessment&lt;/em&gt; to make an informed choice. Present a &lt;strong&gt;default choice&lt;/strong&gt; if the learner wants to move on without choosing. You want choice to be about the feeling of control and autonomy, not about optimization.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ASJh35kR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/eight-7.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ASJh35kR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/eight-7.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Idea 6: Dive Deep
&lt;/h2&gt;

&lt;p&gt;Rote memorization is boring. No one enjoys learning that way. We must &lt;strong&gt;apply&lt;/strong&gt; knowledge to create results. When we learn not only &lt;em&gt;what&lt;/em&gt;, but also &lt;em&gt;how&lt;/em&gt; and &lt;em&gt;why&lt;/em&gt;, we empower ourselves to &lt;strong&gt;use&lt;/strong&gt; the knowledge we gain. Diving deep means learning is more interesting, we can apply what we learn and make a real &lt;em&gt;impact&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  6.1 Practice.
&lt;/h3&gt;

&lt;p&gt;Getting enough &lt;strong&gt;practice&lt;/strong&gt; is important for skill development. That may sound obvious. But, in school we get this idea that we will learn something by only hearing a teacher recite the information. We also have strong &lt;em&gt;misconceptions&lt;/em&gt; about how much practice we need. You need to build more &lt;strong&gt;practice&lt;/strong&gt; in your learning plan than you might guess.&lt;/p&gt;

&lt;h3&gt;
  
  
  6.2 Go beyond rote: explain, apply, analyze, and synthesize.
&lt;/h3&gt;

&lt;p&gt;As you create and update your learning plan, make sure to include a &lt;strong&gt;variety&lt;/strong&gt; of practice. Include exercises that need not only recognition or recall of information. Include exercises that have you to &lt;em&gt;explain, apply, analyze, and synthesize&lt;/em&gt; knowledge.&lt;/p&gt;

&lt;h3&gt;
  
  
  6.3 Build metacognition.
&lt;/h3&gt;

&lt;p&gt;As you are learning, every few hours or so, &lt;em&gt;ask yourself a few questions&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What should I be paying &lt;em&gt;attention&lt;/em&gt; to?&lt;/li&gt;
&lt;li&gt;How well do I understand this? How &lt;em&gt;difficult&lt;/em&gt; is this for me right now?&lt;/li&gt;
&lt;li&gt;Do I have a &lt;em&gt;strategy&lt;/em&gt;? Is my strategy successful?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ask these sorts of questions often. These questions improve your metacognitive ability. And lead you to stronger learning results.&lt;/p&gt;

&lt;h3&gt;
  
  
  6.4 Space your practice.
&lt;/h3&gt;

&lt;p&gt;The &lt;em&gt;stronger&lt;/em&gt; the memory, the &lt;em&gt;longer&lt;/em&gt; we keep the memory. And the more spaced repetitions of the event, the stronger the memory. &lt;strong&gt;Spread&lt;/strong&gt; out your practice rather than cramming. As the memory becomes stronger, you can go longer times without review. Create a &lt;em&gt;system&lt;/em&gt; for yourself, some sort of reminder, to review your knowledge as you learn.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Z1HSkPvD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/eight-8.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Z1HSkPvD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/eight-8.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Idea 7: Make It Real
&lt;/h2&gt;

&lt;p&gt;We need to know not only why the knowledge is important to the subject. We also need to know why the knowledge is important &lt;strong&gt;to us&lt;/strong&gt;. Real-life connection and examples gives the knowledge purpose. And makes it easier to apply the knowledge later.&lt;/p&gt;

&lt;h3&gt;
  
  
  7.1 Check your own reasons for learning.
&lt;/h3&gt;

&lt;p&gt;Before you learn, &lt;em&gt;write&lt;/em&gt; down why you want to learn the subject. Focus on what that goal means for you. Does getting that promotion mean more autonomy in your day-to-day work? Is that course going to help you help others in some way? Go for &lt;em&gt;deeper&lt;/em&gt; purposes. As you learn, &lt;strong&gt;remind&lt;/strong&gt; yourself of that goal every now and again. And make sure you &lt;em&gt;connect&lt;/em&gt; the day’s goal with the bigger picture.&lt;/p&gt;

&lt;h3&gt;
  
  
  7.2 Connect material with real-life problems.
&lt;/h3&gt;

&lt;p&gt;As you learn, try to &lt;strong&gt;connect&lt;/strong&gt; what you are learning to something &lt;em&gt;real&lt;/em&gt; to you. An easy way to do this is to ask, “What problem does this solve?” The problem &lt;strong&gt;&lt;em&gt;is&lt;/em&gt;&lt;/strong&gt; the context.&lt;/p&gt;

&lt;h3&gt;
  
  
  7.3 Learn from examples. Use audio, images, video, and interactive.
&lt;/h3&gt;

&lt;p&gt;Listening to lectures and reading textbooks is common. But an &lt;strong&gt;example&lt;/strong&gt; is so much clearer. Examples can be in &lt;em&gt;visual, auditory, or interactive&lt;/em&gt; form. Include &lt;strong&gt;examples&lt;/strong&gt; in a &lt;em&gt;variety&lt;/em&gt; of formats in your learning plan. If you get stuck, search for an example using an image or video search engine. Or create your own diagram to help with your own understanding!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TeMIlyxy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/eight-9.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TeMIlyxy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://heiskr.com/images/eight-9.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Idea 8: Learn Together
&lt;/h2&gt;

&lt;p&gt;When we learn with other people, we can accelerate both our own learning and others’ learning. We can &lt;em&gt;share ideas&lt;/em&gt;. Challenge each other’s misunderstandings. And provide and gain feedback. &lt;strong&gt;Learning together&lt;/strong&gt; changes what we learn, when we learn, and how often we learn. We need to be careful in how we interact as we learn together to keep things positive and constructive.&lt;/p&gt;

&lt;h3&gt;
  
  
  8.1 Invite and offer feedback.
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Feedback&lt;/strong&gt; is powerful. Feedback &lt;em&gt;isn’t automatic&lt;/em&gt;. We shouldn’t expect others to provide feedback. We need to &lt;strong&gt;ask&lt;/strong&gt; for it. Feedback should be timely. Feedback should be as tailored as possible. When you are learning, see if you can find someone who can offer you feedback as you learn. And you can learn as much by offering feedback to others too.&lt;/p&gt;

&lt;h3&gt;
  
  
  8.2 Be honest and forthcoming.
&lt;/h3&gt;

&lt;p&gt;We learn better when we are &lt;em&gt;honest&lt;/em&gt; and &lt;em&gt;forthcoming&lt;/em&gt; with each other. When others are honest with us, our &lt;strong&gt;trust&lt;/strong&gt; in them grows. We’re more willing to let down our shield and let in what they know.&lt;/p&gt;

&lt;h3&gt;
  
  
  8.3 Hold each other accountable.
&lt;/h3&gt;

&lt;p&gt;When we hold each other &lt;strong&gt;accountable&lt;/strong&gt; for learning, we’re more likely to stick with it and finish our goals. One strategy you can try is to find a ‘study buddy’ and have regular, recurring check-ups.&lt;/p&gt;

&lt;h3&gt;
  
  
  8.4 Build consensus.
&lt;/h3&gt;

&lt;p&gt;We are social creatures, and we are social learners. When learning with others, &lt;strong&gt;consensus&lt;/strong&gt; can drive learning results. The sense of belonging and alignment can help us to learn faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrap Up
&lt;/h2&gt;

&lt;p&gt;Think about ways to create an &lt;strong&gt;environment&lt;/strong&gt; where these ideas can flourish. &lt;a href="https://drive.google.com/file/d/1r9LypX9p65C-zRPDrt2axkUWgkUHgGC_/view?usp=sharing"&gt;&lt;em&gt;Print out this list&lt;/em&gt;&lt;/a&gt; and hang it on a wall or another place you’ll see it often.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Update&lt;/em&gt;: Wondering how to act on these ideas? Check out my “&lt;a href="https://dev.to/stories/a-checklist-to-make-your-own-learning-plan"&gt;Checklist” article&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thanks for reading!&lt;/strong&gt; Feedback on this article is welcome. Let me know by writing a response! Check out the &lt;a href="https://dev.to/stories/eight-big-ideas-of-learning"&gt;full article&lt;/a&gt; for more resources too.&lt;/p&gt;

&lt;p&gt;If you’d like to know more about Sagefy, &lt;a href="https://sagefy.org"&gt;visit today&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Interviewing Prospective Users</title>
      <dc:creator>Kevin Heis</dc:creator>
      <pubDate>Sat, 19 Aug 2017 00:00:00 +0000</pubDate>
      <link>https://dev.to/heiskr/interviewing-prospective-users-3h5a</link>
      <guid>https://dev.to/heiskr/interviewing-prospective-users-3h5a</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on&lt;/em&gt; &lt;a href="https://www.indiehackers.com/@sagefy/5179a03d09"&gt;&lt;em&gt;IndieHackers&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Maybe you’re thinking about starting a new project. Or you have a project that’s not getting results. Or you’d like to improve an existing project. Interviewing users is the best place to start! With a few quick and easy small steps, you’ll get all the information you need to get started on your next adventure.&lt;/p&gt;

&lt;h2&gt;
  
  
  So what are user interviews?
&lt;/h2&gt;

&lt;p&gt;You’d interview 3 to 8 people for approximately 15 to 30 minutes each. Your goal is to discover who these people are, and what they need. You’ll find out their goals, the circumstances they face, and their motivations for their goals. Most important, you’ll discover their pain points. User interviews are the best way to &lt;em&gt;define&lt;/em&gt; problems that your prospective users face.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who am I?
&lt;/h2&gt;

&lt;p&gt;I’m a software engineer in Portland, OR. I am also a designer and a user experience researcher. In addition to conducting research for my employers over the years, I’ve run several projects on the side. My most successful so far was a popular card sorting site. My current project, &lt;a href="https://sagefy.org"&gt;Sagefy&lt;/a&gt;, is an open-content adaptive learning platform. I’ve used user interviews extensively to help guide my projects. Even with Sagefy, I wish I had interviewed users sooner. I’m not an expert on the subject, but I will offer practical advice based on what I’ve learned about interviewing users. I’ve interviewed both real and prospective users.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why conduct user interviews?
&lt;/h2&gt;

&lt;p&gt;I have five great reasons.&lt;/p&gt;

&lt;p&gt;The hardest part of keeping a project going is (1) &lt;strong&gt;motivation&lt;/strong&gt;. Hearing from real people will give you a reason to keep working on your project. When I was in a slump on building Sagefy, I knew I had a very real problem with my tools that allow users to create content. Someone wanting to create content offered me practical feedback. That was enough for me to get back into gear and working on the project again.&lt;/p&gt;

&lt;p&gt;The number one reason why businesses tend to fail is a lack of (2) &lt;strong&gt;product-market fit&lt;/strong&gt;. The most common issue is: no one wants to use what you’ve built. By interviewing users, you start off your project already knowing your target.&lt;/p&gt;

&lt;p&gt;User interviews can help you get started on the right foot, or they can help to correct your current path. When I was researching for Sagefy in the beginning, I conducted some user interviews. These interviews helped me find that most people faced similar issues with online learning: the content was too hard or too easy. And after I finished building my “minimally-viable product” for Sagefy, there was almost no response. After asking a few people to try the site, I interviewed them. It became immediately clear that I need to focus on developing content over developing tools.&lt;/p&gt;

&lt;p&gt;Another great reason to interview users is (3) &lt;strong&gt;low cost and high reward&lt;/strong&gt;. With less than five hours of work, and no money involved, you can get plenty of information to get the project started. It’s a low investment if you end up realizing this isn’t the project you want to take. The worst thing to do is work on something for months, possibly years, only to realize you aren’t building the right thing. User interviews can help you figure out what path to take right from the beginning. And if you’ve been on the fence about an idea, less than five hours of your time can get you moving.&lt;/p&gt;

&lt;p&gt;A common problem founders have at the beginning of the project is everything feels abstract and overwhelming. User interviews are a great way to get more (4) &lt;strong&gt;concrete&lt;/strong&gt;. Your users will become actual humans to you. Their goals and pain points will become real to you. And you’ll know what to focus on and what tasks to prioritize. When I was working on ConceptCodify, I would get many support tickets a day. I interviewed a few of the people who wrote in, and that process made my users and their needs much more real to me.&lt;/p&gt;

&lt;p&gt;My final major reason to interview users is it will help you start and build a (5) &lt;strong&gt;network&lt;/strong&gt;. You will need people as you build your project to give you feedback. And you will need people in the industry to help promote your project. It doesn’t matter how small or how big you get, you will need feedback. In fact, many large corporations have teams of employees devoted to interviewing and researching users.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I find people to interview?
&lt;/h2&gt;

&lt;p&gt;First, you’ll need to figure out who you’d like to interview. You want to find people as close to your prospective audience as possible. Try to find different perspectives on the same process. For Sagefy, I’ve targeted post-secondary teachers, instructional designers for corporate training, and independent adult learners who have taken courses on other sites.&lt;/p&gt;

&lt;p&gt;For finding people to interview, there are many options. You can ask friends and family members if they know anyone in your target audience. You can look up people on the web or through social media, and find their email address. You can also try going to various local events. You’d be surprised at how willing people are to be interviewed. I would guess at least 80% of people say yes.&lt;/p&gt;

&lt;p&gt;You should try to interview about 3 to 8 people. You’ll start noticing trends around the third interview, and by the time you hit 6 or 7 people you’ll have more information than you can process. Make sure you recruit more people than you need. I would recommend trying to get 10 people to say yes and on the schedule, because a few will flake out.&lt;/p&gt;

&lt;p&gt;When you ask people if they are open to an interview, make sure you tell them the purpose of the interview. Make it clear that the interview will not be more than 30 minutes. You can do the interview in person or over the phone; for most people over the phone is easier. If the person agrees to an interview, be the first one to suggest a specific time and date. If you leave it open-ended, that will make it harder to get the interview on the schedule.&lt;/p&gt;

&lt;p&gt;An email thread asking someone for an interview may look like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Me: Hello, I am Kevin and I’m thinking about building a learning platform. I’m interviewing people who have taken online learning courses to find out their goals and needs. Would you be open to a 30-minute phone call? Thank you!&lt;/p&gt;

&lt;p&gt;Response: Yes, I’d be open to it. I’m on vacation most of next week, so this week is best.&lt;/p&gt;

&lt;p&gt;Me: Thanks so much for your help. Would 3pm on Friday this week work for you? Feel free to suggest another time.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now that you’ve gotten about 10 or so people on the schedule, you’ll want to prepare the questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What questions should I ask?
&lt;/h2&gt;

&lt;p&gt;You’ll want to prepare some questions in advance. If it helps, create a checklist. Especially if you are new to interviewing users, your nerves will be higher and having a list will make the interview smoother. You’ll want to limit your number of questions. 5 to 10 is plenty.&lt;/p&gt;

&lt;p&gt;Each interview will follow the three stage process of (1) &lt;strong&gt;introduction&lt;/strong&gt; , (2) &lt;strong&gt;main questions&lt;/strong&gt; , and (3) &lt;strong&gt;wrap up&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Don’t skip the introduction. You want to open the person up before getting into your set of questions. Tell the person who you are and what you want to get out of the interview. One time I skipped this part. Part of the way through the interview I had to backtrack. The interviewee didn’t understand the purpose of the interview, and their answers were off-track. After we went back through the introduction steps, the questions were much easier to answer.&lt;/p&gt;

&lt;p&gt;If you want to do an audio or video recording, make sure to get permission first. I’ve never felt the need to record, but some people do.&lt;/p&gt;

&lt;p&gt;Assure the interviewee confidentiality. Let them know you won’t go blab to their employer or colleagues about what they say. Pain points can be rather political for many organizations.&lt;/p&gt;

&lt;p&gt;As part of the introduction, make sure you know who you’re interviewing. Ask the person about their background, role at their employer, as well as their technical familiarity. Asking these questions before you get to the entree will help you when you want to ask follow-up questions.&lt;/p&gt;

&lt;p&gt;The questions you pick for the main section will determine what you get out of the interview.&lt;/p&gt;

&lt;p&gt;You need to be realistic about what you can and cannot get out of a user interview. User interviews are great for figuring out who the person is, what their goals are, and their pain points. User interviews are not a good way to get specific implementation details. Don’t ask them what copy to use, which colors to use, how to lay out your navigation, or which specific features you should build. Focus on &lt;em&gt;identifying problems&lt;/em&gt; instead of trying to come up with solutions. You are there to learn and listen; not to inform and solve. There’s other ways like usability testing on wireframes to get more specifics later.&lt;/p&gt;

&lt;p&gt;You’ll want to focus on open-ended questions rather than closed form questions. If the person can answer it yes/no, then the question is not open-ended. So instead of, “would you use a learning platform that adapts to your prior knowledge?” you want to ask “when you are looking at a potential learning experience, what do you look for?” Closed-form answers will not get you the result you’re looking for.&lt;/p&gt;

&lt;p&gt;Another huge call out is the difference between opinions and behaviors. People will love to share their opinion with you. However in practice, you’ll find that often the opinion doesn’t match the behavior. Your questions should focus on what people do, and not how they feel. For ConceptCodify, I had some problems on my sign up form. People would tell me that it was no problem, that they would understand what I had. But in reality, it was difficult to use because when using the site, the person is not actively thinking, but doing.&lt;/p&gt;

&lt;p&gt;There’s a few pieces of information you want to focus on: goals, motivations, values, expectations, pain points, circumstances, resources, and attitudes.&lt;/p&gt;

&lt;p&gt;For &lt;em&gt;goals&lt;/em&gt;, the basic question is “what do you need to get done?” The goal is self-evident, but it’s important to establish the user’s goal before asking other questions. If you jump to pain points without knowing the goal, you’ll miss a huge piece of context. Another way to phrase it is, “what are the main things you need to get done each day?”&lt;/p&gt;

&lt;p&gt;Once you’ve established this person’s goals, the next piece is to understand their &lt;em&gt;motivations&lt;/em&gt; and &lt;em&gt;values&lt;/em&gt;. The question here is “why do you need to get it done?” When you ask “why,” the person will also expose their values around the goal. Sometimes the motivation will seem obvious to you. But when you ask the question, you get a different perspective than you might initially expect.&lt;/p&gt;

&lt;p&gt;To clarify the user’s &lt;em&gt;expectations&lt;/em&gt;, you can ask the question “how do you currently get it done?” Usability is almost completely based on familiarity. People expect things to work the way things currently work. So how the person currently completes their goals is very likely how they expect to complete their goals in the future. Anything different from their expectations is going to be a more difficult sale. The further you go from what the person already knows, the more you have to work. By asking for the current state of things, you’ll understand what the person expects. Sometimes you need to read between the lines; not all of their expectations are going to be clear to themselves. We forget our expectations despite holding on to them anyways.&lt;/p&gt;

&lt;p&gt;The next question is probably the one you initially think to ask: “What’s wrong with the current way you get it done?” This question reveals the person’s &lt;em&gt;pain points&lt;/em&gt;. It is tempting to skip right to this question. But without understanding the person’s goals, motivations, and expectations first, you won’t have the full context. The previous questions help frame the interviewee’s mind as well. This is the most important part of the interview, so pay full attention and listen.&lt;/p&gt;

&lt;p&gt;Those questions might be plenty for one interview. If so, skip to the wrap up. If time and energy allows, you might want to ask some follow up questions. A few good topics are &lt;em&gt;circumstances&lt;/em&gt;, &lt;em&gt;resources&lt;/em&gt;, and &lt;em&gt;attitudes&lt;/em&gt;. These questions are in the form “How much…?” and “How often…?”. Clarify the situation the person is in when they work towards the goal. Ask them about how much time, money, people, and effort they expect to use to complete the goal. Ask them about the attitude people tend to have towards the goal and the current way of doing things.&lt;/p&gt;

&lt;p&gt;I’ll give an example set of questions. For Sagefy, I was starting to work on building new content creation tools. I asked these sorts of questions to some instructional designers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Goals&lt;/em&gt;: “When you’re creating learning content, what are the main things you are trying to accomplish?” “What types of content do you usually build?” “On a typical day, what sort of activities do you do to build content?”&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Motivations and Values:&lt;/em&gt; “Why are these the things you try to accomplish when building learning content?” “Why do you spend so much time on that activity?” “Why do you focus on these types of content?”&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Expectations&lt;/em&gt;: “Walk me through your current content creation process.” “What tools do you use to build learning content?” “What are the steps you follow?”&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Pain Points:&lt;/em&gt; “What do you wish were different about your current process and tools for creating learning content?” “What do you wish other instructional designers did as part of creating learning content?” “What could be better about your current workflow?”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At the end of the interview, you should ask the interviewee if they’d like to ask you any questions. Some of the more common questions I get at the end of the interview are “what’s the next step you’re planning to take?” and “what can I do to help you?” My common answer is I’ll follow up with them after I finish the interviews and organize my thoughts. Which I would recommend doing as well!&lt;/p&gt;

&lt;p&gt;And of course, always say thank you to the person. They’ve given up some of their time to help you. “Thank you” is a simple way to keep the connection going with the person.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It takes practice to get good at interviewing people — don’t be too hard on yourself at first. (I’m still getting better at it too!)&lt;/li&gt;
&lt;li&gt;Focus on listening — don’t interrupt or try to change their mind. Don’t try to ‘teach’ who you’re interviewing.&lt;/li&gt;
&lt;li&gt;Ignore solutioning — look at the underlying problems. Don’t ask about potential solutions, you’re there to define problems.&lt;/li&gt;
&lt;li&gt;Demographics are largely worthless — look at the circumstances. What situation is the person dealing with when they are trying to accomplish their goal?&lt;/li&gt;
&lt;li&gt;People don’t always remember everything out of context. You need to have reasonable expectations about what people are going to remember. And you can also tell them they can follow up if they remember anything else.&lt;/li&gt;
&lt;li&gt;Facilitate — keep the person on track by using questions to come back to the focus, what you want to get out of the interview. When a person started to get too theoretical about learning, I asked a question about the task at hand to bring them back.&lt;/li&gt;
&lt;li&gt;Be casual, don’t be formal. I had a few nervous interviews before… practice makes it easier to be casual.&lt;/li&gt;
&lt;li&gt;Say please and thank you.&lt;/li&gt;
&lt;li&gt;Take notes after the interview, not during. I find note taking to be very distracting when I’m trying to listen. As long as you take your notes right after, you won’t forget anything important. The larger point is you are looking for patterns in responses, and not just one person’s take.&lt;/li&gt;
&lt;li&gt;Follow up with the person a few days later, thanking them for the interview. The person will be more likely to help you out later if you do.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Wrap Up
&lt;/h2&gt;

&lt;p&gt;Don’t try to get it perfect your first try. The most important thing is just to get out there and start talking to people in your prospective audience. Everything in this article is just advice based on my own experience. You’ll find things that work better for you as you go. Stop ‘thinking about’ or ‘planning’ your project. Stop worrying about how you could theoretically make things better. Get out there and just talk to some people. Interviewing users is the best way to get started right.&lt;/p&gt;

&lt;p&gt;If you’d like to know more about Sagefy, &lt;a href="https://sagefy.org"&gt;visit today&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>What do you want to learn?</title>
      <dc:creator>Kevin Heis</dc:creator>
      <pubDate>Sat, 29 Jul 2017 00:00:00 +0000</pubDate>
      <link>https://dev.to/heiskr/what-do-you-want-to-learn-1mh0</link>
      <guid>https://dev.to/heiskr/what-do-you-want-to-learn-1mh0</guid>
      <description>&lt;p&gt;&lt;strong&gt;The Suggest page on&lt;/strong&gt; &lt;a href="https://sagefy.org/"&gt;&lt;strong&gt;Sagefy&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;allows you to suggest new free online learning subjects.&lt;/strong&gt; And you can up-vote subjects that interest you. And you &lt;em&gt;don’t&lt;/em&gt; need to sign up for an account! Why use the Suggest page? Maybe you can’t find something you’re looking for. Maybe you’re thinking about building something but want to see what the interest level is first. Or you’re looking for a different approach to something that already exists.&lt;/p&gt;

&lt;p&gt;In this article, I’m going to go into the background about the Suggest page.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Sagefy
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Sagefy is an open-content adaptive learning system.&lt;/strong&gt; &lt;em&gt;Open-content&lt;/em&gt; means anyone can create and update learning content, like Wikipedia. &lt;em&gt;Adaptive learning&lt;/em&gt; means the content changes based on the learner’s goal and their prior knowledge. The combination means anyone can learn almost anything, regardless of their prior knowledge. To learn more about Sagefy, check out &lt;a href="https://dev.to/stories/why-i-m-building-sagefy"&gt;this in-depth article&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the Suggest page idea came about
&lt;/h2&gt;

&lt;p&gt;So far, Sagefy is at &lt;a href="https://en.wikipedia.org/wiki/Minimum_viable_product"&gt;MVP&lt;/a&gt; quality code-wise and I have a full electronic music intro course built out in Sagefy.&lt;/p&gt;

&lt;p&gt;I’d like to build more &lt;strong&gt;content&lt;/strong&gt; along with collaborators. I also want to continue to &lt;strong&gt;improve functionality&lt;/strong&gt;. To support these efforts, Sagefy is going to need a &lt;em&gt;revenue stream&lt;/em&gt;. Even if Sagefy does become non-profit, donations and grants are tough to come by. Finding a revenue model is a priority.&lt;/p&gt;

&lt;p&gt;I’ve committed to myself to &lt;strong&gt;not&lt;/strong&gt; put up &lt;a href="https://medium.freecodecamp.org/massive-open-online-courses-started-out-completely-free-but-where-are-they-now-1dd1020f59"&gt;paywalls to access learning&lt;/a&gt;. I’m looking for a revenue model that would also encourage &lt;em&gt;content creation&lt;/em&gt; as well as &lt;em&gt;learning&lt;/em&gt;. Finally, more than one revenue resources is better, to reduce risk.&lt;/p&gt;

&lt;p&gt;I’ve brainstormed about a dozen ideas that met this criteria, but I have &lt;strong&gt;no idea&lt;/strong&gt; which ones might actually work. Everyone thinks they know what product-market fit is going to be in advance, but no one does in practice. Product-market fit always seems obvious in hindsight. &lt;em&gt;When you’re in the driver’s seat, the road is much more foggy.&lt;/em&gt; I’m not investing a ton of time in predicting and planning the perfect solution and build it all the way. I’m trying little experiments. Get out the &lt;a href="https://en.wikipedia.org/wiki/Minimum_viable_product"&gt;MVP&lt;/a&gt; to see if the idea will work and see what the response is.&lt;/p&gt;

&lt;p&gt;I picked the Suggest page experiment first because its had some of the lowest technical requirements of the ideas I’ve had so far. And the Suggest page &lt;em&gt;meets the criteria&lt;/em&gt; I mentioned above — doesn’t block access to learning, encourages content creation, and encourages learning.&lt;/p&gt;

&lt;p&gt;The Suggest page may not even seem like a potential revenue source. Right now, &lt;em&gt;it isn’t&lt;/em&gt; creating revenue. If the Suggest page succeeds, the idea is to allow anyone to make a &lt;strong&gt;bid&lt;/strong&gt; on the suggested courses, and let others &lt;strong&gt;pledge&lt;/strong&gt; funds towards the bid. If the amount reaches the bid’s minimum, the content gets funded. Sagefy would take some small percentage of the funding to support Sagefy itself. I don’t need the bids or pledges to see if the idea will work. I need to know if people are &lt;em&gt;willing&lt;/em&gt; to suggest and up-vote ideas for free online learning content &lt;em&gt;in the first place&lt;/em&gt;. There’s many sites that already do crowdfunding of course, but I’m not aware of any strictly related to funding free online learning content. And of course, the Suggest page is one idea.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I built the page quickly
&lt;/h2&gt;

&lt;p&gt;Because the Suggest page is an experiment, I did not build the page into the main Sagefy ecosystem. The Suggest page exists as its own Nginx route. In fact, &lt;strong&gt;all the code is in&lt;/strong&gt; &lt;a href="https://github.com/heiskr/sagefy/blob/master/suggest/index.py"&gt;&lt;strong&gt;one file&lt;/strong&gt;&lt;/a&gt;. There’s not even a framework; the only library is for the database. And of course there’s &lt;em&gt;no&lt;/em&gt; &lt;em&gt;automated tests&lt;/em&gt;. I also did not write any JavaScript for the page. The whole thing is &lt;strong&gt;plain old HTML&lt;/strong&gt; and barely any CSS. It’s about as bare bones as possible. You can build a surprising amount with this sort of setup, and get the experiment done very quickly.&lt;/p&gt;

&lt;p&gt;Not doing things the “right” or “modern” way, I built the whole page in &lt;em&gt;less than 4 hours total&lt;/em&gt;. I may have been able to find something out there that produces similar functionality. But I would have spent as much time searching as I did coding. With experiments going forward, I may or may not end up writing code for them… depends on the idea and what’s already out there.&lt;/p&gt;

&lt;p&gt;If I built this page the “correct” way , this experiment would have taken 20 or more hours. Tests, frameworks, scaling, splitting off the API from the UI, and so on. &lt;em&gt;Coding things the “old” way means I can do more experiments with more frequency.&lt;/em&gt; Its sort of fun to relive the glory days when feature expectations on the web were so much lower. If the Suggest page is successful, I’d want to update the approach to be more more feature-capable than plain old HTML.&lt;/p&gt;

&lt;h2&gt;
  
  
  The process for creating new experiments like this
&lt;/h2&gt;

&lt;p&gt;I still have several more ideas I’d like to try out to see if I can find a revenue model for Sagefy. If you’re going through this too, here’s what the &lt;strong&gt;step-by-step process&lt;/strong&gt; looks like:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create, review, and update the &lt;strong&gt;criteria&lt;/strong&gt; for revenue models.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Brainstorm ideas&lt;/strong&gt; that would fit the criteria. Think about the user’s &lt;em&gt;circumstances&lt;/em&gt; and what could help solve the &lt;em&gt;problems&lt;/em&gt; they have. Also, try looking an &lt;em&gt;existing&lt;/em&gt; models.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pick the idea&lt;/strong&gt; you think will meet the criteria with the least amount of &lt;em&gt;effort&lt;/em&gt; to try the idea. Don’t be afraid of using Google Forms or other existing services to get the idea out as quickly as possible. &lt;em&gt;It’s an experiment, not a commitment.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build&lt;/strong&gt; the experiment quickly and cheaply. &lt;em&gt;Verify the idea&lt;/em&gt;, not necessarily actually generating revenue right away. Avoid making people do anything other than the task at hand, such as signing up for an account. Anything more than a few seconds worth of effort will deter people.&lt;/li&gt;
&lt;li&gt;Don’t show a blank page. Add some &lt;strong&gt;real content&lt;/strong&gt; before you start to promote the experiment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Promote&lt;/strong&gt; the experiment. No one’s going to show up because you built it. Go to sites where the audience is &lt;em&gt;already browsing&lt;/em&gt;, and share a link.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Going forward
&lt;/h2&gt;

&lt;p&gt;So far the Suggest page got a bit of initial traffic, but the interest has waned since then. I’d guess about 100 people have either suggested an idea or up-voted one. I’m not ready to count this as an unsuccessful quite yet. With some promotion the Suggest page could have potential. I don’t have a ‘exit plan’ as there’s no costs involved, so the Suggest page is going to be around for the foreseeable future.&lt;/p&gt;

&lt;p&gt;I’m going to try some more experiments too. All while also continuing to improve Sagefy’s learning and contributing experiences. &lt;em&gt;So… keep your eyes open for improvements and more experiments too!&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Try out the Suggest page
&lt;/h2&gt;

&lt;p&gt;If you’ve made this far in the article, congrats! That, and &lt;strong&gt;you should try out the Suggest page.&lt;/strong&gt; No need to sign up for an account. You can up-vote existing ideas and add your own. &lt;em&gt;And let me know your feedback too!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you’d like to know more about Sagefy, &lt;a href="https://sagefy.org"&gt;visit today&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The Mathematics of Sagefy</title>
      <dc:creator>Kevin Heis</dc:creator>
      <pubDate>Thu, 06 Apr 2017 00:00:00 +0000</pubDate>
      <link>https://dev.to/heiskr/the-mathematics-of-sagefy-37p1</link>
      <guid>https://dev.to/heiskr/the-mathematics-of-sagefy-37p1</guid>
      <description>&lt;p&gt;In this article, I’m going to talk about some of the mathematical models I’m using in Sagefy so far. I’m going to discuss some of the problems I’ve run into, and what problems are still ahead. I’m hoping to occasionally update this article as the math that Sagefy uses changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Sagefy?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Sagefy is an open-content adaptive learning system.&lt;/strong&gt; &lt;em&gt;Open-content&lt;/em&gt; means anyone can create and update learning content, like Wikipedia. &lt;em&gt;Adaptive learning&lt;/em&gt; means the content changes based on the learner’s goal and their prior knowledge. The combination means anyone can learn just about anything, regardless of their prior knowledge. To learn more about Sagefy, check out this &lt;a href="https://dev.to/stories/why-i-m-building-sagefy"&gt;in-depth article&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Sagefy Learner Experience
&lt;/h2&gt;

&lt;p&gt;After you create an account, the first thing to do is to find a &lt;strong&gt;subject.&lt;/strong&gt; &lt;em&gt;A&lt;/em&gt; &lt;strong&gt;&lt;em&gt;subject&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;is like a course or a collection of courses.&lt;/em&gt; You can think of it like folders on your computer; they nest. You add the subject to your list of subjects. Then, when you start the subject, you’ll see a tree of units &lt;strong&gt;.&lt;/strong&gt; &lt;em&gt;Each&lt;/em&gt; &lt;strong&gt;&lt;em&gt;unit&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;is a single learning objective.&lt;/em&gt; Then, Sagefy will ask you to choose which unit you’d like to start with. Sagefy presents a recommended unit based on what you know. After choosing a unit, Sagefy will show you a card. &lt;em&gt;A&lt;/em&gt; &lt;strong&gt;&lt;em&gt;card&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;is a single learning activity&lt;/em&gt;, like a video or multiple choice question. As you use the cards, Sagefy updates it’s model of how much you know the unit. When you’ve learned the unit, you choose another. The trio of &lt;strong&gt;subject, unit, and card&lt;/strong&gt; define the learning experience.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fheiskr.com%2Fimages%2Fmath-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fheiskr.com%2Fimages%2Fmath-1.png" alt="The flow of the Sagefy learner experience."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Popular Models of Learning
&lt;/h2&gt;

&lt;p&gt;There’s a few different learning models out there. The subject is diverse. &lt;a href="https://www.elsevier.com/books/building-intelligent-interactive-tutors/woolf/978-0-12-373594-2" rel="noopener noreferrer"&gt;“Building Intelligent Interactive Tutors” by Beverly Park Woolf&lt;/a&gt; is a more comprehensive treatment. Here’s some of the major ones:&lt;/p&gt;

&lt;h3&gt;
  
  
  Forgetting Curve
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://en.wikipedia.org/wiki/Forgetting_curve" rel="noopener noreferrer"&gt;Ebbinghaus Forgetting Curve&lt;/a&gt; is one of the oldest models. Depending on the strength of the memory, our ability to remember generally follows this formula:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fheiskr.com%2Fimages%2Fmath-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fheiskr.com%2Fimages%2Fmath-2.png" alt="The Ebbinghaus Forgetting Curve, r = e^(-t/s)"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this formula, &lt;code&gt;r&lt;/code&gt; is retention, &lt;code&gt;tau&lt;/code&gt; is time, and &lt;code&gt;s&lt;/code&gt; is the strength of the memory.&lt;/p&gt;

&lt;h3&gt;
  
  
  Learning Curve
&lt;/h3&gt;

&lt;p&gt;The opposite of the forgetting curve is the learning curve:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fheiskr.com%2Fimages%2Fmath-3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fheiskr.com%2Fimages%2Fmath-3.png" alt="The Learning Curve, a = 1-e^(-t/s)"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Where &lt;code&gt;a&lt;/code&gt; is learning. Some authors suggest an alternative model for learning, a sigmoid function:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fheiskr.com%2Fimages%2Fmath-4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fheiskr.com%2Fimages%2Fmath-4.png" alt="Alternative learning curve, a = 1/(1+e^(-(t-u)/s)))"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Bayesian Knowledge Tracing
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Bayesian_Knowledge_Tracing" rel="noopener noreferrer"&gt;Bayesian Knowledge Tracing&lt;/a&gt; determines how likely a learner knows a skill, based on the learner’s responses.&lt;/p&gt;

&lt;p&gt;Bayesian Knowledge Tracing derives from Bayes’ Theorem.&lt;/p&gt;

&lt;p&gt;| &lt;a href="/images/math-5.png" class="article-body-image-wrapper"&gt;&lt;img src="/images/math-5.png" alt="Bayes’ Theorem, p(A | B) = p(A) \* p(B | A) / p(B)"&gt;&lt;/a&gt; |&lt;/p&gt;

&lt;p&gt;We call…&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;p(A|B)&lt;/code&gt; the &lt;strong&gt;posterior&lt;/strong&gt;  — what we believe after seeing the data.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;p(A)&lt;/code&gt; the &lt;strong&gt;prior&lt;/strong&gt;  — what we believe before the data.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;p(B|A)&lt;/code&gt; the &lt;strong&gt;likelihood&lt;/strong&gt; —given our prior belief, how likely was the data.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;p(B)&lt;/code&gt; the &lt;strong&gt;normalizer&lt;/strong&gt;  — how likely is the data given all hypotheses.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;p(B)&lt;/code&gt; is often difficult to formulate. We can use this as a replacement:&lt;/p&gt;

&lt;p&gt;| &lt;a href="/images/math-6.png" class="article-body-image-wrapper"&gt;&lt;img src="/images/math-6.png" alt="A Bayes normalizer. p(B) = p(A) \* p(B | A) + p(~A) \* p(B | ~A)"&gt;&lt;/a&gt; |&lt;/p&gt;

&lt;p&gt;&lt;code&gt;~&lt;/code&gt; in this case means &lt;em&gt;not&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;For BKT, we have the follow factors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;p(L)&lt;/code&gt; — probability the learner learned the skill.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;p(C)&lt;/code&gt; — probability the learner will get the item correct.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;p(T)&lt;/code&gt; — probability the learner will learn the skill on a particular item.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;p(G)&lt;/code&gt; — probability the learner will guess the right answer.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;p(S)&lt;/code&gt; — probability the learner will mess up even knowing the skill.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For any item, the probability of getting the answer correct is:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fheiskr.com%2Fimages%2Fmath-7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fheiskr.com%2Fimages%2Fmath-7.png" alt="Probability of a correct answer: p(C) = p(L) * p(~S) + p(~L) * p(G)"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Putting this all together, the probability the learner has learned the skill is, given a correct answer:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fheiskr.com%2Fimages%2Fmath-8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fheiskr.com%2Fimages%2Fmath-8.png" alt="The probability the learner has learned the skill, given a correct answer."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Given an incorrect answer:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fheiskr.com%2Fimages%2Fmath-9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fheiskr.com%2Fimages%2Fmath-9.png" alt="The probability the learner has learned the skill, given an incorrect answer."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We also must account for the idea the learner may have improved the skill during the card. So…&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fheiskr.com%2Fimages%2Fmath-10.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fheiskr.com%2Fimages%2Fmath-10.png" alt="We now include transit, as the probability the learner has learned the action during the action."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The power of Bayes is the ability to update the model each time we receive new information. We don’t have to operate on larger data sets at less frequent intervals. We can constantly update the model just a little bit each time.&lt;/p&gt;

&lt;p&gt;For a better explanation, I recommend &lt;a href="https://www.youtube.com/watch?v=_7CtthPZJ70" rel="noopener noreferrer"&gt;this video from Ryan Baker’s Big Data and Education course&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Item Response Theory
&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Item_response_theory" rel="noopener noreferrer"&gt;Item Response Theory&lt;/a&gt; determines how likely a learner will correctly answer a particular question. It is a logistic function. We use IRT is more commonly in testing, but we can use IRT in adaptive learning as well. The parameters read:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;theta&lt;/code&gt; — learner ability.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;b&lt;/code&gt; — item difficulty.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;a&lt;/code&gt; — item discrimination; how likely the item determines ability.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;c&lt;/code&gt; — item guess.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are two common formulations:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fheiskr.com%2Fimages%2Fmath-11.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fheiskr.com%2Fimages%2Fmath-11.png" alt="The simpler IRT, which only uses item difficulty."&gt;&lt;/a&gt; &lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fheiskr.com%2Fimages%2Fmath-12.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fheiskr.com%2Fimages%2Fmath-12.png" alt="The more complex IRT, which uses difficulty, discrimination, and guess."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The formulas change slightly depending on author.&lt;/p&gt;

&lt;p&gt;We can extend Item Response Theory into &lt;a href="http://pact.cs.cmu.edu/pubs/AIED%202009%20final%20Pavlik%20Cen%20Keodinger%20corrected.pdf" rel="noopener noreferrer"&gt;Performance Factors Analysis&lt;/a&gt;. PFA is a competing model with Bayesian Knowledge Tracing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Knowledge Space Theory
&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Knowledge_space" rel="noopener noreferrer"&gt;Knowledge Space Theory&lt;/a&gt; represents what skills learner knows. KST derives from &lt;a href="http://en.wikipedia.org/wiki/Antimatroid" rel="noopener noreferrer"&gt;antimatroids&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We assume a learner has either learned a skill or not. Given skills &lt;code&gt;+&lt;/code&gt;, &lt;code&gt;-&lt;/code&gt;, &lt;code&gt;*&lt;/code&gt;, and &lt;code&gt;/&lt;/code&gt;, we would form prerequisites, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;+ -&amp;gt; -&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;+ -&amp;gt; *&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;* -&amp;gt; /&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The knowledge space represents all possible sets of knowledge a learner might have, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;none&lt;/li&gt;
&lt;li&gt;&lt;code&gt;+&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;+, -&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;+, *&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;+, *, /&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;+, -, *, /&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An individual learner has a likelihood for each of these sets. KST makes the assumption that an individual question may inquire about multiple skills. We begin by asking questions that use multiple skills, and work backwards to assess learner knowledge.&lt;/p&gt;

&lt;p&gt;Several automated systems exist to automatically determine prerequisites based on learner performance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Spaced Repetition
&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Spaced_repetition" rel="noopener noreferrer"&gt;Spaced Repetition&lt;/a&gt; suggests that learners should spread out their practice. Reviews should happen less frequently as ability improves.&lt;/p&gt;

&lt;p&gt;The most popular algorithm is &lt;a href="http://www.supermemo.com/english/ol/sm2.htm" rel="noopener noreferrer"&gt;SuperMemo 2&lt;/a&gt;. The first review is after 1 day, the second review is after 6 days. After which, the next review is:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fheiskr.com%2Fimages%2Fmath-13.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fheiskr.com%2Fimages%2Fmath-13.png" alt="SuperMemo 2. i(n) = i(n-1) * e"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;…where &lt;code&gt;e&lt;/code&gt; is how difficult or easy the item is. &lt;code&gt;e&lt;/code&gt; is between 1.3 and 2.5, and it uses learner responses on a &lt;a href="http://en.wikipedia.org/wiki/Likert_scale" rel="noopener noreferrer"&gt;Likert scale&lt;/a&gt; to determine the next time to review.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.supermemo.com/help/smalg.htm" rel="noopener noreferrer"&gt;Later versions of SuperMemo&lt;/a&gt; include other considerations, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Similar cards&lt;/li&gt;
&lt;li&gt;Previous iteration duration&lt;/li&gt;
&lt;li&gt;Ebbinghaus forgetting curve&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The latest is version &lt;a href="http://www.supermemo.com/english/algsm11.htm" rel="noopener noreferrer"&gt;11/15&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Sagefy uses Bayesian Knowledge Tracing
&lt;/h3&gt;

&lt;p&gt;Sagefy uses Bayesian Knowledge Tracing. The reason is that it is a simple formula and computationally inexpensive. The other advantage is that with Bayes, the model updates each time the learner interacts with the system a little bit each time. This feature avoids expensive modeling computations all at once. That means that Sagefy can both scale more easily and handle a larger diversity of content.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adding Time to Bayesian Knowledge Tracing
&lt;/h3&gt;

&lt;p&gt;Bayesian Knowledge Tracing does not consider forgetting. To account for forgetting, I have added a taste of the Ebbinghaus forgetting curve into the final calculation. A new formula which calculates &lt;code&gt;belief&lt;/code&gt;, which is our confidence in &lt;code&gt;p(L)&lt;/code&gt; given the elapsed time:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;exp(-1 * time_delta * (1 — learned) / belief_factor)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I set my belief factor to 708000 based on guess-and-check. Likely, I could optimize this value later on.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I’m Working to Learn Card, Unit, and Subject Parameters
&lt;/h2&gt;

&lt;p&gt;Everything here so far lays out how to estimate how likely the learner knows the unit. But, what the other parameters, and how do we come to know those? This is the more challenging area.&lt;/p&gt;

&lt;h3&gt;
  
  
  Parameters of Cards, Units, and Subjects
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Cards.&lt;/strong&gt; In Bayesian Knowledge Tracing, most implementations assign a &lt;strong&gt;Guess&lt;/strong&gt; , &lt;strong&gt;Slip&lt;/strong&gt; , and &lt;strong&gt;Transit&lt;/strong&gt; at the unit level. But, for Sagefy, to get deeper information, I’ve assigned those parameters to cards. Transit informs us of the &lt;em&gt;quality&lt;/em&gt; of the card. Guess and Slip informs us of the &lt;em&gt;difficulty&lt;/em&gt; of the card. &lt;em&gt;Difficulty&lt;/em&gt; helps us to choose cards appropriate to the learner’s ability. We also want to track the &lt;strong&gt;number of learners&lt;/strong&gt; who will we will impact when we make changes to the card.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Units.&lt;/strong&gt; We want to know a way of determining approximately how much time or how many cards it takes on average to learn the unit. This is the &lt;strong&gt;&lt;em&gt;difficulty&lt;/em&gt;&lt;/strong&gt; of the unit. We can judge the &lt;strong&gt;quality&lt;/strong&gt; of the unit based on the average ability of the learners of the unit. We also want to track the &lt;strong&gt;number of learners&lt;/strong&gt; who will we will impact when we make changes to the unit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Subjects.&lt;/strong&gt; We want to know a way of informing the learner how much time it will take to complete the subject, given their currency state of progress. This is the &lt;strong&gt;&lt;em&gt;difficulty&lt;/em&gt;&lt;/strong&gt; of the subject. We can calculate the difficulty of the subject by summing up the difficulty of the remaining units. We can also calculate &lt;strong&gt;quality&lt;/strong&gt; in a similar fashion, but using a mean instead of a sum. We also want to track the &lt;strong&gt;number of learners&lt;/strong&gt; who will we will impact when we make changes to the subject.&lt;/p&gt;

&lt;p&gt;You can see we have lots of data about the smallest entities, and less data about higher entities. We track fine data about cards, a little less about units, and subjects just aggregate unit data. So for this section of the article, the focus will be on card parameters.&lt;/p&gt;

&lt;h3&gt;
  
  
  Probability Mass Functions
&lt;/h3&gt;

&lt;p&gt;Bayes gives us the ability to make constant updates to our models instead of making big and heavy calculations all at once. To achieve this, we work with &lt;em&gt;distributions&lt;/em&gt;. So instead of just resulting with a number, we have a line chart. On one axis is the possible values, on the other axis is the probability of that value being the correct answer. So as we get more data, the graph tightens around a single value.&lt;/p&gt;

&lt;p&gt;There’s two types of distributions. One is continuous. In a continuous distribution, we have a single equation that represents the entire graph. The other is discrete. So we have specific data points that represent our graph. Computers naturally can work with discrete much more quickly than continuous. The official name of a discrete distribution is the &lt;a href="https://en.wikipedia.org/wiki/Probability_mass_function" rel="noopener noreferrer"&gt;&lt;strong&gt;probability mass function&lt;/strong&gt;&lt;/a&gt;. Because Sagefy is ultimately made of servers, the PMF is the more efficient and easier to use choice.&lt;/p&gt;

&lt;p&gt;PMFs are easy to work with in Bayes. Each possible value gets its own update that matches the &lt;code&gt;p(A|B) = p(A) * p(B|A) / p(B)&lt;/code&gt; formula. Then we normalize the PMF after the update so that the sum probability of the values is 1. With the PMF, the normalizer takes care of &lt;code&gt;p(B)&lt;/code&gt;. And we already have &lt;code&gt;p(A)&lt;/code&gt; which is the previous set of hypotheses. That means we need a way to compute &lt;code&gt;p(B|A)&lt;/code&gt;, the likelihood.&lt;/p&gt;

&lt;p&gt;Everything I know about probability mass functions I learned from the book &lt;a href="http://greenteapress.com/wp/think-bayes/" rel="noopener noreferrer"&gt;&lt;strong&gt;Think Bayes&lt;/strong&gt; by Allen Downey&lt;/a&gt;. He gives a much better explanation than I could, and the book is free.&lt;/p&gt;

&lt;h3&gt;
  
  
  Card Parameters
&lt;/h3&gt;

&lt;p&gt;We need to update Guess, Slip, and Transit &lt;em&gt;per learner response&lt;/em&gt;. Guess should increase with correct answers and decrease with incorrect answers. Slip should increase with incorrect answers and decrease with correct answers. Transit should increase if the later responses are more correct, and decrease if the later responses are less correct.&lt;/p&gt;

&lt;p&gt;For Guess and Slip, I figured how how to calculate the likelihood, though it doesn’t work as accurately as I’d like. The formula for if a learner will get an answer correct is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;learned * (1-slip) + (1-learned) * guess&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and incorrect…&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;learned * slip + (1-learned) * (1-guess)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If the learner got it right, I can use the first formula as the likelihood. If the learner got it wrong, I can use the second formula. Learned is the learner’s learned. You take the prior slip to calculate guess, and the prior guess to calculate slip. The value of guess or slip is just each hypothesis (so you do this calculation per each hypothetical value). Doing the math, it means earlier learners will impact guess more, and later learners will impact slip more as expected.&lt;/p&gt;

&lt;p&gt;When I ran this in simulation, it held a strong correlation to the initial values. But, they were off by scale. I have manually adjusted the scale in Sagefy. Transit is likely at play at throwing off these calculations, but I was unable to find a formula to take out this factor automatically. &lt;em&gt;This is an opportunity for improvement.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I was unable to find a way to calculate a likelihood for transit. I know the following is true:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;transit = (learned_post — learned_pre) / (1 — learned_pre)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This likelihood never panned out in simulation, so for now Sagefy has a set transit for all cards. &lt;em&gt;This is a major opportunity for improvement.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I haven’t figured out how how to calculate the number of learners quite yet. That’s more of a technical challenge than a mathematical one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Unit and Subject Parameters
&lt;/h3&gt;

&lt;p&gt;I haven’t done the work to calculate the two unit and two subject parameters: &lt;strong&gt;difficulty&lt;/strong&gt; and &lt;strong&gt;number of learners&lt;/strong&gt;. These are both essentially database queries. The responses table can inform the difficulty. Learners subscribe to subjects, and not units. The solution requires figuring out all the relationships and then counting from there. Not impossible, but not easy either.&lt;/p&gt;

&lt;h3&gt;
  
  
  How I’m Simulating Models and Error Rates
&lt;/h3&gt;

&lt;p&gt;Because Sagefy is new, I don’t have much real user data to test my model against. For now, I’m using simulated data. I created a script that will create a random collection of subjects, units, cards, and users, all of each with random parameters within ranges. I’m using triangle ranges instead of completely linear randomization to more closely simulate real data. Then, I can run my model against the simulated data, and take error rates. We can calculate the error rate for each parameter as:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fheiskr.com%2Fimages%2Fmath-14.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fheiskr.com%2Fimages%2Fmath-14.png" alt="Error rate. sqrt( sum( (si — ri) ^ 2 ) / n )"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Where &lt;code&gt;s_i&lt;/code&gt; is the simulated value (each example), &lt;code&gt;r_i&lt;/code&gt; is the real value, &lt;code&gt;n&lt;/code&gt; is the number of examples.&lt;/p&gt;

&lt;p&gt;When I modeled this, I was able to see my errors shrink by changing the number of steps in my PMF. I also saw improvements by scaling down guess and slip… again, that’s still a mystery at this point. Hopefully, if Sagefy attracts users, we will be able to create better models using real data instead of simulated data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Traversing the Graph of Units
&lt;/h2&gt;

&lt;p&gt;Bayesian Knowledge Tracing helps us within a unit. But, subjects contain many units. To work with the course, we must iterate over the graph of units.&lt;/p&gt;

&lt;p&gt;We collect the subject of units that the learner will be participating in. We will need to diagnose any units which the learner hasn’t seen. We will also need to diagnose any units that the learner viewed, but we are no longer confident in the ability score due to time.&lt;/p&gt;

&lt;p&gt;The following is an example of this process, known as a graph traversal.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fheiskr.com%2Fimages%2Fmath-15.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fheiskr.com%2Fimages%2Fmath-15.png" alt="An example graph of units."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The algorithm makes use of depth first search. We start near the end of the tree, and walk our way down as we diagnose. We record each node in one of three lists: Diagnose, Ready, and Learned.&lt;/p&gt;

&lt;p&gt;First, we start at node “A”. We diagnose an L (low score). Because it is a low score, we will continue to traverse the tree. Append “A” to list Diagnose.&lt;/p&gt;

&lt;p&gt;Next, we will continue to node “C”. This is because we have higher confidence in “C” than “B”. “C” is already diagnosed. Append “C” to list Ready. We note that “C” has one dependency, “A”.&lt;/p&gt;

&lt;p&gt;Third, we continue to node “F” (depth-first search). We are confident that the learner knows node “F”, and we start on the other side of the chain. Append “F” to Learned. Although “F” requires “I”, because we are confident in high ability for “F”, we will not diagnose “I”.&lt;/p&gt;

&lt;p&gt;Because “C” has no other requires, we go back to “B”. We find it is a low ability. Append to Ready, 1 dependent: A.&lt;/p&gt;

&lt;p&gt;We know more about “E” than “D”, so we continue to “E”. We find “E” is a low ability. Append to Ready, 2 dependents: A and B.&lt;/p&gt;

&lt;p&gt;We already know “G”, so append “G” to Learned.&lt;/p&gt;

&lt;p&gt;We diagnose “H”, and find it is low ability. Append to Ready, 3 dependents: “A”, “B”, and “E”. If the learner hadn’t learned “F”, unit “H” would have 4 dependencies instead of 3. The algorithm considers how many nodes &lt;em&gt;depend&lt;/em&gt; on the given node, rather than how deep in the graph the node is.&lt;/p&gt;

&lt;p&gt;Finally, we diagnose node “D” with low ability. Append to Ready, and there are 2 dependents: “A” and “B”.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fheiskr.com%2Fimages%2Fmath-16.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fheiskr.com%2Fimages%2Fmath-16.png" alt="Now, our graph of units after diagnosis."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We also have the following lists:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Diagnose: [] Ready: [A, C, B, E, H, D] Learned: [F, G]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We are now ready to starting the learning process.&lt;/p&gt;

&lt;p&gt;The following is overly simplistic; most learners will not ‘learn’ a unit in their first attempt at it. If at any time the unit composition changes, when we come back to the tree, we will need to diagnose any new units. Additionally, learners will need to review some units every now-and-again to keep the confidence scores up.&lt;/p&gt;

&lt;p&gt;In the ready list, A, B, and E have requires, so those are not options to the learner yet. The available ready nodes are C, D, and H.&lt;/p&gt;

&lt;p&gt;“H” has the most dependents, so Sagefy would recommend “H” as the starting place for the learner. Let’s say, though, the learner choose to learn unit “D” first.&lt;/p&gt;

&lt;p&gt;Now the remaining set is C and H. The learner chooses H. So now the remaining set is E and C. Let’s say the learner chooses C.&lt;/p&gt;

&lt;p&gt;Now, the only option remaining is E. After E, the learner would do B, then A.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choosing Cards
&lt;/h2&gt;

&lt;p&gt;After the learner selects a unit, then Sagefy must choose a card for them. Several factors come into play:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How well has the learner mastered this unit? &lt;code&gt;p(L)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Which cards are assessment v non-assessment cards? (e.g. Videos are non-assessment, multiple choice is assessment)&lt;/li&gt;
&lt;li&gt;Has the learner recently seen the card?&lt;/li&gt;
&lt;li&gt;Does the card require another card first?&lt;/li&gt;
&lt;li&gt;How good is the card? &lt;code&gt;p(T)&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our goals are as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We want to show cards of appropriate difficulty. A card with high slip would not be appropriate for someone with a low &lt;code&gt;p(L)&lt;/code&gt;, for example.&lt;/li&gt;
&lt;li&gt;We want to focus on non-assessment cards for low &lt;code&gt;p(L)&lt;/code&gt;, and assessment cards for a high &lt;code&gt;p(L)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;We want to avoid showing a card the learner has seen recently, when possible.&lt;/li&gt;
&lt;li&gt;We want to ‘follow’ card requires.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The current process works like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Find &lt;code&gt;p(L)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Choose ten random cards in the unit.&lt;/li&gt;
&lt;li&gt;Split up the cards by assessment versus non-assessment.&lt;/li&gt;
&lt;li&gt;If the learner has a low &lt;code&gt;p(L)&lt;/code&gt;, be more likely to prefer non-assessment. As &lt;code&gt;p(L)&lt;/code&gt; increases, prefer assessment.&lt;/li&gt;
&lt;li&gt;For an assessment card, try to find one where the probability of correct is greater than 0.25 and less than 0.75. Otherwise, show any assessment card.&lt;/li&gt;
&lt;li&gt;For non-assessment, just pick the first one.&lt;/li&gt;
&lt;li&gt;Otherwise, choose any remaining card available.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A few things could improve here. We can add tags, track how the learner does with different kinds of cards, and use &lt;code&gt;p(T)&lt;/code&gt; to choose better quality cards. Overall, this is not as difficult of a problem as figuring out what the learner does and does not know.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contributor Experience
&lt;/h2&gt;

&lt;p&gt;The contributor experience is still a work in progress.&lt;/p&gt;

&lt;p&gt;In most open-content systems, &lt;em&gt;anyone can edit&lt;/em&gt;. But, usually there’s a number of people subscribed to all changes to the content. When a change occurs that was not discussed, the change is immediately &lt;strong&gt;reverted&lt;/strong&gt;. Only by &lt;strong&gt;discussion&lt;/strong&gt; and &lt;strong&gt;consent&lt;/strong&gt; is the change made permanent.&lt;/p&gt;

&lt;p&gt;Sagefy codifies this process by not allowing direct edits, but by allowing anyone to &lt;strong&gt;propose&lt;/strong&gt; changes to content. Then, other users can &lt;strong&gt;vote&lt;/strong&gt; on the proposal. With enough approving votes, Sagefy makes the change. Sagefy keeps a record of all the changes too. With any significant dissent, Sagefy &lt;strong&gt;blocks&lt;/strong&gt; the proposal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contributor Ratings and Consensus-Based Decision Making
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fheiskr.com%2Fimages%2Fmath-17.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fheiskr.com%2Fimages%2Fmath-17.png" alt="The proposal flow."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The decision to accept a proposal has a few factors: the &lt;strong&gt;reputation&lt;/strong&gt; of the proposer and voters and the &lt;strong&gt;usage&lt;/strong&gt; of the entity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Entity Calculation
&lt;/h3&gt;

&lt;p&gt;We calculate the “Yes” vote power as the sum of the proposer and the “yes” voters’ vote power.&lt;/p&gt;

&lt;p&gt;We calculate the “No” vote power as the sum of the “no” voters’ vote power.&lt;/p&gt;

&lt;p&gt;To accept a proposal, the proposal requires &lt;code&gt;log2(number_of_learners)&lt;/code&gt; in “yes” vote power.&lt;/p&gt;

&lt;p&gt;To block a proposal, the proposal requires &lt;code&gt;log100(number_of_learners)&lt;/code&gt; in “no” vote power.&lt;/p&gt;

&lt;p&gt;To unblock a proposal, we must work together to reduce the “no” vote power to below this amount. Otherwise, the proposer can decline their proposal.&lt;/p&gt;

&lt;p&gt;The reason for this is simple: its likely impossible to meet perfect consensus all the time. Yet, we should strongly consider dissent. Majority rule isn’t as powerful as near-consensus.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Example:&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Number of Learners, To Accept, To Block - 1, 0, 0 - 10, 3.32, 0.5 - 100, 6.64, 1 - 1000, 9.97, 1.5 - 10000, 13.28, 2 - 100000, 16.61, 2.5&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Contributor Calculation
&lt;/h3&gt;

&lt;p&gt;Each proposal and vote for a proposal in accepted state counts as +1 point. Sagefy calculates the vote power as &lt;code&gt;1-e^(-points/40)&lt;/code&gt;. This may seem like a convoluted formula. The reason is to avoid “superusers” who by their linear reputation alone can make any change. The difference between 0 and 10 successful contributions gives us lots of information. 10 to 100, less so. And 100 to 1000, even less. We learn the most from the earliest examples, and less with each example.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Example:&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Points: Power - 0: 0 - 5: 0.12 - 10: 0.22 - 20: 0.39 - 50: 0.71 - 100: 0.91 - 150: 0.97 - 200: 0.99&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Call to Action
&lt;/h2&gt;

&lt;p&gt;As you can see, this is just the beginning. Sagefy is right now the seed of what it will grow into. To review, here’s the most immediate open questions and TODO items:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why does the likelihood function overestimate guess and slip?&lt;/li&gt;
&lt;li&gt;How do we compute the likelihood for transit?&lt;/li&gt;
&lt;li&gt;Calculate difficulty and number of learners for units and subjects.&lt;/li&gt;
&lt;li&gt;Efficiently diagnose the learner’s current knowledge before entering ‘learn mode’.&lt;/li&gt;
&lt;li&gt;Test using real data instead of simulated data.&lt;/li&gt;
&lt;li&gt;Implement contributor rating and consensus system.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Some of the other opportunities to use math in Sagefy:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Improve the model for choosing cards.&lt;/li&gt;
&lt;li&gt;Create a model for handling asynchronous peer assessment. (Such as short answer/essay type questions, file uploads, etc.)&lt;/li&gt;
&lt;li&gt;Recommend new subjects to the learner.&lt;/li&gt;
&lt;li&gt;Filter spam and low quality content.&lt;/li&gt;
&lt;li&gt;Match up learners with other learners and mentors.&lt;/li&gt;
&lt;li&gt;Group learning.&lt;/li&gt;
&lt;li&gt;When should the learner take a break?&lt;/li&gt;
&lt;li&gt;How valid or accurate is the content?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;If you find this interesting, come join in! Reach out on&lt;/strong&gt; &lt;a href="https://twitter.com/sagefyorg" rel="noopener noreferrer"&gt;&lt;strong&gt;Twitter&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;.&lt;/strong&gt; Thank you!&lt;/p&gt;

&lt;p&gt;If you’d like to know more about Sagefy, &lt;a href="https://sagefy.org" rel="noopener noreferrer"&gt;visit today&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Gamification Isn’t Always the Right Answer</title>
      <dc:creator>Kevin Heis</dc:creator>
      <pubDate>Sat, 01 Apr 2017 00:00:00 +0000</pubDate>
      <link>https://dev.to/heiskr/gamification-isn-t-always-the-right-answer-445m</link>
      <guid>https://dev.to/heiskr/gamification-isn-t-always-the-right-answer-445m</guid>
      <description>&lt;p&gt;Gamification seemed like a natural fit for &lt;a href="https://sagefy.org"&gt;Sagefy&lt;/a&gt;. The term had been around since about 2010. Gamification came to its current position in 2013. 2013 was around the same time &lt;a href="https://dev.to/stories/why-i-m-building-sagefy"&gt;I started working on Sagefy&lt;/a&gt;. I didn’t know much about gamification beyond the cliché of points, badges, and leaderboards. But I did know that many businesses and organizations invested in gamification. In particular, those related to learning (&lt;a href="https://www.khanacademy.org/"&gt;Khan Academy&lt;/a&gt;, &lt;a href="https://www.duolingo.com/"&gt;Duolingo&lt;/a&gt;). I explored this through videos, articles, books, and courses. I realized people used gamification as a synonym for a more familiar phrase: &lt;strong&gt;extrinsic motivation.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The word “gamification” came into existence around 2010. “Gamification” reached the term’s &lt;a href="https://www.google.com/trends/explore?date=all&amp;amp;q=gamification"&gt;current standing in 2013&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Sagefy, and What is Gamification
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Sagefy is an open-content adaptive learning system.&lt;/strong&gt; &lt;em&gt;Open-content&lt;/em&gt; means anyone can create and update learning content, like Wikipedia. &lt;em&gt;Adaptive learning&lt;/em&gt; means the content changes based on the learner’s goal and their prior knowledge. The combination means anyone can learn just about anything, regardless of their prior knowledge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gamification&lt;/strong&gt; is the application of &lt;em&gt;game-like elements&lt;/em&gt; to traditionally non-game activities. An example of gamification would be awarding points to a sales team on each sale, and awarding a prize for the highest number of points. In learning contexts, this usually means something like awarding points for mastering content, and awarding prizes like trophies or unlocking content.&lt;/p&gt;

&lt;p&gt;We often find gamification in learning contexts, especially e-learning. The reason is &lt;strong&gt;motivation&lt;/strong&gt;. Online courses have typically &lt;a href="http://www.katyjordan.com/MOOCproject.html"&gt;lower participation and completion rates&lt;/a&gt; than traditional courses. Learning content creators use gamification to improve their statistics.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I’ve Read
&lt;/h2&gt;

&lt;p&gt;I’m no expert in gamification. Given the age of gamification, I’m not sure anyone is. That said, I’ve had a little background on it. Some of my influences include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;a href="https://www.coursera.org/learn/gamification"&gt;Coursera Gamification course,&lt;/a&gt; taught by Kevin Werbach.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.gdcvault.com/play/1014576/We-Don-t-Need-No"&gt;“We Don’t Need No Stinkin’ Badges”,&lt;/a&gt; by Jane McGonigal.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.amazon.com/dp/1118096347/"&gt;The Gamification of Learning and Instruction&lt;/a&gt; by Karl Kapp.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are three specific items. Also, I have a background in user research and testing, as well as my interest in learning science and memory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pros and Cons of Gamification
&lt;/h2&gt;

&lt;p&gt;Some of the good things can come from adding game elements to a learning platform like Sagefy. The largest opportunity is of course increased motivation and engagement. Gamification can lead learners to use the site for longer and to return more frequently. Adding playful elements can increase the positive emotions of the platform. Positive emotions help to spread word-of-mouth. Gamification can add a sense of progress, and can increase social activity.&lt;/p&gt;

&lt;p&gt;There’s some cons. We already see some negative reaction to points, leaderboards, and badges. &lt;em&gt;Because gamification is becoming so common, many people associate these game elements with marketing.&lt;/em&gt; Gamification can also be manipulative, both intentional and unintentional. By setting up the wrong motivations, it can lead learners to focus on gaming the system rather than on learning. Gamification can also lead learners to focus on the gamified rewards rather than the reward of learning. This can lead to a set of false expectations. Rewards can demotivate because they distract from the learner’s internal goals. The other nuance is that different learners have different reasons for learning. Not everyone finds all game elements motivating.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Intrinsic Focus for Sagefy
&lt;/h2&gt;

&lt;p&gt;In my mind, adding some gamified elements can be fun. &lt;strong&gt;The most important thing is that those elements &lt;em&gt;support,&lt;/em&gt; and not oppose, the internal motivations of the learner.&lt;/strong&gt; For example, giving users an easy way to track their progress is important. Reminding users of their goals is valuable. Encouraging social interactions can add to the learning experience. Focusing too much on badges, leaderboards, economies, and points can detract instead.&lt;/p&gt;

&lt;p&gt;Sagefy is currently minimal. But it will grow in features. The question for me with motivation will remain. &lt;em&gt;Does this feature support the learner’s intrinsic motivation? Or does is distract?&lt;/em&gt; If it doesn’t pass that test, I can’t support it.&lt;/p&gt;

&lt;p&gt;If you’d like to know more about Sagefy, &lt;a href="https://sagefy.org"&gt;visit today&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
