|
3 年之前 | |
---|---|---|
.github | 3 年之前 | |
extras | 4 年之前 | |
translations | 3 年之前 | |
.gitignore | 5 年之前 | |
LICENSE.txt | 8 年之前 | |
README-tr.md | 3 年之前 | |
programming-language-resources.md | 4 年之前 |
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.
Birkaç ay boyunca günde 8 - 12 saat çalıştım. İşte benim hikayem: Neden bir Google mülakatı için 8 ay boyunca tam zamanlı çalıştım?
Burada listelenenler sizi herhangi bir yazılım firmasıyla yapacağınız teknik mülakata iyi bir şekilde hazırlar, büyük devler de dahil: Amazon, Facebook, Google, ve Microsoft.
İyi Şanslar!
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 mülakat 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) konulara 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.
İlerlemeyi izlemek için görev listeleri de dahil olmak üzere GitHub'ın özel işaretleme özelliğini kullanıyorum.
Bu şekilde öğeleri seçmek için yeni bir dal oluşturun, braketler arasına sadece bir x koyun: [x]
Bir dalı fork edin ve aşağıdaki komutları takip edin
Github repositorysini https://github.com/jwasham/coding-interview-university Fork butonuna tıklayarak fork edin
Lokal repositorynize klonlayın
git clone git@github.com:<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
Değişikliklerinizi tamamladıktan sonra bütün kutuları X ile işaretleyin
git add .
git commit -m "Marked x"
git rebase jwasham/main
git push --set-upstream origin progress
git push --force
Github aromalı Markdown ile ilgili daha fazla bilgi
Bazı videolar Coursera ya da EdX 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.
Ü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ı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:
İşte mülakat için bir dil seçme hakkında yazdığım bir makale: Pick One Language for the Coding Interview.
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.
Birini seçin:
Mülakat için bir dil seçmeniz gerekir (alta bakın). Dile göre önerilerim burada. Her dil için kaynaklara sahip değilim. İlaveleri memnuniyetle karşılarım.
Eğer bunlardan birini okursanız, kodlama problemlerini yapmaya başlamanız için gereken tüm veri yapılarına ve algoritma bilgisine sahip olmanız gerekir. İnceleme yapmak istemiyorsanız bu projedeki bütün video derslerini atlayabilirsiniz
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:
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 oldu. Notlar karıştırarak ve flashcardlar yaparak tekrarlamaya 3 günümü harcadım.
Lütfen okuyun, benim hatalarımı yapmayın: Retaining Computer Science Knowledge.
A course recommended to me (haven't taken it): Learning how to Learn.
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)
Öğrendiklerinizi sorunları çözmek için uygulamanız gerekir, yoksa unutacaksınız. Bu hatayı yaptım. Bir konuyu öğrendikten sonra, ve o konu üzerinde kendinizi rahat hissettikten sonra (örneğin bağlantılı listeler), kodlama mülakatı kitaplarından birini açın ve bununla ilgili birkaç soru yapın. Ardından bir sonraki konuya geçin. Daha sonra geri dönün ve başka bir bağlantılı liste problemi yapın, ya da özyineleme sorunu ya da her neyse. Ama öğrenirken problemler yapmaya devam edin. Bilgi için işe alınmıyorsun, bilgiyi nasıl kullandığından işe alınıyorsun. Önerdiğim birkaç kitap ve site var. Daha fazlası için buraya bakın: Kodlama Soruları Pratiği.
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 konsantrasyonda zorlanabilirsin. Arka fon müziği açarak gayet güzel bir şekilde odaklanabilirsin.
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 dile 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 püf noktalarını 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:
[ ] Videolar:
[ ] Online Kurslar:
[ ] Doğrusal sondalama (Linear Probing) 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:
[ ] MIT(videolar):
[ ] Skiena Dersleri - güzel giriş:
[ ] Graflar (inceleme ve fazlası):
Full Coursera Kursu:
Bunları uygulayacağım:
If you need more detail on this subject, see "String Matching" section in Additional Detail on Some Subjects.
You can expect system design questions if you have 4+ years of experience.
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. I use a pencil and eraser.
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:
Language-learning sites, with challenges:
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.
What would you have done better at [job x / project y]?
If you find hard to come up with good answers of this type interview questions, you can refer below link for some answer templates and have some idea.
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 are here so you can dive into a topic you find interesting.
Computer Architecture, Sixth Edition: A Quantitative Approach
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?
SOLID
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.
List of individual Dynamic Programming problems (each is short)
Excellent - MIT Calculus Revisited: Single Variable Calculus
CSE373 - Analysis of Algorithms (25 videos)
UC Berkeley CS 152: Computer Architecture and Engineering (20 videos)
Carnegie Mellon - Computer Architecture Lectures (39 videos)
MIT 6.042J: Mathematics for Computer Science, Fall 2010 (25 videos)
MIT 6.050J: Information and Entropy, Spring 2008 (19 videos)