Feda /dev/ - No Javascript allowed

Normas
spoiler
Personas non gratas
Memes feda dev




Sphere

#25168 #25169 #25170

Acaba de entrar otra con máxima prioridad, ya van 6 hoy xddddddd

Yo me voy a centrar en la que estoy haciendo y si hay prisa particular con una que me avisen, porque hoy está siendo un día de locos.

aren-pulid0

Lo mejor en esos momentos es no hacer nada y dejar que todo arda

Lecherito

Eso es como las enfermedades de Burns

Wei-Yu

puta bida macho sólo hay curro de front

así me sentiría si tuviese título de algo

1 respuesta
isvidal

el problema de los backenders es que son tan buenos que su trabajo ya queda para lo posteridad y no hace falta hacer mantenimientos ni evolutivos

4 1 respuesta
B

#25175 para enmarcar la frase xddd

desu

Pregunta de system design. Justifiquen su respuesta.

Que es mejor y porque. Control de versiones.

Imaginaos que teneis 2 modelos de machine learning, cada entrada requiere un esquema distinto.

  • Opcion A ) tener un endpoint para cada modelo, api/v1/a y api/v1/b o si fuesen versiones distintas api/v1/a y api/v2/a

  • Opcion B ) tener un unico endpoint y pasar como metadato la version del algoritmo dentro del esquema. si se requieren mas campos este field idAlgorithm se usaria para se/deserializar correctamente.

{
  idAlgorithm: "a"
...
}
{
  idAlgorithm: "b" // o "a-v2"
...
}

La A o la B???

3 respuestas
Wei-Yu

Las dos, cuantas más opciones para hacer lo mismo mejor. Mira cpp qué vivo está.

1
Zoko

#25174

True Master Race, alineando divs earning the big bucks

1
_Rpv

La A.
Prefiero tener el código fuente separado entre versiones

fehnd

#25177 Me gusta mas la A, ya que en la misma URL estas marcando el recurso y su versión. También te digo que he visto una implementación de B en el curro en el que estoy, y me marea cosa mala, sobretodo cuando de una versión a otra recortan funcionalidad

Fyn4r

Pero es una de esas preguntas en las que luego te vas a inventar restricciones sobre la marcha?

9
Wei-Yu

A la pregunta de desu le falta un montón de contexto (supongo que se lo inventará sobre la marcha para inyectar su opción favorita)

Si es razonable utilizar en tándem las distintas implementaciones del algoritmo yo creo que debería ser un mismo endpoint, si la idea es que se mantiene más por retrocompatibilidad o quizás edge cases muy concretos, la primera. También depende del resto del sistema; si la api es entera para eso pues la puedes versionar así pero si no como mínimo tiene que tener un sufijo denostando que el versionado es explícitamente para ese recurso y no para la api en sí.

al final del día a mí me parece un poco de bikeshedding a menos que vayas a tener muchas situaciones de esas dentro del mismo sistema/api que entonces sí te merece la pena buscarle los tres pies al gato

esta es mi humilde opinión de pajeet desu no me flamees por favor no me da la cabecha pa más

desu

Hace años elegí la B. En spring hsy una anotación que automáticamente te lo serializa bien y tenía unos dtos usando herencia.

3 años después no tengo dudas de que es la A. La herencia no hay que usarla nunca y los dtos como mas minimalistas mejor. Además, usar metadatos suele ser code smell (a veces son necesarios, hay excepciones, pero de primeras es mejor pensar en que algo has hecho mal)

fehnd

Si todo el mundo aplicase YAGNI y KISS, viviríamos en un mundo mejor.

1 respuesta
LLoid

#25185 siempre que he visto un proyecto en el que los devs decían que DRY y tal tenía una clase Utils.java con un cojón de public static y no veas la fiesta

1 respuesta
desu

El b se usa y mucho, pero para no romper apis publicas. pero tambien se usa mucho porque esta el codigo mal, sobretodo en frameworks.

para mi entra en juego el data flow, la programacion funcional / side effects (metadatos modifican comportamiento) y el flujo de resolucion de dependencias en runtime.

Imagina el problema es que escribes un framework exponiendo unas funcionalidades y normalmente siguiendo un data flow invertido. (debido a usar patrones OOP). estos patrones en primera instancia hacen tu codigo muy atractivo y parecen muy faciles de usar. correcto. son faciles tambien de "modificar" correcto. problema? que no quieres modificar su comportamiento... normalmente queremos cambiar su signatura y sus funcionalidades re usando el maximo codigo posible.

si en lugar de usar un framework en este estilo, expones una serie de librerias con un data flow no invertido. puedes a;adir mas componentes sin problemas. pero para el usuario final requiere "mas trabajo". ya no hay magia negra como hace spring, si no que tienes que picarte un minimo de codigo para que todo este pegado y funcione.

bottom up vs top down design.

a nivel de API no veo ninguna justificacion a no usar los endpoints, por el mismo punto, a nivel modular o de sistemas podemos seguir un razonamiento de FP.

si llamo a /api/v1/a con un input, estoy siguiendo un input y un data flow lineal, una pipeline tonta y funcional que siempre hara lo mismo.
si en cambio envio metadatos a un endpoint para elegir el servicio/modelo/funcionalidad a invocar, estoy delegando la responsabilidad de resolver ese comportamiento al controller, he invertido el flujo de dependencias (1) y ademas estoy a;adiendo side effects (2), mi endpoint ya no es puro.

3 1 respuesta
Wei-Yu

#25187 pero el input/output es distinto entre una y otra o es el mismo? Los resultados serán distintos sí, pero las estructuras también?

1 respuesta
desu

#25188 si claro puede ser distinto.

en el a puedes tener /api/v1/a que acepta InputA y devuelve outputA
ademas de tener /api/v2/a que acepta InputAv2 y devuelve outputAv2

