snow

 

Since there is a blizzard and I’m inside analyzing data, I thought it was a good time for another random SAS tip.

The default output type for SAS 9.4 is HTML, which is nice for presentation and sharing, but sometimes I would like a plain text output, especially if I’m going to be doing something like copying and pasting the output into my program.

You can easily toggle between plain text and HTML output by doing this

Go to the TOOLS menu, select OPTIONS and then PREFERENCES.

In the Preferences window, click on the RESULTS tab.

window with listing preference

 

Check the box next to Create listing and uncheck the box next to Create HTML . Click OK.

Now your results will be in plain text output instead of HTML. To switch back, just go through the same steps, uncheck the listing box and check the HTML box.

Speaking of copying your output into your program ….

I wrote previously about a problem where  I needed to do, among other things, a PROC CONTENTS with the variables in the order they occur in the dataset, not alphabetical order (use varnum) .

 

If you just copy and paste the output of a typical CONTENTS procedure and all you want is the variable names,  you will have a lot of stuff about data type, length and label that you need to delete. Also, my life experience has been that the keystrokes you make (including the backspace key), the more likely you are to make mistakes. When it comes to the keyboard, less is more.

What I really want is the variables output in the order they appear and nothing more. The SHORT option does this for me.

proc contents data= in.sl_pretest varnum short;

and produces this output

Which_choice_is_the_same_as_the What_is_five_time_six__ Fred_walked_for_one_hour__How_ma How_is_nine_thousand__thirty_sev There_are_124_students_making_th
Valerie_has_225_pennies__She_div Joe_did_this_division_problem Which_sign_goes_in_the_space_to

What possible good is that mess? Well, I copy and paste it under the RENAME keyword and then hit the spacebar between each variable name and type = q1   , or whatever number,  like so

RENAME

Which_choice_is_the_same_as_the = q1

What_is_five_time_six__  = q2

Fred_walked_for_one_hour__How_ma = q3

 

As I mentioned in the previous post, I could not do this using an array statement because the data were of mixed type, character and numeric, and SAS does not accept data of mixed types. I also mentioned how to get around that so if you are interested, go back and read that post.

So, this is day 13 of the 20 day blogging challenge, and I skipped over day 12 (although I may go back to it). The prompt was

“Tell about a favorite book to share or teach. Provide at least one example of an extension or cross-curricular lesson.”

My favorite resource is not actually a book, it is a magazine, Mathematics Teaching in the Middle School, published by the National Council of Teachers of Mathematics. One of my favorite parts of the magazine is the Palette of Problems section, which is a bit odd because often I find myself thinking … this problem has no point, for example,

“How many birth dates in a century have the property that the sum of the month and the day equal the value of the last two digits of the birth year?”

I do realize that some students will be interested just in the challenge of solving a problem. However, for many students, the apparent lack of application can be very de-motivating. Most of the problems, though, can be adopted to our games with really simple modifications or may just give me ideas for a problem that would fit right in. For example, this is an extension of a problem in this month’s issue

 

catfish

Zoongey Gniw is looking for a wife.  He is from the Catfish clan and people from the same clan are not allowed to marry. His uncles are going to trade with two different bands. In the first band, 12% are from the Marten clan, 20% from the Crane clan, 64% from the Bear and Loon clans and the rest from the Catfish clan. His other uncle is going to trade with a band where 11% are from the Catfish clan. It is going to be a hard decision which uncle to accompany, says his father.

Not at all, says Zoongey Gniw, and he steps over to the first uncle. How did he decide?

This fits perfectly in our game. There is a video clip on clans, narrated by the inimitable Debbie Gourneau from Turtle Mountain. The prohibition on marrying within clans is historically accurate. As far as the interest of our students today, not only are many of them from tribes that have  the clan system described, but they are also, like most middle school students, interested in the opposite sex, having a boyfriend or girlfriend, so the topic is inherently interesting.

I like this magazine, and I call it that deliberately, rather than an academic journal. All of the journals I read and nearly all of the academic texts talk in theory about what needs to be done and why but not nearly enough on how to effectively do it, whether the topic is teaching mathematics or running a company. Mathematics Teaching in the Middle School is all about how to do things.

When I was in graduate school, it was common for professors to mock teachers who “aren’t interested in anything longer-range or deeper than what am I going to do on Monday.”

That’s the attitude you have the luxury of having if you don’t have to actually show up and teach on Monday.

