Kriteria untuk memilih bahasa untuk kursus pemrograman pertama


35

Sebagai seorang pendidik CS tingkat universitas, masalah yang mana bahasa pemrograman untuk mengajar dalam kursus pemrograman pertama sering muncul untuk diskusi. Ada ribuan bahasa untuk dipilih, dan banyak demam agama (atau demam) mendukung satu kamp bahasa di atas yang lain. Semua ini bias subjektif seputar setiap bahasa pemrograman membuatnya sangat sulit bagi seorang pendidik untuk memilih satu.

Pertanyaanku adalah:

Kriteria objektif apa yang bisa digunakan seorang pendidik untuk memilih bahasa pemrograman yang akan digunakan sebagai dasar untuk kursus pemrograman universitas tahun pertama? Apa dasar untuk kriteria ini?

Catatan : Saya tidak ingin melihat daftar bahasa pemrograman dan mengapa mereka adalah yang terbaik untuk digunakan. Pertanyaannya bukan tentang bahasa terbaik, ini tentang kriteria untuk memilih bahasa . Namun jawaban mungkin menggunakan bahasa pemrograman untuk menggambarkan poin-poin tertentu.


Pertanyaan ini terinspirasi oleh pertanyaan lain yang dianggap di luar topik: https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language .


1
Membuka meta utas tentang apakah pertanyaan ini aktif atau tidak: topik: meta.cs.stackexchange.com/questions/362/…
Dave Clarke

7
<Grabs popcorn> Mengutip Otto Neugebauer : Tidak ada bahasa pemrograman pertama yang diketahui manusia yang mampu menghancurkan semua orang.
JeffE

3
@Raphael: Saya pikir tanggapan Dijkstra mungkin adalah " Setiap bahasa pemrograman pertama yang diketahui manusia mampu menghancurkan semua orang."
JeffE

2
@ edA-qamort-ora-y, ya, mereka harus terkena beberapa paradigma pemrograman. Tidak, itu tidak bisa dilakukan pada kursus pertama.
vonbrand

3
Kami memiliki SMLhanya karena itu tidak mungkin ada siswa yang tahu bahasa itu sebelumnya. Ini menyeimbangkan setiap siswa kurang lebih pada tingkat yang sama untuk memulai kursus.
Markus Malkusch

Jawaban:


14

Saya akan melemparkan dua sen saya sendiri meskipun saya percaya subjek ini adalah jurang maut. Jangan salah paham, saya pikir ini pertanyaan yang menarik, tapi mungkin bukan yang akan kami selesaikan di sini untuk kepuasan semua orang.

Singkatnya, saya akan mengatakan bahwa bahasa itu harus melakukan apa yang Anda inginkan , dengan cara yang sederhana dan tidak ambigu mungkin, dan tidak lebih .

Pengalaman saya sendiri berasal dari bimbingan beberapa generasi siswa tahun pertama dan kedua dengan bahasa pemrograman Oberon . Orang yang tahu bahasa ini akan mengenali pengaruhnya dalam pendapat saya. Perhatikan bahwa bahasa ini digunakan untuk mengajarkan "Algoritma dan Struktur Data". Pada saat itu (saat itu), pemrograman fungsional dan desain berorientasi objek diajarkan dalam kursus terpisah pada tahun kedua.

Penting : Sebelum membahas secara spesifik bahasa apa pun, saya ingin menekankan bahwa hal yang paling penting adalah benar-benar jelas, untuk diri sendiri dan bagi siswa Anda, tentang apa tujuan kursus Anda. Apakah Anda mengajar pemrograman sendiri ? Atau algoritma dan struktur data? Atau rekayasa perangkat lunak? Sebelum memilih bahasa, ada baiknya untuk berpikir sejenak tentang ke mana Anda akan pergi dengannya. Perbedaan pada tingkat ini (tujuan) adalah apa yang mungkin, menurut pendapat saya, mengarah ke sebagian besar ketidaksepakatan tentang topik ini.

Poin-poin yang saya anggap penting mungkin tumpang tindih dengan beberapa hal yang telah dikatakan, tetapi saya percaya sebagian besar akhirnya menjadi himpunan bagian dari salah satu dari empat berikut:

  • Kesederhanaan : Para siswa biasanya di sana untuk diajarkan pemrograman, algoritma dan struktur data, dan bukan fitur dan seluk-beluk bahasa pemrograman tertentu. Wirth menggunakan kutipan Einstein "Jadikan sesederhana mungkin, tetapi tidak sesederhana" sebagai prinsip panduan dalam desain Oberon, dan ada beberapa bahasa lain di luar sana yang melakukannya juga. Bahasa pemrograman pilihan Anda harus dapat menerapkan semua konsep yang diperlukan dalam kuliah Anda, tetapi harus melakukan ini dengan set fitur / detail sekecil mungkin. Bahasa pemrograman biasanya hanya alat, bukan tujuan.

  • Ketidakjelasan : Saudara dekat dari kesederhanaan, harus ada satu konstruksi untuk setiap konsep, dengan sesedikit mungkin tumpang tindih. Anggap saja hanya ada satu cara "benar" dalam mengimplementasikan setiap konsep. Tiga jenis loop yang semantik semuanya melakukan hal yang sama? Atau lima belas cara berbeda untuk meningkatkan variabel? Tidak baik. Ini juga membuat mengoreksi pekerjaan rumah atau umumnya hanya memahami kode siswa Anda jauh lebih mudah. Asisten pengajar Anda akan menghargainya.

  • Portabilitas : Siswa akan pergi ke kelas dengan Linux, mesin Windows dan OSX, dan lingkungan pemrograman harus sama (identik) mungkin di bawah ketiganya. Hasil dari setiap program juga harus identik. Ini adalah poin lain yang asisten pengajar, yang bertanggung jawab untuk menandai pekerjaan rumah dan menangani pertanyaan / masalah, akan sangat menghargai.

  • Preferensi industri : Serius, kita harus mulai mengkhawatirkan hal ini hanya jika "Industri" sendiri memutuskan bahasa pemrograman apa yang paling disukainya. Sejak penemuan komputer ini telah menjadi target yang terus bergerak. Untuk saat ini, jika siswa Anda benar - benar belajar cara memprogram, maka itu tidak akan tergantung pada bahasa. Namun, ada beberapa bidang di mana industri berhasil menyepakati standar, misalnya VHDL untuk desain sirkuit atau SQL untuk kueri basis data, jadi ini masih merupakan poin yang valid.

