Apa yang saya pahami dan masalah apa yang saya temui saat membuat klon Peretas Berita



Dari penerjemah: Artikel ini adalah terjemahan singkat dari pos asli pengembang web Jesse Horne. Pekerjaannya dan sekaligus hobinya adalah desain web. Jesse sering berbagi praktik dan pelajaran terbaiknya dengan programmer lain, baik yang berpengalaman maupun pemula.

Beberapa waktu yang lalu saya menulis posting yang cukup banyak di Hacker News, yang mendapat dukungan kuat dari pembaca. Saya menarik perhatian pada kemampuan sumber daya ini dan memutuskan untuk mencoba membuat tiruannya untuk mendapatkan pengalaman dan pengetahuan baru.

Rekomendasi Skillbox: Kursus pengembang PHP satu tahun yang praktis.
Kami mengingatkan Anda: untuk semua pembaca "Habr" - diskon 10.000 rubel saat mendaftar untuk kursus Skillbox apa pun menggunakan kode promosi "Habr".

Awalnya, ini tampak seperti tujuan besar bagi saya, di mana toolkit dan taktik telah ditentukan sebelumnya. Sebelumnya, saya mengerjakan tugas yang lebih kecil menggunakan bahasa dan kerangka kerja yang berbeda. Satu-satunya hal yang tidak ada adalah proyek besar yang akan memungkinkan untuk menyatukan semua ini.

Saya memutuskan untuk mengerjakan proyek baru dari awal menggunakan bahasa Crystal. Ini adalah alat yang mudah digunakan, yang juga merupakan yang baru. Cepat, prinsip kerjanya mirip dengan Ruby. Ini diketik secara statistik plus adalah open source. Tapi bahasa baru juga tidak cukup, jadi saya memutuskan untuk menyulitkan tugas saya, dan tidak membuat klon dari Hacker News, tetapi versi yang lebih baik dari sumber ini.

Ngomong-ngomong, saya pikir membuat klon biasa akan menjadi tugas yang mudah. Dan kenyataan bahwa ini tidak benar, saya sadari beberapa saat kemudian, mulai bekerja.

Jangan menyapu terlalu tinggi

Saya tidak ingin mengatakan bahwa Anda tidak harus menetapkan tujuan yang ambisius. Cobalah untuk mencapai bintang-bintang, dengan atau tanpa duri. Mimpi bermanfaat, berusaha mencapai apa yang tidak bisa saya lakukan sebelumnya diperlukan untuk kemajuan yang sukses di tangga profesional.

Saya mengatakan bahwa Anda tidak harus mencoba untuk segera masuk ke dalam lubang tugas yang kompleks dan besar. Pilih apa yang Anda butuhkan pada saat tertentu untuk mengimplementasikan ide tersebut. Lebih lanjut, saya merekomendasikan untuk memecah tujuan yang signifikan menjadi lebih kecil. Jika Anda memiliki terlalu banyak kode di mana ada banyak "sampah", maka cobalah untuk menyederhanakan dan menyusun semuanya.

Saya bahkan tidak bisa mengatakan betapa pentingnya membagi tugas besar menjadi beberapa tugas kecil.

Dalam kasus saya, saya mengalami berbagai masalah baru yang belum pernah saya temui sebelumnya. Pertama, saya hanya bekerja Crystal sekali - ketika saya membuat aplikasi yang kompleksitasnya tidak jauh lebih tinggi dari kompleksitas program seperti "Halo, dunia!". Di masa lalu saya menggunakan Python, Lua, PHP. Bahasa baru adalah hambatan pertama untuk implementasi proyek.

Yang kedua adalah kerangka kerja . Crystal, sebagai bahasa baru, masih tidak memiliki terlalu banyak kerangka kerja dan dokumentasi untuk mereka. Saya memutuskan untuk menggunakan Kemal untuk klon saya. Saya berharap kerangka itu intuitif, karena saya bertemu dalam pekerjaan saya. Tapi di sini ada kasus lain - hal-hal individual tidak mudah dimengerti. Misalnya, beberapa bagian kode terlihat cukup normal, tetapi karena beberapa alasan tidak berfungsi. Dan sulit untuk menemukan penyebab masalah di Internet karena alasan yang sama - kebaruan bahasa dan kerangka itu sendiri. Dalam beberapa kasus, saya harus berhenti untuk waktu yang lama dan menangani penyebab masalahnya. Sampai sekarang, saya belum pernah melihat sumbernya, misalnya, Labu yang sama.

Kendala ketiga adalah tujuan spesifik yang telah saya pilih untuk proyek tersebut. Untuk membuat klon saya lebih berguna, saya memutuskan untuk menambahkan sejumlah fitur fungsional. Saya bekerja dengan Hacker News sebelumnya, jadi saya tahu banyak tentang kelebihan dan kekurangan sumber daya ini. Terpikir oleh saya bahwa akan baik untuk memanfaatkan analitik yang disediakan oleh GitHub. Dengan menggunakannya, saya bisa menambahkan statistik tentang jumlah tampilan dan aktivitas pengguna di situs.

