Inverted Debugging

Forget the Docs, There’s Gold in Them Thar Code

We exist in a reality where, at best, documentation lives on the periphery, can’t be trusted, or even worse: non-existent. The development community has done a great job of banding together to help each other solve the many problems we face, but finding that perfect Stack Overflow post may not ever surface. Relying on the world to help you solve your problem is not a long term solution, so break those habits and trust in yourself as I attempt to show you the light that I call Inverted Debugging – the process of using code, not documentation to solve your development problems

Inverted Debugging Forged by Decades of Fire and Source Code

Look back on your development journey, think about how often you are faced with an error message and a stacktace – how much of your precious time has spent digging through google results, reading documentation, posting on forums, calling up your developer buddies only to feel defeated; I wouldn’t be surprised if I’ve spent an entire year of my life hoping the world will unblock my work. Ask yourself:

Why did I put my trust on anonymous internet dwellers over my own abilities?

I am not a better developer than you, no matter what you think reading my words or looking through my work; I simply have spent over 20 years getting beat down, frustrated, and defeated – eventually had had enough of it. The world wasn’t going to change, but I can. What was in my control was how I approached problem solving holistically: documentation is abstracting function into words, code on the other hand is concrete, logical. Through Inverted Debugging, you will have a greater understanding of frameworks, design patterns and appreciation in yourself.

RTFL: Read the Fucking Logs

An error is thrown and your first instinct is it’s a grenade – fight or flight. Why? That error is trying to communicate with you! Fight the frustration instinct, take a breath and read the logs, the message, the stack trace; take it in and look for a pattern, look for key code points, examine the call stack. You were just gifted the map to buried treasure! It’s possible the answer is right there on the screen, but more often than not you are about to grab a shovel and start digging.

Yes It Must Be Said…

Check dependency versions, perhaps a breaking change was introduced via an unpinned library. It is a quick was to rule out the obvious.

Embrace Your New Code Archeological Role

When unearthing your problem, you don’t want to miss the root by digging too fast, too deep, or impatient. Work backwards through the stack trace, examine the logic – think about edge cases, or missing checks.

Once you start to understand the code beneath your code, you become exposed to examples of good architectural patterns, or patterns to avoid. Almost second nature, you stop seeing languages – it becomes a small refresher on language syntax before you’re on your way.

And as Always…

You are not an imposter, in fact the goal is to elevate.

Pro Tip: Frustration-Free Cable Organization Tips

Vocation, hobby, consumer – chances are you will amass a collection of cables for the technology in your life. I finally had enough with the ever-evolving disorganized, tangled mess. Here’s my Cable Organization Life Pro Tip to optimize storage space, as well as the level of effort needed to locate the cable you need, when you need it.

Do you, like us, have amassed piles, upon piles of cables, desperately needing some cable organization?

Inspiration: Document Filing Systems

Used by essentially every business and organization, and the majority of people, document filing systems are a great system for storing, locating, and referencing. Being able to locate and store all those cables with the same efficiency sure would be nice; however, those cords and cables don’t stack neatly like paper. Never one to accept defeat when pursuing my vision, I altered how I perceived a cord’s shape. A 3-dimensional rectangular prism with a near-zero depth, essentially a 2-dimensional rectangle allows Paper to stack neatly; on the other hand, cables, primitively speaking, are 3-dimensional cylinders. If cables could be encapsulated in a rectangular prism, they would be stackable. So, how do we efficiently, and cheaply, make our cables rectangular prisms?

Card-Backed Storage Bags, That’s How

Quart-sized storage bags are pretty much the optimal size for almost any cable, simply coil the cord and place it in the bag – no cable straps required. A 5″x8″ index card not only fits perfectly, preventing the bag from coiling over but also fulfills the need for labels in your filing system. By adding some deep, expanding hanging file folders allows for easy categorization and space-efficient storage in a filing box or crate.

6' Heavy Duty HDMI Cable
6′ Heavy Duty HDMI Cable
4ft 3.5mm Audio Aux Cable
4ft 3.5mm Audio Aux Cable
Finger through your cables to find the exact cable, easily every time
Orangizasm!
Fingering through my optimized cable organization - efficient laziness for the win!
The first cable organization box – many more to come

