Разные вещи могут пониматься под средним уровнем, но будем считать, что это способность работать на реальной работе хотя бы на начальной должности. Тогда это подразумевает владение обширным комплексом фичей языка: в Си это понимание выделения памяти, умение работы с ошибками и исключение утечек памяти, понимание работы операционной системы и железа. В C++ к этому добавляется умение использовать высокоуровненые концепции классов, шаблонов. В Java это владение ООП (но не нужно быть идеологизированным идиотом и писать 9 уровней наследования), а также полиморфизмом. Например, если вы примерно понимаете, как работает под капотом <? extends Class> (ковариантность, контрвариантность) и зачем нужны абстрактные классы и интерфейсы, то все в порядке (при условви, что более базовые вещи ясны на 100%). В python есть похожие концепции, нужно только понимать нюансы самого языка.
Самый лучший способ проверить свои способности - написать достаточно сложное приложение, например веб-сервер, который выполняет нетривиальные вычисления и операции с базой данных. Другой способ - открыть случайную библиотеку, которая достаточно сложная в освоении, например ffmpeg в си и посмотреть, сможете ли вы, гугля и читая исходный код разобраться, как сделать с помощью нее что-то. Ну и высший класс - это способность просто открыть опен сорс код базу и внести свои изменения (тоже нетривиальные - исправить опечатку не считается)