Pregunta original
Ya hice algunas entrevistas para mi empresa, principalmente científicos informáticos para puestos de desarrollo, pero también algunos evaluadores y gerentes de proyectos. Ahora tengo que llenar una vacante en nuestro grupo de investigación dentro del departamento de I + D (nota al margen: "investigación" significa que tratamos de resolver problemas en nuestro dominio profesional / nicho de mercado utilizando software en proyectos de investigación junto con universidades, otras empresas, centros de investigación y organizaciones de usuarios finales. No es investigación en informática; no vamos a resolver el problema P = NP).
Ahora invitamos a un tipo con una maestría en química (con mucha física también en su CV), que nunca tuvo ninguna clase de informática. Ya hablé con él aproximadamente media hora en los días de carrera de una universidad local y no hay duda de que el tipo es inteligente. También sus notas son excelentes y se graduó con distinción. Para su licenciatura, necesitaba aprender a programar en Mathematica y me dijo creíblemente que le gustaba mucho programar. También resolvió un problema de química física que probablemente no entiendo usando su propio software, implementado en Mathematica, para su tesis de maestría. Incluye una GUI y un tamaño notable de 8,000 LoC. Parece estar muy atraído por lo que estamos haciendo en nuestro grupo de investigación y, para ser sincero, es bastante difícil para una PYME como nosotros conseguir buenas personas. También estoy muy interesado en contratarlo, ya que podría ayudarme a escribir propuestas de proyectos, informes, hacer presentaciones, etc. Probablemente también encajaría en nuestro equipo.
La única pregunta que queda es: ¿cómo puedo verificar si obtendrá las habilidades de programación que necesita para implementar software en nuestros proyectos, ya que esta será una parte importante del trabajo?
Por supuesto, le preguntaré qué es, eso es lo que lo fascina de la programación. También le preguntaré cómo procedió a escribir su software de ciencias naturales y cómo lo estructuró. Le preguntaré cómo logró obtener las habilidades y la información sobre el desarrollo de software que necesitaba. ¿Pero hay algo más que pueda preguntar? ¿Algo más concreto quizás? ¿Debo pedirle que explique su solución de Mathematica?
Para ser claros: no estoy buscando conocimiento en un idioma particular o una pila de tecnología. Somos una tienda .NET en desarrollo de productos, pero quiero tener una opción libre para nuestros proyectos de investigación. Así que estoy interesado en que la meta-competencia sea capaz de aprender lo que realmente se necesita.
Espero que esta pregunta sea respondible y no abierta, ya que realmente me gusta saber si hay una forma predeterminada de verificar la capacidad de obtener más habilidades de programación en el trabajo. Si algo no está claro para usted, por favor deme algunos comentarios y permítame mejorar mi pregunta.
Actualización para reflejar las respuestas dadas hasta 2011-12-01
Qué respuesta acepté y por qué
Gracias a todos por sus respuestas, la mayoría de ellas son bastante útiles, ¡así que voté mucho! Aunque la respuesta de Tom Squires obtuvo la mayor cantidad de votos, voy a aceptar la respuesta dada por el Príncipe Goulash . Por supuesto, Tom es objetivamente correcto, pero la respuesta de Prince es más útil para mí y revisé dos veces las preguntas frecuentes de que este es el criterio para aceptar una respuesta.
Lo que le voy a preguntar durante la entrevista.
Le dejaré explicar algunas tareas simples como el ejemplo en The Camel Has Two Humps mencionado por Chris Burt-Brown
Le pediré que explique algunos flujos de control más avanzados, tal vez en una notación gráfica.
Comprobaré su comprensión de la recursividad usando un ejemplo matemático.
Le dejaré explicar un algoritmo de su elección en lenguaje natural.
Le dejaré explicar su solución de Mathematica, en particular le preguntaré por su modelo de procedimiento, uso de herramientas, estructuración de código y software en general, así como diferentes capas de abstracción.
Para verificar su motivación, le preguntaré por su fascinación por el desarrollo de software.
Le preguntaré si está al tanto de lo que necesitará para aprender sobre el desarrollo de software empresarial. Especialmente quiero convertir la discusión en la dirección de trabajar en equipos, programación de pares, TDD, ya que espero que no sepa mucho sobre esto después de trabajar solo en su maestría.
Parece que va a ser una larga entrevista;)
Actualización después de la entrevista 2011-12-09
Nuevamente, gracias a todos por sus buenas respuestas. Pasó la entrevista con gran éxito. Nunca estuve más satisfecho con un solicitante. Su solución de Mathematica parece estar estructurada bastante bien. Pudo explicar dónde usaba las funciones de orden superior, aunque no sabía que se referían así. Él respondió a mis preguntas de recursión basadas en matemáticas, así como a tareas simples y cosas de control de The Camel Has Two Humps. Cuando estaba explicando algunos algoritmos, aprendí mucho sobre el ajuste no lineal;) También dijo honestamente que, por supuesto, no puede garantizar que podrá aprender cosas sobre el desarrollo de software profesional que no conoce hasta ahora. Pero él creía que siempre fue bueno aprendiendo nuevos conceptos, incluso solo, y que estaba realmente interesado en el desarrollo de software. También solicitó la pila de tecnología del proyecto, se le aplicaría primero, para echarle un vistazo en casa. También sentía curiosidad por la programación en pareja y el trabajo en equipo. Ahora espero que se concluya el contrato de trabajo.
Respuestas:
Soy muy parcial aquí porque comencé como desarrollador de software hace unos años con un doctorado en física, pero muy poca experiencia en codificación (que equivale a un curso de pregrado en Fortran). Claramente, depende del tipo de software que esté desarrollando, pero mi opinión es que las habilidades de codificación son muy fáciles de aprender por cualquier persona con habilidades científicas y de resolución de problemas medio decentes. No pretendo que sea un insulto para los programadores de toda la vida que han estudiado ciencias de la computación: por supuesto, hay aspectos técnicos que requieren una capacitación seria para dominar (por ejemplo, arquitectura de subprocesos múltiples y muy bajo nivel), pero supongo que eso es no el puesto que estás tratando de ocupar.
Para mi entrevista técnica para mi puesto actual, me enfrenté a un problema matemático razonablemente complejo y me pidieron diseñar un programa para resolverlo. El énfasis estaba en escribir un algoritmo que, una vez implementado, resolvería el problema. Podría escribir una respuesta simplemente usando palabras para describir mi solución, pero se me permitió escribir un código en un idioma de mi elección si así lo deseara. La prueba fue más sobre la capacidad de resolución de problemas y si pude "pensar como un programador". Obviamente, si hubiera candidatos con la misma capacidad y uno tuviera más experiencia en codificación directa, habría salido en la cima, pero eso me parece bastante justo.
La conclusión es: examina al candidato por las habilidades para las que lo estás contratando, no por los ideales que esperas que logre.
fuente
No se puede . Es imposible probar con precisión una habilidad que aún no tiene. Tienes que hacer un juicio basado en su inteligencia y actitud. En última instancia, siempre será un riesgo.
Por experiencia personal, puedo decir que es muy posible pasar de la ciencia a la programación. Básicamente, ambos se reducen a usar tu cerebro para resolver acertijos complejos.
fuente
No tengo ninguna fuente secundaria que verifique este documento, así que no puedo responder por ello, pero:
El camello tiene dos jorobas
http://www.eis.mdx.ac.uk/research/PhDArea/saeed/paper1.pdf
fuente
¿Cómo puedo verificar si obtendrá las habilidades de programación que necesita?
Es muy sencillo. Dale las habilidades.
Ahora, esa no es una respuesta muy satisfactoria, pero déjenme explicarlo.
Llegué a la programación después de 3 años en Ingeniería Civil. Esa es una formación bastante sólida en física aplicada y matemáticas. No es la matemática teórica que daría un título de CS, pero vale algo. Lo que extraje de la experiencia en ingeniería fue una sólida formación en resolución de problemas . Cualquier persona con experiencia en matemáticas ya aprecia el concepto de elegancia cuando habla de una solución a un problema. Ya han recibido educación en refactorización, ya que han pasado el tiempo tomando seis páginas de scratch de pollo y convirtiéndola en una elegante prueba de media página para enviar.
Cualquiera que haya estudiado física ha desarrollado un enfoque intuitivo para elaborar una solución a partir de marcos básicos.
¿Y qué es la programación fuera de estas habilidades? - Lenguaje, modismos, patrones y marcos. Estos son fáciles de enseñar. Es la resolución de problemas lo que no puedes. Si puede proporcionar instrucciones en estas áreas, terminará con un buen desarrollador.
La pregunta se convierte en "¿Cuánto tiempo puede esperar a que se ponga al día?"
tl; dr; Puedes enseñar mecanografía. No puedes enseñar de manera inteligente.
fuente
Tengo una licenciatura en Ciencia de Materiales pero he trabajado toda mi carrera en el desarrollo de software.
Sugeriría que su candidato probablemente no tenga problemas con la programación básica y los algoritmos, pero cuando se trata de los requisitos de tipo más "ingeniería", puede necesitar alguna orientación. Con eso me refiero a estructurar bien su código, no tener 500 funciones de línea, probar de manera efectiva, diseñar para la eficiencia ...
La mayor parte de esto se puede enseñar, pero es posible que desee diseñar algunas preguntas para verificar esto.
fuente
Me parece que el candidato ya sabe programar, dado que tal vez no tengan tanta experiencia como desarrollador dedicado, pero tienen un proyecto demostrable que han completado y que requiere una cantidad de trabajo no trivial para completarse. Como tal, es posible que pueda entrevistar al candidato de la misma manera que lo haría con un desarrollador que usa un idioma diferente al que usted usa, a saber:
El lenguaje que utiliza Mathematica es bastante avanzado y alguien que sea bueno escribiendo software para Mathematica debería ser bastante competente en otros ámbitos, por lo que centrarse en esa experiencia y usarla como base para codificar la experiencia podría ser una buena manera de abordar la entrevista.
fuente
Hablando como un graduado de Ingeniería Aeroespacial convertido en programador, ciertamente es posible dar el salto de las ciencias naturales a la programación. Sin embargo, tenga en cuenta que la capacidad de resolver problemas no siempre se correlaciona con la capacidad de escribir código. Pareces darte cuenta de esto y eso es algo bueno.
Para mí, los conceptos más importantes para asegurarse de que comprende son el flujo de control y la recursividad (y el bucle en general como un subconjunto de esto). Antes de contratar a un candidato, incluso alguien que sea claramente muy inteligente, asegúrese de poder escribir un algoritmo de palabras simples para resolver problemas. Asegúrese de que pueda tomar ese algoritmo de palabras simples y convertirlo al menos en pseudocódigo. Incluso puede investigar para ver si al menos puede entender el concepto de polimorfismo, aunque no estoy seguro de que este sea el conocimiento necesario en esta circunstancia.
También tenga cuidado con la capacidad de resolver problemas de ciencias en Mathematica / MatLab / Lo que no significa que puede escribir un buen código. Simplemente significa que es capaz de aplicar principios de programación básicos (a veces extremadamente básicos), generalmente declaraciones if / else. Aprender a ser un buen programador generalmente requerirá un compromiso personal y del empleador con alguien en esta etapa. Advertencia: he conocido personas muy inteligentes que eran / son buenos ingenieros que no podían programar su salida de una bolsa de papel y, sinceramente, no podían comprender los fundamentos básicos del lenguaje.
Experiencia personal
Me gradué de la escuela con un título de ingeniería y un poco de experiencia en programación en mi haber. Había trabajado con una cantidad muy pequeña de C, bastante MatLab y algo de VB + Access. Me llevó unos 3 meses de estudio llegar a ser realmente útil como programador en una tienda VB.NET. Me tomó otros 9 meses llegar a ser completamente competente. Sin embargo, puedo decir con bastante confianza que mis habilidades para resolver problemas son superiores al 99% de otros programadores que he conocido en mi trabajo. Mis empleadores siempre me han considerado uno de sus activos más valiosos.
Conclusión
Es una propuesta de riesgo / recompensa, pero a menudo enfrentarse a alguien que tiene las habilidades de resolución de problemas puede ser rentable a largo plazo, siempre y cuando sean capaces de aprender los conceptos de programación y ambos estén dispuestos a invertir el tiempo en expandir su programación. conocimiento. Sin embargo, creo firmemente que debe poseer al menos una comprensión básica de los fundamentos de la programación antes de ofrecerle un trabajo. En mi experiencia, una vez que estás en este punto, puedes ir mucho más allá.
fuente
Comenzaría con algunas preguntas básicas sobre algoritmos y conceptos básicos para ver si está metido en la lógica de algoritmos y programación. Si es capaz de comprender qué es un algoritmo, puede desarrollar las habilidades necesarias para hacer cosas concretas después.
fuente
Honestamente, estoy bastante seguro de que no obtendrá esta información de una entrevista de una o dos horas. Dele una tarea de programación en C # (algo no demasiado técnico) y una o dos semanas para resolver. Eso debería ser suficiente tiempo para aprender los conceptos básicos del lenguaje para alguien que ya ha aprendido programación con Mathematica. Luego haga una revisión del código con él y decida sobre esa base.
fuente
¿Podría mirar Prácticas para programar en un entorno científico? (en Stack Overflow) para tener una idea de cómo es la cultura de programación de las ciencias naturales. De esa manera, usted está en condiciones de comparar su preparación con la de sus compañeros.
Para el caso, puede pedirle que describa las prácticas de programación a las que está acostumbrado para saber si es consciente de que hay otras formas de hacerlo .
Hay muchos "buenos programadores" en mi negocio cuya calificación es poder mantener suficiente estado en su cabeza para improvisar algún código de trabajo, pero cuyo trabajo tiende a ser desestructurado y difícil de mantener. Generalmente se les puede enseñar, pero ... tienen que ser enseñados.
fuente
Otro departamento donde trabajo utiliza una variación en nuestra prueba estándar. La primera tarea es invertir las palabras en una cadena en su lugar. Luego, use ese código para invertir el orden de las palabras en la cadena, aún en su lugar. En lugar de usar un lenguaje de programación, hacen que el candidato diseñe los algoritmos en papel y los ejecute usando una placa Scrabble.
fuente
Yo pediría describir (usando lenguaje natural) un algoritmo para calcular algo de la física. Algo un poco más complicado que una fórmula simple y luego le preguntaría cómo vería su cálculo encapsulado en objetos (no es necesario el conocimiento de OOP, podría explicar cuál es su expectativa de un objeto). De esta manera puedes ver su pensamiento lógico. Esto es más importante que cualquier habilidad de programación.
fuente
Primero, probablemente son bastante inteligentes, por lo que en el peor de los casos, pueden aprender a ser un buen programador con orientación. Sin embargo, si necesita que intervengan y sean un programador decente desde el principio, pídales que envíen un código de muestra que hayan escrito.
¿Se trata de una o dos funciones gigantes de usos múltiples o encapsularon la funcionalidad en los niveles apropiados de abstracción? ¿Están los números mágicos codificados en todas partes? ¿Está el código SECO? ¿Le dieron nombres razonables a las variables o es todo una abreviatura indescifrable o una sola letra variable? ¿Puedes seguir principalmente la lógica de su código? ¿Entienden lo básico de OO?
Pregunte qué utilizan para el control de versiones (git / hg / svn / cvs / bzr, etc.). ¿Han perfilado alguna vez el código o han utilizado un depurador? De ser así, ¿cuál o cuál es su estrategia genérica de depuración?
Si no pasan esta prueba y necesitas un buen programador desde el principio, omite a esta persona. De lo contrario, contratarlos, sugerirles que lean algunos libros de ingeniería de software (por ejemplo, Code Complete) además de libros genéricos de programación / CS.
(Para que conste, también soy un científico físico convertido en programador).
fuente
Como todavía está en una universidad o acaba de terminar, está acostumbrado a estudiar. Haga que lea y comprenda el libro de Patrones de diseño y después (o durante) un mes, tenga discusiones exhaustivas con él sobre los temas. (Creo que) esto puede decirle mucho sobre sus habilidades (no solo las difíciles (también esas), sino también cómo maneja comprender nuevos conceptos, comprender su uso, ver los pros y los contras, etc.). Pero te costará un mes de tiempo.
fuente