Penasaran Penasaran dari Dunia IT - 2

The Daily WTF telah mengumpulkan cerita-cerita lucu, liar, dan / atau sedih dari dunia TI selama 14 tahun sekarang. Saya menerjemahkan beberapa cerita yang sepertinya menarik bagi saya. Semua nama dan nama perusahaan telah diubah. Bagian pertama ada di sini .

Kisah pertama. Meskipun nenek ...


[ Asli ]

Clive membandingkan isi rekening banknya dengan tarif harian yang ditawarkan kepadanya, seperti yang dilakukan banyak freelancer, dan memutuskan bahwa dalam keadaan seperti itu pekerjaan apa pun akan cocok untuknya. Satu lowongan tampak hampir dapat ditoleransi: perusahaan asuransi membutuhkan paket perangkat lunak baru yang akan memungkinkannya untuk mematuhi beberapa persyaratan hukum. Selain itu, manajemen membutuhkan seseorang untuk mengajarkan alat dan teknik modern kepada pengembang ... misalnya, pembuatan kode.

Clive dengan cemerlang melewati wawancara dan seminggu kemudian mulai bekerja. Sebuah surat dari seseorang bernama Brandon sedang menunggunya di kotak surat. Bunyinya: "Kita harus bertemu."

Brandon duduk di kantornya, terpaku pada kursi ergonomis pertengahan 90-an dan seolah menjadi satu dengannya. Dia mendongak dari monitor dan menatap Clive. "Kamu bekerja untukku."

Dalam frasa singkat yang terdiri dari suku kata tunggal, Brandon menjelaskan bahwa tidak ada dari mereka yang membuat keputusan perekrutan akan bertemu dengan Clive. Clive hanya bertanggung jawab kepadanya.

“Oke ... Jadi, ketika aku diterima, mereka mengatakan bahwa kamu perlu mengkonfigurasi Subversion. Haruskah saya mulai dengan ini? ”Tanya Clive.

"Tidak."

"Bisakah saya mencari tahu mengapa?" Apakah Anda lebih suka yang lain? Ingin membahas opsi? "

"Tidak."

Clive menunggu. Brandon tidak tergesa-gesa membuka pikirannya. Dia hanya menatap Clive. Terus menonton dan menonton.

Clive perlahan kembali ke kubusnya dan mulai dengan mempelajari basis kode. Itu terletak di jaringan berbagi, dan kontrol versi adalah "file.pl.old", "file.pl.old.old". Ternyata kode tersebut ditulis dalam Perl, dan tidak dapat dibaca bahkan oleh standar Perl. Dia tumbuh dalam budaya "jika ia mengurai, itu akan mulai", tidak mengandung komentar dan sama sekali tidak memiliki tes. Satu-satunya sekutu Clive adalah Lee, spesialis lain yang direkrut yang juga melapor ke Brandon, tetapi ia memiliki dua minggu cacat dalam analisis kode. Ketika Clive terjebak di suatu tempat, dia melihat keluar dari balik dinding kubusnya dan bertanya pada Lee.

Seperti gletser yang turun dari gunung, Clive perlahan-lahan membuka kode. Dari minggu ke minggu, dia secara bertahap mendapatkan pemahaman. Dan kemudian sebuah surat datang dari Brandon: "Kita harus bertemu."

"Kamu mengganggu tim pengembangan," katanya.

"Apa?"

“Kamu dan Li terlalu berisik. Ini kantor, bukan klub minat. ”

“Ini gila. Saya hanya bertanya kepadanya tentang pekerjaan! "Apakah Anda ingin kami mengatur pertemuan di ruang konferensi hanya untuk mengajukan pertanyaan?"

"Ya."

Brandon terdiam dan sekali lagi mulai menatap Clive. Dia melihat, dan melihat ... Clive memahami petunjuk itu dan melarikan diri ke kubusnya.

Persyaratannya membingungkan dan terus berubah, yang tidak mengejutkan. Satu-satunya pengguna yang tahu persis mereka adalah Carol, yang juga tidak mengejutkan. Clive mengiriminya surat dengan pertanyaan, dan mencoba melakukan pekerjaannya. Dia menunggu beberapa hari untuk jawabannya, lalu dia punya pertanyaan baru, dan dia mengirim surat baru.

Dalam seminggu dia mengirim sekitar selusin surat, tetapi tidak menerima balasan. Dia mengirim yang baru untuk mencari tahu informasi baru. Selama waktu ini, bahkan lebih banyak pertanyaan telah terakumulasi. Clive mencoba meneleponnya, tetapi menemukan pesan suara. Dia mencoba menjadwalkan pertemuan, tetapi Carol tidak pernah menerima undangannya.

Dan kemudian sebuah surat datang dari Brandon: "Kita harus bertemu."

"Carol bilang kau mendorongnya," kata Brandon.

"Apa?"

“Kamu mengirim surat padanya, bahkan setelah dia menjawab pertanyaan. Dia mengatakan bahwa Anda mengadakan pertemuan, tetapi Anda tidak datang kepadanya. Ini harus dihentikan. "

“Ini gila. Dia tidak pernah menjawab, saya bisa menunjukkan kotak masuk saya dan membuktikannya. "

"Carol tidak menggunakan email," Brandon menjelaskan. “Magang mencetak email-emailnya, dan dia menjawab melalui surat internal kantor. Dia sangat sibuk. Anda memiliki tugas teknis. Ikuti itu, dan berhenti mengganggunya. "

"Apa? "Apakah Anda ingin saya menerapkan solusi tanpa berbicara dengan pengguna yang mengetahui semua persyaratan?"