Sekali lagi, bagaimana bahasa cocok dengan daftar ini sangat bergantung pada apa yang Anda coba ajarkan!


4
Sebenarnya ada pemisahan dalam desain sirkuit antara VHDL dan Verilog.
avakar

@avakar: Ah, sial. Saya akan memperbaiki ini dalam jawaban saya, terima kasih sudah menunjukkannya!
Pedro

Astaga, baca ini dan anggap itu salah satu dosen saya. +1 untuk Oberon, selama sakelar kata kunci penggunaan huruf kecil diaktifkan secara otomatis; sangat menyakitkan untuk menulis WHILE expr DO stmts ENDdll.
Callum Rogers

3
+1 untuk "apa tujuan kursus Anda?" dan catatan tambahan, salah satu tujuan paling umum meskipun tidak dieja adalah memberikan dasar-dasar untuk hal-hal lain (kursus dan magang) yang memiliki pemrograman sebagai prasyarat.
Pemrogram

Satu poin penting (setidaknya hari ini) adalah memungkinkan siswa untuk membangun program yang menarik secara visual segera dan tanpa rasa sakit. Mereka terpapar pada begitu banyak aplikasi dan game yang intensif grafis sehingga mereka secara alami berpikir bahwa begitulah seharusnya komputer berinteraksi dengan manusia.
vonbrand

13
  • Mengembangkan pemikiran algoritmik untuk menyelesaikan masalah sebagai tujuan utama: Satu hal buruk tentang menggunakan paradigma berorientasi objek dalam kursus pertama adalah, bahwa mendapatkan peserta didik baru ke dalam hal-hal seperti pewarisan, polimorfisme, dll, mengalihkan perhatian mereka dari tujuan utama yang disebutkan di atas. Bahkan, pengenalan pertimbangan sekunder apa pun di samping tujuan inti ini, seperti rekayasa perangkat lunak, portabilitas, kegunaan industri, dll, adalah kontra-produktif, untuk alasan yang disebutkan.

  • Bukan Bahasa Berorientasi Objek: Saat ini, sebagian besar universitas mulai mengajar pemrograman dengan benar dengan bahasa berorientasi objek. Saya pikir ini adalah kesalahan. Ada hal-hal di dunia yang dapat benar-benar dipahami hanya berbeda dengan kebalikannya. Tanpa terkena paradigma pemrograman prosedural (data dan fungsi sebagai dua aspek program yang terpisah), ide dasar orientasi objek (data dan perilaku dipandang sebagai terikat secara intrinsik bersama) dapat dilewatkan oleh banyak orang. Dan karena, pemrograman berorientasi objek sangat penting, kehilangan ide dasarnya bukanlah hal kecil. Selain itu, karena kemungkinan besar dalam kursus yang lebih senior, siswa CS akan memprogram terutama di OO, mereka perlu terkena sisi prosedural juga.

Jadi, pada akhirnya, saya akan memilih bahasa prosedural, menghindari fitur-fitur canggih, fokus pada pengembangan pemikiran algoritmik. Tetapi, dengan menghindari fitur-fitur canggih, saya tidak bermaksud menghindari masalah yang menantang. Maksud saya, bahwa bahkan masalah yang menantang, siswa harus diminta untuk menyelesaikannya menggunakan prinsip pertama, alat sederhana.


Anda dapat dengan mudah mulai dengan subset, katakanlah, Java pertama untuk menunjukkan gaya prosedural. Kemudian Anda membuka kotak Pandora dan menunjukkan bagaimana hal yang sama terlihat dengan OOP.
Raphael

3
@ Raphael: Tidak mungkin untuk menghindari public static void main()di Jawa, yang harus berada dalam konteks beberapa kelas. Ini menjadikan Java kurang ideal sebagai bahasa pertama, meskipun tentu saja rintangannya tidak terlalu bagus.
Dave Clarke

IDE yang baik dapat menunda public static void main()untuk waktu yang sangat lama. BlueJ adalah contoh bagus dari IDE yang memungkinkan siswa menulis program tanpa satu mainpun di dalamnya.
Barry Brown

2
Masalah dengan OOP adalah bahwa untuk berbagai masalah mainan yang tercakup pada tahun pertama atau lebih pemrograman itu hanya mendapat di jalan, tanpa keuntungan yang jelas. OOP menjadi penting (dan dihargai) ketika program Anda memiliki seribu baris atau lebih. "Java tanpa OOP" mengerikan, banyak hal yang benar-benar buram yang "harus ditulis dengan cara ini" bertentangan dengan orang yang belajar , tidak membeo.
vonbrand

11

Karena kita berbicara tentang kursus pemrograman pertama dalam program Ilmu Komputer, saya akan mengatakan aspek yang paling penting adalah konsep dasar CS apa yang akan diajarkan siswa Anda. Karena tidak ada bahasa yang dapat mengajarkan semua konsep sekaligus, Anda perlu mempertimbangkan konsep apa yang akan dibutuhkan lebih lanjut.

Saya tidak setuju dengan gagasan @ Kaveh bahwa relevansi industri itu penting; itu mungkin bonus, tetapi ini tidak penting di sini. Dengan dasar yang kuat dalam prinsip-prinsip CS, mempelajari bahasa "industri" di kursus selanjutnya akan relatif mudah.

Sebagai catatan tambahan, terlepas dari bahasa yang dipilih untuk menjadi yang pertama, penting untuk mengarahkan siswa Anda ke bahasa lain, yang secara radikal berbeda, sesegera mungkin.


1
Relevansi industri dapat dianggap sekunder tetapi saya pikir ini bukan masalah kecil. Karena ini adalah pengantar kursus pemrograman, saya tidak mengerti mengapa seseorang ingin mengajarkan semua konsep di dalamnya, sering kali ada kursus kedua dalam pemrograman dan kursus lain pada topik bahasa pemrograman di mana berbagai bahasa dibahas, dan banyak lainnya. kursus terkonsentrasi pada area aplikasi tertentu, misalnya pemrograman untuk web, dll.
Kaveh

@Kaveh: Kedengarannya seperti kurikulum universitas teknik bagi saya.
Raphael

6
"Adalah penting untuk mengarahkan siswa Anda ke bahasa lain, yang secara radikal berbeda, sesegera mungkin." -- tepat sekali. Kami mengatur freshers yang berpikir bahwa mereka dapat memprogram dengan langsung dengan memperkenalkan pemrograman fungsional terlebih dahulu: hampir semua baru dalam paradigma ini, dan semakin banyak C (++) yang Anda hadapi semakin sulit tampaknya.
Raphael

