Negative Space And Forming Business Strategy

September 6, 2010 7:42 pm

Negative space in art is the area around the subject that you are drawing. In an art class, you may spend a whole lesson drawing the negative space of an object. In forming a business strategy, the negative spaces are those things you say “no” to. You should use the negative space to help you draw your strategy. The things you say no to will help you better understand what you are choosing to be best in the world at.

Griffith’s Law of Software Economy

May 11, 2010 4:18 pm

Occam’s razor is a principle that “entities must not be multiplied beyond necessity.” In software development, I believe strongly that smaller code is better. I humbly call this my “law of software economy.” Another way to state Occam’s razor is “plurality should not be posited without necessity.”

Now you can’t cheat and make your code small by making it intelligible. It is the smallest code that can be easily understood by SOMEONE ELSE! The reason the law of software economy works is because smaller code naturally minimizes the knowledge that objects have of each other (decoupling) and has very little redundancy (cohesion). More knowledge and redundancy takes more lines of code! Reducing lines of code encourages minimizing layers and layers of interfaces that add no value and make software hard to understand. Have the right and minimal set of interfaces. Reducing lines of code also encourages conventions over configuration. If you buy that every line of code is a chance for a bug, then it also improves quality. Writing smaller code is not faster to develop than writing larger code in the short run. However, in the long run, it will inevitably always win the race.

The smaller the software and elegant the architecture the better chance you can hold the design in your head. The the ultimate position of power is to have a god like knowledge of the system. If you have excessive and overly engineered code, trying to keep it between your ears is like playing musical chairs. Good luck with that.

To the bone, knowing what you are meant to do

12:27 am

One of my favorite quotes–can’t find it credited online but I saw Ed Harris say it in a TV interview, so it’s a bit mangled from memory–is that when someone asked him about his choice to become an actor he said, “I didn’t have a choice, I had no choice, I had to act.” I always think about that statement; I think it separates those that give up and those that have no choice but to keep going for it (a.k.a. to the bone, knowing what you are meant to do).

When the going gets tough, innovate!

April 23, 2010 3:09 am

A crisis can drive innovation. Being able to hold the software in your head at a high level because it is well architected can give you many ways out of a bad situation. Often you surprise yourself how easy a leap forward can be once you have no choice but to find a way! Many of these great ideas live in the back of your head and a crisis will force one to the surface. Solving a problem, in a beautiful way, when your back is against the wall is a rush, and thrill. Especially when you may have been the first to solve it that way.

CEOs are Story Tellers

April 19, 2010 2:44 pm

CEOs are story tellers; you’ve got to create a story people want to work for, a story people want to buy, a story people want to invest in. A fantastic story may be your last when it doesn’t come true. An unexciting story may never get off the ground. How far do you stick your neck out to create goosebumps–that’s the rub.

Average Software Developers Create Suffering in the World

July 24, 2009 4:16 pm

Elite runners get to finish Marathons in less than two and half hours. The average non-professional runner is going to be grinding it out for over four hours. Who suffers more? In some ways the average runner is going through a unique hell that an elite runner never experiences.

The same is true for software. Great software developers end up with simple solutions to complex problems. The novice and average software developer creates really complex code for complex problems. To hold the simple design in your head and code is not as taxing as holding a overly creative complex solution and getting it to work perfectly. I feel sorry for the novice and average software developer who suffer because they code before the simple solution is understood. But it doesn’t end there, elites suffer when they have to go in and fix the untamed solution later because no one remembers all the secrets in the implementation.

One elite I know who had to fix some old code said after the experience:

“We should find the person who wrote that and show him a computer and tell him he is not allowed to ever touch one of these ever again.”

#1 Rule of the House

6:48 am

Ask our two sons what the #1 one rule of the house is and they know it by heart:

“When Mommy’s happy, we’re all happy.”

The Five Mantras of Software Development

April 10, 2009 4:19 pm

