Apa pendapat pengembang Java tentang Scala? [Tutup]

19

Saya telah mencatat bahwa dukungan IDE sama sekali tidak baik, tetapi bahasa itu sendiri mendukung idiom pemrograman fungsional jauh lebih bersih.

Richard Warburton
sumber
3
Python adalah agamaku, jadi aku hanya peduli dengan apa yang Guido pikirkan tentang Scala. neopythonic.blogspot.com/2008/11/scala.html
Ayub
7
Scala adalah bahasa yang luar biasa sehingga tidak hanya menarik semua pikiran hebat yang dimiliki komunitas Scala, tetapi sayangnya juga banyak pembenci yang mencoba menemukan apa saja untuk menyerang bahasa dan orang-orang yang menggunakannya.
soc
@soc: Hanya untuk memperjelas: Saya tidak membenci Scala, dan orang-orang yang menggunakannya mungkin tidak bisa (tidak boleh!) tidak peduli dengan apa yang saya pikirkan. Saya pikir itu terlalu rumit. Itu saja. Kompleksitas mungkin baik-baik saja bagi mereka yang memiliki otak besar. Saya tidak :-)
Joonas Pulakka
3
Maaf, saya hanya kesal ketika orang terus mengulangi mitos tanpa mendukung klaim mereka.
soc
2
@ Soc: Ya, seluruh pertanyaan ini sepenuhnya subyektif, jadi jawaban apa pun benar, baik itu mitos atau bukan.
Joonas Pulakka

Jawaban:

18

Saya telah memprogram Scala selama lebih dari satu tahun sekarang, jadi saya akan mencoba mengatur diri saya kembali setahun untuk menjawab pertanyaan ini.

  • Kode scala lebih ringkas daripada kode Java (tidak ada setter atau pengambil, banyak tipe informasi dapat disimpulkan)
  • Dukungan bawaan untuk XML literal sangat menarik.
  • Kompatibilitas dan interoperabilitas perpustakaan Java sangat bagus
  • Dukungan untuk idiom fungsional tertentu menyegarkan (untuk pemahaman, penutupan, fungsi lambda, peta, lipat, kurangi)
  • Sepertinya tidak ada fitur keren yang pembuat bahasa tidak ingin sertakan

Poin di atas kurang lebih adalah apa yang saya pikirkan tentang Scala sebelum saya mulai mempelajarinya.

Dalam setahun, inilah yang saya temukan:

  • Membeli buku tangga adalah investasi yang bagus dan menghemat waktu saya untuk belajar sendiri
  • Sintaksnya memiliki beberapa keanehan dan kadang-kadang saya benar-benar bingung mengapa ada sesuatu yang tidak valid. Imbalannya adalah setelah Anda terbiasa, kode memiliki lebih sedikit kekacauan dan lebih mudah dibaca. Perhatikan bahwa ini bukan masalah jika Anda membaca daripada menulis kode.
  • Perpustakaan koleksi di 2.8 sangat menyenangkan untuk digunakan. Sulit untuk kembali ke Jawa.
  • XML literal itu bagus, tetapi di luar beberapa hal mendasar, saya harus menjangkau ekosistem perpustakaan Java. Lebih mudah.
  • Menggunakan perpustakaan Java dari Scala sangat mudah dan nyaman. Menggunakan kelas Scala dari Jawa sedikit lebih rumit, tetapi berhasil.
  • Saya telah beralih ke edisi komunitas IntelliJ IDEA dan meskipun tidak sempurna itu lebih dari cukup baik.
  • Pembuat bahasa benar-benar memikirkan set fitur dan semua bekerja dengan sangat baik bersama-sama. Dukungan berorientasi objek lebih baik daripada di Jawa (dengan ciri-ciri) dan Anda dapat melakukan pemrograman fungsional.
  • Ini adalah bahasa yang tampaknya dibenci oleh beberapa pengembang Java. Bagi saya, itu telah mengembalikan kesenangan pemrograman.
huynhjl
sumber
21

Yah, saya pikir Scala terlalu kompleks. Rasanya seperti C ++ karena memiliki segudang cara berbeda dalam melakukan sesuatu. Beberapa orang akan menyebutnya "kekayaan", "ekspresif" atau "kekuatan", tetapi jarak tempuh Anda mungkin berbeda-beda. Dalam banyak proyek dunia nyata Anda harus membatasi secara artifisial fitur bahasa apa yang akan Anda gunakan dan yang tidak, sehingga semua pengembang yang terlibat dapat berbicara dengan subset bahasa yang sama.

