Apa satu bit teori ilmu komputer yang harus saya ketahui? [Tutup]

27

Berbicara sebagai seseorang dengan gelar Insinyur Elektronik daripada Ilmu Komputer, apa sedikit ilmu komputer saya harus tahu untuk membuat saya lebih baik dunia nyata programmer?

(Dengan dunia nyata saya maksudkan sesuatu yang akan saya gunakan dan mendapat manfaat dari dalam pekerjaan saya sehari-hari sebagai programmer - misalnya saya menyarankan pemahaman normalisasi basis data lebih praktis digunakan daripada memahami semacam cepat yang ada banyak perpustakaan).

Jon Hopkins
sumber
42
1 (maaf, saya harus)
haylem
5
oh, atau yang paling penting! (Aku akan pergi sekarang ...)
haylem
Teori Ilmu Komputer stackexchange mengkonfirmasi apa yang orang lain sebutkan di sini: kompleksitas, struktur data dan algoritma. cstheory.stackexchange.com/tags
chrisaycock
2
Saya merasa perlu untuk keberatan dengan pertanyaan ini. Tidak ada "satu bit" yang cukup untuk dipelajari, dan terlebih lagi, tidak ada (IMHO) satu bit "paling penting". Ada beberapa aspek yang (sekali lagi, IMHO) sama pentingnya untuk CS. Jadi saya pikir sementara jawaban untuk pertanyaan ini mungkin menarik, pertanyaannya bisa dirumuskan dengan lebih baik.
Konrad Rudolph
1
Jika Anda belum memiliki eeng Anda, saya akan mengatakan logika boolean dan / atau teori bilangan diskrit. Hampir setiap ifdan looppernyataan yang pernah ditulis menggunakan subset dari dua bidang studi tersebut.
Steven Evers

Jawaban:

52

Jika saya harus memilih hanya satu bit, yang merupakan keputusan yang sulit, saya akan mengatakan pergi untuk notasi O Besar . Memahami implikasi O (n), O (ln n), O (n²), O (2 ^ n), O (n!) Membantu Anda menghindari banyak kesalahan mahal, jenis yang bekerja dengan baik di menguji lingkungan tetapi gagal dalam produksi.

pengguna281377
sumber
2
+1 dan saya akan mengatakan bahwa yang lebih penting bahwa mengetahui bahwa O (n ^ 2) lebih buruk daripada O (lg n) (misalnya) adalah mengetahui cara memperoleh Big-O untuk sepotong kode tertentu.
Dean Harding
3
Sangat tidak setuju. Hal ini relatif sepele, dan ada topik yang lebih menarik di CS. Juga, saya pikir kebanyakan orang berpikir tentang kompleksitas secara intuitif, walaupun mereka mungkin tidak menyebutnya kompleksitas dan mereka mungkin tidak menyebutnya kuadrat, eksponensial, dll.
Magnus Wolffelt
Magnus: Dalam pengalaman saya, kebanyakan orang yang tidak pemrograman sama sekali tidak berpikir tentang kompleksitas, mereka secara intuitif menganggap O (n) untuk semua masalah.
user281377
Saya belum membutuhkan ini secara formal.
CaffGeek
1
Chad: Tidak ada apa-apa tentang notasi-O Besar yang terlalu formalistik, tetapi tanpa nama untuk sesuatu, Anda hampir tidak dapat memikirkan hal-hal itu, apalagi membicarakannya dengan teman-teman Anda.
user281377
19

Ini adalah pertanyaan, semua orang akan memiliki jawaban yang berbeda. Saya akan mengatakan: teori kompleksitas adalah bagian paling penting, bahwa Anda tidak secara langsung belajar sebagai seorang programmer (seperti algoritma dan struktur data), tetapi apa yang dapat mempengaruhi pekerjaan Anda. Ini membantu jika saya tahu, bahwa suatu masalah memiliki kompleksitas kubik, saya tahu bahwa itu akan berskala buruk jika ukuran masalahnya meningkat.

