Humanizing People Isn’t Feasible In Many Industries
I had an interesting debate with Diane and Matt today about how people are treated at companies.
A few thoughts:
Treating people like they’re human beings instead of hours to extract value from is an old fashioned concept that’s coming back into fashion. I think it’s because the skills of one employee to another can’t be mapped out 1:1 any more.
In the assembly line, one healthy person was as good as the next. But that comparison isn’t really relevant any more. Even in the past 10 years, I think the scale of relative “valuable-ness” of otherwise-similarly-skilled-employees has grown quite a bit wider. There are several reasons for this; key among them is that productivity depends on more than skill level now. The productivity of a company depends on cultural cohesion, quality/quantity of communication, emotional investment, etc. The productivity of an individual depends on the degree to which (s)he can think independently and take advantage of the tools available. Considering that there are an infinite amount of tools available and there is no limit to independent thought[1], the degrees to which a person might be productive is theoretically infinite. All this to say that each person can add something different to a team, and therefore the range of relative values of otherwise-similarly-skilled-employees has gotten much wider.
So far there’s not a lot of debating. Here’s where you might disagree.
I think software engineers have the greatest degree of variance in the level of their productivity. Not a linear variance, mind you, a vectorial variance. This is good because it leads to the greatest amount of innovation. But it’s also good because it means that people aren’t as easily replaceable.
I think this vectorial variance is such mostly because the number of paths available for exploration in technology is growing at an extremely rapid pace. This gives engineers many, many directions to explore and be innovative in. Compare this with an industry that doesn’t progress as fast, say, personal finance[2]. Financial managers have fewer paths to explore and so, those paths are crowded. I think the probability that a personal finance manager will discover something new in their industry is lower than the probability that a software engineer will discover something new in theirs. This essentially means that financial managers are more like one another, and thus, relatively more replaceable, whereas software engineers are the inverse.
To drive the point home, I think it’s harder to “humanize” people in these slow moving industries. Humanizing is expensive (in the short term at least), so it’s easier to replace. In an industry that moves fast and people aren’t replaceable, however, it’s cheaper to humanize and retain instead.
[1] on second thought, an interesting topic to explore.[2] just an example, feel free to educate me about the opportunities for innovation in personal finance
Beautiful Code
Had a conversation with Tony the other day about what beautiful code means and wanted to jot down some thoughts.
I think beautiful code has to do with three things:
- readability
- encapsulation/abstraction
- performance
As a beginner, the first is the most important to me. I’ve worked with code bases with poor naming, poor indentation, poor line-breaking practices, etc. And it makes it so much harder to read. There was a point in time when I believed that code must be hard to read (ahh, the good old days of PHP and Wordpress themes!), that’s why it’s code and not English. But in the end, programmers are just reading and writing another language. Good grammar, punctuation, and structure should be a norm. Random aside on this, I don’t know how this applies to Unix systems and terminal yet. Everything in there might as well be a random string of characters…
By encapsulation/abstraction I mean good, DRY code. I’m working with a rails app now that has 400 line views. As my boss says, “that is not ok.” It’s like writing a freehand essay where you’re not allowed to use the backspace or return buttons. It’s kind of like I’m writing this post right now. (If the previous sentence, and this one, are still here, it means I definitely did not refactor” or in any way revisit this post after writing.) The benefits of modularizing your code also contribute to readability in the end. If you don’t modularize, it’s so much easier to run into conflicting namespaces and random bugs, no matter how smart you are.
I’m not even a beginner on the last one. When I built Startapathy and posted it on HN, it got a decent amount of traffic. More than I had ever seen anyway. The app randomly didn’t work for some people and I naively figured/hoped I was having “scaling issues”. Not true in the slightest. The point of that story was that I have very little clue (yet)* of what “code that performs well” means. But I do know that an application is meant to make a task either possible, if it isn’t already, or more efficient, if it already is. For most, applications are trying to do the latter so it only makes sense that the more performant some software is, the more people will like it, and the more inherently beautiful it is.
*I know infinite loops are bad. An 8 year old who has to ask Mom and then Dad and then Mom and then Dad… if they can stay up another hour knows infinite loops are bad. I also know that querying databases too many times is bad and indexing the right things is good. Still not a big deal. I’m learning Ember.js right now (which basically bundles server calls by caching your data), so now I know reducing server calls is good (up for debate).
Floats are mutable objects, apparently?
UPDATE[4/7]: Floats are NOT mutable apparently. Thank you to Robert for clarifying what is actually happening below. Read his comment below.
——————————
I just discovered another interesting tidbit while working with floats and modulos.
First this:
1.9.3p125 :001 > 3 % 0.05
=> 0.049999999999999836
I haven’t figured out the reason for why this happens (I would have assumed 3 % 0.05 returns 0), but it’s something about how math is done in the computer.
Now check this out:
1.9.3p125 :002 > a = 3 % 0.05
=> 0.049999999999999836
1.9.3p125 :003 > a.object_id
=> 5271720
Makes sense. But wait! Let’s add on another bit:
1.9.3p125 :002 > a = 3 % 0.05
=> 0.049999999999999836
1.9.3p125 :003 > a.object_id
=> 5271720
1.9.3p125 :004 > b = 3 % 0.05
=> 0.049999999999999836
1.9.3p125 :005 > b.object_id
=> 5304200
To drive the point home:
1.9.3p125 :006 > a == b
=> true
1.9.3p125 :007 > a.object_id == b.object_id
=> false
This can only mean that floats are mutable. Here’s more proof in case you were thinking (like I was) that the modulo is returning something different each time and truncating the end from the display.
1.9.3p125 :008 > a = 0.999
nbsp;=> 0.999
1.9.3p125 :009 > b = 0.999
=> 0.999
1.9.3p125 :010 > a == b
=> true
1.9.3p125 :011 > a.object_id == b.object_id
=> false
Just in case you were wondering, this is different from how integers (and symbols) work:
1.9.3p125 :012 > c = 1
=> 1
1.9.3p125 :013 > d = 1
=> 1
1.9.3p125 :014 > c == d
=> true
1.9.3p125 :015 > c.object_id == d.object_id
=> true
Maybe I should have learned this by reading up on it somewhere, but chancing across it was ultimately more interesting.
“Called id for nil, which would mistakenly be 4”
I’ve gotten this error so many times while building Rails applications and it didn’t make any sense. It usually appeared when I was trying to call Some_Object.id and the object wasn’t assigned correctly, so in essence I was calling .id on nil. But I had no idea why that would “mistakenly be 4”.
Thanks to Tim, I finally unraveled the mystery.
The first important thing to know is that in Ruby, everything is an object. No really, everything. Even the class “Object” which contains everything inside it is an object. Think of it like an index of keywords, and each one has an object_id. The object_id for the Object class is 18703980.
This index goes like this:
- All odd indexes are integers. E.g. 0.object_id = 1, 1.object_id = 3, 2.object_id = 5, etc.
- All immutable objects always have the same object_id (Classes, Symbols, Fixnum, etc)
- Mutable objects like strings DON’T have the same object id. E.g. “apple”.object_id != “apple”.object_id.
I’m sure there are more rules, but these are the ones I’ve discovered so far.
Getting back to nil
There’s no particular reason for this that I can see, but Ruby was designed so that the first object in this index is false. So, false.object_id = 0. The next non-integer object is true. And finally, the third non-integer object is nil.
1.9.3p125 :050 > false.object_id
=> 0
1.9.3p125 :051 > true.object_id
=> 2
1.9.3p125 :052 > nil.object_id
=> 4
My next question was obviously, how do I find what object is assigned to a given object_id. A quick search revealed that
ObjectSpace._id2ref(object_id)
will return the object associated with the given parameter.
Oh and, by the way. the ObjectSpace class also has an object_id. :)
I just built my first Rails app and this is how I did it

