README-tr.md 141 KB

Kodlama Mülakatı Üniversitesi

Aslında bunu yazılım mühendisi olabilmek için kısa bir yapılacaklar listesi olarak hazırladım, ama bugün gördüğünüz büyük listeye dönüştü. Bu çalışma planını tamamladıktan sonra, Amazon tarafından Yazılım Geliştirme Mühendisi olarak işe alındım.! Muhtemelen yaptığım kadar çok çalışmanıza gerek kalmayacaktır. Her neyse, ihtiyaç duyabileceğiniz her şey burada.

Her hangi bir yazılım firmasında bir mülakata gireceğinizde ihtiyaç duyabileceğiniz her konu başlığı burada listelenmiştir, Amazon, Facebook, Google ya da Microsoft dahil.

İyi Şanslar!

Çeviriler:

Çevirisi Devam Edenler:

Nedir?

Bir web geliştiricisinden (CS derecesi olmadan, alaylı), büyük bir firmada yazılım mühendisi olmak için çok aylı bir çalışma planıdır.

Coding at the whiteboard - from HBO's Silicon Valley

Bu liste, yeni yazılım mühendisleri için veya web ya da yazılım geliştiriciliği alanlarından yazılım mühendisliğine (bilgisayar bilimleri bilgisi gerekli) geçiş için hazırlanmıştır. Eğer uzun yıllardır tecreübeniz varsa ve yazılım mühendisliği tecrübesi istiyorsanız, daha zor bir röportaj bekleyin. Eğer uzun yıllardır yazılım/web geliştirme deneyiminiz varsa, Google, Amazon, Facebook ve Microsoft gibi büyük yazılım firmalarının yazılım mühendisliğini yazılım/web geliştirmekten farklı gördüğüne, ve bilgisayar bilimleri bilgisi istediğine dikkat edin.

Eğer güvenlik ya da operasyon mühendisi olmak istiyorsanız, opsiyonel listeden (network, güvenlik) daha fazla çalışın.


İçindekiler

---------------- Bu bölümün altındakiler opsiyoneldir ----------------


Neden Kullanılır?

Bu projeye başladığımda, Stack ya da heap farkını bilmiyordum, Big-O notasyonu hakkında bir şey bilmiyordum, ağaçlar hakkında bir şey bilmiyordum, ya da bir graf nasıl dolaşılır bilmiyordum. Bir sıralama algoritması kodlamış olsaydım, iyi olmayacağını size söyleyebilirdim. Kullandığım her veri yapısı dilin içinde hazır bulunmaktaydı, kaputun altında nasıl çalıştıklarını bilmiyordum. Çalışmakta olduğum bir proses, "bellek yetersiz" uyarısı verene kadar herhangi bir bellek yönetimi yapmamıştım ve buna bir geçici çözüm buldum. Hayatımda bir kaç sefer çok boyutlu dizileri kullandım ve binlerce birleştirici dizileri kullandım, ama hiç bir zaman sıfırdan bir veri yapısı oluşturmadım.

Bu uzun bir plan. Aylar sürebilir. Eğer bunlara aşinaysanız, daha az zamanınızı alacaktır.

Nasıl Kullanılır

Aşağıdaki her şey bir ana hattır, ve yukarıdan aşağıya doğru öğeleri ele almalısınız.

İlerlemeleri kontrol etmek için listelerde dahil olmak üzere, ben GitHub'ın özel markdown aracını kullanıyorum.

Bu şekilde öğeleri seçmek için yeni bir dal oluşturun, braketler arasına sadece bir x koyun: [x]

Bir dalı çatallayın ve aşağıdaki komutları takip edin

git checkout -b progress

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

git fetch --all

Değişikliklerinizi tamamladıktan sonra bütün kutuları X ile işaretleyin

git add .

git commit -m "Marked x"

git rebase jwasham/master

git push --force

GitHub aromalı markdown hakkında daha fazlası

Yeterince zeki olmadığınızı hissetmeyin

Video Kaynakları Hakkında

