Ogólny konsensus brzmi: „pisz więcej kodu”, z czym się zgadzam, ale dodam do tej rady, że powinieneś pisać wiele różnych rodzajów kodu. Java jest w porządku, jeśli chodzi o języki, ale zdecydowanie powinieneś pisać kod zarówno w górę, jak i w dół spektrum mocy. Oprócz Javy sugeruję wykonanie kilku małych projektów w języku niższego poziomu (C jest do tego dobry), języku skryptowym (wolę perla, ale python jest również dobrym wyborem), języku funkcjonalnym ( lisp jest tutaj ogólną rekomendacją, ale OCaml i Haskell to również dobre wybory) i przynajmniej zadowalają się czytaniem języka asemblera.
Wybierz też różnorodność typów programów, które wdrażasz. Spójrz na implementację przynajmniej graficznego interfejsu użytkownika, bogatej aplikacji internetowej, klienta i serwera sieciowego, sterownika, narzędzia do mungowania danych, ray tracera i symulacji fizyki.
Wszystkie projekty powinny mieć stosunkowo niewielki zakres, celem nie jest posiadanie interesującego programu, ale zdobycie szerokiego wachlarza doświadczeń w różnych domenach, w których możesz się natknąć, aby nauczyć się różnych rodzajów myślenia potrzebnych dla każdego z nich, i dowiedzieć się, gdzie są twoje zainteresowania.
Gdy to zrobisz, będziesz mieć dobry pomysł na program, który najbardziej Cię interesuje, i możesz znaleźć lub rozpocząć projekt open source, aby uzyskać doświadczenie w pracy z dużymi bazami kodu, zajmującymi się długo- projekty terminowe i współpraca z innymi programistami.