Feda /dev/ - No Javascript allowed

Normas
spoiler
Personas non gratas
Memes feda dev




eondev

#34650 nah, no deja de ser un string, no estás seteando nada desde la terminal. Es sólo sintaxis

2 respuestas
desu

#34650 #34651 imaginad que en lugar de un CLI es un header de una API o una config.

Tengo un valor por defecto False. Y un flag que activa o un flag que setteo True para activar y False para que se quede igual.

Ahora cambio el valor por defecto a True.

  • A breaking change
  • B no breaking change, pero hay un caso que el user no ve, si no lo tenia puesto porque no le hacia falta, esperaba un False, ahora tiene un True.
Kaledros

#34651 Sí, pero depende de como sanitizes los inputs. Casi todos los exploits chungos de Linux vienen por inputs que no deberían poder procesarse.

desu

Mi conclusion es siempre tener el breaking change. Porque es explicito. El user se entera. Y puedo de manera automatica cambiar en el cliente con un script todos los flags. De hecho asi funcionan muchos compiladores como Golang y Rust para algunos cambios. te lo hacen automatico en tu code base.

Si en lugar de eso hago un side effect, o a;ado otro parametro posible de input... o a;ado otro flag que segun el otro te haga cosas... y asi haciendo todo mas complicado. Tengo la puta mierda que hace todo el mundo XD

Todo por no romper algo que ha cambiado su comportamiento.

Si algo cambia y el user lo tenia que saber, es un breaking, no lo escondas.

Es lo mismo que tener esto:

   bool *a;
   bool b = false;

tienes que hacer type driven design en tu servicio. primero de todo, la entrada siempre sera un puntero de un bool. aunque tu uses el caso b internamente, que pasa si el user no pasa el valor?

parseas ese puntero a un bool y tienes el contenido. ahi dise;as tu servicio.

mucha gente no parsea los inputs y los pasa para dentro de su servicio y hace muchas liadas.

1 respuesta
Kaledros

#34654 Yo iba a decir que si fuera una API yo elegiría la A porque semánticamente es mucho más legible y claro un verbo que un flag.

1 respuesta
desu

#34655 Si estaria bien.

El problema sera siempre el comportamiento, ahora y en el futuro, yo he puesto un default que es lo mas facil de entender, pero que pasa si ese flag interactua con otros flags? eso es mal API design.

Si tu expones algo al user, es porque el comportamiento lo elige el. Si necesita multiples flags que pueden ser true o false haces algo mal. Lo que tienes que tener es una lista de flags para features que sean EXCLUSIVOS. Si hago A, no puedo hacer B.

Exponer los flags es api design smell... Y es muuuuuuuuy comun. Seguro que por aqui todos lo hemos hecho mal.

1 respuesta
eondev

#34656 entonces te estás respondiendo a ti mismo XD

1 respuesta
desu

#34657 a que te refieres? yo ya sabia la solucion cuando he puesto la pregunta XD

era un ejercicio para los fperos a ver si sabian argumentar el porque.

a ver si alguien tiene una prabola rara para argumentar lo contrario.

a mi no me han dejado hacer el breaking change en el curro XD

1 respuesta
eondev

#34658 🫥

1 respuesta
desu

#34659 este mismo caso lo veo en picar codigo. hay gente que hace esto:

main() {
  flag = true
  foo(flag)
}

foo(flag: bool) {
  if flag {
    bar()
  }
}

bar()

xq no haces esto?

