Seberapa pentingkah mengetahui cara memprogram untuk TCS?

66

Berasal dari latar belakang yang lebih matematis, saya tidak pernah benar-benar belajar cara membuat kode. Saya memulai PhD di TCS dan banyak orang terkejut dengan betapa sedikit yang saya ketahui tentang pemrograman (dan tentang komputer pada umumnya). Saya dapat menulis algoritma dalam pseudo-code, tetapi saya tidak benar-benar tahu bahasa pemrograman.

Saya dapat membayangkan bahwa suatu hari nanti saya mungkin harus mengimplementasikan beberapa algoritma untuk pekerjaan saya, tetapi kemudian bisakah saya menunggu saat ini? Atau ada sesuatu yang lebih?

Seberapa pentingkah mengetahui cara membuat kode dalam TCS (dalam bidang di mana pemrograman tidak terlibat langsung): adakah alasan yang dapat membawa ahli teori CC (misalnya) untuk mengetahui cara membuat kode? Apakah layak menghabiskan banyak waktu mempelajari cara membuat kode? Dan jika ada, apakah ada kategori (fungsional, imperatif, berorientasi objek ..) bahasa pemrograman yang akan lebih cocok?

Gopi
sumber
12
Anda harus memprogram beberapa untuk menulis bermakna, yaitu pasti dan mencerminkan runtime, kode semu. Matematikawan sering tidak melakukan keduanya. Juga, jika Anda ingin benar-benar menggunakan teori yang Anda kembangkan, kemungkinan Anda harus menerapkan sesuatu. Sedangkan untuk bahasa, Anda mungkin lebih baik belajar sesuatu yang fungsional. C bagus untuk kinerja tetapi sulit untuk dipikirkan dan berantakan dalam banyak aspek. (Seperti yang Anda lihat, YMMW)
Raphael
6
Saya setuju dengan "Ahli matematika sering tidak melakukan keduanya." Sebuah tes sederhana untuk mengetahui apakah seorang ahli matematika yang mendeskripsikan suatu algoritma pernah benar-benar diprogram adalah untuk bertanya, "Apa yang sebenarnya Anda maksud dengan 'Diberi X ...'?"
Jeffε
4
Pemrograman, apa itu? Teorema adalah program saya. Prosedur memasak berbeda dari seni memasak. Maaf, lebih dari 20 tahun saya tidak bisa membaca kode program apa pun. Sebenarnya, saya benci kekacauan "sedang direalisasikan pada PC" ini. (Sudah notasi ini membuat sakit.) Euclid tidak dapat memprogram. Namun dia membuat program selama berabad-abad.
Stasys
6
@StasysJukna: Euclid sebenarnya adalah programmer yang benar-benar jelek. Dia tidak hanya tidak pernah mengimplementasikan algoritmanya, dia bahkan tidak pernah menjalankannya dengan tangan pada kasus uji yang cukup rumit.
Jeff
3
@ Jɛ ff E: Ya, Euclid adalah programmer yang payah, persis ini yang ingin saya katakan. Kami, di TCS, cenderung tidak membedakan antara buku memasak dan seni memiringkan. Euclid bisa. Saya sangat menghormati orang-orang yang BISA memprogram. Tetapi saya tidak berpikir bahwa fitur ini berarti "one CAN in TCS". Itu tidak akan sakit.
Stasys

Jawaban:

55

Ilmu komputer teoretis adalah bidang yang luas dan pentingnya pemrograman tergantung pada apa yang Anda lakukan di TCS. Saya akan menyebutkan dua cara di mana pemrograman dapat membantu Anda, tanpa menyiratkan bahwa ini adalah satu-satunya cara.

Pertama, jika Anda merancang algoritme untuk masalah yang praktis penting, menerapkan algoritme Anda dan membuat kode tersedia untuk orang lain bisa menjadi nilai tambah besar. Misalnya, masalah cembung lambung muncul di banyak bidang, dan orang-orang menggunakan paket perangkat lunak seperti cdd oleh Komei Fukuda dan lrs oleh David Avis untuk menyelesaikan masalah ini. Jika mereka menerbitkan algoritme mereka hanya di kertas, mungkin lebih sedikit orang yang akan menggunakan algoritme mereka. Lebih banyak pengguna berarti lebih banyak umpan balik dan mungkin juga lebih banyak peluang untuk berkolaborasi, yang sangat berharga.