Mnementh
sumber
Saya ingin menambahkan bahwa ini sangat membantu untuk mengetahui apakah Anda memecahkan masalah yang dapat dengan mudah disajikan kembali dalam bahasa yang lebih sederhana.
philosodad
Kompleksitas penting sebagai konsep, tetapi sebenarnya menghitungnya sering tidak. Memahami apa yang kurang kompleks adalah bagian yang penting.
Bill
@ Bill: Tepat. Tetapi bagian itu adalah satu hal yang belum tentu Anda lalui saat berlatih. Teorinya sangat membantu pada bagian itu.
Mnementh
12

Pelajari tentang struktur data, algoritma, dan kompleksitas.

Tidak terlalu banyak hanya untuk mendapatkan pemahaman bahwa mesin bukanlah kotak ajaib dengan kekuatan tak terbatas. Anda tidak bisa melemparkan apa pun padanya dan berharap itu akan berderak dalam milidetik. Itu memiliki batasan lho. Anda harus belajar untuk tidak mengujinya dengan kode Anda.

Lihat juga pendekatan umum untuk memecahkan masalah desain tertentu dalam pemrograman. Pola desain yaitu. Jangan menyembah mereka hanya mengambil ide-ide yang mereka komunikasikan.

Pengetahuan tentang pemodelan basis data juga penting.

Setelah itu hanya bahasa pemrograman, kerangka kerja dan pustaka yang berbeda yang menerapkan atau membiarkan Anda menerapkan konsep inti. Ambil apa pun yang Anda suka dan praktikkan dengan itu.


sumber
Spesifik - ada banyak algoritma dan struktur data.
Jon Hopkins
Hanya yang dasar untuk mendapatkan ide tentang hal-hal itu. Ambil beberapa buku yang tidak terlalu tebal dan selesaikanlah.
1
Itu sedikit lebih dari satu .
7

Ini sedikit pertanyaan yang sulit.

Semua aspek ilmu komputer penting dalam satu atau lain cara.

Dalam hal apa yang Anda akan mendapat manfaat dari hari ke hari, mungkin gambaran umum tentang bagaimana kode Anda bekerja "di bawah tenda" dari kode ke CPU.

Memahami Notasi O Besar adalah penting, dan juga memahami bagaimana kode Anda dapat dieksekusi juga sangat penting dalam situasi dunia nyata.

Malam gelap
sumber
7

Ya, ini membuat saya berpikir selama berjam-jam.

Dalam prosesnya, saya harus menghapus beberapa jawaban umum yang sudah diberikan di sini.

TANPA DAFTAR

  1. Notasi O (n) besar . Sulit untuk mengatakannya di sini, tetapi Tidak, kita secara intuitif dapat mengatasi ketidakefisienan dan membandingkan serangkaian prosedur yang berbeda tanpa pernah mendengar analisis algoritmik asimtotik dari jarak jauh.

  2. Bahasa fungsional Tidak, Satu keluarga bahasa hanyalah satu pendekatan untuk memikirkan masalah. Mengapa hanya bagian ini yang penting?

  3. Menghentikan Masalah Beberapa terlalu spesifik dan orang-orang telah menjalani kehidupan tanpa mengetahui keberadaan mereka.

  4. Dengarkan Jika Anda tidak mendengarkan maka Anda hidup di dunia Anda sendiri. Belum tentu merugikan!

  5. Siklus Pengembangan Perangkat Lunak Nah! Kita masih bisa gagal dengan beberapa perangkat lunak yang luar biasa atau upaya heroik solo.

  6. teori kompleksitas Saya kira ini bisa terjadi tetapi tanpa semua formalisme

Itulah sedikit ide dari Comp Science

