Acerca de Jose Antonio

Yo soy el que manda aqui... ¿Que pasa?

Buscar talento en linkedin

Durante mi periodo de CEO en biblioeteca he tenido la necesidad de contratar personas que pudiesen ayudarnos con los proyectos que nuestros clientes nos proponían. En este mercado la rotación es muy alta y el talento (aunque cueste admitirlo) bastante escaso. Tampoco es que nosotros tengamos necesidades extraordinarias, y la mayor parte de nuestras contrataciones venían recomendadas de antes (eso siempre es lo mejor), pero cuando hay que cubrir puestos rápidamente es cuando nos encontramos en problemas.

Uno de los sitios a los que he acudido a ofrecer puestos de trabajo ha sido a LinkedIn, en concreto creo que conseguí un total de 4 personas (en un periodo largo), pero cada vez ha estado funcionando peor, os comento el ejemplo de la última campaña donde buscaba alguien con Java y Linux (y tampoco pedía años de experiencia). El anuncio en concreto está en este enlace:

https://www.linkedin.com/jobs/view/3517177902/

Para esta oferta recibí estos resultados:

Recibí un total de 7 cvs, de los que ninguno era adecuado del todo.

Pero hagamos unas pequeñas cuentas… 100 Euros de gasto, 96 visualizaciones, precio por visualización 1,04 Euros… ¡Por cada visualización! Esto, por si no os lo parece es carísimo. Calculemos que por cada 100 visualizaciones obtenemos 5cvs (1 de cada 20, esto es ser muy optimista), si de cada 10cvs obtenemos 1 al que entrevistar y que, de media, hay que entrevistar a 5 candidatos por puesto… Nos queda que necesitaríamos un mínimo de 5*10*20 = 1000 visualizaciones.

LinkedIn ¿me quieres decir que para contratar un programador (que tampoco busco un experto) tengo que gastarme 1.040 Euros?

A mi esto me ha parecido un error, y como tal se lo he preguntado a la amable gente de linkedin en twitter…

Qué majos! .. Vamos a ello…

Umm, no es ninguna de esas opciones, vamos a abrir incidencia

Vamos a ver que mi pregunta NO es sobre LinkedIn ADS, que de eso no tengo cuenta.. A ver si hay otra forma…

Pues no, no ayuda la verdad…

Y esto tampoco… ¿Cómo que las visitas disminuyen con el tiempo? Oye, que os habéis comido 100 pavos en dos días y solo me habéis dado 96 visualizaciones… Algo pasa

Y chin-pum ahí se acaba la interacción con la ayuda de linkedin… plasplasplas

Así que, si me preguntáis a mi, LinkedIn ha dejado de ser un sitio asequible para poner anuncios de trabajo…

Ser empresario también es tener que tratar con malnacidos

Como se diría en twitter, acompañemé a conocer esta triste historia…

Luis Carballo Rua con nuestro portatil

Llevo 19 años siendo empresario y he contratado unas cuantas decenas de personas. Antes era más sencillo dar con alguien competente, pero ahora con tanto bootcam y con tanto FP con esteroides es más complicado saber si un trabajador sabe lo que dice que sabe o no. Antes tener un título significaba un mínimo, ahora tienes que bucear para encontrar si la persona en cuestión sabe lo que es el http o le han dicho que eso es magia de Angular. En fin, que se te pueden colar inútiles sin comerlo ni beberlo.

Uno de esos casos me pasó recientemente, una persona respondió a un anuncio de trabajo que pusimos en LinkedIn. La plaza que pedíamos de desarrollador front la terminamos ocupando con otra persona, pero me pareció interesante el cv que nos pasó, lleno de dibujos hechos por él mismo.

El caso es que en la siguiente plaza para full stack se volvió a presentar, decidimos entrevistarle y, quitando que hablaba muy deprisa, nos dijo que si a todo lo que le preguntamos, no parecía perdido en ningún área de los que preguntamos y su CV era molón, así que le hicimos una oferta a los dos días… Oferta que rechazó porque dijo que ya estaba trabajando en otra empresa que le llamó después de nosotros… En fin, cosas que pasan, a seguir entrevistando.

