Wait Constraints

I was pondering about how to speed up project deliveries, and I realize that often times, no matter how much knowledge I have on the topic, it will still take a fixed amount of time, because certain processes simply involve “waiting”. For example, if you need to restart a server, you need to deploy some code, you need to wait for something to compile, and programs to simply start.

The way to unlimit yourself is roughly let someone else do the waiting, and focus your energy on other things. This constraint is an important one, and if you can bypass this constraint, then accomplish a large project in a much smaller time. It’ll also bring into question what you’re capable of, and what your role in the project truly is.

Project Constraints and Project Selling

There are 3 things you can control about a project, time, resources, and features. Of the three, you at best can control 2.

Which is why I propose for projects to have the following creation and definition flow:

  1. Feature gathering
  2. Resources / Budget constraints
  3. Time / Delivery constraints
  4. Project planning, project options, packaging, pricing
  5. Investigation
  6. Execution

 

  1. We want to under to undergo feature gathering first, because how can you size something with unknown dimensions?
  2. We want to know what are the budgetary constraints to the project, since we limited resources, we’ll have limited options, and we’ll have to live with the consequences of having limited resources.
  3. We want to know when the project needs to be delivered by, often times, if it’s something that needs to be rushed, then over time might be necessary, or perhaps more resources.
  4. This is where we plan the project and price out the project. I think it makes sense to allow the client to control 2 of the 3 factors of project planning. Once we know what the client is willing to give up, then we can go ahead and structure the deal around it. I’m sure with the resource allocation any venture can be profitable.
  5. During this phase we need to figure out exactly what is entailed with the project, and whether or not we can properly take on the project.
  6. During this phase we basically get it done.

This flow seems to make sense to me, if a person knows a better flow, let me know because this is the flow I’ll stick with for now.

Sell Reputation

The Greek philosopher Aristotle divided the means of persuasion, appeals, into three categories–Ethos, Pathos, Logos.┬áToday, we’ll talk about ethos.

When you’re trying to persuade a customer that your product is worth more than another person’s product, you will invoke one of the three. Substantial investment will be made mostly on the logos and ethos front. In modern day-terms, logos will be data, reports, forecasts and etc, whereas ethos will simply be reputation.

I believe perception and reputation is a good form of investment, because if you want to convince your customers that your product is worth more, you’ll have to employ one of those 3 methods. You can logically convince a customer, and they’ll provide you with logical prices.

The key is to focus on the illogical. Beauty is in the eye of the beholder, and your evaluation will be based on what they perceive. Sometimes, it can be lower, sometimes it can be accurate, and sometimes it can be higher. The fact that it can be higher gives you a great opportunity to capitalize on the differential.

You can sell logic, or you can sell reputation, and even empathy. If you had to choose one, I’d think reputation would have the most potential for irrational profits.

Virtual Test Case Definitions vs Real World Expectation Declarations

In my space, there are a lot of parallels between the virtual space and the physical space. When I see a cup, I see a cup class. Then I think how it’s a unique cup, so it’s an extension of the cup class, perhaps, if we were to think about how cups are manufactured, then it’s a cup factory class, and it’s merely an object of that factory. So on.

Before a test is written, there is a clear understanding of what is expected to happen, and the test is considered incomplete until the test passes the assertion. It’s interesting because in the real world, I believe these are simply listing one’s expectations.

As a leader, I think it’s clear to communicate the things you TRULY care about in regards to your company. Just like in test driven development, you don’t care about the how things are defined, or constructed, but there’s a definite end result you care about. Your job as a leader is to communicate that end result. To illustrate this concept and the underlying reactions to such declarations, for example, lets say you said you care about the following things: Conversion rates, sales, traffic, site speed. The people who are responsible for those things might react as follows:

Conversion rates:

  • Examine existing conversion rates
  • Examine which pages convert the best, gather lessons
  • Monitor conversion rates across the site
  • Monitor overall conversion rate performance

Sales:

  • Examine existing sales
  • Examine which products sell the best, figure out why it sells the best
  • Examine current audience and existing markets
  • Devise a way to expand audience and market
  • Monitor sales and etc

Etc.

My point is, to do an effective job, clear definition of what needs to be done, will allow the people who are responsible for execution to determine how much resources are required, and if there are insufficient resources, which corners to cut. One of my mentors told me, in a project, you can control 2 of 3 things: Resources, Features, or Time, but never all three. Listing your expectation is the equivalent of listing the features. If you don’t want a person dedicated to these tasks, then that’s a resource constraint, and the execution team will respond with how much longer such constraints will delay the expected results. A leader doesn’t need to execute, but a leader needs to plan, communicate, assess, and make judgment calls based on assessments.

Why Segregate Production and Staging

I purposely didn’t specify server and environments. It’s EXTREMELY important that the staging environment isn’t sharing the same box as the production box.

A good staging box perfectly mirrors the production box, you’d imagine, that it’d be two birds with one stone, if you simply create a staging environment on the production machine. This is an extremely risky and bad idea.

The staging environment is for testing, all sorts of crazy things can happen, from installing hacked code, to code that are so inefficiently coded that the web server and the connecting database server’s load goes out of control. When this happens, sales will be lost, data won’t transmit, and there will be a definite cost to business.

So when weighing the convenience versus the cost, having a staging environment on a production environment is almost never worth the cost.

Know Your Strengths and Weaknesses

Nobody in this world can do EVERYTHING, but there are specialist in everything among us. Just like free-trade theory, if specialist engage in work trade, both parties benefit.

This is why it’s important to understand the things you are reasonably capable of doing, and things you aren’t. Then you can harness other people’s specialties.

This is a critical step. If you are under the impression that you’re the specialist in everything, then you’ll come to the conclusion that all work, in order to be completely efficiency, must be undergone by you. This is simply not scalable.

