Yeah, honestly is_contiguous() is such an underrated little check. Most people (me included, back in the day) just panic and slap reshape() on it and move on. But like you said, actually looking at it tells you the real story — the data didn't go anywhere, the strides just stopped lining up after the transpose. Once you see that, reshape() stops feeling like duct tape.
Really glad you brought it up. This is kind of exactly why I ended up writing a book. Most tutorials jump straight into building a model by chapter two, and the student's just sitting there going "wait, why did we unsqueeze here? when do I use keepdim? what even is autograd and why are we turning it off for optimization?" That stuff stays blurry, and then you're trying to build with a hazy picture in your head. I wanted to slow down and actually plant those basics first, so the rest stops feeling like magic. Anyway — if you'd ever want a copy, I'd be happy to send you one, no strings.