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.

apcalis sx 20mg jelly shoes piroxicam side effects in dogs proviron 25mg tablets sunsuria medinitesupradol colchicine without prescription vicodin overdose treatment female viagra pills in hyderabad piroxicam medication side effects in dogs sildenafil preis pergotime gravidarum promethazine with codeine syrup dose levofloxacin 750 mg iv overnight cialis canada cialis livraison en 24 h buy terramycin in the uk naproxen sodium side effects aleve prednisone generic alli simpson wiki cost of mebendazole typical viagra prices gel v coupon code parcopa vs sinemet overdose viagra coupon cara mengugurkan kandungan filling prescription for domperidone tiotropium bromide spiriva classification sertraline hcl 25 mg xenical pils lialda mesalamine prices diroton drugs inc ranigast ulotka real cuckold creek hollywood md real estate allopurinol drug information free prescription viagra reductil diet pills usa zanaflex overdose treatment 2600 morphine and ambien sleeping pills novolax laxative tea torsemide side effects jasmine guy lupus escitalopram 20 mg reviews levitra 20 mg tablet can you use diflucan during pregnancy sildenafil 100 mg paypal elavil dosage for insomnia cialis daily use vs viagra digoxin without prescription prescription fertility pills for men proviron mesterolone cycle amphetamine salts er 10mg low cost viagara pharmacy technician jobs in san antonio tadalafil 10mg mercury pharmacy philippines sildenafil pulmonary hypertension dosage wellbutrin reviews from patients weight loss buy sildenafil 50mg generic xenical by mail nitrazepam vs diazepam 2mg viagra next day delivery calgary xalatan coupon online pharmacy review logain buy viagra next day delievery cleocin antibiotic treatment patients research chemicals usa furosemide without prescription in uk black viagra zestoretic 10 12 5mg amoxicillin and alcohol side effects minocycline hcl 100 mg capsule mozilla2f5 0 user agent tizanidine 4mg side effects kamagranow forum propranolol for anxiety reviews canada pharmacy no prescription drugs buy liquid tamoxifen citrate how to buy lasix and potassium paroxetine hcl 20mg medication seroquel 25mg street value eprex dose in dialysis patients doqi clinical practice buy orlistat reviews cabgolin cabergoline and weight premarin lawsuits in georgiaprevacid buspar without a prescription canadian pharmacy that let you echeck pfizer viagra ireland domperidone and newzealand pharmacy socialist caucus avelox 400 mg cost cheap generic cialis in uk viagra coupon pfizer gemfibrozil peersription us levitra promo code xanax bars street value starcef capsule size prednisone without prescription canada european pharmacists and medics group diflucan otc walgreens baclofen 20 mg assistance astelin nasal spray celebrex medications neurontin for pain control rimadyl 25mg cats precose medication acarbose plavix lawsuit tryptizol side effects beprogel scalpel citalopram hydrobromide side effects medication viagra and cialias black gabapentin 600 mg no script hoodia tea reviews indian online pharmacy reviews free cialis trial pack clonidine 0.2mg tablets ed hardy online site pramipexole dihydrochloride 1mg antabuse disulfiram pictures buy tramadol cod overnight cheap indocin saw palmetto in telugu mirapex medication indications amoxicillin powder tramadol side effects medications dogs bactroban 2 cream 30gm cialis super active for sale los paratextosparoxetine cafergot medication arthritis foundation of america imovane 7 5mg information processing 0ne minute miracle inc viagrarock pills viagra vs cialis viagra alternative betneval pommade hemorroides frases de futbol cost comparison viagra vs cialis 25 levitra sublingual maxalt side effects doctor generic viagra wikipedia tadalafil uk nebivolol 5mg reviews lamictal for depression reviews prevacid coupon prevacid coupons printable orderpharma reviews on fifty vulnerable amex closest natural thing to viagra tretinoin cream 0 1 for sale zyvoxid pfizer animal health hytrin online without prescription zovirax cream ointment albuterol inhaler side effects and children nitrazepam dosage of aspirin bisoprolol 2.5mg cataflam side effects trusted finpecia seller lidocaine ointment usp 5 use for mofur cream dr barak accutane side effects years later duloxetine hcl dr 20 mg cap coumadin side effects sertraline hcl side effects 25mg vagiral ovulos acromona buy prednisone for poison ivy minocycline without prescription no rx synthroid 112 cicloferon aciclovir cream accutane lawsuit class action update coumadin and alcohol effects keflex side effects in dogs acyclovir and pregnancy first trimester buy atorvastatin 20mg ipharmacy android how to buy prednisone antibiotics for tooth infection over the counter pfizer stock split history valium information half life cephalexin monohydrate for dogs erectalis cipla india microzide medication order fluoxetine online zyprexa relprevv dosing pain pill idaho glucophage without prescription accutane reviews side effects cytotec abortion pill buy online nizoral a d ed meds usa escitalopram online india celebrex canada arthritis medication bactrim and alcoholic beverages kamagra vs viagra yasmine galenorn otherworld series list canada pharmacy online review betacin medication side duvadilan drug isoxsuprine milanuncios barcelona vs levante dilantin levels too high salep erlamycetin altace ramipril capsules 5mg cialis rezeptfrei paypal viagra starting point of finasteride 1 mg prices generic cialis 20mg medoflucon 50 shades erlamycetin ear drops buy prednisone onlineno prescription buying synthroid without insurance diovan side effects valsartan yasminelle birth control gupisone prednisolone 5 mg usage statistics milnacipran hcl tab 50 mg buspirone medication for cats paxil paroxetine withdrawal symptoms fluoxetine 10mg for cats biaxin antibiotic for sinus infection kegunaan meloxicam mylan diclofenac 25mg viagra plus without prescription macrobid and breastfeeding reliable place to buy nolvadex for pct democratic socialism cockapoo information about breed provigil medication uses clindamycin phosphate topical 1 albuterol inhaler for bronchitis red viagra tablet prescriptions fast mobicox tabletas android tijuana mexico pharmacy hindi suhagrat tylenol dosage chart for infants canadian online viagra albuterol side effects in children ornidazole drug interaction vytorin 1020 medicine medication lynoral mexico online cataflam medications cialis liquid form nexium 40 vitamin d deficiency symptoms bones flovent inhaler citalopram side effects citalopram withdrawal lesofat reviews hydroxyzine for dogs dosage mesalamine medication prices donde puedo comprar cytotec en usa regenon retard 60mg buy azithromycin doxycycline online buy albuterol without rx synthroid no rx captopril 12.5mg buy slimex online i europharmacy citalopram 20 mg picture buy synthroid without prescription mail order birth control pills tadalifil without a script flexeril 10 mg cyclobenzaprine cost can you buy diflucan over the counter entocort lymphocytic colitisepamin side effects of desogen birth control pills promethazine hcl syrup can you take 150 mg viagra vistaril medication classification lexapro generic 2012 how long do baclofen withdrawal symptoms last garlic chicken recipe chinese cheap medicine without prescription thebest worldwide pharmacy shop craigslist newyork cars fluzol 150 pokemon acheter solupred en ligne nlinephamacy no prescription com curacne 10mg rapharmacy reviews of fifty allopurinol medication until later generic accuatne online buy xalatan ophthalmic solution cost otibact free shipping us online pharmacy cialis albendazole for dogs treatment compare nexium cost at canadian sites lilly cialis in canada over the counter viagra substitute canadian pharmacy 24h com vn citrate synthase deficiency geneic levitra vicodin withdrawal symptoms blood pressure is high arava side effects leflunomide 20mg viagra brand without prescription therapy dogs international one azithromycin 600 mg for chlamydia ospamox pret combo packs viagra and cialis estradiol valerate injectable cymbalta no prescription overnight 651 filagra super active expiration du brevet de cialis levothroid side effects levothyroxine dosage allegra coupons for 2014 amaryl medication for sale ivermectin without a prescription ampicillin overnight delivery betapace 160 mg grathazon dexamethasone depakote medication wikipedia benemid probenecid 500mg anti viral drugs over the counter kegunaan fucidin ivermectin for horses used on dogs buspar xanax medication tretinoin gel 0.01 directions tylenol side effects seniors digoxin toxicity symptoms in elderly cialis tablets20mg best generic cialis website fosamax and jaw problems bisphosphonates clomid success rate cycle clomid 50mg clopidogrel 75mg average price of cialis buy viagra with discover garrigue pronunciation of words xeloda side effects capecitabine chemotherapy wellbutrin for sale where can i get nolvadex online pharmacies in singapore virectin reviews rxdrugstore sitemail xylocaine injection drug clenbuterol side effects dosage tylenol side effects in infants where to buy hyaluronic acid eprex injection patients no prescription sildenafil citrate levitra and cialis online is nolvadex legal canadian family pharmacy online ibuprofen and alcohol and liver damage vytorin 10/40 tabswarfarin proventil inhaler prices domperidone 10mg tablets side effects puppies for sale in illinois lavitra overnight usa trazodone for insomnia and anxiety medrol dose pack paroxetine medications lexapro street value angela ginseng sirious radio sponsors viagra zantac england kamatra gelish gel androgel testosterone cost cash on delivery drug store obetrol medication interaction canada med store lamictal bipolar side effects tetracycline shortage 2012 cialis online apotheke terbutaline sulfate and pregnancy asthma medications baclofen side effects lioresal indapamide side effects lozol uses mobicox 15 mg indicaciones de la sertraline zoloft side effects hair loss avedox fcb aspirin side effects stomach cialis guenstig does half a viagra tablet work citalopram hbr 20 mg tablet side effects colchine medication 6mg no rx cong dung renapril 5mg valium buy meloxicam uk super active viagra online manfaat vit femara order paxil online pharmacy american medoflucon fluconazole side no prescription needed for motilium is tramadol a narcotic imitrex dosage and administration ciprotab dosage of benadryl bystolic 10 mg tab side effects levitra discount pfizer animal health products best price for crestor 5mg 252 insurance commissioner florida viagra professional no prescription cialis canada online dyazide side effects long term adderall weight loss before and after maxaman caye caulker belize lodging victoza coupon lozol medication cordarone drug study clindamycin side effects heartburn flomax no prescription india licensed pharmacies in los algodones canadian pharmacy online secure levothyroxine buy in england med cab reviews motrin 600 mg side effects clozapine monitoring forms digoxina in english please exelon stock dividend spiriva coupons medicine inconveniant du viagra cefadroxil antibiotic duricef clomid for sale in uk augmentin vs omnicef for sinus infection nifedipine side effects while pregnant 14 estrofem transgender dosage risnia tablets on sale silagra australia substitute for propecia clindamycin hcl buy viagra online canada no pres zolpidem tartrate side effects omifin pastillas cuanto cuestan prednisone and pregnancy asthmapresriptionprimamedics famvir dosing for cold sores nolvadex shipped to canada printable proventil inhaler coupons brand viagra buy levlen birth control sibutramine hydrochloride monohydrate medication budesonide nebulizer dose ropinirole hydrochloride doxycap doxycycline anxiety definition apa pinamox suspension lift manly 100mg review valium information cost keftab 500 mg ramipril side effects cough aleve vs ibuprofen for muscle pain evista medication indian substitute of viagra no prescription generic ed meds retin a canada does cialis make you last longer rhinocort and side effects viagra money pak prozac and alcohol interactions motilium tablets uses i want to buy original viagra aspirin for dogs dose kamagra forums albendazole 400mg price trusted medstore online buy vardenafil online free sample pack of viagra canada over the counter femara medameds rapidshare files quinine water leg cramps colchicine online canada cipla pharmaceuticals orlistat for sale 60 mg cordarone amiodarone hcl skelaxin 400mg information z packs antibiotic for sale alli at walmart lasix furosemide diuretic diflucan and canadian pharmacy carafate suspension medication for dogs pharmacy near metairie la vilches radioactive metronidazole tablets new healthy man bbb rating purchase online terramycin eye ointment for cats medicinenet art main script doxycycline acne legal designer drugs for sale acticin 5 cream diltiazem hydrochloride online painkillers no prescription buy cialis 5mg online tinidazole 500mg tablets buy trinessa online generic viagra cialis levitra cheap pyridium boots serophene success stories zyprexa 0 dollars 63 cent baclofen for opiate withdrawal promethazine hcl injection canadian primatene benoquin monobenzone for sale the erection company arlington costco pharmacy price list 2014 bystolic to metoprolol conversion viagra kaufen mit mastercard discount viagra soft tab aldara cream side effects skin cancer azithromycin no script cialis pills fast delivery viagra without subscription clotrimazole lozenges topiramate medication for pain order cialis with paypal what is kenacomb otic ointment eisai aciphex patient assistance programacitabacivir ornidazole tablets side effects buy esomeprazole