Saya merasa penting untuk terus mempraktikkan keterampilan pemecahan masalah saya. Menulis proyek mini saya sendiri adalah satu cara, tetapi cara lain adalah mencoba dan menyelesaikan masalah yang diposting online. Sangat mudah untuk menemukan kuis pemrograman yang menarik secara online yang memerlukan penerapan algoritma pintar untuk dipecahkan - Project Euler adalah salah satu contoh terkenal.
Namun, dalam banyak proyek kehidupan nyata, desain perangkat lunak - terutama pada fase awal - memiliki dampak besar dan pada tahap selanjutnya tidak dapat diubah semudah algoritma sederhana. Untuk meningkatkan keterampilan ini, saya mencari koleksi masalah desain.
Ketika saya mengatakan "desain", maksud saya desain abstrak dari solusi perangkat lunak - misalnya modul apa yang akan ada dan apa dependensi di antara mereka, bagaimana data akan mengalir dalam program, data seperti apa yang perlu disimpan dalam database, dll. Masalah desain adalah masalah yang sangat penting untuk dipecahkan pada tahap awal proyek apa pun, tetapi solusinya adalah diagram papan tulis tanpa satu baris kode.
Tentu saja masalah semacam ini tidak memiliki solusi tunggal yang benar, tetapi saya akan sangat senang dengan tempat apa pun yang juga menampilkan pro dan kontra dari solusi khas yang mungkin digunakan untuk mendekati masalah.
Jawaban:
Bagaimana dengan Kode Kata . Saya telah melakukan beberapa di antaranya, dan itu menyenangkan untuk dilakukan, dan cukup menantang sehingga selalu ada sesuatu untuk dipelajari.
Komentar untuk setiap kata biasanya memiliki informasi yang cukup untuk membantu menjawab apa pun yang Anda terjebak.
sumber
Mulailah dengan yang masalah desain klasik: KWIC.
David Parnas menggunakan KWIC sebagai contoh dalam makalah klasiknya tentang modularitas: Mengenai Kriteria yang Akan Digunakan dalam Sistem Penguraian menjadi Modul , yang mungkin setiap orang harus membaca setiap 10 tahun.
KWIC, untuk kata kunci dalam konteks , adalah masalah pengindeksan dan pengurutan sederhana di mana Anda membaca dalam baris teks, dan kemudian memutar setiap baris berdasarkan kata kunci (mis., Tidak termasuk "the", "with"), menambahkan setiap shift ke daftar Anda kemudian urutkan. Idenya adalah bahwa menggunakan KWIC akan berguna untuk menghasilkan indeks untuk sebuah buku. Pada saat makalah klasiknya, Parnas mengatakan bahwa seorang programmer yang berpengalaman dapat menyelesaikannya dalam satu hingga dua minggu, tetapi Hukum Yannis menyatakan bahwa sekarang dapat dilakukan dalam satu hingga dua jam . [Sistem operasi dan perpustakaan standar menjadi jauh lebih baik.]
Baca melalui makalah Parnas, dan segera setelah Anda dapat memahami apa yang seharusnya dilakukan oleh program KWIC, pergi dan tulis sendiri sebagai latihan desain. Kemudian, bacalah sisa kertas, yang membahas dua desain berbeda: Keduanya modular, tetapi yang satu menyembunyikan informasi sementara yang lain tidak.
Setelah mengetahui contoh KWIC, Anda akan dapat menghargai makalah desain perangkat lunak lain yang menggunakannya. Misalnya, makalah Decoupling Change from Design karya Michael VanHilst untuk menunjukkan teknik desain yang sangat menarik menggunakan templat C ++. Dan, selama kita berbicara tentang templat dan desain C ++, bacalah makalah Czarnecki dan Eisenecker's Synthesizing Objects .
Pindah dari KWIC adalah contoh klasik lainnya, seperti contoh Spacewar , yang telah porting / didesain ulang dalam beberapa bahasa, seperti Python dan AspectJ .
Tentu saja, program apa pun dapat digunakan sebagai latihan desain, tetapi KWIC dan Spacewar adalah contoh di mana Anda dapat melihat beberapa alternatif.
sumber
Saya pernah mendengar hal semacam ini disebut sebagai "pemrograman katas." Kata adalah istilah seni bela diri untuk bentuk atau urutan gerakan yang dipraktikkan berulang-ulang untuk kesempurnaan. Lakukan beberapa pencarian katas dalam bahasa pilihan Anda dan saya yakin Anda akan menemukan sesuatu. :)
sumber
Saya setuju Katas dan Euler bagus untuk merancang algoritma dan mempraktikkan pengkodean - mungkin Anda dapat mengembangkannya, dan menjadi sedikit kreatif dan merancang sistem di sekitar salah satu masalah.
Sebagai contoh, saya berupaya tidak hanya memecahkan masalah Euler untuk menemukan jawaban tercepat dan terpendek, tetapi juga memecahkannya secara terdistribusi - Saya ingin membuat serangkaian node Erlang untuk menangani salah satu masalah. Tentu saja, ini berarti saya harus mencari cara untuk memisahkan masalah menjadi potongan-potongan terpisah dan meminta mereka melaporkan kembali kemajuan mereka dan mengumpulkan hasilnya bersama-sama (semua dalam Bahasa Fungsional yang saya tidak ahli dalam hal ini).
Mungkin Anda dapat merancang sistem untuk menyelesaikan salah satu masalah ini sebagai solusi bisnis - bagaimana Anda membuatnya sehingga beberapa "pelanggan" dapat memiliki akses ke masalah Anda pada satu waktu, Anda dapat melalui perancangan interaksi klien dan lapisan layanan , dll.
Ini semua tentang menjadi kreatif dan bersenang-senang.
sumber