Bagaimana tim pengembangan perangkat lunak profesional menangani kompleksitas desain dalam proyek non-sepele?

9

Pertama, saya menyadari pertanyaan ini mungkin agak lama dan kabur dan saya minta maaf untuk ini. Ini mungkin adalah masalah dasar dengan nama pendek untuk siapa saja yang "mengerti", tetapi karena saya merasa kurang dalam hal ini, tolong jelaskan dengan saya dalam menggambarkan masalah.

Saya sudah melakukan pemrograman dengan cara ini atau yang lain sejak saya berusia sekitar 11 tahun. Ini berarti bahwa saya telah banyak belajar sendiri segalanya sejak awal. Saya menerima pendidikan teknis, tetapi tidak sepenuhnya dalam Ilmu Komputer (saya lulus dengan gelar di bidang Teknik Foton). Kami memiliki kursus pemrograman tentu saja, tetapi ini sebagian besar hal dasar bagi saya dan saya tidak belajar banyak hal baru. Saya terus mendidik diri sendiri untuk kesenangan itu dan selalu tahu saya akan mengejar karir dalam pemrograman, tetapi semua proyek saya cukup kecil pada waktu itu. Saya tidak kesulitan menyimpannya dalam pikiran saya dan mempertahankannya.

Sekarang, saya menemukan diri saya sebagai pemimpin dalam sebuah tim, tetapi tidak dalam lingkungan perusahaan - saya bekerja untuk universitas yang mengembangkan perangkat lunak ilmiah (dalam C ++) untuk aplikasi teknik. Tiba-tiba proyek ini tumbuh (relatif) besar dan saya kesulitan membungkus pikiran saya dengannya hampir sepanjang waktu. Saya kehilangan banyak waktu dan usaha untuk dua hal, kebanyakan:

  1. Ketika saya harus kembali ke bagian kode yang belum saya kerjakan untuk sementara waktu, saya kesulitan mengingat bagaimana cara kerjanya. Saya menghabiskan banyak waktu meninjau file header untuk kelas yang relevan dan membaca komentar yang saya tempatkan di sepanjang file sumber. Saya berharap ada semacam "skematis" yang bisa saya lihat sekilas dan mendapatkan kembali gambar itu dengan lebih mudah;
  2. Ketika saya memperkenalkan perubahan, kadang-kadang saya menyadari setengah jalan bahwa apa yang saya coba lakukan akan memecah hal-hal di tempat lain (atau lebih buruk, itu hanya muncul saat runtime sebagai kejutan). Saya kembali dan mulai melakukannya secara berbeda, hanya untuk mengetahui bahwa saya mengabaikan pengaruh pada beberapa komponen lain. Saya berharap ada beberapa "diagram arsitektur" di mana saya bisa melihat bagaimana hal-hal dilakukan, bagaimana apa yang saya coba lakukan akan mempengaruhi komponen lain dan cara bagi saya untuk merencanakan secara detail sebelum saya mulai menerapkan perubahan.

Sebagian besar orang yang bekerja dengan saya memiliki cerita yang serupa dengan saya - orientasi teknis yang kuat dan terkadang keterampilan yang hebat, tetapi tanpa cara mengatur pekerjaan mereka. Namun, proyek-proyek mereka biasanya jauh lebih kecil daripada proyek saya sehingga mereka dapat mengatasinya. Bagaimanapun, apa artinya itu bagi saya adalah bahwa saya sendirian dan tidak ada seorang pun yang dapat saya pelajari untuk praktik yang baik.

Saya mengambil kursus pascasarjana dalam mengelola TI dan meskipun saya merasa cukup memuaskan, sebagian besar ditargetkan untuk non-programmer, mengajar tentang metodologi manajemen proyek, estimasi anggaran / jadwal, arsitektur perusahaan, dll. - bukan desain dan perencanaan perangkat lunak. Tidak apa-apa, saya mencoba mempelajari hal-hal itu juga. Tentu saja, beberapa alat (seperti UML) dan jenis proses pengembangan perangkat lunak (kaskade, iteratif, lincah ...) diperkenalkan, tetapi jelas tidak secara terperinci dan saya sulit memutuskan apa yang harus saya pilih dan gunakan ( dan sejauh mana).

