Navigating the Coding Odyssey: My 100DaysOfCode Challenge Journey

Navigating the Coding Odyssey: My 100DaysOfCode Challenge Journey

Embarking on a journey of self-improvement was a path often paved with challenges, victories, and the relentless pursuit of growth. In the realm of coding, this journey took the form of the 100DaysOfCode challenge - a commitment to spend a dedicated hour each day for a hundred days, learning and honing coding skills. What began as a personal challenge soon evolved into a transformative odyssey through the vast landscape of web development.

As the first lines of code were written, and the initial hurdles were overcome, I found myself immersed in a world of algorithms, languages, and the sheer joy of creation. This blog is a reflection on those 100 days, a chronicle of the lessons learned, technologies embraced, and the triumphs and tribulations that came with them.

Join me as I navigated through the intricacies of different technologies, unraveling the threads of database management, front-end development, back-end development and Cloud computing, and discovering the fascinating world that lies beneath the surface of our favorite websites and applications. This was not just a coding challenge; it was a personal exploration, a commitment to growth, and a testament to the transformative power of perseverance in the face of complexity.

So, let's dive into the code and explore the milestones, the discoveries, and the unexpected joys that the 100DaysOfCode challenge brought into my coding journey.


Introduction to the Challenge

In the ever-evolving landscape of technology, the need for continuous learning and skill enhancement has become paramount. Recognizing this, the 100DaysOfCode challenge has emerged as a powerful and popular initiative within the coding community. The premise is simple yet transformative: dedicate at least one hour each day to coding for a consecutive 100 days.

This challenge serves as a catalyst for personal and professional growth, aiming to instill discipline, consistency, and a genuine love for coding. Whether you're a seasoned developer looking to expand your skill set or a novice eager to embark on a coding journey, the 100DaysOfCode challenge provides a structured and supportive framework to achieve your coding goals.

Beyond the mere act of coding, this challenge fosters a sense of community by connecting participants worldwide through social media platforms. Sharing progress, challenges, and insights with the hashtag #100DaysOfCode creates a collaborative atmosphere that encourages and motivates individuals throughout their coding odyssey.

Joining the 100DaysOfCode challenge isn't just about completing a hundred days of coding—it's about embracing a mindset of continuous improvement, breaking through barriers, and celebrating the small victories that collectively lead to significant progress. As countless developers have discovered, this challenge isn't just a commitment to code; it's a commitment to personal and professional development, one day at a time.

For more information on the origin of the challenge:-

https://www.100daysofcode.com/


Before the Challenge

Before embarking on the 100DaysOfCode challenge, my coding journey was characterized by a foundation of curiosity and a desire to learn. While confident in the front-end and back-end coding aspects, there were notable gaps in my knowledge, particularly in design, database management, and certain cloud computing and data structure concepts. Though comfortable with technologies like Java, Spring, React, and SQL, I didn't categorize myself a full-stack development professional due to these knowledge gaps.

My goals were aspirational, yet there was a noticeable gap between where I stood and where I envisioned myself in the ever-evolving world of technology. The prospect of handling back-end processes, understanding databases, and seamlessly integrating front-end and back-end development seemed daunting but immensely exciting.

In essence, I was at the foothills of a vast mountain of knowledge, eager to ascend and explore the panoramic views that awaited me in the realm of full-stack development.


Planning

Embarking on the 100DaysOfCode challenge requires thoughtful planning and a clear roadmap to navigate the coding journey successfully. Before diving into the daily coding sessions, I took the time to establish a structured plan, ensuring that the next 100 days would be both productive and rewarding.

  • I outlined clear and ambitious goals centered around mastering key domains in full stack development and expanding my existing knowledge. My focus was on becoming proficient in Database Management, Back-end Development, Front-end Development, and Cloud Computing. Additionally, I aimed to delve into essential concepts like Data Structures, Containerization, and Linux.

  • Recognizing the need for consistency, I divided my overarching goals into manageable sprints of 15 days each. Each sprint was dedicated to a specific topic or domain, ensuring a focused and immersive learning experience. This structured approach allowed me to balance depth and breadth in my coding journey.

  • Selecting the right tools and technologies required meticulous research, considering various parameters such as industry relevance, personal interest, and scalability. Each choice was made with the goal of acquiring practical skills and knowledge that would contribute to my full-stack development proficiency.

  • To track progress effectively, I established milestones to be completed at the end of every second sprint. These milestones served as checkpoints for significant achievements, whether it was successfully implementing a feature, completing a comprehensive tutorial, or building a functional project. Celebrating these milestones provided motivation and a sense of accomplishment.

  • Flexibility was a key component of the plan. Recognizing that unexpected challenges could arise, I built in the flexibility to adapt the schedule and goals as needed. This adaptive approach allowed me to navigate unforeseen obstacles without derailing the overall progress.

  • Regular reflection on my progress became a fundamental aspect of the planning process. This allowed me to assess what was working well, identify areas for improvement, and make necessary adjustments. The ability to adapt and refine the plan ensured that it remained dynamic and responsive to evolving learning needs.