Kedua, bahkan jika Anda tidak bekerja dalam algoritma, menulis kode satu kali membantu Anda untuk menguji dugaan sederhana ketika dugaan tersebut cocok untuk perhitungan numerik. Sebagai contoh, jika Anda bertanya-tanya apakah produk dari tiga matriks pasti positif selalu memiliki jejak positif, mudah untuk menulis kode untuk mengujinya untuk beberapa pilihan acak 2 × 2 atau 3 × 3 matriks pasti positif dan menemukan sampel berlawanan. Meskipun Anda tidak mengiklankan bahwa Anda menulis program apa pun untuk menguji dugaan itu, pemrograman dapat menghemat waktu yang seharusnya dihabiskan dengan sia-sia mencoba membuktikan pernyataan yang salah.

Bahasa pemrograman untuk dipilih tergantung pada apa yang ingin Anda lakukan dengan pemrograman, dan itu bisa menjadi topik untuk seluruh buku menurut saya. Tetapi jika Anda merancang algoritma dan ingin mengimplementasikan algoritma Anda sehingga orang lain dapat menggunakan implementasinya, maka salah satu faktor penting adalah ketersediaan. Meskipun Anda dapat berharap bahwa sebagian besar pengguna potensial kode Anda memiliki akses ke kompiler C, Anda tidak dapat berharap bahwa orang yang sama memiliki akses ke kompiler Haskell. Untuk program satu kali, pilihannya lebih didasarkan pada perpustakaan yang tersedia, dan termasuk lingkungan seperti Matlab.

Omong-omong, pemrograman juga bisa menyenangkan.

Tsuyoshi Ito
sumber
2
@ SureshVenkat: Sebenarnya, jika pemrograman itu menyenangkan, pertanyaan "Seberapa pentingkah pemrograman?" Mungkin tidak terlalu relevan. Tetapi kemudian sebagian besar jawaban saya akan menjadi tidak relevan. Betapa menyedihkan! :)
Tsuyoshi Ito
Saya tidak memikirkan argumen kedua Anda sebelumnya, memang sepertinya ide yang sangat bagus untuk menguji dugaan dengan program singkat! Adapun pemrograman bisa menyenangkan, jadi sepertinya, tapi saya belum melihat semua pembelajaran akhir minggu yang panjang =).
Gopi
@ Gopi: Konon, banyak dugaan tidak cocok dengan kerangka kerja "uji dengan program sederhana" ini. Misalnya, kami biasanya tidak dapat menguji perilaku asimptotik (setidaknya dengan program sederhana). Tetapi ketika Anda memiliki beberapa dugaan yang dapat diuji, sedikit pemrograman bisa menjadi alat yang ampuh. Sedangkan untuk bersenang-senang, ya, saya mengerti. Saya hanya tidak ingin mengabaikan sudut pandang "menyenangkan" dengan hanya mendaftar beberapa motivasi dari sudut pandang "kegunaan".
Tsuyoshi Ito
3
Catatan Knuth tentang kelas penyelesaian masalah memiliki contoh yang bagus tentang interaksi antara dugaan dan kode (lihat Soal 1): www-cs-faculty.stanford.edu/~knuth/papers/cs1055.pdf (saya terutama menyukai gambar seseorang bergegas ke ruang kelas membawa setumpuk cetakan)
Suresh Venkat
47

Saya merasa harus mengutip Doron Zeilberger tentang ini:

Opini 37 : Pemrograman Lebih Menyenangkan daripada Membuktikan, dan, Lebih Penting Itu Memberi Sebanyak, Jika Tidak Lebih, Wawasan dan Pemahaman.

Baca pendapat, itu penuh permata (tapi dia cenderung provokatif dengan sengaja). Misalnya, "Cara terbaik untuk memahami sesuatu adalah dengan mengajarkannya. Tetapi bahkan lebih baik mengajarkannya kepada manusia adalah dengan mengajarkannya ke komputer".

Pengalaman pribadi saya adalah bahwa bahkan ketika melakukan pekerjaan teoritis murni Anda akan memerlukan beberapa alat komputasi. Saya menghindari banyak manipulasi aljabar rutin yang membosankan dengan Mathematica. Saya menguji dugaan setengah matang saya dengan memaksa contoh kecil pada Matlab atau Python. Saya telah menulis bersama satu makalah yang merupakan kombinasi murni, dan itulah pekerjaan yang paling diuntungkan dari menjalankan eksperimen komputer yang luas untuk memahami apa yang terjadi. Euler membuat tabel besar perhitungan yang membosankan untuk mendapatkan wawasan tentang masalah. Kami berutang kepadanya untuk menggunakan alat kami untuk mengotomatisasi proses ini ketika kami melakukan matematika.

