Originalmente creé esto como una lista corta de tópicos a estudiar para volverse un Ingeniero de Software, pero creció hasta ser la gran lista puede apreciar actualmente. Después de pasar por este plan de estudios ¡fui contratado como Ingeniero de Desarrollo de Software en Amazon!
Posiblemente no tenga que estudiar mucho como yo. De cualquier forma todo lo que necesita esta aquí.
Los elementos listados aquí le prepararan bien para una entrevista en cualquier compañía de software, incluyendo a los gigantes: Amazon, Facebook, Google o Microsoft.
Este es mi plan de estudios de varios meses para pasar de ser un Desarrollador Web (Autodidacta, sin título) a un Ingeniero de Software para una gran compañía.
Esto es para los nuevos Ingenieros de Software o aquellos que quieren cambiar del Desarrollo de Software/Web a Ingeniero de Software (Donde el conocimiento de las Ciencias de Computación es requerido). Si tiene varios años de experiencia y clama tenerlos como Ingeniero de Software, espere una entrevista más ardua.
Si tiene varios años de experiencia en desarrollo de software/web note que las grandes compañías como Google, Amazon, Facebook y Microsoft ven la Ingeniería de Software diferente al Desarrollo de Software/Web, requiriendo del conocimiento de las Ciencias de Computación.
Si desea ser un Ingeniero de Escalabilidad/Seguridad o un Ingeniero de Sistemas, estudie más de la lista opcional (Redes, Seguridad).
Cuando comencé este proyecto, no sabía la diferencia entre un stack y un heap, no conocía la notación Big-O, nada acerca de árboles, ni cómo sacar la transversal de una gráfica. Si tenía que programar un algoritmo de clasificación, puedo decir que no hubiera sido muy bueno. Cada estructura de datos que había utilizado estaba incorporada al lenguaje, y yo no sabía cómo funcionaban realmente. Yo nunca tuve que manejar la memoria a menos que un proceso que yo estaba corriendo diera un error de “out of memory”, y tenía que encontrar una alternativa. He usado pocos arreglos de varias dimensiones en mi vida y miles de arreglos asociativos, pero nunca he creado estructuras de datos desde cero.
Pero después de pasar por todo este plan de estudios tengo mucha confianza de que seré contratado. Me toará meses. Si mucho de esto te resulta familiar entonces te tomará mucho menos tiempo.
Es un plan largo, puede tome unos meses; pero si le resulta familiar mucho de esto le tomara mucho menos tiempo.
Como usarlo
Todo lo que aparece abajo es un plan, y debería abordar los elementos en orden de arriba a abajo.
Estoy usando el tema especial de markdown de Github, incluyendo listas de tareas para comprobar el progreso.
[] Cree una nueva rama para que pueda validar elementos como este, solo ponga una x en los corchetes: [x]
Haga fork a una rama y siga los comandos siguientes
Algunos videos solo están disponibles inscribiéndose a una clase de Coursera, EdX, o Lynda.com. Estos son llamados MOOCs.
En ocasiones las clases no están en sesión por lo que tendrá que esperar un par de meses, por lo que no tiene acceso. Los cursos de Lynda.com no son gratuitos.
Apreciaría su ayuda añadiendo fuentes siempre disponibles, publicas y gratuitas como videos de Youtube para acompañar a los videos del curso en línea.
Un curso enfocado a una entrevista centrada en Python; que cubre estructuras de datos, algoritmos, plantillas de entrevistas y mucho más.
Escoja un lenguaje para la entrevista
Puede usar un lenguaje con el que este cómodo para hacer la parte de código para la entrevista, pero para las grandes compañías, estas son buenas elecciones:
C++
Java
Python
También podrías usar éstos, pero busca información primero. Puede haber advertencias:
JavaScript
Ruby
Debes sentirte muy cómodo con el lenguaje y ser experto.
El libro fue publicado en 2004, y es algo anticuado pero es un recurso fantástico para la comprensión de una computadora en breve.
El autor inventó HLA, por lo que tiene muchas menciones y ejemplos en HLA. No es ampliamente utilizado, pero los ejemplos son decentes para ver cómo es un lenguaje ensamblador.
Estos capítulos valen la pena ser leídos para brindarle una buena base:
Chapter 2 - Numeric Representation
Chapter 3 - Binary Arithmetic and Bit Operations
Chapter 4 - Floating-Point Representation
Chapter 5 - Character Representation
Chapter 6 - Memory Organization and Access
Chapter 7 - Composite Data Types and Memory Objects
Para un tratamiento más rico y actualizado (2011), pero un trato más largo.
Específicos del lenguaje
Necesita escoger un lenguaje para la entrevista (mire arriba). Aquí están mis recomendaciones por lenguaje. No tengo recursos para todos los lenguajes. Son bienvenidas adiciones.
Si ha leído alguno de estos, probablemente tenga todos los conocimientos de estructuras de datos y algoritmos que necesitara para hacer problemas de codificación.
Puede saltarse todas las video-lecturas en este proyecto, a menos que quiera una crítica.
Algunas personas recomiendan estos pero creo exageran, a menos que tenga muchos años de experiencia en Ingeniería de Software y espere una entrevista mucho más difícil:
Importante: Leer este libro tendrá un valor limitado. Este libro es un buen resumen de algoritmos y estructuras de datos, pero no le enseñará como escribir un buen código. Necesita ser capaz de codificar una solución decente eficientemente.
Half.com es un buen recurso para libros a buenos precios.
Aka CLR, a veces CLRS, porque Stein llego tarde al juego
El primer par de capítulos presentan soluciones inteligentes a problemas de programación (algunos muy antiguos con cinta de datos) pero solo es una introducción. Esta es una guía sobre el diseño y la arquitectura del programa, como Code Complete, pero mucho más corto.
"Algorithms and Programming: Problems and Solutions" by Shen
Un buen libro, pero después de trabajar con algunos problemas me fruste con Pascal, ciclos do while, 1-arreglos indexados y resultados poco claros de satisfacción post-condición.
Prefiero pasar tiempo en problemas de codificación de otro libro o problemas de codificación en línea.
Antes de iniciar
Esta lista creció a lo largo de varios meses, y sí, está un poco fuera de las manos.
Aquí algunos de mis errores para que pueda tener una mejor experiencia.
1. No recordará todo
Vi horas de video y tomé notas exactas de ellos, meses después había mucho que no recordaba. Pase tres días entre mis notas y haciendo tarjetas para poder repasar.
.
Para solucionar el problema construí un pequeño sitio de tarjetas para recordar donde podía añadir tarjetas de dos tipos: general y código.
Cada tarjeta tiene distinto formato.
Hice un sitio adaptado a moviles para revisarlo en mi celular y en mi Tablet, donde quiera estuviera.
Tenga en cuenta que empecé desde abajo y hay tarjetas que cubren todo, desde el lenguaje ensamblador y la trivia Python al Machine Learning y estadísticas. Es demasiado para lo que se requiere.
Nota en las tarjetas: La primera vez reconozca sabe la respuesta, no marque como conocido; necesita contestar muchas veces correctamente antes de que en realidad lo sepa. La repetición pondrá ese conocimiento de forma más profunda en su cerebro.
Una alternativa a usar mi sitio de tarjetas es Anki, que me ha sido recomendado muchas veces. Usa un sistema de repetición para ayudarle a recordar. Es amigable con el usuario y disponible para todas las plataformas y tiene un sistema de sincronización en la nube. Cuesta $25 en iOS pero es gratuito en las otras plataformas.
Práctica, práctica, práctica… hasta que me canse de ello y pueda hacerlo sin ningún problema (algunos usan técnicas y marcadores para recordar)
Trabajar dentro de las restricciones primarias (asignar / liberar memoria sin ayuda del garbage collection (excepto Python))
Hacer uso de los tipos incorporados para que tenga experiencia usando las herramientas de tipos incorporados para su uso en el mundo real (no escribiré mi propia implementación de listas enlazadas en producción)
Puede que no tenga tiempo de hacer todo esto para cada tema, pero lo intentare.
Este es un libro corto, pero le dará un gran manejo en el lenguaje C y si lo practica un poco, rápidamente conseguirá ser experto. Comprender C le ayuda a entender cómo funcionan los programas y la memoria.
Gotcha: Necesita tener conocimiento del apuntador a apuntador:
(Cuando se pasa un apuntador a una función este puede cambiar la dirección a la que el apuntador apunta)
Esta página es sólo para tener una idea sobre un apuntador a un apuntador. No recomiendo esta lista de estilo transversal. La legibilidad y sostenibilidad sufren debido a la astucia.
Implementar usando listas enlazadas, con el puntero de la cola:
enqueue(value) – Añade el valor en la posición de la cola
dequeue() – Regresa el valor y elimina el valor más recientemente añadido(frontal)
empty()
Implementar usando arreglos de tamaño fijo:
enqueue(value) – Añade elemento al final del almacenamiento disponible
dequeue() – Regresa el valor y elimina el elemento más recientemente añadido
empty()
full()
Costo:
Una mala implementación usando lista enlazada donde se enqueue en la cabeza y dequeue en la cola sería O (n)
Porque usted necesitaría el siguiente al último elemento, causando un recorrido completo cada dequeue
enqueue: O(1) (amortizado, Lista enlazada y arreglo [sondaje])
Los grafos pueden ser usados para representar muchos problemas en las Ciencias de la Computación, así que es una sección larga, como lo son los árboles y ordenamientos.
Notas:
Hay cuatro formas básicas de representar un grafo en memoria:
Objetos y apuntadores
Matriz adyacente
Lista adyacente
Mapa adyacente
Familiarícese con cada representación y sus pros y contras
BFS and DFS – Conozca su complejidad computacional, sus compromisos y cómo implementarlos en código real
Cuando se le haga una pregunta busqué una solución basada en grafos, si no encuentra continúe.
Este tema puede ser bastante difícil, ya que cada problema soluble PD debe definirse como una relación de recursión, y llegar a ella puede ser complicado.
Sugiero que busque muchos ejemplos de problemas de PD hasta que tenga una comprensión sólida del patrón involucrado.
Videos:
Los videos de Skiena pueden ser duros de seguir ya que a veces usa el pizarrón que es demasiado pequeño para ver
Conozca acerca de las clases más famosas de problemas de NP-completo, tales como el vendedor ambulante y el problema de la mochila y sea capaz de reconocerlos cuando un entrevistador se los pide disfrazados.
Necesidades de recursos de proceso (memoria: código, almacenamiento estático, pila, monticulo y también descriptores de archivo, i /o)
Necesidades de recursos de hilos (partes anteriores (menos pila) con otros hilos en el mismo proceso, pero cada uno tiene su propio PC, contador de pila, registros y pila)
Bifurcación es realmente copia en escritura (sólo lectura) hasta que el nuevo proceso escribe en memoria, entonces hace una copia completa.
Cambio de contexto
Cómo se inicia el cambio de contexto por el sistema operativo y el hardware subyacente
La lectura de todos de extremo a extremo con la comprensión completa probablemente tomará más tiempo del que tiene. Recomiendo ser selectivo en los documentos y sus secciones.
Diseño del Sistema, Escalabilidad, Manejo de Datos
Puede esperar preguntas sobre el diseño del sistema si tiene más de 4 años de experiencia.
La escalabilidad y el diseño del sistema son temas muy extensos con muchos temas y recursos, ya que hay mucho que considerar al diseñar un sistema de software / hardware que puede escalar. Espere dedicarle un buen tiempo a esto.
Consideraciones:
Escalabilidad
Destilar conjuntos de datos grandes a valores únicos
Transformar un conjunto de datos en otro
Manejo de cantidades de datos obscenamente grandes
Para aún más, vea la serie de videos "Mining Massive Datasets" en la sección de Series de video.
Practicando el proceso de diseño del sistema: Aquí hay algunas ideas para tratar de trabajar en papel, cada una con cierta documentación sobre cómo se manejó en el mundo real:
Esta sección tendrá videos cortos que puede visualizar rapidamente para revisar algunos de los conceptos importantes.
Es bueno si quieres repasar a menudo.
Series de videos cortos sobre temas de 2-3 minutos (23 videos)
Ahora que conoce todos los tópicos de las Ciencias de la Computación mencionados anteriormente, es tiempo de practicar respondiendo algunos problemas de codificación.
La practica de preguntas de codificación no es sobre memorizar respuestas a problemas de programación.
Porque necesita practicar haciendo problemas de programación:
El reconocimiento de problemas, y donde las estructuras de datos y algoritmos adecuados encajan
Reunir los requisitos para el problema
Hablar sobre su camino a través del problema como lo hará en la entrevista
Codificar en una pizarra o papel, no en un ordenador
Llegar con la complejidad del tiempo y espacio para sus soluciones
Probar sus soluciones
Hay una gran introducción para la solución de problemas metódicos y comunicativos en una entrevista. Conseguirá esto de los libros para la entrevista de programación también, pero encontré esto excepcional:
Algorithm design canvas
¿No tiene pizarrón en casa? Hace sentido. Soy un bicho raro y tengo una pizarra grande. En vez de una pizarra blanca, recoja un gran cuadernillo de dibujo de una tienda de arte. Puede sentarse en el sofá y practicar. Esta es mi "pizarra de sofá". He añadido la pluma en la foto para la escala. Si usa un bolígrafo, deseará poder borrarlo. Se ensucia rápido.
Vea los elementos de preparación en Cracking The Coding Interview and back of Programming Interviews Exposed
Pensando en cuando llegue la entrevista
Piense en aproximadamente veinte preguntas de la entrevista que usted conseguirá, junto con las líneas de abajo. Tenga 2-3 respuestas para cada una.
Tener una historia, no sólo datos, sobre algo que logro.
¿Por qué quiere este trabajo?
¿Cuál es un problema difícil que ha resuelto?
¿Cuáles han sido los mayores desafíos enfrentados?
¿Cuáles han sido los mejores / peores diseños vistos?
Ideas para mejorar un producto existente.
¿Cómo trabaja mejor, individualmente y como parte de un equipo?
¿Cuáles de sus habilidades o experiencias serían claves en el rol y por qué?
¿Qué es lo que más disfruto en [ x trabajo / y proyecto]?
¿Cuál fue el mayor reto al que se enfrentó en [x trabajo / y proyecto]?
¿Cuál fue el error más difícil que enfrentó en [x trabajo / y proyecto]?
¿Qué aprendió en [x trabajo / y proyecto]?
¿Qué habría hecho mejor en [x trabajo / y proyecto]?
Preguntas para el entrevistador
Some of mine (I already may know answer to but want their opinion or team perspective):
How large is your team?
What does your dev cycle look like? Do you do waterfall/sprints/agile?
Are rushes to deadlines common? Or is there flexibility?
How are decisions made in your team?
How many meetings do you have per week?
Do you feel your work environment helps you concentrate?
What are you working on?
What do you like about it?
What is the work life like?
Una vez obtenido el empleo
Congratulations!
Keep learning.
You're never really done.
*****************************************************************************************************
*****************************************************************************************************
Everything below this point is optional.
By studying these, you'll get greater exposure to more CS concepts, and will be better prepared for
any software engineering job. You'll be a much more well-rounded software engineer.
*****************************************************************************************************
*****************************************************************************************************
These topics will likely not come up in an interview, but I added them to help you become a well-rounded
software engineer, and to be aware of certain technologies and algorithms, so you'll have a bigger toolbox.
Know least one type of balanced binary tree (and know how it's implemented):
"Among balanced search trees, AVL and 2/3 trees are now passé, and red-black trees seem to be more popular.
A particularly interesting self-organizing data structure is the splay tree, which uses rotations
to move any accessed key to the root." - Skiena
Of these, I chose to implement a splay tree. From what I've read, you won't implement a
balanced search tree in your interview. But I wanted exposure to coding one up
and let's face it, splay trees are the bee's knees. I did read a lot of red-black tree code.
splay tree: insert, search, delete functions
If you end up implementing red/black tree try just these:
search and insertion functions, skipping delete
I want to learn more about B-Tree since it's used so widely with very large data sets.
In practice:
From what I can tell, these aren't used much in practice, but I could see where they would be:
The AVL tree is another structure supporting O(log n) search, insertion, and removal. It is more rigidly
balanced than red–black trees, leading to slower insertion and removal but faster retrieval. This makes it
attractive for data structures that may be built once and loaded without reconstruction, such as language
dictionaries (or program dictionaries, such as the opcodes of an assembler or interpreter).
In practice:
Splay trees are typically used in the implementation of caches, memory allocators, routers, garbage collectors,
data compression, ropes (replacement of string used for long text strings), in Windows NT (in the virtual memory,
networking and file system code) etc.
In practice:
Red–black trees offer worst-case guarantees for insertion time, deletion time, and search time.
Not only does this make them valuable in time-sensitive applications such as real-time applications,
but it makes them valuable building blocks in other data structures which provide worst-case guarantees;
for example, many data structures used in computational geometry can be based on red–black trees, and
the Completely Fair Scheduler used in current Linux kernels uses red–black trees. In the version 8 of Java,
the Collection HashMap has been modified such that instead of using a LinkedList to store identical elements with poor
hashcodes, a Red-Black tree is used.
In practice:
For every 2-4 tree, there are corresponding red–black trees with data elements in the same order. The insertion and deletion
operations on 2-4 trees are also equivalent to color-flipping and rotations in red–black trees. This makes 2-4 trees an
important tool for understanding the logic behind red–black trees, and this is why many introductory algorithm texts introduce
2-4 trees just before red–black trees, even though 2-4 trees are not often used in practice.
fun fact: it's a mystery, but the B could stand for Boeing, Balanced, or Bayer (co-inventor)
In Practice:
B-Trees are widely used in databases. Most modern filesystems use B-trees (or Variants). In addition to
its use in databases, the B-tree is also used in filesystems to allow quick random access to an arbitrary
block in a particular file. The basic problem is turning the file block i address into a disk block
(or perhaps to a cylinder-head-sector) address.
MIT 6.851 - Memory Hierarchy Models (video)
- covers cache-oblivious B-Trees, very interesting data structures
- the first 37 minutes are very technical, may be skipped (B is block size, cache line size)
k-D Trees
great for finding number of points in a rectangle or higher dimension object
I added these to reinforce some ideas already presented above, but didn't want to include them
above because it's just too much. It's easy to overdo it on a subject.
You want to get hired in this century, right?