main() {
  flag = true
  if flag {
   bar()
  {
}

bar()

simplificando, pero este branching es una horrible mala practica y es muy comun XD

lo mismo con el parseo que he puesto, al recibir por parametro un input por I/O parsealo a los tipos que espera... si falla es una BAD REQUEST y terminas ahi.. no esperes a lanzar la bad request 10 funciones dentro de tu servicio tontito.

esto es lo mismo conceptualmente, pero inviertes el data flow y expones al user el parametro.

luego la gente lee DDD de Evans y se hace pajas con cosas que ni intiende mientras pica codigo de mierda.

el "encapsulamiento" es muy malo en general. esta deprecated por un motivo. nunca lo uses. porque vas a a;adir complejidad a tu codigo en lugar de romper lo antes posible y tener el menor codigo posible.

es que tener foo(flag) es la polla, porque asi me documenta el codigo con funciones, se lo he leido a uncle bob. asi no tengo que pensar en los detalles de implementacion huehueheuheu

1
JuAn4k4

Cambiar el valor por defecto :O

1 respuesta
MTX_Anubis

#34649 usaría la B, siempre

A la hora de automatizar cosas es más sencillo, imaginate que tienes que hacer algo así $cmd -flag=$value

y a la hora de parsearlo mucho mejor

1 respuesta
desu

#34661 es lo que vamos a hacer si. les mandamos un aviso que en 1 mes cambiaremos la API y si no cambian sus configuraciones les cambiamos el comportamiento... que diferencia hay con lanzar una nueva version? XD que ellos hagan upgrade cuando quieran no? es que es mucho mas facil hacer el breaking change para que el compilador te diga todo lo que esta mal XD

no entiendo como una practica tan mala esta tan arraigada en la industria, la mayoria de clis, librerias, apis... por no romper tienes tres flags que tienes que settear o no funcionara lo que quieres.

en fin, fperos, fpeando.

#34662 si te cambio el valor por defecto no te puedo "avisar". imaginate que es una SDK. si cambio el nombre de la funcion o la variable, de enable a disable, te va a romper el codigo al hacer upgrade. y la api te devolvera un error http...

si usas la opcion B para dise;ar tus APIs, el usuario tiene que ir buscando todos los sitios donde lo utilice. y tendra un side effect / hidden effect de comportamiento que no se enterara.

esoty simplificando a un booleano y un flag, imaginate un repo con 50 dependencias, que por dentro tienes cientos de configuraciones... esto es el software en nuestro dia a dia.

te estoy diciendo porque esta mal y como solucionarlo.

2 respuestas
Kaledros
#34663desu:

no entiendo como una practica tan mala esta tan arraigada en la industria

Porque está feo romper las cosas de los demás. Que tampoco me parece bien lo que hace MS de dar soporte a especificaciones de API que llevan ahí desde que Windows se arrancaba por línea de comandos porque hay tres máquinas en el planeta que lo pueden necesitar, pero hay un término medio entre eso y FB llevándose por delante el login de siete millones de apps porque ha cambiado el SDK por su cara bonita.

1
MTX_Anubis

#34663 si cambias el valor por defecto en el caso A tampoco pudes avisar a los que utilicen el valor por defecto, nuse.

1 respuesta
desu

#34665 bien visto. te veo atento a la clase.

entonces tendríamos B y obligaríamos a usar mínimo un flag/header en el cli/api/config?

1 respuesta
Wei-Yu

la mítica de desu

vengo con un problema concreto, lo abstraigo para generalizar y luego según le van dando patadas voy destapando detalles que son importantes para la decisión o el razonamiento

2 2 respuestas
Lecherito

Lo del + de los cli no es muy comun, solo hay unas pocas utilidades que yo conozca que lo usen como dig asi que dudo que lo usara

1
B

#34667 sí, el personaje principal de la serie está estancado y no evoluciona

1
MTX_Anubis

#34666 es que tampoco te se decir, como todo, depende xD

Puedes hacer versionado de api dejando un tiempo de soporte de X meses a la antigua
Puedes soltar un mensaje en caso del cli diciendo que se va a utilizar X argumento y que le den al enter para continuar, puedes meter un argumento para hacer un bypass de estos inputs.
O le pueden dar por culo a los clientes de esa api y que se lean los changelogs o se enteren cuando lo usen.

Yo un valor por defecto nunca lo cambiaría, en caso de que sea imperativo pues dependiendo del caso de uso propondría la solución. No creo que haya nada que se ajuste a todo y muchas veces ni si quiera vale la pena dar la solución "correcta".

2 respuestas
Kaledros
#34670MTX_Anubis:

Puedes hacer versionado de api

Esto tiene peligro porque al final nadie se molesta en upgradear la versión de su cliente y cuando tú descontinuas la versión antigua todo son movidas y quejas porque les has roto la aplicación.

desu

#34667 pues estoy haciendo la del filosofo griego, es una clasica... voy sacando una conversacion y dandole vueltas. Siguiendo la corriente a la gente y viendo quien esta atento. Pues si la que siempre hago para generar debate interesante.

Si lees mi post original...

#34646desu:

esto es unix philosophy y system design de alto nivel. alto toque y facherio expected.

Entiendo que un FPero como tu que es incapaz de pasar la entrevista cultural entienda lo que es una pregunta de system design... porque no pasas ni de la primera entrevista. Y la verdad. Programando como programas no quiero ni saber cual seria tu solucion. Asique ni alto toque. Ni facherio.

En este caso @MTX_Anubis que es un alumno aventajado que ya me conoce e imagino que se la olia, ha visto que mi logica tenia un fallo que nos llevaba a que ambas soluciones tienen problemas. Entonces cual es la respuesta a la pregunta? cambiar la pregunta.

  • La pregunta: esoty dise;ando una API que es un bool y ademas tengo un valor por defecto, como pasarias los parametros???
  • La respuesta: para empezar, quitar el valor por defecto y haciendolo explicito

El usuario siempre configura todo, el servicio nunca hard codea nada. Lo contrario que hacen los frameworks. Lo que hacen todas las librerias (si estan bien hechas). Fijense que se sigue manteniendo lo que dije de que es lo mismo en codigo y encapsulamiento... Y el tema de default hell configs lo he sacado muchas veces. Es el mayor problema de la industria. Spring framework en su maximo explendor. Con el codigo he intentado dar una pista... pero parece que no ha funcionado...

En fin, aparentemente una pregunta sencilla, en la practica tenia truco. Por eso es una pregunta buena de entrevista y un error tan comun entre los fperos. Les ense;o la luna y empiezan a hablar de mi dedo. El problema era que en lugar de la Luna te estaba se;alando Jupiter... Si el problema esta mal definido, la solucion estara mal siempre... Forth philosophy.

Paso N1, entiende el problema. Empieza entendiendo el porque. Si no ENTIENDES el problema, NUNCA sacaras una SOLUCION.

#34670 Creo que hay que romper siempre y dise;ar para que al romper el compilador/api falle al parametro invalido y no tiene que haber valores por defecto nunca.

Si tienes un valor por defecto lo deberias exponer y obligar al usuario a settearlo siempre. En este caso tanto la A como la B funcionan! Peroooo, debe ser OBLIGATORIO settearlos. El problema era el default / no settear. Saca el problema del dise;o y tienes una solucion buena.

Tienes razon en lo de no dar la solucion correcta. entonces porque la gente se esfuerza tanto en no romper haciendo el problema mayor? da una solucion, si el problema cambia, cambia la solucion y rompe... repeat.

Nuestra vida no es tan dificil... eres tu que la haces complicada con defaults, multiples flags, parametros y patrones de dise;o estupidos.

Wei-Yu

Los defaults están para simplificar el uso de la interfaz que tienes delante, dependiendo de la situación quitarlos lo único que hace es amplificar la carga cognitiva que necesitas para usarla o comprenderla porque no hay incrementalidad en la exploración que haces como usuario. Es un todo o nada.

No hay silver bullet; todo es circunstancial.

1 respuesta
desu

#34673 Sabes que tu puedes crear tu propio default?

Esto es algo que parece que los fperos no entienden. Y no lo digo por ti ahora. Es que me lo encuentro mucho. Mas que con configuraciones, con funciones.

Si tu tienes una funcion asi:

fun internal(a, b, c, d, e, f, g) {
   ...
}

Siempre puedes picar esto:

fun external(f, g) {
   internal( defaultA, defaultB, defaultC, defaultE, f, g);
}

fun internal(a, b, c, d, e, f, g) {
   ...
}

Y la libria INTERNAL siempre esta parametrizada para poder ser testeada y full modular...

Tu como usuario, en TU CODIGO, en TU IMPLEMENTACION, si quieres... si lo decides... te puedes crear una auxiliar sabes???

Los defaults estan para simplificar el uso EN EL CLIENTE, no en UNA LIBRERIA.

Esto me lo encuentro mucho, gente que hard codea valores en las funciones porque tiene muchos parametros... a ver... la implementacion de la libreria siempre con parametros. INYECCION DE DEPENDECIAS PUTO SUBNORMAL. Luego si quieres hazte una auxiliar para agilizar tu programacion en el cliente. pero la libreria PARAMETRIZABLE.

Lo mismo se aplica a APIs http, a CLIs... a scripts bash... XDDDD es que todo lo puedes configurar con defaults, MIENTRAS LA LIBRERIA TE LO EXPONGA.

Si en lugar de esto:

fun internal(a, b, c, d, e, f, g) {
   ...
}

tengo esto:

fun internal(a, b, c, d) {
   e,f,g = false
   ...
}

El usuario, TU, no podeis configuraros nada. ni yo puedo testear el codigo... no es tan dificil fperos.

1 respuesta
Wei-Yu

#34674 eso no tiene nada que ver con lo que digo, voy a hablar en los términos que uso cuando hablo con mis juniors y así nos quitamos asperezas comunicativas.

Tu API hoy tiene 5 parámetros y entenderlos no cuesta nada, pero el día de mañana puede tener 100 y algunos de ellos ser densos en contenido o definición. Por eso cuando la configuración se hace muy grande, a veces y dependiendo de la situación, es útil recurrir a defaults para no delegar esa carga cognitiva en los consumidores.

1 respuesta
desu

#34675 He entendido perfectamente lo que has dicho. Parece que tu <140IQ no. Voy a seguir tu ejemplo:

Mi API hoy tiene 5. Si en el futuro tiene 100 porque mi api es compleja. pues tiene 100. Tu no puedes ignorar que es una api compleja. Para eso te pagan. Menudo red flag no querer entender lo que estas programando ... XDDD

Lo que yo te digo es que eso es un default que tu puedes crear aparte, pero es mi responsabilidad ofrecer la maxima flexibilidad en la API sin cosas hard coded. Yo te expongo los 100 parametros, si tu quieres te puedes hacer un middleware para tus consumidores que siga funcionando con 5 parametros. Es tu decision.

Yo como alguien que escribe una libreria, no puedo harcodear los parametros... Como mucho te puedo ofrecer endpoints auxiliares... Pero es mejor no hacerlo nunca. Algun dia aprenderas la diferencia entre algo publico vs privated... Una libreria y un cliente...

En fin, no es tan dificil de entender. Vuelve a leerlo 3 veces y ya lo captaras crack.

No entender lo que es la inyeccion de dependencias... y luego se pone a hacer clases abstractas. como podeis ser tan tontos los fperos? es que os cagais en cima y luego os lavais la cara con vuestra propia diarrea.

B
cli --set-this-option-to-my-choice=TheParam --this-is-the-value-that-i-want-to-set=TheValue --do-all-without-interaction=ofcorse

Y listo.... y sino.. hazme un PR y lo cambias.

1
PaCoX

como mi api es compleja meto breaking changes cada dia, y si no te gusta te vas! al toke!

1 1 respuesta
desu

#34678 asi funciona el kernel de linux, si tienes problemas habla con:

la gracia esta que al no tener defaults tampoco tienes breaking changes, tienes breaking changes cuando empiezas a poner defaults...

asi que si no lo has dicho ironicamente eres un autentico subnormal y lo has entendido del reves XD si tieens 100 params es porque no has roto ni una sola vez... XD

el 2 problema que puedes tener con esto es que en el momento que un parametro depende de otro ya estas exponiendo tu implementacion interna de manera erronea. lo que hay que hacer es romper y poner 1 donde tenias 2 parametros...

y esto ultimo es realmente lo dificil de definir apis.

puedes mirar el kernel mismo como esta definido, con 10 versiones de cada funcion XDDDDD es imposible no romper... si quieres te explico lo que yo hago con defaults para no romper tanto a nivel dependencias... es parecido a lo que hacen en kernel y libs standard de lenguajes... desde ya hace tiempo.

PiradoIV

Iba a escribir algo y lo he borrado antes de darle a enviar. Pero aprovecho para desearos una feliz semana 😂

4 1 respuesta