Saya akan mengatakan - " Abstraksi Abstraksi Abstraksi ... ". Pelajari tentang itu. Lihat contoh di sekitarnya dan pelajari cara membangun menggunakannya. Di mana-mana. Seluruh ilmu komputer, teknik dan aplikasi tampak seperti lapisan demi lapisan abstraksi.

Setelah Anda mengetahui hal ini, Anda mulai belajar untuk melihat-lihat dengan baik.

Ketika Anda melihat seseorang menggunakan list insertiondi pythondan not append, Anda tersenyum karena Anda tahu bahwa daftar python dibangun menggunakan berbagai abstraksi di mana sisipan yang mahal dan append lebih murah.

Ini hanyalah satu contoh.

pyfunc
sumber
Memberi +1 untuk jawaban yang sudah jelas Anda pikirkan.
Jon Hopkins
hanya komentar atas komentar Anda tentang Masalah yang Terputus-putus: "Hidup tanpa mengetahui keberadaan" adalah benar untuk topik ilmu komputer APA PUN.
4

Teori Automata dan FSM. :-)

Prasoon Saurav
sumber
3

Kasus penggunaan yang kompetitif dari struktur data.

Ada situasi di mana peta dengan pohon merah-hitam diperlukan untuk menjamin kinerja dan yang lain di mana Anda tidak dapat menggunakan array, lagi untuk menjamin kinerja. Mengetahui kapan harus memilih struktur data apa merupakan keterampilan yang tak ternilai.

Fanatic23
sumber
3

hanya ada tiga angka yang penting:

  • nol
  • satu
  • banyak
Steven A. Lowe
sumber
tetapi bukankah itu menyiratkan bahwa '3' juga penting?
Javier
Seharusnya nol, satu, dan tak terbatas: en.wikipedia.org/wiki/Zero_One_Infinity
Thomas Owens
@Javier: 3 adalah bagian dari banyak
Steven A. Lowe
@ Thomas: bilang siapa?
Steven A. Lowe
@ Seven Pemahaman saya mungkin tidak 100%, di sini, tapi saya pikir idenya adalah bahwa Anda tidak memiliki sesuatu, satu hal, atau jumlah hal yang Anda miliki harus dibatasi. Jika Anda tidak membatasi untuk tidak ada atau satu instance, maka Anda tidak boleh membatasi instance. Namun, saya tidak sepenuhnya yakin MENGAPA hal ini terjadi (saya hanya samar-samar akrab dengan konsep Zero / One / Infinity).
Thomas Owens
3

Hal terpenting yang saya pelajari di CS (dan sebagai pengembang selama bertahun-tahun dan sebagai arsitek) adalah kemampuan untuk memecahkan masalah berdasarkan volatilitas dan bukan pada fungsi. Semua desain yang baik mengisolasi dan merangkum volatilitas. Semua pengembang / arsitek yang baik melakukan ini secara intuitif bahkan jika mereka belum meresmikannya dalam pemikiran mereka. Alasan besar kegagalan proyek adalah kegagalan untuk memecah masalah berdasarkan volatilitas dan merangkumnya. Kegagalan untuk merangkum volatilitas pasti menyebabkan kompleksitas lari dan kegagalan proyek.

JP Alioto
sumber
Apa yang Anda maksud dengan volatilitas?
amara
3

Masalah Tersendat

Fakta bahwa ada masalah terkait komputer yang tidak bisa dipecahkan oleh komputer.


sumber
3

Anda harus tahu cukup teori automata untuk bisa tahu di mana masalah yang Anda hadapi jatuh dalam hierarki bahasa formal. Dari itu, Anda bisa mengetahui beberapa kegunaan praktis yang penting, seperti mengapa Anda tidak boleh menggunakan REGEX untuk mem-parsing HTML (HTML membutuhkan tata bahasa bebas konteks untuk menggambarkannya), dan mengapa diperlukan waktu lebih lama untuk mengkompilasi C ++ sebagai lawan dari Java atau C # (C ++ membutuhkan mesin Turing, sementara Java dan C # dapat dijelaskan dengan tata bahasa bebas konteks).