Cable Organization Box Supplies

This way to Quality Standards

Silo’d: The Quality Standards Blackhole

To be good at what you do, you have to have unquantifiable criteria you hold yourself to – which is undeniably susceptible to the weathering effects of prolonged and repeated, exposure to minor rationalizations.

Follow me to Quality Standards

Good Engineers Hold Themselves to A Standard

We want to believe ourselves to be good at the things we do and to believe that, we have to compare ourselves to a standard of measure. The standards I have developed, refined, and believe in always revolved around maintainability, consistency, portability, scalability, flexibility, testability, and reliability – you cannot provide a true, accurate, and meaningful measure and are thus, by definition, qualitative in nature. All of my work, personal or professional, needed to implement testing frameworks, allow for easy reconfiguration, facilitate obvious future feature work and avoid stale documentation through self-documenting code.

These metrics were very clear and concrete in my mind, but perception is not always reality. I readily pick up new concepts and technologies – some due to personal interest, many due to professional necessity – but how can you measure that which you haven’t fully adopted? “I’ll learn how to test my Ansible after I get the hang of it”: there goes reliability, “AoC would greatly improve this project that doesn’t natively support it”: now maintainability means Teagan fixes it, “I’ll just use the Redfish API to get system health checks”: bye, bye scalability. These seemed like justified rationale, but the standards I cherish, damaged through rationalities, were no match for the complete lack of feedback that permeates silo’d work.

Better Engineers Hold Others to A Standard

As a self-proclaimed “PR Tyrant” (pull request for the uninitiated), working with a team of talented engineers gave me a lot of satisfaction. It was understood that when you submitted a pull request that you were requesting it be held to the level of quality of all who reviewed it, that you address those concerns before your work is accepted into the project, and what happens in a pull request does not reflect on you the person – and if you can provide a logical and well-formed argument that contradicted my concern, I was open to listen and discuss with an open mind.

I approached every review with my “Definition of “Done” – every comment and concern related directly to one of the items in my checks list:

  • Is the documentation updated and understandable? – Maintainability
  • Does it run in my environment? – Portability
  • Are there meaningful, effective tests that capture positive, negative, and edge cases? – Reliability
  • Can I discern the author from the code? – Consistency
  • Does every component have a purpose and perform that purpose efficiently? – Testability
  • Are dependencies provided or created on-demand? – Flexibility
  • Can the work react to changes in the environment appropriately? – Scalability

Each and every comment and concern received a tagged “severity level” (blocking, non-blocking, suggestion, opinion) and an explanation for the PR comment. Having their own set of criteria and priorities, the other members of my team pushed me to improve. We always tried to have an open mind if the author or reviewer could back up their stance with logic and reason, that was enough to remove or reduce the “severity level”. This process helped everyone learn new architectures, patterns, consider edge cases, and work as a team. We were all held to a level of quality that, usually, reinforced our personal standards; I like to believe these people and this project thrived because of everyone’s willingness to listen, explain and understand each other.

That is until an opportunity I believed to be the “perfect” fit was floated to me. Working with a Home Automation and Applied AI team seemed to fit in with my personal interests and hobbies so well, I just could not pass it up. After about 18 months of working essentially alone, having to beg for code reviews, and never seem to be on the same page with my manager, I couldn’t take it. I had lost sight of my own level of quality due to working with technologies and frameworks I had not used before, utilizing cloud infrastructure that seemed to be intentionally convoluted and hard to understand – but hey, the projects I built worked and were immediately assigned another. I lost that feedback loop, someone holding me accountable to my or their standards, and I barely noticed. The job they promised me never manifested, and a ridiculous pattern of misunderstandings on the scope of work, requirements, tasks – I left, and while I still believed I held myself to my standards – to find out they were mere shadows of the former selves.

The Best Are Always Improving Their Standards

