Imagine this: a few years back, in the COVID chaos, I swapped my globe-trotting, music-festival-loving video producer lifestyle for the uncharted waters of programming.
I took the plunge from casual coder to aspiring full-stack developer. Before, coding was just a side gig; now, I was all in. Despite my brush with small projects, stepping into professional software development was new territory. Join me as I unfold this journey, which might just be the roadmap you need in your tech adventure.
Live Version of TodoStreak.com
My Coding Journey: From Learning to Doing
When I started my coding adventure, I dove headfirst into learning. I watched countless Udemy courses, read blogs, and lost track of the hours I spent on YouTube. Picture me as a programming sponge, soaking up every bit of information. I ordered the top-recommended books and tackled mini-projects. One of them took off and went viral.
Then I discovered the indie hacker community on Twitter. I was inspired by people like Pieter Levels, who was creating his digital products. The thought of bringing my ideas to life and seeing real people use them was fascinating. It was more than learning; it was about making things happen.
Taking the Leap: Building My Web App
The next step in my journey was to break free from the endless cycle of tutorials. It was time to move beyond small projects and step into the shoes of a maker. My goal was bold: to build a full-scale web application. This meant exploring new areas like back-end development and databases, and figuring out how to fit all the pieces together.
I chose to replicate a website, and not just any site, but wip.co – a platform I was already familiar with, known for its community of makers, social features, and leaderboards. Why a clone? Think of it as training wheels for budding developers. By recreating an existing site, you learn essential skills, understand how effective systems work, and gain practical experience in crafting larger-scale applications.
My Endgame: Turning Skills into Success
For me, coding isn’t just about the code; it’s a path to achieving my dreams. Sure, I love the challenges and the excitement of programming, but my ultimate goal has always been clear: to create and potentially sell my web apps. Take a peek at my first attempt. I plan to develop Minimum Viable Products (MVPs), release them to real users, and see if they hit the mark – particularly with those willing to pay. This stage is crucial; it’s where I hone my skills and lay the foundation for my future as a web app developer.
Choosing My Tools: The Tech Stack Odyssey
In this section, I want to share how I chose the right technology stack for my web development journey.
I first got into programming in college, where my roommate introduced me to Python. I started with small projects, getting a good feel for the language. But when I aimed to build complete web applications, I realized Python wasn’t quite the fit for full-stack development.
I wasn’t starting from zero with JavaScript. I had some front-end experience and had played around with the language a bit. But now, it was time to dive in, moving from simple front-end tasks to complex full-stack applications. This meant leveling up in the JavaScript world.
After some thought, I chose React and Next.js as my main tools. Looking back, I remember feeling overwhelmed by JavaScript, as daunting as a foreign language compared to the Python projects in college. My roommate, skilled in Vue and frameworks like Nuxt.js, seemed to speak a different tech language. But now, I’m fluent in JavaScript, navigating what once seemed mystifying with ease. It’s a huge transformation from where I started!
Building the project & Technical challenges
When I began this project in April 2022, I expected a quick sprint. Turns out, it was more like a marathon, lasting nearly two years! Balancing it with my day job and other responsibilities, progress was slower than I hoped. It was a real lesson in time management and the challenges of ambitious projects.
This journey took an interesting turn in 2022 when I started live coding streams. It was a new and exciting experience, quite different from what I had done before. I found that live-streaming my coding sessions added a fresh, spontaneous element to my routine. It wasn’t just about coding anymore; it became a way to connect with other developers and enthusiasts in real time.
These streams turned into a fun, interactive platform for sharing my progress, bouncing ideas off others, and getting instant feedback. It wasn’t something I took very seriously at first, but it soon proved to be a valuable way to learn.
The Tech Stack Evolution
The project’s tech side had its twists and turns. Initially, I used Chakra UI, but it soon felt restrictive combined with Tailwind’s styling. So, I switched to custom components with Tailwind, only to realize I was recreating what I had left behind. Talk about irony!
Database Dilemmas and Serverless Struggles
Choosing the right database was another adventure. Starting with SQLite, I quickly learned it wasn’t compatible with the serverless architecture of Next.js. After experimenting with various options like Neon Database and Vercel Postgres, I settled on Planetscale. It wasn’t perfect (hello, slow cold starts!), but it was a valuable learning experience.
My TypeScript Journey: From Doubt to Confidence
When working on my project, I decided to switch from JavaScript to TypeScript. At first, I was unsure about it. The types in tutorials seemed too complex for what I needed. But as I faced issues with JavaScript, like unexpected API responses, TypeScript started to make a lot of sense. The change wasn’t easy (those TypeScript errors can be tough!), but with the help of chat-GPT plugins and error plugins for TypeScript, I found my way.
Using TypeScript turned out to be a mixed experience. It’s not perfect for every situation, and it’s easy to get caught up in creating detailed type definitions. However, TypeScript can be incredibly helpful. It catches mistakes early and saves a lot of time that would have been spent on fixing bugs. The key is to use TypeScript wisely – it should make coding easier, not harder.
Navigating the Evolving World of Next.js
Let’s talk about my journey with Next.js, a popular React framework. Imagine trying to hit a moving target – that was me with Next.js. I started with version 12, and before I knew it, it had changed completely by the time it reached version 14. These updates were a mix of good and challenging, making me constantly rewrite and adapt my work.
From this, I learned an important lesson: always chasing the newest tech can be tiring and not always helpful. It made me realize the value of finding a balance between using stable, well-known tools and exploring new ones. This is something many developers, including myself, learn over time, often the hard way. It’s about striking the right balance between innovation and reliability in our projects.
Key Takeaways from My Coding Adventure
In this part, I want to share the essential lessons from building my project. It was a journey full of learning and adapting, almost like a rollercoaster. At first, everything moved fast, but then I hit some complex problems that slowed me down. I had to make tough choices and often redo parts to get them just right. Through this process of trying, failing, and trying again, I learned the most.
A major lesson for me was about time – I didn’t realize how long development and learning new tools would take. The tech world is always changing, like with updates in Next.js, and that affected my schedule. Looking back, I think being more realistic about how long things take and sharing my work earlier would have been a better approach. This experience taught me a lot about planning and adapting in the world of coding.
Striking the Balance: Perfectionism and Practicality in Coding
In the world of software development, finding the balance between perfectionism and practicality is key. It’s about understanding that the ‘perfect’ product is a myth and focusing on what truly adds value.
When I started building from scratch, I faced numerous small decisions – like user name formats or default avatars. All the small decisions cloud up your brain and make you lose track of the bigger picture. These choices made me appreciate frameworks that handle the basics, allowing more focus on unique features.
As my project grew, so did its complexity. Software development is like a maze of choices, each affecting the next.
Project Management: Beyond Coding
Surprisingly, a large part of this journey involved project management. Deciding what to tackle and when to stop polishing a feature were crucial skills. The main question was always: What does this add for the user?
Also ego plays a role. It can drive ambition but also blind us to practicalities. Balancing ego means aligning our drive with the practical goals of effective technology solutions. It’s about delivering practical solutions, not just chasing technical perfection or personal validation. Combined with sunk cost fallacy and tunnel vision it’s a recipe for movement without progress.
A vital skill I learned was to not dwell on tough problems. Sometimes stepping away and returning later brought new solutions, saving hours of potential frustration.
“First make it work, then make it pretty.” It’s tempting to perfect your code from the start, but I’ve learned the importance of first focusing on a working solution, no matter how rough it looks. Refining comes later, and this approach has truly been a game-changer.
Navigating Help in Development
Asking for help is not as easy as it seems. Even seasoned developers need the right context to grasp your project’s specific challenges. Interestingly, I found that just trying to articulate my question often led to discovering the answer myself. This is what’s known in our world as “rubber duck debugging.”
Tackling Complexity with the Mikado Method
Discovering the Mikado Method was a breakthrough. Imagine breaking down complex coding tasks into smaller, more manageable pieces, and addressing them one at a time as a chain of dependencies. This strategy keeps you from getting overwhelmed and ensures a more organized way of solving problems.
Embracing Just-In-Time Learning
If I could give one piece of advice, it would be to choose just-in-time learning over accumulating loads of information. The tech world is huge, and it’s easy to get lost. Focusing on what you need to know right now saves time and keeps you from getting bogged down in unnecessary details.
Getting a functional product, even if it’s not perfect, out to your users is far more valuable than endlessly polishing something in the background. This has shifted my focus from chasing technical perfection to prioritizing market fit and user engagement.
What’s next
As I wrap up this two-year journey from video producer to coding enthusiast, the big takeaway is clear: It’s not just about coding skills, but also about understanding the market and strategic thinking.
My Next Chapter: Looking ahead, I’m excited to launch several minimal viable products (MVPs). This marks a shift from focusing solely on technical perfection to prioritizing market feedback and growth. The goal is to evolve from a developer to a tech entrepreneur, where delivering value is key.
As I close this chapter, I’d like to extend an open invitation to my fellow developers and tech enthusiasts. Your feedback is not just welcome; it’s invaluable. Visit the GitHub repo, dive into the code, and don’t hesitate to share your thoughts, improvements, or even criticisms. For those embarking on their programming journey, feel free to clone the project and use it as a learning tool. And if you’re up for it, submit a Pull Request (PR).