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).
learning
computer-science
theory
Jon Hopkins
sumber
sumber
if
danloop
pernyataan yang pernah ditulis menggunakan subset dari dua bidang studi tersebut.Jawaban:
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.
sumber
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.
sumber
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
Ini sedikit pertanyaan yang sulit.
Semua aspek ilmu komputer penting dalam satu atau lain cara.
Memahami Notasi O Besar adalah penting, dan juga memahami bagaimana kode Anda dapat dieksekusi juga sangat penting dalam situasi dunia nyata.
sumber
Ya, ini membuat saya berpikir selama berjam-jam.
Dalam prosesnya, saya harus menghapus beberapa jawaban umum yang sudah diberikan di sini.
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.
Bahasa fungsional Tidak, Satu keluarga bahasa hanyalah satu pendekatan untuk memikirkan masalah. Mengapa hanya bagian ini yang penting?
Menghentikan Masalah Beberapa terlalu spesifik dan orang-orang telah menjalani kehidupan tanpa mengetahui keberadaan mereka.
Dengarkan Jika Anda tidak mendengarkan maka Anda hidup di dunia Anda sendiri. Belum tentu merugikan!
Siklus Pengembangan Perangkat Lunak Nah! Kita masih bisa gagal dengan beberapa perangkat lunak yang luar biasa atau upaya heroik solo.
teori kompleksitas Saya kira ini bisa terjadi tetapi tanpa semua formalisme
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 insertion
dipython
dannot 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.
sumber
Teori Automata dan FSM. :-)
sumber
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.
sumber
hanya ada tiga angka yang penting:
sumber
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.
sumber
Masalah Tersendat
Fakta bahwa ada masalah terkait komputer yang tidak bisa dipecahkan oleh komputer.
sumber
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:
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)
Bahasa yang dapat diuraikan oleh automata dengan memori tumpukan, atau tata bahasa bebas konteks.
Bahasa yang dapat diuraikan oleh mesin Turing, atau automata dengan memori akses acak.
sumber
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:
sumber
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.
sumber
Pemrograman
Dari Departemen Matematika dan Ilmu Komputer Hobart dan William Smith Colleges datang Ilmu Komputer 124 Pengantar Pemrograman :
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 :
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.
sumber
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
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.
sumber
Komputer itu pada dasarnya pencocokan pola, tidak lebih. Semuanya bermuara pada Mesin Turing - Sciencecept komputer klasik konsep menjelaskan pola maching.
sumber
Pemecahan Masalah dan keinginan untuk terus belajar!
Mereka melayani saya jauh lebih baik daripada mengetahui penyortiran cepat dan normalisasi database.
sumber