que es una entrevista técnica - parte 2

desu

#29 Lo más importante es que un ingeniero resuelve problemas.

Paso 1) hacer una solución
Paso 2) comprobar que la solución funciona

En consecuencia has resuelto el problema. Todo lo demás es opcional.

Como he explicado en el ejemplo de #15 en mi prueba he resuelto muchísimos problemas mientras resolvía el ejercicio.

Otra manera de evaluar la capacidad puede ser enumerar los problemas que se resuelven.

  • Resuelvo el problema de guardar un objeto en base de datos
  • Resuelvo el problema de devolver un objeto de base de datos
  • Resuelvo el problema de guardar objetos grandes de manera eficiente
  • Resuelvo el problema de devolver objetos grandes de manera eficiente
  • Resuelvo el problema de detectar errores y que mi sistema se adapte de manera inteligente
  • Resuelvo el problema de poder reparar estos errores cuando sucedan
  • Resuelvo el problema de desplegar múltiples instancias en paralelo de manera segura
  • Resuelvo el problema de desplegar múltiples base de datos y adaptarme de manera segura
  • Resuelvo el problema de reducir costes $$$
  • Resuelvo el problema de trabajar en equipo, compartir el código y colaborar de manera eficiente
  • Resuelvo el problema de desplegar mi servicio de manera segura, gradual y hacer rollbacks

Si realizas esta evaluación de manera objetiva y por ejemplo miras el caso de Codely que vimos en #2.

  • Han añadido un servicio por stream en eventos para tratar de solucionar el problema pero:
    • han creado el problema de mantener un RabbitMQ
      • han creado el problema de que los miembros necesitan conocer AMQ, MQTT, STOMP
      • han creado el problema de decidir entre RabbitMQ y Kafka y razonar el porque uno es mejor
      • han creado el problema de mantener el RabbitMQ y en el futuro tener que re-empelzarlo
    • han creado el problema de mantener un sistema de colas y eventos
    • han creado el problema de testear todo lo anterior
    • han creado el problema de que la eficiencia se ha reducido
      • tanto a nivel de código como a nivel de equipo como a nivel operacional
    • han creado el problema de incrementar los costes de funcionamiento y operacionales del servicio
    • han creado dificultades de mantenimiento de código debido a la sobre-ingeniería
    • han acoplado fuertemente su solución ha frameworks como Spring y sub-componentes y sus detalles internos

Un ingeniero resuelve problemas, si creas más problemas de los que revuelves. Eres un mal programador. No eres ni ingeniero.

Si haces caso de malos consejos, de gente que no son ingenieros terminarás como la pobre gente de PcComponentes... Menuda porquería tienen montada. Y el problema es que esta gente de PcComponentes se ha dejado mal asesorar y guiar por gurús vende-humos.

De hecho este ejemplo del propio Codely es un gran ejemplo de una porqueria de prueba, donde le piden algo muy sencillo, y hace una sobre-enginieria brutal:

Y al final del video le dice el ricitos, a ver flipado, que esto se resuelve con dos lineas de bash y fuera. Por que te complicas tanto? jajaj

Este es un ejemplo muy famoso Command-line Tools can be 235x Faster than your Hadoop Cluster
. La mayoria de programadores haciendo big-data, spark, similares... No tienen ni idea, pero ni idea, de lo que estan realmente haciendo y de lo que realmente se debería hacer.

En resumen, resuelve problemas, no crees más problemas de lo que estas tratando de resolver. Si haces esto, ya estarás en el top de mejores programadores del mundo.

1 1 respuesta
D

#31 Entiendo, va en consonancia con lo que yo pienso, tambien creo que si quieres ser el mejor debes fijarte en los mejores, bueno en este caso como dices en la gente que sabe, por desgracia ya sabeis en internet sobra muchisima morralla.
Luego en empresas no se como tendrán en cuenta esto ultimo que comentas, tengo experiencia de otro sector en donde nos dijeron ''teneis libertad de decision para cambiar o modificar o proponer ideas para mejorar'' y luego ni te escuchaban ni te preguntaban ni una mierda, solo querían que hicieras lo que ellos querían de la manera en que querían aunque vieras que asi era peor o que podria hacerse mejor y mas eficiente.
Todo esto que nos comentas es algo que deberia enseñarse, yo por suerte ya sabia a lo que me apuntaba y que me iba a tocar darle por mi cuenta, pero vamos casi que lo prefiero, y desde luego ''resuelve problemas, no crees más problemas de lo que estas tratando de resolver''.
Codely no se por que siempre me había echado para atrás jajaj. Estoy tomando bastante nota de aquí.