Brandon menatapnya. Dia terus menonton dan ...

Dengan bantuan Lee selama beberapa bulan ke depan, Clive membuat kemajuan yang signifikan. Dia belajar untuk berurusan dengan format tanggal yang absurd (tanggal dihitung sebagai jumlah hari sejak 3 April 1974, dan juga sebagai jumlah bulan dari Senin sebelumnya, dan juga sebagai jumlah minggu dari minggu berikutnya). Mereka berurusan dengan fakta bahwa tidak seorang pun dapat memperbarui Firefox ke versi yang lebih tinggi dari 3, dan dengan fakta bahwa tidak mungkin untuk bekerja lembur, karena semua server terputus tepat pada pukul 6 malam. Carol tidak berhubungan, Brandon hanya memandang mereka, dan seluruh staf memperlakukan mereka seperti penderita kusta.

Beberapa minggu sebelum penyelesaian kontrak enam bulan mereka, Clive mempelajari isi drive jaringan perusahaan untuk mencari spreadsheet dengan data sampel. Dia menemukan sebuah meja dengan nama perusahaan rekrutmen yang mempekerjakannya dan berharap itu adalah sesuatu yang bermanfaat. Di satu sisi, itu.

Spreadsheet adalah laporan yang melaporkan berapa banyak yang diterima perusahaan merekrut untuk Clive dan Lee. Jumlahnya begitu tak tahu malu sehingga mereka bahkan membuat dealer mobil bekas memerah. Dokumen termasuk perubahan pelacakan dan pengeditan kolaboratif, sehingga Clive dapat membaca komentar yang dibuat oleh pengguna yang berbeda.

Dari tingkat manajemen senior, komentar diterima dalam semangat "Tidak peduli berapa banyak yang harus Anda keluarkan." Akuntan memperingatkan: "Jika kita melakukannya, kita tidak akan punya uang tersisa untuk premi pada akhir tahun!"

Brandon meninggalkan catatannya sendiri: “Bisnis kami terlalu spesifik. Mereka tidak akan mengatasinya. Buang-buang uang. Mereka tidak bisa melakukannya . "

Semuanya jatuh pada tempatnya. Brandon tidak memprediksi, tetapi membuat janji . Dan dia akan memenuhinya - selama beberapa minggu ke depan, Clive dan Lee tidak akan bisa melakukan apa yang semula dijanjikan.

Segera dia menerima surat dari perekrutnya. “Perusahaan ini masih membutuhkan staf tambahan. Apakah Anda ingin memperpanjang kontrak selama enam bulan lagi? "

Diajarkan oleh Brandon, Clive menjawab singkat: "Tidak."

Kisah kedua. Jatuhkan segala sesuatu yang mustahil ...


[ Asli ]

Jatuhkan segala sesuatu yang mustahil ...
... dan yang tersisa adalah XML, betapapun menakjubkannya itu.


William Hogarth, Sebuah Perspektif Aneh

Pengembang memiliki banyak kelemahan, dan salah satunya adalah ini: mereka tidak suka mengatakan bahwa sesuatu tidak dapat dilakukan. Itulah sebabnya ketika seorang klien Glenn M , TelCo, bertanya apakah tugasnya benar - benar mustahil, dia, alih-alih meminta maaf dan dengan tegas menggelengkan kepalanya, menjawab: "Ya, secara teoritis ..."

Akibatnya, Glenn menulis ini:

 <value> <mult> <op> <mult> <op> <add> <op> <div> <op> <bitwise_and> <op> <baseNToInt base="16"> <regex> <op>(?:0x)?([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])</op> <op><getRowOid>.1.3.6.1.4.1.2011.2.217.1.4.1.1.6</getRowOid></op> <op>%4$s%3$s%2$s%1$s</op> </regex> </baseNToInt> </op> <op>8388607</op> </bitwise_and> </op> <op>8388608</op> </div> </op> <op>1</op> </add> </op> <op> <left_shift> <op>1</op> <op> <sub> <op> <bitwise_and> <op> <right_shift> <op> <baseNToInt base="16"> <regex> <op>(?:0x)?([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])</op> <op><getRowOid>.1.3.6.1.4.1.2011.2.217.1.4.1.1.6</getRowOid></op> <op>%4$s%3$s%2$s%1$s</op> </regex> </baseNToInt> </op> <op>23</op> </right_shift> </op> <op>255</op> </bitwise_and> </op> <op>127</op> </sub> </op> </left_shift> </op> </mult> </op> <op> <if> <op> <eq> <op> <bitwise_and> <op> <right_shift> <op> <baseNToInt base="16"> <regex> <op>(?:0x)?([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])</op> <op><getRowOid>.1.3.6.1.4.1.2011.2.217.1.4.1.1.6</getRowOid></op> <op>%4$s%3$s%2$s%1$s</op> </regex> </baseNToInt> </op> <op>31</op> </right_shift> </op> <op>1</op> </bitwise_and> </op> <op>1</op> </eq> </op> <op>-1</op> <op>1</op> </if> </op> </mult> </value> 

Ini adalah XML DDF, Data-Definition File untuk aplikasi pemantauan sistem yang didukung Glenn. Anda lihat, suatu sistem dapat membaca data dari perangkat apa pun yang mendukung protokol Modbus / TCP atau SNMP jika memiliki file DDF yang menentukan titik data dan bagaimana mereka ditampilkan. Skema DDF berisi operator aritmatika, Boolean, reguler dan bersyarat yang ditunjukkan di atas, yang diperlukan sistem untuk mengetahui cara menghapus data.