Sometimes, like Alice in Wonderland, I give myself very good advice. Unlike Alice, though, I occasionally take it. The very best advice I think I have given on this blog is this:

Always do one more thing. Before you turn in at the end of the day, when you think you are tired out and done with work, write a blog post, edit the CSS on one page, answer an email. Those things will add up.

Several people have told me they have taken that to heart and it has helped them be noticeably more productive.  Although I must admit  that my sister told me that she was convinced I was an incurable workaholic and she was hoping for advice more along the lines of, when you think you are tired, take a nap, have a glass of wine and watch TV with your husband.

Well, first of all, one can simultaneously have a glass of wine and answer email, edit CSS or write a blog.  However, I have to say, this “one more thing” advice is something that I really do make a point to do every night unless I am just completely exhausted. It’s the intellectual equivalent of what I wrote about on my other blog, “How to lose 60 pounds with barely trying”  – no, it’s not a joke. I just pointed out that walking a few flights of stairs every day, walking to the store instead of driving, walking around the building while on the phone – all of that added up for 30 years is the difference between being 60 pounds overweight or not.

Similarly, an average of an extra 20 minutes a night adds up to over 2 1/2 work-weeks each year. Often, people ask me how I get so much done – well, my year has 54.5 weeks in it.

Julia and Mochi the dog asleep

Related to this are two other pieces of good advice I give myself – know when you are most effective and get enough sleep.

Notice the examples I gave above didn’t include to de-bug a program or work on design. One of the reasons I want to knock out a few things right before bed is so that the next day I have a longer uninterrupted block of time to focus on whatever is most important. I don’t know of anyone who is most effective when they are tired. I also cannot believe that there is anyone who isn’t negatively affected by being sleep-deprived. If I’m tired during the day, I lay down and take a nap.

I am SO not a morning person. I don’t do 8 a.m. meetings. It is miserable for me and unproductive for whoever I am supposed to meet because my brain is barely functioning. I wake up slowly, usually with a lot of moaning and a cup of coffee or two. This is my last good bit of advice I take from myself – make a conscious effort to learn every day. I usually have my iPad or a book under my bed and first thing in the morning after The Invisible Developer brings me a cup of coffee, I read a chapter or two. I’ve read Javascript: The Definitive Guide twice, Eloquent JavaScript and Javascript, the good parts all the same way – a chapter or so in the morning before I got out of bed.

That’s it – knock out a few non-essential but good to do things before turning in, learn something every day, get enough sleep, and give yourself a substantial block of time during whatever is the most productive part of the day for you to do whatever is most important.

These seem simple, obvious ways to be more effective, but the irony of it is that for me personally it would be impossible to implement this advice in a 9 to 5 job.

Seriously, this is something I have always wondered about with those people who believe they are somehow morally superior because they get out of bed at 5 a.m. , arrive at the office at 8 and work until 5 and that people like me are lazy.

I normally work around 8 – 12 hours a day , by which I mean actual work, not lunch hour, not on Facebook, not on the phone with my mom/ friend/ real estate agent. As a former industrial engineer, I know that 8-12 “standard hours” , that is absolutely on task , is a kick-ass performance.

So, why do some people believe that their performance is “better” because it occurred during specific hours? (Obviously, I’m not counting people who are sales clerks or something where they need to be available to the public at convenient hours. ) If I’m writing a program, what the hell difference does it make if I do it at 1 pm or 1 am ? Seriously, I’m asking this because I’ve wondered about the rationale of bosses over the years – not mine, thank God, but other people’s – who seem convinced that there is a difference.

Lately, I’ve been a terrible person. I have told many people, “No, I cannot help you.”

After six happily profitable years, we’re winding down The Julia Group consulting division. We are not taking any new contracts and not adding on to any existing contracts. As contracts expire, we are not replacing them with new business. In the next month or two this blog will get merged with the 7 Generation Games site.

I have agreed to present at one conference, the Tribal Disability Summit, in July, where I will be speaking on Start-up 101 : The Challenges and (Yes) Advantages of People with Disabilities. I have also said no to other offers to speak at conferences. I’m really bad at answering email requests.

Every time I tell someone no, I feel like I am a terrible person. After all, that’s why I went into consulting and why I started The Julia Group, so I could help people. We have always had rates far below the market average so that non-profits could afford the help they need and also so we could choose to work on the projects most rewarding to us overall and not just financially.