In essence, the planning phase was not just about setting goals; it was about crafting a roadmap for a comprehensive and successful 100DaysOfCode challenge. As I moved through the meticulously planned sprints and milestones, each day became a purposeful step toward achieving mastery in full-stack development and beyond.


Tools and Technologies learned

General concepts:-

  • Basics of Data Structures: Array, LinkedList, Stack, Queues

  • Leetcode problems related to String, Arrays, HashMap, Linked List, Interval, backtracking, Stack, Sliding window & 2D matrix.

  • Algorithms: Stack, Queue, Resize Arrays, Dequeue(Randomized), Union Find, Knuth Shuffle, Convex Hull, Selection Sort, Bubble sort, Insertion sort, Shell sort, Merge sort, Quick sort, Dijkstra Threeway, Heap sort, Heapify.

  • Reversed heap, Binary Tree, Binary Search Tree, AVL Trees, Red Black Trees.

  • Implementation of Symbol Tables, Kadanes algorithm.

  • Containerization with Docker and Docker Compose.

  • Docker compose a full-stack application.

Database management:-

  • MySQL and Flyway Migration

  • Indexing

  • Database Principles

Backend Development

  • Technologies: Java 17/21, Springboot 3, Python

  • OpenAPI code generation

  • RBAC system for user Authorization

  • Data structures and algorithms with Python

Frontend Development

  • OpenAPI Integration

  • React Routing

  • Common reusable components in React suitable for multiple projects

  • Hands-on with React libraries like Framer Motion, Three.js

  • NextJs, Tailwind CSS, Swiper.Js, and Framer Motion for the latest portfolio website

  • Vite vs CRA (Create React App) concept

  • Migration of a React application from CRA to Vite

Cloud Computing and DevOps

  • AWS services like IAM, EC2, S3, ELB, ALB, ECR, ECS, EKS, RDS, AWS Amplify, etc.

  • Deployment on various platforms like AWS EC2, S3, Netlify, Vercel, Render, etc.

  • Proxy_pass with Nginx in EC2

  • Setting AWS Cloudwatch logs with RDS, EC2, and ECS

  • Full-stack project deployment with CI/CD

  • Spring app CI/CD through Github Actions & deployment on EC2 instance (Free SSL with Caddy for testing) as a Docker container

  • MySQL on AWS RDS with AWS Cloudwatch logs enabled & React app on AWS Amplify & Vercel

  • Implemented a full-stack app in containers with Docker compose

  • AWS Database and Analytics, Compute services, ECS, Lambda, Batch, Lightsail

  • Cloud integrations, Cloud Monitoring, VPC and Networking, Security and Compliance & Machine Learning


Projects Showcase

  1. Opus - A corporate management system

    Source code

  2. Docker containers running in a single docker network with docker compose

    Source code

  3. CI/CD of a fullstack application

    Source code

  4. 3d portfolio developer website

    Source code

    Live Demo

  5. Portfolio website

    Source code

    Live Demo

  6. Data Structure and Algorithms

    Source code

    Source code

  7. Python

    Source code