Jadi, saya memutuskan bahwa klon saya harus menunjukkan setidaknya pandangan dan klik untuk setiap posting. Fungsi seperti itu mungkin akan bermanfaat bagi pengguna, dan penerapannya akan menjadi praktik yang baik bagi saya. Tapi saya pikir itu tidak akan lama! Sekarang proyek ini lebih merupakan bukti konsep daripada sumber daya yang sudah jadi. Selain tampilan dan klik, saya juga memutuskan untuk menambahkan tampilan komentar yang muncul sehingga muncul secara real-time. Jika bukan karena tugas tambahan ini, proyek akan selesai jauh lebih cepat.

Sekarang proyek ini mendukung otorisasi, posting dan penyortiran posting, interaksi dengan pengguna lain dengan berkomentar dan melihat profil, dll.

Masalah keempat yang saya hadapi adalah kekacauan. Migrasi, model, tampilan, pengontrol API, CSS, dan kode JavaScript terakumulasi dengan sangat cepat. Dan semua ini berubah menjadi berantakan. Saya mencoba menyelesaikan masalah, dan saya hampir berhasil. Tetapi sebagian tempat bermasalah dalam kode proyek saya masih terjadi - Anda dapat dengan mudah melihatnya. Jadi, di banyak tempat kode diulangi, titik akhir tidak terorganisir, penamaan rumit, yang mengarah pada peningkatan jumlah kode dan sejumlah besar permintaan ke database. Secara bertahap, saya memecahkan masalah ini.

Di banyak tempat, kode ini diulangi

Ketika proyek dimulai, saya memecahkan masalah saat masalah itu muncul. Misalnya, perlu untuk memeriksa apakah pengguna diautentikasi - dan saya menemukan solusi asli yang mengambil tiga baris atau lebih tergantung pada rute. Saya sedang terburu-buru untuk mengimplementasikan solusi yang ditemukan.



Secara umum, saya harus mengikuti prinsip KERING dari awal. Jangan ulangi dirimu sendiri! Saya perlu menulis program perantara yang akan melakukan apa yang diperlukan, dan kemudian menerapkan solusi yang ditemukan dalam kasus-kasus ketika diperlukan. Di masa depan, saya akan menyesuaikan proyek saya berdasarkan prinsip ini.

Penamaan dan organisasi titik akhir

Saya biasa mengembangkan API di tim Pioneer. Kami menggunakan REST , gaya arsitektur yang sebenarnya saya sumpah sebagai anggota baru tim Pioneer. Di tim ini, saya mengerjakan elemen kecil dari aplikasi besar. Tetapi dalam proyek baru saya, saya harus menulis semuanya dari awal.

"RESTful API" harus memiliki Uniform Interface, seperti yang dikatakan Wiki. Dalam proyek saya, saya mengatur semuanya sehingga titik akhir didefinisikan dalam file sumber, yang dipanggil sesuai dengan fungsi atau tujuan. Pendaftaran dan keluar dari aplikasi terdaftar di "auth.cr". Nama pengguna terdaftar di "user.cr".

Tidak diragukan lagi, bagian ini membutuhkan pemrosesan. Di masa depan, saya akan mengatur semuanya sehingga tindakan terkait dengan titik akhir "/ pengguna", hanya karena semua ini terkait dengan "Pengguna". Sebagai contoh, untuk meningkatkan struktur proyek, saya akan membagi kode menjadi bagian-bagian yang lebih nyaman dan dapat dikelola dengan sejumlah besar file. Saya akan membuat folder "src / user / auth /", yang akan berisi fungsi-fungsi login, registrasi dan keluar dari aplikasi.

1_6dy_OCE7_Cjj_Df7_A0s_Aj_3i_Q

Terlalu banyak permintaan

Dalam proyek ini, saya mencoba untuk mengukur ide-ide saya. Terlalu banyak pertanyaan saat ini dibuat ke database. Jadi, jika aplikasi memiliki seratus pengguna, saya akan menjadi gila mencoba mencari tahu berapa banyak query database yang dilakukan setiap beberapa detik. Sekarang klien memperbarui status pesan setiap 10 menit. Selain itu, postingan menentukan apakah telah dilihat oleh pengguna. Selama setiap pemeriksaan, permintaan ke database terjadi, ini dilakukan sesuai dengan filter saat ini. Dan semua ini memuat server secara signifikan.



Semua yang dijelaskan di atas hanyalah contoh masalah yang saya temui sepanjang waktu. Saya tidak bisa menggambarkannya secara penuh. Namun, saya sekarang berpikir tentang mendokumentasikan masalah dan solusi saya. Saya berharap bahwa semua ini akan membantu programmer lain melihat dan memahami kesalahan saya dan menghindari kesalahan mereka. Saya tahu bahwa jika saya menggunakan kombinasi Redis dan MySQL atau Postgres, saya bisa mempercepat eksekusi query. Tetapi untuk sekarang saya akan membahas hal ini.

Saya harap Anda menikmati artikel ini dan Anda dapat mempelajari sesuatu yang bermanfaat untuk diri Anda sendiri.

Skillbox merekomendasikan:

Source: https://habr.com/ru/post/id425099/


All Articles