Python üzerine güzelleme

Elif T. Kuş —  14 Ocak 2014 — 10 Comments

Python ile kod yazmak ayrı bir zevk…

Herkes kod yazdığı dili sever, över, en iyisi zanneder. En iyisi demiyorum ama Python’da kod yazmak ayrı bir zevk.. Neden? Geliştirme süresi diğer dillere göre daha kısadır.

Daha az matbu (boilerplate) kod

Geliştirme daha hızlıdır, çünkü gavurların ‘boilerplate’ dediği kod pek yok. Türkçe’de buna matbu kod diyebiliriz. Matbu (boilerplate) kod, koda o dilin gereği tekrar tekrar eklediğiniz koddur. Ne gibi mesela? En basitinden Java’dan ve Python’dan “Merhaba Dünya” diyelim.

Java’da:

public class HelloWorld { //Objenin sınıfını tanımlamak için kullandığımız matbu kod
    public static void main(String[] args) { //gene matbu kod
        System.out.println("Merhaba Dünya!");
    }
}

Python’da:

 print("Merhaba Dünya!")

İki program da konsola “Hello World” yazıyor. Python’da sadece konsola yazan kodu yazarken Java’da klası tanımladık, main fonksiyonunu belirttik. Bu tür kodlar ne kadar da matbu olsa geliştirme süresini uzatıyor. (‘Java kötü, Python iyi’ demiyorum kesinlikle. Java’nın yeri ayrı.)

Gene matbu koda başka bir örnek. Liste üzerinde C#’da Java’da for ile yapılan işlemler için kod kısaltılabiliyor, üstelik okunurluğu azaltmadan. C#’ta for loop üzerinden if’le dolanarak 4-5 satırda yazdığım kodu Python’da tek satırda halledebiliyorum.

C#’ta:

ArrayList firstList = new ArrayList { 1, 2, 3, 4, 5 };
ArrayList resultList = new ArrayList();

foreach (int item in firstList)
{
    if (item > 3)
    {
        int squared = item ^ 2;
        resultList.Add(squared);
        Debug.WriteLine(squared);
    }
}

 

Çıktı:

16
25

Yukardaki ve aşağıdaki kod ne yapıyor? 1’den 5’e kadar sayıların olduğu bir listenin üzerinden geziyor. Eğer sayı 3’ten büyükse, sayının karesini alıp yeni bir listeye ekliyor.

Python’da:

first_list = [1, 2, 3, 4, 5]
result_list = [y**2 for y in first_list if y > 3]
print(a_list)

Çıktı:

[16, 25]

  Piller Dahil

Piller satın aldığınız kutudan çıkıyor. Yani, sık sık lazım olan fonksiyonlar Python’un standard kütüphanesinin içinde var. Mesela bilumum string fonksiyonları, http fonksiyonları, json fonksiyonları.  Üstelik bu fonksiyonların performansları da genel olarak iyi. Java’da olsa ya ordan burdan bir kütüphane bulmanız gerekir veya kendiniz yazmanız gerekir. Java yazmış birçok kişinin vardır böyle bir Java Utils projesi. Açık kaynak edilmiş veya ‘Bir gün açık kaynak edeyim..’ diye düşünülmüş.

Örneğin log kütüphanesi. Java’da ve C#’ta bir proje başlıyorsam ilk işim ya log4net veya log4j eklemek. Python’da öyle bir ihtiyaç olmuyor. log kütüphanesini kullanıyorum. Json için genelde dışardan bir kütüphane kullanıyorum. Gerçi C#’ın hakkını yememek lazım onun da standart kütüphanesinde bir hayli fonksiyonalite var. Bunlar Python’da standart kütüphaneden çıkıyor.

Böylelikle hangi kütüphaneyeyi ekleyeyim ile uğraşmaktansa Python dokümantasyonunda aratıyorsunuz kullanıyorsunuz. Geliştirmeyi hızlandıran şeylerden biri daha.

Kod okunurluğu