Saya telah membaca banyak pertanyaan dan jawaban tentang desain perangkat lunak pada SO - ada banyak tentang melakukannya dengan menggunakan alat atau metodologi ini atau itu, dan jika saya yakin bahwa dokumentasi UML akan menyelesaikan masalah saya - saya akan mengambilnya dan mulai menggunakannya. Tetapi beberapa orang bersumpah dengan itu, yang lain mengatakan itu tidak berguna. Saya mencari jawaban pada tingkat abstraksi yang lebih tinggi - adakah cara untuk menyelesaikan dua masalah yang saya alami, dan bagaimana Anda secara pribadi melakukannya? Apa yang harus saya pelajari untuk dapat melakukannya, mungkin tanpa terikat pada satu alat tertentu? Ini datang dan keluar dari gaya dari waktu ke waktu, dan saya berharap penerapannya bervariasi tergantung pada jenis proyek.

Terima kasih banyak untuk membaca, saya tidak dapat mengatakan apa yang saya maksud dengan lebih singkat (kurang dalam pengalaman desain perangkat lunak dan kosa kata).

neuviemeporte
sumber
2
Saya pikir respons profesional paling umum terhadap kesulitan yang Anda bicarakan adalah, "Persetan," diikuti dengan menyalahkan manajemen, produk, atau beberapa SOB acak lainnya.
Edward Strange

Jawaban:

9

Ketika saya harus kembali ke bagian kode yang belum saya kerjakan untuk sementara waktu, saya kesulitan mengingat bagaimana cara kerjanya. Saya menghabiskan banyak waktu meninjau file header untuk kelas yang relevan dan membaca komentar yang saya tempatkan di sepanjang file sumber.

Bayangkan bagaimana perasaan orang miskin yang datang setelah Anda - dia bahkan tidak mendapat manfaat setelah mengetahui cara kerja kode Anda. Alih-alih mencoba menguraikan kode Anda, Anda harus meninjau dokumentasi yang Anda tulis untuk modul yang dimaksud. Dokumentasi itu harus menawarkan pandangan yang cukup akurat tentang apa yang dilakukan modul mengapa. Ini bukan "modul dimulai dengan menginisialisasi tiga array menggunakan triple for loop ...", melainkan: "modul ini mengambil data yang dikumpulkan oleh sensor utama Fabulotron, mengatur ulangnya ke dalam format standar Neopolitan (cokelat, vanila, stroberi), dan mengirimkannya ke modul Analisis. "

Dalam dunia yang sempurna, Anda akan memiliki dokumen desain yang menetapkan berbagai modul dalam sistem dan menjelaskan tanggung jawab masing-masing, dan masing-masing modul Anda bisa merujuk kembali ke dokumen itu untuk menjelaskan apa yang mereka lakukan: "Modul ini menyediakan Layanan pengumpulan data Fabulotron sebagaimana dirinci dalam bagian 4.8 dari dokumen desain: http://fabulotron.org/design/section4-8.html . " Jika Anda tidak memiliki sesuatu seperti itu, mulailah menuliskan ikhtisar setiap modul saat Anda mengerjakannya. Anda tidak perlu menulis buku - beberapa paragraf sering cukup untuk membuat Anda berorientasi.

Ketika saya memperkenalkan perubahan, kadang-kadang saya menyadari setengah jalan bahwa apa yang saya coba lakukan akan memecah hal-hal di tempat lain (atau lebih buruk, itu hanya muncul saat runtime sebagai kejutan). Saya kembali dan mulai melakukannya secara berbeda, hanya untuk mengetahui bahwa saya mengabaikan pengaruh pada beberapa komponen lain.

Itu mungkin indikasi bahwa modul Anda terlalu saling berhubungan. Semakin mandiri Anda dapat membuat modul / kelas / unit Anda, semakin kecil kemungkinan Anda akan mengalami masalah seperti ini. Cobalah membuat antarmuka antar modul sejelas mungkin, dan coba batasi hanya pada apa yang perlu ada di sana. Antarmuka adalah kontrak - jika Anda tahu bahwa beberapa modul memenuhi kewajibannya sebagaimana ditentukan dalam antarmuka, Anda tidak perlu tahu apa pun tentangnya. Itu mencegah perubahan dalam modul yang sedang Anda kerjakan memengaruhi modul lain.

Saya berharap ada "diagram arsitektur" di mana saya bisa melihat bagaimana hal-hal dilakukan