3
@Kaveh: Bahasa yang dirancang untuk Mendapatkan Hal-hal yang Dilakukan di Dunia Nyata belum tentu optimal untuk mengajarkan konsep atau mengembangkan keterampilan. Tujuannya sangat berbeda.
JeffE

1
@ Kaveh: Saya tidak pernah menulis bahwa pengetahuan tentang bahasa yang digunakan dalam industri tidak penting. Yang saya maksudkan adalah bahwa dengan diberikan bahasa pemrograman pertama yang solid, kursus selanjutnya tidak akan memiliki masalah mengajar siswa sesuatu tentang apa yang sebenarnya akan mereka lakukan ketika mereka lulus. Setelah menjadi bagian dari mengajar beberapa kursus pengantar sendiri (sebagai TA), saya akan mengatakan keterampilan yang Anda pelajari tidak ada yang seperti yang dibutuhkan dalam industri (ada terlalu sedikit waktu untuk itu). Jika ini masalahnya, maka saya merasa lebih baik memberi mereka konsep yang solid sehingga mereka bisa menjadi programmer yang lebih baik, bukan hanya $ programmer-bahasa.
evilcandybag

8

Perhatian utama saya adalah universalitas , dalam arti bahwa belajar bahasa pemrograman ini harus membuat siswa mampu menangani sebagian besar bahasa pemrograman.

Saya sangat menyesalinya, kriteria ini tidak termasuk bahasa fungsional murni. Ini juga berlaku untuk kursus yang tidak boleh menggunakan fitur eksotis bahasa.

... tapi ini hanya akal sehat.


1
Dengan monad seperti di Haskell, dapat diperdebatkan bahwa kriteria ini tidak berlaku untuk bahasa fungsional murni lagi.
Dave Clarke

@DaveClarke: monad adalah cara yang sangat bagus untuk melakukan hal-hal yang tidak berfungsi. Tapi bukankah terlalu berisiko untuk terlebih dahulu mempelajari hal-hal ini dengan overhead monad bukan langsung? (Mungkin tidak, saya tidak tahu!)
jmad

2
@ jdam: Anda mungkin benar. Masalahnya bukan di monads, tetapi, pada umumnya dan kesulitan dalam menyajikan pesan kesalahan yang baik kepada programmer. Varian Haskell Helium membahas masalah ini dan telah berhasil digunakan dengan siswa tahun pertama.
Dave Clarke

@DaveClarke: wow saya tidak pernah mendengarnya. Itu sangat keren! Sayangnya sementara itu sangat berguna untuk mempelajari Haskell, itu tidak mengatasi masalah yang mungkin tidak membantu belajar bahasa lain.
jmad

4
@ Ben: Perasaan saya adalah bahwa manajemen memori manual adalah sesuatu yang saat ini khusus untuk beberapa bahasa (dan bahwa Anda belajar dalam kasus-kasus khusus ini) lebih dari sekadar hal mendasar pemrograman. Jika Anda tidak setuju dengan itu maka saya kira itu menunjuk ke C (atau C ++).
jmad

8

Saat memilih bahasa pemrograman pertama, ada banyak masalah yang perlu dipertimbangkan. Banyak dari ini telah dipertimbangkan dalam jawaban di atas. Saya menyertakan 3 lagi karena ini adalah bagian dari jawaban saya untuk pertanyaan tertutup ( https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language ) yang awalnya mengilhami pertanyaan ini . Saya telah menyalin jawaban saya di sini (dan memodifikasinya) berdasarkan kebijakan saat ini untuk menghapus pertanyaan tertutup.

Berikut adalah 3 hal yang perlu dipertimbangkan, menggunakan beberapa bahasa pemrograman sebagai contoh.

Pemrograman dalam pemrograman besar vs dalam kecil

Ketika pertama kali belajar pemrograman , kita perlu belajar bagaimana memprogram dalam kelompok kecil , sebelum melanjutkan untuk mempelajari mekanisme untuk membantu pemrograman dalam skala besar .

Dengan pemrograman di kecil, maksud saya menulis program dengan kurang dari 100 baris. Program-program ini akan melibatkan algoritma yang memanipulasi struktur data sederhana, memiliki aliran kontrol yang sederhana, dan akan memecahkan masalah sederhana. Mereka pada umumnya tidak akan dianggap sebagai aplikasi .

Dengan pemrograman dalam ukuran besar, maksud saya menulis program besar yang dibangun dari banyak komponen / kelas, membangun di atas API, dengan GUI, database, mungkin dalam konfigurasi client-server.

Hal-hal yang perlu dipikirkan oleh seorang programmer ketika pemrograman dalam yang kecil sangat berbeda dari ketika pemrograman dalam yang besar. Pemrograman dalam skala besar membutuhkan programmer untuk memikirkan modularitas, antarmuka yang baik, desain yang baik, penggunaan kembali, dan banyak masalah lainnya. Bahasa pemrograman modern menyediakan banyak konstruksi untuk membantu program dalam skala besar. Konstruksi ini termasuk kelas, modul, antarmuka, penyembunyian informasi, dll. Ketika pemrograman dalam ukuran kecil, masalah-masalah ini jauh kurang penting.

Bahasa pemrograman seperti C ++ memiliki banyak fitur untuk membantu pemrograman dalam skala besar, tetapi lebih sulit untuk duduk dan mulai menulis program yang sangat sederhana. Java serupa.

Di sisi lain, bahasa seperti Python, Ruby, Skema atau Haskell membuatnya lebih mudah untuk langsung menulis program.

Tingkat tinggi vs tingkat rendah

Bahasa seperti C ++ dan C adalah bahasa tingkat yang lebih rendah. Mereka memungkinkan programmer untuk memanipulasi referensi ke dalam memori secara langsung. Meskipun, ini memungkinkan seseorang untuk menulis kode yang sangat efisien, detail level rendah mungkin sulit bagi programmer pertama untuk mempelajari bahasa. Beberapa orang akan berpendapat bahwa perincian tingkat rendah ini menghalangi penulisan logika untuk menyelesaikan masalah.

Bahasa tingkat tinggi seperti Python membuatnya lebih mudah untuk mengekspresikan konsep lebih langsung dalam hal domain masalah.

Dietik Secara Statis vs Dietik Secara Dinamis

