Kodlama süresini hızlandırmak için genel programlama teknikleri


20

C ++ ile kodlamak zorunda olduğumuz bir programlama yarışmasına hazırlanıyorum ve kısa sürede çalışma kodu üretmekle ilgili. Bir örnek, en az iki int elde etmek için bir makro kullanmak veya dizileri başlatmak için memset kullanmaktır (ancak burada ikisini de kullanmamanız gerektiği söylendi ).

Bu, gerçek bir işte kullanmak için ne tür kodlama tekniklerinin var olduğu sorusuna yol açar?


26
Bir kodlama yarışmasında kullandığınız tekniklerin gerçek bir işte kullanacağınız tekniklerle bir ilgisi olmayacağını tahmin ediyorum.
Doug T.

1
Gerçek bir işte teknik istemiyordum, kodlama yarışmasında teknikler istiyordum.
marktani

1
@DougT. Kabul ediyorum, kodlama yarışması için püf noktaları konuyla ilgili değil, aynı zamanda bir çalışma ortamında üretkenlik ve maymun koduna harcanan zamanı en iyi nasıl azaltabileceğinizi de düşünüyorum
James

1
Neden dinamik dizileri icat etmek için memset kullanmıyorsunuz?
James

3
C ++ kullanmayın. Mümkün olan en üst düzey dili kullanın.
Kevin

Yanıtlar:


52

Hızlı çalışma kodu üretmenin yolu ... yavaşlamaktır. Çok küçük adımlar atın. Her adımın ne için olduğunu bildiğinizden emin olun. Her adımdan sonra kodunuzun derlendiğinden ve çalıştığından emin olun.

En iyisi, Test Odaklı Geliştirme kullanın. Başarısız bir test yazın. Testi geçmek için yeterli kodu yazın. Tüm testleri geçtiğinden emin olarak kodu temiz hale getirmek için refactor. Tekrar et.

Bunu yapmazsanız, çalışmayan büyük bir kod yığını yazmak çok kolaydır. O zaman neden işe yaramadığını anlamanız çok uzun zaman alacaktır .


21
Ciddi misin? Programlama yarışması için TDD?
Codism

1
@Codism: sorular, normal yazılım geliştirmeye uygulanabilir teknikleri içerecek şekilde genişletildi.
Dima

2
TDD kesinlikle kodumu daha iyi hale getirmemize yardımcı oluyor, ancak kodu daha hızlı yazmama yardımcı olmadı. Etkileşimli bir programlama ortamı (örn. Groovy konsolu, Lisp REPL, vb.) Benim deneyimimdeki en büyük zaman tasarrufu oldu.
erturne

3
TDD için -1. Proje kısa bir hackathon değil, uzun vadeli ise bu mantıklıdır.
TheLQ

1
@TheLQ Bir hata ayıklayıcı kullanarak tüm zamanınızı harcamak yerine TDD'nin kötü bir öneri olduğu anlamına gelmez.
byxor

29

Standart kütüphaneleri, özellikle STL algoritmalarını yoğun bir şekilde gözden geçirin. Bu size birçok kod satırı ve zaman kazandırır. Kazanan programlama yarışmalarının anahtarı mümkün olduğunca yüksek seviyede programlama yapmaktır. C ++ 'da, harici kitaplıklar olmadan, döngüler yerine STL çağrıları anlamına gelir.


+1 - Buna tamamen katılıyorum. STL'de hızlı bir şekilde kod yazmayı bilmek bu tür yarışmalarda çok büyük.
Jordan Parmer

23