Selain itu, jika Anda akan bekerja pada algoritma dan struktur data, pemrograman akan memberikan perspektif yang tak tergantikan pada masalah efisiensi dan kegunaan. Pendapat saya di sini agak berbeda dengan yang lain. Saya pikir belajar bahasa fungsional sehingga Anda bisa menulis bukti bahwa mengetik dengan benar adalah buang-buang waktu (saya pikir itu poin bagus bahwa orang-orang yang memiliki pengalaman dengan bahasa yang sangat diketik mungkin cenderung untuk menulis bukti terstruktur yang lebih hati-hati; saya hanya tidak pikir itu bernilai waktu Anda untuk pergi melalui latihan itu). Pemrograman fungsional mengaburkan masalah desain algoritme dan waktu berjalan serta menekankan masalah logika dan semantik (dan, tentu saja, mempelajari pemrograman fungsional mungkin suatu keharusan dan akan datang secara alami jika Anda tertarik pada semantik logika / PL). Demikian pula, Saya pikir masuk ke rincian OO Java dan C ++ juga bukan cara yang optimal untuk menghabiskan waktu Anda, karena tujuan OO adalah untuk menulis kode modular yang dapat digunakan kembali. Ini cara untuk pergi jika Anda akan menghasilkan kode untuk digunakan orang lain. Tetapi jika Anda ingin mendapatkan wawasan tentang efisiensi dan waktu berjalan, jika Anda peduli dengan algoritma dan struktur data yang sangat efisien, saya sarankan untuk melihat ke C. Ini memungkinkan Anda tetap dekat dengan mesin sambil tetap memberikan tingkat abstraksi yang wajar . Dengan cara ini Anda merasakan apa yang cepat dan lambat, apa itu struktur data yang masuk akal, dll. Tetapi jika Anda ingin mendapatkan wawasan tentang efisiensi dan waktu berjalan, jika Anda peduli dengan algoritma dan struktur data yang sangat efisien, saya sarankan untuk melihat ke C. Ini memungkinkan Anda tetap dekat dengan mesin sambil tetap memberikan tingkat abstraksi yang wajar . Dengan cara ini Anda merasakan apa yang cepat dan lambat, apa itu struktur data yang masuk akal, dll. Tetapi jika Anda ingin mendapatkan wawasan tentang efisiensi dan waktu berjalan, jika Anda peduli dengan algoritma dan struktur data yang sangat efisien, saya sarankan untuk melihat ke C. Ini memungkinkan Anda tetap dekat dengan mesin sambil tetap memberikan tingkat abstraksi yang wajar . Dengan cara ini Anda merasakan apa yang cepat dan lambat, apa itu struktur data yang masuk akal, dll.

Sasho Nikolov
sumber
10
"Pemrograman fungsional mengaburkan masalah desain algoritma dan waktu berjalan serta menekankan masalah logika dan semantik". Perkelahian kata-kata :)
Suresh Venkat
3
"Pemrograman fungsional mengaburkan masalah desain algoritma dan waktu berjalan serta menekankan masalah logika dan semantik." Itulah sebabnya ini adalah pilihan yang baik jika Anda bekerja di sisi logika atau semantik TCS. :)
Radu GRIGore
5
Ahem.
Jeff
3
@Sasho: Semua teknik biasa masih berfungsi dalam bahasa fungsional. Satu-satunya "masalah" adalah pemrograman fungsional mendorong gaya pemrograman dan desain struktur data yang teknik analisis algoritmiknya kurang lengkap untuk ditangani. (Misalnya, apa-O komposisi fungsi yang besar? Operasi ini sepele , tetapi sepenuhnya mematahkan asumsi kompleksitas asimptotik - tidak ada metrik numerik ukuran sederhana untuk input fungsional.)
Neel Krishnaswami
3
@SashoNikolov: Setiap kali saya mengajar kelas struktur data pascasarjana, saya benar-benar berharap bisa berasumsi bahwa setiap orang memiliki pengalaman pemrograman fungsional. Alih-alih menghabiskan tiga kuliah 90 menit untuk menjelaskan kegigihan, saya bisa mengatakan, "Hei, apakah Anda memperhatikan bahwa struktur data Anda sudah melakukan INI?"
Jeff
33

Anda bisa menjadi ilmuwan komputer teoretis yang cukup sukses tanpa pemrograman. Untuk beberapa orang, pemrograman cukup sulit, dan jika Anda salah satunya, Anda tidak boleh putus asa dan beralih bidang.

