Problema REAL de DISEÑO de SISTEMAS (Visto en entrevista para posición de ingeniero de SOFTWARE)

แชร์
ฝัง
  • เผยแพร่เมื่อ 11 ก.ค. 2024
  • Las entrevistas de diseño de sistemas no siempre son fáciles... ¡Os muestro la que hice yo!
    👾 Redes sociales 👾
    ► Twitter: / bettatech
    ► Instagram: / betta_tech
    ► Canal Secundario: / @forkdebettatech
    ► Slack: bit.ly/33gaDDM
    👨🏼‍🏫 MIS CURSOS 👨🏼‍🏫
    👽 Curso de iniciación a la programación con JavaScript:
    ► bit.ly/3kr4bTc
    👕 MERCHANDISING DEL CANAL:
    ► Tienda TH-cam: / bettatech
    ► Tienda Teespring: teespring.com/stores/bettatec...
    ⭐️ AFILIADOS ⭐️
    🎁 7% Descuento en HOSTINGER (Código BETTATECH)
    ► www.hostg.xyz/aff_c?offer_id=...
    🐾 MacPaw (CleanMyMacX):
    ► macpaw.audw.net/c/2523912/941...
    🎵 TODA la música es de EpidemicSound:
    ► www.epidemicsound.com/referra...
    ✉️ CONTACTO PROFESIONAL:
    ► Respuesta no garantizada:
    bettatechyt@gmail.com
    📚 LIBROS 📚
    Design Patterns
    ► amzn.to/39XuQlq
    Head First Design Patterns
    ► amzn.to/2uq6XUq
    Refactoring
    ► amzn.to/2SQnf2c
    Clean Architecture
    ► amzn.to/3bZVonJ
    Clean Code
    ► amzn.to/32WVKq3
    Introduction to Algorithms
    ► amzn.to/34SyVFP
    Cracking the Coding Interview
    ► amzn.to/2QkdwC6
    ⏱ ÍNDICE:
    • 0:00 - Introducción
    • 1:52 - El Problema
    • 2:58 - Diseño inicial
    • 5:47 - Problema de concurrencia
    • 9:41 - Estimación de tamaño
    • 11:59 - Conclusión
    #roadTo100k
  • วิทยาศาสตร์และเทคโนโลยี

