Skip to main content

From Developer to Product Owner

·2414 words·12 mins

Last month, I gave my second PechaKucha talk after 10 years at PechaKucha Night Kuching Vol 11…That’s right, after 10 years and 1 month I returned to the local Kuching PechaKucha scene and gave a talk about vibe coding and how AI changed me.

I really have to thank Jeffery and the team for inviting me to their annual PechaKucha to talk about stuff and share my passion with everyone. The speakers were all great and it felt like I was in Spiderman Homecoming…like just the homecoming part, not really Spiderman at all.

Anyway, the beginning of this story didn’t actually start at the event itself. It began during one of the rehearsal sessions before the main event…

Yep, gotta dress comfortably…it’s just a rehearsal anyway!

My wife and I were talking about the new pink buses that were going around town and how our niece (who was going to start university towards the end of the year) would do her daily commute if she were to stay with us.

And so began my quest to find out how feasible it was to ride a bus from all the way out in the boondocks where we’re staying to the vibrant, traffic infested boom town called Kuching…

My IRL User Story
#

As I was saying, during one of the rehearsal sessions, I decided to take a pink bus down to town instead of driving due to a few reasons:

  1. My wife’s car battery died (stupid battery hog Android player!) so she had no other means of transport to pick up the kids.
  2. I had another engagement that same morning, so I needed to be in town pretty much the whole day anyway.

Seeing as how the morning rush hour jam didn’t work very well with the bus that went through my area, wife decided to drive me to town instead and we had breakfast before she dropped me off at my first session in the morning.

It was my first time at this fancy place woohoo

After the session, I had my first real chokepoint on this whole bus thing: walking sucks.

Not because I hated walking in the scorching heat with zero to no walk paths available for pedestrians…ok that too, but the point here is that the bus stops are few and far in between, and the current road works for the upcoming Autonomous Rapid Transit (ART) system in Kuching makes getting to those bus stops an absolute adventure.

Speaking of having a smart phone, the official BAS.MY app is absolute trash. It kept giving me ridiculous bus routes based on my location and I just really couldn’t use it at all to give me the right information to get me where I needed to go. It’s literally the case where you need to feed it with the EXACT SEQUENCE OF INFORMATION for it to show you what it thinks you want. Like seriously, did they even do any user acceptance tests on this app? The devs literally sticking their middle finger at you and screaming RTFM.

Luckily, the bus provider itself had a standard bus route map/timetable that I found to be more useful than that crappy pink memory hogging virus on my phone. So I was using that the whole way, with my wife giving me free consultations on how to navigate the mess that is the Kuching pink bus system. And yes, she’s been at it for weeks at this point, studying and learning how to make sense of the nonsense app and all the bus lines to town!

Needless to say, my experience with getting information is less than stellar. Information on bus fares, timings, routes, everything is just all over the place.

Having said that however, the bus ride itself was quite pleasant and I really do enjoy riding the new pink buses. It’s got just the right amount of air-conditioning, USB ports for charging your devices…the only downside is that there’s not too many seats available, but that really isn’t an issue since not that many people are riding them buses at this point in time.

Anyway, with this personal experience of lackluster information I began thinking about how to make life easier for commuters…

The Gameplan
#

With my IN-REAL-LIFE (IRL. Yup, I finally decoded it all the way down here!) experience and story, I have at least an inkling of what a real user would need from an app:

  1. Bus transit routes and timetables
  2. Location tracking for buses in-service
  3. Bus fare information
  4. A pleasant User Experience

If I were to make an app, I would definitely want to address these things. But then again, I wouldn’t really want to download YET ANOTHER APP on my phone! So I thought to myself “Can I make a free, working webapp that would actually give all the basic information a commuter needs?”

YES! OF COURSE I CAN!
#

And just like that, I set off on a journey that changed me from just your average developer to something else…

VIBE MAX
#

In this project, I decided to try vibe coding purely with the mindset of an amateur, NOT an experienced software developer. Like, just let the AI do its thing and I just feed it with what I expect as the end result…at least for the first 24 hours. I wanted to feel what it felt like to vibe and let the AI take the reins to quickly push out something of a POC.

I began with giving some basic specs:

  • it needs to be in a devcontainer
  • grabs data from the official government API
  • use HUGO static site generator
  • use vanilla Javascript for all interactions
  • use leaflet.js as the main map engine
  • use cypress as the main e2e test framework.

Out of all the specs, I ended up leaving only the cypress tests unfinished by the end of the first day of development.

The initial POC. Looks like your basic Data Scientist dashboard LOL

After the first day, I saw all that Gemini had made, and it was good enough. Not great, but good enough. That was when I stepped in and put a bit more UX and UI refinement in place to get it looking and feeling the way I wanted, on top of refactoring the code a bit to keep it maintainable by humans. Letting the AI do its thing is good but knowing what I know as a first hand bus user, I needed the product to serve the intentions of the user first.

I polished it a little bit more, then published the first version of the “BAS.MY KCH Tracker” and announced it on Facebook.

