The concept of a variable is not hard in and of itself, but it is the first conceptual hurdle for students.
The problem is that in common usage we use the same symbol for comparison and immutable facts as we use for assignment. By the time we start kids with computer programming they are steeped in algebra where "=" means "is the same as".
1 + 1 = 2
5 - 3 = 2
(x+y)² = x² + 2xy + y²
Being steeped in algebra, when they see this construct:
x = x + 10
They automatically want to reduce it algebraically and solve for x
(x-x) = 10
which reduces to
0 = 10
which is nonsense, and they realize that, and get confused.
When programming most languages use "=" as an assignment, where it should be read as "becomes equal to". Back when I started (in the 8 bit days before PC's), BASIC handled this by requiring the "LET" statement, so it read more like algebra, but the LET keyword was a cue that we were making an assignment.
10 LET X = 10
15 LET X = X + 23
20 IF x = 33 THEN GOTO BLABLABLA
The LET notation was cumbersome, so most dialects of BASIC introduced the "implied let". If you started the statement with a variable, it was implicitly a "LET" statement.
Algol, Pascal, and some other language of the day introduced the ":=" operator (read as "becomes equal to") to keep a distinction between assignment and comparison.
x := 10;
x := x + 23;
if x = 33 then writeln("Bla bla bla");
C and its descendents were created for brevity rather than easy reading. They distinguish assignment from comparison by having the most common operation require the fewest keystrokes. Once you started programming in C, you were already thinking like a programmer rather than like an algebra major.
x = 10;
x += 23;
if (x == 33) fprintf(stdout, "Bla bla bla");
Spaghetti code is often the result of not understanding the problem, although an attempt to treat variables as immutables when it is not appropriate would certainly contribute. Even experienced programmers will create spaghetti code if they don't understand the problem, or if the problem changes sufficiently over time. If you don't believe me, walk into any enterprise shop with custom processes and start reading code.