Ogólne techniki programowania w celu przyspieszenia czasu kodowania

20

Przygotowuję się do konkursu programistycznego, w którym musimy napisać kod w C ++, a wszystko polega na tworzeniu działającego kodu w krótkim czasie. Przykładem może być użycie makra w celu uzyskania minimum dwóch liczb wewnętrznych lub użycie zestawów pamięci do zainicjowania tablic (ale powiedziano mi, że nie należy używać tutaj ).

Prowadzi to do pytania, jakie techniki kodowania istnieją w prawdziwej pracy?

marktani
źródło
26
Sądzę, że techniki stosowane w konkursie programistycznym mogą nie mieć nic wspólnego z technikami, których używałbyś w prawdziwej pracy.
Doug T.
1
Nie prosiłem o techniki w prawdziwej pracy, prosiłem o techniki w konkursie kodowania.
marktani
1
@DougT. Zgadzam się, sztuczki w konkursie kodowania nie są na temat, ale myślę też, że możesz rozwinąć się, aby porozmawiać o wydajności w środowisku pracy i jak najlepiej skrócić czas poświęcony na kodowanie małp
James
1
Dlaczego nie należy używać zestawów zadań do inicjowania tablic dynamicznych?
James
3
Nie używaj c ++. Używaj języka najwyższego poziomu, jaki możesz.
Kevin

Odpowiedzi:

52

Szybkim sposobem na wytworzenie działającego kodu jest ... spowolnienie. Rób bardzo małe kroki. Upewnij się, że wiesz, do czego służy każdy krok. Upewnij się, że po każdym kroku kod się kompiluje i uruchamia.

A co najlepsze, skorzystaj z programowania opartego na testach. Napisz test negatywny. Napisz tylko tyle kodu, aby pomyślnie przejść test. Przeprowadź refaktoryzację w celu wyczyszczenia kodu, upewniając się, że nadal przechodzi wszystkie testy. Powtarzać.

Jeśli tego nie zrobisz, bardzo łatwo jest napisać duży stos kodu, który nie działa. Wtedy zajmie ci bardzo dużo czasu, aby dowiedzieć się, dlaczego to nie działa.

Dima
źródło
21
Mówisz poważnie? TDD do konkursu programistycznego?
Codism
1
@Codism: pytania zostały rozszerzone o techniki mające zastosowanie do normalnego tworzenia oprogramowania.
Dima
2
TDD zdecydowanie pomaga ulepszyć mój kod, ale nigdy nie pomógł mi napisać kodu szybciej. Interaktywne środowisko programistyczne (np. Konsola Groovy, Lisp REPL itp.) Było moim największym oszczędzaniem czasu.
erturne
3
-1 dla TDD. Ma to sens, jeśli projekt jest długoterminowy, a nie krótki hackaton.
TheLQ
1
@TheLQ To, że wolisz spędzać cały czas przy użyciu debuggera, nie oznacza, że ​​TDD jest złą sugestią.
byxor,
29

Dokładnie przejrzyj standardowe biblioteki, szczególnie algorytmy STL. Pozwoli ci to zaoszczędzić wiele linii kodu i dużo czasu. Kluczem do wygranych konkursów programistycznych jest programowanie na jak najwyższym poziomie. W C ++, bez bibliotek zewnętrznych, oznacza to wywołania STL zamiast pętli.

Kevin Cline
źródło
+1 - całkowicie się z tym zgadzam. Umiejętność szybkiego pisania kodu w języku STL jest ogromna w tego rodzaju konkursach.
Jordan Parmer,
23