Esta vez el proceso se hizo un poco más largo y a eso de las dos semanas me contacta de nuevo diciendo que las condiciones de la nueva empresa no le interesan y que si le mantengo la oferta. Yo, que soy un hombre de palabra, le digo que le mantengo exactamente la misma oferta que le hice… Y, dicho y hecho, le preparamos el contrato y quedamos ya para que empiece a trabajar en remoto, básicamente, aunque esperábamos que al menos el primer día se quedase en la oficina para que le explicásemos las cosas.

Primer día: quedamos a las 9:30 porque yo tenía reuniones antes… Espero, se hacen las 10, las 11.., le mando un whatsapp, no me contesta, a las 12 ya le llamo por teléfono y me dice que está en Alcorcón, pero llevando su madre al médico, que luego se pasa por aquí (no me parece lo mejor para el primer día y, además, sin avisar), en fin, que a las 13 se pasa por la oficina, firma el contrato, le enseño a entrar en el portatil y en su cuenta de correo; y… Se va. ¡¡!! Que si, que es un trabajo remoto, pero leche, no solo llegas 4 horas tarde sino que ni siquiera te quedas a que te expliquemos nuestra forma de trabajar…

La primera semana de trabajo se perdió intentando que arrancase solo en ubuntu el portatil y que no usase windows (windows=kk), le compramos hasta una docking station para que pudiese enchufar sus dos monitores (y se lo tuvimos que mandar a casa, que él pasar por l oficina ya le daba pereza), la segunda semana ya empieza a hacer algo productivo pero sin hacer puto caso de lo que le decimos. Nos llena el código de librerías que luego tenemos que borrar y nos quita más tiempo del que ahorramos. En la cuarta semana le ponemos a hacer algo para despliegue inmediato (tampoco era muy complicado, pero dediqué yo más horas que él) y nos dice que se va a vivir a la costa que, total, es remoto y no nos vamos a enterar… Y el pavo se va de mudanza el mismo día que pasamos a producción grrrrr. Obviamente la cosa peta y tengo que arreglarlo yo solo.

Lo primero que hace nada más llegar a su destino es pedirme un anticipo (estábamos a día 7 de mes), cosa que me extraña pero que procedemos a hacer sin ningún problema. A partir de ese momento su rendimiento fue cero. La lista de problemas (en orden cronológico):

  • Que el proveedor de internet que tenía no le permitía usar el puerto del ssh y no podía subir nada al servidor
  • Que los que han venido a repararlo no tenían idea y ha terminado tirando el router por la ventana
  • Que me he quedado dormido (excusa para no aparecer por el daily) y el movil estaba descargado
  • Que se me acaban los datos del móvil
  • Que me van a poner la fibra (ese día desapareció tras el daily y apareció después de haber terminado la jornada diciendo que se había dejado el movil en casa mientras le instalaban la fibra)
  • Que me he cargado el móvil (caída fortuita al suelo, dice)
  • Que sigue sin fibra y tiene que hacer el daily desde un bar
  • Que el del bar ha abierto más tarde hoy y no he podido hacer el daily

Y mientras el trabajo que tenía asignado ahí pudriéndose y teniendo que hacerlo entre sus compañeros y yo…

Llegados a este punto decido que es suficiente y que, obviamente, no ha superado el periodo de prueba. Se lo comunico y le indico que empaquete el portatil, la mochila y la docking station y que alguien pasará a recogerla.

Y ahora salta la sorpresa en las gaunas… Esta persona decide que va a quedarse con el material de la empresa, material que vale más que lo que él ha generado para la empresa. Esto no solo está tipificado como una apropiación indebida sino que dado el valor de lo apropiado puede ponerle en un grave aprieto. Mi empresa, como no puede ser de otra manera, le ha pagado finiquito y liquidación (muchas tentaciones de quedarnos con ese dinero en compensación, pero mi abogado me recomendó pagarlo de todas formas) y este desalmado malnacido no ha dado señales de vida.

Ya es duro mantener y gestionar una empresa como para tener que lidiar con gentuza de esta calaña. No solo ha perjudicado a sus compañeros sino que te deja una mala leche que terminas pagando con el primero que pasa… En fin, solo espero que el karma haga su trabajo. Si alguien quiere contratar a un full-stack developer, que me pregunte a quien no contratar nunca.

Saber estar… O cómo los comerciales tienen que tolerar el fracaso