I built Startapathy in a little over 20 hours. If I started from scratch, I could probably do it in 5-7.
I feel like Neo in the Matrix when he downloads the kung fu program to his brain.
It’s been 3 weeks since I wrote about what it’s like going to a web ninja bootcamp. Even then, I didn’t think I’d ever launch a web app on my own. Two months ago, I didn’t even really know what a web app was. Granted I needed a lot of help to put together and debug Startapathy and granted the code is ugly and haphazard and untested.
But seriously… I just built an app from scratch. *moment of gloating*
I’ve seen bunches of posts on HN about how people learned to code in X weeks and they all do a pretty good job of describing some of the things required to learn so fast. Other than complete immersion, I think the two most important things you can do to expedite learning are to:
- Break something, and
- Build something
I think both are fairly self explanatory. If they aren’t, I highly recommend doing the first. It’s really easy. If you’re the type of person who won’t be able to stand that something broken and will stop at nothing to fix it, chances are you’ll be a good developer.
Because other people have done a good job of writing about learning to code in general, I wanted to show you my process of taking the app from my head to Heroku. This process can be applied to any application probably, especially any web application.
The idea
Michael Staton said it quotably well: “Most startups aren’t competing with other startups, they’re competing with no one giving a sh**.” I knew from experience there were hundreds of apps out there I would sign up for and forget about 5 minutes later. Even before getting the confirmation email in some cases. I wanted to see if this was true for others.
Whiteboard
My first instinct was to think about what information I wanted to store and how I would store it, so I drafted a quick version of the database schema using an SQL designer. In the case of Startapathy, it was extremely simple, only 2 tables.
Input Form
Now I knew what information I wanted to store, I thought about how I would collect it. A visitor to the website would have to submit through some sort of a form, so I created a blank form that received data from the visitor and stored it in the database.
Question
Now I had a way to collect user input, I needed to create a reason for users to give me input. I needed to ask a question. Questions, or startups in my case, had to be pulled from an external source so I had to learn to use an API. This was the hardest part, and this topic is probably best reserved for another blog post as it’s not really relevant to the general steps I took to build Startapathy.
Feedback
I had a working interface. App asks a question, user submits an answer, app stores the answer. I had to give the user some feedback now that the data had been received. This is more of a user experience feature than a feature of the app, but it because it requires an understanding of how the data was being stored and how to access it again, I include it as part of the process.
Design
It should be noted that design is important for getting and retaining visitors, but it has little to do with the functionality of the app itself. I refused to Bootstrap the whole thing, so I strolled some of my other favorite libraries for easy design implementations. They’re all listed on the about page.
Refactor
Refactoring is an ongoing process for me, so I hesitate to add it as a separate section. I have trouble seeing 80 lines of code when I know the same thing could be accomplished in 15 lines.
Deployment
Deploying to Heroku wasn’t too difficult; their documentation is really easy to follow. But I had bought a domain name from Network Solutions through Domai.nr and pointing it to a Heroku App was a little tricky. I had to spend considerable amount of time on the phone with Network Solutions learning about A-records and CNAMES. My understanding of DNS and IPs is still incomplete, but again, I’ll leave this topic for another post.
Spruce
To build a product that people will use, this is probably the most important part of the process. To build a web app, this is probably the least important part of the process. This is when I added AJAX calls to submit user input without having to refresh the page. A stats panel that updates after every click. Instructions on how to use the app (if it wasn’t obvious enough already). An About page with acknowledgments. Sprucing is similar to design, but it has more to do with UX than UI.
Testing
Completely opposite of what I should have done (and if you’re a potential employer, what I will always do from now own), I didn’t write tests beforehand, I basically freehanded the whole thing. I tested by sending the app to 10-20 friends, family, and a few Rails savvy people. The app broke. Many times. And then I fixed it, many times. I found, a LOT of holes. Some I bandaged, some I preferred to cover by restructuring the code. Lesson learned: write tests first.
Thinking Ahead
I’m thinking of more features to add now and basically starting at the beginning of the steps I took to get this far. E.g. for the features to be implemented, what information do I need to store and how will I store it? Where will it come from? How will I ask for it? etc.
And that’s it!
Test out Startapathy.com and tell me what you think! The source is linked on the app.
If you’re a developer and this process is missing something, I invite you to comment below with your feedback.
Listening is an interactive activity.
Method names and variables are the same thing
I discovered something interesting today. Kudos to Craig for leading me to this discovery.
Method names and variables are really the same thing. Both point to some object that is being returned. This makes more sense now that I know it, but we proved it in IRB below.
We first create a class Person that is initialized with a name property and make the name accessible outside.
1.9.3p125 :067 > class Person
1.9.3p125 :068?> attr_accessor :name
1.9.3p125 :069?> def initialize(name)
1.9.3p125 :070?> @name = name
1.9.3p125 :071?> end
1.9.3p125 :072?> end
We define a method that returns a string “Bob”
1.9.3p125 :073 > def get_name
1.9.3p125 :074?> “Bob”
1.9.3p125 :075?> end
And then we initialize an instance of the Person class with the get_name method.
1.9.3p125 :076 > bob = Person.new(get_name)
=> #<Person:0x00000002ad78a0 @name=”Bob”>
When we call the name property of the instance, we see that it doesn’t return “get_name” which is what we initialized the class with. We get the value that the method returned.
1.9.3p125 :077 > bob.name
=> “Bob”
Taking this one step further, suppose we update our get_name method
1.9.3p125 :078 > def get_name
1.9.3p125 :079?> “Sally”
1.9.3p125 :080?> end
Now, the name property of bob, our instance of the Person class, remains “Bob” because the method wasn’t called again. It returned “Bob” only once when the instance was initialized.
1.9.3p125 :081 > bob.name
=> “Bob”
This nuance may or may not seem important until you think about storing these properties in a database. For example, imagine a 3rd party company that handles customer service for B2Cs. When the 3rd party company hires a new employee, they ask him or her to fill out a form indicating their gender. Based on the gender, they assign a random pseudonym to that employee for all their interactions with customers on the phone or email, etc. One way to assign and store these pseudonyms would be to create two different tables for male and female employees and instantiate records with “Bob” or “Sally” names. There’s no reason to have two different tables other than that, as far as I can tell.
Or, you could have one class and instead of instantiating records with a string, instantiate with a method that assigns “Bob” or “Sally” based on the gender from the input form. The method could also provide extra flexibility and have a set of names instead of having every male employee being assigned “Bob” and every female employee “Sally.”
If I made a mistake in my reasoning above, or if you can add to this, comment below!
In Python, I would just say something like, ‘Get up and go through the door.’ In other languages, I might have to say something like, ‘Stand up, but not with so much force that you fall over, take three steps to the north, take one step to the east, approach the door, check that it is open, if it is not open, open it, then step through it with this amount of speed …’
I’m starting to discover this more and more every day.
NYE in NYC 2012 (the most epic story ever)
December 26th morning in St. Louis. Justin calls me. I don’t pick up. December 26th evening, I call back. He invites me to go to New York City to sell T-shirts on Times Square. He has 1,000 T-shirts and he needs help selling. I say OK. We talk about costs and profits and agree to split everything 50/50. We’re driving.
December 27th, I drive 6 hours back to Whitewater, WI.
December 27th, 11:30pm. Justin, Megan, and I begin our journey.
Justin is tired after driving 3 hours. We stop at a Subway in Chicago. The lone employee is behind bullet proof glass. He’s Indian. We make conversation, he gives me free cookies for solidarity.
I take the wheel.
Indiana. Ohio. Sunrise. It’s 8 am and we smell something burning. It’s definitely our car. Three hours later, twin brothers in a Mercer, Pennsylvania have solved our dilemma by changing a damaged oil filter.
December 28th. We reach our Craigslist roomshare where we have one room the size of a large walk-in closet and a queen bed. We unpack 16 boxes of T-shirts into it. I put up a website in 2 hours while Megan models the T-shirt hoping to be able to sell online.
December 29th, it’s Thursday now. We visit the testicular cancer foundation we’ve decided to donate part of the profits to, if there are any. We visit the office where they give out permits to sell merchandise on the streets.
We are not eligible. We load up duffel bags and backpacks with T-shirts anyway.
It seems as if the whole world is at Times Square when we get there. No one pays us any attention. We set our bags down, look at each other dubiously for a few minutes, and then yell one of the three sentences I will never forget:
“New Year’s Eve 2012!”
“NYE in NYC!”
“What happens in New York, STAYS in New York!”
We have found our rhythm. People are buying. We’re having fun. We have a code word to hide our merchandise and pretend to sightsee when we see a uniform.
We take pictures of everyone who buys a a T-shirt. At 2 am we run out of steam. It seems as if the city is just getting started. $500 new dollars in our pockets, we are feeling good. Until we get back and see that we’ve only gotten rid of one out of the sixteen boxes we brought. We have two days left.
December 30, we have to wake up early and move out of Queens into a room in Jersey City. The house is like an antique shop. Our roommate, a middle aged Ukranian lady is extremely hospitable. She gives us a key and a tour of the house. And we’re back on the streets.

