Apa manfaat dari pemodelan sistem perangkat lunak vs melakukan semuanya dalam kode?

20

Kebanyakan, jika tidak semua orang IT yang saya kenal percaya bahwa itu bermanfaat untuk memodelkan perangkat lunak dengan UML atau jenis diagram lain sebelum pengkodean. (Pertanyaan saya bukan tentang UML secara khusus, bisa berupa deskripsi grafis atau tekstual dari desain perangkat lunak.)

Saya tidak begitu yakin tentang itu. Alasan utamanya adalah: Kode tidak berbohong. Itu diperiksa oleh kompiler atau interpreter. Mudah-mudahan ini memiliki tes otomatis dan harus lulus analisis kode statis. Jika suatu modul tidak berinteraksi dengan benar dengan modul lain, biasanya jelas dalam kode karena Anda mendapatkan pesan kesalahan.

Semua ini tidak dapat dilakukan dengan diagram dan dokumen lainnya. Ya, ada alat yang memeriksa UML, tetapi semua yang saya lihat sejauh ini sangat terbatas. Oleh karena itu dokumen-dokumen ini cenderung tidak lengkap, tidak konsisten atau palsu.

Bahkan jika diagram itu sendiri konsisten, Anda tidak dapat memastikan bahwa kode tersebut benar-benar mengimplementasikannya. Ya, ada pembuat kode, tetapi mereka tidak pernah menghasilkan semua kode.

Kadang-kadang saya merasa seperti obsesi dengan hasil pemodelan dari asumsi bahwa kode pasti merupakan kekacauan yang tidak dapat dipahami oleh arsitek, desainer, atau orang-orang bergaji tinggi lainnya yang mendapatkan gambaran besar tidak harus berurusan dengan itu. Kalau tidak, itu akan menjadi terlalu mahal. Oleh karena itu semua keputusan desain harus dipindahkan dari kode. Kode itu sendiri harus diserahkan kepada spesialis (monyet kode) yang dapat menulis (dan mungkin membaca) tetapi tidak harus berurusan dengan hal lain. Ini mungkin masuk akal ketika assembler adalah satu-satunya pilihan, tetapi bahasa modern memungkinkan Anda untuk kode pada tingkat abstraksi yang sangat tinggi. Oleh karena itu saya tidak benar-benar melihat perlunya pemodelan lagi.

Apa argumen untuk pemodelan sistem perangkat lunak yang saya lewatkan?

Ngomong-ngomong, saya percaya bahwa diagram adalah cara yang bagus untuk mendokumentasikan dan mengkomunikasikan aspek-aspek tertentu dari desain perangkat lunak, tetapi itu tidak berarti kita harus mendasarkan desain perangkat lunak pada mereka.

Klarifikasi:

Pertanyaan itu ditunda karena tidak jelas. Karena itu izinkan saya menambahkan beberapa penjelasan:

Saya bertanya apakah masuk akal untuk menggunakan (bukan kode) dokumen yang memodelkan perangkat lunak sebagai sumber utama kebenaran tentang desain perangkat lunak. Saya tidak memiliki kasus di mana sebagian besar kode secara otomatis dihasilkan dari dokumen-dokumen ini. Jika ini masalahnya, saya akan menganggap dokumen itu sendiri sebagai kode sumber dan bukan sebagai model.

Saya mencantumkan beberapa kelemahan dari prosedur ini yang membuat saya bertanya-tanya mengapa begitu banyak orang (menurut pengalaman saya) menganggapnya sebagai cara yang lebih baik dalam melakukan perancangan perangkat lunak.

