Tools for any agile web/software startup

by Sumit Chachra on April 3, 2011

Having worked at/with multiple web/software startups there are a certain set of tools I’ve gotten used to leveraging to save time and $. Some of these tools didn’t exist even 2-3 years back, so this list might / will get stale pretty fast!

The list that follows assumes these things:

  • Time is money (duh!).
  • Speed is everything (at least in a startup).
  • Humans are expensive, machines are cheap.
  • The “cloud” is safe, and everything is going to move there. If you’re a “cloud” startup and don’t buy into it, then go live in a cave.
  • Your “startup” can afford $100-200/month of costs using these online services that make your team productive.

Now that we’ve gotten that out of the day, should we jump right in?

  1. Google Apps – Please don’t waste time using MSFT outlook, or dreamhost, or Godaddy for your email needs. Setup a Google Apps account, it takes less than an hour (at max). You get 50 users for free, can’t beat that.Its safe, fast, Gmail rocks, Google docs works, wiki is barely usable.
  2. Servers – Use Amazon EC2, Slicehost or Linode. If you’re new to server administration then stick with Slicehost or Linode.
  3. Github – Source control is important. Its so important that Subversion doesn’t cut it. There I said it. Bitbucket (mercurial) would be the only other thing thats even remotely good. Trac/Assembla/running your own git/svn server etc. are all bad solutions!Notice I am not saying “git”. I am saying Github. It gives you permissions, ssh key based access, easy branching, commenting on code, reviewing merges, integration with 25 external services etc. Its a no-brainer.
  4. Ticketing / issue tracking – There are many options here. On one extreme is Pivotal Tracker (a steep learning curve). In the middle are the likes of Fogbugz. On the linear/boring side are Assembla or Lighthouse app or even Basecamp todo’s!I really like Pivotal Tracker, but only if you’re a truly agile startup with realistic deadlines and goals. I find it useful even when working on a project alone (instead of in a team).
  5. External Monitors etc. –  Every developer should have a dual monitor setup (minimum of 21″, ideally 24-27″), a fast machine and a chair to sit in that costs around 4-5 hours of their salary/pay-rate. Anything less than any of this doesn’t cut it and you’re pinching dollars where it matters least. Really.
  6. Payment Gateways –  There are lot of (shitty) options out there. On one extreme you can go with Paypal. Thats a reasonable solution from a setup perspective. Sadly their API’s (still) suck … a lot!If you’re ok with getting your own merchant account setup etc. I highly recommend using Braintree Payment Solutions. They have amazing customer service, a well written/thought out API and an API wrapper written in most popular languages (Ruby, Java, Python, PHP etc.).
  7. Online contracts/NDA’s – If you’re hiring employees, contractors and vendors you’re probably going to be signing a ton of paperwork! Do your brain a favor and use Echosign. It makes getting contracts, NDA’s, I-9 forms signed a breeze.

I’ll limit myself to these 7 things. There are other problems like invoicing (solved by Freshbooks), CRM (solved by 37Signals Highrise or Salesforce), wiki (solved by pbworks.com), sharing files (solved by Dropbox) etc. that need solving too.

But I’ll leave that an exercise for the reader. Just refer to the bullet points I mention above, and if the solution/tool you choose meets/exceeds the goals specified there then you’re good to go!

Enhanced by Zemanta

{ 0 comments }

Django-cron : Let the open sourcing begin

by Sumit Chachra on February 9, 2011

So after more than a year of thinking/pondering/procrastinating I found myself with 2 spare hours (Wife busy will 9:30 and me not wanting to go to the Gym…. the stars aligned!) and took advantage of it to open source Tivix’s first application.

Its not the sexiest, but makes running python crons / automated tasks in Django hopefully a tad bit easier. If nothing else someone can extend this app and make it even better.

Here is it: https://github.com/Tivix/django-cron

Hopefully we’ll open source 2-3 other applications / code snippets which we find really useful as time goes on. This a small way in which we “give back” to the open source community (Django and Wordpress I am looking at you!) on whose shoulders we’ve built some great products for some great companies!

Thoughts/comments welcome :-)

Enhanced by Zemanta

{ 0 comments }

