Hoje quero especular sobre a complexidade que nos cerca (pessoas) e sobre nossa capacidade de trabalhar com ela. Não sobre a complexidade que escrevem nas situações de estado civil nas redes sociais, como “tudo é complicado”, mas sobre a complexidade dos sistemas organizacionais e técnicos (aliás, na minha opinião, acabou sendo um bom nome para uma especialidade universitária). Não pretendo ser original e, além disso, não pretendo ser verdadeiro (especialmente porque, pelo menos na metade, estou aqui para rebaixar, mexer e brincar). Algum desse raciocínio eu já fiz em algum lugar dos comentários, mas para mim essa questão não está encerrada. Portanto, a vida sempre me lança vários exemplos ilustrativos que me incentivam a pensar mais longe. Apesar de sexta-feira, não foi para ser uma leitura divertida, não haverá fotos engraçadas, se houver - avisei. Se você só quer ler uma frase,e leia o resto dos divertidos artigos de sexta-feira - aqui está: "Simplifique a complexidade onde pode ser feito, lide com a complexidade onde ela não pode ser simplificada e ganhe experiência e a capacidade de distinguir o primeiro caso do segundo."
Algumas citações do excelente:
Compreender é simplificar.
Simplificar não é entender.
A simplicidade requer design e bom gosto.
Mantenha-o o mais simples possível, mas não mais simples.
A complexidade está em toda parte ao nosso redor. Usamos dispositivos técnicos sofisticados, honramos um código penal complexo, dentro de nós um sistema imunológico complexo combate o coronavírus, os seres vivos unicelulares mais simples carregam organelas incrivelmente complexas, a lei mais simples de Newton acaba sendo uma simplificação de uma lei muito mais complexa em velocidades não relativísticas e sobre a complexidade dos Modelos Padrão e todos os tipos de mecânica quântica diferente, geralmente fico quieto.
A complexidade é sempre uma determinada ordem, um certo sistema de elementos em interação e, em plena conformidade com a definição deste conceito básico, a complexidade aumenta quando o número de elementos aumenta e quando aumenta o número e a variedade de conexões entre esses elementos. Talvez complexidade seja sinônimo de ordem, a antítese do caos?
A vida em geral é um aumento espontâneo da complexidade dentro de nós devido a uma diminuição da complexidade externa, como deveria ser para qualquer sistema dissipativo decente. A energia é redistribuída de tal forma que, para aumentar a complexidade, parte dela precisa ser gasta, mas a organização resultante, a ordem resultante, dá "acesso" a grandes quantidades de energia. Esta é, penso eu, a razão evolucionária para o aumento "espontâneo" da complexidade da vida.
Os sistemas complexos ao nosso redor, a complexidade da organização da matéria e da energia ao redor, que se quer dissipar, levam a um aumento da complexidade do consumidor e ainda mais ao longo da cadeia. Uma flor em que se chega ao néctar apenas com a ajuda de um longo tronco provoca o
Somos programadores, criamos sistemas de software que, como o tronco daquela borboleta, devem ser complicados para automatizar soluções semelhantes a processos complexos e astutos da vida.
Somos programadores, criamos complexossistemas de software, e não importa o que digam, gostamos de criar essa complexidade, mas há uma nuance que nos distingue dos criadores de quaisquer outros sistemas técnicos complexos.
O criador de um material complexo e dispositivo técnico é limitado pela resistência, fricção e outros materiais que abafam ligeiramente o vôo de sua imaginação. A força de atrito do programador não se importa ou limita (a menos que ele seja o desenvolvedor do melhor simulador de fraturamento hidráulico do mundo ), a força e o peso do dispositivo também, e a partir daqui, na minha opinião, surge o principal problema.
E está no fato de que é muito fácil para nós, programadores, criar complexidade. É muito fácil para nós. Ctrl + C e Ctrl + V, uma nova função, um novo módulo, uma nova biblioteca, uma nova camada de abstração, macros-shmakros, pré-processadores-pós-processadores, adaptadores, conversores e fachadas - tudo isso vai funcionar, você só tem que adicionar mais frequência e RAM, e nenhum redutor de fricção necessário. No mundo físico criado, nem tudo é tão simples. Onde, na produção industrial, estão os análogos não apenas da programação genética, mas pelo menos até de macros simples do Lisp?
Novamente. É muito fácil na programação adicionar complexidade e muito difícil na programação reduzir a complexidade. Além disso, ninguém gosta daqueles que reduzem a complexidade da programação, porque sempre quebram tudo durante a refatoração.
Não estou dizendo que código complexo seja uma coisa ruim. O código automatiza uma tarefa da vida real, ele a reflete em seus modelos de dados, o código não pode ser mais simples do que a vida. A complexidade do código cresce junto com a complexidade do problema, mas um desenvolvedor analfabeto adiciona muito mais complexidade ao código do que a complexidade do problema.
Um desenvolvedor competente se abstém de introduzir complexidade no código. Não é à toa que os grandes disseram que, como depurar é mais difícil do que escrever código, você não conseguirá depurar o código que escreveu no limite da complexidade disponível para você. Mas eu também diria que um desenvolvedor competente não cria soluções mais difíceis do que 84% de sua capacidade de lidar com a complexidade.
A incapacidade de projetar futuras mudanças imprevisíveis nos requisitos da vida leva ao fato de que o código deve ser reescrito e retrabalhado. Olá, eu sou seu boné. Mas você não pode reescrever sistemas de software complexos do zero só porque não gosta deles por sua complexidade.
Complexidade e confusão são duas coisas diferentes. Como sempre digo aos alunos que trouxeram o laboratório de outra pessoa e têm certeza de que entenderam (dois frames recentemente disseram que eles achavam que deveriam aprender a explicar o código de outra pessoa, e não escrever o seu próprio - explique, Karl, nem mesmo edite e desenvolva !), é impossível entender que você não entende algo se você não entende. Deste lado do limiar indutivo, a situação “acho que entendi” é indistinguível da situação “entendi mesmo”.
Se alguém vier até você e disser: "É muito difícil para você aqui, escreveremos do zero" - você não deve permitir que ele escreva, primeiro você deve demonstrar que ele pode refatorar o sistema antigo. Se você não consegue lidar com a complexidade que já possui, pelo método de refatoração gradual, então quando você começar a escrever você mesmo, irá torcer a complexidade para ainda pior e no final você não resolverá o problema. E porque? Porque é impossível entender o que exatamente você não entende e subestima, por definição.
Exagerando: até mesmo inventar a bicicleta certa não funcionará na primeira vez. A primeira bicicleta será curva e oblíqua, com três marchas conectadas aos pares, como nas clássicas fotos de meninas designers. Mas irá levá-lo ao nível de dificuldade que você precisa para trabalhar ao construí-la, e a segunda bicicleta já sairá sensata. Eles escrevem sua própria classe de strings não para aprender a sintaxe, mas para obter uma porção vital da complexidade.
A complexidade de um mesmo código, da mesma solução, depende muito de quão complexo ele já é no sistema, e a complexidade do sistema não é a soma das complexidades dos subsistemas. E isso é parte do problema ao trabalhar com um cliente ou qualquer outro observador externo. Você provavelmente já ouviu muitas vezes: "É fácil de fazer, é apenas {ação X} {dentro do sistema Y}, já existe {dentro do sistema Z}!". Isso é o resultado de subestimar a complexidade sistêmica, quando uma pessoa acredita que se algo é fácil de fazer separadamente de todo o resto, então é fácil fazê-lo dentro de um grande sistema já pronto. Se o programa precisa implementar A, B, C, D, E e F, e eles são todos aproximadamente da mesma complexidade, então seria uma forte subestimação pensar que eles serão construídos ao mesmo tempo.
O principal para um programador experiente é a capacidade de gerenciar a complexidade. Normalmente nós apenas adicionamos complexidade (você não pode apenas refatorar), mas ai de quem não consegue refatorar (na verdade, simplificação!). Então, em vez de colocar as coisas em ordem e simplificar, esse desenvolvedor enrola muletas e não consegue parar, porque muletas são mais fáceis de escrever. Com o tempo, fica cada vez mais difícil escrever muletas, mas o truque é que a cada momento é cada vez mais difícil escrever outra muleta, mas ainda é sempre mais fácil do que limpar os estábulos e colocar as coisas em ordem. E sempre há essa ilusão de que, devido aos prazos, a solução ideal é escrever muletas. Infelizmente, esta é a solução ideal no momento, mas muito abaixo do ideal no longo prazo. Programação gananciosa.
A capacidade de lidar com a complexidade, antecipar as consequências e ver as relações fora do objeto em questão é em si um grande valor profissional, é assim que os programadores chegam aos gerentes e chefes. Em certo sentido, prever o comportamento de um sistema complexo, antecipar as consequências de novas conexões de sistema emergentes, "depuração mental" e "teste para casos extremos", "a que isso levará", como habilidade profissional dos programadores, incentiva sua crescimento em gerentes, juntamente com habilidades gerais de abstração, indução e dedução. É verdade que a reflexão e a introspecção, a introversão, como várias outras competências profissionais dos programadores, pelo contrário, os limita neste crescimento.
Como você aprende a lidar com a complexidade? Não tenho outra receita além de um conselho para aprender a ver o que funciona para essa habilidade e o que funciona contra ela. Mas em qualquer caso, acho que tudo começa com a educação mais básica. Estudos. A repetição é a mãe da aprendizagem. Sou professor, tenho uma deformação profissional: repetir a mesma coisa duas vezes. Sou professor, tenho uma deformação profissional: repetir a mesma coisa duas vezes. Eu
Freqüentemente, há muitas reclamações sobre o ensino em geral e o ensino na escola e na universidade em particular sobre o fato de que algo irrelevante está sendo ensinado, os cérebros estão entupidos de conhecimentos e habilidades desnecessários. Minha filha tinha cubos ocos com buracos de geometrias diferentes, e apenas figuras menores com a forma correspondente caíam dentro. Alguém acha que uma criança que é ensinada a selecionar uma chave da forma geométrica desejada precisará das habilidades de um bicho-papão na idade adulta?
Acho que uma parte muito séria da educação, e desde o início até a defesa da primeira dissertação, é treinar o cérebro para lidar com a complexidade. Quando uma criança na escola aprende a multiplicar números de três dígitos em uma coluna em uma folha de papel, ninguém em sã consciência pensará que essa habilidade será útil para ela na vida. Multiplicar corretamente dois números de três dígitos em uma coluna é um exercício na capacidade de forçar o cérebro, manter alguns números em mente e não perder a concentração por um determinado período de tempo. Primeiro adicione uma coluna, depois multiplique e depois divida. Aumentando a complexidade. A capacidade de se esforçar, a capacidade de trabalhar.
Esta é a qualidade certa? Depende de quem você deseja criar! Se for um "usuário qualificado", é desnecessário. Se "um homem criador", então, eu acho, é necessário. Na vida, a capacidade de se multiplicar em uma coluna não é útil, na vida será útil ser capaz de multiplicar os mesmos números no telefone, se você precisar de uma resposta exata - e a capacidade de deixar apenas 1 dígito significativo de cada número em sua mente sem um telefone e estimar aproximadamente a ordem do valor obtido. E isso, aliás, também nada mais é do que a capacidade de trabalhar com complexidade: tomar decisões rápidas sobre dados complexos, simplificando os dados de entrada e usando estimativas grosseiras. Mas se alguém acredita que em seu trabalho não precisará se concentrar e, sem erros, realizar algumas operações de rotina semelhantes, então muito provavelmente não trabalhará com a cabeça nesta vida.
Concluindo isso, é claro, um fluxo de pensamentos mal ordenado, quero apenas repetir mais uma vez o apelo feito no primeiro parágrafo. Aprenda a simplificar a complexidade onde isso pode ser feito, aprenda a lidar com a complexidade onde ela não pode ser simplificada e desenvolva a experiência e a capacidade de distinguir a primeira da segunda.