Logika XML? Ya, ini WTF sendiri. Tetapi WTF yang sebenarnya adalah apa yang dilakukan oleh kode di atas. Perusahaan memantau perangkat yang menampilkan nilai suhu (ini cukup mudah untuk dipecahkan), tetapi itu mewakili mereka sebagai string delapan karakter yang menunjukkan nilai heksadesimal dari angka floating-point 32-bit dalam format IEEE-754. Tugas yang Glenn harus segera kenali sebagai tidak mungkin adalah mengubah nilai gila ini menjadi bentuk angka. Dalam DDF, terlepas dari semua kekuatan ekspresifnya, tidak ada operator tipe casting.

Oleh karena itu, Glenn menulis DDF yang ditunjukkan di atas, yang melakukan hal berikut:

  • Karena urutan byte telah dibalik, gunakan <regex> untuk mengembalikannya ke urutan yang dapat Anda gunakan
  • Gunakan <baseNtoInt> untuk mengkonversi dari octetString ke uint_32
  • Gunakan <bitwise_and> dan <right_shift> untuk memisahkan bit tanda, eksponen dan mantissa
  • Konversi bit yang ditandatangani menjadi +/– 1
  • Kami menghilangkan offset eksponensial, dan kemudian jalankan <left_shift> 1 dengan nilai ini
  • Bagilah mantissa dengan 2 23
  • Lipat gandakan tiga elemen terakhir untuk mendapatkan hasil akhir. Karena <mult> dan operator lain hanya menerima 2 operan, tindakan harus disarangkan

Kali berikutnya, Glenn memutuskan untuk mengikuti taktik yang sama, karena ia baru-baru ini mendengar bahwa TelCo memodifikasi perangkat sehingga menampilkan suhu dalam bilangan bulat.

Cerita ketiga. Tim A (nti)


[ Asli ]

Pada 1980-an, serial televisi yang disebut Tim A difilmkan. Ada sesuatu yang menyelinap di dalam dirinya, yang mampu menipu siapa pun. Untuk mendapatkan apa yang dia butuhkan, dia membuat janji yang jujur ​​(seperti pemasaran?). Ada seorang pria keren di tim yang bisa mengintimidasi siapa pun untuk mencapai tujuannya. Dia tahu bagaimana mencapai tujuan, tetapi jauh di lubuk hatinya dia adalah orang yang baik. Tim memiliki seorang pemimpin yang selalu dapat membuat rencana dan menyelamatkan situasi. Dan ada satu orang yang sedikit gila (tetapi dengan cara yang baik) yang selalu bisa Anda andalkan dalam pertempuran. Dari waktu ke waktu, seorang asisten muncul di tim, terlibat dalam intervensi dan kecerdasan. Kelompok orang ini bekerja seperti perlengkapan yang diminyaki dengan baik. Mereka tidak mungkin gagal! Mereka adalah tim!


Tim "A" tidak pernah menulis dokumentasi tentang metodologi manajemen proyek. Tidak mengherankan, mereka semua adalah buronan penjahat.

Alex mendapat pekerjaan di proyek baru untuk menggantikan sistem yang ketinggalan zaman dan tidak didukung. Secara alami, dinyatakan bahwa perusahaan “berupaya melakukan segalanya dengan benar!” Proyek ini sepenuhnya didanai. Tim akan memiliki peralatan dan personel yang diperlukan untuk melaksanakan pekerjaan. Ada dukungan penuh untuk enam tingkat kepemimpinan plus semua pengguna. Alex optimis.

Hal pertama yang dilakukan perusahaan adalah menghabiskan beberapa bulan untuk berkoordinasi antara semua tingkat kepemimpinan yang tak terhitung ini, pengguna akhir, orang-orang pendukung, veteran yang mendukung proyek (sehingga mereka dapat menjelaskan masalah yang membuat sistem lama lebih buruk) dan tiga arsitek dari sistem baru. Arsitektur baru telah didokumentasikan secara luas, disetujui dan ditandatangani oleh semua hal di atas. Tinjauan kritis bahkan dilakukan oleh lembaga audit regulator pihak ketiga yang independen untuk memastikan bahwa otoritas regulator yakin bahwa pendekatan yang tepat telah diambil.

Dalam dokumen delapan halaman, rekomendasi untuk pengembangan kode dijelaskan secara terperinci (seperti: opsi pemformatan kode, konvensi penamaan, pengujian unit, cakupan kode, dan aspek serupa lainnya yang penting bagi tim). Dokumen telah ditinjau dan harus diikuti oleh semua orang yang bekerja di proyek.

Awal proyek ini baik.

Tugas pertama adalah mempekerjakan pengembang untuk tim. Untuk melakukan ini, perusahaan mencari (sangat jauh) untuk spesialis lepas pantai untuk menemukan bakat termurah yang mungkin. Lagipula, semua orang bisa dilatih, kan? Sebuah tim yang terdiri dari 11 pengembang secara total memiliki 13 tahun pengalaman, dan seorang pemimpin dengan pengalaman lima tahun dipekerjakan untuk mengelolanya.

Keputusan penting berikutnya adalah pilihan database yang akan digunakan. Perusahaan telah secara aktif menggunakan tiga. Karena semua database disimpan di server terpusat, salah satunya langsung dikeluarkan: peralatan server database terlalu kuat untuk menangani beban yang diharapkan dalam jangka waktu yang wajar. Dari dua yang tersisa, salah satu anggota tim aktif menggunakan satu. Mereka tahu sintaks, keanehan, dan keterbatasannya. Yang ketiga didirikan secara tidak benar, dan karenanya memiliki reputasi sebagai tidak dapat diandalkan. Namun, dia juga merupakan standar perusahaan. Meskipun ada keberatan dari tim, sepertiga dipilih.