en el b puedes tener un solo endpoint, pero tienes lo mismo InputGeneric y OutputGeneric. Y dentro de estos jsons segun un campo tener una estructura u otra.

nse yo creo que deberias tener muchos endpoints y muchos tipos. el DRY como dicen de tener solo un endpoint y que tenga esta complejidad a;adida, no usar la capa de HTTP al 100% y otros problemas no justifican.

otro tema es que tengas esta API publica que usan cientos de clientes y no puedes romper. o tengas un framework como spring o algo de data science que tambien funcionan como en el b inyectando metadatos.

la API publica creo que te la comes con papas.

el tema de framework es porque esta mal dise;ado, si no hubiesen hecho un framework y hubiesen hecho una libreria no tendrian este problema. problema? api mas compleja, el usuario tiene que escribir mas.

1 respuesta
fehnd

#25186 Pues que caos no? eso se cargaría KISS a mi parecer, porque complicas la existencia del programador con ese archivo

1 respuesta
desu

#25190 los archivos utils se deben

1) no usar bien los modulos/funciones, abusar de OOP usando metodos en lugar de escribir funciones
2) no tener function extensions (esto es un parche sobre la asquerosa OOP de mierdaaaaaaaaaa)
3) no usar bien el sistema de tipado y hacer type driven

normalmente es una combinacion de los 3 porque esto se suele ver en javas, python y demas lenguajes de mierda.

1 1 respuesta
aren-pulid0

es imposible responderte si editas los mensajes de media 3 veces

Wei-Yu

#25189 pues empieza por ahí xd si no es lo mismo por qué ibas a meterlo en el mismo sitio? Da igual que "se use para lo mismo" si no usa las mismas estructuras no tiene nada que ver uno con lo otro.

Yo estaba pensando en algo del palo a tengo un contrato y en runtime decido qué implementación necesito en base a unos datos/queries/lógica/loquesea.

1 respuesta
desu
#25193Wei-Yu:

pues empieza por ahí xd si no es lo mismo por qué ibas a meterlo en el mismo sitio? Da igual que "se use para lo mismo" si no usa las mismas estructuras no tiene nada que ver uno con lo otro

eres la persona mas pajeet y que mas sobre enginieria usa de todo el hilo

todo lo haces con frameworks como .net o spring y usas genericos para todo

patrones malos de la oop son tu dia a dia.

entonces, porque lo usas tu?????

#25193Wei-Yu:

Yo estaba pensando en algo del palo a tengo un contrato y en runtime decido qué implementación necesito en base a unos datos/queries/lógica/loquesea.

esta mal igual en este caso.

si a nivel de funcion y modulo esta mal. a nivel de servicio tambien.


menuda master class sobre FP os acabo de colar por el culo sin que os deis cuenta HAHAHAHAHAHAHAHAHAHAHAHAH

OOP 666
Frameworks caca. diablo. 666

Librerias, FP bueno.

1 respuesta
Wei-Yu
#25194desu:

si a nivel de funcion y modulo esta mal. a nivel de servicio tambien.

y esto xq uwU

danao

#25177 si implementases la opción B ... tendría sentido meterle graphql si es a modo consultivo?

hablo con mi cerve en la mano

1 respuesta
desu

#25196 yo no uso graphql.

fui a una conferencia de graphql que dio uno de facebook y se la meti hasta la garganta por decir bobadas sobre react y typescript. en el pasado he contado esta historia.

no tengo ninguna opinion sobre graphql porque no lo conozco ni he leido sobre el tema mas alla de esta conferencia que asisti.

2
fehnd

#25191 que recomendarías? no a nivel de utils y tal, sino, cuales son los patrones o paradigmas que crees que hacen la programación más limpia?

1 respuesta
desu

#25198 Siempre existe un tradeoff depende del lenguaje en que estes.

Si tienes un lenguaje fuertemente tipado y de calidad pudes hacer type driven. Si por ejemplo tienes una String name, y quieres tener un type Name = String y expandirlo, esto es muy facil. La clave es que tengas inferencia de tipado para no tener que hacer wrapping a mano o anotar todo a mano como en java o kotlin.

Si no tienes una inferencia real tendras que wrapear todo con tu Name("my name") y es bastante palo.

Si no puedes hacer esto, lo suyo seria tener funciones dentro de tus modulos. si estas en python y tienes un modulo http-client que realiza conexiones http y tiene un cliente, ahi dentro pones utilidades y las escribes como funciones.

si en cambio estas en java, tienes el problema de que todo es un objeto, podrias tener la misma idea y tener un HttpClient y metodos estaticos, pero aqui suele haber muchisima verbosidad. al final puedes tener lo mismo que en python pero sera un poco mas verboso y tendras que vigilar mas con las referencias a tus objetos.

al final lo unico que quieres es

"my name".valide_is_right_name()

o

valide(Name("my name"))

y que sea type safe en compile y runtime

y esto puedes hacerlo con extensiones como te da kotlin u otros del estilo.
teniendo que "my name" es del tipo Name y escribir ahi el metodo.
o tener una funcion del estilo

Validator.validate_is_right_name("my name")

pero como ves, esto ultimo al final, es el principio del fin.
xq estas clases estaticas al no poder desacoplar bien los tipos de su comportamiento en java y similares.
terminan en clases dios. aka utils.java

yo lo tengo en mis modulos/clases como funciones estaticas, y si tengo que pasar una referencia nunca lo hago como metodo, lo hago como funcion aunque parezca redundante.

2 1 respuesta
fehnd

#25199 Nice, thanks! veo que mis pensamientos no se iban mucho, pero no he usado nunca las extension functions. Una cosa mas al carro de practicar

1 respuesta