D

#30 Yo siempre voi dispuesto a aprender y a que me enseñen ya digo nervios no tengo, es mas tengo claro que sobretodo al principio van a querer ir a sangrarme pero es lo que toca imagino, tragar, tener suerte de caer en buen sitio y suerte de que te enseñen. Y si me toca salir de algun sitio espero salir con mas carrera por que me joderia salir igual que he entrado, o peor trabajar sin aprender absolutamente nada sintiendome mediocre...

bornex

#15 Por curiosidad, ¿Como hiciste la parte de la subida del fichero con streaming y con los reintentos del kernel? ¿Usaste la API de la stdlib de golang io.Pipe?

1 respuesta
desu

#34 io.pipe es para corutinas. https://github.com/golang/go/blob/master/src/io/pipe.go

a lo que me referia es que usar multipart y apis correctas, io async y buffer, reduces las probabilidades de fallo, y los retries de TCP de los paquetes, q te gestionara el kernel,
seran suficientes.

Si vamos a este codigo de aqui: https://github.com/minio/minio-go/blob/master/api-put-object.go#L338 Pues vemos como lo gestiona. Si tu libreria no hace esto pues lo tienes que hacer tu. Podria estar mejor este codigo, pero bueno.

yo haria un tamaño de paquete optimo según network, y mandaría a buffer para ir mandándolos por tcp, considerando q ahi se partirían de nuevo. con un par de retries por paquete sin backoff. depende si valoras q la operación funcione o que sea rápida en casos de fallo. yo en estos casos de uso prefiero que las cosas funcionen al máximo.

el caso de uso es que un usuario quiere subir algo a tu servidor. no quieres que el usuario si algo falla, tenga que estar todo el rato subiendo archivos de 1GiB.

contrario a lo que mucha gente piensa, el Linux cada vez tiene mas rings buffers para hacer cosas en IO. para poder hacer re-intentos internamente de manera transparente. entre otras cosas.


si tienes contro absoluto de las maquinas, que deberias, si te lees lo que hacen los jugadores para optimizar Youtube, Netflix, Amazon Video y similares veras que hoy en dia con 4 o 5 configuraciones vas a ir volando.

en el caso de la empresa que entrevistaban, dudo que sepan lo que es un puntero.

1 1 respuesta
bornex

#35 entendido, algún libro/recurso que recomiendes para SO? Estoy súper pegado en la API de Linux

1 respuesta
desu

#36 Los libros se quedan desfasado muy rápido.

Recomende esta talk de Brendan Gregg hace poco: https://www.brendangregg.com/blog/2023-03-01/computer-performance-future-2022.html

Y a partir de ahi tirar del hilo de los papers en los temas nuevos que no conozcas. Al menos yo lo hago asi.

En tu caso no creo que te falte ninguna base, pero para la gente que si, suelo recomendar los de Love: https://rlove.org

Por ejemplo, para el tema de parametrizar todo el networking Brendan Gregg y los ingenieros de Netflix tienen un montón de recursos y charlas. Las he compartido muchas veces, son muy buenas.

Yo use uno recurso que no recuerdo de quien, pero googleando se pueden encontrar varios, para optimizar la configuración de TCP de todas las instancias en AWS en arranque y que parámetros del kernel te tienes que fijar. En mi caso recuerdo que me quede sorprendido porque al desplegar a AWS, el propio AWS ya te aplica bastantes optimizaciones a tus instancias y buenas practicas.

1
D

He estado mirando el código del TODOLIST de github, no me mola hacerlo por que queria hacerlo de cero sin copiar código, pero me ha gustado mucho ver que has usado streams, algo que he estado viendo esos dias atrás y comparando es increible como reduce el codigo, lo deja bien sencillo, limpio y quita lineas basura, para un polluelo como yo viene bien aprender de código de otras personas cuando esta bien hecho, pero lo dicho queria hacerlo sin mirar el código por que ahora voi a sentir que estoy haciendo copy/paste. Y creo que empiezo a entender los problemas que tiene Java.

1 respuesta
Kaledros
#38demorador:

no me mola hacerlo por que queria hacerlo de cero sin copiar código

Aprenderás más si empiezas modificando un proyecto para arreglar bugs y añadir features que empezando de cero. Te familiarizarás más con el código, lo entenderás mejor y la carga cognitiva no será tan agotadora al principio. Esto es como aprender a dibujar calcando o a tocar un instrumento haciendo versiones, es por donde hay que empezar.

1 1 respuesta
D

#39 Joder entre desu y gente como tu de aqui sales más preparado que del fp, aunque tampoco es muy dificil xDD.