Tag Archives: yazılım görüşmesine hazırlanma

Yazılım görüşmelerinde soruya yaklaşım tekniği

Daniel Habib isimli bir programcı, yazılım görüşmelerinde konu ne olursa olsun nasıl bir yaklaşım sergilemeniz gerektiği konusunda bir spreadsheet oluşturmuş.

1. İnceleme

  • İnput’un ne olduğunu açıkça belirttim mi?
  • İstenen output’un ne olduğunu netleştirdim mi?
  • Elle çözülebilecek basit bir örnek oluşturdum mu?
  • Tüm aksiyomları yazdım mı?
  • Tüm constraints‘ler benim için ok midir?
  • Tüm akla yatkın varsayımları yazıp türettim mi?

2. Strateji

  • Brute force bir çözüm için beyin fırtınası yaptım mı?
  • Brute force çözümün çalışma zamanını analiz ettim mi?
  • Brute force çözümün space gereksinimini analiz ettim mi?
  • İnput’un memory üzerindeki kapladığı büyüklük ne kadar?
  • Daha iyi, daha karmaşık bir çözüm bulabildim mi?
  • Bu çözümün time complexity‘sini analiz ettim mi?
  • Bu çözümün space complexity‘sini analiz ettim mi?
  • Bu çözümü doğrudan ilk uyguladığım basit çözümümle karşılaştırdım mı?
  • Kodlamaya başladığımda kendime güveniyor muyum?
  • Aklıma gelen tüm yaklaşımları düşündüm mü?
  • İstediğim stratejiyi açıkça yazdım mı?
  • Açıkça base case‘leri dikkate aldım mı? Takıldığım durumlarda ne kadar iyi idare ettim?

3. Kodlama

  • Kodum ne kadar temiz yazılmıştı?
  • Off-by-one hatalarını kontrol ettim mi? Yani index’lerin 0’dan başlaması veya while içerisinde <= yerine < kullanımı gibi.
  • Kodlama sırasında hangi fonksiyonları kullanacağımı tahmin edebildim mi?
  • İnceleme kısmında yaptığım “Beyin fırtınası stratejim” sorunu çözdü mü?
  • Kodlama süreci ne kadar sorunsuzdu?
  • Yazdığım kod ile çözümümü anlatabildim mi?
  • Kodumdaki ilginç fonksiyonların avantajlarından yararlandım mı?

4. Review

  • Time complexit’yi kanıtladım mı?
  • Space complexit’yi kanıtladım mı?
  • Farklı test senaryoları yazıp bunları uyguladım mı?
  • Ne kadar önemsiz olursa olsun satır satır mı gittim?
  • Kodumu gözden geçirirken herhangi bir değişiklik yapmam gerekti mi?

Kaynak: https://docs.google.com/spreadsheets/d/1gy9cmPwNhZvola7kqnfY3DElk7PYrz2ARpaCODTp8Go/htmlview?pru=AAABfLycr3M*TqxdBeNP9JuAGHyhyIwE_A

Yazılım Görüşmelerine Hazırlanabileceğiniz GitHub Sayfaları

Microsoft, Facebook, Google, Amazon, Netflix ve Adobe gibi, birçok yazılımcının hayalini kurduğu şirketlerdeki iş görüşmelerine nasıl hazırlanabilirsiniz? Github‘ta bu iş görüşmelerine hazırlanabileceğiniz sayfaları derlemeye çalıştım bu videoda.

Github sayfaları:

► Tech Interview Handbook: https://yangshun.github.io/tech-interview-handbook/

Benim favori sayfam olabilir burası. İçerisinde özgeçmiş nasıl oluşturulur, ön yazı nasıl oluşturulur, iş görüşmesi formatları, kendini tanıtma, görüşme sonrası “müzakere” kısmı ve temel algoritmalar ile ilgili kısımlar var. Teknik kısımdan ziyade, görüşme öncesi ve görüşme sırasında verdiği bilgiler gayet kullanışlı. Kesinlikle okumanızı tavsiye ederim.