Manajemen proyek memutuskan bahwa QA dapat direkrut nanti.

Akhirnya, saatnya untuk menerapkan struktur yang terperinci. Pemimpin tim lepas pantai memutuskan bahwa Anda dapat menghemat banyak waktu jika Anda membuat desain dengan cepat, sesuai dengan permintaan. Tentu saja, para arsitek menentangnya, tetapi manajer proyek setuju.

Arsitek telah mulai membangun mesin pengontrol dan prinsip-prinsip dasar lain dari proyek. Tim junior, yang seharusnya membuat antrian dari berbagai sistem jarak jauh untuk entri data, menggabungkan, menyaring dan pra-pemrosesan, memutuskan bahwa itu akan lebih baik daripada apa yang tertulis dalam dokumentasi arsitektur, dan mulai mengembangkan caranya sendiri dalam melakukan operasi. Tanpa mengatakan ini kepada arsitek atau manajemen.

Sudah waktunya untuk memeriksa sprint pertama, dan selama peninjauan kode banyak jenis "bendera merah" ditemukan. Junior Lead mengatakan bahwa dokumentasi arsitektur hanyalah sebuah rekomendasi yang dia abaikan agar sesuai dengan keinginan para pengembang. Secara alami, ini memicu reaksi seperti "apakah Anda benar-benar di sana ...?" dan banyak surat di rantai kepemimpinan. Tetapi manajer proyek dan kepemimpinan di atas tampaknya tidak tertarik dengan ini: mereka mengatakan bahwa junior seharusnya tidak melakukan ini, tetapi mereka memercayai mereka.

Pekerjaan berlanjut. Arsitek terus menunjukkan kekurangan dan cacat implementasi yang tidak sesuai dengan persyaratan. Semua penawaran diabaikan karena pemimpin tim lepas pantai mengatakan: “Google mengembangkan suasana inovasi dan kreativitas; kita perlu melakukan itu juga! " Dia diingatkan bahwa Google (sebagian besar) adalah "think tank" dan pemimpinnya bekerja dengan proyek standar ketat dalam industri yang diatur secara ketat. Arsitektur itu, yang disetujui oleh lebih dari empat puluh manajer, bukanlah suatu opsi atau rekomendasi, tetapi suatu persyaratan. Bahwa ini bukan taman kanak-kanak, tempat kreativitas didorong - Anda harus mematuhi rencana yang disetujui! Kami tidak berbicara tentang cara menulis dengan benar suatu sub-prosedur atau merangkum suatu objek, tetapi pemrosesan utas itu digunakan secara tidak benar dan di tempat yang salah, dan akses ke basis data dan komunikasi antarproses tidak akan dapat diskalakan. Yang Anda butuhkan bukanlah menciptakan banyak proses, tetapi hanya menggunakan utas. Anda tidak boleh menggunakan file sebagai semafor hanya karena mereka melakukan ini di sekolah. Dan daftarnya masih akan panjang.

Tapi tidak ada yang diperhatikan. Para pengembang Juni mengeluh bahwa ketika membuat arsitektur mereka tidak memperhitungkan pendapat mereka, sehingga mereka akan terus mengabaikannya (dengan restu dari pimpinan mereka). Manajer proyek terus mengatakan bahwa dia menyadari masalah, tetapi tidak melakukan apa pun dengan mereka. Masalah dilaporkan muncul di rantai, tetapi tidak ada yang melakukan apa pun. Lagi pula, semua orang di tim memiliki hak yang sama untuk memilih.

Di dunia nyata, jika seorang siswa berpikir bahwa guru itu salah, maka mereka tidak mengubah nilainya. Dokter magang memotong tempat dokter bedah menunjukkan padanya, dan bukan sebaliknya. Jenderal tidak membahas strategi dengan pangkat dan file. Jika Anda bergabung dengan serikat pekerja, dan sebagai seorang pemula, Anda menuntut kekuatan yang sama dengan para pemimpin serikat pekerja, maka Anda akan beristirahat di sebelah Jimmy Hoff [seorang pemimpin serikat pekerja Amerika yang tiba-tiba menghilang dalam keadaan misterius] . Pengalaman berbicara dengan tanda seru. Kurang pengalaman berbicara kepada para interogator.

Tetapi tidak di "tim" ini.

Junior terus melakukan apa yang mereka pikir terbaik, mengabaikan semua permintaan arsitek. Sebagian besar kode mereka ditulis dan disalin beberapa kali, karena jones tidak dapat memperhitungkan semuanya pertama kali. Pengembang yang lebih berpengalaman akan tahu apa yang harus diandalkan. Setelah 8 bulan, proyek tersebut mengalami kerusakan sedemikian rupa sehingga tidak mungkin untuk mencapai persyaratan yang paling kompleks, dan dalam proyek pengembangan yang dimulai dari awal, perlu untuk mundur sebulan yang lalu.

