Friday, July 14, 2017

The Technical Estimation Paradox

Face it, we've all been're asked for an "estimate" that you KNOW you're going to be held to, but there are a hundred variables you have no way to control. The client is sitting at the other end of the table tapping their fingers and you think to yourself either: #1 "they don't understand, it's unreasonable, I don't have enough information", or #2 "Hmmmm, how much do I think based on my current information it might take?".

At the end of the day, neither of those matter beyond the psychological value they have for yourself...the real question that matters is "how much is it worth to them for you to deliver this?". Yes, if you're billing time and materials, there are practical problems: If you estimate too low, your client is going to be disappointed that you couldn't deliver in the agreed to cost/time...if you estimate too high, you client might be happy, but often they also think that you cut some corners (especially if you were the "middle of the road" estimate). On the flip side, if it's a "fixed bid", if you estimate too low, your margins are going to dwindle and you could possibly lose money and if you estimate too high you may end up in an ethical dilemma where you are making 99% margin (which is arguably good or bad, depending on your perspective). But at the end of the day, as a consumer of services, you should be happy if you get the contractually agreed to qualities you care about (without assumptions) for the agreed to amount (or less), and as a service provider, you should be happy to deliver at the agreed upon price (or less) with the agreed upon qualities (or more).

Wednesday, July 12, 2017

Software Architectural Decision Making

A common question I get asked is "How do I make architectural decisions?" and my standard answer is "it depends". While it's a tongue in cheek answer, there is a bit of truth to it. While there are frameworks and methodologies to try and reign this problem in, the reality is that the practice of "software architecture" is inherently a mess and certainly a wicked problem. That having been said, I'll give some insight into "how I do it".

First off, let me say, often many "decisions" are predetermined by your primary objective or have such a strong force behind them that there is little value in contemplating alternative solutions. A good example would be "which programming language should I use to develop an Android application?". You really have one decision and it's pretty binary: "Do I use java or javascript?" Yes, from a technical perspective it's possible to use ANY programming language (either through cross compiling or using a runtime interpreter), but if your primary goal is to release an application that allows a user to "do something on their phone" agonizing over every possible option is a HUGE waste of time. On the other hand, if your primary goal is to illustrate how to write applications using ruby to be run on an android device, the decision is preordained (and frankly not really a decision). Moreover, in the latter case, the decision switches from "which language should I use?" to "what approach should I use for running ruby applications on android?".

In the former case above, suppose our primary objective is to write an application that allows users to track their workouts on their phone. In that case, the "language" you use is relevant, but only as a secondary concern. Some questions you have to now concern yourself with are "how many people know java versus javascript?" or "will I want to ultimately release the application in both iOS and Android?". Additionally, you have to concern yourself with "are javascript developers cheaper/faster or java developers?" and "which approach is easier to test and debug?".

However, in the latter case, some questions are: "do I want to highlight using ruby's dynamic nature?" or "illustrate how Ruby can lead to higher quality code?" or something else like "do I want to illustrate how rapidly Ruby applications on android can be developer relative to java?". This also opens up another can of worms you need to consider, such are "is the pool of developers for Ruby such that developing in that language is even VIABLE?".

As we can see, the number of considerations grows at an exponential rate and is extremely sensitive to initial conditions (i.e. what is the primary problem). If you change the "primary problem" entire swaths of decisions are irrelevant (why worry about javascript if your objective is to write things in ruby?). This problem is what makes architectural decision making particularly pernicious and I would contend mean it exhibits fractal characteristics of a nonlinear system. This is also why no one has yet come up with a comprehensive "system" for making these decisions. While many lay claim to methodologies and approaches (take a look at what IBM has to say about it, the fact is it is an extremely difficult problem to reason about.

My best advice is this: Architecture is like software meteorology, you can't predict the future, but you CAN some up with general models that work for defined scopes. What does this mean? Simply that trying to define software architecture is like trying to define what the weather is for the entire globe. The fact is, "it doesn't matter" if your primary objective is to determine if you want to go to the pool or not. All that really matters is the local weather and your preference for the kind of weather you like to go to the pool in. Moreover, you don't need to necessarily explain "why you chose to go to beach instead of a pool" because you realized your original desire was "to go swimming" and limiting your option to a pool might have been a mistake (for other reasons). Put another way, "software architecture is understanding what's important" and "making important decisions", that art is learning how to figure out what is important, the science is too complicated to think about.

Friday, May 12, 2017

An open letter to Trump supporters (warning, bad words)

This letter is for all my friends, family, acquaintances, and others who feel they must support everything Donald J. Trump says without questioning it. I want to "tell it like it is". Before I get into details, I want to share some background. I was born and raised in Michigan, My Dad was a Fireman, Mechanic, Plumber, Heavy Equipment Operator, Cement Contractor, SeaBee...and probably 30 other things I don't know about...My Mom was, (aside from a homemaker that seems to be, even now, able to keep a house tidy and kids(and grand kids...and when we can get our grandkid out there...I'm sure GREAT-grandkids... able to not kill each other or completely destroy a domicile) additionally a jewelry salesperson, telemarketer, police dispatcher (or something like that), collections agent...and also...probably a bunch of other things I don't even know/remember. I personally have been a stock clerk, retail checkout clerk, telemarketer (last two my Mom wrangled for me), general laborer (working with my dad on his 'side projects' doing cement work and cutting well as VERY brief stints hauling block and pitching bales), Personnel Information Systems Specialist/Fitness Trainer/Training Supervisor/Systems Administrator (all courtesy of the US Army), Risk Management Software Engineer, and Software Architect (I think I got MOST of them...there might be a few more).