Learning Moments

  • CSS layout was a significant challenge, especially when working on responsive designs. On Day 68, I dedicated time to master CSS Flexbox and Grid. The "aha" moment came when I realized how these tools could simplify complex layouts and streamline the design process. This newfound knowledge immediately translated into more visually appealing and structurally sound web pages.

  • As the complexity of my projects increased, so did moments of self-doubt. Day 82 became a turning point when I faced and conquered imposter syndrome. Connecting with the coding community, sharing my struggles, and receiving encouragement helped me realize that setbacks were a natural part of the learning journey. It was okay not to have all the answers immediately.

  • On Day 94, I built and deployed my first full-stack application, integrating server-side logic, databases, and client-side functionality. Simultaneously, I embraced continuous integration, setting up automated testing and deployment pipelines. This streamlined my development process, reinforcing the importance of code quality. Witnessing my code undergo automated testing and deployment with each push to the repository was a gratifying and efficient improvement, marking a significant step in enhancing the efficiency and reliability of my coding projects.

  • As the 100DaysOfCode challenge concluded, the final learning moment was a reflective one. Looking back at the journey, I celebrated the accumulation of knowledge, the growth in problem-solving skills, and the newfound confidence in tackling diverse coding tasks. The challenge may have ended, but the learning journey continues.


Building Consistency

Consistency was the cornerstone of my 100DaysOfCode journey. Tracking and maintaining a consistent coding schedule not only kept me on course but also played a crucial role in my overall progress.

  • Daily time commitment - I dedicated an average of at least 3-4 hours per day to coding, ensuring a balance between depth of learning and sustainable progress. On weekends, I adjusted my schedule, dedicating longer blocks of time (18-20 hours) to accommodate more complex projects and deep dives into challenging topics.

  • Progress tracking - Each day, I maintained a coding journal, documenting the topics covered, challenges faced, and solutions discovered. This practice not only served as a reflection tool but also helped identify patterns in my learning journey. I organized my code repositories on platforms like GitHub, creating a visual timeline of my projects. This allowed me to track the evolution of my coding skills and revisit past projects for reinforcement.

  • Learning resources - To maintain variety and avoid monotony, I diversified my learning resources. This included online courses, documentation, coding challenges, and community forums. Leveraging different formats kept the learning experience engaging and dynamic.

  • Community engagement - Regular updates on social media platforms, using the #100DaysOfCode hashtag, allowed me to connect with the coding community. Sharing achievements, challenges, and insights fostered a sense of accountability and support.

  • Adaptation & Flexibility - Recognizing that life can be unpredictable, I developed contingency plans for busy days or unexpected commitments. This ensured that even on challenging days, I could meet my minimum coding commitment. As the challenge progressed, I adapted my schedule based on peak productivity times. Identifying when I was most focused and adjusting my coding hours accordingly contributed to sustained consistency.

Building consistency was not just about meeting a daily coding quota; it was a holistic approach that considered time management, resource diversity, community engagement, and adaptability. These elements collectively formed the framework for a successful and rewarding 100DaysOfCode journey.


Community Engagement

  • Consistent daily updates on Twitter (X) using the #100DaysOfCode hashtag played a crucial role in fostering accountability, connecting with a global coding community, and documenting my coding journey, turning social media into a platform for shared learning and encouragement.

  • Regular GitHub contributions not only showcased my evolving skills through a visual timeline but also served as a personal portfolio, demonstrating coding proficiency and collaboration in open-source projects, thus enhancing my credibility as a developer.

  • Utilizing Discord for real-time guidance provided immediate solutions to coding challenges, while engagement in discussions and project showcases facilitated constructive feedback and exposure to diverse coding perspectives, emphasizing the importance of collaborative learning.

  • Sharing solutions to LeetCode challenges on both Discord and GitHub not only demonstrated problem-solving skills but also allowed me to actively participate in coding discussions, expanding my understanding of optimal strategies and enriching my problem-solving toolkit.

This multifaceted community engagement strategy, spanning Twitter (X), GitHub, Discord, and LeetCode, proved essential in transforming the 100DaysOfCode challenge into a dynamic and collaborative experience. It went beyond personal progress documentation, creating a supportive network and fostering shared enthusiasm for coding.


