Feda /dev/ - No Javascript allowed

Normas
spoiler
Personas non gratas
Memes feda dev




desu

#60420 no xq la primera parte de la entrevista SIEMPRE es resolver las asumciones y restricciones del problema. por ejemplo, tu me has hablado de un posible buffer, y te lo desmonto rapido.

que dudas tienes?

una pregunta no espera una respuesta exacta, espera una conversacion donde se ve el conocimiento tecnico y experiencia del candidato... la pregunta es lo de menos. yo por ejemplo se que eres un junior jugando a CTO en empresas paco solo leyendote por el hilo, no tienes ni puta idea de nada de lo que dices.

1 respuesta
Runig666

#60421 Es decir, que en vez de arreglar la entrevista/problema para que cualquiera entienda el contexto, prefieres tirar el tiempo de todas las personas involucradas?

2 respuestas
desu

#60422 No, xq la entrevista es la conversacion.

Google: system design interview steps

Clarify the problem and establish design scope (https://www.freecodecamp.org/news/system-design-interview-practice-tutorial/)

SDIs are unstructured, where candidates are asked to take on an open-ended design problem that doesn’t have a standard solution.
Requirements clarifications: Always ask questions to find the exact scope of the problem you are solving.
(https://www.designgurus.io/blog/step-by-step-guide)

1 respuesta
Runig666

#60423 Entonces la unica respuesta correcta es que ese codigo esta tan sumamente bien o tan sumamente mal como lo este el contexto. Y luego tu ya te tiras 30 minutos contandome tu rollo

1 respuesta
desu

#60424 osea que eres incapaz de realizarme preguntas para scopear el problema a resolver. junior. no hire.

se nos atraganta una pregunta de un system design de un CRUD.... HAHAHAHAHAHHAHAHAHAH madre mia el nivel, peor que un junior, hasta un junior sabe hacer un CRUD.

1 respuesta
Mewtwo

#60422 sin intención de dar la razon a desu, pero normalmente en este tipo de entrevistas lo normal es preguntar todas esas dudas.

Asi se ve también si el entrevistado esta un ppco avispado. No asumiria tantas cosas como ha hecho desu.

Pero si preguntaria

1 1 respuesta
Runig666

#60425 Es que si el que me tienes que contratar eres tu, tendría que cobrar solo por hacer la entrevista y aguantarte XD
#60426 Si claro que es normal preguntar...lo que no es normal es tener que preguntar cada una de las funciones que hay ahí, eso no es una prueba tecnica, es un coñazo

1 respuesta
desu

https://github.com/donnemartin/system-design-primer?tab=readme-ov-file#how-to-approach-a-system-design-interview-question

Step 1: Outline use cases, constraints, and assumptions

Gather requirements and scope the problem. Ask questions to clarify use cases and constraints. Discuss assumptions.

Who is going to use it?
How are they going to use it?
How many users are there?
What does the system do?
What are the inputs and outputs of the system?
How much data do we expect to handle?
How many requests per second do we expect?
What is the expected read to write ratio?

#60427 tranquilo, que no tienes nivel ni para ser mi becario y lo has dejado bien claro, y considerando que me doblas la edad... ya no hay vuelta atras. necesitarias estudiar 20 años para ser mi becario, y para entonces, estarias jubilado.

nse resuelveme el sistema que quieras, propon las asumpciones que quieras, hasta la del buffer si quieres... pero ya te he dicho q lo hace mas dificil.

propon el sistema que queiras con ese codigo, las asumciones que queiras, libertad absoluta.

estoy seguro que eres incapaz de diseñar cualquier sistema sin cagarte encima. aunque sea el escenario ideal que has hecho mil veces y lo tienes grabado a fuego en la cabeza, xq precisamente la gente haceis las cosas mal por eso he puesto ese ejemplo tan simple y estupido de un CRUD.

1 respuesta
Runig666

#60428

propon el sistema que queiras con ese codigo, las asumciones que queiras, libertad absoluta.

Es que a diferencia tuya...yo cobro por ello. Desde hace años ademas. De ahí que no vaya ofreciéndome a trabajar en cualquier empresa de los de este hilo.

1 respuesta
HeXaN

>este código es una mierda
>alguien lo mejora
>procede a asumir siete páginas de requerimientos que no estaban en el mensaje inicial

Basado.

8
Iselio

#60399 Yo de primeras diría que tu pseudocódigo está mal, qué es eso de:

if old_item == request.condition:

en el condition hay un item entero como para poder comparar? Implica que solo un item va a cumplir la condición? Al menos pon:

if check_condition(old_item, request.condition)

ya que así se puede asumir que la condición puede cumplirse para más de un item.

Luego ya hay que entrar a preguntar si en el get no se pueden filtrar directamente los items del condition, ya que al pasarle de argumento la request entera da a entender que algún tipo de filtro hay; si el update solo puede hacerse uno a uno o no; si hay problema con que no sea transaccional y soy el único que puede estar actualizando a la vez items, etc. etc. Falta mucho contexto.

1 1 respuesta
desu

#60429 Ah vale, que ahora resulta que las empresas se pelean por tu perfil. Tienes a Google y Apple soltandote 700k al año para que seas staff enginer y diseñes sus sistemas, pero tu prefieres ganar 40k al año en empresa Paquitox y Manolox enterprise.

2 respuestas
Runig666

#60432 Ah...por ti no?

desu

#60431 Esta bien, has resuelto el problema mas o menos como yo, q basicamente el objetivo es tener batch processing vs single processing. no es un problema tan dificil de entender. ya sea get con filtrado o update. tampoco hay que darle tantas vueltas como hace creer el fpero666...

la cosa es que si yo ahora miro tu codigo, de cualquier proyecto, cuantas veces vere esto:

for item in list:
  if check_cndition(item, condition):
     ...

o esto, si da igual, es lo mismo:

items.stream().filter(mypredicate).map(mymap).forEach(dispatch)

mal diseño de funciones, malos loops poco eficientes en localidad de CPU.

mal branch predictor, mal uso de caches de CPU, codigo imposible de paralelizar de manera eficiente... etc.

he buscado en spring project en github:
https://github.com/search?q=repo%3Aspring-projects%2Fspring-framework%20filter&type=code

for (Map.Entry<Handler, List<PathPattern>> entry : this.handlers.entrySet()) {
			if (!entry.getKey().supports(exchange)) {

MAL

public WebHttpHandlerBuilder filter(WebFilter... filters) {
		if (!ObjectUtils.isEmpty(filters)) {
			this.filters.addAll(Arrays.asList(filters));
		}

DOBLE MAL

https://github.com/spring-projects/spring-framework/blob/8d3d0e7ae511c03df15f77802a60a72cea0af47d/spring-webflux/src/main/java/org/springframework/web/reactive/BindingContext.java#L183

public void updateModel(ServerWebExchange exchange) {
		Map<String, Object> model = getModel().asMap();
		for (Map.Entry<String, Object> entry : model.entrySet()) {
			String name = entry.getKey();
			Object value = entry.getValue();
			if (isBindingCandidate(name, value)) {
				if (!model.containsKey(BindingResult.MODEL_KEY_PREFIX + name)) {
					WebExchangeDataBinder binder = createDataBinder(exchange, value, name);
					model.put(BindingResult.MODEL_KEY_PREFIX + name, binder.getBindingResult());
				}
			}
		}
	}

for, if if update!!! TRIPLE MAL

todo este codigo de spring es una puta porqueria. mal diseñado.

quizas la pregunta facil y simple, no era tan facil y simple si los fperos no saben aplicarlo o se hacen pajas con tener un update distribuido con buffers que almacenan los resultados parciales y blah blah blah. si luego no saben hacer un for loop.

todo esto en java abusando de vtables y dyamic dispatch.

public static void initBinder(DataBinder binder, MethodParameter parameter) {
			if (ReactiveAdapterRegistry.getSharedInstance().getAdapter(parameter.getParameterType()) == null) {
				for (Annotation annotation : parameter.getParameterAnnotations()) {
					if (annotation.annotationType().getName().equals("jakarta.validation.Valid")) {
						binder.setExcludedValidators(v -> v instanceof jakarta.validation.Validator ||
								v instanceof SmartValidator sv && sv.unwrap(jakarta.validation.Validator.class) != null);
					}
				}
			}
		}

hasta reflection.. mirando el nombre del paquete de la clase jaja

si tengo que destacar porqueria, creo que me voy a quedar con esta:

if (logger.isDebugEnabled()) {
						logger.debug(label + " '" + name + "' overridden by request bind value.");
					}

un if logger, y un logger que aloca una string en la heap en lugar de pasarle un consumer...

1 respuesta
Iselio

#60434 y si tienes la restricción de que 1- no se pueden filtrar items, tienes que tener el listado entero cargado en memoria (o paginado mejor) 2 - solo se puede actualizar los items de uno en uno.
cómo lo resuelves si no es así? guardandote los items a actualizar en un array diferente como has sugerido antes? y si son cientos de miles que vienen paginados?

1 respuesta
desu

#60435 podrias trabajar todo en stream y devolver solo los que han fallado por ejemplo. haciendo mini-batches a db si es posible. habria que definir que APi quieres.

nose, podiras hacer como lo hace el kernel de linux/bsd si quieres. tener un ring buffer interno. depende de los requerimientos tecnicos de la cola en concreto.

en el kernel las APIs habituales mantienen todos los items, si son 100k, son 100k que te devolvera OK o KO (simplificando, no es exatamente asi en todas, complitud vs bloqueo). yo en mis APIs HTTP/RPC, si son internas, me gusta devolver solo los KO para optimizar un poco, porque tengo control (al ser interna) de como se usa la API.

abro una conexión, pagino/stream elementos, el servidor los procesa y me va devolviendo en la misma conexión, o al final de todo. depende de como definas los niveles de trigger de la API.

pero vamos, que esto esta inventado desde hace años... hasta decadas. Hay 3-4 alternativas, elige una.

cuales son tus dudas? o que problemas ves?

1 - si todo cabe en memoria, todo en memoria.
2 - el problema te vendria como hacer este paso, si esperar a que este en memoria, stream, o mini batches.

1 respuesta
Iselio

#60436 claro pero cuando a mi me ponen un problema en pseudocódigo asumo que lo que hay detrás de esas llamadas a un tercero no lo puedo tocar porque igual ni siquiera es código mío, si lo puedo tocar entonces ya puedes fliparte lo que te de la gana, lo más que puedo hacer en la supuesta entrevista es preguntar qué hay detrás y si puedo ver la documentación de ese código a ver qué opciones tengo de consumir/actualizar esos datos pero poco más.

1 respuesta
desu

#60437 entiendo, en este caso bueno, era un CRUD y tienes control de todo el servicio, las llamadas a db las defines tu. normalmente en un servicio que es un crud tienes, controller, service y repositorios. a nivel conceptual serian las 3 capas. llega request, la procesas, la guardas en db.

si no puedes tocar nada de nada, a nivel de system design no puedes hacer mucho, pero podrias seguramente hacer esto:

CODIGO ORIGINAL

def update_items(request, new_value):
  let old_items = find_items(request)
  for old_item in old_items:
    if old_item == request.condition:
      update_item(old_item, new_value)
  return 200

CODIGO NUEVO

def update_items(request, new_value):
  let old_items = find_items(request)
  let new_items = []
  for old_item in old_items:
    if old_item == request.condition:
      let new_item = Item(..., new_value)
      new_items.push(new_value)
  for new_item in new_items:
    update_item(new_item) # necesitas
  return 200

y la entrevista en lugar de system design seria entrevista tecnica de programacion, paralelismo, CPU, IO etc..

En sistem desygn, si o si necesitaras un update_item que acepte el objeto nuevo. es un update en sql, podemos asumir q lo tenemos, pero nos falta el batch_update.

asi puedes paralelizar los dos pasos, y la CPU va mejor, tampoco puedes hacer mucho mas, el mayor problema es que tendras cuello de botella en network a la DB.

ahora si el update_item es consistencia eventual como ha dicho fpero666 podrias tirar todo de golpe y delegar a DB el retry del update_item si falla.

pero vamos, la lección es que hay que tener batch processing por defecto, tener un update_items([Item]) es igual que update_item(Item) a nivel logico, pero permite update_items([Item1, Item2, item3, ...]) y tienes una API mas potente y flexible.

Y lo mismo se aplica a funciones. Tener un for y un if y luego despachar, suele estar mal, mejor filtrar primero, aunque tener dos for loops parece contra-intuitivo 1) es mas rapido, 2) se puede paralelizar gratis.


Tanto con epoll como con kqueue(es mejor) le pasas una LISTA DE EVENTOS

events = [fd0, fd1, fd2...] lista que quieres mantener y subscribirte a resultados. en este caso ejecutas tareas, y el sistema operativo te responde que fdX a terminado para que tu sigas trabajando en cada poll. en este caso marcarlo como completado.

si tu tarea es escribir a disco mediante una DB, pues tienes una lista de tasks a ejecutar, si o si las tienes que mantener todas las activas como te he explicado, luego puedes borrarlas o marcarlas como OK. o solo quedarte con los KO para que el usuario haga retry.

1 respuesta
Iselio
#60438desu:

en este caso bueno, era un CRUD y tienes control de todo el servicio, las llamadas a db las defines tu

si esta es la premisa entonces mi pseudocódigo sería (suponiendo que estas en la capa de controller o service:

def update_items(request, new_value):
  update_items(request.condition, new_value)

porque cualquier base de datos va a tener un update condicional transaccional o al menos pseudotransaccional que no haga que necesite un get y luego un update. Y si no lo tiene es que entonces probablemente elegiste una base de datos erronea para tu sistema si es que pensabas que ibas a tener que hacer updates de ese tipo.

1 respuesta
spidermanman

No se para que tanta tontería si luego medio hilo cobra más pintando cuatro coloritos y echándose a dormir el resto de la mañana

1 respuesta
desu

#60439 tu respuesta me parece de 10/10. si solo si pasa una cosa, la gente que ha escrito la DB la han escrito bien ajajaj

si la DB podemos confiar en ella, y podemos confiar en los programadores, delegar a un bajo nivel siempre es lo mejor. como menos logica mantengas tu y mas haga el sistema por ti (kernel y librerias) mejor.

bien hecho, te asigno el rango de Fpero Junior en el hilo, enhorabuena.

por desgracia, la mayoria de sistemas no son buenos y es dificil depender de ellos. por ejemplo Kafka: https://jepsen.io/analyses/bufstream-0.1.0

Kafka esta lleno de bugs de consistencia en las transacciones.

We also characterize four issues related to Kafka more generally, including the lack of authoritative documentation for transaction semantics, a deadlock in the official Java client, and write loss, aborted read, and torn transactions caused by the lack of message ordering constraints in the Kafka transaction protocol.

No useis Kafka. Cuanta gente usa Kafka en el mundo porque es open source y es "reliable" y demas patrañas? Mentira, Kafka es una porqueria.

1 respuesta
Runig666

#60440 El problema son esos 4 coloritos que están ya fijos, que diseño les ha dado el visto bueno todos le han dado el visto bueno...pero luego magicamente no era el visto bueno definitivo y ahora son otros

Y tu mientras tanto pensando que la parte importante lleva meses echa pero los pinta y colorea dicen que el retraso es cosa tuya

1 respuesta
Iselio

#60441 genial, pues a seguir trabajando, que tengo que ganarme mis 50€/h (la voy a cobrar igual xd)

Soltrac

Si @desu la lía tanto para 4 líneas de código, la q puede liar en un programa completo...

1 respuesta
spidermanman

#60442 el día que me importe quizás me levanto de la cama para entrar en esas reuniones a ver de qué hablan xD

1 1 respuesta
Runig666

#60445 Nunca has estado en una de diseño? Son cojonudas. Todo esta precioso y perfecto. Excepto cuando ya lo haces. Oye, entonces nada esta bien, todos los colores mal, la abuela dice que ahora quiere Camel.

A mi me gustaba uno que era completamente ciego. Encima era el jefazo. Igual estabas en la reunión, no te dabas cuenta, te ponias a compartir pantalla y el hijo puta siempre te decia "Yo lo veo perfecto"

3 respuestas
Kaledros

#60446 Lo mejor es cuando el de iOS y el de Android, que estaban los dos a la vez en la misma reunión con el de diseño, acaban implementando cosas diferentes y ninguo de los tres sabe por qué.

1
spidermanman

#60446 por suerte para mi eso ahora son cosas del pasado, no por no hacer esas reuniones si no porque las hacemos bien, miedo me da cambiar de empresa la verdad

1 respuesta
desu

#60444 cuando programas a mi nivel (top mundial, 0.00001%) estas cosas no suelen suceder mucho. La mayoria de gente esta en la misma pagina. Aunque si que de vez en cuando me toca bajarme al barro y explicar a algun staff engineer de FAANG o de proyectos open source lo que es un puntero y meterselo por el culo.

la mayoria de estos detalles además, en los programas habituales no son necesarios, lo importante es si sabes hacerlo o no cuando IMPORTA, cuando tienes bugs o performance issues. yo si puedo, tu puedes?

cuando escribes software a escala planetaria que le llamamos, estas cosas son muy importantes.

Runig666

#60448 En la mia lo estan empezando hacer bien...pero a base de tocar las narices.

Ya van varias de saber que es una chapuza, ver que es una chapuza, esperar la chapuza...hacerlo igual y decir "Bueno...esto es vuestro diseño y el funcional", y ya que discutan entre ellos.

Total, como a nosotros ya los cambios nos llevan nada y menos ya pasamos de discutir, preferimos que se den la ostia ellos. Al final a partir de la 5ª reunión de hacer el idiota aprenden XD

1 1 respuesta