Those that have worked with me know that I am passionate about getting to the simple truth that lies below the surface of what may at first appear very complex. I believe discovering the fundamental use-case of a product and describing it in its simplest form empowers a development team to create killer applications for users and maximum economic value for a business. Our job as software architects is to reveal the simplest design that delivers the use-case in a beautiful way so that we minimize the complexity of the system. Complexity in a design is a sign that we did not get to the simple truth and prematurely wrote software. I purposely use the terminology “reveal a design” rather than “design the design” because I believe a design already exists and our job as software artists is to reveal it.

“In every block of marble I see a statue as plain as though it stood before me, shaped and perfect in attitude and action. I have only to hew away the rough walls that imprison the lovely apparition to reveal it to the other eyes as mine see it.” – Michelangelo

There are a lot of software development processes that help teams build software. This article is not about a software development processes (e.g. Scrum, XP, and RUP). This article is about the art of software development from a design perspective and put in the simplest language possible. The goal is to show how it only takes a few easy to understand mantras to develop designs that can scale and grow into large systems. Software development processes help teams work together to create software, but each developer will find using these mantras useful no matter the type of software development process they are using.

Often you do not have the entire problem understood when you have to design and deliver a software product. The mantra “build one to throw away” really does not work when creating large systems. Too many times the code you expect to throw away ends up being the product. Then you have a software base that is flawed and ultimately collapses as the demands of the system exceed the ability of the team to evolve the software. The worst thing that can happen, the software developers become creative and add secrets deep inside the code. Here I am talking about the kind of creativity that makes the complexity of the system grow exponentially and ultimately causes you to hit a brick wall. The result, in time, even those that wrote the software do not remember all decisions in the software they produced. Are your developers running the software to see what it does? Are they reverser engineering their own software?

The brick wall happens because a poorly designed system’s complexity grows exponentially with every feature request. You cannot evolve software organically into large systems. Following good object oriented design practices from the beginning allows a system to scale linearly. Scaling a system linearly with each feature request is important because it drives the return on investment of the development team. Achieving a high return on investment from the development team allows a company to create economic value.

Design patterns, object oriented analysis and design (OOAD) terminology, and other concepts are drilled into the heads of all software developers. Unfortunately, from my observations, only about five percent of developers truly become masters of object oriented design.

Note: The reason there are so few is that true software masters have spent at least 10,000 hours writing software with intense passion in a short period of time (few years). For them writing software becomes more than a career choice. Malcom Gladwell’s Outliers gives a nice qualitative argument that supports this concept.

Other software professionals often have good working knowledge of principles but struggle in creating simple designs for large systems. In fact, the master software developer creates very small code that does a lot while those that struggle create much more software with often very creative solutions to accomplish the same task. The extra creativity is the root cause of problems with scalability and understandability of a system.

If every developer asks the following mantras for every object they create, then they could greatly simplify their designs, and increase the scalability of the software that they are building. The mantras are great questions to ask during code reviews. The mantras allow a place for complex code to exist where the simple solution has not yet been found. It keeps complexity or poorly designed code from co-mingling with the rest of the system. The mantras allow for a higher-level understanding of the design to be revealed over time. The challenge for the developer is determining how deeply you need to adhere to the mantra for any given circumstance. The idea is that satisfying the mantra is easier to understand than textbook object oriented design lingo. Those practices taught in books, classes, and seminars are simply techniques to satisfy the mantras. However, blindly following the formal solution can often produce overly complex code that sometimes still can miss the most important goal, building a system that is easy to understand and will scale. An easy to understand system is easy to use and easy to test.

OOAD MANTRA #1 – Why does that know about that?

Now, I must admit that these mantras are really simple sentences for well known OOAD principles. The benefit of having a loosely coupled system is well known. The first mantra simplifies how to look for coupled objects in your code. When two objects interact, are you hiding as much knowledge as possible between two objects? Often I see information about objects flowing deep down into a series of methods of a package that has no business knowing about that object. In a code review, simply look at the system with one question in mind, “why does that know about that?” Using interfaces, abstract classes, and inheritance may feel like your decoupling but it is meaningless if you do not adhere to OOAD Mantra #1. Your time is well spent to actually rework your software as soon as you identify objects that should not know about each other’s business.

OOAD MANTRA #2 – Why do we have two of those?

