O conceito de complexidade computacional é importante para desenvolvedores de software? [fechadas]

11

Fiquei com a impressão de que os conceitos de complexidade de tempo e memória são obrigatórios para os graduados em cursos de computação, mas, tendo estudado engenharia, não tenho conhecimento se esse é o caso. Recentemente, fiquei surpreso ao entrevistar alguns graduados de uma faculdade local que nem conhecem o conceito. Acho que minha pergunta é:

O conceito de complexidade computacional é importante para desenvolvedores de software? E deveria ser ministrado em cursos de graduação?

Muhammad Alkarouri
fonte
1
Para explicar a pergunta usando um exemplo: os graduados que me deparei não sabem o que O(n^2)significa.
Muhammad Alkarouri
1
Interessante questão relacionada: programmers.stackexchange.com/q/20832/6184
Muhammad Alkarouri

Respostas:

12

Na maioria das universidades, presumo (espero!) Que a complexidade do tempo e da memória seja definitivamente parte de seus cursos.

Agora, essas "complexidades" são um tópico muito elástico. Se as pessoas realmente devem conhecer toda a teoria como "ZPP é a classe de complexidade dos problemas de decisão que podem ser resolvidos com erro zero em uma máquina de Turing probabilística em tempo polinomial". e esse tipo de coisa é questionável. Pessoalmente, considero essas teorias avançadas irrelevantes para o desenvolvimento de software.

Pelo contrário, considero que todo desenvolvedor deve estar ciente da complexidade de tempo / espaço das estruturas de dados e algoritmos que eles usam.

dagnelies
fonte
8

Muitos iniciantes sofrem de obsessão por micro-otimização. Aprendizagem comp. A complexidade direciona os alunos para uma maneira muito mais prática de estimar o desempenho e a escalabilidade, na minha experiência.

mpartel
fonte
6

Pelo que vi, parece que a notação O-grande e a complexidade do tempo e da memória são muito enfatizadas na educação formal em ciência da computação ... mesmo sendo autodidata, essa percepção se baseia em ouvir e ler o que as pessoas com essa educação têm. fale e escreva.

Embora eu acredite que as idéias e conceitos gerais sejam importantes, não acredito que a formalização dela (como notação O-grande e várias terminologias) seja tão importante quanto a questão, exceto para os propósitos de comunicação. Só porque alguém não está familiarizado com a notação formal e a terminologia não significa que não pode ver como e por que um algoritmo seria mais rápido que outro em um caso específico. As pessoas podem ver que o tempo gasto para pesquisar uma árvore binária balanceada está relacionado ao logaritmo da base 2 do número de nós, sem primeiro aprender sobre a teoria da complexidade em qualquer sentido formal, se eles entenderem como a árvore funciona e se tiverem uma compreensão razoável da alta matemática escolar. É importante saber quando prestar atenção à complexidade e ao uso da memória e, no entanto, considerar os casos típicos e os piores ... mas algumas pessoas não.

A notação e a terminologia se tornam importantes para a comunicação. Eles fornecem uma boa maneira de transmitir uma quantificação do desempenho de um algoritmo para outra pessoa. Como aparece em documentos e explicações com frequência, é útil ter pelo menos um entendimento vago disso, para facilitar o acompanhamento.

Portanto, sim, os conceitos são importantes (embora menos quando os recursos e o tempo são amplos, mas os dados não são). Mas, embora os conceitos sejam importantes, a formalização deles geralmente não é tão importante - e é preciso lembrar que a notação e a terminologia não são as mesmas que os próprios conceitos.

Editar:

Eu não pretendia entender os conceitos com tanto detalhe quanto alguém que estudou formalmente, mas muitas das idéias gerais fazem sentido. Eu acho que há valor em estudar formalmente isso, mas parte desse valor ainda pode existir sem.

Quanto à introdução dos conceitos (fora do estudo formal), acho que um bom começo é incentivar as pessoas a pensar em quanta memória adicional as estruturas de dados têm, quais etapas os algoritmos envolvem e como essas coisas mudam com dados diferentes.

Também ajuda a considerar situações e mudanças hipotéticas, como considerar o que acontece se uma árvore é equilibrada versus o que acontece se for o mais desequilibrado possível, ou quantos níveis na árvore a maioria dos nós seria ou quantos outros nós podem segure se a profundidade aumentar um nível. De qualquer maneira, esse modo de pensar é útil para programadores, não apenas quando se olha para a complexidade; e se aplicado ao pensamento sobre o desempenho de algoritmos e estruturas de dados em diferentes circunstâncias, naturalmente aponta na mesma direção que um exame mais formal da complexidade.