Bazı videolar Coursera, EdX ya da Lynda.com sınıflarına dahil olduğunuzda ulaşılabilmektedir. Bunlar MOOC'lar olarak adlandırılır. Bazı kurslar aktif olmayabilirler, bir kaç ay beklemeniz gerekebilir, erişiminiz olmaz. Lynda.com kursları ücretsiz değildir.

Ücretsiz ve her zaman ulaşılabilir kaynaklar eklerseniz memnun olurum, YouTube videoları gibi çevrimiçi kurs videolarına eşlik edebilirsiniz.
Üniversite derslerini kullanmayı severim.

Mülakat Süreci & Genel Mülakat Hazırlığı

Mülakat İçin Bir Dil Seçin

Mülakatın kodlama bölümü için rahat hissettiğiniz bir dili kullanabilirsiniz, ancak büyük şirketler için, aşağıdakiler sağlam seçeneklerdir:

  • C++
  • Java
  • Python

Ayrıca bunları da kullanabilirsin, ancak önce okuyun. Bazı uyarılar olabilir:

  • JavaScript
  • Ruby

Bir dilde çok rahat ve bilgili olmanız gerekmektedir.

Seçenekler hakkında daha fazlasını okuyun:

Dil kaynaklarına buradan göz atın

Aşağıda C, C++ ve Python öğreniminin dahil olduğunu göreceksiniz, çünkü ben öğreniyorum. Alta bakarsanız bir kaç kitap dahil edilmiştir.

Kitap Listesi

Kendi kullandığım kısa bir liste. Zamandan tasarruf etmenizi sağlayacaktır.

Mülakat Hazırlığı

Eğer tonlarca ekstra vaktiniz varsa:

Bilgisayar Mimarisi

Zamanınız kısaysa:

  • Write Great Code: Volume 1: Understanding the Machine
    • Kitap 2004 yılında yayınlanmış, ve bazı şeyler geçerliliğini kaybetmiş, ama bilgisayarı anlamak için muhteşem bir kaynaktır.
    • Yazar HLA'yı icat etmiş, bu nedenle HLA ile bahsedilen örneklere biraz kuşkuyla yaklaşın. Yaygın olarak kullanılmaz, ancak assembly'nin nasıl göründüğüne dair iyi içerikler barındırır.
    • Bu bölümlerin okunması size güzel bir temel verecektir:
      • 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

Eğer daha fazla vaktiniz varsa (Bu kitabı istiyorum):

Spesifik Dil

Mülakat için bir dil seçmeniz gerekir (alta bakın). Dile göre önerilerim burada. Her dil için bir kaynağım yok. İlaveler hoş olur.

Eğer bunlardan birini okursan, kodlama problemlerini yapmaya başlamanız için gereken tüm veri yapılarına ve algoritma bilgisine sahip olmanız gerekir. Bu projedeki bütün video derslerini atlayabilirsiniz, inceleme yapmak istemiyorsanız.

Spesifik dillere özgü ek kaynaklar burada.

C++

Henüz bu ikisini okumadım, ancak Sedgewick tararından yüksek derecelendirilmiş ve yazılmıştır. O mükemmel biri.

C++ için daha iyi bir tavsiyeniz varsa, beni bilgilendirin. Kapsamlı bir kaynak arıyorum.

Java

YA DA:

  • Data Structures and Algorithms in Java
    • Goodrich, Tamassia, Goldwasser tarafından
    • UC Berkeley'de bilgisayar bilimleri tanıtımı için isteğe bağlı metin olarak kullanılır
    • aşağıda Python versiyonuyla ilgili kitap raporuma bak. Bu kitap aynı konuları kapsıyor.

Python

Opsiyonel Kitaplar

