“Não reinventa a roda” ignora os limites da memória humana?

16

Uma coisa que trabalhar em Haskell e F # me ensinou é que alguém em uma universidade mais inteligente que eu provavelmente já encontrou uma abstração para o que estou fazendo. Da mesma forma, em C # e programação orientada a objetos, provavelmente há uma biblioteca para "it", seja o que for que eu esteja fazendo.

Há tanta ênfase na reutilização de abstrações na programação que muitas vezes sinto um dilema entre: 1) apenas codificar algo curto e sujo ou 2) gastar o mesmo tempo para encontrar a biblioteca / solução mais robusta de outra pessoa e apenas usá-la.

Como recentemente, um dos codificadores aqui escreveu um (des) serializador para arquivos CSV, e eu não pude deixar de pensar que algo assim provavelmente é muito fácil de encontrar on-line, se ele ainda não vem com o padrão .NET APIs.

No entanto, não o culpo; várias vezes trabalhando no .NET, consertei uma solução com base no que sei, apenas para perceber que havia alguma chamada ou objeto de método ou algo , geralmente na mesma biblioteca, que fazia o que Eu queria e simplesmente não sabia disso.

Isso é apenas um sinal de inexperiência ou sempre existe um elemento de troca entre escrever novo e reutilizar o antigo? O que eu mais odeio é quando encontro uma solução que eu já sabia e esqueci. Sinto que uma pessoa simplesmente não é capaz de digerir as grandes quantidades de código que vêm pré-empacotadas com a maioria dos idiomas atualmente.

CodexArcanum
fonte

Respostas:

9

Primeiro, você precisa aprender a identificar "componentes" genéricos / reutilizáveis ​​o suficiente para que uma biblioteca ou solução de terceiros provavelmente já exista. Depois de fazer isso, perceba que, mesmo se você for um bom desenvolvedor, é provável que a experiência coletiva de inúmeros desenvolvedores que passam inúmeras horas com o mesmo problema tenha produzido uma solução melhor do que você jamais será capaz de fazer. Isso não significa que você nunca deve "reinventar a roda", mas se optar por fazê-lo, é melhor ter uma boa justificativa para isso.

Há tanta ênfase na reutilização de abstrações na programação que muitas vezes sinto um dilema entre: 1) apenas codificar algo curto e sujo ou 2) gastar o mesmo tempo para encontrar a biblioteca / solução mais robusta de outra pessoa e apenas usá-la.

Vale a pena mencionar que mesmo se você leva a mesma quantidade de tempo para encontrar uma biblioteca / solução existente como faz para escrevê-lo, lembre-se que fazê-lo sozinho também significa que você vai ter que mantê-lo para sempre . Você não está apenas reinventando a roda, mas também toda a equipe do poço para mantê-la funcionando. Obviamente, algumas bibliotecas são incorretas ou com manutenção insuficiente, mas essas são coisas que você deve ter em mente ao escolher uma solução de terceiros.

Yevgeniy Brikman
fonte
2
Muitas vezes, porém, você pode acabar gastando mais tempo de manutenção em uma biblioteca, mesmo que seja boa e ativamente mantida. Normalmente, isso acontece quando foi projetado de tal maneira que, por acaso, não se encaixa no seu código de alguma forma.
Jason Baker
+1 para justificar o tempo gasto na pesquisa da biblioteca / solução existente.
rwong
+1 por apontar o grupo de poço, que parecem sempre esquecê-los
Filip Dupanović
5

Às vezes, isso é um sinal de inexperiência, seja com a linguagem específica ou com a programação em geral. Às vezes, porém, se o ajuste não for óbvio, é melhor lançar seu próprio código que faça exatamente o que você deseja e nada mais . Bibliotecas genéricas, embora frequentemente úteis, podem ser criadas para requisitos que você simplesmente não possui e, em alguns casos, esse nível de genérico pode torná-los mais problemáticos do que valem.

Exemplo: para meus pequenos projetos individuais, nunca uso uma biblioteca de log "real". Eu uso printdeclarações mais uma pequena configuração ad-hoc. Não quero me preocupar em instalar e configurar uma biblioteca de log que tenha muito mais recursos do que jamais utilizarei, quando as printinstruções funcionarem bem para meus propósitos. Também não quero outra dependência que possa não ser compatível com a versão do compilador / intérprete que desejo usar, precisaria ser distribuída etc.

dsimcha
fonte
1
... ou o contrário. Às vezes, foi ajustado para uma tarefa muito específica e simplesmente não é flexível o suficiente para fazer o que seu código precisa.
Jason Baker
Isto é o que eu ia responder #
Dominique McDonnell
4

Bem-vindo ao mundo da programação. Esta questão será objeto de muitas divergências entre você e seus futuros colegas. Você tem duas opções:

  1. Role o seu próprio.
  2. Crie algo em cima da solução de outra pessoa.

Eu acho que há momentos em que ambas as soluções são apropriadas. Por exemplo, eu preferiria evitar o lançamento do meu próprio analisador CSV do ORM, se puder evitá-lo principalmente porque é um trabalho muito tedioso. Por outro lado, as bibliotecas geralmente são restritas. Eu diria que, para cada projeto em que trabalhei, encontrei bibliotecas que resolveriam meu problema perfeitamente, se não fosse por essa falha. Ou, às vezes, uma biblioteca é exatamente o que você precisa quando começa a fazer algo, mas é mais mal do que ajuda quando você precisa fazer alterações.

No entanto, em geral, desaconselho a tentar encontrar respostas "corretas" porque elas não existem. Em caso de dúvida, basta seguir seu instinto. Uma vez ouvi alguém dizer que a experiência é definida por quantos erros estúpidos você comete. Geralmente, você aprende algo ou faz algo que funciona. De qualquer maneira, não é de todo ruim.

Jason Baker
fonte
Eu diria que é uma escolha de três vias: implante sua própria solução para essa necessidade específica , adapte a solução existente de outra pessoa ou implante sua própria solução de uso geral para lidar com essa necessidade e as necessidades futuras . O fato de ser uma escolha de três vias torna muito mais difícil do que seria uma escolha de duas vias.
Supercat 18/11
2

Isso (ou algo semelhante) muitas vezes aconteceu comigo em um trabalho anterior em que a estrutura estava sofrendo um grave efeito de plataforma interna.

Basicamente, sua base de código evoluiu desde o início do Windows C / C ++ e começou a ser compilada no MFC - e, assim, os mantenedores começaram a misturar o MFC e suas estruturas de dados internas antigas e componentes de janelas. A plataforma interna não estava muito bem documentada, mas era supostamente "o caminho" para fazer as coisas naquele produto, devido a algumas instalações internas que ele fornecia. Muitas vezes, achei mais fácil e rápido escrever minhas próprias coisas do zero (dos fundamentos do MFC), em vez de descobrir como fazê-lo com a estrutura interna da empresa.

(Ok, então isso parece ser quase o oposto do seu ponto inicial - mas o princípio é o mesmo, hehe! Sim, às vezes é realmente mais rápido fazer suas próprias coisas do que gastar tempo e esforço para encontrar um reutilizável existente solução.)

Bobby Tables
fonte