For my first software development project, I created a command-line program to read bank statement files downloaded from online banking sites. The program parsed the data, stored it in an SQLite database, and exported it into a formatted Excel file.
This project was the first time I interacted with any build tools (I used maven for that project), handled proper logging systems (log4j here), and designed a schema.
I tried to do everything the "right" way. If you look at the code - it is all neatly formatted, javadoc comments are present for every function and there's high test coverage. I focused really hard on making the design extensible, ... trying my best to future proof, by following the SOLID principles. But, looking back now, it's clear I was overly fixated on this "perfect" modular idea. The project is over designed, the codebase is fragmented with a multitude of small, specialised classes each with only one responsibility. It makes it hard to follow
With regards to the output from the program itself - it does work - but I never use it... mostly because of the simple design flaw that I would need to actually login online to download my bank statements. I could be bothered enough to build a whole parser, but not to log into my online bank.
Still, I'm happy with this project - it got me started at least :) .
I developed a basic 2D game using Java (JPanel for Graphics). The game loop engine was built from scratch, but takes inspiration from various online tutorials.
In the game, the player controls a square character and a cursor, which cannot pass through walls, requiring multitasking to survive.
Most of the work focused on designing the engine architecture: representing entities and levels, implementing a game loop with different “game states,” and managing background tasks like scoring, sounds, and events. I used a tile-based level system and a spatial hash map to optimize collision detection and pathfinding.
While the game is playable, it is far from polished. The main achievement was understanding how to structure a game engine, link its components, and handle real-time updates—experience that has informed my later projects and deepened my appreciation for professional game development.