Видчуй рiзницу:
.firstElementChild возвратит первую ноду, которая является ЭЛЕМЕНТОМ.
.firstChild возвратит то, чё первое будет у папы-узла.
После этого твои слова я не понял)
Наверно, тебя смутило то, что у Кантора в задаче написано:
// вставить elem после первого элемента
insertAfter(elem, body.firstChild); // <--- должно работать
// вставить elem за последним элементом
insertAfter(elem, body.lastChild); // <--- должно работать
Это просто варики вызова функции.