Sadece Java Kullanın
(teamten.com)- En sevdiğim dil Python. Buna rağmen her yerde — basit script'ler için bile — Java kullanıyorum.
- Birkaç deneyim:
- Java tabanlı bir şirkette test senaryolarını JavaScript ile yazdım. Ancak stack trace takibi zordu ve Java ile JavaScript arasında köprü kodu yazmak gereksiz bir uğraşa dönüştü.
- Logları JSON formatında saklıyorduk ve bir ekip arkadaşım bu logları işleyen
logcatadlı bir program yaptı. O programdan memnundum, ama daha sonra benzer bir program Java ile yazılınca 10 kattan fazla performans artışı görüldü. - Java hakkındaki zengin deneyim ve kaynaklar sayesinde, web servisi geliştirme açısından Java Python'dan daha hızlıydı. Daha doğru söylemek gerekirse, bu tek bir dili kullanmanın getirdiği bir avantaj.
- Java hakkındaki en hararetli tartışma konusu verbose olmasıdır. Ama bu aslında hiç de bir dezavantaj değil. Aşağıdaki iki koda bakın.
// java
Map<String,User> userIdMap = new HashMap<String,User>();
// python
userIdMap = {}
- Ama gerçekte Python kodunun aşağıdaki gibi yazılmış olma ihtimali daha yüksektir. (Aksi halde bakımı gerçekten çok zor olurdu.)
# Map from user ID to User object.
userIdMap = {}
- Yani dinamik tipli bir dil kullanmak, 30 dakikada havalı bir şey yapmak için 14 gün sonrasındaki üretkenliği feda etmek gibidir.
- Stack Overflow, ASP.NET kullanarak (2010'da) 5 sunucuyla 60,000,000 sayfa görüntülenmesini kaldırdı.
- Birim test örneğine bakalım. Birim test yazmak ve bakımını yapmak zaman alır. Özellikle tiplerle kolayca doğrulanabilecek istisna durumları, dinamik tipli dillerdeki unit test'lerle de pek iyi yakalanmaz (ör. parser).
- (Python kullanmama nedenlerinden birini daha eklemek gerekirse) geçici çözüm olarak yazılan bir quick hack zamanla büyüyüp çok önemli bir araca dönüşüyor; ama onu yeniden yazacak fırsat olmadığı için her kullanımda performans ve bakım sorunlarıyla boğuşuluyor.
- Son olarak, diğer statik tipli diller yerine Java'yı tercih etme nedenleri
- C/C++ işime uygulaması zor diller
- C#'ın çapraz platform desteği yetersiz
- Scala fazla karmaşık
- D, Go gibi diğer diller işime katmak için fazla yeni
- Bu yazıyı GeekNews'e taşımamın birkaç nedeni var:
- "Ben Java'yı gerçekten seviyorum!" diyen bir yazıyı ilk kez gördüm, o yüzden ilginç geldi (sadece başlığa bakınca bir ters köşe beklemiştim...)
- Kendisinin Java ile yapılmış kendi alet çantasına sahip olması eğlenceliydi. Nedense cebinden antik silahlar çıkaran yaşlı bir adam görüntüsü canlandı gözümde.
- Ben şahsen JavaScript ve Python'ı çok seviyorum. Ama ilk bakışta bu dillerde de eğilim sanki 'bir şekilde tip ekleme' yönünde gibi görünüyor (JavaScript için TypeScript, Python için typing/mypy). Bu durumda bu yazıyı görünce, benim statik tipli dilleri (tipleri hiç zorunlu kılmayan bir şekilde) kullanmamın biraz kendini tatmin etmeye yakın bir şey olup olmadığını düşünmeden edemedim.
- Yazarın Java ve Python konusunda deneyimi olduğu için bu iki dili doğrudan karşılaştırmış, ama bunu özellikle bu kadar dar çerçevede düşünmek gerekmiyor gibi geliyor. Daha geniş bir perspektiften baktığınızda statik tipli ve dinamik tipli diller hakkında siz ne düşünüyorsunuz?
PS. Belirli bir dili anlamsız yere küçümsemeyelim :D
58 yorum
Bu fazla kişisel bir deneyim olabilir ama bence Java'da asıl sorun dilden çok JVM.
Birden fazla JVM sürümünde bellek yönetiminin düzgün çalışmadığını çok fazla yaşadım.
O zaman
pandas,numpy'yi de Java ile yapıp kullanın. Böyle iddialarda bulunanları yakında tutmamak gerekir.Java web backend için kullanılır, Python da yapay zeka için kullanılır. Performans önemliyse Rust kullanmak gerekir; zaten herkesin bildiği bir şey değil mi? Ama gelecekte yapay zekanın payının artması beklendiği için, "Acaba Java'yı bırakma zamanı geldi mi?" diye düşünülüyor. Ülkemizde "geri kalmamalıyız" şeklinde bir zihniyet de çok yaygın haha
Yapay zekaya olan talep artar ve sıradan REST API ya da basit CRUD işleri yerini alıp artık bu tür sistemler yapılmaz hale gelirse, o zaman Java'yı bırakmak mümkün olabilir.
Ayrıca projelerin her zaman tek bir dilden oluşmadığı durumlar da var; bu yüzden dil ile projenin amacını bire bir eşleştirmenin de doğru olmadığını düşünüyorum. Programlama arayüzü Python olup performansın kritik olduğu kısımlarda native code kullanılması yaygın bir durum sonuçta. Ülkemizde projeleri bu şekilde kurgulayan örnekler çok yaygın olmasa da.
Giriş yazısı biraz yetersiz kalmış. Önce orijinal metnin yazıldığı tarihi belirtseydiniz, buradakilerin en azından yarısı bunu bir ölçüde anlayışla karşılardı...
Ben de diğer kişilerin yorumlarını görünce fark ettim.
Ama ben bunun yakın zamanda yazıldığını peşinen varsaydım ve içeriği okurken hiç de tuhaf gelmedi. En azından benim için hâlâ ikna edici bir yazı.
Bundan ayrı olarak tarihlere bir göz atarım artık haha
Tartışma hararetleniyor.
İtirazınız varsa lütfen yalnızca içeriğini yazın.
Site kullanım kurallarına aykırı yorumlar silinmiştir.
Ayrıca, kullanım kurallarına uymayan faaliyetleri tekrarlayan hesaplar engellenmiştir; bilginize.
Lütfen yapıcı bir tartışma yürütün.
Ben Oracle'a (JVM) değil, Google'a (V8) güveniyorum.
Python kullandıktan sonra Java’yı ilk gördüğümde gerçekten çok ayrıntılı gelmişti, ama bugünlerde Python’a tam kapsamlı type hint eklemek için gereken kodlara bakınca artık pek de öyle görünmüyor gibi haha. Bence Java’nın asıl zayıf yanı, yöntem adlarını inanılmaz uzun yapmaya çalışan naming convention’ı olabilir.
1 Haziran 2014
Ben de statik tipli dilleri tercih ediyorum.
Dinamik tipli dillerin kullanışlı olduğu yanlar var, ancak prodüksiyon ortamında bakımın zorlaştığı durumlarla da sık sık karşılaşılıyor.
Ayrıca dinamik tipli diller genelde tasarım felsefesi olarak "basit kod yazımı"nı hedeflediği için, dil seviyesinde örtük olarak yönettikleri şeyler çok oluyor; bu yüzden optimizasyon için alanın daraldığı durumlar da epey fazla.
Sonuçta mesele, uygulama kolaylığı ile optimizasyon için geniş hareket alanı arasındaki dengeyi geliştirme ortamına göre düşünüp seçmek gibi görünüyor.
10 yıl önceki yazı, vay be
Aynen öyle lol
Java'yı bıraktıktan sonra hayatım huzura kavuştu.
Stack Overflow anketinde Java'nın popülerlik sıralamasının sürekli düşmesinin elbette geçerli nedenleri var.
Özellikle Kore'de o meşhur devlet framework'ünü Spring'e sabitlemiş olmaları yüzünden iş bulurken işe yarıyor ama,
Batı'da legacy dışında yeni bir projeye başlarken Java'yı seçmek artık neredeyse tamamen ortadan kalkmış gibi görünüyor
Bunun için geçerli nedenler olduğu doğru, ama sanırım o nedenleri farklı değerlendiriyorsunuz.
TIOBE sitesinde de programlama dili sıralamasına yalnızca referans olarak bakılması gerektiği, bunun pazar payı veya popülerlikle doğrudan ilişkili olmadığı belirtiliyor.
Sonuç olarak: Python ezici bir payla 1. sıradaysa, piyasaya çıkmış araçlar nerede?
En sık karşılaştıklarımız C/C++, .NET, Java (Kotlin) ve Swift.
Soru ve arama sayısının fazla olması, onun çok kullanılan bir dil olduğu anlamına gelmez.
Python, bilgisayar bilimi eğitimi almamış olsa bile herkesin kullanabileceği bir dildir.
Popüler olduğunu inkâr edemeyiz, ama geliştirme pazarında durum farklı.
Instagram, backend tarafında Python kullanıyor.
"Piyasaya çıkmış araç" ifadesinin tam olarak ne anlama geldiği biraz belirsiz ama... Django, FastAPI, PyTorch, NumPy, Pandas vb. araçlar zaten yeterli değil mi...?
Başlığı görünce önce yorumları merak edip geldim hahaha. Son zamanlarda dillere bel bağlama alanı gerçekten genişledi.
Maliyet tarafıyla sınırlı bakarsak, Java bellek kullanımı nedeniyle bulutta maliyetleri epey yükseltiyor. Statik dilli bir programın 100 MB, 200 MB bellekle çalışabildiği durumlarda, Java ile yazıldığında 1 GB, 2 GB gerektirmesi oldukça sık görülüyor; hafif iş parçacıkları da kütüphane uyumluluğu nedeniyle çoğu zaman kullanılamıyor.
Java da statik bir dildir ama... bellek sorunu çöp toplayıcıya veya JVM'e ilişkin bir konu; sözünü ettiğiniz "statik bir dilde 100MB, 200MB bellek gerektiren program" ise muhtemelen C, C++ gibi yerel dillere karşılık geliyor.
Halüsinasyon için özür dilerim. TT Java da statik bir dil, doğru. Bulutta çeşitli maliyetleri toplayınca 1 GB bellek başına yaklaşık 30 bin won hesaplamak gerekiyor; bu yüzden Java ile geliştirilen servislerde oldukça yüksek maliyetler ortaya çıkıyor.
İstisnalar varsa bu dinamik tipli bir dildir. Ayrı olarak, tip sistemi ile bellek kullanımının ayrı konular olduğu görüşüne katılıyorum.
Bahsettiğiniz istisnanın anlamı bana fazla geniş geliyor; biraz daha ayrıntılı açıklayabilir misiniz?
Benim bildiğim kadarıyla statik/dinamik tipli dillerin tanımı şöyleydi: Bir değişkenin tipi derleme zamanında belirleniyorsa ve bunu değiştirmek için açıkça belirtmek gerekiyorsa bu statik tipli bir dildir; dinamik tipli dil ise çalışma zamanında değişkenin tipinin istenildiği gibi belirlenebildiği ve örtük olarak da değiştirilebildiği dildir.
Runtime’da downcasting yapma gibi bir durumla karşılaşıldığında, Java’nın çalışma anında tür kontrolü yapması gerekir. Bu yüzden Java dinamiktir; bu sırada ortaya çıkan şey de istisnadır.
Temelde bu boşluk olmasaydı, istisnalara istisna demeye gerek kalmazdı.
throw, fırlatılan nesneyi global bir değişkende tutupgotoyapmak şeklindeki bir kalıp için sözdizimsel şeker olurdu.Bahsettiğinize benzer şekilde, tür denetimini çalışma zamanında yapan dillere dinamik tipli denir. Ancak bu, programda ele alınan tüm değerler için geçerlidir. Konu Java olduğuna göre Java’yı örnek alırsak, Java kodu derleme zamanında tür denetiminden geçer; ama bu, o değişkene karşılık gelecek değerin değişkenin türüyle eşleşmesi gerektiği yönünde önemli bir ima da içerir.
Tip kontrolü çalışma zamanında yapılıyor diye dinamik tipliyse, C de dinamik tipli bir dil mi oluyor?
voidpointer diye bir kavram olduğunu biliyorum; ikisi arasında ne fark var?Hangi C derleyicisi veri türü denetimini koda enjekte edip veri türü yanlış olduğunda açık bir hata üretir? Böyle bir gerçekleştirim varsa lütfen sadece bir örnek verin.
C’de bu süreçte tip kontrolü diye bir şey yok. Kayan noktalı veriyi tamsayı olarak okusanız bile hiçbir sorun çıkmıyor, değil mi? Mesele dinamik tipli olması değil, düpedüz tehlikeli olması.
Evet, C tür denetimini çalışma zamanında yapsaydı dinamik tipli bir dil olurdu.
Öyle olmadığı için statik tipli bir dildir.
voidpointer, yalnızca özgün veri türü bilinmeyen ham bir pointer'dır. Bu pointer'ın gösterdiği adreste hangi türün bulunduğu bilinemez.Benim temel görüşüm, en iyi dilin alışık olduğunuz dil olduğudur.
Katılıyorum. Bir ekipte ya da organizasyonda kullanılan dilin dışına çıkmak da çok kolay görünmüyor.
İş içeriğinin veya görev dağılımının ayrılmasının çeşitli nedenleri arasında bir de dil eklendiğinde, belirli kişiler üzerinde iş yükü artıyor ve personel değiştiğinde işin ilerlemesi duruyor. İşe alımı da etkileyen bir unsur olduğu için, teknoloji yığını seçiminin dikkatle yapılması gerektiğini düşünüyorum.
Ancak tersine, sırf alışık olunduğu için işe alım havuzu dar olan ya da işe alımdan sonra ayrıca öğrenme gerektiren bir dili ısrarla sürdürmek de ayrı bir sorun olur elbette.
Neden C#'ın çapraz platform desteğinin yetersiz olduğunu düşünüyorsunuz? Günümüzde .NET sunucu uygulamalarının çoğu zaten Linux sunucularına dağıtılıyor.
Python baştan itibaren bir karşılaştırma ölçütü değil; Kotlin ve C# ile kıyaslandığında daha ayrıntılı olduğu ve ihtiyaç duyulan pek çok özelliğin eksik olduğu doğru gibi görünüyor.
Ah, bu 10 yıl önceki bir yazıymış. Şimdi durum çok değişti.
C# de sanal makine kullanan bir dil olduğundan, çapraz platform desteğinin çok daha önce gelmiş olması gerekirdi; ama benim bildiğim kadarıyla bu ancak çok yakın zamanda çıktı. Bu yüzden bir süre daha, Windows dışındaki başka işletim sistemlerinde de çalıştırılabildiği düzeyinde bir algı sürecek gibi görünüyor.
Üstelik yılın 365 günü çalışan sunucu ağırlıklı Linux ortamlarında, ilgili sistemde 10 yıldan uzun süredir kararlılığı kanıtlanmış diğer diller yerine yeterince doğrulanmamış .NET'ten çekinilmesi de bir gerçek.
Bu anlamda, çapraz platform açısından yetersiz denmesinin sebebi bu değil mi?
Peki ama istikrarın kanıtlandığının ölçütü tam olarak nedir? Sadece kullanım süresinden mi bahsediyorsunuz, ben bunu anlayamadım doğrusu.
Bu, 10 yıl önce yazılmış bir yazı olduğu için, .NET Core daha yeni ortaya çıkmışken metin o şekilde kaleme alınmış.
.NET uygulamaları zaten Linux ve Mac'te kararlı biçimde gayet iyi çalışıyor.
Python tarzı sade sözdizimine sahip, statik tipli bir dil gibi bir şey var mı diye bakınırken tesadüfen GDScript'i keşfettim, ama bunun genel amaçlı olarak kullanılmasının zor olması çok büyük bir dezavantaj.
Fırsatınız olursa Godot üzerinden küçük bir proje yapıp GDScript'i biraz denemenizi tavsiye ederim.
Kotlin’le tanıştıktan sonra Java’ya karşı bir nefret geliştirdim...
Java'da, ne zaman bir özelliğe ihtiyaç duyulsa doğrulanmış bir doğru cevap varmış gibi hissettim.
Sadece Kotlin kullanın.
Ben de zaten bir Kotlin kullanıcısı olarak e-postayla Kotlin hakkındaki görüşlerini sormuştum; kendisi hiç kullanmadığı için deneyim aktarımında bulunmasının zor olduğunu söyleyerek yanıt vermişti.
Statik tipli dilleri seviyorum. Çünkü düşünmem gereken şeyleri azaltıyor; ben de o zamanı başka şeyleri düşünmeye ayırabiliyorum.
Java gerçekten çok kendine özgü bir konumda olan bir dil. En son işte Java’yı yaklaşık 10 küsur yıl önce kullandım ama bugün bile hobi için değil, iş için bir program geliştirmem gerekse ilk sırada değerlendireceğim diller listesinde yer alıyor.
Şu anda işte kullandığım ana diller Ada ve C, ama kişisel olarak ya da ekip içinde kullanacağımız araçları çoğunlukla PowerShell ile yazıyorum. Ama yazarken biraz zaman geçsin yeter (5 dakika bile...), kendimi "Bu değişkenin tipi neydi acaba?" diye düşünürken buluyorum. O yüzden bugünlerde tipi mutlaka açıkça belirtiyorum. (PowerShell’de değişken tanımında tip belirtmek de mümkün, atlayıp dinamik olarak kullanmak da.)
C’yi de pek sevmiyorum. Ada olsaydı derleyicinin yakalayacağı tiple ilgili hataları C hiç yakalayamıyor. C benzeri söz dizimine sahip ama Ada’nın tip sistemini destekleyen bir dil olsa ne iyi olurdu diye sık sık düşünüyorum.
Javascript ve Python bana pek sıcak gelmiyor. Perl ya da Shell Script ise... onları düşünmek bile istemiyorum.
Sanırım C dilinin temel felsefesi olan "programcıya güven" yüzünden bu kaçınılmaz...
Ah, ayrıca Java'yı severim ama Maven'dan nefret ederim.
Güzel eski günlerde Ant ile her şeyi yapabiliyordunuz!
Java'ya record ve pattern matching gibi özellikler eklenerek yavaş yavaş modern dilleri yakalıyor olması, en azından teselli verici geliyor.
Java'nın çok sayıda referansı olması güzel ama mesele sadece buysa neden C++ olmasın diye düşünüyorum.
Java'nın avantajlarına dair biraz daha fazla şey olsaydı iyi olurdu.
Ben ağırlıklı olarak C++ kullandığım için yalnızca C++'ı örnek verdim. Ben de Java'nın iyi bir dil olduğunu düşünüyorum; benim işaret etmek istediğim şey, o asıl gönderide Java'nın avantajlarına dair anlatının yetersiz olduğuydu.
"Java'yı çok seviyorum" diye yazıldıysa, ana eksen Java'nın avantajları olmalıydı ama sanki ana eksen diğer dillere yönelik eleştiriler gibi duruyor.
Belirttiğiniz gibi, Java'nın JVM'inin son derece iyi olduğunu ben de düşünüyorum.
Tamamen katılıyorum. Bunu illa Java ile sınırlayarak konuşmayalım şeklindeki çekince de aslında bu niyetteydi. Ama pek aktarılmamış gibi görünüyor..
Karşılaştırma grubunun Java ve C++ olması güvenilirliği bir anda epey düşürüyor gibi, haha
Sadece Java kullanın
Java, JVM üzerinde çalıştığı için yerel ve makine ortamını aynı şekilde kurmak mümkün. C++ ile tüm geliştiriciler ve makineler için aynı ortamı oluşturmak ise epey zaman alır. Sürdürmesi de zordur...
Asıl yazarın Java kullanmasının nedeni muhtemelen sadece C++ uygulaması zor bir iş olması gibi görünüyor. Muhtemelen Python ile C++ arasında seçim yapması gerekseydi, C++'ı seçmez miydi?
düzeltme: "son olarak diğer statik tipli dillerin neden olmadığı" -> "son olarak, diğer statik tipli diller yerine Java'yı tercih etme nedenleri"
Oduna ateş iyi tutuşuyor.. kesinlikle tavsiye
Benim istediğim yangın bu değil T_T
Sımsıcak.. öyle..