System programming is a usually a very different kind of activity from application programming, and most programmers tend to specialize in one or the other areas. Its most distinctive characteristic is the awareness of hardware upon which the software runs, which may range from the explicit form of writing device drivers, to the use of assembly language, to the design of compiler algorithms that best exploit hardware characteristics.
In system programming, often limited programming facilities are available. The use of automatic garbage collection is not common and debugging is sometimes hard to do.