Merhaba,

 

Bu yazıda yazılım geliştiriciler için teknik mülakatlarda çıkabilecek bazı sorulardan, cevaplardan ve yazılım terimlerinden bahsedeceğim. Bu konudaki bir önceki yazıma şuradan ulaşabilirsiniz.

 

Soru: == (iki eşittir) ve === (üç eşittir) farkı nedir?

Cevap: == de sadece değer karşılaştırması yapılırken, === de hem tip hem değer karşılaştırması yapılır. örneğin if (0 == false) bize true değeri döndürürken, if (0 === false) bize false değeri döndürür.

 

Soru: Fonksiyon ve metodun farkı nedir?
Cevap: İkisi de function keyword ü ile oluşturulur (tabi bu dilden dile farkedebilir). Eğer bir class ın içinde tanımlandıysa ona metot deniyor, class dan bağımsız tanımlandıysa fonksiyon deniyor.

 

Soru: Redis nedir, nasıl çalışır?
Cevap: Redis key-value şeklinde çalışan bir Nosql veritabanıdır. Verileri diskte değil ram de tuttuğu için çok hızlı çalışır. Genellikle cache, session yönetimi ve queue işlemleri için kullanılır.

 

Soru: RabbitMQ nedir, nasıl çalışır?
Cevap: Bir message brokerdır. Herhangi bir kaynaktan alınan mesajı başka bir kaynağa sırası geldiği anda iletir.

 

Soru: Mikroservis nedir, bir servisin mikroservis olması için gerekli şartlar nelerdir?
Cevap: Tek sorumluluğu olan, bağımsız yazılım servisleridir. Bağımsız şekilde bakımı yapılabilir, izlenebilir ve dağıtılabilir yapıda olmalıdır.

 

Soru: Docker komutlarına örnek verebilir misiniz?
Cevap: docker pull ile bir image çekilir, docker search ile image araması yapılabilir, docker images ile mevcut imagelerin listesi çekilir, docker run ile image çalıştırılır, docker ps ile çalışan containerlar listelenir, docker start/stop ile container başlatılıp durdurulur, docker-compose up ile docker projesi ayağa kaldırılabilir.

 

Soru: Git komutlarına örnek verebilir misiniz?
Cevap: init (local de repo oluşturur), clone (uzak sunucudan repo çeker), add (değişiklikleri stage area a gönderir), status (stage area ve local repodaki değişikliklerin durumuna bakmak için), log (local repodaki commit geçmişi için), commit (değişiklikleri local repoya gönderir), push (değişiklikleri uzak sunucuya gönderir), pull (uzak sunucudan değişiklikleri çeker), checkout (branch değiştirmek için), branch (branch açma silme işlemleri için), merge (branch birleştirme işlemleri için), stash (değişiklikleri geçici olarak saklamak için).

 

Soru: Inheritance, abstraction, encapsulation ve polymorphism nedir?
Cevap: Inheritance kalıtımdır, bir class ın özelliklerini başka bir class ın kullanabilmesini sağlar. Abstraction soyutlamadır, sadece girdi ve çıktılara odaklanıp diğer detayları düşünmezsiniz, örneğin arabada gaza basmak girdi iken arabanın gitmesi çıktıdır, arkaplanda gerçekleşen işlemlerle ilgilenmezsiniz. Encapsulation class ın property leri korumaya almasıdır, örneğin private bir property e sadece o class dan ulaşılır, protected a o class ve türeyen classlardan. Polymorphism metotların objeye göre farklı çıktılar üretmesi veya farklı işler yapmasıdır, örneğin hayvan class ı var ve sesCikar metodu var, kedi class ını hayvan dan kalıtım yapınca sesCikar metodu miyav çıktısı üretirken köpek class ında hav hav çıktısı üretir.

 

Soru: Abstract class ve interface farkı nedir?
Cevap: Abstract class genellikle base class tanımlamak için kullanılan ve soyutlama yeteneği kazandıran sınıflardır, new ile oluşturulamaz, içinde değişken ve metot bulundurabilir, constructor ve destructor bulundurabilir, static tanımlanamaz ancak static üyeler içerebilir, bir sınıf yalnızca bir abstract class ı inherit edebilir, kendisinden kalıtım alacak sınıflarla arasında is-a ilişkisi vardır, çarpışan araba bir arabadır gibi. Interface, içinde sadece kendisinden türeyecek olan sınıfların içini dolduracağı metod tanımlarının bulunduğu ve soyutlamaya olanak sağlayan yapıdır, new ile oluşturulamaz, bir sınıfın ne yapması gerektiğini belirtir, nasıl yapması gerektiğini değil, default olarak tüm interface üyeleri abstract ve publictir, static üyeler içeremez, bir sınıf birden fazla interface i inherit edebilir, içi dolu metod bulundurmazlar, kendisinden kalıtım alacak sınıflarla arasında can-do ilişkisi vardır, çarpışan araba hızlanabilir gibi.

 

