El sublime arte de contratar practicantes de programacion



Bueno acá volviendo del infierno (osea un curso que me ha tenido un poco loco) y tratando de retomar un poco el tema de la web. Debo confesar que estuve por tirar la toalla, que 6 años es suficiente, pero bueno, retomando un poco el blog y con los ánimos renovados (mas o menos).

Quería comentarles algo que me paso hace pocos días. Tuve, junto a un compañero, la responsabilidad de contratar un practicante de programación, osea un chico que aún estudie y desea hacer unas prácticas y de paso aprender algo, no solo de programación sino además de la dinámica propia de un área de sistemas y de una empresa en general. De esta experiencia he podido sacar unas cuantas conclusiones acerca de cosas buenas, malas e interesantes en las que quizá no había reparado antes con tanto interés. Espero les ayude si tienen que afrontar un proceso de este tipo.



¿Como saber que un programador sabe?


Una de las primeras grandes incógnitas. Muchos exámenes, incluyendo los que he tomado con anterioridad, hacen hincapié en el uso de comandos y sentencias propias del lenguaje que vamos a utilizar, es decir ADO.NET en .NET, por ejemplo.

Sin embargo, creo es un error. Un buen programador o un chico con inclinación para programar debería tener la lógica incorporada en su cerebro de manera independiente  del lenguaje a usar. Quizá sería mejor usar esto :

"Cree un algoritmo que en base un número ingresado menor a 10 dígitos rellene con tantos ceros a la izquierda hasta que dicho número este conformado por 10 dígitos"

¿Un poco enredado? ¡No! Algo como si ingreso "340", el algoritmo me debe botar "0000000340". Simple. Ojo no usar ninguna función propia del lenguaje que rellene los vacíos. Nuevamente simple. En mi expereriencia personal, 50% de los entrevistados !no puede hacer esto! Maldita sea, quien no puede esta, solo recibirá de mí, cortesía y buen trato para que intente resolver la prueba pero es un zombie y a menos que me cree un "Mini-SAP-Portable" (ja) en las próximas preguntas está "out".



Más formas de saber cuando una persona tiene potencial para la programación

Quitale el internet. Si así es, corta internet y verás a muchos sudar frío ya que olvidaron tal o cuál comando. ¡Quien no los olvida! Si tomas un exámen tipo "Construye un mantenimiento de la tabla usuarios" es probable que tengan que recurrir al internet porque les falto un punto en la línea "x". Por eso pienso se debe priorizar evaluar el nivel de lógica del postulante y no si se aprendió de memoria como hacer "update" en la tabla.

Otra. Cortale el USB y obtendrás lo mismo que con internet. "Le meterás terror", como dicen los "chicos" ahora.

Si eres postulante, no se te ocurra llevar tu USB con "calatas" incluidas en el mismo, por favor (que ya me a tocado gente así)



¿Que hacer si el área de RR.HH escoge a los practicantes?

Para los amigos de RR.HH. un mensaje de este, su muy humilde servidor. El hecho que alguien tenga un cartón o que estudie en una universidad élite no significa que sepa programar. Craso error. Ya me han enviado chicos top-a1-super-mega-masters-of-the-universe que no superan el ejercicio que que describí líneas arriba (el de rellenar ceros). Es que las carreras de ingeniería por lo general no buscan crear programadores, sino gente que gerencia los proyectos. Además, las universidades, por lo menos en Perú, están enfocadas en el gerenciamiento de proyectos y manejos de equipos de desarrollo (por eso enseñan UML, Rational Rose, Metodologías rápidas, etc. de manera casi compulsiva). Si a eso le sumamos que para programar se debe tener cierto "talento especial" como una lógica sólida y una actitud diferente, ¡Si una actitud diferente!, el universo de gente que cumpla con estos requisitos es reducido.

Por esto amigos de RR.HH. no solo basta el cartón de la universidad "x" o "y".

Errores, errores y más errores

