00:00:16.400
Uh, hi everybody! Hey Jerry.
00:00:21.600
Please, uh, okay this is a talk about how I corrupted survey results and maybe ruined a business.
00:00:27.160
'Maybe' is in smaller letters. I think I did, but I'm not positive.
00:00:34.000
Firstly, I'd like to thank the conference organizers who are here. All the other speakers have been amazing.
00:00:39.920
I've attended so many great talks since I've been here, unfortunately many more that I missed.
00:00:45.039
And thank you to everybody here for spending a piece of your morning listening to me talk about my biggest professional failure.
00:00:52.399
So, with that said, let's talk about me for a minute.
00:00:57.879
There's a big risk in talking about yourself at a conference like this.
00:01:03.920
People might think this is just some elaborate exercise in egoism. I swear this isn't an ego booster for me.
00:01:11.200
If I were going to do that, I'd talk about something I was proud of, probably.
00:01:17.640
But this story is about a terrible thing that I did, not something that happened to me.
00:01:22.840
Since I was complicit in it, it was totally preventable.
00:01:29.159
I'd like to believe that if I had heard a talk like this, it could have been avoided. No guarantees, though.
00:01:36.079
More briefly about me, I'm the CTO of a company called Life iio.
00:01:41.520
We're a small company based out of Philadelphia. We're not hiring right now, but it doesn't mean we're not fun to talk to.
00:01:47.799
I have some team members here as well—they're awesome. Okay, we like to talk about code every so often.
00:01:53.040
I live with my wife and our two cats in Vancouver, Washington, which is just outside of Portland.
00:01:59.119
The cats are not as thrilled about the holidays as we are. I'm 35 years old.
00:02:04.960
I’ve been programming for about nine years, most of it Ruby at this point. I think I finally flipped that switch last year.
00:02:12.440
I have loved my career, with one noted exception, which we're going to talk about.
00:02:17.519
In that time, I've come to understand two traits about myself that are pretty fundamental to this story.
00:02:24.680
It's also probably relevant for background about me. I'm a lot higher strung than I'd like to be.
00:02:29.920
It's probably coming through right now; I'd like to pretend it's not there sometimes, but it seems to manifest unexpectedly.
00:02:36.800
It's made interviews very hard for me in my career.
00:02:41.959
I'd go to the interview and start placing such high importance on it, thinking, 'This is the job I need to have.'
00:02:47.440
And if I don't get it, I don't know what I'm going to do; who's going to hire me if I don't get this one? They all talk to each other.
00:02:53.120
Then if I do get the job, that becomes even harder because I spend all my time convinced I'm about to get fired.
00:02:59.319
There's always this dagger hanging over me. It's not the best feeling, I swear.
00:03:07.200
It's led to a higher level of output for me—probably not sure if that's good.
00:03:13.519
It's definitely put me in uncompromising situations.
00:03:18.760
I tend to commit to things I shouldn't commit to, saying I've got a Herculean level of work covered, then work constantly for weeks on end.
00:03:27.920
I also don't handle confrontation well.
00:03:33.239
Not to say I'm constantly screaming at people and losing my temper left and right—it's quite the opposite.
00:03:40.040
I'll retreat wholesale and just check out of that conversation.
00:03:45.200
I don't want to do it. It's not a passive-aggressive issue; it's really the idea of two adults screaming at each other in a professional context.
00:03:50.319
I think the only noted exception might be my sister and me at the holidays. Thanksgiving is just around the corner; she's coming to visit.
00:03:58.040
I know these are not particularly unique characteristics; they're probably very relatable to a lot of people in the room.
00:04:03.159
But for the purpose of this story, I think they're worth noting.
00:04:08.799
So let's get through it. In 2006, Ruby was version 1.9.
00:04:14.640
Rails was at version one—it might not be completely accurate on my notes.
00:04:20.799
Beyoncé had just released her second album, and I had just completed earning a Master's of Library Science.
00:04:27.080
You know, a rocket ship to South Dakota—I was going places with that.
00:04:32.400
So I started to look for jobs. I had been working somewhat with programming in the background.
00:04:38.680
There was some tangential intersection in the library science program; a lot of those schools are now called Masters of Information.
00:04:45.000
I found a job programming for a small micro consultancy in Manhattan.
00:04:52.800
I say micro consultancy; you know, we're 16 people at Life, so I say a small company where there were five people total counting me.
00:05:01.320
We sat in this weird perfectly square office with one office behind us.
00:05:06.720
I got this job in Manhattan; it was a short train ride from my apartment in Brooklyn.
00:05:12.840
I was excited—more than excited, really. I was elated!
00:05:18.759
I moved past the fear my parents had that I'd always be in school, which felt good.
00:05:26.560
I was realizing a lifelong dream, so to speak. I grew up in upstate New York and wanted to move to New York City.
00:05:34.600
My parents were terrified of New York City, and I was determined to go.
00:05:40.120
I was really excited to start programming! There was no dress code, and I could ride the train to work.
00:05:47.479
Reading way too intellectual books for my weight class—I loved it.
00:05:53.280
That optimism disappeared real quick; this was a terrible environment for me. I'll never forget the first time this happened to me.
00:06:06.919
We sat in this perfectly square office with a door behind me to my boss's office.
00:06:12.039
It was like the third day, and all of a sudden, I just hear this billowing yell coming from behind me.
00:06:18.199
It was directed at the person who sat caddy corner to me, and she was getting dressed down for what I now know to be a pretty insignificant bug.
00:06:25.160
At the time, I thought, 'Oh, she really messed up—that's terrible; I'm never going to do that.' Yet, I ended up doing it quite a bit.
00:06:31.360
Everybody was severely isolated; we sat in this weird square office with four corner desks all facing the walls.
00:06:37.319
Say what you will about the open office plan, but creating a circumstance where we're in one room yet can't talk to each other is bizarre.
00:06:43.560
It's even more bizarre when you consider that the boss would kind of monitor us in this Orwellian fashion.
00:06:51.000
If we heard cross-talk, like, 'Hey, how was your weekend?' or 'What are you working on?'
00:06:56.639
I remember routinely hearing him say, 'You guys not have enough to do? You got time to talk. What's going on there?'
00:07:03.960
I was like, 'Oh sorry, I'll go back to my corner; that's fine.' Anecdotally, I was told not to waste my time on Ruby.
00:07:11.479
I kind of wonder if he's typing into the livestream right now—that would make my day, honestly.
00:07:18.599
I was chastised for asking for help.
00:07:24.280
There was a time I was working on something, and he was bragging about how good he was at JavaScript.
00:07:30.360
I'm terrible at JavaScript, so I said, 'Can I get some help with this? I'm not very good at JavaScript.'
00:07:36.680
He replied, 'Well, you need to get better.' I was like, 'Oh okay, well I thought that's what I was trying to do.'
00:07:42.480
I was also criticized for not seeking help. If something took too long, I'd be told, 'You should have asked for help sooner.'
00:07:48.280
In a book called 'The Wizard of Oz and Other Narcissists,' there’s a concept called the double bind that narcissists engage in.
00:07:55.360
They present one set of rules, and if you don't accomplish your task, the rules change—which makes it impossible to win.
00:08:01.800
So, I'm criticized for asking for help and criticized for not getting help.
00:08:06.199
I figured I’d just not talk to anybody—that seems like the way to go.
00:08:11.800
I was called home on one occasion after taking a sick day with laryngitis.
00:08:18.560
I sent an email saying, 'Hey, I can't make it in today.' He literally called me and asked, 'Where are you?'
00:08:25.040
I was like, 'I can't come in; you hear my voice—it’s terrible!'
00:08:32.159
It was an overall terrible environment for an anxious librarian who hates confrontation.
00:08:39.000
It was pretty rough, but you got to pay the bills, and I made an okay go of it.
00:08:45.000
I got to be competent; I would say it's probably not how I thought of it at the time.
00:08:51.360
I keep thinking of this notion of 'sink or swim.' We say that phrase a lot, but what it really gets at is life or death.
00:08:57.680
So if you don't die, you live, and that seems pretty important.
00:09:04.000
So if I’m succeeding in my version of it in this atmosphere where it's hard to succeed, I start telling myself I'm amazing at this.
00:09:11.360
I was doing things a lot of developers do as they start to level up.
00:09:18.200
I started to pursue more learning opportunities where they presented themselves.
00:09:24.360
I went to meetups; I was an active participant in a Drupal forum. I read a book, despite being told not to waste my time.
00:09:30.600
I think I started to piece through the first pickaxe book.
00:09:37.600
I learned enough to, in hindsight, be really dangerous.
00:09:43.080
This brings me to the project. After a couple of months, I got my first solo project.
00:09:49.920
It was a straightforward survey application. The client needed to make decisions about their business for the coming year.
00:09:56.240
To do that, they were going to aggregate feedback from users by asking them 25 questions spread across five pages.
00:10:02.560
You’re probably thinking, 'Oh, I know this is going to be a breeze!' And it is! We had a lot of tools now for this.
00:10:11.040
Nowadays, we could probably just do it in Survey Monkey, but Survey Monkey didn't exist back then.
00:10:18.720
I was in a position where Ruby wasn't on my radar, Rails wasn't there, and Erlang wasn't a choice.
00:10:24.000
I was terrified to ask for help. The only things I knew were PHP and MySQL.
00:10:31.240
So you can guess where this is probably going. The thing I built was complete and utter trash.
00:10:36.760
I'm kind of bummed that Patterson is not in the room because I could brag about this being a true marvel of modern engineering.
00:10:42.360
But it was seven PHP pages, where each one submitted to the next page.
00:10:49.560
Every page that a user loaded in its browser, like survey1.php and survey2.php, began with a chunk of custom PHP.
00:10:56.639
And MySQL was writing directly to the database. The HTML of the questions pulled answers out of the query string.
00:11:01.800
It was really bad; there was no validation happening.
00:11:08.120
There was nothing remotely resembling an object. And probably most importantly, nothing verified the data ever saved.
00:11:14.480
So it was a complete failure.
00:11:19.639
It took me about a week to realize how badly it was broken.
00:11:25.040
When the user began the survey, a marker would take off in the database saying 'survey begun.'
00:11:30.920
When they finished, there’d be a marker that ticked 'survey ended.'
00:11:36.279
So I knew when a user started and finished the survey but didn’t drop off.
00:11:42.720
I expected a certain number of answers to correspond, but I realized I didn’t have all the answers; those were getting lost.
00:11:49.079
There was this record of 100 surveys being taken. After the first week, I think it was actually more than that, which is terrifying.
00:11:55.079
I had a record of 100 surveys being taken, but the drop-off rate was about 30%.
00:12:01.679
So for every 100 surveys, I had about 70 sets of answers.
00:12:05.880
This was bad! The client paid us for something that fundamentally didn't work.
00:12:12.519
They were going to base their business off of this.
00:12:18.720
I should have stopped; I should have paused, taken it down, apologized to my boss and the client.
00:12:24.040
I needed to say, 'We’re going to fix the problem. I need a little help because I don’t know what's wrong.'
00:12:30.680
I wasn't as good as I thought I was.
00:12:36.680
Again, I was terrified. I was anxious. I thought, 'This is going to be the thing that gets me fired.'
00:12:41.839
So I hatched a plan. I realized I could come in early and stay late.
00:12:48.720
I spent a big chunk of my day every day monitoring these results as they came in.
00:12:56.519
When I realized that something got dropped, like when users started and finished without answers, I just made them up.
00:13:03.519
I could insert the values directly into the database. I thought, 'This person wanted this and this and this.'
00:13:09.279
It seemed a lot better than getting yelled at.
00:13:16.959
So, I was making up these answers, saving them to the database for the survey that the client was using to inform their business direction.
00:13:24.480
So again, I say I maybe ruined a business. All I know is they don’t exist anymore; that’s all I can confidently say.
00:13:30.720
There was none the wiser at the end of it. I worked constantly for that whole month that the survey ran.
00:13:36.000
In fact, this is really the first time I talked about it. No one ever knew about this.
00:13:42.680
I got increasingly fast at covering it up. It was pretty intense in terms of stress.
00:13:48.720
But at the end, the client was happy, given what they knew.
00:13:55.560
Let me rephrase that: the end result that made everybody happy was that my boss got paid.
00:14:02.320
Not long after that experience, I left that company; it was a bad environment for me.
00:14:08.840
I don't think there's any debating that the guilt of this was with a client.
00:14:14.279
We continued to work with them, and the guilt of sporadically interacting with them was hard.
00:14:20.320
I'd say, 'Hey, based on survey results, we want to build this thing,' and in my head, I’d just groan.
00:14:26.920
So, yeah, the bad environment was a good enough reason to leave.
00:14:32.040
But I really couldn't handle the guilt of interacting with that client on an ongoing basis.
00:14:38.000
I was hired at another consultancy that wasn't without its own set of problems.
00:14:43.920
But those were problems that we worked to solve as a team.
00:14:49.800
Let's take a look at what, if anything, we can learn from this.
00:14:55.680
The really obvious thing that comes out first and foremost is: never hire me.
00:15:03.800
I mean, I'm up here literally telling you how I drove a client out of business and how bad an employee I was.
00:15:12.720
But maybe not; I like to think I bring this experience wherever I go.
00:15:19.839
It's certainly something I’ll sporadically consider in a lot of circumstances.
00:15:26.320
And I promise I won't ever intentionally sabotage a project again.
00:15:31.399
I mean, I wrote 'sabotage' here, and I really mean intentionally. Sure, I may make accidental mistakes.
00:15:37.120
We all make mistakes, but I won't scream at people if they do make mistakes.
00:15:42.720
And I'll never cover it up—especially when I know I've made it, I'll just say something.
00:15:48.720
I know what I want to be as a manager. You know, I'm a CTO now, which is still a weird concept to think of.
00:15:55.480
But I know what I don't want to be in that position; I'm still trying to learn what I want to be.
00:16:02.319
But there's also a bigger concept to consider in all of this: let's consider environments for a minute.
00:16:08.199
In isolation, it's hard to understand why something exists the way it does.
00:16:14.200
To explain why this picture of me is so ridiculous, put it into an environment—it starts to make sense.
00:16:20.640
You're like, 'Oh, okay, I get it—they're at a soccer game.' However, it's still pretty ridiculous.
00:16:26.920
But I think importantly, it's important to remember that I think software is really a product of the environment it was built in.
00:16:32.920
The wells of business opportunity, talent, and user happiness can be very shallow.
00:16:41.040
If you're in an environment where condescension, fear, selfishness, and egoism dictate how things are run.
00:16:46.440
You'll start to experience issues with retention. And when I say retention, that seems like I'm only concerned about people working there.
00:16:54.399
It extends to employees, clients, and users. Clients can go out of business—not your fault, maybe your fault.
00:17:00.560
Users won’t want to use the product.
00:17:07.159
These problems will manifest in ways we can't anticipate; they’re unknown unknowns.
00:17:14.440
Conversely, what about a communicative, educational, transparent, and positive environment?
00:17:20.880
Something more collaborative? You’re going to build great things there!
00:17:27.159
I never hear a successful product owner give an interview saying, 'Well, at our office we don't encourage people to work together; they're not allowed to talk.'
00:17:32.640
And if a mistake is made, I dress them down thoroughly. Maybe Elon Musk, I don't know.
00:17:41.720
But I genuinely believe that people love using software that was built by people who love what they do and where they do it.
00:17:49.240
In my story, I think about the time I spent on an insane cover-up. I didn't love doing that work.
00:17:55.560
It was, 'Any minute now I’m going to get found out, and it's going to be terrible. I'm a fraud; and you deal with so much from that.'
00:18:02.720
If I could have just had help or some positive guidance—a mentor, somebody to collaborate with.
00:18:09.040
However, we do need to remember that collaboration is tricky; it's a double-edged sword, so to speak.
00:18:16.680
It means different things to different people.
00:18:24.239
What if I was forced to work with the person who was making my life miserable? You're going to get collaboration, but it’s from the worst person you know.
00:18:32.320
So, you need to learn how you work best and figure out a way for you all to work together.
00:18:39.000
Share feedback about feedback. Paul ATL talked about this yesterday. It was a great talk.
00:18:46.320
We don't only need code reviews; we also need feedback about how we work together and how we’re doing towards each other.
00:18:54.719
While fostering collaboration, let’s encourage learning.
00:19:01.239
I mean, go beyond a company's book club or attending a meetup, which are great things.
00:19:08.360
If you confine learning to just those areas, it’s harder to extend it everywhere.
00:19:15.919
So make it a part of your everyday practice.
00:19:22.840
Some level of cross-training—check in with people. Ask them, 'Hey, could you tell me about what you think of this?'
00:19:30.720
I do this all the time. I ask people for a second set of eyes on an issue because I'm not sure of my approach.
00:19:37.320
Naming things is impossible. So what do you think of this word? Why did you choose that approach?
00:19:43.600
Offer help in a non-condescending manner. Sometimes, people give signs they could use help but are afraid to ask.
00:19:50.800
You can say, 'How's that survey you're working on going? If you need anything, I'm available.'
00:19:57.520
Somebody asking me that question would have made me grateful.
00:20:03.320
Build a culture of code reviews and insight and teaching.
00:20:10.200
I feel a little awkward saying this: we just got done with a big sprint and know we’ve sacrificed some of these standards.
00:20:18.559
But we made our promise to ourselves that we’d come back and fix them later.
00:20:24.560
Thinking back on this story, I was a pretender. It's really hard to find an image for that.
00:20:31.520
Then I remembered I love The Pretender, so that worked out.
00:20:37.120
That sink or swim mentality led to some learning, but what kind?
00:20:44.840
Going back to the life or death comparison, I was swimming; I felt like I was KD Lei.
00:20:51.760
In reality, I was probably one of those people on the Titanic, taking everybody down with me as I flailed about aimlessly.
00:20:58.840
I learned to be very dangerous and not do my job well.
00:21:06.440
I came in boy coding at that next consultancy, and that was immediately shut down.
00:21:12.400
They weren't going to scream at me; they were going to fix the problem.
00:21:18.240
I was put in something that resembled a mentorship program, and that was great for me.
00:21:24.239
I've built off of that, and that needs to be kept in mind.
00:21:30.640
We make mistakes, and we learn from them.
00:21:36.160
Some of the best learning I've done has been through getting confused with something and hacking around until it works.
00:21:42.080
Then I improve it. I think we have a pattern for that: red-green-refactor.
00:21:48.240
But beyond that, I think there's so much phenomenal and motivated talent coming into our communities.
00:21:56.239
More experienced people are getting to work with new people and new perspectives.
00:22:02.560
Megan T made a great point about this in her talk last Thursday; go back and watch that one.
00:22:10.240
More experienced people are learning the work of being a leader, and that's tough.
00:22:17.600
A great talk yesterday discussed how senior developers need to learn to be leaders in their organization.
00:22:22.480
New developers can learn a lot as well. It goes beyond coding; it's about the experience of working in software.
00:22:28.959
Classroom learning doesn't always reflect real-life application.
00:22:36.240
They need to gain experience in real-world practices and understand the occasional compromises that business requires.
00:22:42.800
We all have the opportunity to be on ambitious, thoughtful teams where feedback is given constructively.
00:22:48.720
Know that you are a part of a culture and that you are contributing to it.
00:22:55.199
Wherever you go, you're joining a new culture and contributing to it.
00:23:01.440
You should be expected to contribute to it—it's kind of your obligation.
00:23:07.360
When considering a company, you can ask questions about promoting personal growth and what values are valued.
00:23:14.159
Were you the first person to bring up culture in an interview? That might be a concern.
00:23:21.599
In my interview for that terrible job, I was too nervous to think about these things.
00:23:28.200
We need to be aware of what’s happening around us and trust our instincts.
00:23:35.960
If you walked into a weird room where four people were pointing into corners, that's a warning sign.
00:23:43.120
You might ask, 'Is everyone sharpening daggers?' If they look bored, that might be a concern.
00:23:49.920
In a remote interview, pay attention to certain markers. Is there more than one person on the call?
00:23:57.119
And if so, how are they interacting with each other? Is it tense?
00:24:04.239
Usually, in our first intro interview, it’s me and another person who are probably more nervous than the applicant.
00:24:10.960
We tend to be jokey about it, which is a good reflection of us as a company.
00:24:17.520
In summary, I think we can practice obtrusive collaboration.
00:24:24.200
Go back to learning—figure out how you work, learn what makes you comfortable, and how co-workers work.
00:24:30.160
Allow free communication; don't cut off people from asking for help.
00:24:36.080
Be aware of language that can prevent help. Avoid using phrases like, 'just put that in a PHP file.'
00:24:42.479
Foster growth—if you create a safe environment, it will snowball into something amazing.
00:24:49.360
But remember, parts will fall off, so ensure you keep it together.
00:24:55.839
Reflect on the environment you've created. If issues boil up in your software, users are dropping off.
00:25:04.000
Before filling the gaps, look at what's causing everyone to leave.
00:25:09.479
If you have a lot of bugs, assess what's causing those bugs to arise.
00:25:18.160
Treat the actual disease, not just the symptoms.
00:25:25.920
Don't engage in massive cover-ups. That is effort and talent misused.
00:25:31.920
Don't sabotage other businesses unless they're competitors, which might be worth considering.
00:25:37.320
But in general, don’t do it if they’re nice people.
00:25:43.162
Thank you all very much for spending your time at RubyConf hearing me share my most humiliating professional experience.
00:25:49.600
I really hope you got something from this, or perhaps just caught up on emails you meant to send while you were here.
00:25:56.440
Either way, I’m happy to take some questions.
00:26:02.760
My name is Mike again, coic01 on GitHub and Twitter.
00:26:08.639
Twitter is not anything meaningful, and I think that's probably true for most people these days.
00:26:14.579
But thank you!
00:26:40.639
So, the question was: does the micro consultancy still exist?
00:26:48.520
Could they find out about this from the talk? The answer to both questions is yes.
00:26:54.600
There are a few people who know the company I'm talking about.
00:27:01.240
It's funny because they’ve made no effort to update their presence since 2006.
00:27:08.480
Their footer still says copyright 2006, but they're still there.
00:27:15.440
Conceivably, they could find this out.
00:27:20.560
I'm less worried about it these days.
00:27:27.000
The joke was, on my flight here, I connected in Salt Lake City, and there was a guy who looked exactly like my boss.
00:27:34.960
I started to have a panic attack right there on this plane.
00:27:41.440
He was at the conference, and I said, 'Wait, no, what is happening?' I talked to him.
00:27:47.920
He said, 'No, I'm not your old boss; I'm someone entirely different.' People tend to look alike sometimes.
00:27:55.720
So, that was a good question.
00:28:01.560
Do you have any advice for preventing these types of failings?
00:28:06.600
If you’re the only developer in the company?
00:28:12.720
That's tricky; it depends on your skill level.
00:28:20.560
If a company needs a developer and they hire an entry-level developer to do all the work, that could point out problems.
00:28:26.560
You might want to consider bringing in a consultant to help to leverage your resources.
00:28:35.919
You can lean on the community; they help.
00:28:42.080
In Portland, we have a Slack channel where people regularly post help questions.
00:28:48.560
Being your own person is important.
00:28:54.560
As the sole developer, the biggest challenge I faced was knowing how to expand and grow.
00:29:01.080
I would talk to my partners and say, 'Guys, I messed this up; I need to figure out how to do it correctly.'
00:29:07.840
I might need to bring in outside help, and as we grew, I kept this experience in mind.
00:29:14.240
I was going to be a big part of ensuring that less experienced people had a better support structure.
00:29:21.680
That's a bit tricky for being a lone wolf.
00:29:29.200
If you live in San Francisco, you're literally on an island!
00:29:36.640
So the question is: do you have any advice for management to fix that situation?
00:29:44.720
I can speak from my personal experience.
00:29:51.720
Try to encourage people to ask questions first and foremost.
00:29:58.720
I don’t want to do it in a way that's overbearing; I want other opinions and thoughts.
00:30:05.840
If multiple people are present, talk about each other's code and approaches.
00:30:12.560
When mistakes happen, make sure it’s clear that they can say it and feel safe.
00:30:19.200
Your job's literally not on the line; you should have regular check-ins.
00:30:26.640
Encourage learning and questions.
00:30:34.200
Thank you, everyone, for your time!