Sekitar waktu ini, manajemen menyerah pada permintaan dan meminta beberapa pengguna komersial untuk menulis tes tingkat komersial (misalnya, spreadsheet yang dapat diajukan ke JBehave untuk pengujian JUnit). Pengembang menyediakan kode dan beberapa contoh sederhana dalam spreadsheet. Arsitek mengatakan mereka perlu merekrut staf QA karena pengguna jarang tahu bagaimana menangani kasus batas, masalah akurasi, dll. Tetapi uang tidak bisa dihabiskan. Setelah enam bulan beroperasi, pengguna komersial mengatakan bahwa semua tes untuk seluruh aplikasi (mis., Seluruh tugas teknis) telah siap. Hanya dengan melihatnya, dimungkinkan untuk memahami bahwa mereka tidak memperhitungkan kasus batas akun, contoh kosong, masalah akurasi, dan sebagian besar aspek lain yang biasanya memerlukan pengujian. Bahkan, mereka menempatkan semua catatan yang secara teoritis bisa (dari sudut pandang mereka) ada dalam satu tes lulus-gagal besar. Tentu saja, ketika sesuatu berubah dan gagal pasti terjadi, tidak ada cara untuk mengetahui di mana itu terjadi.

Akhirnya, banyak hal terjadi sehingga para arsitek membangun dinding fisik antara bagian-bagian aplikasi dengan kode pengaturan (ditulis oleh tim lepas pantai) dan mesin utama (dibuat oleh arsitek). Segera setelah mesin utama mulai menggiling data, setiap variabel dalam sistem direset ke tabel keadaan dalam database, sehingga jika terjadi masalah yang tak terelakkan, data input ditampilkan dan pengembang lepas pantai dapat mengirim permintaan koreksi. Setidaknya dengan cara ini mereka bisa mengisolasi mesin utama dari sampah.

Kementerian menghemat satu ton uang melalui penggunaan tenaga kerja murah, kurangnya departemen QA dan penggunaan basis data "sehat secara politis". Tentu saja, semua kode konfigurasi yang ditulis oleh tim lepas pantai itu mengerikan. Sebagian besar sulit untuk dipelajari, dipelihara, di-debug, dan ditingkatkan.

Produk belum diluncurkan, dan pengguna sudah mengeluh tentang mendiagnosis dan memperbaiki masalah terlalu lama (ini adalah salah satu alasan utama untuk menulis ulang proyek lama). Dan jika menulis ulang tidak menyelesaikan tugas utama penulisan ulang, maka mungkin ada yang tidak beres ...

Kisah keempat. Lewati pointer nol


[ Asli ]

Maxine kesulitan menampilkan situs web di peramban dengan add-on NoScript. Ini tidak mengherankan - beberapa browser mungkin tidak berfungsi dengan benar dengan NoScript, tetapi mengejutkan bahwa browser tersebut melemparkan pengecualian Java. Saat Anda mengaktifkan JavaScript, halaman kesalahannya hilang, tetapi bagaimana itu? Kurangnya JavaScript menyebabkan pengecualian Java!?

Dia membuka kode halaman dan menemukan bahwa server mengharapkan parameter "innerCHK"; mungkin semacam sesi atau token keamanan yang harus dilewatkan dalam string kueri URL. Jika tidak, server mengembalikan halaman kesalahan yang menampilkan java.lang.NullPointerException. Untungnya, para pengembang front-end datang dengan potongan besar JavaScript berikut untuk menyelesaikan masalah:

  // Pemeriksaan kesalahan
 if (document.body.innerHTML.indexOf ('java.lang' + '. NullPointerException')! = -1) {   
    if (document.location.href.indexOf ('innerCHK =') == -1) {    
         document.location.href = document.location.href + "& innerCHK =" + Math.random () * 10000;
    }
 }
 // Akhiri pemeriksaan 

Tapi ini hanya puncak gunung es; halaman itu dipenuhi dengan antipatterns, roda diciptakan kembali, roda cadangan dan ban kempes. Semua ini direkam . Untuk mengetahui gaya konversi string aneh dan antipattern favorit pengembang - skrip penutup hanya untuk membuka yang baru di baris berikutnya, mari kita lihat bagaimana Dojo diimpor. Harap dicatat bahwa cookie Dojo diimpor.

  <script type = "text / javascript">
     if (typeof dojo == "undefined") {        
         document.writeln ('<scr' + 'ipt src = "' + '/wps/themes/./dojo/portal_dojo/dojo/dojo.js' + '"> </ scr' + 'ipt>');
     }
     if (typeof dijit == "undefined") {      
         document.writeln ('<scr' + 'ipt src = "' + '/wps/themes/./dojo/portal_dojo/dijit/dijit.js' + '"> </ scr' + 'ipt>');
     }      
  </script>     
  <script type = "text / javascript">     
  dojo.require ("dijit.form.Button");
  dojo.require ("dojo.cookie");
  //dojo.require("dijit.form.DropDownButton ");
  dojo.require ("dijit.Dialog");
  dojo.require ("dijit.form.TextBox");
  dojo.require ("dijit.form.CheckBox");
  dojo.require ("dijit.form.ComboBox");
  </script>

Beberapa, jika tidak semua tautan CSS ditangani dengan cara ini. Saya menemukan dalam kode sumber setidaknya tiga kejadian (identik). Ulangi Dojo.cookie diimpor.

  <script name = "DojoEnable_script" language = "JavaScript"> if (typeof dojo == "undefined") {
     dojo.require ("dojo.cookie");
     dojo.require ("dojo.parser");
     djConfig = {parseOnLoad: false, isDebug: false};
     document.write ("<script src = 'http: //www.****************.com: 80 / ps / PA_WPF / pabrik / dojo / dojo / dojo.js '> </ "+" script> ");
     document.write ("<link rel = 'stylesheet' type = 'teks / css' href = 'http: //www.****************.com: 80 / ps /PA_WPF/factory/dojo/dojo/resources/dojo.css '/> ");
     document.write ('<link rel = "stylesheet" type = "text / css" href = "http: //www.****************.com: 80 / ps /PA_WPF/factory/dojo/dijit/themes/tundra/tundra.css "/> ');
     document.write ('<link rel = "stylesheet" type = "text / css" href = "http: //www.****************.com: 80 / ps /PA_WPF/factory/dojo/dijit/themes/tundra/tundra_rtl.css "/> ');
     dojo.addOnLoad (function () {if (! document.body.className) document.body.className = 'tundra'});
 }


