One of the learnings that came out of the Reboot process is that helping students find the right exercises to work on is a critical part of making Exercism enjoyable, reducing the barrier and time to learning, and reducing frustration. There are three axes we are initially doing this on: difficulty, average time to completion, and topics.
As such, topics will appear around the site in lots of places. For example in the following two images you can see topic percentage completion on a track and topics on an exercise card. Integrating topics into the site in this way means there are certain "design rules" that we need to follow to make them look good. This means, for example, not having topics that have more than X characters in order to fit them on a line.


There's also other nice stuff that we'd like to be able to do with topics such as analysing coverage across tracks and looking at cross-corrolations with difficulty, length, completion %, etc. This sort of data might be able to help us find the strengths and weaknesses in each track and help us work out what sort of exercises we could do with adding where.
This leaves me with two linked considerations:
1) We need guaranteed consistency within track
To guarantee constancy I would like to propose that topic names listed in the config.json should be underscored lowercase alphabetic (e.g.control_flows_if_else). This makes them easy to visually scan and allows us to more easily notice differences that when comparing more natural language strings. e.g. "Control Flow (if / else)" and "Control Flow (if | else)". This also allows us maintainers to structure these topic names in a way that makes sense to them but that might not naturally make sense to a student (e.g. the use of the phrase "control flow" is useful for experienced programmers but scary and confusing for beginners who might be better just seeing "if / else")
2) Display names in the UI will want to be pretty and flexible
For example, we might want to put a unicode character in the UI, but we wouldn't want that in the neat underscored track data in config.json. We might also want to rename all "If / else" to "If and else" or "If | else" without having to update the config.json data everywhere. We therefore need a mapping between the topic names that appear next to exercises in the config and the UI versions. We don't want to shoehorn tracks into following certain topics where that's not natural - languages are different - but where there is overlap, we want to utilize it where possible.
Suggestions
After some brief thought I think this could be in three places:
a) As a separate array in the config.json, so the exercises.topics are keys pointing to the topics array. This doesn't help us with cross-track consistency, but will be good for ensuring track consistency.
b) As an array in a global cross-track config file, which enables us to guarantee consistency. This strikes me as great in theory, but a big pain for adding new topics.
c) In the UI database and managed by the UI team, not the track maintainer. New topics that hadn't been seen before would be "titliezed" so "control_flow_if_else" would become "Control Flow If Else" in the UI, and would be flagged to be checked by the UI team, who could then enforce whatever rules they want.
I'm edging towards (c). If we did this then I'd happily go through all the topics across all the tracks so far and write an initial mapping and put PRs out to update the existing configs.
This still leaves me with the question about consistency across tracks, but I wonder if that's just something that we periodically review, rather than having a formal process for.
As a side note, there's an existing file here which contains a set of the current topics in use. I'm not sure how comprehensive or up to date it is.
I'd value everyone's thoughts. (cc @exercism/track-maintainers)
One of the learnings that came out of the Reboot process is that helping students find the right exercises to work on is a critical part of making Exercism enjoyable, reducing the barrier and time to learning, and reducing frustration. There are three axes we are initially doing this on: difficulty, average time to completion, and topics.
As such, topics will appear around the site in lots of places. For example in the following two images you can see topic percentage completion on a track and topics on an exercise card. Integrating topics into the site in this way means there are certain "design rules" that we need to follow to make them look good. This means, for example, not having topics that have more than X characters in order to fit them on a line.
There's also other nice stuff that we'd like to be able to do with topics such as analysing coverage across tracks and looking at cross-corrolations with difficulty, length, completion %, etc. This sort of data might be able to help us find the strengths and weaknesses in each track and help us work out what sort of exercises we could do with adding where.
This leaves me with two linked considerations:
1) We need guaranteed consistency within track
To guarantee constancy I would like to propose that topic names listed in the
config.jsonshould be underscored lowercase alphabetic (e.g.control_flows_if_else). This makes them easy to visually scan and allows us to more easily notice differences that when comparing more natural language strings. e.g. "Control Flow (if / else)" and "Control Flow (if | else)". This also allows us maintainers to structure these topic names in a way that makes sense to them but that might not naturally make sense to a student (e.g. the use of the phrase "control flow" is useful for experienced programmers but scary and confusing for beginners who might be better just seeing "if / else")2) Display names in the UI will want to be pretty and flexible
For example, we might want to put a unicode character in the UI, but we wouldn't want that in the neat underscored track data in
config.json. We might also want to rename all "If / else" to "If and else" or "If | else" without having to update theconfig.jsondata everywhere. We therefore need a mapping between the topic names that appear next to exercises in the config and the UI versions. We don't want to shoehorn tracks into following certain topics where that's not natural - languages are different - but where there is overlap, we want to utilize it where possible.Suggestions
After some brief thought I think this could be in three places:
a) As a separate array in the
config.json, so theexercises.topicsare keys pointing to thetopicsarray. This doesn't help us with cross-track consistency, but will be good for ensuring track consistency.b) As an array in a global cross-track config file, which enables us to guarantee consistency. This strikes me as great in theory, but a big pain for adding new topics.
c) In the UI database and managed by the UI team, not the track maintainer. New topics that hadn't been seen before would be "titliezed" so "control_flow_if_else" would become "Control Flow If Else" in the UI, and would be flagged to be checked by the UI team, who could then enforce whatever rules they want.
I'm edging towards (c). If we did this then I'd happily go through all the topics across all the tracks so far and write an initial mapping and put PRs out to update the existing configs.
This still leaves me with the question about consistency across tracks, but I wonder if that's just something that we periodically review, rather than having a formal process for.
As a side note, there's an existing file here which contains a set of the current topics in use. I'm not sure how comprehensive or up to date it is.
I'd value everyone's thoughts. (cc @exercism/track-maintainers)