The truth is, I’m not really a terrible person. I decided to do a new start-up to make games that teach mathematics and I work every day on making those games better meet the needs of students and teachers.

The best advice on succeeding is to focus on whatever it is that you want most.

When I was competing in judo, every decision I made all day met a single criterion:

Will this help me win the world championships?

If the answer was, “Yes”, no matter what it was, I did it.

If the answer was, “It will make my chances of winning lower”,  I didn’t do it.

If the answer was, “It won’t make any difference”, then I did it if I felt like it or there were other reasons.

I’m applying those same lessons learned in winning a world judo championships to running a successful gaming company. Being best in the world is not a part-time gig.

As my big brother (who is, coincidentally, a math teacher) told me,

There are too many people in this world who cannot give up what they want now for what they want most.

I’m trying my best not to be one of those people.

 

 

 

 

This week I had one of those pain-in-the-ass problems. I had a test with 24 items but they were of mixed types. That is, for some the answer was multiple choice and for others it was numbers.

The data was received as an Excel file.

Now, I could have opened it with SAS Enterprise Guide and specified data types for each variable, but the problem is, I am going to get this particular data set over and over, so I want code I can write once and run every time.

As if that wasn’t bad enough, the variables all had names like:

which_choice_is_the_same_as_the_

I wanted to rename these all to something sane like q1, q2 etc.

The first step was an option I don’t think I’ve ever used before, oddly enough.

 

proc contents data= annoying  varnum ;

 

Normally, SAS gives you the variables in a data set in alphabetic order when you do a PROC CONTENTS. The varnum option lists the variables in the order they appear on the data set. This was immensely helpful because it spared me going through the data trying to figure which was the first question, which was the second, and so on.

I just copied the variables in order after a RENAME statement and tacked on an =q1, q2, etc. like so

Data better ;

set annoying ;

rename

which_choice_is_the_same_as_the_ = q1
what_is_five_time_six__ = q2

etc.

proc contents data= better ;

I could have combined this with the previous step , but the fact is that unless the data set is really gigantic, the time that needs to be preserved is not computer processing time but my time, and this way was quicker because I didn’t have to write out those ridiculous variable names and worry about the program failing because I used  _ in the name instead of __ .

SAS does have a function to detect variable type, but that wouldn’t really have helped me because I still need to write all of these variables into a single array of item1 – item24 for later use, and you cannot have mixed type arrays. So, I did this

 

data mo_better ;
set better ;
array qs{*} q2 – q6 q10 q12 q14 -q16 q19- q21 ;
array itemN {*} $12 item2 – item6 item10 item12 item14 – item16 item19 – item21 ;
array qsA {*} $12 q1 q7-q9 q11 q13 q17 q18 q22- q24 ;
array itemA {*} $12 item1 item7 – item9 item11 item13 item17 item18 item22- item24 ;
do i = 1 to dim(qs) ;
 itemN{i} = put(qs{i},12.) ;
end ;
do j = 1 to dim(qsa) ;
 itemA{j} = qsa{j} ;
end ;
drop i j q1 – q24 ;

I have 4 arrays. The first consists of the numeric variable type questions. I couldn’t use _numeric_ to create an array of all numeric variables because there were others in the data set that were NOT test questions but were numeric and I did not want them in my array. I had to actually list each variable individually or in a range like q14-q16.

The next array is the one I am going to recode the variables into as character variables. Notice that character arrays need a $ and a length. The next two arrays are the character variables and the variables I’m going to copy them into. I could have just renamed the character variables in a RENAME statement and then changed the length in an ATTRIB statement  but  it would have taken more typing.

The DIM function is the dimension of the array, so it is going to loop through from 1 to however many variables in the array because I didn’t feel like counting them.

The PUT function is going to put this numeric variable into a new character variable with the specified length. It changes the variable to character.

The next loop just puts all the character variables into other character variables with the names item1, item7, etc. Now I have variables that are all the same type and length, named item1 – item24 and I can do things with them like compare each student’s response to each variable to the answer key, score it right or wrong and sum up the scored items, like this (1ANSWER is the first username)

 

Data in.pre_scored ;
set mo_better ;
by username ;
Array scored {24} sc1 – sc24 ;
Array items {24} $12 item1- item24 ;
Array ans{24} $12 ans1 – ans24 ;
if _n_ = 1 then do i = 1 to 24 ;
ans{i} = items{i} ;
end ;
else do i = 1 to 24 ;
if ans{i} = items{i} then scored{i} = 1 ;
else scored{i} = 0 ;
end ;
Retain ans1 – ans24 ;
total = sum(of sc1-sc24) ;

