A deep dive into the first call

A deep dive into the first call

Welcome to our second article, fuelled by our lives, experiences, and knowledge. We'll take a deep dive into the first call with a new client and share our thoughts on the impact of AI on our code and on ourselves. Don't forget to leave a comment at the end to share your thoughts!


Meeting with a new client

A new client has reached out to us 🎉

Securing a new client is always a mix of excitement and joy. Excitement, because it's a new project where we'll likely discover new things along the way. Joy, because we're passionate about what we do and strive to satisfy our clients.

We had our first call with this new client, following the approach we outlined in our previous article. This client is a videographer looking to build a new website, something more performant and flexible than what Wix has offered them so far. We (implicitly) divided this call into three distinct phases:

Step 1: Understanding the client's needs

The first step is to listen to what your client wants. This allowed us to understand their requirements and main criteria, which in this case include:

  • Authentication, allowing users to access their accounts and view photos and videos.
  • A services page where users can view and purchase our client's different offers.
  • A portfolio to showcase our client's work.

Step 2: Challenging their expectations

Once the first step was complete, we moved to the second: challenging their expectations. The goal here was not to question the client, but to dig deeper. Distinguish what they want from what they truly need. For example, until now, they posted photos and videos on third-party platforms due to the limitations of their current site. Is it really worth paying for the development of such a service when what they have currently works?

💡
The key is to provide real value, not just sell the most expensive service possible.

Step 3: Opening up

Finally, the opening, which forms the third part. During the discussion, ideas naturally come up. We then discuss these with the client in order to get initial feedback. This helps us understand if the idea interests them and if we should explore it further during our internal brainstorming session after the call. For example, we suggested to this client that users could gift photo shoots to their loved ones through the services page.


Reflecting on AI's impact on our code and lives

Today, as developers, we are confronted with AIs on a day-to-day basis. They are becoming more and more prevalent in our work and restructuring our daily routines. It's not just about ChatGPT or GitHub Copilot suggesting code directly, as AI goes much further, with tools like v0, which can help front-end developers build websites frond scratch, or Midjourney, that provides interesting ideas for UI designers.

However, with these AIs and their efficiencies, we sometimes fall into a productivity frenzy where the goal is to make things work as quickly as possible without considering quality and sturdiness. Other drawbacks also include the introduction of subtle and insidious bugs or the knowledge loss (the more AI does for us, the more we forget how to do it ourselves). This can lead to a waste of time when we were trying to save it!

If we find ourselves no longer enjoying our coding sessions, it might be worth returning to the fundamentals for full control of our code. I found the following process to be an effective solution. Step one was disabling all AI tools I used and going back to good old Stack Overflow, or even paper for the more challenging algorithms.

Next, I aimed to develop my features entirely before the testing phase, by breaking them down into succinct steps. Good practices like meaningful variable names, doc strings, or types (especially for languages where types are optional) were valuable allies. Finally, to avoid infernal debugging sessions, it's always interesting to follow Principle #5, that helps NASA code without bugs: Use a minimum of two runtime assertions per function. For the non developer readers, a runtime assertion is a line of code that raises an error (make the code crash) if a certain condition isn't met. It's useful to be 100% sure you don't go forward with your algorithm if the data you are handling isn't what you expect it to be.

🚀
Of course, following the other principles of space-proof code can only help reduce your bug count in production!

Although the points I've mentioned can be achieved with the help of AIs, working without them allows us to regain excellence in mastering and understanding our own code (truth be told, the removal of generated code plays a big part), and to rediscover the joy of coding sessions.


Conclusion

  1. Always aim to provide value to your client: Understanding and challenge your client's needs is crucial. The goal is not just to sell the most expensive service, but to deliver real value that meets their true requirements.
  2. Step away from AI to enhance your coding experience: While AI tools can be incredibly helpful, relying too heavily on them can lead to a loss of knowledge and enjoyment in coding. Taking a step back and returning to the fundamentals can help you regain control and rediscover the joy of programming.

That's it for our second article! We hope you found it insightful and enjoyable. Don't forget to leave a comment below to share your thoughts and join the discussion!