Tingkatan terpenting dari bahasa formal adalah, dari yang terlemah ke yang terkuat:

  1. Bahasa yang dapat diurai oleh automata terbatas, atau REGEX (implementasi REGEX dengan backreferences lebih kuat dari kategori ini, tetapi mereka masih tidak dapat menguraikan semuanya dalam kategori 2)

  2. Bahasa yang dapat diuraikan oleh automata dengan memori tumpukan, atau tata bahasa bebas konteks.

  3. Bahasa yang dapat diuraikan oleh mesin Turing, atau automata dengan memori akses acak.

Dan Monego
sumber
Um, tidak. Ekspresi reguler mem-parsing tata bahasa biasa. Itulah kategori tata bahasa yang dapat diterima oleh automata keadaan terbatas. Dan 'Chomsky Grammar' tidak merujuk secara eksklusif pada tata bahasa bebas konteks, yang merupakan proses tumpukan mesin.
philosodad
@ philosodad - Tata bahasa gratis konteks lebih tepat, dan saya telah memperbarui posting untuk menggunakan istilah ini. Saya tidak mengerti masalah Anda dengan apa yang saya katakan tentang ekspresi reguler.
Dan Monego
@Dan - Masalah saya adalah bahwa ekspresi reguler sama kuatnya dengan automata keadaan terbatas, dan jika Anda dapat menguraikan SETIAP tata bahasa bebas konteks deterministik dengan mesin daripada Anda dapat menguraikan SEMUA tata bahasa bebas konteks deterministik.
philosodad
Atau, lebih tepatnya: Anda perlu tumpukan atau tidak. Jika Anda benar-benar membutuhkan stack untuk mem-parsing suatu bahasa, maka Anda harus memiliki stack untuk mem-parsing bahasa, dan oleh karena itu, jika suatu bahasa membutuhkan stack untuk menguraikannya, Anda dapat menguraikan bahasa itu.
philosodad
@ philosodad - Ada dua jenis ekspresi reguler - ekspresi reguler dalam teori, dan ekspresi reguler seperti yang diterapkan dalam perangkat lunak. Anda benar tentang ekspresi reguler teoretis, tetapi sebagian besar implementasi memiliki beberapa fitur di luar basis teoretisnya, dan dapat mencocokkan beberapa bahasa non-reguler, seperti ^ n untuk non prime n. Karena ini adalah utas tentang teori dalam praktiknya, saya berusaha untuk menyebutkan bahwa ada perbedaan antara definisi formal dan yang digunakan di alam liar.
Dan Monego
2

Yah, saya bisa memberikan jawaban yang membosankan: teori automata, dan teori informasi.

Atau saya bisa memberi tahu Anda apa yang saya pelajari dari konsultan perangkat keras sejak lama:

  • "Cukup Baik" tidak cukup baik.
Mike Dunlavey
sumber
1

Siklus Hidup Pengembangan Perangkat Lunak adalah sesuatu yang saya sarankan ketahui jika Anda belum melakukannya. Memang ini diperkenalkan pada tahun kedua kursus Ilmu Komputer dan merupakan sesuatu yang digunakan berulang kali dalam proyek perangkat lunak. Ini bisa berguna untuk mendapatkan ide umum tentang bagaimana proyek berjalan dari awal hingga selesai, meskipun jika Anda ingin lebih mendalam ada metodologi seperti Waterfall atau Agile yang bisa Anda pelajari untuk mendapatkan pengetahuan yang lebih spesifik.

JB King
sumber
2
Hukum Murphy: Apa pun yang salah, akan salah
Richard
Ini bukan teori CS, tapi ini jawaban yang bagus.
justkt
1

Pemrograman

