27 Şubat 2013 Çarşamba

Biyoinformatiğe Nasıl Başladım 4

Önceki yazıyı tamamlarken, gerekli disiplini nasıl aldığımdan bahsedeceğimi söylemiştim. İkinci sınıfın yazında gerçek problemlerin neye benzediğini görmek için Doç. Dr. Özlen Konu'nun laboratuvarında çalışabilmek adına bir girişimde bulundum ve mikrodizi verileriyle çalışmaya başladım. Yalnız aklınıza bugünkü tarzda mikrodizi verileri gelmesin; daha GEO ve ArrayExpress'in yaygınlaşmadığı zamanlar, sadece SMD (Stanford Microarray Database) vardı ve cDNA mikrodizi çipleri kullanılarak elde edilen veriler mevcuttu. Yaklaşık 10 yıl öncesinden bahsediyoruz ancak henüz verilerin nasıl normalize edileceğine ilişkin tam olarak belirlenmiş algoritmalar bile mevcut değildi veya yaygınlaşmamıştı.

Amacımız, farklı mikrodizi çalışmalarından elde edilen verileri biraraya getirmek ve ribozomal proteinleri meydana getiren genlerin ifade seviyelerini incelemekti. Verilerin indirilmesi biraz zaman alıyordu ancak ilk büyük problem, bu verilerin doğru ve istenilir bir biçimde biraraya getirilebilmesiydi. Bu da kendi içerisinde iki temel problemi barındırıyordu: 1) veriler etkin bir şekilde nasıl depolanabilir ki hızlı ve basit bir şekilde ulaşılabilsin, ve 2) veriler birleştirilirken en doğru nasıl yeniden şekillendirilebilir? Her birinde binlerce satır ve onlarca sütun olan verilerden bahsediyoruz, ve işin kötüsü her bir mikrodizi çipi tasarım olarak birbirinden çok farklı; ortak gen veya transkriptleri elle tespit edebilmek neredeyse imkansız. Tam bir programlama problemi ve yeni başlayan biri için de ideal zorlukta, ancak o zaman etkin bir şekilde kullanabildiğim tek dil JAVA idi ve JAVA'nın metin işleme problemleri için en iyi seçenek olmadığını rahatlıkla söyleyebilirim. Bir diğer problem de, geliştirilecek olan yazılımın herkes tarafından kullanılabilir olmasıydı, bu da beraberinde bir arayüz tasarımını gerektiriyordu. Farklı işletim sistemlerinde çalışabilir bir yazılım yerine, bir sunucuda çalışan fakat bir web arayüzü aracılığıyla ulaşılabilen bir sistem geliştirmenin daha faydalı olacağını hissetmiştim ve JAVA tabanlı bir web uygulaması geliştirme yazılımı olan JSP'ye yönelmiştim, ancak birşeyler ters gidiyordu.


Web tabanlı bir uygulama geliştirmek için HTML kodlarıyla oynayabilmek yetmez, bir de onları dinamik olarak oluşturabilmek gerekir. Yani kullanıcıyla etkileşim kurarak seçim veya kısıtlarına uygun olarak web sitesinin içeriğini değiştirebilen bir tarzdan bahsediyorum; günümüzün Facebook'u gibi. Siz sayfada bir yere tıklarsın, hatta bazen siz tıklamadan her şey güncellenir, bir şeyler değişir, ve sürekli içerik yenilenir.

Böyle bir uygulamayı geliştirmek üzere çabalarken, bir gün Can Uğur Ayfer'in odasında buldum kendimi. Yapmak istediğim şeyi anlattım, ve bana bunun için en uygun programlama dilinin Perl olduğunu, bu dilin biyoinformatik dünyasında da sıkça kullanıldığını söyledi. Usta-çırak ilişkisiyle çalışmaya başladık ve o yaz okumam için iki kitap önerdi (hatta önermekle kalmayıp birer kopyasını benim için çıktı almıştı). O'Reilly yayınlarından Learning Perl ve Mastering Regular Expressions. Learning Perl kitabının mottosu şuydu: "Kolay Şeyleri Kolay ve Zor Şeyleri Mümkün Kılmak"; bana şu sözü hatırlatıyor: "Zoru hemen yaparız, imkansız biraz zaman alır":) Sonradan farkına vardım ki, başlanabilecek en iyi iki kaynakla başlamışım Perl öğrenmeye. Çok değerli Türkçe bir kaynak da mevcut Perl öğrenebilmek için: Perl ve MySQL ile CGI programlama. Programlama dilleri ve birbirlerine göre üstünlüklerine bir başka yazıda değinmek istiyorum.   