Frank Puffer
sumber
5
Saya pikir ini adalah pertanyaan yang sepenuhnya valid. Jika model kami memiliki nilai apa pun, itu harus cocok dengan kode. Jadi mengapa tidak mendesain model dalam bahasa yang sama yang kemudian kita gunakan untuk mengimplementasikannya? Maka mereka selalu sinkron. Dan jika Anda lebih suka grafis mewah, mereka dapat dihasilkan dari kode.
Ralf Kleberhoff
3
Anda harus mengenal lebih banyak orang "IT". Atau mungkin saya harus mengatakan, Anda harus terbiasa dengan lebih banyak komunitas di dalam payung itu.
Derek Elkins
@DocBrown: Sementara jawaban untuk pertanyaan itu dan terutama artikel yang terhubung dalam komentar Anda memang memberikan informasi yang relevan, pertanyaan aslinya sangat berbeda.
Frank Puffer
@ Frankpuffer: Saya tahu itu, memilih untuk membuka kembali. Namun demikian saya pikir inti dari pertanyaan Anda - "apa desain perangkat lunak" dan "peran pemodelan dalam desain perangkat lunak", adalah pertanyaan yang sangat luas, mungkin terlalu luas untuk dijawab di sini dengan cara yang masuk akal.
Doc Brown

Jawaban:

23

Manfaat pemodelan sistem perangkat lunak vs. semua dalam kode adalah: Saya dapat memuat model di papan tulis.

Saya sangat percaya pada keajaiban komunikasi di selembar kertas. Jika saya mencoba meletakkan kode di papan tulis, ketika mengajarkan sistem kami kepada pembuat kode baru, tidak ada kode apa pun pada tingkat abstraksi yang diperlukan yang pas di papan tulis.

Saya tahu obsesi dengan pemodelan yang Anda maksud. Orang-orang melakukan sesuatu karena itulah yang telah mereka lakukan sebelumnya, tanpa memikirkan mengapa mereka melakukannya. Saya datang untuk menyebutnya formalisme. Saya lebih suka bekerja secara informal karena lebih sulit untuk menyembunyikan kekonyolan di balik tradisi.

Itu tidak berarti saya tidak akan membuat sketsa UML sekarang dan kemudian. Tapi saya tidak akan pernah menjadi orang yang menuntut Anda menyerahkan dokumen UML sebelum Anda bisa kode. Saya mungkin meminta Anda mengambil 5 menit dan menemukan BEBERAPA cara untuk menjelaskan apa yang Anda lakukan karena saya tidak tahan dengan keberadaan kode yang hanya dimengerti oleh satu orang.

Fowler mengidentifikasi berbagai cara orang menggunakan UML yang ia sebut mode UML . Yang berbahaya dengan mereka semua adalah mereka dapat digunakan untuk bersembunyi dari melakukan pekerjaan yang bermanfaat. Jika Anda melakukannya untuk kode menggunakan mouse, baik saya telah melihat banyak yang mencoba. Belum pernah melihat orang yang benar-benar bekerja. Jika Anda melakukannya untuk berkomunikasi, Anda sebaiknya memastikan orang lain memahami Anda. Jika Anda melakukannya untuk merancang Anda sebaiknya mencari dan memperbaiki masalah saat Anda bekerja. Jika semuanya berjalan dengan lancar dan sebagian besar waktu Anda dihabiskan untuk membuat anak panah terlihat bagus kemudian matikan dan kembali bekerja.

Yang terpenting, jangan membuat diagram yang Anda harapkan valid lebih dari sehari. Jika Anda entah bagaimana bisa, Anda gagal. Karena perangkat lunak dimaksudkan untuk menjadi lunak. Jangan menghabiskan berminggu-minggu untuk mendapatkan diagram dengan benar. Katakan saja padaku apa yang terjadi. Jika harus, gunakan serbet.

Yang mengatakan, saya lebih suka coders yang tahu UML dan pola desain mereka. Mereka lebih mudah untuk berkomunikasi. Selama mereka tahu bahwa membuat diagram bukanlah pekerjaan penuh waktu.

