DE
Это в школьной программе точно прописано, что человек знает в каждом классе. И по этому списку можно вступительный экзамен на каждый уровень проводить.
В школе учат всему по общему списку. В программировании же все самоучки, учащие только те главы, которые им интересны. Умножение мне нравятся – про него прочитаю. А деление какое-то непонятное – пропущу. Поэтому чётких градаций нет:
Кто-то знает про return вместо echo, но не знает про static. Кто-то знает про сеттеры, а кто-то нет. Кто-то уже умеет в Docker, а кто-то только на composer в консоли способен. Кто-то юзает контейнер, а кто-то синглтоны. Кто-то знает, что REST это принципы, а кто-то называет им любой API с JSON. Кто-то автодепломт на виртуалку, а кто-то на хостинг по FTP. Кто-то знает про инвариант, а кто-то нет. Кто-то читал Эванса, но не читал Вернона, а кто-то наоборот или вообще никак. Кто-то пишет тесты, а кто-то не пробовал. Кто-то уже читал документацию по предмету и уже что-то пробовал, а кто-то просто поглазеть пришёл.
И как их на уровни делить? Сказать, что "это уровень для тех, кто уже умеет в ООП"? Так на него все придут. Ведь все же умеют слово class писать :)
Так что единственный способ, чтобы что-то зашло – это рассказать всё по нарастающей от начала до конца. Бывалые начало перемотают, а новичкам половину слов не придётся отдельно гуглить.
Если же делить на этапы по сложности, то по Даннингу-Крюгеру все новички сразу ломанутся в середину, пропустив начало. Как и бывалые читая Эванса кидаются сразу в главы с кодом, пропуская начало с "неинтересной" им философией.
Так что с этим всё сложно.