Untuk pemrograman fungsional, saya lebih suka Clojure , yang jauh lebih sederhana daripada Scala.

Biarkan perang suci dimulai ;-)

Joonas Pulakka
sumber
2
Andai saja Rich Hickey begitu peduli dengan .Net seperti halnya JVM ...
Ayub
Akan sangat membantu jika Anda menjelaskan sedikit lebih banyak tentang hal-hal yang Anda rasa terlalu rumit.
Richard Warburton
4
@Richard Warburton: Masalah kompleksitas Scala (atau, sebagaimana Martin Odersky katakan, "kekuatan dan masalah Scala: ekstensibilitasnya") telah banyak dibahas di banyak forum. Salah satu diskusi semacam itu ada di sini . Saya tidak mengatakan bahwa kompleks == buruk per se . Masalahnya adalah bahwa sementara 1% programmer paling cerdas mungkin dapat melakukan keajaiban dengan Scala, sebagian besar tidak akan "mengerti", dan itu adalah masalah untuk penggunaan dunia nyata. Ini seperti mobil Formula 1: sebagian besar orang tidak akan bisa mengendarai binatang seperti itu.
Joonas Pulakka
2
+1 Untuk menyebutkan Clojure sebagai alternatif yang valid (ketika datang ke pemrograman fungsional).
Oliver Weiler
Clojure memang hebat, tetapi apakah ia sama performannya dengan Scala? Apakah semudah refactor, tanpa semua pengetikan statis ini? (Refactoring Python cukup sulit, misalnya - Saya memang menulis refactorings untuk itu.)
9000
13

Sekitar satu tahun yang lalu, ketika saya menjadi semakin frustrasi tentang masa depan produk-produk startup saya jika saya terus menggunakan Java, saya memutuskan untuk mencoba Scala. Saya sudah memprogram dalam JavaScript dan Python pada saat itu, Ruby juga merupakan alternatif yang baik, tetapi saya sedang mencari bahasa yang diketik secara statis, lebih disukai yang bisa berjalan di JVM.

Saya benar-benar mencoba untuk menyukai Scala, saya benar-benar menyukainya, tetapi saya mendapati kode itu benar-benar jelek dan sulit dimengerti. Saya secara dramatis bertanya-tanya bahwa jika Scala adalah jawaban terbaik kami untuk Jawa, maka saya pasti kacau dan dihukum untuk terus bekerja dengan bahasa yang saya tidak sukai ...

Untungnya, tidak terlalu lama setelah itu, saya mengetahui tentang Fantom . Oh man, apa aku menyukainya! Bagi saya, itu seperti jawaban kemegahan Amerika terhadap birokrasi Jerman! Itu sesuai dengan persyaratan yang saya cari di Scala, tetapi jauh lebih elegan . Itu Vim , Eclipse dan Netbeans integrasi, baik kerangka web , dewasa produk berjalan dengan itu, kecil tapi sangat membantu masyarakat ... Dinamis dan Statis mengetik! Saya bersukacita!

(Saya bisa melanjutkan tetapi posting ini dimaksudkan untuk Scala, bukan Fantom, jadi saya berhenti di sini. Preferensi saya jelas , namun ada posting ini yang membandingkan keduanya. Saya tidak pernah bisa mengerti mengapa Fantom mendapat sedikit perhatian jika dibandingkan dengan Scala. Tapi ternyata saya bukan satu-satunya, jika Anda mendengarkan [ mp3 ] podcast ini sampai akhir.)

ivo
sumber
9

Ketika saya awalnya mencoba-coba Scala 2 tahun yang lalu, itu tampak asing dan menakutkan bagi saya. Pada titik tertentu saya menemukan bahwa bahasa inti sebenarnya jauh lebih sederhana daripada Java, tetapi sintaks dan semantiknya sangat fleksibel sehingga Anda dapat membuat konstruksi bahasa baru seperti itu, bahkan tanpa fitur makro. Sejak itu saya sepenuhnya beralih ke Scala untuk semua proyek Java saya, karena memungkinkan saya menulis tanpa terlalu banyak kode boilerplate.

Saya suka Clojure, tetapi ada beberapa situasi, di mana platform membutuhkan Anda untuk mengkompilasi bytecode statis (Android, applet, ...) dan selagi Anda bisa melakukannya, di Scala, itu ada di sana.