candied_orange
sumber
2
"sama sekali tidak ada kode pada tingkat abstraksi yang pas di papan tulis" Itu memunculkan pertanyaan yang menarik. Kenapa tidak? Apa yang harus benar bagi titik masuk suatu sistem untuk menjelaskan pada tingkat yang sangat tinggi apa fungsinya?
RubberDuck
2
Karena kode harus semuanya untuk semua orang (dan setidaknya satu kompiler). Model dapat memiliki audiens yang fokus.
candied_orange
Saya pikir menggunakan kata "formalisme" untuk ini sangat disayangkan. Entah itu over-mengembang apa yang dilakukan "pemodel" lakukan, atau itu merendahkan pemodelan formal yang sebenarnya . (Tampaknya juga tidak benar-benar menangkap maksud Anda dari apa yang dapat saya katakan di sini. Kekhawatiran Anda tampaknya bukan pada pemodelan itu sendiri tetapi dengan menggunakannya sebagai gerbang atau untuk alasan birokrasi bahkan ketika itu tidak menambah nilai.)
Derek Elkins
3
Masalah saya bukan pada pemodelan. Ini dengan menggunakan upacara formal sebagai pengganti pemikiran kritis. Saya mencoba untuk mengatakan banyak model bashing terjadi karena banyak model jatuh dengan kerumunan itu. Pemodelan bisa sangat bagus. Tetapi memiliki sisi gelap.
candied_orange
1
"Saya dapat memuat model di papan tulis" adalah cara yang sangat konkret (luar biasa!) Untuk mengatakan, "Saya dapat membuat abstraksi dari sesuatu yang lebih rumit untuk membantu memahami atau mengkomunikasikan aspek yang saya rasa penting." Inilah yang dilakukan pemodelan yang baik secara umum, apakah itu perangkat lunak atau hal lain yang kompleks.
Fuhrmanator
6

Saya bertanya apakah masuk akal untuk menggunakan (bukan kode) dokumen yang memodelkan perangkat lunak sebagai sumber utama kebenaran tentang desain perangkat lunak

Tidak. Ini tidak pernah masuk akal. Kode Anda adalah dokumen desain utama Anda, yaitu "sumber utama kebenaran tentang desain perangkat lunak". Hanya kode yang menjelaskan dengan tepat apa yang dilakukan aplikasi saat kompiler mengambil desain itu dan membuat aplikasi darinya.

Dengan segala cara, gunakan diagram sebagai dokumen desain tambahan, meskipun jika mereka tidak dihasilkan secara otomatis dari kode, berhati-hatilah karena mereka menceritakan kisah yang berbeda dengan desain sebenarnya. Jika UML mengapung perahu Anda, gunakan itu. Jika tidak, gunakan sesuatu yang lain.

Beberapa orang merasa berguna untuk membuat sketsa pemikiran mereka dalam bentuk diagram sebelum mulai menulis kode. Tapi ingat apa yang dikatakan Paman Bob tentang masalah ini:

" Jadi, ya, diagram kadang-kadang bisa tidak tepat. Kapan mereka tidak pantas? Ketika Anda membuat mereka tanpa kode untuk memvalidasi mereka, dan kemudian bermaksud untuk mengikuti mereka. Tidak ada yang salah dengan menggambar diagram untuk mengeksplorasi ide. "

Jika Anda benar-benar menggunakan UML untuk menjelajahi suatu desain, buanglah ketika Anda mulai membuat kode. Tulis tes, lalu tulis beberapa kode untuk membuatnya lulus. Ulangi. Dengan begitu, Anda akan berakhir dengan desain yang divalidasi. UML tidak dapat menawarkan tingkat validasi desain yang sama kepada Anda.