Namun, bagi sebagian besar mahasiswa pascasarjana matematika dan ilmu komputer, belajar ke program tidak terlalu sulit, dan merupakan keterampilan yang sangat berguna. Anda harus belajar bahasa pemrograman, dan jika Anda menikmatinya, Anda harus mencoba untuk mendapatkan latihan yang cukup untuk menjadi mahir dalam hal itu. Kemudian, ketika titik datang (dan itu akan) bahwa itu akan berguna dalam penelitian Anda untuk menulis sebuah program, Anda akan dapat melakukannya.

Jika Anda tidak belajar memprogram sekarang, sangat mungkin bahwa ketika Anda akhirnya perlu menulis sebuah program, Anda tidak akan punya waktu untuk belajar, sehingga Anda mungkin tidak benar-benar menulisnya, dan akhirnya menjadi kurang efektif dalam penelitian. Walaupun mendapatkan mahasiswa pascasarjana atau sarjana untuk melakukan ini untuk Anda tidak terlalu sulit, ada banyak waktu ketika lebih mudah dan lebih sedikit waktu untuk melakukannya sendiri daripada menjelaskan masalahnya kepada mereka.

Bahasa apa yang harus Anda pelajari? Saya akan merekomendasikan bahasa berorientasi objek, karena ini adalah yang saat ini paling banyak digunakan, dan saya menduga ini akan lebih benar di masa depan. Mungkin Python atau Java — keduanya bahasa berorientasi objek, dan sementara mereka lebih jarang digunakan dalam praktik daripada C ++, kesan saya adalah keduanya jauh, lebih mudah dipelajari. (Peringatan: Saya tidak tahu C ++, meskipun pernah bekerja di Bell Labs, jadi mungkin saya salah tentang ini.)

Peter Shor
sumber
2
Saya melihat kebenaran di paragraf ketiga Anda :).
Gopi
1
"Namun, bagi kebanyakan orang, belajar untuk memprogram tidak terlalu sulit" - pengalaman saya membuat saya tidak setuju dengan ini, tetapi kebanyakan orang bukan peneliti TCS.
Maks
2
Dengan munculnya Sage, dimungkinkan untuk bekerja dengan bahasa yang bagus dan populer seperti Python sambil masih memiliki perpustakaan matematika gaya Mathematica / Maple / Matlab yang tersedia secara instan.
András Salamon
1
C ++ memiliki tipe / metaprogramming system tercanggih dari semua bahasa pemrograman general purpose umum yang pernah saya lihat, kecuali keluarga bahasa Lisp. Jadi jika Anda tertarik pada teori tipe, desain bahasa atau teori kompiler, atau lebih luas ke dalam semantik formal, Anda mungkin ingin terbiasa dengannya. Selain C ++, Java dan C # adalah suatu keharusan jika Anda ingin melakukan penelitian dalam Ilmu Komputer eksperimental, atau berharap untuk mendapatkan pekerjaan sebagai programmer atau insinyur perangkat lunak di industri. Python harus diajarkan di sekolah menengah: D
Antonio Valerio Miceli-Barone
4
@ AntonioValerioMiceli-Barone: Saya harus tidak setuju, setidaknya untuk teori jenis, desain bahasa, semantik formal dan teori bahasa pemrograman (PLT) secara umum: C ++ bukan bahasa yang dipelajari untuk bidang-bidang itu; TT dan semantik formal berhubungan hampir secara eksklusif dengan pemrograman fungsional, sementara komunitas PL lebih beragam, tetapi lebih memilih bahasa yang lebih elegan daripada C ++. Haskell adalah bahasa "mainstream" dengan sistem tipe paling canggih, diikuti oleh Scala (kurang maju, sedikit lebih mainstream). C ++ memang memiliki fitur menarik, tetapi terlalu rendah untuk selera modern.
Blaisorblade
33

Ada jawaban lain yang belum pernah dibicarakan oleh siapa pun. Pemrograman benar-benar dapat mengarah pada teori yang menarik. Banyak perkembangan baru-baru ini dalam hashing (terutama tabulasi hashing) dimotivasi bukan oleh masalah teoretis semata, tetapi oleh kenyataan bahwa algoritma yang secara teoritis optimal tidak begitu bagus dalam praktiknya. Ini tentu saja adalah sesuatu yang tidak Anda ketahui kecuali Anda dapat menulis kode.

