Seorang klien meminta saya untuk melakukan desain ulang situs web mereka, aplikasi ASP.NET Webforms aplikasi yang dikembangkan oleh konsultan lain. Sepertinya relatif mudah pekerjaan, tapi setelah melihat kode, it's jelas bahwa's tidak terjadi.
Aplikasi ini tidak ditulis dengan baik. Di semua. Hal ini sangat rentan terhadap serangan SQL injection, logika bisnis yang tersebar di seluruh aplikasi, ada banyak duplikasi, dan buntu kode yang tidak apa-apa. Di atas itu, itu terus melemparkan pengecualian yang sedang disiram, agar situs muncul untuk berjalan dengan lancar.
Pekerjaan saya adalah untuk hanya update HTML dan CSS, tapi banyak dari HTML yang dihasilkan dalam logika bisnis dan akan menjadi mimpi buruk untuk memilah-milah. Perkiraan saya di redesign lagi dari klien adalah bertujuan untuk. Mereka bertanya mengapa begitu lama.
Bagaimana saya bisa menjelaskan kepada klien saya hanya seberapa buruk kode ini? Dalam pikiran mereka, aplikasi ini berjalan bagus dan desain ulang harus cepat satu-off. It's kata-kata saya terhadap sebelumnya konsultan. Bagaimana saya bisa memberikan sederhana, contoh-contoh konkret yang non-teknis klien akan mengerti?
Update
Terima kasih untuk semua tanggapan. SQL injection attack demonstrasi akal dan saya akan demo ini di lingkungan pengujian. Itu hanyalah salah satu bagian dari banyak masalah dalam aplikasi ini. Saya sedang mencari cara untuk menjelaskan mengapa bagian lain (seperti html yang dihasilkan di lapisan data) akan perlu diganti dengan yang lebih baik praktek-praktek dalam rangka untuk html dan css update berlangsung. Ada banyak saran yang baik di sini yang saya'll sepotong bersama-sama ketika saya berbicara dengan klien saya.
Non-teknisi aren't idiot (untuk sebagian besar). Mereka dapat memahami teknis argumen jika anda tetap tinggi-tingkat cukup. Pilih tugas yang anda pikir harus sederhana, dan berjalan mereka melalui mengapa itu's tidak.
saya harapkan perubahan ini menjadi salah satu kata dalam satu file. Yang paling mungkin tempat untuk mengubah tampaknya berada di sini, tapi ketika saya berubah itu ada, itu hanya bekerja di satu tempat, dan itu pecah ini 7 tempat lain. Ketika Saya tetap satu, itu pecah dua tempat lagi, menyebabkan efek domino, jadi perubahan yang saya pikir harus diambil 10 menit akhirnya mengambil 2 jam. Yang's hanya salah satu contoh. Ada banyak hal yang tak terduga 2 jam tugas di sana.
Kode struktur, gaya, teknis utang adalah salah satu hal yang - setidaknya pada awalnya, sampai klien mempercayai anda - anda're akan perlu untuk hidup dengan.
Kerentanan keamanan adalah masalah lain.
Secara pribadi, saya akan melakukan estimasi berdasarkan pekerjaan yang diperlukan dengan menggunakan struktur yang ada dan gaya saat membuatnya jelas bahwa ada masalah yang signifikan dengan basis kode. I'd meningkatkan keamanan implikasi secara terpisah: melakukan demonstrasi hack pada database ke drive titik rumah selama pertemuan.
Aku punya sukacita yang besar melakukan hal ini dengan sebelumnya klien dengan loyalitas gift card sistem ketika saya menempatkan £5000 on "saya" kartu dan dia memeriksa kartu pada-nya sampai.
Beberapa saran yang besar di sini tentang bagaimana untuk menyampaikan dan mengkomunikasikan hal ini kepada klien. Mudah-mudahan mereka akan membayar untuk anda.
Bendera merah besar di sini!
Jika klien meminta anda untuk tidak membuat perubahan apapun selain dari apa yang anda've setuju untuk (HTML dan CSS) I'd meneruskan proyek ini dan menarik penawaran saya.
Bahkan dengan tertulis dan dikomunikasikan dengan baik gambaran dari semua kekurangan dan masalah keamanan, potensi kewajiban terlalu besar bagi saya untuk merasa nyaman dengan. Bahkan jika klien tidak pernah mengambil setiap tindakan hukum atau menuntut perbaikan setelah hack atau pelanggaran; nama dan reputasi yang masih melekat pada pekerjaan!
Anda mungkin kehilangan jauh lebih banyak dari yang anda berdiri untuk mendapatkan.
Menjelaskan dan mungkin menunjukkan cacat** Ketika itu's kata-kata anda terhadap-nya, segala sesuatu yang anda katakan bisa saja udara panas sejauh mereka're bersangkutan. Setelah anda menunjukkan kepada mereka bagaimana aplikasi mereka dapat disalahgunakan melalui SQL injection, kemudian tiba-tiba anda're seseorang untuk dapat dipercaya. Anda're akan membutuhkan kredibilitas dalam rangka untuk menegosiasikan kembali. Dan ini adalah cukup sebuah game-changer untuk memberikannya kepada anda.
Menjadi amal dengan hormat untuk anda pendahulunya Itu doesn't berarti berpura-pura kesalahan aren't ada, tetapi jika anda menemukan merendahkan kemudian anda kehilangan kredibilitas. Don't berkata-kata tentang programmer kecuali mungkin untuk memberinya manfaat dari keraguan. Fokus pada kode, bukan coder. Membuat mereka merasa seperti anda're "orang baik" akan memberikan lebih banyak kelonggaran dalam negosiasi. Dan "orang-orang yang baik" tidak pernah mengatakan hal-hal berarti. Ketika menjelaskan ada kesalahan keamanan (seperti SQL injection vulnerabilities) untuk klien, saya lebih memilih untuk mengatakan sesuatu seperti ini:
aplikasi Web security adalah cepat-bidang yang terus berkembang. Banyak dari perkembangan alat-alat dan teknik yang orang belajar bahkan saat ini berkembang sebelum sebagian besar dari eksploitasi ini telah dipahami dengan baik. Dalam rangka untuk tetap berada di depan perkembangan keamanan, anda harus mengikuti bidang yang sangat erat dan kadang-kadang bahkan mengubah seluruh perkembangan gaya. Kebanyakan programmer don't melakukan hal ini.
Di sana kami pergi. Bukan kata jahat berbicara tentang pengembang; ia's just "kebanyakan programmer" yang berarti's di perusahaan cukup bagus. Dan sekarang anda've menunjukkan bahwa anda're tak "kebanyakan programmer" yang memberi anda sedikit lebih banyak kredibilitas dan mungkin menjadi alasan bagi mereka untuk membayar anda lebih banyak uang.
Menegosiasikan pengaturan baru Setelah klien memahami bahwa aplikasi ini terbuka untuk penyalahgunaan oleh publik, ia's akan ingin untuk diperbaiki. Anda mungkin orang yang dia's akan meminta untuk memperbaikinya. Anda mungkin atau mungkin tidak ingin pekerjaan itu, jadi berpikir hati-hati sebelum anda berbicara kepada mereka.
Setidaknya, anda ingin lebih banyak waktu untuk menyelesaikan pekerjaan mereka've sudah diberikan anda. Anda've mengatur mereka cukup off-guard dengan kerentanan hal-hal yang mereka mungkin tidak't memegang perkiraan semula. Tapi pastikan klien mengetahui apa yang anda sedang dan tidak akan memperbaiki sebagai bagian dari pengaturan ini.
Biasanya pengembang (anda) akan lebih memilih untuk mengulang semuanya dari awal. Dan dalam kasus-kasus seperti ini, yang bahkan mungkin menjadi pilihan. Tetapi bahkan kemudian, klien akan ingin sesuatu yang dapat menjaga nya bisnis berjalan sampai aplikasi baru dibangun. Ini berarti bahwa meskipun anda're mulai lagi, kau're mungkin masih akan harus memperbarui aplikasi lama sedikit.
Saya memulai ini sebagai komentar, karena pada awalnya saya pikir itu ke samping, tapi itu mungkin benar-benar isn't.
Saya akan mendokumentasikan segala sesuatu yang anda merasa harus didesain ulang, dan mengapa (apa yang terjadi jika mereka don't membuat perubahan), dan perkiraan pada memperbaiki masalah ini. Saya akan sangat teliti dengan apa pun yang anda anggap sebagai risiko keamanan.
Saya akan melakukan hal ini sebelum menyentuh setiap kode, dan pastikan bahwa klien anda memiliki salinan dari laporan ini, sebaiknya dengan beberapa jenis timestamp. Ini mungkin mengambil beberapa waktu, tapi itu juga akan mencakup anda jika salah satu dari risiko keamanan yang pernah datang ke hasil. Bahkan lebih baik jika anda bisa mendapatkan sesuatu yang menandatangani yang mengatakan bahwa mereka menerima dokumen.
Tentu, anda dapat menunjuk ke kontrol sumber dari kode asli anda mewarisi jika itu pernah terjadi, tapi itu akan jauh lebih mudah untuk menunjuk ke dokumen ini dan mengatakan, secara lebih profesional, "Lihat? Saya bilang begitu."
Dokumen ini dapat menjadi titik meluncurkan diskusi lebih lanjut, dan mungkin bahkan dapat digunakan oleh klien anda untuk mendapatkan "orang yang tepat" untuk memberikan izin untuk membuat beberapa atau semua dari perubahan.
Bahwa menjadi kata, setelah klien undestands risiko, senyum dan beruang itu jika mereka mengatakan untuk melakukan pekerjaan tetap, atau berjalan kaki.
Ingat bahwa klien akan dengan anda untuk membantu menjaga aplikasi mereka. Itu adalah tugas anda sebagai seorang profesional untuk menunjukkan setiap masalah yang anda temukan dengan aplikasi mereka. Klien mungkin tidak tahu masalah ini ada dan mereka harus dibuat sadar dari mereka. Menjelaskan masalah ini dalam sebuah cara yang dapat mereka mengerti dan membiarkan mereka memutuskan bagaimana mereka ingin untuk melanjutkan.
Menggunakan contoh nyata untuk menggambarkan masalah ini, seperti mobil mogok atau mesin cuci yang membutuhkan perbaikan. Untuk point adalah dengan menggunakan contoh-contoh yang mereka sudah akrab dengan. Untuk menjelaskan SQL injection, saya hanya akan menunjukkan apa itu dan mengapa itu's sebuah masalah.
Pada akhirnya anda ingin menyampaikan bahwa anda peduli tentang keberhasilan aplikasi anda diminta untuk bekerja pada.
Saya ingin menggunakan analogi klien dapat berhubungan dengan. Jumlah pekerjaan yang saya dimasukkan ke dalam dimuka dalam memenangkan pekerjaan akan tergantung pada jumlah uang klien berniat untuk menghabiskan ($100 adalah jauh berbeda dari $20,000). Perhatikan aku berkata "berniat". Anda pribadi perkiraan nilai yang terlibat doesn't berarti banyak jika anda don't mendapatkan apa yang anda'kembali bertanya.
Dalam situasi anda - lagi tergantung pada uang - saya akan menggambar sebuah kotak dengan satu garis yang keluar dari setiap sisi dan berkata kepada klien "Ini adalah bagaimana anda memvisualisasikan perangkat lunak sekarang. Data yang masuk di salah satu ujung dan keluar yang lain, semua terlihat bagus dan bersih dan sederhana". "Ini adalah apa yang anda pikirkan perangkat lunak yang tampak seperti di dalam" dan kemudian menarik ketiga garis yang menghubungkan dua garis dalam kotak.
Kemudian saya'd menggambar kotak lain seperti pertama dengan jalur input dan output di luar, kecuali kali ini saya'd mengatakan "di Sini's apa perangkat lunak benar-benar terlihat seperti dalam kotak sekarang." dan kemudian untuk menghubungkan dua garis kali ini saya'd menggambar acak tumpukan spaghetti berantakan, mungkin dengan istirahat dan bergabung dan coretan.
Akhirnya saya'd mengatakan, "Sekarang apa yang anda're meminta saya untuk melakukan ini..." dan menggambar bentuk yang sederhana di dalam kotak pertama mungkin kecil setengah lingkaran menyentuh garis dan kemudian berkata, "tapi untuk melakukan itu, saya'd harus melakukan ini..." dan menggambar tornado mencari jenis bentuk spiral di sekitar garis dan terus ... "dalam rangka untuk mendapatkan sekitar semua ini....." dan arahkan ke spaghetti dalam kotak yang lain.
Saya akan berpikir bahwa akan mendorong titik rumah di sekitar 2 menit waktu. Jika mereka bersikeras anda tetap melakukannya, maka dokumen itu sebagai lain-lain sebutkan di atas.
Bagaimana saya bisa menjelaskan kepada klien saya hanya seberapa buruk kode ini?
Mungkin anda dapat menggunakan analogi seperti pipa di sebuah rumah yang dari waktu ke waktu, setelah perbaikan dan remodels, menjadi begitu berubah-ubah dan ditambah bahwa ketika memperbaiki satu hal, mempengaruhi dan mungkin istirahat sesuatu yang lain yang kemudian harus diperbaiki dan ada's hanya ada cara bagi anda untuk tahu semua tempat bahwa ini akan terjadi.
It's kata-kata saya terhadap sebelumnya konsultan, jadi bagaimana saya bisa benar-benar memberikan sederhana, contoh-contoh konkret yang non-teknis klien akan mengerti?
Anda're kanan, it's kata terhadap apapun visual sebelumnya konsultan telah dibuat di kepala mereka. Saran saya adalah untuk melakukan apa yang anda're bertanya, memberi sederhana, contoh-contoh konkret. Karena ini adalah ulang, menunjukkan bagaimana HTML fragmen didefinisikan dalam kode dikompilasi ditampilkan dengan sisa halaman HTML dan bagaimana perubahan itu mempengaruhi atau doesn't, sisa halaman. Mungkin yang sama disusun kode membuat markup setelah menerapkan beberapa "bisnis" aturan. Menunjukkan perbedaan.
Ini adalah sulit dan masalah yang SANGAT umum. Good luck dengan itu.
Jujur dan langsung.
Tapi yang paling penting tidak mengambil pekerjaan yang tidak akan memenuhi harapan anda. Kebanyakan orang tidak menyadari bahwa kontraktor dapat api klien, mereka dapat dan harus jika pekerjaan adalah masalah lebih dari itu layak.
Berikut ini's analogi saya've digunakan (meskipun saya tidak menjamin untuk itu's efektivitas): Bayangkan situs web mereka adalah sebuah mesin fisik, seperti mekanik mesin cetak yang entah bagaimana menerima input.
Mereka mungkin berpikir dari mesin bisa pada komponen yang tidak X dan yang lain yang tidak Y. Pada kenyataannya, itu's 20 atau jadi sebagian besar mesin yang sama. Beberapa dari mereka tidak lagi melakukan apa-apa, mereka semua upaya untuk melaksanakan fungsi-fungsi yang lain sudah dan tidak ada seorang pun selain sebelumnya konsultan telah pernah melihat sesuatu persis seperti mereka sebelumnya.
"Lihat alat ini berikut yang mem-posting variabel dan kemudian mengirimkan komponen ini kelinci-lubang jika-elses? Ada isn't hanya satu dari jumlah tersebut, ada salah satu dari ini di setiap halaman (atau apa pun), beberapa mereka membersihkan input dan beberapa don't (atau semua don't) dan tanpa membaca seluruh hal yang dapat saya't tahu di mana."
Salah satu titik yang benar-benar tidak disebutkan lagi adalah bahwa anda mungkin hanya akan melangkahi apa yang klien anda benar-benar inginkan dari anda dalam hal ini. Ambisius adalah besar dan dapat memberikan anda banyak kepuasan kerja. Tetapi jika klien hanya doesn't peduli, berpikir kinerja saat ini adalah "cukup baik" dan hanya ingin beberapa update minor, mungkin mustahil untuk membujuk mereka untuk melakukan investasi yang besar pada anda untuk merombak basis kode.
Pada saat itu anda'll mungkin perlu memutuskan apakah untuk berdiri di atas prinsip-prinsip dan menolak untuk mengambil pekerjaan yang akan memaksa anda untuk melampirkan nama baik anda untuk memalukan kode berantakan atau apakah anda dapat memegang hidung anda, dapatkan, mendapatkan pekerjaan yang dilakukan dengan beberapa lakban, dan keluar dengan pembayaran anda.
Jika anda memutuskan untuk pergi ke depan dengan lakban pekerjaan meskipun, pastikan untuk dokumen, dokumen, dokumen dan setransparan mungkin. Hal terakhir yang anda inginkan adalah untuk mendapatkan disalahkan untuk sesuatu yang terjadi di masa depan yang merupakan hasil dari aplikasi cacat anda memperingatkan klien tentang tetapi bahwa klien memutuskan tidak't cukup penting untuk berurusan dengan pada saat itu.
Sejauh SQL injection risiko pergi, sebagai orang lain telah mengatakan anda harus mampu menunjukkan bahaya itu kepada mereka dengan cara yang menunjukkan risiko tanpa benar-benar melakukan sesuatu yang merusak dalam produksi. Tapi sekali lagi, jika mereka melihat itu dan don't peduli cukup untuk membayar anda untuk memperbaiki ini, anda've dilakukan dengan itikad baik anda ketekunan dalam kasus ini.
It's noob saus untuk datang ke proyek dan menyarankan menulis ulang hal pertama, melakukan beberapa subset kecil dari modifikasi dan menggunakan mereka untuk menggambarkan bagaimana jauh lebih sederhana dan lebih murah bisa telah. Maka anda telah dibuktikan kasus tentang mengapa peningkatan biaya cleaner pembangunan akan menimbulkan biaya pemeliharaan yang lebih rendah dan lebih cepat pembangunan jangka panjang diberikan sedikit font sisi biaya.
Jangan pernah lupa bahwa pada dasarnya anda meminta mereka untuk membayar anda untuk membuat hidup anda lebih mudah, dalam pikiran mereka hanya perlu menemukan 'cowok' yang dapat X fitur pada Y biaya dan pembesar kompleksitas proyek anda mungkin hanya menghilangkan kesempatan untuk anda. It's sepanjang jalan ketika anda're bulan ke rewrite dan anda memiliki pertemuan dengan pengembang asli hanya untuk menyadari seluruh aplikasi yang ditulis dalam yang sangat dikontrak jendela oleh pengembang yang sepenuhnya dipahami semua kompromi yang dilakukan. Jika aplikasi internal terlihat mengerikan tapi eksternal berfungsi dengan baik, seperti yang anda katakan, hal ini sangat mungkin ini akan menjadi kasus. Sering teknis utang hanya codebase adalah produk dari keterbatasan sumber daya kode dikembangkan di dan jika mereka tidak't membangun sebuah tim dan bukan pihak pada hal-hal... mereka mungkin masih belum serius tentang pemeliharaan.
I'm hanya bilang'
I'm akan bermain devil's advokat di sini (agak sepanjang garis dari apa @khrome mengatakan: "anda tidak membayar klien untuk membuat anda hidup lebih mudah"). Aku bahkan akan pergi sejauh yang menyatakan bahwa kasus anda disajikan terlalu satu sisi karena anda menggambarkan kasus secara umum. Paling masuk konsultan untuk proyek baru yang akan bersinar cahaya yang buruk dengan yang sebelumnya...saya'm tidak mengatakan bahwa's apa yang anda lakukan di sini, tapi sampai kita melihat contoh-contoh, saya tidak bisa hanya mengambil kata-kata anda untuk itu.
Yang mengatakan, saya'm akan mencoba untuk mengatasi masalah anda dengan titik titik:
Jadi singkatnya, saya akan menyarankan anda untuk mengambil jalan yang tinggi. Jika anda pikir itu's tidak layak waktu anda dan anda ingin menulis ulang dengan mengorbankan klien anda, kemudian berjalan menjauh dari pekerjaan. Serius, pada akhirnya, klien membayar untuk waktu anda untuk membuat semuanya bekerja dengan sedikitnya jumlah $$$.
Bertahun-tahun saya pengalaman di lapangan, saya selalu mengatakan bahwa programmer terbaik saya've datang adalah orang-orang yang dapat membuat suatu sistem yang stabil dengan menulis sedikit kode, bukan menulis ulang semuanya.
Edit: saya sudah melihat bahwa jawaban saya adalah tidak salah satu yang paling populer (aku sudah menduga ini) tapi aku berdiri oleh saya respon. Saya mengedit untuk membuatnya kurang snarky. ;-)
Tentu saja serangan injeksi SQL dan fungsional lainnya kekurangan dalam aplikasi didahulukan, tetapi anda juga dapat "menunjukkan" buruk kualitas kode dan praktek. Dengan kode metrik alat yang anda dapat dengan jelas menunjukkan betapa buruknya adalah kode dan menunjukkan kepadanya seberapa banyak ini akan menambahkan dalam biaya untuk setiap perubahan masa depan dan memperbaiki bug. I'm tidak akrab dengan .lingkungan bersih tapi aku'm yakin ada beberapa yang mengambil.