Skip to content

Latest commit

 

History

History
1996 lines (1670 loc) · 143 KB

File metadata and controls

1996 lines (1670 loc) · 143 KB

Coding Interview University

File Originale (in Inglese) - Original File Here

Traduzione in Italiano a Cura di @volpoh

Inizialmente ho creato questo progetto come una sorta di "to-do list" degli argomenti da studiare per diventare un software engineer, ma è cresciuta fino a diventare ciò che potete vedere oggi. Dopo aver seguito questo percorso di studio, Sono stato preso come Software Development Engineer ad Amazon! Probabilmente non hai bisogno di studiare tanto quanto ho studiato io. Comunque, tutto ciò di cui hai bisogno è qua.

Ho studiato dalle 8 alle 12 ore al giorno, per diversi mesi. Questa è la mia storia: Perché ho studiato full-time per 8 mesi per un colloquio Google (Articolo in Inglese)

Nota Bene: Non avrai bisogno di studiare tanto quanto ho studiato io. Ho sprecato un sacco di tempo su argomenti evitabili. Più informazioni riguardo questo qua sotto. Ti aiuterò ad arrivare ai tuoi obiettivi senza sprecare il tuo prezioso tempo.

La lista proposta qua sotto ti preparerà egregiamente per un colloquio tecnico e per qualsiasi azienda di informatica, anche per le quelle Big come Amazon, Facebook, Google e Microsoft.

Buona fortuna!

Traduzioni:
Traduzioni in corso:

Che cos'e'?

Programmare sulla lavagna - da HBO's Silicon Valley

Questo è il mio piano di studio distribuito su più mesi per diventare un software engineer per una grande azienda.

Requisiti:

  • Una minima esperienza con la programmazione (variabili, cicli, metodi/funzioni, etc)
  • Pazienza
  • Tempo

Ricorda che questo è un piano di studio per software engineering, non per web development. Grandi aziende come Google, Amazon, Facebook e Microsoft considerano il software engineering molto diverso dal web development. Per esempio, Amazon ha dei Frontend Engineers (FEE) e dei Software Development Engineers (SDE). Questi sono due ruoli separati e i colloqui per queste posizioni non saranno gli stessi, dato che ogni reparto ha le sue peculiarità. Queste aziende esigono conoscenza in ambito software development/ruoli dell'engineering.


Tabella dei Contenuti

Il Piano di Studio

Argomenti di Studio

Ottenere il Lavoro

---------------- Qua Sotto Sono Riportato Argomenti Facoltativi ----------------

Argomenti Extra Opzionali & Risorse


Perche' usarlo?

Se vuoi trovare lavoro come software engineer per una grande azienda, questi sono i concetti che devi sapere.

Se hai perso l'occasione di prendere una laurea in informatica, come io ho fatto, tutto questo ti aiuterà a recuperare 5 anni della tua vita.

Quando ho iniziato questo progetto, non sapevo nulla, dallo stack fino all'heap, non conoscevo O-Grande o nulla riguardo gli alberi e i grafi. Se avessi dovuto scrivere un algoritmo di ordinamento da zero, ti assicuro che sarebbe stato terribile. Ogni struttura dati che avevo usato era già integrata nel linguaggio e non sapevo assolutamente come fossero implementate. Non ho mai dovuto gestire la memoria tralasciando i momenti in cui un programma returnava un errore del tipo "Out of Memory", che avrei poi risolto, cercando una soluzione. Nella mia vita ho usato alcuni array multidimensionali e migliaia di array associativi, ma non ho mai creato strutture dati da zero.

Il piano è lungo. Potrebbe richiedere mesi, ma se si ha un po' di familiarità con queste cose già partirete avvantaggiati.

Come usarlo

Tutto ciò che segue rappresenta la cornice degli attuali argomenti, che si dovrebbero affrontare dall'alto verso il basso.

Sto usando le funzionalità del Markdown di Github, comprese le task-liste per monitorare i propri progressi.

Se non vuoi usare git

Su questa pagina, clicca il bottone in alto con scritto "Code", e clicca "Download ZIP". Unzippa il file e potrai lavorare con il file testuale.

Se lo aprirai con un editor di testo che sa interpretare il linguaggio markdown (.md), allora leggerai il testo formattato.

Come scaricare la repository come un file .zip

Se invece ti trovi a tuo agio con git

Crea un nuovo branch affinché tu possa tenere aggiornata la task list, semplicemente mettendo una 'x' nelle parentesi quadrate, così: [x]

Forka un branch e segui le istruzioni qua sotto

Forka la repository https://github.com/jwasham/coding-interview-university cliccando sul pulsante Fork.

Clona nella tua repository locale:

git clone [email protected]:<your_github_username>/coding-interview-university.git
git checkout -b progress
git remote add jwasham https://github.com/jwasham/coding-interview-university
git fetch --all

