Growth vs Established Site Metric

What do websites prioritize? User sign in (mainstream) or user sign up (startups)?

Top US sites (per Alexa)

I looked at the Alexa Top US sites list and went through the top 10. These are established websites. The purpose of the site helps determine which options (Sign in & Sign up) to feature. Is it a gateway to content (Google, Yahoo)? A source of content (Wikipedia, Youtube)? A social network (Facebook, Twitter)?

The call to action of each site is interesting (and surely optimized in countless ways). Let’s look at the top 10 US sites:

  1. Google
    google
    Google only provides an option to Sign In. They’ve kept their homepage uncluttered with a clear call to action (to search).
  2. Facebook
    facebook
    Facebook wants sign ups, and they offer both Log In & a giant Sign Up form. As a social network, if you don’t log in or sign up, you can’t really do anything on Facebook. Interestingly, the Log In form has the focus so you can immediately type in your login credentials. This one goes to Sign Up, just look at that real estate.
  3. Youtube
    youtube
    Youtube has two different Sign in buttons. As Google owns Youtube, this is consistent with their assumption that you already have an account and are not new to Youtube. Also like their parent, Google, Youtube allows you to use their site right away without signing in.
  4. Amazon
    amazon
    Amazon only provides a Sign in button. As a store, you can immediately click on things to view and perhaps purchase. Amazon, like most stores, lets you add things to your cart without an account. When you want to checkout, you can sign in or create an account.
  5. Yahoo
    yahoo
    Yahoo only provides a Sign In link. Yahoo, an enduring web portal, lets you do many things on from their homepage. You do not need to be logged in to use their site (for things like news, weather, etc.).
  6. Wikipedia
    wiki
    The English Wikipedia page has a tie between “Create account” and “Log in”. Perhaps “Create account” wins since English is a left-to-right language. For our purpose, we’ll consider Wikipedia a tie for user accounts. Wikipedia is a content source and you can (and most likely) browse it without signing in.
  7. Twitter
    twitter
    Twitter is similar to Facebook. It’s a social network, but Twitter doesn’t have as strict of a login requirement as Facebook to use it. Like Facebook, Twitter’s default focus falls on the Log in form, but the Sign up form takes up more real estate. We’ll give this round to Sign up.
  8. Ebay
    ebay
    Ebay is an auction site or a shop. As such, you can browse most of the site without logging in. The header contains “Sign in or register”. Since they provide both options without giving one option a more prominent style, this is a tie.
  9. Linkedin
    linkedin
    LinkedIn is a professional social network. Along with Facebook & Twitter, it places a heavy emphasis on sign up. There is a large form and giant “Join now” button in bright yellow. LinkedIn also defaults the focus to the Sign In form. Since social networks display different content for each user, having an account is important to experience the social network as intended.
  10. Reddit
    reddit
    Reddit is an online community that tends to provide news and other user generated links. Reddit can be used without an account since you can read most of the content without logging in. Reddit provides small text links for “sign in” and “create an account”. There is a big login form nested or obscured between a search input and submit buttons.

Recent YC Startups

For the sake of picking some newer companies, I went to yclist and looked at the first five. I’m sure there are better ways to come up with new startup sites, but I wanted something reasonable and simple. For these startups, I’m going to focus on their Sign In vs Sign Up call to actions (not their business model).

  1. Abacus
    abacus
    Abacus has Login & Sign Up links in the header, but the page is clearly focused on signing up for a free 30 day trial. There’s screenshots of their product, a Watch Video link, and a Schedule a Demo link. All signs that they want you to find out more and sign up.
  2. AirHelp
    airhelp
    AirHelp has something which I haven’t seen in a long time: a choose your location screen. Selecting “US”, there’s are multiple Call to Actions for “Start your claim”, “Check if you’re eligible”, and “Don’t have a claim yet?” to entice you to start (or sign up).
  3. AirPair
    airpair
    Airpair has a header link for “Login”, but a giant input for “Enter your email to get started …”. Clearly, they want to draw your attention to enter your email and get started.
  4. Algolia
    algolia
    Algolia’s header contains a “LOGIN” and a “FREE TRIAL” link/button. The “FREE TRIAL” in the header is very prominent since it has so much contrast with the other header elements. In addition, the page is dedicated to “SIGN UP NOW”.
  5. Ambition
    ambition
    Ambition contains a “SIGN UP!” element in the header that is very prominent (high contrast and 2nd item from the left). The page itself is dedicated to “TRY IT OUT” with various ways you can sign up.

