coding-interview-university/translations/es/README.md

144 KiB
Raw Blame History

Coding Interview University

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.

¡La mejor de las suertes!

Traducciones:

¿Qué es esto?

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.

Coding at the whiteboard - from HBO's Silicon Valley

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).


Tabla de contenido

---------------- Todo debajo de esta marca es opcional ----------------


¿Por qué usarlo?

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

git checkout -b progress

git remote add jwasham https://github.com/jwasham/coding-interview-university

git fetch --all

Marque todas las cajas con una x después de que completa los cambios

git add .

git commit -m "Marked x"

git rebase jwasham/master

git push --force

Más acerca de los temas de Github para markdown

No sienta no es lo suficientemente listo

Acerca de los recursos de vídeo

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.

Me gustan recursos provenientes de universidades.

Prepárese para la entrevista

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.

Lee más acerca de opciones:

Ve recursos de programas aquí

Verás algunos materiales de aprendizaje de C, C++ y Python abajo, porque estoy aprendiendo. Hay algunos libros involucrados, ve al final.

Lista de libros

Ésta es una lista más corta que la que yo usé. Está abreviada para ahorrarle tiempo.

Preparación para la entrevista

Si tiene mucho tiempo extra:

Arquitectura de Computadores

Si esta corto de tiempo:

  • Write Great Code: Volume 1: Understanding the Machine
    • 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
      • Chapter 9 - CPU Architecture
      • Chapter 10 - Instruction Set Architecture
      • Chapter 11 - Memory Architecture and Organization

Si tiene más tiempo (Yo quiero este libro):

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.

Recursos adicionales específicos del lenguaje aquí.

C++

No he leído estos dos, pero están altamente calificados y escritos por Sedgewick. Él es asombroso.

Si tiene una mejor recomendación para C++ por favor hágamelo saber. Busco fuentes comprensivas.

Java

O:

  • Data Structures and Algorithms in Java
    • Por Goodrich, Tamassia, Goldwasser
    • Usado como texto opcional en el curso de Informática impartido en UC Berkeley
    • Vea mi reporte de la versión de Python debajo. Este libro abarca los mismos tópicos.

Python

Libros Opcionales

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:

  • Algorithm Design Manual (Skiena)

    • Como un resumen y un reconocimiento de problemas
    • La porción del catálogo de algoritmos está más allá del alcance de la dificultad que obtendrá en una entrevista.
    • Este libro consta de dos partes:
      • Libro de clase sobre estrcutura de datos y algoritmos
        • Pros:
          • Es un buen resumen como cualquier libro de algoritmos debe ser
          • Buenas historias de sus experiencias resolviendo problemas en la industria y en la academia
          • Ejemplos codificados en C
        • Cons:
          • Puede ser así de denso o impenetrable como los CLRS, en algunos casos, los CLRS pueden proveer una mejor alternativa para algunos temas
          • Capítulos 7, 8, 9 pueden ser un martirio intentar darles seguimiento, ya que no están bien explicados o requieren más cerebro del que tengo
          • No me malentiendan: Me gusta Skiena, su estilo de enseñanza y manierismos, pero no puedo ser material de Stony Brook.
      • Catálogo de algoritmos:
        • Es la verdadera razón para comprar el libro.
        • Actualizare esto, una vez haya pasado por este.
    • Se puede rentar en Kindle
    • Half.com es un gran recurso para libros de textos a buen precio.
    • Respuestas:
    • Errata
  • Introduction to Algorithms

    • 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
  • Programming Pearls

    • 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. .

Lea por favor para que no cometa mis errores:

Retaining Computer Science Knowledge

2. Use tarjetas para recordar

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.

Haga el suyo gratis:

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.

Mis tarjetas en ek formato de Anki: https://ankiweb.net/shared/info/25173560 (Gracias@xiewenya)

3. Revise, revise, revise

Mantuve una serie de hojas clave en ASCII, OSI stack, notación Big-O y más. Las estudie cuando tenía tiempo libre.

