I saw a tweet the other day that said, “the scariest thing about COVID-19 is that it looks like a JIRA ticket.” That is scary!
Gets you thinking though: What if COVID-19 were a JIRA ticket for a software bug? Can we unearth a lesson or two about how to prevent bugs from sneaking into our haloed code repositories and affecting our users?
Grab a bowl of buttery popcorn because the saga continues! The end of the previous chapter saw our intrepid little Rails app camping happily on Heroku. This latest chapter in the hosting chronicles brings with it a twist: not just a change in host, but a complete migration from one programming language to another.
Onward for the Why’s, How’s, and Gottchas of the switch.
Refactoring is the lifeblood of a nimble codebase, but we need to stop hand-refactoring via Ctrl-C/V and start using our automated refactoring tool. Prepare to be convinced, then watch in amazement as you memorize your favorite refactoring tools’ keyboard shortcuts in two hours flat – and remember them forever.
You need an automated refactoring tool Refactoring without tests is dangerous Refactoring without tests and without an automated tool is like walking a tightrope over Niagara falls without a safety net - with your product and entire team standing on your shoulders.
These days it’s hard to tell whether the computer saves us more time than it wastes. However recently I had an experience programming in Ruby that demonstrated to me that the computer can be our modern time-saving friend, especially when wielding a language like Ruby, delicately designed to just “get out of your way” and let you program. The story involves number crunching, eyebrow scrunching, and in the end, an unabashed brute-force beauty.
In the ring today we have Interface Oriented Programming (IOP) vs Object Oriented Programming (OOP).
What’s the difference?
TL;DR: In my opinion there is no difference. IOP is merely clarifies OOP, a reminder to program to interfaces, not implementations.
Object oriented programming has always been about interfaces. That’s the whole idea. You take a cluster of data, encapsulate it, infuse it with behavior, and it’s ready to interact with other objects as long as they respect the interface’s contract.