Apakah ada cara yang disarankan untuk mengkomunikasikan pemrograman ilmiah / teknik ke pengembang C?

16

Saya memiliki banyak kode MATLAB yang perlu porting ke C (kecepatan eksekusi sangat penting untuk pekerjaan ini) sebagai bagian dari proses back-end untuk aplikasi web. Ketika saya mencoba untuk melakukan outsourcing kode ini ke pengembang C, saya berasumsi (perbaiki saya jika saya salah) beberapa pengembang C juga memahami kode MATLAB (hal-hal seperti pengindeksan dan manajemen memori berbeda, dll.). Saya bertanya-tanya apakah ada pengembang C di luar sana yang dapat merekomendasikan prosedur untuk saya ikuti untuk mengkomunikasikan dengan baik apa yang kode lakukan?

Sebagai contoh, haruskah saya memberikan kode MATLAB dan menjelaskan apa yang dilakukannya baris demi baris? Atau, haruskah saya memberikan matematika / algoritme, menjelaskannya dalam bahasa Inggris, dan membiarkan pengembang C mengimplementasikannya dengan pemahaman ini dengan caranya sendiri (mis. Bisakah saya menganggap pengembang memahami cara bekerja dengan matematika yang rumit (yaitu imajiner angka), bagaimana cara menghasilkan histogram, melakukan FFT, dll)?

Atau, adakah metode yang lebih baik? Saya berharap saya bukan orang pertama yang perlu melakukan ini, jadi saya ingin tahu apakah ada pengembang C di luar sana yang menghadapi situasi ini dan dapat berbagi kebijaksanaan konvensional bagaimana mereka ingin tugas ini ditransfer?

Terima kasih sebelumnya atas komentar Anda.

gkdsp
sumber
3
apakah Anda sudah mencoba menggunakan mcc untuk mengonversi kode matlab ke c? Saya pikir inimcc -c matlabfile.m
Will Tate
4
Ketika Anda menyewa programmer, tentukan bahwa ia harus memahami kode C dan Matlab. Mengingat penekanan Anda pada kecepatan, Anda mungkin harus menggunakan C ++ alih-alih C (dengan hati-hati, itu tidak pernah lebih lambat, dan seringkali lebih cepat).
Jerry Coffin
3
@willytate: Ini mengharuskan Anda memiliki kompiler Matlab, tidak menghasilkan kode yang sangat efisien, dan ada beberapa batasan pada kode apa yang dapat Anda kompilasi.
Jonas
3
Jika Anda melakukan pemrograman berorientasi objek dalam C, Anda tidak hanya kehilangan kesempatan untuk membuat kompiler melakukan pemeriksaan keamanan tipe tambahan, Anda juga membuat kompiler memiliki peluang untuk melakukan beberapa jenis optimasi yang tidak dapat diekspresikan dengan mudah di C. Juga, menggunakan C ++ meningkatkan kemungkinan Anda dapat menggunakan fungsionalitas dari pustaka yang ditulis oleh seseorang yang lebih pintar daripada Anda.
3
Apakah sebagian besar waktu dihabiskan dalam algoritma aktual, atau mengutak-atik file, IO, dan parsing? Coder C rata-rata tidak akan mampu menulis FFT dan kode matriks yang mendekati bersaing dengan implementasi MATLAB. Jika parsing, IO, dan file fiddling adalah tempat program Anda menghabiskan waktunya, maka programmer C Anda harus fokus pada hal itu, dan menulis kode lem yang memanggil fungsi dari perpustakaan MATLAB. Jika pemecahan FFT / matriks dekomposisi / ODE adalah hambatan, maka Anda harus menemukan seorang programmer C dengan BANYAK pengalaman metode numerik.
Charles E. Grant

Jawaban:

15

Saya berada dalam situasi yang sama seperti Anda dalam hal saya juga memiliki orang-orang port kode Matlab saya ke C ++.

Banyak hal tergantung pada kerumitan kode Anda, serta tingkat keterampilan pengembang C / C ++ dan pada pemahaman mereka tentang apa yang seharusnya mereka terapkan - semakin baik mereka dan semakin baik mereka memahami masalah Anda, semakin banyak secara mandiri mereka dapat bekerja.