Things to do in Hyderabad

by Sumit Chachra on January 3, 2011

chowmahalla palace in hyderabad
Image via Wikipedia

Priyanka and I spent 3 nights in Hyderabad, while there for a friends wedding. We made a vacation out of it and had a great time.

The highlight of the trip was our stay at The Park there. Even though the tripadvisor ratings for the hotel are wanting, its a great new hotel with a lot of potential. Overlooking the Hussain Sagar lake, the Hotel has a infinity pool, outdoor seating, a 24 hour cafe, 3 bars and excellent staff to round it off. The morning breakfast was the best morning food spread I’ve seen in a while. Highly recommend staying there if you find yourself in Hyderabad.

We also made our way to the Chowmahalla Palace which is worth a visit with 3-4 small palaces and exhibits. The Charminar was a bit of a disappointment. Its not been maintained, is in a super crowded market/neighborhood and just made us run to the nearest auto-rickshaw.

The Golconda Fort is a well worth a visit too. Go around 2-3pm, so that you can hire a guide and go all the way to the top. That will take 2-3 hours and that’ll be a great segway into the 6:30pm light and sound show in English inside the fort. The acoustics and science applied 700 years ago is impressive.

Apart from these places we made our way to a local mall (GVK-1), to the Shilparamam (think Delhi Haat) and of course to Paradise for their famous Mutton Biryani (not the best in Hyderabad, but pretty decent. Sit in their nicer airconditioned top floor, if you’d like a more relaxed experience!). The old city is a bit chaotic and dirty, but if the airport and the 11 km freeway to the city are any signs, things are improving for sure.

Overall we were pretty impressed with the city of Nizams and highly recommend it to anyone if you have 3-4 days.

Enhanced by Zemanta

{ 0 comments }

Satchmo is a popular Django based e-commerce system. Its well suited for the most part to sell things like shirts and shoes that come in various sizes / colors (variations) etc. These are items that a seller would have a certain amount of in stock, and sell out when the inventory hits 0.

There are situations however this doesn’t work as well. Say you’re a bakery that sells cupcakes and macaroons. Lets assume you bake 100 cupcakes and 50 macaroons every day. So thats the max you can sell on a daily basis. Some days you won’t sell all, but the next day you may run out. This means your inventory number is not fixed.

Moreover the way you’ll define your “product” (thing that customer buys) will need to change. Instead of saying that “I sold a cupcake”, you have to say “I sold a cupcake on Sep. 7, 2010″. The temporal aspect is important, since your inventory is not static. The date may represent the order date or a date in the future (say you take pre-orders).

The exact same scenario applies to sellers of theater tickets (or tickets of any kind really), hotel rooms etc. Almost any kind of commerce online that has daily or variable inventory levels and / or perishable items.

OK, so how to go about solving this problem. Without going into too many details, its obvious we need to use what Satchmo calls Custom Product(s). Apart from that we need to capture the core product type (cupcake or macaroon or hotel room) etc. Below you will find a VariableInventoryProductType class that represents a typical type of product and a VariableInventoryProduct class that has a FK to a core Satchmo product, a day and a type of product. This is the product the customer is really buying (executive suite on December 25, 2010… room would be a product type and executive suite would be a “variation” of that).

import logging

from django.conf import settings as django_settings
from django.db import models
from django.contrib.sites.models import Site
from django.utils.translation import ugettext_lazy as _

from product.models import SHIP_CLASS_CHOICES, Product, OptionGroup, Price
from product.modules.configurable.models import ConfigurableProduct

class VariableInventoryProductType(models.Model):
    """
    Represents a type of product thats sold by the seller. In case of a Theater for example only one instance of
    this would exist. In case of a bakery say, the number of instances would be the same as the number of different
    types of items the bakery sells.
    """
    name = models.CharField(max_length=255)
    description = models.TextField()
    slug = models.CharField(max_length=255, db_index=True)
    image = ImageField()
    default_inventory = models.IntegerField(verbose_name='Default daily inventory')
    active = models.BooleanField(default=True, db_index=True)
    order = models.IntegerField(db_index=True, default=0)
    base_price = models.DecimalField(max_digits=6, decimal_places=2)
    option_group = models.ForeignKey(OptionGroup, blank=True, null=True)
    shipclass = models.CharField(_('Shipping'), choices=SHIP_CLASS_CHOICES, default="YES", max_length=10)
    featured = models.BooleanField(default=False, db_index=True)

    class Meta:
        ordering = ('order', )

    def __unicode__(self):
        return self.name