Sementara Scala memungkinkan Anda memecahkan banyak masalah secara fungsional, saya sering menemukan masalah ketika menggunakan kelas terasa lebih alami. Itu membuat hal-hal sedikit lebih kompleks, tetapi jauh dari kompleksitas dan rasa sakit dari C ++.

Yang paling penting bagi saya ketika saya benar-benar mulai belajar bahasa adalah bahwa saya dapat memprogram seperti yang saya lakukan di Jawa, hanya tanpa suara (sedikit seperti ketika Anda memulai Groovy), tetapi pada akhirnya Anda ingin mencoba menyelam lebih dalam ke dalam kekuatan bahasa - tumbuh bersama Anda.

Tentang pertanyaan IDE: Setelah menggunakan Emacs untuk semuanya, semua masalah IDE saya hilang :-)

boxofrats
sumber
9

Saya suka Scala karena banyak alasan, tetapi ada satu yang sering diabaikan: kesederhanaannya.

Scala mungkin tidak sesederhana, katakanlah, Oberon, tetapi itu jauh lebih sederhana daripada beberapa bahasa lain. Spesifikasi Bahasa Scala adalah ~ 160 halaman, Spesifikasi Bahasa Jawa adalah ~ 600 (hanya bahasa, bukan JVM atau perpustakaan!), Spesifikasi Bahasa ECMA-334 C # (yang AFAIK terkait dengan subset Visual C # 2.0) adalah ~ 440 halaman (ini tanpa hal-hal seperti pemahaman permintaan LINQ, ekspresi lambda, metode ekstensi, co-dan contravariance generik dynamic,, argumen opsional dengan nilai default, argumen kata kunci, var). Bahkan draf saat ini untuk ECMAScript 5.1 lebih besar di ~ 210 halaman. Dan tentu saja bahasa "default" saya sendiri, Ruby, yang ISO Draft saat ini berbobot ~ 310 halaman, yang hanya menentukan subset kecil yang hampir tidak biasa dari persimpangan Ruby 1.8.6, 1.9.1 dan 1.9.2.

Jörg W Mittag
sumber
6
Jumlah halaman dalam spesifikasi bahasa adalah ukuran yang menarik dari kerumitannya. Sungguh menakjubkan bagaimana Scala membagi pendapat tentang ini. Tidak ada yang akan mengatakan Python kompleks, atau C ++ sederhana, tetapi Scala tampaknya keduanya :-) misalnya scala-lang.org/node/7431
Joonas Pulakka
Anda dapat membangun hal-hal rumit dengan bahasa tersebut, dan beberapa akan terlihat seolah-olah itu adalah bahasa - metode dengan nama non-alnum, yang terlihat seperti kelebihan operator, yang bukan, misalnya, bukan.
pengguna tidak dikenal
2
Jumlah halaman dalam spesifikasi bahasa adalah cara TERRIBLE untuk membandingkan kompleksitas dua bahasa. Hanya untuk memberikan dua contoh: spec Java ditulis dengan cara yang hampir tutorial sedangkan spec Scala ditulis dengan cara yang sangat singkat. Atau contoh lain, C # 2.0 sebenarnya kira-kira sekompleks Java saat ini, atau mungkin sedikit lebih kompleks mengingat mesin, delegasi, dan properti "tidak aman". Tetapi seperti yang Anda perhatikan, spesifikasi C # 2.0 lebih kecil dari JLS.
James Iry
1
Sekarang, Martin Odersky telah membandingkan ukuran tata bahasa formal bahasa. Itu ukuran yang masuk akal dari satu aspek kompleksitas. Tapi itu hanya masuk akal karena tata bahasa tidak sefleksibel bahasa Inggris. Meski begitu, Anda harus berhati-hati. Seperti halnya program biasa, Anda dapat dengan mudah meregangkan atau mengecilkan tata bahasa dengan pilihan berbeda tentang cara menata mereka, berapa banyak produksi berbeda untuk dimasukkan, kelas karakter apa yang harus diasumsikan, dll.
James Iry
3
tunggu apa ? Mengapa Anda mencoba mengukur kompleksitas dengan ukuran spek? Itu ide yang mengerikan.
smartnut007
9

