In order to attract desirable tech talent, desirable people have to want to work for you or with you. There has to be something attractive that you (as a leader) have to offer – the company or business, the technology, the leader (team lead or manager), the location, the pay, the people, the environment, the culture, etc. If you are located in the middle of nowhere, your business is “knife sharpening robots”, your software looks like it was made in the 80’s, the team lead or manager is dislikable, the pay is less than what other companies offer, the technology is obsolete, the culture is miserable, and the reviews on Glassdoor are terrible, it is going to be virtually impossible for you to attract good tech talent. You would be lucky to end up with “indentured servants”, or people who work for you and stick with you because they can’t get a job elsewhere. The best tech talent can work wherever they want for pretty much whoever they want, and if you suck, they are not going to want to work for you. There are people who have received competing job offers from Google, Amazon, Facebook, Microsoft, and other top companies. How can you get their attention or peak their interest, and why would any of them want to work for you? Recruiting tech talent is kind of like dating – if you look and smell like shit, you’re going to struggle with it, but if you are attractive and likable, you’re going to have an easier time with it.
Continuing with the dating metaphor, some companies metaphorically “look and smell like shit”, but they aren’t even aware of it. They are like the guy who smells like farts, and people stay away from him because of it, but nobody tells him that he smells like farts, and unfortunately he can’t smell his own odor. He thinks that he smells like perfume, but he smells like farts. You don’t want your company to be like that. Work on yourself and maintain a good, presentable image and a good network in order to make yourself (or your organization) attractive to the kind of people that you want. It’s like you’re dating, but the “men” or “bees” are the talented software people and the “women” or “flowers” are the companies that need talent. You want your flower to attract the right kind of bees.
I’m going to start with myself for an example. My first tech job I hated, the second tech job I disliked but tolerated, and the third tech job I liked. My first tech job was a contract, through Accenture, for a cruise ship company to make cruise hospitality software. The way a cruise ship is built is very different than the way a website is built. A cruise ship is pretty much finished on the day of it’s launch, but a website is not. This cruise ship company didn’t really know what it was doing or what it wanted from a technology perspective, and they lacked basic technology competence, so Accenture just hired and flew in people from all over the US and had them sit around and pretend to do work for over a month and charged them for it. A friend who had a PhD was paid to get on a plane on Monday, fly in to Miami for work, stay in a hotel, make it look like he was doing work on his laptop, and then fly back home on Friday, all while Accenture collected a percentage of his pay, which by the way was a lot of money. The cruise ship company was basically shoveling cash into an incinerator, and Accenture was totally fine with that, probably because they were making money. It’s fine to hire plenty of people early and provide them with training resources or education during a “ramp up” period, but this was literally highly paid people being paid to pretend to work. I went ballistic and then they fired me. Unlike some people, I am INCREDIBLY productivity oriented – I get bored easily and I want the best tools and the best technology for maximum productivity, so any tech job where I have to sit on my ass, tilt my laptop screen away from a boss, and hit keys on a keyboard to make it look like I am working is a definite no-go. Some people dream of getting paid lots of money to do pretty much nothing, but I don’t, and you don’t want to hire workers who will suck cash out of your company the way a vampire sucks blood. Unhappy, mediocre, or deadbeat tech people who are just there to collect a paycheck and go home will drain your company of finances. If you are a big, fortune 500 company with below average tech competence, and you want a third party to grab 100 tech people from India of varying talent levels and have them create something in a way that is standardized and not particularly innovative, this might be an acceptable approach for you, but to me it is a massive waste of money. In addition, because the people from India who are doing the work for you often don’t speak good English, you can’t communicate with them directly. You end up having to talk to someone, who talks to someone, who talks to someone, who finally talks to the person who is doing work on your behalf. Too many layers. I personally prefer to just see a software bug on my computer screen, take a screenshot, email it to someone with a message that says “this is not working – please fix”, get a quick response, and later see a bug fix on the website.
This is how I get bug fixes from https://buffer.com:
I just shoot them an email, they forward it to the developers, the developers fix the bug, and then I refresh the website and the bug is either fixed or modified. This all happens within the span of a couple weeks.
Back to the main story, my second job was at Amazon Web Services. In theory it would have been a great job. The pay was great, the environment was great, the culture was great, the teammates were great, and the company was great. The place ran like a well oiled machine, but I disliked my job from week one, and I didn’t stop disliking it until after I submitted my letter of resignation and left the company. Amazon took regular employee surveys, but I never explicitly said that I disliked my job and didn’t want to do my assigned tasks, and frankly I don’t think they pickup up on that until the end. Just because a job is great for one person doesn’t mean that it’ll be great for everyone, and just because one person doesn’t like a particular job doesn’t mean that someone else won’t love it and excel at it. Someone else took that job, and whoever it is, I am not jealous of them because frankly it was never a job that I personally wanted.
Going back to the dating analogy, maybe were looking for a relationship and you got the hottest guy, and everyone was like “wow, he’s so good looking,” but he’s not the best guy for you, and you later find happiness with a less hot looking guy. The hot looking guy was Amazon and the less hot looking guy was my follow-up employer, Bank of America. Sometimes certain people look really good together on paper or in a photo, but things don’t work because of “irreconcilable differences”, and they separate. The blame isn’t all on one side or another. Resigning from a job is kind of like divorcing your employer, and this divorce (like the divorce of Jeff and MacKenzie Bezos) was amicable. I learned a lot as a software engineer from my time at Amazon and I have no complaints.
One error I think that Amazon made was that they as an organization are so hyper-focused on the customer that they often miss vibes from the employees. For example, an employee might feel a certain way, but not explicitly say to their boss something along the lines of “here is a thing that I dislike about my job or my company. Allow me to explain it to you while praying that you don’t fire me.”
One detail that I would like to go into is the boss/employee relationship. I have a psychiatric condition and I am mentally “different”. Sometimes it is nice when those differences can be accommodated, a subject that I wrote about in this gist. I’m not going to say his name, but my boss at Amazon was a very humble, soft, respectful guy. He’s a great manager, and I have no issue with him, but I generally avoided him. When he scheduled meetings with me and asked how I was doing or if I had any issues, I generally nodded my head and said “no issues” even though there were issues. There were issues from the day I received my offer, which I accepted to make my parents happy, and those issues remained throughout the duration of my employment, but I didn’t talk about those issues, and I honestly do not think that Amazon was aware of exactly what those issues were until years after I accepted my offer. I remember at the very end of my employment, my boss asked me “Do you like you job?” and in a politically correct fashion I replied “there are moments where I experience brief happiness, like when I complete a task, but in general, no.” Other than brief moments where I felt a short burst of happiness, I did not like my job, but I held on regardless. This was a failure where neither side was entirely at fault. It’s like the divorce where the wife isn’t happy and her needs are not met. As a boss, you want happy, productive employees rather than people who merely tolerate their job so that they can collect a paycheck and go home after having put in the minimum number of hours. This is especially true in the software industry.
I’d also like to say that there was a personality mismatch that didn’t help. During my employment, my boss repeatedly said that I was overly soft-spoken during team stand up meetings, and that when I did go into verbal detail nobody cared. Oh boy. I don’t think he actually saw the kind of person who I am until well after I left Amazon, and perhaps I acted a certain way to make myself more tolerable to other people like him. Sometimes one person kind of puts on a mask and pretends to be someone different than they really are so that someone else can be in a relationship with them. Like imagine a wife who pretends to be this soft, womanly wife in order to fit certain gender roles in order to be with this hard, manly man who got her pregnant so that they can stay together for another month for the sake of their baby (who may or may not be this other man’s biological child). Like this hypothetical person, the real me kind of tried really hard to remain in a relationship. The real me is this very aggressive, forward, borderline egomaniac who will steamroll anyone who gets in my way, but in this relationship, I made my behavior different than it usually is am in order to make it last longer because I didn’t think that I could get a better job than the one I had at Amazon. I mean, just look at how sparkly the word “Amazon” looks on a résumé. Seriously though – there is not one job that is the best job for every person just like there isn’t one boyfriend who is the best boyfriend for every woman. Like a romantic relationship, an employer/employee relationship is a relationship and it should be treated as such. There are cheap, short-term relationships that just temporarily give you what you want and there are valuable long-term relationships that are more than that, and if you are building high quality, long lasting, maintainable software, then you want the latter, not the former. Temp workers can provide supplemental assistance, but a company like Amazon is not built by temp workers. Just like a good child is raised by caring parents, a good company is raised by responsible leaders who treat it like their baby. Amazon was like Jeff Bezos’s baby.
Getting good talent for your software project is a skill in and of itself. You could pay some company to hire cheap people in India to bombard programmers on websites like LinkedIn, Dice, Monster, and Angel.co with spam cell phone calls, but unless you want to throw spare cash at cheap overseas tech workers who will build a low quality product, that approach is usually not the best. Tech recruiters as a group are annoying, sometimes calling people like myself multiple times an hour and hitting them with over a dozen spam emails a day, wasting the programmer’s time pitching totally irrelevant or uninteresting jobs that they wouldn’t do even if they received an offer. They don’t really know which jobs go with which people because they don’t have domain expertise, so they do keyword searches and send mass emails. Cheap tech recruiters are like guys on Tinder. They swipe right on everyone and send the same first message to almost every woman, and sometimes they come off as desperate. Unprofessional tech recruiters can make the end client look bad, pathetic, or desperate, and the jobs that they pitch usually pay less and have less benefits than what high end tech company jobs pay. Basically, these recruiters bother people in order to get them to agree to employment that they don’t want. In addition, if talented people come to you asking you for a job, you have more bargaining power than if you come to them and ask them to work for you. Tech recruiters serve as a liaison between programmers who are looking for a job and companies that most programmers do not want to work for. For all these reasons, cheap tech recruiters are a last resort or at most a supplement to more professional recruiting methods. Staffing companies may display the semblance of professionalism, but that’s just the surface. If you go deeper, it’s just a bunch of people with zero domain working a call center in order to make a commission. They don’t actually care about the people who they are contacting – they want money.
In contrast to the way these people who don’t know what they’re doing do it, allow me to explain how I recruit. At Bank of America, we needed people with a very esoteric specialty, “Semantic Web”, so we resorted to hiring smart people who don’t know what that is and providing them with educational resources and “ramp up time” to learn during the first few months of their employment. My manager, “Rick Short” said “You can’t hire people who know Semantic Web. Trust me, we tried.” Not long after he said that, I befriended someone online who was getting a PhD in this subject, and through me this PhD student reached out to my employer. Savy networking can be helpful when recruiting people. For example, on https://www.meetup.com/, I found tech events where people can network with tech people. I talked to some subject matter experts at an event and recruited some teammates for a startup that I was interested in creating, and at least one of them seemed genuinely excited about my idea. For me, networking works much better than paying someone from overseas who doesn’t speak good English to filter through online employee profiles by keyword and bombard potential employees with spam calls. The following story comes to mind.
On my resume, I wrote something to the effect of “Even though I have experience with Ruby, I hate Ruby. Please do not contact me with Ruby jobs.” A recruiter then proceeded to contact me with a Ruby job, perhaps because my resume had the word “Ruby” in it. This was incredibly annoying. In addition, it’s often better to just hire good, talented people with a similar (but not identical) skills to what you need and have them pick up new skills while they are an employee of yours (for example through a combination of online educational resources, books from https://smile.amazon.com, and employer sponsored training) rather than hire people whose specific skills are an exact keyword match with the technologies that you have. For example, C# and Java are similar in that they are both statically typed, object oriented programming languages, so even if you have a Java project, it’s usually better to hire a good, talented C# developer and have them pick up Java than it is to hire an average Java developer and not have them not learn new things while they are an employee of yours. Ruby and Python are similar, Swift and Kotlin may be similar, and F# and Scala are similar. There aren’t many backend Scala programmers, but if I were looking to fill a roll, I might seek out good F# programmers and have them pick up Scala because these two programming languages are similar. In general, people can quickly pick up programming languages that are similar to what they already know, but picking up something different is more difficult and takes more time. The similarity between F# and Scala is not obvious to most people, so it helps to have domain expertise which can be obtained by read online articles and Wikipedia.
Your run-of-the-mill tech recruiter typically doesn’t know these things because they’re basically call center workers who lack background information. In the absence of information, they rely on heuristics. For example, they might obtain a list of keywords which they jot down on a piece of paper, and then search for people with those keywords on their profiles or in their resumes. Me personally, if I had a really esoteric technology and I was hiring for that, I would look up that technology on Wikipedia, look at “related technologies”, and find people with related skills who could pick up this esoteric technology on the job, but your run-of-the-mill tech recruiter would probably just resort to copy-pasting keywords and dialing through a list of people, often pissing people off in the process. Example:
One way to tell which programming languages are related is by looking up a programming language on Wikipedia and looking at the attributes and the “influenced by” section:
From Wikipedia, I can see that “Kotlin” has static typing (just like Java, C#, Scala, Gosu, and ML) and that it was influence by “C#, Gosu, Groovy, Java, ML, Python, Scala”. I don’t actually know what “Gosu” is, but Wikipedia tells me that it is statically typed and that it runs on the Java Virtual Machine, as does Kotlin. Because of these similarities, if I saw someone with “Gosu” on their resume but no “Kotlin”, I would still consider them in my recruiting because of these similarities, and also the fact that anyone who knows a language as esoteric as “Gosu” probably has picked up most of these other languages at some point. There aren’t many backend Kotlin developers, but Kotlin is not a hard programming language to learn, so if someone knows say Java or Scala, they should be able to pick up Kotlin over the course of several weeks, especially if I order them a book and provide links to online educational resources and entry level “baby” tasks like tiny bug fixes. Personally, I am more of a physical paper-and-ink book kind of person, but different people learn things in different ways and ideally there should be multiple different ways to learn the same thing. Learning doesn’t end when you get a degree – you have to keep learning new things to stay relevant and up-to-date in tech. Some people program old mainframes, and that is great for them, but I like to stay on the cutting edge, and even mainframes eventually get decommissioned.
Informational video on recruiting and hiring: https://youtu.be/fSOTocaLhJM
Now I’m going to change the topic to hiring and screening.
On the topic of hiring, high-end tech companies have their own policies, procedures, and recommendations, and they evaluate potential employees and make offers based on their evaluations. They train people on how to conduct interviews and copy interviewing techniques from other companies, often adding their own twist to existing techniques. Techniques which are described in books like “Cracking the Coding Interview“. I might also Google “How to conduct a good Programming Interview” and conduct interviews based on my research. If your hiring manager goes on Google, types in “Interview Questions For [Insert Technology]”, and then asks online questions verbatim, then you’re going to end up hiring people who are good at Googling interview questions on their cell phone.
Companies that are not tech savy do not have the means to attract and recruit top tier talent on their own, and they often don’t even know how to estimate a programmer’s worth. Rather than going through all that, they might hire ten people at say $65 an hour, and out of those ten, one is horrible, two are bad, five are in the middle, and three are good. Overall, it averages out, particularly if they get lucky and end up hiring a really good person who sets things up in such a way as to positively direct and ultimately help the group of programmers as a whole. That being said, if you don’t know what you’re doing, hiring programmers is a crap shoot. Spam recruiting is for technologically undesirable companies that just want to throw money at a recruiting agency and get labor that will eventually do work. If you advertise and network well, have an attractive looking business or company, can attract and recruit top tier people, and know the kind of people you’re looking for and how to peak their interest and train, then you generally don’t need to resort to paying recruiters to make cold calls and send out mass emails.
Popular tech companies that pay well, like the FANG companies (Facebook, Amazon, Netflix, and Google) have their own internal recruiters who (in my experience) have excellent social skills and speak perfect English. They can stop by at University job fairs and can be socially charismatic with a variety of people. As an aside, these interpersonal workers tend to also appear more attractive looking than tech people, especially at networking events. They are more likable than people overseas who make cold calls, and they don’t make the company that they are representing look cheap or desperate. In addition, Amazon has an employee leadership principle that is as follows:
Me personally, I am very socially outgoing and if I’m passionate about something, I can delve into it and convey that passion to other people. This can be helpful when recruiting. Personally, outsourcing my recruiting to a firm that hires people from overseas would be a last resort, and only something that I would resort to if I had a lot of spare money and an inability to recruit talented people on my own.
I might also consider hiring people through TripleByte, which is a service that screens people in bulk with an online exam that covers a myriad of computer science fundamentals and then runs programmers who pass this exam through a rather difficult tech interview over a website like https://codeshare.io/ or an app like Skype. I personally like this approach, and also I personally prefer doing my coding interview with Skype via screensharing or by solving a challenge while screen recording my computer. I tend to get distracted by the other person’s face on Skype, so my personal favorite type of tech interview is when they just send me a hard problem, I turn on my screen recording software, forget that it is recording, work on the problem for an hour or two, and then send them the solution and the recording in video format showing me solving the problem on my computer. I like this approach because I don’t get distracted by the screen recorder and it verifies not only that I solved the problem, but how I solved the problem. Skype is not bad, but I find the little square with the other person’s face in it distracting. Using a whiteboard is also pretty good, although you should research how to conduct a whiteboard interview before attempting to do one on my own, and I would also watch an example whiteboard interview or shadow one. My least favorite interview method is when prospective employers make me write code inside of a code sharing website like https://codeshare.io/ because I rely heavily on tooling like my Itegrated Development Environment (IDE) and I am basically so dependent on tooling that I can’t work productively without it, and online browser based coding lacks tooling. For me, tooling makes an order of magnitude difference in my productivity and once I start using a tool that I like, I forget how I lived without it. For example, I pretty much don’t even know how to navigate without Google Maps anymore because I am dependent on that tool. Without the Google Maps tool, I get lost. My coding productivity tools are kind of like Google Maps in that regard.
Different programmers like different tools, and they’re going to run into problems if you drop them in say the middle of nowhere with no “Google Maps” like tool. Also, regardless of whether you use a WhiteBoard, Skype, a ScreenRecorder, or do your screening some other way, some form of filtering or evaluation is a must. Different organizations do it differently, and there is not a perfect approach for every organization, but your organization needs some sort of filtering and evaluation method, and preferably one that is standardizable and widely applicable. A given tech person could be worth $300k to one employer and $50k to another employer, and I want to filter out the people who are worth $50k to me rather than hiring a mixture of people who suck and people who are good and hoping that the good people will balance out with the sucky people. Maybe that $50k person will be worth $150k to another employer in another job role, so you want that person to go work for someone else rather than having them suck money out of you or your company. Amazon kind of nudges these people out of the company by for example offering them a financial incentive to leave the company within a certain timeframe. I resigned without being paid to quit, as described in this article, but you really want unhappy people who don’t want to do their job to go find another job or position.