Climbing to Stand on the Shoulder of Giants

One challenge I faced early on in programming was writing new code for existing projects.

I first encountered this while working with the Research Data Management team in 2023. During this attachment, I had to balance two main tasks:

  • Learn the Django web framework
  • Understand the existing work on the web application

The project focused on developing a separate app within Django, so I didn’t need to grasp the entire codebase. I just had to understand the project’s setup—like Django Settings and dependencies for container environments. This setup allowed me to direct the design, implementation, and documentation of the new app, aside from adhering to a few conventions from the existing codebase.

Since joining the Melbourne Data Analytics Platform (MDAP) team, that flexibility has disappeared. I was thrown into the deep end of a Django project with advanced authentication, RBAC, CMS, testing pipelines, critical third-party packages, and multi-container deployment setups. Oh, and did I mention it uses the Django REST framework for API building?

Whew, that’s quite a handful…

So how have I managed to navigate this forest of code so far?

Three things:

  1. Understand the requirements thoroughly
  2. Acquire the necessary knowledge
  3. Test, test, test

Understanding the Requirements

I tend to dive straight into implementation because that’s the fun part! My strength lies in quickly piecing things together and refining them to meet the final requirements. However, I’ve realized this approach can lead to constant re-coding, bringing new bugs along the way and endangering both functionality and security.

I’ve started taking a different approach. The most obvious step is to ask questions to uncover as many technical details as possible. But more crucially, I’ve learned to anticipate the future implications of adding new features.

My workflow now looks like this:

Receive new requirements → Clarify details → Challenge the need → Anticipate implications → Align through communication → Code

It’s definitely more involved than just jumping into coding, but it pays off later when there’s no need for significant redesigns or revisits.

Acquiring the Necessary Knowledge

With so many new concepts, I’ve needed to upskill fast. But it’s easy to get lost in a rabbit hole of knowledge, especially when it’s fascinating. The balance lies in picking up just enough to complete the task.

It can feel frustrating not to fully understand every aspect of a framework, especially with that nagging fear that I’m missing something important. But it’s a necessary trade-off.

Test, Test, Test

An age-old adage, but one I’ve come to respect. If I’m navigating a sea of unknowns, testing is my life jacket. I aim to create a test that meets the feature requirements before implementing it. So far, this approach has served me well.


I could go on about this, but I think I’ll stop here. I’ll probably cover more on this topic before the end of this internship.

Till then.

– UTQ –

Posts in this series