Apakah saya perlu memahami algoritma dan struktur data untuk disebut seorang programmer? [Tutup]


37

Sudah enam tahun sejak saya coding. Pengodean ke semua hal seperti ActionScript, JavaScript, Java, PHP, Ajax, XML HTML, ASP, dll. Saya telah menggunakan array, peta, daftar yang terhubung, set, dll dan di mana pun saya bekerja orang-orang seperti saya. Tetapi setiap kali saya diwawancarai, sangat mungkin bahwa orang bertanya kepada saya tentang hash, pohon, tumpukan, dan antrian. Beberapa pertanyaan ada pada juggling beberapa algoritma penyortiran. Saya tidak tahu apakah saya harus benar-benar mengenal mereka atau haruskah saya berhenti menyebut diri saya seorang programmer. Ada sesuatu dalam diri saya yang juga memberi tahu saya bahkan jika orang yang menanyakan semua pertanyaan ini memilih saya, mereka tidak akan pernah membuat saya mengerjakan hal-hal ini. Apakah saya benar-benar harus mengetahui semua ini?


10
Itu tergantung di mana Anda bekerja dan siapa yang ingin Anda panggil sebagai programmer.
Tim

1
Ya, jika tanpa kata sifat negatif.
duros

Jawaban:


79

Jika yang Anda tahu bagaimana melakukannya adalah menulis kode lem, Anda dapat menyebut diri Anda sendiri kode monyet. Banyak kode lem yang perlu ditulis dan Anda dapat hidup layak sebagai monyet kode. Untuk menyebut diri Anda seorang Real Programmer TM dan dipercaya ketika kode perlu ditulis dari awal, Anda harus mengetahui algoritma, struktur data, manajemen memori, pointer, bahasa assembly, dll. Dan memahami bagaimana menggunakan pengetahuan ini untuk mengevaluasi pengorbanan.


6
Wow, saya setengah berharap ini akan diturunkan menjadi terlupakan oleh orang-orang yang secara politis benar untuk menggunakan istilah "kode monyet".
dsimcha

15
"peranti lunak simian" selalu menjadi terminologi yang disukai
STW

3
Saya tidak sepenuhnya setuju. Jenis perangkat lunak yang ditulis "dari awal" sangat memengaruhi siapa yang mampu menulisnya. Beberapa perangkat lunak membutuhkan kecanggihan yang secara inheren lebih sedikit (atau lebih besar) daripada yang lain.
Nick Spreitzer

8
+1, 20% karena saya setuju, 5% karena "Real Programmer TM", dan 75% karena saya belajar bahasa assembly dan ingin berpura-pura itu sepadan dengan rasa sakit
Carson Myers

