İçeriğe geç
Muhammet Şafak
Günlük 3 dk okuma

Polyglot olmak bir hedef değil bir sonuçmuş

Çok dilli geliştirici olmak nasıl bir hedefe dönüştü, neden aslında hiç öyle olmadığını ve buna nasıl ulaştığımı düşünüyorum.


“Polyglot geliştirici” ifadesini ilk duyduğumda bunu bir kimlik gibi benimsemek istedim. Birden çok dil bilen, her probleme uygun araçla yaklaşan, tek bir ekosisteme mahkûm kalmayan geliştirici. Kulağa çekici geliyordu.

Ama geriye dönüp baktığımda polyglot olmak böyle oldu değildi. Bir hedef belirleyip o yönde yürümedim. Daha doğrusu, şöyle oldu: bir problem geldi, elimin altındaki araç yetersiz kaldı, farklı bir şey öğrendim. Bu birkaç kez tekrarlandı. Bir noktada etrafıma bakınca birden fazla dil biliyordum. İşte bu kadar.

Go nasıl girdi

Go hikâyesi somut. 2019’da bir komut satırı aracı yazmam gerekiyordu. PHP de yazabilirdim elbette, ama deployment için bağımsız bir binary üretmek istiyordum — çalıştıran kişinin PHP yüklemesine gerek kalmadan. Go’nun derlediği şeyin tek ve taşınabilir bir ikili olduğunu öğrendim. Denedim. Çalıştı.

Sonrasında Go’nun goroutine ve channel modelini de merakla incelediğimde dilin eşzamanlılık yaklaşımının ne kadar temiz tasarlandığını gördüm. PHP’nin varsayılan olarak tekil süreçli dünyasından gelince bu oldukça farklı hissettirdi.

Ama bugün bir web uygulaması yazmak için Go seçmiyorum. HTTP servisi Go ile de yazılır, evet; ama Laravel ekosistemi benim için çok daha üretken. Go’yu hâlâ araç yazmak, küçük servisler ve sistem etkileşimi gerektiren durumlar için tutuyorum.

// Go ile basit bir dosya satır sayacı
package main

import (
    "bufio"
    "fmt"
    "os"
)

func countLines(path string) (int, error) {
    f, err := os.Open(path)
    if err != nil {
        return 0, err
    }
    defer f.Close()

    count := 0
    scanner := bufio.NewScanner(f)
    for scanner.Scan() {
        count++
    }
    return count, scanner.Err()
}

func main() {
    if len(os.Args) < 2 {
        fmt.Fprintln(os.Stderr, "kullanım: satir-say <dosya>")
        os.Exit(1)
    }
    n, err := countLines(os.Args[1])
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
        os.Exit(1)
    }
    fmt.Printf("%d satır\n", n)
}

Bu küçük araç PHP ile de yazılırdı. Ama bu ikili dosya olarak dağıtılıyor, kurulum gerektirmiyor. Go’yu seçmemin nedeni buydu; dil merakı değil.

Python nasıl girdi

Python 2020’de girdi. Yine somut bir problem: CSV dosyalarından veri çekmek, dönüştürmek ve farklı formatlarda kaydetmek. Bunu PHP ile de yapabilirdim ama Python’da pandas ile aynı şeyi çok daha az satırda yapabildiğimi gördüm.

Python’un script yazımı için ne kadar uygun olduğunu da burada öğrendim. Ayrıntıları düşünmeden hızlıca yazıp çalıştırabildiğiniz, sonucu hemen görebildiğiniz bir dil. PHP de betik yazılabilir ama Python bu konuda çok daha doğal hissettiriyor.

Bugün Python’u veri dönüştürme, metin işleme ve otomasyon betikleri için kullanıyorum. Web uygulaması yazmak için seçmiyorum.

Dil bilmek ne anlama gelir

Birden fazla dil “bilmek” derken ne kastediyorum? Bence burada dürüst olmak gerekiyor.

PHP’de uzmanım. Dilin inceliklerini, ekosistemi, kalıpları ve tuzakları tanıyorum. On iki yıl birikiyor.

Go’da yeterliyim. Araç yazabiliyorum, HTTP servisi yapabiliyorum, dili okuyabiliyorum. Ama Go’nun daha derin eşzamanlılık senaryolarında uzman olmadığımı biliyorum.

Python’da işini görür durumdayım. Betik yazıyorum, veri işliyorum. Ama Python ile büyük uygulama yazmak istesem öğrenmem gereken çok şey olduğunu da biliyorum.

Bu ayrım önemli. Polyglot olmak “her dili eşit derinlikte bilmek” değil, “farklı problemler için farklı araçlara erişebilmek” demek. Derinlik her dilde aynı olmuyor ve olmasına da gerek yok.

Hedef olarak polyglot’un tuzağı

Birden fazla dil öğrenmek bir hedef olarak belirlendiğinde tehlikeli bir yola giriliyor. “Bu yıl Rust öğreneceğim” diye karar vermek, o dili gerçekten kullanacak bir problem olmadan yüzeysel bir tanışıklıktan öteye gidemiyor. Dil ancak probleme çözüm ararken gerçekten özümseniyor.

Bence polyglot olmak şu şekilde oluyor: Bir probleme bakıyorsunuz. Elinizdeki araç yetersiz kalıyor ya da o araçla çözüm üretmek çok maliyetli hissettiriyor. Alternatif arıyorsunuz. Buluyorsunuz, öğreniyorsunuz, kullanıyorsunuz. Bu birkaç kez tekrarlandığında fark etmeden polyglot oluyorsunuz.

Tersi, yani “önce dili öğreneyim, sonra problem bulurum” yaklaşımı çoğu zaman işe yaramıyor. Öğrenme yüzeysel kalıyor çünkü gerçek bir ihtiyaç yok.

Bugünden geriye bakarken

Bugün PHP, Go ve Python kullanıyorum. Bu üç dilin üçünü de kasıtlı olarak öğrenmeye oturmadım; problemler beni bu dillere götürdü. Ve her biri ayrı bir alan kaplıyor: PHP uygulama geliştirme için, Go araç ve küçük servisler için, Python otomasyon ve veri işleme için.

Bu dağılım rastlantı değil, birikimidir. Her dil öğrenildiğinde bir öncekine de farklı bakmaya başlıyorsunuz. Go’nun derleme güvenliği PHP’deki tip sistemini daha ciddi ele almama neden oldu. Python’un okunabilir sözdizimi, diğer dillerde de gereksiz karmaşıklıktan kaçınmama katkı sağladı.

Polyglot olmak bir kimlik değil, bir sonuç. Ve bu sonuçla barışık olunca, yeni bir dil öğrenmek de daha sağlıklı bir yere oturuyor: yalnızca bir problemi çözmek için, zamanı gelince.

Etiketler: #Go#Python#PHP
Paylaş:

İlgili Yazılar

Sitede Ara

Yazı, proje ve sayfalarda arama yapmak için yazmaya başlayın.

Esc ile kapat Pagefind ile güçlendirildi