I have to admit, the initial version here looks really barebones but again, I wanted to build a bit of buzz and awareness about this very real problem with the current fragmentation of information and user experience with the platforms servicing these buses. This comes back to the very real dilemma that I highlighted in a previous blogpost.

One thing I realize is that people love seeing progress, and in the very same way that you see how a content creator evolves, seeing an app evolve is equally satisfying, especially if it becomes more and more useable as time goes on.

Although it’s nice to see it getting better with every update, it’s not all sunshine and rainbows when it comes to actual development…

Trials and Tribulations
#

Software development is well known for increasing forehead height across the developer landscape. That’s why most devs are either bald or experience hair loss at an unprecendented rate. Anyway, some patterns I noticed in developing an app like this boil down to these main topics:

  1. AI hallucinations
  2. Unreliable data

Let’s first address the elephant in the room: AI hallucinations.
#

Sometimes when vibe-coding, the required “suspension of disbelief” comes at a cost of your sanity (albeit not as much as the old days of spending hours of searching through stackoverflow for a tiny hint of the solution that you need to fix a hyper-specific problem in your code.)

In this particular project especially, I found myself going through the same bunch of code over and over again with the AI, iterating to find the solution to the problem, only to realize that the official government API was sending out blank data.

At the cost of your neurons and hairline, you sacrifice your logical and critical thinking in exchange for fast responses to your questions and queries. More often than not, after a few back and forth rallies with the AI, I end up combing through the code itself just to find ONE line that didn’t make any sense, or my instincts about a specific block inside a function or routine that looked iffy turned out correct.

In the old days, you’d face a bug, search high and low for the solution, fail, take a 30 minute break, come back, comb through the code once more and find the silly mistake somewhere in line 67.

Now, replace the 30 minute break with going back and forth with the AI because you’ve become so dependent on it doing all the heavy lifting. Honestly, it’s a zero sum game when it comes to output quality, but a detriment/liability when it comes to your overall well-being and ability to get away from the computer.

Anyway, most of this is also attributed to something I had underestimated…

Unreliable data
#

The dataset I use for this webapp actualy comes from the official government APIs over at data.gov.my specifically the realtime GTFS (General Transit Feed Specification) data. As such, it’s totally dependent and I have 0 control over the dataset.

One thing I implemented was the daily pulling of GTFS static data which gives me the latest bus routes, dates, and times of a specific city in which the pink buses are deployed, in my case, Kuching.

I’ve faced these problems so far:

  1. Missing rows for GTFS static data, which results in missing bus stops and terminals on the map
  2. GTFS realtime data not being updated due to various reasons (network down, outages, physical problems with hardware or infrastructure) which causes buses to seemingly “freeze” on the map for hours, even up to a whole day!

Even though I’ve implemented some countermeasures (i.e. rate limiting for API requests, remove buses if the updates are not happening within a reasonable timeframe, backup GTFS static data, etc) there’s no way for me to really counteract the fact that this small little app is purely dependent on a single server for data.

So if a lil’ old free app like this is faced with these existential crises of monumental repercussions, you would expect companies relying on such data to have backups, three to four times over so that they’d have 0 downtime and smooth operations 24/7 365 days a year for 100 years, right?

Well, you’d be surprised 🫢

Moving Forward
#

Looking back at this project, I feel like I’ve finally broken free of the chains that shackled me as a software developer: the lack of purpose and making things happen for other people that I feel little to no connection towards. For the first time in my life, I actually feel like I own this piece of software that I built. I mean, I’ve built a lot of things for myself, but a piece of software? Does this website count?

For the first time I really feel like I OWN my own software PRODUCT. Does that make me the product owner? In the strictest sense of the word, probably not.

Semantics aside, I’m quite amazed at the response from the community and general public consensus on the need for something like this:

400+ reactions and some comments and shares. The people want this!

I shared it to an active Facebook group (yes, people here in Kuching use Facebook actively you know!) and the comments and feedback from the public is very encouraging. The idea that people want a single, easy-to-use app with no frills and just gets the job of putting all the necessary information in one place…IS VALIDATED.

Besides, this I also showed some earlier versions to people living nearby me and they also saw the upsides and shared some frustrations they had with the official app, as well as features they would like to be on the webapp I created.

And now comes the exciting part…

A wild challenger appears!

I’ve been giving this a thought while continuing to update my tiny free webapp: “What if we can just get all the information on ALL public transport service providers in one place in the same way as this tiny tracker? AND what if we have the funds to allocate to feeder cars/transport to bring people from their local neighbourhood to the designated bus stops for any of these buses?”

And so the idea of “numpang” was born. Translated to English, it means “to ride” or “get a lift”. There’s still a lot to figure out at this point, but I’m excited to bring this to life in the coming weeks/months. How did I get the name? So here’s how it all went down:

A group admin posted this bus going to the Rainforest World Music Festival…
I jokingly referenced it at the end of my post…
Amanda here referenced it back so I guess it caught on 😉

Jokes aside, I thought it would be a nice name to move forward with as I’m now aiming for bigger things with this project.

How exactly will it turn out? Who knows.

But one thing’s for sure, I feel like I have a purpose in this space, and I’m going to push to make it happen.

-Fab