Sure, perhaps in a single person’s man-hours, it might be more efficient, but it will ultimately result in the project taking much longer to deliver than necessary.

None of us is perfect, but it’s the concept of working together to achieve a greater goal that’s been at the core of civilizations’ success and prosperity. Learn to lean and learn to lead.

Management

There are two types of management, managing for a field you’re familiar with, and managing for a field you’re not.

In the case of managing for a field you’re familiar with, you’re going to leverage a lot of your experience and expertise to make decisions.

In the case of managing for a field you’re not familiar with, you are going to rely on your people assessment skill, your surveying skill, and intuition. Do note, that if you’re going to hire someone to be an expert in the field, and constantly doubting his work, then you need to one, either hire a new person, get some training in the field so you can ascertain whether or not doing his job properly (but then you’ll be micromanaging; doing your job and their job), and finally you can keep your ears open to see if there are disagreements with the approach.

It’s important to realize what type of management the organization hired you for, so you know if you’re managing the way they expect you to. In a way, we’re all cogs in a larger machine, if we’re fulfilling our purpose, things will run smoothly, if we’re not, there are going to be hiccups.

Harsh on self, Harsh on others

I realize that in my world, there is working or broken, completed or incomplete, one or zero. A delivery is not complete until it is delivered and proven working, until then, it’s incomplete.

I don’t like making promises until I’m relatively certain that it can be delivered, and this certainty can only be obtained through testing. Just like a test, either the assertion is met, or the assertion failed.

I don’t like building systems that are prone to breakage, and not doing a thing about attempting to avoid them. It makes me feel negligent. Fixing a bug that I incidentally introduce doesn’t feel like an accomplishment, it feels like a failure.

Every single system I touch, every single line of code I contribute, I have a sense of fondness for it. To me, computer systems are like children. You groom and shape them into exactly what they’ll be. Sometimes, they’ll take on a life much bigger than the life you anticipated, and when they’re able to withstand the battery that’s the real-world, you feel a sense of pride that it was YOU who brought it into this world.

I ponder if I’m being harsh, or am I just following best-practices.

If I’m the person in charge of handling a project, or a delivery, and it doesn’t meet my criteria of code and system integrity, then it’s like asking me to violate my own principles. Not only am I violating my principles, it’s likely that the violations will result in much more headaches and time expenditures than originally allocated. Such requests are inconsiderate and insulting, especially if you acknowledge that you know the consequences of such violations. Perhaps the reason why I find it so irritating is that I expect them to understand the principles I live by, and for the most part, everyone should. You’re either alive or your dead (medical), you’re either in the black or the red (finance), you either got paid or you didn’t (human resources), your system entire works entirely or it doesn’t (code); It’s not so abstract of a concept really.

So am I being harsh on myself and others, or am I just being normal, and others are being extra lax? It’s something to think about, but I say I’m being normal.

Testing, Delivery, and Confidence

I’m often asked regarding how likely a code deployment will deliver the expected results. It’s actually a very simplistic formula, the answer is a neutral answer, but people often think of it as either over positive, or over negative, more frequently the later.

Chance of delivering on time is a function of: testing, how recent the tests are, how close the test matches the production system, and the points of failure.

Obviously, by on time, we’re assuming we’re delivering the functionality the client expected to have by a certain date.

A delivery that has no testing, server systems are widely different, and there are many points of failure, have little chance of being a successful one, doesn’t mean it can’t happen. A delivery that has testing, matching server configurations, and little to no points of failure, has a huge chance of being a successful one, but doesn’t it’s guaranteed.

I know I speak for a few, possibly not for all, but developers wouldn’t feel comfortable with the deploy until it’s been released onto production, stress tested by the public, performed as expected, and then, their hearts are finally at ease. This, is also a form of testing, the final one. Even then, in the back of their minds, they’re thinking that the code could’ve been better, there are edge cases it didn’t cover, and so on. We are forever doomed by a feeling of insecurity, the only thing we can say is that we’ve rigorously tested the crap out of it because, fact of the matter, bugs are a fact of life.

Responsive Design: Fixing misconceptions

I’m exposed to more of the web than most people, not only on the usage front, but also from the development front. A lot of people employ a technique called “word salad”. Roughly, the spout a bunch of words, and pray that they have some sort of meaningful connotation.

One of these words is “responsive design”. Truthfully, “responsive design” meaning should be closest to “fluid design”, which is to develop a site that look “right” on different browser sizes and resolution.

One interpretation of responsive design seems to be, develop a webpage, that if the user switches from desktop, to tablet, to mobile, things will look the same, and the user will have the same experience.

That interpretation is absolutely wrong. If anything, the better statement would be mobile-tablet-desktop-friendly-architecture-with-relevant-designs. Fact of the matter, if you’re website is image intensive, 5 megabytes of image intensive, even if you employed the most advance fluid layout techniques, it WILL NOT be a good mobile device experience.

The main thing to take into consideration is bandwidth. Most likely the user is viewing the site using a 3G, 4G connection, and even then, not everyone has access to 25+ mbps wifi line.

Instead of creating one design that will magically work for all 3, I say design 3 versions that are designed for a specific experience. If you design for desktop, tablet and mobile miss out. If you design for mobile, the tablet and pc version is lacking. If you design for tablet, you’re kind of stuck in the middle, with a mobile device that has a slow experience, and a desktop version that has an underwhelming experience, since it could’ve been so much more.

I think if possible, we should stick to the terms “mobile design”, “tablet design”, and “desktop design”, and the “responsive” versions of each. If the web would adopt this, I’m sure a lot of people who do work in the web will be saved a lot of headaches, where requirements just seem to crawl out of nowhere, rendering existing architectures less effective at the very last stages of development.