Dari seorang penerjemah : Kami menerbitkan untuk Anda terjemahan dari sebuah artikel oleh Steve Merrit , seorang karyawan Google yang berbicara tentang bagaimana dia memecahkan masalah pemrograman yang khas. Posting ini akan berguna terutama untuk programmer pemula.Dalam artikel ini saya akan berbicara tentang strategi saya untuk menyelesaikan masalah yang muncul selama pengerjaan proyek, dari awal hingga selesai. Saya menggunakannya dalam alur kerja harian di Google, serta ketika bekerja dengan coder dari semua tingkatan (kolega, lulusan bootcamps, mahasiswa). Teknik terstruktur meminimalkan waktu yang dihabiskan untuk debugging dan pada saat yang sama mengarah pada pembuatan kode yang lebih baik.
Omong-omong, strategi yang sama sering berhasil selama wawancara di perusahaan teknologi besar. Tiga tahun yang lalu saya mendapat pekerjaan di Google berkat dia.
Kami mengingatkan Anda: untuk semua pembaca "Habr" - diskon 10.000 rubel saat mendaftar untuk kursus Skillbox apa pun menggunakan kode promo "Habr".
Skillbox merekomendasikan: Kursus pendidikan online "Pengembang Java Profesi" .
Langkah demi langkah
Saya akan menunjukkan contoh dalam bentuk masalah khas untuk mengungkapkan topik.
Masalah: โDiberikan dua baris, sourceString dan searchString, Anda harus mengembalikan indeks pertama saat sourceString muncul di searchString. Jika searchString tidak dalam sourceString, kembalikan -1. "
1. Gambarkan
Mulai menulis kode segera bukan ide yang baik. Pertama, Anda perlu menguraikan cara untuk memecahkan masalah. Mulailah dengan membentuk hipotesis dan bukti dari sudut pandang Anda. Dan mulai bekerja hanya ketika Anda sudah memiliki rencana yang jelas. Jika ini tidak dilakukan, maka ketika pekerjaan sudah dimulai, Anda mungkin menemukan fakta bahwa setiap potongan kode tidak akan saling berhubungan.
Solusinya sering bisa nontrivial, bahkan jika tugasnya terlihat sederhana. Perencanaan kertas membantu Anda menemukan pendekatan yang tepat dan memastikannya berhasil dalam situasi lain. Dan Anda akan mempelajari semua ini bahkan sebelum baris pertama kode ditulis.
Jadi jangan mulai menulis kode, jangan pikirkan itu. Anda akan memiliki banyak waktu untuk bekerja. Anda adalah komputer manusia, dan Anda memecahkan masalahnya.
Letakkan algoritma solusi di atas kertas. Jika sesuatu membantu Anda memvisualisasikan rencana Anda, lakukanlah. Tugasnya adalah menyelesaikan masalah dengan pensil dan kertas, tanpa keyboard.
Munculkan input sederhana. Jika fungsi "melewati string", maka "abc" adalah contoh sempurna pertama. Cobalah untuk memahami apa hasil yang benar. Kemudian pikirkan tentang bagaimana Anda memahami masalahnya, langkah apa yang diambil.
Bayangkan bahwa string memiliki nilai-nilai berikut:
sourceString: "abcdyesefgh"
searchString: "yes"
Jadi kita dapat melihat bahwa searchString ada di dalam sourceString. Tapi bagaimana kita sampai pada ini? Kami mulai dari awal sourceString dan membacanya sampai akhir, melihat setiap fragmen tiga karakter untuk melihat apakah itu cocok dengan kata "ya". Misalnya, "abc", "bcd", "cde" dan sebagainya. Ketika kami sampai di indeks 4, kami menemukan "ya" dan karena itu memutuskan bahwa ada kecocokan, dan itu dimulai pada indeks 4.
Saya memiliki seorang guru di institut yang mengatur tugas untuk membuat instruksi membuat sandwich selai kacang. Untuk instruksi yang terperinci dan dapat dimengerti, mereka menjanjikan kami peringkat tertinggi.
Saya menulis yang berikut:
"Buka selai kacang, oleskan di atas roti. Letakkan sepotong roti lagi di atasnya dan Anda sudah selesai. "
Saya pikir saya berhasil sampai guru mengambil mentega dan menyebar di atas roti, yang masih di dalam kantong plastik.
Program, seperti guru saya, membutuhkan instruksi yang sangat terperinci untuk memungkinkan tugas tersebut. Karenanya, saat kami membuat algoritma, kami memastikan bahwa kami menyediakan segalanya - semua skenario yang memungkinkan. Mengembalikan jawaban yang benar ketika pertandingan DITEMUKAN sangat baik, tetapi perlu untuk mengembalikan jawaban bahkan jika pertandingan TIDAK DITEMUKAN.
Mari kita coba lagi dengan sepasang garis lain:
sourceString: "abcdyefg"
searchString: "yes"
Di sini, kami mulai dari awal sourceString dan membacanya sampai akhir, melihat setiap fragmen tiga karakter untuk melihat apakah itu cocok dengan kata ya. Ketika kami sampai di indeks 4, kami menemukan kamu, yang hampir kebetulan, tetapi tidak lengkap, karena karakter ketiga berbeda. Dengan demikian, kami terus membaca hingga mencapai akhir baris, dan kemudian memutuskan bahwa tidak ada kecocokan, jadi kami kembali -1.
Kami membuat serangkaian langkah (dalam pemrograman ini disebut algoritme) yang kami lakukan untuk menyelesaikan masalah, dan kami mencoba menjalankan beberapa skenario, setiap kali mendapatkan hasil yang benar. Saat ini, kami dapat memastikan bahwa algoritme kami berfungsi, dan sekarang saatnya memformalkannya, yang akan membawa kami ke langkah berikutnya.
2. Kami menulis algoritme dengan kata-kata
Ini membuat langkah nyata, yang berarti kita bisa merujuk mereka nanti ketika menulis kode.
- Mulai dari awal baris.
- Kami melihat melalui kombinasi tiga karakter (atau berapa banyak karakter yang ditunjukkan dalam searchString).
- Jika salah satu dari mereka sama dengan searchString, kami mengembalikan indeks saat ini.
- Jika kita sampai pada akhir baris tanpa menemukan kecocokan, kembalikan -1.
3. Kami menulis kodesemu
Pseudocode sebenarnya bukan kode, tetapi berpura-pura menjadi kode. Contoh dari apa yang saya bicarakan, dengan algoritma kami:
for each index in sourceString,
there are N characters in searchString
let N chars from index onward be called POSSIBLE_MATCH
if POSSIBLE_MATCH is equal to searchString, return index
at the end, if we haven't found a match yet, return -1.
Saya dapat membuatnya lebih seperti kode asli seperti ini:
for each index in sourceString,
N = searchString.length
POSSIBLE_MATCH = sourceString[index to index+N]
if POSSIBLE_MATCH === searchString:
return index
return -1
4. Kami menerjemahkan semua yang kami bisa ke dalam kode
Sekarang kita harus mengurus sintaks, parameter fungsi dan aturan bahasa. Mungkin Anda tidak bisa menulis semuanya, dan itu normal. Tuliskan dalam kode apa yang Anda tahu pasti!
function findFirstMatch (searchString, sourceString) { let length = searchString.length; for (let index = 0; index < sourceString.length; index++) { let possibleMatch = <the LENGTH chars starting at index i> if (possibleMatch === searchString) { return index; } } return -1; }
Perhatikan bahwa saya membiarkan sebagian kode ini kosong. Ini disengaja! Saya tidak yakin dengan sintaks untuk memproses string dalam JavaScript, tetapi lebih lanjut tentang itu nanti.
5. Jangan mengandalkan keberuntungan
Kesalahan yang cukup umum, terutama untuk programmer pemula, adalah menggunakan sesuatu yang ditemukan di jaringan dengan harapan itu hanya akan berfungsi. Fragmen yang ditemukan hanya dimasukkan ke dalam proyek Anda sendiri tanpa pengujian. Semakin banyak bagian dari program Anda yang tidak akan Anda mengerti, semakin tidak realistis penyelesaian pekerjaan yang berhasil.
Kemungkinan kesalahan berlipat ganda saat Anda menambahkan item yang tidak Anda yakini. Akibatnya, prosesnya jadi tak terkendali.
Komentar: probabilitas kesalahan dapat dihitung menggunakan urutan Mersenne: a (n) = (2 ^ n) - 1
Uji kode Anda. Menemukan sesuatu yang online itu keren, tetapi sebelum Anda menambahkan potongan ke program Anda, coba bagian ini secara terpisah dari segalanya.
Pada langkah sebelumnya, saya mengatakan bahwa saya tidak tahu bagaimana memilih bagian tertentu dari string menggunakan JavaScript. Mari kita google itu.
https://www.google.com/search?q=how+to+select+part+of+a+string+in+javascriptHasil pertama adalah dari w3schools. Agak ketinggalan jaman, tetapi akan bekerja:
http://www.w3schools.com/jsref/jsref_substr.aspSaya berasumsi saya harus menggunakan substr (indeks, searchString.length) untuk menyorot bagian sourceString setiap kali. Tetapi sejauh ini ini adalah asumsi dan tidak lebih. Jadi saya akan periksa dulu.
let testStr = "abcdefghi"
let subStr = testStr.substr(3, 4); // simple, easy usage
console.log(subStr);
"defg"
subStr = testStr.substr(8, 5); // ask for more chars than exist
"i"
Sekarang saya tahu persis bagaimana fungsi ini bekerja. Karena itu, ketika saya menambahkan fragmen ini ke program saya, saya sudah tahu bahwa jika tidak berfungsi, masalahnya tidak ada di bagian yang ditambahkan.
Dan akhirnya, saya menambahkan bagian terakhir dari kode.
function findFirstMatch(searchString, sourceString) { let length = searchString.length; for (let index = 0; index < sourceString.length; index++) { let possibleMatch = ( sourceString.substr(index, searchString.length)); if (possibleMatch === searchString) { return index; } } return -1; }
Kesimpulan
Jika Anda telah membaca sampai akhir, coba tipnya. Temukan masalah yang tidak bisa Anda tangani. Saya jamin semuanya akan beres sekarang.
Semoga sukses dan selamat coding!
Skillbox merekomendasikan: