My “Complicated” Work History At Google

Although the asshat who accused me of threatening to shoot him for six weeks has faded away, other asshats are popping up to replace him on Slashdot. One asshat posted comments not to my comments but to the comments that I replied to, but I periodically rechecked older threads and respond to each of those wayward comments. Another asshat complained about my weight (I’m 350 pounds — think football player), my diet (daily calorie intake is 1,500 calories), and why I haven’t committed suicide yet (I’m too sexy die young). One asshat in particular kept misrepresenting my work history with Google in multiple comments, as if I struck a nerve by working at Google. And perhaps I did. Let’s look at my “complicated” work history at Google.

Most people have the erroneous assumption that Google hires only “the best of the best of the best, sir!” (Men In Black) from the leading universities around the world. That’s true for direct hires like engineers and managers. (But maybe not for long, according to Fast Company, as tech companies hire tech workers without four-year degrees to fill their ranks.) Direct hires are a small part of Google. Everyone else who works at Google are hired through vendors for different functions throughout the company.

After I graduated from San Jose City College with an Associate of Science (A.S.) degree in computer programming and made the president’s list for maintaining a 4.0 GPA in my major, a vendor hired me for what was my first of several assignments in 2007-2008. A different vendor would hire me for several more assignments in 2011-12.

2007-2008

I’ve worked in the Google IT help desk call center for seven months from 2007 to 2008. For the first three months, I was in dispatch and routing 300+ tickets per day to the call center techs, fields techs or other groups like facilities. I’ve worked in the call center for the remaining four months, assisting users when I can, opening tickets when I can’t, and doing whatever I can remotely (i.e., installing software, opening network jacks with the correct VLAN, or adding hostnames to DNS). Since the average Googler gains 26 pounds from eating the free food and move their desk every three months, this was a high-paced environment that kept me busy for eight hours a day.

Since the vendor I worked for lost the call center contract to the Indian firm that managed the call centers for Google in India and Europe, a group of us worked in inventory for a month before transferring to a new assignment at eBay. Google at the time hired 300+ people per week. We got shipments of hardware in on Friday and Monday, got everything unboxed and put away by Tuesday, spent Wednesday prepping 300+ systems to go out the door, and loaded up the vans on Thursday mornings for deployment. Before we could take a breather, the cycle started all over again.

As a reward for my brief stint in inventory, I got a Kensington backpack that Google used to give to their new hires back then. Nine years later I’m still using that backpack, now flaying at the edges and falling apart from working all over Silicon Valley.

The Great Recession

I worked at eBay for 13 months before I got laid off on Friday the 13th, February 2009 (my supervisor let me pick the date from a list). That was the beginning of my journey as 99’er in the aftermath of the Great Recession, spending two years out of work (2009-2010), underemployed for six months (working 20 hours per month at a moving company), and filing for Chapter Seven bankruptcy in 2011. When my bankruptcy got finalized in July 2011, I had $25 left in my checking account and a new full-time job at a different vendor to become the lead tech of a PC refresh project at… eBay.

One of the phone guys at eBay gave me a hero’s welcome: “Jesus Christ, if HR let this guy back in, they will hire anyone off the streets.” 

For the next two years (2011-2013) I would work seven days a week to re-establish my finances. I’ve worked over 30+ assignment for three different vendors that competed for my availability. I had a regular Monday-Friday assignment, and a weekend assignment that sometimes starts on Friday nights. Assignments that lasted a week or more went on my resume, shorter assignment that lasted four hours to several days I didn’t bother to keep track.

That would bite me in the ass in 2014 when the two-hour background interview for the security clearance at my current tech job lasted four hours because I had to list every assignment since 2007. Unlike most Fortune 500 HR departments, government investigators checked out every reference and requested credit reports from all three reporting bureaus. They were quite thorough.

2011-2012

When the PC refresh project at eBay had a six-week lull after the holidays, a different vendor offered a one-month assignment at Google to build out a data center. I started working at Google the day after Christmas in December 2011 and finished at the end of January 2012. Unlike my experiences from working at the call center and in inventory, we sat around waiting for parts — servers, switches, routers, twisted-pair and fiber optics cables, odds and ends — to arrive in the morning and spent the afternoon installing everything into the racks.

