It seems to me your problem is not with the imaginary numbers per se, but with the stipulation that $i$ is such an abstract object that $i^2=-1$.
And yes, as mentioned in the comments, you can just define $\mathbb C:=\mathbb R^2$ with peculiarly defined addition/multiplication, then set $i:=(0,1)$ and verify that it satisfies $i^2=-1$, but this is a different approach and it still does not make it clear why can we take some abstract $i$ out of thin air and impose $i^2=-1$ on it.
The proper way to explain that particular wording is based only on the addition/multiplication operations.
Let's start simple with $\mathbb N_0=\{0,1,2,\ldots\}$ with the addition (+) operation. As you have a CS background, you can imagine it in terms of OOP as a class with a member function "plus".
What is a negative one (and $\mathbb Z$), then? It's such an entity that sums with $1$ to zero. We can take an arbitrary object $\xi$ (denoted by $(-1)$) outside $\mathbb N_0$ and try to define a new set (class) $\mathbb N_0 \cup \{ \xi \}$ with a new overloaded (in OOP terms) function "plus", which acts just like $\mathbb N_0$'s "plus" on $\mathbb N_0$, but for $\xi + a$ returns the element previous to $a$.
You should now immediately notice that this "function" is undefined at $\xi+\xi$, because that should sum to 0 when added to 2, while no such element exists in the set (class) we're working - $\mathbb N_0\cup\{\xi\}$. To make it work, we have to add another artificial element from thin air - denoted $(-2)$ - to the set and define $(-1)+(-1):=-2$. But that still does not work, because now $(-2)+(-1)$ is undefined on $\mathbb N_0\cup\{-1,-2\}$. As you notice, we can go like this for arbitrarily long time and never get a properly defined "plus" function, which extends $\mathbb N_0$'s "plus" (i.e. acts like the normal plus on the $\mathbb N_0$ subset) and satisfies $(-1)+1=0$.
So what we want is an extension of $\mathbb N_0$ which supports a total function "plus" in the sense described above, but nothing more! There are a lot of these, but there's a unique -- up to isomorphism (of monoids, but let's not go there) -- "smallest" one, that we denote by $\mathbb Z$. I have no space to delve into details here, but I hope you can agree that the set you intuitively know as $\{\ldots,-2,-1,0,1,2,\ldots\}$ works here - it's "plus" function works like $\mathbb N_0$'s "plus", satisfies $(-1)+1=0$, and you cannot take any elements from $\mathbb Z$ without breaking these properties.
Now let's return to $i$. By analogy with above, here we have a set $\mathbb R$, but now the key operations include not only "plus", but "multiply" too.
Again, take an arbitray object outside $\mathbb R$ (formally, you can even take the set $\mathbb R$ itself!) and denote it by $i$. Construct the set $\mathbb R\cup\{i\}$ and try to define "plus" and "multiply" on it so that they coincide with the respective functions on $\mathbb R$, but also satisfy $i\cdot i=-1$.
You'll immediately notice that you need to add an element $2\cdot i$ to the set in an attempt to make the function "multiply" total, just like you had to add $(-1)+(-1)$ to $\mathbb N_0$ to get to $\mathbb Z$. Similarly, you'll have to add $-1$, because the multiplication function has to be defined on $i$ and $(-1)$, too.
The "smallest" set containing $\mathbb R$, on which "plus" and "multiply" are total functions restricting to the standard real addition and multiplication, with the additional condition that $i\cdot i=-1$, exists, and is denoted by $\mathbb C$.
To continue the OOP analogy, this is now only an "interface" - it just asserts that the object has methods satisfying some properties. To get an "implementation" of it, you have multiple options:
- Probably the easiest one for you is to use $\mathbb C:=\mathbb R \times \mathbb R$ and define $(+),(\cdot)$ in the familiar way.
- Another option (as mentioned in another answer) is to start with the polynomials $\mathbb R[x]=\{a_0+a_1x+\cdots+a_nx^n:n\in\mathbb N,a_i\in\mathbb R\}$ and consider any two of them equal if they differ by a factor of $x^2+1$.
But you didn't ask about the implementation, I feel, you asked about the interface.