David Arno
sumber
Sebuah counter contoh (?) :: model-view pemisahan (atau pola GOF) dapat dengan mudah ditarik sebagai dimaksudkan kebenaran desain (cetak biru) yang diusulkan oleh seorang arsitek. Pengembang yang menyimpang dari niat itu tidak membuat model (yang dimaksudkan) tidak berguna. Ya, kodenya adalah "kebenaran" tetapi itu belum tentu desainnya. Validasi tidak harus otomatis dengan UML atau model tertentu. Fakta bahwa itu tidak tidak membuat model layak sampah.
Fuhrmanator
Sedangkan untuk tes, saya tidak yakin itu berguna untuk memvalidasi desain. Bisakah Anda menulis tes yang menunjukkan bahwa logika domain tidak ada di lapisan presentasi (masalah yang sangat umum dengan implementasi yang menyimpang dari desain yang dimaksudkan)? Menampilkan diagram dari lapisan ke pengembang dan menjelaskan bahwa suatu actionPerformed()metode ada di lapisan presentasi, dan bahwa itu hanya harus melewati kontrol ke lapisan domain, adalah aspek kunci pemisahan. (Contoh sepele, tetapi dapat diterapkan untuk semua jenis strategi desain yang tidak mudah ditampilkan hanya dalam kode).
Fuhrmanator
5

Kebanyakan, jika tidak semua orang IT yang saya kenal percaya bahwa itu bermanfaat untuk memodelkan perangkat lunak dengan UML atau jenis diagram lain sebelum pengkodean.

Saya tidak setuju bahwa semua orang yang Anda kenal percaya ini, tapi saya pikir itu tidak umum terjadi. Pada tahun 1970, Winston Royce tahu bahwa pengembangan perangkat lunak memiliki beberapa tingkat iterasi antara kegiatan desain dan kode. Pada tahun 1992, Jack Reeves menulis tentang pengkodean sebagai aktivitas desain yang sebenarnya (juga dibahas pada C2 Wiki ).

Ini tidak berarti bahwa orang telah mencoba membuat alat pengembangan berbasis model. Ada alat yang mencoba untuk menghasilkan kode dari model UML (dan bukan hanya diagram kelas, tetapi menghubungkan berbagai jenis diagram bersama-sama dan menghasilkan kode dari mereka). Tapi itu bukan, setidaknya dari apa yang saya lihat, alat yang banyak digunakan.

Ini juga tidak berarti bahwa Anda harus langsung dari persyaratan menjadi kode penulisan. Ada keputusan desain tertentu yang sangat penting untuk dilakukan sejak dini dan beberapa tingkat pemodelan dapat berguna untuk memastikan bahwa semua orang memahami pilihan, dampaknya, dan dapat berkomunikasi. Beberapa orang (termasuk saya) menyebut ini "arsitektur perangkat lunak" .

Kode tidak berbohong. Itu diperiksa oleh kompiler atau interpreter. Mudah-mudahan ini memiliki tes otomatis dan harus lulus analisis kode statis. Jika suatu modul tidak berinteraksi dengan benar dengan modul lain, biasanya jelas dalam kode karena Anda mendapatkan pesan kesalahan.

Ini benar-benar jantung dari beberapa aspek Pemodelan Agile, terutama Spesifikasi yang Dapat Dieksekusi dan Sumber Informasi Tunggal . Saya tidak perlu setuju dengan TDD, tetapi gagasan memiliki kode Anda dan tes terkait (dari unit melalui tes penerimaan, sebaiknya ditangkap sebagai tes otomatis) menjadi satu-satunya sumber kebenaran adalah ide yang bagus.

Bahkan jika diagram itu sendiri konsisten, Anda tidak dapat memastikan bahwa kode tersebut benar-benar mengimplementasikannya. Ya, ada pembuat kode, tetapi mereka tidak pernah menghasilkan semua kode.

Saya pikir sebagai aturan umum, pergi dari model-> kode adalah cara yang salah. Sebaliknya, kode harus menghasilkan model. Artinya, alat harus dapat memeriksa kode dan menghasilkan representasi grafis dan tabel yang dapat lebih ditingkatkan saat para insinyur menulis teks di sekitarnya. Dan generasi model ini dari kode harus menjadi bagian mulus dari proses build dan release.

