Building a Recommendation Engine That Understands SA Students
We just had our biggest week since launching UniApplyForMe. Tens of thousands of students using the platform in a matter of days, and almost immediately, things I thought were solid started showing their cracks.
Not breaking cracks. More like the kind that only appear when real people are using something at a real scale. The kind that make you realise your assumptions were built for a quieter world.
A lot of what I spent the past few days on was caching and refining how we match students to courses. It sounds unglamorous. It is a little. But it forced me to sit with a question I want to try to answer here: why is recommending a university course to a South African student so much harder than it should be?
An APS Score Is Not Just a Number
The Admission Point Score is the primary gate to university in South Africa. Every matric subject gets converted to a point value; you add them up, and universities use that total as a minimum entry threshold. Simple enough in theory.
In practice, not every subject counts. Some are excluded from the general APS calculation entirely. A student doing agricultural management practices, or equine studies, or a vocational subject outside the mainstream NSC stream cannot just throw those marks into the pot and expect the same result as someone doing physical sciences or history.
When you are building a system that has to evaluate eligibility for thousands of qualifications across 26 public universities, getting this wrong at the data level means getting it wrong for real students. We spent real time making sure the subjects in our database carry the right flags and that our matching logic actually respects them. During this past week under load, that logic was being exercised harder than ever, and a few edge cases surfaced that needed tightening.
Languages Are a Minefield
South Africa has 11 official languages, and they all appear in the matric curriculum. But a subject is never just “Zulu” or “Sotho.” It is Zulu home language, or Zulu first additional language, or, in some cases, Zulu second additional language. Those distinctions carry real weight.
Some university programmes require a language at the home language level. Others accept a first additional language. The same student, with the same language on their result slip, can qualify for one programme and not another depending entirely on which level they sat it at.
And it does not work in reverse. Passing a language at the home language level does not automatically satisfy a first additional language requirement at a different institution. The rules are asymmetric and institution-specific.
When we index qualification requirements, we have to store and evaluate these distinctions correctly. A flat “requires a language” flag is not good enough. It never was, but the past week made that even clearer as we looked at where our matching was producing results that needed a second look.
Maths Is Not Maths
South Africa has three distinct mathematics qualifications at matric level:
- Mathematics is the full academic stream required for most science, engineering, and commerce programmes
- Mathematical Literacy is a more applied, everyday numeracy focus, accepted by some faculties but a hard blocker for many others
- Technical Mathematics, a vocational pathway, sits somewhere in between and is accepted by a growing number of programmes
The problem is not that students do not know the difference. The problem is that a lot of platforms treat these three as interchangeable, or worse, only account for one of them entirely.
Our matching engine has to know which one a student has and what each programme specifically requires and apply the right substitution rules. Mathematics satisfies a mathematical literacy requirement. The reverse is not true.
This is the kind of thing that is easy to get right when you are manually checking one student. It is much harder to get right consistently at scale, under load, with caching layers in the mix that need to serve fast without serving stale data.
What “Eligible” Actually Means
When a student on UniApplyForMe searches for courses that match their results, we are not doing a single number comparison. We are evaluating their full subject profile against the requirements of each qualification, at each university, using that university’s specific APS calculation method.
Because universities do not all calculate APS the same way. Some exclude life orientation. Some have faculty-specific rules that deviate from their own general policy. Some have changed their rules recently, and their published prospectuses have not caught up.
Our job is to know all of this, keep it current, and apply it correctly every single time. The past few days were a good test of whether the system I have built actually does that under pressure. Mostly yes. A few things needed fixing. That is what building looks like.
Why I Keep Working on This
More than a million South African students sit their NSC exams every year. A lot of them are trying to figure out on their own where they can study and what they qualify for, often without a guidance counsellor who actually knows the answer, often without the money to apply speculatively to five universities and see what comes back.
When the platform gives a wrong answer, it is not a UX bug. It is a student making a decision based on bad information at one of the most important moments of their life.
That is what keeps me up at night refining this. Not the caching. The caching is just the mechanism. The reason is the student on the other end of it.
// Tags