I have known Alan for 5 years, and the whole time knew I wanted to work for World Wide Technology – It was blatantly obvious they truly trusted and invested in the people in their employ, every person I met who worked with World Wide Technology spoke highly of the company, loved their jobs, crazy smart and great people. After a 3 month-long interview process – yes, this seems extreme, but this just shows that they truly want to make sure it’s a good fit both ways and the investment is mutual between the prospective employee and company. The interview process was, without a doubt, the best interview experience I have ever had. They provided a person I’d be working with upon hire to be there throughout the process and each interview was followed up with positive feedback and constructive feedback – which I took to heart, and they noticed the work I put in to address the areas I could improve. My first week was not your normal orientation, it was your indoctrination into working in a truly Agile environment. The terms Agile and DevOps are thrown around a lot in the technology industry but they are not just buzzwords, just ideas, not just practice – they are a cult-like life philosophy, driven by often and fast feedback to improve and I willingly drank that Kool-Aid.

For example: when you’re assigned a project, your team has full autonomy – you decide work schedule, communication methods, distribution of work, and how internal issues are resolved. Every team is different, so how one team works doesn’t mean that process would be successful in another team, by providing trust and autonomy you feel empowered, valued, and respected; in the end, your team is more efficient and happy.

After 2 years of letting myself chip away at my standards, I almost felt ashamed to submit code for review – a feeling I hadn’t felt since the inception of my career. Each comment and concern I received was perfectly in line with my original level of quality – logical, reasonable, and well-articulated – I couldn’t wait to implement the fixes, test, discuss and repeat. That feeling of raising the bar, that you let drop over the years, raises your perception of your work equally high.

However, this doesn’t make us the best engineers we can be. To be the best version of ourselves, we have to live the philosophy that is Agile/DevOps – that is, how do we bring our standards to a higher, more improved state? Feedback! We set up weekly sessions to talk about our work, how we can improve, when is it ok let slide, when is it not. These sessions aren’t just talking, we take them and implement them – and sometimes they don’t work, and try new ideas until it works – and we repeat. It’s not always about the quality of our work, but how to communicate better, how to mentor better, how to Life better.

Drink the Kool-Aide, find your feedback loop, and get that feedback fast and often, listen to the feedback. Change is hard, but growing spiritually, professionally, personally is far more rewarding than your fear of failure. Failure is nothing more than an indicator to try different, not harder. You can be a better you – and you are the only one who can define a better you, raise your quality standards, and see where it takes you!

Happy Fishes through Nature Automation

Nature Automation: Life’s Built-In Automation Engine

Humans have been bending nature to their whim since the dawn of civilization, and it is a full-time job for many keeping nature out of the way. Alan and I learned this firsthand over the course of the last year and wish to share the lessons we learned with others: trust Nature Automation and your aquatic pets will thank you.

A Cautionary Tale: Fighting Against Nature Automation

Admiral Shiny Sides and the His First Mate Tank

Admiral Shiny Side, sadly, passed away in the heat of battle during his 5th deployment after 16 years of loyal service; posthumously promoted to Fleet Admiral Shiny Sides. His first mate, Tank, failed to lead with the same authority and followed Admiral Shiny Sides not long after. Ensign Alan fought the lonely and uphill battle of maintaining the ship since its inception: swabbing the poop rocks, manning the main filters, and keeping the mess hall fully stocked.

Tank was assigned three new recruits upon the passing of Fleet Admiral Shiny Sides. Morale amongst the crew never recovered, even while the valiant Ensign Alan took on the task of making the long journey at sea as comfortable as possible. In the end, the effort to uphold the same standards proved fruitless. One by one they succumbed to the siren’s seductive song.

They will be missed.

If you’re confused, that’s understandable; Admiral Shiny Sides and his first mate were Alan’s goldfish for 16 years, which I, for one, had no idea they could live such long and fulfilling lives. Moving in marked their 5th home move, and it was just too much for these intrepid sailors – and nearly triggered the retirement of the battle-hardened S.S. Aquarium.

The Road to Recovery is Long and Hard

Taking care of fish can be a lot of work: vacuuming the waste, replacing filters, cleaning out algae, addressing illness, and feeding. The aquarium was always Alan’s project, and provided a very clear indication of his general mood; when stressed or overburdened, the aquarium maintenance would be put on hold and only further the level of stress he experienced. The loss of our fish was conflicting, we loved our pets but the effort to maintain the equilibrium violated the prime directive of laziness that permeates our existence.

