Um primeiro desdobramento mais simples ocorre na referência [2], por exemplo. Nela, o autor considera três categorias distintas:
Software cliente-servidor: software desenvolvido para rede ou internet. São aplicações constituídas de dois lados: o cliente e o servidor.
Apesar de ser uma classificação interessante, essa divisão considera tipos de software como um possível sinônimo para arquitetura de software. Na minha opinião, atualmente, essa classificação tornou-se confusa, pois a maioria dos softwares hoje em dia possuiu alguma funcionalidade de comunicação com um servidor. Por exemplo, um game singleplayer offline é um software aplicativo, mas um singleplayer online, que solicita login antes de jogar, é um software cliente-servidor? Essa classificação permite dúvidas como esta.
Uma observação importante é preciso ser feita quanto ao tipo de software de base, ou de sistema. Os principais exemplos são, de fato, os sistemas operacionais (SO). Mas eles não são os únicos. Ambos os autores das referências [1] e [2] citam as linguagens de programação como outro tipo de software de base. Mas como assim? Linguagem de programação é um software. Por isso mesmo que não coloquei essa informação anteriormente, pois acredito que ela esteja confusa.
Faz-se necessário o esclarecimento de que existem linguagens de baixo e alto nível. As de baixo nível são mais próximas ao código que uma máquina entende (composta por números 0 e 1), enquanto as de de alto nível são mais próximas do desenvolvedor. Para saber mais sobre isso, leia este post.
As últimas são sofisticadas, pois podem realizar várias instruções como um único comando, focadas em ser amigável ao desenvolvedor. Elas são usadas com um IDE (ambiente de desenvolvimento integrado), que equivale a uma ferramenta de desenvolvimento. Um programa que gera programas. Neste sentido, uma IDE é um software aplicativo. Ele depende de um sistema operacional para ser instalado e rodar.