C ++, Haskell, Java, dan banyak lagi bahasa lainnya diketik secara statis. Ini berarti bahwa kompiler secara otomatis menemukan tempat-tempat di mana potensi kesalahan terjadi berdasarkan tipe nilai yang diharapkan di setiap lokasi dalam kode. Ada sedikit perang agama tentang apakah pengetikan statis adalah hal yang baik atau tidak, tetapi saya akan menghindari itu. Satu masalah dengan pengetikan statis untuk programmer baru adalah bahwa pesan kesalahan yang dilaporkan oleh kompiler seringkali sulit untuk dipahami. Ini khususnya terjadi pada templat C ++ dan program Haskell secara umum.

Python, Ruby, dan Skema diketik secara dinamis. Ini berarti bahwa kesalahan terdeteksi saat program sedang berjalan. Orang bisa berpendapat bahwa ini sudah terlambat untuk mendeteksi kesalahan (tetapi kita juga dapat menggunakan pengujian untuk menghindari kesalahan tersebut). Sekali lagi, menghindari argumen keagamaan, keuntungan dari jenis kesalahan yang kita temui ketika menulis program sederhana dalam bahasa pemrograman yang diketik secara dinamis adalah dari jenis objek ini tidak tahu bagaimana melakukan operasi ini . Dalam konteks program kecil, kesalahan ini mudah dipahami dan dilacak.

Bahasa seperti C memiliki pengetikan yang lemah, artinya meskipun kompiler membantu dengan beberapa kesalahan, run-time gagal menjebak orang lain yang terjadi, seperti akses memori yang tidak valid. Akibatnya, pesan kesalahan yang dikembalikan ke programmer mirip dengan "Program macet". Bahasa yang diketik secara dinamis akan menjebak kesalahan ini dan mengubahnya menjadi pesan kesalahan yang lebih komprehensif.

Lainnya

Untuk bahasa lain, berbagai pertimbangan dapat ikut berperan, seperti dukungan yang diberikan oleh lingkungan pemrograman, API yang tersedia, kualitas buku dan tutorial online, dll.


Setuju dengan sepenuh hati.
vonbrand

1
Saya juga memiliki preferensi sendiri tentang pertentangan "static vs dynamic types". Namun, dalam program CS umum, selama keduanya diajarkan sebagai poin tertentu, saya percaya urutannya tidak terlalu penting. Namun, jika hanya satu sisi koin yang disajikan, itu masalah besar bagi saya.
chi

8

Sebagai kata pengantar, pertimbangkan kemungkinan penyajian lebih dari satu bahasa (dalam satu kursus). Dalam istilah pertama saya, kami menunjukkan SML dan Java. Kontrasnya memiliki pesannya sendiri dan penting: pilih alat yang tepat untuk pekerjaan itu.

Tapi sekarang untuk kriteria, dalam urutan acak.

Kesulitan untuk belajar adalah masalah subjektif, tetapi penting: Anda tidak ingin siswa Anda membuang waktu untuk belajar bahasa, tetapi pada melakukan hal hal dengan itu. Bisa dibilang, bahasa dinamis seperti Ruby mungkin menang di bagian depan ini: Anda dapat memberi mereka makan apa saja, dan ada tutorial "dummy" yang sangat baik di web. Jika saya ingat dengan benar, ada juga studi yang menunjukkan bahwa siswa yang belum memprogram sebelum mencapai hasil yang lebih baik dengan bahasa fungsional daripada yang lain.

Kekayaan : bahasanya harus cukup kaya untuk semua konsep yang ingin Anda ajarkan. Misalnya, jika Anda ingin membahas fungsi tingkat tinggi, Anda memerlukan bahasa di mana fungsi bernilai, seperti bahasa fungsional atau Scala.

Skalabilitas : Peluangnya adalah siswa Anda tidak akan belajar lebih banyak bahasa sendiri daripada yang Anda tunjukkan kepada mereka. Jadi Anda ingin bahasa yang Anda pilih untuk ditingkatkan selama masa belajar mereka: mereka perlu menulis latihan kesayangan Anda sekarang, tetapi mungkin juga menyerang proyek berukuran menengah nanti. Jawa dan bahasa dengan ekosfer yang serupa adalah pilihan yang baik di sini.

Dukungan alat : Ini terkait dengan skalabilitas. Jika Anda berharap / ingin siswa Anda menjadi produktif dengan bahasa tersebut, maka IDE yang bagus, pengelola gedung, dan perpustakaan harus ada. Kerang interaktif (Ruby, Scala) juga merupakan hal yang baik, terutama untuk pemula. Alat juga harus bekerja pada semua platform utama.

Dokumentasi : Anda mungkin tidak ingin benar-benar mengajarkan bahasa tetapi minta siswa mengajar diri mereka sendiri dengan bimbingan (abstrak) Anda. Karena itu, dokumentasi yang baik adalah penting. Dapat diperdebatkan, semakin populer suatu bahasa, semakin baik dokumentasinya. Sebagai contoh, dokumentasi Scala sangat buruk (tetapi membaik). Alat seperti Hoogle merupakan nilai tambah.

Ketersediaan : Sebenarnya ada orang yang mengajar menggunakan Matlab atau Visual C ++. Pertimbangkan bahwa tidak semua orang mungkin memiliki lisensi atau mesin yang dapat menjalankan program yang diperlukan. Anda mungkin harus memilih bahasa gratis yang berjalan di berbagai platform.

Cleanness : Anda mungkin ingin membentuk cara berpikir siswa Anda. Semakin berantakan bahasa, semakin berantakan mereka akan berpikir; Saya tidak akan pernah mengusulkan PHP dalam suatu kursus. Bahasa dinamis secara umum memiliki kelemahan di sini: mereka memungkinkan, kadang-kadang bahkan mempromosikan, kebiasaan buruk.

Kriteria mana yang lebih penting bagi Anda daripada yang lain juga tergantung pada apa yang ingin Anda ajarkan. Apakah ini benar-benar kursus pemrograman? Apakah ini kursus algoritma dan struktur data? Apakah ini kursus yang memperkenalkan konsep bahasa pemrograman dalam berbagai paradigma? Apakah ini kursus pengembangan perangkat lunak dalam skala besar?


For example, if you want to discuss higher-order functions, you need a language where functions are values, such as functional languages or Scala. ... atau C atau Pascal, yang keduanya memiliki pointer fungsi hampir selamanya. Praktis satu-satunya bahasa (mainstream) kriteria ini benar-benar menutup adalah Jawa.
Mason Wheeler