Seseorang pernah berkata bahwa jika Anda ingin menyelesaikan masalah dengan ekspresi reguler, maka Anda memiliki dua masalah. Saya pikir, mengatakan "dua," ia meremehkan situasi.

  var locale = 'en'.replace (/ _ /,' - '). ganti (/ iw /,' he '). toLowerCase ();

Ingat, anak-anak selalu menggunakan nama yang dipikirkan dengan matang untuk konstanta! Angka ajaib itu buruk. Kecuali 2008, semuanya baik-baik saja dengannya.

  if (typeof (MONTHS_IN_YEAR) == 'tidak terdefinisi')
 {
     MONTHS_IN_YEAR = 12;
 }

 if (typeof (isDisableDate) == 'undefined') {
     var isDisableDate = fungsi (tanggal, tahun, bulan, iday)
     {
         if (date.getFullYear () == 2008)
         {
             kembali benar;
         }
         return false;
     }
 };

Tidak ada aplikasi yang diimplementasikan dengan buruk akan lengkap tanpa perpustakaan DateTime yang diimplementasikan dengan buruk. Pasti ada semacam hukum ilmiah tentang ini.

  var month = new Array (12);
 bulan [0] = "1";
 bulan [1] = "2";
 bulan [2] = "3";
 bulan [3] = "4";
 bulan [4] = "5";
 bulan [5] = "6";
 bulan [6] = "7";
 bulan [7] = "8";
 bulan [8] = "9";
 bulan [9] = "10";
 bulan [10] = "11";
 bulan [11] = "12"; 

 if (typeof (MONVALUE) == 'undefined')
 {
     MONVALUE = Array baru
     ("Jan",
      "Feb",
      "Mar",
      "Apr",
      "Mei",
      "Jun",
      "Jul",
      "Agustus",
      "Sep",
      "Okt",
      "Nov",
      "Des");
 }

 // fungsi mengonversi tanggal dari str ke Num
 function Month2Num (bulan)
 {
     if (month == "JAN") return "01"; if (bulan == "FEB") return "02"; if (bulan == "MAR") return "03"; if (bulan == "APR" ) kembalikan "04"; jika (bulan == "MUNGKIN") kembalikan "05";
     jika (bulan == "JUN") kembali "06"; jika (bulan == "JUL") kembali "07"; jika (bulan == "AUG") kembali "08"; jika (bulan == "SEP" ) mengembalikan "09"; jika (bulan == "OCT") mengembalikan "10";
     if (month == "NOV") return "11"; if (month == "DEC") return "12";
 }

Kode berisi banyak gaya CSS (sering duplikat), misalnya, ini bukan gaya yang sangat biru.

  div.wpfTemaBiruBackgroundPanelTable  
 { 
     latar belakang: # F6F9FC; 
     padding: 10px; 
 } 
 / * ---- Panel biru ---- * / 
 table.wpfTemaBiruBackgroundPanelTable  
 { 
     latar belakang: # F6F9FC; 
     padding: 10px; 
 } 

Berikutnya adalah dua array yang identik, yang hanya digunakan satu.

  var arr_location_001 = Array baru ();
 var arr_location_002 = Array baru ();

 arr_location_001 ['AU'] = {value: 'AU', judul: 'australia', teks: 'Australia'};
 arr_location_002 ['0'] = {value: 'AU', judul: 'australia', teks: 'Australia'};

 arr_location_001 ['CA'] = {value: 'CA', judul: 'canada', teks: 'Canada'};
 arr_location_002 ['1'] = {value: 'CA', judul: 'canada', teks: 'Canada'};

 arr_location_001 ['CN'] = {value: 'CN', judul: 'china', teks: 'China'};
 arr_location_002 ['2'] = {value: 'CN', judul: 'china', teks: 'China'};

 arr_location_001 ['FR'] = {value: 'FR', judul: 'france', teks: 'France'};
 arr_location_002 ['3'] = {value: 'FR', judul: 'france', teks: 'France'};

 arr_location_001 ['HK'] = {value: 'HK', judul: 'hong_kong', teks: 'Hong Kong'};
 arr_location_002 ['4'] = {value: 'HK', judul: 'hong_kong', teks: 'Hong Kong'};

 / * fragmen banyak baris kode serupa * /