3
Sebagian besar pekerjaan yang ada hanya membutuhkan 'kode monyet'. Itu normal bahwa orang-orang di pekerjaan 'kode monyet' cenderung melupakan semua pengetahuannya sebelumnya, membuat dirinya sedikit lebih 'monyet kode' setiap hari, terlepas dari potensinya. :(
cag

32

mereka yang tidak tahu sejarah dikutuk untuk menciptakannya kembali


75
Sebenarnya, mereka yang tidak tahu sejarah dikutuk untuk menciptakannya kembali menggunakan metode O (N 2) atau O (N 3) alih-alih menggunakan metode O (N log N) yang terkenal yang cukup tua untuk membeli minuman keras di ke-50 menyatakan.
John R. Strohm

@ John ROFLMAO - terlalu benar!
Steven A. Lowe

3
.... ditakdirkan untuk

30

Nah, bekerja dalam bahasa seperti JavaScript membuat ini sangat usang, karena Array adalah campuran antara vektor, hash dan pohon dan dapat digunakan sebagai tumpukan atau antrian. Sangat tidak mungkin Anda akan perlu atau dapat menerapkan struktur data dalam JavaScript yang mengungguli kelas Array. Ini juga terjadi di PHP.

Untuk Java OTOH, ada perbedaan. Saya kira perpustakaan standar Java menyediakan Anda tentang struktur data apa pun yang Anda butuhkan. Namun:

  1. Anda perlu mengetahui dan membedakan struktur data tersebut dan memahami bagaimana kinerjanya dalam situasi yang berbeda sehingga Anda dapat memilih yang benar.
  2. Di Jawa, bukan tidak mungkin Anda pada akhirnya ingin menulis implementasi Anda sendiri untuk sebuah hashmap untuk mendapatkan kecepatan yang lebih baik dalam beberapa kasus yang sangat spesifik (misalnya jika kunci yang ingin Anda penuhi memenuhi beberapa kendala khusus yang memungkinkan optimasi).

Ketika datang ke pengurutan algoritma, tidak perlu banyak tahu atau memahaminya, karena tidak perlu untuk mengimplementasikannya sendiri. Namun, jika algoritma seperti itu diberikan kepada Anda, Anda harus dapat memahami dan mengimplementasikannya.

Ada dua hal yang pasti:

  1. Anda bisa berkarier sebagai programmer tanpa mengandalkan pengetahuan seperti ini.
  2. Ini pasti tidak akan menyakiti Anda mengenal mereka.

Struktur data dan algoritme hanyalah hal yang baik untuk dipahami. Dan itu adalah sesuatu yang sangat jelas dan formal dan dengan demikian cukup sepele dibandingkan dengan seluk-beluk aplikasi atau rekayasa sistem. Mereka hanya satu bagian kecil dalam teka-teki, tetapi mudah dipahami - jika Anda mau meluangkan waktu.

Jadi tidak, Anda tidak membutuhkannya, tetapi hanya untuk keuntungan Anda mengenal mereka.


13

Ini mungkin suatu kesempatan di mana ada perbedaan semantik yang bermakna antara 'programmer' dan 'insinyur perangkat lunak.' Dalam konteks ini, secara khusus, kami melihat bahwa Anda memiliki pengetahuan tentang beberapa bahasa pemrograman dan teknologi terkait dan bahwa Anda dapat menggunakannya untuk menghasilkan hasil yang diinginkan. Ini adalah definisi operasional yang bagus tentang 'programmer komputer.'

Saya menganggap diri saya sebagai insinyur perangkat lunak. Dalam sebagian besar aspek pekerjaan saya sehari-hari, saya mungkin melakukan hal yang sama seperti yang Anda lakukan. Saya menggunakan bahasa komputer dan teknologi terkait untuk menghasilkan beberapa hasil yang diinginkan. Namun, saya memiliki pemahaman tentang struktur data dan algoritma, dan saya menganggap pengetahuan itu sebagai dasar yang mendasari kemampuan saya untuk melakukan lebih banyak lagi.

Seringkali - meskipun tidak pernah hari - pekerjaan saya melibatkan menemukan solusi untuk masalah kompleks yang tidak ada solusi yang jelas, tidak ada yang secara langsung ditangani oleh fitur kerangka kerja yang saya gunakan atau kemampuan bahasa yang saya gunakan dengan. Dalam hal ini, saya perlu menganalisis masalah dan menyusun solusi dan kadang-kadang proses ini berjalan di bidang arsitektur skala besar.

Sementara pemahaman yang sangat baik tentang masalah yang lebih dalam ini diperlukan untuk melakukan pekerjaan semacam itu, itu tidak cukup . Dengan kata lain, hanya mengetahui cara kerja tabel hash atau mengapa heap sort biasanya memiliki karakteristik kinerja yang baik tidak cukup untuk menjadi arsitek sistem atau insinyur senior. Ini adalah tempat awal yang logis, dan dari sana Anda dapat mulai menggali lebih dalam dan melakukan perjalanan lebih luas serta mendapatkan pengalaman yang juga diperlukan untuk mengatasi masalah yang lebih besar.

Saya kira bahwa untuk menjawab pertanyaan Anda, Anda harus bertanya pada diri sendiri, "Apa yang saya inginkan? Di mana saya akan pergi dengan karier saya?" Jika Anda puas untuk terus melakukan apa yang Anda lakukan, maka Anda mungkin hanya ingin mempelajari cukup struktur data dan algoritma untuk melewati pertanyaan wawancara yang sebagian besar arbitrer yang Anda hadapi.

Jika Anda ingin tumbuh dalam karir Anda dan Anda memiliki hasrat untuk itu yang sangat penting, Anda harus merangkul mata pelajaran ini sekencang mungkin. Jika Anda punya waktu untuk mengatasinya, pikiran terbuka dan antusiasme sejati, Anda akan menemukan beberapa hal yang indah dan menarik. Saya tidak akan pernah melupakan hari pertama kali saya memahami quicksort. Perasaan gembira dan penemuan mengatur jalan bagi sebagian besar sisa hidup saya, dan saya tidak bisa lebih bersyukur untuk itu. Sekarang, saya tidak bisa membayangkan melakukan apa pun selain bekerja sebagai insinyur perangkat lunak.

Semoga beruntung dengan apa pun yang Anda pilih.


2
Selalu ada solusi yang jelas. Mereka hanya berhenti bekerja ketika persyaratan berubah;) Saya tidak berpikir pengetahuan yang mendalam tentang algoritma dan struktur data adalah prasyarat nyata bagi insinyur perangkat lunak yang baik. Hanya saja Anda jarang melihatnya tanpa itu, karena apa yang dimiliki oleh seorang insinyur perangkat lunak yang baik, adalah haus yang tidak memuaskan akan pengetahuan.
back2dos