Karena terjemahan langsung kode Matlab ke C / C ++ mungkin bukan cara yang paling efisien untuk menangani masalah, saya sarankan Anda berkomunikasi dengan baik apa inputnya, apa yang harus dilakukan kode, dan apa yang seharusnya dikembalikan sebagai output. Anda juga harus menyediakan cara untuk menguji kode untuk memastikan kode itu berfungsi dengan benar - baik sebagai bantuan untuk debugging maupun menyediakan sarana untuk kontrol kualitas. Selain itu, Anda harus memberikan dan menjelaskan kode Matlab sebagai pedoman kasar tentang bagaimana hasil dapat dicapai.

Anda harus dapat mengasumsikan bahwa pengembang tahu bagaimana menyusun program dan bagaimana menggunakan alat debugging. Namun, Anda mungkin tidak dapat mengasumsikan bahwa pengembang tahu bagaimana memiliki pengetahuan khusus dalam, katakanlah statistik, atau optimasi (matematis). Dengan demikian, men-debug bagian-bagian ini akan jauh lebih cepat dengan input Anda.

Mungkin membantu untuk menjadwalkan pertemuan rutin dengan pengembang, sehingga "hal-hal kecil" yang mungkin terasa agak aneh bagi pengembang, tetapi itu akan menandakan masalah penting agar Anda dapat dikomunikasikan sebelum mereka berkembang menjadi masalah besar.

Jonas
sumber
+1 karena memiliki hasil pengujian yang valid untuk perangkat lunak. Kode porting dari Matlab ke C / C ++ cukup sulit tanpa mengetahui seperti apa hasilnya.
rjzii
12

Saya tidak mengatakan ini berlaku untuk Anda, tetapi: Kebanyakan orang yang hanya kode di MATLAB menulis kode yang buruk. Sangat buruk, dengan format, struktur, dan dokumentasi yang buruk.

Ketika hal ini terjadi, satu-satunya cara mudah untuk menggunakan kode MATLAB adalah menjalankannya untuk memverifikasi hasil dari kode porting. Mencoba merekayasa balik kode MATLAB tanpa dokumentasi tambahan adalah sesuatu yang hanya boleh dilakukan jika pembuat asli kode MATLAB benar-benar mati atau koma. Di sisi lain, makalah matematika yang ditulis dengan baik pada suatu algoritma biasanya jauh lebih membantu daripada implementasi mahasiswa pascasarjana sendiri.

Untuk mempermudah orang yang mengirim kode Anda:

  1. Perbaiki kode Anda untuk memastikan bahwa operasi dipecah menjadi fungsi yang berbeda. Gaya satu-fungsi-per-file MATLAB mendorong fungsi menjadi terlalu panjang dan mencakup terlalu banyak operasi. Juga pastikan bahwa kode yang digandakan ditarik ke fungsi pembantu, bahkan jika ini menghasilkan lebih banyak file daripada yang biasanya ingin Anda gunakan untuk proyek MATLAB.

  2. Jelaskan angka ajaib atau konstanta yang digunakan dalam kode Anda, dan kondisi di mana mereka valid.

  3. Dokumentasikan struktur data kode Anda. Gaya "semuanya adalah matriks" MATLAB sangat berbeda dari kebanyakan bahasa, dan itu sering berarti bahwa struktur data Anda didefinisikan secara implisit oleh cara Anda menggunakan matriks. Pemrogram AC perlu mengetahui cara mengatur berbagai struktur dan mengalokasikan array yang diperlukan, jadi pastikan sudah jelas apa arti dan struktur internal variabel Anda.

  4. Dokumentasikan algoritma yang digunakan oleh kode Anda. Secara khusus, pastikan bahwa sudah jelas apa yang terjadi ketika Anda menggunakan fungsi dan operator seluruh array yang rumit, dan pastikan bahwa programmer C memiliki akses ke referensi tentang algoritma yang digunakan oleh fungsi toolbox atau fungsi pustaka standar yang lebih rumit daripada Fungsi BLAS.

  5. Dokumentasikan apa pun yang telah Anda lakukan untuk membuat kode tersebut kuat, seperti validasi input dan penanganan kesalahan. Cara Anda menerapkannya mungkin sangat berbeda dari yang harus dilakukan dalam C. Akademisi menulis kode MATLAB jarang repot untuk belajar tentang hal-hal seperti penanganan pengecualian. Jika Anda belum melakukan apa pun untuk membuat kode Anda kuat, maka setidaknya dokumentasikan apa yang dapat dilakukan tentang input yang tidak valid atau cacat atau sebagian data.

  6. Pastikan orang yang mem-porting kode dapat membandingkan keluaran dengan kode MATLAB asli, dan jika memungkinkan, berikan rangkaian uji input dan keluaran yang benar.

  7. Jika orang yang melakukan porting tidak mengetahui analisis numerik, Anda perlu mengawasi proses porting dan memastikan bahwa Anda meninjau dan memahami kode C. Ini akan sangat mendidik bagi Anda berdua.