Bahkan dalam bidang algoritma waktu eksponensial yang tepat, suatu motivasi menghasilkan algoritma yang benar-benar dapat bekerja. Pemecah SAT adalah contoh kanonik ini.

Singkatnya, kemampuan kode memungkinkan Anda untuk menyadari kekurangan dan kelemahan dalam apa yang mungkin terlihat seperti hasil teoritis yang optimal, dan yang pada gilirannya membuka arah penelitian teoritis baru.

Suresh Venkat
sumber
Jawaban Anda mungkin dapat membantu pada pertanyaan tentang hasil empiris di TCS .
Gopi
mungkin: tapi utas itu sudah lama mati :)
Suresh Venkat
Memang, saya tidak melihat tanggalnya, itu ada di buletin terakhir yang saya terima, di bagian "Hit terhebat dari minggu-minggu sebelumnya" =).
Gopi
18

Tiga poin:

1) Ada pendekatan untuk matematika yang disebut Matematika Eksperimental (lihat juga wikipedia: // Bukti berbantuan komputer ) di mana Anda menggunakan program komputer untuk menyelidiki tentang pola dan struktur objek untuk menghasilkan bukti analitik tentang objek-objek ini. Untuk pendekatan ini, Anda sebaiknya tahu cara memprogram. Anda dapat yakin bahwa Anda akan membutuhkan pendekatan ini untuk membuktikan pernyataan yang sangat teoretis. Saya percaya bahwa keangkuhan terhadap pemrograman seringkali ternyata tidak terlalu membantu dalam penelitian TCS.

2) Ketika Anda belajar cara memprogram, sebagai produk sampingan Anda belajar keterampilan yang berguna dalam TCS. Salah satu contoh di atas semua: Saya menemukan bahwa orang-orang dengan latar belakang pengkodean cenderung mengetik-memeriksa bukti mereka lebih banyak. Bahkan lebih baik, mereka cenderung sangat sering mendefinisikan jenis objek yang mereka pertimbangkan (mis .: "mari kita pertimbangkan operator dan ). Ini bagus untuk pembaca naskah. Kompiler (dan penerjemah) mengubah kita menjadi ilmuwan yang baik :) Untuk keterampilan semacam ini, saya merasa menyarankan beberapa bahasa fungsional yang sangat diketik.B L ( Y , C )AL(X,Y)BL(Y,C)

3) Ketika Anda mengatakan "ke program" apakah Anda juga bermaksud "untuk program linear " atau "ke program semidefinite "? :)

Alessandro Cosentino
sumber
2
Tidak ada yang saya kenal menggunakan "ke program" untuk "ke program linear" atau "ke program semidefinite". Anda akan mengatakan "untuk membangun / menyelesaikan program linier" sebagai gantinya.
Peter Shor 8/11
2
@PeterShor Point 3 tidak serius
Alessandro Cosentino
3
Dan tentu saja, Anda juga harus belajar program linear dan program semidefinite ... keduanya keterampilan yang berguna.
Peter Shor 8/11
3
+1 untuk poin 2, saya benar-benar diajarkan sedikit OCaml ketika saya masih mahasiswa, meskipun saya hanya menggunakannya selama satu tahun, saya terbiasa memeriksa jenis bukti saya.
Gopi
4
Saya memprogram secara dinamis !
Jeff
16

Terima kasih Gopi untuk pertanyaan ini. Saya ingin memperluas banyak jawaban menarik di dimensi lain yang belum disebutkan.

Penelitian bukan satu-satunya hal yang kami lakukan di universitas: jika Anda ingin tetap di dunia akademis, pada akhirnya Anda harus mengajar. Jika Anda beruntung, Anda harus mengajarkan kursus yang cukup jauh dari bidang spesialisasi Anda. Sangat mungkin Anda akan diberikan kursus dengan komponen pemrograman yang substansial. Di sinilah bahkan kemampuan moderat untuk memprogram membantu secara substansial: Anda akan menjadi guru yang jauh lebih baik jika Anda tahu cara memprogram. Pertama dan terutama, Anda akan lebih nyaman dengan materi, Anda akan dapat menjawab pertanyaan siswa dengan lebih baik, dan Anda memahami kesulitan yang siswa miliki dengan belajar ke program, karena Anda sendiri sudah mengalami proses belajar ini. Selain itu, Anda dapat menghasilkan bahan pengajaran yang lebih baik. Misalnya Anda dapat menguji latihan pemrograman sendiri sebelum memberikannya kepada siswa,

