Thursday, July 30, 2009

Iron Man Perl, redux.

Badges? We ain't got no badges. We don't need no badges! I don't have to show you any stinkin' badges!

Matt Trout writes in his blog about almost being done with the Iron Man Perl Judging software. He wrote his beautiful modern perl code to pass a suite of tests. But when he put it all together, the system didn't work. So he put out an open call to find out what's up.

This seemed like a good opportunity to do something useful for the community. Also, a chance to read some modern, moose-y perl, and do my first git checkout. Oh, and do some debugging.

I spent much of Saturday afternoon hitting "Y/Ret" in cpan to get my 5.10 debian install up-to-date with the moose core. Once I got my system up-to-date, I started running his tests. Sure enough, most of them passed. One of them didn't clean-up well so failed on subsequent runs. But that was minor.

I started by digging into the heart of the matter. The test calculate.t that verified the date calculation routines. Why did the tests pass and not with the demo data later via plagger_loader.t? I squirelled through the rest of the code, squinting at all the new funny moose bits and got a overall view of the plan.

By now it was late Saturday night, and I was having trouble sleeping. My mother-in-law was visiting, so we'd given her the bed and I was on the couch in the living room. By Santa Monica standards it was super hot (maybe 80F). Since I couldn't sleep, I pulled the laptop back out and jumped back to check one more hunch: "what is the difference between the data for calculate.t and plagger_loader.t?"

AHA! The age-old problem of real world data not being nearly as pretty as test data. All of the post data created in calculate.t was neatly sorted by increasing age. The csv data, plucked from real logs, was a hodgepodge of sorting. Maybe it was alphabetical, but it sure wasn't reverse chronological.

A quick change was called for: Sort the data by reverse date. Where to slip this into the API? 1) Sort the post order when reading the CSV in plaggerloader? 2) sort the post array in Calculate.pm, either in check_both or check. Which change matches the intentions of the API designer? I don't know, that's up to you, Senor Trout.

This experience gave me my first interaction with git. See the next post for my blog entry on cloning remote read-only git to github.

These changes are now up on github.
http://github.com/spazm/Iron-Munger/tree/master

In the mean-time, here's the ghetto-diff version:

PlaggerLoader.pm
Synopsis: add sort { $b->at <=> $a->at }

method _expand_posts_from_file(IO::All::File $file) {
    return [
      sort { $b->at <=> $a->at }
      map $self->_expand_post($_),
        @{$self->_expand_postspecs_from_file($file)},
    ];
  }
Calculate.pm
Synopsis: add my @sorted_posts = sort {$b->at <=> $a->at} @posts; and call check on @sorted_posts instead of @posts.
sub check_both ($check, @posts) {
  my @sorted_posts = sort {$b->at <=> $a->at} @posts;
  return min(
    $check->(1, 10, @sorted_posts), # 10 days between posts
    $check->(4, 32, @sorted_posts), # 4 posts within any given 32 days
  );
}

There is something very satisfying about spending a day or more debugging in a process that eventually ends with adding five lines to the primary code base. It's a feeling of having cut through the accidental complexity to the heart of the matter. Finesse vs Force. Good thing I don't get paid by the KLOC.

Hope this helps! Now when do we get our badges?

Tuesday, July 28, 2009

perler

Perler, I must say I've never heard this term before the most recent Mongers, when it was brought up as some sort of perlish epithet. Tommy and I had some fun tossing it back and forth afterwards. Along with our plans to release "blah module TWO", as in "oh yeah, I already have that fixed in <legitmate module><TWO>." Ok, maybe you had to be there. So you should come, next time around. Fourth Thursday in August.

I haven't been able to stop thinking about it. perler perler perler. Not having a backstory, I think it's cute. Maybe it's time I "took it back!" ?

