Hello! Once again, I’m feeling pretty excited to be doing some actual free-form writing on the blog. As best I can tell, I typically write an average of about 1,500 words per day. And since many of those no longer go toward my (now draft complete) book, they can go toward other things. For instance, sharing my thoughts on organizational mediocrity.
Over time, I’ve observed a growing list of organizations in action. Usually, these heavily involve tech, or else I wouldn’t get a phone call. But the actual purpose, shape and size of these places varies considerably.
All organizations tend to share some common ground, however. For instance, at any kind of scale, they tend to form themselves into pyramids. They also tend to make rules targeting their lowest common denominator. But today I’d like to focus on a different, subtler commonality.
Organizations trend toward mediocrity by valuing apparently beneficial behaviors. I’ll chalk these behaviors up as locally maximizing; they make tactical sense and create strategic messes. Companies and society both value them in individuals. But, counter-intuitively, encouraging them in your organization paves the road to hell with good intentions.
Today, I’m going to try to tie various strands of my life together into one lanyard of efficiency. I haven’t done a reader question for a while, so I’ll change that today. In this post, I’ll offer a terminology nod to dead seas, a now-defunct term that became one of my favorites. The best context I can now offer lies here, in a post of mine, summarizing it.
How can I tell if the company interviewing me has a “Bill?” (i.e. “How can I preemptively identify expert beginners?”)
Well, I’ll take a crack at that.
Expert Beginner Primordial Soup
I think that a meaningful examination of this question requires us to look at the conditions that give rise to such archetypes. In the original series/book, I cover part of it. The organization must draw sort of a neat little box around the techie group and then put an advanced beginner in charge. From there, the concoction needs to simmer in a nicely insular environment, in which the budding expert beginner receives no real negative feedback, second guessing, or industry exposure.
But this assessment focuses entirely on the software development organization. An ensconced expert beginner reigning over some miserable, backward fiefdom requires “the business” as an accomplice. Simply put, it requires the operational laziness to allow your business to be ruled by an unaccountable “expert” operating with utter opacity.
Expert Beginner Hut
Imagine you started a pizza shop and hired a pizza chef to run the kitchen. Then imagine that you completely delegated the cooking to the chef, as you should. Life treats all of you well for a while and you develop some business.
But now complaints from customers start to come in about the taste and presentation of the pizza. “My pizza was incredibly salty and all of the pepperoni was isolated to three slices!” When you bring this problem to the chef, he tells you that such is life when it comes to making pizza—and, also, get out of the kitchen. You don’t taste the pizzas coming out or look at them or launch any sort of investigation when his pizza chef assistants serially quit, muttering about his incompetence. You just count the inbound trickles of revenue and assume that’s as good as it gets.
I won’t be doing the regularly scheduled Thursday night/Friday morning post this week.
For those of you not in the US, today is the national holiday Thanksgiving for us. To those of you in the US, happy Thanksgiving! To celebrate, please enjoy this drawing of a turkey. The turkey was almost the national bird of the US, but we ate it and chose the eagle instead.
Prompted by comments from a few people, I’ve decided to see if I like using Trello for keeping track of the TODOs instead of Excel. Also, learning from past feedback, I’ve defaulted Trello to being really big when recording so everything is legible, and I copied everything over from Excel. Hopefully I like it as I go, but please let me know if it’s more pleasing to view as compared with the Excel spreadsheet, if it matters to you one way or the other.
Also, a meta-note. I apologize for the time between posts in the series and for the lack of posting in general, but I’ve been traveling nonstop and am pretty much living out of hotels, meaning my life is one of 3G-ish wifi and sub-optimal setups. Luckily, I’m driving everywhere and lugging my boom mic, desktop and monitors with me so I can still record in the hotel. 🙂
Here’s what I accomplish in this clip:
Make the “blocked” algorithm for horizontal/vertical less dumb.
Start the implementation for “blocked” diagonal.
Inadvertently create a potential solution for the problem of knight’s oddball movement.
Here are lessons to take away:
Even little things matter when it comes to readability. For instance, at 0:40 I noticed that my test class name ended in should but the methods started with “returns.” So, I took the time to fix this. My advice is to get in the habit of avoiding sloppiness and inattention to detail at any level of code.
Bear in mind that changing prod code is fine while green in TDD, provided you’re not looking to introduce new behaviors. It’s a refactoring if your goal is continue satisfying existing test cases in a different way.
A little before 10:00, I refactored a bit of a test while red for the sake of readability. I shouldn’t have. My bad. Lesson is, no matter how much TDD you do, sometimes you flub it.
Sometimes a great way to get things passing when the implementation is getting hairy is to tease out a conditional that only applies to your new case and do something obtuse. Use with discretion because it can lead you into blind alleys and cause problems, but there are times when getting to green can provide an aha! moment.
You’ll notice I refactored to a different method signature, changed some stuff around, and then refactored back. This kind of waffling is fine. With TDD, you’ll get used to fearlessly refactoring and slinging stuff around until you settle on something you like (or at least thing is the least bad, for now).
Get it working ugly now, make it pretty later. It’s sometimes amazing how an algorithm will suddenly make itself obvious after a bit of brute forcing and futzing around.
Alright, welcome to the inaugural video post from my blog. Due to several requests over twitter, comments, etc, I decided to use my Pluralsight recording setup to record myself actually coding for this series instead of just posting a lot of snippets of code. It was actually a good bit of fun and sort of surreal to do. I just coded for the series as I normally would, except that I turned the screen capture on while I was coding. A few days later, I watched the video and recorded narration for it as I watched it, which is why you’ll hear me sometimes struggling to recall exactly what I did.
The Pluraslight recordings are obviously a lot more polished — I tend to script those out to varying degrees and re-record until I have pretty good takes. This was a different animal; I just watched myself code and kind of narrated what I was doing, pauses, stupid mistakes, and all. My goal is that it will feel like we’re pair programming with me driving and explaining as I go: informal, conversational, etc.
Here’s what I accomplish in this particular video, not necessarily in order:
Eliminated magic numbers in Board class.
Got rid of x coordinate/y coordinate arguments in favor of an immutable type called BoardCoordinate.
Cleaned up a unit test with two asserts.
Got rid of the ‘cheating’ approach of returning a tuple of int, int.
Made the GetPossibleMoves method return an enumeration of moves instead of a single move.
And, here are some lessons to take away from this, both instructional from me and by watching me make mistakes:
Passing the same primitive/value types around your code everywhere (e.g. xCoordinate, yCoordinate) is a code smell called “primitive obsession” and it often indicates that you have something that should be a type in your domain. Don’t let this infect your code.
You can’t initialize properties in a non-default constructor (I looked up the whys and wherefores here after not remembering exactly why while recording audio and video).
Having lots of value type parameter and return values instead of domain concepts leads to constant small confusions that add up to lots of wasted time. Eliminate these as early in your design as possible to minimize this.
Sometimes you’ll create a failing test and then try something to make it pass that doesn’t work. This indicates that you’re not clear on what’s going on with the code, and it’s good that you’re following TDD so you catch your confusion as early as possible.
If you write some code to get a red test to pass, and it doesn’t work, and then you discover the problem was with your test rather than the production code, don’t leave the changes you made to the production code in there, even if the test is green. That code wasn’t necessary, and you should never have so much as a single line of code in your code base that you didn’t put in for reasons you can clearly explain. “Meh, it’s green, so whatever” is unacceptable. At every moment you should know exactly why your tests are red if they’re red, green if they’re green, or not compiling if the code doesn’t compile. If you’ve written code that you don’t understand, research it or delete it.
No matter how long you’ve been doing this, you’re still going to do dumb things. Accept it, and optimize your process to minimize the amount of wasted time your mistakes cause (TDD is an excellent way to do this).
So, here’s the video. Enjoy!
A couple of housekeeping notes. First, you should watch the video in full screen, 1080p, ideally (click the little “gear” icon between “CC” and “YouTube” at the bottom of the video screen . 720 will work but may be a touch blurry. Lower resolutions and you won’t see what’s going on. Second, if there’s interest, I can keep the source for this on github as I work on it. The videos will lag behind the source though (for instance, I’ve already done the coding for part 3 in the series — just not the audio or the post, yet). Drop me a comment or tweet at me or something if you’d like to see the code as it emerges also — adding it to github isn’t exactly difficult, but I won’t bother unless there’s interest.