Ada alat yang, untuk tingkat yang berbeda, mendukung hal ini untuk berbagai bahasa. Mengingat sifat bahasa dan paradigma, lebih mudah bagi sebagian orang daripada yang lain.

Saya mencantumkan beberapa kelemahan dari prosedur ini yang membuat saya bertanya-tanya mengapa begitu banyak orang (menurut pengalaman saya) menganggapnya sebagai cara yang lebih baik dalam melakukan perancangan perangkat lunak.

Saya tidak berpikir bahwa orang-orang ini perlu memahami rekayasa perangkat lunak dan desain perangkat lunak. Saya pikir orang-orang ini melihat apa yang dilakukan disiplin ilmu teknik lain dan memetakannya ke hal-hal yang menurut mereka harus dilakukan oleh para insinyur perangkat lunak. Tetapi mereka mengabaikan satu perbedaan besar. Disiplin teknik lainnya menciptakan model dan simulasi terlebih dahulu karena sangat mahal dan memakan waktu untuk membangun produk yang sebenarnya. Dalam rekayasa perangkat lunak, kita dapat mengambil bagian dari desain kita dan menghasilkan sesuatu yang dapat diuji di lingkungan dunia nyata dalam waktu yang sangat sedikit dan dengan biaya yang sangat sedikit. Ekonomi sangat berbeda.

Apa manfaat dari pemodelan sistem perangkat lunak vs melakukan semuanya dalam kode?

Ketika Anda memiliki sistem perangkat lunak yang sangat kompleks, memiliki model berarti memiliki sesuatu yang lebih mudah dipahami. Ini adalah tingkat abstraksi yang berbeda, sesuatu untuk membantu orang memahami berbagai aspek sistem Anda. Ini adalah salah satu alasan mengapa ada begitu banyak bahasa pemodelan yang berbeda dan berbagai jenis model yang diizinkan oleh setiap bahasa pemodelan atau notasi - untuk memungkinkan pemangku kepentingan yang berbeda untuk memahami, secara konseptual, sistem perangkat lunak dengan cepat dan mudah.

Thomas Owens
sumber
5

Saya bertanya apakah masuk akal untuk menggunakan (bukan kode) dokumen yang memodelkan perangkat lunak sebagai sumber utama kebenaran tentang desain perangkat lunak. Saya tidak memiliki kasus di mana sebagian besar kode secara otomatis dihasilkan dari dokumen-dokumen ini. Jika ini masalahnya, saya akan menganggap dokumen itu sendiri sebagai kode sumber dan bukan sebagai model.

Banyak dokumen non-kode berguna sebagai cetak biru . Artinya, "kebenaran" desain harus mengikuti arahan ini. Ini adalah cara untuk memodelkan elemen yang harus dipenuhi oleh suatu desain. Anda bisa menyebut mereka dokumen persyaratan, tapi itu mungkin terlalu kuat dalam semua contoh yang bisa saya berikan. Saya telah menggunakan PlantUML melalui PlantText.com untuk menghasilkan ini.

  • Diagram use-case dapat menunjukkan fitur dan interaksi yang dimaksud dengan pengguna atau sistem eksternal. masukkan deskripsi gambar di sini

  • Diagram aktivitas dapat menunjukkan proses bisnis yang perlu didukung oleh perangkat lunak. masukkan deskripsi gambar di sini

  • State diagram dapat menunjukkan dinamika yang dimaksudkan di situs web: masukkan deskripsi gambar di sini

  • Pola desain Geng Empat disajikan sebagai model statis dan dinamis. Misalnya, Memento:
    masukkan deskripsi gambar di sini
    masukkan deskripsi gambar di sini

Saya mencantumkan beberapa kelemahan dari prosedur ini yang membuat saya bertanya-tanya mengapa begitu banyak orang (menurut pengalaman saya) menganggapnya sebagai cara yang lebih baik dalam melakukan perancangan perangkat lunak.

Jika Anda tertarik pada beberapa informasi nyata tentang penggunaan UML di luar pengalaman Anda, ada beberapa studi yang dilakukan (saya mencoba menemukan tautan ke artikel non-paywall):

