Açık kaynak kodlu yazılım geliştirme disiplinine inanan, güvenen ve şirket olarak tüm ticari işlerimizde açık kaynaklı bileşenlerden faydalanan biri olarak, bugün bir kez daha yakından tanık olduğum bir olayın hikayesini, açık kaynaklı yazılımlarda problem çözme hızına örnek olarak gösterebilme amacıyla aktarmak istiyorum.
Şirket olarak web tabanlı işlerimizi Ruby On Rails platformuna taşıma kararı aldığımızdan itibaren, Rails üzerinde çalışmaya başladık. Rails ve altında yatan Ruby, bir çok ilginç özelliğe sahip fakat elbette bunların hepsini kullanıyor değiliz. Şu sıralar üzerinde çalıştığımız YeniHayatNetwork projesinde oldukça büyük kodlar ortaya çıktı. Tüm network içerisinde, kullanıcılar için kendi geliştirdiğimiz dinamik bir erişim kontrol sistemini (ACL) kullanıyoruz. Geçtiğimiz günlerde Rails 2.2′nin çıkmasıyla birlikte, oldukça derinlerde bir yerde değişen bir kaç satır nedeniyle, bugüne kadar farketmediğimiz bir probleme sahip olduk. ActiveRecord AssociationProxy sınıfı içerisinde Ruby’nin güçlü olduğu alanlardan biri olan method_missing blokunun tanımlamasında Rails 2.2 ile birlikte ufak bir yapısal değişikliğe gidilmiş. Burada amaç, association içerisinde kullanılan hedef obje, çağrılmak istenen metoda sahip değilse doğrudan NoMethodError istisna durumunu oluştursun ve garbage collector ve genel sistem performansına olumlu yönde bir katkıda bulunsun şeklindeymiş.
Ancak, eğer association içerisinde kullanılan hedef obje de kendi özel method_missing blokunu tanımlamış ve burada normalde sahip olmadığı bazı metodları çalışma sürecinde dinamik olarak karşılayabiliyorsa, association içerisinde yukarıda bahsettiğimiz değişiklik nedeniyle bu işlevsellik sağlanamaz hale geliyor. Zira, AssociationProxy#method_missing fonksiyonu, hedef objenin istenilen metoda yanıt verip vermediğini
target.respond_to?(method)
ile kontrol ediyor. Bizim kullanmakta olduğumuz erişim kontrol sistemi büyük ölçüde method_missing özelliğine ihtiyaç duyduğundan, sistemde association içerisinden kullanıcı objesine ulaştığımız yerlerde, kullanıcının sistemdeki haklarına ulaşamaz olduk. Elbette problemin kaynağının bu olduğunu farketmek çok kısa olmadı, ancak bir kaç saatlik uğraşıdan sonra temel nedenin bu olduğunu farkettim.
Hemen sistemimde kurulu olan Rails kodunda değişiklik yaparak problemi düzelttim. Ancak bu Rails’in oldukça derinlerinde yatan önemli bir problem olduğundan dolayı, Rails kaynak kodlarında AssociationProxy bölümüne ek yapan birilerini bulup duruma ilişkin mail attım.
Yaklaşık 3 dakika sonra yanıt gelmişti. Gözden kaçan bu durum için süreci hızlandırabilmek adına mümkünse bir patch üretmemi istedi. Bir kaç dakika sonra patch’i hazırlayıp ana Rails kaynak kodu havuzuna göndermiştim bile.
Bu örnekte belki benim farkettiğim bir problemden kaynaklanan bir sorun, aynı soruna sahip veya ileride sahip olacak ama henüz bu problemin kaynağını bulamayan veya ileride bulamayacak olan kişilerin hayatını kolaylaştırmış oluyordum. Problemin ne kadar can yakıcı olduğunu düşündüğümde, bir an bunun oldukça önemli bir değer ürettiğini düşündüm.
Hemen ardından olayın diğer tarafından bakıp, şimdiye kadar ben farketmeden başkaları tarafından çözülen yüzbinlerce problemin değerini, kendi ölçeğimde tartmaya çalıştım, kolay bir hesap olmayacağını görünce de fazla üstelemedim.
Bu örnekte de görüldüğü üzere, açık yazılımların sahiplenilme modeli, başkaları için de bir şeyler yapabilmiş olmanın hazzı ve yapılan katkılarla orantılı biçimde sizi açık yazılım camiası içerisinde dolaylı olarak onurlandırmaya dayalı sistem, yazılım dünyası için ciddi bir alternatif oluşturuyor. Teknik olmayan bileşenler de içermekle birlikte, bu geliştirme modeli yazılım geliştiricilere de karşılaştığı problemlerin hızla çözülmesi gibi bir avantaj sağlıyor.
Burada bahsettiğimiz Rails 2.2 problemi ve ilişkili patch’i de aşağıdaki adreslerde bulabilirsiniz:
Açık Yazılımlarda Hata Düzeltme Hızı
Açık kaynak kodlu yazılım geliştirme disiplinine inanan, güvenen ve şirket olarak tüm ticari işlerimizde açık kaynaklı bileşenlerden faydalanan biri olarak, bugün bir kez daha yakından tanık olduğum bir olayın hikayesini, açık kaynaklı yazılımlarda problem çözme hızına örnek olarak gösterebilme amacıyla aktarmak istiyorum.
Şirket olarak web tabanlı işlerimizi Ruby On Rails platformuna taşıma kararı aldığımızdan itibaren, Rails üzerinde çalışmaya başladık. Rails ve altında yatan Ruby, bir çok ilginç özelliğe sahip fakat elbette bunların hepsini kullanıyor değiliz. Şu sıralar üzerinde çalıştığımız YeniHayatNetwork projesinde oldukça büyük kodlar ortaya çıktı. Tüm network içerisinde, kullanıcılar için kendi geliştirdiğimiz dinamik bir erişim kontrol sistemini (ACL) kullanıyoruz. Geçtiğimiz günlerde Rails 2.2′nin çıkmasıyla birlikte, oldukça derinlerde bir yerde değişen bir kaç satır nedeniyle, bugüne kadar farketmediğimiz bir probleme sahip olduk. ActiveRecord AssociationProxy sınıfı içerisinde Ruby’nin güçlü olduğu alanlardan biri olan method_missing blokunun tanımlamasında Rails 2.2 ile birlikte ufak bir yapısal değişikliğe gidilmiş. Burada amaç, association içerisinde kullanılan hedef obje, çağrılmak istenen metoda sahip değilse doğrudan NoMethodError istisna durumunu oluştursun ve garbage collector ve genel sistem performansına olumlu yönde bir katkıda bulunsun şeklindeymiş.
Ancak, eğer association içerisinde kullanılan hedef obje de kendi özel method_missing blokunu tanımlamış ve burada normalde sahip olmadığı bazı metodları çalışma sürecinde dinamik olarak karşılayabiliyorsa, association içerisinde yukarıda bahsettiğimiz değişiklik nedeniyle bu işlevsellik sağlanamaz hale geliyor. Zira, AssociationProxy#method_missing fonksiyonu, hedef objenin istenilen metoda yanıt verip vermediğini
ile kontrol ediyor. Bizim kullanmakta olduğumuz erişim kontrol sistemi büyük ölçüde method_missing özelliğine ihtiyaç duyduğundan, sistemde association içerisinden kullanıcı objesine ulaştığımız yerlerde, kullanıcının sistemdeki haklarına ulaşamaz olduk. Elbette problemin kaynağının bu olduğunu farketmek çok kısa olmadı, ancak bir kaç saatlik uğraşıdan sonra temel nedenin bu olduğunu farkettim.
Hemen sistemimde kurulu olan Rails kodunda değişiklik yaparak problemi düzelttim. Ancak bu Rails’in oldukça derinlerinde yatan önemli bir problem olduğundan dolayı, Rails kaynak kodlarında AssociationProxy bölümüne ek yapan birilerini bulup duruma ilişkin mail attım.
Yaklaşık 3 dakika sonra yanıt gelmişti. Gözden kaçan bu durum için süreci hızlandırabilmek adına mümkünse bir patch üretmemi istedi. Bir kaç dakika sonra patch’i hazırlayıp ana Rails kaynak kodu havuzuna göndermiştim bile.
Bu örnekte belki benim farkettiğim bir problemden kaynaklanan bir sorun, aynı soruna sahip veya ileride sahip olacak ama henüz bu problemin kaynağını bulamayan veya ileride bulamayacak olan kişilerin hayatını kolaylaştırmış oluyordum. Problemin ne kadar can yakıcı olduğunu düşündüğümde, bir an bunun oldukça önemli bir değer ürettiğini düşündüm.
Hemen ardından olayın diğer tarafından bakıp, şimdiye kadar ben farketmeden başkaları tarafından çözülen yüzbinlerce problemin değerini, kendi ölçeğimde tartmaya çalıştım, kolay bir hesap olmayacağını görünce de fazla üstelemedim.
Bu örnekte de görüldüğü üzere, açık yazılımların sahiplenilme modeli, başkaları için de bir şeyler yapabilmiş olmanın hazzı ve yapılan katkılarla orantılı biçimde sizi açık yazılım camiası içerisinde dolaylı olarak onurlandırmaya dayalı sistem, yazılım dünyası için ciddi bir alternatif oluşturuyor. Teknik olmayan bileşenler de içermekle birlikte, bu geliştirme modeli yazılım geliştiricilere de karşılaştığı problemlerin hızla çözülmesi gibi bir avantaj sağlıyor.
Burada bahsettiğimiz Rails 2.2 problemi ve ilişkili patch’i de aşağıdaki adreslerde bulabilirsiniz:
http://rails.lighthouseapp.com/projects/8994/tickets/1515
http://rails.lighthouseapp.com/attachments/69117/association_proxy_fix.diff