¿"No reinventar la rueda" ignora los límites de la memoria humana?

16

Una cosa que trabajar en Haskell y F # me ha enseñado es que alguien en una universidad más inteligente que yo probablemente ya ha encontrado una abstracción de lo que estoy haciendo. Del mismo modo, en C # y en la programación orientada a objetos, probablemente haya una biblioteca para "eso", sea lo que sea lo que estoy haciendo.

Hay tanto énfasis en reutilizar abstracciones en la programación que a menudo siento un dilema entre: 1) codificar algo corto y sucio yo mismo o 2) pasar el mismo tiempo para encontrar la biblioteca / solución más robusta de otra persona y simplemente usar eso.

Como recientemente, uno de los codificadores aquí escribió un (des) serializador para archivos CSV, y no pude evitar pensar que algo así probablemente sea muy fácil de encontrar en línea, si aún no viene con el estándar .NET APIs.

Sin embargo, no lo culpo, varias veces trabajando en .NET he arreglado una solución basada en lo que sé, solo para darme cuenta de que había alguna llamada a método u objeto o algo , a menudo en la misma biblioteca, que hizo lo que Quería y simplemente no lo sabía.

¿Es esto solo un signo de inexperiencia, o siempre hay un elemento de compensación entre escribir nuevo y reutilizar viejo? Lo que más odio es cuando encuentro una solución que ya conocía y olvidé. Siento que una persona simplemente no es capaz de digerir las enormes cantidades de código que viene preempaquetado con la mayoría de los idiomas en estos días.

CodexArcanum
fuente

Respuestas:

9

Primero, debe aprender a identificar "componentes" que sean lo suficientemente genéricos / reutilizables como para que ya exista una biblioteca o solución de terceros. Una vez que haga eso, tenga en cuenta que, incluso si es un buen desarrollador, es probable que la experiencia colectiva de innumerables desarrolladores que pasan innumerables horas en el mismo problema haya producido una solución mejor de lo que nunca podrá hacer. Eso no significa que nunca debas "reinventar la rueda", pero si eliges hacerlo, será mejor que tengas una buena justificación para hacerlo.

Hay tanto énfasis en reutilizar abstracciones en la programación que a menudo siento un dilema entre: 1) codificar algo corto y sucio yo mismo o 2) pasar el mismo tiempo para encontrar la biblioteca / solución más robusta de otra persona y simplemente usar eso.

Vale la pena mencionar que incluso si le toma la misma cantidad de tiempo encontrar una biblioteca / solución existente que escribirla usted mismo, recuerde que hacerlo usted mismo también significa que tendrá que mantenerla para siempre . No solo estás reinventando la rueda, sino también todo el equipo de boxes para que siga funcionando. Por supuesto, algunas bibliotecas tienen errores o están mal mantenidas, pero estas son cosas que debe tener en cuenta al elegir una solución de terceros.

Yevgeniy Brikman
fuente
2
Sin embargo, a menudo, puede terminar gastando más tiempo de mantenimiento en una biblioteca, incluso si es buena y se mantiene activamente. Por lo general, esto sucede cuando se diseñó de tal manera que no encaja de alguna manera con su código.
Jason Baker, el
+1 para justificar el tiempo dedicado a la búsqueda de la biblioteca / solución existente.
rwong
+1 por señalar al equipo de boxes, siempre parecemos olvidarnos de ellos
Filip Dupanović
5

A veces esto es un signo de inexperiencia, ya sea con el lenguaje particular o con la programación en general. Sin embargo, a veces, si el ajuste no es obvio, es mejor rodar su propio código que hace exactamente lo que quiere y nada más . Las bibliotecas genéricas, aunque a menudo son útiles, se pueden construir para requisitos que simplemente no tiene, y en algunos casos este nivel de genérico puede hacer que sean más problemáticos de lo que valen.

Ejemplo: para mis pequeños proyectos individuales, nunca uso una biblioteca de registro "real". Yo uso printdeclaraciones más una pequeña configuración ad-hoc. No quiero molestarme con la configuración y configuración de una biblioteca de registro que tiene muchas más funciones de las que usaré, cuando las printdeclaraciones funcionan bien para mis propósitos. Tampoco quiero otra dependencia que podría no ser compatible con la versión del compilador / intérprete que quiero usar, tendría que ser distribuida, etc.

dsimcha
fuente
1
...O al revés. A veces se ajustó para una tarea muy particular y simplemente no es lo suficientemente flexible como para hacer lo que su código necesita.
Jason Baker, el
Esto es lo que iba a responder
Dominique McDonnell el
4

Bienvenido al mundo de la programación. Este tema será objeto de muchos desacuerdos entre usted y sus futuros colegas. Tienes dos opciones:

  1. Ruede el suyo.
  2. Cree algo sobre la solución de otra persona.

Creo que hay momentos en que ambas soluciones son apropiadas. Por ejemplo, preferiría evitar lanzar mi propio analizador CSV de ORM si puedo evitarlo principalmente porque es un trabajo bastante tedioso. Por otro lado, las bibliotecas a menudo están restringidas. Diría que para cada proyecto en el que he trabajado, he encontrado bibliotecas que resolverían mi problema perfectamente si no fuera por esta deficiencia. O, a veces, una biblioteca es exactamente lo que necesita cuando comienza a hacer algo, pero es más perjudicial que ayuda una vez que necesita hacer cambios.

Sin embargo, en general, aconsejaría no tratar de encontrar respuestas "correctas" porque no existen. En caso de duda, solo sigue tu instinto. Una vez escuché a alguien decir que la experiencia se define por la cantidad de errores estúpidos que cometes. Por lo general, aprenderás algo o harás algo que funcione. De cualquier manera, no todo es malo.

Jason Baker
fuente
Yo diría que es una opción de tres vías: implementar su propia solución para esta necesidad en particular , adaptar la solución existente de otra persona o implementar su propia solución de uso general para manejar esta necesidad y las necesidades futuras . El hecho de que sea una opción de tres vías hace que sea mucho más difícil de lo que sería una opción de dos vías.
supercat
2

Esto (o algo similar) me ha sucedido a menudo en un trabajo anterior en el que el marco sufría un grave efecto de plataforma interna.

Básicamente, su base de código evolucionó desde los primeros días de Windows C / C ++, luego comenzó a compilarse bajo MFC, por lo que los encargados del mantenimiento comenzaron a mezclar MFC y sus antiguas estructuras de datos internas y componentes de ventanas. La plataforma interna no estaba muy bien documentada, pero supuestamente era "La forma" de hacer cosas en ese producto, debido a algunas instalaciones internas que proporcionaba. A menudo me resultaba más fácil y rápido escribir mis propias cosas desde cero (desde los fundamentos de MFC), en lugar de averiguar cómo hacerlo con el marco interno de la empresa.

(De acuerdo, parece que esto es casi lo opuesto a su punto inicial, ¡pero el principio es el mismo, jeje! Sí, a veces es más rápido hacer lo suyo que gastar tiempo y esfuerzo para encontrar un material reutilizable existente) solución.)

Mesas Bobby
fuente