Inilah yang menyebalkan tentang Scala:

  • Null pointer adalah ide yang sangat buruk untuk memulai. Hoare menyebutnya "kesalahan miliaran dolar", tetapi Scala bahkan lebih buruk. Ini memiliki objek bernama null, Null, None, dan Nil. null adalah untuk interoperabilitas dengan Java. Null adalah bentuk null pointer dari spesifikasi DOM W3C, Tidak ada yang harus diganti dengan nol, dan Nil adalah sesuatu yang kosong.

  • Ketika konstruksi bahasa berubah menjadi hacky, biasanya programmer yang harus disalahkan dan bukan bahasa. Di Scala, bagaimanapun, bahasa inti sudah berisi kelas perpustakaan yang satu-satunya perilaku yang didokumentasikan adalah "Ini adalah retasan". Tidak percaya itu Cari scaladoc untuk scala.xml.Group.

  • Terakhir, Scala didokumentasikan dengan buruk. Hampir tidak ada kelas scala dalam dokumentasi resmi yang disertai dengan kode contoh. Scala secara signifikan lebih sulit untuk dipelajari daripada Java dan membutuhkan pengetahuan mendalam dalam ilmu komputer.

Untuk menghindari keliru sebagai pembenci scala, inilah yang saya sukai:

  • Saya memiliki lebih sedikit pengecualian. Saya tidak pernah memiliki ClassCastException dan sangat sedikit NullPointerExceptions ketika berinteraksi dengan Java.
  • Kode jauh lebih pendek dan lebih ringkas daripada Java
  • Ini secara intelektual menantang. Jawa terasa seperti bahasa bayi jika dibandingkan.

sumber
10
nulladalah null pointer Java, Nulladalah "tipe" itu. Noneadalah salah satu "keadaan" dari Option[T], koleksi dengan salah satu atau nol elemen. Niladalah daftar kosong. Meskipun Anda ingin membuatnya terdengar menakutkan, sebenarnya tidak. Jenis-jenis itu tidak dapat diganti atau dipertukarkan satu sama lain dan berperilaku seperti yang seharusnya.
soc
9

Scala itu kompleks. Tidak ada jalan lain! Sintaksnya sangat fleksibel dan dapat dikustomisasi dalam banyak cara (di atas semua operator / notasi infiks) - dan sistem jenis memiliki fitur yang lebih berbeda daripada bahasa lain yang saya tahu.

Jadi hal-hal yang tidak lurus seperti misalnya di Haskell: Typeclasses untuk menutupi semuanya.

Ketika Scala mencoba menyatukan pemrograman fungsional, OO, pemrograman prosedural dan perpustakaan java serta ide-ide sendiri, kami akhirnya berakhir dengan banyak konsep yang entah bagaimana tampaknya "mengarah ke arah yang sama":

  • Nilai implisit
  • Fungsi tersirat
  • Eksistensial
  • Kartu liar
  • Sifat
  • Antarmuka
  • Kelas abstrak
  • Kelas kasus
  • Jenis struktural
  • Kendala umum
  • Lihat batas
  • Jenis anonim

Memilih di antara mereka tampaknya sulit pada awalnya dan orang mungkin dengan mudah bertanya-tanya apakah seseorang telah menemukan solusi yang tepat untuk beberapa masalah. Bahkan sangat mudah untuk menghasilkan barang-barang yang diretas dengan menyalahgunakan implicit.

Tetapi yang menarik adalah: Scala bekerja. Kadang-kadang sulit untuk memahami mengapa (terutama mencari tahu melalui apa konversi implisit + warisan + ... beberapa objek punya fungsi X), tetapi Anda tidak perlu repot tentang hal itu sebagian besar waktu.

Tulis Scala sejelas mungkin dan itu akan berhasil. Jangan bingung dengan semua yang mungkin dan gunakan saja yang Anda butuhkan. Dan jika Anda membutuhkan sesuatu, Anda dapat yakin bahwa entah bagaimana Scala memilikinya;)

Dan semakin baik Anda, semakin Anda dapat menyesuaikan Scala dengan operator, implisit, monad, sintaks funky ... dan akhirnya mendapatkan sesuatu yang dekat dengan DSL yang akan dengan sempurna mengatasi masalah Anda.

Bagaimanapun, Anda selalu memiliki kemungkinan untuk hanya menggunakan Scala sebagai Java yang jauh lebih baik dengan sintaks yang lebih bersih, lebih mudah, inferensi jenis dan beberapa fitur fungsional.

Dario
sumber
1
"di atas semua operator / notasi infiks" - hanya saja scala tidak memiliki operator. :) Ini hanya metode.
pengguna tidak dikenal
6

Ini adalah bahasa yang sangat baik yang lebih sederhana dari Jawa dalam banyak hal.

Kebanyakan orang tidak akan suka, programmer Java atau tidak, karena alasan yang sama bahwa kebanyakan orang, programmer atau tidak, tidak suka belajar bahasa pemrograman baru. Saya menduga bahwa kebanyakan orang yang belajar bahasa pemrograman bahkan tidak suka belajar itu.

