<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Femgineer &#187; Software Principles &amp; Practice</title>
	<atom:link href="http://femgineer.com/category/software-principles-practice/feed/" rel="self" type="application/rss+xml" />
	<link>http://femgineer.com</link>
	<description>Coder. Speaker. Writer.</description>
	<lastBuildDate>Thu, 10 May 2012 00:24:04 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Growing Pains? Try Retooling.</title>
		<link>http://femgineer.com/2012/04/growing-pains-try-retooling/</link>
		<comments>http://femgineer.com/2012/04/growing-pains-try-retooling/#comments</comments>
		<pubDate>Thu, 19 Apr 2012 05:10:38 +0000</pubDate>
		<dc:creator>Poornima</dc:creator>
				<category><![CDATA[Product Development]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Software Principles & Practice]]></category>
		<category><![CDATA[Startups]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[startup]]></category>

		<guid isPermaLink="false">http://femgineer.com/?p=1076</guid>
		<description><![CDATA[
<div class="twitterbutton" style="float: right; padding-left: 5px;"><a href="http://twitter.com/share?url=http://femgineer.com/2012/04/growing-pains-try-retooling/&amp;text=Growing Pains? Try Retooling.&amp;via=&amp;related=DolcePixel"><img align="right" src="http://femgineer.com/wp-content/plugins//easy-twitter-button/i/buttons/en/tweetn.png" style="border: none;" alt="" /></a></div>


Growth is fun and exciting in a startup, but it can also be just a little painful and scary.
Its scary because people can&#8217;t anticipate problems that arise from growth such as having customers, supporting them, answering their requests, and fixing the issues they experience with your product.  Or adding employees, training them, educating them on ]]></description>
			<content:encoded><![CDATA[
<div class="twitterbutton" style="float: right; padding-left: 5px;"><a href="http://twitter.com/share?url=http://femgineer.com/2012/04/growing-pains-try-retooling/&amp;text=Growing Pains? Try Retooling.&amp;via=&amp;related=DolcePixel"><img align="right" src="http://femgineer.com/wp-content/plugins//easy-twitter-button/i/buttons/en/tweetn.png" style="border: none;" alt="" /></a></div>
<p>Growth is fun and exciting in a startup, but it can also be just a little <em>painful</em> and <em>scary</em>.</p>
<p>Its <em>scary</em> because people can&#8217;t anticipate problems that arise from growth such as having customers, supporting them, answering their requests, and fixing the issues they experience with your product.  Or adding employees, training them, educating them on the vision of the company, keeping them motivated and collaborating with each other.  And then there&#8217;s the product itself!  More customers are using it, and generating data which leads to a less than awesome experience for your customers.</p>
<p>This isn&#8217;t the time to feel overwhelmed.  Its the time to pat yourself on the back: you found product market fit and you&#8217;ve recruited some stellar people to help you out!</p>
<p>Now you&#8217;ll need to change some processes to handle the growth which can be the <em>painful</em> part.  Its easy to throw money at the problem, but lets just say you you may or may not have access to a seemingly bottomless pit of cash.</p>
<p><strong>Figure out what you need not what you want.</strong></p>
<p>It all comes back to milestones.  Where do you want to be in 3 months, 6 months, and 1 year?  You don&#8217;t need to have definitive growth numbers for your startup but you need to put things in perspective.  Lets say you&#8217;re shopping around for a customer support ticketing system, and right now your growth is fairly predictable and manageable by a single human being and possibly part time.  In that case don&#8217;t buy something that&#8217;s going to cost more than what a single customer is paying you monthly.  You might even be fine  doing support via email and phone, and it will probably aid in your customer development process to have someone listening for feedback.  If your customer support person starts to get inundated then its the time to look into a system to organized.</p>
<p>Start shopping for products when you want to cut down on human labor costs that are quantifiable by time and money.  The people you hire are smart, so invest in their productivity and happiness, and don&#8217;t let them become drones by having them do repetitive mundane tasks that aren&#8217;t advancing themselves or the company.</p>
<p><strong>Building vs. buying?</strong></p>
<p>You&#8217;ve isolated a few areas in which you need to put a new tool in place or replace an old one.  As engineers running a company its easy to say: &#8220;Oh I&#8217;ll just build it!&#8221;  Wrong answer.  Yes it might be super easy for you to whip something up, but who&#8217;s going to test that new tool, maintain the code base, and add on to it?  If its you great!  You now have a new department: internal tools.  Oh you&#8217;re small&#8230; well then you just cut down on product development.</p>
<p>Save yourself some keystrokes and shop around for products instead.  As I mentioned before, if you identified your needs then it becomes easier to tell people what you want and to shop around for it.  Yes there are times when you might not find what you&#8217;re looking for, and it might make sense to build it in house if its cost effective (cost == time + money).  If you find a product that satisfies 70-80% of your needs and is within your budget buy it!</p>
<p>When I was working at <a href="http://mint.com" target="_blank">Mint</a> I had the painful task of searching for an email provider to handle all the outbound emails we were sending.  Integration was a nightmare especially given the products that were in the market at the time.  Had I taken a little more time to do research I would have found <a href="http://mailchimp.com" target="_blank">MailChimp</a> and been happier.  Live and learn.</p>
<p>Fortunately I did learn, a different lesson while working there, put off managed hosting for as long as possible.  Which is why  when I started <a href="http://bizeebee.com" target="_blank">BizeeBee</a> I went with <a href="http://heroku.com" target="_blank">Heroku</a>.  Could I have written deploy scripts, and the add-ons that they offer on my own?  Sure, in fact I wrote some of them at <a href="http://mint.com" target="_blank">Mint</a> (sms and email messaging, performance monitoring, etc) in Java!  But going with a solution like Heroku for less than $100 a month gave me the freedom to build, iterate, and launch BizeeBee all in the same year!  Did I mention $100 is also less than the going rate of a developer pretty much anywhere.</p>
<p><strong>How long will the solution last?</strong></p>
<p>Remember the title of this article is <em>re</em>tooling.  If your startup is on a growth trajectory it will outgrow tools, and you&#8217;ll need to refine processes.  Get comfortable with it.  They key is to identify when you&#8217;ve outgrown a product or anticipate when you will.</p>
<p>Sometimes you can live with a less than perfect solution for awhile, especially if its cheaper than the alternative in terms of setup and maintenance.  Just acknowledge the limitations, and prepare to fix them if they cut into progress.  For example, at BizeeBee we have a customer support tool that I built.  Its not perfect,  it drags the system down a little when we run large queries, but we&#8217;re operating with limited resources.  I&#8217;ve optimized the queries once they really start to impact application performance, but I haven&#8217;t yet setup a dedicated database, and optimized the heck out of it, because I have other <em>priorities</em>.  I&#8217;ll throw resources at it when it start to cost us customers and time, or isn&#8217;t serving its purpose.</p>
<p><strong>ROI</strong></p>
<p>Retooling is not a cost.  Its a cost if you do it <em>prematurely</em>.  If you do it when you absolutely need to or when you anticipate a need arising then it can actually be aid in the growth of the company.  Once again figure out what you need.  Do you need to grow your user base?  Do you need to keep your customer happy?  Do you need to get paid on time?  Do you need your employees to be happy and productive?  Those should translate to what you&#8217;re looking for in a solution.</p>
<p>Retooling isn&#8217;t just about finding the right tool, its also about finding the tool that will help you you meet your next milestones, and once you reach them you&#8217;ll need to retool again.  Happy retooling! <img src='http://femgineer.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://femgineer.com/2012/04/growing-pains-try-retooling/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Deploy 2010: 3&#8242;S to a Successful Launch</title>
		<link>http://femgineer.com/2010/10/deploy-2010-3s-to-a-successful-launch/</link>
		<comments>http://femgineer.com/2010/10/deploy-2010-3s-to-a-successful-launch/#comments</comments>
		<pubDate>Sat, 30 Oct 2010 16:38:39 +0000</pubDate>
		<dc:creator>Poornima</dc:creator>
				<category><![CDATA[Conferences]]></category>
		<category><![CDATA[Software Principles & Practice]]></category>
		<category><![CDATA[Startups]]></category>

		<guid isPermaLink="false">http://femgineer.com/?p=684</guid>
		<description><![CDATA[
<div class="twitterbutton" style="float: right; padding-left: 5px;"><a href="http://twitter.com/share?url=http://femgineer.com/2010/10/deploy-2010-3s-to-a-successful-launch/&amp;text=Deploy 2010: 3&#8242;S to a Successful Launch&amp;via=&amp;related=DolcePixel"><img align="right" src="http://femgineer.com/wp-content/plugins//easy-twitter-button/i/buttons/en/tweetn.png" style="border: none;" alt="" /></a></div>


I&#8217;ll be speaking at Deploy hosted by Seattle 2.0 on November 8, 2010.  Building upon a couple of my blog posts (Pre-Launch and Post-Launch) I will be speaking on the engineering execution for a successful Launch.  Here is an outline of the topics I will cover.
1. Stability 

Security: store and retrieve     ]]></description>
			<content:encoded><![CDATA[
<div class="twitterbutton" style="float: right; padding-left: 5px;"><a href="http://twitter.com/share?url=http://femgineer.com/2010/10/deploy-2010-3s-to-a-successful-launch/&amp;text=Deploy 2010: 3&#8242;S to a Successful Launch&amp;via=&amp;related=DolcePixel"><img align="right" src="http://femgineer.com/wp-content/plugins//easy-twitter-button/i/buttons/en/tweetn.png" style="border: none;" alt="" /></a></div>
<p>I&#8217;ll be speaking at <a href="http://deployday.com/">Deploy</a> hosted by <a href="http://www.seattle20.com/">Seattle 2.0</a> on November 8, 2010.  Building upon a couple of my blog posts (<a href="http://femgineer.com/?p=574">Pre-Launch </a>and <a href="http://femgineer.com/?p=637">Post-Launch</a>) I will be speaking on the engineering execution for a successful Launch.  Here is an outline of the topics I will cover.</p>
<p><strong>1. Stability </strong></p>
<ul>
<li>Security: store and retrieve      hashed password, encrypt sensitive information, field validation through      JS, Ruby, Java, and DB constraints</li>
<li>Bugs: prioritize mission      critical vs. look and feel</li>
<li>Background Processes: nightly      cron jobs, data imports</li>
<li>Browser Interoperability      Issues: IE Hacks, Litmus</li>
</ul>
<p><strong>2. Scale</strong></p>
<ul>
<li>Identify bottlenecks through      performance testing: JMeter, New Relic, profilers</li>
<li>Front-End Optimizations: JS      compression, sprite images, measure page load and rendering times</li>
<li>Back-End Optimizations: index      database tables, avoid costly joins, identify &#8220;growth tables&#8221;, lazy loading and load fewer columns, caching, process data via db instead of loading into business logic</li>
<li>User Experience: design around slow processes</li>
</ul>
<p><strong>3. Support</strong></p>
<ul>
<li>Logging</li>
<li>Error Messages and Error      Handling</li>
<li>Debugging Tools: scripts for redundant queries, DB admin</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://femgineer.com/2010/10/deploy-2010-3s-to-a-successful-launch/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Post-Launch Prep</title>
		<link>http://femgineer.com/2010/03/post-launch-prep/</link>
		<comments>http://femgineer.com/2010/03/post-launch-prep/#comments</comments>
		<pubDate>Thu, 18 Mar 2010 03:37:48 +0000</pubDate>
		<dc:creator>Poornima</dc:creator>
				<category><![CDATA[Software Principles & Practice]]></category>

		<guid isPermaLink="false">http://femgineer.com/?p=637</guid>
		<description><![CDATA[
<div class="twitterbutton" style="float: right; padding-left: 5px;"><a href="http://twitter.com/share?url=http://femgineer.com/2010/03/post-launch-prep/&amp;text=Post-Launch Prep&amp;via=&amp;related=DolcePixel"><img align="right" src="http://femgineer.com/wp-content/plugins//easy-twitter-button/i/buttons/en/tweetn.png" style="border: none;" alt="" /></a></div>


This is a follow-up to my prior post Pre-Launch Prep.  First, pat yourself on the back for making it through the launch!  Now let&#8217;s focus on next steps.  The product team’s job is to create and design features that will keep users engaged, and engineering team’s job is to make users happy.  Happiness == (bug ]]></description>
			<content:encoded><![CDATA[
<div class="twitterbutton" style="float: right; padding-left: 5px;"><a href="http://twitter.com/share?url=http://femgineer.com/2010/03/post-launch-prep/&amp;text=Post-Launch Prep&amp;via=&amp;related=DolcePixel"><img align="right" src="http://femgineer.com/wp-content/plugins//easy-twitter-button/i/buttons/en/tweetn.png" style="border: none;" alt="" /></a></div>
<p><a href="http://femgineer.com/wp-content/uploads/2010/03/Shuttle_launch.jpg"><img class="alignleft size-medium wp-image-639" title="Shuttle_launch" src="http://femgineer.com/wp-content/uploads/2010/03/Shuttle_launch-247x300.jpg" alt="" width="247" height="300" /></a>This is a follow-up to my prior post <a href="http://femgineer.com/?p=574" target="_blank">Pre-Launch Prep</a>.  First, pat yourself on the back for making it through the launch!  Now let&#8217;s focus on next steps.  The product team’s job is to create and design features that will keep users engaged, and engineering team’s job is to make users happy.  Happiness == (bug free  &amp;&amp; accurate data &amp;&amp; responsive site).</p>
<p><strong> </strong></p>
<p><strong>1. Squash big bugs first!</strong></p>
<p>Grep the logs and count the number of Exceptions or Errors then have it!  Best to create a nightly script to tally up Exceptions and Errors so that you don’t have to type the same grep command everyday.  You also want to check the user forums for discussions on bugs and talk to customer service representatives.  But before you begin doing a big fix make sure that the bug impacts a majority and not a vocal minority.</p>
<p><strong>2. Get down and dirty with data.</strong></p>
<p><strong> </strong></p>
<p>Depending your product you might have data accuracy issues.  The easiest first step is to hit the production db and make sure the data that is being pulled in is correct.  If it is then you know there’s an issue farther upstream i.e. business logic or rendering.  If the db is wrong then you’ve got an issue with storing data, which could be caused by a broken link somewhere in the front to back-end flow.</p>
<p><strong>3. Prioritize performance.</strong></p>
<p>Everyone is always touting the vices of premature performance optimizations, which is a valid point, especially in a startup where you are resource and time constrained. You don’t need to optimize from the start, but you do want to build infrastructure to measure your site’s performance.  Performance is both a front and back-end issue.</p>
<ul>
<li>Front-End: your page load time is abominable because you’ve got lots of graphics that haven’t been sprited, have browser interoperability issues, or network latency sucks because your user bought the cheapest DSL package…</li>
<li>Back-End: sure you’re using ajax on the front-end, but if each request is hitting the db and you’re pulling in thousands of records no point in being asynchronous…</li>
</ul>
<p>Figure out where your bottlenecks are, and then tune it up!</p>
]]></content:encoded>
			<wfw:commentRss>http://femgineer.com/2010/03/post-launch-prep/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pre-Launch Prep</title>
		<link>http://femgineer.com/2010/02/pre-launch-prep/</link>
		<comments>http://femgineer.com/2010/02/pre-launch-prep/#comments</comments>
		<pubDate>Mon, 15 Feb 2010 06:03:25 +0000</pubDate>
		<dc:creator>Poornima</dc:creator>
				<category><![CDATA[Software Architecture]]></category>
		<category><![CDATA[Software Principles & Practice]]></category>

		<guid isPermaLink="false">http://femgineer.com/?p=574</guid>
		<description><![CDATA[
<div class="twitterbutton" style="float: right; padding-left: 5px;"><a href="http://twitter.com/share?url=http://femgineer.com/2010/02/pre-launch-prep/&amp;text=Pre-Launch Prep&amp;via=&amp;related=DolcePixel"><img align="right" src="http://femgineer.com/wp-content/plugins//easy-twitter-button/i/buttons/en/tweetn.png" style="border: none;" alt="" /></a></div>


I&#8217;ve been advising a few pre-launch startups that are getting ready to do their first ever product launch.  From first-hand experience I know that the first product launch can be nerve-wrecking.  You expect the product to be pixel perfect, and all the features to be fully functional and bug-free.  But there is such a thing ]]></description>
			<content:encoded><![CDATA[
<div class="twitterbutton" style="float: right; padding-left: 5px;"><a href="http://twitter.com/share?url=http://femgineer.com/2010/02/pre-launch-prep/&amp;text=Pre-Launch Prep&amp;via=&amp;related=DolcePixel"><img align="right" src="http://femgineer.com/wp-content/plugins//easy-twitter-button/i/buttons/en/tweetn.png" style="border: none;" alt="" /></a></div>
<p>I&#8217;ve been advising a few pre-launch startups that are getting ready to do their first ever product launch.  From first-hand experience I know that the first product launch can be nerve-wrecking.  You expect the product to be pixel perfect, and all the features to be fully functional and bug-free.  But there is such a thing as spending too much time on perfecting the product, and forgetting that you need to be able to support load on the system.  What good is a shiny product that people can&#8217;t even sign up for because a server has gone down, or their signup process takes on the order of minutes or hours!</p>
<p><a href="http://femgineer.com/wp-content/uploads/2010/02/Screen-shot-2010-02-14-at-10.06.37-PM.png"><img class="alignright size-full wp-image-582" title="Screen shot 2010-02-14 at 10.06.37 PM" src="http://femgineer.com/wp-content/uploads/2010/02/Screen-shot-2010-02-14-at-10.06.37-PM.png" alt="" width="221" height="108" /></a>Here are a few tips I&#8217;ve been giving people to help alleviate their pre-launch preoccupations:</p>
<ol>
<li><strong>Logging</strong>.  For good developers this should be a no-brainer, because they would havetested or debugged their code and would have included logging to do so.  For Java I use log4J, Ruby has its own class Logger.  You also want to make sure you are rotating the logs daily.</li>
<li><strong>Keep an eye on Exception and Errors. </strong>Once you&#8217;ve got your logging in place create a simple shell script to grep the logs and tally up errors and exceptions.  You can set this up in cron to delivery the logs to your email every hour or day.</li>
<li><strong>Fix Showstoppers.</strong> These are bugs that prevent a user from signing up, or are glaringly obvious and create a negative and lasting impression on new users.</li>
<li><strong>Monitor Your Servers. </strong>Tools like <a href="http://www.nagios.org/" target="_blank">Nagios</a> or <a href="http://ganglia.sourceforge.net/" target="_self">Ganglia</a>.</li>
<li><strong>Monitor the drop off points.</strong> There are typically three: coming to the site, sign-up, and then performing the first action (depending on your product&#8217;s features).  To do this you will need <a href="http://www.google.com/analytics/" target="_blank">Google Analytics</a>.</li>
<li><strong>Load Test.</strong> Test the limits of your system so that you know how much load it can handle.  <a href="http://jakarta.apache.org/jmeter/" target="_blank">JMeter</a> is a good tool to use to do this.</li>
<li><strong>Load Balancer.</strong> If you are responsible for your servers then I&#8217;d highly recommend doing this.  Check out this intro lesson on <a href="http://devcentral.f5.com/weblogs/dmacvittie/archive/2009/03/17/intro-to-load-balancing-for-developers-ndash-how-they-work.aspx" target="_blank">load balancing</a>.</li>
</ol>
<p><a href="http://femgineer.com/wp-content/uploads/2010/02/Screen-shot-2010-02-14-at-10.06.04-PM.png"><img class="alignleft size-full wp-image-579" title="Screen shot 2010-02-14 at 10.06.04 PM" src="http://femgineer.com/wp-content/uploads/2010/02/Screen-shot-2010-02-14-at-10.06.04-PM.png" alt="" width="67" height="51" /></a>Hold off on all new feature requests!  First impressions count for a lot, and whats more important than being feature rich is being able to have a site up and running.  What good are more features if users can&#8217;t even get through your front door!  Focus on supporting the new and incoming users and giving them a worthwhile and timely experience.  Stay tuned for a follow-up on what to do the morning after&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://femgineer.com/2010/02/pre-launch-prep/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Femgineer Goals for 2010</title>
		<link>http://femgineer.com/2009/12/femgineer-goals-for-2010/</link>
		<comments>http://femgineer.com/2009/12/femgineer-goals-for-2010/#comments</comments>
		<pubDate>Fri, 25 Dec 2009 00:19:52 +0000</pubDate>
		<dc:creator>Poornima</dc:creator>
				<category><![CDATA[Software Principles & Practice]]></category>

		<guid isPermaLink="false">http://femgineer.com/?p=428</guid>
		<description><![CDATA[
<div class="twitterbutton" style="float: right; padding-left: 5px;"><a href="http://twitter.com/share?url=http://femgineer.com/2009/12/femgineer-goals-for-2010/&amp;text=Femgineer Goals for 2010&amp;via=&amp;related=DolcePixel"><img align="right" src="http://femgineer.com/wp-content/plugins//easy-twitter-button/i/buttons/en/tweetn.png" style="border: none;" alt="" /></a></div>


Every year I make the usual new year&#8217;s  resolutions to be healthier, friendlier, calmer, cheaper, smarter, and so forth.  But, I don&#8217;t actually set goals for how I want to become a better developer!  So I decided that I&#8217;d put together a list of skills I want to have, and goals I want to accomplish ]]></description>
			<content:encoded><![CDATA[
<div class="twitterbutton" style="float: right; padding-left: 5px;"><a href="http://twitter.com/share?url=http://femgineer.com/2009/12/femgineer-goals-for-2010/&amp;text=Femgineer Goals for 2010&amp;via=&amp;related=DolcePixel"><img align="right" src="http://femgineer.com/wp-content/plugins//easy-twitter-button/i/buttons/en/tweetn.png" style="border: none;" alt="" /></a></div>
<p><a href="http://femgineer.com/wp-content/uploads/2009/12/Screen-shot-2009-12-24-at-4.29.05-PM.png"><img class="alignright size-medium wp-image-431" title="Screen shot 2009-12-24 at 4.29.05 PM" src="http://femgineer.com/wp-content/uploads/2009/12/Screen-shot-2009-12-24-at-4.29.05-PM-300x225.png" alt="" width="300" height="225" /></a>Every year I make the usual new year&#8217;s  resolutions to be healthier, friendlier, calmer, cheaper, smarter, and so forth.  But, I don&#8217;t actually set goals for how I want to become a better developer!  So I decided that I&#8217;d put together a list of skills I want to have, and goals I want to accomplish by the end of 2010.</p>
<p>I&#8217;m also going to post the best tutorials and troubleshooting tactics I come across while meeting my goals.</p>
<p><strong>1. Learn Ruby on Rails</strong></p>
<p><strong>2. Learn Objective-C and Create an iPhone app</strong></p>
<p><strong>3. Learn Adobe Air</strong></p>
<p><strong>4. Read 3 books on software architecture</strong></p>
<p><strong>5. Attend at least 1 developer conference</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://femgineer.com/2009/12/femgineer-goals-for-2010/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>When to Build and When to Buy</title>
		<link>http://femgineer.com/2009/10/when-to-build-and-when-to-buy/</link>
		<comments>http://femgineer.com/2009/10/when-to-build-and-when-to-buy/#comments</comments>
		<pubDate>Mon, 05 Oct 2009 05:32:09 +0000</pubDate>
		<dc:creator>Poornima</dc:creator>
				<category><![CDATA[Software Principles & Practice]]></category>

		<guid isPermaLink="false">http://femgineer.com/?p=260</guid>
		<description><![CDATA[
<div class="twitterbutton" style="float: right; padding-left: 5px;"><a href="http://twitter.com/share?url=http://femgineer.com/2009/10/when-to-build-and-when-to-buy/&amp;text=When to Build and When to Buy&amp;via=&amp;related=DolcePixel"><img align="right" src="http://femgineer.com/wp-content/plugins//easy-twitter-button/i/buttons/en/tweetn.png" style="border: none;" alt="" /></a></div>


I have posted the presentation I gave today at Code Camp here.  Hope you enjoyed it, and please feel free to email me feedback!
]]></description>
			<content:encoded><![CDATA[
<div class="twitterbutton" style="float: right; padding-left: 5px;"><a href="http://twitter.com/share?url=http://femgineer.com/2009/10/when-to-build-and-when-to-buy/&amp;text=When to Build and When to Buy&amp;via=&amp;related=DolcePixel"><img align="right" src="http://femgineer.com/wp-content/plugins//easy-twitter-button/i/buttons/en/tweetn.png" style="border: none;" alt="" /></a></div>
<p>I have posted the presentation I gave today at Code Camp <a href="http://www.slideshare.net/poornimav/when-to-build-and-when-to-buy" target="_blank">here</a>.  Hope you enjoyed it, and please feel free to email me feedback!</p>
]]></content:encoded>
			<wfw:commentRss>http://femgineer.com/2009/10/when-to-build-and-when-to-buy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Importance of Readability</title>
		<link>http://femgineer.com/2009/09/the-importance-of-readability/</link>
		<comments>http://femgineer.com/2009/09/the-importance-of-readability/#comments</comments>
		<pubDate>Sun, 13 Sep 2009 05:50:43 +0000</pubDate>
		<dc:creator>Poornima</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Software Principles & Practice]]></category>

		<guid isPermaLink="false">http://femgineer.com/?p=217</guid>
		<description><![CDATA[
<div class="twitterbutton" style="float: right; padding-left: 5px;"><a href="http://twitter.com/share?url=http://femgineer.com/2009/09/the-importance-of-readability/&amp;text=The Importance of Readability&amp;via=&amp;related=DolcePixel"><img align="right" src="http://femgineer.com/wp-content/plugins//easy-twitter-button/i/buttons/en/tweetn.png" style="border: none;" alt="" /></a></div>


When I first started coding I believed it was good enough to get stuff working, and then move on to solving the next problem.  I&#8217;d spend a little time designing, but most of my time implementing and testing.  My primary concerns were correctness followed by efficiency.  I didn&#8217;t see the point in re-factoring code until ]]></description>
			<content:encoded><![CDATA[
<div class="twitterbutton" style="float: right; padding-left: 5px;"><a href="http://twitter.com/share?url=http://femgineer.com/2009/09/the-importance-of-readability/&amp;text=The Importance of Readability&amp;via=&amp;related=DolcePixel"><img align="right" src="http://femgineer.com/wp-content/plugins//easy-twitter-button/i/buttons/en/tweetn.png" style="border: none;" alt="" /></a></div>
<p>When I first started coding I believed it was good enough to get stuff working, and then move on to solving the next problem.  I&#8217;d spend a little time designing, but most of my time implementing and testing.  My primary concerns were correctness followed by efficiency.  I didn&#8217;t see the point in re-factoring code until it was time to add new functionality or modules became incompatible or worse incomprehensible!  However, once I started to work in a team that was growing linearly I realized that readability is very important for code maintainability because:</p>
<p>1.  Other people read your code either because they are learning the code base and need to extend it or because they are trying to figure out how their functionality can fit with yours.  If it isn&#8217;t immediately obvious what problem the code is trying to solve then they are going to turn to you for help, and if you are around to explain it to them, great.   But even then you might have forgotten when you wrote, which then causes them  to add new functionality that most likely duplicates your existing solution.  Now there are two pieces of code that solve the same problem, and need to be maintained!</p>
<p>2. Other people mimic your code.  Before adding new functionality most people read through existing code to see if it solves a similar problem.  Instinctually they will copy the pattern, or skeleton of the solution if it applies.  Now you have more unreadable code!</p>
<p>So what constitutes as unreadable code? </p>
<p>1. Function names that are ambiguous or functions that perform multiple actions that aren&#8217;t reflected in the function name.</p>
<blockquote><p>public void createBudget(User user, String name, Double amount) {</p>
<p>    if (user.getBudget(name) != null) {</p>
<p>       user.getBudget(name).setAmount(amount);</p>
<p>    }</p>
<p>    else {</p>
<p>        Budget budget = new Budget();</p>
<p>        budget.setName(name);</p>
<p>        budget.setAmount(amount);        </p>
<p>        user.addBudget(new Budget(name));    }  </p>
<p>    totalSpending(user.getBudget(name));</p>
<p>}</p></blockquote>
<p>This function is doing more than just creating a budget.  It is checking to see if one exists first for the given name, if not then it creates one.  If it does exist it updates the amount.  Instead of forcing developers to read through the entire function to figure this out a better name would be: createOrUpdateBudget (assuming that eventually more than the amount will change).  The same principle exists for variable names as well.  In today&#8217;s world of coding using and IDE with the auto-complete function saves typing, so long and descriptive variable names are preferable to ambiguous ones like &#8220;String s&#8221; or &#8220;String temp&#8221;.</p>
<p>The call to totalSpending makes no sense in this function.  If the point is to total up spending for a budgeted category then it should be done outside of the function meant to create a budget.  Limiting functionality reduces the levels of redirection a developer has to read through and understand, and makes it easier for them to understand what is going on.  Otherwise they have to remember multiple interactions, and juggle them when adding new code.</p>
<p>2.  Lumping together function calls.</p>
<p>Looking at the previous example there are multiple function calls lumped together e.g. &#8220;user.getBudget(name).setAmount(amount);&#8221;.  This is done out of convenience, and while in this case the functions are small, and perform simple actions, it becomes much harder to read if the function names are longer and more descriptive.  Its best to go through the additional typing, and break them into two separate lines.</p>
<blockquote><p>e.g. Budget budget = user.getBudget(name);</p>
<p>        budget.setAmount(amount);</p></blockquote>
<p>3. Using private or inner classes.  </p>
<p>If a class cannot be reused then it might make sense to create it as an inner or private class.  However, the tradeoff is that it becomes harder to search for the class name in IDEs.  If you plan to reuse the class because it a basic structure that can be reused then it should be promoted to being a public class.</p>
<p>4. Overbearing parent classes.  </p>
<p>Naming is very important to describing the concept that a class is trying to convey. Highly general names should be reserved for parent classes e.g. &#8220;Account&#8221;.  But as you add to the class hierarchy the subclass names should be very specific e.g. &#8220;BankAccount&#8221; or &#8220;CreditAccount&#8221;.  This also gives developers an intuition of what each class might have as data members.  For example, the Account class might have general variable such as &#8220;String name&#8221;.  Whereas its subclasses will contains members that convey the concept of that class e.g. CreditAccount has a variable &#8220;Double interestRate&#8221; or BankAccount has a variable &#8220;Double atmFee&#8221;.  It also becomes easier to add data members to each of these classes because the classes are divided, and prevents developers from polluting the parent class with too data members that don&#8217;t pertain to multiple classes.</p>
<p>5. Function length</p>
<p>Length does matter!   Going back to point #1, you should strive to cut down on function length by removing calls to functions that are extraneous, or re-factoring sections into simple single level functions that can be called and re-used.</p>
]]></content:encoded>
			<wfw:commentRss>http://femgineer.com/2009/09/the-importance-of-readability/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Book Review: Secrets of the Rockstar Programmers</title>
		<link>http://femgineer.com/2009/08/book-review-secrets-of-the-rockstar-programmers/</link>
		<comments>http://femgineer.com/2009/08/book-review-secrets-of-the-rockstar-programmers/#comments</comments>
		<pubDate>Sun, 02 Aug 2009 18:05:45 +0000</pubDate>
		<dc:creator>Poornima</dc:creator>
				<category><![CDATA[Book Review]]></category>
		<category><![CDATA[Software Principles & Practice]]></category>

		<guid isPermaLink="false">http://femgineer.com/?p=202</guid>
		<description><![CDATA[
<div class="twitterbutton" style="float: right; padding-left: 5px;"><a href="http://twitter.com/share?url=http://femgineer.com/2009/08/book-review-secrets-of-the-rockstar-programmers/&amp;text=Book Review: Secrets of the Rockstar Programmers&amp;via=&amp;related=DolcePixel"><img align="right" src="http://femgineer.com/wp-content/plugins//easy-twitter-button/i/buttons/en/tweetn.png" style="border: none;" alt="" /></a></div>


For my summer software reading I choose Secrets of the Rockstar Programmers by Ed Burns (yes I know the title is a bit cheesy&#8230;).  The book contains interviews with several male programmers, who have been in industry for at least 10 years, and have made significant contributions to in pure software such as creating a ]]></description>
			<content:encoded><![CDATA[
<div class="twitterbutton" style="float: right; padding-left: 5px;"><a href="http://twitter.com/share?url=http://femgineer.com/2009/08/book-review-secrets-of-the-rockstar-programmers/&amp;text=Book Review: Secrets of the Rockstar Programmers&amp;via=&amp;related=DolcePixel"><img align="right" src="http://femgineer.com/wp-content/plugins//easy-twitter-button/i/buttons/en/tweetn.png" style="border: none;" alt="" /></a></div>
<p><a href="http://femgineer.com/wp-content/uploads/2009/08/Screen-shot-2009-12-23-at-1.42.10-PM.png"><img src="http://femgineer.com/wp-content/uploads/2009/08/Screen-shot-2009-12-23-at-1.42.10-PM.png" alt="" title="Screen shot 2009-12-23 at 1.42.10 PM" width="124" height="153" class="alignleft size-full wp-image-418" /></a>For my summer software reading I choose <em><a href="http://www.amazon.com/Secrets-Rock-Star-Programmers-Riding/dp/0071490833/ref=sr_1_1?ie=UTF8&amp;qid=1249235851&amp;sr=8-1" target="_blank">Secrets of the Rockstar Programmers</a></em> by Ed Burns (yes I know the title is a bit cheesy&#8230;).  The book contains interviews with several male programmers, who have been in industry for at least 10 years, and have made significant contributions to in pure software such as creating a framework like Spring, or working on .NET architecture.</p>
<p>I thoroughly enjoyed the book, and the format makes it easy to digest.  However, it took me a while to get through, because I wanted to mentally process each programmer&#8217;s hard and soft skills, and lifestyle.  I thought it was an accurate depiction of what I believed the life of a programmer to be, and what it took to be stellar in the field of software.</p>
<p>There are a few common themes amongst these <em>rock stars</em>.  The vast majority of them have trouble with work life balance, the exception being British programmers, such as Adrian Colyer, CTO of SpringSource, who spends weekend with his family.  But for the rest, life is about solving problems and thinking about problems all the time.  The younger programmers, especially, have trouble balancing a family life, and attest to the fact the have to be told spend time with family or have learned to make time.  As far as hard skills go, Burns spent most of his time asking how these programmers keep up with technology trends, which blogs they read, and how to spot the latest language fads.  When it comes to soft skills, a few believe it is important to have a business sense if you want to advance, but there are a few in the minority, who would rather focus their efforts on development and technology.</p>
<p>I also enjoyed the historical perspective of the book.  Burns interviews programmers who pretty much started out with punch-cards, to those who have never had to manage memory.  Having been an electrical engineer, it is very interesting to see how hardware technology improved the overall productivity of programmers, and from the software side it peaked my curiosity of what&#8217;s to come in areas such as cloud computing and thinking about the computer as a network rather than an individual self-contained processing unit.</p>
<p>After finishing the book I started thinking of issues that I felt the book did not handle, the most obvious being there were no female programmers interviewed!  While I don&#8217;t believe it necessarily detracts from the essence of the book and what it takes to be a <em>rockstar programmer</em>, I think it highlights one of the fundamental problems that exists in the software industry: lack of female role models.  Those who did exist such as Grace Hopper, have yet to be  replaced by a new generation.  And I don&#8217;t think it is because software is particularly difficult, there are plenty of women surgeons and lawyers.</p>
<p>Leaving aside the gender bias, I also thought the book was too biased in interviewing programmers who worked for purely software based companies like Microsoft, SpringSource, and Sun.  While I think programmers at these companies are highly capable individuals, IMHO, they do not have the same resource constraints (both programmers and technology), and consumer driven issues such as security and high availability that programmers at places like Amazon.com, Facebook, and Mint.com face.  It has hardly, if any programmers like myself, who work for consumer web services, and are constantly fighting to solve scalability, security, and performance issues.  I would have liked to have learned about how people handle thinking about such issues given the fact that the age of the Internet is causing more software engineers to go into web services.</p>
<p>Overall, I would highly recommend reading Burns&#8217; book, especially for those who are a few years out of college like myself, who are wondering what the next steps are in their career, and interested in learning from those who have paved the way.</p>
]]></content:encoded>
			<wfw:commentRss>http://femgineer.com/2009/08/book-review-secrets-of-the-rockstar-programmers/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

