Erhan Yakut Software Developer @Binalyze | Founder @Passwall | Golang Enthusiast | Open Sorcerer

Neden PHP’den Go’ya Geçtim?

4 min read

Uzun yıllar yazılım ile ilgilenmiş kişilerin özellikle yazmaktan keyif aldıkları birer programlama dili vardır. Bu dil benim için PHP‘dir. Elbette bunda 10 yıldan fazladır bu dil ile proje geliştirmenin etkisi büyük ama son yıllarda esas nedeni PHP’nin gerçekten çok iyi yerlere gelmiş olması. Bu sebeple yazı başlığında Go’ya geçtim desem de her zaman PHP ile proje geliştiremeye devam edeceğime inanıyorum ancak şimdilik konumuz bu değil, mesele Go.

PHP’den Go Programlama Dili’ne geçiş hikayemi Ankara Gophers Haziran etkinliğinde anlatmıştım. Öncelikle sunumu olduğu gibi paylaşmayı düşündüm (yazının sonunda paylaştım da) ancak sunum esnasında sözlü olarak yaptığım bazı yorumları da ekleyerek blog yazısı olarak paylaşmanın daha iyi olacağına inandım. Baştan söylemeliyim, başlıktaki sorunun bir genel, bir de özel cevabı var ;)

Go Hakkında Genel Bilgi

  1. Go’nun 28 Mart 2012’de versiyon 1.0’ı yayınlanmıştır ancak bundan önce 2009 yılında production ortamında kullanılmaya başlanmıştır.
  2. Ken Thompson, Rob Pike ve Robert Griesiemer tarafından Google çatısı altında geliştirilmiştir.
  3. Bu kişiler Unix işletim sistemi, C programlama dili ve UTF 8’i tasarlayan kişilerdir.
  4. Tamamen açık kaynaktır. https://github.com/golang
  5. Linux, Mac OS X, FreeBSD, NetBSD, OpenBSD ve Windows ortamlarında derlenip, çalıştırılabilir.
package main

import "fmt"

func main() {
	fmt.Println("Hello World")
}

Statik veya Dinamik Tip

PHP’de değişkenler dinamik olarak tanımlanır ve değişkenin türü programın herhangi bir yerinde aldığı değere göre hata vermeden değişebilir.

";

$degisken = 15;
echo gettype($degisken) . "
"; $degisken = true; echo gettype($degisken) . "
"; $degisken = 15.6; echo gettype($degisken) . "
"; ?>

Go’da değişkenler statik olarak tanımlanır. Yani başlangıçta değişkeni belirli bir tipte oluşturursunuz ve program boyunca o değişkenin tipi hiç değişmez. Aşağıdaki resimde string tipindeki değişkene integer bir değer atamak istediğimde aldığım hatayı görebilirsiniz.

Nesne Tabanlı veya Fonksiyonel Programlama

PHP

PHP nesne tabanlı bir dil olup Class’lar ile kalıtım vardır.