“New Year’s Eve 2012!”
“NYE in NYC!”
“What happens in New York, STAYS in New York!”
People are delighted. We get smiles and laughs from everyone who see us. Those guys who stand around passing out coupons for Broadway shows and comedy shows warn us not to get caught. They’ve seen others like us get arrested. Some are silently rooting for us, others are resentful of the new kids on their turf. We meet this guy.
We can only carry about 50 T-shirts at a time. Transit time to restock inventory is 2 hours. We cannot split up because we need everyone to carry enough T-shirts back. We realize we did not plan logistics very well. We are on the streets till 4am this time. By the time we get home it’s 7am.
I am too tired to sleep.
December 31st. It’s 11am and we’re supposed to go to Times Square before it gets blocked off. We cannot find the house key. Tatiana, our Ukranian landlord, thinks we are joking. This is the first time she has put up her extra room for rent. She has to get her lock replaced. We lose our deposit.
It is 4pm now. Too late to go to Times Square. We decide we’re done selling. The past two nights have been draining. I go to sleep, Justin and Megan head out to see the ball drop.
I spend New Year’s Eve on a train to visit cousins in Queens. The train is mostly empty, but the conductor, a large, African American youth shouts “Happy New Year” rather gleefully into his megaphone, first inside the train, then out the windows, then at every station. He can’t wait to be off duty so he can go celebrate 2012.
I visit my cousins and stay with family for the night.
January 1st. I meet up with my fellow apparel compatriots. We still have 14 boxes left. We make a feeble attempt to sell them to retailers in the city. They laugh at us.
January 2nd. We load up the car. We’ve made $1247 from T-shirt sales. The trip cost us $1400. We’re in red even before accounting for inventory. The mood is somber. We don’t have much conversation material left.
New Jersey. Pennsylvania. We stop at a rest area. Our car breaks down again. A blizzard starts. We call half a dozen garages. They’re all closed. We find one willing to take a look at the car in the morning. An old man with a tow truck shows up. We try to make conversation. He does not respond.
The garage is in State College, PA. We make our way to the motel the garage manager points us toward. We trek a quarter mile along a dark highway, lugging our suitcases when a truck pulls up and offers us a ride. We’re glad we accepted because the motel is a 15 minute drive at 50 mph.
January 3rd. The garage owner says he can’t have the parts to fix the car till Friday. It’s Tuesday. Justin’s dad calls the garage and suddenly the car can be fixed by Wednesday.
The motel has free wi-fi. I stay in bed all day and catch up on email. We order 60 wings from Pizza Hut and eat them all.
January 4th. The car is ready. We start for home. Ohio. Indiana. Illinois. We attempt to play driving games.
Wisconsin. It’s a sweet sight. I reach home and pass out.
January 5th. Sleep.
January 6th. I reflect on the trip.
Totally worth it.
I don’t expect this to work
- Jason: Will that work?
- Me: I don’t expect this to work.
- Andrew: I feel that way every time I do anything.
I think I’m getting better at programming. I used to have no idea what was going on most of the time. Now most of the time I know my code won’t work.
A prospective summer student came in today. She wanted to know if DBC was a viable alternative to a Masters in CS. Tim spent a lot of time weighing the pros and cons of both alternatives, like he always does.
I told her that the only thing I’ve learned in the past four weeks is how little I really know.
DevBootcamp Testimonial
Three things happened. Shereef asked us to write testimonials for the new DBC website and I said I would. An old friend from high school asked about DBC and what I thought about it. And Andrew Dennis wrote a testimonial. Andrew was the last straw.
So here it is: a review/testimonial of DevBootcamp.
Short version:
Long version:
Halfway through DevBootcamp I am reading lines of Ruby like English. I’m rails g’ing my way into models and controllers and scaffolding. I know what gems are. I know that rake isn’t a garden tool. I (am trying to make myself) believe that software is more about understanding problems and empathizing with those who have them than being able to write complex code. I can swing through git commands and branches like a monkey. I worked in a team of four to recreate the classic Mastermind.
Wait, what?
Rewind. Time.new = 28.days.ago #Totally valid date manipulation in rails by the way
The day before bootcamp started, I was nervous because I hadn’t done much of the prep work Shereef had sent us. I hadn’t been very successful at what I had tried, and the Hartl Tutorial was too much reading for me to handle.
The first day of bootcamp, I was nervous. Everyone seemed super smart. I was the little fish in the big ocean. The big ocean being 92* Market St, around which my life has revolved for the past four weeks.
On the second day, Alex Chafee said to us: “There is no line of code in the world that cannot be read or understood.” This has been my mantra when I have wanted to give up or gotten a PC Load Letter.
After the second day, I blacked out.
In some order I can’t remember, I learned pair programming, object oriented design, database modeling, test driven development and the git version control system. Then I built Twitter.
Turns out none of this is as magical as I thought it was. It makes sense if you have mentors like the ones we have:
- Christian asks you questions until you find yourself staring at the answer you were looking for. Then he’ll take you to the whiteboard and scribble things about bits and memory that make perfect sense for five minutes and it makes you feel empowered and knowledgeable and full of glee.
- Robert bikes up the stairs every day at some point and then solves all the errors we have.
- Tim will make you refactor your code until he can read it before he answers your questions. Then he’ll discuss every possible solution and its respective pros and cons in a way that drives home the “software is an art” rule. He will also demonstrate the perfect push up if you ask.
- And then there’s Shereef; the fatherly-older-brotherly-mentorly figure who does an amazing job of breaking down concepts that make no sense into smaller concepts that… also make no sense. He says questions are gifts, and we give him many. Sometimes he opens them carefully, sometimes he rips them apart. But our gifts are never forgotten or left untouched.
Factoid: today, we decided that we would call ourselves Boots, modeling ourselves after the legendary Pivots of Pivotal Labs.
I had always put “back end development” (which included everything except HTML and CSS) into a category labeled “Too Difficult”. It was a knot tied too tightly for me to even find the crevices to loosen. Four weeks into bootcamp, I know that this knot is much bigger than I thought it was, but I’ve also learned some neat ways to systematically pry it apart.
This isn’t much of a testimonial. But I’m up at 3am writing it.
DevBootcamp promised to teach me how to code. It didn’t tell me how much fun I would have doing it. It’s been a blast. For a better account of what we do on a day-to-day basis, read Doug’s chronicles. You can also get in touch with me and I’ll do my best to respond during these next four weeks. In the words of Roy Bahat, “if you don’t know where to find me, you shouldn’t be here.”
PS, if Dev Bootcamp doesn’t sound like something you’re interested in, maybe you can try this eight week program.
What the Proc? (The Art of Being Confused)
A proc is a block of code that is passed into other blocks of code. But it’s different from a block because a block isn’t an object.
It took me 3 days to understand that. It might take me another 3 weeks to understand how to use it. And that’s saying nothing about using it well.
I’ve been confused many times in academia. It’s possible that my standards for “understanding” are higher than average. It’s possible that I’m slower to understand than average. And it’s also possible that I am more expressive about confusion than average. Whatever the explanation, I’ve become accustomed to that sense of being enveloped by fog, unable to see the beginning or end; hearing sounds I recognize as words all around me, but not knowing their source and not being able to distinguish what is important from what is not.
It used to be frustrating. Not understanding. Not knowing. More importantly, not seeing a way out into the comfort of things I could see and touch and hear clearly.
But I realized recently that I actually didn’t seek an end to confusion. I sought precedence. A series of steps to take out of confusion. And then I realized that this precedence had already been set. Many many times over:
Confusion → Frustration → Abandonment → Revisit → Confusion → Frustration…
Becoming familiar with the sequence of how you naturally deal with confusion is extremely useful. Shereef reiterates every day that we are here first to learn how to figure things out, second to learn Ruby or Rails.
The better I understand my confusion spiral, the more I’m beginning to enjoy it. I’m finding that I’m actually seeking out confusion, at least as a programmer. The more often I find it, the more familiar my spiral gets, and the better equipped I am to deal with it the next time around.
Confusion is amazingly rewarding if I give it a chance.
A startup is never competing with other products. It’s competing with nobody giving a sh**.
We live in democracies, but we work in dictatorships.
Source: http