Summary

We looked at 10 big US sites and 5 startup sites. Within the top 10 US sites, there were 5 sign ins, 3 sign ups, and 2 ties. Within the arbitrarily selected startups, all 5 were sign ups. This makes sense since websites start out and assume that visitors don’t have an existing account. As sites become mainstream, they make the assumption that most people visiting already have an account. If the site doesn’t require user features (Google, Youtube, Wikipedia), you can start using the site right away. If the site practically requires user features (Facebook, Twitter, LinkedIn), they offer both Sign Up and Sign In options.

Choosing to feature Sign Up versus Sign In is interesting since it is a big step for a startup to de-prioritize new users (Sign Up). I don’t have the data, but I would be interested in when sites like Youtube, Yahoo, etc. switched from featuring “Sign up” to “Sign in”.

All of the top US sites we looked at mentioned “Sign in”. All of the startups we looked at prioritized “Sign Up”. Looking at what company’s deem important to draw your attention and place on the homepage is very revealing.

Standing on the Shoulders of Documentation

sprout123

Learning how to build a simple iOS app has not been bad. There’s a lot of learning how to find things in Xcode (protip: get a 2nd screen) and familiarizing myself with UIKit conventions. I completed the bitfountain iOS 7 course and have subscribed to more iOS newsletters than I care to admit.

At a meetup last year, I had a discussion about my choice to start with Objective-C. He asked me why I didn’t jump into Swift or use a tool like PhoneGap. Fast forward several months to today, I’m very happy I went with Objective-C. Whenever I am unsure how to do something in Objective-C, there are endless helpful blog posts and StackOverflow discussions out there. Even blog posts written before 2010 can be helpful. I am truly standing on the shoulders of all those heroic individuals who’ve tread down the path before me years ago.

With Swift, I’m sure there’s great documentation out there, but my guess is that Swift today (the beginning of 2015) cannot compete with the thoroughness of Objective-C edge cases discussed on the Internet.

Access to simple, basic questions like converting a NSUInteger to a NSNumber are essential for those just starting out. I’d like to use the example of an extremely beginner friendly resource, RailsCasts, which taught you how to use run of the mill gems, like Devise, and helped create a new generation of developers. Without a wealth of beginner accessible resources, a language or framework can’t grow or grow as fast.

New Bro: Double Bro Seven

Broforce is a satire of over the top ‘MURICA. It has different bros that let you play as different famous movie characters. The latest being Double Bro Seven!

doublebro7bro

In the Double Bro Seven update on 12/18/2014, the Special Command has been updated to depict each Bro’s currently remaining special ability. Double Bro Seven seems to be unique so far as the only one to have different Special Commands, whereas the others have one Special Command that is repeated a certain number of times. Also, this patch released a Christmas theme in the form of Christmas trees, presents, etc.

Distracted Gaming

728751_19556269

Modern gaming is often filled with bogus achievements. Start the campaign? Achievement. Get max upgrades on your pistol? Achievement. Often, a game will show you your percentage completed. If you casually play through, you may get 40% complete. If you traverse the map for hidden collectibles and beat the game on different difficulties, you can get 100%.

While this is fun for college students or those who enjoy following a guide to find all the secrets, the rest of us don’t have time for that. We play games for reasons like gameplay, escapism, and socializing.

I can’t count the number of times, I’ll be playing as the protagonist and clear out a room full of bad guys. The building is on fire and the accompanying AI is telling me we have to get out of here. Instead of running through the open door to the next area, I stop and scour every nook & cranny for obscure loot. Crawling around dark corners, running along the walls, and checking every desk for hidden items. Repeat for every room in the game.