Ada dimensi pragmatis tambahan: mengajar melibatkan berbagai tugas berulang yang sering dapat dilakukan oleh programmer yang terampil, seperti dengan cepat membuat situs web yang dapat digunakan siswa untuk mengirimkan tugas kuliah, dan membuatnya dinilai secara otomatis (sesuai dengan jumlah tes otomatis yang diloloskan oleh kode).

Martin Berger
sumber
"Jika kamu beruntung, kamu harus mengajar kursus yang cukup jauh dari bidang spesialisasi kamu." Apakah itu beruntung ...?
Tsuyoshi Ito
3
@ Tsuyoshi: Ya, itu memaksa Anda untuk membiasakan diri dengan bidang subjek baru. Dalam jangka pendek, itu berarti banyak pekerjaan (yang akan diamortisasi dalam jangka panjang, karena Anda mungkin akan mengajarkan materi ini lebih dari sekali). Pada saat yang sama, itu memperluas cakrawala intelektual Anda secara signifikan.
Martin Berger
@ TsuyoshiIto: Ya!
Jeffε
13

Pemrograman adalah cara yang baik untuk meningkatkan pemahaman Anda tentang berbagai konsep, tetapi juga merupakan waktu yang berbahaya.

Argumen tipikal terhadap pemrograman adalah membuat Anda menghabiskan waktu dengan detail yang tidak penting; argumen umum untuk pemrograman adalah membuat Anda menyadari bahwa detail yang Anda pikir tidak penting sebenarnya penting. Menjadi ahli dalam pemrograman terutama berarti mampu menangani bagian-bagian yang tidak penting dengan cepat. Menjadi baik membutuhkan waktu yang lama .

Adapun bahasa pemrograman untuk belajar: "semuanya" adalah jawaban (lidah-di-pipi) saya.

Radu GRIGore
sumber
2
Akhirnya argumen menentang pemrograman :).
Gopi
1
@ Gopi, saya pikir pemrograman bisa sangat menyenangkan dan pemahaman yang lebih baik yang Anda dapatkan sangat penting. Jawaban lainnya memberikan contoh yang bagus tentang bagaimana pemrograman membantu pemahaman. Jadi saya akan mendorong Anda untuk belajar pemrograman, dan tidak menyerah jika perusahaan sepertinya tidak membuahkan hasil dengan cepat.
Radu GRIGore
6
Teorema pembuktian juga merupakan cara yang baik untuk meningkatkan pemahaman Anda tentang berbagai konsep, tetapi juga merupakan waktu yang berbahaya.
Jeffε
@ Jɛ ff E, pendapat saya dipertahankan oleh substitusi [pseudocode-> proof di atas kertas, kode-> proof di asisten bukti].
Radu GRIGore
12

Saya terlambat ke pesta, dan ini semua jawaban yang bagus, tapi saya punya alasan lain:

Visualisasi.

Ya, seringkali Anda akan bekerja dengan hal-hal yang tidak dapat divisualisasikan, tetapi sering kali Anda akan bekerja dengan hal-hal yang bisa. Mengetahui cara memprogram sangat diperlukan untuk tugas ini, dan visualisasi dapat memberi Anda banyak wawasan tentang suatu masalah.

John Moeller
sumber
3
Saya tahu cara memprogram, dan saya benar-benar putus asa dalam visualisasi. Saya juga curiga ada alat yang memungkinkan Anda memvisualisasikan sesuatu tanpa melakukan banyak pemrograman; jika tidak ada, harus ada, dan mungkin akan ada dalam beberapa tahun.
Peter Shor
@PeterShor: Karena Anda tidak menggunakan C ++! (Just kidding)
Tsuyoshi Ito
1
@PeterShor: Saya tidak merujuk pada bahasa atau lingkungan spesifik apa pun; MATLAB diperhitungkan di sini. Tetapi mengetahui bagaimana memprogram dapat membuat Anda visualisasi yang seharusnya sangat merepotkan. Sebagai contoh, ruang dua dimensi matriks positif-pasti adalah tiga dimensi, dan saya ingin memvisualisasikan keluarga konstruksi di ruang ini. Saya harus membuat transformasi dan kemudian mengkodekannya untuk benar-benar melihat objek saya.
John Moeller
@ John ... Anda benar, saya tidak berpikir Anda bisa melakukannya dengan cara lain.
Peter Shor
7