Another well understood OOAD principle is that of cohesion. Cohesion is the idea that a class should do related tasks. I like to think of a class as having a well defined purpose. If you have classes with well defined purposes, then you shouldn’t see another class in the system doing the same thing. When a class is doing too many things, you are adding hard to understand complexity to the system. You should not have two classes do the same thing and you should not have a single class do too much. You shouldn’t have two methods of a class that do the same thing as well. Quality is greatly improved when you can keep classes very small and focused on specific tasks. If you see similar code in many places then a developer went to town with “copy and paste.” Stop and rework or that code will be in the system forever. The biggest cause of “copy and paste” is because the developer didn’t adhere to OOAD MANTRA #1. Test complexity can grow exponentially if you do not adhere to OOAD Mantra #2.

OOAD MANTRA #3 – Why is that public interface so complicated?

The other part of cohesion is creating classes with related tasks. I like to think of a public interface as the definition of a box. The outside view of the box must be simple. I do not care how bad the code is in a box, if the box has a simple public interface that can easily be unit tested. You can, at a later time, improve what is inside of the box with very little impact on the system. However, if the spaghetti inside the box leaks outside into the public interface, then that box is patient zero of an infection that can contaminate the rest of the system. Like Pandora’s Box, no harm comes if you can keep the lid closed.

OOAD MANTRA #4 – Do we really need that to be configurable?

The proliferation of configuration files is a sign that developers are not willing to close doors. When are ten lines of code better than 500 lines of XML configuration? Always! Convention is a great option not used enough to reduce the need for overly verbose configuration files. Naming conventions allow for great simplification to the external configuration of the system. If you consider configuration files as part of the public interface of a system, then OOAD MATRA #3 would question exposing complex configurations that never needs configuring. Keep the public configuration simple. Lots of configuration can be eliminated if developers just made more decisions rather than leaving every possible option open for someone else to decide. The brilliance of Apple products is how the applications hit the sweet spot, the interfaces are beautifully simple, and there is just enough configuration and no more. Simply, developers should make choices and be minimalist.

OOAD MANTRA #5 – Where do we need extreme decoupling?

In a system, there are a handful of places where it pays to do extreme decoupling. This is where the business application would receive leveraging if those elements could be expanded easily. For a statistics package it is statistical methods, for a plotting package it would be charts. The best extreme decoupling areas enable outside resources to extend the capabilities of a system with limited knowledge of the whole system. Just consider how much third-party plug-ins increase a Web browser’s value. Software developers get excited and passionate about decoupling behind the scene services that never change or change once in a blue moon. We should decouple framework services, but that passion needs to be brought to the application level and for its specific decoupling needs.

The above mantras have served me well and I hope you find them valuable. It is a well-known fact that people on average can hold seven things in their heads while more than that can be very difficult. That is why functions in software should be limited to seven arguments. Thus, I think I have room for two more mantras. I’m open to suggestions and will consider extending the list if they are fundamentally important.

An argument against being creative when coding

November 20, 2008 7:46 pm

Here is a quote that recently crossed my path:

Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are,
by definition, not smart enough to debug it.”
–Brian Kernighan

I believe this is true. Beware if you are being creative when you are writing your software (code). You should be creative in how simple you can make the design for the problem you are trying to solve. Use proto-typing that may create some complex code to get the information you need to reveal the simple design. Don’t leave that code in the system unless it is well incapsulated in a block with a super simple interface to the rest of the system.

Some advice for the beginner runner…

March 20, 2008 5:12 am

Here is a little advice for the beginner runners out there. You really should buy running shorts, shirts, and socks. Especially as you start getting some distance on your long runs. The technical material really does wick moister away and can prevent chaffing. When you finally go buy some running cloths, buy neutral color shorts. I now only buy black shorts. That way you can avoid some really wacky short and shirt color combinations just before laundry day.