Python’da girintili yazma sözdiziminin parçası. Yukardaki Java örneğinde olduğu gibi kodun okunurluğu artsın diye girintili yazıyorken Python’da bu durumlarda girintili yazmazsanız kodunuz çalışmıyor. Bu da koda bir çekidüzen getiriyor. Girintileri alakasız kodla karşılaşmanız mümkün değil. Mesela:

def contract_whitespaces_to_single_space(the_string):
    white_state = False
    new_string = ""
    for c in unicode(the_string):
        if not c in unicode(string.whitespace):
            new_string += c
            white_state = False
        elif white_state is False:
            new_string += c
            white_state = True
        else:
            white_state = True

    return new_string

Şahane bir framework: Django

Python’u daha da değerli kılan web çatısı (framework’u) Django. Aynı şekilde tabi Django aslında Python’un güzelliklerini kullanarak daha güzel hale geliyor. Yani bir yumurta-tavuk ilişkisi var.

Web uygulamalarında temelde yapılan iş veriyi alıp veritabanına yazmak sonra veritabanından okuyup evirip çevirip arayüzde göstermek. Django bize çok güzel bir altyapı sağlıyor. Bir data modeli tanımlıyorsunuz. Önce veritabanı tablolarını yarattırabiliyorsunuz. Sonra bu modelde obje oluşturma, güncelleme ve silme metodları hazır geliyor. Bu objeyi arayüzde de kullanabiliyorsunuz. Form oluşturmak tek satırlık kod. Üstelik işinize gelmeyen yerler oldu mu istediğiniz şekilde değiştirebiliyorsunuz. Hani derler ya Microsoft’un çatılarında çoğu şey hazırdır az kodla çok iş yaparsınız (Java çatılarına göre özellikle). Ama birşey değiştirmek istediğinizde ananız ağlar. Java o açıdan çok rahatır. İstediğiniz şekilde yazarsınız. Tüm kontrol sizdedir. Ama işte öyle bedavadan kod pek yoktur. Django bu iki dünyanın iyi taraflarını almış. Sandart işler yapacaksanız Django çatısını öğrendikten sonra -ki çok da uzun sürmez- çok kısa sürede uygulamalar çıkartabilirsiniz. Üstelik size uymayan yerler varsa açın Django dokümanını çok yüksek ihtimalle konfigure edebilirsiniz. Edemiyorsanız da kaynak kodunu açın. Değişmesini istediğiniz yerin kodunu kendinize göre değiştirin.  Kütüphane kodunun üstüne kendi kodunuzu çalıştırın. Tabi Django’yu biraz daha derinlemesine anlamanız gerekir ama mümkün.

Django bunun yanında size oturum (session), login, güvenlik, admin arayüzü, önbelleğe alma (caching) için altyapıyı hazır verir. İstediğinizi kullanır, istediğinizi kapatırsınız.

Öğrenmesi kolay

Bütün bu güzellikler beraberinde kolay öğrenebilirlikle geliyor. Python dilinin güzel bir tasarımı var.  Bu güzellikler şu tip prensiplerden geliyor:

  • Güzel çirkinden daha iyidir.
  • Açıkça yazmak üstü kapalı yazmaktan iyidir.
  • Basit, karmaşıktan iyidir.
  • Düz, birbirine içine yerleştirilmişten (nested) iyidir.
  • Okunabilirlik önemlidir.
  • Birşeyin bir ve sadece bir bariz yapılma yolu olmalıdır.

Python çok şahane ama herşey için değil tabi…

Python hızlı prototipleme için güzeldir. Yani mesela sıfırdan bir proje yazıyorsunuz. Gereklilikler çok net değil. Elde olanlarla çöpe atılabilir bir projeyi hızla geliştirip hem işin teknik zorluklarını araştırırsınız hem de müşteriyle üstünde tartışabilecek bir başlangıç noktası oluşturmuş olursunuz.

Küçük projeler için iyidir. İş büyüyüp obje tipleri arttı mı Python’un iyi gelen bir takım özellikleri canınızı sıkmaya başlar.

