I asked this question myself on hn a couple of months ago, as the Chassell Elisp Introduction just wasn't working for me. Someone suggested learning CL via Seibel's Practical Common Lisp [1] and then just refering to the Elisp docs, which is a bit of a round-the-houses approach, but I'm now half way through the Seibel and really enjoying it. Pitched at just the right level for me.
I started with a simple .org file. Whenever I encountered a problem, a question, or a confusing topic, I would simply add a todo heading.
Over time, I slowly learned Org-mode, then Babel, then transitioned to Org-Roam. I learned enough of Emacs Lisp, then learned Clojure, then tried other Lisps like Fennel. Today, I'm comfortably writing my own little elisp packages, sharing tips with my colleagues, chasing performance bottlenecks, and still learning.
Emacs includes a book, or maybe it's in the list of installable packages called An Introduction to Programming in Emacs Lisp (I think the package is called 'eintr') that does a pretty good job as an introductory lisp programing text and then gets deeper into the internal functions of Emacs.
By the later part of it I felt like I had a decent handle on Emacs Lisp and could read the code for packages I was interested in reasonably well.
[1] https://gigamonkeys.com/book/