There really is no magic, all you need is some math (matrices mostly) and nice quick code here and there...
Here are two very good reads about software 3D to get the brain going:
http://fabiensanglard.net/quake2/quake2_software_renderer.php
http://nothings.org/gamedev/thief_rendering.html
And here's my own 3D rasterizer. It's messy, inefficient and has weird model format and lots of hardcoded stuff. It was a homework. I use armadillo for matrices operations.
I'd not call myself at all experienced in 3D (or even 2D) graphics, but I know how to do C and C++ and the basic principles of 3D graphics so I wrote it with relative ease.
https://github.com/FRex/brender
It has just the basic triangle raster (done by iterating trough aabb and checking the barycentric coords, scanline would be better and faster but harder to code) with color interpolation and texture mapping (perspective correct one.. I think.. I don't remember now), some crappy shading (I don't remember which kind of shading and it was a little rushed too) and Z buffer and winding based culling.
It has no alpha, but alpha is no magic either, you just need to define the formula (or few) for computing the resulting pixel color based on alpha and destination current color instead of just overwriting it with the new one.
Of course then you get the usual issues of drawing back to front and so on, like in real 3D.
And I'd advise against doing it, just use a 3D API instead unless you want to learn for the sake of knowing.