Notas de Eric Lippert Os perigos da programação em C++:
Costumo pensar no C++ como minha linguagem de programação pessoal, a Pit of Despair. O C++ não gerenciado torna muito fácil cair em armadilhas. Pense em buffer overruns, vazamentos de memória, double frees, incompatibilidade entre o alocador e o desalocador, uso de memória liberada, inúmeras maneiras de destruir a pilha ou o heap – e esses são apenas alguns dos problemas de memória. Há muito mais “pegadinhas” em C++. Muitas vezes, o C++ o joga no poço do desespero e o usuário precisa subir a colina da qualidade. (Não confunda com escalar os Penhascos da Insanidade, isso é diferente).
Isso é O problema com o C++. Ele faz um péssimo trabalho ao protegê-lo de seu pior inimigo – o senhor mesmo. Quando escreve código em C++, o senhor está sempre rondando o poço do desespero, a apenas um passo em falso de mergulhar para a perdição.
Não seria bom usar uma linguagem projetada para evitar que o senhor caísse no poço do desespero? Mas evitar modos de falha horríveis e desastrados não é uma meta particularmente louvável. Não seria ainda mais melhor se o senhor usasse uma linguagem que lhe permitisse cair no poço do sucesso?
O poço do sucesso: em contraste com um cume, um pico ou uma jornada por um deserto para encontrar a vitória por meio de muitas tentativas e surpresas, queremos que nossos clientes simplesmente caiam em práticas vencedoras usando nossa plataforma e nossas estruturas. Na medida em que facilitamos o surgimento de problemas, fracassamos.
Rico Mariani cunhou esse termo ao falar sobre design de linguagem. O senhor pode abrir mão de algum desempenho ao optar por codificar em C#, Python ou Ruby em vez de C++. Mas o que o senhor recebe em troca é uma probabilidade muito maior de evitar o miserável Poço do Desespero – e a oportunidade de cair no muito mais desejável Poço do Sucesso.
Como Brad Abrams aponta, esse conceito vai além da linguagem. Uma API bem projetada deve também permitir que os desenvolvedores caiam no poço do sucesso:
[Rico] nos aconselhou a pensar em como podemos criar plataformas que levem os desenvolvedores a escrever códigos excelentes e de alto desempenho, de modo que os desenvolvedores simplesmente façam a “coisa certa”. Esse conceito realmente ressoou em mim. É o ponto-chave de um bom design de API. Devemos criar APIs que orientem e apontem os desenvolvedores na direção certa.
Acho que esse conceito se estende ainda mais, para aplicativos de todos os tipos: grandes, pequenos, web, GUIs, aplicativos de console, o que for. Eu sempre disse que um sistema bem projetado torna fácil fazer as coisas certas e incômodo (mas não impossível) fazer as coisas erradas. Se projetarmos nossos aplicativos adequadamente, nossos usuários deverão ser inexoravelmente atraídos para o poço do sucesso. Alguns podem demorar mais do que outros, mas todos devem chegar lá eventualmente.
Se os usuários não forem não estão obtendo sucesso por conta própria – ou se não estão obtendo sucesso dentro de um período de tempo razoável – a culpa não é deles. É nossa culpa. Não facilitamos o suficiente para que eles caíssem no poço do sucesso. Considere seu projeto um Grande escavação: seu trabalho é rearquitetar constantemente sua linguagem, sua API ou seu aplicativo para tornar esse poço de sucesso cada vez mais profundo e amplo.