Ja zwykle robię to tak:
Jeżeli problem jest rozbudowany, staram się go podzielić / zredukować do prostszego lub wcześniej rozwiązanego problemu. Zastanawiam się, co jest najważniejszą funkcją (jak to mawiają "minimum viable product"), która nadawałaby się do pokazania komuś. Na początku skupiam się tylko na najważniejszej.
Jeżeli ta najważniejsza funkcja jest nadal za duża, aby zakodować w jeden dzień, to zaczynam od eksplorowania rzeczy najbardziej ryzykownych / najtrudniejszych / zwykle ukrytych przed użytkownikiem. Czyli nie zabieram się za interfejs, dopóki nie mam zrobionego silnika. Później zwykle jest już z górki. Po prostu piszę kod, zwykle bottom-up, równolegle z testami, stopniowo dodając funkcjonalność. Tzn. trochę kodu, trochę testów. Pisanie bottom-up ma tę zaletę, że praktycznie od pierwszych 5 minut kodowania zawsze mam coś działającego i przetestowanego. Składam kod z małych kawałków, często przerabiam, często refaktoryzuję, szukam możliwości uproszczenia. Przed napisaniem danego fragmentu kodu (czy to klasy, czy metody) również sprawdzam, czy nie da się zrealizować jakąś biblioteką.
W pewnym momencie dochodzę do etapu, kiedy jest funkcjonalność jest na tyle bogata, że można zrobić demo i/lub myśleć o włączeniu mojego kodu do reszty.