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:
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.
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.
---------------- Bu bölümün altındakiler opsiyoneldir ----------------
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.
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ı
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.
[ ] Büyük 4'lü de bir iş nasıl alınır:
[ ] Hazırlık Kursu:
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:
Ayrıca bunları da kullanabilirsin, ancak önce okuyun. Bazı uyarılar olabilir:
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.
Kendi kullandığım kısa bir liste. Zamandan tasarruf etmenizi sağlayacaktır.
Eğer tonlarca ekstra vaktiniz varsa:
Zamanınız kısaysa:
Eğer daha fazla vaktiniz varsa (Bu kitabı istiyorum):
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.
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.
YA DA:
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)
[ ] Introduction to Algorithms
"Algorithms and Programming: Problems and Solutions" by Shen
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.
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
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)
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.
Değerli zamanınızı alabilecek bir çok dikkat dağıtıcı şey vardır. Odaklanma ve konsantrasyon zordur.
Bunlar yaygın teknolojilerdir ancak bu çalışma planının bir parçası değildir:
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:
Bunların hepsine ihtiyacın yok. Sadece mülakat için bir dil ihtiyacın var.
Neden bunların hepsinde kod var?
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.
[ ] C Öğren
[ ] Bilgisayarlar programları nasıl işlerler:
[ ] Cheat sheet
Bazı dersler çok matematik içeriyorsa, aşağıya atlayıp ayrık matematik videolarını izleyerek arkaplan bilgisi edilebilirsiniz.
[ ] Videolar:
[ ] Online Kurslar:
[ ] Doğrusal sondalama (problama) kullanarak dizi ile uygulayın:
[ ] Notlar:
Heap sort için, yukarıdaki Heap veri yapısına bakın. Heap sort güzel, ama stabil değil.
[ ] UC Berkeley:
[ ] Merge sort kod:
[ ] Quick sort kod:
[ ] Uygulama:
[ ] Gerekli değil, fakat tavsiye ediyorum:
Ö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, 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.
Notlar:
[ ] Skiena Dersleri - güzel giriş:
[ ] Graflar (inceleme ve fazlası):
Full Coursera Kursu:
Bunları uygulayacağım:
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.
If you need more detail on this subject, see "String Matching" section in Additional Detail on Some Subjects
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.
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:
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.
Supplemental:
Read and Do Programming Problems (in this order):
See Book List above
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:
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.
Some of mine (I already may know answer to but want their opinion or team perspective):
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.
[ ] AVL trees
[ ] Splay trees
[ ] Red/black trees
[ ] 2-3 search trees
[ ] 2-3-4 Trees (aka 2-4 trees)
[ ] N-ary (K-ary, M-ary) trees
[ ] B-Trees
--
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?
[ ] Union-Find
[ ] More Dynamic Programming (videos)
[ ] Advanced Graph Processing (videos)
[ ] MIT Probability (mathy, and go slowly, which is good for mathy things) (videos):
[ ] String Matching
[ ] Sorting
Sit back and enjoy. "Netflix and skill" :P
[ ] List of individual Dynamic Programming problems (each is short)
[ ] Excellent - MIT Calculus Revisited: Single Variable Calculus
[ ] Computer Science 70, 001 - Spring 2015 - Discrete Mathematics and Probability Theory
[ ] CSE373 - Analysis of Algorithms (25 videos)
[ ] UC Berkeley 61B (Spring 2014): Data Structures (25 videos)
[ ] UC Berkeley 61B (Fall 2006): Data Structures (39 videos)
[ ] UC Berkeley CS 152: Computer Architecture and Engineering (20 videos)
[ ] Carnegie Mellon - Computer Architecture Lectures (39 videos)
[ ] MIT 6.034 Artificial Intelligence, Fall 2010 (30 videos)
[ ] MIT 6.042J: Mathematics for Computer Science, Fall 2010 (25 videos)
[ ] MIT 6.046: Design and Analysis of Algorithms (34 videos)
[ ] MIT 6.050J: Information and Entropy, Spring 2008 (19 videos)
[ ] Mining Massive Datasets - Stanford University (94 videos)