Crafting Efficiency: My Journey to Mastering Engineering Tasks Through Planning and Execution.

9/8/2024

 Plugins

I remember the days when I felt swamped by the sheer number of tasks and meetings on my plate. As a software developer, juggling multiple tickets and deadlines was overwhelming. I found myself constantly bouncing between tasks, putting out fires, and barely making progress on what truly mattered. I knew something had to change.

What I needed was a system. A method to bring order to the chaos. Through trial and error, experience, and plenty of mistakes along the way, I’ve developed an approach to handling engineering tasks that has completely changed the way I work. It’s grounded, efficient, and best of all - it works! The mindmap I’ll share below outlines the key elements of my approach. It didn’t come to me overnight but evolved as I found ways to streamline my workflow and focus on what truly matters.

 Plugins

Let’s dive into the process that has made me more organized and productive, from planning to deployment, and beyond.

1. The Planning Phase: Set the Foundation

Before jumping into any task, the most important step is to “really plan”. In the early days, I used to jump into coding the moment a Jira ticket landed on my desk. But I quickly learned that this was a recipe for inefficiency, rework, and missed edge cases. Now, my first instinct is to explore the problem deeply and gather as much information as possible.

Exploration and Information Gathering

When tackling an engineering task, I make sure I understand all aspects of the problem. That means diving into:

  • Product Requirement Documents (PRDs): What are the precise needs of the task? Is it a new feature or a bug fix? This document is my first stop.
  • Sprint Planning Calls: I use these discussions to clarify expectations and gather context from team members. If there are any uncertainties, this is where they get resolved.
  • 1:1 Syncs with Stakeholders: Talking directly with product managers or other stakeholders gives me a clear understanding of priorities, edge cases, and potential hurdles.
  • Custom Planners and Trackers:: Breaking down tasks into chunks and giving the the right estimates ( story points ).
💡

Taking the time to gather all this information upfront saves me hours down the line. It’s much easier to pivot at the beginning than to scramble and rework everything halfway through.

Documentation: Framing the Problem

Once I have a clear understanding, I start writing down the problem and the approach. Why? Because having everything laid out ensures that I’m focused on the right things, helps me in keeping all the stakeholders on the same page and track my thought process. This includes:

  • What are we solving? Every task comes with a problem—whether it's feature devlopment, improving performance, optimizing costs, enhancing security, or making a developer's life easier. I always start by framing the problem clearly.
  • Solutions: Next, I jot down potential solutions, considering everything from the design patterns I might use to performance or security concerns.
  • Impact: Will this change improve a key engineering metric or a product feature? I always tie the work back to tangible benefits.
  • Approvals: Before I dive into development, I always make sure to have the right approvals from stakeholders. This avoids unnecessary rework later.

2. Development: Time to Build

With my plan in place, it’s time to start coding. But coding is not just about writing lines of code. It’s about writing good, maintainable code that will stand the test of time.

Coding with an Eye for the Future ( Open to extentibility and Closed to Modifications )

I always follow a few core principles when writing code:

  • SOLID Principles: These five principles are the backbone of my approach. They ensure my code is easy to maintain, open to extension, and not rigidly tied to one use case. Flexibility is key for future updates. If the existing code is complex and unreadable, I’ll modify the existing code to reduce the complexity.
  • Design Patterns: I’ve found that following established design patterns helps me structure my code in a clean and reusable way. It also makes collaboration easier since these patterns are universally understood in the dev world.
  • Performance: Speed is important, but so is writing code that can scale. I make sure to think about how the system will perform under load. Perform Load testing, stress testing if possible, after the coding phase.
  • Security: With so many high-profile data breaches making headlines, security is non-negotiable. I integrate security measures early to whatever extent I can as a developer, rather than treating it as an afterthought.
  • Monitoring: Keeping an eye on logs and alerts is crucial. I make sure my code integrates well with monitoring tools to catch issues early by settings alerts and meaningfull logs.

Test Cases:

Once the code is written, testing comes next. And not just superficial tests, but comprehensive testing. I aim for 90-100% code coverage because it gives me confidence that my code works as expected, including edge cases.

  • Edge Cases: These are often overlooked, but they can lead to nasty bugs later on. I make sure to cover as many edge cases as possible.
  • 90-100% Code Coverage: Achieving high coverage ensures that most of the logic is being tested.
  • E2E Testing and Integration Testing: This guarantees that the entire system flows as expected, from the front end to the back end.

Self PR Review: Be Your Own Worst Critic

Before submitting a pull request, I always conduct a PR self-review. I take a step back and assess my code, asking questions like: “Is this efficient? Can I optimize this further? Have I covered all scenarios?” Tools like GitHub Copilot and GPT have become invaluable for suggesting improvements I might not have thought of on my own. Whether it’s code optimization or better readability, these tools have become a great way to elevate my work.

3. PR Review and QA: Refining the Work

Once my self-review is complete, it’s time for the team to weigh in. Code reviews are where I get critical feedback from other developers, making sure the work aligns with the team’s standards.

  • Following Code Templates: Having a set of coding guidelines that ensure consistency across the project is a great plus point. This not only improves readability but also makes onboarding new developers easier.
  • Optimization Templates: Having pre-defined optimization patterns that help me refactor my code for better performance.

QA Sign-Off

Finally, the work needs to pass through QA. They’re responsible for verifying that everything functions as expected in the real world. Only after QA gives the green light do I consider the task complete.

4. Deployment: Shipping with Confidence

Once the QA sign-off is done, it’s time to get the work out into the world. CI/CD pipelines are used to automate the deployment process, ensuring it’s seamless and quick.

  • CI (Continuous Integration): It catches main level issues before they reach production.
  • CD (Continuous Deployment): Once the code is integrated, it’s time to deploy. Generally Docker is used for containerization and Kubernetes to manage deployment at scale.
  • Monitoring: Even after deployment, the work isn’t over. I keep a close eye on logs and alerts to make sure everything is running smoothly.

⚠️ 5. Maintaining Trackers and Work Loggers: Accountability and Continuous Improvement

One important layer that I would like to highlight to my workflow is self-tracking. While some might consider it micro-managing, I’ve found that maintaining detailed logs of my day-to-day activities helps me stay on track and improve my efficiency over time. Here’s how I do it:

  • Daily Work Logs: At the end of each day, I jot down what I accomplished and any roadblocks I encountered. This not only helps with retrospectives but also gives me a clear view of how I spent my time. If delays happen, I can quickly trace them back to their root causes.

  • Tracker for Blockers: I maintain a separate log for blockers, where I list issues that halted my progress. During sprint retrospectives, these logs are invaluable. They allow me to analyze common bottlenecks and suggest improvements to avoid similar delays in the future.

🧠

Tracking your daily progress might seem tedious, but it is incredibly helpful for pinpointing where things went wrong or right. Over time, you’ll spot patterns that either boost or hinder your productivity.

Incorporating self-tracking into your workflow isn’t just about identifying problems—it’s about accountability and making sure you’re constantly evolving as an engineer. It’s been a game-changer for me and can be for anyone seeking to improve efficiency.

6. Finishing Notes: Reflecting on the Task

With the task completed and deployed, I like to take a step back and reflect. What went well? What could be improved next time? Were there any unexpected issues?

It’s also important to document any future improvements. Maybe there’s a part of the system that could be optimized further, or a feature we didn’t have time to implement this sprint. Keeping a log of these ideas ensures they don’t get lost and can be revisited in the future.

Conclusion

While this template works for me most of the time, every task is unique. Sometimes, you might spend more time in the exploration phase or skip certain testing steps if the task is simple. The key is knowing what’s important for the specific task at hand and adapting accordingly.

My approach has evolved over the years, but the essence remains the same: thoughtful planning, smart development, and solid execution. It’s not magic, just consistency. If you’re struggling with efficiency, I hope this gives you a solid starting point. Tweak it, make it your own, and see how it works for you.

After all, every engineer has their own journey, but a little structure can go a long way.