A simplicidade sempre melhora a legibilidade?
Eu diria, talvez com um pouco de controvérsia, absolutamente não .
Você poderia me dar uma classe com 200 funções-membro em sua interface pública, e pode ser a interface pública mais humanamente legível por aí. Pode ser uma alegria apenas ler casualmente esse código e sua documentação. No entanto, eu não chamaria isso de "simples", porque, apesar da legibilidade, eu teria que me preocupar com a forma como todas essas funções interagem umas com as outras e, potencialmente, tomar cuidado com casos complicados resultantes de uso indevido.
Eu preferiria uma classe com 20 funções-membro que não eram tão fáceis de ler para 200, porque "legibilidade" não é a principal prioridade para mim em termos de prevenção de erros humanos e melhoria da capacidade de manutenção do código (a facilidade com que nós podemos mudar isso, ie).
No entanto, tudo isso depende de nossa definição pessoal de "simplicidade". "Legibilidade" normalmente não varia que descontroladamente entre nós, a menos que alguém tenha adquirido tanto conhecimento e fluência que consideram regex a ser muito "legível", por exemplo, esquecendo o resto de nós meros mortais.
Simplicidade
Houve um tempo, há muito tempo, em que pensei que "simplicidade" significava "o mais fácil de ler possível". Então, eu escreveria o código C com muitas funções de conveniência, tentando melhorar a sintaxe e facilitar a leitura e gravação das coisas.
Projetei bibliotecas muito grandes, ricas e de alto nível como resultado, tentando modelar uma função para todo pensamento humano natural: ajudantes sobre ajudantes sobre ajudantes, tudo para moldar o código do cliente para uma sintaxe mais legível. O código que escrevi na época pode ter sido o mais "legível", mas também o mais "inatingível" e "complexo".
Lisp
No entanto, tive uma breve paixão pelo LISP em meados dos anos 90 (retardatário). Isso mudou toda a minha idéia de "simplicidade".
LISP não é a linguagem mais legível. Felizmente, ninguém pensa que extrair CDRs e CARs enquanto invoca uma função recursiva com um monte de parênteses aninhados é muito "legível".
No entanto, depois de lutar para envolver meu cérebro na estranha sintaxe da linguagem e em maneiras totalmente recursivas de fazer as coisas, isso mudou permanentemente minha ideia de simplicidade.
O que descobri com o código que escrevi no LISP é que não estava mais cometendo erros sutis, embora a astúcia de pensar dessa maneira tenha me cometido erros mais flagrantes (mas esses são fáceis de identificar e corrigir). Eu não estava entendendo mal o que uma função estava fazendo e perdendo um efeito colateral sutil e imprevisto. Eu estava tendo um tempo mais fácil em geral, fazendo alterações e escrevendo programas corretos.
Após o LISP, a simplicidade para mim passou a ser minimalismo, simetria, flexibilidade, menos efeitos colaterais, menos funções mais flexíveis que se combinam de uma infinita variedade de maneiras.
Apreciei a mentalidade de que o código mais confiável de todos é o código que não existe. Embora seja apenas uma métrica grosseira, costumo ver o potencial de falta de confiabilidade do código com base em sua quantidade. Buscar a máxima conveniência e legibilidade sintática tende a aumentar essa quantidade por um grande fator.
Minimalismo
Com a mentalidade LISP incorporada em mim, passei a preferir APIs minimalistas. Prefiro uma biblioteca com menos, mas mais confiáveis, funções flexíveis que sejam menos convenientes e com potencialidade mais difícil de ler do que uma que ofereça um monte de ajudantes "convenientes" e que possam facilitar a leitura do código, mas potencialmente tropeçar mais problemas com falta de confiabilidade e surpresas resultantes de mal-entendidos sobre o que uma dessas milhares de funções faz.
Segurança
Outra coisa sobre o LISP era a segurança. Ele promoveu efeitos colaterais mínimos e funções puras, e foi aí que eu não me via mais cometendo erros sutis, mesmo que a dificuldade de ler e escrever no idioma aumentasse os erros mais flagrantes que eu conseguia detectar 10 segundos depois.
Funções puras e estados imutáveis se tornaram preferíveis a mim sempre que eu podia pagar, mesmo que a sintaxe de:
sword = sharpen(sword)
... é um pouco menos direto e distante do pensamento humano do que:
sharpen(sword)
Legibilidade VS. Simplicidade
Mais uma vez, o LISP não é a linguagem mais "legível". Ele pode incluir muita lógica em uma pequena seção de código (possivelmente mais de um pensamento humano por linha). Idealmente, prefiro um pensamento humano por linha para "legibilidade", mas não é necessariamente para "simplicidade".
Com esse tipo de definição de "simples", às vezes "simples" pode, na verdade, competir um pouco com "legível". Isso está considerando coisas mais do ponto de vista do design de interface.
Uma interface simples significa que você precisa aprender muito menos coisas para usá-la e, potencialmente, tem maior confiabilidade e menos problemas como resultado de seu minimalismo. Uma documentação abrangente sobre o assunto pode caber em um livreto, e não em um grande volume de livros. No entanto, pode exigir mais trabalho pesado e produzir código menos legível.
"Simples" para mim melhora nossa capacidade de entender a funcionalidade em nosso sistema em um nível amplo. "Legível" para mim melhora nossa capacidade de conectar cada pequena linha de código à linguagem natural e ao pensamento e pode acelerar nossa compreensão do que uma linha de código faz, especialmente se não somos fluentes na linguagem.
Regex é um exemplo do que considero "extremamente simples". É "simples demais e ilegível" para o meu gosto pessoal. Há um ato de equilíbrio para mim entre esses extremos, mas a regex tem essa qualidade de simplicidade semelhante à LISP como eu a defino: minimalismo, simetria, incrível flexibilidade, confiabilidade etc. O problema para mim com a regex é que é tão simples que tornou-se tão ilegível ao ponto que acho que nunca vou me tornar fluente nisso (meu cérebro simplesmente não funciona dessa maneira e invejo as pessoas que podem escrever código regex fluentemente).
De qualquer forma, essa é minha definição de "simplicidade", e é completamente independente da "legibilidade" e às vezes pode até interferir na outra, levando a um ato de equilíbrio entre uma biblioteca mais "sintaticamente conveniente" e legível, mas maior, ou uma "biblioteca sintaticamente" biblioteca inconveniente ", menos legível e ainda menor. Eu sempre achei as verdadeiras prioridades de "conveniência da compreensão" e de "manutenção" alinhadas com as últimas, com a forte preferência pelo minimalismo, mesmo a algum custo de legibilidade e sintaxe humana mais natural (mas não ao ponto de regex) . YMMV.