Since this is part of a two-year grant and I am going to receive these same test data sets many times, I am now finished with reading in and scoring the data for the next two years. After this, I just need to import the excel file and click run. I am happy.

Also curious, because I noted that this year’s pre-test scores are 1.5 standard deviations higher than the previous year.  I suspect this is because we have many more fifth-graders in this sample. So … with the scoring done automatically, I can now go on to interesting stuff.

If you want to check out the game these results came from, you can read about it here

 

I read a blog post where the author said the women who dropped out of programming “should have been discouraged” because it’s not for everyone and many women try to use smiles and flattery to get men to do their work for them.

I actually have had the experience the author cites, but with both men and women. It’s true there are some people in the tech field who are very introverted or socially inept. They are willing to help you with your technical problems if you will just stop by and have a cup of coffee and chat with them.

I’m not that person. I have a husband and four daughters. Interestingly,The Invisible Developer, who is so introverted as to be never seen in public is also not that person. He has me and aforementioned four daughters. That is enough for him.

Clearly, people who want you to do their work for them are annoying, however, I haven’t found them to be limited to one gender at all.  Lately, I’ve been wondering whether they are like that in SOME  cases because they don’t believe they can learn to do it themselves. I don’t know the answer to that.

What I do know, though, is that over the years I have known many people to succeed in areas I would not have given them a chance. Two very fine physicians that I know didn’t attend the best high schools, have the grades as undergraduates and honestly,  I didn’t think they had a prayer of  getting into medical school, much less succeeding. Neither got accepted in medical school the first year that they tried. People I would not have given the chance of a prayer in hell of becoming elite athletes have often gone on to surprise me, including a couple who won Olympic medals.

Life discourages people enough. Don’t add to it!

That advice is particularly true for programming. The last couple of days have been discouraging. We had our next install almost ready and then I found some bugs in it. Then we thought it was done, and I found some more bugs in it.

Yes, he's a man and we work together to fix stuff

The Invisible Developer is upstairs fixing those and testing the latest version. I am downstairs fixing his code on the next game (so much for women wanting men to do their work for them, and he is definitely a man. I can point to fact of having collaborated in producing The Spoiled One as irrefutable proof of said manliness. Photograph attached.). Actually, he’s brilliant and totally capable of fixing it himself, but he was already working on the other game.

Everyone’s code, if it is the least bit complicated, is going to have bugs in it. Sometimes it can take you days to find them.

Some days we succeed in writing quizzes where students can drag and drop answers, video clips with sound and animation play in response to correct answers with dialogue in English and Dakota, and then the student is transported back to a 3-D virtual world to continuing playing.

Other days, nothing happens. Just nothing. There are no errors in our consoles, just a screen looking obstinately back at us refusing to do what it’s supposed to do.

Programming is discouraging some days on its own and the LAST thing you need those days is someone saying,

“Maybe you’re just not cut out for this. “

I was complaining about how today had just not been productive, that I wanted to have the latest fixes on Spirit Lake in the hands of the teachers today but it wasn’t saving the game state frequently enough. While The Invisible Developer worked on that I found that some of the quizzes in the next build of Fish Lake were telling the student the answer was wrong even when it was right.

The Spoiled One said,

“Don’t worry, Mom. You’ll figure it out. You have time. Life is long.”

You know what? She was right. We figured it all out today. People should be encouraged. I’m proud of that she has figured this out at not-quite-sixteen.

One of the many questions on start-up accelerator applications that make me go “Hmm”, is this question :

How many lines of code have you written?

I have heard of, but thankfully never worked at, organizations that evaluated their technical staff by the lines of code written.

Let me give you two stories that illustrate why this is a bad example.

fairy

Once upon a time ….

Many years ago, I worked at an organization that decided the programming staff was overpaid and generally had a bad attitude. (No, this wasn’t due solely to me. In fact, unbelievably, I was one of the easier to get along with people on the technical staff).  So … they hired some people at low salaries who had, I believe, a three-month training course in SAS. Most of the senior people avoided the cube farm where these new hires were housed, believing that it would be apparent soon enough that you get what you pay for.