Menggunakan komponen standar dapat membantu dalam hal ini. C ++ menyediakan bagian-bagian standar dalam bentuk Perpustakaan Templat Standar, dan menggunakan bagian-bagian itu jika memungkinkan Anda bekerja pada tingkat abstraksi yang lebih tinggi. Jika Anda telah menulis kode Anda sendiri untuk mengelola struktur data seperti daftar, Anda dan orang-orang yang mengikuti Anda harus terus-menerus membaca sumber untuk mencari tahu apa yang terjadi. Jika Anda menggunakan bagian standar yang disediakan oleh STL, setiap programmer C ++ akan dengan cepat dapat mengetahui apa yang sedang dilakukan kode Anda tanpa menggali ke dalam rutinitas manajemen data Anda.

Jenis standar lain berasal dari pola desain. Mereka adalah konsep standar yang dapat digunakan sebagai singkatan untuk menjelaskan bagaimana hubungan antara dua objek bekerja.

Caleb
sumber
Terima kasih atas jawabannya. Tentu saja saya sudah menggunakan STL selama bertahun-tahun, tetapi urutan langkah-langkah yang diperlukan program saya untuk melakukan beberapa perhitungan yang dibuat terkadang sulit untuk digambarkan secara keseluruhan bahkan dengan penggunaannya. Hal yang sama berlaku untuk modul. Saya tidak bermaksud mengubah satu istirahat yang lain, tetapi bahwa mengubah sesuatu di suatu tempat menyebabkan kesalahan misalnya ketika pengguna melakukan sesuatu yang tidak standar dalam GUI di mana urutan yang rumit semakin rumit oleh urutan langkah yang tidak terduga yang mereka ambil untuk menyelesaikannya.
neuviemeporte
5

Saya hanya menjadi pengembang profesional untuk waktu yang singkat, dan banyak kesulitan dalam melakukan hal ini ketika saya mulai. Saya terutama belajar sendiri, bahkan melalui Universitas. Untungnya bagi saya orang-orang yang bekerja dengan saya memiliki banyak pengalaman dan mampu mendidik saya tentang cara mengelola dan bekerja pada proyek-proyek besar.

Salah satu hal pertama yang saya lakukan adalah duduk dan membaca kode bersih . Buku yang fantastis yang membantu saya memahami cara menulis kode yang bisa saya mengerti ketika saya kembali ke sana atau orang lain bisa mengerti.

Yang kedua adalah menulis tes kualitas yang baik, Unit, Integrasi, Penerimaan. Jika kode Anda diuji dengan baik, Anda akan segera tahu kapan Anda telah memecahkan sesuatu dan dengan cepat dapat mendiagnosis masalahnya. Ada banyak sumber daya pengujian yang bagus di internet, dan saya tidak yakin mana yang terbaik untuk Anda.

Poin utama saya adalah Pengujian dan Kode Bersih.

Klee
sumber
Terima kasih atas sarannya, saya akan pastikan untuk memeriksa buku itu (meskipun "gesit" dalam subtitle tampaknya menunjukkan itu sebagian besar relevan dengan metodologi itu). Saya memang memiliki tes dan telah membaca banyak buku gaya pengkodean (misalnya Programmer Pragmatis) Saya selalu berusaha keras untuk menciptakan antarmuka yang bersih dan terpisah, tetapi untuk satu pengujian otomatis sulit untuk bagian GUI dari aplikasi saya dan saya masih belum memiliki cara untuk melakukan desain keseluruhan yang baik pada skala yang lebih besar, yang melampaui penerapan praktik "bersih" pada potongan kode yang relatif kecil.
neuviemeporte
2

Berikut adalah beberapa ide tingkat tinggi untuk mengatur sistem perangkat lunak besar. Sebagian besar pengalaman saya adalah dalam sistem internet, tetapi saya pikir ide-ide ini berlaku untuk perangkat lunak teknik.

  • Pisahkan fungsionalitas menjadi blok modular yang relatif terisolasi. Misalnya, Anda mungkin memiliki modul untuk setiap keluarga perhitungan yang disediakan oleh perangkat lunak Anda.
  • Terapkan pola desain MVC untuk antarmuka pengguna, jika ada. Jauhkan antarmuka dan model terpisah dengan batas yang jelas.
  • Pertimbangkan menggunakan layer untuk mengelompokkan modul. Dalam aplikasi yang menggunakan lapisan abstraksi, setiap lapisan hanya bergantung pada lapisan di bawahnya.
  • Saat menulis dokumentasi, anggap Anda akan melupakan semua detail implementasi. Anda akan menulis banyak dokumentasi di bawah asumsi ini - mungkin sebanyak setengah dari kode Anda akan menjadi komentar, tetapi Anda akan lebih bingung nantinya.
  • Unit otomatis, tes integrasi dan penerimaan sangat bagus di beberapa ruang, tetapi pengembang C ++ tampaknya memiliki perasaan campur aduk tentang mereka.
  • Menarik banyak pada pola desain . Selain ide yang umumnya bagus, pola desain memberikan kosa kata umum dalam rekayasa perangkat lunak. Memanggil kelas sebagai WidgetFactory adalah cara ringkas untuk berkomunikasi bahwa itu adalah kelas yang ada untuk membuat widget.