Regularnie uczestniczę w konkursach ACM, mam nadzieję, że niektóre z tych wskazówek pomogą ci:

  • Jak powiedzieli inni, zapoznaj się z językiem , w C ++, zwłaszcza w STL, ma on zarówno typowe funkcje, których chcesz używać (wyszukiwanie binarne, min, maks.), Jak i solidne struktury danych, aby zaoszczędzić czas (stos, aby uniknąć rekurencji w górę , kolejka do BFS, nawet priorytet_kolejka dla Dijkstry, jeśli ci się to podoba).

  • Określ kategorię problemu, jeśli jest to matematyka, programowanie dynamiczne, teoria grafów itp. Zadaj sobie pytanie: czy znasz ten rodzaj problemu? Po wykonaniu tej czynności powinieneś podjąć decyzję dotyczącą kolejności ich rozwiązywania , która idzie w parze z następnym punktem ...

  • Chcesz całkowicie zrozumieć problem przed pisaniem na klawiaturze, rozwiązać właściwy problem , w moich pierwszych konkursach myślałem, że jeśli nie piszę, tracę czas; Później odkryłem, że to był błąd.

  • Nie myśl, że komentarze są stratą czasu, przynajmniej w „sprytnym” kodzie, nie chcesz debugować wiersz po wierszu, aby zobaczyć, co poszło nie tak (to jest prawdziwa strata czasu), jasność wartości .

  • Mają zabawy .

lccarrasco
źródło
6
+1 za pełne zrozumienie problemu przed wpisaniem. W przeciwnym razie marnujesz czas zespołu (konkurs ACM to 3 osoby na jeden komputer)
Codism
Niezła odpowiedź. :)
Jared Farrish,
13

Cóż, wydaje mi się, że znasz tylko C, a nie C ++. Odpowiedzi na te pytania z łatwością udziela osoba z podstawową znajomością języka.

Przykładem może być użycie makra, aby uzyskać minimum dwie wartości int

Po prostu użyć funkcji? std::minjuż istnieje.

lub używanie zestawów pamięci do inicjowania tablic

std::array<T, N> już inicjuje jego zawartość.

jakie techniki kodowania istnieją w prawdziwej pracy?

Pierwszym krokiem jest poznanie języka, którego używasz.

DeadMG
źródło
Próbuję poznać język, którego używam, dlatego zadałem to pytanie! Dzięki za wkład na ten temat .
marktani
7
O. Musiałem wtedy źle zrozumieć twoje pytanie. Poleciłbym książkę . Uprzejmie prezentujemy tylko książki warte przeczytania, zamiast tych, które uczą śmieci C.
DeadMG
10

Oprócz znajomości języka poznaj swoje narzędzia, a zwłaszcza edytor. Koduję od ponad 15 lat profesjonalnie i widziałem, jak inaczej wielcy programiści zwolnili, ponieważ jedynymi używanymi przez nich poleceniami edytora są klawisze kursora i crtl-x / c / v ..

Czy twój edytor obsługuje pojedyncze naciśnięcie klawisza w celu usunięcia linii? Aby ponownie wciąć linię? Poruszać się między funkcjami / metodami? zablokować wybrać / wkleić? zakładki? Poruszać się słowem? Czy edytor może automatycznie generować klasy / metody / funkcje? Czy obsługuje szablony, które można tworzyć z wyprzedzeniem? Szybkie refaktoryzacja? Nagrywanie makr?

Znajomość edytora może znacznie przyspieszyć proces programowania.

Garion911
źródło
1
Amen. Pracuję tylko z nowym facetem, który jest bardzo szybki ... i używa vima. To działa dla niego, ponieważ poświęcił czas, aby nauczyć się go używać.
gbjbaanb
Także ... jeśli twój edytor nie obsługuje prawie wszystkich wymienionych tu funkcji - znajdź lepszy edytor.
Abhi Beckert
wywiad w dokumentach google ... najgorsze doświadczenie z tego powodu.
UmNyobe,
6

Pomyśl, zanim zrobisz. Lepiej pomyśleć i zaplanować przed napisaniem implementacji klasy niż po trzech nieudanych. Myśl także podczas działania - wykonywanie rzeczy małymi krokami znacznie upraszcza proces programowania.

Napisz tylko potrzebny Ci kod. Oznacza to, że nie zaczynaj pisać kodu z mentalnością: „ Będę potrzebował tych funkcji później, aby równie dobrze napisać ich prototypy, gdy będę przy nich ”. Rzeczy się zmieniają, plany się zmieniają. Otrzymasz kod, który może nawet nie być użyteczny. To strata czasu.

Wiedz co robisz Nie ma nic gorszego niż próba zapamiętania, jak działają podstawowe funkcje i cechy języka i / lub biblioteki. Zapoznaj się z używanymi narzędziami.