Berikut ini adalah skrip kecil yang indah yang berhasil menghindari banyak termasuk tag skrip sendiri! Pengembang mendapat poin bonus jika ia menulisnya di jaket, naik di peti mati penuh dengan kalajengking, tergantung di helikopter di atas Hudson. (Sebenarnya, ini mungkin penjelasan paling logis untuk sebagian besar kode.)
  <SPAN name = "onloadScript"> <tipe input = "tersembunyi"> fungsi onSelectInfo (kalender, tanggal, elem_date) { 
     elem_date = document.getElementById (& quot; Day_NArr & quot;);       
     elem_mon_year = document.getElementById (& quot; Month_NArr & quot;); 
     hidden_elem = document.getElementById (& quot; temp_date_NArr & quot;); 
     doOnSelect (kalender, tanggal, elem_date, elem_mon_year, hidden_elem); 
 } 

 Kalender.setup ( 
     { 
         inputField: & quot; temp_date_NArr & quot ;, // ID dari kolom input 
         ifFormat: & quot;% b,% e,% Y & quot;, 
         onSelect: onSelectInfo, 
         range: [currentYear, nextYear], 
         dateStatusFunc: dateStatusHandler, 
         tombol: & quot; cal_dep & quot;  // ID tombol 

     } 
 ); 

 var _InfoVerAccurateFunc = clone (akuratDate); 
 initializeDate (Array baru ('Month_NArr', 'Day_NArr'), _InfoVerAccurateFunc); ">
 <script type = "text / javascript">

Ingat semua dojo.cookie yang diimpor di atas? Seseorang menambahkan fungsi perpustakaan untuk membaca cookie.Namun demikian, orang lain menganggap perlu untuk menulis fungsi copy-paste Get_Cookie dari Internet, tetapi tidak sekali, tetapi empat kali!

 function Get_Cookie (check_name) {
    // pertama kita akan membagi cookie ini menjadi pasangan nama / nilai
    // note: document.cookie hanya mengembalikan nama = nilai, bukan komponen lainnya
    var a_all_cookies = document.cookie.split (';');
    var a_temp_cookie = '';
    var cookie_name = '';
    var cookie_value = '';
    var b_cookie_found = false;

    untuk (i = 0; i <a_all_cookies.length; i ++) {
        // sekarang kita akan memisahkan setiap pasangan nama = nilai
        a_temp_cookie = a_all_cookies [i] .split ('=');


        // dan rapikan spasi putih kiri / kanan selagi kita berada di sana
        cookie_name = a_temp_cookie [0] .replace (/ ^ \ s + | \ s + $ / g, '');

        // if the extracted name matches passed check_name
        if (cookie_name == check_name) {
            b_cookie_found = true;
            // we need to handle case where cookie has no value but exists (no = sign, that is):
            if ( a_temp_cookie.length > 1 ) {
                cookie_value = unescape(a_temp_cookie[1].replace(/^\s+|\s+$/g, ''));
            }
            // note that in cases where cookie is initialized but no value, null is returned
            return cookie_value;
            break;
        }
        a_temp_cookie = null;
        cookie_name = '';
    }
    if (!b_cookie_found) {
        return null;
    }
}

Saya pikir metode pengembangan perangkat lunak yang digunakan oleh tim ini adalah sistem yang baru dibuat yang disebut “Dolby on CTRL-C dan kunci CTRL-V !!!!!! 11 !!!! 11! 11”. Saya yakin bahwa dalam waktu dekat ini akan menggantikan Agile.

Cerita kelima. Robot manusia


[ Asli ]

Selama pembentukan SuperbServices, Inc, bisnisnya berkembang pesat. Itu adalah berkat dan kutukan; seperti pada startup apa pun, ada lebih banyak pekerjaan daripada tangan. Departemen penjualan tidak bisa melepaskan kesuksesan mereka, sehingga teknisi harus beradaptasi.

CEO SuperbServices, Inc memberi Roland tugas serius yang dapat menyelamatkan perusahaan, atau setidaknya kesehatan mental karyawan. "Kita perlu mengotomatiskan semua pemrosesan sehingga kita dapat fokus pada penyediaan layanan," kata CEO. “Yang paling berharga dengan kami adalah layanan kami, dan segala sesuatu yang lain tidak perlu diributkan. Anda perlu mengotomatiskannya, dan itulah yang akan Anda lakukan. Anda akan bekerja sama dengan robot manusia untuk mengotomatisasi segalanya: konfirmasi operasi, pembelian, transaksi dana, email pelanggan - itu saja! ”

"Dengan ... robot manusia?"

Roland memiliki fobia baru. Departemen server perusahaan luar biasa eksentrik, bahkan menurut standar industri. Hanya beberapa yang melihat karyawannya, dan hanya desas-desus aneh yang datang ke Roland.

Ketika Roland mengetuk pintu ruang server, kamera pengintai di atas kepalanya hidup kembali dan suara tanpa emosi dari robot itu bertanya kepadanya: "APA YANG ANDA CARI?"

“Uh, hai ... aku Roland, manajer proyek. Sepertinya kita semua, atau siapa di sana, harus mengotomatiskan tugas? ”

"APA YANG ANDA TAWARKAN KAMI?" Jawab suara logam yang tidak menyenangkan itu.

"Yah, uh ... robot suka donat?" Saya miliki dengan saya. Hanya itu yang ada. "

"LULUS". Kunci elektronik di pintu terbuka dengan klik. Roland menarik pintu ke arahnya sendiri, dan udara dingin berhembus dari belakang. Ribuan lampu dan rak berkelap-kelip di dalam, di dekatnya ada sebuah meja kecil. Lampu menyala di atas meja. "TETAPKAN PENAWARAN DI SINI," kata senapan mesin dari bayang-bayang.

Roland meletakkan kotak donat di atas meja dan perlahan berjalan pergi. Teriakan "Terima kasih!" Datang dari belakangnya. Roland melompat. Pria lemah dengan modulator suara terkikik dan meraih donat.

"Hai Roland, aku Roy," katanya, sambil menyisihkan modulator. “Kami tidak memiliki banyak pengunjung, jadi kami ingin mengejek mereka. Nah, apakah Anda perlu mengotomatisasi sesuatu? ”