Sudah lama sejak saya bekerja dengan perangkat lunak teknik, sehingga jarak tempuh Anda dapat bervariasi pada saran ini. Semoga berhasil!

greg
sumber
1

Jawabannya adalah rekayasa perangkat lunak.

Itu untuk proyek besar Anda mengikuti serangkaian kumpulan persyaratan, definisi proses, spesifikasi, dll. Jauh sebelum pengkodean aktual dilakukan.

Ada berbagai metodologi yang digunakan tergantung pada lingkungan dan budaya. Jenis usaha perusahaan cenderung mengikuti " Proses Bersatu Rasional " atau serupa, start up teknologi biasanya pergi untuk beberapa variasi pada Agile , departemen pemerintah beberapa metodologi Waterfall terlalu banyak bekerja .

Dalam semua kasus, proses ini membantu Anda menentukan dengan tepat apa yang Anda lakukan, dan, menjelang akhir proyek, Anda dapat membuktikan bahwa Anda telah melakukannya.

James Anderson
sumber
Dengan asumsi persyaratan tidak berubah (asumsi yang tidak realistis dalam banyak kasus, saya tahu), apakah mungkin untuk menentukan semuanya sebelum pengkodean dan kemudian membuat perangkat lunak yang berfungsi sebagai spec tanpa perubahan besar di sepanjang jalan? Aku hanya tidak bisa membayangkannya. Saya harus mulai coding untuk masuk ke dalam nuansa. tweak sedikit, tweak lagi dll ...
neuviemeporte
Ini mungkin bekerja untuk proyek-proyek kecil, tetapi untuk proyek-proyek besar Anda harus memahami persyaratan terlebih dahulu. Juga bagian penting dari RUP adalah memodelkan sistem yang diusulkan dengan diagram UML dan Sequence. Jauh lebih mudah untuk mengubah dan memperbaiki model daripada kode sebenarnya.
James Anderson
@neuviemeporte: Tergantung. Terkadang persyaratan berubah atau persyaratan baru ditemukan selama pengembangan. Kadang-kadang persyaratan cukup jelas dari awal dan hanya beberapa detail kecil akan berubah selama pengembangan tetapi arsitektur keseluruhan akan tetap sama.
Giorgio
1

Saya sangat merekomendasikan mendapatkan Enterprise Architect , yang walaupun tidak gratis, memang menawarkan harga akademik. Ini adalah alat yang sangat baik untuk memetakan proyek baik di tingkat makro dan mikro. Itu juga dapat membalikkan file sumber Anda menjadi diagram kelas, yang mungkin akan menjadi awal yang baik bagi Anda dalam mendokumentasikan dan mengatur kembali bagaimana aplikasi Anda berjalan bersama.

Saya juga merekomendasikan kedua @ Klee. Jangan tertunda oleh alat yang dianggap "gesit", karena mereka benar-benar hanya item praktik terbaik yang juga berguna (jika tidak wajib) jika Anda mengikuti proses tangkas. Tetapi integrasi berkesinambungan (misalnya) sangat berharga, apa pun metodologi Anda. Selain itu, tes unit (cppUnit?) Adalah teman Anda. Tes unit harus sangat bisa dilakukan jika Anda menguji kelas logika yang dipanggil oleh UI Anda, daripada menguji UI secara langsung. Ada juga alat yang dapat membantu Anda mengotomatiskan pengujian UI, tetapi saya akan mencoba untuk menyatukan hal-hal back-end terlebih dahulu.

Semoga berhasil!

Matthew Flynn
sumber
1

Saya percaya bahwa masalah Anda memiliki tiga dimensi

  1. Berorientasi pada Programmer
  2. Berorientasi pada Program
  3. Pemeliharaan Program - Berorientasi

