Products == Mess

How to avoid it?

-By Suman Mukherjee
Is your product becoming like this?




   Courtesy - http://www.flickr.com/photos/
adamcathro/1035741023/sizes/m/in/photostream/
Symptoms

Takes too long to fix bugs?
Takes too long to deploy bug fixes?
Takes too long to build features?
Spend too much time doing QA?
You completely depend on one developer for core
features in your app?
Developers are more interested in working on new
features than modifying of existing ones?
You are not aware of how to use certain features in
your app?
Stay on the same page

Understand your domain

Capture the language of the domain

Formulate a vocabulary

Management, marketing and tech team - all on the
same page
Specify specify specify

Do not jump into features

Invest time to gather all information for a feature

Specify behavior of the system

Unspecified behavior leads to bugs
Lessons from specification

Behavior is too complicated to specify == Hard to use

Too many preconditions == Hard to use

Too many fail safes == Numerous bugs

Don’t know what to specify == Take a nap & rethink
Core should be SOLID

Single Responsibility - A class should have one and
only one reason to change
Open Closed - Open for extension, closed for
modification
Liskov substitution - Derived objects should be able
to substitute parent objects
Interface Segregation - Small interfaces that cater to
specific clients
Dependency Inversion - Depend on abstractions not
concretions
Quick Code review

Classes with single responsibilities

Small methods

Meaningful method and variable names

Common classes reside in single namespace

Minimal use of global states and/or singletons
Code for humans

Avoid super smart code that only you understand

Avoid monkey patches

Raise meaningful errors

Keep things private unless needed publicly

Document the code
Build like a framework developer

Identify common reusable behaviors

Build libraries/interfaces to support them

Leave callbacks for customizations

Test your libs thoroughly

Use your libs for customized app specific logic
Why so Anti YAGNI?

Cause the product grows and complexities creep in

Cause you will always have good developers and not
so good developers in your team

Cause at some point of time you will have scalability
issues

Cause you might out source some of your work

Cause you might want to open source some stuff
Test test test

Do not behave like a caveman and do manual QA

Be always ready to deploy

Be confident of what you build

Humans are more intelligent than machines, make
them do something useful

Do not rush features without tests cause they’ll come
back and bite you
Deploy deploy deploy

Let every one in your team deploy

Let everyone have access to the servers

Deploy multiple times a day or at least once a day

Do not deploy right before the week end
Project management

Use a tool that you know well

Follow a school that you understand

Do not get excited like a kid with every new tool

Do not change workflow all of a sudden. Make slow
and continuous changes
Metrics

Collect metrics that matter

Data can be both quantitative and qualitative

Don’t collect and forget. Monitor and learn.
Successful technical teams deliver good quality
software consistently.

Successful entrepreneurs solve problems of
customers, not their own.
Thank You

     Follow me - @mukherjeesuman
                  or
Email me - sumanmukherjee03@gmail.com

Products are a mess

  • 1.
    Products == Mess Howto avoid it? -By Suman Mukherjee
  • 2.
    Is your productbecoming like this? Courtesy - http://www.flickr.com/photos/ adamcathro/1035741023/sizes/m/in/photostream/
  • 3.
    Symptoms Takes too longto fix bugs? Takes too long to deploy bug fixes? Takes too long to build features? Spend too much time doing QA? You completely depend on one developer for core features in your app? Developers are more interested in working on new features than modifying of existing ones? You are not aware of how to use certain features in your app?
  • 4.
    Stay on thesame page Understand your domain Capture the language of the domain Formulate a vocabulary Management, marketing and tech team - all on the same page
  • 5.
    Specify specify specify Donot jump into features Invest time to gather all information for a feature Specify behavior of the system Unspecified behavior leads to bugs
  • 6.
    Lessons from specification Behavioris too complicated to specify == Hard to use Too many preconditions == Hard to use Too many fail safes == Numerous bugs Don’t know what to specify == Take a nap & rethink
  • 7.
    Core should beSOLID Single Responsibility - A class should have one and only one reason to change Open Closed - Open for extension, closed for modification Liskov substitution - Derived objects should be able to substitute parent objects Interface Segregation - Small interfaces that cater to specific clients Dependency Inversion - Depend on abstractions not concretions
  • 8.
    Quick Code review Classeswith single responsibilities Small methods Meaningful method and variable names Common classes reside in single namespace Minimal use of global states and/or singletons
  • 9.
    Code for humans Avoidsuper smart code that only you understand Avoid monkey patches Raise meaningful errors Keep things private unless needed publicly Document the code
  • 10.
    Build like aframework developer Identify common reusable behaviors Build libraries/interfaces to support them Leave callbacks for customizations Test your libs thoroughly Use your libs for customized app specific logic
  • 11.
    Why so AntiYAGNI? Cause the product grows and complexities creep in Cause you will always have good developers and not so good developers in your team Cause at some point of time you will have scalability issues Cause you might out source some of your work Cause you might want to open source some stuff
  • 12.
    Test test test Donot behave like a caveman and do manual QA Be always ready to deploy Be confident of what you build Humans are more intelligent than machines, make them do something useful Do not rush features without tests cause they’ll come back and bite you
  • 13.
    Deploy deploy deploy Letevery one in your team deploy Let everyone have access to the servers Deploy multiple times a day or at least once a day Do not deploy right before the week end
  • 14.
    Project management Use atool that you know well Follow a school that you understand Do not get excited like a kid with every new tool Do not change workflow all of a sudden. Make slow and continuous changes
  • 15.
    Metrics Collect metrics thatmatter Data can be both quantitative and qualitative Don’t collect and forget. Monitor and learn.
  • 16.
    Successful technical teamsdeliver good quality software consistently. Successful entrepreneurs solve problems of customers, not their own.
  • 17.
    Thank You Follow me - @mukherjeesuman or Email me - [email protected]