safest generic viagra no prescription required drugstore actos plus metformin 15 850 dianabol cycle methandrostenolone suhagra 100mg canada confidex ingredients in nyquil buying antabuse buy vardenafil alternatives for doxycycline tadalafil discount progesterone suppositories pregnancy penegra 100mg swiss similar to prednisone retin a cream 0.1 tretinoin pyridium boots salbutamol inhaler vs albuterolsecnidazole best price on viagra without rx expiration date on cialis pill 5 mg cialis generic india suhagra 100 rx canada levofloxacin 750 mg iv singulair medication side effects secure online pharmacy dth 24b kamal kunj s v road buy viagra online no prescription buy mifepristone and misoprostol online online india generic drugs epogen dosing protocol order prednisone without rx non percription diflucon omnicef side effects antibiotics amoxicillin yasmin boland pisces content marketing agency can you buy albenza over the counter exelon patch treatment for frontotemporal disease tadalafil generico alendronate side effects webmd advantage rent a car denver metallica albums vicodin withdrawal symptoms side effects xalatan side effects blood pressure levaquin antibiotic side effects vs cipro when to take levitra viagra affect women reglan 10mg medication lorinol 10mg percocet dopareel 10 mg adderall buy generic viagra europe hoodia diet pills appetite suppressant indinavir crystals in ear is ok to take 2 20 milligram of cialis secnidazole tablets side effects cardizem cd generic equivalent clomid and twins next stage casodex withdrawal response vardenafil hcl side effects sildenafil online india atacand coupons walmart canadian pharmacy viagra taking liquid clomiphene at home too much cialis lasix water pills buy phenergren no perscription discount generic cialis india benefits of clomid for men best cialis online order does target have a generic for nexium cozaar side effects coughing bactrim ds 800 160 tab benicar medication side effects pulmicort flexhaler 180 mcg price walgreens employee website buy lasixs water pill retin a cream 0.1 for sale cialis nose bleeds buy teva viagra 254 mestinon medication for myasthenia gravis nizoral a d shampoo reviews lasuna food poisoning viagra pfizer price online abortion pills for sale suhagra 50 manfaat voltaren retirides 0 1 crema marfil oxazepam drug testing toprol xl 25 mg tablet safe black market viagra phenergan ampules without prescription free samples of femara finasteride for hair loss betneval pommade hemorroides order metformin without prescription paxil generic name and brand name viagra apotheke polen zolpidem tartrate need diamox 250mg in middle east how to order levitra on line venta on line la viagra mas barata cialis nabp pharmacy nexium 40mg esomeprazole over the counter sildenafil generico best time to take cialis pharmacy technician jobs in san antonio duetact medication interaction 1841 finasteride 1mg no prescription omifin pastillas cuanto cuestan leponex drug study pfizer stock symbol novolax laxative sidenovolog cheap gabapentin online no rx norvasc 0 dollars 28 century estradiol valerate injectable lergigan fortes magnesium side effects problems phenergan overnight amikacin injection cost retin a no prescription codeine cough syrup buy azithromycin single dose valium side effects in elderly ephedraxin ingredients in cigarettes dermasone 0.05 cream can you use fucidin cream for thrush bumex to lasix conversion dapoxetine 30 mg abilify medication and weight gain isoptin retard side effects mesalamine medication prices pravachol lipitor mirapex lawsuit mirapex restless leg syndrome toprol xl 25 mg canadian 24hr pharmacy canadian pharmacy 24 hr review longs drugs hawaii roacutan mexico lergigan fass buy cheap adderall mexican steroids pharmacy zestoretic side effects lisinopril recall cipralex 10 mg tabletta differin gel reviews makeupalley filme onlain abana himalaya product nimesulide tablets alpalide parlodel medication buy finasteride 5mg online neurontin and weight gain finasteride proscar mupirocin uses in dogs peritol tablets for appetite comprar misoprostol en mendoza azithromycin for sale torsemide 20 mg and lupus cialis for daily use cost at cvs claritin dosage for children by weight lexapro side effects weight loss lisinipril no rx 2 5mg valium vs xanax dosage what is relafen 750 nabumetone for mobicool coolers viagra 100mg preisvergleich medrol 4mg dosepak for dogs sertraline zoloft side effects vardenafil hcl 20mg tablets tadalafil 20 mg sublingual viagra generique inde seroquel medication classification on line erectile dysfunction medication buy viagranext day delivery supreme suppliers pharmacy mumbai real viagra pills what is terramycin ointment for humans clomid ovulation pills for sale alberta cipralex information medication min ovral 21 viagra ohne rezept aus uk rhinathiol expectorant cough suppressant cialis rezeptfrei paypal advair online no prescription edukacijski fakultet travnik tiotropium bromide inhalation powder cost pilex dosage buy viagra india no prescription paypal decadron dosage information cialis made in india sildenafil 100mg 30 pills vilches ferreteros mexico city penis pics salbutamol guaifenesin ventolin expectorant parafortan tabs viagra usa online pharmacy online drug store without prescription pharmacy without dr prescriptions sibutramine user reviews antibiotics for ear infections and sinusitis prozac and alcohol use buy camera using echeck increasing and decreasing functions and the first derivative test euthyrox 50 mcg cabergoline side effects dose terramycin for cats topiramate side effects topamax weight loss topiramate purchase generic valtrex online pharmacies no prescription femara fertility success stories risperdal risperidone children best price on cialis coupon lamisil side effects casodex patient assistance program misoprostol in south africa fluconazole for yeast infections how to buy cialis online usa midamor medication for anxiety thyroxin without priscription lynoral tablets for kids nolvadex dosage for gynecomastia cialis how long does it take to work erectalis 20 mg prednisone benazepril 10 mg images yasmine hamdan hal meclizine hydrochloride for dogs bystolic package insert patient reviews decadron dosage for croup misoprostol 200mcg tab greenstone flomist cipla india order mifepristone online salzarex tramadol capsules 100mg acheter alli tegretol toxicity levelstemovate synthroid purchase canada priligy side effects rapidtabs viagra commercial actress linezolid cost does viagra make you harder subutex side effects dose cheap generic cialis india cialis fast delivery where to buy levitra best price cialis 20mg usa lasix furosemide diuretic avedox fcb liquidex arimidex dosage is omnicef for strep throat viagra online canada pharmacy review paulinia news indapamide side effects lozol uses celebrex sales in canada ketorolac tromethamine injection dosage erexin spray review nexium 40 mg for sale mebendazole dosage sildenafil para mujeres waitutu lodge doxycycline eye drops cost of cialis for daily use glaxo betnovate n cream dyazide side effects long term buspar xanax medication zyvox side effects in pregnancy order fertility drugs online epanutin phenytoin sodium amoxicillin dosage chart for infants bystolic side effects and diabetes code red 7 male enhancement spray f ree viagra for sale looking for cialis pills fentanyl patch side effects in humans buy viagra at walmart is it safe to buy levitra on line canadian pharmacy for womans viagra doxylamine side effects blood pressure best over the counter erection pill new healthy man suhagraat tips in hindi font torsemide medication for dogs buy alli orlistat prostata agrandada kamagrafast comcast order alli diet pills to canada who found good viragra ezetimibe 10mg simvastatin 40 ovral l online bonadoxina pfizer dosis pastillas para bajar suhagraat ka tariqa lamisil cream treatment nail fungus doxycycline hyclate 100mg for dogs biozole fluconazole 200 mg for what uroxatral vs flomax medication dilantin medication vytorin 10/40 tabswarfarin how much is flovent without insurance esomeprazole strontium price fosamax generic date sifrol pramipexole zovirax acyclovir online cialis tadalafila amoxil and alcohol levaquin antibiotic lawsuits diamox medication for headaches albendazol order on line fucidin hydrocortisone buy viagra super active online pharm online motrin dosage for children by age consumer report buying viagra on line tamoxifen side effects high risk clomid fast delivery aciclovir tablets viagra ireland online shop generic viagra and cialis robaxin 500mg methocarbamol for dogs viamedic coupon code prescription estrogen pills uk online pharmacy no rx required myambutol adverse reactions to morphine digoxina in english what is a thespian zyban without prescription cialis viagra buy my progesterone levels during early pregnancy lidoderm patch 5 12 hours doxazosin 8 mg tablets rizatriptan maxalt actavis promethazine codeine for sale cialis asia flomax for sale grathazon kaplet roh meprate to start period faster oracea coupon 2014 depakote withdrawal side effects comprar viagra online canada flagyl dosage for children non perscription flomax actavis cough syrup uk paroxetine hcl 40mg tabs rxdiler stores pariet sodium rabeprazole side effects malaseb wipes buy lexapro 5mg in singapore us viagra for sale buy medication online amermycin 100mg viagra cardinal health locations duvadilan indications side effects bystolic 10 mg tab side effects eldepryl manufacturer coupons canadian pharmacy quick shipping free world pharmacy lipitor side effects muscle pain elavil medication avodart side effects in women sifrol 0 125 company claritin d ingredients list canadian drugs without prescription atepros drug emporium diamox side effects altitude sickness adderall withdrawal symptoms length vitamix vs blendtec videoviyagravoltaren cymbalta on line cialis gratui viagra pills overnight delivery pregnant pictures cephalexin 500mg sildenafil citrate sample canadian viagra atenolol side effects in cats amerimedrx cialis canada tegretol toxicity lawsuits eprex injections side effects xlpharmacy medications for ocd flomax for women for kidney stones zithromax z pack dose atacand medication for migraine headaches levaquin lawsuit settlements new jersey rimonabant fda lanoxin drug side effects cialis best price fast delivery leponex drug forcibly feminized men doxycycline monohydrate 100mg buy now baclofen on line pharmacy side effects of generic viagra colchicine with no prescription desyrel 50mg acticin over the counter macrodantin 100mg capsules digoxina in english please valtrex cheap seroquel side effects constipation pletal side effects proscar to uk without prescription feldene gel pain increasing lung capacity after quitting smoking doxylamine succinate pregnancy chlamydia pictures and images in women xanax from canada roaccutane isotretinoin treatment raloxifene side effects vimax malaysia dealer sildenafilo normon 50 mg precio where to get viagra in dublin buy indian erythromycin sofilex wikitravel cheapest celais made in us buyfinasteride with a master card avalide side effects doctor overnight pharmacy 4 u kamagra piroxicam medication for dogs cheapest medications online medoflucon 50 shades clavupen 100mg to g tableta viagra strattera coupons with insurance birth control without prescription ropinirole medication dapoxetine propecia ibuprofen for dogs veterinarianimiquimod tronto drug store maxolon medication cheapest place to get propecia insurance auto auctions dilantin iv administration normal saline benazepril hctz 10 12.5 side effectsbenfotiaminbestherbal buy maxifort online ovral l pill same time daily news reglan side effects in infants lipitor 40 mg buy femara tadarise pro 20 dosage online viagra teacup cockapoo puppies for sale in michigan vasotec iv half life snorting gabapentin azithromycin order without prescription cataflam 50 mg buy cheap amoxicillin tizanidine 4mg ephedraxin reviews of fifty no prescription arimidex cheap viagra prix pharmacie sildalis for sale american express haldol pharmacological classification staminafit tablets after effects levitra free shipping actos and bladder cancer studies taking clomid after a miscarriage champix tablets side effects zestoretic side effects lisinopril paypal propecia tegretol toxicity seizures viagra walgreens ranitidine zantac eq clonidine patch side effects black market viagra toprol xl 25 mg generictoradol does amoxicillin work for staph lavestra penis enlargement salbutamol kaufen ohne rezept lipitor side effects muscle pain muscle pain in legs vantin antibiotic for ear infection cialis c80 compare prices of viagra octreotide treatment acromegaly is 5mg of levitra enough cialis super active plus generic sildenafil clomid pregnancy test calculator buy ranitidine bismuth citrate lamisil tablets treatment for sale proviron side effects nolvadex viagra super active plus review best deals on levitra medication canadian pharmacy 247 what deos xypresy feel like motrin and robitussin together avodart side effects dutasteride results levitra generic drugstore sildenafil citrate 100mg tabs cholesterol levels chart by age order deltazone tadalafil over nighted benazepril side effects on dogs software house international logo buto asma inhaler oxybutynin medication used discount tadalafil 20mg apertium wikimapia levofloxacin 500 mg interaction with nexium floxin drops and pregnancy protonix 40 mg over the counter lesofat side effects orlistat augmentin side effects in women cialis generic with paypal prednisoe for sale canadian pharmacy lumigan eye drops coupons actos plus metformin insulin vigrx plus ingredients mg cialis special viagra radio commercial premarin lawsuits drugs clopidogrel 75mg