Beberapa bulan yang lalu, kami mulai mengembangkan aplikasi untuk mengontrol peralatan uji yang dikembangkan sendiri dan merekam serangkaian pengukuran. Seharusnya memiliki UI sederhana, dan kemungkinan akan memerlukan utas karena perekaman berkelanjutan yang harus dilakukan. Aplikasi ini akan digunakan selama beberapa tahun, dan akan dikelola oleh sejumlah mahasiswa ilmu komputer selama periode ini.
Bos kami lulus sekitar 30 tahun yang lalu (tidak dianggap sebagai pelanggaran; saya memiliki lebih dari setengah waktu di punggung saya juga) dan telah mengamanatkan bahwa kami mengembangkan aplikasi ini dalam ANSI C. Alasannya adalah bahwa ia adalah satu-satunya yang akan ada di sekitar sepanjang waktu, dan karena itu dia harus dapat memahami apa yang kita lakukan. Dia juga memutuskan bahwa kita tidak boleh menggunakan tipe data abstrak; dia bahkan memberi kami daftar dengan nama variabel global (desahan) yang dia ingin kita gunakan.
Saya benar-benar mencoba pendekatan itu untuk sementara waktu, tetapi itu benar-benar memperlambat saya untuk memastikan bahwa semua operasi pointer aman dan semua string memiliki ukuran yang benar. Selain itu, jumlah baris kode yang benar-benar terkait dengan masalah yang ada hanya sebagian kecil dari basis kode kami. Setelah beberapa hari, saya membatalkan semuanya dan mulai menggunakan C #. Bos kami sudah melihat program berjalan dan dia suka cara kerjanya, tetapi dia tidak tahu bahwa itu ditulis dalam bahasa lain.
Minggu depan kita berdua akan bertemu untuk membahas kode sumber, sehingga dia "akan tahu bagaimana mempertahankannya". Saya agak takut, dan saya ingin mendengar dari kalian argumen apa yang bisa saya gunakan untuk mendukung keputusan saya.
Milikmu pengecut,
sumber
Jawaban:
Perhatikan bahwa "Tolong lakukan seperti ini jadi saya yakin saya bisa memeliharanya" sebenarnya merupakan persyaratan yang sangat baik - sebagian besar program menghabiskan lebih lama dipertahankan daripada ditulis dan menjaga solusi dalam teknologi yang dikenal biasanya merupakan ide yang baik.
Bayangkan saja jika beberapa anak komputer baru ketika diminta untuk menulis aplikasi C # menulisnya di Haskell dalam dua hari dan berkata, "Hei, itu bekerja dan saya pergi, sampai jumpa" meninggalkan pemeliharaan pada Anda.
Bayangkan saja jika beberapa anak komputer baru ketika diminta untuk menulis aplikasi ANSI C 15 tahun yang lalu telah menulisnya dalam Visual Basic 6 dalam dua hari dan meninggalkannya. Sekarang Anda harus memeliharanya dan Windows 7 mulai mengeluh ketika media instalasi dimasukkan .
Ini mungkin kesempatan yang baik untuk mengatakan - seperti Heinzi mengisyaratkan dalam komentar - bahwa "ini adalah prototipe cepat yang ditulis dalam C # yang kebetulan terlihat sangat mirip dengan C - akankah kita membuatnya produksi siap, atau menerapkannya kembali dalam ANSI C seperti Anda bertanya ", dan kemudian berdiskusi sekarang. Memiliki sumber aktual untuk dilihat, jauh lebih baik daripada "Hei, seharusnya kita tidak menulis aplikasi kita berikutnya di Haskell karena lebih cepat".
Dengan kata lain - Anda sekarang memiliki kesempatan untuk menunjukkan bahwa platform baru dapat dipertimbangkan. Tampilkan bahwa Anda menulis prototipe sebelum ulasan kode - ini akan membantu menghilangkan kesan bahwa Anda mencoba menyelinap C # di bawah radar. Saya menyarankan Anda juga menunjukkan bahwa semua kode yang ada yang ditulis dalam ANSI C dapat digunakan dari dalam C #. Secara pribadi saya percaya Anda akan diberitahu bahwa target tetap ANSI C untuk tetap dalam satu platform.
sumber
Bos Anda tampaknya menjadi pelanggan Anda dalam hal ini, dan persyaratan utamanya adalah bahwa ia dapat mempertahankan aplikasi saat Anda pindah. Ini sepertinya masuk akal.
Jadi, pilihannya adalah melakukan apa yang dia minta, atau menunjukkan bahwa Anda dapat menyelesaikan pengembangan DAN mengajarinya cara memelihara aplikasi C # dalam batasan waktu dan biaya yang lebih rendah. Jika Anda tidak dapat melakukan itu, Anda tidak memenuhi persyaratan proyek.
sumber
Anda belum memberikan banyak info tetapi saya pikir C benar-benar pilihan yang tepat - saya bekerja sebagai Insinyur di pabrik industri dan sebagian besar (jika tidak semua) kode kami ditulis dalam C. Jika Anda perlu mendapatkan pengukuran dari perangkat (Saya mengasumsikan flow meter atau termokopel atau serupa di sini) dan menampilkannya di dekat ke realtime C adalah pilihan yang sangat baik.
Ini cepat, portabel (saya tidak pernah menulis dalam C # tapi saya tidak berpikir itu berfungsi tanpa versi tertentu dari kerangka kerja yang diinstal dan biasanya hanya berbasis windows).
Dengan segala cara Anda bisa menggunakan bahasa lain untuk melakukan GUI. Tetapi Anda bisa menghemat usaha dan hanya menggunakan paket trending yang sudah ada sebelumnya (ada beberapa yang tersedia opensource yang baik).
Untuk meringkas saya akan mengatakan untuk antarmuka yang mendasari dengan bagian perangkat keras C adalah pilihan yang baik.
sumber
TCHAR
omong kosong khusus Windows (yang tidak kami gunakan secara konsisten pula) dan mengadopsi standar tim menggunakan UTF-8 pada saat yang sama dengan transisi Linux. Sayangnya, ini membutuhkan penerapan kembali sebagian besar pustaka standar pada Windows, yangboost::nowide
belum ada pada saat itu.Oh sayang. Ini adalah aplikasi real-time? Mengontrol peralatan secara langsung? Mengumpulkan data secara real-time? Menggunakan bahasa dengan pemulung? Oh sayang.
Meskipun saya setuju bahwa Anda mungkin dapat melakukan aplikasi dalam bahasa yang lebih modern dalam waktu yang lebih singkat, itu mungkin bukan kriteria utama. MUDAH PEMROGRAMAN ANDA MUNGKIN BANYAK KURANG PENTING DARI KRITERIA LAINNYA, seperti yang ditetapkan atasan Anda, DAN waktu respons, dan perilaku deterministik.
Saya akan menyarankan Anda melakukan prototipe dalam C # atau Python, hanya untuk menguji fungsi utama dan UI. LALU menguji hal itu, mengukur latensi aktual dan waktu respons, ketika aplikasi mendapatkan banyak data, selama beberapa hari berjalan terus menerus. Kemungkinannya, aplikasi tersebut bisa menjadi terlalu lambat atau tertinggal secara acak, ketika VM atau pengumpul sampah masuk.
Saya sarankan Anda menyajikan apa yang telah Anda lakukan sebagai PROTOTIPE.
Pengodean dalam C tidak terlalu sulit. Jika Anda tidak sanggup melakukannya, katakan demikian. Ada banyak dari kita yang siap menghadapi tantangan. (Saya telah melakukan coding C real-time untuk, argh, dekade sekarang).
sumber
Nah, hal pertama yang harus dilakukan adalah pergi ke bos Anda dan mengaku. Anda telah mengabaikan permintaannya yang jelas, dan lebih buruk telah melakukannya selama berbulan-bulan. Saya tidak tahu berapa banyak waktu yang Anda miliki dalam hal ini, tetapi dengan asumsi bahwa sebagian besar waktu yang dialokasikan untuk menyelesaikan proyek, Anda harus berhadapan dengan kenyataan bahwa Anda mungkin akan segera mencari pekerjaan baru.
Semakin cepat Anda berurusan dengan ini, semakin baik.
Kedua, saya tidak berpikir Anda dapat meyakinkannya bahwa ANSI C tidak memadai, yang perlu Anda lakukan adalah meyakinkannya tentang beberapa hal lain (1) bahwa c # memadai, (2) ia dapat dengan mudah belajar mempertahankan c #, (3) ) bahwa Anda tidak cukup untuk menulisnya dalam C. Dengan asumsi bahwa Anda masih memiliki pekerjaan dan bagian untuk bermain dengan proyek ini, saya akan berkonsentrasi pada 2, menekankan kesamaan antara c dan c #.
Kutipan dalam menanggapi komentar ...
sumber
Ini adalah persyaratan yang cukup masuk akal.
Ini tidak masuk akal. Sekarang mulai berbau agak mencurigakan, karena ini adalah persyaratan desain program dan bukan persyaratan bahasa. Jika kode harus mudah dipelihara, menerapkan ADT atau menggunakan yang sudah teruji, yang sudah ada harus menjadi prioritas.
Ok, jadi sekarang bau. Sekarang kami dapat mengatakan bahwa atasan Anda memiliki pengalaman yang terbatas tidak hanya dari berbagai bahasa pemrograman, tetapi dari pemrograman secara umum. Seorang programmer veteran yang terampil, tidak peduli preferensi bahasa, tidak akan pernah membuat pernyataan seperti itu. (Satu-satunya pengecualian yang dapat saya pikirkan adalah jika sebagian besar kode dimaksudkan untuk berjalan pada sistem tertanam yang cukup kecil, dan oleh karena itu semua memori kerja yang diperlukan untuk kode diharapkan akan dialokasikan sebelumnya. Gagasan bahwa kode yang sama diharapkan memiliki UI tingkat layar yang sangat menentang hal ini terjadi).
Saya menduga bos Anda tidak pernah terlibat dalam proyek perangkat lunak mission mission skala besar, tetapi ia lebih cenderung bekerja dalam berbagai proyek berkualitas rendah.
Jadi ini tidak ada hubungannya dengan bahasa pemrograman C. Anda dapat dengan mudah menulis program yang sama menjijikkan di C # juga. Adalah kesalahan yang sangat umum untuk percaya bahwa desain program yang baik tergantung pada bahasanya. Itu tidak benar!
C # tentu saja memiliki sintaksis yang lebih cantik, lebih bersih, dan kurang jelas daripada C. C # memiliki banyak dukungan desain program, karena memiliki jauh lebih banyak kata kunci yang berhubungan dengan OO daripada C. Tetapi selain itu, C # tidak memberi tahu Anda cara menulis program. Jika Anda percaya bahwa semua yang ditulis dalam C adalah buruk secara default dan semua yang ditulis dalam C # adalah surga secara default, saya yakin Anda saat ini menulis program C # yang agak mengerikan tanpa menyadarinya.
Apa yang saya sarankan adalah Anda membuat desain program yang abstrak, tidak tergantung bahasa, tetapi terperinci sebelum hal lainnya. Gunakan pendekatan normal, berorientasi objek. Objek apa yang ada di sana dan bagaimana mereka berkomunikasi antara satu sama lain, apa saja dependensi yang dibutuhkan dll. Ketika Anda telah memberikan pemikiran desain program yang cukup dan menuliskannya di atas kertas, itu tidak akan menjadi masalah bagi Anda atau bos Anda yang bahasa yang Anda pilih untuk mengimplementasikannya.
sumber
Masalah pertama yang harus Anda tangani adalah masalah emosional dan irasional. Industri TI adalah satu dalam perubahan konstan dan, meskipun ada tempat untuk semuanya, menolak untuk meningkatkan atau merangkul perubahan adalah masalah.
Mengapa bos Anda berpegang teguh pada ANSI C? Jika itu adalah satu-satunya bahasa yang diketahuinya, mungkin sekarang saatnya untuk perubahan tetapi argumen rasional mungkin tidak cukup. Apakah atasan Anda merasa diremehkan atau mungkin dipecat jika dipaksa bekerja dalam bahasa yang tidak dikenal? Tekankan pengalaman yang dia miliki dan manfaat lain yang dia bawa.
Jika Anda tidak menyelesaikan masalah ini, semua argumen rasional yang dapat Anda bawa akan sia-sia. Sebagai bawahan, Anda mungkin bukan orang yang bisa berdiskusi dengannya. Mungkin membicarakan hal ini dengan salah satu manajer lain, jika ada.
Pertimbangkan juga dari sudut pandang Anda. Mengapa Anda ingin menggunakan C #? Berapa banyak dari ini keinginan untuk menggunakan sesuatu yang baru dan keren? Jujurlah pada dirimu sendiri. Jika Anda mengenali ini, itu akan membantu Anda berdebat dengan lebih efektif.
Masalah kedua adalah risiko dan biaya. Menulis perangkat lunak itu mahal dan pilihan bahasa adalah faktor utama dalam hal itu. Mempertimbangkan:
Saya bisa terus tetapi intinya adalah berhenti berdebat tentang manfaat teknis dari bahasa saja. Manfaat teknis adalah hal-hal yang hanya Anda dan atasan Anda mengerti. Jika Anda mulai membicarakan dampak bisnis, Anda menarik sekelompok orang yang jauh lebih luas dan membuat argumen yang jauh lebih meyakinkan.
Mungkin C adalah pilihan yang lebih baik. C # tidak secara otomatis lebih baik untuk semua situasi. Mungkin Anda melakukan proyek ini menggunakan C tetapi melakukan bukti konsep C # untuk yang berikutnya. Ingat Anda bisa kalah dalam pertempuran tetapi tetap memenangkan perang juga.
sumber
Mungkin argumen lain: Mungkin sangat sulit untuk menemukan siswa ilmu komputer yang memiliki cukup pengalaman untuk menulis kode C tanpa membuat kesalahan. ANSI C bukanlah hal pertama yang dipelajari orang hari ini.
Sekarang semua siswa ilmu komputer akan membunuhku.
sumber
Anda sepenuhnya gagal meyakinkan kami bahwa ANSI C tidak memadai. C adalah bahasa yang sangat baik yang tampaknya disesuaikan untuk jenis tugas yang telah Anda jelaskan. Dengan deskripsi singkat tentang tugas (kecuali persyaratan bahasa), saya juga akan merekomendasikan C (atau mungkin pergi).
Saya pikir masalahnya adalah Anda memprogram dalam C dengan pikiran Anda berpikir dalam C #. Saya memiliki masalah yang sama ketika saya beralih dari Perl ke C atau java. Anda harus belajar beradaptasi dengan bahasa tersebut, dan tidak belajar menerjemahkan dari cara berpikir Anda ke bahasa saat itu.
Masalahnya bukan bos Anda atau bahasa C, masalahnya adalah untuk membuka pikiran Anda terhadap berbagai cara berpikir. Mengubah bahasa pemrograman adalah sesuatu yang akan menguntungkan Anda.
sumber
Pertama, Anda harus memberi tahu atasan Anda bahwa itu dalam bahasa yang berbeda, sekarang. Dia akan (dimengerti) marah jika Anda membawa kembali sesuatu dengan sengaja terhadap persyaratan tanpa pemberitahuan.
Sekarang, cara terbaik untuk menjelaskan hal-hal ini kepada bos / manajer adalah dengan memasukkannya dalam hal waktu dan uang. Perkirakan berapa banyak waktu yang dibutuhkan proyek semacam itu dalam ANSI C, dan kemudian perkirakan berapa banyak waktu yang dibutuhkan untuk sesuatu yang lebih tinggi seperti C #. Catatan saya katakan level lebih tinggi, bukan modern. Ini dapat membantu merapikan semuanya juga. Maksud saya, Anda tidak akan menangani melukis kamar hanya dengan kuas cat kecil, Anda akan menggunakan rol dan hal-hal lain yang membuat setiap langkah (garis kode) mencakup lebih banyak area proyek. Juga, jika Anda atau salah satu anggota tim Anda tidak tahu C, atau nyaman membuat proyek besar di C, ini memakan masalah waktu bahkan lebih karena mereka harus bangun dengan kecepatan.
Sepertinya bos Anda sedang mencoba mengelola mikro. Saya yakin salah satu jawaban lain akan mencoba menjelaskan bagaimana membuat atasan Anda melakukan itu lebih sedikit
sumber
Keengganan atasan untuk ADT ditujukan di tempat lain, seperti dev yang tampaknya tidak mengetahui biaya GC, jadi saya akan fokus pada "utas".
Mungkin alih-alih berpikir dalam kaitannya dengan threading .NET (atau JVM, jika diindoktrinasi), yang mungkin Anda inginkan adalah beberapa proses, menggunakan beberapa mekanisme komunikasi antar proses (IPC) untuk berkomunikasi di antara mereka. Misalnya - pesan windows, memori bersama, buffer file yang dipetakan memori, bernama pipe, apa pun. Dedikasikan proses kecil untuk berinteraksi dengan perangkat atau aspek perangkat dan memeriksa IPC untuk mengomunikasikan pembaruan dan mengakui permintaan, dan memiliki proses yang agak lebih besar untuk mempertahankan GUI dan berkomunikasi dengan "monitor" peralatan menggunakan IPC apa pun yang Anda pilih.
sumber