Soru: Sınıf ve nesne nedir?
Cevap: Sınıf, içinde metotlar ve değişkenler barındırabilen, nesneler için şablon görevi gören yapılardır. Nesne sınıfın bir örneğidir.

 

Soru: Design patterns nedir, örnek verebilir misiniz?
Cevap: Yazılım geliştirme aşamasında karşılaşılan genel sorunların çözümüdür. Bir algoritma ya da kod değildir, dilden bağımsızdır. Örneğin singleton, builder, adapter, observer, facade ve factory gibi pattern lar mevcuttur. Singleton da bir objeden bir tane üretilip sadece onun kullanılması ilkesi vardır. Builder da class oluştururken kullanılan constructor içindeki parametreler esnek bir hale getirilip temiz bir kod yazılabilir. Facade karmaşık alt sistemler için basit bir arayüz sağlar, örneğin bilgisayarı açıp kapatırken yapılan tek şey güç tuşuna basmaktır ancak o tuşa basınca arkaplanda dönen işlerle ilgilenmeyiz. Observer da observable adı verilen bir nesnenin, observer yani gözlemci adı verilen nesnelerin listesini tuttuğu ve durum değişiklikleriyle ilgili onları bilgilendirdiği bir desendir.

 

Soru: Bir api nin daha hızlı response vermesi için neler yapabiliriz?
Cevap: Veritabanı sorguları optimize edilebilir, veritabanında indexler oluşturup sorguların hızlanması sağlanabilir, responsun cache e atılıp hiç veritabanına gitmeden cache den döndürülmesi sağlanabilir.

 

Soru: Solid prensipleri nelerdir?
Cevap: Yazılımın esnek ve geliştirilmeye uygun olması için uyulması gereken kurallardır. Single responsibility tek sorumluluk ilkesidir, bir fonksiyon bir iş yapmalıdır. Open/closed nesnelerin geliştirilmeye açık, değişime kapalı olması gerektiğini ifade eder, yani bir nesne davranışını değiştirmeden yeni özellikler kazanabiliyor olmalıdır. Liskov substitution yerine geçme ilkesidir, miras alarak türemiş olan class ların önce miras aldıkları nesnenin tüm özelliklerini kullanması, sonra da kendi özelliklerini barındırması gerekir. Interface segregation arayüz ayırımı ilkesidir, bir interface e gerekenden fazla sorumluluk eklemek yerine, daha özelleştirilmiş birden fazla interface oluşturulmalıdır. Dependency inversion bağımlılığın ters çevrilmesi ilkesidir, alt sınıflarda yapılan değişiklikler üst sınıfları etkilememelidir.

 

Soru: Dependency injection nedir?
Cevap: Bir sınıfın/nesnenin bağımlılıklardan kurtulmasını amaçlayan ve o nesneyi olabildiğince bağımsızlaştıran bir programlama tekniği/prensibidir. Dependency injection uygulayarak; bir sınıfın bağımlı olduğu nesneden bağımsız hareket edebilmesini sağlayabilir ve kod üzerinde olası geliştirmelere karşın değişiklik yapma ihtiyacını ortadan kaldırabiliriz.

 

Soru: Rest nedir?
Cevap: İstemci ve sunucu arasında veri alışverişinin yollarından biridir. Http protokolüne ait metodları ve durum kodlarını kullanarak web servisler hazırlanabilir. Json, xml ve text gibi formatlarda veri dönüşü sağlayabilir.

 

Soru: Http metodları nelerdir?
Cevap: get (listeleme), post (ekleme), patch (tek özellik güncelleme), put (birden fazla özellik güncelleme), delete (silme)

 

Soru: Http durum kodları nelerdir?
Cevap: 200 ile başlayanlar başarılı sonuç, 300 ile başlayanlar yönlendirme, 400 ile başlayanlar client tarafı hataları, 500 ile başlayanlar server tarafı hataları

 

Soru: Restful web servis nedir?
Cevap: Rest mimarisiyle yazılan servislerdir. Rest, representational state transfer yani temsili durum aktarımı anlamındadır. Http protokolünü kullanır. Hafiftir, ölçeklenebilirlik ve sürdürülebilirlik sağlar. Farklı programlama dilleri kullanılarak geliştirilen birden çok uygulama arasında iletişimi destekler.

 