I would generally come in around 10:30 or 11 and leave the office around 8 pm. I couldn’t help but notice several times that some of these new programmers were still there when I left. Leaving one evening, I saw one woman in tears in her cubicle, so I stopped and asked what was the matter. She said she had come into the office at 6 a.m. and was still waiting for her program to run. I sat down with her and looked at her program, which was a simple thing to create a few total and subtotal scores and get statistics on these by state. Her program looked like this:

 

LIBNAME  in “directory”;

Data Alabama ;
set in.us ;
If var1 = .  then var1 = 0 ;
If var2 = .  then var2 = 0 ;
If var3 = .  then var3 = 0 ;
Total = var1 + var 2 + var 3;
If state= “Alabama” ;

run;
Proc means data = alabama ;
var total ;
run;

REPEATED 50 TIMES (50 states + Washington, DC) for a total of 562 lines of code (there is only one Libname statement).

The reason it was taking so long is that she was reading in this dataset with millions of records 51 times. There are many ways this could be fixed. Since I was on my way home, I sat down and did this.

libname mydata “directory”  ;
data test ;
set mydata.us ;
total = sum(var1,var2,var3) ;
keep total state ;

Proc tabulate data= test ;
class state ;
var total ;
Table state ,(total*(n*f=comma12.0(mean std)*f=comma8.2) );
run ;

My program was 10 lines, read the dataset in once and produced a nicely formatted table.

So, was she 60 times more productive? I don’t think so.

Story number two happened in the last week. I have been working on improving our two games, Spirt Lake, and particularly Fish Lake. A major improvement has been merging multiple scripts into one.

Here is what we did with our prototype, since we had to meet a deadline:

  • Wrote a script to handle multiple choice tests.
  • Wrote another script to handle tests that had an integer or decimal answer.
  • Wrote a third script to handle tests that had a fraction as an answer, like 4/5 , to be sure it also accepted 8/10, etc.
  • Wrote a fourth script to handle tests where the answer was dragged and dropped.

etc.

Now obviously, de-bugging would be simpler if we have only one or two scripts. So, this week, I have been taking a couple of scripts and making them more generalizable and deleting many others.

Another thing I’ve done is create a CSS style sheet for each game and included that link in files instead of having the common classes defined in each page.

 

The number of code in the project has gone DOWN by hundreds of lines, but I think the ease of maintenance and documentation has gone UP.

Now, if you asked me how many lines of code I have written in my life, that might be a relevant question. (True story, I once worked on a job where I did repeated measures ANOVA so many times for so many projects, I got so bored, I started writing statements backward beginning with the semi-colon.)

Well, I better get to bed since it is well past midnight, I have seven teenagers sleeping over at my house and I have to get up in the morning and take them all to Disneyland for The Spoiled One’s birthday.

7 Generation Games Logo

BTW – You can buy Spirit Lake: The Game here 

The Invisible Developer had commented that I write an awful lot about SAS and maybe I should write about some other language. For Christmas last year, someone gave me an impact.js license so I made a little game where players drop snares to catch rabbits and collect berries. This doesn’t have much educational value,  I was just playing around. I thought it would be amusing to have the food items they collect in the game be equal in value to the number of calories in that item.

If you have impact and wanted to do this yourself, here is what you would do.

1. Basic stuff – include game.entities.berry, game.entities.rabbit and any other food item in your main.js script. It goes right at the beginning with any other entities you require

 

ig.module(
‘game.main’
)
.requires(
‘game.entities.berry’,
‘game.entities.rabbit’,

— more stuff —

)

2. Create the score in your game info function that stores information

GameInfo = new function(){
this.food = 0;
— other stuff you want to initialize
}

 

3. When you extend the game to add your own cool stuff include an addFood function

