A tanulófeladatok célja, hogy megtanítsák a tanulónak azokat a kulcskészségeket, amelyekre egy adott nyelven való munkához szükség van. Ezek egyszerre arról szólnak, hogyan csináljunk szokványos dolgokat abban a nyelvben (például hogyan manipuláljunk stringeket), és arról is, hogyan csináljunk nyelvspecifikusabb dolgokat (például monádok, objektumorientált programozás, magasabb rendű függvények).
A tanulófeladatokra a következő jellemzők érvényesek:
A feladatok feloldása a tanított és megtanult fogalmak alapján történik. Minden tanulófeladatnak egy vagy több fogalmat kell tanítania. Lehetnek előfeltétel-fogalmai is, ami azt jelenti, hogy nem oldódik fel addig, amíg a tanuló el nem készül azokkal a tanulófeladatokkal, amelyek ezeket az előfeltétel-fogalmakat tanítják.
A tanulófeladatoknak nem szabad a kurzus előrehaladtával eleve nehezebbé válniuk. Az X nyelvben jártas fejlesztőnek úgy kell tudnia végigcsinálni a kurzus összes tanulófeladatát, hogy egy-egy megoldására legfeljebb 5-10 percet fordít. Mivel minden feladat célja az, hogy valakit rávegyen egy fogalom első használatára, és mivel a jártas fejlesztő már érti ezt a fogalmat X nyelvben, a feladat viszonylag triviálisnak tűnik majd neki. A későbbi feladatok nehezebbnek tűnhetnek egy olyan fejlesztőnek, aki nem ismeri X nyelvet, de csak azért, mert a későbbi feladat olyan fogalmat tanít, amely önmagában bonyolultabb (például a legtöbben egyetértenek abban, hogy a rekurzió összetettebb téma első alkalommal megtanulni, mint egy ciklust átültetni egyik nyelvből a másikba).
A tanulófeladatokat nem mentoráljuk. Amikor egy tanuló beküld egy olyan megoldást egy tanulófeladathoz, amellyel sikeresek lesznek a tesztek, megnézzük, hogy van-e elemző vagy representer, amely visszajelzést adhat. Ha nincs ilyen, a megoldást jóváhagyjuk. Ez a tanítás terhét a feladatra hárítja, amelynek világos utat kell kínálnia a tanított fogalom megtanulásához.