Contrassegna con una X le task che hai completato:

git add .
git commit -m "Marked x"
git rebase jwasham/main
git push --set-upstream origin progress
git push --force

Non Pensare di non Essere Abbastanza Intelligente

Un Appunto Riguardo le Risorse Video

lcuni video sono disponibili solo iscrivendosi a un corso Coursera o Edx. Questi vengono chiamati MOOCs. A volte le lezioni non saranno disponibili immediatamente, quindi dovrai aspettare un paio di mesi senza averne accesso.

Sarebbe bello sostituire le risorse dei corsi online con fonti pubbliche gratuite e sempre disponibili, come i video di Youtube (preferibilmente lezioni universitarie), in modo che le persone possono studiare in qualsiasi momento e non solo quando un determinato corso online è disponibile.

Scegli un Linguaggio di Programmazione

Avrete bisogno di scegliere un linguaggio di programmazione per i colloqui che farete, ma sarà necessario trovare anche un linguaggio da utilizzare per studiare i concetti di informatica.

Sarebbe perfetto se il linguaggio fosse lo stesso per entrambi gli scopi così da poter essere costante solo su un linguaggio.

Per Questo Piano di Studio

Quando ho fatto questo piano di studio, ho usato principalmente due linguaggi: C e Python

  • C: Bassissimo Livello. Permette di gestire puntatori e allocazione/deallocazione della memoria, cosicché si possano toccare gli algoritmi e le strutture dati con le proprie mani. In linguaggi di alto livello, come Python o Java, tutto questo viene mascherato dal linguaggio stesso. Nel lavoro di tutti i giorni, un linguaggio di basso livello è terrificante, ma quando si stanno imparando le basi è utilissimo sentirsi vicini al cuore di tutto ciò.
    • C è ovunque. Vedrai esempi nei libri, nelle lezioni, nei video, OVUNQUE durante il tuo corso di apprendimento.
    • Il Linguaggio di Programmazione C, Vol. 2 (Libro in Inglese)
      • Questo è un libro abbastanza corto, ma ti darà una grande mano riguardo il linguaggio C e, se ti allenerai un po', diventerai velocemente un esperto. Capire C aiuta a comprendere il funzionamento dei programmi e della memoria.
      • Non c'è bisogno di studiare in profondita il libro (o comunque finirlo). Basterà arrivare al punto dove sarai a tuo agio nel leggere e nello scrivere in C.
      • Risposte alle Domande del Libro
  • Python: Moderno e molto espressivo, l'ho imparato perché è semplicemente utilissimo e ti permette di scrivere codici brevi, ma potenti.

Questa è una mia preferenza, ovviamente te sei libero di scegliere.

Forse non ne avrai bisogno, ma ecco una lista di siti utili per imparare a programmare online:

Per il tuo colloquio

Puoi usare un qualsiasi linguaggio di programmazione per la parte tecnica del colloquio, ma le grandi aziende richiedono certi linguaggi, quali:

  • C++
  • Java
  • Python

Potresti usare anche questi, ma valuta bene. Ci potrebbero essere delle contro-avvertenze:

  • JavaScript
  • Ruby

Questo è un articolo che ho scritto riguardo la scelta del linguaggio: Scegli il Linguaggio per il tuo Colloquio Tecnico (Articolo in Inglese). Questo è l'articolo originale su cui si basa il post: Scegliere un Linguaggio di Programmazione per il Proprio Colloquio (Articolo in Inglese)

Devi essere tranquillo nel linguaggio che scegli, oltre che il più competente possiile.

Informati di più riguardo la scelta:

Risorse Specifiche per i Linguaggi (Pagina in Inglese)

Libri per Studiare Strutture di Dati e Algoritmi

Il libro che sceglierai creerà le fondamenta delle tue conoscenze nell'ambito informatico.

Scegline uno solo. Cerca di sentirti a tuo agio nel linguaggio che sceglierai, dovrai leggere e scrivere molto codice.

C

Python

Java

A tua scelta:

C++

A tua scelta:

Libri per la Preparazione in Vista dei Colloqui

Non è necessario comprare molti libri. Onestamente, "Spaccare il Colloquio Pratico di Coding (Libro in Inglese)" è sufficiente, però io ne ho comprati altri per fare più pratica, ma faccio sempre troppo.

Io li ho comprati entrambi e mi hanno permesso di impratichirmi molto:

Se hai un Sacco di Tempo Libero:

Scegline uno:

Non Commettere i Miei Stessi Errori

Questa lista è cresciuta esponenzialmente negli ultimi mesi, e sì, la situazione è sfuggita di mano.

Questi sono alcuni dei miei errori, così che tu possa evitarli, risparmiando mesi di tempo.

1. Non ti Ricorderai Tutto