Bazı insanlar bunları önerdi, ancak biraz fazla, uzun yıllar yazılım mühendisliği tecrübeniz yoksa ve daha zorlu bir mülakat bekliyorsanız:

  • [ ] Algorithm Design Manual (Skiena)

    • Bir gözden geçirme ve problem tanıma
    • Algoritma kataloğu kısmı, bir röportajda bulacağınız zorlukların çok ötesinde bir şey.
    • Bu kitap 2 bölüme sahip:
      • veri yapıları ve algoritmaları üzerine birinci sınıf ders kitabı
        • artılar:
          • herhangi bir algoritma kitabı kadar iyi bir inceleme
          • endüstri ve akademik alanlardaki sorunları çözme deneyimlerinden güzel hikayeler
          • C dilinde kod örnekleri
        • eksiler:
          • CLRS kadar yoğun ya da geçilemez olabilir, ve bazı durumlarda, CLRS bazı konularda daha iyi bir alternatif olabilir
          • bölüm 7, 8, 9'u takip etmek acı verici olabilir, çünkü bazı şeyler iyi açıklanmamış ya da benim sahip olduğumdan daha fazla beyin gerektiriyor olabilir
          • beni yanlış anlamayın: Skiena'yı, öğretme stilini ve davranış biçimlerini severim, ancak Stony Brook materyali olmayabilirim.
      • algoritma kataloğu:
        • bu kitabı satın almak için gerçek neden budur.
        • bu kısma geçmek üzereyim. Burası daha sonra güncellenecek.
    • Kindle üzerinden kiralanabilir
    • Cevaplar:
    • Errata
  • [ ] Introduction to Algorithms

    • Önemli: Bu kitabı okumak sadece sınırlı bir değere sahip. Bu kitap, algoritmalar ve veri yapılarının mükemmel bir incelemesidir, ancak size nasıl iyi kod yazılacağını öğretmez. İyi bir çözümü verimli bir şekilde kodlayabilmelisiniz.
    • aka CLR, bazen CLRS, çünkü Stein oyuna geç katılmıştı
  • [ ] Programming Pearls

    • İlk birkaç bölüm programlama sorunlarına akıllıca çözümler sunar (bazı çok eski veri tiplerini kullanır) ama bu sadece bir tanıtım. Code Complete'e benzeyen, ancak daha kısa, program tasarım ve mimarisi üzerine bir rehberdir.
  • "Algorithms and Programming: Problems and Solutions" by Shen

    • Hoş bir kitap, ancak birkaç sayfada sorunlarla uğraştıktan sonra Pascal ile hayal kırıklığına uğradım, do while döngüleri, 1 indexli diziler, ve belirsiz durum sonrası memnuniyet sonuçlarını içerir.
    • Başka bir kitaptan veya çevrimiçi kodlama problemleriyle vaktimi harcamayı tercih ederim.

Başlamadan Önce

Bu liste birkaç ayda büyüdü, ve evet, biraz elden çıktı.

Yaptığım hatalar şunlardır; böylece daha iyi bir tecrübeye sahip olacaksınız.

1. Hepsini Hatırlamayacaksın

Saatlerce videolar izledim ve bol bol notlar aldım ancak aylar sonra hatırlamadığım çok şey olduu. 3 günümü notlar karıştırarak ve flashcardlar yaparak inceleyebildim.

Lütfen okuyun, benim hatalarımı yapmayın:

Retaining Computer Science Knowledge

2. Flashcard Kullanın

Problemi çözmek için, genel ve kod olmak üzere 2 tür flashcard ekleyebildiğim küçük bir flashcard sitesi hazırladım. Her kart farklı bir formata sahip.

Nerede olursam olayım, telefonumdan ve tabletimden inceleyebilmek için bir mobil web sitesi hazırladım.

Kendinizinkini ücretsiz olarak yapın:

Kartlarla ilgili biraz aşırıya kaçtım, benim kartlarım Assembly dilinden Python'a, makine öğrenmesinden istatistiğe kadar bir çok şeyi kapsar. Gerekli olandan çok daha fazlasına sahip.

Flashcardlarla ilgili not: İlk defa cevabı bildiğinizi fark ederseniz, bildiğiniz gibi işaretlemeyin. Aynı kartı görmeniz ve gerçekten bilmeden önce birkaç kez doğru cevaplamanız gerekir. Tekrarlama bu bilgiyi beyninizde derinleştirecektir.

