Saya harus mengakui bahwa saya tidak begitu kuat dalam struktur data ketika saya lulus dari perguruan tinggi. Sepanjang penempatan kampus selama wisuda saya, saya telah menyaksikan bahwa sebagian besar perusahaan teknologi besar seperti Amazon, Microsoft dll berfokus terutama pada struktur data. Tampaknya struktur data adalah satu-satunya hal yang mereka harapkan dari seorang lulusan.
Sejujurnya, saya merasa tidak enak tentang itu. Saya menulis kode yang bagus. Saya mengikuti pola desain standar pengkodean, saya memang menggunakan struktur data tetapi pada tingkat yang dangkal seperti di Java terkena API seperti ArrayList, LinkedList dll. Tetapi perusahaan biasanya berfokus pada aspek-aspek rumit dari Struktur Data seperti manipulasi memori berbasis pointer dan kompleksitas waktu.
Mungkin karena latar belakang Java saya, saat itu, saya mengerti efisiensi kode dan logika hanya ketika berbicara dalam hal Pemrograman Berorientasi Objek seperti objek, instance, dll tapi saya tidak pernah mengebor ke tingkat bit dan byte. Saya tidak ingin orang-orang memandang rendah saya karena defisit pengetahuan saya dalam Struktur Data.
Jadi sungguh mengapa semua ini menekankan pada Struktur Data?
sumber
Jawaban:
Tidak, masih ada lagi. Misalnya, kami juga berharap Anda menjadi pembelajar cepat yang dapat mempelajari kerangka kerja baru, API, atau bahkan bahasa pemrograman dalam waktu singkat. Itu bar minimum yang telanjang. Seseorang yang membutuhkan waktu lama untuk mempelajari kerangka kerja baru, API atau bahasa tidak akan menjadi pengembang yang sukses di sebagian besar tim di Microsoft.
Dan tentu saja ada lebih banyak aspek yang kita fokuskan dalam wawancara selain hanya pengetahuan mentah tentang struktur data. Kemampuan untuk berurusan dengan spesifikasi yang ambigu, misalnya, atau kemampuan untuk mengenali pola pengkodean yang menghasilkan kode tidak aman, atau selusin hal lainnya. Tetapi kemampuan untuk memahami struktur data tentu saja sangat besar.
Hal ini terutama terjadi bahwa wawancara bias terhadap pengujian pengetahuan tentang struktur data untuk lulusan CS baru-baru ini. Lulusan baru-baru ini, kebanyakan dari mereka tidak memiliki banyak pengalaman di dunia nyata, tidak diharapkan untuk menjadi baik dalam hal-hal yang sama dengan seseorang yang memiliki pengalaman industri selama lima belas tahun.
Adalah baik bahwa Anda mengetahui hal itu tentang diri Anda sendiri. Jika Anda tidak dapat atau tidak mau mengubah itu tentang diri Anda maka rekomendasi saya adalah Anda tidak melamar pekerjaan yang membutuhkan fasilitas dengan struktur data.
Ini tautologis bahwa seorang programmer yang baik adalah seorang programmer yang pandai membangun jenis-jenis program yang perlu dibangun. Banyak programmer bekerja pada tugas-tugas yang tidak memerlukan pengetahuan mendalam tentang struktur data. Beberapa dari mereka mengerjakan tugas yang membutuhkan pengetahuan mendalam tentang desain antarmuka pengguna, misalnya. Atau normalisasi basis data. Atau terserah. Orang-orang itu masih bisa menjadi "programmer yang baik" di domain mereka.
Saya mengajukan pertanyaan wawancara tentang struktur data karena di tim saya pengembang mendesain, mengimplementasikan dan memanipulasi struktur data yang kompleks setiap hari setiap hari. Kemarin kami memiliki empat jam pertemuan di mana setengah lusin pengembang berpendapat pro dan kontra menambahkan bidang Boolean tunggal ke simpul pohon tertentu. Mungkin tidak ada keahlian di tim saya yang lebih penting daripada kemampuan untuk memahami struktur data pada level yang dalam. Sungguh bodoh untuk tidak menanyakan pertanyaan wawancara tentang hal itu, karena itulah yang kami lakukan.
Yah itu pasti akan mencegah Anda mendapatkan pekerjaan di tim saya. Tapi seperti yang saya katakan sebelumnya, pemrograman adalah bidang yang sangat besar . Ada banyak jenis pemrograman komputer yang tidak memerlukan pengetahuan tentang struktur data.
Tidak. Tetapi hampir selalu cukup untuk mendeteksi pengembang yang tidak mungkin berhasil di Microsoft. Karena itulah yang saya terutama tertarik untuk mendeteksi, pengetahuan tentang struktur data adalah salah satu faktor yang saya uji dalam wawancara.
sumber
Satu poin penting tentang struktur data adalah bahwa mereka bersifat universal dan tidak lekang oleh waktu, setidaknya untuk tujuan praktis. Siapa pun yang telah menjadi pengembang dalam 30 tahun terakhir harus mengetahui struktur data dasar seperti daftar tertaut tunggal / ganda, pohon biner, atau grafik. Jika Anda bertanya kepada dua pengembang tentang mereka, Anda dapat membandingkan pengetahuan pengembang dengan jawaban mereka. Ini hampir tidak bisa dikatakan untuk kerangka kerja atau bahkan bahasa: Jika Anda bertanya kepada dua pengembang tentang Rails, dan yang satu tahu lebih banyak daripada yang lain, apa artinya itu bagi Anda, sungguh? Seperti yang Anda katakan dalam pertanyaan, pengembang yang cerdas dapat mempelajari kerangka kerja baru dengan cukup cepat, jadi menguji pengetahuan mereka saat ini tidak masuk akal.
Iya. Pastinya. Kecuali Anda ingin menghabiskan seluruh hidup Anda menulis aplikasi CRUD.
Tidak, itu tidak cukup. Tetapi ada beberapa hal yang bisa Anda tanyakan dalam wawancara kerja yang cukup. Dan saya akan mengatakan algoritma pengetahuan adalah salah satu indikator yang lebih baik, setidaknya untuk orang-orang yang baru keluar dari sekolah, di mana Anda tidak dapat bertanya tentang pengalaman kerja.
sumber
Tidak terdengar terlalu keras, tetapi setiap pengembang yang setengah layak akan dapat mengambil bahasa atau kerangka kerja baru dalam periode waktu yang relatif singkat.
Struktur data bersifat universal, mereka adalah blok bangunan dasar ilmu komputer - pohon merah-hitam pada dasarnya sama, apakah itu diterapkan di Jawa, Python, PHP atau apa pun. Jadi, alih-alih menguji bahasa tertentu, atau kerangka kerja tertentu, pemberi kerja (setidaknya, pemberi kerja yang mencari pengembang yang menonjol) akan menguji apakah Anda mengetahui dasar - dasar ilmu komputer, daripada sekadar rasa apa pun yang mereka miliki bulan ini. sedang menggunakan.
(setidaknya, mereka harus menguji dasar-dasar di samping apa pun yang mereka gunakan saat ini ... tidak ada gunanya menyewa seorang penyihir ilmu komputer jika dia tidak pernah menulis sederet kode dalam hidupnya)
sumber
Apakah Anda percaya bahwa pembalap F1 hanya mengendarai mobil cepat? Tidak, mereka mengerti mobil yang mereka kendarai dan mereka bekerja dengan mekanik / insinyur untuk menyetelnya. Tentu saja, pengemudi normal hanya mengemudi.
Anda bisa menjadi programmer normal / rata-rata yang hanya menulis kode. Anda tidak mengerti apa yang ada di belakang. Anda menyelesaikan sesuatu. Itu saja, sampai jumpa hari berikutnya.
Tetapi banyak perusahaan mencari pengembang F1. Orang yang akan berkembang mengetahui apa yang ada di balik kode mereka. Orang yang juga akan membantu perusahaan untuk membangun sesuatu yang lebih baik.
Cukup baik untuk mengetahui struktur data tidak hanya karena Anda akan menggunakannya dalam bentuk "pra masak". Ini juga bagus karena Anda akan menciptakan sesuatu yang berasal dari ide mereka.
sumber
Di kelas saya tentang struktur data, hal pertama yang dikatakan profesor adalah: Kelas ini bukan tentang kemampuan mencari dengan sangat cepat. Kami kemudian menghabiskan setengah tahun untuk menemukan struktur data dan algoritma terbaik untuk mencari dengan sangat cepat.
Tetap saja, dia tetap benar. Mampu menganalisis struktur data, menerapkan struktur data yang tepat untuk masalah tertentu atau bahkan menghasilkan struktur data baru membutuhkan banyak kualitas seorang insinyur:
Ketika Amazon dan Microsoft merekrut orang, mereka tidak mengajukan pertanyaan tentang struktur data karena mereka berharap dapat menemukan quicksort berikutnya . Mereka ingin memastikan mereka mempekerjakan seseorang dengan kualitas yang disebutkan di atas.
Tentu saja mungkin untuk memiliki seperangkat kualitas ini dan masih menyedot struktur data. Tetapi kemudian, jika itu masalahnya, Anda tidak perlu waktu lama untuk menjadi ahli dalam struktur data.
Yang sedang berkata, masih ada masalah yang
ArrayList
hanya tidak cukup skala. Ketika sistem menjadi besar, solusi adaptasi yang lebih baik diperlukan untuk melakukan pekerjaan itu. Dan tanpa pemahaman yang baik tentang struktur data, Anda tidak akan dapat menemukan dan menyusun struktur dan algoritma yang berskala luas dalam skenario konkret Anda.sumber
ArrayList
, tanpa pemahaman yang baik tentang struktur data Anda bahkan mungkin tidak menyadari bahwaArrayList
itu tidak cukup skala dan Anda perlu menemukan dan menyusun struktur dan algoritma skala itu.Secara umum algoritma dan struktur data dianggap sebagai dua topik yang paling "inti" dalam pemrograman. Ini karena ada banyak sekali pekerjaan dan penelitian tentang mereka dalam ilmu komputer. Mereka juga menarik program "lobus kiri" khas yang menyukai hal-hal seperti matematika dan sains (yang banyak programmer)
Yang sedang berkata, pengetahuan ini dapat mempengaruhi karir Anda dalam hal wawancara, terutama jika Anda wawancara di tempat kerja yang berorientasi teknik seperti google. Perusahaan lain sekarang mungkin peduli dengan aspek itu sama sekali.
Dalam pengalaman saya, algoritma / tuntutan struktur data kadang-kadang dapat dianggap sebagai "programmer elitism" di mana alpha geeks berebut untuk menunjukkan siapa yang paling pintar. Itu selalu baik untuk mengetahui apa yang ada di luar sana, tetapi ada banyak pekerjaan pemrograman yang berbeda di mana Anda tidak perlu tahu bagaimana menggunakan pohon merah / hitam atau kode pencarian boyer-moore.
Saya akan merekomendasikan belajar lebih banyak tentang topik-topik tersebut jika Anda menganggapnya menarik dan memiliki beberapa proyek pribadi di mana Anda dapat bermain-main dengannya, jika tidak, Anda mungkin dapat bertahan tanpa topik itu untuk saat ini
PS. Kemahiran dengan struktur data yang belum sempurna (daftar tertaut, kamus, tagar, dll.) Harus menjadi pengetahuan wajib untuk setiap programmer DS.
sumber
Dua alasan.
Untuk satu hal, ini menunjukkan Anda bisa memikirkan masalah dalam istilah abstrak, bukan dalam hal bahasa pemrograman tertentu. Apakah Anda tahu mengapa tabel hash mungkin menjadi pilihan yang lebih baik atau lebih buruk daripada pohon merah-hitam dalam situasi tertentu, terlepas dari penerapan yang mendasarinya?
Untuk yang lain, ada sejumlah orang yang menakutkan di luar sana mewawancarai pekerjaan yang hanya berbohong tentang pengalaman mereka dan memiliki kemampuan pemrograman yang sangat sedikit; pertanyaan struktur data adalah cara cepat menyiangi orang-orang ini.
sumber
Mereka mendasar, tetapi juga, apa yang akan Anda kuis pada lulusan? Mereka mungkin atau mungkin tidak memiliki pengalaman di luar pekerjaan kursus mereka. Kursus mereka mungkin lebih banyak membahas teknologi Microsoft daripada mengatakan Java, atau sebaliknya. Struktur data adalah landasan bersama.
sumber
Sering kali kode terbaik menghindari menciptakan kembali struktur data tingkat rendah. Ini terutama benar dalam bahasa tingkat tinggi. Saya telah memperhatikan tren pertanyaan struktur data tingkat rendah bahkan dalam pekerjaan CRUD. YMMV, tetapi tampaknya penekanan pada keahlian ilmuwan peretas telah membayangi keterampilan lain yang membuat pengembang hebat:
Struktur data sangat bagus. Struktur data penting. Setiap programmer harus memiliki pemahaman tentang mereka. Namun, kita menjadi terobsesi untuk mendorong dasar-dasar ini keluar dari tempatnya. Ini bukan SEMUA tentang struktur data, dan dalam 99% kasus tidak perlu bertanya di luar dasar-dasar struktur data. Jika Anda mewawancarai seorang akuntan, tanyakan kepada mereka apa yang dibagi dengan 9 itu, tetapi jika Anda terus bertanya "Apa akar pangkat tiga dari 98425454242412 * 4512324? ... tanpa kalkulator!" maka Anda akan menakutkan persentase yang baik dari orang-orang yang masuk akal, pintar, berbakat, dan menyenangkan yang bisa Anda miliki. Tanyakan apakah mereka dapat membangun model data relasional dasar, tanyakan apakah mereka dapat menggunakan struktur array ditingkatkan yang disediakan oleh kerangka kerja yang relevan, dan tanyakan apakah mereka dapat menjelaskan kapan pencarian biner lebih cepat daripada pencarian datar, tetapi tidak ada gunanya melangkah terlalu jauh dari itu. Jika mereka dapat melakukan hal-hal itu, maka mulailah mencari yang terbaik, paling profesional, paling kreatif dari kelompok itu.
Saya suka tulisan Joel, tapi saya pikir "Sekolah Jawa" masalahnya salah. Ada banyak hal yang dapat membuktikan seseorang pintar melampaui penguasaan C ++. Pikirkan tentang hal ini, Anda dapat berbicara dengan seseorang selama 10 menit, tanpa bertanya kepada mereka tentang aritmatika pointer, dan mendapatkan ide yang cukup bagus tentang apakah mereka adalah tipe yang dapat menyelesaikan sesuatu dan mencari tahu. Kita tidak perlu seperti ini:
Pewawancara: "Ceritakan tentang prestasi Anda."
Coder: "Di posisi terakhir saya, saya adalah satu-satunya pengembang untuk sistem ERP khusus untuk perusahaan finansial bernilai miliaran dolar. Kami mengirimkan beberapa bulan lebih cepat dari jadwal, dan sistem telah diproduksi selama 3 tahun terakhir."
Pewawancara: "Biarkan saya mengklarifikasi. Ceritakan tentang pencapaian pemrograman Anda "
Coder: "Umm ..."
Pewawancara: "Misalnya, apakah Anda pernah membuat daftar tautan Anda sendiri?"
Coder: "... [berjalan keluar]"
sumber
Menjadi pemrogram yang baik bukan berarti bisa belajar bahasa dan kerangka kerja. Ini adalah tentang membangun solusi untuk masalah yang kompleks. Agar solusi ini menjadi efisien dan andal hampir selalu bergantung pada algoritma yang baik dan penggunaan struktur data yang tepat. Mengetahui struktur data yang ada tidak cukup. Anda perlu memahami struktur data yang cukup untuk menggunakan yang tepat untuk masalah ini. Daftar dan peta menawarkan beberapa fitur yang berharga, tetapi mereka datang dengan biaya, dan menggunakan yang salah dapat secara signifikan merusak kinerja perangkat lunak Anda.
Pewawancara yang baik mengetahui hal ini dan berusaha menentukan apakah Anda dapat berharga bagi tim atau perusahaannya. Bahasa yang akan Anda gunakan 2 tahun dari sekarang mungkin sangat berbeda, tetapi kebutuhan akan algoritma dan struktur data yang efektif tidak akan berubah.
sumber
Struktur data, kompleksitas waktu, manipulasi memori, dan petunjuk adalah dasar-dasar yang harus diketahui oleh seseorang yang menyebut dirinya Ilmuwan Komputer. Monyet kode apa pun dapat mempelajari bahasa dan mempelajari cara menggunakannya, tetapi di mana profesional dan siswa CS harus membedakan diri mereka mengetahui bukan hanya bagaimana menggunakan daftar yang ditautkan atau peta hash, tetapi MENGAPA.
MENGAPA adalah apa yang benar-benar membedakan kita dari skrip dasar kiddie, kode monyet, dan dengusan dunia komputasi. MENGAPA menggunakan tabel hash bukan daftar yang ditautkan, MENGAPA tabel hash saya berada pada kepadatan cluster sekitar 0,6 -8,8, MENGAPA saya harus menggunakan daftar yang terhubung secara melingkar di sini, bukan daftar yang ditautkan secara ganda. MENGAPA kode saya harus berjalan pada efisiensi 'x' dalam kasus terburuk dan 'y' dalam kasus rata-rata.
Struktur data dasar ini dan pengetahuan tidak hanya BAGAIMANA mereka digunakan (bagaimana seharusnya dalam setiap programer repritoire tetap) tetapi bahasa agnostik MENGAPA mereka digunakan, yang cenderung lebih dari apa yang mereka cari dalam kasus ini.
Banyak tempat akan membuat Anda menulis kode dalam bahasa yang Anda tegaskan, tapi itu lebih bersifat umum, mengingat C benar-benar bukan langua franca dari dunia pemrograman lagi, dan penataan kode pseudo dapat berupa kecelakaan dan semua alih tempat dan, dalam kebanyakan kasus dengan kode pseudo / p & p kode tidak benar-benar diajarkan, benar tidak mungkin untuk berurusan dengan.
sumber
Struktur data adalah landasan mendasar dari semua program. Anda tidak perlu harus memiliki pemahaman yang mendalam tentang mereka, tetapi Anda benar-benar harus tahu cara kerjanya.
Mengapa? Karena semua kode Anda berinteraksi dengan dan memanipulasi data. Jika kumpulan data tidak dapat disimpan dalam struktur, maka tidak dapat digunakan. Data ibarat bahan bangunan rumah. Sampai Anda menyatukannya dalam sebuah struktur, Anda hanya memiliki tumpukan papan yang tidak berguna.
Setelah Anda memutuskan bagaimana memikirkan dan menetapkan set data Anda, maka Anda dapat mulai menggunakannya untuk melakukan sesuatu, bagian algoritma klasik dari duo tersebut. Setiap program yang Anda tulis menggunakan struktur data, meskipun dalam banyak kasus struktur ini sangat sederhana sehingga hampir tidak ada. Beberapa variabel untuk data keadaan dan kita selesai!
Setelah Anda bergerak melampaui program-program sepele, hampir semuanya membutuhkan struktur data. Yang mana yang Anda pilih, seorang arsitek profesional yang merancang gedung pencakar langit Anda dengan praktik terbaik dan matematika, atau paman joe bob yang segera mulai membangun?
sumber
Untuk membangun apa yang dikatakan @Pelshoff , itu untuk menunjukkan bahwa Anda tahu apa yang Anda lakukan. Jika Anda menggunakan LinkedList untuk semuanya, itu mungkin menunjukkan Anda tidak tahu apa yang Anda lakukan atau Anda tidak peduli untuk berhenti dan memikirkan masalahnya. Selain itu, setidaknya mata kuliah struktur data yang saya ambil membahas, dasar, teori kompleksitas dari struktur data itu yang, ketika berhadapan dengan set data besar sangat penting. Itu sebabnya perusahaan seperti Amazon atau Microsoft akan melakukan hal seperti itu.
Saya harus mengatakan, sebelum saya mengambil kelas struktur data, saya pikir itu tidak penting, tetapi paling tidak bisa recongnize ketika daftar tertaut (atau ArrayList) tidak praktis atau apa yang menarik dari mereka adalah penting.
sumber
Apakah Anda menulis kode yang baik atau tidak adalah pernyataan subjektif. Penting untuk diketahui bahwa kode fungsional tidak selalu menghasilkan kode yang baik.
Yang mengatakan, struktur data penting karena mereka seperti pekerja di belakang layar yang Anda, sebagai programmer, arahkan. Memang benar bahwa Anda dapat memanggil metode pada struktur tanpa benar-benar memahami apa yang dilakukannya dan Anda dapat memanfaatkan struktur tanpa benar-benar mengetahui bagaimana data disimpan, tetapi mengetahui detail ini akan lebih mempersiapkan Anda untuk memahami kapan saat yang tepat untuk menggunakan satu struktur lebih dari satu. lain.
Mengetahui, misalnya, bahwa Anda dapat melintasi di kedua arah melalui daftar yang ditautkan dua kali lipat dan hanya meneruskan ke depan melalui daftar yang terhubung sendiri dapat membantu Anda menentukan struktur mana yang penting ketika menyimpan data. Anda dapat membuat keputusan pendidikan yang lebih banyak lagi dengan mengetahui bahwa daftar yang ditautkan secara tunggal dapat berpotensi memiliki overhead yang lebih rendah dalam hal konsumsi memori (karena tidak mengandung pointer ke elemen sebelumnya) jadi, jika Anda hanya perlu beralih ke depan melalui daftar, Anda dapat menghemat sebagian memori dengan menggunakan struktur yang sesuai.
Ini hanya contoh kecil dan, pada akhirnya, jika Anda merasa berhasil dengan baik dalam karier Anda tanpa pengetahuan mendalam tentang struktur data maka mungkin Anda tidak perlu belajar lebih banyak. Memahami apa yang terjadi di bawah tenda, benar-benar dapat membantu mengubah kode fungsional menjadi kode yang baik.
sumber
Struktur data adalah blok bangunan dari banyak hal yang ingin Anda lakukan. Jika Anda tahu kegunaan untuk setiap struktur data, kelemahan dan poin kuatnya maka Anda dapat dengan mudah menyelesaikan masalah.
Misalnya, kami memiliki persyaratan untuk mengelola ribuan objek. Sesekali kita perlu memperbarui stempel waktu objek sesuai dengan ID-nya. Sesekali kami harus menghapus objek yang tidak diperbarui selama lebih dari X menit.
Jika Anda tahu struktur data Anda, Anda dapat dengan mudah mendefinisikan masalahnya, dan juga sangat mudah untuk menemukan solusi. Ketika seorang programmer yang tidak tahu struktur data yang cukup mencoba untuk datang dengan solusi, solusinya canggung. Dia seperti Anda - pintar, programmer kode, mampu mempelajari kerangka kerja dengan cepat. Tetapi tanpa pengetahuan dalam struktur data dia harus menemukan roda sendiri. Lebih dari itu - dia kesulitan memahami solusi yang lebih sederhana karena didasarkan pada struktur data yang tidak dia pahami seperti pohon merah-hitam (TreeMap lama di Jawa).
Jadi, saya akan mengatakan bahwa yang penting adalah mengetahui bagaimana dan kapan menggunakan setiap struktur data tanpa harus memikirkannya. Tapi saya tidak berpikir ada cara untuk mencapai itu tanpa benar-benar memahami cara kerjanya.
sumber