class VariableInventoryProductManager(models.Manager):
    def get_product(self, product_type, day, create=True):
        qset = self.filter(product_type=product_type, day=day)
        if qset:
            return qset.get()
        elif create:
            logging.info('Creating new product of type: %s and day: %s' % (product_type.name, day))
            # create real satchmo product first.
            product = Product()
            product.site = Site.objects.get_current()
            product.name = '%s on %s' % (product_type.name, day)
            product.items_in_stock = product_type.default_inventory
            product.shipclass = product_type.shipclass
            product.save()

            p = Price()
            p.product = product
            p.price = product_type.base_price
            p.save()

            # Create Variations
            if product_type.option_group:
                configurable_product = ConfigurableProduct(product=product)
                configurable_product.save()
                configurable_product.option_group.add(product_type.option_group)
                configurable_product.create_subs = True
                configurable_product.save()

            return self.create(product=product, product_type=product_type, day=day)
        else:
            return None

class VariableInventoryProduct(models.Model):
    """
    Actual product thats sold by the store. FKed to an actual satchmo product.
    """
    product = models.OneToOneField(Product)
    product_type = models.ForeignKey(VariableInventoryProductType)
    day = models.DateField(db_index=True)

    objects = VariableInventoryProductManager()

    class Meta:
        unique_together = ('product_type', 'day')

    def _get_subtype(self):
        return 'VariableInventoryProduct'

    def __unicode__(self):
        return '%s on %s' % (self.product_type.name, self.day)

{ 0 comments }

Three things to be thankful about in California

by Sumit Chachra August 1, 2010

Having lived in California for 4+ years now there is a lot to be thankful about. The beaches, sun (not in SF sadly), bounty of natural resources, fresh organic food etc. etc. There is a lot that sucks too (high taxes etc.) but thats for another day…..
But there are three things in the CA law [...]

View Comments Read the full article →

Sandboxing emails in Django

by Sumit Chachra July 10, 2010

Its usually good to sandbox your QA / staging environments so that they don’t shoot out emails to real email addresses (say you’ve made a copy of your production database). Django 1.2 and their email backends make it really easy to do so.

Here’s a testing email backend I wrote. Simply drop in a email address [...]

View Comments Read the full article →

Moving Wordpress mu to a different domain

by Sumit Chachra March 4, 2010

So I have a Wordpress MU setup where we’re hosting a bunch of sites/blogs (email me at sumit AT tivixlabs.com if you’re interested in one).
As with all my Django webapps I wanted to replicate all the sites on qa for testing purposes (so that we’re not messing production sites with plugin / wordpress upgrades etc.). [...]

View Comments Read the full article →

On project management, bug/issue tracking and source control

by Sumit Chachra March 4, 2010

There seems to be a big disconnect between project management, bug/issue tracking and source control solutions out there. Simply put in most companies these systems don’t talk to each other as much as they should.
How have I solved the problem. I’m using bitbucket.org for source control that talks nicely with LighthouseApp which I use mainly [...]

View Comments Read the full article →

Fanning/Following is the new SEO?

by Sumit Chachra September 6, 2009

So lots of friends have been messaging and emailing me about my bizarre Fanning behavior on Facebook. Weirdly none complain when I fan someone/some brand on Twitter. I guess cause that affects my feed, not theirs (Facebook apparently informs them about my fanning?).
In any case, I thought I’ll fire up a blog post about it, [...]

View Comments Read the full article →

My thoughts on Yahoo!

by Sumit Chachra February 22, 2009

I’ve been thinking of blogging about my employment with Yahoo! for a while, but never got around to it. Reading today, about yet another impending Yahoo! reorg, I decided to write about what I felt like while I was there, what worked, what didn’t, and how Yahoo! can get out of the rut it finds [...]

View Comments Read the full article →
Powered by Tivix