Yazılım Geliştirme Trendleri 2017/15: Functional Programming

Mustafa Ekim
Bilişim Hareketi
Published in
6 min readNov 5, 2017

En başta imperative programming vardı. Kısaca bilgisayara ne yapacağını en ince detayına kadar adım-adım ifade etmek olarak özetleyebiliriz. Herhangi bir abstraction (soyutlama) yok, her şey olduğu gibi.

Ancak, imperative programming’in yapı taşlarından olan GOTO, insan için izlemesi/anlaması/takip etmesi çok zor bir akışa neden oluyordu ve bu yüzden GOTO kullanılarak yazılan programlar kısa sürede çok karmaşık hale geldi.

Bu yüzden GOTO kullanımı “kötü” ilan edildi. GOTO yerine, bu süreci LOOP ve IF’ler ile yaratılan soyut bir katmanın (abstraction layer) altına gizlemek önerildi. Arka tarafta GOTO gene elbette çalışıyordu ancak programcılar artık sadece LOOP ve IF ifadeleri ile program yazıyordu. Bu programlama paradigmasına Structured Programming deniyor.

Dolayısıyla, güçten ve özgürlükten feda ettik. Muhtemelen performanstan da. Eskiden yapabildiğimiz bir şeyi artık yapamaz hale geldik. Ama sonuç olarak daha iyi programlar yazılmaya başlandı. Kulağa bir hayli garip geliyor. Birşeyi yapma (yapabilme) özgürlüğü kısıtlanınca, programcıların daha başarılı oluyor olması gerçekten ilginç, ancak Structured Programming kısa sürede en geçerli paradigma oldu. Artık kimse GOTO’lu günlere geri dönmek istemiyor. Eğer daha becerikli yazılımlar yazılacaksa, Structured Programming ilkelerine uygun yazılması gerektiği konusunda bir ortak görüş var.

programlama dillerinin sınıflandırılması

Sonra bir grup programcı, imperative programming’in bir başka yapı taşı olan assignment’ı (değer güncellemesi) hedef tahtasına koydu. Assignment bir değişkenin değerini güncellemektir. Örneğin name adlı değişken önce “Hello World” değerini gösteriyor iken, programın istediğimiz bir yerinde yeni bir assignment yaparak bu değişkenin değerini “Hello Space” olarak değiştirebiliyoruz. İşte bu değiştirmenin (mutation) “kötü” olduğu ve deterministik (ne yapacağı öngörülebilir) programlar yazmanın önünde bir engel olduğu iddia edilmeye başlandı. Bu grup, daha sonra Referential Transparency, Higher Order Functions .. gibi birçok yeni ilke ile birlikte Functional Programming paradigmasını ortaya attı. Bu paradigmanın da yeni “yasakları” vardı. Yine iddiaya göre, bazı araçları kullanmadan ve paylaşılan yeni (kısıtlayıcı) ilkelere göre program yazarsak, daha başarılı olabilirdik. Bu süreç içerisinde kimilerince programlama dünyasının altın çocukları olarak anılan LISP, HASKELL gibi programlama dilleri ortaya çıktı.

Sonra yine bir grup, bu sefer Pointer to Functions’ı hedef aldı ve daha iyi programlar yazmanın önündeki engel olduğunu savundu. Pointer to Functions’ların olmadığı yeni bir programlama paradigması ortaya atıldı: Nesne Tabanlı Programlama. Yazının konusu olmadığı için detaylara girmeyeceğim. Ancak buradaki önemli ayrıntı, Nesne Tabanlı Programlama, Functional Programming’in üzerine değil, Structured Programlama paradigması üzerine inşa edildi. Dolayısıyla Functional Programming’e alternatif bir yaklaşım olarak ortaya çıktı.

Son 20 yıl boyunca neredeyse tüm yazılım endüstrisi nesne temelli programlama ile gelişti. Geliştirilen neredeyse bütün kurumsal yazılımlar, üniversitelerdeki neredeyse tüm programlama dersleri, en iyi yazılım şirketleri vb. hep nesne tabanlı programlama üzerine ilerledi. Bu sırada Functional Programming, pek sesi çıkmadan ama tarihe de karışmamayı başararak kendince ilerlemeye devam etti.

Aslen nesne tabanlı programlama başarılı oldu diyebiliriz. Çok iyi ürünler geliştirildi ve halen geliştirilmeye devam ediliyor. Ancak bu 20 yıllık süreç içerisinde, nesne tabanlı programlama paradigması ile geliştirilen programlar büyürken ortaya çıkan problemleri çözmek için 100'lerce design pattern, anti pattern ve prensip geliştirildi. Gelinen şu son noktada, bu pattern ve prensipleri uygulamadan nesne tabanlı programlar geliştirirseniz, kısa sürede kötü sonuçlar elde etmeniz çok olası.

