Not having done it myself, my belief is that for a new LaTeX programmer it's easier to start to with the functions defined by loading expl3 (otherwise known as the LaTeX3 kernel, or l3kernel) than to first learn basic TeX programming and move up.
The reason for this is that expl3 gives you a very nice abstraction layer that is powerful and internally consistent. With TeX programming you very quickly have to move to learning ‘tricks’ to do rather simple things.
For example, if you're talking about two commands \foo and \baz, to make \foo a copy of \baz you write
\let\foo\baz
But what if you need to refer to them by name instead of control sequence? For example, you might be defining something to do this:
\defineacronym{baz}{BAZ}
\useacronym{baz} % => \textsc{\MakeLowercase{BAZ}}
This can be defined with
\makeatletter
\newcommand\defineacronym[2]{%
\@namedef{acronym@#1}{\textsc{\MakeLowercase{BAZ}}}%
}
\newcommand\useacronym[1]{%
\@nameuse{acronym@#1}%
}
\makeatother
So far so good. But to define a command like \copyacronym{foo}{baz}, you have to write:
\newcommand\copyacronym[2]{%
\expandafter\let\csname acronym@#1\expandafter\endcsname\csname acronym@#2\endcsname
}
This is easy to follow for a seasoned TeX programmer, but is not very nice for a new one.
In expl3 this would be written as:
\ExplSyntaxOn
\newcommand\copyacronym[2]{
\cs_set_eq:cc {acronym@#1} {acronym@#2}
}
\ExplSyntaxOff
The goal of expl3 is to make TeX programming more structured and therefore easier. We hope that this is the case even more so with new TeX programmers than with old ones.
For your final question, the answer is sort of. Bruno Le Floch has written the unravel package, which can certainly show you what's going on with expansion. After writing
\usepackage{unravel}
\def\baz{BAZ}
\unravel{\expandafter\let\csname foo\expandafter\endcsname\csname baz\endcsname}
it returns the following:
======== Welcome to the unravel package ========
"<|" denotes the output to TeX's stomach.
"||" denotes tokens waiting to be used.
"|>" denotes tokens that we will act on.
Press <enter> to continue; 'h' <enter> for help.
||
|> \expandafter \let \csname foo\expandafter \endcsname \csname baz\endcsname
[===== Step 1 =====] \expandafter \let
[===== Step 2 =====] \csname = \csname
|| \expandafter \let
|| \csname
|> foo\expandafter \endcsname \csname baz\endcsname
[===== Step 3 =====] \expandafter \endcsname
|| \expandafter \let
|| \csname foo
|| \expandafter \endcsname
|> \csname baz\endcsname
[===== Step 4 =====] \csname = \csname
|| \expandafter \let
|| \csname foo
|| \expandafter \endcsname
|| \csname
|> baz\endcsname
[===== Step 5 =====] \endcsname
|| \expandafter \let
|| \csname foo
|| \expandafter \endcsname
|| \csname baz\endcsname
|>
[===== Step 6 =====] \csname baz\endcsname =\baz
|| \expandafter \let
|| \csname foo
|| \expandafter \endcsname
|> \baz
[===== Step 7 =====] back_input: \expandafter \endcsname
|| \expandafter \let
|| \csname foo
|> \endcsname \baz
[===== Step 8 =====] \endcsname
|| \expandafter \let
|| \csname foo\endcsname
|> \baz
[===== Step 9 =====] \csname foo\endcsname =\foo
|| \expandafter \let
|> \foo \baz
[===== Step 10 =====] back_input: \expandafter \let
||
|> \let \foo \baz
[===== Step 11 =====] \let \foo
|| \let \foo
|> \baz
[===== Step 12 =====] Set \foo=macro:->BAZ
||
|>
[===== End =====]
As you can see, even with a simple case it gives you quite a mouthful. (An easy to digest one, but even still.) Especially when debugging expl3 as a new user, this may only be useful in certain situations.
LaTeX3gives new features to deal with expandability. When studying it, I have to make a strategic decision: should I focus only on studyingl3expanor turn back and start with the native TeX commands? – ALOUI Feb 18 '16 at 00:59l3expanis now obsolete (as of 2014-09-06, if not earlier): you want to load/useexpl3. But I doubt it's ever 'wrong' to start with TeX. As for #3, there are many\tracing*commands. – jon Feb 18 '16 at 01:49l3expanon it's own to requiring all ofexpl3be loaded together. – Joseph Wright Feb 18 '16 at 07:17