Tome un descanso de los problemas de programación por media hora y repase sus tarjetas.

4. Enfóquese

Hay muchas distracciones le pueden quitar tiempo valioso. Enfocarse y concentrarse es difícil.

Lo que no verá cubierto

Estas son tecnologías predominantes, pero no están cubiertas por este plan de estudios:

  • SQL
  • Javascript
  • HTML, CSS, y otras tecnologías front-end

El plan diario

Algunos temas tomarán un día y otros tomarán varios. Algunos son solo para aprender sin nada que implementar.

Cada día yo tomé un tema de los siguientes, vi videos sobre el tema y escribía una implementación:

  • C - usando estructuras y funciones que toman una estructura * y otra cosa como argumentos.
  • C++ - sin utilizar tipos incorporados
  • C++ - usando tipos incorporados, como std::list de STL para una lista enlazada
  • Python - usando tipos incorporados (para seguir practicando Python)
  • y escribir pruebas para asegurarme de que lo estoy haciendo bien, a veces simplemente usando simples declaraciones assert()
  • Puede hacer Java o algo más, esto es solo lo mío.

No necesita todo esto. Solo necesita un lenguaje para la entrevista.

¿Por qué codificar en todo esto?

  • 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.

Puede ver mi código aquí:

No es necesario recordar las entrañas de cada algoritmo.

Escriba código en un pizarrón o en papel no en la computadora. Pruebe con alguna entrada de prueba. Después pruébelos en la computadora.

Conocimientos Previos

Complejidad algorítmica / Big-O / Análisis asintótico

Estructuras de datos

  • Arreglos

    • Implemente un vector automáticamente redimensionable.
    • Descripción:
    • Implemente un vector (Arreglo mutable con redimensionamiento automático):
      • Practique codificar usando arreglos y apuntadores, y un apuntador matemático para saltar a un índice en lugar de utilizar la indexación.
      • Nueva arreglo de información primaria con memoria asignada
        • Puede asignar un arreglo entero, simplemente no use sus características
        • Empiece con 16, o si el número inicial es mayor, use potencias del 2 - 16, 32, 64, 128
      • size() Número de elementos
      • capacity() Número de elementos soportados
      • is_empty()
      • at(index) Regresa el elemento al índice dado, falla si el índice esta fuera de sus limites
      • push(item)
      • insert(index, item) Inserta el elemento en el índice, intercambia el valor del índice y desplaza los elementos a la derecha
      • prepend(item) Puede usar para insertar encima del índice 0
      • pop() Elimina del final, regresa el valor
      • delete(index) Elimina el elemento en el índice, intercambia todos desplazándolos a la izquierda
      • remove(item) Busca el valor y elimina el índice lo contiene(aunque este en varios lugares)
      • find(item) Busca el valor y regresa el primer índice con ese valor, -1 si no encuentra
      • resize(Nueva capacidad) // Función privada
        • Cuando alcance el límite, redimensiona al doble el tamaño
        • Cuando se haga “pop” a un elemento, si el tamaño es 1/4 de la capacidad, redimensiona a la mitad
    • Tiempo
      • O(1) Para añadir/eliminar al final (Amortizado para asignaciones por más espacio), índice o actualización
      • O(n) Para insertar/eliminar donde sea
    • Espacio
      • Contiguo en la memoria, por lo que la proximidad ayuda al rendimiento
      • Espacio necesario = (capacidad de matriz, que es> = n) * tamaño del elemento, pero incluso si 2n, todavía O (n))
  • Listas Enlazadas

    • Descripción:
    • C Code (video) - No todo el video, solo porciones acerca de la estructura de nodos y la asignación de memoria.
    • Listas enlazadas vs Arreglos:
    • why you should avoid linked lists (video)
    • 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.
    • Implemente (Lo hice con y sin un puntero de cola):
      • size() Regresa el número de elementos en la lista
      • empty() Un bool que regresa verdadero si está vacío
      • value_at(index) Regresa el valor del el n-avo elemento (iniciando con el 0 como primero)
      • push_front(value) Añade un elemento al frente de la lista
      • pop_front() Elimina el elemento frontal y regresa su valor
      • push_back(value) Añade un elemento al final
      • pop_back() Elimina el último elemento y devuelve su valor
      • front() Obtiene el valor del elemento frontal
      • back() Obtiene el valor del último elemento
      • insert(index, value) Inserta valor en el índice, por lo que el valor actual en ese índice es apuntado al nuevo elemento en el índice
      • erase(index) Borra el nodo del índice dado
      • value_n_from_end(n) Regresa el valor del nodo en la n-ava posición a partir del final de la lista
      • reverse() Pone al revés toda la lista
      • remove_value(value) Borra el primer elemento en la lista con ese valor
    • Doble lista enlazada
  • Pila

  • Cola o fila

    • Using Queues First-In First-Out(video)
    • Queue (video)
    • Circular buffer/FIFO
    • Priority Queues (video)
    • 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 [probando])
      • dequeue: O(1) (Lista enlazada y arreglo)
      • empty: O(1) (Lista enlazada y arreglo)
  • Hash table

