He contratado a aproximadamente 200 programadores en los últimos 20 años, por lo que tengo una guía general para usted. También tengo experiencia con estudiantes graduados de CS, así que puedo tener una idea particular de su situación. Primero la orientación general:
- La forma en que piensas a través de un diseño es lo más importante. Explica lo que estás pensando mientras trabajas. Puede obtener algo de dirección si va por el camino equivocado. De lo contrario, sabrán que sus elecciones provienen de la consideración de las compensaciones en lugar de la suerte o alguna hoja de trucos de problemas de entrevistas.
- La codificación es un deporte de equipo, por lo que la forma en que comunicas tus pensamientos es casi tan importante como los pensamientos mismos . Haga diagramas de clase rápidos, pseudocódigo, diagramas de bloques, etc. para asegurarse de que entiendan lo que quiere decir. Usa un lenguaje claro y participa.
- Recuerde, parte de la “prueba” es qué tan bien obtiene los requisitos . Comprenda el problema Y la rúbrica de cómo el entrevistador evaluará su respuesta. Haga preguntas aclaratorias y siga preguntando hasta que: (1) haya encontrado los límites de lo que realmente importa para el problema. (2) Tener una idea bastante buena de las prioridades del entrevistador. Si favorece la capacidad de evolución sobre la simplicidad, entonces puede querer que use un patrón de diseño que facilite cambios posteriores incluso a expensas de la simplicidad ahora. Lo sabrás porque él te dirá que el problema va a evolucionar. Presta atención a esas pistas. Si él quiere que escribas pruebas primero, dirá cosas como: “¿Cómo harías normalmente para codificar esto?” Si no está seguro, pregunte: “¿Es preocupante la capacidad de evolución?” o “¿Debo escribir pruebas?”
- Tome buenas decisiones de identificación y mejórelas a medida que aprende más o el problema evoluciona. Mis problemas de codificación de entrevistas favoritas requieren que desarrolles un juego de cartas simple a través de varios cambios / adiciones a las reglas. Al principio, puede llamar a un objeto “jugador” pero luego, cuando el jugador puede tener más de una mano, lo divide y lo llama “mano”. Esas opciones son clave para escribir código mantenible. Quiero verte hacer eso en entrevistas.
Mi licenciatura era Ingeniería Eléctrica y mis dos primeras contrataciones de programadores también eran EE. Mi tercer programador era un graduado de CS y lo hizo tan mal en el trabajo que nunca contraté a otro graduado de CS como programador hasta aproximadamente mi 50a contratación. También enseñé clases de Ingeniería de Software en Carnegie Mellon a estudiantes de CS (a diferencia de los estudiantes de SE), así que tengo mis sospechas sobre cuál podría ser su problema particular. El consejo que voy a dar puede no ser tan importante para los trabajos orientados a algoritmos, pero se aplicará a la mayoría de las aplicaciones comerciales.
La diferencia entre ciencia e ingeniería es que un ingeniero trata cada decisión como una evaluación de las compensaciones. A los estudiantes de CS se les enseña sobre abstracciones elegantes, estructuras de datos y algoritmos. Los ingenieros también los aprenden, pero nunca se olviden de cambiarlos por consideraciones prácticas de funcionalidad, usabilidad, riesgo y, lo más importante, COSTOS . Entonces:
- ¿Qué crees que apesta más sobre las entrevistas de la industria de TI india?
- Mañana tengo una entrevista técnica en software acuvate para el rol de ingeniero de software. Alguien puede ayudarme?
- ¿Qué tipo de preguntas de diseño se hacen en la entrevista de Google / Facebook / Amazon?
- Cómo descifrar entrevista técnica de MNC
- ¿Qué tipo de preguntas se hacen en la prueba de análisis Flipkart?
- Conozca los patrones de diseño más comunes [1] y cómo aplicarlos. Preste especial atención a los patrones de diseño que utilizan la inversión de control y / o apuntan a la “intención” de la capacidad de evolución, incluida la estrategia, el método de plantilla, el observador, la fábrica y el iterador. Estos ayudan a mitigar el riesgo de tener una comprensión imperfecta de los requisitos reales (en oposición a los documentados) y contra los cambios inevitables. También facilitan la comunicación y la aplicación de un patrón conocido cuesta menos que un enfoque basado en principios fundamentales … especialmente cuando se enfoca en las entidades. Conozca las palabras de moda que se activarán cuando el entrevistador lo esté buscando para usar un patrón particular. Si él dice: “¿Cómo codificaría el algoritmo general mientras permite diferentes detalles?” debes saber que él quiere que uses el Método de plantilla.
- La respuesta “correcta” puede ser usar una biblioteca o un marco de terceros. Intento sembrar mis entrevistas con preguntas de “truco” que se responden mejor con “Usar Lucene Solr”. o “Espero que haya una función de biblioteca para la codificación de URL adecuada”. La decisión de compensación de compra versus construcción es a menudo la más importante.
- Conozca los principios de SOLID [2], cómo aplicarlos … y cuándo su aplicación se va por la borda, particularmente el principio de sustitución de Liskov.
- Tenga cuidado con el uso de la programación funcional a menos que el trabajo lo mencione (Erlang, F #, Scala, etc.) o el problema de programación lo requiera (recorrido recursivo del árbol, función lambda para python o javascript). Java, C # y C ++ son mucho más frecuentes. La mayoría de los tiempos de ejecución de Java y JavaScript no aplanan adecuadamente la recursividad de cola. El uso de la memoria de escape es una gran preocupación en los sistemas de producción y no te enseñan eso en la escuela. Si usa la recursividad donde un simple bucle limitado sería suficiente, sabré que no ha aprendido a preocuparse por estos riesgos y (al menos para mí) la entrevista ha terminado.
- Conozca las herramientas para la gestión del código fuente, las pruebas automatizadas y la integración continua y por qué son importantes .
[1] http://en.wikipedia.org/wiki/Des…
[2] http://en.wikipedia.org/wiki/Sol…