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.

potassium deficiency symptoms in people frumil diuretic definition mesalamine medication prices tadalafil 20 mg cheap buy online ode des perfume abilify side effects in children with autism nexium coupons for over the counter fanegada conversion fahrenheit canadian pharm support group lisinopril 20mg online pharmacy loss of a dog what to say free samples of cialis or viagra cefaclor drug interactions dermasone betamethasone valerate cream doxycycline hcl 100mg prandin medication side effects minocin 100mg generico do viagra da sandoz premarin cream side effects for men prescription water pills online desogen birth control for acne viagra farmacia de canada canadian express pharmacy lasix water pills canadian pharmacy buy finasteride 5mg online genaric viagra retailers in canada phexin azithromycin cheapest albendazole online cialis best price arimidex dosage for gynecomastia floxin otic solution 0 3 month swimsuits where to buy viagra in kuching 273 tramadol withdrawal symptoms depression crestor generic release date online viagra without a prescriptuon proventil coupon freeprovera fucidin h cream side effects medicine store order propanonal propranolol side effects in children prezzo viagra in farmacia primatene mist inhalers for sale vicodin addiction symptoms drug buy fentanyl uk non prescription pharmacies mexico amoxil and alcohol ibuprofen dosage chart for kids what is terramicina oxitetraciclina polimixina b 30 day supply viargra amy ried cardizem medication side effects prandin generic name canada cipla suhagra legitamate online viagra vagiral ovulos acromona lamotrigine medication cost tadalafil soft gel capsule where to buy hormonin tablets mexican pharmacy oxycontin tavor ohne rezept www online generic kamagra cataflam dd macrodantin 100mg side effects antabuse side effects disulfiram side buy lexapro 5mg in singapore isoniazid and alcohol zantac vs prilosec acid reflux vendita viagra viagra online cheap requip side effects dose vistaril 25mg dose zyban smoking medication sotalex medication identification norfloxacin dosage in dogs lasix generic online diane stretton vexatious litigant ciprotab 500 florinef dose mometasone furoate cream 0.1 used for buy vyvanse canada cheap zanaflex no prescription atacand medication information therapy for depression in children efecto del cialis en la mujer cytoxan and taxotere fluoxetine 10mg for cats ovral l online minomycin 50mg anavar buy viagra without a prescription clenbuterol side effects athletes foot pharmacy technician training online caffeine pills vs coffee kamagra strong clonazepam without script dosage quinine sulfate leg cramps mentat mantra vega 100 online italia cialis 5 mg best prices cialis 10mg uk donepezil 5 mg tablets side effects tamoxafin for sale in canada best ed pill over the counter indapamide 2.5mg tab order viagra overnight shipping pharmacie de garde 1000 bruxelles glyprin 100mg morphine micardis medication side effects xylocaine jelly over the counter flomax 0.4 mg for 7 centimeter kidney stone in women cialis gel uk prozac and alcohol dose p57 hoodia tylenol arthritis acetaminophen xenical precio colombia doxycycline acne wellbutrin reviews smoking milnacipran for depression dianabol cycle methandrostenolone medicine viagra best sellers catalog reditabs viagra torsemide medications rapidtabs viagra rx one pharmacy viagra simular to bisalic flagyl antibiotic used to treat sinusitis kelnor without prescription tylenol with codeine during pregnancy online pharmacies echeck low cost antibiotics minocin side effects medication citalopram for sale uk proscar vs avodart for bph lowest price viagra 100 mg online pharmancy kwikmed online pharmacy benazepril side effects on dogs buy slimex online procalisx scampi myambutol toxicity definition rx relief card levofloxacin 750 mg iv india pharmacy cialis amerimedrx models ramipril side effects cephalexin for sale metformin weight loss results codeine cough syrup mexitil mexiletine alphagan 0.1 patient assistance how to order levitra on line chigualos ejemplos de hipotesis atarax medicine classification cymbalta withdrawal brain zaps spedizioni cialis in italia salzarex tadalafil tablets oracea side effects doxycycline rash where to buy levitra leconfield kennels von hytrin generic lidocaine and prilocaine cream side effects compare viagra to generic doxycycline no pres online rs non prescription viagra for sale amoxicillin 500mg capsules for sale gabapentin buy online triam hctz 75 50 mg prednisone for poison ivy breastfeeding how to buy cialis online usa compra cytotec buy flagyl online no prescription levaquin antibiotics side effects the erection company arlington diltiazem side effects erectile amoxi 500mg for dogs where to buy raloxifene evista side effects in men pariet 20mg diflucan dosage for yeast infection in children doxycap dosage thyroxine tablets to buy xenical orlistat 120mg capsules suhagra 100 india biaxin xl antibiotic combivent inhaler dosage information target nexium on line order compare prescription prices in florida sildenafil citrate cheapest prices flurazepam hydrochloride can you get high off celebrex 200 mg entocort budesonide without prescription cytotec super lavitra online pharmacy india kamagra soft viagra tabs online painkillers no prescription unisom overdose amount xenical 120 mg independent online pharmacy reviews cialis canadian no presciption cialis kaufen billig can buy colchicine 0 5 at store vardenafil hcl 10mg generic actos without prescription livial tablets 2.5mg tegretol xr 400 mg side effects dicyclomine 20 mg what is it for no prescription arimidex cheap lialda coupon 2013 suhagra 50 advantages of solar phenergan medication uses buying generic viagra online cleocin antibiotic treatment patients acheter cialis livraison rapide viagra 24 hr delivery proscar side effects finasteride abdominal fat viagra super active plus review seroquel side effects in the elderly pyridium drug classification morphine sulfate 30mg er tabs anxiety disorder nos norvasc 10mg reviews no prescription warfarin pilexil sprayground voveran is it available in the us norlevo effectiveness of the pill propecia reviews forum doxitab 100 mg tramadol online drugstore free shipping minoxidil 2 topical treatment for women benadryl for infants while flying coversyl plus hd side effects buy fucidin online uk mincorp mn dept imitrex injection side effects lantus solostar pen losartan 50 mg tablets losartan potassium 100 mg sinequanone paris dresses buy kamagra spain maestro liquidex dosage on cycle workout avedox fcb nasonex vs nasacort vs flonase desyrel side effects ketazol cream aspen trees walgreens take care clinic alton il amiloride side effects mincorp mining games buy meloxicam uk adipex diet pills online strattera side effects cheap flomax no prescription terramycin eye ointment for dogs reviews can you buy zithromax over the counter advair hfa inhaler coupons femara side effects treatment vpxl ingredients vimax detox pills amlodipine besylate 10mg tablets side effects pravachol 40mg price colchicine tablets usp rx marvelon pil perancang remeron antidepressant mirtazapine side effects lynoral mexico online estradiol valerate estrogens cefadroxil antibiotic duricef 1mg finasteride kebaikan mercilom nosipren prednisona 5mg para where to buy viagra in nyc where to buy proair albutoral inhalors ciprolet para que sirve amiloride furosemide avelox 400 mg cost clindamicina pretty 1489 dr edward b armington arava side effects leflunomide 20mg xlpharmacy scam alert pregnancy test calculator female viagra pills in hyderabad best price on viagra without rx noroxin medication zyban information dose doxycycline hyclate duloxetine hcl dr 20 mg cap remeron withdrawal symptoms length lamotrigine medication guide reichlox capsule machine lorinol 10 mg valium nitrospray kaufen nuvigil vs adderall diflucan 150 mg promathazine where to buy benazepril 10 mg images metrodinazole for birds femara drug assistance ketorolaco tramadol jasmine sanders and chris brown medicinenet static main scriptures hydroxyzine hcl 25 mg tablet dosage to buy roaccutane seroflo inhaler revatio purchase is bactrim for sinus infection iraplax orlistat 120mg kamagra next day qsymia cost zyrtec side effects after stopping prednisone 40 mg online 100 mg viagra price walmart doxycap capsule machine viapro reviews tadacip india aciphex online no prescription keppra medication levetiracetam dosage retail price for crestor gold viagra from china famciclovir drug medication otibact ear drops 15ml is how many teaspoons nebivolol hydrochloride prices exelon patch side effects information medomycin antibiotics and alcohol micardis side effects weight gain over the counter diabetic medicine claritin d side effects with alcohol marcumar therapy lyrics rythmol medication cost accutane online pharmacy buy alli weight loss pills phamacy canana non prescription hytrin prostate medication hyaluronic acid side effects pharmacy the best nitroglycerin red 7 pill sildenafil soft tablets levaquin for sinus infection dosage kamagra canadian where to buy bactrim antibiotic duvadilan isoxsuprine drugs mail kumaden co jp cialis coupon walgreens aldara treatment for skin cancer fluzol 150 pokemon best canadian pharmacies vicodin withdrawal symptoms blood pressure is high ordering flagyl by mail finpecia from india online online overnight pharmacy amikacin sulfate injection dose for koi fish budesonide side effects weight gain peritol tablets for appetite salazopyrin sulfasalazine canadian pharmacy quick shipping viagra kaufen mit mastercard paxil side effects medication healthy man viagra is it a scam buy stillnot on line flomaxtra xl 400 epson levemir cost at walmart indapamide 2.5mg side effects effexor withdrawal symptoms last haloperidol drug schedule adderall xr weight loss lamisil side effects im hydrating peritol tablets side effects anxiety pills aristocort cream ointment for itchy amaryl medication generic subutex images prescription online diflucan online generic pharmacy clomid next day delivery morphine pills drug meclizine medication information estrace side effects amphetamine salts er 20mg cialis no prescription needed canada sildenafil 50mg buy 100 ml viagra cialis insurance online macrobid for uti 800 mg viagra obetrol adhd pharmacie de garde geneve premarin tablets 0.625 cheap quick cialis buy kamagra jelly india almased turbo diet forum valium vs xanax medications side effects of tizanidine 4mg information citodon buy mometasone furoate ointment usp 0.1 uses 1841 finasteride 1mg no prescription dth 24b kamal kunj s v road dynamogen drug interaction what is diprosone ointment how to buy cheap generic viagra sifrol 0 125cc retin a cream 0.05 salbutamol pay pal cardinal health products overdose of ranitidine for infantsrapharmacy canadian pharmacy prednizone uroxatral vs flomax medication milanuncios mascotas perros amoxicillin for sinus infection in infants rythmol manufacturer feldene 20mg review 24hr canadian pharmacy what happened to online pharmacys buy viagra with master card saroten retard albaneses roadhouse atrovent inhaler peanut allergy hoodia weight loss patch review increasing sperm count diet 280 retin a without prescription usa terramycin for cats instructions ropinirole hcl side effects zocor medication simvastatin viagra super active pills pain killers online mobicox tabletas en no prescription lexapro south african hoodia gordonii side effects proscar for hair loss in men viagra 100mg without a prescription can you use lidoderm patch for back pain prozac no rx mastercard naproxen 500mg uses side effects how to take prometrium 100mg capsules betnovate cream buy online uk levofloxacin 750 mg side effects aggrenox medication and plavix inexpensive alli 2600 morphine and ambien sleeping pills lortab hydrocodone 5 500 amantadine without prescription lidocaine viscous 2 dose estrofem effects in males prevacid side effects chlamydia discharge claritin d coupons zyrtec viagra home delivery lowest prices on viagra trusted finpecia seller vytorin generic equivalent prednisolone eye drops side effects medication amlodipine besylate side effects ed propranolol for migraines side effects rx canada 365 testosterone cream for men xlpharmacy canada revenue buy esomeprazole acura viagra sertralina efectos adversos plavix lawsuit plavix side effects best price levitra 20 mg walmart pharmacy drug list raymeds complaints navidoxine information betnovate scalp application hair loss prednisone 20mg side effects dogs clomid shipped australia eprex dose in dialysis patients doqi clinical practice trusted online pharmacies no rx needed trusted online pharmacy reviews dublin pharmacy to sale kamagra what is the shelf life of lisinopril unisom sleep tabs side effects doctors in ri who prescribe propecia indocin medication for gout epharmacy online shoes tijuana pharmacy prices takeda duetact coupon buy propecia online in singapore medoflucon fluconazole side vermox 100mg clonidine for children behavior puppies for sale in ohio combivent mail order pharmacy latisse before and after youtube yasmine yousaf tumblr valtrex without prescription overnight betnovate n cream for sale sinequanone meaning of life seroquel for anxiety and panic disorder generic finasteride health shop eprex injection condyline wartec furosemide medication side effects what is duloxetine hcl dr 60 mg cap used for motilium dosage breastfeeding paracetamol mechanism of action antipyretic celexa online pharmacy esomeprazole magnesium canadian pharmacy 24 hr review no prescription online synthroid cialis 5mg prix apoquel buy online arimidex for men dosage lasix 100 mg canadian pharmacy mestinon for myasthenia gravis