Roland terkejut melihat Roy yang biasa, dan bukannya dia benar-benar manusia. "Ah, ya, CEO mengatakan bahwa Anda banyak bekerja dengan robot, dan bahwa kami dapat menggunakannya untuk mengotomatisasi semua yang kami bisa," Roland menguraikan persyaratan dan spesifikasinya.

Roy menghela nafas. "Sayang sekali mengecewakanmu, tapi kami benar-benar tidak ada hubungannya dengan robot, tidak peduli apa yang dipikirkan gender. Dia bersikeras bahwa Ruby adalah nama robot, meskipun itu hanya bahasa pemrograman. Tetapi sebagian besar dari proses ini dapat diotomatisasi. Beri kami dua minggu, donat dan minuman berenergi sebanyak yang bisa kami konsumsi, dan kami bisa menanganinya. ”

Selama dua minggu berikutnya, Roland membawa penawaran yang diminta dan menerima informasi pertukaran tentang kemajuan dan demo fungsi. Roy dan robot manusia lainnya menulis kodenya, dan tak lama kemudian tumpukan kertas kerja yang dilakukan semua orang di puncak dipindahkan ke server di ruang bawah tanah. Roland menjelaskan bahwa sebagian besar pekerjaan dilakukan oleh "robot manusia," tetapi CEO memuji usahanya.

"Roland, pekerjaan besar telah dilakukan, sekarang mesin-mesin ini menarik tuas yang membuat bisnis kita bergerak," Direktur Jenderal menepuk punggungnya. “Hadiahmu akan menjadi proyek baru - proyek lain dengan prioritas tertinggi. Departemen keuangan kami tidak menangani volume transaksi. Saya berbicara dengan CFO dan dia ingin Anda dan orang-orang robot mengotomatisasi produk baru yang kami beli - MoneyWorx. Jangan biarkan aku jatuh! "

Roland kembali ke ruang server. Jika proyek otomasi sebelumnya sangat sederhana, maka semuanya akan sama, kan? Dia menunjukkan Roy tuntutan.

Kulit Roy yang kecokelatan di bawah cahaya monitor menjadi lebih pucat. “Ini buruk, sangat buruk! Bahaya! ”Seru Roy. Dia melambaikan tangannya dengan ngeri. “Ini bukan MoneyWorx, tetapi MoneyDoesntWorx. Bahkan ketika layanan berjalan, mereka memerlukan token RSA-SecurID. Seseorang harus memasukkan kode secara manual. "

"Secara manual?" Artinya, agar sistem berfungsi, seseorang harus ada di saluran? ”

"Ya. Kami menggunakan tiga token SecurID, jadi biasanya ketika MoneyWorx meminta kode baru, harus ada tiga orang di telepon. ”

"Jadi itu tidak akan berhasil. Jika untuk transaksi orang harus menerima telepon malam, CEO akan sangat marah. Dan dia sudah menandatangani perjanjian - kita harus memastikan bahwa sistemnya bekerja tanpa memanggil orang. "

Roy membuka pria energi dan menggigil. “Beri aku akhir pekan, aku akan memikirkannya. Dan saya akan membutuhkan lebih banyak dari ini, ”dia mengguncang toples. "Dan yang ini," dia menunjuk ke sebuah kotak donat.

Roland muncul di akhir pekan dan memberikan persembahannya. Roy menerimanya, tetapi tidak mengatakan apa-apa. Robot manusia terlalu sibuk untuk mengobrol. Ketika Senin tiba, Roland kembali dengan donat baru dan minuman berenergi. "Eureka!" Seru Roy saat Roland masuk. "Biarkan aku menunjukkan padamu mahakaryaku!"

"Mahakarya" adalah kotak donat kosong yang diletakkan di satu sisi. Token RSA-SecurID terpaku pada kotak. Seluruh sistem dipasang di depan webcam murah. "Ketika MoneyJerks akan membutuhkan token dua faktor baru, seseorang dapat mengakses mesin ini dari jarak jauh, memeriksa token dan memasukkan kode yang benar."

"Tidakkah menurutmu kotak ini perlu dilindungi kata sandi?" Saran Roland.

"Apakah Anda pikir pengguna akan ingat cara masuk?" Roy keberatan.

Mungkin itu ide paling bodoh yang pernah didengar Roland, tetapi dia melaporkannya di lantai atas dan menunjukkan demo solusi di kantor CEO. Setelah ia terputus dari mobil dengan kamera web, ia meringis, menunggu ulah.

“Ini luar biasa! Mereka mengalihkan pandangan robot mereka pada hal-hal ini, dan sekarang tidak seorang pun di perusahaan perlu memberi tahu MoneyWorx apa yang harus dilakukan! Kerja bagus, Roland. Ucapkan selamat dari orang-orang robot. Robot mereka hanya keajaiban. "

Roland senang bahwa pekerjaan itu selesai, tetapi tidak dapat menyingkirkan perasaan bahwa dia telah melakukan kesalahan besar. Keamanan finansial perusahaan berada di tangan webcam murah tanpa perlindungan apa pun, kecuali kurangnya alamat IP publik.

gambar

Ketika bencana akhirnya meletus, itu tidak mengambil bentuk transaksi penipuan. Sebuah kotak donat jatuh Rabu malam. Roland harus memanggil Roy, yang pergi ke kantor dan mengembalikan kotak itu ke tempatnya. Setelah menganalisis penyebab kegagalan, Roy menempelkan kotak ke rak server dengan pita listrik, sehingga memastikan waktu kerja yang konstan.

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


All Articles