<?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>consulting &#8211; Software, Fitness, and Gaming &#8211; Jesse Warden</title>
	<atom:link href="https://jessewarden.com/tag/consulting/feed" rel="self" type="application/rss+xml" />
	<link>https://jessewarden.com</link>
	<description>Software &#124; Fitness &#124; Gaming</description>
	<lastBuildDate>Wed, 29 Jun 2016 01:54:59 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://jessewarden.com/wp-content/uploads/2016/08/cropped-Lambda2-32x32.png</url>
	<title>consulting &#8211; Software, Fitness, and Gaming &#8211; Jesse Warden</title>
	<link>https://jessewarden.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Some Notes To Consider on the Technical Difficulties with Healthcare.gov</title>
		<link>https://jessewarden.com/2013/10/some-notes-to-consider-on-the-technical-difficulties-with-healthcare-gov.html</link>
					<comments>https://jessewarden.com/2013/10/some-notes-to-consider-on-the-technical-difficulties-with-healthcare-gov.html#comments</comments>
		
		<dc:creator><![CDATA[JesterXL]]></dc:creator>
		<pubDate>Tue, 22 Oct 2013 21:05:23 +0000</pubDate>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[aca]]></category>
		<category><![CDATA[consulting]]></category>
		<category><![CDATA[healthcare]]></category>
		<category><![CDATA[healthcare.gov]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[technicaldebt]]></category>
		<category><![CDATA[websites]]></category>
		<guid isPermaLink="false">http://jessewarden.com/?p=4426</guid>

					<description><![CDATA[I&#8217;m not involved. I am not saying I&#8217;m for/against ACA. That said, a few things I&#8217;ve gleaned from a few of the technical views on the internet that weren&#8217;t from a higher profile source such as the NY Times: http://www.nytimes.com/2013/10/21/us/insurance-site-seen-needing-weeks-to-fix.html First, when management says &#8220;a few weeks&#8221;, what that really means is a few months. [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>I&#8217;m not involved. I am not saying I&#8217;m for/against ACA. That said, a few things I&#8217;ve gleaned from a few of the technical views on the internet that weren&#8217;t from a higher profile source such as the NY Times:</p>
<p><a href="http://www.nytimes.com/2013/10/21/us/insurance-site-seen-needing-weeks-to-fix.html" rel="nofollow">http://www.nytimes.com/2013/10/21/us/insurance-site-seen-needing-weeks-to-fix.html</a></p>
<p><span id="more-4426"></span>First, when management says &#8220;a few weeks&#8221;, what that really means is a few months. Yes, months.</p>
<p>Second, because it&#8217;s so big with many of the parts not under the purview of the contractor, they can&#8217;t rewrite it. That means, it&#8217;ll take 2 times or more longer.</p>
<p>Third, bringing on additional contractors/people will not help fix the problem. There was a book written in the 1970&#8217;s called the Mythical Man Month that debunked the claim that adding more programmers will make things get done faster. It causes the opposite. See Slate&#8217;s coverage here:Â <a href="http://www.slate.com/blogs/moneybox/2013/10/21/obamacare_and_the_mythical_man_month.html" rel="nofollow">http://www.slate.com/blogs/moneybox/2013/10/21/obamacare_and_the_mythical_man_month.html</a></p>
<p>Fourth, launching a site before it&#8217;s fully tested is fine and encouraged. Software, currently, has no fool proof way to detect for all problems. There are certainly languages and programming techniques some mathematicians can use, but that&#8217;s not the tools the private sector uses to build web sites.</p>
<p>Fifth, even if fixed, it&#8217;s clear the parties they&#8217;re responsible for connecting to for customer data are a huge component and huge part of the problem such as the Centers for Medicare and Medicaid Services. Since they are not under the direct control of CGI Federal, the contractor originally responsible to buildÂ <a href="http://healthcare.gov/" rel="nofollow">healthcare.gov</a>, there is only so much you can do to compensate for someone else&#8217; incompetence &amp; lack of communication. Meaning, holding CGI solely responsible unfortunately is not an option. It&#8217;d be easy to blame CGI for the failings, but that&#8217;s not how software, and our bloated government, work.</p>
<p>Sixth, 8 out of 10 software projects are failures, and 9 out of 10 are perceived as failures. Software is hard. We do it not because it&#8217;s a lottery, but because when it works it makes a huge difference despite the huge assurance we&#8217;ll fail.</p>
<p>Things will slowly improve. There will continue to be glitches, some of which the press may even talk about, a year from now. Jan 1st deadline is unrealistic.</p>
<p>&#8230; and for those who are curious about what just 6 million lines of code can do vs. 500 million, check it:Â <a href="http://arstechnica.com/information-technology/2013/10/the-navys-newest-warship-is-powered-by-linux/" rel="nofollow">http://arstechnica.com/information-technology/2013/10/the-navys-newest-warship-is-powered-by-linux/</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://jessewarden.com/2013/10/some-notes-to-consider-on-the-technical-difficulties-with-healthcare-gov.html/feed</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Breaking the $100 Per Hour Barrier</title>
		<link>https://jessewarden.com/2013/09/breaking-the-100-per-hour-barrier.html</link>
					<comments>https://jessewarden.com/2013/09/breaking-the-100-per-hour-barrier.html#comments</comments>
		
		<dc:creator><![CDATA[JesterXL]]></dc:creator>
		<pubDate>Sun, 15 Sep 2013 15:01:29 +0000</pubDate>
				<category><![CDATA[Branding]]></category>
		<category><![CDATA[Business Process]]></category>
		<category><![CDATA[Marketing]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[1099]]></category>
		<category><![CDATA[consulting]]></category>
		<category><![CDATA[corptocorp]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[freelance]]></category>
		<category><![CDATA[money]]></category>
		<category><![CDATA[personalbranding]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[proposition]]></category>
		<category><![CDATA[rate]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[value]]></category>
		<category><![CDATA[w2]]></category>
		<category><![CDATA[w9]]></category>
		<guid isPermaLink="false">http://jessewarden.com/?p=4382</guid>

					<description><![CDATA[I get this question at least once a year so thought I would write a blog post on it to help others. &#8220;How do I make more than $100 per hour?&#8221;. I&#8217;ve learned a few ways and wanted to share them below. If you want to save time, simply do something other than programming such [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>I get this question at least once a year so thought I would write a blog post on it to help others. &#8220;How do I make more than $100 per hour?&#8221;. I&#8217;ve learned a few ways and wanted to share them below. If you want to save time, simply do something other than programming such as flipping houses, investment banking, or being the boss of a mid size company. They make way more money than we do. If you still love programming, but just want to know your options for making more money, read on.</p>
<p>I won&#8217;t cover whether money can buy you happiness or not. All I&#8217;ll say is that for some people it does, and others it does not.</p>
<p>Many of the financial and tax nomenclature below applies to the USA, but the types of work are the same regardless of country.</p>
<p><span id="more-4382"></span><strong>Introduction</strong></p>
<p>Early on my consulting career, I found the maximum amount of money I could charge per hour was $100/hr. I had just assumed it was a simple linear graph: the more time that goes, the more experienced &amp; marketable I get, thus the more money I can make per hour. This wasn&#8217;t the main metric I used to measure my success, but it&#8217;s certainly how a lot of people, at least in America, do. &#8220;How much money do you make?&#8221;</p>
<p>As time went on, and I actually did get more experienced, I learned it&#8217;s not a linear line. A variety of things can happen, or not, to affect it&#8217;s elevation. Examples include not working for a couple months, whether intentionally or not. There are a variety of stages you can possibly go through, at least in software development, and I&#8217;m still learning all the possible vs. desirable ones.</p>
<p>The basics are starting out in an internship or job, then breaking away to do freelance, and finally starting a company.</p>
<p>Below are the 3 things that don&#8217;t work.</p>
<p><strong>W2 &#8211; Salaried Employee</strong></p>
<p>Salaried employees are those who work for a company, called a &#8220;job&#8221;, and that company takes out your State and Federal taxes for you. They pay a salary, a flat amount of money per 1 days worth of work, whether you actually work 1 hour or 12 doesn&#8217;t matter. They also offer &#8220;compensation packages&#8221; such as 401k matching, 20 or more vacation days, and 5 or more sick days. People put their own arbitrary dollar amounts on these which helps companies offset their lowered salaries.</p>
<p>The problem with W2 is that you eventually max out. I&#8217;ve yet to see a salaried programmer make more than $175,000, although most are $120,000. That&#8217;s gross, not net. That&#8217;s still only about $90 an hour if you take out vacation days and holidays. You&#8217;re replaceable, and there is only so much code you can produce in a given time on your own. Although there are <a href="http://www.dungeonsanddevelopers.com/">skill trees for development</a>, getting better doesn&#8217;t lead to making more money. You basically have to go into management, leadership, or sales to sometimes fully utilize all those software skills you know. There are SOME options for hybrid roles such as Enterprise Architects, people who dictate how to build things but don&#8217;t actually build the things. Sales Engineers are another. You travel with a Sales person and get their back when the clients ask highly technical questions. Sometimes you get to code, but they&#8217;re often just simple prototypes, not real projects.</p>
<p>Finally, W2 is perceived as a form of &#8220;stability&#8221;; something long term, something earned and deserved. Unfortunately, that&#8217;s how things were back in the 1940&#8217;s, not anymore. Regardless, the prophecy is self-fulfilling for some people, so they believe it to be true, and thus it is true even if it&#8217;s not.</p>
<p>Unless you actually want to get out of programming, W2 isn&#8217;t an option.</p>
<p><strong>1099 &#8211; Freelance</strong></p>
<p>Freelancers usually charge by the hour or project (obviously they like the former). They are synonymous with contractors: someone who works for the company but is their own business. Your own business can just be 1 person: you. You are ultimately responsible for all of your finances and taxes, thus you file a form for the IRS called a 1099. The common rule is when you get a paycheck, you immediately take 33%, round up, and shove into savings so you can pay once a month, 4 times a year, or once if you&#8217;re a slacker the taxes you owe the State you live in and the IRS. None of that includes your operating expenses like buying your own computer, contributing to your retirement, and paying your own medical insurance.</p>
<p>The key here, though, is you can pay those first, THEN get taxed on what you have left over using &#8220;pre-tax&#8221; money whereas in W2, you&#8217;re taxed twice: first on your paycheck and then whatever you buy with it, the IRS still assumes you made X per year. For example, lets say you make $100,000 per year. You then buy $50,000 worth of hardware, software, and office space. You then only owe $16,500 in taxes vs. $33,000 like you would as a W2. This desire to spend your pre-tax money, whether on stuff, services, or even contributing to retirement accounts like SEP IRA&#8217;s is yet another to balance in your time that has nothing to do with programming. W2&#8217;s don&#8217;t have to worry about any of this crap.</p>
<p>This amount of work is not to be understated. This is how many companies go out of business. It&#8217;s also a lot of work for 1 person to handle just 1 persons business finances, let alone all the time spent hustling to get clients. More importantly, though, companies bear this &#8220;burden&#8221; when hiring W2&#8217;s. This is why a lot more companies are going the 1099 route or hiring contractors for set projects, not providing benefits, nor the &#8220;free&#8221; tax services like <a href="http://www.bbc.co.uk/news/uk-24017011">Amazon and others are doing in the UK</a>Â and in the states.</p>
<p>There are a variety of reasons programmers go freelance. There is no growth potential at their W2 job. They don&#8217;t like the clients they&#8217;re working with and want to choose their own. They have short attention spans and want smaller projects. They hate the large code base they&#8217;re working on that&#8217;s messed up and they didn&#8217;t create, and want the opportunity to create their own. They want to utilize a completely different technology stack and there is no opportunity to do so at their current job.</p>
<p>Whatever the reason, the POTENTIAL exists for making more money than W2. Sometimes, you&#8217;ll make less. The reasons for those are also numerous. While you may get many high paying gigs, you may actually have many weeks or months with no work. While W2 has a steady paycheck, 1099 does not. Additionally, there is a cost of doing business that you now incur. Time spent on the phone, writing emails, going to meetings and conferences, writing books, blog entries, curating relationships with your content and others on social media; all of that takes a lot of time that no one is paying you for. Some of that could lead to getting a client to hire you to build something. Sometimes that client just wants free consulting, or is asking you and 9 other contractors to bid on a project and they just want you to do the quote for them with zero intention of actually hiring you.</p>
<p>The reasons are vast. The theory, though, is that you&#8217;re using a technology with either a local market (where you live) that has a need for your skills, a remote market (meaning you telecommute with clients you&#8217;ll never meet face to face), or both. Sometimes you&#8217;ll get many concurrent projects. While one project has slow communication and is long term, and other is more clear, and shorter. While you&#8217;d prefer to have both side by side, the companies hiring you, and their clients, usually dictate the schedule, and they don&#8217;t care that you haven&#8217;t had any work all June and July, and now 3 companies want to start work immediately in August all at the same time. Sometimes that can work; other times it can sacrifice your code quality so you can only get one.</p>
<p>Bottom line, this is where most programmers get stuck. If they do manage to break the $100/hr barrier, it&#8217;s because they got a fixed bid contract and just did it in a shorter time. Meaning you produce the work for this amount of money, no more. If you work 4 hours or 40, you still get paid the lump sum. So, if you can do 40 hours worth of work for less than 40, then great, you just made more than $100/hr. Sadly, this is just 1 week out of the year. It also doesn&#8217;t factor in the cost of doing business to actually get that contract signed.</p>
<p>1099 is a mindset. You either like the freedom, the &#8220;harder I work, the more I get paid&#8221;, or just the lifestyle of having your clients&#8230; even if those clients are just like a W2, only with none of the benefits. Worse, many large companies cannot do work directly with 1099&#8217;s, and want to do W9. While that&#8217;s fine, it&#8217;s usually assumed those W9&#8217;s are a preferred vendor, or have workman&#8217;s comp and a lot of other bs that isn&#8217;t needed and doesn&#8217;t matter. If you get the W9, great, but if you&#8217;re not a preferred vendor and you haven&#8217;t convinced the company to go through the process, you&#8217;ll simply have some company you&#8217;ve never heard of take $10 to $30 an hour off your paycheck. Horrible.</p>
<p>Independent Contractor programmers, someone who owns a company strictly as a tax shelter and is a single person, aren&#8217;t usually paid more than $100/hr outside of California, New York, or Boston. So 1099 is usually a no go (exceptions below).</p>
<p><strong>Recruiters</strong></p>
<p>Recruiters are a waste of your time, and theirs.</p>
<p>Many companies lack the resources to &#8220;find you&#8221;. Even if you make yourself easy to find on the internets, they often won&#8217;t look. Swimming through mountains of programmer social media is less savory than paying a fee to someone to &#8220;find me someone with these skills&#8221;. While smaller companies who recognize the value of good talent DO use Github, LinkedIn, and Google to search for people such as yourself, they aren&#8217;t going to dump bling into your lap.</p>
<p>Thus, recruiters are often the gateway to jobs nowadays. Many in large companies like recruiters because it&#8217;s not their money being spent, and a litany of resumes arrive in their email with them not having to do anything but ask HR to send a list of requirements of what they need. As such, most job sites nowadays such as Monster, Dice, LinkedIn, etc. are owned by recruiters. I say owned because finding a job posting that ISN&#8217;T a recruiter is rare. If it&#8217;s not, the likelihood of someone with your skills getting past the often horrible interview web applications or HR wall (&#8220;Yes, mam, as I&#8217;ve told you, MVP is just like MVC, and Ember and Backbone share many characteristics, so if you know one, you can easily learn the other and be prod&#8230; mam? Hello?&#8221;)&#8230; all for W2 position we&#8217;ve already talked about is a no go.</p>
<p>They&#8217;ve seen their business explode since the information age started back in the 80&#8217;s and 90&#8217;s. We have some of the worst unemployment, underemployment, and those giving up and leaving the workforce since 1979. This means a few things.</p>
<p>First, it&#8217;s just &#8220;normal&#8221; nowadays that mid-size and large companies use them. You may not like the game, so you can either get played by it, play it, or make your own rules.</p>
<p>Second, a lot of them are NOT there by choice. We have a swath of college educated youngsters with degrees not in the Art disciplines who just can&#8217;t find jobs that their degrees implied. Many went to recruiting because they had no other choice.</p>
<p>Therefore, you shoulder never be rude to them for the above reasons. Yes, I troll them every chance I get, but that&#8217;s in good fun. You should never be rude; you never know when you have zero choice but to go through a recruiter for a job. We&#8217;re extremely lucky in software, and history shows it will not last.</p>
<p>Keep in mind larger consulting firms like Accenture, Deloitte, IBM, Randstad, etc. are hybrid. They sometimes act like staffing companies, but often have internal divisions that do consulting. Meaning, although they recruit you, can you get above $100/hr rates with them which often includes lots of travel, but is still longer term projects. Still, better to err on the side of caution; bring up money first to save yourself time.</p>
<p>That said, again, recruiters are a waste of your time, and theirs. I made $80,000 at one large company, and another $140,000. We went through the same recruiting firm for the same position. When I once was hiring for my client, the recruiting firm was charging $200/hr and paying him $80/hr. Finally, recruiter rates are beholden to the location in which they are hiring. You won&#8217;t get New York city rates in Nashville even if the recruiting firm is national; companies, even for telecommuters, often pay the local rate.</p>
<p><strong>5 Solutions</strong></p>
<p>So if &#8220;a job&#8221; caps out at or below $100/hr, freelance has no growth potential with maintenance pain, and recruiters are worthless, what to do? You have 5 options that I&#8217;ve seen work. I&#8217;m sure there are more, I&#8217;m just basing the below on what&#8217;s worked for me, others I know, and what I&#8217;ve seen work from past clients who&#8217;ve done it.</p>
<ol>
<li>Build a Personal Brand</li>
<li>Score a large client</li>
<li>Find a Closer</li>
<li>Find a network and form a firm</li>
<li>Start a business</li>
</ol>
<p><strong>Build a Personal Brand</strong></p>
<p>I&#8217;ve written about <a href="http://jessewarden.com/2006/10/personal-branding-checklist.html">Personal Branding</a>Â 7 years ago. I even <a href="http://www.youtube.com/watch?v=R4HP08mlefk&amp;list=PLZEZPz6HkCZl7gJELOkwz5WF4pTahlUB7">talked in depth about Personal Branding in my video series</a> about becoming a successful freelancer. Make no mistake; the level of effort is inversely proportional to how bad ass you are. This includes either your talent &amp; technical prowess at programming, your charisma, or both. The less awesome you are, the harder you have to work. That&#8217;s called life.</p>
<p>Worse, if you cultivate a rock star status, whether on purpose or by accident, fame is fleeting. Trends in software occur just like they do in the music industry. A library you wrote, a blog post that became popular, or an app that scored you money and fame&#8230; is only temporary and you can only milk it so long. A personal brand is something that is cultivated often, like a garden. The decisions you make in the beginning help guide it and create expectations amongst those in the industry.</p>
<p>Writing blog posts, contributing to open source, releasing helpful code, speaking at conferences, and writing books are all staples of building a personal brand for yourself. Additionally, networking and PARTICIPATING in the industry, even if it&#8217;s just your small niche, are important. You want people to like you, you want them to want to work with you, and most importantly, THEY should be selling the client on you, not you selling the client on you. <a href="http://sethgodin.typepad.com/seths_blog/2008/03/why-bother-havi.html">You don&#8217;t have a resume</a>.</p>
<p>Those who have cultivated their epics skills/personality/brand are rife. Martha Stewart, Rachel Ray, Dr. Oz, Oprah, Craig Ferguson, Conan O&#8217;Brien, etc. In our industry, <a href="http://gskinner.com/blog">Grant Skinner</a>, <a href="http://en.wikipedia.org/wiki/Bruce_Eckel">Bruce Eckel</a>, <a href="http://en.wikipedia.org/wiki/Linus_Torvalds">Linus Torvalds</a>, <a href="http://ejohn.org/">John Resig</a>, <a href="http://www.paulirish.com/">Paul Irish</a>, <a href="http://joelhooks.com/">Joel Hooks</a>, <a href="http://infrequently.org/">Alex Russell</a>, <a href="http://www.joshuadavis.com/">Joshua Davis</a>, <a href="http://www.joa-ebert.com/">Joa Ebert</a>, and <a href="http://ricardocabello.com/blog">Ricardo Cabello</a> (<a href="http://www.mrdoob.com/">Mr Doob</a>).</p>
<p>You may not know some of them, which is fine, but also potentially brings up a good point. Some of them spend more time using their talents, and the fame is just a byproduct of that, whilst others get the marketing angle, and help accentuate their work. People like me are 90% big mouth, 10% contribution. Any combination works. The point is, it&#8217;s hard work, but less so if you&#8217;re talented. And you can&#8217;t stop, you have to keep marketing yourself, either through continually producing awesome, or continually producing just enough awesome, and marketing like crazy.</p>
<p>If you&#8217;re famous, you can easily charge more than $100/hr for freelance work even for work that&#8217;d normally go for $80/hr. Just depends on the clientele.</p>
<p>Con? It&#8217;s a lot of work. All the time. Sometimes you have to start at square one if the tech changes. It can be done and repeated and is easier in a objective discipline like programming vs. the entertainment industry.</p>
<p><strong>Score A Large Client</strong></p>
<p>I&#8217;ve seen many large agencies and software firms sprout up like this. You&#8217;re 1 dudette/dude, 2 friends, or maybe you just know a lot of people you could sub-contract for design and other back-end/front end development if you could only get a large client. What happens is, the contractor gets a large client, can&#8217;t handle the size of the project alone, hires people, and voila: a company.</p>
<p>The money comes into play from 2 places. First, the job is obviously larger, thus requires more money to pay more people for more time working.</p>
<p>Second, those more people do not get the same amount you do. There are a variety of factors that dictate how much a designer gets, a front end developer gets, a back-end developer, manager, project manager, qa, etc. The more you make is inversely proportional to how much you pay your sub-contractors/employees. The less you pay, the more you make. Except it&#8217;s not you, it&#8217;s the company&#8230; or are you just paying yourself? That gets into running a business which I won&#8217;t cover here. Obviously if they&#8217;re an idiot contractor who&#8217;s good at coding but sucks at math, you can&#8217;t pay them less than living expenses, else they&#8217;ll lose their house/apartment/flat in the middle of the project, and that&#8217;s no good. Yes, you&#8217;ll get people like this.</p>
<p>You then bill those people out at a higher rate. This is how it works with big clients. Large company hires large firm. Large firm hires smaller firm. Smaller firm hires you as a 1099 contractor. The pay goes like this: Large company pays Large firm $300/hr. Large firm pays Smaller firm $150/hr. Smaller firm pays you $80/hr. Now that you&#8217;re the Small firm, you now get the $150/hr&#8230; and you&#8217;re sub-contractors get the $80/hr. Make sense?</p>
<p>The more sub-contractors you get, the longer the project is, or both results in more money in your pocket; well over $100/hr.</p>
<p>How does one score such a Large client? One way, you can become a preferred vendor/consultant/provider of your favorite technology stack. Whether it&#8217;s the company that makes it, or those who have a vested interest in it, one things for sure: those who make technology are not consulting firms. They focus on making tech, not forcing a bunch of people to travel to some random location to build something for random business for a bunch of dough. YOU and yours are the ones who actually represent that company and do the actual work. Obviously they have small arms in the sales team that do this, but they usually don&#8217;t scale that side of the business.</p>
<p>Another way is networking with past clients. One way to utilize a network you&#8217;ve created is to contact past clients&#8217; clients directly if your non-compete is up. For example, lets say you worked for a company as a 1099 that worked on a project for Nike. You did a great job, and had a good relationship with the company, and even had the opportunity to work with some people at Nike directly. Most smart companies will ensure you never talk to them for this very reason. 1 year+ later (or whatever your non-compete states), you reach out to them and ask if they have any work. If you kicked ass, they&#8217;ll remember you. Suddenly, that cut in pay is gone since you can form a direct relationship with them either as W9 (corp to corp), and possibly become a preferred vendor for that company: 1 of many companies who gets first dibs on projects they outsource.</p>
<p>Other times, you just get lucky as a Freelancer, and you portray yourself as a &#8220;company&#8221; with 6 people (who are really part time sub-contractors). Thus, larger companies will come asking you to deliver something quite large. It&#8217;s not dishonest at all if you truly can deliver. I&#8217;m making the assumption here you&#8217;ve worked on multi-person projects and can actually do what you say you can do. It&#8217;s all about how sell yourself. Example: <a href="http://jessewarden.com">jessewarden.com</a> vs. <a href="http://webappsolution.com">webappsolution.com</a>.</p>
<p>Don&#8217;t be afraid to write contracts that are too large for you to handle. If they were, you wouldn&#8217;t have the cajones to actually move forward with it, and finding resources for a project that&#8217;s too big for you is a good problem to have. It&#8217;s already assumed at this point that you know a bunch of freelancers, and might have even put them in a spreadsheet to list their name, contact info, last known rate, and area of speciality. BUILD UP THAT NETWORK and then USE IT.</p>
<p><strong>Find A Closer</strong></p>
<p><iframe src="//www.youtube.com/embed/8kZg_ALxEz0" width="640" height="480" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<p>All closers are salesman, but not all salesman are <a href="http://www.youtube.com/watch?v=8kZg_ALxEz0">closers</a>. Many companies spring out from a talented closer who scores that big client, whether from a cold call or networking. It&#8217;s like the previous &#8220;Score A Large Client&#8221;, except there&#8217;s no work on your part: you just unleash the closer and wait for her/him to catch you a big fish.</p>
<p>I&#8217;ve seen some successful firms/companies who are basically run by these closers. Many are partnerships where a talented programmer partnered with a talented closer and together they built a company.</p>
<p>Actually FINDING one is where I can&#8217;t help you. Most either formed the company on their own or the technical person had a childhood/college/previous company relationship beforehand.</p>
<p>Commissions don&#8217;t help, either. &#8220;Dude, I know 9% is the norm, but I&#8217;ll give you 20%.&#8221;</p>
<p>&#8220;Oh yeah? How much y&#8217;all pulling in a year?&#8221;</p>
<p>&#8220;Uh&#8230; I guess $1 million.&#8221;</p>
<p>&#8220;My current company gives me 9%, but they rake in 30 million. Thanks for the free beer, though!&#8221;</p>
<p><strong>Find a Network and Form a Firm</strong></p>
<p>You can form a firm in 2 ways. Basically, you do #1 where you&#8217;ve either established a name for yourself, and find like minded people who want to do the type of work you want to do with the types of clients you like to work with.</p>
<p>The other option is just like her majesty&#8217;s life advice: surround yourself with those better than you. You basically find a group of people, at least 1 but hopefully more, who think like you do. You all agree to find work, share work if you&#8217;re too busy, or help each other out on projects WITHOUT a premium; meaning you don&#8217;t take a cut of the rate from each other. This makes some freelance gigs a lot easier because you can borrow people for helping you out on some projects. Since they make you a priority, and there is no worry about rate negotiations, it&#8217;s a no brainer. THAT has some serious value to clients that you should up-sell. Most clients who know what they are doing recognize that already when dealing with companies that have more than 1 person vs. an independent contractor&#8230; sometimes.</p>
<p>More importantly, though, is the hope that they already have the preexisting network contacts described above. Even better, you can combine networks. It actually goes over quite well when you describe to the client that you&#8217;ve left the previous firm to found your own since that client wants you anyway. They&#8217;ll often assume you formed it to work with like minded individuals and you&#8217;re still in the idealistic and prove yourself/your company phase.</p>
<p>This is basically what I did when one of the firms I was working with exploded on itself. Preferred vendor, existing client base to get opportunities from, and 3 guys who all have different strengths that compensate my weaknesses, specifically 2 of them doing back-end Java (I&#8217;m 100% front end). The bigger clients want <a href="http://webappsolution.com">Web App Solution</a>, not <a href="http://jessewarden.com">Jesse Warden</a>.</p>
<p>This is the opposite if your brand is really powerful, though. For example, some strong personal brands form a company, and larger companies will hire them strictly because they want that one person&#8217;s expertise/clout/reputation.</p>
<p>$101-$119/hr is no mans land. Once you have a company that consists of individuals, not just a bunch of subs, $120 on up gets tons more likely&#8230; because the sum is greater than its individual parts. That has a lot of value to companies who need you to scale, be used to scaling quickly, and have a network of your own to acquire certain resources for certain types of projects (UX, design, business analysts, etc). That and it&#8217;s easier for the CPA and lawyers to swallow since you&#8217;re a more legit entity to do W9 work with for tax and legal purposes.</p>
<p>Keep in mind, while it&#8217;s obviously nice to have a track record that you can show to existing clients of your firm helping companies build awesome, often it&#8217;s just as accurate to use past clients as that track record. For example, all of your past freelancing clients you can include in your company&#8217;s repertoire of past clientele.</p>
<p>If your partners, or even just sub-contractors don&#8217;t have a network, you better have one&#8230; else you&#8217;re just fishing for the big client with extra lines in the water.</p>
<p><strong>Start A Business</strong></p>
<p>Everything I&#8217;ve talked about up to this point has been B2B: Business to Business. Some company hires your company. However, that&#8217;s not where the real money is for software development. The real money is in products. Now, granted, you can create products for a certain set of businesses, thus making you a B2B, vs. targeting consumers as a B2C, but the point here is you are NOT a services company: You&#8217;re a product company.</p>
<p>If a clients software project fails, your company doesn&#8217;t fail. If your a product company, and your product fails, your company fails. Huge difference.</p>
<p>Products also have the nice ability to sometimes make passive income. That means, while you sleep they make money. Some products require companies around them to build and support them, hence the current state of Silicon Valley. The amount of effort gets less every day, as does the cost of entry.</p>
<p>While there is more risk, having hundreds or even thousands of people pay $10/a month for your software is a lot more appealing then hustling multiple times a year to get a client to pay for the next few months. You can flip that around, too; a few dozen customers paying you $250 a month.</p>
<p>While there are a bunch of great <a href="http://en.wikipedia.org/wiki/Minimum_viable_product">articles</a> and <a href="http://www.amazon.com/Rework-Jason-Fried/dp/0307463745/ref=sr_1_1?ie=UTF8&amp;qid=1379010456&amp;sr=8-1&amp;keywords=37signals">books</a> on the subject, here&#8217;s the general idea:</p>
<ol>
<li>Find a problem you think you can solve with software, and if it has competition, you think you can solve it better.</li>
<li>Build a prototype in less than a week.</li>
<li>Show it a potential customer and ask them if they&#8217;d pay for it.</li>
<li>Iterate weekly/bi-weekly until they do.</li>
<li>Get more customers.</li>
</ol>
<p>Eventually you&#8217;ll reach what Paul Graham calls <a href="http://paulgraham.com/ramenprofitable.html">Ramen Profitable</a>. It&#8217;s a way longer ramp up time, but has a potentially greater reward. It&#8217;s also assumed you&#8217;ll fail multiple times getting there which is hard for some people to swallow in a culture that&#8217;s all about winning and &#8220;the thought of losing&#8230; is HATEFUL to Americans.&#8221; &#8212; Patton.</p>
<p>If you ain&#8217;t failin&#8217;, you ain&#8217;t trying hard enough, sucka!</p>
<p><strong>Dangers</strong></p>
<p>There are a few potential dangers you need to be aware of going the above route.</p>
<p>First, you need to be flexible. Are you willing to accept work at or below $120/hr? If not, can you survive on savings until you find a client? The &#8220;I deserve&#8221; or entitlement mentality is dangerous. You don&#8217;t get what you deserve, you get what you negotiate. Some companies just don&#8217;t have that kind of money.</p>
<p>Second, it&#8217;s hard to go back to salaried positions once you&#8217;ve gone the Firm or Freelance route. The startup route is a lot easier, and the freelance somewhat easier. Often, if the company doesn&#8217;t know your brand, it doesn&#8217;t matter.Â You need to be careful how you pitch your &#8220;long term consulting&#8221; or &#8220;short term freelance&#8221;.</p>
<p>If you ran a company, you suddenly know a lot about the game, and companies get nervous when you want to quit that and go back to W2. Sometimes that&#8217;s uber valuable to them, but as a front line software developer, it&#8217;s sometimes hard for them to see that value. Others get nervous if they see a lot of short term gigs on your LinkedIn and/or resume and you suddenly apply for a long term position. If you talk to a business owner, it&#8217;s an easier conversation; they get it. Other times this can backfire; &#8220;If you&#8217;re running a business, why come work for me? What about your competing interests?&#8221;. If you talk to an HR, manager, or senior developer, they might not understand at all. Remember, the truth of your history is written by you; modify your social media and resume to match the position you&#8217;re going for.</p>
<p>Also, be aware it&#8217;s a new world. Going back to the old one can be hard. You can sometimes forget what it&#8217;s like to NOT speak about business and software in the same sentence&#8230; vs. just software. This is reflected in your resume, social media, and conversations with people.</p>
<p><strong>Conclusions</strong></p>
<p>If you want to break the $100/hr barrier, getting a salaried position, being a single freelancer, or wasting your time with recruiters won&#8217;t get you there. There are a few exceptions with freelancing, especially on the back-end. Many Ruby/Python/Scala etc. guys can charge $200/hr to $300/hr in the Bay Area. The key, though, isn&#8217;t getting a project for that much money, it&#8217;s getting a career where that&#8217;s the norm.</p>
<p>Whether building a strongly recognizable personal brand, scoring a large client which is a catalyst for creation and growth, finding a closer, forming your own firm, or even creating a product that itself validates the company around are just 5 ways in which you can break that barrier. I&#8217;m sure there are more.</p>
<p>Even not being successful, you still learn a ton, and if you&#8217;re a long time software developer, constantly learning and re-learning is probably something you already do anyway. So it&#8217;s ok to try some of the things above and fail, especially the last one. I&#8217;ve had a lot of failures. I even once refused work for 6 months in an attempt to learn how to double my rate. I failed but I <a href="http://jessewarden.com/2010/08/what-i-learned-about-trying-to-double-my-rate.html">learned a ton</a>.</p>
<p>I also posted a companion video to this post, embedded below, that <a href="http://youtu.be/KfXLSj2xWUE">you can watch</a>.</p>
<p><iframe src="//www.youtube.com/embed/KfXLSj2xWUE" width="640" height="480" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
]]></content:encoded>
					
					<wfw:commentRss>https://jessewarden.com/2013/09/breaking-the-100-per-hour-barrier.html/feed</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Consulting Chronicles #7: The Priority Pyramid</title>
		<link>https://jessewarden.com/2012/04/consulting-chronicles-7-the-priority-pyramid.html</link>
		
		<dc:creator><![CDATA[JesterXL]]></dc:creator>
		<pubDate>Wed, 04 Apr 2012 14:09:37 +0000</pubDate>
				<category><![CDATA[Consulting Chronicles]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[consulting]]></category>
		<category><![CDATA[consultingchronicles]]></category>
		<category><![CDATA[leadership]]></category>
		<category><![CDATA[priority]]></category>
		<category><![CDATA[prioritypyramid]]></category>
		<category><![CDATA[pyramid]]></category>
		<category><![CDATA[refactoring]]></category>
		<category><![CDATA[software]]></category>
		<guid isPermaLink="false">http://jessewarden.com/?p=3099</guid>

					<description><![CDATA[Introduction The Priority Pyramid is a tool I use to stay on track with new consulting clients. It prioritizes how, who, and what I engage in at any given time. It can be overwhelming when thrust into a challenging situation, a code base in dire straits, and a frustrated team. You need a strong pillar [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img fetchpriority="high" decoding="async" style="padding-right: 8px;" src="http://jessewarden.com/archives/blogentryimages/priority-pyramid-4.4.2012.jpg" alt="The Priority Pyramid - The 8 Tiers of Software Consulting" width="320" height="483" align="left" /><strong>Introduction</strong></p>
<p>The Priority Pyramid is a tool I use to stay on track with new consulting clients. It prioritizes how, who, and what I engage in at any given time. It can be overwhelming when thrust into a challenging situation, a code base in dire straits, and a frustrated team. You need a strong pillar of guidance.</p>
<p>This article goes over what parts make up the Priority Pyramid from a high level. I&#8217;ll talk about what milestones make up each section and how you navigate back and forward between the priorities.</p>
<p>When done, you should know how to engage your client&#8217;s team and tackle working on a large code base at a frustrated client site with 99 problems.</p>
<p><span id="more-3099"></span><strong>Why?</strong></p>
<p>Over the years, I&#8217;ve prioritized what I need to be doing when working my consulting clients. There are countless things I need beyond &#8220;coding&#8221;, and all have to do with &#8220;people&#8221;. Code in its own right is challenging enough. Add people to the mix and it gets more complicated than it already is.</p>
<p>Every engagement is different, even with repeat clients. This is why I like consulting. Meet new people, travel new places, learn new things.</p>
<p>While I enjoy and thrive on improv, what I didn&#8217;t like was not having a set of guidelines to deal with each new client. The business blogs &amp; books I&#8217;ve read are pretty dry, and don&#8217;t really focus on the people issues coders encounter and have to deal with. Most also assume YOU are the one creating &amp; maintaing the app, not fixing/modifying a large one extremely behind schedule. It&#8217;s either sales, management, or product management. This includes the consulting books. Some approach it from a larger consulting perspective, where you come in, listen to the client&#8217;s problems, write up a plan, and pass it off to India. If you are involved, it&#8217;s just to either head off major disaster and/or provide face time for the client.</p>
<p>This is NOT what I, and my colleagues I&#8217;ve worked with over the years do. We&#8217;re in the trenches, working alongside our clients, playing the politics games whilst coding.</p>
<p>So, I made my own rules for engagement, prioritized based on importance, with verification points to ensure I&#8217;m on the right track. If I cannot work towards getting through all tiers of the pyramid, I will not be working for the client long, whether by my choice or theirs. It&#8217;s important I flush out these red flags early and tackle them full bore.</p>
<p>That&#8230; and it has D&amp;DÂ connotations.</p>
<p><strong>Quantitative vs.Â Qualitative Foundations</strong></p>
<p>I&#8217;ve used both quantitative and qualitative results from case studies, white papers, and my own experience to base this set of priorities on.</p>
<p><a href="http://en.wikipedia.org/wiki/Brooks%27_law">Mythical Man Month/Brooks&#8217; Law</a>: &#8220;Adding manpower to a late software project makes it later&#8221;. Some of the bad projects I&#8217;ve been on had too many people on them. Your goal at that point is to delegate refactoring to the team to compensate, lead with good architecture, and leverage your trust currency to guide the various teams into a direction you need them to go. Also known as software chaos management. This requires you be at a high enough level to be in charge of various teams. If you&#8217;re not, God help you.</p>
<p>Code Review: One person, reading code for up to but not exceeding 1 hour finds more code defects than unit testing. This is not peer review, but that is also effective. Citations: <a href="http://support.smartbear.com/resources/cc/book/code-review-cisco-case-study.pdf">Code Review at Cisco Systems</a>, <a href="http://www.cnx-software.com/pdf/klocwork-research-code-review-study.pdf">Klocwork/Forrester &#8220;The Value and Importance of Code Reviews&#8221;</a>, and some other <a href="http://www.codinghorror.com/blog/2006/01/code-reviews-just-do-it.html">stats</a> from <a href="http://www.amazon.com/exec/obidos/ASIN/0735619670/codihorr-20">Code Complete</a>. Keep in mind while most of the studies mention that defects do notÂ significantlyÂ decrease after 1 person, the ability to learn from your peers and getting architecture suggestions are very well documented in the blogosphere.</p>
<p>Cheaper to Find Defects Early: Whether you are ruthless about upfront requirements gathering and/orÂ initialÂ architecture, or are adamant about short development iterations that includes scope reduction, both allow the ability to find more defects early. It&#8217;s easier to both find, and fix problems earlier than later for a variety of reasons (code size, feature acceptance, contractual obligations, etc). Beyond the IBM studies back in the 70&#8217;s here&#8217;s an <a href="http://www.methodsandtools.com/archive/archive.php?id=29">excerpt</a> from <a href="http://www.methodsandtools.com/archive/archive.php?id=29">High Quality Low Cost Software Inspections</a>. Also, crazy charts from <a href="http://sqgne.org/presentations/2011-12/Jones-Sep-2011.pdf">Capers Jones</a> (they have some other good studies). This is why I&#8217;m so adamant about getting the visual design (wireframes/design comps/ux/information architecture, etc.) right from the get go, even if 6 months into the project. Lowest hanging fruit and saves tons of time/money.</p>
<p><a href="http://dl.acm.org/citation.cfm?id=1536639">DistributedÂ Development</a> (<a href="http://cs.queensu.ca/~ahmed/home/teaching/CISC880/F10/papers/DistributedDevelopment_CACM2009.pdf">PDF</a>): The result that physical distance between developers doesn&#8217;t matter. Different room/building/country&#8230; not a big deal at all. What matters is how far the software developer(s) are from the stakeholder(s) in the organization management hierarchy. This is extremely important. I am firm believer in both telecommuting as well as on-site visits with clients for communication &amp; leadership reasons. This is central to identifying the power structure of the organization in Tier #2 and garnering trust with those who can help you talk to who you need to talk to in Tier #3. I&#8217;ve been ineffective at more than one consulting engagement because I wasn&#8217;t Â high enough to affect the required positive change.</p>
<p><a href="http://en.wikipedia.org/wiki/Toyota_Production_System">Toyota Production System</a>: Their continuousÂ improvementÂ philosophyÂ and respect for people are what really ring true to me. While <a href="http://blog.digitalbackcountry.com/2007/01/a-look-at-the-rich-internet-application-consulting-landscape/">It Takes a Village</a>Â to build great software, sometimes you have a crowded, drama filled city that you have to work within. Doing your best to get the team motivated to constantly improve, and SEE the improvement occur over time for motivation reinforcement, is just a small way to continually improve. You can only do this if you do in fact respect the people you work with. Empowering leaders amongst those who actually do the work can lead to effective production. You can use these <a href="http://www.fastcompany.com/magazine/111/open_no-satisfaction.html">Toyota Process strategies</a> in your own team delegation.</p>
<p><strong>The Priority Pyramid</strong></p>
<p>The 8 steps are in order of importance:</p>
<ol>
<li>Report</li>
<li>Understanding</li>
<li>Trust</li>
<li>Lead</li>
<li>Build</li>
<li>Explosions</li>
<li>Diagnostics</li>
<li>Architecture</li>
</ol>
<p>While it implies 4 are about coding, make no mistake: The Priority Pyramid is all about people. It&#8217;s built on your relationships with them and those relationships ensure you can do your job.</p>
<p>Lets break down the tiers the following way: What milestones do you need to complete, how to do you move on to the next tier, and when should you move back? I make the assumption if you&#8217;re on a team, you&#8217;ll divide tasks appropriately.</p>
<p><strong>A Note on Tier Foundations</strong></p>
<p>Each tier works on top of the foundation of the former. If the foundation is weak, it won&#8217;t strongly support the one on top. If you don&#8217;t have the trust of management and your co-workers, it&#8217;sÂ difficultÂ to lead them. If you don&#8217;t have a good understanding of the company andÂ peopleÂ who work within it, it becomes veryÂ difficultÂ to affect positive visual design changes to make architecture easier. It&#8217;s ok to be in Tier #8 and realize you need more understanding of how the application will be deployed from Tier #2; just like refactoring code over time, you can continue to strengthen the foundation tiers over time as well.</p>
<h2><strong>Tier #1: Report</strong></h2>
<p><strong>Milestones Before Arriving</strong></p>
<ol>
<li>You&#8217;ve talked to stakeholder(s) on the project to have an idea of what you&#8217;re getting into.</li>
<li>Verify you actually want to get into it. Some consulting gigs are hard to get out of. Some can reflect poorly on your firm/you even if you do a good job. Make sure you&#8217;re willing to make the plunge. We&#8217;re looking for red flags here to save you tons of money and stress. I&#8217;m not saying be choosy, I&#8217;m saying be careful.</li>
<li>Where you&#8217;re going, who you&#8217;re supposed to see, and when.</li>
</ol>
<p><strong>Milestones</strong></p>
<p>You/your firm has scored a client, you&#8217;ve booked your airfare + hotel, and you&#8217;re 1st day on-site has arrived. You look sharp, are excited, and looking forward to making a good first impression.</p>
<ol>
<li>First question out of your mouth after small talk should be &#8220;Who&#8217;s do I report to?&#8221;. Yes, it&#8217;s ok to follow up this question once you&#8217;ve scored more rapport with &#8220;Great, so&#8230; who&#8217;s my boss?&#8221;. This ensures you don&#8217;t do good things that get you in bad trouble.</li>
<li>Second question: &#8220;What will make you happy when I leave?&#8221;. This helps verify why you&#8217;re really here, and what they&#8217;re really paying you for. Sometimes this takes alcohol to get the true answer. Sometimes just a neutral setting outside of the office/building.</li>
</ol>
<p><strong>Successful Exit</strong></p>
<p>Know who you work for and your true goal in life for the next 8 months.</p>
<h2><strong>Tier #2: Understanding</strong></h2>
<p>The best communicators are good listeners. Your task now is to look people in the eye, lean forward, and listen well.</p>
<p><strong>Milestones</strong></p>
<ol>
<li><strong>Listen</strong>: Get people talking, asking questions, and listen to what they say. This is the most important step in the entire pyramid.</li>
<li><strong>Goals</strong>: You need to understand what the goals are for the project, both stated and real. What are you and the client really trying to accomplish? Answering &amp; documenting this will guide your actions for the rest of the project,Â overriddenÂ only by &#8220;Who do you report to?&#8221;.</li>
<li><strong>Problems</strong>: What are the problems and challenges the company has run into? Do any relate to why you&#8217;re here? Do they have a thorough list or are there more? Solving problems earns trust, and helps in the next tier. It also validates your paycheck. Why does the client have those problems? Where do you fit in? Who&#8217;s accountable for identifying solution(s) for and solving those problem(s)? These are your first challenges in the game.</li>
<li><strong>Dissect People</strong>: This is also an opportunity for you to start learning who the players are in the game. You need to understand what makes someone tick to best interact with them. Do they like business first, small later or the opposite? Do they have ulterior motives? Can they be trusted? Can they give you valuable intel on the project others won&#8217;t? What will it take to make them comfortable enough to tell you more? How can you possibly help them? You&#8217;re going to be spending the next 3 to 18 months with these people. Get to know them, make a good first impression, and understand them. These are the people you want on your team, who you want to do certain things for you, who you want to trust you. Once you understand them, you can effectively engage them. Sometimes this is done simply by watching how they interact with others. Ask questions to get them talking; their personality whilst reveal itself. Finally, figure out who reports to whom for real? What is the power structure? You&#8217;ll need to play within this framework; best to know how it works for real vs. what the label says on their door.</li>
<li><strong>Explore</strong>: Finally, code stuff. Time for initial reconnaissance. Taken what you&#8217;ve learned, it&#8217;s time to verify what you heard is recent, relevant, and can be corroborated with the code. This should still be framed from a &#8220;learning the company&#8221; perspective. You need to:</li>
<ol>
<li><strong>Learn the Data Model</strong>: The VO&#8217;s, the Services it calls, and what those business objects actually mean to the organization.</li>
<li><strong>Learn The Framework</strong>: How is the codeÂ architected; what framework did they use?</li>
<li><strong>Understand The Story</strong>: With another developer, preferably one who worked on the code base and/or your client, ask the developer questions to learn the story. Even the worst code base has a reason how it got there. Like an archeologist, you want to understand this history, the pivotal decisions, or lack thereof, that made it the way it is. You&#8217;ll learn the to respect, and pity, even the worst code base once you&#8217;re armed with this knowledge.</li>
<li><strong>Look For Red Flags</strong>: Both the currentlyÂ benign, and the &#8220;holy eff we&#8217;re eff&#8217;d&#8221;. Whether that&#8217;s everything being a hashmap in Java, Angular &amp; Backbone both being used in the same code base, or ActionScript 2. You don&#8217;t want surprises, you want to frame your perspective of the code base with your client&#8217;s. This is a VERY important step. Don&#8217;t say it, but talk about it internally in my mind. Find out why there is aÂ disparityÂ in perception.</li>
<li><strong>Look For Mines</strong>: Like red flags, these are things that down the line of a project, based on what you learned above could go boom. They aren&#8217;t aÂ priorityÂ but need to be documented.</li>
<li><strong>Look For Validation</strong>: Did everything you learned in Steps 1 &#8211; 4 get validated or where you completely off? If so, continue to dig, and redo steps 1 &#8211; 4 to re-verify.</li>
</ol>
</ol>
<p><strong>Successful Exit</strong></p>
<p>When you firmly understand the client&#8217;s reality, the reality the code reflects, and the real reality once you&#8217;ve resolved the two, you&#8217;re ready to move on. If they still don&#8217;t mesh, keep asking questions &amp; researching.</p>
<h2><strong>Tier #3: Trust</strong></h2>
<p>Assuming you&#8217;ve made good first impressions with those you&#8217;ve met, it&#8217;s now time to validate those initial impressions in those you&#8217;ve met. It&#8217;s time to start building trust.</p>
<p><strong>Milestones</strong></p>
<ol>
<li><strong>Provide Immediate Value</strong>: Check in code into the company&#8217;s source control your 1st week there. Preferably the code fixes a bug. Do NOT try to save the world in the code base. Pick some litter instead. If you clean the entire thing in a day, great, but get your feet wet and see what happens. A lot of drama and things you couldn&#8217;t predict happen AFTER you&#8217;ve checked in code and it goes into production. Start small and work your way up. Just ensure it&#8217;s immediate.</li>
<li><strong>Make Professional Friends</strong>: Respect those you work with and get to know them. Whether this is small talk that&#8217;s sincere orÂ genuineÂ interest, whatever works to build a positive relationship. People trust those they like. Trust is a currency you&#8217;ll sometimes have to spend in buckets to make positive headway so start investing in earning some now.</li>
<li><strong>Visible Logger</strong>: Invest in a visible logger. Even if the code doesn&#8217;t currently have problems, when it does, you want it to talk to you. Not only you, but the company. You want to corroborate this communication with your boss. When production explodes, and you know within seconds because your little secret keyboard shortcut debug window shows the error, that inspires confidence. It also provides a kind of transparency to your client when others start using it proactively to find problems. You just empowered a company to work together; well done, that&#8217;ll earn some trust. Make the code talk to you so you can trust what it&#8217;s saying, then expose this communication channel to your client.</li>
<li><strong>Provide Transparency</strong>: As you start getting your feet wet, whether this is struggling to get your environment setup so you can compile, or are deep in the bowels of fixing your first bug, let your boss know. Keep them appraised of what you&#8217;re doing on regular intervals, even if she doesn&#8217;t ask. Come across with confidence; you KNOW what you need to be working on, and you&#8217;re informing your boss as such. Additionally, she has a chance toÂ re-prioritizeÂ if you need to be working on something more pressing. No communication, and neither of these things happen. If they know and have confidence in you doing what you say you&#8217;re going to do, they can play defense and keep their boss off your, and your team&#8217;s back.</li>
</ol>
<p><strong>Successful Exit</strong></p>
<p>Do you think people trust you? Have you checked in working code that fixes a problem and your boss has verified this? Can you even compile? Do you know the names of those you&#8217;re working with/near? If yes to all, you&#8217;re ready to move on.</p>
<p><strong>NOTE</strong>: If you ever lose trust, fall back to continually adding immediate value. Trust isn&#8217;t given, it&#8217;s earned. If you lose it, the only way to get it back to is re-earn it from scratch.</p>
<h2><strong>Tier #4: Lead</strong></h2>
<p>At this point you know enough about the goals of the project to start formulating plans on moving forward, whether this is how to implement new features or how to fix/refactor existing ones. You&#8217;ve provided enough value to earn a modicum of trust. It&#8217;s time to lead people forward.</p>
<blockquote><p>A manager puts people in a line, puts the guy with the machete at the front, and leads people through the jungle effectively. A leader climbs the tree, and tells everyone they need to go left instead.</p></blockquote>
<p><strong>Milestones</strong></p>
<ol>
<li><strong>Short Term Goals</strong>: You&#8217;ve assessed the situation and identified priorities that need to be refactored (using my previous article). You need the team to agree on a common logging interface, both in code and visually. Finally, you need the team to agree on an architecture.</li>
<li><strong>Long Term Goals</strong>: You&#8217;ve identified architecture holes that need to be plugged. Sometimes there are design problems that if changed could save months of work and hardship. You need to start work and documentation on it now. Solidify the long term goal into something defendable, and get the teams input. <span><span style="color: #000000;">Be careful how you go about talking about it. While you need client feedback (remember transparency), it must be attainable to company-relevant, short term steps. You can spend trust currency for longer term refactoring/re-architectureÂ endeavors, but I recommend against it.</span></span></li>
<li><strong style="color: #000000;">Resources</strong><span style="color: #000000;">: Sometimes you need to hire additional people, whether from internal client teams, additional consultants/contractors from your firm, or hiring on behalf of your client. This could be staff augmentation or hiring a specificÂ </span>skill set<span style="color: #000000;">Â you need/want. Identify these early and ask your boss.</span></li>
<li><strong>Divide, Delegate, and Conquer</strong>: Whether the client&#8217;s employee&#8217;s or your firms, you need to divide up the massive amount of work amongst people. Offer up tasks first, and then assign to those you deem appropriate if no volunteers materialize. Building upon Tier 2 and 3, you should have a gut feeling for who&#8217;s best for what task. You cannot save the world by yourself. It may seem that you spend more time aiming people in the same direction then actually walking that direction yourself. Don&#8217;t fret; you&#8217;re on the right track.</li>
<li><strong>Be Positive</strong>: While misery loves company, peopleÂ like and follow positive people. In talking &amp; delegating all of your goals, plans, do so positively. You&#8217;re not &#8220;fixing a pile of rubbish&#8221;, you&#8217;re &#8220;building an awesome application&#8221; or &#8220;improving an important machine&#8221; or whatever you can say and actually believe when you say it. Eat right,Â exercise, and/or surround yourself with positive influences. Make this the year you <a href="http://www.menshealth.com/best-life/make-life-worth-living">commit suicide</a>, reorganize &amp; clean your working environment/home office, or just accomplish a small goal that&#8217;s not work related that you use asÂ positivityÂ fuel. Mentor &amp; encourage your team but don&#8217;t come off as a know-it-all/holier-than-thou. Play to win.</li>
</ol>
<p><strong>Successful Exit</strong></p>
<p>If you know what you/your team needs to be working on today, next month, you&#8217;ve approved the hiring you need, and the team is all tasked up, then it&#8217;s time to move on.</p>
<p><strong>Notes on Tier #5 &#8211; 8</strong></p>
<p>The latter teirs are development specific, but rely on a strong firm foundation from the first 4. Remember, the human component is your weakest link, not your Factories. Strengthen them; do not enter these 4 latter tiers of first 4 are weak.</p>
<h2><strong>Tier #5: Build</strong></h2>
<p>You need to easily build the software. This is the most common, and frequent, option you&#8217;ll do many times a day, every day. The longer this takes, the longer it takes you to develop. This can also kill your team&#8217;s momentum. If something goes wrong, such as someone checking in a bug that breaks the build into source control, or a feature needing be implemented for a presentation by some date, a slow buildÂ exacerbatesÂ time to resolution.</p>
<p>Worse, some developers will start making their own build setup, leading to code that works on some developers machines and not on others. Validation of working code suddenly becomes meaningless which can adversely affect project schedule metrics. Even worse, you can think your code works, but it doesn&#8217;t for others. Who&#8217;s right?</p>
<p><strong>Milestones</strong></p>
<ol>
<li><strong>Quick</strong>: The build needs to run quickly. This obviously anÂ arbitraryÂ metric based on code size, libraries,Â continuousÂ integration setup, etc. If developers say &#8220;the build is slow&#8221;, then it&#8217;s slow. Utilize libraries so the entire thing doesn&#8217;t have to compile, inject dependencies at runtime, utilize modules&#8230; whatever it takes.</li>
<li><strong>Easy</strong>: If the build is complicated to do, you&#8217;ll get developers making a lot of mistakes during code validation time before they check in. They&#8217;ll either check in bad code, or make their own setup that allows the code to work on only their machine. They should be able to just click 1 button, run an Ant/Maven script, or do a 1 line command line execution.</li>
<li><strong>Duplicated</strong>: The build should be able to be duplicated on a new developers machine. It&#8217;s completely fine to have company standards, such as only Windows 7 PC w/admin rights, Flex SDK 4.6, running Rake 0.8.2. It&#8217;s also ok if that takes some time with another developer to setup. What&#8217;s not ok is once they do that, it doesn&#8217;t work. If there are 3rd party dependencies that cannot effectively be deployed x-machine, find a way to remove them. Solutions include, again, using libraries, modules, development servers vs. local server setup, etc.</li>
</ol>
<p><strong>Successful Exit</strong></p>
<p>If you can run the build multiple times a day without pulling your hair out, it can be run multiple times on the same code base and not break, and anyone on the team can explain to a new developer 90% of the setup, you&#8217;re good to go. Another validation includes Developer A checking in code, then Developer B updating to latest and running the build and it works on their machine as well.</p>
<h2><strong>Tier #6: Explosions</strong></h2>
<p>When things go awry, you need to immediately know where and why. More than aÂ euphemismÂ for errors/exceptions, explosions also include errors in the application that constantly cause fire drills in the company.</p>
<p><strong>Milestones</strong></p>
<ol>
<li><strong>Exceptions Handled</strong>: Handle all errors save null pointers. If you have global exception handling capabilities, implement it/them. This doesn&#8217;t mean just wrapping something in a try/catch; it means not only logging the catch, but putting something meaningful in the catch so you&#8217;ll understand what it means when it happens.</li>
<li><strong>Logging</strong>: You need to centralize all long into a single library. It&#8217;s ok if this library is your own that builds on top of the built-in provided one, such as Flex&#8217; ILogger. As long as anyone, anywhere on the team wants to log something, they use that vs. print/trace.</li>
<li><strong>Visual Log</strong>: Optional: A visual window, built into the application itself (SWF/JS, etc), that prints out the log levels. This is done to allow logs to be seen by developers, not users. It also allows non-developers,Â especiallyÂ QA, to proactively find problems and talk directly with thoseÂ responsibleÂ vs. the 1st developer they can find. The value this provides inÂ empowermentÂ and time saved should not be underestimated.</li>
<li><strong>No More Fire Drills</strong>: Wrangling in challenging errors to help prevent fire drills can do 3 things. First, you score a lot of trust in &#8220;knowing&#8221; why something is wrong vs. 10Â peopleÂ running around aimlessly trying to figure out why. Second, you can clearly cite accountability; is it the server-side team, your team, or the database team? Instead of yelling &#8220;I think your stuff broke&#8221; you can confidently say it did with helpful data for them to test against. That kind of attitude is much easier to solve problems with. Third, fire drills no longer sabotage your productivity.</li>
</ol>
<p><strong>Successful Exit</strong></p>
<p>If an error occurs and you know where it happened, a general reason of why, and who&#8217;s potentially accountable, you&#8217;re in insanely good shape. Users don&#8217;t see these errors, just null pointers, or those you&#8217;ve built a GUI for (ie Alert error dialogue). Bonus points if fire drills happen on other teams that aren&#8217;t related to yours&#8230; but you have a way of helping through logging to make testing easier.</p>
<h2><strong>Tier #7: Diagnostics</strong></h2>
<p>Diagnostics form a range of tools, not just code. They are anything that helps provide insight into code issues or runtime errors without costing more overhead inÂ maintenanceÂ than the value they provide. The reason diagnostics is before architecture is that in larger applications,Â especiallyÂ in a consulting context, adding simple diagnostics has a ton of value with little effort whereas architecture takes a ton of effort but tends to have low perceived value (yes, it&#8217;s valuable, just harder to sell).</p>
<p><strong>Milestones</strong></p>
<ol>
<li><strong>Unit Test Coverage</strong>: Even if you&#8217;re not doing TDD, unit tests along help find &amp; prevent bugs as well as improve API&#8217;s. Unlike code reviews, they don&#8217;t get tired, benefit the entire team, and if written well only slightly add to codeÂ maintenance. Finally, they can be automated. These are also great things to work on in down times such as when JIRA is cleared, you&#8217;ve hit a brick wall with another bug, or are waiting on dependencies for a feature.</li>
<li><strong>Integration Tests</strong>: These are my favorite on service layers, more so than unit tests. The reason being is most of the Flex projects that I&#8217;ve worked on in a consulting context had some form of service layerÂ problem; ie how they talk to the back-end. Both refactoring the service code and writing unit tests that allowed me to automate the testing. It&#8217;s also nice to quickly know what part broke with confidence; client, server, or database. Automating these also makes you feel better when the server guys test new code, you can quickly help them test. There are more to integration tests, but these are the low-hanging fruit of &#8217;em.</li>
<li><strong>Automated Builds</strong>: Expanding upon Tier #5,Â streamliningÂ your build process to be more inline withÂ continuousÂ integration practices. This means designating a resource to setup, and maintain, aÂ continuosÂ build tool like CruiseControl/Hudson/TeamCity, etc. You should know who checked in bad code and when.</li>
<li><strong>Custom Diagnostics</strong>: Some applications have challenging domains of complexity. For example, video; there are TON of things that can go wrong at runtime even if the code compiles just fine. There are also a sequence of events that can cause video to fail, and knowing this sequence is paramount in debugging it, or shrugging it off since there&#8217;s nothing you can do (i.e. CDN is down). More importantly, though, sometimes you need a way to glimpse this in a more visual way than a logging window can provide. Conversely, sometimes you need to see environment variables in real-time. This little window can verify your application is running in the mode you think it is for a developer in another country. Simply making a box with a text field in it that showed Flash Player&#8217;s sandbox security type saved me 3 days (I lost 3 figuring this out, heh). Additionally, they can help empower others to do testing &amp; diagnostics on their own. Just be careful these are not a security risk for code and/or company information if deployed in production.</li>
</ol>
<p><strong>Successful Exit</strong></p>
<p>If you have good unit test coverage, can automate their running, your build is automated in some fashion (even if just client side only), and you have gui or command lines way to gain insight to your running application to find out more about errors, you&#8217;re in awesome shape.</p>
<h2><strong>Tier #8: Architecture</strong></h2>
<p>While good architecture requires a book full of information + years ofÂ experimentationÂ to get right, what we&#8217;re concerned with here is IMPROVING existing architecture. If you are starting a project from scratch and own the architecture, great, use this phase forÂ maintenance. Otherwise, we&#8217;re looking for that sweet spot of a 1 day change for a more decoupled, easier to use &amp; test in code system. If something takes longer than 3 days, you&#8217;ll be hard pressed to merge it back in and notÂ inconvenienceÂ other developers&#8230; unless it&#8217;s very little code.</p>
<p><strong>Milestones</strong></p>
<ol>
<li><strong>Tight Factories</strong>: Any part of your application which takes outside data into it&#8217;s system, such as external JSON/XML as well as user input, needs to be furtherÂ hardened. DRY the code, layer with <a href="http://jessewarden.com/archives/pix/moar-unit-tests-jxl.jpg">#moarUnitTests</a>. Form a convention on what happens when parsing/decoding fails; do you throw errors orÂ returnÂ null and log them, thus passing the burden of handling null to your system? Decide as a team.</li>
<li><strong>Fault Tolerant Services</strong>: Whether to a back-end, an external call to JavaScript in a host page, or an ad library&#8230; if it&#8217;s not your code, it&#8217;s a service. Make sure you wrap that with a Proxy that can NOT explode, and logs everything that went wrong. That extra 20 minutes pays off mad dividends.</li>
<li><strong>MVC/MVP/MVVM/YourMom/SC/PV/PM</strong>: As a team, pick one an over arching architecture pattern and stick with it for new code. I like <a href="http://martinfowler.com/eaaDev/SupervisingPresenter.html">Supervising Controller</a>, while others of my front-end Â ilk like <a href="http://martinfowler.com/eaaDev/PresentationModel.html">Presentation Model</a>. A lot of JavaScript web frameworks follow more of a <a href="http://martinfowler.com/eaaDev/PassiveScreen.html">Passive View</a>. The only right choice is team consensus &amp; comfortability. Then endeavor as a team to get certain parts moving in that direction. If there is old code, and you&#8217;re currently working on it, see if I can convert in less than a day to make more congruent with the rest of the architecture.</li>
<li><strong>DRY</strong>: If none of the above can be improved, simply making code more DRY is a good fall back task to more unit test coverage.</li>
<li><strong>TODO/FIXME/KLUDGE/HACK</strong>: Do a find all in the code. If you see those, fix them. #<a href="http://pragprog.com/the-pragmatic-programmer/extracts/software-entropy">fixBrokenWindows</a></li>
</ol>
<p><strong>Successful Exit</strong></p>
<p>You never really exit Tier #8; in fact you tend to loop back to either 7 or 6 and 7 and then back to 8. However, if you find yourself working on new features, or fixing bugs with no other drama and the rest of your team is doing the same&#8230; then you&#8217;re in epic shape.</p>
<p><strong>Conclusions</strong></p>
<p>As you can hopefully see, my priority list helps keep you focused on delivering value to those that matter quickly. Good software development is iterative. Earning trust is also iterative; you don&#8217;t take people&#8217;s money and disappear for 6 months (that&#8217;s called good Capitalism via Waterfall). This whole list, while referring to software development, is all about relationships with people. Excluding code review, your challenge as a leader is delegating the tasks in each tier to divide &amp; conquer, mitigating conflicts, and solving hard software problems in addition the rest of yourÂ responsibilities.</p>
<p>Each tier builds upon the former all the way down the line. While deep in the bowels of fixing explosions in Tier #6, I&#8217;m still continuing to build meaningful relationships in Tier #3.</p>
<p>Remember:</p>
<ol>
<li><strong>Report</strong>: Know your true boss and what will make her happy.</li>
<li><strong>Understanding</strong>: Listen, learn about the company, the people, and dive into reading the code.</li>
<li><strong>Trust</strong>: Earn trust by providing immediate value.</li>
<li><strong>Lead</strong>: Take the initiative and move the team forward. Delegate, divide, conquer.</li>
<li><strong>Build</strong>: Make the build fast, easy, and capable of being duplicated if need be.</li>
<li><strong>Explosions</strong>:Â When things go awry, you need to immediately know where and why. Prevent fire drills.</li>
<li><strong>Diagnostics</strong>: Get good unit test coverage, integration tests, automate your builds, and build any customÂ diagnosticÂ tools needed.</li>
<li><strong>Architecture</strong>: Decide on a direction/framework, and continue to nurture the code, and developers, in that direction. Loop back to 6 &amp; 7 if need be.</li>
</ol>
<h6><a href="http://www.flickr.com/photos/55935853@N00/2401448261/">Title photo by Ewan Monro</a>Â is under aÂ <a href="http://creativecommons.org/licenses/by-sa/2.0/">Creative Commons &#8211; ShareAlike Attribution license</a>.</h6>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Consulting Chronicles #6: Refactoring</title>
		<link>https://jessewarden.com/2012/04/consulting-chronicles-6-refactoring.html</link>
					<comments>https://jessewarden.com/2012/04/consulting-chronicles-6-refactoring.html#comments</comments>
		
		<dc:creator><![CDATA[JesterXL]]></dc:creator>
		<pubDate>Tue, 03 Apr 2012 14:50:09 +0000</pubDate>
				<category><![CDATA[Consulting Chronicles]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[chronicles]]></category>
		<category><![CDATA[consulting]]></category>
		<category><![CDATA[consultingchronicles]]></category>
		<category><![CDATA[refactoring]]></category>
		<guid isPermaLink="false">http://jessewarden.com/?p=3080</guid>

					<description><![CDATA[Introduction Refactoring is the discipline of applying a multitude of small, low-risk techniques to a code base in order fix and improve it. While corroborated by the software community, employing such techniques in a consulting context can be challenging because people are involved, often in a negative situation. You need 2 weapons to win the [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" style="padding-right: 8px;" src="http://jessewarden.com/archives/blogentryimages/refactoring-4.3.2012.jpg" alt="Refactoring" width="320" height="240" align="left" /><strong>Introduction</strong></p>
<p>Refactoring is the discipline of applying a multitude of small, low-risk techniques to a code base in order fix and improve it. While corroborated by the software community, employing such techniques in a consulting context can be challenging because people are involved, often in a negative situation.</p>
<p>You need 2 weapons to win the refactoring battle. First, you need to understand what refactoring techniques are at your disposal and how to implement them. Below, I&#8217;ve listed the core ones I see needed time and time again. Second, you need to have a plan on how you engage the client company and their employees to allow you to do the first. That&#8217;s covered in the next article.</p>
<p><span id="more-3080"></span>I&#8217;ve talked about how you do various parts of these initiatives in previous articles. What I want to talk about today is 1 of the 2 things: The core things you need to be concerned about in refactoring. In the next article we&#8217;ll talk about aÂ prioritizedÂ plan you should follow when engaging a client where refactoring is needed. These are aimed at being used in the worst situations, but can provide positive benefits inÂ benignÂ or benevolent situations as well.</p>
<p>You should be able to take this blog post and the next, and from them both progressively improve a poor quality code base as well as engage a challenging client amongst challenging circumstances.</p>
<p><strong>Note On Languages</strong></p>
<p>I&#8217;ve intermingled JavaScript, ActionScript, and Lua to help provide a variety of examples, show this list is technology agnostic, and provide corroboration of techniques across technologies. That and I miss coding Lua since I&#8217;ve been so busy and needed an excuse. This does have a strong focus with front-end languages, namely those which run in a browser.</p>
<p><strong>Nomenclature</strong></p>
<p><strong>Factory/Decoder/Parsing</strong>: Taking any kind of data, such as JSON or XML, and converting Â into something you need it for. This could be as simple as accessing properties on it to converting it to a completely different type of object, or even creating new objects from it.</p>
<p><strong>Coding Conventions</strong></p>
<ul>
<li><strong>Factory Errors vs. Null</strong>: Below, I&#8217;m using both error and null. Error means if a Factory/function/decoder fails in anyway to understand its data, you throw an error. This helps in unit testing, and expose errors early in the weakest part of a front end application; those that utilize non-strongly typed data. Optionally, when you find a parsing error, you return null instead. Consumers of the Factory must test for null, but youÂ mitigateÂ runtime exceptions and expose faulty consumers. I like using both, but it&#8217;s a lot of work to be sure.</li>
<li><strong>Don&#8217;t Create Grenades</strong>: Regardless of language,Â <a href="http://jessewarden.com/2009/06/error-handling-in-actionscript-3-dont-make-grenades-or-how-to-not-crash-safari.html">you shouldn&#8217;t create grenades</a>. This means don&#8217;t use throw/error. Instead, dispatch a custom error event that is opt-in. Consumers shouldn&#8217;t have to worry about the code they&#8217;re using bubbling up problems to their area of worry unless they&#8217;ve opted into those concerns. ActionScript, JavaScript, and Lua also don&#8217;t have a strongly typed ways to verify with the compiler that these contracts have been met, unlike Java&#8217;s throwable. Thus, don&#8217;t throw, inform to those who wish to know. Log regardless.</li>
<li><strong>Factory vs. VO Self Parsing</strong>: Some like Factory&#8217;s to parse external data (JSON/XML, etc.) into ValueObjects for an increased likehood of DRY code (shared parsing code that&#8217;s easier to unit test). Others like ValueObjects to serialize/deserialize themselves to reduce coding overhead as well as make the API easier to use. I&#8217;ve used both below, but I&#8217;ve found this is usually a team decision and also depends on how complex your VO&#8217;s are.</li>
<li><strong>Model vs. Command vs. Remote Proxy</strong>: From architecture perspective, some people prefer to have a Model handle Application Data, and a Command/Controller/Presenter handle remote Service calls to update that data. Some prefer wrapping both inside of a Remote Proxy (basically a Model that has serivce(s) inside it), and allowing Controllers/Mediators/Presenters/ViewControllers to make calls on those Remote Proxies. I use both Model &amp; Commands below, but no Remote Proxies. It&#8217;s up to you and your team which you think is best. If you&#8217;ve gotten this far in the discussion, you&#8217;re clearly better off than most. The point here is solve for Model and/or Application logic encapsulation.</li>
<li><strong>try/catch</strong>: I use try/catch liberally. Developers concerned about performance, such as game developers or those using complicated parsing algorithms should take note the significant performance cost of try/catch as well as liberal use ofÂ <a href="http://martinfowler.com/refactoring/catalog/extractMethod.html">ExtractMethod</a>. ThisÂ articleÂ assumes the code is in bad shape and you/your team needs to refactor it over many months to ensure your team can preventÂ fire drills, meet milestones, and start to build a firm foundation. If the code base has the following problems outlined in this article, your first order of business should be fixing them first before you start optimizing. If you really need performance, just use unit tests instead and pray.</li>
<li><strong>Singletons</strong>: While not a replacement for global variables, and generally frowned upon, well written ones are a good first step if they have access control and utilize strong-typing. (ex Model).</li>
</ul>
<p><strong>Refactoring Basics</strong></p>
<p>Improving existing code can be done in 3 ways: handling exceptions, using a good architecture, using strong-typing if available, and following refactoring paths. The reason you use refactoring,Â especiallyÂ in a consulting/contracting context with existing code bases is that you&#8217;re not allowed to rewrite them from scratch. Thus an unwritten bequeathment ofÂ responsibilityÂ occurs between the code base and you: it now becomes your problem. Its failings become your failings. The insecurity it gives your client now has them project that insecurity, andÂ responsibilityÂ to remedy it, onto you.</p>
<p>I&#8217;m assuming you&#8217;ve already done a code review by this point to ensure you, or your firm, want to even getÂ involved. If you don&#8217;t but are still here, it&#8217;s probably because they&#8217;re paying you a lot of money to wallow in their mess. In that case, welcome to the suck.</p>
<p>The original <a href="http://martinfowler.com/refactoring/">definition of refactoring</a>, referring to Martin Fowlers here, is making a small, positive change that has low inherent risk. This is done to ensure you don&#8217;t break anything. The theory is, over time if you make enough positive changes, you&#8217;ll make the whole code base positive.</p>
<p>Life is more complex than that, but the point here is that you use refactoring to affect positive change without breaking the code and looking like an idiot in front of your client and ticking off their customers. You <strong>do not</strong> make large, sweeping changes to the code base, even if they are needed. Take it slow and steady, 1 little change at a time. Some of the examples below are small (such as using strong-typing in place of Object and *), and some are larger (such as modifying your Model layer) are larger. Sometimes such changes you need help in tackling because it&#8217;s sphaghetti code; team refactoring can be invigorating and you get a lot more done, so don&#8217;t think you have to do this on your own.</p>
<p>When in doubt, make a small, positive change. If you take more than 3 days to make a change, abort.</p>
<p><strong>Exceptions</strong></p>
<p>Your first priority in refactoring should be handling exceptions or errors. It&#8217;s ok if you see how sausage is made in the meat factory, but it&#8217;s <a href="http://www.msnbc.msn.com/id/46926159/ns/business-us_business/#.T3pMl6sS3vI">not ok</a> if your client does. You can turn explosive bedlam into a controlledÂ spectacle. That&#8217;s right, things breaking can be made into looking like your in total control. Magic isn&#8217;t magic; it&#8217;s sleight of hand through distraction.</p>
<blockquote><p>&#8220;Look at this pretty logging window created by our company to handle such situations. All errors are now known to us, when and where they happen. This awesome ability to report said errors amongst your staff, not just QA, but you, your customers&#8230; everyone, even while in production! No surprises or fire drills here&#8230; ALL at no extra charge.&#8221;</p></blockquote>
<p>But how do we get there? Let&#8217;s start at bottom.</p>
<p>A lot of programming languages execute functions or methods in 2 modes: protected or omg-it-might-blow-up-we&#8217;re-hardcore mode. JavaScript/CoffeeScript, ActionScript, and Java for example use try/catch. Ruby uses begin &amp; rescue. Python uses try/except. Lua uses pcall. Most languages have various ways to ensure that if code explodes, it&#8217;s done so in a controlled fashion. Additionally, some have global exception handling as well.</p>
<p>Exceptions are the first area of uncontrolled chaos that must be contained. No controlled refactoring can take place without tackling these areas first.</p>
<p><strong>Architecture</strong></p>
<p>Architecture comes into play for large code bases, although, using it for small code bases can help you learn (albeit hard to appreciate as it&#8217;ll often get in your way of getting r done).</p>
<p>Architecture refers to how an application is built. It&#8217;s usually anÂ amalgamationÂ of design patterns used in a common way. For the sake of this article, we&#8217;re using architecture in a small sense of the word in helping move parts of the code to be more encapsulated, make things that break easier to identify, test in isolation, that sort of thing. While references to MVC/MVP/MVVM can get really esoteric and subjective, we&#8217;re not concerned with that.</p>
<p>What you need to verify with defining &#8220;good architecture&#8221; for you and your team is how it works, agree on approach, and ensure it helps you test things in isolation. If y&#8217;all agree, can be independently productive, and if something breaks you know where&#8230; that&#8217;s good architecture. Don&#8217;t get hung up on the definitions, get hung up on the contract on how things talk to each other, and that your team all agrees on that contract. This&#8217;ll come into play later in the next article regarding team synergy.</p>
<p><strong>Strong Typing</strong></p>
<p>Not much to say here. Don&#8217;t use Object/*/Dictionary. If you do, wrap it with a strongly typed API or unit tests. Putting the burden on the consumer of those objects leads to lots of code. Lots of code == bad.</p>
<p>Don&#8217;t do this:</p>
<pre lang="actionscript">var person:Object = {};
person.firstName = "Jesse";
person.lastName = "Warden";</pre>
<p>Do this:</p>
<pre lang="actionscript">class PersonVO
{
   public var firstName:String;
   public var lastName:String;
}

var person:PersonVO = new PersonVO();
person.firstName = "Jesse";
person.lastName = "Warden";</pre>
<p>When you don&#8217;t have strong-typing (JavaScript/CoffeeScript/Lua), <a href="http://jessewarden.com/archives/pix/moar-unit-tests-jxl.jpg">#moarUnitTests</a>. For JavaScript use <a href="http://jshint.com">jshint</a>,Â <a href="http://jslint.com">jslint</a>, and annotations that various frameworks use to infer type like Google&#8217;s Closure compilerÂ for great justice.</p>
<p><strong>Refactoring Paths</strong></p>
<p>Beyond the suggestions below + mentioned resources, you have to use your own intuition. Refactorings on their own are good but when done as a team effort in strategic areas, you can make greater headway, earn more trust from your client, and do more &#8220;relevant&#8221; refactoring.</p>
<p>There are some things you&#8217;ll know are right such as investing in a good GUI logger, making friends with IT, etc. Others, on what to fix first, how to support dual architectures in some areas, and how to portray transparency to your client&#8230; some of those are just experience. When in doubt, go with your gut. The less code of the choices, the better.</p>
<p>A good refactoring path allows you the ability to code right now, satisfy non-programmers for trust earning, with assurance you havenâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />t coded yourself into a corner. It&#8217;s like a good marriage:Â compromise.</p>
<p>You&#8217;ll lose some battles. The goal is to win the war.</p>
<p>You&#8217;ll have detractors such asÂ who don&#8217;t have their Code License; knowing the rules before breaking them&#8230; or some who are just afraid. Some are ivory tower zealots who aren&#8217;t punished for getting nothing done (some are rewarded). Some have emotional scars from attempting to fix things, and are hesitant to do what&#8217;s right. This is usually when they know the value but cannot effectively articulate it to stakeholders (this is called a &#8220;software developer&#8221;). Some are just insecure and don&#8217;t believe in their own refactoring ability and thus hold you back as well (<a href="http://en.wikipedia.org/wiki/DISC_assessment">low D on DISC</a>). Some think you&#8217;re full of it.</p>
<p>Refactoring is temporal. You are creating a positive change to last for awhile&#8230; but not forever. It&#8217;s ok to refactor something, then refactor it again later as long as you&#8217;re actually making an improvement upon a problem. If a ship is taking on water, the first thing you do is plug the holes with wooden spikes. Later, when the French stop firing at you and your hangover is gone from drinking all the wine you found on their now apprehended ship, you can plug the holes proper with a leather &amp; tar mixture. Then once in dry dock, replace the planks.</p>
<p>Architecture is not temporal&#8230; but can be as well. You&#8217;re supposed to establish rules and guidelines on how you approach a code base. Sometimes, however, you can jury-rig a solution to hit some deadline, or get a build out the door for some managerial milestone. Later, you can re-assess. Sometimes, you&#8217;re initial hack is controlled; meaning you are writing throwaway code on purpose. In doing so, you can make it easier to fix later.</p>
<p>Architecture is generally decided upon by the team, and you move forward for the length of the project on it.</p>
<p>Refactoring is a strategy that can change daily.</p>
<p><strong>Step #1: Exceptions</strong></p>
<p><strong>Case</strong>: Service layer has 3 failure points: entry, error, and exit parsing.<br />
<strong>Solution</strong>: Validate post data, log error, wrap parsing/factory/decoding.<br />
<strong>Language</strong>: JavaScript using <a href="http://amplifyjs.com">AmplifyJS</a></p>
<p><strong>Bad Code</strong>:</p>
<pre lang="javascript">amplify.request.decoders.appEnvelope =
    function ( data, status, xhr, success, error )
    {
        if ( data.status === "success" )
        {
            success( data.data );
        } else if ( data.status === "fail" || data.status === "error" )
        {
            error( data.message, data.status );
        } else {
            error( data.message , "fatal" );
        }
    };

amplify.request.define( "decoderExample", "ajax", {
    url: "http://server.com/service/doSomething/",
    type: "POST",
    decoder: "appEnvelope"
});

amplify.request({
    resourceId: "decoderExample",
    success: function( data )
    {
        data.foo; // bar
    },
    error: function( message, level )
    {
        alert( "always handle errors with alerts." );
    }
});</pre>
<p><strong>Refactored Code</strong>:</p>
<pre lang="javascript">/*
Our decoder function is now:
1. shielded from bad data
2. assumes the response not well formed from the get go
3. logs each parsing error separately for easier diagnosis
*/

// modified appEnvelope decoder function
function ( data, status, xhr, success, error )
{
    try
    {
        if(data == null || data == "")
        {
            error("Decoding error in parsing data.");
        }
        else if(data.status == null || data.status != "")
        {
            error("Unknown status.");
        }
        else if(data.message == null || data.message != "")
        {
            error("Uknown message.");
        }
        else if ( data.status === "success" )
        {
            success( data.data );
        }
        else if ( data.status === "fail" || data.status === "error" )
        {
            error( data.message, data.status );
        }
        else
        {
            error( data.message , "fatal" );
        }
    }
    catch(e)
    {
       error("Decoding error.");
    }
};

/*
Notice we:
1. Validate our requestData (you could do more than a null check) before making an actual service call.
2. Additionally, we log the failed request with the Service name and reason for easier diagnosis in a larger application.
*/

if(requestData != null)
{
    amplify.request({
        resourceId: "decoderExample",,
        data: requestData,
        success: function( data )
        {
            data.foo; // bar
        },
        /*
        Our request error handling now has:
        1. a log, vs. an alert, for logging our error
        2. a common logging signature for easier diagnosis in a larger application
        */
        error: function( message, level )
        {
            console.error("MyService::error, message: " + message + ", level: " + level);
        }
    });
}
else
{
    console.error("MyService::error, requestData is null.");
}</pre>
<p><strong>Case</strong>: Null values in GUI. View/GUI must assume data is not always good; must handle null without exploding.<br />
<strong>Solution</strong>: Check for null using if/then.<br />
<strong>Language</strong>: ActionScript 3</p>
<p><strong>Bad Code</strong>:</p>
<pre lang="actionscript">myTextField.text = person.name;</pre>
<p><strong>Refactored Code</strong>:</p>
<pre lang="actionscript">/*
We now:
1. check for a null VO first
2. if it is in fact null, we have a visual, conventional way of displaying null values w/o exploding.
3. if a property of the VO is null, that'll display as normal (in this case as an empty String)
*/

if(person)
{
   myTextField.text = person.name;
}
else
{
   myTextField.text = "???";
}</pre>
<p><strong>Case</strong>: Global Exception Handling<br />
<strong>Solution</strong>: Add global handler that logs errors away from users to see.<br />
<strong>Language</strong>: ActionScript and JavaScript</p>
<p><strong>Refactored ActionScript Code</strong>:</p>
<pre lang="actionscript">package
{
   import flash.display.Sprite;
   import flash.events.Event;
   import flash.events.UncaughtErrorEvent;

   public class ErrorHandling extends Sprite
   {
      public function ErrorHandling()
      {
         super();
         addEventListener(Event.ADDED_TO_STAGE, onAdded);
      }

      private function onAdded(event:Event):void
      {
         loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, onUncaughtError);
      }

      private function onUncaughtError(event:UncaughtErrorEvent):void
      {
         trace("Uncaught Error: " + event);
         try
         {
            // note, fails in Asyncronous errors
            throw new Error("stack trace creator");
         }
         catch(error:Error)
         {
            trace(error.getStackTrace());
         }
      }
   }
}</pre>
<p><strong>Refactored JavaScript Code</strong>:</p>
<pre lang="javascript">// via http://stackoverflow.com/questions/951791/javascript-global-error-handling
//
// more techniques here for Opera/Safari older versions
// http://stackoverflow.com/questions/645840/mimic-window-onerror-in-opera-using-javascript
//
// also note various browsers pass different arguments, and some suggest
// handling existing handlers if they exist
// https://developer.mozilla.org/en/DOM/window.onerror
//
// also note that the error in some browsers will still occur unless you handle it
// a certain way; here we're returning true from the error handler to do so.

window.onerror = function()
{
    if(arguments &amp;&amp; arguments.length &amp;&amp; arguments.length &gt; 0)
    {
        var logStr = "";
        var len = arguments.length;
        for(var index = 0; index &lt; len; index++)
        {
            logStr += "\t" + arguments[index] + "\n";
        }
        console.error("Global Error:\n" + logStr);
    }
    else
    {
        console.log("Global Error");
    }
    return true;
};</pre>
<p><strong>Step #2: Architecture</strong></p>
<p><strong>Case</strong>: Encapsulation of statefull, Model data.<br />
<strong>Solution</strong>: Encapsulate Setting of Model Data to single place (DRY)<br />
<strong>Language</strong>: Lua in Corona SDK</p>
<p><strong>Bad Code</strong>:</p>
<pre lang="lua">_G.score = 0

local scoreText = display.newText()
function updateScoreText()
   scoreText.text = _G.score
end
updateScoreText()

local powerUp = display.newImage("powerup.png")
powerUp.name = "powerUp"

local enemy = display.newImage("enemy.png")
enemy.name = "enemy"
function enemy:collision(event)
   if event.phase == "began" then
      if event.target.name == "bullet" then
         _G.score = _G.score + 1
      end
   end
end
enemy:addEventListener("collision", enemy)

local ship = display.newImage("ship.png")
function ship:collision(event)
   if event.phase == "began" then
      if event.target.name == "powerUp" then
         _G.score = _G.score + 1
         updateScoreText()
         return true
      end
   end
end
ship:addEventListener("collision", ship)

function onTouch(event)
   if event.phase == "began" then
      local bullet = display.newImage("bullet.png")
      bullet.name = "bullet"
      return true
   end
end

Runtime:addEventListener("touch", onTouch)</pre>
<p><strong>Refactored Code Round 1</strong>:</p>
<pre lang="lua">--[[
Notice we've added an addScore method to:
1. have a central place everyone can update the model data
2. make it easier to identify WHO is calling this add function
3. ensure we never forget to update our Text Field with the latest value like in the original code
]]--

function addScore(amount)
   _G.score = _G.score + amount
   updateScoreText()
end

-- Fixing our enemy collision handler to now call our encapsulated method
function enemy:collision(event)
   if event.phase == "began" then
      if event.target.name == "bullet" then
         addScore(1)
      end
   end
end</pre>
<p><strong>Refactored Code Round 2</strong>:</p>
<pre lang="lua">--[[
Now we use a more generalized Observer pattern, and dispatch an event
when the value changes. The system is free to listen to this event
and react however it needs to. This allows the GUI to change w/o worrying
updating the model changing behavior to compensate for a changing GUI API.
]]--

function addScore(amount)
   _G.score = _G.score + amount
   Runtime:dispatchEvent({name="onScoreChanged", newScore=_G.score})
end

-- we now can update more GUI parts as they become needed
function onScoreUpdated(event)
   updateScoreText(event.newScore)
end
Runtime:addEventListener("onScoreChanged", onScoreUpdated)

-- notice this includes encapsulated GUI controls as well;
-- they can just listen in on the Event Bus.
-- Here, we have a Level Progress bar that listens to the score change
-- to visually indicate how far along the user is until they level up.
require "com.company.project.controls.ProgressBar"

LevelUpProgressBar = {}

function LevelUpProgressBar:new()

   local bar = ProgressBar:new({width = 100, height = 60})
   bar.levelMax = 1

   function bar:onScoreChanged(event)
      self:setProgress(event.newScore, self.levelMax)
   end

   function bar:onLevelMaxChanged(event)
      self.levelMax = event.newLevelMax
   end

   Runtime:addEventListener("onLevelMaxChanged", bar)
   Runtime:addEventListener("onScoreChanged", bar)

end

return LevelUpProgressBar</pre>
<p><strong>Case</strong>: Access Control for Statefull Model Data Using Application Logic (English: you need to update some model data, and multiple parts in your application need to do this). aka, removing global variables.<br />
<strong>Solution</strong>: Utilize Proxy Pattern or Command Pattern for single access (DRY), this ensures there is only 1 way to update your model data, inputs are validated. This makes it easier to debug who is calling/invoking it, and what data they are passing, as well as ensuring those who need to know about the change are informed.<br />
<strong>Language</strong>: ActionScript</p>
<p><strong>Bad Code</strong>:</p>
<pre lang="actionscript">var firstName:String             = firstNameTextInput.text;
var lastName:String              = lastNameTextInput.text;
var birthdate:Date               = birthdateControl.value;
var myPersonVO:PersonVO          = new PersonVO(firstName, lastName, birthdate);
MyStaticModel.person             = myPersonVO;
MyStaticModel.person.lastName    = "McTaggart"</pre>
<p><strong>Refactored Code</strong>:</p>
<pre lang="actionscript">// First we create a factory class to test our creation &amp; validation in isolation.
// This is also easier to write unit tests for. It's also DRY in that all classes
// who need to create PersonVO's and validate them are using the same code to do so.

class PersonFactory
{
   public static function getPerson(firstName:String, lastName:String, birthdate:Date):PersonVO
   {
      if(firstName == null || firstName == "")
      {
         throw new Error("firstName cannot be null nor an empty String.");
         return;
      }

      if(lastName == null || lastName == "")
      {
         throw new Error("lastName cannot be null nor an empty String.");
         return;
      }

      if(birthdate == null)
      {
         throw new Date("birthdate cannot be null.");
      }

      return new PersonVO(firstName, lastName, birthdate);
   }

   public static const validateLastName(lastName:String):Boolean
   {
      if(lastName != null &amp;&amp; lastName != "")
      {
         return true;
      }
      else
      {
         return false;
      }
   }
}

// Second step, create a change event that those who need to know about a changing
// personVO in the model can be made aware of.

class PersonModelEvent extends Event
{

   public static const PERSON_CHANGED:String = "personChanged";

   public function PersonModelEvent(type:String)
   {
      super(type, false, true);
   }

}

/*
Third, create a Model class Singleton that:
- dispatches change events when it's internal person variable is changed, or modified
through accessor controls
- validates creation &amp; changes
NOTE: If classes need to operate on PersonVO itself, create additional methods to
operate on the internal PersonVO to ensure proper change events are dispatched.
NOTE: For those who wish to remove Singletons, create as an instance, and inject the dependencies,
whether via a DI framework such as SwiftSuspenders/Guice/Spring, or manually via
getter/setters for those classes who need instance access.
*/

class PersonModel extends EventDispatcher
{

   private var _person:PersonVO;

   public function get person():PersonVO { return _person; }
   public function set person(value:PersonVO):void
   {
      _person = value;
      dispatchEvent(new PersonModelEvent(PersonModelEvent.PERSON_CHANGED));
   }

   public function PersonModel()
   {
   }

   public function setNewPerson(firstName:String, lastName:String, birthdate:Date):void
   {
      // first, validate data is good, don't want to pollute our model
      var personVO:PersonVO;
      try
      {
         personVO = PersonFactory.getPerson(firstName, lastName, birthdate);
         person = personVO;
      }
      catch(error:Error)
      {
         trace("PersonModel::setNewPerson error: " + error);
      }
   }

   public function updateLastName(lastName:String):void
   {
      if(person)
      {
         if(PersonFactory.validateLastName(lastName) == true)
         {
            person.lastName = lastName;
            dispatchEvent(new PersonModelEvent(PersonModelEvent.PERSON_CHANGED));
         }
         else
         {
            trace("PersonModel::updateLastName, failed because the lastName '" + lastName + "' is invalid.");
         }
      }
      else
      {
         trace("PersonModel::updateLastName, failed because the current person is null.");
      }
   }

   private static var _inst:PersonModel;

   public static function get instance():PersonModel
   {
      if(_inst == null)
         _inst = new PersonModel();

      return _inst;
   }
}</pre>
<p><strong>Refactored Code 2</strong>:</p>
<pre lang="actionscript">/*
In the case of need of many needing to affect the Model, and there is no
desire to all Models/Proxies to have public methods accessible by others,
you can use the Command pattern. Additionally, this solves the use case
where multiple Models are needed to be accessed and/or modified. Finally,
we also handle asynchronous use cases where you need to update a Model(s)
based on a server response. Notice how each step is validated, and a log is
produced if any step fails. You need to know WHERE it failed and WHY.
Also, no rollback support in the following.
*/

class CreatePersonEvent extends Event
{
   public static const CREATE_PERSON:String = "createPerson";

   public var firstName:String;
   public var lastName:String;
   public var birthdate:Date;
   public var personModel:PersonModel;
   public var organizationModel:OrganizationModel;

   public function CreatePersonEvent()
   {
      super(CREATE_PERSON);
   }
}

class CreatePersonCommand extends AsynCommand
{

   // injected dependencies; you could use a DI framework,
   // wrap Command class creation with these, or simply pass
   // in through the Event payload like the below shows.
   private var personModel:PersonModel;
   private var organizationModel:PersonModel;
   private var createPersonService:RESTFullCreatePersonService;
   private var personVOToCreate:PersonVO;

   // Create a PersonVO, set on the PersonModel,
   // and ensure the OrganizationModel is updated with the
   // new person once the server has verified it's creation.
   public function execute(event:CreatePersonEvent):void
   {
      try
      {
         personModel = event.personModel;
         organizationModel = event.organizationModel;
         personVOToCreate = PersonFactory.getPerson(firstName, lastName, birthdate);
         if(personVOToCreate != null)
         {
            createPerson()
         }
         else
         {
            throw new Error("ERROR: CreatePersonCommand::exeucte, PersonFactory returned null.");
         }
      }
      catch(error:Error)
      {
         trace("ERROR: CreatePersonCommand::execute, error: " + error);
         finish();
      }
   }

   private function createPerson():void
   {
      createPersonService = new RESTFullCreatePersonService();
      createPersonService.addEventListener("success", onCreatePersonSuccess);
      createPersonService.addEventListener("error", onCreatePersonError);
      createPersonService.createPerson(personVOToCreate);
   }

   private function onCreatePersonError(event:Event):void
   {
      trace("ERROR: CreatePersonCommand::onCreatePersonError, event: " + event);
      finish();
   }

   private function onCreatePersonSuccess(event:Event):void
   {
      // server has successfully created PersonVO, let's update ours with what
      // the server sent back to ensure we now have a proper PersonVO.ID set
      // by the server
      if(createPersonService.savedPersonVO != null)
      {
         personModel.person = createPersonService.savedPersonVO;
         organizationModel.addNewPerson(personModel.person);
      }
      else
      {
         trace("ERROR: CreatePersonCommand::onCreatePersonSuccess failed, server sent back a null savedPersonVO.");
      }
      finish();
   }

}</pre>
<p><strong>Step #3: Strong Typing</strong></p>
<p><strong>Case</strong>: Using loose typing/variants/Objects/*, resulting in loss of compiler time checking and thus errors that only appear at runtime.<br />
<strong>Solution</strong>: Use strong-typing.<br />
<strong>Language</strong>: ActionScript</p>
<p><strong>Bad Code</strong>:</p>
<pre lang="actionscript">/*
Notice:
- personVO.lstName is a mispelling, but no error will be raised by the compiler.
- no error will be raised by the updatePerson function as Object is dynamic,
and lastName will be created and set on the personVO Object.
- no error will be raised if you pass something other than a personVO to updatePerson
except for runtime errors
*/

var personVO:Object = {};
personVO.firstName = "Jesse";
personVO.lstName = "Warden";

function updatePerson(person:*, newNameFromStringBlock:String):void
{
   var nameArray:Array = newNameFromStringBlock.split(" ");
   person.firstName = nameArray[0];
   person.lastName = nameArray[1];
}</pre>
<p><strong>Refactored Code</strong>:</p>
<pre lang="actionscript">/*
Notice:
- our "lstName" will be caught by the compiler
- our updatePerson function ensures only a PersonVO is accepted to be operated on. If not,
our compiler will let us know.
*/

class PersonVO
{
   public var firstName:String;
   public var lastName:String;
}

var personVO:PersonVO = new PersonVO();
personVO.firstName = "Jesse";
personVO.lstName = "Warden";

function updatePerson(person:PersonVO, newNameFromStringBlock:String):void
{
   var nameArray:Array = newNameFromStringBlock.split(" ");
   person.firstName = nameArray[0];
   person.lastName = nameArray[1];
}</pre>
<p><strong>Case</strong>: Service layer has no input validation, is hard to test, and has no error reporting. Burden is on class user to wrap in try/catch as well as parse server response including knowing business logic. Finally, asynchronous loader is not a class member variable, thus potential memory leak + harder to debug.<br />
<strong>Solution</strong>: Create a Service class that is easy to use, validates inputs, and logs errors. Encapsulates business logic.<br />
<strong>Langauge</strong>: ActionScript</p>
<p><strong>Bad Code</strong>:</p>
<pre lang="actionscript">class CreatePersonService extends EventDispatcher
{

   public var loader:URLLoader;

   public function CreatePersonService()
   {
      super();
   }

   public function createPerson(person:PersonVO):void
   {
      var loader = new URLLoader();
      loader.addEventListener(Event.COMPLETE, onComplete);
      var req:URLRequest = new URLRequest("http://someserver.com/restful/api/");
      req.data = person.toJSON();
      loader.load(req);
   }

   private function onComplete(event:Event):void
   {
      dispatchEvent(new Event("success"));
   }
}

var service:CreatePersonService = new CreatePersonService();
service.addEventListener("success", onSuccess);

function onSuccess(event:Event):void
{
   var json:Object = JSON.decode(service.loader.data);
   var person:PersonVO = new PersonVO(json.firstName, json.lastName, json.birthdate);
}</pre>
<p><strong>Refactored Code</strong>:</p>
<pre lang="actionscript">/*
Note:
- createPerson validates you gave it a valid PersonVO.
- all errors within class are opt-in, no throw's. User has to register event listener to hear; #dontCreateGrenades
- class assumes single-concurrency if possible, kills previous load call before proceeding
- listens for all errors, and responds with 1 error with more detail logged if needed; simplifies API
- wraps actual call to verify SecurityError isn't thrown and if it is, it's logged w/ opt-in error
- uses united tested Factory for DRY parsing and assumes
- assumes Factory can fail, and reports it as such
- result in the form of a strongly-typed ValueObject in a read-only property to ensure proper API usage
*/
class CreatePersonService extends EventDispatcher
{

   private var _savedPersonVO:PersonVO;
   private var loader:URLLoader;

   public function get savedPersonVO():PersonVO { return _savedPerson; }

   public function CreatePersonService()
   {
      super();
   }

   public function createPerson(person:PersonVO):void
   {
      _savedPersonVO = null;

      if(person == null)
      {
         onError("You cannot pass in a null person to create.");
         return;
      }

      if(loader == null)
      {
         loader = new URLLoader();
         loader.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
         loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
         loader.addEventListener(Event.COMPLETE, onComplete);
      }
      else
      {
         try
         {
            loader.close();
         }
         catch(error:Error)
         {
            // only exception that is ok to swallow
         }
      }

      try
      {
         var req:URLRequest = new URLRequest("http://someserver.com/restful/api/");
         req.data = person.toJSON();
         loader.load(req);
      }
      catch(error:Error)
      {
         onError("CreatePersonService::createPerson, error: " + error);
      }
   }

   private function onIOError(event:IOErrorEvent):void
   {
      onError(event.text);
   }

   private function onSecurityError(event:SecurityErrorEvent):void
   {
      onError(event.text);
   }

   private function onComplete(event:Event):void
   {
      try
      {
         _savedPersonVO = PersonFactory.parsePersonFromJSON(loader.data);
         if(_savedPersonVO != null)
         {
            dispatchEvent(new Event("success"));
         }
         else
         {
            onError("CreatePersonService::onComplete, factory returned a null PersonVO.");
         }
      }
      catch(error:Error)
      {
         onError("CreatePersonService::onComplete, parsing error: " + error);
      }
   }

   private function onError(errorString:String):void
   {
      trace("ERROR: CreatePersonService::onError: " + errorString);
      dispatchEvent(new Event("error"));
   }
}</pre>
<p><strong>Step #4: Fine Tuning</strong></p>
<p>If you made it this far, and have managed to continue to maintain the above, congratulations! This stuff is icing on the cake. You can continue onto <a href="http://martinfowler.com/refactoring/catalog/index.html">smaller scope refactorings</a>, as well as continuing to increase your unit test coverage.</p>
<p><strong>Final Tips</strong></p>
<ol>
<li>When casting, ensure result is not null before using. If null, log the casting failure.</li>
<li>For Flash Player, set ExternalInterface.marshallExceptions = true if using ExternalInterface</li>
<li>Log all errors</li>
<li>Code Review. Often. Weekly. Whatever, pick a schedule.</li>
<li>Object / * / Dictionary == if you can&#8217;t avoid, wrap with unit tests</li>
<li>Remember: small, low-risk changes.</li>
<li>TODO was invented for a reason.</li>
<li>If you haven&#8217;tÂ committed to source controlÂ for 3 full days of working, abort and just check into a branch for later revisiting/reference.</li>
</ol>
<p><strong>Conclusions</strong></p>
<p>Remember, the most important refactoring you can possibly do is reading the code base for 1 hour a day, no more. Just 1 person. This is has more positive impact than good unit test coverage. Daily code reviews, even in isolation, areÂ extremelyÂ important. The earlier in the project life cycle, the better.</p>
<p>From that, you can make small, low risk changes. Keep track with TODO&#8217;s. Breathe, Rome wasn&#8217;t fixed in a day, and a pile of rubbish wasn&#8217;t fixed in one either.</p>
<p>For further, positive refactorings you can check an older <a href="http://martinfowler.com/refactoring/catalog/">list by Martin Fowler</a>, and <a href="http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052/ref=sr_1_1?ie=UTF8&amp;qid=1333060864&amp;sr=8-1">this book</a> has a ton of wonderful ones + tests as well. While a Code Review has decreasing value the more people you add in terms of defects found, the ability to learn &amp; make positive suggestions for architecture are wonderful. If you&#8217;re alone, use <a href="http://codereview.stackexchange.com/">codereview.stackexchange.com</a>.</p>
<p>In the next article I&#8217;ll show you how to get help with the above&#8230; and permission.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jessewarden.com/2012/04/consulting-chronicles-6-refactoring.html/feed</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Consulting Chronicles #5: Getting In, and Out, of the Industry</title>
		<link>https://jessewarden.com/2011/05/consulting-chronicles-5-getting-in-and-out-of-the-industry.html</link>
					<comments>https://jessewarden.com/2011/05/consulting-chronicles-5-getting-in-and-out-of-the-industry.html#comments</comments>
		
		<dc:creator><![CDATA[JesterXL]]></dc:creator>
		<pubDate>Thu, 12 May 2011 16:11:59 +0000</pubDate>
				<category><![CDATA[Consulting Chronicles]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[consulting]]></category>
		<category><![CDATA[consultingchronicles]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[scrum]]></category>
		<guid isPermaLink="false">http://jessewarden.com/?p=2644</guid>

					<description><![CDATA[Today, I&#8217;ll talk about how to get into consulting, what the skills and expectations are, and what can cause you to get out. What is Consulting? Consulting in the Flash/Flex world usually consists of 3 tasks that may be related: Offer your architecture expertise. Offer your code mechanic expertise. Augment an existing team. For #1, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Today, I&#8217;ll talk about how to get into consulting, what the skills and expectations are, and what can cause you to get out.</p>
<p><strong>What is Consulting?</strong></p>
<p>Consulting in the Flash/Flex world usually consists of 3 tasks that may be related:</p>
<ol>
<li>Offer your architecture expertise.</li>
<li>Offer your code mechanic expertise.</li>
<li>Augment an existing team.</li>
</ol>
<p><span id="more-2644"></span>For #1, companies either want you to architect a project, give professional feedback on a suggested/signed off architecture done by another firm (usually to give a stakeholder corroborated evidence), or are having scalability problems and want your advice.</p>
<p>For #2, things aren&#8217;t going well and they want you to fix it. No, not re-write it, fix it.</p>
<p>For #3, they want you to augment an existing team. Some firms do this because the pay + finder fee is good money. Other firms do not because you can sometimes be put into situations where you&#8217;re setup to fail since you may be smart enough to fix it, but you&#8217;re not in charge, thus you cannot do so.</p>
<p>#3 is how I got into consulting, staff augmenting an existing team. While the #1&#8217;s were fun, they were few and far between; usually big companies would rather pay lots of money to fix things vs. pay what it costs to do it right. This isn&#8217;t cynical, this is fact.</p>
<p><strong>Why Get Into Consulting?</strong></p>
<p>The reason is often simple: more money. More money than full-time/salaried/W2 work. More money than freelance/contracting.</p>
<p>Other reasons include working with really smart developers, learning about how Enterprise companies build &amp; sell software, Â learning about how to work in and manage large software teams&#8230; TONS of opportunities to just learn on a variety of subjects. Sometimes people havenâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />t worked on extremely large codebaseses. Itâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />s fun to take all the theory and see what it actually does in the real world, with real people.</p>
<p>Me personally, I like travelling, meeting new people, and seeing how different companies work.</p>
<p><strong>Getting Into Consulting</strong></p>
<p>You have a few options listed in order of ease.</p>
<ol>
<li>Find a firm, become an employee.</li>
<li>Find a firm, become a sub-contractor.</li>
<li>Become an independent contractor.</li>
</ol>
<p>If you find an existing firm, especially when your country isnâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />t in a recession, this is the easiest way. Whether large like Deloitte and Accenture, to smaller firms (more focused on Flash/Flex) like Roundarch and Universal Mind. Regardless of skill level, while youâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />ll be sold to the client as a â€œconsultantâ€, but larger firms will ensure a senior is on the project unless youâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />re merely staff augmentation. Joining as an employee usually is easier because youâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />re cheaper tax wise/cost wise to the firm, and youâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />re more versatile to them. Meaning, since youâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />re on payroll, they can pay the same rate to fix a huge clientâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />s code base as well as working on your firms intranet when in between clients.</p>
<p>If youâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />re the freelance type, or typically like getting a variety of clients (and often potentially making more money), becoming a sub-contractor is another option. This is how smaller firms get off the ground, and is common place even in larger firms. While you usually cannot do mundane work, this is often easier for smaller firms tax wise, thus itâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />s an option as well. If the firm has no current clients, you wonâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />t get any work though. A W2 will get paid for the 2 week downtime, you wonâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />t. Hustling during consulting engagements is usually harder than hustling during contracting ones.</p>
<p>If you have enough contacts or typically do only Enterprise type software (LiveCycle, BlazeDS, Java/Spring/Hibernate), then going the independent route is also an option. Basically, start your own company, and start working directly with clients. This is the hardest, even if you do Enterprise software, because most larger clients only work with â€œcompaniesâ€. Just because you have a company legally filed on paper doesnâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />t mean youâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />re a â€œcompanyâ€. Often theyâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />ll want multiple developers on a whim, liability insurance, and multiple large clients on your track record/portfolio. Iâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />m personally still learning the sales for this, but it seems networking tends to help a lot/the most.</p>
<p>My advice, seek out people you know from the community at Roundarch, Universal Mind, or Cynergy, and make sure youâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />re known to be available, even if they donâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />t currently have any openings.</p>
<p><strong>Skills</strong></p>
<p>Being a consultant involves a lot of things a normal software developer doesn&#8217;t do. Even if you&#8217;re a salaried/W2 employee, these are still required:</p>
<ol>
<li>leadership</li>
<li>large scale architecture</li>
<li>travel on-site to client&#8217;s location</li>
<li>expense reporting</li>
<li>meeting clients and their stakeholders</li>
<li>offering professional, 3rd party opinions</li>
<li>dressing nice</li>
<li>attending meetings for a company you don&#8217;t work for</li>
<li>interviewing/hiring members for your team and/or the company&#8217;s on the company&#8217;s behalf</li>
</ol>
<p>All the standard stuff like team management, working with the company&#8217;s stakeholders, and tracking your hours are there too. You also donâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />t always do all the above mentioned; sometimes just one. Itâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />s just those arenâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />t normal required in traditional freelancing (excluding #3 and #5). Let&#8217;s break down what these skills mean.</p>
<p><strong>Leadership</strong></p>
<p>Unless your role is for staff augmentation, leadership is the most important skill for a consultant. You need to be able to inspire confidence in strangers you&#8217;ve just met, inspire confidence in your chosen direction &amp; decisions, and to keep people moving on the right path.</p>
<p>Some leadership skills can be taught. Some people are just born with the other aspects. If you don&#8217;t know how to do this, watch &amp; learn from those that do. Examples include raising your Charisma score. Doing one or more of the following will help:</p>
<ul>
<li>have good hygiene</li>
<li>have clean clothes that are ironed</li>
<li>dress to impress; this boosts your confidence as well. You want to look successful.</li>
<li>listen: people like good listeners</li>
<li>empathy: people like others who understand them. If you listen to their pains, and sound like you understand, you connect.</li>
<li>be knowledgeable: if you know what you&#8217;re talking about, you&#8217;ll exude confidence when you talk. You also won&#8217;t get offended if someone disagrees and will want to hear their point of view. If you don&#8217;t know, ask/listen vs. act like you know.</li>
<li>have a vision: assuming you know the companies problems, have a long term vision to fix everything. Communicating this to your colleague and your clientâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />s employeeâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />s is paramount.</li>
<li>communication: you need to be an effective communicator to articulate your vision to others, and get them to follow you. Be relaxed, look people in the eyes, be confident in your delivery, and be open to listen. Using slang/ebonics/l33t in normal conversation negatively affects peopleâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />s perception of you. Be professional when you speak.</li>
<li>egg shells: crush those sons of bitches. You do NOT walk on egg shells. You&#8217;re a consultant; grab drama by the neck, raise it high, and execute it. Then, move forward.</li>
<li>be positive: while Andrew Dice Clay and Rush Limbaugh have gotten popular for their negative spin on things, they don&#8217;t last. Positivity is the antithesis to Entropy; that lasts, especially in people&#8217;s perception of you.</li>
<li>control your emotions: software is hard. People in large groups do really dumb things, particularly large companies. Have patience, breathe, and keep your emotions in check. Â Your self-control inspires confidence in your actions by others. People assume you have things under control if you&#8217;re relaxed and poised.</li>
<li>win: You have to WANT to win. You need ambition to reach your goals and vision. If you have that, you&#8217;ll have the motivation to do all of the above.</li>
</ul>
<p><strong>Large Scale Architecture</strong></p>
<p>The most common need in the Flex world is architecting how the Flex talks to the BlazeDS/LiveCycle, and how that talks to the Java, and how that talks to the client&#8217;s stuff. Often, they&#8217;ll have an existing infrastructure in place and you&#8217;ll need to decide &amp; describe how and where to integrate technology stacks to a client&#8217;s existing infrastructure and possibly already in progress project with the existing resources, which are often in a variety of teams.</p>
<p>You need to know this well enough that you can cater design, development, and deployment techniques to various client needs. You need to be able to effectively articulate these to the client, the team, and ensure the tasks meet the resources currently available; meaning the client can build, deploy, and support what you&#8217;re actually suggesting to do. Thatâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />s a lot of traditionally Project Management tasks.</p>
<p>If you don&#8217;t know how to architect large Enterprise sized projects, specifically Flex, learn. If the back-end/middle tier isn&#8217;t your thing, partner with those who know it. Unlike learning traditional software skills, you can&#8217;t really get away with practicing as a consultant. Based on my consulting gigs people can do this all the time if they&#8217;re a salaried employee of a large company. So, if you want to get on the fast track to learn, join <a href="http://universalmind.com/">a consulting firm</a> and get mentored.</p>
<p><strong>Travel On-site to Client</strong></p>
<p>Unless it&#8217;s staff aug, most consulting involves travelling on-site to the client&#8217;s location(s) to meet the stakeholders and team. This means donning your business casual, booking airfare &amp; hotel, and travelling both on the weekend and during the week. Being responsible by ensuring you have ample lay over time, donâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />t get the last flight out, Â arriving to the airport early, and arriving at a client site early to ensure you&#8217;ve gotten enough sleep are assumed.</p>
<p>For those with needy significant others and/or young children, this is challenging to do, and will determine if you do higher level consulting or not. This has forcibly paused my career which Iâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />ll defer to a later blog post.</p>
<p>To me, this was one of the draws I have to consulting. I like traveling to new places, meeting new people, and the lifestyle of being on the move. Being on the road is one thing that&#8217;s therapeutic to me.</p>
<p>If you don&#8217;t have a few thousand in the bank to cover the costs (flight, hotel, fuel, food), the firm you work for will have to front the money. Either way, you have to ensure this is tracked as reimbursed expenses for tax purposes (unless you&#8217;re salaried with the firm). The benefit of paying for these things yourself are tax write off opportunities as well as frequent flyer miles with certain airlines.</p>
<p>If you can use expedia.com, drive a car, and find your way around an airport, you&#8217;ll be fine. Sometimes you get to meet new people you sit next to on the plane. Yes, there are cool people in coach, but you want to strive to be in first class even if the company will only fund coach. Make sure you use your own miles program vs. the companies if you can. You aren&#8217;t paid for your travel time like lawyers, so it&#8217;s nice to have some way to offset costs; i.e. being able to work. Trying to type on your laptop in coach is torture vs. first class.</p>
<p><strong>Expense Reporting</strong></p>
<p>A lot of consultants, even if salaried, are required to document their time and expenses. This means documenting, usually in some web based time tracking program. Thus, you need to be aware of how much time you&#8217;re spending on tasks, what those tasks were, and how much more you think you&#8217;ll do. This can get tricky, too, when you end up in a staff aug position and basically end up running the project. Suddenly you&#8217;re holding the ball, and people are wondering why you&#8217;re billing time for meetings vs. coding&#8230; you can get into really uncomfortable, and extremely irritating and unfair situations. Examples include being the architect &amp; mentoring company employed developers on the project, and when the UAT comes up at the end of an Agile SCRUM Sprint, you show zero User Story points completed, and people in charge question what value youâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />re providing.</p>
<p>If you document well, cya (cover yer arse), and have transparency with the client into what you&#8217;re spending your time on by talking to them early and often, you&#8217;ll do fine. While they often don&#8217;t plan for you to spend a lot of your time in meetings for doing architecture, as long as they&#8217;re aware that out of 4 months of billable hours, 2 months were spent helping the client align their processes to ensure they could support the app, ensure the user stories/features in the application were valid, and the design was actually capable of being built&#8230; then you&#8217;ll at least get paid.</p>
<p>Document your time, be aware of what you&#8217;re working on, and what you need to work on. Communicate what you&#8217;re doing for the client often.</p>
<p><strong>Meeting the Client and Its Stakeholders</strong></p>
<p>I like meeting new people. I like talking. I like meeting successful people and learning from them. Consulting with companies that desire your expertise teaches you a lot about software that supersedes the construction of it, but how it&#8217;s actually consumed and sold. This makes you question a lot of the commonly held beliefs by OOP Purists and other fads touted in the news. It&#8217;s awesome. You get to learn how to build software, how to fix it, how to align teams, how to prevent fire drills, why you&#8217;d even want to prevent a fire drill, how to compromise amongst silo&#8217;d departments, how itâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />s sold&#8230; the list goes on and on.</p>
<p>To get things done, and get bigger problems resolved (like using the wrong technology stack/methodologies/processes), youâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />ll have to meet &amp; talk with the big wigs. If you arenâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />t comfortable talking with upper level management, having an MBA helps. If that isnâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />t your thing, find someone who is good at it, and learn. Sometimes these are either A) the only people that can move you forward and/or B) theyâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />ll great at articulating why youâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />re so effâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />d and just need to deal with it.</p>
<p>Bottom line, you can get the REAL story behind why the way things are, and exactly where they are going by talking to project stakeholders vs. the variety of â€œthis is my world at this companyâ€ responses youâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />ll get from interviewing employees who arenâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />t Director level or higher.</p>
<p><strong>Offering Professional, 3rd Party Opinions</strong></p>
<p>Often youâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />re firm will be hired for your realm of expertise. Other times, they already have the expertise, whether internal employees or another firm, and just want your opinion as a 3rd party who isnâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />t currently involved nor has stake in the current project. They actually care what youâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />re opinion is and pay for it. This helps them confirm what they already know with an â€œiron cladâ€ assessment, or perhaps challenging strongly held beliefs in a certain section of the company.</p>
<p>Sometimes these validations, such as:</p>
<p>â€œYes, this other consulting firm is billing out a bunch of n00bs to you for $150/hr, and yes, youâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />re internal employee DID in fact build something amazing in 1 week what the 2 n00bs couldnâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />t do in 3 months.â€</p>
<p>&#8230;lead to consulting engagements. Sometimes confirming what the company already knows builds trust, and thus leads to a longer term engagement.</p>
<p>Other times youâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />re actually hired for a less valued position such as staff augmentation, but youâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />re experience/knowledge ARE in fact beneficial the project. Thus, you need to find a way to ensure those who need to know learn about what you know. If you sucked, you wouldnâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />t be hired for your high price, thus, ensure the client gets value from you via your professional opinions.</p>
<p><strong>Dressing Nice</strong></p>
<p>Iâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />ve mentioned this countless times before. Clothes make the man. Women typically dress to impress other women; in this case, women need to dress to impress the client. Business casual is usually ok, although, the larger the account, the more formal you need to look. In my opinion, you CANNOT be overdressed for an engagement. If someone mentions on the side you donâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />t have to, theyâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />re either threatened, or donâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />t understand the game.</p>
<p>Dress to impress. If you look impressive, you must be impressive. Youâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />re thus apparently successful because youâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />re knowledgeable. This includes accessories such as the car you drive, the bag/briefcase you carry, and the business card you deploy.</p>
<p><strong>Attending Meetings for a Company You Donâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />t Work For</strong></p>
<p>Sometimes, especially if you end up being a shield for the rest of the team, or if you just want to learn about the lay of the land, the players, and all the drama, youâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />ll need to attend company meetings. These are often a waste of time, or things to be avoided at all costs. However, to management, THIS is their transparency to give to stakeholders at some companies. Providing attendance by your firm is often a requirement.</p>
<p>Either way, youâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />re involved in the project, and need to attend the meetings, and sometimes participate. Sometimes you even need to call/create meetings (OMG, the horror!). These are usually to get consensus from the team on an issue that you couldnâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />t do in SCRUM, or resolve drama, or to brainstorm on how to solve some challenging coding issue.</p>
<p><strong>Interviewing/Hiring Members for Your Team and/or the Company&#8217;s on the Company&#8217;s Behalf</strong></p>
<p>Sometimes youâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />re brought onto a project, and realize you need help. The company looks to you to â€œbuild itâ€ or â€œfix itâ€; if that means more developers/designers from your firm, so be it, theyâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />ll find the budget. Getting resources can be challenging. At a smaller firm, you may have to have the resources yourself already ready to go. <a href="http://twitter.com/davidortinau">David Ortinau</a>, one of my mentors on this, has helped me create a spreadsheet of people Iâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />ve met over the years. On it, I list out people Iâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />d hire (and who I wonâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />t ever hire), what their speciality is, and what the last rate I got them for was. This is because they are often working for me. Even at my firm, my partners are uber-busy, so I canâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />t immediately assume theyâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />re always available. Obviously theyâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />re my first pick to work with.</p>
<p>If youâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />re with a larger firm, they can often help in 2 ways. First, they can provide you additional consultants if the client has the budget for it. Secondly, they can sometimes provide resources from other firms. This is more challenging because usually the other firm will want their cut of providing a resource. This means, either your firm makes less revenue from that resource, or justifies the lack of serious profit from your dire need&#8230;. or both.</p>
<p>Other times, the company is looking to maintain the solution/software you/you and their team has created. This means hiring employees that work for the client. They&#8217;re responsibilities include adding features to &amp; maintaining that software. Often, youâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />re the most qualified to hire said employees. Interviewing potential coders is a challenge &amp; learned set of skills in and of itself.</p>
<p><strong>Getting Out of Consulting</strong></p>
<p>A profession that provides a significant amount of money, a huge opportunity to learn, and networking opportunities with new people &amp; companies seems like something you wouldnâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />t ever want to leave, right?</p>
<p>Wrong.</p>
<p>Consulting has a lot of overhead on the soul. This includes the following:</p>
<ul>
<li>copious amounts of travel to be on-site wherever the client is. This is time away from your loved ones.</li>
<li>dealing with incompetence where said incompetence cannot be fired/laid off, yet continues to actively sabotage your project and/or client relationship.</li>
<li>dealing with politics that theoretically help the companyâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />s stockholders, but ensure the software team is setup to fail</li>
<li>various implementations of Agile SCRUM that arenâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />t true to the tenets of SCRUM, and thus donâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />t see the benefit of it. A lot of times, this angers everyone involved in the team including the PMâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />s running it, and is just a gross feeling.</li>
<li>You potentially never â€œlove the codeâ€ youâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />re working on.</li>
<li>The ultimate consulting goal of â€œleaving the company better than you found itâ€ may potentially be unknowable in how to do so.</li>
<li>Entropy is scientific fact that all things eventually will return to chaos. Youâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />re constantly fighting this in consulting/leading large teams regarding the code base; this can take an emotional, and spiritual, toll.</li>
<li>Sometimes, companies pay you lots of money to produce code that never sees the light of day.</li>
<li>Sometimes, companies pay you lots of money to code in an IDE you loathe on an OS you are unfamiliar with using a framework you hate implementing design patterns you disagree with amongst a team who doesnâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />t understand why youâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />re unhappy with the status quo.</li>
<li>If things go sour, you can sometimes not get paid, or take awhile to get paid.</li>
<li>Depending on the team, the complex processes involved on the surface appear to provide no value to the project and prevent developers from actually writing code since they&#8217;re in meetings or writing docs instead.</li>
</ul>
<p>Add to that the paperwork around expenses &amp; taxes, and itâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />s an enough to make anyone want a salaried job. A steady, consistent paycheck with easy taxes. Sometimes way less stress, too.</p>
<p>In most cases Iâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />ve seen a change of scenery, a long vacation, or just a different project is enough to rejuvenate even the most burnt out consultants. Other times a dive back into the W2 world is a great vacation from consulting.</p>
<p>Just be aware there is a huge pay scale difference between consulting and non-Enterprise salaried positions. Just because you take a salaried, full-time position at a large company because they offer comparable money &amp; benefits doesnâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />t mean youâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />ll actually be able to use your consulting skills. There is a lot of power in not working for a company directly. You can get away with telling them off for being incompetent, explaining how to get out of the mess, and theyâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />ll thank you for it. You do that as an employee, you typically get a different reaction, one you donâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />t want.</p>
<p>Bottom line, this can make finding comparable employment &amp; compensation challenging if youâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />re thinking of getting out. From a skill set perspective, usually only start-ups need someone of that caliber, and unless they have known backers, itâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />s hard for them to afford you unless they offer some serious equity.</p>
<p><strong>Conclusions</strong></p>
<p>Consulting is a profitable endeavor, usually involving your skills on larger projects for larger companies. You can work with various teams or simply offer your expertise, perhaps via training. Itâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />s a great opportunity to learn, meet new people, and discover the business of software and the development processes various companies use. The money canâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />t be beat, either. The easiest way to get in is to find an existing firm such as <a href="http://www.universalmind.com/">Universal Mind</a> or <a href="http://www.deloitte.com/">Deloitte</a> and get hired.</p>
<p>The skills required are more demanding that normal freelance software development. Specifically, knowing how to architect extremely large applications, having good leadership skills, and the ability to communicate complex subjects succinctly are key. These skills can be learned and practiced.</p>
<p>Consulting is a demanding career choice and itâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />s ok to take a break from it. Being an expert in your field requires you to be constantly researching, learning, and being on top of your game.</p>
<p>Keep in mind, too, you can work for a consulting firm and â€œjust codeâ€. This isnâ€<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />t consulting, though.</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jessewarden.com/2011/05/consulting-chronicles-5-getting-in-and-out-of-the-industry.html/feed</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
	</channel>
</rss>
