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

142 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! (Art. En Inglés) 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 ésto 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 gusta usa lecturas de universidad.

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.

What you won't see covered

These are prevalent technologies but not part of this study plan:

  • SQL
  • Javascript
  • HTML, CSS, and other front-end technologies

The Daily Plan

Some subjects take one day, and some will take multiple days. Some are just learning with nothing to implement.

Each day I take one subject from the list below, watch videos about that subject, and write an implementation in:

  • C - using structs and functions that take a struct * and something else as args.
  • C++ - without using built-in types
  • C++ - using built-in types, like STL's std::list for a linked list
  • Python - using built-in types (to keep practicing Python)
  • and write tests to ensure I'm doing it right, sometimes just using simple assert() statements
  • You may do Java or something else, this is just my thing.

You don't need all these. You need only one language for the interview.

Why code in all of these?

  • Practice, practice, practice, until I'm sick of it, and can do it with no problem (some have many edge cases and bookkeeping details to remember)
  • Work within the raw constraints (allocating/freeing memory without help of garbage collection (except Python))
  • Make use of built-in types so I have experience using the built-in tools for real-world use (not going to write my own linked list implementation in production)

I may not have time to do all of these for every subject, but I'll try.

You can see my code here:

You don't need to memorize the guts of every algorithm.

Write code on a whiteboard or paper, not a computer. Test with some sample inputs. Then test it out on a computer.

Prerequisite Knowledge

Algorithmic complexity / Big-O / Asymptotic analysis

Data Structures

More Knowledge

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

Graphs

Graphs can be used to represent many problems in computer science, so this section is long, like trees and sorting were.

You'll get more graph practice in Skiena's book (see Books section below) and the interview books

Even More Knowledge

System Design, Scalability, Data Handling


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.

Coding Question Practice

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

Coding exercises/challenges

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:

Once you're closer to the interview

Your Resume

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

Be thinking of for when the interview comes

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]?

Have questions for the interviewer

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?

Once You've Got The Job

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.

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

Additional Books

Additional Learning

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.

--

Additional Detail on Some Subjects

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?

Video Series

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

Computer Science Courses