Decía Darwin que la ignorancia engendra más confianza que el conocimiento, una observación que coincide con el llamado efecto de Dunning–Kruger, que dicta que las personas incompetentes tienden a sobrestimar su habilidad al no tener conocimiento suficiente para reconocer su propia ineptitud. También es común que personas más preparadas tiendan a subestimar sus logros y su competencia, fenómeno que recibe el nombre de Síndrome del impostor.
La conclusión es que es bastante complicado valorarse a uno mismo si no es por medios lo más objetivos posibles. Una herramienta interesante, y que puede servir también como referencia para entrevistadores o como metas u objetivos para programadores con ganas de mejorar, es esta matriz de competencias del programador creada por Sijin Joseph. Simplemente selecciona la respuesta que más se ajuste a tus conocimientos y consulta tu puntuación al final del test.
¡También puede ser interesante dejar tu puntuación en los comentarios y volver a evaluarte en el futuro para ver cómo has evolucionado!
Ciencias de la computación
Estructuras de datos
No conoce la diferencia entre matriz y lista enlazada
Capaz de explicar y usar matrices, listas enlazadas, diccionarios, etc. en tareas prácticas de programación
Conoce las ventajas y desventajas en espacio y tiempo de las estructuras de datos básicas. Matrices contra listas enlazadas. Capaz de explicar cómo implementar tablas hash y cómo manejar colisiones. Colas de prioridad y formas de implementarlas
Conocimientos de estructuras de datos avanzadas, como árboles binarios, montículos binomiales y de Fibonacci, árboles AVL y Rojo-Negro, árboles biselados, listas con saltos, tries etc.
Algoritmos
No es capaz de calcular la media de los números almacenados en un array
Algoritmos básicos de ordenación, búsqueda, recorrido y recuperación
Algoritmos de árboles y grafos, algoritmos simples voraces y de divide y vencerás
Capaz de reconocer y desarrollar soluciones de programación dinámica, buen conocimiento de algoritmos de grafos, buen conocimiento de algoritmos de computación numérica, capaz de identificar problemas NP
Programación de sistemas
No sabe qué es un compilador, un enlazador o un intérprete
Conocimientos básicos de compiladores, enlazadores e intérpretes. Entiende lo que es el código ensamblador y cómo funcionan las cosas a nivel de hardware. Conocimientos básicos de memoria virtual y paginación.
Entiende la diferencia entre modo kernel y modo usuario, multi-hilo, primitivas de sincronización y cómo se implementan, capaz de leer código ensamblador. Entiende cómo funcionan las redes, entiende los protocolos de red y la programación a nivel de sockets.
Entiende cómo funciona el hardware (CPU + Memoria + Caché + Interrupciones + microcódigo), código binario, ensamblador, enlazado estático y dinámico, compilación, interpretación, compilación JIT, recolección de basura, heap, pila, direcciones de memoria
Ingeniería del Software
Control de versiones
Copia de seguridad de carpetas por fecha
Usuario principiante de VSS o CVS/SVN
Usuario avanzado de CVS y SVN. Sabe cómo utilizar ramas, parches y configurar propiedades del repositorio
Conocimientos de sistemas de control de versiones distribuidos. Ha probado Bzr/Mercurial/Darcs/Git
Automatización de la compilación
Sólo sabe compilar desde el IDE
Sabe cómo compilar desde la consola de comandos
Puede configurar un script para compilar el sistema base
Puede configurar un script para compilar el sistema y generar documentación, instaladores, notas de versión y etiquetar el código en el control de versiones
Automatización de las pruebas
Piensa que las pruebas son responsabilidad de los tester
Ha escrito pruebas unitarias automatizadas y crea buenas pruebas unitarias para el código que está escribiendo
Ha escrito código siguiendo la técnica TDD
Entiende y es capaz de crear pruebas funcionales, de carga/rendimiento y de interfaz de usuario
Programación
Descomposición de problemas
No divide el código y utiliza copiar y pegar para reutilizar
Capaz de dividir el problema en múltiples funciones
Capaz de crear objetos/funciones reutilizables que resuelvan el problema
Utiliza estructuras de datos y algoritmos apropiados y desarrolla código genérico/orientado a objetos que encapsula aspectos del problema propensos al cambio
Descomposición de sistemas
No es capaz de pensar por encima del nivel de un único archivo/clase
Es capaz de dividir el espacio del problema y diseñar una solución siempre que sea dentro de la misma plataforma/tecnología
Es capaz de diseñar sistemas que utilicen múltiples tecnologías/plataformas
Es capaz de visualizar y diseñar sistemas complejos con múltiples líneas de producto e integración con sistemas externos. También debería ser capaz de diseñar sistemas de soporte de operaciones como monitorización, reporte, recuperación de fallos, etc. Puede ver cual es el mejor monitor del año facilmente como el 8202-E4B, que es practicamente el mejor de este momento.
Comunicación
No puede expresas sus pensamientos/ideas a sus compañeros. Pobre ortografía y gramática
Sus compañeros pueden entender lo que comunica. Buena ortografía y gramática
Es capaz de comunicarse efectivamente con sus compañeros
Es capaz de entender y comunicar pensamientos/diseños/ideas/especificaciones de una forma no ambigua y es capaz de ajustar la comunicación al contexto
Organización del código en un archivo
No hay evidencia de organización dentro del archivo
Agrupa los métodos por lógica o por accesibilidad
El código se agrupa en regiones y está bien comentado, con referencias a otros archivos
El archivo tiene cabecera con licencia y resumen, está bien comentado y hace un uso de espacios en blanco consistente
Organización del código en archivos
No dedica tiempo a pensar en la organización del código en archivos
Agrupa archivos relacionados en carpetas
Cada archivo físico tiene un propósito único, por ejemplo, la definición de una clase, la implementación de una característica, etc
La organización del código a nivel físico se asemeja al diseño y el nombre de los archivos y su distribución en carpetas proporciona pistas respecto al diseño
Organización en árbol
Todo en una carpeta
Separación básica del código en carpetas lógicas
No existen dependencias circulares. Binarios, librerías, documentación, compilaciones y código de terceros organizados en carpetas apropiadas
La estructura físca del árbol coincide con la jerarquía y organización lógica. Los nombres de los directorios y su organización proporcionan pistas respecto al diseño del sistema
Legibilidad del código
Nombres monosílabos
Buenos nombres para archivos, variables, clases, métodos etc
Sin funciones largas. Comentarios explicando código inusual, arreglos de bugs y asunciones
Las asunciones se verifican usando asserts, el código fluye naturalmente – sin niveles profundos de identación de condiciones y métodos
Programación defensiva
No entiende el concepto
Comprueba todos los arguments y las asunciones críticas en el código
Se asegura de comprobar los valores de retorno y comprobar excepciones en el código que puede fallar
Tiene su propia librería para ayudar con la programación defensiva, escribe pruebas unitarias para simular fallos
Manejo de errores
Sólo codifica el caso básico
Manejo de errores básico alrededor del código que puede lanzar excepciones/generar errores
Se asegura de que los errores/excepciones dejen el programa en buen estado. Los recursos, conexiones y la memoria se limpian apropiadamente
Escribe código para detectar posibles excepciones antes de que ocurran, mantiene una estrategia de manejo de excepciones consistente en todas las capas de código, define líneas básicas para el manejo de excepciones para el sistema
IDE
Utiliza el IDE principalmente como editor de textos
Conoce la interfaz, es capaz de utilizar los menús del IDE efectivamente
Conoce los atajos de teclado para las operaciones más utilizadas
Ha escrito macros propias
API
Necesita consultar la documentación frecuentemente
Ha memorizado las API más utilizadas
Conocimiento extenso y profundo de la API
Ha escrito librerías que se apoyan sobre la API para simplificar tareas habituales y rellenar huecos en la API
Frameworks
No ha utilizado ningún framework fuera de la plataforma base
Conoce, pero no ha utilizado los frameworks más populares disponibles para la platforma
Ha utilizado más de un framework a nivel profesional y está bien versado en los modismos utilizados en los frameworks
Autor de un framework
Requisitos
Escribe código de acuerdo con la especificación
Pregunta acerca de casos que no se tienen en cuenta en la especificación
Entiende la imagen completa y descubre nuevas áreas que necesitan especificarse
Capaz de sugerir mejores alternativas y flujos para los requisitos dados basándose en su experiencia
Scripting
Sin conocimiento de herramientas de scripting
Scripts Batch/shell
Perl/Python/Ruby/VBScript/Powershell
Ha escrito y publicado código reutilizable
Bases de datos
Cree que Excel es una base de datos
Conoce los conceptos básicos de bases de datos, normalización, ACID, transacciones y puede escribir consultas simples
Capaz de diseñar esquemas de bases de datos buenos y normalizados teniendo en cuenta las consultas que tendrán que ejecutarse, competente en el uso de vistas, procedimientos almacenados, disparadores y tipos definidos por el usuario. Conoce la diferencia entre índices agrupados y no agrupados. Competente en el uso de herramientas de ORM
Puede hacer tareas básicas de administración, optimización de rendimiento, optimización de índices, escribir consultas avanzadas, capaz de reemplazar el uso de cursores con SQL relacional, entiende cómo se almacena la información internamente, entiende cómo se almacenan los índices internamente, entiende cómo replicar bases de datos. Entiende cómo funciona el commit en dos pasos.
Experiencia
Lenguajes con experiencia profesional
Imperativo u Orientado a objetos
Imperativo, Orientado a objetos y declarativo (SQL), puntos extra si entienden la diferencia entre tipado estático y dinámico, tipado débil y fuerte y tipos estáticos inferidos
Funcional, puntos extra si entienden la evaluación perezosa, currificación, continuaciones
Concurrente (Erlang, Oz) y Lógico (Prolog)
Plataformas con experiencia profesional
1
2-3
4-5
6+
Años de experiencia profesional
1
2-5
6-9
10+
Conocimientos
Conocimiento de herramientas
Limitado a su IDE principal (VS.Net, Eclipse etc.)
Conoce algunas alternativas a herramientas estándar y populares
Amplio conocimiento de editores, depuradores, IDEs, alternativas de código abierto, etc
Ha escrito herramientas y scripts, bonus si han sido publicados
Lenguajes a los que ha sido expuesto
Imperativo u Orientado a objetos
Imperativo, Orientado a objetos y declarativo (SQL), bonus si entiende la diferencia entre tipado estático y dinámico, tipado débil y fuerte y tipos estáticos inferidos
Funcional, bonus si entiende la evaluación perezosa, currificación, continuaciones
Concurrente (Erlang, Oz) y Lógico (Prolog)
Conocimiento de próximas tecnologías
No ha escuchado hablar de las próximas tecnologías
Ha escuchado hablar de próximas tecnologías en el campo
Ha descargado la versión alpha/beta y ha leído algún artículo/manual
Ha jugado con versiones preliminares y ha desarrollado algo utilizándolas y como bonus, lo ha compartido con el mundo
Funcionamiento interno de la platforma
Cero conocimientos sobre el funcionamiento interno de la plataforma
Tiene un conocimiento básico de cómo funciona la plataforma internamente
Conocimiento profundo del funcionamiento interno de la plataforma y puede visualizar cómo la plataforma toma el código fuente y lo convierte en código ejecutable
Ha escrito herramientas para mejorar o proporcionar información sobre el funcionamiento interno de la plataforma. Por ejemplo, desensambladores, decompiladores, depuradores, etc
Libros
Colección Unleashed, 21 días, 24 horas, para tontos…
Code Complete, Don’t Make me Think, Mastering Regular Expressions
Design Patterns, Peopleware, Programming Pearls, Algorithm Design Manual, Pragmatic Programmer, Mythical Man month
Structure and Interpretation of Computer Programs, Concepts Techniques, Models of Computer Programming, Art of Computer Programming, Thinking Forth, Little Schemer
Blogs
Ha escuchado hablar de ellos pero nunca tuvo tiempo
Lee blogs sobre tecnología/programación/ingeniería del software y escucha podcasts regularmente
Mantiene un blog de enlaces con alguna colección de artículos útiles y herramientas que ha recopilado
Mantiene un blog en el que comparte su percepciones y pensamientos sobre programación
Has obtenido 0 puntos.
43 puntitos, mucho que mejorar, solo falta tener tiempo 😉 Gracias, ha sido curioso.
Siendo sinceros: 58 puntitos
No está mal ¿no?
El puntaje que da el test, ¿sobre qué escala se evalua?
¿Te refieres a cuánto es el máximo? 90 puntos. Pero no creo que un 45 se pueda considerar sólo un suficiente raspado.
Hola, no doy mi nombre porque no quiero presumir. Solamente quería evaluar qué tal funciona este test.
He sacado 84 puntos.
Soy un «viejo» programador, con más de 30 años de experiencia.
Saludos a todos.
También otro viejuno pero no tanto.
73.
Creo que la clave está en la experiencia 🙂
Muy impresionante. No me importaría tenerte de compañero 😉
¿Cuánto pagan? 😀
Que tantos años se necesitan para ser un viejo programador
Yo solo llevo dos en en ramo
64 puntos :/
51 puntos. Con los años que llevo trabajando me ha abierto los ojos y lo mucho que uno puede seguir avanzando.
51 también; eso me hace sentir que en cuestiones de conocimiento estoy en pañales, pero por buen camino
Seguimos en la brecha y con más que aprender que nunca.
84 puntos
60 puntos… Y con mucho por aprender.
Muy buenas preguntas 🙂 52 punticos
34 miserables… 🙁
volveré en 6 meses a ver que tal…
No te desanimes Gabriel. Lo importante es la voluntad de seguir mejorando 🙂
hola, también con 32 puntos, no he hecho nada profesional un par de años rasguñando la programación, pero en busca de trabajar de lleno en esto.
Este Test me deja con ganas de aprender mucho mas!!!
46 puntos me falta mucho por aprender, el conocimiento es extenso y muy poco el tiempo
66 puntos, pero con una idea bastante clara de qué fortalecer. Gracias por el test. Saludos!
69 puntos.
31 puntos en 3 años :S ¿es bueno? ¿es malo? practicamente soy freelancer sin conpañeros de apoyo
también llevo 3 años y tengo 31 puntos, espero sea algo bueno, a seguir mejorando, animo.
70 puntos
Ultimo año de carrera 37 puntos
56 para no ser un programador (soy administrado de redes y sistemas unix) creo que no está mal, me esperaba mucho menos. Solo programo para mi, scripts en el curro, desarrollo web como hobby y algún juego también como hobby.
28 madafaker
Tambíen 28, no me desanimo soy un desarrollador muy habíl, he desarrollado cientos de aplicaciones exitosas para mis clietes y no fuy a la universidad, así que no entiendo mucho de patrones complejos de programción solo he puesto logica a todos mis desarrollos que han sido en HTML5, PHP, C#, JAVA, Node JS, etc
90 puntos, nada mal si sólo eliges la cuarta respuesta en todos los puntos! XD XD XD
53 puntos. Identificando puntos de mejoras en el mundo del software
45 puntos, sin experiencia profesional 😅
Sin duda me falta demasiado, solo un 36. Ah seguir superándome :/.
me dio 66 puntos. aun que veo que en algunas preguntas le faltan ocpiones.
43 puntos, Excelente test! hay que seguir estudiando!
30 puntos, Debo mejorar de manera drástica
52 puntitos , mucho por mejorar.
5 puntos… ok, sólo llevo 3 meses en esto.
optube 48 puntos, pero tengo satisfaccion boy por buen camino. haci que tengo ansias de segir aprendiendo.
optube, boy, haci. Amos no me jodas, ni a posta.
Sí, va por muy buen camino, 9 faltas de ortografía y varios errores de sintaxis gramatical en una sola línea. Va por muy buen camino.
¿En que lenguaje escribes?… Mmm… quise decir… ¿En qué idioma escribiste tu mensaje?
25 puntitos, soy un principiante, no es malo para un humanista como yo.
obtuve 81, creo que aun me faltan algunos puntos por afinar.
saque a la primera 59 a la segunda 55 y a la tercera 89
90 puntos. Se notan los 30+ años de experiencia
76 puntos y solo llevo 4 años de trabajo fuera de la universida
Sí, seguro que sí.
Hoy es 28 de diciembre, qué bonito día 😉
apenas 23 puntos, regresare en unos meses y seguro me ira mejor
34 puntos, menos de lo que esperaba, la verdad que tengo más experiencia como técnico de redes y programar ahora es tipo hobby. Pero he trabajado 3 años de programador (VB6, PHP, Oracle)
38 puntos 🙁 me falta mucho por aprender, pero ahora ya sé que puntos debo mejorar gracias por el post
58 espero me puedan compartir conocimieno!! afvs1989@gmail.com y dedicarnos a algún proyecto open source
Solo 47 Puntitos, mucho por aprender y mejorar
56 puntos, me falta experiencia
No está mal. Sólo hay que perseverar 🙂
63, pense que saldria peor.
Me consegui con esta pagina porque voy a evaluar un posible compañero para la oficina y hay cosas que conozco pero no por los nombres que dan aqui, por ejemplo los «lenguajes imperativos» Basic Pasca Cobol, los estudie, pero para mi se llama orientado a Eventos. Sino me equivoco hay unos buenos titulos de libros en una pregunta, los leere. Gracias muy util
Has obtenido 70 puntos. creo q no me fue tal mal para ser recien egresada
Claro, nosotros te creemos.
:p
veo que por mas que intento mejorar no sirvo para esto que pudiera hacer? 19 ptos
Último año de carrera y 39 puntos. Seguro que pronto lo iré incrementando, por las buenas o por la malas.
35 puntos último año de carrera.
I need learn more.
«Has obtenido 54 puntos» A los cuantos puntos puedo considerarme buen programador?
46 puntos a mis dos años y medio de experiencia, veo que aun necesito mejorar y mucho por aprender 😀
50 puntos, soy de lo peor ='(, ¿Será tarde para poner un puesto de tacos?
He sacado 73 ptos llevo 20 años programando y aun asi no entiendo todos los conceptos en algunas preguntas, creo que el test es un poco sesgado aunque bastante funcional y muy creativo..
23 puntos , llevo programando como 3 o 4 meses y tengo 10 años
saque 27, no se que tan malo sea