Fuhrmanator
sumber
0

Kami para pengembang suka menggunakan gambar untuk menjelaskan dunia kami, jadi inilah satu dengan produksi mobil:

  • Mobil adalah hasil dari rantai produksi, sama dengan kode (tentu saja menambahkan proses penyebaran).
  • Dokumen desain mobil sama dengan dokumen desain perangkat lunak.

Di dunia kita, ini sering terjadi daripada mereka yang membuat dan membuat dokumen desain sama dengan yang menghasilkan kode. Itu tidak benar di bidang lain. Namun itu tidak berarti Anda benar-benar bisa mendapatkan tingkat kualitas yang sama dengan melakukan semuanya bersama-sama.

Dengan membuat dokumen-dokumen itu terlebih dahulu tanpa coding (tidak termasuk apa pun seperti bukti konsep untuk kemudahan, ...):

  • Anda yakin untuk berpikir sebelum melakukan, pengkodean setelah Anda tahu apa yang harus Anda lakukan adalah MUDAH.
  • Anda dapat membuat orang yang lebih berpengalaman fokus pada bagian tersulit dari perangkat lunak Anda: desain, algoritma / matematika adalah apa pun kecuali untuk tujuan yang sangat spesifik (tertanam, waktu nyata, perakitan).
  • Anda dapat mendelegasikan kepada orang yang kurang berpengalaman bagian yang baik dari proses pengkodean sedangkan orang yang lebih berpengalaman hanya fokus pada bagian paling kritis yang membutuhkan tingkat keterampilan mereka. Orang-orang yang kurang berpengalaman akan belajar banyak tentang itu.
  • Anda dapat berdiskusi dengan orang-orang non IT melalui gambar dokumen desain Anda, sementara jika Anda hanya memiliki kode, Anda harus mengekstrak gambar dari apa yang Anda lakukan, dengan semua risiko untuk melupakan sesuatu (pendengar yang terlupakan di suatu tempat ...). Lihat jawaban CandiedOrange untuk lebih banyak aspek tentang komunikasi.
  • Ketika Anda harus membuat perangkat lunak Anda berkembang, Anda dapat mengantisipasi dengan lebih baik apa yang akan berdampak.
  • Desain akan memudahkan untuk memotong sebagian perangkat lunak Anda dan membuat bagian dari perangkat lunak Anda dikembangkan bersamaan.
  • Tuliskan tes unit reberbative sialan itu akan jauh lebih mudah ketika Anda tidak perlu pusing karena harus mencakup semua kasus saat mengkodekannya, dalam pendekatan TDD yang mengkode tes sebelum kode mudah.
  • ...

Catatan: penegasan tersebut mengira bahwa kode tersebut benar-benar mencerminkan desain dan keduanya tetap terbaru ...

Walfrat
sumber
Jawaban ini menjelaskan skenario mendekati kasus terbaik. Anda menyebutkan satu peringatan pada akhirnya yang cukup besar dengan sendirinya. Ada banyak lainnya. Anda dapat dengan mudah menghilangkan aspek-aspek yang diperlukan, meremehkan kerumitan beberapa bagian, bukan memperhitungkan kendala pustaka / kerangka kerja yang Anda gunakan, bukan faktor bug dalam dependensi, bukan faktor kinerja atau persyaratan non-fungsional lainnya, lebih dari insinyur, gagal mengantisipasi perubahan, atau tidak begitu bagus dalam desain. Skenario terbaik ini tidak mungkin terwujud bahkan secara kasar dalam konteks profesional.
Derek Elkins
Jika Anda mulai dengan hanya mempertimbangkan setiap peringatan dari segalanya, Anda tidak akan pergi ke mana pun. Metode apa pun yang Anda gunakan. Dan daftar panjang dari apa yang Anda katakan sangat valid saat melakukan hanya kode.
Walfrat