Kitapları çabucak bitirivermiştim ve bir an önce uygulamaya geçmek istiyordum. Her hafta Uğur Hoca'mın yanına gidip geliyordum ve her seferinde verdiği ödevleri tamamlayıp bir sonraki gidişimde heyecanla çözümlerimi sunuyordum. Usta-çırak yöntemiyle öğrenmenin diğer yöntemlere göre çok büyük bir avantajı var; her seferinde yaptığımız programlama sohbetlerinde bu işin nasıl yapılması gerektiğini öğreniyordum; bunu iyi uygulamalar [best practice] olarak düşünebiliriz. Programlama derslerinde eksik olan ve bir sınıf ortamında öğrenilmesi çok zor olan şeyleri böylece öğrenebildim ve büyük ölçüde bir programlama disiplini edindim. Bir probleme nasıl yaklaşılır, nasıl algoritma geliştirilir, etkin bir arayüz nasıl hazırlanır, arka planda kullanışlı loglar nasıl tutulur vb. konularda balık tutmayı öğrendim. Bu süreçte de CIF (Common Id Finder) adında web tabanlı bir uygulama geliştirdik ve ilk HIBIT'te bir konferans makalesi olarak sunduk.

Programlamanın en güzel yanı, emek verdiğiniz şeyin sonucunu hızlı bir şekilde görebilmek. Deney yaparken bu süreç çok daha yavaş işliyor ve her bir adımda elinize geçen çıktı kendi başına büyük bir anlam ifade edemeyebiliyor. Ancak birkaç haftada geliştirdiğiniz bir web uygulamasını insanlar kullandıkça motivasyonunuz artıyor ve sürekli belirli bir limitin üzerinde kalıyor. Buna belki de "işe yarama duygusu" diyebiliriz.

CIF bir öğrenme sürecinde geliştirilmişti ve karmaşıklaştıkça yazılımın geliştirildiği sunucu bilgisayara bağımlı hale gelmişti; maalesef o dönemde bir başka bilgisayara taşınabilir hale getirememiştim. Bir gün o bilgisayarın hard diskinin ve RAM'inin "değerlendirmek" üzere alınacağını söylediler ve kurtarabildiklerim dışında geliştirdiğim birçok yazılım çöpe gitti. Tek tesellim, o günlerde çıkan bir yayında CIF'in kullanılması nedeniyle tarihe not düşülmüş olması. 

CIF'i geliştirmeye başladıktan 2 yıl sonra, makalesini yayınlamak amacıyla tekrar çalışmaya başladım ancak o sıralarda benzer bir yayının daha birkaç ay önce yayınlanmış olduğunu gördüm, üstelik neredeyse tamamen aynı arayüzle. Aklın yolu bir. Büyük bir hayal kırıklığı yaşamıştım; ancak bu, bilgiyi üretebilme kabiliyetini büyük oranda kaybetmiş bir ülkede yeni bir şey geliştirmeye çalışmanın bedeliymiş, çok sonradan öğrendim.


Sözün özü:
Herhangi bir alanda kendini geliştirmek için sistematik bir bütünlükte ilerlemek kıymetlidir ve mümkünse bir ekole dahil olmak daha da kıymetlidir; biyoinformatik için de bu kural geçerlidir. Gelişen paylaşım teknolojileriyle bir ekole dahil olma, internet üzerinden ders ve kaynak takip etme şeklinde olabilir.





Proje:
Bir programlama dilinin metin işleme kabiliyetlerini anlamak adına basit bir test yapılabilir. Bildiğiniz bir programlama diliyle, bu yazıda geçen kelimeleri sayacak (içerik bir metin dosyasına kaydedilebilir) ve çoktan aza doğru sıralayarak raporlayacak ufak bir yazılım geliştirin. Perl'de bunu 4 satırda gerçekleştirebilirsiniz.

Meraklısına:
Can Uğur Ayfer'in biriktirdiği ve paylaştığı yazılara cayfer.bilkent.edu.tr adresinden ulaşabilirsiniz; ilginizi çekecek en az birkaç yazı bulabileceğinizi düşünüyorum.