Yazılımcıların söylediği önemli bir söz vardır, “en zoru isimlendirmektir”. Yazılım parçalarınızı isimlendirmek, dosyalarınızı isimlendirmek, verilerinizi isimlendirmek; hepsi zordur. Ancak bundan daha zor olan birşey varsa bu da sürekli gelişim halindeki yazılım projelerinin sürümlerinin kontrolüdür.
Yazılım Süreçleri Zordur
Nedir sürüm kontrolü? Varsayalım ki bir program yazıyorsunuz, kaynak kodunuz sürekli değişiyor, her aşamada sizden beklenen programın bir parçasını tamamlıyorsunuz ama birçok şeyden tedirginsiniz. Ya yeni özellik eklemek isterken çalışan kısımları bozarsanız? Ya yeni özellik çalışmazsa? Ya dosya sisteminiz göçer de dosyalarınız kaybolursa?
Bunun için aklınıza ilk gelen şey yazılımınız sürümlemek olabilir. Diyelim mi C programlama dilinde bir hesap makinesi programı yazıyorsunuz ve her eklediğiniz ozellikten sonra dosyanızı farklı isimle kaydediyorsunuz: hesap-makinesi-1.c, hesap-makinesi-2.c, … hatta isterseniz her seferinde eklediğiniz özelliğin ismini de dosyaya ekleyebilirsiniz: hesap-makinesi-3-carpma.c gibi (eski bir arkadaşımın taraftarı olduğu futbol takımının ilk onbiriyle program sürümlemesi yaptığını hatırlıyorum, eski güzel günler işte(!)). Dizininizde bir çok dosya kirliliği olacağı kesin. Diyelim ki ilk iki sıkıntıyı hallettik, üçüncüye, yani dosya sisteminizin göçmesine çözüm için de bir flaş bellek kullandığınızı varsayalım. Şimdi düşünelim birsürü acayip isimli dosya ve flash bellekte onların yedekleri. Aman Allahım, ağlamak istiyor olmalısınız!
İşi bir adım daha öteye taşıyalım: Birden çok kişinin üzerinde çalıştığı bir yazılım projesinde çalışıyorsunuz, artık numaralandırma da yetmeyecek. Yazılımların programlara göre çok büyük olduğunu, uzun soluklu ve sürekli gelişim/bakım halinde olduğunu düşünürseniz, demin ağlamaya baslamadiysanız da şimdi başlayabilirsiniz.
Sürüm Kontrol Sistemleri: Geliştirme Süreçlerindeki Acıyı Azaltır
Neyse ki sürüm kontrol sistemleri bu karmaşık isimlendirmelere gerek kalmadan kodunuzun her aşamadaki halini farklı bir sürüm olarak belirlemenizi sağlar. Bu sayede hiçbir sürümünüzü kaybetmezsiniz, sürümlerinizi sistematik olarak saklayabilir, listeleyebilir, yazılımınızda/programınızda bir problem olduğunda, sıkıntısız bir sürüme geri dönebilir, insanlar problemsiz sürümdeki ürününüzü (yazılımınızı/programınızı) kullanırken siz problemli sürümünüz üzerinde çalışabilir ve düzeltince de problemsiz yeni sürümü çıkartabilirsiniz. Bunları yaparken de hiçbir yeni dosya ismi, numarası düşünmek zorunda kalmazsınız. Üstüne üstlük birden çok insanın eş zamanlı aynı dosya üzerinde çalışması da mümkündür. Bu bir sihir olmalı!
Sürüm kontrol sistemleri bir sihir değildir. Sürümleme yazılımları, yazılımcılar tarafından, yazılımcı hayatını kolaylaştırmak için hazırlanmıştır. Ayrıca sürüm kontrol sistemlerinin kullanımı, sadece yazılım/program projeleriyle sınırlı değildir. Bilgisayarınızdaki hemen her elektronik bilgiyi (yazılmış bir şey olmak zorunda değil, video, resim gibi dosyalar da gayet güzel kullanılabilir), dosyaları, dosya gruplarını (klasör) sürüm kontrol sistemleriyle yönetebilirsiniz. Sürüm kontrol sistemleri sizi yanlış yapma korkusundan arındırır, aynen dosyalarınızın düzenli olarak yedeğinin belli bir yerde bulunması gibi. Ama dosya yedekleriniz ihtiyacınız olana kadar görünüp canınızı sıkmaz.
Meşhur Sürüm Kontrol Sistemleri
Yazılım tarihinin 1900’lerin ortalarından başladığını düşünürseniz ve bu problemin daha ilk günlerden beri yaşanabileceğini düşünürseniz, çok fazla sürüm kontrol sistemi olduğunu tahmin edebilirsiniz. Bu çok fazla sürüm kontrol sistemi ana olarak iki grupta toplanır: merkezi sürüm kontrol sistemleri, dağıtık sürüm kontrol sistemleri.
Merkezi sürüm kontrol sistemleri, daha eski olmakla birlikte hala kullanımdadır. Merkezi sürüm kontrol sistemleri sunucu-istemci yapısıyla çalışmaktadır. Üzerinde çalıştığınız projenin bir sürümünü kaydetmek (o anda bir kayıdını almak) için merkezi sürüm sunucusuna, internet ya da lokal aginizdan, erişebilir durumda olmanız gerekmektedir. Merkezi sürüm sunucusu kendi makinenizde de yüklü olabilir. O durumda herhangi bir ağdan ulaşım gerekmemektedir.
Geniş kullanım kabulü görmüş, belli başlı merkezi sürüm kontrol sistemleri CVS (Concurrent Version System) ve SVN (Apache Subversion)’dir.
Dağıtık sürüm kontrol sistemleri daha yenidir ve daha esnek bir yapıya sahiptir. Merkezi sürüm kontrol sistemleriyle yapabileceğiniz hemen her şeyi dağıtık sürüm kontrol sistemleriyle yapabileceğiniz gibi ek özellikleriyle yazılımcıların hayatına güzellikler katar. Dağıtık sürüm kontrol sistemlerinde, sunucu-istemci yapısına alternatif olarak, sürümlemeler için ana makineye (sunucu) bağlı olmak gerekli değildir. Dağıtık sürüm kontrol sistemlerinde de ana bir makine (sunucu) olabilir ve ama birden çok kişinin üzerinde çalıştığı projede ana makine kaçınılmazdır. Bu sistemlerde yazılımcı hazırladığı sürümleri lokal makinesinde belirleyebilir ve zamanı geldiğinde ana makineyle eslestirebilir ayrıca diğer insanların ana makineye gönderdiği değişiklikleri kendi makinesindeki kodlarına kolaylıkla uygulayabilir.
Merkezi sürüm kontrol sistemlerindeki gibi, dağıtık sürüm kontrol sistemlerinde de genel kullanım bulmuş birkaç tanesi öne çıkar: Bazaar, Mercurial ve Git.
Şimdi Nereye? Oğlum Bak: "Git"!
Bunları öğrendiğimize göre ne yapmalıyız? Sürüm kontrol sistemlerinden bir tanesini seçip onun hakkında detaylı bilgi edinmemiz ve en küçük programlama projelerimizde bile kullanmamız gerekir. Benim tavsiyem en güncel ve günümüzde çoğu bilindik şirketin kullandığı, bu konuda en iyilerden olan Git’le bu dünyaya girmeniz.
Git, e-bergi okuyucularının yakından tanıyacağı Linux çekirdeğinin ilk programlayicisi ve Linux’e ismini vermiş insan Linus Torvalds’in Linux çekirdeğinin sürümlenmesi için başlattığı bir projedir. “yazılımcılarin %95’i kendisini en iyi %5 yazılımcı içinde zanneder” diyen Torvalds büyük ihtimalle diğer sürüm kontrol yazılımlarını beğenmemiş olmalı ki bu güzel eseri ortaya çıkarmıştır.
Git’e başlarken tabi ki öncelikle Git’i kurmalısınız. Daha sonra da hızlı bir internet makalesiyle komutları öğrenebilir ve projelerinizi (evet ödevlerinizde de kullanabilirsiniz) sürüm kontrollemeye başlayabilirsiniz. Git’le ilgili çok çeşitli kaynağa internetten erisebilirsiniz, ama benim tavsiyem kafanızda taşları yerli yerine oturtmak için görsel bir kaynaktan çalışmanız yönündedir. Bu tarz bir kaynağa bu bağlantıdan erisebilirsiniz.
Git’le biraz tecrübe kazandıktan sonra “sosyal programlama” sloganlı Git servisi sunan Github hizmetine göz atmanızda da yarar var. Günümüzde birçok önemli açık kaynak kod projesi bugün Github ile insanlığa sunulmuş durumda. Sizin de bu projelerin geliştiricilerinden birşeyler öğrenmemeniz ve bu projelere katkıda bulunup tecrübenizi artırmamanız için hiçbir sebep yok. Yeter ki ellerinizin kirlenmesinden ve birşeyleri bozmakan korkmayın.
"Her zaman bilgisayarımın telefonum kadar kolay kullanılabilir olmasını umut ettim. Bugün bu hayali gerçekleşti çünkü telefonumun nasıl kullanılacağını artık bilmiyorum." (Bjarne Stroustrup, C++’ın yaratıcısı)
"Bir şeyleri bozmuyorsan yeterince hızlı hareket etmiyorsundur." (Mark Zuckerberg, Facebook’un kurucusu ve CEO’su)