Algo a lo que nunca le tomé mucha importancia es al hecho que los programadores suelen parecen venidos de Jupiter o de algun objeto transneptuniano. Osea, parecen marcianos. Suelen vestir raro, no ser muy "fashion" y de hablar poco. Y nunca me importo. Pero, quizá, he cambiado un poco de parecer. El último que escogí con ayuda de un compañero me demostró que quizá estos temas si tengan algún tipo de valor. ¡Vamos que por lo menos hable! Me tocó un chico que no hablaba, mudo, y del cuál escuche su voz tres veces en la semana que estuvo trabajando. Mal. Querido postulante si vas a entrar a un trabajo, por lo menos has la "finta" (simula, aparenta) que estás interesado, claro si realmente lo estás, que si paras callado, lo que voy a pensar es que o no sabes nada (y ya te diste cuenta, glup) o estás pensando en irte lo más rápido posible. Como dije antes, actitud, es lo mínimo que se le debe pedir a un programador, sobretodo a los practicantes supuestamente deseosos de aprender.

Error, otra vez. No pido que vengas con un "Ermenegildo Zegna" para programar, pero deja las zapatillas  y las "bermudas" en casa por favor, que RR.HH. "ipso facto" te meterá un patada en las posaderas y no te volveremos a ver nunca más. Eso está bien en las películas o en empresas muy particulares (emprendimientos personales, por ejemplo), pero en una empresa, donde la gran mayoría va con pantalón y camisa, pues, que crees ¿debe la empresa adaptarse a tí o tu a la empresa?. Si, ya se que eres un super hacker que eso no importa. Ok, te mandaré a que levantes información a la gerencia para que veas como eres tomado en cuenta (tanto como un cero a la izquierda). Recuerda eres practicante de programación y estás comenzando no eres el maldito Bill Gates.



Las mujeres no programan

Ojalá nadie me odie, pero hasta ahora solo he conocido una que lo hacía y allá por los lejanos 2002. Es más, quedo en entrevistas con varias de ellas parar que vengan a pasar las pruebas y nunca vienen. Es casi crónico. ¿Que pasa chicas? Ojalá alguna me tape la boca en un futuro no muy lejano.


Para finalizar...Números. Algunas estadísticas basadas en mi experiencia personal (no tomarselo tan en serio, please)

- De un universo de personas convocadas para prácticas de programación, 80% son hombres y 20% mujeres.
- De ese 20% de mujeres, solo la mitad viene. De esa mitad, ninguna pasa la primera prueba (la de rellenar los ceros).
- Del 80% de hombres convocados, casi todos vienen.
- De ese 80% de practicantes convocados, pongamosle un número, 15 personas, 5 vienen como si llegarán de jugarse un partidito de fútbol. Se autodescartaron ellos mismos.
- De los 10 restantes, 5 no pasan la prueba de rellenar los ceros.
- De los 5 que quedan, un par de ellos quieren cobrar 1000 dólares mensuales + beneficios + CTS + Gratificación  + pavo por navidad. Vamos no vamos a ser tan miserables como algunas otras empresas que, hasta donde se, solo dan pasajes y un certificado impreso en una matricial, pero debes ubicar cual es tu real alcance y posibilidades salariales.


Bueno, es todo. Espero que estás breves experiencias en la búsqueda de personal para prácticas le ayude a alguien a saber que hacer o no hacer en caso de ser postulante y que esperar y no esperar en caso tengas la responsabilidad de buscar personal.

Bye.

A.

14 comentarios:

Sergi dijo...

Pasar la variable numerica a texto.

Comprobar longitud de texto (letras). Si la longitud es menor de 10, añadir un cero al principio (var_num = "0" + var_num).

Repetir hasta alcanzar los diez dígitos (letras).

Se supone que la variable de entrada siempre nos darán un número de menos de 10 dígitos.

No soy programador.

apeves dijo...

Bien, ahora explicaselo a los chicos que vienen.

apeves dijo...

No olvidar que es solo la primera pregunta de otras para determinar si alguien puede programar o no.

Leo dijo...

El código lo tenía en mi mente ya, lo único que no recuerdo en este momento era la manera de contar la cantidad de caracteres en :S. La he usado antes y no la recuerdo... dios.

PD: Interesante blog. Saludos.

apeves dijo...

Este mini algoritmo se puede hacer hasta en papel en menos de 10 lineas ( y eso es mucho), jejeje.

Leo dijo...