Issues Faced

  • Juggling full-time work, personal commitments, and the 100DaysOfCode challenge required careful planning and adaptability to establish a consistent coding schedule.

  • Intense daily coding sessions, particularly during challenging project phases, led to burnout and mental fatigue. Implementing breaks, relaxation techniques, and adjusting the daily workload helped mitigate these issues.

  • Engaging with the coding community triggered impostor syndrome, especially when comparing progress with others. Recognizing this mindset and refocusing on personal goals played a crucial role in overcoming self-doubt.

  • Long challenges led to monotony and plateaus in motivation. Implementing variety in coding tasks, exploring new projects, and occasionally participating in coding events helped reignite enthusiasm.

  • External factors, such as family emergencies or unexpected work demands, disrupted the daily coding routine. Developing contingency plans and the ability to adapt became crucial in mitigating these disruptions.

  • The abundance of coding resources sometimes led to decision paralysis. Selecting high-quality, relevant resources became crucial to avoid information overload and maintain a focused learning path.


Benefits & Impact

  • Consistent daily coding sessions led to quantifiable progress, including faster problem-solving, efficient coding practices, and proficiency in various languages and frameworks.

  • GitHub contributions created a visible portfolio, showcasing growth and proficiency, demonstrating adaptability and skills in diverse areas of web development.

  • Active participation on Twitter (formerly known as X) and GitHub garnered recognition, evident through likes & retweets, providing motivation and a sense of accomplishment.

  • Discord channels provided real-time problem resolution, with engagement from experienced developers and mentors offering insights and valuable advice.

  • Regular participation in LeetCode challenges honed problem-solving skills and exposed diverse coding approaches, influencing real-world problem-solving strategies.

  • Active participation in Discord project showcases offered constructive feedback, alternative perspectives, and collaborative learning experiences, refining coding practices.

  • Public sharing of code snippets and project updates on social media contributed to increased confidence, with positive feedback reinforcing a sense of achievement.

The combination of daily Twitter updates, GitHub contributions, Discord engagement, and LeetCode challenges created a multifaceted learning experience, extending beyond technical skills to include community interaction, collaboration, and shared passion for coding.


After the Challenge

The 100DaysOfCode challenge fueled a substantial transformation in my skill set. Originating as a software engineer with proficiency in frontend and backend development, I strategically closed knowledge gaps during the challenge.

I enhanced my grasp of Data Structures, tackling Leetcode problems related to Array, LinkedList, Stack, Queues, and more. Projects evolved into industry-grade solutions, incorporating Java 17/21, Springboot 3, MySQL, Flyway Migration, OpenAPI, React, TypeScript, and Material UI. I explored RBAC system implementation, alongside frontend concepts like React Routing and reusable components.

Diverse topics, including SMPT server concepts & setup, Leetcode String problems, advanced JavaScript concepts, and Python basics for Data Structures and Algorithms, were covered. I revisited fundamental concepts like basic Linux commands and delved into Tree data structures, JavaScript topics like Parcel, Babel, and npm, as well as OOP with C++.

I showcased my skills with a cutting-edge portfolio project using NextJs, Tailwind CSS, Swiper.Js, and Framer motion. Migrating a React app from CRA to Vite and hands-on experience with AWS services (IAM, EC2, S3, ELB, ALB, ECR, ECS, EKS, RDS, AWS Amplify) marked key milestones. Deployments on AWS platforms, Netlify, Vercel, Render, and Docker/Docker Compose for containerization added to the journey.

This expertise significantly elevated my role as a developer, paving the way for continued growth in the dynamic technology landscape.


Resources


Conclusion

As the 100DaysOfCode challenge concludes, it leaves behind a trail of accomplishments and a profound sense of achievement. This coding odyssey, though challenging, was undeniably transformative.

Reflecting on these past hundred days, I'm reminded of the power of consistency and the incremental nature of learning. Beyond the syntax and frameworks, this journey strengthened my technical skills and instilled in me a sense of discipline and continuous learning.

Through the ups and downs, I've gained proficiency in various technologies and become part of a supportive coding community. The camaraderie with fellow learners added an invaluable layer to this experience, emphasizing that the journey is as important as the destination.

As this chapter concludes, I look forward to the next set of challenges and opportunities for growth. The 100DaysOfCode challenge was not just a commitment to code—it was a commitment to self-discovery and a reminder that learning is a lifelong journey.

To anyone considering a similar challenge, embrace the challenges, celebrate the victories, and, most importantly, enjoy the process. Happy coding!