zxcdw
źródło
+1 dla YAGNI .
Brendan Long,
4

Było już wiele odpowiedzi, nadal chciałbym dodać swoją opinię.

Aby przyspieszyć kodowanie, zostań maszynistką dotykową do takiej prędkości, że podczas pisania możesz skoncentrować się zarówno na logice, jak i kodzie. Istnieje wiele programów do nauki pisania (na przykład Mistrz pisania, Szybkie pisanie, KTouch, gTypist), używaj ich

Widziałem wielu doświadczonych programistów, którzy wciąż są maszynistkami. Prowadzi to do nieprzyjemnego kodu bez dokumentacji i naprawdę tajemniczego kodu z makrami i skróconymi nazwami typów.

Sarvex
źródło
Głosowałem z palcem wskazującym :)
mlvljr,
Świetna odpowiedź. Dodam, że ludzie, którzy patrzą na klawiaturę zamiast ekranu, często piszą śmieci, zanim zdadzą sobie z tego sprawę i będą musieli wrócić. Lub napiszą w niewłaściwym oknie. Smutne jest to, że nie zdają sobie sprawy, jak bardzo to ich spowalnia.
Dave Markle,
2

Tworzenie oprogramowania jest jednym z tych klasycznych działań 80–20 - tzn. Gdy pierwsze 80% pracy zajmuje 20% czasu, a ostatnie 20% pracy zajmuje 80% czasu.

Kluczem do ogólnego przyspieszenia pracy jest zatem praca nad poprawą wydajności, która zapewnia 20% wysiłku. Zazwyczaj są to etapy debugowania i praca nad związaniem wszystkiego razem i uczynieniem go użytecznym.

Możesz to poprawić, zachowując większą ostrożność na wczesnych etapach. Planowanie i prace projektowe na początku projektu mogą wydawać się stratą czasu, gdy masz ochotę zanurzyć się w hardcorowym programowaniu, ale mogą one zaoszczędzić dużo czasu później.

Ludzie będą mówić o konkretnych metodach, takich jak TDD lub BDD. Są świetne, ale jeśli nie robisz ich teraz, zajmie ci to trochę czasu, aby się do nich dostosować, więc prawdopodobnie nie są czymś, od czego chcesz zacząć od konkursu programistycznego. Ale przestaniesz planować, co robisz, zanim się w to zanurzysz, i zbierze nagrody, bez względu na wszystko. I tak są to pierwsze kroki w kierunku TDD i BDD. To jest miejsce, od którego chcesz zacząć.

SDC
źródło
-2

Jeśli jest to prawdziwy konkurs programistyczny, nie używaj C ++. Użyj szybkiego, interaktywnego języka skryptowego RAD. Jest to coś, w czym VB6 absolutnie dominuje. Idź z uzbrojonymi bibliotekami, które wcześniej napisałeś. Dzielenie ciągów, odwracanie tablicy, wyszukiwanie, sortowanie, podstawowe grafiki, sterowanie konsolą.

Jeśli to do pracy, rób dokładnie odwrotnie. Dowiedz się, co tam jest, użyj solidnego języka (C ++ jest w porządku), komentuj wszystko i tak dalej. Te dwa rodzaje środowisk nie mogą być od siebie oddalone.

Bryan Boettcher
źródło
3
Nie byłem jednym z downvoterów, ale zakładam, że prawdopodobnie -1-ty, ponieważ pytanie dotyczyło szybszego programowania w C ++ .
Gordon Gustafson,
9
VB6? Poważnie? Czy jesteś z przeszłości?
Konamiman
2
@Konamiman: heh, tak jestem. Nie wiedziałem, czy miał na myśli „Przygotowuję się w C ++ do konkursu programistycznego” czy „Przygotowuję się do konkursu programistycznego C ++”. No cóż, frytki leżą tam, gdzie mogą. Mimo to nic nie przebije bardzo szybkiego środowiska RAD dla konkursów programistycznych, w których liczy się dosłownie każda sekunda.
Bryan Boettcher
Zredagowałem pytanie w celu wyjaśnienia.
marktani
Na RAD: Delphi 6 będzie wtedy najlepszym wyborem.
mlvljr