Poin singkatnya: mengetahui cara memprogram memberi saya alat tambahan dalam penelitian teori. Ketika saya memiliki algoritme yang saya pikir akan berfungsi, jika cukup mudah, saya mungkin kode itu dan memeriksa apakah itu benar-benar. Jika ide saya tidak (bahkan) bekerja dalam praktek, itu tidak mungkin bekerja secara teori, dan pendekatan ini sering menyelamatkan saya dari tenggelamnya waktu yang sangat besar untuk mencoba membuktikan sesuatu yang salah.

Lev Reyzin
sumber
Tsuyoshi Ito menulis argumen serupa dalam jawabannya (poin kedua :)).
Gopi
Ups, Anda benar - saya melewatkannya.
Lev Reyzin
5

Tidak ada seorang pun di sini yang membahas masalah praktis mengapa seseorang yang mempelajari TCS harus belajar pemrograman.

Jika Anda berencana untuk mengambil gelar PhD di TCS di departemen Ilmu Komputer, ada kemungkinan Anda perlu mengambil beberapa mata kuliah non-teori, dan itu hampir pasti akan sangat intensif pemrograman. Bergantung pada program yang Anda ikuti, Anda mungkin perlu pengetahuan tentang mata pelajaran non-teori untuk lulus ujian kualifikasi Anda.

Ketika Anda menyelesaikan PhD, sebagian besar peluang kerja untuk TCS ada di dunia akademis. Jika Anda bekerja di dunia akademis, Anda akan diharapkan untuk mengajar, dan Anda mungkin diharapkan untuk mengajar kelas CS tingkat sarjana tingkat dasar yang akan lebih banyak pemrograman daripada teori. Bahkan jika Anda mengajar kelas teori untuk undergrads, seperti Algoritma, Anda dapat berharap bahwa siswa Anda akan tahu lebih banyak tentang pemrograman daripada teori, dan tanpa mengetahui apa yang diketahui siswa Anda, akan sulit bagi Anda untuk menjembatani kesenjangan dalam pemahaman mereka. . Saya ngeri membayangkan undergrad CS yang diajarkan oleh seseorang yang tidak tahu pemrograman!

Jika Anda tidak peduli dengan masalah praktis ini, maka Anda mungkin bisa melakukan riset tanpa benar-benar tahu apa-apa tentang pemrograman. Tentu saja Anda memiliki banyak perusahaan dalam komunitas TCS, tetapi jarak tempuh akan bervariasi tergantung pada area teori mana Anda bekerja. Misalnya, jika Anda melakukan teori kompleksitas komputasi murni, membuktikan batas bawah pada kelas yang tidak ada yang memiliki pernah mendengar, maka kemungkinan pemrograman tidak akan berguna bagi Anda. Tetapi jika Anda melakukan sesuatu yang lebih algoritmik, maka saya merasa bisa menulis kode kerja bersih yang baik akan memperkuat intuisi Anda jika tidak ada yang lain.

Saya merekomendasikan belajar C (bukan C ++). Ambil salinan K&R dan bacalah dari depan ke belakang. C tidak memiliki banyak fitur mewah bahasa modern, tetapi memang memiliki sintaksis dan semantik yang sederhana namun elegan, yang harus Anda pelajari secara keseluruhan. Namun, bahkan ketika Anda memahami bahasa secara keseluruhan, masih perlu latihan untuk menguasai penulisan kode bebas bug yang bagus dan elegan di C. Namun demikian, jika Anda dapat menguasai pengkodean dalam C, Anda akan dapat menguasai bahasa pemrograman yang Anda temui. Selain itu, disiplin itu akan membantu Anda berpikir bagaimana perangkat keras berpikir, yang akan bermanfaat saat merancang algoritma.

Gagasan seperti pointer sangat penting bagi siapa saja yang mendesain algoritma, tetapi sayangnya, bahasa seperti Java dan Python mengaburkannya dari Anda, jadi itu sebabnya saya tidak merekomendasikan mereka sebagai bahasa pertama bagi seseorang dengan latar belakang matematika. OOP lebih penting bagi orang yang harus memelihara proyek perangkat lunak besar, bukan seseorang yang merancang algoritma.

Menandai
sumber
0

Saya menyarankan agar Anda tidak menunggu permulaan program studi Anda karena ilmu komputer pada level apa pun melibatkan penerapan algoritma melalui komputer untuk mencapai / memverifikasi / memecahkan teori yang harus Anda hadapi di seluruh program studi Anda, TERUTAMA pada level Anda.