Kullandığım flashcard siteme bir alternatif Anki, bana defalarca tavsiye edildi. Unutulmaması için bir tekrarlama sistemi kullanır. Kullanıcı dostu, tüm platformlarda kullanılabilir ve bir bulut senkronizasyon sistemi vardır. iOS'da 25$, diğer platformlarda ücretsiz.

Benim flashcard veritabanımın Anki formatı: https://ankiweb.net/shared/info/25173560 (teşekkürler, @xiewenya)

3. İnceleme, inceleme, inceleme

ASCII, OSI stack, Big-O notasyonu, ve daha fazlası üzerinde bir dizi kopya kağıdı tutarım. Boş zamanlarım olduğunda bunlara çalışırım.

Yarım saat için programlama problemlerine ara verin ve flashcard'larınıza geçin.

4. Odaklanma

Değerli zamanınızı alabilecek bir çok dikkat dağıtıcı şey vardır. Odaklanma ve konsantrasyon zordur.

Neyi görmeyeceksiniz

Bunlar yaygın teknolojilerdir ancak bu çalışma planının bir parçası değildir:

  • SQL
  • Javascript
  • HTML, CSS, ve diğer front-end teknolojileri

Günlük Plan

Bazı konular bir gün alır, ve bazıları birkaç gün sürer. Bazıları sadece öğrenilir, kullanılmaz.

Her gün aşağıdaki listeden bir konu alıyorum, bu konuyla ilgili videolar izliyorum, ve implemente ediyorum:

  • C - using structs and functions that take a struct * and something else as args.
  • C++ - yerleşik türleri kullanmadan
  • C++ - yerleşik türleri kullanarak, bağlı liste için STL'in std::list gibi
  • Python - yerleşik türleri kullanarak (Python'la ilgili pratiğe devam etmek için)
  • doğru yaptığımdan emin olmak için testler yazarım, bazen sadece assert() deyimleri kullanırım
  • Java ya da başka bir şey yapabilirsin, bu sadece benim yaptıklarım.

Bunların hepsine ihtiyacın yok. Sadece mülakat için bir dil ihtiyacın var.

Neden bunların hepsinde kod var?

  • Ben bıkana kadar, pratik, pratik, pratik, ve sorunsuzca yapılabilir(bazılarının bir çok köşe durumu var ve hatırlanması için defter tutma ayrıntıları var)
  • Ham kısıtlamalar ile çalışın (Çöp toplayıcı yardımı olmadan belleği ayırma / boşaltma (Python hariç))
  • Yerleşik türlerden faydalanarak, yerleşik araçları gerçek dünya kullanımında tecrübe edindim. (kendi bağlı liste uygulamamı üründe kullanmayacağım.)

Her konu için bunları yapmaya vaktim olmayabilir, ama deneyeceğim.

Kodumu buradan görebilirsiniz:

Her algoritmanın cesaretlerini ezberlemenize gerek yok.

Kodları beyaz tahtaya ya da kağıda yazın, bilgisayara değil.. Örnek girdileri test edin. Sonra bilgisayar dışında test edin.

Önkoşul Bilgisi

Algoritma karmaşıklığı / Big-O / Asimptotik analiz

Veri Yapıları

Daha Fazla Bilgi

Ağaçlar

Sıralama

Özetlemek gerekirse, burada 15 sıralama algoritmasının görsel temsili var. Bu konuda daha fazla bilgiye ihtiyacınız varsa, "Sıralama" bölümüne bakın Bazı Konularda Ek Bilgiler

Graflar

Graflar, bilgisayar bilimlerinde birçok sorunu temsil etmek için kullanılabilir, bu nedenle bu bölüm ağaçlar ve sıralama algoritmaları gibi uzundur.

Skienna'nın kitabında (aşağıdaki Kitaplar bölümüne bakın) ve mülakat kitaplarında daha fazla graf pratiği bulabilirsiniz.

Daha Fazla Bilgi

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