Bir Android Geliştiricinin Golang ile Backend İmtihanı

2016'da Ankara Yıldırım Beyazıt Üniversitesi’nde geliştirdiğimiz AVM içi navigasyon konulu bitirme projemiz, o dönem üniversitenin en iyi projesi seçildi. Bu yazıyı yazarken bitirme projemizi anlatan bir başka yazı daha yazma fikri aklıma gelmişti ve buradan okuyabilirsin. ‘Android güzelmiş ya, ben buradan devam ederim,’ dedim ve o günden 2024 Ocak ayına kadar kariyerime Android geliştirici olarak devam ettim. Bildiğiniz üzere, frontend çalışmaları, backend -yani web servisleri ve API’ler (Application Programming Interface)- olmadan işlevsizdir. Bunların detaylarına girmeyeceğim; zira bunlar hem bilinen konular hem de yazıyı fazla uzatmak istemiyorum. 😊
Frontend geliştiriciler için backend ile iletişim her zaman önemli bir adımdır, hele ki mobil ekiplerle daha önce çalışmamış backend geliştiricileriyle iş birliği yapmak daha da zordur. Bunun yanında, onlarsız da yapamayız ha, kendi ufacık şahsi projelerimizde bile backend geliştirici ararız; veritabanı oluşturmak, API yazmak ve yayınlamak gözümüzde deve dönüşür.
Yapay zekâların hayatımıza girmesi ve öğrenme kaynaklarının orantısız artmasıyla, ‘Ben Android biliyorum, bu bana yeter,’ düşüncesiyle yetinmeme kararı aldım. Ocak ayında gerçekleştirdiğim iş değişikliğiyle Kotlin ile native mobil uygulama geliştirmeye ara verdim ve bambaşka bir teknoloji yığınına sahip yeni bir işe atıldım. Artık bir takım lideriyim ve ekibimle birlikte web teknolojileri üzerinde çalışıyoruz.
Sorumluluklarım arttığı ve ekibimiz küçük olduğu için, problem çözme yeteneğimi sergilemek, her şeyi öğrenmek ve veri tabanında fonksiyonlarla bile uğraşmak istiyorum. İş yerimde bir API yazmamız gerekti. Durur muyum, hemen atladım ‘Ben hallederim,’ diye. İçimde yukarıda bahsettiğim hisler vardı; ‘Şu backend’e de bi’ bakıp çalışmam lazım artık, o kadar da zor olamaz,’ diyordum. Fırsat ayağıma gelmişti.

Görsel Golang dili Wikipedia sayfasından alınmıştır.
Golang hakkında çok şey duymuştum ve hiç tereddüt etmeden, yapay zekânın da yardımıyla geliştirmeye başladım. Birkaç dakika içinde API hazırdı. Bu kadar kolay ve kısa sürede tamamlanabileceğini hiç düşünmemiştim. Senelerdir kafamda büyük bir sorun gibi duran servis yazma işi artık Android kadar kolay hâle gelmişti. Büyük projeler için elbette hâlâ büyük bir saygım var ama ufak bir projeniz varsa backend geliştirmek Golang ile çok daha kolay ve hızlı.
2024 Ramazan Bayramı tatilinde Golang ile kendimi daha da geliştirmek istedim. Daha önce koşu ekibimiz Runarchy için geliştirmeyi düşündüğümüz ancak gönüllü bir backend geliştirici bulamadığımız için rafa kaldırdığımız koşu uygulaması projesi üzerinde tekrar çalışmaya karar verdim. Bu proje o zamandan beri içimde kanayan bir yara olmuştu.
Bu yazılım projesinde şunları yapmayı planlıyorduk:
· Mobil uygulama
· Veri girişi için gerekli olan bir admin paneli
· Yaklaşık 25–26 adet, çoğu CRUD olan, kimi frontend’de kimiyse admin panelinde kullanılacak REST API servisler
İlk olarak, hem admin paneli hem de mobil uygulamalar için servisler geliştirmeye başladım. Giriş yapma işlevi için Firebase’den yardım aldım. Birkaç saat içinde login servisim hazır olmuştu ve Golang, Heroku, Git ortaklığı sayesinde Heroku’da yayınlanmıştı bile. Bu süreçte, kullanıcıların kimlik doğrulama işlemlerini nasıl yönettiğimizi aşağıda görebileceğiniz veri akış grafiği ile detaylandırdım:

Yazar tarafından Creately üzerinde hazırlanmış veri akış grafiği.
Backend'de Kullanıcı Kimlik Doğrulama Süreci:
· Kullanıcı, mobil uygulamamıza e-posta ve şifresini girerek giriş yapmaya çalışır.
· Uygulama, kullanıcının varlığını ve kimlik bilgilerinin doğruluğunu kontrol etmek üzere Firebase’e bir istek gönderir.
· Eğer kullanıcı varsa ve bilgiler doğruysa Firebase, 926 karakter uzunluğunda bir geçici kimlik metni olan ID token’ı uygulamaya iletir.
· Login servisimiz bu ID token’ı uygulamadan alır ve Firebase’de bu token ile ilişkilendirilmiş bir kullanıcının olup olmadığını sorgular.
· Firebase kullanıcıya özel ve değişmeyen bir kimlik metni gönderir.
· Servisimiz, bu kullanıcı ID’sini client’a ileterek tüm işlemlerin kullanıcıya özel kalmasını sağlar.
Kullanıcıların e-posta adresi gibi bilgilerini tutma gereksinimi duymadım ancak daha kapsamlı bir projede, login zamanı, e-posta adresi ve cihaz bilgileri gibi ek verilerin saklanması gerekebilir. Login servisinin yapısı da bu tür ihtiyaçlara göre şekillendirilir.
package auth
import (
"context"
"encoding/json"
"fmt"
"net/http"
"runarchy/firebase"
)
type LoginRequest struct {
IDToken string `json:"idToken"`
}
func LoginHandler(w http.ResponseWriter, r *http.Request) {
var lr LoginRequest
err := json.NewDecoder(r.Body).Decode(&lr)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
app := firebase.InitFirebase()
authClient, err := app.Auth(context.Background())
if err != nil {
http.Error(w, "Firebase auth client alınırken hata oluştu", http.StatusInternalServerError)
return
}
token, err := authClient.VerifyIDToken(context.Background(), lr.IDToken)
if err != nil {
http.Error(w, "Token doğrulama başarısız", http.StatusUnauthorized)
return
}
w.WriteHeader(http.StatusOK)
fmt.Fprintf(w, "Token başarıyla doğrulandı, Kullanıcı ID: %s", token.UID)
}Golang gerçekten de övüldüğü kadar iyiymiş, hatta övüldüğünden de fazlasıymış. Bu projeyi 4–5 yıl önce, Ruby on Rails ile (Ruby diliyle yazılmış, açık kaynak kodlu bir web uygulama geliştirme çatısı) yazan bir arkadaşımla denemiştik. 25–26 servis ona fazla gelmiş, projeyi yarıda bırakmış ve mesajlarıma cevap bile vermemişti. Ruby’de yazdığı kod, GitHub’da tozlu bir köşede kalmıştı.
En az Go kadar övülen Ruby ile yazılmış bu projeyi kurcalamış ancak kod yapısını tam olarak kavrayamamıştım ancak Go ile yazdığım aynı projede, her bir dosyanın amacını ve işlevini net bir şekilde biliyor olmak çok farklı ve keyifliydi. Boilerplate (standart veya ortak kod) olmayan bir dilde çalışmak benim için yeni bir tecrübeydi. Ruby ile detaylı bir kıyasa tabii ki girmeyeceğim çünkü o yetkinlikte birisi değilim ama siz yorumlarda üstüme gelmekten çekinmeyin. 😊
Servislerim 1 gün içinde -bazısı testleriyle birlikte- o kadar hazırdı ki bir mobil uygulama kullanıcısı koşu kaydı yaptığında, koşuya ayakkabısını eklediyse ayakkabı kilometresi shoes tablosundaki veriye otomatik olarak ekleniyordu. Böylece, koşu dünyasında çok gerekli olan bir datayı -yani ayakkabı ömrünü- kayıt altına almış oluyorduk. Yıllarını Android’e vermiş birisi olarak inanamadım. Kod çok sade, tertemiz, okunabilir, anlaşılabilirdi. Go ile yalnızca birkaç gün muhatap olmama rağmen kodumun her yerini ayrıntılarıyla anlatabilirdim. Daha önce Android’de yazdığım hiçbir projeye bu kadar hâkim olmamıştım.

Yazar tarafından alınmış ekran görüntüsü
Sevgili native ciler, önceki yazılarımda da bahsettiğim üzere, teknolojilerin, dillerin, kütüphanelerin kölesi olmayın. Onları yazılım üretmek için birer araç olarak görün zira beş sene sonra o hayran olduğunuz teknolojinin veya dilin nerede, ne hâlde olacağını bilemezsiniz…
Golang, Javascript, Vue.js hoşuma gitmiş olsa da gözüm bi’ encapsulation, bi BaseActivity, bi’ Fragment aramadı değil. Geleceğiz oralara, başka yazılarda.

ChatGPT tarafından oluşturulan görsel — kaynak ve telif hakkı yazara aittir.
Sevgiyle ve kodla kalın…
Sıkça Sorulan Sorular
▸Android geliştirici neden backend öğrenmeye ihtiyaç duyar?
Frontend uygulamaları, web servisleri ve API'ler olmadan işlevsiz kalır. Android geliştiriciler bir noktada backend'in nasıl çalıştığını anlamak ya da kendi servislerini yazmak ihtiyacı duyabilir.
▸Yazar neden Golang'ı seçti?
Yazıda bu tercih belirtilmekte ancak seçim gerekçelerinin ayrıntıları içeriğin devamında ele alınmaktadır. Golang, backend geliştirme için tercih edilen modern dillerden biri olarak öne çıkmaktadır.
▸Yazarın Android geliştiricilik deneyimi ne kadar sürdü?
Yazar, 2016 yılında üniversitede Android tabanlı bir bitirme projesi geliştirdikten sonra 2024 Ocak ayına kadar kariyerine Android geliştirici olarak devam etti.
▸Yazarın ilk Android projesi neydi?
2016'da Ankara Yıldırım Beyazıt Üniversitesi'nde AVM içi navigasyon konulu bir bitirme projesi geliştirdi. Bu proje o dönem üniversitenin en iyi projesi seçildi.