(yeah, it's been 10 days... oops)

Saturday, July 25, 2009

Slack by Tom DeMarco

I checked out Tom DeMarco's a new book from our company library and started reading last night. I'm about half way through, and I've already had to put it down a couple of times to either nod in affirmation, "Amen, Brother!" or to vent when reminded of workplace ineffectiveness.

Slack : getting past burnout, busywork and the myth of total efficiency is aimed at busy people meant to be "read[able] cover-to-cover on a flight from NY to Chicago." Don't let the slenderness of this 200 page paperback fool you, there is substance contained within. This mirrors the message of smarter work, and avoiding busyness for busyness's sake.

What is Slack? In the prelude, Tom defines for us, "Slack: The unfortunate tradeoff between efficiency and flexibility." Later we expand to "time slack" and "control slack", available looseness in the time or control model that enables the knowledge worker to improve their work, prepare for coming work and generally be more effective and responsive. We can get more efficient in the near term by squeezing out slack but we lose the ability to react and change. In essence helping the bottom-line this year by killing our ability to meet the bottom-line next year.

Squeezing out slack in the name of efficiency is another in line of short-term optimizations that improve short term efficiency but don't improve effectiveness. The thesis here is that if we over-optimize in the short term, we lose the ability to think, plan and prepare.

So far, we've already seen: why overtime is bad for the employee and for the company, why a "hurry up, be busier" mantra can lead people to work slower, the operational cost of turnover, how to recognize and avoid a culture of fear, the costs associated with made-up/over-aggressive schedules, and the myth of the fungible resource. And that's just in the first hundred pages!

More coming once I finish part II, and move on to parts III and IV.

Overview:
Part I: Slack
Part II: Lost, but making good time
  (The effect of stress on organizations)
Part III: Change and Growth
  (The difference between companies that can learn and those that can't)
Part IV: Risk and Risk Management
  (Why running away from risk is a no-win strategy)

Wednesday, July 22, 2009

new url -- www.LowLevelManager.com

We have a new domain: www.LowLevelManager.com!

This is a little easier than remembering the .blogspot.com address, and will allow me to someday move this off of proprietary google blogging software to an open source perl solution. One of these days.

Update your bookmarks! (the old address will still work)

Saturday, July 18, 2009

New Catalyst Book

Catalyst Book Cover There's a new catalyst book out, The Definitive Guide to Catalyst: Writing Extensible, Scalable and Maintainable Perl–Based Web Applications.

Update: Buy through This Link and the referral money will go to the Enlightened Perl Organisation.

I'm looking forward to going to my local bookstore and flipping through it. It looks pretty good from the Table of Contents. The authors are Kieren Diment and Matt Trout. I've heard of Trout and the good work he does over at Shadowcat. I hope it's awesome so I can buy a copy.

I definitely feel like I've blundered through Authentication and Authorization before with a variety of frameworks, that's the sort of think where I want to plug in an obvious system for Authentication, and then build appropriate Authorization rules without shooting myself in the foot. Let's hope this can help walk me through that part.

Page 28 in chapter 2 starts a section on "Object Oriented programming with Moose," so that sounds pretty cool.

Table of Contents
  1. Introducing the Catalyst Web Application Framework
  2. Catalyst Setup and Background Knowledge
  3. Your First Catalyst Application
  4. Extending LolCatalyst-lite
  5. Deployment
  6. Database Models
  7. The Catalyst Dispatcher
  8. Authentication and Authorization
  9. Interacting with Web Services in your Applications
  10. Extending Catalyst
  11. Catalyst Cookbook
  12. The Reaction Component UI Framework
  13. Compiling your own Perl
  14. Making your own CPAN Mirror with CPAN::Mini or minicpan.sh

Sunday, July 12, 2009

July Los Angeles Perl Mongers Meeting -- Thu Jul 16

Hello Los Angeles!

What: Los Angeles Perl Mongers Meeting
When: 7-9pm
Date: Thu, July 16, 2009.
Where: The Rubicon Project HQ - 1925 S. Bundy, 90025
Theme: Perl!
Food: Pizza and BEvERages provided.
RSVP: Responses always appreciated.

Presentations:

  1. Mojo and Mojolicious -- A next generation web framework for the Perl programming language. Presentation and examples. (Xantus).
  2. Either:
    • Interviewing perl programmers -- How to find the best: what to look for, what to ask, what to say: a Q&A. (Mon-Chaio Lo)
    • Continuous Integration and testing. (Mon-Chaio Lo)

About our speakers:

David W Davis is a software engineer who specializes in rich front-end applications and scalable back-end servers. He has a special interest in Comet, WebSockets and various other emerging technologies. He is currently rewriting his cometdesktop project using the mojo web framework.

Mon-Chaio Lo is a Software Engineer and Team Lead at the Rubicon Project. He is a fan of TDD and agile methodologies. He was previously at CarDomain.com leading a Ruby team.

About your host:

  • Andrew Grangaard is a Senior Software Engineer at the Rubicon Project, and long time Perl Monk(ey).
  • The Rubicon Project (http://www.rubiconproject.com)
    The Rubicon Project is an Advertising Technology Company headquartered in Los Angeles. Their mission is to automate the selling and buying of online advertising.

See you at 7 on Thursday the 16th.

View Rubicon Project in a larger map

Thursday, July 9, 2009

Perl Monks and Mongers

Tired of being a "Level 1: Initiate" at perl monks, I spent a few hours yesterday answering incoming questions. Answering other people's code questions can be super fun, especially when I'm laying in bed waiting to get over a cold.

I'm really happy with how my Hash walker with closures turned out.

When I left to drive up to the Thousand Oaks Perl Mongers meeting, I was at 18 points. When I checked afterward, I'd been bumped up to 20 points -- the threshold for Level 2: Novice. Now I get two votes to mod up&down other posts. FEEL THE POWER!(my perl monks profile).

The TO perl mongers meeting was fun. Aran Deltac talked about his experience at YAPC and then Shawn Faison talked about Genetic Programming, evolving programs through iterated competition with mutation and crossover. I liked that he was talking about something he's doing on his own time for fun because he finds it interesting. Fascinating stuff.

Shawn also mentioned a desire to have a perl 6 / rakudo hackathon at one of the PM meetings. He got a response on his blog from Patrick Michaud (PM), the Pumpking of Rakudo! So now we totally have to do it!

Monday, July 6, 2009

pretty printing perl with enscript

I've been using enscript for years to format source code for printing. In particular the -2Gr flags for two-up, landscape prints with "Fancy header".

I recently found there are some colorization flags, -E for syntax highlighting and --color for colored syntax highlighting. -E can take an optional lang flag, perl in our case.

So now my pretty printer uses 'enscript -2Gr --color -Eperl' to create the postscript file and then ps2pdf to dump to pdf.

My perl wrapper and self-referential pdf output. Script requires enscript to be installed.

This is the shell code that the wrapper ends up evaluating:

enscript -MLetter -Gr2 --color -Eperl 'code_to_pdf.pl' -p - | ps2pdf - "$HOME/public_html/pdf/code_to_pdf.pdf"

% enscript --help-highlight |egrep '^Hi|^Name|^Desc|^$'
Highlighting is supported for the following languages and file formats:

Name: ada
Description: Ada95 programming language.

Name: asm
Description: Assembler listings.
Name: awk
Description: AWK programming language.

Name: bash
Description: Bourne-Again shell programming language.

Name: c
Description: C programming language.

Name: changelog
Description: ChangeLog files.

Name: cpp
Description: C++ programming language.

Name: csh
Description: C-Shell script language

Name: delphi
Description: Delphi programming language.

Name: diff
Description: normal diffs

Name: diffs
Description: side diff

Name: diffu
Description: unified diffs

Name: dylan
Description: Dylan Programming Language template for Enscript.

Name: eiffel
Description: Eiffel programming language.

Name: elisp
Description: Emacs LISP.

Name: forth
Description: Forth Programming Language.

Name: fortran
Description: Fortran77 programming language.

Name: fortran_pp
Description: Fortran77 programming language with cpp-statements

Name: haskell
Description: Haskell programming language.

Name: html
Description: Hypertext markup language HTML.

Name: icon
Description: Icon Programming Language.

Name: idl
Description: IDL (CORBA Interface Definition Language)

Name: inf
Description: GUI INF Script language

Name: java
Description: Java programming language.

Name: javascript
Description: JavaScript language.

Name: ksh
Description: Korn shell programming language.

Name: lua
Description: Lua Programming Language template for Enscript.

Name: m4
Description: macro processor

Name: mail
Description: Mail and news articles.

Name: makefile
Description: Make program's definition files.

Name: matlab
Description: Matlab programming language.

Name: nroff
Description: Manual pages formatted with the nroff program.

Name: oberon2
Description: Oberon 2 Programming Language.

Name: objc
Description: Objective-C programming language.

Name: outline
Description: Outline text.

Name: oz
Description: Mozart/Oz Programming Language.

Name: pascal
Description: Pascal programming language

Name: perl
Description: Perl programming language.

Name: postscript
Description: PostScript programming language.

Name: pyrex
Description: Pyrex - a Language for Writing Python Extension Modules

Name: python
Description: Python programming language.

Name: rfc
Description: RFC and Internet Draft reformatter.

Name: ruby
Description: Ruby programming language.

Name: scheme
Description: Scheme programming language.

Name: sh
Description: Bourne shell programming language.

Name: skill
Description: Cadence Design Systems lispy language.

Name: Smalltalk
Description: Smalltalk Programming Language.

Name: sml
Description: Standard ML Programming Language.

Name: sql
Description: Sybase 11 SQL.

Name: states
Description: States program's definition files.

Name: synopsys
Description: Synopsys dc shell scripting language

Name: tcl
Description: Tcl programming language.

Name: tcsh
Description: TC-Shell script language

Name: tex
Description: TeX/LaTeX command, comment and math highlighting.

Name: vba
Description: Visual Basic (for Applications)

Name: verilog
Description: Verilog hardware description language

Name: vhdl
Description: VHSIC Hardware Description Language (VHDL)

Name: vrml
Description: Virtual Reality Modeling Language (VRML97)

Name: wmlscript
Description: WMLScript language.

Name: zsh
Description: Z-shell programming language.

Wednesday, July 1, 2009

returning apache 204

"Can you return an HTTP 204 (no content) response from vanilla apache, from within the conf file? For any request that matches a regex?" asked my coworker. It seemed simple enough.

A quick search showed people building little cgi scripts to fork off. That seemed like wasteful overhead, especially since this was basically to be used as a kill switch to lessen a potential data flood.

Ask Apache has a nice list of all available HTTP response codes and had a link to mod_alias redirect, which is right next to the docs for RedirectMatch

Other status codes can be returned by giving the numeric status code as the value of status. If the status is between 300 and 399, the URL argument must be present, otherwise it must be omitted. Note that the status must be known to the Apache code (see the function send_error_response in http_protocol.c).
Putting together the Redirect documentation with the RedirectMatch documentation, we see that yes, we can send a custom 204 back. Here is a quick example that responds with 204 to any request matching foo with any characters after it.
#RedirectMatch example using mod_alias
RedirectMatch 204 foo(.*)$

His next question was more difficult, "If we're using rewrite rules and redirect match, which one 'wins' if they both match the same url? We're using [L] in rewrite rules to force matches". That one I'm still wondering about.

Redirect directives do take precedence over other mod_alias directives, like Alias and ScriptAlias:

Note: Redirect directives take precedence over Alias and ScriptAlias directives, irrespective of their ordering in the configuration file.

Monday, June 29, 2009

July LA Perl Mongers Meeting.

Next LA perl mongers meeting: Thursday, July 16, 2009.

Open call for presenters:


What have you done recently with Perl? Come tell your friends and lets all learn together.


What: LA Perl Mongers Meeting
When: 7-9pm
Date: Thu, July 17, 2009
Where: The Rubicon Project HQ - 1925 S. Bundy, 90025
Theme: Perl!
Food: Pizza and beverages provided.
RSVP: Responses appreciated.

June Perl Mongers recap

"Thank you!" to all who came out to the June meeting. We had nearly 20 people and two excellent presentations.

David's talk challenged the common belief that "Perl is Slow" and sparked an excellent discussion that ranged from data models, snowflake schemas and pure perl olap cubes and off to Bloom filters, scaling horizontally vs vertically, hadoop/hbase and onwards. To paraphrase: Make it as simple as possible (elegance) and think about every speed consideration (diligence).

Matt's presentation was packed as he demonstrated the technologies and ideas behind his latest project. We got to see a lot of live code and patterns in action. Touching on Moose, MooseX::Storage, KiokuDB, Coro, Continuity, Mason, JSON, AnyEvent, Moose::Object::Pluggable, Process, HTML::Seamstress, HTML::Tree, HTML::Element, Net::Server, IPC::Cmd, jquery and Joose. Then gluing it all together and testing it. Here's the pdf cheatsheet from his talk.

In between speakers we continued the discussion while we munched pizza and raided the beer fridge. We had a fun cross section of people, those who signed in to show support: Gray, HSiegel, Jordan, David, David, Matt, Allen and others). Eric and his coworkers from Campus Explorer even drove to Santa Monica on their work-from-home-Wednesday. Rubicon Project, thanks for the support, location, food and vibe.

Can't wait to see you all in July.

Friday, June 19, 2009

Using Apache::Test with Test::Class

I've recently switched from simple Test::More scripts to trying Test::Class. I'm also revisiting some apache module testing with Apache::Test and friends. Today I tried to merge the two.

With Test::Class, you make a test runner script that imports modules and then executes tests. The tests are defined in modules, and then run in module import order by the Test::Class test harness. Test::Class has some nice convenience methods and sugar. You defined test subroutines by adding :Test(n) where n is the number of tests run in the method. Methods can be tagged to run at the start and finish of each test as well as at startup and shutdown, and you get a handy $self object passed around to the methods that you can use to store configuration and etc.

With Apache::TestRun, the standard boiler plate is to create a TEST.pl script which isa Apache::Test and calls __PACKAGE__->run_tests, which then runs all the .t tests in the directory.

To get them working together, I've created two wrappers. TEST.pl uses Apache::TestRun and then I have a test_wrapper.t which uses Test::Class and loads my tests where are defined in modules.

As I get this smoothed out a bit, I'll update. I've been planning to write a talk on "Using Apache::Test to test Apache modules" talk to have handy in case I need something for perl mongers or similar. I think adding Test::Class to the mix will nicely improve the signal-to-noise, assuming I can get it worked out in a non-cludgey manner.

#!/usr/bin/perl

use strict;
use warnings FATAL => 'all';

use FindBin;
use lib "$FindBin::Bin";

package My::TestRun;
use base 'Apache::TestRun';
use Apache::TestConfig;
__PACKAGE__->new->run(@ARGV)

Monday, June 15, 2009

Smart::Comments

Here's a quick example of Smart::Comments. I originally planned to have a Getopt::Long flag to turn smart comments on-and-off, but that doesn't work due to the way Smart::Comments uses filters and where that happens in the compile&run cycle.

This example code still serves as a nice boilerplate for Getopt::Long and Pod::Usage.

The following script shows debugging behavior if the environment variable Smart_Comments is set to a 1.

Ex: Smart_Comments=1 ./smart-comments-example.pl
### Base Smart Comments - Show variables
### $help: 0
### $man: 0
### $DEBUG: 0

### @array: [
###           1,
###           2,
###           3,
###           4,
###           5,
###           6,
###           7,
###           8,
###           9,
###           10
###         ]
Debug output of variables is neat and worth the price of admission. "### $help" in the code turns into "### $help: help_value" during output. Arrays get dumped via Dumper. And all of this code output is on STDERR and prefixed with three hashes -- so it'll get ignored by the Test Any Protocol if it gets triggered by your unit tests.

Add to that cute progress bars that are only around when people want them? Sweet.

It sure would be nice to have an explicit flag to set/unset the smart comment level, but I don't think that's possible the way it smart comments is implemented as a filter.

Fun for personal code and scripts, but I don't think I'd use it in production, without looking a bit closer under the hood to see what (if any) affect it has when used with -ENV and with the ENV variable not set.

#!/usr/bin/perl

use strict;

use warnings;

use Getopt::Long;
use Pod::Usage;
use Smart::Comments -ENV;

my $help  = 0;
my $man   = 0;

my $DEBUG = 0;

my $result = GetOptions(
 'help|?' => \$help,
 'man'    => \$man,
 'debug'  => \$DEBUG,
);
pod2usage(1) if ( $help or !$result );
pod2usage( -exitstatus => 0, -verbose => 2 ) if $man;


my $quiet = $ENV{Smart_Comments} ? 0 : 1;

#### Base Smart Comments - Show variables
### $help
### $man
### $DEBUG
my @array = ( 1 .. 10 );
### @array

print "Now running 4 runs through the slow loop\n" if $quiet;

#### <now> Slow Array 1 at <line>...
for my $num (@array) {    ### Slow array1...       done
 ### $num
 sleep 1 if $num % 4;
}


#### <now> Slow Array 2 at <loc>...
for my $num (@array) {    ### Slow array2--->       done
 sleep 1 if $num % 4;
}


#### <now> Slow Array 3 at <place>...
for my $num (@array) {    ### Slow array3 [===|   ] [%] done
 sleep 1 if $num % 4;
}


#### <now> Slow Array 4 at <where>...
for my $num (@array)
{                         ### Slow array4===[%]       done
 sleep 1 if $num % 4;
 print "$num\n";
}

__END__

=head1 NAME

smart-comment-example - Using Smart::Comments with Getopt::Long (and Pod::Usage)

=head1 SYNOPSIS

smart-comment-sample [options]
 
 Environment
  Smart_Comments  Set the environment variable Smart_Comments = 1 to enable comments.

 Options: 
  --help         brief help message
  --man          full documentation
  --DEBUG        increase debug level

=head1 OPTIONS

=over 4

=item B<--help>

Print a brief help message and exit.

=item B<--man>

Print the manual page and exit.

=item B<--DEBUG>

Affect the DEBUG/verbose level

=back

=head1 DESCRIPTION

B<This program> will demonstrate smart comments (Smart::Comments) as well as
boilerplate for setting up Getopt::Long with Pod::Usage

=cut

organizing: less fun than coding.

I finally emailed the Thousand Oaks perl mongers list about the June LA Perl Mongers Meeting. We crossed wires and it didn't get announced at TO.PM last Wednesday.

I just talked with Matt Burns and he assures me his presentation is coming along nicely. Now it is time to follow-up with David about the other presentation.

Maybe after all this organizing I'll get to write some perl?

Saturday, June 6, 2009

June Perl Mongers Meeting.

Hello Los Angeles!
I am pleased to announce a Los Angeles Perl Mongers Meeting:

What: Perl Mongers Meeting
When: 7-9pm
Date: Wed, Jun 17, 2009.
Where: The Rubicon Project HQ - 1925 S. Bundy, 90025
Theme: Perl!
Food: Pizza and Pop provided. Responses appreciated.

Speakers:

  1. Data processing and Numerical Analysis in Perl (David Williams)
  2. Moose and Joose -- Programming is (more) fun again. (Matthew Burns)

About our speakers:
David Williams is a Senior Software Engineer and Researcher at the Rubicon Project, formerly of RAND. He's a mathematician, puzzle solver and perl lover.

Matthew Burns is a Senior Software Engineer at ValueClick / Search123. He has modernized and revitalized the S123 team and product over the past year. He's a magician and great at finding creative ways to plug things together.

About your host:
* Andrew Grangaard is a Senior Software Engineer at the Rubicon Project, and long time Perl Monkey. A Caltech EE, he made the switch from Hardware to Software in 1998 and hasn't looked back.

* The Rubicon Project (http://www.rubiconproject.com)
The Rubicon Project is an Advertising Technology Company headquartered in Los Angeles. Their mission is to automate the selling and buying of online advertising.

See you at 7 on the 17th.


View Rubicon Project in a larger map

Thursday, June 4, 2009

Non-stick is the new sticky

Here at Rubicon Project I've heard the complaint "we have to be more sticky!" The fear being that clients can turn us off very easily just by adjusting tags on their sites. Some people think this means they want a higher barrier to exit.

It's time to turn that idea on its head.

Now, it may be that I'm just a F.O.S.S. junkie, but I tend to avoid software that has strong lock in because I know that I'm going to be trapped if it doesn't live up to the hype. So having lowered perceived stickiness will lower the barrier to entry.

Secondly, if I see a product with low barrier-to-exit and yet it is popular and clients renew and stick with it, I know the clients are staying for quality and not due to a technical lock-in. For me, that is the real stickiness.

When I talked to Damian (Hogan) about this last month, he agreed and expanded to say how true stickiness comes from providing a value proposition where it's worth more for clients to stay than to leave.

And when it comes to that kind of stickiness, we are very, very sticky.

Tuesday, May 26, 2009

Reviving Los Angeles Perl Mongers

The most recent meeting of the Los Angeles Perl Mongers was in April -- of 2008.

I'm planning to start this back up. I was at the Thousand Oaks meeting earlier this month, and it was so nice to be back at a meeting. I've contacted the current head of the email list to get the ball rolling.

There was an impromptu meeting in Burbank a couple of weeks back (the day after the TO meeting, actually). I couldn't make it over there, but it sounds like everyone had a fun time.

But watch this space for details! (or the la.pm.org mailing list, of course).

LA Perl Mongers Meeting
When: TBD (7-9pm)?
Date:  TBD (4th Wednesday)?
Location: The Rubicon Project, 1925 Bundy.  At the interchange of the 405 and the 10.
Speakers/Topics: 
  1) Data processing and Numerical Analysis in Perl (David Williams)
  2) Moose and Joose -- Programming is (more) fun again. (Matthew Burns)
Catering: working on it.

Edit: June 17, 2009 seems to be the front runner in voting, with 100% of the vote.

Friday, March 6, 2009

With all these books, maybe I should just give in and get a Kindle 2.0. I'm torn between the Kindle and a Sony 505, the Kindle has so many buttons, which seems like a downside. But it does bring its own network...

Thursday, March 5, 2009

Reading List

A backlog of books that I've added to my "to-read" list.

Saturday, January 10, 2009

A look inside the Rubicon Project

In late November / early December I was in an interview room with Karim and a potential hire. This was the end of a long day for everyone* and when we asked the candidate if he had any questions for us, he asked an excellent question, "What don't you like here?"

I was a bit taken aback. I really like that style of question, but that's not what surprised me. What surprised me was that I didn't have a ready answer. And then I thought about it, and looked at Karim, and realized my only answers were, "Everything that I've been annoyed with, I've brought up and we are in the process of fixing," and then a weak answer of "We do a lot of interviews, and they take a lot of time that I could be spending coding." That's an excellent question and it felt really great to not have anything to complain about.

I realized that if the worst part of my job was talking to talented candidates to find awesome coworkers, I must have a pretty sweet gig. And I do.

Footnote:

* Our interviews are long and involved.

Now, they're not at the Microsoft or Google multiday level, but they are about half a day of heavy questioning. I'd say three rounds of interviews from your peer engineers, one from head of Development, and lastly a "culture interview" which is traditionally with the CEO or COO.

We want to find good coders who are also team players with good attitude. And they should have a basic vocabulary of design patterns and deep language knowledge of their preferred coding language.