ACM yarışmalarına düzenli olarak katılıyorum, umarım bu ipuçlarından bazıları size yardımcı olacaktır:

  • Başkalarının dediği gibi dilin yakından tanımak C ++ özellikle STL, bu kullanımda istemezsiniz hem ortak işlevlere sahiptir, (binary_search, min, maks) ve sağlam veri yapıları düz özyineleme kadar önlemek için size zaman (grubunu kaydetmek için , BFS sırası, hatta bu şekilde isterseniz Dijkstra için öncelik_kipi).

  • Matematiksel, dinamik programlama, grafik teorisi vb. İse sorunun kategorisini belirleyin. Kendinize sorun: Bu tür bir soruna ne kadar aşinasınız? Bunu yaptıktan sonra, bunları çözeceğiniz sıra ile ilgili karar vermelisiniz , ki bu bir sonraki nokta ile el ele gidiyor ...

  • Yazmadan önce problemi tam olarak anlamak, doğru problemi çözmek istiyorsunuz , ilk yarışmalarda yazmazsam zamanımı boşa harcadığımı düşündüm; Daha sonra bunun bir hata olduğunu gördüm.

  • Yorumların zaman kaybı olduğunu düşünmeyin, en azından "akıllı" kodda, neyin yanlış gittiğini (gerçek bir zaman kaybıdır), değer netliğini görmek için satır satır hata ayıklamak istemezsiniz .

  • İyi eğlenceler .


6
Yazmadan önce sorunu tamamen anlamak için +1. Aksi takdirde, takımın zamanını boşa harcıyorsunuz (ACM yarışması bir bilgisayar 3 kişidir)
Codism

Güzel cevap. :)
Jared Farrish

13

Bana öyle geliyor ki, sadece C ++ biliyorsunuz, C ++ değil. Bu sorular, dil hakkında temel çalışma bilgisine sahip biri tarafından kolayca cevaplanabilir.

Bir örnek, en az iki int elde etmek için bir makro kullanmak olabilir

Sadece bir işlev mi kullanıyorsunuz? std::minzaten var.

veya dizileri başlatmak için memset kullanma

std::array<T, N> zaten içeriğini başlatır.

gerçek bir işte kullanmak için ne tür kodlama teknikleri vardır?

İlk adım kullandığınız dili bilmektir.


Kullandığım dili öğrenmeye çalışıyorum, bu yüzden bu soruyu sordum! Bu konudaki bilgiler için teşekkürler .
marktani

7
Ah. O zaman sorunuzu yanlış anlamış olmalıyım. Bir kitap tavsiye ederim . C çöpünü öğretenlerin yerine sadece okumaya değer kitapları sunuyoruz.
DeadMG

10

Dili bilmenin yanı sıra, araçlarınızı, özellikle de düzenleyicinizi de bilin. Profesyonel olarak 15 yılı aşkın bir süredir kodlama yaptım, aksi takdirde büyük programcıların yavaşladığını gördüm çünkü kullandıkları tek editör komutları imleç tuşları ve crtl-x / c / v ..

Düzenleyiciniz bir satırı silmek için tek bir tuşa basmayı destekliyor mu? Bir satırı yeniden girintilemek için? İşlevler / yöntemler arasında geçiş yap? seç / yapıştır engelle? yer imleri? Sözle mi taşınıyor? Editör otomatik olarak sınıflar / yöntemler / işlevler oluşturabilir mi? Önceden oluşturabileceğiniz şablonları destekliyor mu? Hızlı yeniden düzenleme? Makro kaydı?

Editörünüzü bilmek, geliştirme süresini büyük ölçüde hızlandırabilir.


1
Amin. Sadece çok hızlı olan ve vim kullanan yeni biriyle çalışıyorum. Onun için işe yarıyor çünkü nasıl kullanılacağını öğrenmek için zaman ayırdı.
gbjbaanb

Ayrıca ... düzenleyiciniz burada listelenen hemen hemen her özelliği desteklemiyorsa - daha iyi bir düzenleyici bulun.
Abhi Beckert

Google dokümanlarında röportaj ... bu nedenle en kötü deneyim.
UmNyobe

6

Harekete geçmeden önce düşün. Bir sınıf uygulaması yazmadan önce düşünmek ve planlamak üç başarısız olandan daha iyidir. Ayrıca, hareket ederken düşünün - küçük adımlarla bir şeyler yapmak geliştirme sürecini büyük ölçüde basitleştirir.

Şu anda yalnızca ihtiyacınız olan kodu yazın. Yani, “ Daha sonra bu işlevlere ihtiyacım olacak, böylece ben de prototiplerini yazarken de yazabilirim ” gibi bir zihniyetle kod yazmaya başlamayın . İşler değişir, planlar değişir. Sonunda bile kullanılamayacak bir kod elde edersiniz. Zaman kaybı.