► Coding Interview University: https://github.com/jwasham/coding-interview-university

Burası John Washam adlı bir programcının, Google’da iş görüşmesine hazırlanma süreci amacıyla oluşturulmuş (ki kendisi şu anda Amazon’da çalışıyor), daha sonra inanılmaz büyük bir kaynak haline dönüşmüş. İçerisinde her şey var, veri yapıları, algoritmalar, dinamik programlama, nesneye yönelik programlama, tasarım desenleri, vb. birçok farklı yapı ile ilgili bilgilendirmeler var. Bunlara ek olarak, iş görüşmesi öncesi hazırlıklar, günlük çalışma planı oluşturma, kitap ve dış kaynak tavsiyeleri gibi bölümler de mevcut. Gerçekten Github içerisinde, bu konu ile ilgili en büyük kaynak olabilir.

► The System Design Primer: https://github.com/donnemartin/system-design-primer

Belirli veri yapıları ve algoritmalar yerine, daha büyük, ölçeklenebilir sistemler nasıl tasarlanır? şeklinde bilgiler öğrenebileceğiniz bir sayfa. Sayfanın Türkçe kısmı da hali hazırda geliştiriliyor gördüğüm kadarıyla. Özellikle “Sistem Tasarımı” görüşmelerine hazırlanabilirsiniz bu sayfayı çalışarak. Örneğin; Twitter ve Instagram gibi sistemleri nasıl tasarlayabilirisiniz? Bu tarz sorular aslında en çok sorulardan biri. Bunlar için özellikle Grokking the System Design Interview kısmına da göz atabilirsin, bu da çok değerleri bir kaynaktır.

► Interview: https://github.com/Olshansk/interview

Bu sayfada genellikle dış linklere bağlantılar şeklinde bir listeleme mevcut. Algoritmalar, kod pratikleri yapabileceğiniz siteler, guide tarzı sayfalara olan linkler, kurslar, ücretsiz iş görüşmesi deneyimi yaşayabileceğiniz siteler vb. bir çok kaynak mevcut.

► How to Secure Anything: https://github.com/veeral-patel/how-to-secure-anything

Sadece bilgisayar güvenliği ile ilgili değil, “güvenlik” kavramına çok daha derin bir bakış açısı kazanmanızı sağlıyor. İçerisinde, güvenlik mühendisliğini nedir, en iyi pratikler, security policies, güvenlik modelleri, açık bulma, authentication ve authorization kavramları gibi bir çok konu ile ilgili bilgi mevcut.

► How Web Works: https://github.com/vasanthk/how-web-works

Bu sayfada web kavramının nasıl çalıştığını çok iyi şekilde öğrenebilirsiniz. Bilgisayar kullanan herkesin günlük hayatta yaptığı, ama arka tarafta nasıl çalıştığını bilmedikleri kısımlardan bahsediyor. Örneğin Google’da bir g harfine bastığınızda veya klavyede bir url girdikten sonra enter tuşuna basınca ne oluyor gibi bilgilere ulaşabilirsiniz. Ek olarak http protokolü, dns, tls, dom tree gibi kavramlardan da bahsediyor.

► JavaScript Algorithms and Data Structures: https://github.com/trekhleb/javascript-algorithms

Bu sayfadaki örnekler Javascript dili ile geliştirilmiş. Tüm algoritmalar ve veri yapıları bu şekilde. Güzel yanı olarak Türkçe kısmı da var. Ayrıca algoritmalar ve veri yapıları da, kolay ve zor olarak işaretlenmiş. En sevdiğim kısım ise, çok sade bir anlatımı olduğu için, buradaki algoritma ve veri yapıları sizin kullandığınız programlama dili üzerinde kolayca uygulayabilmeniz.

Eğer sizlerin de bildiğiniz, bu tarz Github sayfaları varsa yorumlar kısmına bırakabilirsiniz.