Mencoba mengajari para pemula berbagai macam sintaksis dan konsep-konsep yang mendasarinya benar-benar membingungkan.
vonbrand

6

Pertanyaan menarik; Saya suka penekanan Anda pada kriteria objektif. Kami ingin mahasiswa baru belajar:

konsep pemrograman : Bahasa pemrograman pertama harus mendukung: pemanggilan fungsi, iterasi, rekursi

ide dasar : Bahasa pemrograman pertama harus mendukung array (untuk langkah-langkah pertama dalam pengantar yang lembut tentang bagaimana cara memori benar-benar bekerja dan bagaimana pointer bekerja)

keterampilan pemrograman praktis : cara menggunakan debugger, cara menggunakan profiler, cara memecahkan masalah besar (bahasa tingkat tinggi), cara menyusun sistem besar, cara memecah masalah (penguraian masalah), cara menghindari penulisan kode yang rumit, cara berkomunikasi dengan manusia tentang maksud di balik serangkaian pernyataan yang dapat dieksekusi (seringkali samar).

fakta bahwa perpustakaan pra-tulis ada untuk hal-hal seperti sort (), dan bagaimana menggunakannya - yaitu, fakta bahwa tidak perlu menulis semuanya dari awal.

Kriteria lain untuk bahasa pertama :

ditafsirkan (umpan balik cepat membantu proses pembelajaran).

lingkungan interaktif yang mempercepat pembelajaran, pengujian, dan debugging.

kode sumber berkualitas tinggi tersedia bagi siswa untuk membaca dalam bahasa itu

"mudah dibaca", "sintaks yang mendekati bahasa alami" (untuk membuatnya lebih mudah untuk membaca dan menilai SourceCode)

portable (berjalan pada Mac OS, Windows, Unix). Setidaknya satu implementasi perangkat lunak bebas bahasa.

cepat untuk mengajar, "beberapa gotchas" - misalnya, "[saya] mungkin lebih cepat untuk mengajar pemula Python dan kemudian Jawa, daripada Jawa sebagai OOPL pertama." - "Perbandingan Bahasa Pemrograman Berorientasi Objek" dan TelescopeRule

Matthias Felleisen mengembangkan bahasa pemrograman dengan pesan kesalahan yang disesuaikan untuk audiens pemula. Dia menekankan bahwa pilihan bahasa tertentu tidak sepenting mengajar metodologi desain yang baik. Bahkan, ia melihat kursus CS pertama sebagai kelas Seni Liberal, mengajar pemikiran kritis, pemecahan masalah, dan perhatian terhadap detail.

kriteria untuk bahasa pemrograman kedua

Hal-hal yang kami ingin siswa pelajari, tetapi mungkin ini bisa menunggu bahasa pemrograman kedua:

bahasa "relevan" yang "tidak terlalu esoteris"; sesuatu yang "populer di industri"

Teori kompleksitas: bagaimana mengenali tugas yang tidak mungkin dilakukan dengan teknologi saat ini.

hal-hal tingkat yang lebih tinggi: cara memilih alat yang tepat untuk pekerjaan itu , bagaimana menggunakan kompiler, struktur, pemrograman berorientasi objek, pemrograman fungsional, pemrograman logika, desain kompiler, menyusun dan memanipulasi fungsi (dalam pengertian Lisp / ML), pemrograman bersamaan dan didistribusikan,

hal-hal tingkat rendah: aritmatika pointer, arsitektur komputer. manajemen memori, frame stack, pemrograman perakitan, arsitektur mesin, driver perangkat dan desain sistem operasi (sehingga mesin tidak akan "tampak seperti kotak hitam menakutkan yang tidak dapat mereka tembus")

EDIT: Saya merasa mengecewakan bahwa memposting ringkasan dari sesuatu yang saya tulis, bekerja sama dengan banyak orang lain, "mungkin bukan posting yang legal".

Jadi saya menambahkan kutipan yang lebih formal ke tautan informal saya sebelumnya, berusaha untuk mematuhi penggunaan yang adil dan masalah hak cipta wiki lainnya.

Jawaban ini adalah ringkasan Bahasa Pertama Freshman (Anon 2011) di Portland Pattern Repository.

(Anon 2011) Banyak penulis anonim dan berbagai lainnya. "Bahasa Pertama Mahasiswa Baru". Repositori Pola Portland. 27 September 2011. http://c2.com/cgi/wiki?FreshmansFirstLanguage .


Sudahkah Anda memeriksa dengan penulis asli apakah Anda diperbolehkan mereproduksi konten mereka? Sumbernya adalah situs web perusahaan dan saya tidak dapat menemukan pernyataan bahwa kontennya gratis, jadi ini mungkin bukan posting yang legal!
Raphael

1
@Raphael Sumbernya adalah wiki (jadi berpotensi memiliki banyak penulis berbeda). Jika penulis (penulis pendamping) materi ini tidak menginginkannya dimasukkan di sini, ia harus mengirim pemberitahuan penghapusan DMCA ke [alamat kontak yang tercantum di bagian bawah halaman ini] (mailto: team+cs@stackexchange.com) . Selanjutnya, informasi tersebut tidak dicakup oleh hak cipta, hanya cara itu diungkapkan. Sedikit refactoring dan MenghapusRunTogetherWikiWikiStyle akan meningkatkan jawaban ini dan menghilangkan risiko pelanggaran hak cipta.
Gilles 'SANGAT berhenti menjadi jahat'

1
+ Jawaban bagus, tapi saya punya satu nit untuk memilih - profiler. Tidak ada teori di belakang mereka - hanya "pengetahuan umum". Secara umum tidak dihargai di kalangan akademisi bahwa ada banyak masalah yang tidak mereka temukan, dan teknik lain tidak. Periksa tautan ini.
Mike Dunlavey

5

Saya pikir kesederhanaan dan kemudahan belajar adalah salah satu kriteria utama. Dalam kursus pengantar tentang pemrograman kami ingin menghindari rintangan pemrograman yang tidak perlu dan fokus sebanyak mungkin pada prinsip-prinsip pemrograman dan pemecahan masalah algoritmik. Para siswa tahun pertama sering kurang memiliki kemampuan untuk berpikir algoritmik tentang masalah sehingga kursus juga tentang mengajar pemikiran algoritmik.