Me acaba de entrar una llamada al teléfono de la empresa, es un comercial de una consultora energética cabreado como una mona porque he aceptado la contra-oferta de Iberdrola cuando ya había firmado con otro proveedor que él trabajaba anteriormente.

Me ha hecho gracia, la verdad, ver que hay gente todavía que no sabe qué es esto del trabajo comercial, que unas veces se gana y otras se pierde, que por muy bueno y simpático que sea el potencial cliente al final son los números y la estrategia de cada uno la que dicta si te contrata o no.

Tengo que reconocerle que a mi también me ha pasado lo de cabrearme cuando un cliente, después de tener todo apalabrado, se iba con otro proveedor por cualquier motivo. A hechos consumados no sirve de nada llamar al cliente para echarle en cara lo poco serio que es o decirle (literal) que van a pagar justos por pecadores porque a partir de ahora van a cobrar por su servicio (no solicitado, por cierto).

En fin, supongo que ya ha dado por hecho que nunca nos vamos a cruzar otra vez y que le merece más la pena desahogarse ante la pérdida económica quemando puentes que algún día pueda necesitar. Porque, digámonos sin tapujos, que un comercial me engañe es lo normal y lo esperado, pero que lo haga un cliente es algo más raro. Un cliente se gana día a día y se pierde solo una vez si se hacen cosas como esas.

¿Tenía oportunidad de venderme otra cosa aprovechando la «culpabilidad» de haberle dejado con la miel en los labios y su comisión por cobrar… Pues si, pero ya es completamente imposible. Ni lo puedo recomendar a nadie (no quiero que me echen en cara que le mando empresas que terminan por abroncar al cliente) y no voy a contratar nada que huela siquiera a la empresa que le mandó a visitarme.

A mi edad ya no estoy por aprender nuevos trucos, el cliente no siempre tiene la razón, pero siempre hay que respetarle, yo respeto a los míos y entiendo sus razones cuando contratan con otros o cuando no contratan conmigo. Eso no les convierte en malas personas ni les amenazo con perjudicar a mis futuros clientes. Le deseo que haya disfrutado de su momento de desahogo y, por mi parte, nada más que esperar que no trate igual a todos sus clientes o terminará con una cartera muy pequeña de ellos.

Yo no soy contrario a hacer una post-mortem con el cliente, así se aprende qué se ha hecho mal, que se podría mejorar y revisar así la forma de presentar los proyectos la próxima vez. En este caso debería haber aprendido a advertir (como si lo hacen con la telefonía) a los clientes de que iban a recibir una contraoferta y darles el argumentario para declinarla. Si no ha aprendido eso, bueno, peor para él porque parece ser que las energéticas se han decidido a empezar a contratacar… Y eso es algo a tener en cuenta.

La deuda técnica

La deuda técnica es un tema importante a considerar en el desarrollo de software. Se refiere a la acumulación de tareas pendientes, como la documentación, el mantenimiento, el refactorizado y la eliminación de código obsoleto. A medida que la deuda técnica aumenta, se vuelve cada vez más difícil y costoso mantener y mejorar el software.

Robot arreglando código

En mi experiencia, hay varias razones por las que la deuda técnica puede acumularse. Una de las principales es la falta de tiempo para dedicar a tareas no relacionadas con el desarrollo de nuevas funcionalidades. A menudo, se priorizan las tareas que producen resultados visibles a corto plazo en lugar de las que tienen un impacto a largo plazo.

Otra razón es la falta de disciplina en el desarrollo de software. A veces, los desarrolladores se sienten presionados por plazos ajustados y optan por escribir código rápido y sucio en lugar de tomarse el tiempo para refactorizar y documentar adecuadamente.

La solución para reducir la deuda técnica es simple pero no es fácil. Es necesario dedicar tiempo y recursos para abordar las tareas pendientes. Esto puede incluir dedicar tiempo cada semana para el mantenimiento y la documentación, o incluso asignar un equipo específico para abordar la deuda técnica.

Además, es importante fomentar una cultura de disciplina y responsabilidad en el equipo de desarrollo. Esto puede incluir establecer estándares de calidad y proporcionar retroalimentación continua sobre el cumplimiento de estos estándares.