+1 Diucapkan dengan baik, 'Saya kira untuk menjawab pertanyaan Anda, Anda harus bertanya pada diri sendiri, "Apa yang saya inginkan? Di mana saya akan pergi dengan karier saya?'
Bill

12

Itu tergantung untuk apa pekerjaan itu. Hal-hal semacam ini adalah pertanyaan wawancara yang cukup standar tetapi juga tidak imajinatif dan mungkin tidak berhubungan dengan pekerjaan sama sekali - tentu saja bukan pekerjaan yang menggunakan teknologi yang Anda daftarkan.

Bagi saya sebagai pertanyaan wawancara pergi mereka menilai baik apakah Anda melakukan gelar Ilmu Komputer (dan bisa mengingatnya) daripada ukuran kemampuan pemrograman umum atau pengetahuan.

Saya menyarankan agar Anda mempelajari hal-hal ini sehingga Anda dapat melewati wawancara, atau Anda hanya menerima bahwa di mana pun menanyakan hal-hal ini bukan untuk Anda, tetapi tidak, Anda tidak perlu tahu mereka untuk menyebut diri Anda seorang programmer.


1
Terima kasih atas jawaban anda. Saya akan berbagi dengan orang-orang lucu wawancara yang mewawancarai saya diperlukan seseorang yang baik di sisi Antarmuka Pengguna menggunakan json css ajax javascript jquery dll. Mereka bertanya kepada saya bagaimana Anda menulis server web. Dan Apa yang terjadi ketika simpan ditekan dalam file kata
sushil bharwani

2
@ushil - Saya pikir itu adalah jenis tempat yang tidak ingin Anda kerjakan ...
Jon Hopkins

@sushil: Saya sepenuhnya setuju dengan @Jon Hopkins. Lebih baik bekerja sebagai pelayan menunggu pekerjaan yang baik daripada mengambil pekerjaan seperti itu. Memiliki idiot yang tidak kompeten sebagai atasan akan membuat Anda sangat frustrasi dan menghambat Anda dalam pengembangan pribadi Anda.
back2dos

6

Pertanyaan bagus Javascript atau Java atau VC ++ adalah bahasa pemrograman super pintar di mana Anda tidak perlu membuat daftar tertaut atau tabel hash dari awal. Tetapi Anda masih harus memiliki kemampuan untuk memutuskan kapan harus menggunakan satu di atas yang lain, hukuman kinerja dan bonus masing-masing bertambah dll.

Saya telah mewawancarai banyak programmer API alias kode monyet, dan dalam sebagian besar wawancara mereka secara rutin gagal merancang sistem yang efisien dan terukur kinerja. Intinya: mengetahui banyak API akan memberi Anda roti, tetapi untuk mentega Anda harus mulai dari dasar-dasar komputasi.


Terima kasih banyak, saya akan menerima saran Anda dan mulai belajar tentang topik-topik itu
Mahmoud Hossam

3