Do you see a problem here? It’s game breaking distraction. It kills the fantasy and immersion. Developers spend years crafting beautiful, immersive maps only to have players break the immersion by constantly doing things that don’t fit the narrative.

It could be a zombie outbreak, a space ship on fire, or a warzone. As the main character, you spend a significant amount of time thinking about the map layout to try and find all the collectibles. Enemies and puzzles are a second thought as you face the fear of missing out if you didn’t check every side room or alternate pathway.

Depending on the setting, it could work out. With franchises like Tomb Raider or Uncharted, you’re a treasure hunter and finding treasure is what you do. Even then, finding a rare tribal necklace in the janitor closet on the ship breaks immersion.

I assume developers add arbitrary collectibles and achievements to pad their gameplay hours on the box description (or product page). When the single player campaign can be beat in 5 hours, the game can be marketed as having 20 hours of content by adding secrets to each map.

Developers, I play your game for the gameplay. Not to check every corner of the map to pad my achievements, which are points that don’t mean anything. Focus on nailing the crisp gameplay. Don’t distract me by making me constantly worry if I have missed out on hidden collectibles.

 

iOS Programming

I’ve started learning iOS programming. Objective-C seems very low level, but it’s alright as an older object oriented language. Learning the Apple frameworks seems to the be tricky part. There’s a lot for me to learn with using Xcode (since I don’t normally use IDEs) and frameworks like Cocoa Touch.

I spoke to someone recently who suggested skipping Objective-C and going directly to Swift. Or even a tool like PhoneGap. Personally, I side with Aaron Hillegass’ take:

I have three messages for these people:

  • If you want to be an iOS developer, you will still need to know Objective-C.
  • Objective-C is easier to learn than Swift. Once you know Objective-C,
  • it will be easy to learn Swift.

To take a longer perspective on iOS, I want to build my foundation up from Objective-C to iOS. This is similar to how learning Ruby is critical for being a Rails developer.

With that said, I’m eager to get my hands dirty with iOS prototypes through different online courses.

Maptime Movement

I’ve attended Maptime in both NYC & LA. Each location seems to make the event their own. If you’re interested in maps, you should definitely check out a local Maptime event.

maptime

In NYC, we worked on different mapping challenges (subway maps, D3.js, etc.). In LA, we went over using git & Github.

True Business

I recently read The Box by Marc Levinson.

Marc brings out this excellent insight about Malcom McLean, a pioneer in containerization (using Shipping Container to modularize transport & avoid break bulk):

Malcom McLean’s real contribution to the development of containerization, in my view, had to do not with a metal box or a ship, but with a managerial insight. McLean understood that transport companies’ true business was moving freight rather than operating ships or trains.

As the excerpt says, a shipper’s business is about transporting goods and not operating ships. I’d like to draw a parallel to web development. Developers need to know how to build & maintain websites, but the true business side of web development is about providing services to visitors.

Gogo Inflight Internet Prices – US Airways

Posting this since I wanted to know roughly how much you would save by buying wifi BEFORE your flight (or inflight). And I didn’t find a good source for this while searching.

Buying in advance Prices

preflight_v2

Buying inflight Prices

inflight_v2

The difference

1 Hour – $5 preflight vs $8 inflight

All day – $16 preflight vs $22.95 inflight

Also, here’s some more US Airways / American Airlines inflight prices:

inflight_extras_v2

How to unit test your JS and use it in the browser

Intro

Recently, I wanted to add test coverage to Halloween Bash and keep using it in the browser. This doesn’t seem to be an unreasonable request, but it turns out that it involves many things. You have many choices of test runners & testing frameworks, and I didn’t want to setup a [cci]SpecRunner.html[/cci] to unit test my JS.

The setup that I ended up using is:

What you’ll need:

  • Your HTML/JS project (You can use my demo project)
  • NodeJS (I recommend the Installer from the Node homepage – click “Install”)

Try out the demo app that squares your input.

With my demo, my file structure looks like:

index.html
assets/js
assets/css

There are countless ways to organize your non-html assets, and my demo asset structure is intended to be easy to follow.

My demo contains jquery and two unit testable lib functions (multiply & square):

// define multiply()
window.unitTestJsDemo.multiply = function(x, y) {
  return x*y;
};

// define square()
window.unitTestJsDemo.square = function(x) {
  return unitTestJsDemo.multiply(x, x);
};

Setup NodeJS & GulpJS

Once NodeJS is installed on your machine, setup your node environment:

npm init

The [cci]npm init[/cci] command will walk you through your project, ask you a series of questions, and setup your configuration in [cci]package.json[/cci].

Next, setup Gulp via npm on your command line:

// Install gulp globally
npm install -g gulp

// Install gulp in your project devDependencies
npm install --save-dev gulp

// Create a gulpfile.js at the root of your project
touch gulpfile.js

// gulpfile.js file contents
    var gulp = require('gulp');

    gulp.task('default', function() {
      // place code for your default task here
    }); 

// Run gulp default task
gulp

You now have Node & Gulp setup to run your Gulp tasks. The default Gulp task doesn’t do anything, but you can try it out by running [cci]gulp[/cci].

Setup gulp-jasmine

Save gulp-jasmine into your gulpfile.js:

npm install --save-dev gulp-jasmine

Create your tests:

mkdir -p assets/js/spec/lib
touch assets/js/spec/lib/multiply-spec.js
touch assets/js/spec/lib/square-spec.js

[cci]assets/js/spec/lib/multiply-spec.js[/cci] will contain:

/* jslint node: true */
/* global describe, it, expect */

"use strict";

var multiply_lib = require('../../lib/multiply');

describe("#multiply", function () {
  it("returns the correct multiplied value", function () {
    var product = multiply_lib.multiply(2, 3);
    expect(product).toBe(6);
  });
});

[cci]assets/js/spec/lib/square-spec.js[/cci] will contain:

/* jslint node: true */
/* global describe, it, expect */

"use strict";

var square_lib = require('../../lib/square');

describe("#square", function () {
  it("returns the correct squared value", function () {
    var squared = square_lib.square(3);
    expect(squared).toBe(9);
  });
});

Next, we’re going to move the unit testable functions (multiply & square) into node.js-style modules.

mkdir assets/js/lib
touch assets/js/lib/square.js
touch assets/js/lib/multiply.js

[cci]assets/js/lib/multiply.js[/cci] will contain:

exports.multiply = function(x, y) {

  "use strict";

  return x*y;
};

[cci]assets/js/lib/square.js[/cci] will contain:

var multiply_lib = require('./multiply');

exports.square = function(x) {

  "use strict";

  return multiply_lib.multiply(x, x);
};

Update your [cci]gulpfile.js[/cci] to run the tests:

"use strict";

// Include gulp
var gulp = require('gulp');

// Include plugins
var jasmine = require('gulp-jasmine');

// Test JS
gulp.task('specs', function () {
    return gulp.src('assets/js/spec/lib/*.js')
        .pipe(jasmine());
});

// Default Task
gulp.task('default', function() {
  // place code for your default task here
});

gulp.task('default', ['specs']);

You’ve created your libs (multiply & square), the lib specs (multiply-spec.js & square-spec.js), and setup Gulp to run your tests with Jasmine.

[cci]square.js[/cci] is setup to use the [cci]multiply.js[/cci] lib through the Node require module syntax. Woot!

You can run the default task, which is setup to run your specs task. It should look like:

$ gulp
[16:29:18] Using gulpfile your/path/unit-test-js-demo/gulpfile.js
[16:29:18] Starting 'specs'...
[16:29:18] Finished 'specs' after 44 ms
[16:29:18] Starting 'default'...
[16:29:18] Finished 'default' after 20 μs
..

Finished in 0.008 seconds
2 tests, 2 assertions, 0 failures

Great! Your modules are unit tested (feel free to add more tests), and you want to use them in the browser.

Browserify your JS