Jika Anda khawatir tentang bahasa yang rumit seperti C ++, saya akan menghindari Clojure seperti wabah. Mengeluh bahwa Scala lebih rumit daripada Clojure telah menjadi argumen mundur bagi orang-orang yang sama sekali tidak tahu tentang satu atau kedua bahasa.

Clojure memiliki makro, yang berarti Anda dapat mengubah sintaksis bahasa sebanyak yang Anda inginkan, memberi Anda tidak hanya "segudang cara berbeda dalam melakukan sesuatu" tetapi sejumlah cara yang hampir tak terbatas dalam melakukan sesuatu. Dan tidak ada sintaks baru ini yang dibuat oleh programmer dengan makro akan didokumentasikan di mana saja dalam spesifikasi bahasa.

"Tapi kita bisa menghindari menggunakan makro atau mengatur mana yang diizinkan dalam kode kita", katamu. Selamat, Anda sekarang memiliki "untuk secara artifisial membatasi fitur bahasa apa yang akan Anda gunakan dan yang tidak", yang persis seperti apa yang digunakan oleh para idiot yang mengoceh yang menggunakan Clojure of Scala sebagai alasan mereka untuk menghindari Scala untuk memulai.

Josh
sumber
6
Terima kasih atas masukan Scala vs Clojure Anda, tetapi apakah itu yang benar-benar ditanyakan oleh OP?
Martin Wickman
Poin menarik kembali: makro. Sedikit mengkhawatirkan juga. Apakah makro atau sejenisnya tersedia di Scala, atau apakah keseluruhan "batas artifisial" merupakan gangguan?
Armand
1
Ini sepertinya merupakan komentar untuk jawaban saya dan bukan jawaban untuk pertanyaan awal. Saya setuju, makro memberi Anda kekuatan tak terbatas, jadi ketika digunakan salah, mereka payah. Jadi, Anda harus menggunakannya dengan benar (hanya jika diperlukan). Ini tidak mengubah fakta bahwa bahasa Clojure adalah salah satu yang paling sederhana. Scala jelas tidak.
Joonas Pulakka
> Ini tidak mengubah fakta bahwa bahasa Clojure adalah salah satu yang paling sederhana. <Ini juga sepenuhnya salah, kecuali jika Anda menggunakan beberapa metrik seperti "jumlah konstruksi bahasa". Jika Anda menggunakan sesuatu yang bermanfaat, seperti betapa mudahnya membaca dan menulis program dalam bahasa tersebut, maka Clojure bukanlah salah satu yang paling sederhana.
Josh
Jadi, silakan terus dan beri kami metrik kompleksitas bahasa yang baik. "Betapa mudahnya untuk membaca dan menulis program dalam bahasa" benar - benar subjektif , sehingga tidak terlalu membantu di sini. Memang, menghasilkan metrik yang berguna dan obyektif mungkin hampir mustahil. (Misalnya Jörg W Mittag di bawah ini menggunakan jumlah halaman dalam spesifikasi bahasa sebagai ukuran kompleksitas. Sementara objektif, saya tidak yakin itu sangat berguna.)
Joonas Pulakka
4

Saya sangat suka jenis yang lebih terperinci dari perpustakaan Scala. Sepertinya perpustakaan koleksi baru dipikirkan dengan matang. Saya juga suka bagaimana ini mengurangi jumlah kode yang diperlukan untuk kelas sederhana, dan konsep fungsional yang ditambahkannya. Inferensi tipenya juga sangat membantu. Rasanya seperti Jawa tanpa roda pelatihan. Setelah menggunakan C # untuk sementara waktu, Scala benar-benar terasa seperti pesaing, dengan Java masih berguna tetapi tertinggal.

Matt H
sumber
2

Sebagai seorang programmer Java, saya awalnya menemukan Scala menarik. Namun, setelah mencoba-coba untuk sementara waktu (dan berlari ke hampir semua positif / negatif yang sudah terdaftar oleh orang lain), saya merasa sangat "meh" ke arah itu. Peningkatan bahasa diimbangi oleh ketersediaan toolets yang lebih rendah. Aku hanya tidak bisa menemukan alasan untuk beralih. Itu bagus, tapi itu tidak "cukup baik" untuk membuat kasus untuk beralih. Tidak memiliki faktor kegembiraan subyektif (seperti Clojure tampaknya).

Brian Knoblauch
sumber