Saya berada di posisi sebaliknya karena telah menghabiskan sebagian besar 9 tahun terakhir sebagai programmer C, dan baru-baru ini mengerjakan beberapa Ruby di Rails front-end.
Barang-barang yang saya kerjakan di C sebagian besar adalah sistem kustom berukuran sedang untuk mengendalikan gudang otomatis (biaya khas beberapa ratus ribu pound, hingga beberapa juta). Contoh fungsionalitas adalah basis data dalam memori khusus, yang terhubung ke permesinan dengan beberapa persyaratan waktu respons pendek dan manajemen aliran kerja gudang yang lebih tinggi.
Saya bisa katakan pertama-tama, kami tidak melakukan TDD. Saya sudah mencoba beberapa kali memperkenalkan unit test, tetapi di C lebih banyak masalah daripada nilainya - setidaknya ketika mengembangkan perangkat lunak khusus. Tapi saya akan mengatakan TDD jauh lebih dibutuhkan di C daripada Ruby. Terutama, itu hanya karena C dikompilasi, dan jika dikompilasi tanpa peringatan, Anda telah melakukan sejumlah pengujian yang serupa dengan tes perancah rspec yang dibuat secara otomatis di Rails. Ruby tanpa tes unit tidak layak.
Tetapi apa yang akan saya katakan adalah bahwa C tidak harus sekeras beberapa orang membuatnya. Banyak dari pustaka standar C merupakan kekacauan dari nama fungsi yang tidak dapat dipahami dan banyak program C mengikuti konvensi ini. Saya senang mengatakan bahwa kami tidak, dan sebenarnya memiliki banyak pembungkus untuk fungsionalitas perpustakaan standar (ST_Copy bukan strncpy, ST_PatternMatch alih-alih regcomp / regexec, CHARSET_Convert alih-alih iconv_open / iconv / iconv_close dan sebagainya). Kode C in-house kami lebih baik bagi saya daripada kebanyakan hal lain yang pernah saya baca.
Tetapi ketika Anda mengatakan aturan dari bahasa tingkat tinggi lainnya tampaknya tidak berlaku, saya tidak akan setuju. Banyak kode C baik 'terasa' berorientasi objek. Anda sering melihat pola inisialisasi pegangan ke sumber daya, memanggil beberapa fungsi melewati pegangan sebagai argumen, dan akhirnya melepaskan sumber daya. Memang, prinsip-prinsip desain pemrograman berorientasi objek sebagian besar berasal dari hal-hal baik yang dilakukan orang dalam bahasa prosedural.
Saat-saat ketika C menjadi sangat rumit sering kali ketika melakukan hal-hal seperti driver perangkat dan kernel OS yang pada dasarnya tingkat sangat rendah. Saat Anda menulis sistem level yang lebih tinggi, Anda juga dapat menggunakan fitur level C yang lebih tinggi dan menghindari kompleksitas level rendah.
Satu hal yang sangat menarik yang mungkin ingin Anda lihat adalah kode sumber C untuk Ruby. Dalam dokumen Ruby API (http://www.ruby-doc.org/core-1.9.3/), Anda dapat mengklik dan melihat kode sumber untuk berbagai metode. Yang menarik adalah kode ini terlihat cukup bagus dan elegan - tidak terlihat serumit yang Anda bayangkan.