Ne yaptığınızı bilin. Dilin ve / veya kütüphanenin temel işlevlerinin ve özelliklerinin nasıl çalıştığını hatırlamaya çalışmaktan daha kötü bir şey yoktur. Kullandığınız araçlara aşina olun.


YAGNI için +1 .
Brendan Uzun

4

Zaten birçok cevap var, yine de fikrimi eklemek istiyorum.

Senin kodlama hızlandırmak için, dokunmatik daktilo ol yazarken sen mantık ve kod üzerinde hem konsantre edebiliyoruz böyle bir hıza. Yazmayı öğrenmek için birçok yazılım vardır (Typing Master, Hızlı Yazma, KTouch, gTypist), bunları kullanın

Hala iki parmaklı daktilo olan birçok deneyimli programcı gördüm. Bu, hiçbir belge olmadan kötü kod ve makrolar ve kısaltılmış tip adları ile gerçekten şifreli kod yol açar.


İşaret parmağı ile indirildi :)
mlvljr

Mükemmel cevap. Ekran yerine klavyeye bakanların farkına varmadan ve geri gitmeden önce genellikle çöp yazdıklarını ekleyeceğim. Yoksa yanlış pencereye yazarlar. Üzücü olan şey, bunun onları ne kadar yavaşlattığının farkında değiller.
Dave Markle

2

Yazılım geliştirme, klasik 80-20 etkinliklerden biridir - yani işin ilk% 80'inin% 20'sini ve işin son% 20'sinin zamanın% 80'ini aldığı yer.

Bu nedenle, genel olarak işinizi hızlandırmanın anahtarı, çabanın% 20'sini karşılayan performansınızı artırmak için çalışmaktır. Bu genellikle hata ayıklama aşamaları ve her şeyi birbirine bağlama ve kullanılabilir hale getirme işidir.

Erken aşamalarda daha fazla özen göstererek bunu geliştirebilirsiniz. Bir projenin başlangıcındaki planlama ve tasarım çalışmaları, hardcore programlamaya dalmak istediğinizde zaman kaybı gibi görünebilir, ancak daha sonra çok zaman kazanabilirler.

İnsanlar TDD veya BDD gibi belirli metodolojiler hakkında konuşacaklar. Bunlar harika, ancak şimdi yapmıyorsanız, uyum sağlamanız biraz zaman alacaktır, bu yüzden muhtemelen bir programlama yarışması için başlamak istediğiniz bir şey değildir. Ama dalmadan ve yapmadan önce ne yaptığınızı planlamayı bırakmak, ne olursa olsun ödülleri toplar. Ve yine de TDD ve BDD'ye doğru ilk adımlar. Bu, başlamak istediğiniz yerdir.


-2

Gerçek bir programlama yarışması içinse, C ++ kullanmayın. Hızlı, etkileşimli, RAD komut dosyası dili kullanın. Bu, VB6'nın kesinlikle egemen olduğu bir şey. Önceden yazdığınız kütüphanelerle önceden donanın. Dize bölme, dizi ters çevirme, arama, sıralama, temel grafikler, konsol kontrolü.

Eğer iş içinse, tam tersini yapın. Orada ne olduğunu öğrenin, sağlam bir dil kullanın (C ++ iyidir), her şeyi yorumlayın vb. İki tür ortam birbirinden daha uzak olamazdı.


3
Ben downvoters biri değildi, ama sanırım onlar -1 -1 sanırım çünkü soru C ++ daha hızlı programlama hakkındaydı .
Gordon Gustafson

9
VB6? Ciddi anlamda? Geçmişten misin?
Konamiman

2
@Konamiman: heh, evet öyleyim. "C ++ 'da bir programlama yarışması için hazırlıyorum" veya "C ++ programlama yarışması için hazırlıyorum" anlamına gelip gelmediğini söyleyemedim. Oh, cipsler olabilecekleri yerde yatıyor. Yine de, hiçbir şey tam anlamıyla her saniyenin önemli olduğu programlama yarışmaları için çok hızlı bir RAD ortamını aşamaz.
Bryan Boettcher

Soruyu açıklığa kavuşturmak için düzenledim.
marktani

RAD'de: Delphi 6 muhtemelen en iyi bahis olacaktır.
mlvljr
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.