Kriteria lain adalah kegunaan bahasa dalam industri. Kami tidak ingin mengajarkan bahasa yang tidak berguna di industri. Sebagian besar siswa yang jelas akan bekerja di industri sehingga orang harus memperhatikan apa yang digunakan (dan akan digunakan ketika siswa lulus) di industri.

Kriteria ketiga adalah kursus yang akan diambil siswa di tahun-tahun berikutnya. Kursus, khususnya kursus yang diperlukan, tidak dirancang sendiri tetapi berkoordinasi dengan kursus lain.

Yang terakhir yang dapat saya pikirkan saat ini adalah sama dengan jawaban jmad, bahasanya harus memberikan kemudahan dalam mempelajari bahasa-bahasa penting lainnya. Itu harus cukup kaya dan mengambil bahasa-bahasa penting nantinya akan mudah (di sini, sarana-sarana penting penting dari sudut pandang para siswa).

Saya pikir banyak universitas telah mengalihkan pengantar utama mereka ke kursus pemrograman dari Java / C ++ / C ke Python meskipun mereka mungkin memberikan pengantar pemrograman dalam bahasa lain dari waktu ke waktu (sering untuk jurusan sains non-komputer, misalnya C untuk jurusan teknik elektro) meskipun mereka mungkin menunjukkan fleksibilitas jika instruktur ingin bereksperimen dengan mengajar bahasa lain sesekali.


3
Saya tidak akan menilai kegunaan dalam industri sangat tinggi dalam kursus pemrograman pengantar. Seorang programmer yang sukses di alam bebas mungkin harus belajar sejumlah bahasa selama karir mereka, beberapa di antaranya "bekerja", sehingga kemampuan untuk mengambil dan mempelajari bahasa baru adalah keterampilan utama yang perlu diajarkan. Akibatnya, saya tidak akan mengharapkan bahasa pertama yang diajarkan dalam kursus sepanjang universitas akan menjadi yang terkuat saat mereka lulus.
Ben

1
@ Ben: Kegunaan dalam industri ini sangat penting jika siswa tidak akan mengambil jurusan CS. Di mana saya berasal dari banyak orang pergi untuk bekerja di bidang biologi atau ilmu lain dan, mengingat bagaimana mereka tidak punya waktu untuk belajar banyak bahasa, mempelajari sesuatu yang umum dalam ekosistem mereka seperti Python kemungkinan akan lebih berguna daripada ML, Jawa atau C.
hugomg

1
Berbicara sebagai seseorang dari industri (satu industri tertentu, tidak selalu representatif), saya tidak berpikir relevansi industri adalah faktor ketika datang ke programmer tingkat-1 masa depan. Paparan berbagai paradigma membuat pemrogram lebih baik, bahkan jika dalam domain saya (pemrograman terprogram) kami sebagian besar menggunakan C. Khususnya suatu bahasa dapat dipelajari dalam manual, konsep umum lebih baik diajarkan di sekolah. Untuk programmer insidental (mis. Ilmuwan), prioritasnya berbeda - tetapi terlalu berfokus pada Fortran dapat membuat orang mengabaikan Numpy ketika itulah yang seharusnya mereka gunakan.
Gilles 'SANGAT berhenti menjadi jahat'

5

Jadi, saya akan segera mengeluarkan reaksi spontan saya, yaitu setiap orang harus belajar pemrograman melalui SICP karena Lisp adalah Hal yang Tepat.

Ada banyak kriteria bagus yang ditawarkan sudah untuk memilih bahasa ... kesederhanaan dan portabilitas menjadi yang paling penting. Namun, saya juga berpikir sangat penting bagi siswa baru untuk pemrograman untuk tidak mendapatkan ide yang salah (atau tidak tahu) tentang apa yang terjadi di balik layar dengan bahasa modern.

Walaupun beberapa dari pos-pos lain ini telah menawarkan kriteria yang sangat baik, saya ingin menggunakan bahasa tertentu untuk menggambarkan seperti apa 'memenuhi kriteria'.

Beberapa masalah ini telah diatasi (jauh lebih baik daripada yang dapat saya coba) dalam posting blog Joel Spolsky, The Perils of JavaSchools . Memilih bahasa seperti Java atau Python menutup lebih dari dua konsep yang lebih sulit (dan paling vital) di CS; yaitu, pointer dan rekursi.

Tentu saja, mengajar kursus intro di C akan menjadi sangat padat, sementara juga kemungkinan kehilangan banyak konsep penting yang berkaitan dengan rekursi. Demikian juga, kursus yang diajarkan di Lisp harus membahas petunjuk di bawah selimut, cardan cdrmenyiratkan konsep-konsep penting yang terkait dengan daftar-tertaut, sambil membiarkan bahasa menangani detailnya.

Pada dasarnya, yang saya maksudkan adalah bahwa siswa perlu memahami dasar-dasar struktur data dan algoritma, serta implementasi praktis.

Saya juga tidak setuju dengan saran untuk tidak menggunakan bahasa berorientasi objek. Saya pikir kegunaan bahasa berorientasi objek untuk memodelkan dunia nyata adalah aset positif bagi programmer baru, selama ketidakcocokan impedansi dibuat jelas, dan bahwa bahasa berorientasi objek adalah salah satu paradigma di antara banyak.

Saya akan mengusulkan bahwa Ruby (disarankan sebagai kemungkinan oleh posting lain juga) mencontohkan banyak kualitas yang harus dicari dalam bahasa yang akan digunakan untuk intro ke kursus pemrograman.

Saya akan membenarkan pernyataan ini sebentar, tetapi pertama-tama saya ingin mengomentari satu tren yang mengganggu saya dalam kursus CS intro. Saya bekerja di sebuah universitas yang, seperti banyak sekolah, baru-baru ini beralih menggunakan Python untuk kursus intro-nya. Saya sangat percaya bahwa Python adalah BASIC baru, dan kecenderungan bahasa adalah untuk memilih persahabatan baru daripada kekuatan dan ekspresif, seperti yang saya baru-baru ini berpendapat di tempat lain . Ini merugikan, dan kita perlu memikirkan tentang programmer yang akan menjadi, bukan newb mereka saat ini.