ความคิดเห็น • 218

  • @BettaTech
    @BettaTech  3 ปีที่แล้ว +39

    Al final del vídeo os dejo un problema que resolveremos en el siguiente de la serie! Dejarme en los comentarios las propuestas de solución y quizá las revisamos! :D

    • @alvarocespedes9890
      @alvarocespedes9890 3 ปีที่แล้ว

      Manos a la obra! 😎👌

    • @boomboom-9451
      @boomboom-9451 3 ปีที่แล้ว

      Aquí te adjunto la mía, aunque te la mencioné en otro comentario. He usado stacks y hash tables,
      tiene un coste de O(n).
      const input = process.argv[2].split('');
      let hashTable = {
      '(': ')',
      '[': ']',
      '{': '}'
      };
      let stack = [];
      for (let i = 0; i < input.length; i++) {
      if (input[i] in hashTable) {
      stack.push(input[i]);
      continue;
      }
      if (stack.length != 0 && input[i] == hashTable[stack[stack.length - 1]]) {
      stack.pop();

      if ( i+1 == input.length ) {
      console.log(true);
      return true;
      }
      continue;
      }
      console.log(false);
      return false;
      }

    • @petro13cid
      @petro13cid 3 ปีที่แล้ว

      @@boomboom-9451 Considero que sería preferible determinar si la cadena es correcta poniendo un if ( stack.length == 0 ) después de for, así evitarías ejecutar ese if ( i+1 == input.length ) por cada vez que se saque un elemento de la pila. Dentro del for se pondría una condición y un break para cuando el caracter de cierre no seaa correcto. Pero buena solución

    • @MaximoPower2024
      @MaximoPower2024 3 ปีที่แล้ว +1

      Una pila.

    • @pepeluis766
      @pepeluis766 3 ปีที่แล้ว +1

      No me gusta mucho mi solución, funciona para el ejemplo dado (aunque fallaría si se abren dos elementos del mismo tipo antes de cerrarse uno de ellos). Una mejor sería el uso de substring como si de pilas se tratatran, quitando la recursión y teniendo en cuenta si se abren varios elementos del mismo tipo, pero ahora no tengo tiempo!!
      Bueno, ahí va mi código:
      //--------------------------------------------------------------------------------------------------------------------------------------------
      public class Ejemplobusqueda {
      public static boolean comprobarTexto(char[] texto, int i, int j)
      {
      if(i>j) return true;
      // no queda nada que comprobar, todo bien
      if(i==j) return false;
      // solo hay una letra, no puedo encontrar el objetivo
      char letra = texto[i];
      // letra que voy a comprobar
      char objetivo = ' ';
      // letra de cierre buscada
      //-----------------------------
      switch (letra){
      case '[': objetivo = ']'; break;
      case '{': objetivo = '}';break;
      case '(': objetivo = ')';break;
      default: return false;
      }
      //-----------------------------------------------
      int k = i + 1;
      //empiezo a buscar desde la siguiente letra a i
      while(k j) // no he encontrado el caracter objetivo
      {
      return false;
      }
      else //encontré el caracter objetivo
      {
      boolean parte1 = comprobarTexto(texto, i+1, k-1);
      // quito las letras emparejadas y sigo comprobando
      if(parte1)
      {
      return comprobarTexto(texto, k+1, j);
      // compruebo el resto del string
      }
      else
      {
      return false;
      }
      }
      }
      //--------------------------------------------------------------------------------------------------------------------------------------------
      public static void main(String[] args) {
      String texto = "[()]{}{[()()]()}";
      String texto2 = "[(])";
      boolean resultado = comprobarTexto(texto.toCharArray(),0, texto.length() -1);
      if(resultado)
      {
      System.out.println("correcto");
      }
      else {
      System.out.println("incorrecto");
      }
      }
      }

  • @victorfondevilla1424
    @victorfondevilla1424 3 ปีที่แล้ว +50

    Hola! Una recomendación, para mejorar la escalabildiad, concurrencia y resiliencia de la solución, a menos que haya un requerimiento de actualizar datos en tiempo real, creo que deberías poder un sistema de colas entre la API y la base de datos con un (o varios) ingestor de datos. Esta cola daría persistencia a las peticiones, con lo que si en un momento dado tu base de datos colapsa por sobrecarga, no se perderían transacciones de escritura de la API. Mi recomendación (me dedico profesionalmente a diseñar sistemas) es que se empiece siempre este tipo de entrevista haciendo un requirements gathering (incluyendo límites y riesgos), que es lo que deberías usar para guiar tus decisiones arquitecturales.
    Mi enhorabuena por el vídeo porque no hay mucho de Systems Design en español (y te has ganado otro suscriptor)! :D

    • @ernestoviso3083
      @ernestoviso3083 3 ปีที่แล้ว +2

      Buenas, estoy de acuerdo contigo pero solo a medias.
      Si implementas un sistema de colas para realizar la persistencia de modo asincrono, correrías el riesgo de si en determinado momento fallaras al persisitir, perderías esta información o podrías tambien correr el riesgo de ralentizar toda la cola con una lógica de reintentos.
      Aquí creo que dependería en gran medida de las necesidades reales del producto, si hablamos de información que requiera cierta transaccionalidad (como la información del vuelo de un cliente) no puedes permitirte un sistema de colas sin más, sería más robusto hacerlo de forma síncrona y mejorar el rendimiento en otros aspectos.
      Igualmente es una opinión, pero hay otro tipo de operaciones en las que utilizar sistemas de colas puede ser mas seguro, o usar una cola persistente como la que ofrece NATS o algo así para almacenar mensajes e ir reintentandolos con cierta regularidad, pero el problema reside en que al ser de manera asíncrona es muy complejo recuperar al usuario para dicha operación.

  • @alejandroballesterosh4252
    @alejandroballesterosh4252 3 ปีที่แล้ว +48

    Esta serie es de lo mejor, hasta ahora practicaba con los problemas de hackerank, pero las explicaciones que das, agregan muchísimo sentido y valor para quienes van empezando. Saludos desde México.

    • @BettaTech
      @BettaTech  3 ปีที่แล้ว +3

      Gracias! Me alegra muchísimo ver que os gusta y que además os es de utilidad. :)

  • @fedegregori318
    @fedegregori318 3 ปีที่แล้ว +1

    Betta muchas gracias por estos videos, para estudiantes de ing son un camino hacia la luz! Saludos y ojalá siga la serie!

  • @eloscmao6945
    @eloscmao6945 3 ปีที่แล้ว +1

    Felicitaciones, explica muy bien todo se hace fácil. Espero el próximo video. Saludos desde Colombia.

  • @mauroquiroga225
    @mauroquiroga225 3 ปีที่แล้ว

    Muy buena toda la info que aportas y con la buena calidad que lo haces. Super agradecido, me gustan mucho esta serie de videos.

  • @19JVC68
    @19JVC68 3 ปีที่แล้ว

    Lo felicito por su valiosa colaboracion para los que estamos en este mundo de la programacion, que no es saber programar, si no es saber la logica de lo que se esta haciendo, muy clara su explicacion, estaremos pendientes de sus proximos videos, Feleicitaciones

  • @josevicente632
    @josevicente632 3 ปีที่แล้ว

    Excelente por favor màs contenido sobre diseño stmas como este video..saludos desde Colombia!!!

  • @carsdfj
    @carsdfj 3 ปีที่แล้ว

    Excelente serie de vídeos para estudiar y la explicación va muy de la mano Gracias un saludo desde Venezuela

  • @ElIncreibleCptSpiff
    @ElIncreibleCptSpiff 3 ปีที่แล้ว

    Me encanta este tipo de contenidos. Muchas gracias, crack!

  • @marcjall
    @marcjall 3 ปีที่แล้ว +1

    😮 top video. El mejor en Español. Compartiendo!

  • @UskoKruM2010
    @UskoKruM2010 3 ปีที่แล้ว +1

    ¡Excelente video, Martín! Saludos! 👋🏻👋🏻

  • @samuelfarfan3062
    @samuelfarfan3062 3 ปีที่แล้ว

    Muy buen video, cada vez estan mejores muchas felicitaciones

  • @ThePomelo09
    @ThePomelo09 3 ปีที่แล้ว +1

    genial muchas gracias me sirvio mucho ! esa pregunta me la hicieron en mi ultima entrevista, en si el concepto era bastante similar: tener una aplicacación que permita al usuario visualizar y escribir un mensaje y guardarlo en la db pero esta app podian consumirla varios usuarios simultanamente.

  • @franciscojesusmartinezdura4748
    @franciscojesusmartinezdura4748 3 ปีที่แล้ว

    Mola mucho esto de proponer problemas y resolver lo en el próximo vídeo 👏

  • @FlightgearTutorials
    @FlightgearTutorials 3 ปีที่แล้ว +4

    Muy buen video. Yo lo que mas estoy esperando es un video CLARO (solo como tu sabes hacerlos, que lo dificil parezca facil) sobre (DI) Dependency Injection en la serie de Patrones de Diseño. Please !!! Jejeje

  • @carlosjavierbellotti6660
    @carlosjavierbellotti6660 3 ปีที่แล้ว +1

    Muy bueno el planteo. Respecto al próximo problema creo que se puede solucionar con un stack, haciendo push en en el stack cuando tenes un carácter de apertura ((, [ o { ) y cuando son de cierre ( ), ] o }) hacer un pop comprobando que lo que acabamos de levantar de la pila se corresponda con el carácter de cierre, si no llega a corresponder o la pila se encuentra vacía al momento de hacer el pop es incorrecto. Abrazo!!!!

  • @pablorequejo5680
    @pablorequejo5680 3 ปีที่แล้ว +5

    He empezado a ver hace poco tus vídeos ya que son muy explicativos y ahora estoy enganchado, gran trabajo! Una pregunta soy una persona que viene de la rama mixta y desde hace unos años trabajo para una empresa de desarrollo de proyectos dentro del mundo TI. Gracias a esto ha crecido mi interés por toda la parte técnica del diseño de sistemas y me gustaría conocer cuál sería tu mejor opción para adquirir este mayor detalle técnico de diseño de sistemas y programación? Gracias!

  • @Swilarx19
    @Swilarx19 3 ปีที่แล้ว

    Pues fue un buen video, me agrada este tipo de problemas que desarrollan habilidades para ser un buen programador, estuvo increible espero mas resoluciones así y tambien sugerencia para practicar nosotros tambien! Aún no me han preguntado ello estoy en la facultad aún pero gracias!.

  • @leow375
    @leow375 3 ปีที่แล้ว

    Muy buen video betta!!

  • @sadielottenwardel331
    @sadielottenwardel331 3 ปีที่แล้ว

    Me gustan mucho estos vídeos, aprendo muchísimo

  • @javieraleangonzalez4786
    @javieraleangonzalez4786 3 ปีที่แล้ว +14

    Ahhhh, Primer Comentario, felicidades por tus videos, cada día mejoran más (producción) y se vuelven más interesantes, Saludos desde Colombia!!!

    • @BettaTech
      @BettaTech  3 ปีที่แล้ว

      Gracias y saludos desde España!! :D

  • @marialejandrausart4162
    @marialejandrausart4162 3 ปีที่แล้ว +1

    Dejo un tip: todo estos problemas los vez en la facultad, a mi lo que me pasa es que cuando presentas titulo es como que ni pasas por la entrevista tecnica porque en realidad si los rrhh hicieron su trabajo al leer sus programas de estudios ya esta claro, es como preguntarle a un corredor de formula uno si sabe conducir, pero si lo hacen para aquellos que son autodidactas a la marcha, va en resumen con titulo la entrevista dura minutos sin titulo la entrevistas pueden ser varias fases. Y si vez que como profesional te preguntan cosas absurdas ya como que a prender la alarma y pensarlo.

  • @fernandiwxbc13
    @fernandiwxbc13 3 ปีที่แล้ว

    Me gusta la solucion que diste, simple y real. De igual forma, generaria un microservicio dedicado a los vuelos (o abstraerlo por completo a un servicio de consulta y reporte y usarlos desde otros microservicios si esta tarea se piensa extender a mas entidades), y si no es mi prioridad controlar de alguna forma especifica la cola de peticiones y como atenderla usaria alguna base de datos en tiempo real o un CaaS (los cuales incluso ya manejan la logica de Key/Value) y delegar la concurrencia a un recurso dedicado a esto.
    Editado: Creo que para el problema del final de video, si el lenguaje lo soporta utilizaria una regular expression, pero desconozco si es la mejor alternativa.

  • @DavidCervantes.
    @DavidCervantes. 3 ปีที่แล้ว +1

    Podemos tener un arreglo de variables que "abren" ({[ y otras que "cierran" )}].
    Siempre podemos permitir que allá variables que abren, estás las escribimos en una pila, pero si se detecta que hay una que cierra está la tenemos que comparar con la cabeza de la pila, y si es la misma está bien, se sigue iterando a las demás posiciones haciendo lo mismo.
    Pienso que está podría ser una solución... Aunque tal vez no la más óptima.
    Excelente video!

  • @joaquinvilchez5846
    @joaquinvilchez5846 3 ปีที่แล้ว +1

    Genial!! Ojalá a puedas hacer mas ejercicios prácticos sobre diseño de sistemas, no hay mucha data de eso...
    Gracias

  • @pepeluis766
    @pepeluis766 3 ปีที่แล้ว

    Muy buen vídeo y solución al problema.
    Se me ocurren un par de optimizaciones,
    crear una tabla de destinos con un id autoincremental y el nombre.
    Luego trabajar en la tabla muchos a muchos destino-destino con los id, creo que las lecturas-escrituras y espacio de esa tabla se optimizaría.
    Otra mejora que se me ocurre podría ser un sistema de replicación de información con servidor de bases de datos maestro y varios esclavos.
    También existe la posibilidad de crear una caché en el cliente que accede a los datos (actualizando la caché de manera asíncrona) para que tenga la última versión de la base de datos. Esto puede traer problemas pero es otra opción.
    Gracias por el vídeo, está genial!

  • @nicolasa.bermellferrer8025
    @nicolasa.bermellferrer8025 3 ปีที่แล้ว +1

    Me encanta este canal

  • @shelu17
    @shelu17 3 ปีที่แล้ว

    Diría que falta un sistema de colas como kafka , rabbit y el evento de dominio a encolar es la consulta de pares de aeropuertos/ciudades. Un saludo ! :) gran video !

  • @moisescaicedo4078
    @moisescaicedo4078 3 ปีที่แล้ว +14

    Esa fue una de las preguntas en mi primera entrevista de trabajo.

  • @CulturaDevOps
    @CulturaDevOps 3 ปีที่แล้ว

    buenisimo este video gracias por comparti esto

  • @lucian1320
    @lucian1320 3 ปีที่แล้ว

    Que buena serie de videos!

    • @BettaTech
      @BettaTech  3 ปีที่แล้ว

      Gracias!!!!!!

  • @tutistar96
    @tutistar96 3 ปีที่แล้ว +2

    Recuerdo haber visto ese problema en la materia de compiladores cuando estaba en la universidad, me dieron ganas de leer esos apuntes de autómatas y pilas.

  • @eduardozepeda1972
    @eduardozepeda1972 3 ปีที่แล้ว +1

    Hay un ejercicio parecido en js-assesment de github. Son una serie de problemas para evaluar el conocimiento de Javascript, están interesantes.

  • @GerentedeSistemas
    @GerentedeSistemas 3 ปีที่แล้ว

    Una de las entrevistas para un puesto laboral mas difícil que me sucedió, no fue precisamente técnica, si no fue una mesa redonda entre 5 entrevistadores y yo, todos ellos expertos en diversas áreas, tuve a mi favor que me desenvuelvo muy bien en cualquier nivel y eso fue el valor diferente por el que me dieron el puesto de Gerente de tecnologías de información y procesos para una entidad de gobierno, mas allá de mi pericia técnica y el PMP.

  • @kaelt75
    @kaelt75 3 ปีที่แล้ว

    Hola, genial todos tus videos :D, muchas gracias por ellos. Solo me quedá una duda, ¿durante la entrevista lo que tu entregaste fueron los dibujos que nos mostraste?

  • @eduardomurrieta1367
    @eduardomurrieta1367 3 ปีที่แล้ว +1

    Si es una BD relacional y declarar el ID o su identificador PK no tendría por que pasar lo de perder datos, a lo máximo a pasar es que uno de los dos de fallo. Al ser PK automáticamente tiene que ser único y no repetir, pero al final si tendrías que implementar la solución que dan en el vídeo.

  • @Kevin-et9jy
    @Kevin-et9jy 3 ปีที่แล้ว

    Molaría un video sobre ACID vs BASE y llegar un poco a las bases de datos de grafos como Neo4j

  • @sentadoensilla
    @sentadoensilla 3 ปีที่แล้ว

    Muy buena forma de resolverlo! Yo hubiera pensado en hacer una tabla de registros tipo bitácora: bitacora(idreg int, fecha timestamp, ip text, navegador text, os text, origen text, destino text ) index (fecha, origen, destino) sin PK o FK, registrando con la API todas las búsquedas, Luego ampliar la API para que consulte dicha tabla cada N segundos, devolviendo los pares origen-destino con su frecuencia de acuerdo al mes actual o un período específico de tiempo. Claro que también se podrían saber sólo los destinos, los orígenes u otros datos de acuerdo a la tabla. El único prooblema sería que de acuerdo a la cantidad de registros, la consulta cada N segundos sería más o menos impactante para la DB.

  • @dan6577
    @dan6577 3 ปีที่แล้ว

    Hola, me llamo Daniel De Paz saludos desde El Salvador, me pareció bastante interesante el ejercicio que dejaste al final del video así que me puse a resolverlo, no sé si sea la mejor forma de hacerlo o esté totalmente correcto ya que solo hice algunas pruebas pero aquí lo dejo por si lo quieren revisar, lo hice en javascript:
    const validateBrackets = (textToTest) => {
    let valid = true;
    let charArray = textToTest.split('');
    let map = new Map([
    ['{',{rep:0,pos:[]}],
    ['[',{rep:0,pos:[]}],
    ['(',{rep:0,pos:[]}],
    [')',{rep:0,pos:[]}],
    [']',{rep:0,pos:[]}],
    ['}',{rep:0,pos:[]}],
    ]);
    let closingBrackets = new Map([
    [')',{opos:['{','['],recipr:'('}],
    [']',{opos:['{','('],recipr:'['}],
    ['}',{opos:['(','['],recipr:'{'}],
    ]);
    charArray.forEach((char,index) => {
    map.set(char,
    {
    rep:(map.get(char)===undefined)?1:map.get(char).rep+1,
    pos:(map.get(char)===undefined)?[index]:[...map.get(char).pos,index],
    });
    if(closingBrackets.get(char)){
    let recipr = closingBrackets.get(char).recipr;
    closingBrackets.get(char).opos.forEach(c => {
    if(map.get(c).pos[map.get(c).pos.length-1]!==undefined)
    if(map.get(c).pos[map.get(c).pos.length-1]>map.get(recipr).pos[map.get(recipr).pos.length-1]) valid = false;
    });
    map.get(recipr).pos.pop();
    }
    });
    return valid;
    }
    console.log(validateBrackets("[()([)]")); //Incorrecto
    console.log(validateBrackets("[()()]")); //Correcto
    console.log(validateBrackets("[()]{}{[()()]()}")); //Correcto
    console.log(validateBrackets("[(])")); //Incorrecto

  • @Unknown971
    @Unknown971 3 ปีที่แล้ว +1

    Muy buen video, muy util la verdad. Me genera una duda en el punto de hacer una transaccion atomica, ya que a mi me gusta mas es estilo de tener la logica en un solo lugar (por ejemplo, generar tablas virtuales para trabajar con los datos, como por ejemplo entity framework), ya que lo considero mas ordenado que tener logica en la base de datos y en la aplicacion en si. ¿Sabrias cual seria el equivalente (o de que forma se haria) para hacer esto desde el lado de la aplicacion?

  • @migcon67
    @migcon67 3 ปีที่แล้ว

    Muy bueno como siempre. el universo es confuso realmente

  • @Renzofranche770
    @Renzofranche770 3 ปีที่แล้ว +8

    Hola tengo 17 años y soy un estudiante de ingeniería informática. Tu canal me ayudó e inspiró mucho, graciaaaaaasss:)

  • @popularfan5893
    @popularfan5893 3 ปีที่แล้ว

    Puedes hablar del tema seguridad, autenticacion en webservices ? Es decir que solo puedan acceder al webservices solo ciertos clientes y que ademas los datos esten de alguna manera encriptados.

  • @Dev403M
    @Dev403M 3 ปีที่แล้ว

    Gran video!!! Saludos!.

    • @BettaTech
      @BettaTech  3 ปีที่แล้ว +1

      Gracias! 😊

  • @paumasabad1449
    @paumasabad1449 3 ปีที่แล้ว

    ¡Gran video! Tengo una duda acerca de la orientación laboral: si quiero ser software developer pero elijo la mención en tecnologías de la información, me será más difícil?

  • @jonthan34
    @jonthan34 3 ปีที่แล้ว +2

    Me gusta mucho el contenido. Por favor mantén el formato... primero intro luego publicidad 👍🏼

  • @sebasppp
    @sebasppp 3 ปีที่แล้ว

    Nuevo sub. Gracias

  • @LuisLopez1099llg
    @LuisLopez1099llg 3 ปีที่แล้ว +5

    El problema del final me lo dejaron de tarea en la universidad :0
    Jaja

  • @francocaballero4835
    @francocaballero4835 3 ปีที่แล้ว +1

    Excelente!!!

  • @gustavoandres1792
    @gustavoandres1792 3 ปีที่แล้ว

    Muy bueno el video, pero si trabajas con tablas sql, podrias sin necesidad de atomizar la consultar (es decir meterla en una transaccion esperando a otra consulta), realizar un update en la cantidad haciendo UPDATE table SET cantidad +1 where key = "clave q lei", es decir la suma no depende de la concurrencia sumas 1 al valor de la cantidad q ya estaba independientemente de la lectura

  • @ThePomelo09
    @ThePomelo09 3 ปีที่แล้ว

    Buenas, como estas? que libro, curso/tutorial completo me recomiendan para empezar de cero con diseño de sistemas?

  • @yumix77
    @yumix77 ปีที่แล้ว

    Interesante video.
    Solo un pequeño comentario. En la solución al problema de la doble escritura en la base de datos mencionas que debe ser atómica, y en el caso de la base de datos relacional transaccional. Realmente eso no es suficiente, porque depende del aislamiento de dicha transacción. Si el aislamiento es serializable o lectura repetida si funcionaria, porque hace un lock de dicha linea de la base de datos, pero si es otro tipo de aislamiento como "read comitted" (por defecto por ejemplo en Oracle) "read uncommitted", entonces podrías tener exactamente el mismo problema, independientemente de que la ejecución sea transaccional o atómica.

  • @22panchy
    @22panchy 3 ปีที่แล้ว

    Bonito problema final. Existen dos aproximaciones. La corta y bonita sería una función recursiva pura, pero hay que tener cuidado con el tamaño de la pila de llamadas, por otro lado está la forma liosa pero más eficiente, que sería una función iterativa.

  • @CragCode
    @CragCode 3 ปีที่แล้ว

    El ejercicio del final ya lo habia visto en codewars

  • @ManuelMartinez-sl7op
    @ManuelMartinez-sl7op 3 ปีที่แล้ว

    Me queda la duda al igual que a varios, ya que al hacer n^2 se piensa en una permutaciones es decir la conexión Madrid-Barcelona y Barcelona -Madrid cuentan como pares distintos, el problema inicial nos pedía que contaramos la petición en un par de aeropuertos dado, que no sería mejor pensar en un combinación es decir n! /((n-2)!2!), que daría la mitad del cálculo original, ya que da lo mismo el orden de donde se haga la petición solo importa el par de conexión???

  • @EzequielRegaldo
    @EzequielRegaldo 3 ปีที่แล้ว +2

    Se me ocurre un modelo mejor : { from : (aeropuerto), to : (aeropuerto), flights : (number) } con eso podrías usar un grafo :P

  • @Soy_Kenneth1993
    @Soy_Kenneth1993 3 ปีที่แล้ว

    Yo había hecho un Dashboard con algo parecido a lo que presentaste

  • @SolucionesELP
    @SolucionesELP 3 ปีที่แล้ว

    Tal vez usando diccionario en python con key los aeropuertos A y B, el valor las veces que se repite.

  • @estrelladelsurjudiciales5259
    @estrelladelsurjudiciales5259 2 ปีที่แล้ว

    Buenas humilde aporte, si para identificar un aeropuerto solo se cuenta con 3 caracteres, ejemplo el primer aeropuerto AAA y el ultimo ZZZ por combinatoria ( son 26 si no contamos la Ñ) 26 X 26 X 26 = 17.576, según comentas te informaron que son 40.000 aprox. así que estimo que serian del tipo char y también numéricos, ( letras 26 + números 10 ) 36 X 36 X 36 = 46.656.- (este nro es el máximo alcanzable )
    Esta forma de verlo puede ayudar a estimar, si es que no se cuenta con el dato de que hay 40.000 aeropuertos,. O para saber cual seria la maxima capacidad posible (46.656 todas las combinaciones ) y la capacidad real los aeropuertos funcionando ( 40.000 aprox ).-

  • @jorgelopezcabrera1658
    @jorgelopezcabrera1658 3 ปีที่แล้ว

    Para el problema de la concurrencia, yo lo resolvería con un procedimiento almacenado en la DB, la base de datos automáticamente se encargaría de gestionar la cola de ejecución del procedimiento y mantener la secuencia de los datos

  • @Luis-ww1kx
    @Luis-ww1kx 3 ปีที่แล้ว +25

    10:00 no es n al cuadrado, es n * (n - 1); esto es porque no puedes viajar desde el punto a al a... ya estás ahí 😅

    • @gidraxl.6082
      @gidraxl.6082 3 ปีที่แล้ว +4

      tienes razon, sin embargo es mejor utilizar una cota superior fácil de usar como n * n y ademas, es más comprensible

    • @rbjmalca2
      @rbjmalca2 3 ปีที่แล้ว

      de razón no le llamaron

    • @VallenatoDelAlma
      @VallenatoDelAlma 3 ปีที่แล้ว

      Tenia el mismo comentario, chevere la aclaración, buenos videos saludos

    • @grl4171
      @grl4171 3 ปีที่แล้ว +1

      @@gidraxl.6082 ¿por qué es más comprensible?, todas las combinaciones posibles es n por n --> n^2 de ahí quitas lo que por condiciones de contorno no se puede dar , no valen combinaciones contigo mismo le restas n (que son los elementos únicos) no te valen permutaciones divides entre dos. Es combinatoria básica, cualquier ingeniero debería pensar así y no en una fórmula al aire genérica, porque cada problema es un mundo.

    • @gidraxl.6082
      @gidraxl.6082 3 ปีที่แล้ว

      @@grl4171 claro pero a efectos prácticos se usa una cota superior sencilla. En este caso n^2. Si quieres mas información investiga sobre "Big-O notation"

  • @andresmauriciovalderramagi6138
    @andresmauriciovalderramagi6138 3 ปีที่แล้ว

    Los pares de aeropuerto a-b no seria
    40000 combinado 2?? O en su defecto 40000 permutado 2??

  • @meiffel4874
    @meiffel4874 3 ปีที่แล้ว

    tengo una duda... es valido responder con un diagrama de flujos? casos de uso? es que ando viendo la materia y no veo donde entran estrcutruas si todo es codigo y corridas en frio :C , muchas gracias por el video esta genial tu canal!

  • @johncerpa3782
    @johncerpa3782 3 ปีที่แล้ว

    Buen video

  • @marioagostinelli5827
    @marioagostinelli5827 ปีที่แล้ว

    12:58 en este caso, no seria necesario tambien contabilizar desde B-A? para diferenciar el lugar de origen/destino?

  • @kenethsandoval2641
    @kenethsandoval2641 3 ปีที่แล้ว

    ¿Para cuando los directos en twitch?😎

  • @arnaucastellvi
    @arnaucastellvi 3 ปีที่แล้ว +2

    Se puede reducir un poco el tamaño suponiendo que el origen y el destino no sera el mismo aeropuerto, por lo que serian 40.000 X 39.999 pares.
    Por otra parte, yo habría presentado los datos en capacidades binarias (MiB y no MB), pero eso va a gustos.

    • @andresandreti
      @andresandreti 3 ปีที่แล้ว +1

      siendo más rigurosos seria permutado 2, además tampoco se especificó si se debe diferenciar los viajes de A a B y de B a A, si no es necesario seria combinado 2.

  • @kingskull619
    @kingskull619 3 ปีที่แล้ว

    El problema se soluciona con un stack
    Iteras por cada carácter, si es un carácter de apertura "( [ {" lo metes al stack.
    Si es de fin ") ] }" haces pop, y checas, si el carácter del stack no coincide con el de fin (paréntesis con paréntesis y así) si no coincide está mal y lanzas un error. Si si está bien continuas.
    Si al final de iterar el strings el stack está vacío está correcto, si aun tiene valores está mal.

  • @lucaslorenzo361
    @lucaslorenzo361 3 ปีที่แล้ว +1

    Alguien más está viendo este video sin saber casi nada de programación y no entendiendo una mierda salvo los nombres como "sql, mongo, etc" ? jajaja quisiera saber tanto como esta persona :( buenos videos crack!

    • @pablopalma2862
      @pablopalma2862 3 ปีที่แล้ว +4

      La concurrencia es cuando dos procesos se ejecutan al mismo tiempo. El problema con esto es que al haber mas de 1 proceso accediendo a los mismos datos, estos pueden que no se guarden segun lo esperado y que haya algun conflicto. Por eso la solucion propuesta por Betta es que solo se permita acceder a la BD de modo sincrono, que no haya mas de un hilo a la vez modificando los datos. Eso para evitar posibles conflictos con los datos.
      Depues hablo de la estimación del tamaño, aca dijo que cuanto es el peso aproximado que puede llegar a tener la base de datos, asi como cualquier archivo, una musica, una imagen, en este caso una base de datos. El calculo los posibles datos que se pueden guardar en ella y asi sacar una estimacion de lo que va a pesar la base de datos.
      Igual si no entendiste el video, menos creo que entendas esto jaja, pero bueno volve a ver el video e intenta buscar en el google lo que no tendas bro.
      Suerte y a seguir dandole!

  • @LuisRuizHalo
    @LuisRuizHalo 3 ปีที่แล้ว

    Una opción práctica para un sistema con una buena carga sería poner un collector de datos con un simple endpoint (potencialmente pudiendo ser gRPC streaming unidireccional) que envíe datos periódicamente de los vuelos a través de un stream (AWS Kinesis o Apache Kafka), el cual contenga un grupo de consumidores donde se encuentren los nodos workers (procesadores) que se encarguen de agregar los datos en el data lake Key-Value (potencialmente pudiendo ser una tabla AWS DynamoDB). Cabe recalcar que, como siempre, nuestros procesadores deben cumplir con la regla de idempotencia.
    Para finalizar, la aplicación GUI de analítica hipotética lee de este data lake los agregados en tiempo real con algún websocket o usando igualmente gRPC con streaming full-duplex.

    • @LuisRuizHalo
      @LuisRuizHalo 3 ปีที่แล้ว

      PD: Se puede tener una arquitectura completamente serverless con AWS Kinesis o SNS/SQS, Lambda, DynamoDB, Route53, CloudFront y API Gateway. (Sin contar S3 con CloudFront para algún sitio web para la aplicación GUI)

  • @MaximoPower2024
    @MaximoPower2024 3 ปีที่แล้ว

    Como no sé mucho de bases de datos, mi solución al problema fue otra: tenemos un conjunto de arrays, pongamos 100 diferentes, y cada uno de ellos tiene 100 valores, consistentes a su vez en un array inicialmente vacío.
    Cada vez que entra una nueva consulta de aeropuertos del frontend, obtenemos un número aleatorio de 1 a 10.000, creamos un objeto que represente la solicitud (el más simple sería una cadena de 6 caracteres) y lo añadimos al array correspondiente al número aleatorio. De esta manera, podríamos tener a miles de usuarios enviando datos a la vez sin apenas colisiones (un porcentaje despreciable).
    Luego, cada cierto periodo de tiempo, por ejemplo una hora, copiariamos los arrays, los reseteariamos, y con los datos de las copias haríamos la operación de incremento en la base de datos.
    Con esto tanto las colisiones como el tiempo de inactividad sería mínimo. Hay que tener en cuenta que hacer muchas operaciones pequeñas en una base de datos supone una gran cantidad de tiempo, lo que su vez incrementa la probabilidad de que se produzcan cuellos de botella.
    Por eso me parece interesante solucionar el asunto en el nivel previo, en lo que sería la RAM.

  • @ciberhormaza
    @ciberhormaza 3 ปีที่แล้ว

    yo lo habría hecho con una combinación de microservicio+logstash, podria solucionar el desafío y servir para explotar mucha más información

  • @aigon777
    @aigon777 3 ปีที่แล้ว

    Para no generar bloqueos, si este proceso no fuese crítico, podrías usar una cola de mensajes. Publicas ahí una nueva "búsqueda", y otro proceso se encargaría de ir consumiendo esa cola de mensajes. Puede parecer muy lento, pero realmente funcionan muy rápido y son muy versátiles.

    • @aigon777
      @aigon777 3 ปีที่แล้ว

      Y como seguramente tengas los aeropuertos en otra tabla, puedes hacer que la clave sean id de aeropuerto A, e id de aeropuerto B, reduciendo el tamaño de la base de datos.

  • @alfoorego8380
    @alfoorego8380 3 ปีที่แล้ว +1

    7:40
    Eso se resuelve si metes la actualización en una transacción

  • @djthdinsessions
    @djthdinsessions 3 ปีที่แล้ว

    Un redis te lo resuelve en dos patadas y ya tiene la instrucción incr que es atómica y te quitas el problema de concurrencia, gestion de bbdd y demás de un plumazo

  • @MinombreesSergio
    @MinombreesSergio หลายเดือนก่อน

    Pues no sé yo, yo lo hubiera planteado guardando cada búsqueda con su IP, ubicación, y un token de usuario, para luego tener esa data para minería o para Big Data, pero claro, depende mucho de lo que necesite el producto.

  • @dalilabenkaddour6767
    @dalilabenkaddour6767 3 ปีที่แล้ว

    Aquí está mi solución al problema del final:
    github.com/satinfive/betta_tech_string_problem
    Muy interesante el planteamiento del sistema :) Muy similar a lo que se me hubiese venido a la cabeza en primera instancia, aunque agradezco la completitud del planteamiento, llegando a analizar hasta cuánto ocuparía la BD. Si bien al principio pensé en un sistema de colas, quizás, pero a lo mejor se hacía demasiado para el planteamiento del problema.
    ¡Gracias!

  • @pablino234
    @pablino234 ปีที่แล้ว

    Todo es UML de casos de uso cierto ?

  • @Alkchofa
    @Alkchofa 3 ปีที่แล้ว

    Me gusta pensar este problema con una base de datos basada en grafos.. Por alguna razón no sería una buena idea? 🤔

  • @rafaelpereiraarias
    @rafaelpereiraarias 3 ปีที่แล้ว

    Para cuando un video con el canal @holamundo?

  • @JuanCamiloSutachanTrujillo
    @JuanCamiloSutachanTrujillo 3 ปีที่แล้ว

    El número de pares que tendrías no sería 40000 choose 2? Porque que n^2 sólo es el número de formas en que podemos combinar todos los elementos.

  • @maxbarcon
    @maxbarcon 3 ปีที่แล้ว +1

    Problema:
    Tendría una variable para cada caracter y iteraría por la string, cada vez que me encuentre un carácter abierto ( [ { le sumo 1 a su correspondiente variable y si está cerrado ) ] } le resto 1, en caso de que cualquiera de las variable sea negativa significa que se ha cerrado más veces de las que se ha abierto y termino el bucle y devuelvo false, si se termina el bucle y cualquiera de las variables es mayor que 0 significa que se ha abierto más veces de las que se ha cerrado y devuelvo false, si no, pues es que es correcto :D

    • @BettaTech
      @BettaTech  3 ปีที่แล้ว +1

      Cómo se comporta tu algoritmo con el siguiente string 🤔? [{]} (debería dar false porque no está bien construido)

    • @maxbarcon
      @maxbarcon 3 ปีที่แล้ว +1

      @@BettaTech Buff esto me complica las cosas. No se si se puede continuar como lo estaba haciendo pero tengo otra solucion :)
      Lo que haría sería una pila de carácteres y cada vez que llegue un carácter abierto se pondría en la pila, cuando llegue uno cerrado, mirará en la cima y si es su carácter opuesto lo "quitas" de la pila, en caso contrario o en el caso que la pila no quede vacía al final de la iteración, es que no es correcto.

    • @joaquinllallire6744
      @joaquinllallire6744 3 ปีที่แล้ว

      @@BettaTech Si pongo esa cadena efectivamente sale false. Lo hice con Javascript tu creas que lo puedas revisar he probado con varias cadenas y hace la validación correctamente. Te dejo el link del código paiza.io/projects/CcIW9gY6Y9YxpgXS3Cl-IQ#&togetherjs=kf8MTAe0Uq

  • @aprende-computacion
    @aprende-computacion 2 ปีที่แล้ว

    40k^2 no creo, quizás sería 40k^2*media de conexiones de un aeropuerto no?, que opinas?

  • @junama
    @junama 3 ปีที่แล้ว +1

    16 Gb de sistema concurrente me parece que puede haber cuello de botella en el motor de base de datos, depende de cuántas búsquedas por segundo se hagan, yo empezaría a mirar sistemas cloud que aceptaran colas de mensajes, y que cada mensaje fuera a una función lambda creada para cada par de asociaciones (limitada a concurrencia 1), y desde ahí simplemente crear un archivo en DynamoDB e ir incrementándolo en cada llamada.
    Y a pesar de que Mongo te da opción para incrementar, y veo bien comentarlo, creo que en rendimiento en paralelo pierde mucho

    • @pablopalma2862
      @pablopalma2862 3 ปีที่แล้ว

      Si 16 gb de datos, cada consulta puede demorar una eternidad, imaginte si son miles de consultas por segundo. Te hago una consulta bro, si los datos se acceden de forma asincronica en diferentes hilos, supuestamente se dice que es mas rapido que acceder de forma sincrona, ¿esto es cierto? si fuese falso es preferible que los datos se accedan de forma secuencial y no paralela. Así mentenemos integros los datos sin causar algún conflicto creo yo

  • @lolimilesi1291
    @lolimilesi1291 3 ปีที่แล้ว +2

    el ejercicio se puede hacer con una expresión regular?

  • @marlon5013
    @marlon5013 3 ปีที่แล้ว +1

    Hola, yo lo solucionaría usando un stack, algo más o menos así.
    static String isBalanced(String stringToCheck) {
    Stack stack = new Stack();
    for (char currentChar : stringToCheck) {
    if(isOpening(currentChar)) stack.push(currentChar);
    else if(stack.isEmpty()) return "INCORRECTO";
    else if(isComplement(stack.top(), currentChar)) stack.pop();
    else return "INCORRECTO";
    }
    if(stack.isEmpty()) return "CORRECTO";
    return "INCORRECTO";
    }

    • @jcoucelanga4373
      @jcoucelanga4373 3 ปีที่แล้ว +1

      ciclomatic complexity over 5 please review your code :D

  • @elchewin9243
    @elchewin9243 3 ปีที่แล้ว

    no sabia que el de Vsauce hablaba español y a la vez programaba

  • @JessHilario
    @JessHilario 3 ปีที่แล้ว

    Buen video, ese ejercicio recuerdo haberlo hecho en la universidad aunque la verdad no recuerdo como lo resolví xD así que te dejo mi re-interpretación de la solución en JS codesandbox.io/s/problema-bettatech-dr7oj?file=/src/index.js saludos!

  • @PositronQ
    @PositronQ 3 ปีที่แล้ว +1

    Se que esto es algo de pila y se necesita conocimientos de paréntesis balanceados en donde si lo hacemos en Python lo haría con la librería import pila

  • @jonathanhernandezcastellan1212
    @jonathanhernandezcastellan1212 3 ปีที่แล้ว

    El caso de uso

  • @relarbaelish
    @relarbaelish 3 ปีที่แล้ว

    No deberían ser 7 bytes para el key? Faltaría el guión que separa a los dos aeropuertos.
    Por cierto, el problema final creo recordar que se resuelve con pilas (creo haberlo visto en Sintaxis y Semántica de los Lenguajes).

    • @heatxtm
      @heatxtm 3 ปีที่แล้ว +1

      te puedes ahorrar el guión, ya que siempre son 3 caracteres en los códigos de aeropuerto
      al leerlo después, tan solo haces el split

  • @vicenttortosa7680
    @vicenttortosa7680 2 ปีที่แล้ว +1

    No hay 400^2 pares… hay que restarle 40K para quitar los emparejamientos con uno mismo

  • @claudioj.4512
    @claudioj.4512 3 ปีที่แล้ว

    ¿No estarías cometiendo un error en dejar en la tabla los pares de aeropuertos como strings?. En otra tabla deberías poner los 40000 aeropuertos con una clave numérica asociada y luego en la tabla de registro hacer referencia a esas claves numéricas en vez de utilizar un string de 6

  • @maso1483
    @maso1483 3 ปีที่แล้ว +1

    Mi cara cuando escuché terabytes
    'o' ?
    Jaja buen video, gracias

  • @vidasimple6611
    @vidasimple6611 3 ปีที่แล้ว

    9:51 40mil al cuadrado? 🤔 Si no me equivoco sería factorial, ya que descartas los que salen y van al mismo sitio. Si tenés 3 aeropuertos, A, B y C tenemos los pares A-B, A-C, B-C, B-A, C-A y C-B... 3! No 3cuadrado (no contas A-A ni B-B ni C-C)

    • @BettaTech
      @BettaTech  3 ปีที่แล้ว +1

      Seria N * (N - 1), pero cuando te acostumbras a hacer cotas superiores, acabas simplificando casi todo como si fuera asintótico, que es lo que me ha pasado aqui xD (O(N*(N-1)) es equivalente a O(N*N))

  • @kketoo_
    @kketoo_ 3 ปีที่แล้ว

    Me ha gustado mucho la idea de proponer un problema. Te mandamos la solución y lo comentas en el siguiente video?

    • @BettaTech
      @BettaTech  3 ปีที่แล้ว +2

      En el siguiente video propondre una solución y enseñare las que me hayan parecido interesantes ☺️

  • @flavioe.salasm.9922
    @flavioe.salasm.9922 2 ปีที่แล้ว

    todo esto se resuelve con programacion del lado del servidor de bases de datos...
    procedimientos almacenados

  • @tomasromero3314
    @tomasromero3314 3 ปีที่แล้ว

    hola betta tech , queria saber que te parecia este plan de estudios para data science
    , siento que la formacion matematica es media escasa y queria saber tu opinion al respecto saludos y gracias por los videos, son de mucha utildad.
    unab.edu.ar/LIC-Ciencia-Datos-PE-2020.pdf

  • @finnelhumano3326
    @finnelhumano3326 3 ปีที่แล้ว

    Creo que esto se llama el problema de los lectores y escritores en programacion concurrente.. Se resulve con semaforos o monitores (al menos asi me lo enseñaron a mi)