Üstelik nesne tabanlı programlamada geliştirilen bazı pattern ve prensipler, nesne tabanlı programlamanın doğasındaki sorunları ortadan kaldırmaya yönelikti. Örneğin “Composition over Inheritance” ilkesinin class hiyerarşisi oluşturmayı kötü adletmesi veya “Loose Coupling” ilkesinin nesnedeki veri-method sıkı bağını da hedef alıyor olması, bazı çarpıklıkları/çatırdamaları gösteriyordu.

Her ne kadar doğru pattern ve prinsipleri uyguladığınız zaman nesne tabanlı programlama iyi sonuçlar vermiş olsa da, programlama dünyasının en favori isimleri tarafından ağır bir şekilde eleştrilmekten kurtulamadı:

  • “Object oriented programs are offered as alternatives to correct ones” Edsger W. Dijkstra
  • “I invented the term object-oriented, and I can tell you I did not have C++ in mind.” and “Java and C++ make you think that the new ideas are like the old ones. Java is the most distressing thing to happen to computing since MS-DOS.” Alan Kay
  • “Object-oriented programming offers a sustainable way to write spaghetti code.” Paul Graham
  • “With OOP-inflected programming languages, computer software becomes more verbose, less readable, less descriptive, and harder to modify and maintain.” Richard Mansfield
  • “The OO design concept initially proved valuable in the design of graphics systems, graphical user interfaces, and certain kinds of simulation. To the surprise and gradual disillusionment of many, it has proven difficult to demonstrate significant benefits of OO outside those areas.” Eric Raymond
  • “OO seems to bring at least as many problems to the table as it solves.” Jeff Atwood
  • “C++ is a horrible language. … C++ leads to really, really bad design choices. … In other words, the only way to do good, efficient, and system-level and portable C++ ends up to limit yourself to all the things that are basically available in C. And limiting your project to C means that people don’t screw that up, and also means that you get a lot of programmers that do actually understand low-level issues and don’t screw things up with any idiotic “object model” crap.” Linus Torvalds
  • “I think that large objected-oriented programs struggle with increasing complexity as you build this large object graph of mutable objects. You know, trying to understand and keep in your mind what will happen when you call a method and what will the side effects be.” Rich Hickey
  • “I used to be enamored of object-oriented programming. I’m now finding myself leaning toward believing that it is a plot designed to destroy joy. The methodology looks clean and elegant at first, but when you actually get into real programs they rapidly turn into horrid messes.” Eric Allman
  • “Objects bind functions and data structures together in indivisible units. I think this is a fundamental error since functions and data structures belong in totally different worlds.” Joe Armstrong
  • “Object-oriented programming, whose essence is nothing more than programming using data with associated behaviors, is a powerful idea. It truly is. But it’s not always the best idea. … Sometimes data is just data and functions are just functions.” Rob Pike
  • “We now know that OOP is an experiment that failed. It is time to move on. It is time that we, as a community, admit that this idea has failed us, and we must give up on it.” Lawrence Krubner
  • “Reading an object oriented code you can’t see the big picture and it is often impossible to review all the small functions that call the one function that you modified.” Asaf Shelly

Functional Programming paradigması aşağıdaki 4 alanda daha iyi sonuç veriyor:

  • Concurrency (Pure function’lar concurrency için ideal.)
  • Test Edilebilir Kod (Nesne yönelimli programlamada kodumuzun test edilebilir olması için uyguladığımız pattern (dependency injection) ve teknikler (mocking) kod yükünü çok arttırıyor.)
  • Öngörülebilir (Deterministic/Predictable) Kod

Son 5 yıl içinde Functional Programming kendisini ispatladı. Bir yanda Scala, F# gibi diller, öte yanda React/Redux/Lodash gibi kütüphaneler Functional Programming’in haklı olduğu alanlar olduğunu ortaya koydu. Bu yüzden 2017'de iyice hızlanan bir Functional Programming trendi var.

Functional Programming’in temel ilkelerini okuduğumuzda, eğer uzun yıllar nesne temelli programlama ile yazılım geliştirmiş birisi iseniz, kısa sürede ikna oluyorsunuz. Problem olarak ortaya koydu şeyler, gerçekten de bizim sürekli başımızı ağrıtan, bizi sıkıştıran konular. Bu konularda çözümler öne sürüyor olması son derece çekici.

Bu sürecin hızlanarak devam edeceğini tahmin ediyorum.

Eğer sıfırdan yazılım kariyerine başlamak istiyorsanız, 3 aylık yoğun programlar düzenliyorum. Bilgi için: https://www.yenikodyazilimkursu.com/

Test Invite online sınav sistemi ile tanışın: İşe alım sınavları, Genel Yetenek Testleri ve İngilizce Seviye Tespit Testleri

Video kayıtlı ve zorunlu tam ekran ile güvenli online sınavlar yapmak için: https://www.testinvite.com/lang/tr/online-sinav-sistemi.html

--

--

Mustafa Ekim
Bilişim Hareketi

Software Developer & Trainer. Entrepreneur & Founder of TestInvite Exam Software — https://www.testinvite.com