Ho guardato ore e ore di video, preso tanti appunti, ma mesi dopo ricordavo davvero poco. Ho speso 3 giorni a leggere i miei appunti e a farmi flash-cards affinchè le potessi revisionare. Non mi serviva tutta quella conoscenza.

Perfavore leggilo, così da non fare il mio stesso errore:

Mantenere la Conoscenza in Ambito Informatico (Articolo in Inglese).

2. Usa delle Flash-Cards

Per risolvere questo problema, ho creato un piccolo sito web di flashcards dove è possibile trovare 2 tipologie di carte: generali e codice. Ognuna ha una formattazione diversa. Il sito è ottimizzato per telefono e tablet, affinché potessi revisionare da lì.

Crea le tue flash-cards gratuitamente:

SCONSIGLIO VIVAMENTE di Usare le mie Flash-Cards Sono troppe e alcune eccessivamente complesse.

Ma se non vuoi darmi ascolto, eccole qua:

Tieni a mente che ho creato carte per qualsiasi argomento, dall'assembly alle curiosità su python, fino al machine learning e alla statistica. Tutto ciò è molto più di quanto è veramente necessario.

Riguardo le Flash-Cards: La prima volta che comprendi la domanda e rispondi correttamente, non mettere via la card. Devi rispondere più volte alla stessa carta prima di considerarla appresa. La ripetizione farà penetrare la vostra conoscenza nei meandri del nostro cervello.

Un alternativa al mio sito di è Anki, sito che è stato consigliatomi parecchie volte. Usa un sistema di ripetizione che aiuta a memorizzare meglio. Facile da usare, disponibile su qualsiasi piattaforma e auto-sincronizzato con altri tuoi dispositivi, ha un costa di $25 su iOS, ma è disponibile su altre piattaforme.

Il mio DataBase di Flash-Cards in Anki: https://ankiweb.net/shared/info/25173560 (grazie a @xiewenya).

Alcuni studenti mi hanno fatto notare problemi di formattazione con degli spazi vuoti, facilmente risolvibili così: apri un mazzo, modifica il mazzo, clicca sulle carte, seleziona "styling" e aggiungi "white-space: pre;" alla classe "Card".

3. Esercitati con delle Domande da Colloquio Durante lo Studio

QUESTO È MOLTO IMPORTANTE.

Comincia ad esercitarti con delle possibile domande da colloquio durante lo studio delle strutture dati e degli algoritmi.

Dovrai applicare tutto ciò che stai imparando per risolvere i problemi, o ti dimenticherai tutto. Io ho fatto questo errore.

Appena hai imparato un argomento e pensi di saperlo padroneggiare bene (come ad esempio le linked lists):

  1. Apri uno dei libri di preparazione ai colloqui (o siti internet di problem-solving, listati poi sotto)
  2. Rispondi a 2 o 3 domane riguardo le linked lists.
  3. Studia il prossimo argomento.
  4. Dopo, torna indietro e rispondi ad altre 2 o 3 domande sulle linked list.
  5. Fai questo con ogni nuovo argomento che dovrai affrontare.

Continua ad esercitarti con i problemi durante la tua fase di studio, non dopo.

Non verrai assunto per la tua conoscenza, ma per come applicherai la tua conoscenza.

Ci sono molte risorse da consultare, riportate poi sotto.

4. Concentrazione

Ci sono un sacco di distrazioni che potrebbero toglierti tempo prezioso. Focalizzarsi e concentrarsi è difficile. Metti un po' di musica senza lyrics e ti saprai concentrare molto bene.

Cosa Non Sara' Trattato

Queste tecnologie sono fondamentali, ma non fanno parte di questo piano di studio:

  • SQL
  • Javascript (JS)
  • HTML, CSS e altre tecnologie front-end

Il Piano Giornaliero

Questo corso tratta moltissimi argomenti. Ognuno di questi ti terrà impegnato per qualche giorno, o addirittura per settimane. Dipende dal tuo programma.

Ogni giorno, guarda il prossimo argomento nella lista, guarda video a riguardo e implementa degli appunti di quelle strutture dati o algoritmi del linguaggio a tua scelta per il corso.

Puoi vedere i miei codici qua:

Non devi memorizzare ogni algoritmo. Devi essere capace di capirlo abbastanza da poterlo implementare tu stesso.

Domande per Esercitarsi in Vista del Colloquio

Perché questo paragrafo? Non sono ancora pronto ad un colloquio.

Allora torna in dietro e leggi questo.

Perché esercitarsi con dei proble-solving:

  • Ricognizione del problema e come le strutture dati ed algoritmi possono essere utilizzate
  • Raccolta dei requisiti per risolvere il problema
  • Mentre programmi, spiega il problema e la soluzione, proprio come succederebbe durante il colloquio
  • Programma su foglio di carta o su una lavagna, non al computer
  • Trova la complessità temporale e spaziale delle tue soluzioni (vedi O-Grande sotto)
  • Testa le tue soluzioni