setMarka($marka);
        $this->setPlaka($plaka);
    }
 
    public function arabaBilgileriniGoster() {
        echo 'Araba Markası:'.$this->marka." 
Araba Plakası:".$this->plaka; } private function setMarka($marka) { $this->marka = $marka; } private function setPlaka($plaka) { $this->plaka = $plaka; } } $araba1 = new Araba("Audi","25 VA 025"); $araba1->arabaBilgileriniGoster(); echo "
"; $araba2 = new Araba("BMV","25 YAKUTER 025"); $araba2->arabaBilgileriniGoster(); ?>

Go

Go’da nesne tabanlı değil, fonksiyonel programlama kültürü vardır.
 Class ve kalıtımdan ziyade, Struct ve Interface vardır.

package main

import (
	"fmt"
)

type Araba struct {
	marka string
	plaka string
}

func ArabaBilgileri(araba Araba) (string, string) {
	return araba.marka, araba.plaka
}
func (araba *Araba) setMarka(yeniMarka string) {
	araba.marka = yeniMarka
}
func (araba *Araba) setPlaka(yeniPlaka string) {
	araba.plaka = yeniPlaka
}
func main() {
	audiAraba := Araba{
		marka: "Audi",
		plaka: "06 TT 451",
	}
	bmwAraba := Araba{
		marka: "BMW",
		plaka: "25 YAKUTER 025",
	}

	model, plaka := ArabaBilgileri(audiAraba)
	fmt.Printf("%s %s \n", model, plaka)

	bmwAraba.setPlaka("06 ABK 658")
	bmwAraba.setMarka("Anadolu")
	model, plaka = ArabaBilgileri(bmwAraba)
	fmt.Printf("%s %s \n", model, plaka)
}

Barındırma (Hosting) Konusu

PHP

  • PHP paylaşımlı, bulut veya fiziksel gibi tüm sunucularda rahatlıkla barındırılabilir.
  • Büyük çaplı bir proje olmadığı sürece sunucu kontrolü ihtiyacı yoktur.

Go

  • Go’da sunucu kontrolü şarttır.
  • Bu nedenle basit bir web arayüzü (cpanel, plesk vs.) barındırma için yeterli değildir.
  • Paylaşımlıdan ziyade bulut (cloud) veya fiziksel (dedicated) sunucu ihtiyacı vardır.

Program Yapısı ve Derleme

PHP

  1. PHP’de yazılan kod anlık olarak derlenir ve sonucu tarayıcıya yine anlık olarak iletilir.
  2. Kod olarak herhangi bir PHP dosyasında sadece PHP kodu olabileceği gibi HTML ve JS de bulunabilir.
  3. Uygulamalar birden fazla dosyanın bir araya gelmesi ile ortaya çıkar.
  4. Bağımlılıklar sunucuda farklı dosyalar halinde bulunur.

Go

  1. Go’da uygulama en baştan derlenir ve derleme sonucunda tek bir binary dosya ortaya çıkar.
  2. Bütün bağımlılıklar aynı binary dosyada toplanır. Bu nedenle dosya boyutu normalden büyüktür.
  3. Dosyanın sonradan değiştirilmesi mümkün değildir, baştan derlenmesi gerekir.

Paket Yönetimi, Kod Yapısı, Framework

PHP

  1. PHP’nin bünyesinde hazır bir paket yöneticisi yoktur, Composer kullanılır.
  2. Kodlar paternlere uygun olarak yazılabildiği gibi, onlarca HTML dosyasının içine serpiştirilebilir.
  3. Büyük projeler için MVC mantığı ile çalışan Framework’ler (Laravel, Symfony, WordPress) tercih edilir veya ek paketlerle sıfırdan Framework yazılır.
  4. Routing, template gibi önemli özellikler ancak ek paketlerle kazandırılır.

Go

  1. Go’nun kendi paket yöneticisi vardır ve kullanılmak istenen paketler “go get …” komutu ile kolaylıkla kurulabilir. Go Modules ile de tüm bağımlılıklar rahatlıkla yönetilebilir.
  2. Düzensiz kod yazmaya müsade etmez. Özellikle fmt paketi kodun otomatik olarak uygun şeklde dönüştürülmesini sağlar.
  3. Boşluk (Space) yerine Tab kullanılır.
  4. Kendi routing özelliği (net/http) ve template sistemi vardır.
  5. Routing ve template sistemi sayesinde herhangi bir framework kullanmadan da oldukça sağlam ve stabil projeler geliştirebilirsiniz.

Genel Cevap

Yukarıda yapmış olduğum karşılaştırma oldukça yüzeysel aslında. Temelinde hem üretilme, hem de kullanılma amacı bambaşka iki dil PHP ve Go. Buna rağmen kısa bir karşılaştırma ile genel olarak Go’ya geçme nedenlerimi söylemem gerekirse:

* Mevcut çalıştığım projelerde linux sistem tarafında güçlü bir dile ihtiyaç duymam,
* Aynı anda sistem, network, ve web tarafı güçlü olması gereken bir ürün geliştirmem diyebilirim.

Elbette bu iki sebep, yukarıda yazdıklarımdan sonra sizin ilk aşamada duymayı beklediklerinizdir sanırım fakat esas geçiş nedenim çok farklı :)

Özel Cevap


Buraya kadar yazdıklarım PHP/Go karşılaştırması ve genel kıstaslar doğrultusunda neden Go’ya geçtiğim ile ilgili mevzulardı. Gelelim esas meseleye.

6 Şubat 2018 tarihinde SpaceX tarafından Falcon Heavy 9 roketi uzaya fırlatıldı. Yazılımdan donanıma, mühendislikten elektroniğe tam bir şölendi bu fırlatma. Şahsen bütün benliğimle hayran kalmıştım bu olaya. Bununla birlikte kendimi ve o zamana kadar yaptığım tüm işleri sorgulama gereği hissetmiş ve şöyle bir tweet atmıştım.

Bu depresyon hali bir süre devam etti. Kendimi o roketi geliştiren ekibin içinde hayal etmek istemiştim ancak ortada bir sorun vardı. 10 yıldan fazladır PHP ile projeler geliştirirken böyle bir rokette acaba PHP kullanılmış mıydı ve bir şekilde bu projeye katkıda bulunma şansım var mıydı? Aklımdaki soruyu bu işin uzmanına, yani PHP dilinin mucidi olan Rasmus Lerdorf‘a sormaya karar vermiştim. Kendisini etiketleyerek atmış olduğum tweet şuydu:

Kendisinden gelen cevap ile resmen başımdan aşağı kaynar sular döküldü.

Özetle kendisine böyle bir projede PHP ile yer almamız mümkün mü demiş ve kendisinden mümkün olmadığı yönünde yanıt almıştım :/ İşte o dakikadan sonra yeni bir dile geçmeye karar verdim. PHP elbette üretilme amacına uygun olarak (web geliştirme) dört dörtlük bir dil ancak benim üreteceğim şeyler yön değiştirmişti.

Yapmış olduğum araştırma neticesinde Falcon Heavy 9 roketinde en çok Python, C++ ve Go kullanıldığını öğrendim. O dönemde Python ve C++ ile öyle çok fazla haşir neşir olmamıştım ama Go ile merakımdan ufak tefek projeler geliştmişliğim vardı. Durum böyle olunca önce hiç düşünmeden Go’yu seçtim.

Çünkü ben roket kodlamak istiyordum!

Son olarak bu makaleye konu olan sunumu şuradan indirebilirsiniz.

Erhan Yakut Software Developer @Binalyze | Founder @Passwall | Golang Enthusiast | Open Sorcerer