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.

cialis supr active for sale melovax 15mg etodolac 500 mg tablet san prozac nation author minoxidil shampoo and conditioner perkinil tablet lipothin 200 ventolin nebules dosage children allegra d 12 hour salbutamol pay pal online pharmacy baku clindamycin side effects antibiotic nexium 40 promethaine codeine canada salibet ointment definitionsalzarex tramadol controlled substance california medicine store order propanonal buy nolvadex uk tizanidine hcl 4mg tablet duvadilan side effects pregnancy pilexil ampollas usa androfin reviews caffeine powder walgreens ativan dosage for insomnia best mexican pharmacies ceftin antibiotic revista kosovarja numri i ri zoloft and lorazepam together polarmeds reviews on vigrx viagra prescription on line progesterone levels during pregnancy week by week kamagra tablets sumycin syrup brands piroxicam medication vidalta side effects aristocort cream buy viagra in dublin nexium esomeprazole 20mg in uk ketorolac tromethamine 10mg tab purchase doxycycline online mastercard 40 viagra pills for 99 dollars entocort side effects budesonide iraplax orlistat 120mg xenical is it illegal to sell lantus online cheap amitrippline rush delivery antibiotic purchase colchicine with no prescription 36 hr cialis pharmacie de garde noumea prescription water pills online celexa withdrawal side effects how long buy viagra and cialis lasix 12 5 mg for dogs yellow cheap cockapoo puppies for sale in ohio estrace 1mg how long does it take to work where can i buy nitroglycerin ointment cardizem medication wikipedia buy levitra softabs buy birth control from thailand buying cialis in montreal prozac and alcohol dose omeprazole dr 20 mg capsule picture alesse birth control pill information haloperidol drug schedule mofur cream vermox liquor dulcolax pour maigrir digoxin toxicity level cialis generika cheap accutane reviews before and after pictures clomid twins no prescription keflex 500mg cephalexin infections mupirocin ointment usp 2 used to treat athletes foot milanuncios coches de segunda mano sureway construction alberta no prescription tramadol buy cyproheptadine online amiloride hydrochloride the pharmacy express complaints 20 mg nolvadex pct pletal cilostazol classification fanegada en metrosouth robaxin dosage amount metoprolol er 25 mg coupons cialis 5mg generic sale liquid cialis for sale pregnant pictures of jennifer lopez doxycycline hyclate side effects dogs paxil generic side effects haldol dosage for terminal restlessness does doxycycline work for acne where to get viagra online eszopiclone lunesta benadryl dosage for infants under 2 metoprolol tartrate 25mg medication viagra mfg furosemide 40 mg medication etodolac er 500mg uses exelon corp jobs vitamix vs blendtec review $ 99 00 viagra zantac for infants arthritis of the spine lexapro generic reviews mirtazapine 30 mg tablet side effects one azithromycin 600 mg for chlamydia progesterone levels after ovulation viagra usa online pharmacy side effects of levothyroxine 75 mcg lialda coupon for 2014 salbutamol inhaler vs albuterolsecnidazole reglan 10mg medication farmacias de canada buy viagra online australia duphaston tablet for pregnancy prandin generic name kamatra sumatra tsunamikeflex finasteride generic visa colcrys side effects zyban smoking medication canada drugs online reputable meclizine 25 mg tablet directions cheapest brand name levitra celecoxib mechanism of action ppt pela viagra dominicana floxin otic drops dosing rimonabant tablets healthyman co ranitidine for infants how long to work buying levitra with paypal medication for type 2 diabetes online latisse for eyebrows benicar generic substitute promethazine dosage to get high elavil 75 mg fasigyn forte suhagraat video dailymotion thalidomide babies where are they now prednisone with paypal minocycline 100 mg for dogs flexidol relax efectos del where to buy viagra for men prednisone 20mg side effects dogs buy promethazine w codeine syrup online sunsuria bukit jelutong cycling lotemax gel eye drops albenza 200mg pinworms gufulvin without a prescription latisse before and after results astelin generic name cialis free trial coupon provigil 200 mg price oxybutynin medication used medrol over the counter options viagra price hong kong canadapharmacy24 online antibiotics in canada cialis daily use vs viagra how come lumigan 0.03 discontinued lidoderm patch 5 12 hours dynamogen drug interaction diflucan over the counter cvs luvox dosage for anxiety can u buy viagra online cardura xl 4 mg allopurinol drug reactions best drugstore diet pills januvia online belgium cleocin hcl 150mg capsules diamox sequels picture haloperidol 5mg ml lanoxin medication with chlorothiazide super avana reviews diarex pro series stone color enhancer for brick clomidwith out prepscription furolin medicine dictionary microzide medication buy generic propecia 2012 arimidex breast cancer side effects acyclovir and pregnancy category war on drugs lamisil cream treatment viagra 100mg vs 50 mg pharmacy tech certification exam zovic 800 viagra online sales mirtazapine for dogs dosage cialis in walmart dianabol for sale in canada esomeprazole 40mg price parcopa vs sinemet overdose effexor xr without rx new pregnant celebrities 2015 us online pharmacy cialis tadalafil 20mg lowest price flomaxtra xl uk no prescription lexapro piroxicam side effects aspirin hair loss propecia from canada levofloxacin 750 mg iv can you buy viagra in bali comprar cialis en washington online pharmarcy clopidogrel side effects symptoms permethrin creme purchase buying medicaltion online cleocin cream for yeast infection prices cialis walmart zocor information simvastatin ebay cheap kamagra uk no prescription canadian pharmacy lavestra penis enlargement detrol side effects itching flovent hfa 220 mcg inhaler astelin nasal spray cost oxybutynin hydrochloride side effects buy metformin xr best price for cialis tablets 5 mg doxazosin cardura 2 mg viagra gold usa phenergan with codeine abuse synthroid vs levothyroxine dosage purchase tamoxifen citrate online tegretol withdrawal symptoms ketazol cream aspen times need viagra fast tetracycline for sale how much vistaril overdose buy finasteride canada ditropan 5mg buy sildenafil citrate canada phenergan dm syrup dose over the counter lexpro celebrex 200 mg online pharmacy doxycycline for sale india myambutol adverse reactions to flu jaguar viagra como comprar cytotec sin receta medica can you buy diflucan over the counter buy silagra 100mg with no rx myambutol medicine shoppe generic viagra england ramipril capsules dose compare prescription prices in florida prednisone over the counter walmart decadron mail order liquid cialis research chemicals clindamycin for dogs antibiotic berifen 100mg clomid condyline pdf download prometrium progesterone reviews what is progynova side effects flagyl forte tab 500 mg viagra farmacia de canada anti biotic drugs without prescriptions quien a comprado cytotec en usa elimite permethrin 1 benemid medication side citrate synthase regulation atorlip 20 mg adderall cialis c80 cabaser cabergoline dosage prazosin side effects weight gain estrogen for sale vermox 100mg does metronidazole turn urune irange lamisil pills cardinal bank hours best price for cialis 5 mg online leconfield house curzon street cinema buy clonidine online no prescription getpharma ukraine xeloda capecitabine dose skelaxin 800 information doxycap tablets with keyboards is superdrugsaver legit rimadyl for dogs side effects viagra and cialias black indapamide side effects lozol indapamide doxitab tablets with windows compra decialis non perscription cialis super active crestor savings card motilium tablets uses kamagrafast co cialis troppo uso fa male viagra24 0rg differin gel 0.3 savings page carbimazole tablets 5mg buy generic viagra europe famciclovir drug medication entocort side effects rash cant ejaculate aciclovir crema en ingles hctz 25 mg cheap tadalafil 60 mg for sale rimadyl 25mg ampicillin trihydrate fs no prescription propranolol budesonide drug cost at walgreens elomet ointment mometasone furoate cream venlafaxine 75mg er side effects tegretol xr 400 mg side effects tramadol withdrawal symptoms drugs dove acquistare cialis in sicurezza 185 asthmahaler mist buy buy obagi tretinoin cream in uk sibutramine containing diet pills is zifi 200mg tablets causes sleep viagra usa without a prescription septrin antibiotic suspension aldactone 25mg proviron dosage for women femara 2.5 mg ketazol shampoo for oily hair zyloprim contraindications for flu metronidazole and orange stools in dogs over the counter erectile dysfunction anafranil side effects sweating bupropion hcl xl colchicine products for sale minomycin information eszopiclone 3mg tablets clenbuterol side effects athletes performance depakote medication generic name pramipexole dihydrochloride canadian pharmacy ed meds magnesium chloride benefits lasix water pills buy decadron side effects cialis costo in farmacia prednisolone eye drops side effects medication viagra for women free sample dutasteride canada where to get viagra samples nexium 40 mg for sale atenolol side effects lisinopril side effects viagra sold in the united states amiloride hctz 5 50 drugs for depression and anxiety vimax reviews doctor buy valacyclovir viasek side effects cialis 20 mg estados unidos no prescription penicillin viagra tablets for men price alli walmart buy cialis ebay 15 buspar side effects weight loss evista medication budesonide formoterol best price on levitra canada albuterol sulfate inhalation solution side effects vibramycin syrup online meds without presciption flonase side effects children how long paroxetine take to work pulmicort side effects in children furasemidum to buy uk diane ladd on alice extenze review information truth about enzyte price of levitra at walgreens prinivil 20 mg tablet microcidal molecules to grams tretinoin 0 1 cream uk elavil medication information mirtazapine for cats how long to work tadalafil 20 mg dosage domperidone 10mg tablets buy can a man use hydroxycut max for women cataflam suspension dosis minocycline 100 mg capsules uses diclofenac potassium 50mg diazepam 5mg for dogs buy fentanyl no prescription salep agne manfaat does viagra make you bigger where to buy beta blockers clomid 100 mg tablets to buy los paratextosparoxetine novolog patient assistance program phone number plendil er dosage vigrande nedir bu rx canada pharmacy 365 rapidtabs viagra for women does viagra work when drunk epanutin drug testing non prescription cialis 5mg apodefil sildenafil from india viagra in singapore duphaston 10mg tabletki vibrox tablets for sale cialis free 30 day trial orlistat availabilty albuterol inhaler dosage children order viagra online viagra capsule generic plavix at walmart canesoral reviews 50 bluemountain pharmacy dostinex mg can benadryl brain hemorrhage clomiphene citrate 50mg price buy xenical without consultation payment paypal levitra buy lotensin 40 mg tablet online pentrexyl 500 mg dosage doxylamine succinate pregnancy nizagara gold 120 buy neurontin online cod terramicina oxitetraciclina 500 mg bactrim dosage for adults viagra online kaufen billig famciclovir side effects dyazide side effects long term lasix medication information amoxicillin 500mg capsules for dogs retin a cream buy online buy nizoral shampoo norvasc side effects buy tramadol overnight with mastercard mirapex restless leg syndrome restonite ambien side cheap isotretinoin ipharmacy android euthyrox 50 mcg compare prices on viagra ditropan xl 10mg side effects cialis srbija prodaja phenergran no perscription bactrim dosage for urinary tract infection levitra canadian online pharmacy super active metformin hydrochloride extended release lidocaine cream over counter saroten retard 50 mg xenical orlistat buy online uk phenergan with codeine syrup medication percocet canadian pharmacy phentermine adipex medications cialis 5mg daily reviews synthroid purchase canada sotalol hcl 80mg tab how does cialis work on men vitamix 7500 blender adalat side effects nifedipine cozaar side effects cozaar 50 mg buy lisinopril 30 no prescription buy viagra uk tesco azithromycin 250 mg for mrsa cialis rezeptfrei paypal cefaclor side effects doctor zithrogen 500 million atosil dropstar cnadian pharmacy medazole tablecloths buto asma inhaler brand viagra online rezeptfreis buy isotretinoin online kuwait risnia syrup of black metallica one youtube non us pharmacies dosage for zyban to quit smoking stilnox side effects forum lidocaine patch 5 cost diclofenaco de sodio voltaren mincorp mining companies greenline pharmacy best alternative to viagra latisse for eyebrows side effects can u buy misoprostol over the counter chlamydia pneumoniae treatment metallica black album cover advantage multi for dogs coupon baclofen 20 mg price isoptin verapamil dosage range cialis online mastercard clotrimazole and betameth cream uses cramping after taking letrozole for fertility can i take augmentin for strep throat macrobid and breastfeeding side effects substitute for propecia cholesterol levels chart by age safe nizagara site zofran over the counter tadalafil generic best price alfuzosin uroxatral generic viagra shopping spain 30 day supply viargra prevacid coupon printable cialis with avodart tadalafil citrate wikipedia cialis for women reviews suprax 400mg used for xenical philippines advertisement proscar finasteride price at walmart advantage one federal credit union morrison il pharmacie en ligne maroc quinine sulfate 324 mg capsules femara fertility success stories