Muy raramente tengo que lidiar con mi propia frustración cuando programo.
La programación es quizás la única actividad donde, literalmente, todo está bajo mi control.
La gente puede traicionar, olvidar, decepcionar o simplemente convertirse en idiotas.
Las reglas de la vida no siempre se siguen y, a menudo, conocer a las personas adecuadas y los trucos correctos es más importante que conocer las reglas por sí mismos.
Los autos se rompen. Los terminales tienen errores. Roturas de hardware.
- Cómo enseñar a alguien la empatía.
- ¿Es cierta la leyenda del rey Arturo?
- ¿Puede explicar el interbloqueo, cómo detectarlo y evitarlo, y eliminarlo en términos simples con un ejemplo?
- Cómo confiar en cualquier lado opuesto en una discusión cuando no puedo estar seguro de la evidencia proporcionada por ambos lados
- ¿Cuál es el propósito de vivir con alguien que te ama? ¿Reproducción? (Lea la descripción, minutos después de un intento fallido de suicidio)
La programación es probablemente la pieza más confiable aquí.
Mientras mi código esté en la nube, mis pruebas pasan y mi buscapersonas está configurado para zumbar si algo falla, ¿de qué se puede frustrar?
Probablemente el único caso en el que me frustro mientras la programación está conectada con las expectativas de cierto software.
Rant sigue.
Por ejemplo, hace aproximadamente un mes pasé un fin de semana intentando configurar a Zookeeper y Kafka.
Esa vez estuve realmente frustrado.
No solo Java no funcionó correctamente y requirió una configuración adicional.
No solo tuve que encontrar las versiones correctas para instalar y la herramienta de compilación correcta para usar.
¡Ninguno de esos dos tenía herramientas de depuración disponibles!
Zookeeper es un sistema de archivos de bloqueo distribuido. Sistema de archivos! Is no tiene una herramienta de línea de comandos incorporada con “ls / cat / cp / mv / chown”. Lo mejor que encontré han sido algunas aplicaciones de terceros que ofrecen una interfaz web para navegar por el árbol de “directorios”.
Eso tomó cerca de tres horas para resolverlo. Y fue frustrante.
Kafka … Esperaba una cola de mensajes persistente y fácil de usar. Bueno, la parte de la cola de mensajes funciona, pero no mejor que cualquier PubSub.
Lo que realmente necesitaba era la funcionalidad para reproducir datos desde cierto desplazamiento.
Resultó imposible.
Primero, Kafka estaba cambiando su interfaz interna. Lo que invalidó la mayoría, si no todos los módulos de código abierto en node.js, Python y Ruby. Específicamente para la parte “replay form offset”.
He leído una docena y he probado al menos cinco en los tres idiomas. En ninguno de mis intentos he tenido éxito en tener un código de diez líneas que publicaría 10 entradas y luego leería desde la 5ª en adelante.
Después de un fin de semana entero perdido, me di por vencido y codifiqué dkorolev / overlog
Hasta el día de hoy, me siento frustrado por el hecho de que las personas no tengan el mismo enfoque para las pruebas que yo. Donde el código descargado viene con una prueba reproducible y, efectivamente, un ejemplo de uso:
$ git clone [correo electrónico protegido] : dkorolev / overlog.git Clonando en 'overlog' ... remoto: contando objetos: 8, hecho. remoto: Compresión de objetos: 100% (8/8), hecho. remoto: Total 284 (delta 1), reutilizado 0 (delta 0) Objetos de recepción: 100% (284/284), 60.86 KiB | 8 KiB / s, hecho. Resolución de deltas: 100% (180/180), hecho. $ cd overlog $ npm instalar prueba de $ npm > [correo electrónico protegido] test / home / dima / quora / overlog > ./test_storer.sh && ./test_fetcher.sh && ./test_http_and_pubsub.sh Directorio de trabajo: /tmp/tmp.Hl5PFDMz86 Responde con INVALID_JSON: OK Responde con NEED_MS_FIELD: OK Responde con LARGE_TIME_DISCREPANCY: OK Escribe una entrada: OK Escribe una entrada y mantiene las estadísticas: OK Falla si no se puede escribir en el directorio intermedio: OK Utiliza el directorio intermedio anulado: OK Falla si el directorio de destino no se puede escribir en: OK Utiliza el directorio de destino anulado: OK Enjuague explícitamente: OK Se vacia implícitamente por el número máximo de entradas por archivo: OK Reproduce archivos intermedios preexistentes en el inicio: OK Se descarga de forma implícita debido al tiempo de espera (inestable, usa el modo de suspensión): OK PASAR Directorio de trabajo: /tmp/tmp.DNrQmJIvcY No devuelve ningún registro: OK Devuelve todos los registros de un archivo de entrada: Aceptar Puede ejecutar múltiples consultas: OK Ordena la salida por "ms" antes de regresar: OK Devuelve el rango de registros de un archivo de entrada: OK Devuelve el rango de registros de un archivo de entrada II: OK Devuelve el rango de registros de un archivo de entrada III: OK Devuelve todos los registros de varios archivos de entrada: Aceptar Devuelve resultados de un rango de archivos de entrada: OK Da prioridad a las marcas de tiempo en el nombre de archivo sobre las marcas de tiempo dentro del archivo: OK PASAR Directorio de trabajo: /tmp/tmp.xyGpDzKiiJ A partir de almacenamiento en el fondo: PID 20251 Esperando que el almacenista se ponga saludable: .. OK La página de estado refleja un servidor recién iniciado: OK Agregando algunas entradas: OK La página de estado refleja las entradas recién agregadas: OK La página de entradas pendientes devuelve las nuevas entradas no confirmadas: OK Ejecutando el buscador no siguiente para ver las entradas pendientes: Aceptar Confirmar coincidencias de entradas coincidentes: Iniciar la recuperación de PubSub en segundo plano: PID 20278 A la espera de que se inicie el programa de recuperación y tome las entradas pendientes: .. Aceptar Limpiando las entradas: OK La página de estado refleja el flujo reciente: OK La página de entradas pendientes ya no devuelve las entradas ya que se han confirmado: Aceptar Añadiendo algunas entradas más: OK Esperando a que el recolector obtenga nuevas entradas a través de PubSub: .. OK Deteniendo captador de fondo: OK Deteniendo el almacenador de fondo: OK PASAR