Saya harus memprogram di kelas 10 (sekolah menengah) pertama, dan saya sudah tahu cara menggunakan baris perintah dan ini sangat membantu (ini untuk menunjukkan kepada Anda bagaimana keterampilan pemrograman "dasar" dipertimbangkan dalam CS).

Keheranan rekan-rekan Anda cukup beralasan, karena kodesemu dan algoritma adalah salah satu hal pertama yang harus dipelajari untuk diprogram.

Namun, Anda tidak akan benar-benar tersesat dalam kursus Anda yang akan datang karena Anda dapat menggunakan keterampilan matematika Anda yang lebih luas (sendiri) atas keuntungan Anda untuk melewatkan pemrograman berorientasi objek untuk mengejar lebih cepat belajar bahasa pemrograman fungsional.

  • Pemrograman fungsional SANGAT berorientasi pada matematika, dianggap lebih sulit untuk dipelajari karena latar belakang matematika yang dibutuhkan, dianggap sangat kuat (dalam "sederhana", cara matematika untuk menyelesaikan masalah sulit melalui cara yang elegan dan "bersih").
  • Orientasi objek baik ketika Anda tidak ingin memahami algoritma dan prinsip implementasi yang mendasarinya dan hanya ingin "menggunakan kembali" objek yang sudah ada.

Saya pikir Anda bisa menangani Haskell (biasanya bukan bahasa pertama) karena itu murni matematika, fungsional dan pada dasarnya dapat melakukan apa pun yang Anda inginkan. Mempelajari Haskell akan menempatkan Anda pada level di mana Anda tidak perlu belajar lebih banyak untuk mengikutinya, dan bahkan akan menempatkan Anda dalam situasi kontrol dan kekuasaan atas program studi Anda. Jika Anda menyukai statistik, belajar R adalah nilai tambah, tetapi tidak sedekat Haskell. Saya telah melihat laporan dari matematikawan yang menyatakan betapa terkejutnya mereka tentang kedekatannya dengan matematika dan bagaimana hal itu merangkul cara berpikir mereka.

Juga, tantangan yang perlu ditangani (untuk membuat tangan Anda terbiasa dengan lingkungan pemrograman yang cepat) adalah menginstal dan menggunakan Linux (Ubuntu Linux akan melakukannya). Percayalah, Anda akan belajar banyak dengan bermain dengannya ...

Nasihat ini adalah cara terbaik yang saya tahu untuk mengejar ketinggalan dengan cepat dan tentunya untuk seorang ahli matematika dalam ilmu komputer. Selain itu, komunitas open source sangat ramah dan membantu dan jika Anda buntu, IRC menjadi cara paling langsung untuk berbicara tentang subjek apa pun melalui saluran khusus (terhubung di FreeNode). Ingat: bertanya adalah satu-satunya cara untuk menyelesaikan pertanyaan, baik itu untuk diri sendiri, forum, mesin pencari, atau di ruang obrolan.

Samuel Duclos
sumber
4
Saya tidak tahu berapa banyak Anda menjawab pertanyaan asli: Saya tidak bertanya "bagaimana", tetapi lebih "untuk apa".
Gopi
0

Contoh implementasi C ++ dari sistem bukti interaktif adalah makalah berikut ini: Bukti Interaktif Waktu-Optimal Untuk Evaluasi Sirkuit, oleh Justin Thaler. Ini tersedia di http://people.seas.harvard.edu/~jthaler/ . Tampaknya menjadi langkah menuju tujuan mengembangkan implementasi praktis sistem bukti interaktif tujuan umum.

Makalah serupa dan kode sumber terkait muncul di situs web yang disebutkan di atas.

lgidwani
sumber
3
Apakah Anda akan menjelaskan bagaimana makalah ini terkait dengan pertanyaan yaitu Seberapa pentingkah mengetahui cara memprogram untuk TCS ?
scaaahu
Bahkan jika itu adalah contoh hasil teoretis yang mendapat manfaat dari pemrograman, tidak akan menjawab pertanyaan aslinya?
Jeremy
Pertanyaannya bertanya apakah ada kebutuhan untuk teori kompleksitas untuk mengetahui pengkodean. Makalah yang disebutkan di atas jelas menggunakan hasil eksperimen untuk melengkapi konsep-konsep teoritis; ini membutuhkan pengkodean. Bagaimanapun, butuh waktu yang sangat lama bagi saya untuk menemukan proyek pemrograman yang begitu dekat hubungannya dengan konsep sentral dalam ilmu komputer teoretis. Saya harap posting ini dapat bermanfaat bagi seseorang pada pencarian serupa.
lgidwani