Es verdad, por eso apenas terminé de escribir el comentario anterior abrí N++ e intenté hacerlo, creo que fue por dudar de mí mismo :S.

Anónimo dijo...

num_texto=convert(var_num a texto)
si longitud(num_texto) <=10 hacer

repetir(10 -long(num_texto)))veces
num_texto="0"+num_texto
fin repetir

en todo caso
imprimir "La cantidad ingresada debe ser igual o menor de 10 digitos"

fin si

imprimir num_texto

Matias Flaja dijo...

Buen blog!!

Codito dijo...

uhmmm...
funcion mod_txtnumero(txtnumero)
{
si(longitud(txtnumero)<10)
entonces
{
txtnumero = "0" + txtnumero;
return mod_txtnumero(txtnumero);
}
caso contrario
return txtnumero;
}


o podria ser...
function mod_numero(txtnumero)
{
ceros = "0000000000";
si(longitud(txtnumero)<10)
txtnumero = ceros.substring(0,10-longitud(txtnumero)) + txtnumero;
return txtnumero
}


o podria ser iterativo...

muchas posibilidades dependiendo que se pregunto... algoritmo recursivo, iterativo o secuencial... o talvez teniendo en cuenta la complejidad O(n)... complejidad O(1).... quizas un select directo desde una BD

SELECT CASE WHEN LENGTH('numero')<10 THEN
SUBSTRING(CONCAT('0000000000','numero')
FROM LENGTH(CONCAT('0000000000','numero'))-9) ELSE 'numero' END AS 'nuevonumero'


uhmmm... mucha vaina...
en un examen de practicantes solo les dimos una cuenta de usuario del TopCoder y pedimos que resuelva la pregunta de 250 puntos usando cualquier lenguaje y podia usar internet....

Anónimo dijo...

var_numero_ingresado = 123 -- por ejemplo

var_numero_con_formato = derecha('0000000000' + numero_ingresado,10)

Saludos,
Iván

Alberto Peves M. dijo...

Veo que usas "derecha" como una funcion para llenar los ceros. El truco consiste en no usar funciones, sino hacerlo a "la manera antigua" sin soluciones magicas. En este caso un bucle seria mas interesante como solucion al ejercicio...claro desde mi punto de vista. Saludos. A.

Anónimo dijo...

el sobrante de (340 / 100000000000)

Anónimo dijo...

Mi solución:

class Program
{
static void Main(string[] args)
{
/*
"Cree un algoritmo que en base un número ingresado menor a 10 dígitos rellene con tantos
ceros a la izquierda hasta que dicho número este conformado por 10 dígitos"
Ejemplo:
Si se ingresa "340" mostrar "0000000340"
*/

string numero_ingresado, mascara = "0000000000", numero_ingresado_formateado = string.Empty;
int numero_ingresado_tamano, numero_ingresado_formateado_tamano, mascara_tamano, startIndex;
string resultado_mostrar;

Console.WriteLine("Ingrese un número: ");
numero_ingresado = Console.ReadLine();

numero_ingresado_tamano = numero_ingresado.Length;

if (numero_ingresado_tamano < 10)
{
numero_ingresado_formateado = mascara + numero_ingresado;
numero_ingresado_formateado_tamano = numero_ingresado_formateado.Length;
mascara_tamano = mascara.Length;
startIndex = numero_ingresado_formateado_tamano - mascara_tamano;
resultado_mostrar = numero_ingresado_formateado.Substring(startIndex, mascara_tamano);
}
else
{
resultado_mostrar = numero_ingresado;
}

Console.WriteLine("Resultado: " + resultado_mostrar);
Console.WriteLine("Número de caracteres: " + resultado_mostrar.Length.ToString());
Console.ReadLine();
}
}

Yelinna dijo...

primero: me has resulto varias dudas existenciales. Estudié ing. de Sistemas y lo odié (y lo dejé), estudié ing. electrónica y lo amé, y ahora soy programadora porque como ingeniera electrónica... programo más que uno de sistemas :D

Ten thousand thanks!!
Te dejo mi codiguillo (Python recursivo):

num0 = raw_input('drop me a number! ')

def ceros10(num):
if len(num)<10:
return ceros10('0'+num)
else:
return num

print ceros10(num0)