C'è una bellissima introduzione per la metodica della comunicazione nei colloqui di problem-solving. Lo scoprirai anche nei libri di preparazione, ma ho trovato questo articolo fatto molto bene: Design degli Algoritmi (Articolo in Inglese)

Scrivi il codice su carta o su una lavagna, non su un computer. Provalo con qualche input di prova. Poi riscrivilo e testalo su un computer.

Se non hai una lavagnetta a casa, prendi un quadernone per fogli da disegno in una qualsiasi cartolibreria. Puoi metterti comodo sul divano e programmare. Questa è la mia "lavagnetta da divano". Ho aggiunto la penna nella foto per far capire le dimensioni. Se usi una penna, vorrai poter cancellare. Diventa subito un casino. Io uso una matita e una gomma.

La mia Lavagnetta da Divano

Risolvere questi problemi di coding non serve a memorizzare.

Problemi di Coding

Non dimenticarti dei libri per prepararti al colloquio.

Risolvere i Problemi:

Video sulle Domande per Colloqui Tecnici:

Siti per Mettersi alla Prova:

Cominciamo

Ok, abbiamo parlato abbastanza, cominciamo ad imparare!

Ma non dimenticare di esercitarti con i problemi, anche durante lo studio!

Complessita' degli Algoritmi / O-Grande / Stima Asintotica

Bene, direi che può bastare.

Quando leggerai la parte di "Spaccare il Colloquio Pratico di Coding", c'è un capitolo riguardo questo e alla fine c'è un quiz per testare la tua capacità nell'identificare la complessità del runtime di diversi algoritmi.

Strutture Dati

Piu' Teoria

Alberi (Trees)

Sorting (Ordinamento)

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

Grafi (Graphs)

I grafi possono essere usati per rappresentare molti problemi in informatica, perciò questo paragrafo sarà lungo, come quello degli alberi e dell'ordinamento.

Ancora Piu' Teoria


Revisione Finale

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

Update Your Resume

Find a Job

Interview Process & General Interview Prep

Mock Interviews:

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 at least one answer 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]?

  • If you find it hard to come up with good answers of these types of interview questions, here are some ideas:

Have questions for the interviewer

Some of mine (I already may know the answers, 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?
  • How is the work/life balance?

Once You've Got The Job

Congratulations!

Keep learning.

You're never really done.


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

Everything below this point is optional. It is NOT needed for an entry-level interview.
However, 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

These are here so you can dive into a topic you find interesting.
  • The Unix Programming Environment
    • An oldie but a goodie
  • The Linux Command Line: A Complete Introduction
    • A modern option
  • TCP/IP Illustrated Series
  • Head First Design Patterns
    • A gentle introduction to design patterns
  • Design Patterns: Elements of Reusable Object-Oriente​d Software
    • AKA the "Gang Of Four" book, or GOF
    • The canonical design patterns book
  • Algorithm Design Manual (Skiena)
    • As a review and problem recognition
    • The algorithm catalog portion is well beyond the scope of difficulty you'll get in an interview
    • This book has 2 parts:
      • Class textbook on data structures and algorithms
        • Pros:
          • Is a good review as any algorithms textbook would be
          • Nice stories from his experiences solving problems in industry and academia
          • Code examples in C
        • Cons:
          • Can be as dense or impenetrable as CLRS, and in some cases, CLRS may be a better alternative for some subjects
          • Chapters 7, 8, 9 can be painful to try to follow, as some items are not explained well or require more brain than I have
          • Don't get me wrong: I like Skiena, his teaching style, and mannerisms, but I may not be Stony Brook material
      • Algorithm catalog:
        • This is the real reason you buy this book.
        • This book is better as an algorithm reference, and not something you read cover to cover.
    • Can rent it on Kindle
    • Answers:
    • Errata
  • Write Great Code: Volume 1: Understanding the Machine
    • The book was published in 2004, and is somewhat outdated, but it's a terrific resource for understanding a computer in brief
    • The author invented HLA, so take mentions and examples in HLA with a grain of salt. Not widely used, but decent examples of what assembly looks like
    • These chapters are worth the read to give you a nice foundation:
      • 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
  • Introduction to Algorithms
    • Important: Reading this book will only have limited value. This book is a great review of algorithms and data structures, but won't teach you how to write good code. You have to be able to code a decent solution efficiently
    • AKA CLR, sometimes CLRS, because Stein was late to the game
  • Computer Architecture, Sixth Edition: A Quantitative Approach
    • For a richer, more up-to-date (2017), but longer treatment

System Design, Scalability, Data Handling

You can expect system design questions if you have 4+ years of experience.

Additional Learning

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.

Computer Science Courses

Algorithms implementation

Papers

LICENSE

CC-BY-SA-4.0