Kaynak Kodları GitHub Üzerinden Yönetilen ve Debian Depolarında Bulunan Yazılımların Geliştirme İstatistikleri Aliye Dilara Koca 1, Recai Oktaş 2 1 Ondokuz Mayıs Üniversitesi, Fen Bilimleri Enstitüsü, Bilgisayar Mühendisliği Anabilim Dalı, Samsun 2 Ondokuz Mayıs Üniversitesi, Bilgisayar Mühendisliği Bölümü, Samsun dilara@bil.omu.edu.tr, roktas@bil.omu.edu.tr Özet: Günümüzde sürüm kontrolü ve kaynak kodlarının yönetimi amacıyla birçok yazılım çözümü bulunmakta ve kullanılmaktadır. Bunların en yaygını olan Github, Debian başta olmak üzere birçok açık kaynak kodlu yazılım projesinde sıklıkla kullanılmaktadır. Bu çalışma kapsamında kaynak kodları Github üzerinden yönetilmekte olan Debian paketlerinin geliştirme süreçlerine ait istatistiksel tespit ve değerlendirmeler yapılmıştır. Bu çalışma sayesinde Debian kaynaklarında bulunan yazılımların geliştirme evreleri hakkında yorumlanabilir ve anlamlı istatistiksel veriler üretilmiş olacaktır. Anahtar Sözcükler: Sürüm kontrolü, Github, Geliştirme Süreci. Development Statistics of Softwares, Source Code is Managed Through Github and Hosted on Debian Repositories Abstract: Today, many software solutions are used for version control and management of source code. Github is most commonly used one. Often used in many open source projects, including Debian. In this study, there is statistical analyzes of the development of Debian packages source code, which is controlled via Github. Through this study, data were collected about Debian packages on the development stage and interpretable and meaningful statistical data was produced. Keywords: Version Control, Github, Development Process. 1. Giriş Bir yazılımın geliştirilmesi süreci yazılımın ölçeğine göre değişiklik arz etmekle beraber kalabalık bir ekip tarafından sürdürülür. Bu yazılım geliştirici ekibin görev ve sorumluluklarının farklılığı, yazılımın modüler bir yapıda geliştirilmesi ihtiyacı, tüm yazılım geliştiricilerin aynı anda, aynı yazılımın geliştirilmesi üzerinde çalışması gibi zorunluluklar yazılım sektöründe bir sürüm kontrolü ve kaynak kodların yönetimi ihtiyacı doğurmuştur. Bu amaçla birbirine benzer yöntemleri kullanan birçok sürüm kontrolü ve kaynak kodu yönetimi yapan yazılım geliştirilmiştir. Github, internet üzerinden servis veren, tüm dünyadan geliştiricilerin bir arada çalışmasına imkan tanıyan, açık kaynak kodlu yazılımlara olduğu kadar özel yazılım projelerine imkan tanıyan bir kaynak kod/yazılımcı sosyal ağıdır. Github 10 milyonu aşkın üyesi, 25 milyonu aşkın kaynak deposu ile bu bağlamda en yaygın kullanıma sahip ağdır. Debian paketleri açık kaynak kodlu olarak geliştirilmektedir. Gönüllü geliştiriciler tarafından sağlanan desteğin verimli şekilde yönetilebilmesi için çeşitli sürüm takip sistemleri kullanılmaktadır. Git ise bu sürüm takip sistemlerinden biridir.
Yapılan bu çalışma ile üst geliştirici kaynak kodları Github üzerinde geliştirilen ve barındırılan Debian paketlerinin geliştirme süreci incelenmiştir. Yapılan çalışmada 26444 adet paketten elde edilen veriler ile 6 adet kriter üzerinden incelemeler yapılmıştır. 2. Sürüm Konrol Sistemi Sürüm kontrol sistemi, dosyalar üzerinde yapılan tüm değişiklikleri kaydedip versiyonlar oluşturan ve daha sonra istenilen versiyona geri dönebilmeye olanak sağlayan bir sistemdir. Bu sistem neredeyse tüm dosya türlerinde kullanılabilir. Merkezi sürüm yönetim sistemlerinde tüm kullanıcılar bütün değişikliklerini direkt olarak uzaktaki depo üzerinde yaparlar. Merkezi versiyon yönetim sistemlerinde tüm kullanıcılar bütün değişikliklerini direkt olarak uzaktaki depo (repository) üzerinde yaparlar. Merkezi olmayan sistemlerde ise birçok yerel depo (local repository) ve birçok kullanıcı ile birlikte bir adet de uzak depo (remote repository) bulunmaktadır. Bu sistemlerde, commit yapısı yapılan değişikliklerin bir mesaj ile birlikte versiyon olarak kaydedilmesini sağlar. push eylemi ise, daha önce yerel makinede commit edilmiş bütün revizyonları sırayla uzak depoya uygular. Merkezi olmayan versiyon kontrol sistemlerinin bir örneği Git'tir. Git, yerel depolar ile de çalıştığından internete bağlı olunmadığında da değişikliklerin versiyonlanması mümkündür. Github ise, Git sürüm kontrol sistemini kullanan yazılım geliştirme projeleri için web tabanlı bir depolama servisidir. 3. Depo Adreslerinin Elde Edilmesi Güncel Debian paket listesi Debian'ın kaynağından [1] alınmıştır. Listede 26444 adet paket bulunmaktadır. Bir debian paketinin.dsc uzantılı dosyası kaynak paketi tanımlayan bilgiler içerir. Bu dosya ayrılmış alanlardan oluşan bir dizi içerir. Paket listesi üzerinden üst geliştirici kaynak kodlarının bulunduğu depoların elde edilmesi için, Debian paketlerin kaynak kod bilgilerinin tutulduğu.dsc dosyalarının elde edilmesi yöntem olarak seçilmiştir. Dsc dosyaları paket listesi kullanılarak aptget komutu ile aşağıdaki şekilde (1) elde edilmiştir. $ apt-get source dsc-only paket (1) Dsc dosyasının formatı genel olarak Şekil 1 de gösterildiği formattadır. Bu formatta bazı alanların açıklamaları aşağıdaki gibidir. Source alanı, kaynak paketin adı Maintainer alanı, Deb paketi geliştiricisi bilgileri Uploader alanı, Deb paketini Debian paket havuzuna gönderen geliştiricinin bilgileri Homepage alanı, üst geliştirici kaynak paketinin paket ile ilgili bilgi veren sayfası Vsc-* alanı, paket kaynak kodunun geliştirildiği sürüm takip sistemine bağlı olarak verilen geliştirme bilgileri
Sürüm kontrol sistemi olarak Git ve depolama servisi olarak Github kullanan paketlerin seçilmesi istenilmiştir. Dsc dosyasının Homepage alanında üzerindeki adres bilgisini veren paketler, düzenli ifadeler kullanan otomatize bir yapı ile süzülmüştür. 26444 adet paket içinden süzme işlemi sonucu elde edilen paket sayısı 1137 dir. * Count(distinct(repo)) as repo_count"). * order( repo_count desc ) (3) 4. Verilerin Üretilmesi Dsc dosyalarından alınan Homepage alanlarından elde edilen Github depo sahibi kullanıcı adı ve depo adı bilgileri kullanılarak, Github API'si aracılığıyla depolara ait son 2 yıllık Commit'ler çekilmiş ve formatlanarak kaydedilmiştir. Bu sorgu işlemi için istek gönderilen adres aşağıda (2) gösterilmektedir. https://api.github.com/repos /depo-sahibi/depo/commits? Since=2013-08-20 (2) Tespit edilemeyen sebeplerden dolayı 1137 adet paket içinden 942 adet paketin Commit verilerine ulaşılabilinmiş, 195 adet paket için Github API'sinden Not found yanıtı alınmıştır. Şekil 2. Depo Sahiplerinin Depo Sayıları 6. Depolar Hakkında İncelemeler Seçilen depoların geliştirici sayıları sorgusu (4); aşağıdaki (Şekil 3) gibi sonuç Bir kayıtlı veri için, commit'in içeriğindeki değişiklikleri açıklayan yazı (message), depo sahibi (owner), depo (repo), değişiklikleri hazırlayan kişi (author), değişiklikleri gönderen kişi (committer), değişikliklerin gönderilme tarihi (date) alanları tutulmaktadır. 5. Depo Sahipleri Hakkında İncelemeler Veriseti içerisindeki hangi Github kullanıcılarının, seçilen depolardan kaçına sahip olduğu sorgusu (3); aşağıdaki (Şekil 2) gibi sonuç > Commit.group(:owner). * select( * "owner, Şekil 3. Depoların Commit Gönderen Kullanıcı Sayıları
> Commit.group(:repo). * select( * "repo, * Count(distinct(committer_login)) as committer_count"). * order( commiter_count desc ) (4) Seçilen depoların toplam commit sayıları sorgusu (5); aşağıdaki (Şekil 4) gibi sonuç > Commit.group(:repo). * select( * "repo, * Count(distinct(message)) as commit_count"). * order( commit_count desc ) (5) Şekil 5. Depoların Saatlere Göre Commit Sayıları Hata (bug) düzeltme amaçıyla gönderilen commit'lerin, genel olarak mesaj alanında fix ve fixed içerikli olarak depoya gönderildiği görülmüştür. Seçilen depoların fix commit sayıları sorgusu (7); aşağıdaki (Şekil 6) gibi sonuç Şekil 4. Depoların Commit Sayıları Seçilen depoların toplam saatlere göre commit sayıları sorgusu (6); aşağıdaki (Şekil 5) gibi sonuç > Commit. * select( "date_format(committer_date, '%H') as hour, Count(distinct(message))"). * group("hour") (6) > Commit.group(:repo). * where("message like '%fix %' or message like '%fixed%'"). * select("repo, Count(message) as mcount"). * order( mcount desc ) (7)
> Commit.group(:repo). * where("message like '% test%'"). * select("repo, Count(message) as mcount"). * order('mcount desc') (8) Şekil 6. Depoların Fix Commit Sayıları Toplam 150049 commit içinde 22096 adet fix commit bulunmaktadır. Yani gönderilen commit'lerin %15 oranında hata düzetlme amaçlı olduğu görülmektedir. Bir yazılımın doğrulanması ve geçerlenmesi süreci olan yazılım testi, yazılım geliştirme aşamaları içerisinde oldukça büyük bir yer kaplamaktadır. Yine de yazılım testine dair farkındalık gerektiği ölçüde gelişememiştir; pek çok yazılımda test edilmeyen özellikler bulunduğu gibi test edilmeyen yazılımlar da bulunmaktadır. Test ile ilgili işlemler için gönderilen commit'lerin genel olarak test dizgisini içerdiği gözlemlenmiştir. Seçilen depoların test ile ilgili olan commit sayıları sorgusu (8); yandaki (Şekil 7) gibi sonuç Şekil 7. Depoların Test ile İlgili Commit Sayıları Yazılıma dair uygulanan geliştirmelerin ne kadaranının test ile ilgili olduğunu kavramak amacıyla bir ölçüm yapılmıştır. Toplam 150049 commit içinde test ile ilgili 14522 adet commit bulunmaktadır. Yani gönderilen commit'lerin %9.2 oranında test ile ilgili olduğu görülmektedir. Ek olarak commit yazarı (author) ve depoya göndereni (committer) aynı kişi olan 148148 commit bulunurken, farklı kişiler tarafından yazılıp, depoya gönderilen 9686 commit bulunmaktadır. Kayıp olan 3 verinin API'den
gelen bilgilere göre bu alanları belirsizdir. Burada da %6.1 gibi bir oran görülmektedir. Commit gönderilirken yapılan işlemi açıklayan mesaj alanına anlaşılır açıklama yazmak önerilmektedir. Commit mesajlarının fazla ayrıntı verecek kadar uzun veya bilgi veremeyecek kadar kısa olması anlaşılırlığı olumsuz etkilemektedir. Seçilen depoların commit mesajı uzunlukları dağılımı; aşağıdaki (Şekil 8) gibi sonuç Homepage alanını düzenli doldurulmuş olan paketlerin oranıdır. Depo sahipleri hakkında yapılan inceleme (Bölüm 5., Şekil 2.) göz önüne alındığında ortalama 1 (1.38) olarak hesaplanan kullanıcı başına düşen depo sayılarının 25'e kadar çıkabildiği gözlenmiştir. Depolar hakkında yapılan incelemelere yakından bakıldığında depoya commit gönderen kullanıcı sayılarının ortalama 12 iken bu sayının 930 ile maksimum noktaya docker deposunda ulaştığı tespit edilmiştir (Bölüm 6., Şekil 3.). Depolara yapılan commit sayıları ortalama olarak 159 olarak hesaplanırken 14646 commit sayısı ile docker deposu başı çekmektedir. (Bölüm 6., Şekil 4.) Yapılan bu commitler ağırıklı olarak 15:00-23:00 saatleri arasında yoğunlaşmaktadır (Bölüm 6., Şekil 5.). Bunun yanı sıra depolara yapılan commitlerin ortalama olarak yüzde %15'inin fix commiti olduğu görülmektedir (Bölüm 6., Şekil 6). Şekil 8. Depoların Commit Mesajı Uzunluğu Dağılımı 6. Sonuç Depoların geliştirilme alışkanlıkları ve özellikleri kullanılarak, Debian paketleri için bir kalite metriği oluşturulması hedeflenmiş, bir ön çalışma olması amacıyla geliştirme istatistiklerine ulaşılmaya çalışılmıştır. Bu doğrultuda tüm Debian paketleri incelenerek, sürüm kontrol sistemi olarak Git ve depolama servisi olarak Github kullanan paketlerin geliştirici ve commit istatistikleri elde edilmiştir. Seçilen 26444 adet programdan 1137 tane programın üst geliştirici kaynak kodunun % 4.3'lük bir oranla Git sürüm takip sistemini ile geliştirildiği tespit edilmiştir. Bu yalnızca Yazılım geliştirme sürecinde büyük bir yer tutan test geliştirme süreciyle alakalı yapılan commitler analiz edildiğinde test ile alakalı commitlerin sayısının tüm commitlere oranı %9.2 olarak tespit edilmiştir (Bölüm 6., Şekil 7.). Geliştirme sürecinde geçmişe dönme, gelişim sürecinin takip edilmesi gibi bir çok alanda kolaylık sağlayan commit mesajlarının anlamlı olması gerekmektedir. Çalışmada depolara gönderilen commit mesajlarının ortalama 92 karakter uzunluğunda olup, %70 oranındaki commit'lerin bu ortalamaya eşit veya altında kalırken, %30 oranındaki commit'lerin ise sınırın üstünde olduğu görülmüştür (Bölüm 6., Şekil 8.). Ayrıca commit mesajı uzunluğunun 65535 karaktere kadar artabildiği görülmüştür.
10. Kaynaklar [1] Index of /changelogs, Ağustos 2015 (de indirildi) World Wide Web: http://metadata.ftpmaster.debian.org/changelogs/ [2] Rodin J., Aoki O., Debian New Maintainers' Guide, Ağustos 2015 (de indirildi) World Wide Web: https://www.debian.org/doc/manuals/maintguide/ [3] Github, Github Develeoper, Ağustos 2015 (de indirildi) World Wide Web: https://developer.github.com/v3/ [4] Nussbaum, L., & Zacchiroli, S. (2010). The ultimate debian database: Consolidating bazaar metadata for quality assurance and data mining. Mining Software Repositories (MSR), 2010 7th IEEE Working Conference, 52-61. IEEE. [5] Spinellis, D. (2012). Git. Yazılım, IEEE, 29(3), 100-101. [6] Knott, M. (2014). Version Control with Git. In Beginning Xcode, 371-403. Apress. [7] Shaffer, K. (2013). Push, Pull, Fork: GitHub for Academics. Hybrid Pedagogy. [8] Agrawal, K., Amreen, S., & Mockus, A. (2015). Commit quality in five high performance computing projects. Proceedings of the 2015 International Workshop on Software Engineering for High Performance Computing in Science, 24-29.