The first type work on some aspect of a core blockchain protocol, such as its networking layer (peer-to-peer communication) or the consensus layer (coming to a distributed consensus about the current state of the blockchain). They normally need a strong background in lower-level programming languages, distributed systems and cryptography.
The second type of developers write back-end applications that run on a blockchain (these usually take the form of smart contracts). For example, after ethereum burst onto the blockchain scene last year, the demand for programmers who understood its native programming language Solidity has gone through the roof. The preferred language for writing ethereum smart contracts, Solidity developers normally need a background in programming, security and software testing.