When the data center got done, the manager took us over to the Google Store to buy something up to $25 in value (I got a pair of Google running shorts) and we had dinner at Building 51 (the former nickname for a sports bar at the edge of the Google campus). I went back to eBay to finish the PC refresh project.

A few months later I would come back to do a one-week cleanup at the data center. Besides throwing out the trash, consolidating equipment on multiple pallets into fewer pallets, and sweeping the floor, I also had to verify that the port mapping info in the spreadsheet was accurate, remove decommissioned servers from the rack, and relocate severs around the data center. Unlike last time, there was no trip to the Google Store or Building 51.

Sometimes being “the best of the best of the best, sir!” at Google is just rolling up your sleeves to do the jobs that no one else wants to do.

Coaching VTA Bus Drivers Again

This morning I stood at the bus stop with the usual suspects waiting for the pre-dawn express bus to Palo Alto. It was five minutes late. We watched in amazement as the express bus drove past us across the street, coming from the opposite direction for the afternoon route. Before the bus could finish turning right on to Southwest Expressway to enter the loop-de-loop at Meridian Avenue and the 280, someone had the VTA customer service number on speed dial and started talking to a customer rep. We shook our heads. This isn’t the first time we had to coach the bus drivers on their new routes.

The Valley Transit Authority (VTA) in Silicon Valley rotates the drivers among the different routes every March and September. This week, the second full week of April and six weeks after the last rotation, some schedules got tweaked and new drivers started on the routes to my tech job in Palo Alto.

The local bus I take to pick up the express bus arrived two minutes earlier on the revised schedule, which meant I had to get out of my apartment five minutes earlier. Some drivers will arrive a few minutes earlier to avoid getting stuck behind the lights at the light rail crossing or take a break at the 7-11 at the next stop. New drivers on new routes are an unpredictable bunch, especially when sticking to the schedule.

The express bus tried to pick us again. Now ten minutes late. The driver probably had to go back out on southbound 280, swung up and around on Bird Avenue, and came back on northbound 280.  Still coming from the opposite direction by taking the Meridian Avenue exit instead of continuing on to Southwest Expressway. The onboard GPS should have given the driver precise directions for getting to this particular bus stop. If the driver is early or late, the GPS gives them a notification. The GPS either not worked or this driver ignored it.

The person on call to customer service got patched through to the driver over the radio. “You stay on that side,” he told the driver, pointing at the other side of the street. “We’re crossing over.”

A half-dozen of us ran across the empty lanes like East Berliners trying to cross the kill zone to West Berlin. The express bus veered across the lanes as if the driver was going to pick us up in the middle of the street, make a U-turn to pick us up from the other side, or just run us over for shakes and giggles. Some of us stopped in the middle lane to make sure that the express bus did stop before we cross over the last lane. We stepped aboard as if we were right on schedule.

Like most bus drivers running late, this driver put the pedal to the metal once we hit the freeway. When we quickly came upon the Page Mill Road exit, and still in the fast lane, people in the back of the bus started shouting directions. We cut through three lanes of traffic in a heartbeat. Once we were on Page Mill Road, the driver remembered the rest of his route. I arrived at my next bus stop to pick up the local bus with a few minutes to spare. Not surprisingly, a new driver learning the route with some coaching from the passengers.

 

The Python Time Zone Rabbit Hole

Thanks to the recent asshat controversy on Slashdot, and a fellow Slashdotter’s request for the link to the comment that prompted the controversy in the first place, I wrote a Python script to scrap my ~8,000 comments from Slashdot to dump into a spreadsheet for future reference. I’m planning to write essays about my various misadventures in Silicon Valley and my comment history is rich treasure trove of stories I’ve written over the years. While working on the script, I came across a programming rabbit hole for converting the timestamp string into a different timestamp string that kept me up for three nights.

The original timestamp that I extracted from each comment was a text string like this, “on Friday April 04, 2017 @06:03PM” (as it appeared on the website), and got written into CSV (Comma Separated Values) file just like that. After the initial script was working, I opened the 5MB CSV file in Excel to scroll through the data and see what I needed to change in the script. The timestamp string wasn’t in a sortable format. I had to change the timestamp into this format: “2017-04-07 18:03:00”. There’s two ways of doing this in Python: using a datetime object or slice-and-dice the string.