pengguna23748
sumber
Saya setuju dengan penilaian teknis Anda dan Anda membuat poin bagus (1 - 7), tapi saya pikir ad hominem di atas tentang "kebanyakan orang yang hanya kode di MATLAB" tidak perlu dan tidak benar.
5
Berdasarkan pengalaman saya, sebagian besar orang yang menggunakan MATLAB sebagai satu-satunya bahasa pemrograman mereka adalah orang matematika terapan, untuk siapa pemrograman umumnya tidak lebih dari sarana untuk mencapai tujuan. Mereka tidak memiliki insentif untuk peduli dengan praktik pemrograman, dan mereka hanya peduli tentang menulis kode yang benar, bukan kode yang baik atau indah. Ketika mereka membagikan kode mereka, itu biasanya dimaksudkan untuk digunakan, tetapi tidak membaca - selalu ada kertas untuk melakukan pekerjaan menjelaskan kode. Jika Anda menganggap ini ofensif (dan tidak seharusnya demikian), maka Anda kehilangan perspektif orang-orang yang tidak peduli.
4
Dalam pengalaman saya, kode yang buruk terutama ditulis oleh orang yang menulis kode sekali pakai, yaitu kode yang akan digunakan (dibaca) oleh satu orang untuk satu masalah. Bahasa pemrograman tidak masalah. Dan bagi saya sebagai orang yang sebagian besar pemrograman di Matlab, ad hominem memang dianggap ofensif.
Jonas
Sebagai EE saya terutama diharapkan untuk menulis MATLAB, dan saya setuju dengan Anda. Ini mendorong gaya pengkodean yang sangat mengerikan tanpa pelingkupan, penentuan nama, pengorganisasian ke dalam struktur data, atau penamaan variabel yang baik. Setelah vektorisasi dipahami, orang tidak perlu repot-repot mengomentari keajaiban satu-garis-pintar yang dihasilkan. Hanya tumpukan sampah raksasa dengan kode jelek dan tidak efisien.
Milind R
4

Bahasa pemrograman lebih mudah dibaca daripada menulis. Kebanyakan programmer C dengan sedikit pengalaman harus dapat membaca kode Matlab Anda baik-baik saja dengan akses ke referensi, dan terutama dengan akses ke programmer Matlab untuk menjawab pertanyaan mereka. Kode apa pun jauh lebih tidak ambigu daripada sebagian besar persyaratan yang harus kami selesaikan.

Jika mereka memiliki gelar sarjana dalam ilmu komputer atau teknik komputer, mereka kemungkinan akan mengambil kalkulus, trigonometri, dan aljabar linier, tetapi mungkin berkarat. Kecuali mereka melakukan banyak pemrograman sains / matematika, kebanyakan programmer C akan tahu apa itu FFT, tetapi jarang atau tidak pernah harus melakukannya. Kandidat ideal Anda akan memiliki semua yang segar dalam pikirannya, tetapi siapa pun dengan gelar harus mampu menangani matematika dengan beberapa studi penyegaran. Dalam kedua kasus, Anda menginginkan seseorang yang menekankan menemukan perpustakaan yang ada untuk operasi umum seperti itu bila memungkinkan daripada menggulir perpustakaan mereka sendiri.

