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.

valtrex valacyclovir 500 mg tadacip tadalafil 20mg buy strattera generic farmacia online augmentin purchase viagra cheap buy celebrex 400 mg buy cheap valtrex viagra online tn synthroid 20 mg viagra online walgreens clomid buy 25 mg year viagra generic viagra ordering online diflucan caps 150mg viagra generica canada costo lasix 25 mg generic strattera launch buy viagra hk generic diflucan tablet tesco viagra buy lisinopril 20 mg generic glucophage generics 200 mg erythromycin phosphate herbal viagra 6800 mg buy viagra walmart cialis 20 mg siparisi blackking generic viagra lexapro 5 mg treatment generic drugs viagra 150mg canadian viagra clomid 100mg zwanger levitra 5 10 oder 20 mg order viagra cod cialis online buy medicina cialis 5 mg generic cialis chewables 2 pills 10mg cialis buying cheap cialis buy viagra 500mg 500 mg zithromax cheapest kamagra jelly cheap clomid 100mg doxycycline 50 mg dental cheapest levitra 100 buy diflucan tablet prednisone 40 mg bid hmgr metformin viagra hydrochlorothiazide 50 mg tab phenergan 25mg online viagra 25 mg etkileri 5mg of propecia canadianpharmacyonline viagra coupon buy propecia 1mg comprar priligy generico phenergan epocrates online google viagra 800mg doxycycline 100 mg prescription nolva clomid buy viagra dosage 100 mg cyproheptadine periactin 4mg 20mg cialis cheap buy viagra paypal buy bactrim suspension take levitra 40mg zoloft 50 mg sospensione nexium 40 mg colombia viagra generic indian celebrex bleeding disorders levitra 10 mg preis 80 mg strattera adults 300 mg zoloft overdose doxycycline generics glipizide metformin 5 500 mg propranolol al 40 mg augmentin 312 mg montreal buy cialis tetracycline 200mg lisinopril 10 mg medication viagra generico brasile clomid 50mg ingredients levitra 20 mg india viagra 100 oder 50 mg zithromax dokter online local generic viagra buying metformin tablets 5 mg di cialis buy zoloft 100mg generic valtrex tablets viagra online narudzba blue zoloft 50 mg buy viagra topix cipro generic ciprofloxacin red viagra 100 mg australian viagra online xenical pills online wellbutrin xl 600 mg online viagra good 500mg tetracycline antibiotic nexium 40 mg indicatii propranolol hydrochloride 20 mg augmentin 875 mg forum cialis 20mg everyday simge viagra periactin tablets 4mg generic kamagra pillen generic levitra cvs buy lexapro mexico generic lexapro mages walmart lexapro generic metformin 1000 mg n3 100 mg viagra online lexapro 5 mg price lexapro 30 mg anxiety cheapest cialis soft order viagra sample buy synthroid australia thuoc augmentin 625mg buy propecia where cytotec generic name buy augmentin 625 buy priligy europe order cialis daily cheapest cipla viagra levitra dosage 100mg cialis cheap online levitra generic viagra 50 mg zoloft dose viagra 100 mg cheap augmentin 250 mg dosis lexapro generic us lasix 12.5mg propecia singapore online celebrex celecoxib generic diflucan 50 mg doxycycline epocrates online antidepresivo lexapro 10 mg zovirax 200 mg prix zithromax 750 mg enough xenical 120 mg presentation 50mg viagra effect levitra 20mg sale generic viagra 130 mg viagra 30 lu 100mg viagra 400mg dosis 7.5 teva prednisone 50 mg viagra online perth cialis 20 mg good wirkung viagra 100 mg cialis rx 20 mg cipro 250 mg pille kamagra 100 online clomid 100mg tweeling buy levitra kamagra bactrim 800 mg dosage buy phenergan online order buspar online bijsluiter cialis 20mg synthroid 0.137mg doxycycline 100mg abortion viagra kupiti online 75 mg strattera 3 discount generic viagra lexapro 20 mg 4 weeks lisinopril 10 mg dose viagra free online viagra 100mg nebenwirkungen generic valtrex coupons lasix special 500 mg sildenafil 50 mg viagra 1000 mg propranolol all generic viagra buy cytotec pills mtabs cialis 5mg nexium generic for cialis 20 mg jakarta cheap phizer viagra viagra 50 mg tabs bestel kamagra online buy viagra register zoloft de 50 mg cialis 20 mg tabletten buy nolvadex prices cialis 10 mg australia propecia cheap australia buy professional levitra 1 mg prednisone dogs beand viagra online doxycycline 75 mg generic prednisone 40 mg alcohol walmart generic lexapro zovirax tabs 800mg cd 27 clomid 150mg viagra generics paypal il viagra online cialis sales online buy cheapest cialis zovirax online buy cheapest propecia prices natural generic viagra online female viagra cialis 20mg pret levitra kaufen online pret diflucan 50 mg cheapest lexapro price 5mg lexapro withdrawal online viagra green generic viagra lasix 20 mg tabletten levitra 10 mg schmelztabletten makes generic levitra online buy viagra lisinopril 10 mg pink zithromax order online lexapro generic dosage viagra rx online buy propecia fast viagra 5 mg buy online levitra el viagra generico diflucan cream buy cialis generic effectiveness buy doxycycline canada augmentin 600 mgs viagra 100mg half cheap levitra 40 mg augmentin 125 mg diflucan 200 mg costo buy nexium 20 capsule buy viagra 150mg levitra 10 mg 8 stuck buy discount cialis doxycycline 100mg herpes cialis professional cheap canada 2.5 mg cialis wellbutrin 250 mg 12 generic meltabs viagra cipla clomid 50 mg viagra buyonline lexapro generic ingredients cialis 20mg 4 buy cheap viagra 100 cialis 50mg philippines viagra online bangladesh india levitra generic is viagra generic wellbutrin xl 150 generic nz generic viagra levitra od 10 mg doxycycline hydrochloride 100 online 300 mg of wellbutrin cheap generic viagra 150 lexapro 150 mg zoloft 100 mg n3 30 mg of propranolol buy kamagra london viagra buy 500 mg zithromax cialis 5mg long farmaco wellbutrin 150 mg viagra buy ionline cialis pro 40 mg prednisone zentiva 20mg book viagra order celexa citalopram 20 mg dominican generic viagra clomid to buy generic augmentin costs viagra cheap drugs original cialis 5mg metformin 500 mg medicine 200 mg zoloft day kolkata buy viagra zoloft 25 mg vidal buy viagra nsw 500mg valtrex daily buy chewable viagra order phenergan online levitra perscription online viagra 25 mg works 30 mg of lisinopril valtrex generic 1 gram buy propecia singapore dapoxetine generic india 50 mg strattera buy propecia au lexapro mg size buy prednisone australia strattera 80 mgs costo celebrex 200mg purchase viagra gold 1000mg 1 nexium 40mg best levitra generic buy pct nolvadex celebrex 400 mg cap propranolol 10mg dawkowanie green kamagra 100mg propranolol sa 160 mg levitra 20mg 8 clomid generic multiples lexapro cheap generic buy 500 mg zithromax 80 mg strattera online synthroid mgs buying viagra 100mg q buy viagra augmentin 875 mg uti 600 mg of wellbutrin 1500 mg zoloft generic 10mg cialis lisinopril sleep disorder teva generic wellbutrin cialis 5mg prostata doxycycline hydrochloride 115 mg levitra de 10mg levitra bestellen online buy augmentin 625mg buy viagra jellies celebrex 4oomg levitra 100 mg fiyati generic zoloft lawsuit levitra 10 mg yorumlar doxycycline 100mg antimalarial 40 mg prednisone 3 days generic viagra prices free viagra online professional viagra generic taking cialis 40 mg buy lasix 12.5mg doxycycline 100mg bp synthroid dosage .025 mg wellbutrin sr 150 mg soft cialis 40 mg lisinopril 2.5 mg medicine nolvadex 25mg strattera 18 mg capsules online kupovina viagra beli viagra online nexium 40 mg cpr augmentin dawkowanie 500 mg generic wellbutrin 150 mg apteka online clomid cialis 10mg walmart buying viagra budapest augmentin generic drug generic cialis isosorb viagra buy kiev viagra 50 mg effetto cheap lexapro kamagra online cheap cialis 5mg ejaculation shop clomid 50mg 20 mg prednisone pregnancy levitra 20 mg canada zovirax acyclovir buy 1 cialis generic viagra price valtrex 500mg nolvadex online kopen 2.5 mg. levitra propranolol 40 mg pret price cialis 25 mg buspar 5 mg erowid generic viagra health erythromycin 125 mg 5 ml propecia buy online valtrex 500 mg tab clomid 100mg instructions phenergan promethazine 25 mg ebay generic viagra xenical generico preco viagra tablets online generic viagra jel tijuana generic cialis viagra online slovenija propranolol inderalici 10 mg cialis purchase online prednisone 20 mg webmd nexium 20 generico cialis 20 mg vs acheter cialis 10 mg metformin 500 mg diet 2 50 mg viagra cialis took 20mg lasix 80 mg dosage viagra online 50 mg doxycycline tablets 150mg metformin ct 500 mg hydrochlorothiazide cap 12.5 mg multiples clomid 50mg generic viagra bahamas cheapest viagra pharmacies cheap canadian levitra 80 mg nexium safe generico viagra 100mg clomid 25 mg pct buy doxycycline 200 mg viagra cobra 125 mg zoloft online order strattera online bestellen buy vibramycin doxycycline xenical india online buy viagra ecstasy priligy 30 mg prezzo wellbutrin generic pulled cialis 5 mg dipendenza buy lisinopril 5mg buy viagra vardenafil cialis 2.5mg augmentin 620mg viagra online generico glucophage 2500 mg amoxil vet 200 mg cipro 500 mg medication levitra 20 mg kullanimi cialis 05 mg cialis cost 5mg 20 mg cialis directions levitra generic name lisinopril 5 mg tabs generic levitra cheap doxycycline 100 mg shortage cipro 750 mg fiyat nexium mups 20 mgs zoloft vs generics glucophage online buy medicamento augmentin 875 mg generic viagra drops zithromax online india strattera speech disorder levitra 2 5mg buy cialis 50mg pfizer viagra 100mg viagra 100mg kosten generic lasix images wellbutrin dosage 300 mg 25 mg viagra fiyati search cheap viagra clomid 200 mg twins taking 3 cialis 5mg levitra 5 mg mexico spain kamagra online priligy generico prezzo generic levitra cost zoloft generic teva 50 mg doxycycline liquid doxycycline 20mg pharmacy lasix 500 mg rumania cialis cuantos mg buy augmentin suspension cheapest brand cialis viagra 100mg preise levitra 10mg hr propecia goiing generic strattera tic disorder lexapro to buy buy zithromax suspension about cialis 80 mg doxycycline hyc 100 mg strattera generic version levitra uk buy cheap prescription cialis propecia buy generic bijwerkingen celebrex 200 mg lexapro 20 mg info cialis 5mg boite cialis 10 mg vademecum prednisone 5 mg dose buy amoxil bencard ubat doxycycline 100mg buy cialis sydney viagra online delivery cialis generico italia mg lisinopril hctz canadian viagra online cialis 120mg zovirax cheap cream prednisone dosage 60 mg propranolol 40 mg comprimido cipro 500mg generic cialis 10 mg kanada levitra cheaper lisinopril 20 mg dosing viagra 100 mg reviews cheap cialis 10 mg prednisone 40 mg methylprednisolone nexium 20mg alcohol ranbaxy generic cialis nolvadex mg pct lexapro 30 mg withdrawal buy viagra mastercard cheap discount levitra xenical tablets 250mg wellbutrin 50 mg sr lisinopril 10 mg sandoz 600 mg cialis 25mg of viagra viagra buy forum to buy nolvadex prednisone cats 5mg buy wholesale cialis