Düşünme Aracı Olarak Notation (1979)
(jsoftware.com)- Notation (Gösterim), düşünmeye yardımcı olan önemli bir araçtır ve hem matematikte hem de programlama dillerinde merkezi bir rol oynar
- APL dili, matematiksel gösterimin avantajlarını programlama dilinin çalıştırılabilirliği ve evrenselliğiyle birleştirme girişimi olarak geliştirildi
- İyi bir gösterimin özellikleri arasında yalınlık, açıklık, çağrışımsallık, ayrıntıların alt düzeye indirgenmesi ve biçimsel olarak ispatlanabilirlik yer alır
- Çeşitli matematiksel yapılar (polinomlar, dönüşümler, grafikler vb.) APL ile verimli biçimde ifade edilip dönüştürülebilir
- Gösterimin tanıtılması ve öğrenilmesi, bağlam içinde doğal biçimde gerçekleşmelidir; gösterimin yapısallığı ve genelliği de önemlidir
Düşünme Aracı Olarak Gösterim
- Kimya, botanik gibi bilim alanlarında da sistematik adlandırma, disiplinlerin gelişimini hızlandırır
- George Boole, dilin kendisinin bir düşünme aracı olduğunu vurgulamıştır
- Matematiksel gösterim, düşünmeyi destekleyen dilin temsilî örneklerinden biridir; düşünme yükünü azaltır ve düşünme gücünü artırır
- A.N. Whitehead ve Charles Babbage, matematiksel gösterimin önemini vurgulamıştır
Programlama Dillerinin Düşünme Aracı Olarak Potansiyeli
- Programlama dilleri, genellik ve açıklık gibi güçlü yönlere sahiptir
- Bilgisayar aracılığıyla fikirleri denemek ve açık düşünce deneyleri yapmak mümkündür
- Ancak çoğu programlama dili, matematiksel gösterime kıyasla düşünme aracı olarak daha zayıf kalır
- APL, açıklık ve kesinliği hedefleyerek düşünmeyi destekleyen bir gösterim olarak tasarlanmıştır
İyi Bir Gösterimin Başlıca Özellikleri
- Problemi ifade etme kolaylığı: Problemin doğrudan türettiği yapılar kolayca ifade edilebilmelidir
- Çağrışımsallık: İfade edilen biçim, benzer ya da genişletilmiş problemleri ima edebilmelidir
- Ayrıntıların alt düzeye indirgenmesi: Karmaşık ayrıntıları sadeleştirerek düşünmeyi destekleyen bir yapı sağlamalıdır
- Yalınlık: En az sayıda sembol ve kuralla geniş bir ifade alanı sunabilmelidir
- Biçimsel olarak ispatlanabilirlik: Gösterim, biçimsel ispat ve tümdengelimli akıl yürütmeye elverişli olmalıdır
APL'nin Temel Gösterim Tekniklerine Giriş
- Vektör, matris gibi dizi tabanlı yapıları doğal biçimde kullanır
- Fonksiyonlar ve işleçler, vektör/matrislere öğe bazında otomatik uygulanır
- Redüksiyon(
/), scan(\) ve iç çarpım(.) gibi işleçlerle fonksiyon bileşimleri ifade edilir ⍳,⌽,⍴,+,×,*gibi temel sembollerle zengin ifadeler kurulabilir- Tüm fonksiyonlar sağ öncelik kuralını izler; böylece parantezsiz doğal ifadeler yazılabilir
Problem Çözme ve Düşünmeyi Teşvik Eden Örnekler
- Üçgensel sayılar, faktöriyel gibi matematiksel diziler basit formüllerle ifade edilebilir
- Polinomların gösterimi ile çarpma, türev alma gibi işlemler tutarlı kurallarla özlü biçimde ele alınabilir
- Grafik kuramı (ağaçlar, geçiş kapanışı, kapsayan ağaç) da dizi işlemleriyle açık biçimde ifade edilebilir
- Permütasyonlar, Boole cebiri, sayı sistemleri dönüşümü (asal çarpanlara ayırma) gibi çeşitli alanlara genişletilebilir
Biçimsel İspat ve Yapılandırılmış Düşünce
- Tüm işlemler ve ifadeler açıkça çalıştırılabilir biçimde yazıldığından bilgisayar aracılığıyla otomatik doğrulama mümkündür
- Matematiksel tümevarım, tam arama ve özdeşliklerin listelenmesi yoluyla çeşitli biçimsel ispat örnekleri sunulur
- Redüksiyon ve scan'in bölünme özelliği (identity) ile iç çarpım işleminin birleşme ve dağılma özellikleri biçimsel olarak ispatlanır
- Newton simetrik fonksiyonları ile polinom çarpımı ve türev formülleri doğrudan ispatlanır
APL ile Geleneksel Matematiksel Gösterimin Karşılaştırılması
- APL, fonksiyonların açık tanımını, tutarlı dizi işlemlerini ve zengin bir sembol sistemini sunar
- Tüm işlemlerde öncelik kuralları yerine sağdan sola yürütme kuralı uygulanır
- Matematiksel sembol kullanımındaki karmaşıklığı azaltır ve biçimsel işleme (
formal manipulation) destek sağlar - Sözdizimi yalındır, kurallar tutarlıdır; bu da hem yeni başlayanlar hem de uzmanlar için avantaj sağlar
Gösterimin Tanıtılması ve Öğrenilme Yöntemi
- Ayrı bir "dil dersi" olmadan, bağlam içinde gerekli gösterimlerin doğal biçimde tanıtılması yaklaşımı vurgulanır
- Yeni semboller somut problem bağlamlarında sezgisel olarak öğrenilir
- Önemli olan, gösterimin zorluğundan çok onun ima ettiği farklı olanakları ve genişletilebilirliğini fark etmektir
APL'nin Genişletilebilirliği ve Öneriler
- Karmaşık sayı işlemlerini kapsayacak fonksiyon genişletmeleri önerilir
- Unique elements ve summary fonksiyonlarının standartlaştırılmasına ihtiyaç vardır
- Daha genelleştirilmiş işleçlerin eklenmesiyle vektör hesabı gibi ek konular da desteklenebilir
- Hedef, dil tasarımında açıklığı ve akıl yürütme kapasitesini artırmaktır
Verimlilik ve Açıklık Arasında Denge
- Önce açık ve analiz edilebilir bir gösterim tanımlanıp ardından optimizasyonla verimliliğin artırılması önerilir
- Algoritmanın berraklaştırılması, daha sonraki optimizasyon ve derleyici iyileştirmelerine de yardımcı olur
- APL ile yazılan temel ifadeler, hem akademik araştırmaya hem de endüstriyel uygulamalara katkı sağlayabilir
1 yorum
Hacker News yorumları
Notasyonu, shell genişletmesi gibi “bir ifadeyi başka bir ifadeyle değiştirmek” düzeyinde görmek kolaydır; ama gerçekte çok daha derindir.
Hocam, büyük keşiflerin çoğu zaman yeni bir notasyonla birlikte ortaya çıktığını anlatmıştı; yeni notasyon, “bu problemi düşünmenin yeni bir yolu” anlamına gelir.
Günümüzdeki birçok çözülmemiş problemin de güçlü bir notasyon ortaya çıktığında çözülebileceğini düşünüyorum.
Bu gerçekten güçlüdür ama Lisp tarzına daha yakındır; APL ya da Clojure tarzı ise temel tipleri gerçekten kullanışlı hâle getirmeye yöneliktir.
10 veri yapısının her birine 10’ar fonksiyon koymak yerine, 1 veri yapısına 100 fonksiyon koyma yaklaşımıdır; bu yüzden APL’de DSL oluşturmak yerine veriyi çok dikkatli tasarlayıp yerleştirdiğinizde geri kalanı yerine oturur.
Richard Feynman, gençliğinde trigonometri öğrenirken sinüs ve kosinüs notasyonunu beğenmediği için formülleri basitleştirmek ve gürültüyü azaltmak amacıyla kendi matematik sembollerini oluşturmuştu.
Sonrasında da Feynman diyagramları veya slash notation gibi örneklerle, fiziği düşünme biçimini ve ifade etme biçimini birlikte yeniden kurdu.
Küçük bir örnek olarak CoffeeScript çıktığında, lambda kısaltmaları ve çeşitli sözdizimi kolaylıkları sayesinde JavaScript kullanma biçimi ciddi ölçüde değişmiş; düşünmesi, okuması ve düzeltmesi daha kolay hâle gelmişti.
SML/Haskell ve Lisp ailesi de benzer hissettiriyor.
Brian Greene ve Barry Mazur’un şu kısa klibi de hoşunuza gidebilir: https://youtu.be/8wQepGg8tHA
Tarihsel olarak APL’i gerileten şey, tuhaf klavyelerin yanı sıra IBM’in Lotus 1-2-3’ü ve hemen ardından gelen MS Excel oldu.
Mühendislerin, akademinin, muhasebecilerin ve MBA’lilerin TI-59 ya da HP-12C’den daha iyi araçlara ihtiyacı vardı; bilgisayar bilimi tarafı ise sembolik işlemeye, yapay zekaya ve LISP’e odaklanmıştı ve sonunda sektör bu boşluğu doldurdu.
APL’in elektronik tablolardan çok daha büyük bir etkisi olabileceği ve çok daha fazla problemi çözebileceği düşünüldüğünde talihsiz bir tesadüf.
Asıl vizyon, elle yazılabilen, tutarlı ve çalıştırılabilir bir matematik notasyonuydu; ama bu hiçbir zaman tam olarak başarılamadı.
İlginizi çekerse şu yazı okunmaya değer: https://mlajtos.mu/posts/new-kind-of-paper
Para ödemeden problem çözebiliyorsunuz; derlenmiş sonucu ücretli müşterilerin önüne dağıttığınızda maliyet doğuyor.
Çözüm belirli bir alt kümeye uyuyorsa April’e taşıyıp Common Lisp üzerinden sunma yoluna da gidebilirsiniz.
Ancak APL tarafındaki insanlar genellikle çok akademik; mühendislik işlerini hızlı ve özlü biçimde çıkarabilirler, ama ortalama bir yazılım şirketinde fonksiyon sıralaması ya da Naperian functor’lardan söz açarsanız, iş arkadaşlarınız tıbbi yardıma ihtiyacınız olup olmadığından şüphelenebilir.
Yazılım geliştirmenin önemli bir kısmı, müşterilerin ve kullanıcıların konuşma ve düşünme biçimini ifade eden, bir ölçüde biçimsel bir teknik dil icat etmektir; Iverson ailesi dillerde bunu yapmak kolay değildir.
Java uzun süre her metoda hangi iş terimlerinin girip çıktığını açıkça yazdırdı ve bu bakımdan organizasyonun kavramlarını koda eşlemek kolaydı.
APL’de de veri ve fonksiyon adları verilebilir; ama uzun adları ve ad alanı yapılarını getirip dış organizasyonu koda eşlemeye başladığınız anda kısalık ve zarafet kaybolur.
ML ailesinin incelikli tip sistemlerinde bile geliştiriciler, icat edilmiş yarı-dilsel ontolojiyi organizasyon ve süreçlerle doğrudan bağlamakta zorlanır; daha sık matematiksel ya da akademik kavramları seçerler.
İkisini birden yapabilen biri varsa mümkün olur; ama çoğu zaman müşteri dünyasına çeviri tarafında iyi olmak bile yeterlidir.
The Array Cast geçen yıl Iverson’ın 1982 tarihli röportajını yeniden yayımladı: https://www.arraycast.com/episodes/episode92-iverson
Oldukça ilginç ve Turing konuşmasına göre daha erişilebilir sayılır.
1979’daki APL, bugünkü gibi tuhaf ve uçta kalmış bir dil değildi.
O zamanlar programlama dilleri bugün olduğu gibi dünya çapında kitlesel bir olgu değildi; neredeyse hepsi tuhaf ve uçtaydı, C de o dönemde oldukça yeniydi.
Biraz hoşgörülü bakarsanız APL, yoğun C’den çok da uzak olmayan bir soyutlama gibi görünür; diziler üzerinde pointer manipülasyonunu doğrudan uygulamadan bilgisayarı programlamayı sağlıyordu.
Matematiği APL [1] ya da J [2] sözdizimiyle öğreten epey ders kitabı da var.
Iverson aslında APL’i matematik için daha iyi bir sözdizimi olarak kullanmıştı; programlama uygulaması birkaç yıl sonra geldi.
[1] https://alexalejandre.com/about/#apl
[2] https://code.jsoftware.com/wiki/Books#Math_for_the_Layman
Eskiden, artık yayında olmayan bir tip teorisi podcast’i dinlemiştim; son derece anlaşılması güç bir içerikti.
Temel kavram, başka yararlı kavramlarla bağlantılı
Sapir-Whorf hipotezi de benzer; tersinden düşününce daha da ilginçleşiyor
Kusursuz olmayan bir dilde düşünülemeyen ya da düşünmesi zor olan şeyler vardır; öyleyse kullandığımız dille ifade de edemediğimiz, üzerine düşünemediğimiz şeyler olup olmadığını sormaya başlarız
Burada “dil” ve “düşünce”yi normalden daha geniş anlamda ele almak mümkün
Örneğin toplumsal etkileşim kuralları, nasıl etkileşime girdiğimizi belirler mi? Zeynep Tufekci, “Twitter and Teargas”ta Twitter’ın flash mob’ları mümkün kıldığını ama kalıcı toplumsal değişimi zorlaştırdığını söyler
Birini takip etmek, yorum yapmak ya da beğenmek gibi toplumsal mekanizmalar, birbirimizle etkileşme biçimimizi belirler ya da mümkün kılar mı? Başka mekanizmalar daha iyi kolektif düşünmeyi mümkün kılabilir
Müzik de var. Notasyondan değil; müzik, başka yollarla iyi ifade edilemeyen bir şeyi ifade eder mi?
Birkaç yabancı dil öğrenmiş biri olarak, yalnızca belirli bir dilde düşünebildiğim ve ana dilim İngilizcede düşünmesi zor olan pek çok şey var
Örneğin Ukraynaca ve Rusçadaki “гулять”, İngilizcenin yakalayamadığı pek çok anlam taşır; bu dilleri öğrenmeden önce bu anlamları hiç düşünmemiştim
“Гулять” kelime anlamıyla “yürümek”tir, ama cinsel deneyimler de dahil olmak üzere deneyimlerin peşinden gitmek anlamında da kullanılır
Birinin çok erken evlendiğinden yakınırken “не нагулялся”, yani “yeterince yürüyemedi” denebilir
İngilizcede “sow his wild oats” gibi benzer ifadeler olsa da, “yürümek” fiilinin tek başına bu kadar çok anlam taşıması, hayatı yürüyerek kat etme düşüncesini baştan değiştirir
Arapça öğrendiğimde de yalnızca o dilde ortaya çıkan pek çok anlam ve düşünce vardı; bunları İngilizceyle açıklamak imkânsız olduğundan değil, kısa ve öz ifade edecek bir notasyon olmadığı için uzun metinler gerekir
Kimi insanlar dil aracılığıyla başka düşüncelere yolculuk etmeyi sever, kimileri ise bu olasılık karşısında donakalır
Her zaman olduğu gibi başarı denge ve iki tarafın da varlığındadır
Matematikçiler ya da bilgisayar bilimciler için son derece bariz bir gerçek olmasına rağmen, bu fikir dilbilimciler ve “eğitimciler” arasında oldukça tartışmalı
Dilbilimsel benzeri Sapir-Whorf hipotezidir; hangi dili öğrendiğinizin düşünme biçiminizi belirlediğini ileri sürer
Doğal dil kültürel bir nesnedir ve kültürleri zayıf bir kısmi sıralamayla bile eşlemek akademide neredeyse tabu sayılır
Eğitim açısından da büyük sonuçları var; öğrenciler, karşılaştıkları problemler üzerinde gerçekten akıl yürütmelerini sağlayacak notasyonları öğrenemeyebiliyor
Açıkçası bu kısmı pek iyi anlamıyorum
Herhangi bir dili konuşan kişinin aynı matematiği ya da bilgisayar programını öğrenebilmesi bunu gösterir
Sözlü ya da yazılı dilin düşünce için mutlaka gerekli olup olmadığı da şüpheli
En azından dil olmadan da mümkün olan geniş bir düşünce alanı var; insanlar da bir zamanlar hiç konuşmuyordu ya da çok az konuşuyordu ve iletişim kurma düşüncesi ile niyeti sözcükleri ve dili yarattı
Bu yüzden öğrenilmiş dili düşüncenin temel modeli olarak görmek tuhaf geliyor
Örneğin bir toplum denizin rengiyle otun rengini aynı sözcükle adlandırıyor diye, bu iki rengin farkını deneyimleyemedikleri bile iddia edilebiliyor
Deneyimi benzer biçimde belleğe kodladıkları anlamında değil, farkı göremedikleri anlamında
Bir dilde olmayan sesleri hiç duyamadıkları iddiası da buna benzer
Buradaki notasyon tartışması ise bundan çok, sözcük dağarcığının keşif için kullanılabileceği fikrine daha yakın
Yalnızca bir ses duyduğunu değil, müzik duyduğunu ve belirli bir akor ilerleyişini vb. duyduğunu söyleyebilmek gibi
Şu anda APL ile bir proje geliştiriyorum
Uzun süredir backlog’da bekleyen bir işti ama artık gerçekten kod yazıyorum
İlgi duymaya başladığım zamanla tek satırlı ifadelerin ötesinde bir şeyler yazabildiğim zaman arasında epey uzun bir süre vardı
Bu sürecin başlarında bu makaleyi keşfedip içine çeker gibi okudum; şimdi ise bu kavramlar düşüncemin tam anlamıyla temeli oldu
Hatta bir mimarlık programında NAATOT öğretiyorum
Yazılım mimarisinden değil, mimari tasarımdan söz ediyorum
Iverson’ın özünü koruyacak şekilde düzenlenmiş bir sürüm kullanıyorum; gerçek matematik ve programlama kısmını ise yalnızca ana fikri gösterecek ve öğrencileri tasarım ile ifade araçlarının olanaklarını farklı düşünmeye zorlayacak kadar bıraktım
Yani fikirleri biçimlendirme süreci, bunları kendine ve başkalarına ifade etme biçimi gibi konuları ele alıyor
Daha gevşek ve açık uçlu bir programda fırsatım olursa, öğrencilerin mimari tasarım alanına uygulayacakları kendi sembol ve notasyon sistemlerini oluşturdukları bir ders yürütmeyi isterim
Eskiden yaptığım Freeform not uygulamasını bitirememiş olmama üzülüyorum
SVG aracılığıyla bağımsız web sayfalarına derlenen bir uygulamaydı ve STEM alanlarında yaygın olan teknik içerikler için gerçekten harika bir fikir olduğunu düşünüyorum
Eski kimya notu örneği burada: https://colbyn.github.io/old-school-chem-notes/dev/chemistry-1010---fall-2021/week-14-acids-and-bases.html
Şu anda nasıl bir sistem kullandığını merak ediyorum
Birkaç yıl boyunca APL’e bir tür sihir gibi baktıktan sonra bu yılın başında zaman ayırıp öğrendim.
APL ile tek bir tweet’e sığacak kadar inanılmaz fazla kod yazılabilmesi beni şaşırttı.
Eğlenceli ama kullanması zordu.
Yazdıktan sonra neredeyse her zaman “Bunu yazmak gerçekten bu kadar uzun mu sürdü?” diye düşünüyor ve başka bir araç mı kullanmalıydım diye sorguluyorum.
Ama aslında başka bir aracın çok daha uzun süreceği sezgisel olarak pek oturmuyor.
Zor ve zaman yiyen gibi hissettiren kısım, aslında problem tanımını daha sıkıştırılmış bir biçimde düzenlemeye zorlanma süreci.
Daha dik ama çok daha kısa bir yolu tırmanmaya benziyor; daha yorucu hissettiriyor ama gerçekte daha az iş var.
Bu yüzden APL’i öğrenip kullanmam gerektiğini düşünüyorum.
“Matematiksel gösterim evrensellikten yoksundur ve konuya, yazara ve bağlama göre farklı yorumlanmalıdır” şeklindeki makale öncülüne kişisel olarak katılmıyorum.
Problemin görselleştirilmesinden ve ergonomiden kopuk gösterimlerin maliyetinin büyük olduğunu düşünüyorum.
Bazı akademisyenler, karmaşıklığın büyük bölümünü gizleyerek “Eureka” türü kavrayışlar ya da beklenmedik eşdeğerlikler üretebilen gösterimleri tercih ediyor; ancak bazı durumlarda bu tam tersine bulanık ve hataya açık olabiliyor.
Yine de düşünce sürecini aktarmada önemli bir araç olduğu doğru.
Bir alan ya da yakın alanlar için yalnızca tek bir standart gösterim bulunmasının, akıl yürütme ve problem çözmenin yaratıcı, sanatsal ve keşifçi yönlerini epey bastırdığını düşünüyorum.
Terry Tao’nun gösterimle ilgili harika bir açıklaması da var: https://news.ycombinator.com/item?id=23911903
Matematikte Lean, Coq gibi “enterprise” akıl yürütme sistemleri oluşturmaya yönelik çabalar var ve bu tür durumlarda evrensel bir gösterim sistemi makul.
Ama kişisel keşif söz konusuysa, elde ne varsa uydurup kullanmak daha iyi olabilir.
Kişisel olarak eğitimde bunu daha zor buldum.
Cebir dersleri vb. sırasında, öğretmen gösterimle ilgili kişisel kararlarını ve tercihlerini tutarlı ya da açık sözlü biçimde ele almadığında zorlanıyordum; tip teorisi ve mekanik ispat teorisi çalışırken matematik becerim ciddi ölçüde gelişti.
Makaledeki “ayrıntıların tabi kılınması” kavramının yeterince derinlemesine ele alınmadığını düşünüyorum
APL uygulamalarını uzun süre okuyup yazdıkça, bu kavramın soyutlamadan temelden farklı bir karmaşıklık yönetimi biçimine işaret ettiğini fark ettim
API’ler, kütüphaneler, modüller, paketler, arayüzler gibi soyutlama bariyerleriyle çevriliyiz; bunun sonucu da yüksek soyutlama kuleleri, API’leri birbirine yapıştıran geliştiriciler, donanımdan kopuş, performans üzerine akıl yürütmenin zorluğu gibi tanıdık sorunlar
APL farklı bir yaklaşımı çok rahat hale getiriyor
Soyutlama tasarlamak yerine, veriyi basit ifadelerle kolayca işlenebilecek şekilde özenle tasarlıyorsunuz
Genelde kütüphane fonksiyonlarının ya da DSL terimlerinin olacağı yerde ilkel işlemleri doğrudan kullanmak gibi
Örneğin bir string tablosu, anahtar dizisi ve değer dizisiyle vektör değerleri ve içselleştirilmiş anahtarları olan hashmap benzeri bir yapı kurup ekleme, çıktı alma ve silmeyi doğrudan APL ifadeleriyle ele alabilirsiniz
Bu yöntemin iyi yanı, her ifadenin bir kara kutu olmaması; belirli ihtiyaçlara göre doğal biçimde ayarlanabilmesi
Sıradan bir hashmap eklemesinde yeni anahtar ekleme kodu gerekir, ama burada mevcut anahtara yalnızca değer eklenebileceği ortak değişmezi kullanabilirsiniz
Bir kütüphane API’si olsaydı kullanılmayan kod yolları, birden çok ekleme fonksiyonu varyantı ya da ölü kodu ortadan kaldırmak için incelikli tip çıkarımı gerekirdi
Böyle bir yaklaşım, alanla ilgisiz kaygıların kod tabanına sızmasına yol açar
Ayrıntıları gizlemek yerine tabi kılarsanız, gerektiği kadar alana özgü ayrıntıya erişebilir; ilgisiz ayrıntıları da ihtiyaç duyulana kadar arka planda sessizce bırakabilirsiniz
Elbette APL ifadelerine çok aşina olmak gerekir, ama bunun Python ekosistemi gibi bir şeyi derinlemesine öğrenmekten çok daha büyük bir yük olduğunu sanmıyorum
Pratikte APL sembolleri arka plana çekiliyor; İngilizce sözcükleri harf harf değil de sözcük ve söz öbeği düzeyinde okur gibi anlamlı söz dizimleri olarak görünmeye başlıyor
Çoğu dilde bu imkânsızdır, ama dil yeterince özlü ve ifade gücü yüksekse epey geniş bir ölçekte yeniden mümkün hale gelir
Arthur Whitney’nin kaydırmaktan gerçekten nefret ettiği düşüncesi hep aklıma geliyor
20 dosya açıp “tanıma git”in peşinden dolaşmaya da gerek yok
Tüm program tek sayfaya sığdığında bunlar ortadan kalkar ve göz hareketleriyle gezinirsiniz
Cidden zaman ayırıp öğrenmem gerektiğini hissediyorum
Son birkaç haftadır yaşadığım sıkıntılarla da derinden örtüşüyor
Fazla sıkı bağlanmış legacy Python koduna bakıyorum; önceki tüm “iyileştirme” girişimleri, yanlış veri modelinin üstüne daha fazla soyutlama bindirmekten ibaretmiş
Kodu doğrusal biçimde okuyarak hangi metodun girdi nesnesini değiştirdiğini anlayamıyorsunuz
Bazıları değiştiriyor, bazıları değiştirmiyor; bazen de hiçbir değişiklik yapmadan aynı girdi argümanını olduğu gibi döndürüyor
Aynı arayüzü bile paylaşmayan çeşitli hesaplayıcıları döndüren bir factory’nin oluşturduğu dolambaçlar denizindense, analiz edip anlayabileceğim sihirli string’leri tercih ederim
Çünkü tüm işlemler O(n)
Genel operatörleri kullanabilirsiniz, ama değer çiftlerinin alan mantığında ne anlama geldiğini ve her işlemde doğru yapıyı nasıl koruyacağınızı dikkatle anlamanız gerekir
Programı ilk kez okuyan biri, ilkel işlemleri değil iş alanı anlamını anlamakta aynı ölçüde zorlanacaktır
Bir iyileşme varsa, karmaşıklığı başka bir yere koyduğunuz için değil, kod ile gerçek değerlerin aynı anda görülebilmesi yüzündendir diye düşünüyorum
Karmaşık programlamayı kolaylaştıran şey çalışma zamanı verisi ile kod işlemlerinin yan yana görülebilmesidir; bu yüzden IDE araçları da hata ayıklayıcıları ve inceleyicileri sürekli geliştirip programın her adımda ne yaptığını göstermeye çalışıyor
Bu bağlamda, işlemlerin bir kısmını soyutlamak da veri yapısının bir kısmını soyutlamak da olsa, iyi ve özlü yeni soyutlamalar oluşturmak hâlâ iyi bir şeydir
Örnekteki ekleme kodunun büyük bölümü istenen ek işi değil, yorumlayıcının girdirmeye izin verdiği biçimi gereken biçime dönüştüren veri temizleme işi
Asıl ekleme
⍪←;↓⍉↑()()()ise APL’nin ve yorumlayıcı giriş ayrıştırıcısının sınırlarını aşmaya yönelik giriş ayrıştırma ve dönüştürmeye daha yakınSilme kodunda da
'buggy'yi iç içe dizinin tek bir öğesi olarak bulmak için sarmak gibi, problem alanıyla ilgisiz Boolean dizileri oluşturmak gerekiyor“Vektör değerlerinden oluşan bir hashmap yapmak” ifadesi de gerçek hashing olmadığı için yanıltıcı
Yinelenen anahtar kontrolü yok, hash seçimi ya da hız ve dağılım ayarı mümkün değil; anahtarlar sırayla eklendiği için arama da yavaşlıyor
Dyalog APL’de hızlı arama için diziyi dahili hashing hedefi olarak işaretleyen sihirli yorumlayıcı komutu I-Beam 1500 de var, ama dahili soyutlamanın sızdığını sürekli akılda tutmak gerekiyor
“Başarı çukuru”, “tek bir yol olmalı”, “akla ilk gelen yöntem doğru yöntem olmalı”, “farklı işler farklı görünmeli” gibi dil ve araç tasarımındaki iyi fikirler APL’de eksik
Python ya da C#’ta
kv={'a':1, 'b':2}gibi sözdizimi doğrudan çalışır; parantez ya da iki nokta üst üste unutulursa açıkça yanlış görünür, editör ve derleyici yardımcı olurAPL uygulaması girdi/çıktıda
⎕NGET,⎕CSV,⎕JSONgibi sihirli yorumlayıcı fonksiyonlarına dayanıyor; hata işleme, loglama ve debugging de zayıfİfadenin tamamı tek parça halinde çalıştırılıyor; hook ve fork’lar yüzünden kolayca parçalamak da zor
Sonuçta çeşitli dizi şekillerini,
⊂3ün neden hiçbir şey yapmıyormuş gibi göründüğünü,⊆ile⊂arasındaki farkı, skaler genişletmeyi vb. doğru bir sezgiyle bilmeden deneme yapmak ve öğrenmek bile mümkün olmuyor“Anahtar varsa güncelle, yoksa ekle” gibi hemen erişilebilir bir kalıbı bile APL’de dallanmanın nasıl yapılacağından başlayarak yeniden düşünmek gerekiyor
Python’da
if/elsevekey in map, C#’taif/elsevemap.Contains(key)ile geçilecek bir iş, APL’de temel işlevi yeniden uygulamayı düşünmeye dönüşüyorAaron Hsu’nun iddiasına benziyor ama “itfaiye aracı” diyemeyip “yangını durdurma işini yapan kişinin arabası” demek zorunda kalınan Up-Goer 5 ya da Toki Pona gibi hissettiriyor
[1] https://docs.dyalog.com/latest/CheatSheet%20-%20I-Beams.pdf
[3] https://aplwiki.com/wiki/Scalar_extension
[4] https://xkcd.com/1133/