Up to this point, we’ve been using jQuery through our local file at [cci]/assets/js/jquery-1.10.2.min.js[/cci]. We’ll want to get rid of managing jQuery ourselves and let Node manage our jQuery dependency.

Let’s create a new file for our page’s JS to organize itself around:

touch assets/js/app.js

Add jQuery to your dependencies and remove your local copy of jQuery:

npm install --save-dev jquery
rm assets/js/jquery-1.10.2.min.js

[cci]assets/js/app.js[/cci] will contain:

var $           = require('jquery');
var square_lib  = require('./lib/square');

$(function() {

  "use strict";

  $("#squareValue").change(function() {
    var $this       = $(this),
        squareValue = $this.val(),
        squareResult;

    // if squareValue is not numeric
    if (isNaN(squareValue)) {

      $("#squareResult").html('N/A');
      return false;

    // else squareValue is numeric
    } else {

      squareResult = square_lib.square(squareValue);
      $("#squareResult").html(squareResult);
      return true;
    }
  });

});

Now we need to use Browserify to build our JS file with gulp.

Add Browserify related dependencies into your gulpfile and setup your new task:

npm install --save-dev gulp-uglify
npm install --save-dev vinyl-source-stream
npm install --save-dev gulp-streamify
npm install --save-dev browserify

Update your [cci]gulpfile.js[/cci] to include the new browserify task:

"use strict";

// Include gulp
var gulp = require('gulp');

// Include plugins
var jasmine     = require('gulp-jasmine');
var uglify      = require('gulp-uglify');
var source      = require('vinyl-source-stream'); // makes browserify bundle compatible with gulp
var streamify   = require('gulp-streamify');
var browserify  = require('browserify');

// Test JS
gulp.task('specs', function () {
    return gulp.src('assets/js/spec/lib/*.js')
        .pipe(jasmine());
});

// Concatenate, Browserify & Minify JS
gulp.task('scripts', function() {
    return browserify('./assets/js/app.js').bundle()
        .pipe(source('all.min.js'))
        .pipe(streamify(uglify()))
        .pipe(gulp.dest('./public/'));
});

// Default Task
gulp.task('default', function() {
  // place code for your default task here
});

gulp.task('default', ['specs', 'scripts']);

You’ll notice that we did a few things: declare new modules at the top through [cci]require[/cci], add a new gulp task called [cci]scripts[/cci], and update the default task to run our JS specs & scripts tasks.

At [cci]public/all.min.js[/cci], your new JS is ready to use in your browser.

Let’s remove the old file and update our [cci]index.html[/cci] to use our new minified JS:

rm assets/js/main.js 

Remove the following lines from [cci]index.html[/cci]:

< script src="assets/js/jquery-1.10.2.min.js">
< script src="assets/js/main.js">

Add the following line into [cci]index.html[/cci]:

< script src="public/all.min.js">

Voila! Open up [cci]index.html[/cci] in your browser and your [cci]square()[/cci] function is working again.

Conclusion

GulpJS is an amazing tool to run tasks, and the Gulp streaming build system is very easy to read and understand.

There are countless tasks that you can setup on Gulp to lint your JS, compile your sass, etc. Livereload is useful for front end development.

Hopefully, the Unit Test JS demo helped you understand a simple example of using Gulp to run Jasmine unit tests and use the tested JS in your website.

SCARF: a brain-based collaboration model

At YC’s Startup School NYC, Shana Fisher brought up an amazing resource called SCARF.

SCARF stands for Status, Certainty, Autonomy, Relatedness and Fairness.

With these five areas, stands positive (approach) and negative (avoid) modes of interacting with people. As the title says, SCARF is based on neuroscience research to correlate human interaction & collaboration with physical brain activity.

When you are being threatened with a SCARF metric, you will perform worse (due to “less oxygen and glucose available for the brain functions involved in working memory“). On the contrary, when you have an opportunity to increase a SCARF metric, you perform better since you don’t have decreased cognitive resources.

There are lots of findings and useful applications, so I encourage you to read about SCARF.