Información adicional

Trees

Sorting

As a summary, here is a visual representation of 15 sorting algorithms. If you need more detail on this subject, see "Sorting" section in Additional Detail on Some Subjects

Grafos

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 trees y sorting.

Obtendrá más practica de grafos en el libro de Skiena (vea Sección de libros debajo) y en los libros de entrevistas

Más información adicional

Diseño del Sistema, Escalabilidad, Manejo de Datos


Final Review

This section will have shorter videos that you can watch pretty quickly to review most of the important concepts.
It's nice if you want a refresher often.

Practica de preguntas de codificación

Now that you know all the computer science topics above, it's time to practice answering coding problems.

Coding question practice is not about memorizing answers to programming problems.

Why you need to practice doing programming problems:

  • problem recognition, and where the right data structures and algorithms fit in
  • gathering requirements for the problem
  • talking your way through the problem like you will in the interview
  • coding on a whiteboard or paper, not a computer
  • coming up with time and space complexity for your solutions
  • testing your solutions

There is a great intro for methodical, communicative problem solving in an interview. You'll get this from the programming interview books, too, but I found this outstanding: Algorithm design canvas

No whiteboard at home? That makes sense. I'm a weirdo and have a big whiteboard. Instead of a whiteboard, pick up a large drawing pad from an art store. You can sit on the couch and practice. This is my "sofa whiteboard". I added the pen in the photo for scale. If you use a pen, you'll wish you could erase. Gets messy quick.

my sofa whiteboard

Supplemental:

Read and Do Programming Problems (in this order):

See Book List above

Ejercicios de codificación/Desafíos

Once you've learned your brains out, put those brains to work. Take coding challenges every day, as many as you can.

Coding Interview Question Videos:

Challenge sites:

Challenge repos:

Mock Interviews:

Una vez cerca de la entrevista

Su CV

  • See Resume prep items in Cracking The Coding Interview and back of Programming Interviews Exposed

Pensando en cuando llegue la entrevista

Think of about 20 interview questions you'll get, along with the lines of the items below. Have 2-3 answers for each. Have a story, not just data, about something you accomplished.

  • Why do you want this job?
  • What's a tough problem you've solved?
  • Biggest challenges faced?
  • Best/worst designs seen?
  • Ideas for improving an existing product.
  • How do you work best, as an individual and as part of a team?
  • Which of your skills or experiences would be assets in the role and why?
  • What did you most enjoy at [job x / project y]?
  • What was the biggest challenge you faced at [job x / project y]?
  • What was the hardest bug you faced at [job x / project y]?
  • What did you learn at [job x / project y]?
  • What would you have done better at [job x / project y]?

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.

*****************************************************************************************************
*****************************************************************************************************

Libros adicionales

Aprendizaje adicional

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.

--

Detalles adicionales de ciertos temas

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?

Series de videos

Sit back and enjoy. "Netflix and skill" :P

Cursos de Informática