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.

order viagra melbourne paypal overnight cialis efectos levitra 20 mg cialis lilly 20 mg erythromycin dental uses 40 mg nexium dosage price viagra singapore lisinopril 20 mg bid mexico pharmacy viagra tetracycline oral use zovirax suspension nebenwirkungen buy 3 dosage zithromax synthroid 0.125 mg tablet viagra 100mg indien price propecia prescription pfizer viagra 300mg nexium cost ireland 100 mg viagra better 20 cialis canadian pristiq and buspar doxycycline 500mg capsules kamagra lasix 40 mg nedir rogaine without propecia bodybuilders using viagra xenical user feedback propecia 1 mg effectiveness 400 mg. viagra clomid 50mg bula viagra bottle price valtrex 500 mg cost buy nexium mups viagra discount offer buy zithromax europe viagra prices tesco metformin diabetes mellitus scrub typhus doxycycline buspar emagrecer buy viagra herbal 40mg nexium bid overnight cialis cheap lisinopril 10 mg description prednisone dose tablets use cialis women principio ativo buspar is 5 mg cialis viagra canada. price 100 mg generic viagra get nolvadex australia purchase zoloft canada prednisone 5mg prescribed effetti cialis 10 mg lasix natriumausscheidung cialis kaufen europa prednisone uses allergies lexapro espasmos musculares costco cialis cost cytotec 200 mg uso levitra 60 pills nexium drug group viagra germany price levitra user reports valtrex tablets price zithromax online delivery viagra pakistani price nexium 20 mg pack generic augmentin dosage bactrim 400 80 mg tablet 200 mg zoloft dosage online cialis satis viagra 250 mg cost of doxycycline stop cialis flush buy 1000 mg zithromax cat costa celebrex strattera 80 mg prices lexapro available canada order bactrim online cialis without rx propranolol thrush modo uso levitra augmentin causes gas actavis hydrochlorothiazide 12.5mg diflucan nausea lisinopril sinusitis uso do lexapro cialis dangerous forum order viagra online generic viagra soft 100 cialis 2.5mg daily cipro oral tablet cialis prostate disorders buy xenical us viagra genuine cheap strattera 25 mg cost generic periactin pills tetracycline antibiotics purchase buspar dosage effective weddings online clomid lasix purchase online cipro 500 mg wikipedia buy diflucan 150mg propecia price uk nexium have generic cialis 100mg forum drug like celebrex abilify wellbutrin together indian levitra muscle spasms bactrim african viagra sales zovirax pills breastfeeding cialis generica 40mg kamagra hoeveel mg viagra online prescription tabletat nolvadex.d prednisone tablet 477 cialis online comprar buspar class drug penicillin tetracycline together zovirax cost treatment celebrex information canada pin viagra india india labs nolvadex buy Cialis Jelly 90 bactrim uk pharmacy posologia lasix 25 mg buy propranolol 40mg tetracycline antibiotics drugs buspar prozac combination kopen cialis 40mg buying cialis uk viagra price shopper cipro nail fungus cialis 12 20 mg viagra generico roma viagra plus yohimbe viagra online korea medicaments cialis 5mg cialis de 0.5 mg augmentin pseudomembranous colitis levitra 20mg canadian viagra pfizer design lexapro 5 mg deutschland prednisone 2.5mg tab strattera discounts coupons usp 31 strattera assay strattera discussion board metformin milchprodukte lasix colombia 20 mg nolvadex dosage price metformin drug uses lexapro generic canada gnc viagra canada cytotec wirkmechanismus zithromax drug information cytotec tab 200 mg buy cialis re nervousness and viagra taking 2 10mg levitra without ed cialis buspar dopamine agonist nhs prescription cialis provilus v propecia zoloft tablete 50 mg propecia 5mg viagra 100 mg reviews buy overnight cialis discount prices viagra cialis 20mg tabs enterococcus species doxycycline define lasix drug buspar withdrawal schedule xenical online au harga levitra 5 mg costo di zoloft prednisone 10mg purchase cialis generic info buspar medication wiki cialis 20 mg prospecto propranolol 20 mg bid celebrex and tinnitus keburukan cialis zoloft 25 or 50 mg viagra propecia together celebrex pill description antibiotic doxycycline 100mg drug dosage doxycycline cialis generic review cytotec drug guide prednisone for menopause pulsatile tinnitus celebrex london pharmacy cialis herbal viagra 6800 mg buy viagra france xenical rx dosage strattera canada acheter viagra usa propecia cost pill clomid purchase australia kamagra 6 hour delivery phenergan usage prednisone for sinuses flagyl plus cipro online legal cialis buy metformin er qualitest lisinopril 10mg greenstone pfizer zoloft viagra cheap raleigh pfizer viagra kopen celebrex recall pfizer cialis brand online purchase bactrim 800 paypal multi focus lasix orlistat alli tablets viagra 50 100mg zithromax prescription cost indian generic viagra levitra 20mg 8 st lexapro untuk apa cialis prescription get generic viagra suppliers propecia causes ed order manly viagra viagra drug class metformin plus glyburide augmentin duo 250mg drug lexapro used viagra generic legitimate buy cipro singles lisinopril drug insert cialis 100mg sale prednisone mood disorder 20 mg daily cialis genuine cialis 5mg erythromycin pertussis treatment buy levitra discount glucophage purchase online levitra generic viagra viagra users discussion celebrex 100 mg used buyin nolvadex ireland zoloft from canada wellbutrin 150 mg enough generic valtrex price steakhouse viagra trangle precio cialis 5mg prednisone evil drug clomid 50mg walgreens viagra unusual uses cialis 5 mg ceny cheap viagra europe budget viagra zoloft reviews australia propecia dubai prescription lasix 12.5mg cost zovirax costo cialis online rx glucophage lantus levitra 20mg srbija viagra pfizer harga prescription for nolvadex viagra cost walgreens 2011 cialis 100 mg lilly famous indian viagra clomid 50 mg prescription drug category strattera lexapro pharmacy using clomid unprescribed cipro antibiotic 500 mg lasix drug schedule strattera flushing priligy online review viagra canada review tetracycline fusaric acid buy lexapro cheap cheap lisinopril hctz prescription valtrex online costanza cipro common buspar dosage xenical orlistat drug starting 20 mg lexapro wellbutrin ve uykusuzluk augmentin suspensie 7 ani levitra online rezeptfrei ranbaxy viagra cheap generic lexapro date buying 4 250mg zithromax lasix 40 mg infarmed generic dapoxetine 60mg buspar after benzo paroxetine buspar lasix tabletten dosierung viagra legal canada usage cialis 5mg xenical uk cheap zithromax 500 mg pulver costo propecia svizzera metformin causing vertigo cialis 20mg tadalafila get xenical online metformin buy online viagra pricing us lisinopril mg buy lexapro sale lexapro and nervousness clomid target pharmacy generic viagra instructions synthroid causing hypoglycemia usos zovirax buspar pregnancy safe celebrex generic name cialis dad 5mg nortriptyline versus lexapro cialis tablets used cialis 100mg. price doxycycline infusion rate discount cialis free efectos cialis generico doxycycline is dangerous cytotec interactions medicamenteuses prednisone price india cialis 5 mg doctissimo zovirax pills used generic lexapro list viagra kaufen preis simvastatin plus viagra prescription drug cipro tadalafil cialis 500mg clomid online nz cipro purchase online lexapro 20 mg pricing clomid 100mg overweight doxycycline 150 mg day quanto custa lasix get wellbutrin online powerful viagra tablet zithromax 500 mg dosis viagra 25 mg бrak zithromax drug indications cialis 5mg diario viagra rx canada diflucan 50 mg advantages sinoretik lisinopril 20 mg pfizer viagra preis cialis 20 mg 10 pills canada levitra safety prednisone dogs online 16 mg prednisone hives strong cialis 40 mg wellbutrin 150 mg withdrawal diflucan user reviews levitra prescription dosage interaction medicamenteuse cialis wellbutrin klonopin together lasix pharmacy lexapro withdrawal 2.5 mg infectious mononucleosis erythromycin albuterol generic ventolin quando viagra generico indian viagra equivalent zovirax chemist warehouse propecia causes shedding wellbutrin australia antidepressant drug fever lasix buy brand valtrex viagra price pkr found viagra husbands viagra india himalayas apotex generic viagra synthroid 200 mg kamagra 12 tablets teva generic wellbutrin lexapro 2mg 1000mg zithromax lasix 80 mg online diflucan usos pcos clomid 150 mg prednisone buy cheap 1 mg prednisone safe zoloft pill identification canadian viagra overnight clomid 50mg erfahrung prednisone 1 mg 30 mg buspar muse eller viagra cialis filmtabletten 10 mg buy cialis cheaply cialis cause hemoroids doxycycline nausea fever phenergan vs. cheratussin cymbalta strattera together clomid uk pct 200 mg viagra dangerous buy valtrex buspar et prozac buspar viibryd kamagra brausetabletten frau 20 mg propranolol anxiety viagra pfizer confezioni zoloft muscle stiffness crush diflucan prednisone uses chemo wellbutrin muscle pain cialis split pills strattera medication prices viagra 50 mg uso cipro authorized generic viagra causa diabetes viagra pfizer direkt bactrim tablets dosage valtrex price costco uk viagra liquid celebrex 200 mg tabletki lexapro generic liquid cytotec tablets dosage buspar or klonopin viagra coupons pfizer doxycycline 100mg cats prescription viagra coupons get viagra uk buy 100mg viagra zoloft prescription strengths buy 1oomg clomid zithromax buy generic mercury drugs viagra cipro 500mg paypal viagra drink kaufen generic xenical canada cytotec o generico viagra de 25mg my rx cialis doxycycline 200mg cena propecia 4rx pharmacy prices levitra xenical api price overnight viagra viagra generika 100 mg viagra price qatar cytotec sale philippines cialis canada purchases viagra causes afib strattera generic approval prescription for cialis augmentin tablet uses bactrim thyroid disorders cialis generica contrareembolso diflucan online uk augmentin 500mg 125mg viagra brand overnight bactrim muscle aches zoloft causing restlessness cialis 5 mg works levitra dose rxlist buspar kidney stones indianapolis viagra viagra cheapest canada zovirax pills online lexapro causing anger buy viagra cyprus cialis target market prednisone 20mg. mayo chennai viagra tablets lisinopril pill strength buy cheapest cialis periactin 4 mg used viagra 50mg australia buy cialis powder diflucan 100 mg tablets lisinopril 20 mg fish glasgow buy cialis cytotec 500mg cheratussin and lexapro buspar and imitrex nolvadex tablets used viagra pharmacy australia viagra pricing india nexium medication uses lexapro ssri drug viagra singapore buy cheap nexium canada clomid best price 4 pills of cialis viagra prescription prague sedefil online viagra propecia cvs price lexapro cost help get viagra cheap lexapro celexa drug glucophage rxlist cheap cialis india 10mg prednisone dosage household viagra alternatives tabletes propecia comprar levitra online viagra chennai price metformin er generic cialis 10 mg wiki lowest cost synthroid levitra 10 mg canada viagra online ordering cialis confusion obese sous clomid generic valtrex manufacturers olanzapine fluoxetine generic propranolol tab 80mg kamagra 100mg prijs cheap viagra tablets synthroid drug reactions viagra flushed face erythromycin cause spots buy zoloft prednisone dosage 60 mg cialis prescription cheap cialis online paypal 2012 malvern house cipro ibuprofen valtrex together zovirax 400 mg filmtabletten kamagra green tablets cialis 5 mg two levitra, worldwide sales 30 mg cialis dose online viagra in zovirax 800 mg precio order cialis prescription viagra buy clomid dublin lasix backorder metformin 1000 mg spc extreme exhaustion lexapro ordering lexapro canada synthroid prices walmart cipro 500 mg nedir nexium cause depression zoloft 25 mg color viagra cvs price metformin er 750 mg 143 walmart cialis price generic augmentin antibiotic viagra online jamaica costo cialis 2 5 mg celebrex 50 mg image bactrim pill id pfizer viagra recall viagra generico paypal levitra 5mg bestellen lisinopril 5 mg purpose cheap viagra wholesale teva wellbutrin generic cialis 3 capsules 100mg erythromycin 250 mg effectiveness getting aroused cialis lexapro nausea diarrhea nexium globus hystericus cialis tablets usa cialis price 2.5 mg cialis 20 mg kullanimi cialis 5 mg dauertherapie 25 mg zoloft anxiety zithromax 250mg israel use cialis dosage odchudzanie tabletki xenical nausea after zithromax nexium 10 mg dosage levitra generic prices students using viagra nexium price compare wellbutrin xl dangerous viagra india herbal drug interaction phenergan nexium 75mg prednisone 400mg strattera capsules 40 mg viagra untuk perempuan buspar uk nhs cialis kaufen bangkok online cialis canadian cipro costo vita priligy costo farmacia levitra buy discount walmart valtrex cost viagra indian made ubat celebrex 400 mg viagra en bloeddruk drug lasix 20 mg costo pillole viagra zoloft pill strength generic propecia sandoz augmentin 500mg tab valtrex costco metformin causing fatigue 40mg of lasix cymbalta lexapro together androgel propecia together generic levitra 2.5 lloyds pharmacy propecia buy doxycycline periostat cipro cause tiredness viagra sales online alternative uses lisinopril doxycycline 500mg reviews buy propecia regrowth cialis 100 mg generic buspar not available buy kamagra china metformin drug screen componentes lisinopril 20 mg amoxil 875 mg tab viagra 12.5mg experience buspar quit smoking lisinopril 30 mg price metformin 500 mg diabetes nexium for nausea valtrex leukemia propecia principle muscle strattera drug screening cialis lowest prices order doxycycline uk viagra generico spagna percription viagra cost buspar kick in propecia online canadai cheap viagra japan cialis tadalafil USA xenical uk pharmacy prednisone 25 mg compresse everyday use cialis buspar drug classification cost cialis 5 mg clomid online kaufen petraeus cialis index zovirax cvs price sandoz generic augmentin 3000 mg viagra skusenosti cipro price list zithromax suspension strength new viagra 150 mg prescription like viagra purchase bull viagra lasix ret 30mg bactrim suspension 120mg cheapest cytotec buspar 30 mg dividose kamagra jelly 100mg viagra pills uses kamagra costa blanca boots cialis cost erythromycin resistance bacillus amoxil 100mg kamagra postorder glucophage diet pill comprare viagra online prednisone plus vicodin pfizer zoloft australia buspar and steroids viagra professional 100 mg generic lexapro when buspar 3 times daily levitra pill shape amoxil suspension uses abuso del viagra viagra price quote celebrex drug dose zoloft 50 mg filmtabletten viagra pfizer 100mg genuine pfizer viagra lisinopril 40 mg dizziness buy zithromax pharmacy nexium esomeprazole prices tetracycline 500 mg acne viagra bali buy cost viagra medco valtrex prescription help generic cialis sweden price viagra pharmacy stop using viagra viagra forum dyskusyjne viagra prescription insurance lexapro overdose mg cialis 10 mg effects cialis online 50mg levitra kaufen 10mg viagra pills soho usos del cytotec metformin generic problems celebrex discount coupon Levitra pill online cipro 500mg ingredients celebrex 200 mg obat bactrim uses diarrhea propecia finasteride uk india viagra company zithromax dosage pfizer levitra 20 mg sale doxycycline hyperacusis online genuine viagra cialis wholesale uk prednisone 20 mg zentiva cost propecia merck 007 power viagra pill walgreens cost levitra levitra odt australia propecia costs comparison buy doxycycline 100 online lexapro price malaysia lasix come usarlo viagra purchase pakistan posologie bactrim suspension synthroid prescription assistance online propecia canada Cialis Professional 90 pills augmentin 12h susp buspar pain weaning lexapro generic cialis 5mg cijena lexapro buspar combination kamagra uk max viagra discount sale cost low propecia nexium 40 mg kairos colour viagra tablets wellbutrin plus pristiq viagra 100mg china viagra 2 li tablet 200mg generic cialis viagra online register viagra canada paypal bactrim suspension 800 mg dangerous split cialis bactrim suspension turkce overnight cialis fedex generic viagra business metformin 250 mg dose viagra flushing prevent priligy wo kaufen erythromycin 250 mg tablets viagra prices nz metformin drug dose cipro generic ciprofloxacin augmentin streptococcus pneumoniae costa rican cialis augmentin for proteus drugs containing hydrochlorothiazide prednisone tablets skin chinese viagra pills erythromycin 800 mg lasix medication australia amlodipine lisinopril tablets lustral and cialis synthroid rx assistance towards metformin prodrugs anavar tribulus clomid viagra plus buy glucophage uspi levitra overnight viagra 50 mg jovenes viagra superdrug uk drugs like lisinopril ordering metformin online zoloft berapa mg buspar complications cialis kaufen mallorca kur nusipirkti levitra lexapro 5mg alcohol augmentin comprimate 875 mg levitra 20 mg indicazioni uses for cipro 500 generic zithromax bad viagra salesman viagra at costco tetracycline hydrochloride usp levitra 10mg cost prices levitra 20mg wat doxycycline 100mg prednisone causing spotting generic viagra deutschland doxycycline tablets 100mg propecia cheapest uk phenergan elixir uk prednisone 8mg uk prescription viagra yahoo erythromycin and thrush viagra 100mg effets zovirax tabletten preis buspar vs atarax lexapro 20mg canada zithromax 400 mg suspension lasix generic names buy cialis florida doxycycline 100mg alcohol usos de lexapro splitting 50mg viagra buspar zombie buy propecia usa taking 75 mg wellbutrin generic viagra plus buspar message board london drugstore cialis levitra de 100 mgs buy propecia bangkok phenergan 25mg wiki buspar 15 mg recreational zoloft buspirone pfizer viagra 200mg beipackzettel lisinopril 10 mg doxycycline mono tablet 200 mg doxycycline gum doxycycline 500 price prednisone buying online clomid order paypal cialis 50mg shop cialis 30 lu 100 mg canadian pharmacy zithromax strattera pill size nexium causing constipation stopping prednisone use cialis prices canada prednisone pill 50 92 cialis cheapsarasotafl buspar patient teaching cipro resistance india xenical tabletes celebrex drug contraindications average mg zoloft buspar and vicodin generic medication lasix lisinopril tableta precio lisinopril 5 mg zoloft 100 mg precio nexium dr price use viagra sperm cytotec de pfizer took 2 cialis 20mg augmentin generico bustine buy viagra miami india viagra sildenafil cialis age use nexium generic 30 pills buy periactin canada levitra 20mg forum using cialis dosage tetracycline discus bolus of lasix 60mg prednisone cialis 50mg todalafil buy strattera american canada cialis rx celebrex tablets ingredients augmentin 457 mg prospect buspar eye problems doxycycline muscle pain amoxil 250mg 5ml viagra switzerland prescription buspar reviews espanol nexium 10 mg praf buy cipla clomid cytotec mercury drugstore buspar vikt doxycycline 100mg dogs doxycycline dosis vergeten cialis backache cause lisinopril 10 mg indicaciones canadian supplier viagra kamagra 100mg england cipro causing pain valtrex and nausea india nolvadex xenical tablete cijena canada levitra price prednisone 30mg lexapro patent canada 100mg wellbutrin xl doxycycline harm fetus nolvadex order online kamagra online shop viagra generico guadalajara female viagra menopause zovirax tablets generic cialis 5 mg tabs cialis 20 mg murah 21 genrx doxycycline diflucan generic price viagra pill price cost and cialis viagra drugs test cialis online 2.5mg ambien wellbutrin together zovirax uso ocular 20 mg to levitra herpes drugs valtrex nolvadex 20 mg kaufen walgreen cialis prices lexapro tablets 20mg 40 mgs of cialis cialis patient uk 50mg doxycycline arthritis brand zoloft online viagra postmenopausal women viagra generic australia lexapro ibuprofen together apollo pharmacy viagra cipro liquid price walmart pharmacy synthroid celebrex 200mg kosten lichen planus celebrex online cialis uk prednisone 20 mg tablet viagra cost australia buying clomid pct viagra direct india cvs diflucan price boots pharmacy cialis tetracycline therapeutic use viagra prescription code googlle levitra pills prices cialis 10 mg viagra pharmacy direct alternative viagra india buy injectable lasix genuine lexapro price doxycycline 100mg webmd nexium 40 mg faydalari strattera 120 mg levitra qatar price priligy purchase online strattera online kaufen buspar ja alkoholi buspar and dementia cialis drug tolerance buspar teva 54 walmart pharmacy propecia lexapro overdose 1000mg sildenafil dapoxetine india cialis tablete 5 mg xenical comprar generico buy viagra overcounter india cena cialis nolvadex prescription gyno prednisone 20 mg 3 days viagra prescription savings lilly cialis kaufen viagra 100 mg 8 augmentin 875 dosage sinusitis xenical achat canada edema prednisone use viagra tribulus viagra pharmacy review clomid causa espinhas viagra 100 street price viagra tablet rupees hibiscus lisinopril lisinopril 20 mg pfizer viagra gel zovirax in india finasterride versus propecia viagra uk 150m lisinopril tabletas viagra online mdu generic lisinopril diabetes zithromax drug allergy canada cialis 5mg cipro online buying strattera mg kg mexico cialis 2.5 mg doxycycline 100mg wiki cipla viagra buy lexapro pill id forum glucophage 500mg wellbutrin iv use usando levitra symptoms using prednisone wellbutrin medlineplus strattera lexapro together cialis 5mg nebenwirkungen usos bactrim f cipro pediatric suspension lexapro street price viagra lausanne propecia merck online 800mg viagra lisinopril 1 mg diflucan 150 mg prescription xenical in canada 40 mg propranolol pregnancy viagra costs honolulu malaysian cialis 50mg zoloft cause gout controindicazioni lasix 25 mg about clomid 75mg compare prices levitra viagra pill women prednisone 10mg identification canada viagra safe lisinopril actavis 5 mg viagra forsale getting sample viagra cialis 40 mg overdose amoxil generic brand synthroid generic problems valtrex mouse traps review 2.5 mg cialis tetracycline target species drug addicts viagra mg of phenergan sweiss nexium price free cialis prescription generic 36hr cialis price propecia canada cialis 20 mg deutschland zithromax treatment sinusitis cytotec pills miscarriage spray nasale viagra buy nexium coupon buspar gastro cialis 20 mg exp 042014 buy diflucan tablet viagra canadian sales lisinopril 5 mg bula uk kamagra cialis 20mg couper pfizer levitra forum cialis 20 mg augmentin 625 mg 21x morning nausea zoloft cialis discount uk cialis generico contraindicaciones clomid 100mg miscarriage cvs pharmacy levitra canadian pharmacycom levitra clomid 100 mg success bactrim syrup usage buspar love custa strattera metformin versus metformin lasix infusion rate lisinopril cough dangerous professional cialis 20mg nexium 40 mg walmart doxycycline cyprus cost of metformin 500 ebv virus valtrex kamagra 150 mg info buspar risperidone quantos custa levitra cialis reflusso gastroesofageo viagra internet uk lasix generic dosage lisinopril muscle atrophy amoxil 875 mg dosage nolvadex kaufen rezeptfrei viagra rx assistance propranolol dangerous cialis generico delivery cipro causes anemia zithromax dosage sinus generico cialis andorra generic drugs lexapro generico viagra sandoz walmart 5mg cialis mgus vs cialis diflucan 150 mg costo clomid robitussin pregnancy wellbutrin causing blackouts metformin mouse cancer buspar fast acting viagra perscription online skipping zoloft pills zoloft pfizer venezuela doxycycline 20mg canada cipro registration online buy generic wellbutrin opus nexium using levitra everyday viagra price hyderabad priligy mercury drug 75 mg clomid twins cipro registration prices lexapro generic tablets lasix use pneumonia celebrex use symptoms cialis 5 mg turkey xenical canada online viagra useless nexium tablet capsule cialis generico pericoli 40mg cialis reviews order 50mg viagra buy amoxil cheap metformin 500 kaufen levitra austria apotheke generic zovirax buy cialis user reviews viagra price 100 uk cheapest oem levitra buspar bijsluiter prednisone axapharm 5mg lamictal plus zoloft generic wellbutrin headache viagra generic leagle synthroid generic version doxycycline 40mg cytotec misoprostol canada cialis 20mg malaysia doxycycline online express lexapro happy pills zoloft at 50 mg viagra cost australia 2011 two 10mg cialis prednisone causing flushing strattera online canada augmentin price malaysia lisinopril tablets 40 mg uk kamagra con propecia in theuk zovirax wo kaufen over 40 using clomid viagra canada toronto viagra iskustva forum diflucan uk price propranolol foetus uk viagra tabs buy viagra paysafe ampicillin versus amoxicillin xenical 120 mg english japan buy viagra wellbutrin xr uses metformin 850 mg overdose clomid fast delivery doxycycline 40 mg generic nolvadex 20mg tablets cialis 40 mg difference buy bayers levitra buy kamagra brisbane buy viagra 100g valtrex discount program viagra suggested use zovirax infusion cialis online information buspar propranolol tetracycline capsules 500 mg 20mg cialis worth pfizer viagra description prescription free cialis costo clomid propecia price generic augmentin drug class viagra online com safely buy viagra prednisone bipolar disorder zithromax 250mg canada synthroid doses mg lisinopril 10 20 mg lisinopril generic walmart fungsi cialis 20mg 100mg viagra walmart cumpara cialis online generic cialis ingredients zithromax sp 200mg pemakaian clomid tablet fungsi tablet metformin precios cialis 10 mg wholesale c20 viagra buspar medication information viagra instructions use kamagra viagra cheap drugs like valtrex cellcept without prednisone erythromycin to buy zovirax filmtabletten 400 mg trustable generic viagra zyprexa versus abilify synthroid mgs unlabeled use lisinopril pfizer viagra anwendung viagra generico 50 mg generic lasix drug online doctor xenical viagra 100 mg fta cialis 5mg blind Levitra 10 pills order levitra half tablet viagra generic thehun kamagra 100mg flashback zoloft schedule drug paxil buspar cipro 250 mg tabs i take buspar propranolol 50mg zovirax oral uses phenergan rus cialis online user buspar forums generic viagra 100m purple generic wellbutrin cialis reviews uk cialis free uk viagra canada india cytotec consecuencias uso cialis 20mg cheapest discount cialis fedex pzn viagra 100mg osama using viagra cipro 750 mg prostatitis buspar nyquil interaction compuesto generico viagra cialis indian doxycycline herxheimer synthroid 0.05mg 250 mg zithromax dosage get cialis doctor metformin causing dizziness bactrim without water cheapest lexapro price nexium 20 mgr cheap viagra forum doxycycline bordetella pertussis viagra online bankeinzug cialis plus aspirin cialis american pharmacy viagra sydney cost cialis tadalafil generic cialis generico costi doxycycline nhs prescription vegetables like viagra psilocybin and buspar buspar cant sleep buy viagra sale phenergan 25 mgs bactrim causes anemia aarp viagra discount cialis cheaper us viagra original propecia prices strattera cheap online purpose of buspar viagra bad pill crushed viagra vaginally liquid cipro cost is viagra prescription rxlist celebrex drug doxycycline anhydrous make viagra costume lexapro canada buy diflucan 150 mg 3 days cytotec tabletas abortivas viagra 25mg cheap tablets viagra name buy nolvadex forum propecia 5mg review metformin 850g tablets cost clomid nhs order xenical pills miami viagra prescription viagra ile mg lisinopril 5 mg manufacturer generico del zovirax phenergan drug test strattera gewichtsverlust pfizer viagra sg viagra drug alternative bactrim generico bula 30 mg prednisone taper prednisone tablet doses prednisone 80mg cipro causing bloating using phenergan insomnia beli cialis 2.5mg pfizer invented viagra generico priligy italia canada viagra cialis cialis forum uk erythromycin pharex price viagra cost mexico lasix costa rica kamagra gold tablet celebrex canada rx viagra usage world synthroid tablets strengths use cialis viagra sublingual viagra 150 mg buspar pill strength costo de viagra valtrex uk buy clomid use metformin generic levitra strips purchase real cialis propecia 5 mg uk zithromax susp neonates buspar driving synthroid 80 mg prednisone drug store buy doxycycline us prednisone dr house 50 vs 100mg clomid lisinopril sandoz 20 mg buy cheap strattera buying doxycycline malaysia chlamydia zithromax 1000 mg canadian drug viagra pegasus cipro nord viagra pill dimensions 25mg viagra reviews clomid 50mg days 3 7 viagra buying canada prescription synthroid glucophage 500 mg tablets zithromax suspension posologia doxycycline 100mg treats celebrex dosage 600mg prednisone tablets scored celebrex yellow pill buy nolvadex genox using zoloft recreationally generic 25 mg viagra synthroid dosages mg viagra biggest customers viagra 200mg pfizer lisinopril mg doses buscar cialis remboursement cialis 5mg zithromax 500 mg used cytotec get watson 347 12.5 mg hydrochlorothiazide 100mg. vardenafil levitra viagra 100mg canada cialis needs prescription metformin safe drug vegetal viagra 600mg gebrauchsanweisung viagra 100mg 11 mg prednisone valtrex 1000 mg buy cialis pill identifyer obtain viagra prescription buspar crazy cialis cheap nz xenical 120 mg dosis zoloft 100mg buy cytotec generico sirve cheapest 150 ml viagra cialis tablets cheap lisinopril causing stiff xenical untuk diet blue pill viagra nolvadex online canada buy viagra oslo prednisone 50mg asthma zithromax suspension flavor kamagra 100mg nebenwirkung metformin online prescription diflucan is dangerous fausse prescription viagra metformin 850 mg tablets kaboom versus viagra viagra pillola rossa buy zoloft generic acquista levitra generico buspar horoscope nolvadex india generic zoloft color viagra drug store experiencias usando viagra synthroid online mexico lexapro drug erowid synthroid dosage .112 mg bactrim paed suspension clomid indian men strattera augmentin cocuklar icin viagra causa necrose how get cialis lisinopril ratiopharm 20 mg red viagra india walmart cialis 2.5 mg lasix uk racing buspar safe anxiety viagra buy paypal wellbutrin plus effexor 140 mg lexapro celebrex generic prices zithromax suspension rxlist drug class cipro buspar jaw propecia cause Levitra 120 pills order kamagra w cukierku metformin 1000 mg effects viagra online real acute sinusitis prednisone order cialis us online prescriptions cialis 2 original cialis 20mg zovirax pills 400 mg clomid for sustanon 800 mg viagra uk doxycycline monohydrate tinnitus doxycycline malaria online wellbutrin 150 mg bijsluiter augmentin sf suspension zoloft oral suspension nexium 20mg wirkung buspar dosage needed pelicula viagra pfizer celebrex indications use buspar 5 mg information xenical online singapore glucophage 500mg tablets 50 ml viagra uk viagra online biz buy zoloft cost valtrex 500mg 30 celebrex dose australia zoloft order 100mg viagra review propranolol 160 mg cialis 25 mg usa glucophage online kaufen viagra online siparis pill besides viagra lexapro prices walgreens viagra de india buy propecia 5mg order viagra ert 100 nexium purple plus cialis generico svizzera viagra 100 usa 3000 mg nexium din canada xenical used for metformin robitussin dapoxetine drug information clomid online kopen online check cialis 1 mg zithromax chlamydia bactrim causes neutropenia sales cheap kamagra xenical 120mg cz augmentin 600 suspension clomid used steroids prednisone acne use lisinopril 10 mg medicine vancouver viagra delivery cialis priminence 50 mg erfahrungsberichte cialis 10 mg drugs like cialis original cialis cost wellbutrin sertraline together cialis generico e20 lupin lisinopril 20 mg zoloft overdose 300mg priligy 60 mg fiyati buspar ativan cipro 500mg vo cialis 200mg tab sanafil 20 mg cialis wieviel mg viagra clomid 50mg tabs hydrochlorothiazide 15 mg nexium 20 mg granulado propecia discount vitamin metformin 500 mg rxlist pfizer viagra monopoly cytotec used for taking two buspar propecia generic equivalent cipro document status uk suppliers cialis doxycycline versus tetracycline viagra 100mg instructions cheap natural viagra pfizer viagra srbija erythromycin cost increase buy cialis switzerland cialis 20 mmg cheap generic clomid are propranolol dangerous clomid tab 50mg cialis informationsales celebrex online discount propecia tablet bosley safe cheap levitra nexium 10 mg indicaciones generic cialis directions wellbutrin purple tablet propecia 0.2 mg buy wellbutrin xl use nolvadex dose use buy synthroid 175 mcg 2 cialis pills clomid online store blue viagra pfizer canadian pharmaceuticals viagra xenical pakkausseloste zovirax 400 mg herpes ranbaxy lisinopril cost precio lexapro 10 mg generic 40 mg cialis generic valtrex dosage celebrex chair price Online Levitra 180 pills levitra 20 mg indicaciones 4 zithromax tablets augmentin 500 mg suspension purchase phenergan tablets get propecia fast nexium and costochondritis doxycycline us army nexium 40 mg packet order lasix cheap uti 200mg doxycycline keguanaan cialis 20mg levitra 10mg tablet 50 mg prednisone asthma cialis fc tablet viagra 100mg nizagara cheratussin ac prednisone viagra prescription discount levitra 10 mg sarajevo buy lisinopril 20mg doxycycline tablets capsules tokobagus viagra generic viagra professional lexapro have generic glucophage costs viagra online secure cialis 10 mg original zithromax 500mg tabs abilify versus celexa viagra houstontx natural viagra pill lisinopril tablets india generic cialis gnc cialis cost canada wellbutrin causes anger buspar personality changes uk propecia costs medline plus prednisone cialis cramps muscle cialis reviews 10 mg online propecia cytotec price manila prices on viagra uk lexapro feline buspar dosage viagra canada women extreme nausea zoloft zoloft generic forum viagra tablet uk nexium 100 mg makes generic cialis costituzione di cipro viagra 150 mg dosage augmentin suspensie de 400 viagra tablet description generic4all dapoxetine viagra online aust switching propecia generic nolvadex causes acne doxycycline 200 without prescription lexapro generic drug cheap cialis drug cialis 20 mg wikipedia viagra of india zovirax 400 mg tabs propecia 0.25 mg results 2013 preco xenical 240 mg viagra online hangery zovirax price list lexapro and 5 mg nioxin propecia together no prescription propecia buspar nicotine viagra kaufen paypal prednisone 20mg tablets viagra kaufen apotheke nexium 20 mg prospect prednisone celebrex together viagra rxmeds propranolol antagonist drug 300 mg tetracycline augmentin 250 mg prospect zoloft 250mg dosage buspar cause insomnia green viagra australia lasix diuretic aus doxycycline generic 1000mg doxycycline drug reactions buspar yahoo propecia athens buy cialis india capsules wellbutrin 300 mg nausea cialis 40 mg einnehmen cialis apteka online cialis charlotte prices douane canada cialis buspar 5664 250 mg doxycycline acne Cialis Tabs Canada wellbutrin generic dosages cialis 300mg price lisinopril api 300 mg wellbutrin xl cytotec misoprostol kaufen canada pharmacies lexapro prednisone 10mg buy kroger viagra cost clomid nolvadex online zoloft sertralin kaufen vistaril and buspar cialis overnight paypal viagra sales johannesburg viagra generic canada buspar jitters celebrex online kaufen generic propecia ireland cipro similar drugs augmentin kaufen buy wockhardt lisinopril splitting viagra tablets 5 htp lexapro together prednisone the pill viagra russe diflucan 100 mg 7 days bangkok viagra price buspar grapefruit juice what causes propecia synthroid sinus infection healthymen buy viagra propranolol 180 mg synthroid white pill cost viagra nigeria drug class augmentin viagra generico illegale generic version levitra viagra thailand phuket zithromax 500 mg ceny viagra discounters viagra without arousal buy clomid american levitra bayer online dosage bactrim 800 mg tetracycline 250 mg acne soft cialis online kamagra viagra clinical uses price augmentin 875 lisinopril 10 mg tabs viagra buy levitra us thuoc nexium 200mg preise cialis 20mg kamagra birmingham uk kamagra pills 500mg mercury drug xenical discount buy viagra bactrim tablet 30 tb diflucan india buy viagra bournemouth cialis muscle aches dosage generic viagra prednisone bc pills nexium 20mg uk cialis australia generic celebrex muscle relaxant cialis billig online buspar getting high buspar pill wiki pfizer viagra gold forum kamagra 100mg