Mengenai masalah pertama, Anda mungkin memiliki programmer yang tidak memahami konsep apa yang dilakukan oleh program (ini sering terjadi pada pengaturan perusahaan). Tetapi dengan pertanyaan Anda dan domain tempat Anda berada, tampaknya Anda dan tim Anda mengendalikan apa yang dilakukan program tetapi tidak dapat menerjemahkannya menjadi program kerja dalam waktu cepat (Mengutip contoh, saya telah mendengar tentang orang-orang memiliki gelar pasca doktor dalam Fisika mengalami kesulitan memahami petunjuk dalam pemrograman dan saya yakin Fisika jauh lebih sulit daripada C ++). Jika itu masalahnya, maka sebagian besar masalah Anda adalah Program-sentris (Anda harus merasa cukup beruntung bahwa orang-orang di sekitar Anda dapat memahami apa yang sedang dilakukan program Anda dan dapat menghargainya).

Dalam kasus masalah yang berpusat pada program, salah satu saran saya yang keterlaluan adalah pindah ke tingkat abstraksi yang lebih tinggi daripada C ++ seperti mempelajari bahasa baru sebagai Python atau Haskell (Python cukup mudah dipelajari dan jika Anda memiliki ahli matematika yang baik, Haskell sangat bagus). Pindah ke tingkat abstraksi yang lebih tinggi akan menjaga ukuran kode Anda, mudah dipahami dan dipelihara dalam jangka panjang dan efek perubahan dengan cepat. Jadi Anda dapat memiliki 10 baris kode menggantikan 50 baris kode asli. Juga, memiliki seseorang dengan keahlian dalam pemrograman komputer pasti akan membantu. Berada di universitas, Anda juga dapat melibatkan beberapa siswa dalam GUI dan antarmuka sehingga Anda dapat lebih berkonsentrasi pada fungsionalitas. Saya juga merekomendasikan buku Desain Perangkat Lunak C ++ Skala Besar oleh John Lakos(Ini buku yang cukup besar, Anda bisa menjadi Programmer Python yang mahir dalam waktu yang Anda ambil untuk membaca buku)

Jika Anda memilah 2 dimensi pertama dari masalah Anda, yang ketiga akan dipecahkan secara otomatis. Karena saya yakin Anda sedang mengerjakan satu proyek besar, semua perangkat lunak manajemen proyek yang layak Anda dapatkan melalui Anda. Perencanaan di muka diperlukan. Jika Anda mulai mengkode langsung, Anda mungkin terlalu banyak terlibat dalam program sehingga Anda akan melupakan gambaran besarnya. Ingatlah hal-hal yang tidak akan berhasil untuk proyek besar. Letakkan semuanya di kertas (atau di komputer). Gunakan wiki untuk berbagi informasi. Mengenai metodologi, saya lebih suka metodologi tangkas (Sederhananya, tangkas adalah nama gaya untuk pengembangan perangkat lunak tambahan). Saya juga menyarankan untuk mempekerjakan seseorang dengan keahlian di bidang ini sehingga dia menangani ini sehingga Anda dapat berkonsentrasi pada program inti Anda. Intinya di sini adalah bahwa semua metodologi manajemen proyek hanyalah cara untuk memastikan keberhasilan program; sehingga Anda dapat memilih siapa saja yang cocok untuk Anda dan tim Anda alih-alih memilih sesuatu yang paling direkomendasikan seseorang. Selain itu, perangkat lunak berikut juga dapat membantu Anda

  • Perangkat lunak pemetaan gratis Pikiran - Pikiran
  • Trac - Program bug perangkat lunak yang cepat dan mudah dan wiki
  • MoinMoin - wiki cepat untuk mengaktifkan berbagi pengetahuan tentang program ini

Padahal tips di atas akan membutuhkan beberapa kurva belajar yang layak dalam jangka panjang. Dan akhirnya, pemrograman lebih mudah daripada Photonic Engineering (meskipun tidak C ++ Programming)

Ubermensch
sumber
0

Seperti pertanyaan Anda, jawaban apa pun yang berguna bagi Anda akan sangat panjang dan tidak jelas - tetapi jawaban singkatnya adalah "Rekayasa Perangkat Lunak"

Saya sarankan Anda menghapus waktu luang, sebanyak mungkin jika Anda serius tentang karir pengembangan perangkat lunak, dan mulai dengan mengunjungi situs Steve McConnells . Pemrograman mudah dan dapat diajarkan dalam satu semester, Rekayasa Perangkat Lunak adalah urutan besarnya lebih kompleks dan perlu banyak waktu untuk belajar.

mattnz
sumber