Dari Departemen Matematika dan Ilmu Komputer Hobart dan William Smith Colleges datang Ilmu Komputer 124 Pengantar Pemrograman :

Topik meliputi struktur kontrol, objek, kelas, pewarisan, struktur data sederhana, dan konsep dasar pengembangan perangkat lunak.

Jika Anda tidak dapat memprogram, Anda tidak akan terlalu jauh dalam komputasi dunia nyata.

Dan, ya, saya perhatikan Anda adalah programmer. Ini untuk meningkatkan pengetahuan Anda secara keseluruhan tentang teori pemrograman dan apa pendekatan lain yang tersedia untuk Anda.

Apakah pemrograman Ilmu Komputer seperti yang kita kenal?

Menanggapi komentar dari @ Thomas Owens, yang menunjukkan (dengan benar) bahwa pemrograman tidak sepenuhnya Ilmu Komputer, saya ingin mengutip dari artikel Ilmu Komputer Wikipedia :

... fokus ilmu komputer lebih pada memahami sifat-sifat program yang digunakan untuk mengimplementasikan perangkat lunak seperti game dan browser web, dan menggunakan pemahaman itu untuk membuat program baru atau meningkatkan yang sudah ada ...

Jadi, ketika saya membacanya, dengan pemrograman Anda menunjukkan pemahaman Anda tentang teori pemrograman. Ini pada gilirannya akan membantu Anda untuk membuat kode sederhana dan elegan yang menyenangkan bagi orang lain untuk bekerja dengannya.

Gary Rowe
sumber
Pemrograman bukanlah teori CS. Bahkan, saya bisa dengan mudah berpendapat bahwa pemrograman bukanlah ilmu komputer sama sekali.
Thomas Owens
@ Thomas Owens Saya telah memperbarui jawaban saya untuk mendukung klaim saya bahwa itu valid. Bisakah Anda memeriksanya dan memberi tahu saya pendapat Anda?
Gary Rowe
1
Masih tidak berpikir pemrograman itu CS. Pemrograman MUNGKIN berguna bagi ilmuwan komputer yang ingin mengimplementasikan algoritma atau struktur data, tetapi topik dalam teori CS (dari buku Intro ke CS Theory saya, jadi mungkin ada topik yang lebih maju juga) termasuk logika, teori automata, teori grafik , kemampuan komputasi, kompleksitas komputasi, dan analisis algoritma. Saya juga akan mengatakan bahwa bahasa pemrograman (teori di balik desain dan implementasi bahasa) juga merupakan bagian dari ilmu komputer. Namun, Anda tidak perlu bisa memprogram untuk menjadi ilmuwan komputer yang baik.
Thomas Owens
@ Thomas Owens, saya mengerti maksud Anda, dan (memakai topi murni) saya setuju. Namun, OP meminta sedikit CS yang akan membantunya di dunia nyata. Saya berpegang teguh pada pendapat saya bahwa teori pemrograman (seperti yang diterapkan dalam kode yang baik) adalah yang sedikit. Saya telah mengedit sedikit sesuai.
Gary Rowe
Ya. Dari CS, saya akan mengatakan memahami bahasa pemrograman dan paradigma mungkin membantu (terutama jika Anda menerapkan DSL, tetapi mengetahui banyak paradigma seperti prosedural, fungsional, OO, logika hanya membantu dalam pengembangan perangkat lunak). Memahami algoritma dan struktur data juga membantu Anda memilih yang tepat untuk menyelesaikan masalah Anda dengan cara yang paling efisien. Teori Automata mungkin membantu (saya pernah bekerja dengan sistem yang pernah menjadi FSM raksasa, tapi saya tidak tahu seberapa umum itu). Jadi saya akan mengatakan struktur data, algoritma, dan teori PL akan menjadi hal yang paling berguna untuk diketahui dari CS.
Thomas Owens
1