from datetime import datetime

def get_timestamp(string):
    return datetime.strptime(string, "on %A %B %d, %Y @%I:%M%p")

print(get_timestamp("on Friday April 04, 2017 @09:03PM"))

My first attempt (see code fragment above) was quite simple, using the strptime function for the datetime object to parse the timestamp string according to the matching format string (“on %A %B %d, %Y @%I:%M%p”). When I opened up the CSV file and compared the timestamp against the corresponding timestamp on Slashdot, the timestamp was correct except that the hour in 24-hour time was off by three hours. Every timestamps in the CSV file was off by three hours. I quickly learned that Python’s datetime objects are generally time zone unaware (or naive), and, in general, not very easy to use with different time zones.

def convert_timestamp(string):

    months = ['January', 'February', 'March', 'April', 'May', 'June', 'July',
              'August', 'September', 'October', 'November', 'December']
    month_number = {x: str(y).zfill(2) for y, x in enumerate(months, 1)}

    # remove "on" and split string into list
    string = string[3:].split(' ')

    # slice and dice into date/time components
    month = month_number[string[1]]                       # '04'
    day = string[2][:-1]                                  # '07'
    year = string[3]                                      # '2017'
    hour, minute = string[4][1:][:-2].split(':')          # '06' / '03'
    period = string[4][-2:]                               # 'PM'
    second = '00'                                         # add missing value

    # convert 12-hour time to 24-hour time
    if period == 'PM':
        if hour < '12':
            hour = str(int(hour) + 12).zfill(2)

    date_str = '-'.join([year, month, day])               # 2017-04-07
    time_str = ':'.join([hour, minute, second])           # 18:03:00
    return ' '.join([date_str, time_str])                 # 2017-04-07 18:03:00

print(convert_timestamp("on Friday April 04, 2017 @09:03PM"))

My second attempt (see code fragment above) was to slice-and-dice the timestamp string into the corresponding string values for month, day, year, hour and minute. The second value got added for completeness. If the period was “PM” instead of “AM”, the hour went from 12-hour time to 24-hour time. Date, “2017-04-07”, and time, “18:03:00”, are join together into one string, “2017-04-07 18:03:00” . When I ran the script and looked at the CSV file, the resulting timestamps was identical to the timestamps created by the datetime object.

Every timestamp was still off by three hours.

When I work on a website scraping script, I always save the scraped data into text files while refining the parsing and output sections to avoid re-scraping the website. That reduces the risk of my IP address being flagged by the website or firewall as a spammer and/or scrapper. The completed script will scrape, parse and write each page directly to the CSV file.

The slice-and-dice function converted the timestamp string as found in those text files. If I viewed the timestamps on the website, the timestamps are correct for the Pacific time zone. If I look at the timestamps in the text files, the timestamps were all off by three hours (“09:03PM” instead of “06:03PM”). So both the datetime object and slice-and-dice functions were working properly. The logical conclusion is the Slashdot server is located in the Eastern time zone and what I thought about the data was wrong. There lies the problem—and the solution.

from datetime import datetime
from pytz import timezone

def set_timezone(ts_str, tz_alt='US/Eastern'):
    ts_format, tz_def = "on %A %B %d, %Y @%I:%M%p", 'US/Eastern'
    tz_obj = timezone(tz_def).localize(datetime.strptime(ts_str, ts_format))
    return tz_obj if tz_alt == tz_def else tz_obj.astimezone(timezone(tz_alt))

timestamp = set_timezone("on Friday April 07, 2017 @09:03PM", 'US/Pacific')

print(timestamp.strftime("%Y-%m-%d %H:%M:%S %Z%z"))

The third and final attempt (see code fragment above) uses the pytz package to add time zone definitions to the datetime object and provide functionality to translate between different time zones. Using the datetime object from the first code fragment, the timestamps get encoded “US/Eastern” and then translated into “US/Pacific” to match the timestamp on the website. The resulting timestamp with time zone info in the CSV file has this format: “2017-04-07 18:03:00 PDT-0700”. A nice thing about the pytz package is that it also handles Daylight Saving Time seamlessly. If you don’t need the time zone info for the timestamp, remove “%Z%z” from the format string.