Dmitri
fonte
Vista alternativa interessante. Você pode explicar como introduziria os conceitos? Ou como você os entendeu? Isso pode apontar para uma maneira alternativa de obter o entendimento necessário.
Muhammad Alkarouri
1
@ MuhammadAlkarouri Eu editei minha resposta para resolver isso um pouco.
Dmitri
4

sim

Compreender os conceitos básicos de complexidade é importante e deve ser algo que você aprende na graduação. Na verdade, acho que isso geralmente é abordado em qualquer classe que ensina sobre estruturas de dados. Eu consigo entender os graduados que não entendem ou não se lembram, mas não consigo vê-los não tendo aprendido o básico da complexidade.

Atualização: Por que é importante

Eu estava em uma migração de banco de dados em um trabalho específico. Tínhamos um prazo para quando a migração precisava ser concluída. A pessoa que escreveu o roteiro não teve nenhum fundamento na complexidade. Infelizmente, ninguém mais olhou atentamente para a lógica que ele usou no script. Não me lembro de outros detalhes além de ele usar um loop duplamente aninhado em vez de uma hashtable. Após uma semana de execução do script continuamente, analisamos a lógica e percebemos o problema. Demorou cerca de 5 horas para concluir após a alteração. Quase perdemos o prazo para conclusão da migração como resultado de alguém não entender a complexidade.

O ponto é que é fácil tornar acidentalmente algo com ordens de magnitude mais lentas ou que sempre fica sem memória antes que o trabalho seja concluído. Enquanto máquinas mais rápidas com mais memória podem atenuar pequenos erros, elas geralmente não podem atenuar problemas de complexidade.

dietbuddha
fonte
Mas, ainda assim, a pergunta é "isso é importante?". Porque, mesmo que iterem na lista de pares, isso significa que o produto final não está fazendo o que deveria? Isso significa que é lento? Isso significa que eles não realizaram o trabalho para o qual são pagos?
Yam Marcovic
Se o programa terminar em 2 dias, mas demorar 2 anos, eu diria que eles não realizaram o trabalho para o qual foram pagos.
dietbuddha
O problema que você descreveu não era tanto um problema do desenvolvedor ruim, mas um problema no processo de tomada de decisão que levou um programador não qualificado a ser responsável por esse programa.
Yam Marcovic
Ou talvez um processo de tomada de decisão que leve à contratação de alguém não qualificado para programar como "desenvolvedor de software" em vez de "jr. Desenvolvedor de software" ou "estagiário".
dietbuddha
3

Acho que perguntar se é "importante ou não" é bastante vago.

Você encontrará muitas pessoas evangelizando sobre como cada pedacinho de conhecimento neste mundo é estritamente necessário em sua opinião. Mas isso é um pouco inútil, porque nunca se pode saber tudo, e não se deve esperar, a menos que ajude a cumprir os requisitos que seu trabalho impõe. Prefiro adotar uma abordagem mais pragmática dos pré-requisitos educacionais, em geral, a menos que seja uma questão de hobby ou preferência pessoal arbitrária.

É importante para programadores que devem escrever código extremamente eficiente ou algoritmos de infraestrutura inovadores? Sim.

É importante para programadores que desenvolvem aplicativos da web convencionais? Eles podem gerenciar sem ele ou obter implementações eficientes no mundo do código aberto.

É importante para programadores que desenvolvem GUIs para aplicativos? Provavelmente não, porque estruturas de GUI bem-sucedidas abstraem todos esses pequenos detalhes.

É sempre bom saber, como qualquer coisa, mas isso não impede que muitos (ou mesmo a maioria) dos programadores simplesmente façam seu trabalho para a satisfação de seus empregadores.

Por outro lado, se alguém se matriculou em estudos superiores, em busca da educação fundamental e teórica, deve-se aprender matérias que, por definição, são mais teóricas do que práticas. Na minha opinião, é essencial que o CompSci. os alunos aprendem sobre complexidade, assim como é importante que aprendem sobre cálculo.

Mas de qualquer maneira, desde quando o CompSci. programas ensinam as pessoas a serem bons programadores? Para isso, você tem programas de treinamento especializados e experiência prática (a sua ou de seus colegas programadores que podem compartilhar os deles com você).

Yam Marcovic
fonte
1
A segunda parte é provavelmente menos vaga: ela deveria ser ensinada aos estudantes de composição no nível de bacharelado?
Muhammad Alkarouri
1
Também editei minha postagem para responder a essa pergunta.
Yam Marcovic