Django ile web projelerinde iyidir.

Python’la betik de yazabilirsiniz. Hem Linux’ta hem de Windows’ta çalışır üstelik, shell script’ten ve powershell’den farklı olarak.

Python pek şahane. Uzun zamandır yeni bir dil öğreneyim diye düşünüyorduysanız Python’u düşünün derim.

Referanslar

Elif T. Kuş

Posts Twitter Google+

Bu günlerde Cloud Infrastructure Engineer adı altında Scala Developer olarak çalışıyorum. Geçmişte mobil ve web uygulamları ile uğraştım. Python, Java, C#, Objective C, Android ve iOs ile kod yazdım. Lisansımda Kimya Mühendisliği okudum. Sonradan öğrenenlerdenim.

10 responses to Python üzerine güzelleme

  1. Selamlar,

    “Küçük projeler için iyidir. İş büyüyüp obje tipleri arttı mı Python’un iyi gelen bir takım özellikleri canınızı sıkmaya başlar.”

    Burayı biraz daha açabilir misin? Hangi büyük projelerde Python’la çalıştınız ve hangi özellikleri canınızı sıkmaya başladı?

    • Yıl 2008. Bir iş arama motoru projesi üzerinde çalışıyoruz. Python yeni yeni yaygınlaşmaya başlamış, bir heves projeyi Python ile yazalım dedik. Google’da çok kullanılıyormuş. Şöyle iyiymiş böyle iyiymiş.
      Proje için Python’la bir “Crawler” yazdık. Arkasından bir de bir “Parser” yazdık. Crawler çok güzel çalıştı. Threading ile ilgili bir bug’a çarptık sadece, onu toparlayınca güzel oldu. Parser başta iyi gidiyordu. Ama sonra “crawl” ettiğimiz IK sitelerinin birinin inanılmaz kırık html kodları yüzünden işi bayağı detaylandırmak durumunda kaldık. Beautiful Soup daha ilk parse denemelerinde zaten ıskartaya çıktı.
      Yapıyı anlatayım. Bir SiteAnalyzer objemiz var. Veritabanından html dosyasının lokasyonunu çekiyor. Html dosyasını parse ediyor. Veritabanına yazıyor. (Bundan üç ayrı site için üç çeşit var.)
      Biraz daha detaya girelim. Parse ediyor dedik. Parse etmek için PageAnalyzer diye bir objeyi kullanıyor. PageAnalyzer, html içeriğini “Tag”lere ve “InnerHtml”lere bölüyor. (Bundan gene her siteye özel üç çeşit var.) Arkasından bu parçaların içinden TextSearcher denen bir obje ile ilan kodu, şirket adı, pozisyon, şehir, şirket web sitesi, şehir kodu, iş tanımı, aranan özellikler bölümünü çıkarıp bir AdContent objesine atıyor. Her site için bu bilgileri nasıl çektiği değişiyor. Kiminde “tag”in id’sini kullanıyor. Kiminde DOM yapısındaki yerini kullanıyor.
      Html içeriğini “Tag”lere ve “InnerHtml”lere bölüyor dedik. Bir Chopper objesi var. Asıl parse etme işi burda gerçekleşiyor. Chopper dosya metninin üstünden geçerek içeriği bir Tag ve InnerHtml listesine dönüştürüyor. Bu objedenin üstünde ‘1. tablonun içindeki 4. tablonun içindeki 1. td’nin içeriğini ver’ tarzı metodları var. Chopper özünde metni parse edip içinde tutuyor. Bir de TextSearcher var dedik. Bu arkadaş da Chopper objesinin içinden istediğimiz verileri bulmamıza yarıyor. Bunun içinde de bir Node objesi var. Node’un içinde de aramanın çabuk olabilmesi için bir trie yapısı var.

      Sayalım obje tiplerini 1 SiteAnalyzer, SiteAnalyzer’dan türeyen 3x siteye özel SiteAnalyzer (SuperIsBulmaSitesiSiteAnalyzer mesela biri), 1 PageAnalyzer, PageAnalyzer’dan türeyen 3xPageAnalyzer, Chopper, Tag, InnerHtml, TextSearcher, Node. Etti mi 13 obje tipi? (Data objelerini saymadım. Saydıklarım iş yapan arkadaşlar.)

      Yukarda detaylarını anlattığım üzere kodda 3 soyutlama seviyesi (level of abstraction) var. Yani SuperIsBulmaSitesiPageAnalyzer’da ben bir metod implemente ederken bir alt seviyedeki TextSearcher’in altındaki Node, Chopper’in içindeki Tag benim umrumda değil. Bu detay seviyesi ile ilgilenmiyorum

      Yaşadığımız problem şu: SuperIsBulmaSitesiPageAnalyzer’da metodu yazıyoruz. Sonra çalıştırıyoruz. Çat “runtime exception” alıyoruz. Bu objenin üstünde x metodu yok. Tekrarlı bir şekilde bu olmaya başlayınca gözünü sevdiğim Java deyip tüm kodu Java’ya döndürdük. Arkadaş kodu yazarken bizi uyarmıyor, runtime’da çatlıyor. Kodun her tarafını test etmiyor olabiliriz geliştirirken. Arkadaş bunu kodu canlıda çalıştırırken de yapacak. Bir güvensizlik verdi. Java’da yanlış tipte obje kullanırsan daha yazarken IDE uyarıyor. “Dostum compiler” deyip güven içinde kodunu yazıyorsun.

      Yapıyı abartmışız gibi gözüküyor olabilir. Ama her yeni kodu ihtiyaç üzerine yazdık. İK sitesinin html kodu felaketti. Onun sayesinde parser, tarayıcının yorumlayabildiği her tür html’i parse edebiliyor. Üstelik bunu çok hızlı yapıyor. (Yani kodun içinde regex yok.)

      Python çok sevdiğim bir dil. Çok hızlı geliştirme yapılabiliyor. Pilleri içinde. Sözdizimi rahat anlaşılır. Zorunlu indentation’lar koda temizlik getiriyor. Ama en nihayetinde o da araç kutusundaki araçlardan biri. Python çekiç gibi. Hızlı geliştirme yapılır. Kısa sürede uygulamayı çıkarırsın. Python yazmaya başlamak için deli tecrübeye de gerek yok. Kod da temiz olur. Java balyoz gibi. Yerden kaldırması zor. Çok kod yazarsın. İçinden pilleri çıkmıyor. Sağdan soldan pilleri bulman lazım veya kendin yazman gerekiyor. Ama problemin üstüne çaktın mı problemi deliğine oturtursun. Önemli olan herşeyin çivi olmadığının farkına varıp doğru aracı doğru yerde kullanmak.

      • Elif T. Kuş 6 Eylül 2014 at 14:38

        Şunu da ekleyeyim. Python ile başlamamız gene de iyi oldu. Python’la prototipi yapmış olduk. Yazılımın gereklilikleri, değişiklik yapmanın daha kolay olduğu Python’da netleşti. Sonra Java’ya çevirme işi de fazla vakit almadı.

        • Çok teşekkürler cevap için 🙂 Fakat verdiğiniz detaylı cevap sorduğum soruya ait değil.

          Sorum “burayı biraz daha açabilir misin? Hangi büyük projelerde Python’la çalıştınız ve hangi özellikleri canınızı sıkmaya başladı?” idi ve cevapta bahsettiğiniz şey büyük proje değil bir crawler implementasyonu.

          “3 level of abstraction”, “büyük proje” demek değildir. Keza “Python diye bir dil çıkmış, onu deneyelim” zaten başlı başına hatalı bir bakış açısı.

          Tüm yazdığınız cevap Python’u değil dinamik dilleri eleştiriyor. Bu mantıkla Perl, PHP, JavaScript, Ruby, vs. neredeyse tüm dinamik diller sadece prototipleme için ve küçük projelerde kullanılmalı. Yazılımcının yaptığı bir hatayı tamamen dile fatura etmek sizce ne kadar mantıklı? Bu arada ben Java’ya karşı bir argüman kullanmıyorum ama yaptığınız karşılaştırma elma ve armut karşılaştırması ve çıkarımınız da biraz “tuhaf”.

          “Arkadaş kodu yazarken bizi uyarmıyor, runtime’da çatlıyor. Kodun her tarafını test etmiyor olabiliriz geliştirirken. Arkadaş bunu kodu canlıda çalıştırırken de yapacak. Bir güvensizlik verdi. Java’da yanlış tipte obje kullanırsan daha yazarken IDE uyarıyor”. Bu kısım başlı başına problem arzediyor:

          IDE’nin kodu yazarken uyarması compiler ile ilgili değil, IDE’nin static code analysis yapmasıyla alakalı bir durum. Dil de en nihayetinde bu işi yapıyor ama bunu argüman olarak sunmamalısın. PyCharm kullanırsan o da code inspection yaparak static code analysis yapar, daha kodu yazarken uyarır. Hatta PyCharm kullanırsan annotations ile static type checking’e kadar yardım eder.

          Özetle yazdığın cevapta Python değil dinamik dillerin tümü eleştiriliyor, sırf implementasyondan kaynaklı bir hata Python’u “küçük projeler için iyi, büyüyüp obje tipleri arttı mı can sıkmaya başlayan bir dil” konumuna sokmaz.

          • Elif T. Kuş 7 Eylül 2014 at 17:37

            Fatih dikkat edersen ilk yorumda alıntıladığın “İş büyüyüp obje tipleri arttı mı” diyorum. Her büyük projede kullanılmaz demiyorum. Sana anlattığım proje bana bu cümleyi yazdıran proje idi. Onun dışında sana başka büyük proje niye anlatayım anlayamadım. (“Büyük proje yazdın mı ki konuşuyorsun’ gibi bir terbiyesizliğe girmediğini varsayıyorum.)

            Amacım Java ile Python karşılaştırması yapmak değil. Python’un benim için eksik kalan kısımları anlatmaktı. Tesadüfen bu projede bu eksiği Java ile giderdik. Başka bir projede C# da olabilirdi.

            Python’u eleştiriyorum. Dediğin gibi aynı problem tüm dinamik tipleme olan dillerde var. Nitekim bu yüzden projeyi Ruby, Javascript veya Perl’e çevirmedik.

            “Python sadece prototipleme için kullanılır” dediğimi yazı ve yorumun neresinden anladın? Yazıda sondan 2. ve 3. paragrafları okumuş muydun?

            Neyi argüman olarak sunup sunmayacağımı ben karar veririm. Sen argümanı geçerli bulursun bulmazsın ikna olursun olmazsın senin bileceğin şey. Burda uslübunda problem olduğunu düşünüyorum.

            Ben dili kendi başına değerlendiririm. Dili efektik kullanmam için IDE indirmem şartsa eksiktir. Aynen Java’da “pillerin” eksik olması gibi. (IDE ile kod yazmak daha efektiftir meselesi ayrı bir konu. Karıştırmayalım.) Ha sen dersin ki benim umrumda değil. Statik tipleme yok. PyCharm bana desteği atıyor. İyi güzel. Ama bu gene de dilde statik tipleme olduğunu göstermez.

            Implementasyon kaynaklı hatanın ne olduğunu yazıda belirtmemişsin. O yüzden yorum yapamıyorum.

            “Python diye bir dil çıkmış, onu deneyelim” bakış açısının bu durum için ne açıdan hatalı olduğunu anlatmamışsın. O yüzden “bu bakış açısı doğru” demiş olmandan bir farkı yok benim için.

            Python benim için hala “küçük projeler için iyi, büyüyüp obje tipleri arttı mı can sıkmaya başlayan bir dil”. Argümanların ne yazık ki beni ikna etmedi.

            Seni ikna etmeye çalışmak gibi bir amacım yok. ‘Biraz açar mısın konuyu?’ dedin. Ben de açtım.

            Eğer beni ikna etmek gibi bir amacın varsa artık bu yorumlardan devam etmeyelim. Blogunda bir yazı ile çok çeşit objenin olduğu bir projede Python’un nasıl efektif bir şekilde kullanılabileceğini anlat. Ben de yeni birşey öğreneyim. Linki buraya yorum olarak ekleriz. Başkaları da görebilir böylelikle. (Bu arada data objeleri sayılmaz. İş yapan objeler olması gerekiyor ikna olmam için.) ‘Derdim değil, beni anlamadın ama yorumları okuyanlar anladı’ diyorsan da mesele yok zaten.

          • Mesele zaten yok, amacım kavga etmek değil, tartışıp orta noktada -okuyanların da faydalanbileceği- bir sonuca erişmek, bağcıyı dövmeye çalışmıyorum yani, ofansif cevaplar yazmaya gerek yok.

            İkna etmeye çalışmıyorum, bu zaten benim öğrenme davranışıma uygun olmaz, seni ikna etmeye çalışmam bana bir şey kazandırmaz, keşke ikna olsam da bir şeyler öğrenebilsem. Tartışmayı sürdürmem ikna olma amaçlı yani.

            Üslubumda problem yok, argüman olarak sunacağın şeye tabii ki sen karar verirsin, ben sadece bir tartışmada karşı tarafa sunduğunda zayıf olduğunu belirtmek istedim.

            “Ben dili kendi başına değerlendiririm. Dili efektik kullanmam için IDE indirmem şartsa eksiktir. Aynen Java’da “pillerin” eksik olması gibi. (IDE ile kod yazmak daha efektiftir meselesi ayrı bir konu. Karıştırmayalım.) Ha sen dersin ki benim umrumda değil. Statik tipleme yok. PyCharm bana desteği atıyor. İyi güzel. Ama bu gene de dilde statik tipleme olduğunu göstermez.”

            Java’yı da Vim’le yazarsan kodu yazarken uyarmaz, derlerken uyarır. Dil ve IDE karşılaştırmasını bu sebeple yazmıştım. Sen yukarıda “daha kodu yazarken uyarıyor” dediğinde aslında IDE’yi övmüş oldun, dille alakası yok bu argümanın demek istemiştim. Keza Python’da da abstraction’u iyi sağlarsan compile-time’da olmasa da runtime’da class oluşturulurken hata alırsın.

            “Implementasyon kaynaklı hatanın ne olduğunu yazıda belirtmemişsin. O yüzden yorum yapamıyorum.”

            Implementasyonda hata var demedim, onu sen söylemişsin zaten. ‘x methodu yok’ ise eğer, implementasyonda hata vardır. Zaten Python’dan Java’ya geçiş sebebi de bu implementasyon hatasını önceden yakalamak değil miydi anlattığın durumda?

            ‘“Python diye bir dil çıkmış, onu deneyelim” bakış açısının bu durum için ne açıdan hatalı olduğunu anlatmamışsın.’

            Herhangi bir dile yeterliliklerini, tech spec’lerini tam olarak araştırmadan “yeni çıkmış” diye başlamak hatalı bir bakış açısı, bunu demek istedim.

            Konunun agresifleşmesini istemedim şahsen, düzgün bir tartışma sürdürdüğümüze ve sonunda faydalı bir sonuca varabileceğimize inanıyordum fakat son cevabından sonra bu işin tartışma değil bir yarışa döndüğünü gördüm, yazdığın uzun cevaplar için teşekkür ederim. Yine de insanların şu ana kadar okunanlardan da bir fayda edinebileceği inancındayım 🙂

            Teşekkürler.

      • Sırf siz geliştirme yaparken test yazmıyor ve geliştirme yaptığınız dilin ne sunduğunu bilmiyor veya araştırmaya üşeniyorsunuz diye o dil sadece “prototip yapmak için iyi” olmuyor. Bir kere, “hmm X dili yaygınlaşıyor yeni projeyi bununla yazalım” diyerek zaten kağıt üzerinde işe 1-0 yenik başlıyorsunuz.

        Bir dil ile proje geliştirirken başka bir programlama disiplininden/paradigmasından/felsefesinden/bakış açısından gelen biri olarak yaşadıklarınızı anlatsanız eyvallah diyeceğim ama üzerine direkt yargıda bulunup bir de bunu blog olarak yazınca iş FUD yaymaya doğru gidiyor.

        “Yaşadığımız problem şu: SuperIsBulmaSitesiPageAnalyzer’da metodu yazıyoruz. Sonra çalıştırıyoruz. Çat “runtime exception” alıyoruz. Bu objenin üstünde x metodu yok.”

        Mesela yorumunuzdaki sırf şu iki cümle bile yukarıda bahsettiğim farklı zihniyeti(yabancıların mindset dediği şeyi kastediyorum) açığa çıkarıyor. Birincisi, eğer bu tip bir tasarımınız varsa ve nesnelerinizdeki belli metodların mutlaka implemente edilmesi gerekiyorsa abc modulünü kullanıp ilgili metodları abstractmethod olarak tanımlayabilirsiniz. Böylece çalışma zamanında daha bu nesneler yaratılmadan “hop bu sınıftan bir instance yaratamam çünkü önce x ve y metodlarını implemente etmen gerekiyor” diye hata verir, uzun süreli debug derdinden kurtulursunuz. İkincisi, yine farklı zihniyete örnek olarak Python programcıları “duck typing” severler. Pythonic bir tasarımda bariz programcı hatası olmadığı sürece bu nesnenin kimliği ne, bu nesnede şu metod var mı, bu nesnenin y metodunun döndürdüğü nesnenin tipi ne ve bu dönen nesnenin x metodu var mı vb. gibi kontrollere bel bağlamazsınız.

        Sizin Python ile proje geliştirirken yaşadığınıza benzer bir afallamayı ben de Common Lisp ile yaşadım. Common Lisp benzerlerine göre Python ve JavaScript gibi farklı bir disiplinden gelen programcılar için daha anlaşılabilir ve kolay olmasına rağmen(mesela Haskell gibi bir pure fonskyionel programlama dili değil) epey zorlandım ve halen de fonskiyonel programlamayı kavrayabilmiş değilim.

        Eğer sizin bu yazı ve yorumu yazdığınız üslupla Common Lisp ile yaşadıklarımı kaleme alsaydım muhtemelen “AI üzerine araştırma yapan akademisyenlerin ve programlama dili üzerine doktora yapan nerdlerin uğraştığı, öğrenilmesi ve kullanması zor ve pratikte/iş hayatında hiçbir faydası olmayan bir dil” deyip geçmem gerekirdi. Bloguma bir şekilde ulaşmış ve Common Lisp’i ilk kez duymuş biri bu kendinden emin görüşlerimi okusaydı, büyük ihtimalle bir daha Common Lisp’e denk geldiğinde koşarak kaçardı.

        Bir de, “programlama dillerinden konuşurken Google’dan bahsetme eşiği”ne şimdilik değinmeden geçiyorum ama ayrı bir yorumu ya da blog yazısını hakediyor.

  2. “Boilerplate code” icin “matbu kod” kullanilan bir ceviri mi? Ufak bir Google aramasi yaptim ama pek bir sey cikmadi.

    • Elif T. Kuş 4 Eylül 2014 at 09:49

      Ben kullandım. 🙂 Aradım bulamadım ben de böyle bir karşılık kullandım.

      “Boilerplate code” dilin özelliğinden dolayı değişiklik yapmadan tekrarlı bir şekilde eklediğin kod manasında kullanılıyor. Matbu özünde basılı demek ama “aynen kullanılması gereken” gibi bir manada da kullanılıyor. O yüzden uygun olduğunu düşündüm. Senin düşündüğün bir karşılık veya karşılıklar var mı?

  3. C++ ile dene!!! Yardimci olabilirim….

Yorum yapmak için