We decided to start over. After lots of research, we drained the aquarium, replaced the gravel, and focused on keeping some aquarium plants alive before we put any more naval recruits in mortal danger. After 2 months, our plants were thriving and it was time to assign a new crew to the S.S. Aquarium – this time, we sought expert advice from the employees of Aquamart. One of their friendly staff taught us how to use the ecosystem through bio-filters and the right blend of aquatic species to be introduced slowly to implement nature automation.

The road to recovery is far from a linear journey. We did lose a few recruits along the way, but such is life – there’s no guarantee any of us, animals included, will live long and healthy lives. These losses were very hard for us animal lovers, but we know we did our best. The first live fish we introduced were a few Corydoras, these are small, bottom-feeder, freshwater catfish – unfortunately for them, the tank was not quite as stable as we thought, and we ended up losing all three of them. Their loss was not in vain. Researching their symptoms and what solutions were available, we switched to SeaChem for, essentially, all of our aquarium treatments. We have suffered other losses, but only to those fish we ordered online and perished in transport.

Our aquarium is a thriving ecosystem now, requiring only basic maintenance. Gone are the evenings dedicated to 3-4 hours of tending to the aquarium. We devote around 20 minutes every few weeks to replenishing water that has evaporated and rinsing off the bio-filters. We do add some chemicals every so often: plant food, liquid CO2, stress-reducers – but we do so while we are admiring our beautiful fish. Thriving so well, we discovered we accidentally purchased two female guppies when we came home from vacation to around 12 tiny baby fantails that are now starting to show their colors!

Why Did We Succeed Where We Failed Before

Fleet Admiral Shiny Sides, Tank, and their crew were very dirty. Goldfish are prone to polluting their tank with nitrates and ammonia. Choosing the appropriate species helps reduce toxins and waste present in your underwater ecosystem. In addition to reducing the pollutants, these aquarium fish are much more active and colorful, creating living art that we love to admire daily.

Algae are actually bacteria that contain chlorophyll and require many of the same resources that are consumed by plants. Originally we planted plastic and silicone plants in our aquarium; by planting living plants there are little-to-no resources left for algae to consume. Common sense right? Except, it’s not. It’s amazing how many people, including ourselves, are willing to dedicate hours every month cleaning and removing algae from their water-dwelling pets’ homes.

Carbon filters are a complete waste of time and money – bio-filters promote healthy bacteria and reduce harmful bacteria. Sure, carbon filters remove solid waste and help cleanse the water, but fish, like humans, do not live in a hermetically sealed environment. You can purchase a bio-wheel filter from most pet stores, however, we discovered them to be fragile and ineffective. As our helpful Aquamart employee explained, utilizing bio-media rocks to remove ammonia, nitrites, and nitrates from our aquarium, Purigen to promote healthy bacteria, and a little filter media to filter out the solid waste was the most cost-effective and time-efficient solution.

In addition, we installed an under gravel filter, to help keep any particulate matter from clouding the tank. The fish actually love these, swimming through the bubbles to get a little morning swim in before a hard day’s work. Don’t fight it, let nature automation in!

See For Yourself

We are so proud of how far we have come and how beautiful our aquarium is that we wanted to share it with the world. Please feel free to watch the live stream of our aquarium here: https://aquarium.prettybaked.com.

The Current Crew of the S.S. Aquarium

Using Nature Automation, happy aquarium fish swim through a thriving ecosystem.

Fan Tailed Guppies

Neon Blue Guppy: Tropical Fish for Freshwater Aquariums
Blue/Green Fan Tail Guppy
Orange/Red Fan Tail Guppy

Cory Catfish

Bandit Cory
Spotted Cory

Gourami

Opaline Gourami
Marbled Gourami
Dwarf Flame Gourami
Pearl Gourami
Dwarf Sunset Gourami

Sharks

Rainbow Shark

Algae Eaters

Siamese Algae Eater