Bagaimanapun, membenarkan Ruby sebagai bahasa pengantar ...

  • Ruby, meskipun tidak dioptimalkan untuk panggilan ulang, melakukan rekursi dengan cukup baik. Jadi begitulah.
  • Ruby adalah multi-paradigma. Meskipun ini adalah bahasa berorientasi objek murni, itu juga mencakup pemrograman fungsional, serta memiliki beberapa roda pelatihan C-diturunkan imperatif pada. Bandingkan ini dengan Python, yang merupakan bahasa prosedural dengan beberapa OO tertempel (meskipun baut menunjukkan), dan beberapa elemen fungsional (yang BDFL Python telah berulang kali mencoba untuk memotong ).
  • CRuby (alias MRI atau 'Ruby Classic') ditulis, dan diperluas, dalam C. Anda dapat mengajar siswa tentang petunjuk, manajemen memori, dan dewa ketakutan malloc() dengan mengajar mereka untuk memperluas bahasa dalam C.
  • Bahkan mengira itu adalah bahasa dinamis tingkat tinggi, Anda dapat mengajarkan banyak hal tentang struktur data, jenis, dll .; ada perpustakaan (permata) untuk apa pun yang dapat Anda bayangkan, dari pohon merah-hitam hingga melakukan hal-hal aneh dengan mengetik bebek.

Bagaimanapun, tidak ada pengganti untuk belajar banyak bahasa, dari banyak paradigma, apakah Anda menggunakannya secara profesional atau tidak. Pada dasarnya, saya pikir semua orang harus mengerti , jika tidak digunakan , C dan Lisp. Ruby adalah kompromi terbaik yang bisa saya pikirkan untuk semester pengantar.

Bagaimanapun ... itu adalah US $ .02 saya. Saya tidak mencoba meyakinkan Anda untuk menggunakan Ruby, ingatlah ... hanya menggunakannya sebagai contoh kualitas yang harus dicari dalam bahasa untuk mengajar kursus intro.


2
"Saya sangat percaya bahwa Python adalah BASIC baru" - salin itu. "dua konsep yang lebih sulit (dan paling vital) di CS; yaitu, pointer dan rekursi" - Saya tidak pernah belajar bahasa yang berhubungan dengan pointer secara eksplisit, dan saya tidak pernah melewatkan apa pun. Ketika saya belajar bagaimana kompiler bekerja, petunjuk di mana dijelaskan dengan cukup cepat.
Raphael

Saya setuju bahwa bahasa multi-paradigma memiliki daya tariknya (walaupun mengajar dua hingga tiga bahasa "murni" mungkin lebih baik), tetapi saya tidak akan memilih Ruby karena alasan itu. Bahasa lain untuk pekerjaan yang lebih baik, imho, khususnya sehubungan dengan perpustakaan dasar. Scala, misalnya, memiliki seluruh koleksi koleksi abadi.
Raphael

3
Saya juga percaya bahwa Python adalah BASIC baru. Tapi mengapa itu argumen terhadap Python?
JeffE

1
@ Raphael, pointer sulit hanya ketika Anda mulai dengan C yang agak memaksa Anda untuk terkena pointer ketika terlalu banyak hal tidak diselesaikan dan di mana mereka memiliki hubungan yang membingungkan dengan array. Pointer tidak sulit bagi saya ketika saya belajar sendiri Pascal. Pointer tidak sulit untuk orang-orang di kelas saya yang mengajar mereka di Algol 68 (mereka disebut referensi di sana, tetapi mereka pointer dengan nama lain, seperti di Jawa; apa yang sulit di Algol 68 adalah aturan dereference otomatis), pointer bahkan tidak sulit dengan C ++ jika Anda tidak memulai dengan mengajarkan bagian C.
Pemrogram

1
@DaveClarke: Itu indentasi dengan whitespace, yang lebih dari make up untuk itu.
Raphael

5

Bahasa pemrograman pertama saya adalah bahasa perakitan mainan. Yang kedua adalah Fortran. Di antaranya, saya diajari notasi "algoritma", yang kira-kira Algol 60. Saya ternyata cukup ok. Sebenarnya, saya pikir apa yang diajarkan kepada saya cukup sempurna.

Ketika saya pertama kali melihat pemrograman fungsional, dalam makalah penelitian meskipun tidak dalam bahasa yang diterapkan, saya berkata, "Wah, ini benar-benar berbeda. Ini cukup matematis!" Kebanyakan orang yang diajarkan pemrograman fungsional masih memiliki pengalaman "wow" yang sama. Saya pikir itu hebat.

Saya pikir pemrograman imperatif dan pemrograman fungsional adalah dua cara yang sangat berbeda dalam memandang dunia. Kami akan merugikan siswa kami jika kami merampok mereka dari pengalaman yang beragam.

Bahasa pemrograman pertama yang terbaik haruslah sesuatu yang sesederhana mungkin dan sejelas mungkin, sehingga siswa dapat fokus pada cara berpikir jernih. Sayangnya, kesederhanaan dan kejelasan perakitan, Fortran dan Algol 60 tidak tertandingi oleh sebagian besar bahasa pemrograman modern. Haskell adalah pengecualian yang bagus. Tapi, Haskell akan membuat bahasa pemrograman kedua yang ideal saya, bukan yang pertama. Eiffel atau Oberon mungkin bisa sesuai dengan tagihan.


5

Di Sekolah Sains dan Matematika Carolina Utara , kami telah memperkenalkan siswa ke Python sejak tahun 2004. Kami menggunakannya untuk mengajar pemrograman prosedural, karena kami berpikir bahwa kemampuan untuk menulis prosedur yang singkat dan benar sangat penting untuk berkembang kemudian dengan alat yang lebih berat, termasuk OO pemrograman.