Saya harus tidak setuju dengan Konrad Rudolph. Ada "Sedikit" ilmu komputer yang harus Anda ketahui untuk menjadikan Anda "programmer dunia nyata" yang lebih baik. Jika Anda tidak mengambil hal lain dari jawaban yang Anda dapatkan di sini, setidaknya pertimbangkan ini- Memuaskan persyaratan TIDAK sama dengan memuaskan klien! Pengguna akhir akan SELALU mencoba menggunakan program Anda dengan cara yang tidak pernah Anda pikirkan atau kodekan. SELALU, SELALU, SELALU.

Oleh karena itu, untuk menjadi programmer yang lebih baik, Anda harus MENDENGARKAN terlebih dahulu. Dengarkan klien. Dengarkan kebutuhan mereka. Dengarkan keinginan mereka. Dan terutama, dengarkan level "tech-pertise" mereka. Saya tidak bisa memberi tahu Anda berapa kali saya melihat sebuah proyek yang dibangun persis seperti yang diminta, tetapi tidak sama sekali apa yang sebenarnya dibutuhkan klien. Semua karena programmer yang mengumpulkan req tidak benar-benar mendengarkan.

Hal lain yang dapat Anda ambil adalah, kecuali Anda memiliki latar belakang dalam desain UI, minta seseorang untuk merancang UI. Saya SELALU dapat menemukan aplikasi di mana UI dirancang oleh programmer dan bukan ahli. Apa yang logis dan masuk akal bagi Anda tidak akan masuk akal bagi klien. Dan, jika klien Anda tidak memiliki teknologi, (dan siapa?) Maka solusi "fungsional Anda benar, tetapi secara estetis jelek" akan bertemu dengan kehangatan sigung di pesta makan malam.


sumber
3
Jawaban ini tidak berhubungan dengan teori CS, yang ditanyakan Hopkins.
James
1

Bahasa fungsional!

Mempelajari bahasa fungsional membuat Anda berpikir dalam hal ekspresi, alih-alih langkah-langkah dan menamai status yang bisa berubah (variabel). Ini memiliki dampak signifikan pada kemampuan Anda untuk secara efektif menangani masalah pemrograman setiap hari - terutama sekarang karena hampir setiap bahasa populer memiliki fitur fungsional.

Algoritma dan teori kompleksitas juga penting, tetapi agak kurang menarik karena sebagian besar memungkinkan Anda meletakkan nama pada hal-hal yang biasanya sudah Anda ketahui dan dapat disimpulkan.

Magnus Wolffelt
sumber
0

Komputer itu pada dasarnya pencocokan pola, tidak lebih. Semuanya bermuara pada Mesin Turing - Sciencecept komputer klasik konsep menjelaskan pola maching.

therobyouknow
sumber
-2

Pemecahan Masalah dan keinginan untuk terus belajar!

Mereka melayani saya jauh lebih baik daripada mengetahui penyortiran cepat dan normalisasi database.

Bryan Harrington
sumber
6
Itu bukan teori ilmu komputer, mereka berlaku sama untuk elektronik (atau cukup banyak bentuk lain dari) rekayasa.
Jon Hopkins
Cara saya melihatnya, untuk mengambil contoh Anda dengan mengetahui penyortiran cepat hanya tidak membantu. Mengetahui keberadaannya dan apa yang istimewa adalah membantu, tetapi juga merupakan satu pencarian google jika saya tidak tahu apa-apa tentang itu. Mengetahui salah satu algoritma juga tidak membantu. Namun, mengetahui cara membuat dan menafsirkannya adalah! Mungkin jika saya bisa mengubah jawaban saya, Kompleksitas mungkin yang paling penting.
Bryan Harrington
1
Anda tidak dapat mencari sesuatu jika Anda tidak tahu Anda membutuhkannya atau itu ada. Jawaban Anda mencantumkan kualitas penting yang harus dimiliki pengembang, tetapi tidak menjawab pertanyaan yang diajukan.
Adam Lear