Bakat untuk dapat mengoptimalkan waktu eksekusi algoritma sangat bervariasi bahkan di antara programmer berpengalaman. Saya akan merekomendasikan Anda memiliki masalah wawancara untuk menemukan itu. Tunjukkan kepada kandidat algoritma yang sederhana namun tidak efisien dan tanyakan kepada mereka apa fungsinya. Lihat apakah mereka memunculkan inefisiensi sendiri. Tanyakan kepada mereka apa kompleksitas asimptotik itu dan apa yang seharusnya. Tanyakan kepada mereka bagaimana mereka akan menulis ulang untuk meningkatkan efisiensi.

Karl Bielefeldt
sumber
3

Alasan keuangan untuk tidak menggunakan kompiler matlab dapat dimengerti. Namun, Anda dapat menggunakan pengubah scilab ke C gratis. Prosedurnya adalah

  • Ubah kode Anda dari Matlab ke Scilab dengan alat M2SCI ,
  • Ubah kode Scilab ke C menggunakan "Scilab 2 C" ,
  • Uji silang kode,
  • Gunakan profiler untuk mencari kemacetan yang membutuhkan mata manusia.

Idealnya tidak ada pengetahuan tentang Scilab yang diperlukan dalam proses dan cukup mudah untuk mengambil waktu untuk mencoba solusi ini (dalam praktiknya, itu mungkin tidak sesederhana ...)

Catatan: Saya tidak mencoba ini tetapi ini adalah solusi yang saya bayangkan untuk alasan yang sama.

Clement J.
sumber
2

Kembangkan set pengujian yang baik yang dapat Anda jalankan melalui kedua aplikasi dan kemudian lihat metriknya.

Ini akan sangat membantu pengembang Anda menguji kode mereka, dan memastikan bahwa kualitasnya pada tingkat yang masuk akal.


sumber
2

Pos luar biasa oleh Jonas, terutama untuk menyediakan cara menguji kode. Berikut beberapa saran tambahan:

  • Kode Berbagi Pertimbangkan untuk menyediakan sumber MATLAB tetapi bersiaplah untuk menjelaskan strukturnya atau detail lainnya (dari sintaksis ke gaya pribadi Anda). Pengembang C diharapkan akan mengenali konsep, algoritma, dan matematika tingkat tinggi ( dan mudah-mudahan Anda mengomentari kode Anda ).

  • Dokumentasi. Sangat penting bagi Anda untuk memiliki dokumentasi yang jelas yang mendefinisikan proyek; setelah semua, jika orang tersebut tidak lancar dalam MATLAB, kode tersebut mungkin bukan referensi yang sangat berguna.

  • Latihan Keterampilan Orang. Ini mungkin jelas namun ada baiknya untuk diingat ketika berkolaborasi, terutama pada tingkat mikro semacam ini. Jadi Anda harus mencoba untuk menghapus sebanyak mungkin ambiguitas dari kode / dokumentasi Anda. Bergantung pada tingkat kepemimpinan Anda dalam proyek, Anda mungkin menemukan bahwa Anda mencapai keseimbangan antara membimbing pengembangan dan membiarkan orang tersebut memberikan kontribusi pribadi mereka sendiri.

gary
sumber
1

Kecuali jika coders C Anda menggunakan libs yang tepat, Matlab jauh lebih baik dalam hal-hal sepele seperti membalikkan sebuah matriks. Implan C naif. tidak cukup stabil. Menyewa coders C akan mahal. Saya akan mencoba porting kode Matlab ke scipy dan membandingkan kecepatan, mencoba menggunakan kompiler c Matlab, atau ... hanya melemparkan lebih banyak perangkat keras di dalamnya - itu bisa jauh lebih murah dan lebih sederhana dan lebih aman dan lebih cepat dan lebih cepat.

Pekerjaan
sumber