Kami menyukainya karena alasan ini.

  1. Python bukan bahasa format bebas. Ini memaksa siswa untuk menulis kode mereka dalam blok menggunakan indentasi. (Sebagai catatan teknis, kami menggunakan editor teks vim dan meletakkan [ set tabstop=4 set et] di .vimrc untuk menghilangkan masalah yang mengganggu dan agar lekukan kode terlihat tetapi tidak menyebabkan pergeseran horizontal yang jelek dan berlebihan). Siswa kami terbiasa melihat struktur hierarki program yang dibatasi oleh spasi putih. Akibatnya, kebiasaan memformat mereka cenderung sangat baik karena mereka memprogram dalam bahasa lain.

  2. Kesederhanaan sintaksis Python membuatnya ramah-pemula. Program sederhana dapat ditulis dengan minimal kata kunci misterius dan mantra magis. Kami ingin siswa yang biasanya tidak berpikir pemrograman untuk mencobanya. Perhatikan kesederhanaan yang indah dari Python hello.py; sangat jelas apa yang terjadi.

  3. Python diketik secara dinamis dan diketik bebek. Ini membuat memperkenalkan variabel mudah. Saya memberi tahu siswa saya bahwa variabel hanyalah label. Mereka menunjuk benda. Anda mengirim pesan ke objek menggunakan nama variabel, sama seperti seseorang mengirim pesan kepada Anda dengan menelepon Anda di telepon.

  4. Python adalah alat yang siswa ambisius tidak akan tumbuh lebih besar. Ini memiliki perpustakaan canggih yang melakukan banyak hal berguna. Ini adalah alat kreatif yang kuat yang dapat diakses oleh pemula.

  5. Python gratis dan berjalan di semua platform utama. Sekolah kami adalah lingkungan OS yang heterogen dengan semua jenis mesin. Kami tidak perlu khawatir tentang sakit kepala seperti masalah kompatibilitas. Ini akan berjalan di hampir semua komputer.

  6. Python memiliki dokumentasi yang sangat baik. Kami mendorong siswa kami untuk mengeksplorasi, mengotak-atik, dan mewarnai di luar garis. Mereka belajar tentang menggunakan dokumentasi Python sejak awal dan sering berakhir menjelajahi hal-hal keren di luar kelas.

Kami sangat senang dengan Python.


1
Selamat datang! Ini adalah studi kasus yang bagus, tetapi tidak banyak menjawab pertanyaan setelah kriteria seleksi, imho. Membaca barang-barang Anda dari belakang dapat melakukan hal itu, tetapi saya tidak yakin apakah Anda memang menginginkannya.
Raphael

Tidak ada pesanan khusus yang dimaksudkan. Itu adalah "dan".
ncmathsadist

3

Saya akan mengatakan, bahwa bahasa (di bawah beberapa batasan) tidak terlalu penting, seperti apa yang Anda lakukan dengan bahasa tersebut. Anda dapat mempelajari hal yang sama tentang pengembangan perangkat lunak, algoritme, pemrograman berorientasi objek, perangkat keras komputer, dan sebagainya dalam sebagian besar bahasa. Kuncinya adalah, untuk mengembangkan sesuatu yang menarik, yang memanfaatkan semua konsep ini.

(jawaban yang dimigrasikan dari https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language/ )


1

TL; DR: Tidak ada cara untukmenjawab ini secara objektif karena tidak adadasar objektif untuk kriteria di baliknya. Ini sama sewenang-wenangnya dengan mencoba memperdebatkan apakah biru, secara objektif , warna "lebih baik" daripada merah, atau jika es krim vanila secara objektif "lebih enak" daripada cokelat.


Saya pikir sudah ada beberapa posting indah yang sudah ada, tetapi saya akan menambahkan 2 sen saya sendiri.

Kriteria objektif apa yang bisa digunakan seorang pendidik untuk memilih bahasa pemrograman yang akan digunakan sebagai dasar untuk kursus pemrograman universitas tahun pertama?

Pertanyaan ini mirip dengan menanyakan apakah ada cara untuk secara objektif memilih rasa es krim pertama yang harus dicoba orang lain ketika mengunjungi tempat es krim untuk pertama kalinya. Tidak, tidak ada cara obyektif untuk memilih sesuatu yang pada dasarnya subyektif .

Mengapa? Karena bahkan ketika kita melihat kriteria masuk akal yang disebutkan dalam jawaban Pedro , semua orang masih akan memiliki pandangan subjektif tentang bagaimana masing-masing faktor "bertahan" terhadap pandangan orang lain.

Misalnya, apakah Ruby secara objektif "lebih sederhana" dari pada Python? Lebih sederhana dalam arti apa? Sehubungan dengan apa? Apa arti "sederhana" bagi Anda ? Apakah ini berarti "lebih sedikit baris kode"? Apakah ini berarti "lebih mudah dibaca dan dimengerti"? Bagaimana dengan orang lain? Mengapa ada yang setuju dengan pilihan tertentu di sini? Saya tidak berpikir kita bisa menjawab pertanyaan itu secara objektif .

Ini mengarah ke pertanyaan berikutnya.

Apa dasar untuk kriteria ini?

Meskipun beberapa kriteria masuk akal, saya pikir ini lebih didasarkan pada preferensi subjektif daripada yang lain. Sebagai contoh, tidak ada alasan mengapa aku harus menerima kriteria Pedro dari kesederhanaan , unambiguity , portabilitas dan industri preferensi -regardless bagaimana wajar beberapa mungkin berpikir untuk menjadi. Faktanya, preferensi industri adalah subyektif berdasarkan definisi dan hanya akan mengarah pada lingkaran setan. (Semua orang dilatih di dalamnya, jadi semua orang menggunakannya dalam industri, itulah sebabnya semua orang dilatih di dalamnya, ...)

Misalnya, mengapa tidak

  • Efisiensi: Waktu eksekusi dan jejak memori sebenarnya dapat diukur.
  • Ukuran: Jumlah kata yang disediakan paling sedikit mungkin akan membuat bahasa lebih mudah dipelajari.
  • Rangkaian Fitur: Rangkaian fitur yang didukung yang lebih luas (mis. Lambdas, generik, orientasi objek, kelebihan operator, dll.) Akan memungkinkan Anda untuk mengajarkan lebih banyak konsep tanpa harus berganti bahasa dan kembali ke titik awal.
  • Interoperabilitas: Bahasa yang membuatnya mudah untuk bekerja dengan bahasa lain dan sistem asli (mis. API Win32 dari C # atau Python, dll.) Dapat dimunculkan sebagai investasi waktu jangka panjang yang lebih baik, dll.

Intinya adalah bahwa, walaupun saya dapat menghasilkan serangkaian kriteria evaluasi yang berbeda dan masih dianggap masuk akal, kami tidak dapat mengklaimnya secara obyektif lebih unggul / lebih rendah daripada kriteria orang lain.

Kesimpulannya, tidak ada dasar objektif untuk kriteria tersebut. Ini sama sewenang-wenangnya dengan mencoba memperdebatkan apakah biru, secara objektif , warna "lebih baik" daripada merah, atau jika es krim vanila secara objektif lebih enak daripada cokelat.

Itu bukan untuk mengatakan bahwa Anda tidak dapat memiliki alasan yang bagus untuk membenarkan preferensi Anda, tetapi pada akhirnya, itu hanya preferensi Anda .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.