When ideas that have never been successful keep coming up over and over again it's usually because they simply haven't been implemented right and are just waiting for someone to think up the right sauce.
Ambitious successful technology is usually a culmination of decades of failure. For example:
1. Touch screen computing (iPad)
2. On-demand video (YouTube, Hulu)
3. Video phones (Skype)
4. The all-in-one fits-in-the pocket pda/phone (Android/iPhone)
If you talked to say, a YouTube exec in 2004 about their ideas you'd probably walk away thinking "Oh yeah, that idea; the one that has failed so hard, so many times, that I was looking for the hidden cameras".
And you'd be dead wrong.
This isn't new, if you go back 40 years you'll find that Credit Cards, Bar Codes, ISBN numbers, the home theater, all had predecessors that sucked. Even the personal computer and the home video game system had years of failed starts.
Thursday, September 1, 2011
Monday, August 29, 2011
The Lottery Analogy
I've told you the lottery ticket analogy, right? It's really important that everyone understands this:
If you want to win the lottery, you need to do something that makes that possible; in this case it's buy a ticket. But you'll probably lose and that ticket will probably be worthless. However, you cannot win the lottery without it. And who knows? You might, actually, indeed, win.
Here's the rules:
Want to be a successful author or get a good job or make money on the stock market or be a famous scientist? The same rules apply.
If you want to win the lottery, you need to do something that makes that possible; in this case it's buy a ticket. But you'll probably lose and that ticket will probably be worthless. However, you cannot win the lottery without it. And who knows? You might, actually, indeed, win.
Here's the rules:
- You can't win without playing.
- Every time you play, you get a new chance to win, independent of the previous chances.
- Doing the right thing on the wrong day is worthless. Even if you do everything perfect and you get really lucky, there are still externalities that will almost always snatch the victory from you. You will then see someone doing the exact same thing as you on another day and succeeding.
- When you realize that you picked the right numbers on the wrong day, get over it and Play Again. Don't allow your past to paralyzed you.
- You will officially lose far before you personally know it. Make sure you know what failure and loss looks like and then accept it. Never fool yourself into thinking you have a winner, acknowledge the loss and move on as quickly as possible.
Want to be a successful author or get a good job or make money on the stock market or be a famous scientist? The same rules apply.
Wednesday, July 20, 2011
on getting a job
know what you can tolerate
if you don't think you could put up with being a sysadmin every day, don't ever apply as one; regardless of skill; you won't get the job unless you interview at a dysfunctional company that you won't want to work at. know what role you would be willing to put up with and apply strictly for those positions.
resumes are important, github is more. you are pitching yourself, over email. silence isn't a problem. keep trying until someone explicitly says no. remember you are talking to humans and not grammar professors. be cordial but formal; assertive, eager, and well-mannered.
interviewing
smile, agree with everything, answer slowly and clearly, make eye contact, laugh at their jokes, gloss over their mistakes, don't bring in any baggage, and don't worry too much.
after the interview
it's critical to send an email after about 4 but less then 24 hours later. repeat the same pleasantries.
about pay
understand what you need to leverage before it comes on the table. you should make the first offer, always. do it at the point of accepting the job after the employer has vested in you as a future employee. make it implicitly but not explicitly clear that you will quickly back out if conditions aren't met.
remember why are you working
most programmer I know would rather be working on their pet project (which is The Next Big Thing) full-time instead of for a company. If this is your goal, remember this at the negotiation table; 5 day work weeks, coming in around noon, leaving at 5 strictly every day; all of these accommodations are best set at this point.
Friday, May 27, 2011
Abandon your cake
Pretend you spend all day making your spouse a cake. You carefully research the ingredients and then painstakingly try to the best of your effort to do everything well. However, it comes out slightly too brittle; the hand-made frosting is a little tart. But you spent a lot of time on it.
You present the cake. After the overjoyed response, you proceed to cut the first slice and your spouse takes the first bite, rolls the taste around, ponders a bit and very seriously states, "A bit bland, the frosting needs some work. Let's go to the grocery store and get a better one."
You are shocked. "Let's go to the grocery store?!", you spent all day on that damned thing; the store wasn't even open when you started; there were not even cakes available for sale at the time you began.
But sure, you aren't a pastry chef and you probably made a few mistakes along the way, but it's your cake. You made it specifically for your spouse.
But now, of all things, your spouse looks impartially at it, throws out the idea that you had anything to do with it and does some objective comparison. The conclusion is inescapable; the store is in fact open now, and does sell better cakes than the one that you made and instead of making it yourself you probably should have just gone out and bought one when the store opened, spending all of 20 minutes.
However painful it may be, you must acknowledge that if you want to enjoy a great cake, you should toss yours in the garbage, forget about it, and grab one from off the shelf.
Software is the same way. Oftentimes you will find that a solution baked in-house by a colleague you know and respect is not as mature as one that is open source.
Sometimes although the in-house solution may predate the open source one by many years, the open source solution appears to have raced ahead in quality, stability, and features.
You know intellectually that you will get a better product if you go forward with the open source solution that is well supported and well written. You know that you will free up the time of all parties involved. It looks like a pure business and logical decision. It's easy to forget the fact that you are suggesting to toss out someone's handmade cake by effectively saying:
The truth is though, adopting open source (ie, off-the-shelf) components over in-house solutions can often be a leading factor in whether a project is successful and done on schedule. Off-loading as much responsibility as possible permits your team to focus on the product and not the dependencies.
When you are the cake maker, this reality is a very difficult thing to accept. "My cake is worthless?", you incredulously pout. You skeptically go over the open source project with a fine-toothed comb. "But wait", you insist, "It can't do xyz, and I can. Ha!" or "Let's run some performance tests and see how this POS does".
However, you acknowledge that it is well done. They are catching errors that you were too lazy to check for; they have active mailing lists and people around the world fixing bugs while you are at home sleeping. Intellectually, you know what to do:
Abandon Your Cake.
Implement the stuff you have that the open-source project does not and submit a patch. Probably introduce yourself as someone who has written a similar project but has done the grief of switching over.
Once you get over yourself and toss your cake away, you can hop on the winning team with enough courage and strength.
Don't look at it as if you need to match the feature-set of the project but as a collaborative project with open-membership that you have specific expertise on.
You came up with a solution to a generic problem that many people face and you learned a lot by building it out yourself. You have a lot of knowledge to contribute. You were good enough to do the solution single-handed; you are certainly good enough to contribute to a group effort.
So someone else won the internet lottery fame game this time, it happens. Go join them and you will be a valued member of their team. After a little while you will be able to faithfully consider it your project as much as any other contributor.
It will be easier, you'll get more exposure, and you can claim part ownership of something that people actually have heard of instead of filling your resume with github projects that are only watched by yourself.
Sharing the fame beats pounding the pavement any day.
You present the cake. After the overjoyed response, you proceed to cut the first slice and your spouse takes the first bite, rolls the taste around, ponders a bit and very seriously states, "A bit bland, the frosting needs some work. Let's go to the grocery store and get a better one."
You are shocked. "Let's go to the grocery store?!", you spent all day on that damned thing; the store wasn't even open when you started; there were not even cakes available for sale at the time you began.
But sure, you aren't a pastry chef and you probably made a few mistakes along the way, but it's your cake. You made it specifically for your spouse.
But now, of all things, your spouse looks impartially at it, throws out the idea that you had anything to do with it and does some objective comparison. The conclusion is inescapable; the store is in fact open now, and does sell better cakes than the one that you made and instead of making it yourself you probably should have just gone out and bought one when the store opened, spending all of 20 minutes.
However painful it may be, you must acknowledge that if you want to enjoy a great cake, you should toss yours in the garbage, forget about it, and grab one from off the shelf.
Software is the same way. Oftentimes you will find that a solution baked in-house by a colleague you know and respect is not as mature as one that is open source.
Sometimes although the in-house solution may predate the open source one by many years, the open source solution appears to have raced ahead in quality, stability, and features.
You know intellectually that you will get a better product if you go forward with the open source solution that is well supported and well written. You know that you will free up the time of all parties involved. It looks like a pure business and logical decision. It's easy to forget the fact that you are suggesting to toss out someone's handmade cake by effectively saying:
Hi. I just wanted to say that you wasted your time and your solution is inferior to something I found in 30 seconds on google. We should be using this instead.Breaking this news is one of the most difficult things to do at a personnel level on any programming team. You look like the new kid tossing out personal insults, disparaging the quality of your colleagues works; suggesting that they produced inferior code that simply is not good enough to be put in any project that you want to work on.
The truth is though, adopting open source (ie, off-the-shelf) components over in-house solutions can often be a leading factor in whether a project is successful and done on schedule. Off-loading as much responsibility as possible permits your team to focus on the product and not the dependencies.
When you are the cake maker, this reality is a very difficult thing to accept. "My cake is worthless?", you incredulously pout. You skeptically go over the open source project with a fine-toothed comb. "But wait", you insist, "It can't do xyz, and I can. Ha!" or "Let's run some performance tests and see how this POS does".
However, you acknowledge that it is well done. They are catching errors that you were too lazy to check for; they have active mailing lists and people around the world fixing bugs while you are at home sleeping. Intellectually, you know what to do:
Abandon Your Cake.
Implement the stuff you have that the open-source project does not and submit a patch. Probably introduce yourself as someone who has written a similar project but has done the grief of switching over.
Once you get over yourself and toss your cake away, you can hop on the winning team with enough courage and strength.
Don't look at it as if you need to match the feature-set of the project but as a collaborative project with open-membership that you have specific expertise on.
You came up with a solution to a generic problem that many people face and you learned a lot by building it out yourself. You have a lot of knowledge to contribute. You were good enough to do the solution single-handed; you are certainly good enough to contribute to a group effort.
So someone else won the internet lottery fame game this time, it happens. Go join them and you will be a valued member of their team. After a little while you will be able to faithfully consider it your project as much as any other contributor.
It will be easier, you'll get more exposure, and you can claim part ownership of something that people actually have heard of instead of filling your resume with github projects that are only watched by yourself.
Sharing the fame beats pounding the pavement any day.
Sunday, April 17, 2011
hold on ... even better
if($level=="Level 1" && $month=="Month 1")
{
$newLevel="Level 1";
$newMonth="Month 2";
}
else if($level=="Level 1" && $month=="Month 2")
{
$newLevel="Level 1";
$newMonth="Month 3";
}
else if($level=="Level 1" && $month=="Month 3")
{
$newLevel="Level 1";
$newMonth="Month 4";
}
else if($level=="Level 1" && $month=="Month 4")
{
$newLevel="Level 1";
$newMonth="Month 5";
}
else if($level=="Level 1" && $month=="Month 5")
{
$newLevel="Level 1";
$newMonth="Month 6";
}
else if($level=="Level 1" && $month=="Month 6")
{
$newLevel="Level 2";
$newMonth="Month 1";
}
else if($level=="Level 2" && $month=="Month 1")
{
$newLevel="Level 2";
$newMonth="Month 2";
}
else if($level=="Level 2" && $month=="Month 2")
{
$newLevel="Level 2";
$newMonth="Month 3";
}
else if($level=="Level 2" && $month=="Month 3")
{
$newLevel="Level 2";
$newMonth="Month 4";
}
else if($level=="Level 2" && $month=="Month 4")
{
$newLevel="Level 2";
$newMonth="Month 5";
}
else if($level=="Level 2" && $month=="Month 5")
{
$newLevel="Level 2";
$newMonth="Month 6";
}
else if($level=="Level 2" && $month=="Month 6")
{
$newLevel="Level 3";
$newMonth="Month 1";
}
else if($level=="Level 3" && $month=="Month 1")
{
$newLevel="Level 3";
$newMonth="Month 2";
}
else if($level=="Level 3" && $month=="Month 2")
{
$newLevel="Level 3";
$newMonth="Month 3";
}
else if($level=="Level 3" && $month=="Month 3")
{
$newLevel="Level 3";
$newMonth="Month 4";
}
else if($level=="Level 3" && $month=="Month 4")
{
$newLevel="Level 3";
$newMonth="Month 5";
}
else if($level=="Level 3" && $month=="Month 5")
{
$newLevel="Level 3";
$newMonth="Month 6";
}
else if($level=="Level 3" && $month=="Month 6")
{
$newLevel="Level 4";
$newMonth="Month 1";
}
else if($level=="Level 4" && $month=="Month 1")
{
$newLevel="Level 4";
$newMonth="Month 2";
}
else if($level=="Level 4" && $month=="Month 2")
{
$newLevel="Level 4";
$newMonth="Month 3";
}
else if($level=="Level 4" && $month=="Month 3")
{
$newLevel="Level 4";
$newMonth="Month 4";
}
else if($level=="Level 4" && $month=="Month 4")
{
$newLevel="Level 4";
$newMonth="Month 5";
}
else if($level=="Level 4" && $month=="Month 5")
{
$newLevel="Level 4";
$newMonth="Month 6";
}
That must have taken like days or something ... I don't know if the programmer even knew about the advanced "copy" and "paste" concepts.
Saturday, April 16, 2011
wait wait
I can top that (below)
switch($month)
{
case'1':
$date = calculateenddate(1,$weakly,7,$unixtime);
break;
case '2':
$date = calculateenddate(2,$weakly,7,$unixtime);
break;
case '3':
$date = calculateenddate(3,$weakly,7,$unixtime);
break;
case '4':
$date = calculateenddate(4,$weakly,7,$unixtime);
break;
case '5':
$date = calculateenddate(5,$weakly,7,$unixtime);
break;
case '6':
$date = calculateenddate(6,$weakly,7,$unixtime);
break;
case '7':
$date = calculateenddate(7,$weakly,7,$unixtime);
break;
case '8':
$date = calculateenddate(8,$weakly,7,$unixtime);
break;
case '9':
$date = calculateenddate(9,$weakly,7,$unixtime);
break;
case '10':
$date = calculateenddate(10,$weakly,7,$unixtime);
break;
case '11':
$date = calculateenddate(11,$weakly,7,$unixtime);
break;
case '12':
$date = calculateenddate(12,$weakly,7,$unixtime);
}
return $date;
What is a loop?
function duedates($programStartDate, $month, $request) {
if ($request == "accelarate")
{
$weakcycle = '2';
}
else if ($request == "deaccelerate")
{
$weakcycle = '4';
}
else
{
$weakcycle = '4';
}
$db = new databasemanager();
$unixtime = strtotime($programStartDate);
switch($month)
{
case'2':
$date[] = calculateenddate(1,$weakcycle,7,$unixtime);
break;
case'3':
$date[] = calculateenddate(1,$weakcycle,7,$unixtime);
$date[] = calculateenddate(2,$weakcycle,7,$unixtime);
break;
case'4':
$date[] = calculateenddate(1,$weakcycle,7,$unixtime);
$date[] = calculateenddate(2,$weakcycle,7,$unixtime);
$date[] = calculateenddate(3,$weakcycle,7,$unixtime);
break;
case '5':
$date[] = calculateenddate(1,$weakcycle,7,$unixtime);
$date[] = calculateenddate(2,$weakcycle,7,$unixtime);
$date[] = calculateenddate(3,$weakcycle,7,$unixtime);
$date[] = calculateenddate(4,$weakcycle,7,$unixtime);
break;
case '6':
$date[] = calculateenddate(1,$weakcycle,7,$unixtime);
$date[] = calculateenddate(2,$weakcycle,7,$unixtime);
$date[] = calculateenddate(3,$weakcycle,7,$unixtime);
$date[] = calculateenddate(4,$weakcycle,7,$unixtime);
$date[] = calculateenddate(5,$weakcycle,7,$unixtime);
break;
case '7':
$date[] = calculateenddate(1,$weakcycle,7,$unixtime);
$date[] = calculateenddate(2,$weakcycle,7,$unixtime);
$date[] = calculateenddate(3,$weakcycle,7,$unixtime);
$date[] = calculateenddate(4,$weakcycle,7,$unixtime);
$date[] = calculateenddate(5,$weakcycle,7,$unixtime);
$date[] = calculateenddate(6,$weakcycle,7,$unixtime);
break;
case '8':
$date[] = calculateenddate(1,$weakcycle,7,$unixtime);
$date[] = calculateenddate(2,$weakcycle,7,$unixtime);
$date[] = calculateenddate(3,$weakcycle,7,$unixtime);
$date[] = calculateenddate(4,$weakcycle,7,$unixtime);
$date[] = calculateenddate(5,$weakcycle,7,$unixtime);
$date[] = calculateenddate(6,$weakcycle,7,$unixtime);
$date[] = calculateenddate(7,$weakcycle,7,$unixtime);
break;
case '9':
$date[] = calculateenddate(1,$weakcycle,7,$unixtime);
$date[] = calculateenddate(2,$weakcycle,7,$unixtime);
$date[] = calculateenddate(3,$weakcycle,7,$unixtime);
$date[] = calculateenddate(4,$weakcycle,7,$unixtime);
$date[] = calculateenddate(5,$weakcycle,7,$unixtime);
$date[] = calculateenddate(6,$weakcycle,7,$unixtime);
$date[] = calculateenddate(7,$weakcycle,7,$unixtime);
$date[] = calculateenddate(8,$weakcycle,7,$unixtime);
break;
case '10':
$date[] = calculateenddate(1,$weakcycle,7,$unixtime);
$date[] = calculateenddate(2,$weakcycle,7,$unixtime);
$date[] = calculateenddate(3,$weakcycle,7,$unixtime);
$date[] = calculateenddate(4,$weakcycle,7,$unixtime);
$date[] = calculateenddate(5,$weakcycle,7,$unixtime);
$date[] = calculateenddate(6,$weakcycle,7,$unixtime);
$date[] = calculateenddate(7,$weakcycle,7,$unixtime);
$date[] = calculateenddate(8,$weakcycle,7,$unixtime);
$date[] = calculateenddate(9,$weakcycle,7,$unixtime);
break;
case '11':
$date[] = calculateenddate(1,$weakcycle,7,$unixtime);
$date[] = calculateenddate(2,$weakcycle,7,$unixtime);
$date[] = calculateenddate(3,$weakcycle,7,$unixtime);
$date[] = calculateenddate(4,$weakcycle,7,$unixtime);
$date[] = calculateenddate(5,$weakcycle,7,$unixtime);
$date[] = calculateenddate(6,$weakcycle,7,$unixtime);
$date[] = calculateenddate(7,$weakcycle,7,$unixtime);
$date[] = calculateenddate(8,$weakcycle,7,$unixtime);
$date[] = calculateenddate(9,$weakcycle,7,$unixtime);
$date[] = calculateenddate(10,$weakcycle,7,$unixtime);
break;
case '12':
$date[] = calculateenddate(1,$weakcycle,7,$unixtime);
$date[] = calculateenddate(2,$weakcycle,7,$unixtime);
$date[] = calculateenddate(3,$weakcycle,7,$unixtime);
$date[] = calculateenddate(4,$weakcycle,7,$unixtime);
$date[] = calculateenddate(5,$weakcycle,7,$unixtime);
$date[] = calculateenddate(6,$weakcycle,7,$unixtime);
$date[] = calculateenddate(7,$weakcycle,7,$unixtime);
$date[] = calculateenddate(8,$weakcycle,7,$unixtime);
$date[] = calculateenddate(9,$weakcycle,7,$unixtime);
$date[] = calculateenddate(10,$weakcycle,7,$unixtime);
$date[] = calculateenddate(11,$weakcycle,7,$unixtime);
break;
}
return $date;
}
... Solid Gold I tell you ... solid gold ....
Subscribe to:
Posts (Atom)