Para ser sincero não existem "especialistas" dentro da área de programação. Só existem programadores normais e programadores que têm preguiça de estudar e se declaram "especialistas" por isso.
Todo "programador especialista" que eu já vi tinha conhecimento medíocre na tecnologia que ele era "especializado". A base de computação é universal, não existe especialização na base. Se tu tem base de computação tu tem base para programar com qualquer linguagem, usar qualquer ferramenta e trabalhar em qualquer área (incluindo segurança da informação).
Thread é thread em qualquer linguagem, socket é socket em qualquer linguagem etc.
O tal do "programador especialista" nada mais é que um programador que trabalha com uma linguagem específica, ele não tem mais conhecimento técnico do que o "programamador generalista", embora ele goste de fingir que tem.
Então respondendo a pergunta: nenhum dos dois. Falar de especialização só faz sentido se estivermos falando de áreas e não tecnologias específicas. Exemplo:
- Especialista em programação (CORRETO)
- Especialista em redes (CORRETO)
- Especialista em segurança da informação (CORRETO)
- Especialista em PHP (ERRADO!)
Esse último não faz sentido. A pessoa se dizer especialista em programação faz sentido, se dizer especialista em uma linguagem ou framework não...