Saya akan menambahkan "ya, tentu saja Anda masih bisa menyebut diri Anda seorang programmer". Tapi Anda ingin menjadi programmer seperti apa? Saya pikir programmer terbaik memiliki setidaknya beberapa landasan teori. Mereka tahu mengapa mereka memilih struktur data / algoritma tertentu serta trade-off yang datang dengan itu. Saya berharap setiap pengembang yang saya wawancarai memiliki setidaknya pemahaman dasar, bahkan jika mereka tidak menggunakan jargon yang sama (walaupun tidak mengetahui jargon berarti Anda akan merasa lebih sulit untuk berkomunikasi dengan pengembang lain).


2

Pengetahuan tentang algoritma memungkinkan Anda untuk dengan yakin mengatakan bagaimana pilihan Anda akan berkembang ! Saya pribadi menganggap ini perlu untuk menjadi programmer senior



1

Tergantung dari proyeknya: Saya seorang Insinyur Komputer dan saya bekerja sebagai programmer analis.

Saya menghabiskan banyak waktu untuk bekerja dalam desain (pengujian, doc, desain kode). Tetapi, ketika saya menemukan bug (atau kinerja yang buruk) atau saya harus mengkodekan struktur data baru (karena persyaratannya sangat BARU untuk aplikasi), saya harus memahami di mana masalah dalam algoritme dan saya harus memperbaikinya ( Saya melakukan ini tidak terlalu baik, jadi :))

Algoritma dan struktur data klasik adalah semacam "pola kamus" di dunia pengembang.

Beberapa tautan luar biasa:


1

Anda mungkin menjadi programmer yang baik sekarang, tetapi pengetahuan tentang Struktur Data, Algoritma dan pengetahuan tentang topik lain dalam ilmu komputer tentu akan banyak membantu dalam meningkatkan diri Anda dalam banyak hal:

  • Anda mungkin bisa lebih efektif dan lebih cepat dalam melakukan sesuatu. Bahkan orang-orang yang sudah memiliki gelar Ilmu Komputer dan tahu banyak dari topik ini akan cenderung untuk mengikuti perkembangan terbaru untuk meningkatkan diri mereka sendiri.

  • Pengetahuan ini juga akan baik untuk, jika sampai tingkat yang lebih rendah, katakanlah jika Anda pindah dari programmer ke track manajemen nanti, karena Anda masih akan dapat memahami aspek teknis proyek dengan lebih baik dengan pengetahuan ini.

  • Tentu saja struktur data dan algoritma banyak ditanyakan dalam wawancara, sehingga merupakan satu alasan lagi mengapa mungkin berguna untuk mengetahuinya.


0

Anda menyebutkan hash, pohon, tumpukan, antrian dan algoritma penyortiran. Nah, teknologi yang Anda sebutkan sebagian besar terkait laman web dan skrip web. Setidaknya Anda harus memahami pohon, sehingga Anda dapat bekerja dengan DOM dengan baik. Tetapi jika skrip adalah semua yang perlu Anda lakukan, maka Anda mungkin baik-baik saja. Anda tidak akan memerlukan sebagian besar alat perdagangan untuk programmer sejati. Tapi itu karena ada perbedaan besar antara string-juggling yang membentuk sebagian besar scripting Web dan apa yang kebanyakan dari kita anggap "program menulis."

Saya bekerja dengan hash dan pohon secara praktis setiap hari, dan tumpukan dan antrian lebih jarang tetapi cukup sering. Penyortiran pada dasarnya adalah masalah yang diselesaikan; hampir semua bahasa memiliki quicksort yang dibangun di perpustakaan standar, metode Sortir pada tipe koleksi dasar, dll, tetapi Anda harus tahu dalam keadaan apa kinerja quicksort dapat sangat menurun dan strategi yang tepat untuk menunda penyortiran.

Jika saya tidak tahu prinsip-prinsip ini dan bagaimana cara kerjanya, saya mungkin bisa meretas solusi pengkodean yang berfungsi, tetapi mereka tidak akan menjadi solusi berkualitas sangat baik. Mereka berjalan lambat, sulit dibaca, dan sulit untuk memodifikasi, menggunakan kembali atau memperluas. Jadi jika Anda ingin belajar menjadi programmer yang baik, Anda harus membaca tentang algoritma dan struktur data Anda. Mereka benar-benar akan meningkatkan kualitas kode 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.