En resumen, la deuda técnica es un problema común en el desarrollo de software, pero puede ser manejado si se toman medidas proactivas para abordarlo. Dedicar tiempo y recursos, y fomentar una cultura de disciplina y responsabilidad, son fundamentales para reducir la deuda técnica y mejorar la calidad del software.

JWT y Postman

O, mejor dicho, como probar tus APIs que usen JWT en postman.

Cuando estamos diseñando APIs es muy normal que, lo primero, las diseñemos sin pensar en el tema de la seguridad y, una vez que están funcionando, ya les añadimos los elementos de seguridad para que no puedan ser llamadas por cualquiera en producción.

Una forma, que yo he usado mucho, para fortificar las llamadas es hacerlo mediante un token que se ha obtenido con las credenciales de un usuario concreto, eso supone hacer una llamada previa al sistema del que se obtiene el token y, después, verificarlo en cada llamada. Esto, siendo un token arbitrario, supone sobrecargar el sistema de seguridad con llamadas de comprobación de token, además, tenemos que hacer caducar los tokens periódicamente ya que cualquier filtración del mismo da acceso a los recursos del usuario durante el tiempo que el token esté sin caducar.

Otra manera, ligeramente diferente, es utilizar JWT (JSON Web Tokens) que se diseñaron para poder transmitir credenciales y otra información entre sistemas de una manera más eficiente y segura. Lo único un poco «especial» es que tiene que haber un secreto compartido entre los sistemas que se comunican. Además, se usa ese secreto para firmar la comunicación, así que no es sencillo generar el token JWT de forma manual para las pruebas.

Si usas postman (que es lo que estoy usando yo últimamente) para hacer las pruebas, hay una manera de solventar el problema y que, básicamente, pasa por rellenar el campo pre-request script con este código:

// JWT generation script adapted from
// https://gist.github.com/corbanb/db03150abbe899285d6a86cc480f674d

var jwtSecret = pm.environment.get('jwt_secret') || ''

// Set headers for JWT
var header = {
	'typ': 'JWT',
	'alg': 'HS256'
};

// Prepare timestamp in seconds
var currentTimestamp = Math.floor(Date.now() / 1000)

var data = {
	'iss': pm.environment.get('jwt_iss') || '',
	'ist': pm.environment.get('jwt_ist') || '',
	'iat': currentTimestamp,
	'exp': currentTimestamp + 30, // expiry time is 30 seconds from time of creation
	'jti': 'jwt_nonce'
}


function base64url(source) {
    // Encode in classical base64
    encodedSource = CryptoJS.enc.Base64.stringify(source)
    
    // Remove padding equal characters
    encodedSource = encodedSource.replace(/=+$/, '')
    
    // Replace characters according to base64url specifications
    encodedSource = encodedSource.replace(/\+/g, '-')
    encodedSource = encodedSource.replace(/\//g, '_')
    
    return encodedSource
}

// encode header
var stringifiedHeader = CryptoJS.enc.Utf8.parse(JSON.stringify(header))
var encodedHeader = base64url(stringifiedHeader)

// encode data
var stringifiedData = CryptoJS.enc.Utf8.parse(JSON.stringify(data))
var encodedData = base64url(stringifiedData)

// build token
var token = `${encodedHeader}.${encodedData}`

// sign token
var signature = CryptoJS.HmacSHA256(token, jwtSecret)
signature = base64url(signature)
var signedToken = `${token}.${signature}`

pm.environment.set('jwt_signed', signedToken)
console.log('Signed and encoded JWT', signedToken)

En el mismo vemos que se usan estas variables que deberemos incluir en el entorno o en la petición:

  • jwt_secret : secreto compartido con el otro sistema
  • jwt_iss: issuer (como queramos identificar al emisor)

En cualquier caso también podríamos añadir el campo sub si es parte del payload que recibe nuestro API, o cualquier otro campo adicional que decidamos incluir, ya que el proceso de firma se realiza en ese momento y las fechas de expiración se actualizan justo antes de lanzar la petición al API por lo que no estarán expiradas en las pruebas.

Lo único que quedaría pendiente sería usar el token generado en la cabecera (o donde corresponda) ya que este código genera la variable {{jwt_signed}} esta la podemos usar donde queramos.

Sigo buscndo formas más sencillas para hacer las pruebas sin salir del Visual Studio Codel, si las encuentro las pondré por aquí.