Here's the thing, Donald Trump is nothing like me, I see him as a vain, privileged, and arrogant Narcissist who gives zero shits about people like me, let alone folks who are much worse off. Yes, "talks the talk", but he doesn't "walk the walk". He didn't "do his time" and "make something of himself", he just got a bunch of money from his daddy and futzed around. Do I hate him for that? Hell no, good for him! but do I think he's an asshat for manipulating folks who have 'better things to do' and convincing them that he's 'their guy'?

Listen, everyone's entitled to their opinion...I'm totally OK with that...but if you're a veteran, do you really want a guy who claims his sexual escapades in college are equitable to John McCain's experiences as a prisoner of war? If you REALLY think that, email me...I'll talk to my uncle (who pulled McCain out of his plane on the Forestal and has all the plates, screws, substance abuse, and mental problems to show for it)..we'll see if we can set up a conversation where you guys can get together and rap at length about how awesome he is. Heck I don't even know said uncle's political predilections...I suspect he's also a Trump supporter, so you might hit it off. Be sure to mention how my uncle wasn't really a very good sailor because he couldn't stop the magazine from exploding though...because... you know a good sailor (like if Trump had ever served) would have avoided that problem.

For folks who work hard and succeed.. Let me ask you, do you think you could have done better with a one million dollar loan? I mean, shit, aside from sports figures who piss their money away on gold plated doorknobs, who the hell COULDN'T succeed with that sort of "minor help"? For folks who've started with "fuck-all nothing" in their pockets (and I'm including Donald Trump's father in this group, that guy started with nothing), his claims should be INFURIATING...he's essentially claimed that bringing a gun to a knife fight is a "fair fight" and he's a better "knife fighter" because he brought a gun.

For folks you are marginalized...if you voted for Donald Trump...WTF were you thinking? I mean, seriously...this cat has had every benefit of every bias in the system and you vote for him? My friends, please let's talk. Just because he's rich doesn't mean somehow he's going to change the country to help you so you can also be rich. The only thing working against him is the media, and he can't even handle THEIR criticism...Jeesus H. Christ, you ran for president and are offended by what the media writes? You really didn't think this through dude did you?

For folks who are afraid of "Radical Islamic Terrorists". Quick question: How many have you met? I've never met one, they seem as rare as Siberian Tigers to me. Of course if you believe the narrative that Donald Trump and a lot of folks that feed him (patently false) information, every street corner in America has packs of violent Jihadist waving AK-47s. That is not reality, it will never be reality, "buying into" the fear that this might happen is just a way for King Trump to illustrate why you "need him".

My final points: Donald Trump promised to "make America great again" without explaining what is wrong with America. I struggle to understand how "building a wall" or "trumping Hillary" or any of the other silly (my opinion, I get one too) "plans" are going to make America great. Maybe some more Americans will be employed building a wall, so that could be a plus, but other than that, all I see him doing is running around spreading rumors and redistributing false information to scare people into trusting him against "the bad people". Trump supporters should be writing the White House telling this man that "hey I didn't hire you to run around spreading gossip...and yes, you work for US, so man the fuck up and stop spreading gossip like a little bitch, we ALL see through it".

This was originally written a month or so after President Trump was elected and my sentiments still hold true (of not more now than then). In fact I'm more disappointed in the guy NOW than at any point previous because as an (eternal) optimist, I was REALLY hoping we were going to see him turn things around. I think the takeaway is that while he PERSONALLY isn't going to do anything, the fact that he was elected at all is a big enough catalyst (especially after our first black president and first "close race" with a woman) to cause lethargic stalemate we've had in presidential elections to disintegrate in the next election cycle. In a way, Donald Trump has accomplished more to "bring down the rigged system" than Bernie Sanders (who I greatly admire) has. Yes, he's a crappy president and we're going to have to deal with the shit show that is his presidency, but in a way, "it's a good thing".

Tuesday, February 14, 2017

Yet Another Take On Software Developer Archetypes

If you search for Software Developer Archetypes you'll find a large number of perspectives on this ranging from serious and helpful to lighthearted to frankly...kinda mean. I'm going to give a lighthearted example of core Archetypes I find when dealing with software developers.

The Squirrel

These developers are happy to jump between frameworks, languages, design patterns willy nilly and will be running 1000 miles per hour toward a "Haskell event processing framework to render static HTML files" and after 3 weeks/months, suddenly pivot, turn 135 degrees, and implement the remaining 10% (which will only take a couple days) in Ruby on Rails. By the end of a project, there are so many frameworks, dead ends, and partially done solutions that no matter what the original design was...their immediate solution for all problems is to "rewrite it in...something else".

The Sloth

These are almost diametrically opposed to squirrels, they often know "one thing" (though not always), but the defining feature is that it takes 3 weeks to implement "Hello World" in a language explicitly designed to produce "Hello World" apps. You can immediately spot these folks because the "remaining estimate" tends to either stay at "two weeks" (or some other random time amount), or you have to pad their estimates by the factorial of their original one.

The One Trick Pony

These developers are a middle ground in velocity and direction change between the first two, but are characterized by always having a "go to solution". If they're a "java developer"...coding something in Groovy will "blow their mind" and they'll insist this new arcane "dynamic mumbo jumbo" is completely useless. They are often religious defenders of "their way of doing things" and often have "any thing you can do in 'A' I can do (maybe better, maybe not) in 'B'".

The Duck Billed Platapus

While interesting creatures, these developers are easily spotted when you look at their code and you spend most of the time scratching your head thinking "WTF?". They are often adept at stringing together inappropriate design patterns and tools to produce solutions that just don't make sense from any reasonable perspective. At the end of the day, their code may "work", but it is a nonsensical assortment of odd parts glued together seemingly ad-hoc.