Soru: Rest api best practiseleri nelerdir?
Cevap: 

  • endpointleri tanımlarken çoğul isimler kullanmak. örneğin /users
  • endpointlerde uzun isimler için _ ve - kullanmak. örneğin /authorized-users veya /authorized_users
  • endpointlerde küçük harf kullanmak
  • http metodlarını ve durum kodlarını doğru şekilde kullanmak
  • kaynaklar arasındaki hiyerarşiyi belirtmek için / kullanmak. örneğin /users/{id}/address
  • büyük veriler alınırken sayfalama yapılması
  • ssl/tls kullanmak
  • rol tabanlı erişim kontrolleri yapmak. örneğin bir kullanıcı, yöneticinin veya başka kullanıcının verisine erişmemeli
  • performansı arttırmak için cache kullanmak ve sürekli veritabanına gitmemek
  • versiyonlama kullanmak. örneğin /v1 /v2 gibi. böylece değişikliklere geçiş sorunsuz olur.

 

Soru: Laravel in diğer php frameworklerine göre avantajları nelerdir?
Cevap: Söz dizimi etkileyici şekilde temiz, basit ve anlamlıdır. Öğrenilmesi diğer php frameworklerine göre nispeten daha kolaydır. İçindeki auth, mail, cache, görev zamanlama mekanizması gibi bir çok hazır fonksiyonu size sunarak zaman kazandırır. Gelişmiş eloquent orm yapısı ile veritabanı sisteminden bağımsız şekilde hızlı ve güvenilir sorgular yazmamıza yardımcı olur. En yaygın güvenlik açıklarından olan sql injection, cross-site scripting vs gibi tehlikelerden sizi korur. Migration sistemi sayesinde veritabanında bir versiyonlama sistemi oluşur, tabloları baştan oluşturmaya gerek kalmadan yeni sutun ve özellikler eklenebilir. Mvc yapısı sayesinde projeniz daha modüler ve yönetilebilir olur ve kod okunabilirliği artar.

 

Soru: Index nedir nasıl çalışır?
Cevap: Sorguları hızlandırmak için kullanılan bir özelliktir. Kitaplardaki indeks sayfası gibi düşünülebilir. Örneğin users tablomuz var ve name sütunu mevcut. Bunu indexleyince artık name sütunundaki veriler ayrıca tutulur, örneğin yusuf kelimesinin hangi id li satırlarda olduğu tutulur ve name i yusuf olanlar şeklinde sorgu yapınca daha hızlı şekilde sonuca ulaşılır. Veritabanındaki ekleme, güncelleme ve silme işlemlerinde index yeniden inşa edileceği için gereğinden fazla index oluşturmak performansı düşürür.

 

Soru: JS'de null ve undefined farkı nedir?
Cevap: null boş değer anlamındadır, undefined ise değişken bildirilmiş ama henüz değeri atanmamış demektir.

 

Soru: JS'de primitive ve non-primitive data tipleri nelerdir?
Cevap: Primitive tek bir değer depolar. string, number, bigint, boolean, undefined, null ve symbol primitive data tipleridir. Non-primitive çoklu ve karmaşık değerleri depolar. Object non-primitive data tipidir.

 

Soru: JS'de var, let ve const farkı nedir?
Cevap: var; function scope çalışır yani fonksiyonun herhangi bir yerinde var ile belirtilen değişkene erişilebilir, var ile değişkenler tekrar tanımlanabilir ve değerleri güncellenebilir. let; block scope çalışır yani oluşturulduğu yerdeki süslü parantezler içerisinde erişilebilir, let ile değişkenler tekrar tanımlanamaz ama değerleri güncellenebilir. const sabittir, tanımlanınca değiştirilemez, buna immutable da denir, block scope özelliklidir. const ile bir nesne tanımı yapıldıysa o nesnenin içindeki özelliği değiştirmek veya yeni özellik eklemek mümkündür, bu durumda const mutable davranmış olur.

 

Soru: JS'de arrow function nedir?
Cevap: ES6 ile gelen bir özelliktir. Fonksiyonları daha kısa bir syntax ile tanımlayabilmemizi sağlar. Normal function ile arasındaki en büyük fark this özelliğidir. Normal function da this içinde bulunduğu scope u ifade ederken, arrow function da global scope u ifade eder.

 

Soru: JS'de hoisting nedir?
Cevap: JS'de tüm değişken ve fonksiyon tanımlamalarının kod derlenmeden önce scope un en üstüne taşınmasına hoisting denir. Yani bir değişken önce kullanılıp sonra tanımlanabilir. Ancak hoisting özelliği sadece var için geçerlidir. let ve const ile yapılan tanımlamalarda hata alınır. Eğer "use strict" kullanılırsa hoisting engellenir.

 

Soru: JS'de pop, push, shift, unshift nedir?
Cevap: pop dizinin sonundan eleman siler, push dizinin sonuna eleman ekler, shift dizinin başından eleman siler, unshift dizinin başına eleman ekler. push ve pop hızlı çalışır, shift ve unshift yavaş, bunun nedeni dizinin başından eleman ekleyip silindiğinde diğer elemanları taşıyıp tekrar indekslemek gerektiğidir.

 

Umarım faydalı olmuştur.

 

İyi çalışmalar.