MyGame = ig.Game.extend({

— init and other functions

addFood: function(amt){
//pickup item
GameInfo.food += amt; //add caloric value to the food score
}
,

— draw and other functions

 

4. To each entity script, add a function that defines how the player gets the food. Here are two examples.

Collecting berries

In the case of the berries, the player will just walk by the bushes and collect the berries. Think Pac Man!

In your berry.js file add a check function like this

EntityBerry = ig.Entity.extend({

— other stuff

check: function(other){
if (other.name == “player”){
ig.game.addFood(5);
this.kill();
}}
})

So …. it is about 5 calories per berry. When the player walks by a bush and comes into contact with a berry (picks the berry), the berry disappears and the player’s food count goes up by 5.

Snaring rabbits

Here is a second example. In this one, they drop snares around the virtual woods and when they snare a rabbit they get 1,000 points which is the approximate calorie content of a dressed rabbit, according to the USDA Nutrient database . I assumed this yielded an average of 2 pounds of meat.

For my rabbit I have extended the rabbit.js script as follows

EntityRabbit = ig.Entity.extend({

— other stuff

kill: function(other){
ig.game.addFood(1000);
this.parent();
}
})

But what is going to kill my rabbits? The snares, of course, so I added this into my snare.js script

EntitySnare = ig.Entity.extend({

— other stuff

check: function(other){
if (other.name == “rabbit”){
other.receiveDamage(100,this) ;
ig.game.addFood(1000);

}}
})

Since the rabbit only has 100 health points, that kills it off so your rabbit disappears and your food value goes up by 1,000.

As you can see, you could easily add shooting deer, buffalo and other food in the same way.

——————————————–

After I had played around with this for a bit, I thought it was a waste to just trash it so I put it into our upcoming game, Fish Lake, in between levels. When they finish Level 3, they play this game and then go on to Level 4. Our main game is 3-d, this is just a little interlude. I like to throw surprises into the game so kids like it and keep playing.

—————————————-

Someone in Los Angeles was very upset by our Spirit Lake game where players shoot wolves and buffalo. She said she just could not kill animals. (The Invisible Developer asked me if she was aware that they were virtual animals and not real.) I told her that our games are based on Native American history and history is what happened, not what you think should have happened or wanted to happen. In fact, there is a very touching story in Fish Lake narrated by Debbie Gourneau of the Turtle Mountain reservation on how many people died of starvation and how many more would have died were it not for the jackrabbits.

——————————

buffalo in the snowClick here to get Spirit Lake: The Game for $9.99

 

P. S. The amount of information produced by USDA is nothing short of amazing, and I don’t say that just because they funded are grant. They really are incredible.

 

 

Most start-up events waste my time. Founder Friday Women 2.0 was one of the few exceptions.

Generally,  at start-up events, the people who have an actual company make up a tiny fraction of the attendees, being out-numbered at least 5 to 1 by people with “an idea for a company”. The remainder of those in attendance are in insurance, law or other companies selling to start-ups. Nothing wrong with that and at one event we actually met a company we signed a contract with, so it’s not always a waste of time.

I think most people running actual companies are like me, they are too busy doing things to have a lot of time to spare for drinks with people talking about what they are going to do.

Our Chief Marketing Officer insists that I get out of the office and network. She believes everyone in the company, regardless of job title, should pitch, present or exhibit our games at least once a month. So … I agreed to put up a table at Founder Friday ‘s Women 2.0 event in Los Angeles.

There are only two guarantees that your time at a start-up event won’t be completely wasted; 1. You get to pitch/ present your company or 2. There is a speaker you can learn from.

Founder Friday, Women 2.0 had both. I did get to discuss 7 Generation Games with a number of people, but most helpful for me was the speaker. I tweeted about the event and a couple of people asked me her name. It was Jody  Dunitz, and she is an investor with the Tech Coast Angels, which is the largest angel investor group in the country. Most of her talk was about how she personally decided whether a company was a good investment. Here are the main points from my notes:

  • She looks at three things.
  • Look at the product first. It must be innovative in some way. Status quo is a huge barrier to overcome. You can have a greatly superior X but if people already have an X then they are very inclined to stay with that. (Take the example of a car. You’re probably not going to go out and buy a new car right now just because a better car came out on the market. If you have a Prius, when it comes time to buy a new car, you’re likely to just buy another Prius. )
  • You need to have a product. “There has to be some there there.” Too many people have just an idea but no actual product. It can be a prototype, a minimal viable product, but there has to be something.
  • You need to have a way that you are going to make money. Too many people say they are going to scale up and then be acquired for $19 billion. You need to have a way that you are going to make revenue.
  • Second, she looks at the team. Some investors may look at the team first.
  • She is extremely reluctant to invest in a company with a sole founder. To make up for being a sole founder they would have to have some other aspect of the company  that was really extraordinary.
  • There isn’t a magic number of founders to have on your team but whatever the number is, it’s more than one.
  • The key member of the team is the CEO. The CEO should be knowledgable about all aspects of the company. He or she doesn’t have to write code but should at least understand the technical aspects of a product and not have to go ask the CTO. The CEO should understand the financial situation and not have to go ask the CFO.
  • Third thing she looks at is valuation. Founders always think their company is worth more than investors do. Founders look at how much time and effort they have put into it. Investors look at how much money they think they can make.
  • Angel investors look for a 10x return in 5-7 years. It used to be 3-5 years but there is more competition from accelerators, incubators and different investor groups now, so the horizon has gotten a bit longer.
  • Growth in venture capital has not matched the pace of growth in angel investment, so a higher proportion of companies than previously now get angel funding but fail to get venture capital and die.
  • Angels are looking for a 10X return. They need a high return to make up for all of the companies that fail and don’t make anything.
  • If your company looks like it may pay 10-20% returns, they aren’t interested. In that case, it would make more sense to invest in something like Apple stock.
  • Startup companies at the Angel level are usually valued at $2- $4 million
  • When founders are deciding whether an angel investor is a good fit, the first thing they should look at is rapport, do they get along. Is this person interested in their company over and above the money it can make? Will the investor bring something to the deal in addition to money – connections with key customers, knowledge of the industry.

Two main points I took away from it for me personally are,

  1. Our team is doing a lot of things right.
  2. We need to stress more how 7 Generation Games is different from other educational gaming companies. I got right on that.

hunter on horseback

7 Generation Games – Grand Theft Auto – but with horses and math, and for kids. 

For $9.99 you can quit arguing with your kids about math homework.

Got interrupted by coding, meetings, flying across country, teaching judo, more meetings and flying back across country. Just finishing The Hard Thing about Hard Things and and I thought it was a terrific book EXCEPT for the part about not hiring people from your friend’s companies. I completely disagreed with this, and even though I admired what Horowitz has done and appreciated the great advice in his book, this part would make me very reluctant to ever work with or for him, not because he’s necessarily a bad person or manager but because it reveals a completely incompatible view of the world and business.

In short, he says that you don’t hire people from your friends’ companies. I just read a rather damning article about the collusion of tech companies in artificially lowering wages of engineers and programmers by a “gentleman’s agreement” not to hire one another’s star employees in Pando Quarterly..I hope Horowitz’s friends lose the anti-trust lawsuit and pay a lot of penalties because I believe they are wrong.

His argument is that if your friend’s company is in dire straits that person is a major loss, if they are that good, and why would you do that to a friend? He equates it to dating your friend’s ex-husband.

I completely disagree.

What about the poor man/woman who is a superstar programmer , manager, sales person at company X. They are great at their job, that’s why you are interested in them. They want to leave company X because it is circling the drain, or maybe they just want more money or a shorter commute. They have worked very hard their whole lives to be a superstar whatever and they would be good at the job. They would be good for your company. And you refuse to hire them not because they are unqualified but because your friend doesn’t want to release them. This is so much like indentured servitude or slavery that it creeps me out. Your master must release you. Ick.

It is NOT like dating someone’s ex-husband. It is like beating their friend in a match. You get over it.

This came up in a story at lunch today with some friends. MANY years ago, I was on the U.S. team and one of our athletes came out as a lesbian while we were on the European tour, when her girlfriend showed up. The rest of the team had a meeting without her present, called by the manager, and discussed “what to do about it”.

I said,

“At the last tournament, the only two people who won gold medals were me and her, and so the way I see it, the only person who has any room to talk is me and I don’t care if she has sex with small desert animals as long as she brings back medals for our country. As far as who would be willing to room with her, I’ll room with her.”

After that, a couple of other women on the team spoke up and agreed with me. So, nothing was said and she roomed with someone else on the team, because we weren’t particularly good friends at the time.

One of the women at lunch asked why we weren’t friends and I explained that she had beaten a very good friend of mine and replaced her on the U.S. team. The same woman asked why I offered to room with her then, and I said,

Because we were team mates.

To me, it made perfect sense. Yes, I was not happy my friend wasn’t on the team. I liked her. I would have liked to have roomed with her. I was also really sad for her that she was not on the U.S. team. However, I sure didn’t expect someone else to lose out to their own detriment to benefit my friend. Moreover, I wanted my team, the United States, to win, and that meant having the best people.

It seems as if Horowitz decisions harmed people who were outstanding performers who had done no more wrong than choosing to work for one of his friends, reducing those “stars” opportunities and maybe offering less than optimal employees for his company.

I think he was wrong to do that.

 

 

Next Page →