Tagged: career advice

TALK! It’s An Interview, Not An Interrogation

Several times a year I will get a call or email from a hiring manager telling me that an interview never really ‘went anywhere’ because the candidate seemed either unwilling or unable to dive very deep into technical topics.  It can be impossible for an interviewer to accurately gauge whether the cause was a lack of tech skills or just an inability to communicate those skills, but it really makes no difference as the end result is a rejection.  This observation is probably a bit more prevalent during phone screens, where the parties do not have the advantage of proximity and body language to assist.

Whenever I hear feedback like this from clients, I imagine what the interview may have sounded like:

INTERVIEWER:  Have you worked with Ruby on Rails before?
CANDIDATE:  Yes, I have.
INTERVIEWER:  Could you elaborate on that a little bit?
CANDIDATE:  Yes, I could.
INTERVIEWER:  (VISIBLY ANNOYED)

It brings to mind the old joke (which of course reinforces gender and programmer stereotypes):

A wife asks her computer programmer husband, “Go to the store and get a gallon of milk, and if they have eggs get a dozen.”  A short time later the programmer returns with twelve gallons of milk.  She asks, “Why did you get twelve gallons of milk?” and he responds, “They had eggs.”

In the short two question interview scenario above, the candidate is answering the questions being asked, and the candidate is providing all the information that was being requested.  If you look at the questions in a literal manner (as many engineers tend to do), this candidate may not feel he/she is being dodgy at all.  Just as the programmer in the joke did what his wife asked (by his literal interpretation).

Let’s now look at a brief example of a police interrogation:

INTERROGATOR:  Where were you on the night of the 8th?
SUSPECT:  At home.
INTERROGATOR:  Were you by yourself?
SUSPECT:  No
INTERROGATOR:  Who was with you?
SUSPECT:  My husband.
INTERROGATOR:  WHO WAS WITH YOU??!!
SUSPECT:  My lover!  (CUE SCARY MUSIC)

These answers provide the minimum amount of information the interrogator requested, and a lawyer will probably advise you to keep your answers short and precise during questioning.  The interrogator’s job is to get a suspect to say something that he/she does not want to reveal.

A job interview is not an interrogation, and it is important for candidates to be sure they are not treating it as such.

Keep in mind that interviews, particularly in technology settings, can be awkward situations for participants on both sides of the table.  Most interviewers are at least slightly uncomfortable being placed in a room with a complete stranger for the sole purpose of judging him/her in order to reach some conclusion about whether he/she should be hired, a decision which could greatly impact the life of at least one party (the candidate) or even both parties (if the hire is made).  If an interviewer gives even a small consideration that this stranger may have a family that depends on the income that the job would provide, the potential for an awkward exchange is even more likely.

Most interviewers want to get a dialogue flowing, where the discussion will allow them to evaluate your technical and interpersonal skills.  They want to control and moderate the conversation, but they would like to listen more than they speak.  The candidate’s ability to communicate his/her thoughts will be apparent after a few questions.  At some point most interviewers have to ask themselves, “Would I want to work next to this person every day for several years?”  If the candidate answered their questions in a fashion resembling the Candidate or the Suspect in the samples above, the answer is always “No”.

Some candidates may argue that they have answered the questions as asked, and that if the interviewer wanted more details he/she should have inquired for them specifically (“Tell me about Ruby on Rails experience.”).  This is a valid observation, but it doesn’t solve the problem.  It’s purely a function of conversational English, and it is one reason that chatbots with artificial intelligence may give answers like our Candidate did in the example.

So, I’ll just keep talking and talking to solve the problem?  NOPE.  There is also the possibility that if a candidate answers every question with a long-winded response, he/she may be rejected for not being able to provide succinct answers.  Managers are often unwilling to hire someone who they feel is unable to express themselves efficiently, and in the case of software engineers you may hear, “Being that chatty, I can’t imagine what his/her code (comments) looks like!

How do I appear to be open, honest, and transparent without sounding chatty?  How do you avoid being labeled as unable or unwilling to answer interview questions?

  • Don’t take every question literally – Remember that a good interviewer is trying to engage you in a dialogue and an exchange of ideas.
  • Pause before answering – Some candidates seem programmed to immediately start talking after a question is asked, and then find that they haven’t really answered the question.  Taking a moment to reflect on the question and to organize your thoughts gives the appearance that you are making an effort to supply a strong answer and that you are not impulsive.  A little white space does not have to be an uncomfortable silence.
  • Pause after answering –  If the interviewer does not respond with a follow-up after a few seconds, he/she may be waiting for you to go deeper.  Ask if he/she is satisfied with your answer and offer to continue with more information if necessary.  “Would you like some more details on that?
  • Ask questions to clarify what type of answer is expected – If you are asked a question where there could be both an acceptable short answer (yes/no) or a longer answer (details), give the short response and offer the interviewer more.  “Yes, I have used Ruby on Rails.  Would you like me to discuss my experience further?
  • At the end of the interview, ask the interviewer if they have any other questions that will help them make their decision. Invite them to contact you in the coming days if any additional information is required or if they would like any clarification on the answers you provided.

Go into the interview with the goal of having a conversation which should put the interviewer at ease.  Be willing to follow the interviewer into any direction the discussion may take, and ask questions so you know that you are on the same page.

If you found this post useful, you may find my ebook Job Tips For GEEKS: The Job Search even more helpful.  You can follow Job Tips For Geeks on FacebookTwitter, or Google+.

Advice From A JUG Leader II – Debate Breakdown

It’s been a week since I posted “Advice From A JUG Leader – Learn a Different Language” and it seems to have ruffled at least a few feathers in the Java community. As the article has been re-posted and bounced around on Twitter, I have had some opportunity to interact with some members of the Java community who have strong feelings about the content. None have called for my death, and the debate has been almost entirely polite thus far.

I think and sincerely hope that the Java community understands that the impetus for writing this article was an observation that many in the Java community are simply not aware of the trends in the industry, and by the time those trends become standards it is too late. These are the people that, if the train does come, never heard it approaching. My purpose is not to predict or encourage the demise of Java, as that should not and will not happen. The Java community is deeply loyal to Java, perhaps even to a fault, and I hope these articles serve as a wake-up call that the most important loyalty should be to your career as a software professional and to neither an employer or language.

I have noticed from these mini-debates is that defenders of Java, at least in my interactions so far, seem to primarily be highly experienced developers that perhaps have the most invested in Java. As I mentioned in my original article, I don’t expect known Java experts to feel any changes. At least a few of the comments seem to come off as rants against youth (“go play your Xbox“?) and startup culture and not a defense of the language’s health itself. I haven’t seen the younger generation of Java pros, but I know they are out there. I don’t seem to see Java enthusiasts attacking faults in the alternative languages or praising Java for a superior feature set.

Some comments seem to admit that Java has some shortcomings just like other languages, but it’s what we have for now. That is good enough for some people – particularly those that have been in Java for a long time – but not good enough for many developers who want to work with the best available. The arguments so far have been, in no particular order:

Argument #1 – Don’t Use Alternative Languages Because The Languages are Unproven, and/or Only Startups Use Alternative Languages

“And, don’t forget, 70% of startups will fail within the first ten years. So, I’m not inclined to base my decisions on the faulty and unproven ability of start-ups to make sound business decisions for themselves.” – Comment from TSS reader, click for full context

Some of the languages are more proven than others obviously, but we can’t ignore the fairly regular news regarding established firms transitioning to alternative languages and platforms or taking a polyglot approach. I would hardly call companies like Twitter, YouTube, foursquare, LinkedIn and Google immature startups at this point. If you are going to argue that there are plenty of other shops that use Java, we all know that. The point is some startups (those most apt to use these alternative languages) have made bad decisions (as have large firms), but to call the languages themselves ‘unproven’ at this point would not be accurate. No guilt by association here.

Businesses don’t make decisions, people do. I don’t think we should fall into the trap of lumping together the decisions made inside of some startups as any proof of language relevance at this point. When a host of startups fail due to their language choice alone, that conversation can be had.

If you were around back in the late nineties there were a lot of technology startups with funny sounding dot-com names. Many of these companies were using a three or four year-old programming language called Java. They could not have predicted that Java would grow to be as popular as it is today.

Note:  Python is older and Ruby is about the same age as Java, Scala has been around for 9 years, Clojure for 5 years.

Argument #2 – If You’re Bored With Java, That Is No Reason To Branch Out

“Becoming “bored or frustrated with Java” is a pretty poor excuse for branching out. As a professional, I’m not paid to feel entertained and broadened in my horizons. I’m paid to get things done as efficiently and as well as I possibly can… Go home and play your Xbox to relieve boredom. Don’t make your employer pay for yet another language learning curve so that you feel less bored and frustrated.” – Comment from TSS reader, click for full context

Simply being bored with Java could be enough for someone to look for other alternatives. I think the bigger issue is that technologists who pay attention to developments in other languages are envious of the features that other languages provide. Today, I feel that a smaller percentage of the Java community explore alternative languages based either on less curiosity or less opportunity. As the Java community at large is exposed to these other languages more and more, I would expect you will see many more defectors. The early adopters of Java were the most curious C++ or C developers who were looking for something different and stumbled on Java, and the most curious of Java pros stumbled on these other languages over the past few years.

Argument #3 – The Assumption That Most or All Of These Alternative Languages Will Be Dead In 5-10 Years

“If I’m off learning optional languages, I’m falling short of what I get paid to do. What’s more, I may have decided to do some development in one of the latest and greatest languages that, in a few years, will fall by the wayside, and now I’ve left my employer with a bunch of projects that will have to be re-written into a language that is currently active and supported.” – Comment from TSS reader, click for full context

Many of the early adopters of Java, as I mentioned in my article, have already been exploring some of these alternative languages for some time now. Often they were not initially paid to do so.  Could some of these languages be dead in 5-10 years? Sure. Most of the languages I’m thinking of when I talk about alternative languages are already 5 years old, and some much older. Even the young Ruby/Rails combo has been around for over 5 years.

Did people make the same assumption about Java back in the late nineties?

Argument #4 – Look At The Evidence That These Alternative Languages Are Not Being Adopted/Used/Sought After

Some defenders of Java have been pointing me to various statistics as proof that these alternative languages are not being used, not being sought after by employers, or not being adopted. I would cede that none of the current crop are even close to Java in terms of popularity today. I was sent to this link from Networkworld.com that says Java developers are the “most difficult tech pros to land, followed by mobile developers“. I wonder where the demand for mobile developers was three years ago? Would mobile development be a valuable skill to learn at this point?

As a recruiter, I’m also having a bit of a harder time finding Java developers now. One of the main reasons for that is pretty simple – a lot of the people that I know that used to do Java work aren’t interested in doing Java work any more. Over the years I’ve met a fair amount of experienced Java developers that were dying to get a job doing mobile work, Ruby work, Scala work, etc., but I’m not finding too many Ruby or Scala programmers with five years out of school looking for their first Java job. Maybe it’s just me, but I don’t see that…ever.

Another link was given to the Tiobe Index, which is pretty widely used to highlight trends of language popularity. It is based on search engine hits.  All indexes like this have some obvious flaws. If you read Tiobe’s Definition, the phrase “Java programming is dead” will actually improve Java’s position in the rankings. So absorb these ratings with that in mind.  They measure chatter, which could be positive or negative.

Tiobe Index July 12

Tiobe Programming Community Index for July 2012

Well, the takeaway from this graphic, for me anyway, would be that Java dropped significantly and Objective-C seems to be gaining popularity dramatically. But this could be some anomaly in a given month.

Tiobe Long Term Trend

Tiobe PCI 10 Year Trend

“Java has slid only recently and barely while the much touted JVM languages aren’t even on the radar” – Comment from Dzone.com reader, click for full context

The green line that is Java seems to be trending downward on a fairly regular basis since ’02.  I’m not sure I’d refer to a 10 year decline as ‘recent’ in the technology industry. Again, I don’t think the Tiobe index is the ultimate indicator, but I wouldn’t point someone to this statistic to support an argument that Java is healthy.

Objective-C wasn’t listed in 1997, was ranked #46 in 2007, and now stands at #3 on the index. If you had picked up Objective-C a few years ago, say in ’07 when it was not entirely popular, you would probably be doing well today as the demand for iOS work is quite high and the supply of developers is quite low. In ’97, Java was #5 – one spot behind VB and two spots behind COBOL.

Conclusion

The arguments against learning a new language or using a new language in production were probably the same back in the late nineties when Java was still new. People surely came to the defense of C and C++ saying that we didn’t need a new language then. It’s progress and subsequent resistance to change, and in the technology industry change can sneak up on you pretty quickly if you aren’t paying attention.

I feel that many in the Java community may not be paying close attention. 

If you were a C++ programmer messing around with applets back in ’96, you’ve already been through this transition once. What I’m hearing now from experienced folks is that these alternative languages are for start-ups, “Trix are for kids!“. I know quite a few gray haired former Java developers that are getting paid to write code in other languages now, and I think they would tell you that the alternative language market isn’t just for kids. Were you using Java in a start-up back in the day – were you one of the kids?

My purpose in writing these posts is to make a certain element of the Java community aware of what is out there, and that in my opinion now is an opportune time based on external market forces to explore other languages. This is not an attack on Java as a language or on the people that choose to write in Java. I’ve dedicated much of the past 12 years to the Java community and I don’t intend to change that now. I expect that I will be involved with Java professionals for several years, helping them to find jobs and scheduling great events for my JUG. I chose to change the focus of my business beyond Java, and my suggestion to Java professionals would be to at least consider and research doing the same.

Why You Didn’t Get the Job

Over the course of my career I have scheduled thousands of software engineering interviews with hundreds of hiring managers at a wide array of companies and organizations.  I have learned that although no two managers look for the exact same set of technical skills or behaviors, there are recognizable patterns in the feedback I receive when a candidate is not presented with a job offer.

Obviously, if you are unable to demonstrate the basic fundamental skills for a position (for our purposes, software engineering expertise), anything else that happens during an interview is irrelevant.  For that technical skills assessment, you are generally on your own, as recruiters should not provide candidates with specific technical questions that they will be asked in an interview.

It should be helpful for job seekers to know where others have stumbled in interviews where technical skill was not the sole or even primary reason provided for the candidate’s rejection.  The examples of feedback below are things I have heard repeatedly over the years, and tend to be the leading non-technical causes of failed interviews in the software industry (IMO).

Candidate has wide technical breadth but little depth – The ‘jack of all trades’ response is not uncommon, particularly for folks that have perhaps bounced from job to job a little too much.  Having experience working in diverse technical environments is almost always a positive, but only if you are there long enough to take some deeper skills and experience away with you.  Companies will seek depth in at least some subset of your overall skill set.

Candidate displayed a superiority complex or sense of entitlement – This seems most common when a candidate will subtly (or perhaps not so subtly) express that they may be unwilling to do any tasks aside from new development, such as code maintenance, or when a candidate confesses an interest in exclusively working with a certain subset of technologies.  Candidates that are perceived as team players may mention preferences, but will also be careful to acknowledge their willingness to perform any relevant tasks that need to be done.

Candidate showed a lack of passion – The lack of passion comment has various applications.  Sometimes the candidate is perceived as apathetic about an opportunity or uninterested in the hiring company, or often it is described as what seems to be an overall apathy for the engineering profession (that software is not what they want to be doing).  Regardless of the source of apathy, this perception is hard to overcome.  If a candidate has no passion for the business, the technology, or the people, chances are the interview is a waste of time.

Candidate talked more about the accomplishments of co-workers – This piece of feedback seems to be going viral lately.  Candidates apparently ramble on about other groups that built pieces of their software product, QA, the devops team’s role, and everyone else in the company, yet they fail to dig deep into what their own contribution was.  This signifies to interviewers that perhaps this candidate is either the least productive member of the team or is simply unable to describe their own duties.  Give credit where it is due to your peers, but be sure to focus on your own accomplishments first.

Candidate seems completely unaware of anything that happens beyond his/her desk – Repeatedly using answers such as “I don’t know who built that” or “I’m not sure how that worked” can be an indicator that the candidate is insulated in his/her role, or doesn’t have the curiosity to learn what others are doing in their company.  As most engineering groups tend towards heavy collaboration these days, this lack of information will be a red flag for potential new employers.

Candidate more focused on the tools/technology than on the profession – Although rare, this often troubles managers a great deal, and it’s often a symptom of the ‘fanboy’ complex.  I first experienced this phenomenon when EJB first arrived on the scene in the Java world, and many candidates only wanted to work for companies that were using EJB. When a technologist is more focused on becoming great at a specific tool than becoming a great overall engineer, companies may show some reluctance.  This is a trend that I expect could grow as the number of language/platform choices expands, and as fanatical response and the overall level of polarization of the tech community around certain technologies increases.

Candidate’s claimed/résumé experience ≠ candidate’s actual experience – Embellishing the résumé is nothing new.  A blatant lie on a résumé is obviously a serious no-no, but even some minor exaggerations or vague inaccuracies can come back and bite you.  The most common example is when a candidate includes technologies or buzzwords on a résumé that they know nothing about.  Including items in a skills matrix that are not representative of your current skill set is seen as dishonest by hiring managers.

Candidate’s experience is not ‘transferable’ – If your company is only using homegrown frameworks and proprietary software, or if you have worked in the same company for many years without any fundamental changes in the development environment, this could be you.  The interviewer in this case feels that you may be productive in your current environment, but when given a different set of tools, methodologies, and team members, the candidate may encounter too steep a learning curve.  This is often a response on candidates that have worked within development groups at very large companies for many years.

Give some thought to these before your next interview.

If you found this post useful, you may find my ebook Job Tips For GEEKS: The Job Search even more helpful.  You can follow Job Tips For Geeks on FacebookTwitter, or Google+.

I Heard That Company Was Horrible (three years ago) – Truth in Company Reputation

Let’s start with a brief exercise.

  1. First, name three companies in your area that you have heard negative details about from other software engineers (sweatshop, poor code base, horrible software processes, buggy product, low salaries, etc.).  Places you would probably never work.
  2. Got it? Now name three companies in your area that you have heard stories about, and you would classify them as great places to work.  Places that you would pick up and leave your job for tomorrow.

If I had to guess I would say that the first question was probably much easier to answer than the second, and the obvious reason is that bad news is sticky and tends to travel fast. There is evidence of why this happens – read about the availability heuristic as an example.  Your ability to recall a co-worker saying his former employer was ‘pleasant’ is lower than your ability to recall him saying that ‘the place was a sweatshop’.  Casual sports fans will know OJ Simpson or Kobe Bryant more about them from tabloid headlines than their impressive athletic statistics. The same goes for anecdotal evidence about technology companies, and unfortunately some technologists miss out on great opportunities based on what is often dated or inaccurate information.

When I start a search for software engineering talent with a new client company, I  know that it is only a matter of time before I will hear a candidate telling me that he/she has heard that my client has flaws. No company is immune, and I always dig deeper to find out what the candidate has heard. Sometimes the information is so outlandish that it can be immediately dismissed, but more often than not there is some truth in the dirt, and it’s important to find out as early as possible about any skeletons in the closet.

When presented with patterns of information that paint my client in an unflattering light, I go to the client with the ‘word on the street’ and ask if there is any merit to the stories. Most shops own up to past sins and how they remedied the situation, or sometimes they say that the issue is still an issue.

Part of the problem is a general mistrust of the messenger (recruiters) by the tech community, with the prevailing thought that recruiters lie.  Some do. Another potential issue is that companies looking to hire tend to describe their environment as they would like it to be and not as it actually is. Self-assessments of work environment, the quality of an engineering team, and internal development process will often be at least slightly biased.  Lastly, the web is a tremendous resource for finding negative opinions on companies from disgruntled former employees, but probably not a great tool for honest company reviews.

The inspiration for this blog post was a discussion I had last week with a candidate.  I was giving him details on a new client company and the candidate told me that he had heard a few years ago that they suffered from high turnover, poor technical leadership, and the engineering staff was overworked.  I told him I would look into this as I had not heard any of it before, and this candidate told me that at this point he was not interested in pursuing the opportunity.

I immediately contacted an engineering director at the client and asked about the feedback.  The manager responded that their turnover was about industry average and provided numbers for the past year.  He told me that there indeed were two managers who were ineffective and they had been released earlier in the year, and the managers that replaced them have received positive reviews from their engineering teams.  Lastly, the manager described several improvements they have made over the past two years to try and appease the development staff.  These changes included the creation of an application support group that would tackle client issues and bug fixes that the development team had previously handled, upgrading the physical office space and equipment, and redesigning the floor plan to increase developer collaboration.

I was quite pleased with this response, as it answered all of my candidate’s concerns while acknowledging that there was some historical truth to the information.  When I shared this information with the candidate, he felt that he would like to pursue the opportunity.  I don’t know if he will or won’t get the job at this point, but his ability to keep an open mind at least gives him the chance to compete for a good career opportunity.

Simply put, a bad reputation or stereotype is difficult for any organization to overcome, even if the information is old or completely inaccurate.  Many companies are able to change with the times and make improvements over time, and technology companies are perhaps more adept at reinventing themselves just based on the ever-changing world of software development.  If you don’t want to miss a potential great opportunity, weigh the evidence you have seen and keep an open mind.

Lessons From a JUG Talk With Eric ‘ESR’ Raymond

(full video of ESR’s presentation from YouTube below this post)

I have been President of the Philadelphia Area Java Users’ Group for 12 years, and as one might expect a typical meeting is geared around a presenter with a slide deck that gives a deep dive into some Java topic.  We could hear a case study, an explanation of a tool, tips for programming effectiveness, etc.   The JUG has followed this model since I founded the group in 2000, and we manage to get between 75-150 attendees at most meetings.

Last month we held a meeting that was entirely different.  I had reached out to Eric Raymond (aka ‘ESR’), who is best known as a leader in the open source software movement and author of The Cathedral and the Bazaar, about potentially speaking to the group.  Although ESR is not commonly associated with Java, I thought it would be an opportunity for the group to hear a well-known and respected engineer speak about a topic.  ESR suggested that he would do a free-form type presentation, without notes and slides, and simply take questions from the audience to use as improv material.  With about 150 engineers in attendance, ESR fielded a fairly wide array of questions on everything from functional languages to open source licensing to coding standards.

So why am I posting this article on JobTipsForGeeks?  As a recruiter I am often asked for career advice by my network of engineers, and my answers are always based much more on market trends (supply and demand) and ‘buzz’ around various technologies than on the viability of the technologies themselves.  For example, I am well qualified to discuss the adoption of specific languages by software companies in my region, but I am much less qualified to discuss the long-term viability of those adoption choices from a technical viewpoint.

As ESR was asked some of the same questions I am often asked, I thought his answers and insights were an opportunity for the audience to hear a ‘technically-grounded’ counterpoint (or supporting evidence) to the market-based advice I provide to individuals.  His specific commentary on functional programming languages and the value of learning them regardless of adoption rate was something I thought was insightful advice for engineers of all levels, and his musings on coding standards and how to obtain management ‘buy-in’ on open source are great tips for navigating at companies that may not be as tech-friendly as others.  These are not all specifically ‘job tips’, but I believe there is certainly some value in reading these opinions as you decide on which directions you may take your software career.

The quotes below are ESR’s responses to questions, organized by topic.

ON PYTHON
“Yes, I really like Python.  I like it for a very specific reason.  I like Python because of all the languages I have ever used, it is the one that maximizes ease of long term maintainability.  That is, the ease with which you can read your code six months later.  The longer I program, the more convinced I am that that is THE most important metric of a language, bar none… Most of the programming I do these days is in either Python or C.”

ON JAVA
“I still haven’t actually learned Java well enough to do more than a couple hundred lines of programming in it.  I don’t dislike Java but I think it is a little over-verbose, it’s become kind of top heavy.  So it’s not my first choice, but if I had to write something in Java I wouldn’t go ‘ICK’.

ON C++
“C++ has the exact opposite problem to the virtue I had called out in Python.  Long-term maintainability of C++ code, TERRIBLE.”

ON PERL (answer continues from his answer on C++ above)
“OK, the best thing I can say about that is, it’s not as bad as Perl, but I’m afraid that constitutes damning with faint praise.  I still like Perl fine and occasionally use it, as long as the program isn’t more than 25 lines long.”

ON GOOGLE GO
“I am sort of gingerly dipping my toes into the waters of Go, Google’s new language… I’ll tell you one concurrency thing I am really pleased by.  I have been wondering since about 1971 why nobody took the ball and ran with Hoare’s communicating sequential processes model.  So elegant, so pretty, so nice to reason about and 40 years later the Go people picked it up and ran with it.  That’s one reason I’m looking at Go.  CSP is the basis of their concurrency model in that language which is enough to motivate me to want to look at it some more.”

THOUGHTS ON THE JVM BECOMING MORE GENERAL PURPOSE
“I’m mostly ok with that.  I think the JVM has some deficiencies near word length and there are some serious problems with the numerical tower…It needs some work to be a really robust platform, it’s good but not as good as it needs to be.”

ON RUBY 
“I’ve dipped into Ruby a little bit, there was a point where I had to modify some Ruby code for a project I was working on, so I think I understand the language a little, maybe not master level.  My impression of Ruby is that it has pretty much the same virtues and the same problems as Python, and I might be tempted to switch except that it’s not different enough.  Functionally speaking of course, I mean aesthetically there is all kinds of odd little differences.  But it’s not different enough from Python to make me move, that’s my impression.”

ON SCALA
“It’s on my list of languages to learn.  I have a friend whose judgment I trust who says it is a very good design, and that’s enough reason for me to go look at it.”

ON OPEN SOURCE LICENSING/GPL
“…this is one of my more incendiary opinions, I don’t think we need the GPL anymore…My attitude in general is just use permissive licenses, stop with the viral stuff…”

ON OPEN SOURCE 
“If you’re thinking in terms of bringing open source inside the corporation, you’ve already failed.  That is already thinking in the wrong direction because you’re trying to figure out how to control and make safe a process that thrives on lack of control and no safety, other than good code review.  Instead of thinking about how to bring open source inside the corporation, the right kind of question to ask is ‘how do I start up an open source project that benefits my corporation, build a community, and THEN sell it to my bosses?’.  Because one of the iron laws of dealing with bureaucracy is ‘it is easier to get forgiveness than permission’…How do I start an open source project that will interest my bosses, get it viable, and then sell it to them once they have a benefit that they can see?…Show them a benefit.  Don’t say ‘we can do this wonderful thing if you authorize me to spend n hours with no obvious physical return’.  That is something a manager is always going to say ‘no’ to.  What you have to do is show them a benefit.  It works much better, for example, to find an existing piece of open source software that is fairly close to solving the business problem and going to your boss and saying ‘you know, this thing already works and already has a user community and I can show you where it’s deployed, give me 50 hours and I can turn it into something that will solve our problem too’.  At that point you have a much better pitch, because that’s the kind of trade-off your manager is used to thinking about.”

ON OPEN SOURCING PRODUCTS DEVELOPED IN-HOUSE
“The universal argument that works for that is to say ‘hey boss, how would you like to reduce your maintenance costs?’.  Lay off the work on other people so it’s not coming out of your budget.  That’s the reason for open sourcing stuff that was developed in-house.  The argument for that is cost-spreading and risk-spreading.  And you want to put it exactly that way, ‘hey look, I’m going to reduce your bottom-line expenses’.”

PROS AND CONS OF CODING STANDARDS
“My first overarching observation is that the smartest thing you can do is choose a language in which coding standards are not necessary because there’s a uniform style that the language semi-enforces.  Yes I have Python in mind.  Go also has this property, it’s very difficult to have indent style variations in Go…The smartest thing you can do if all other things are equal is pick a language where you will never have coding standards wars.  The reason that that is a high-utility thing to do is, of course, the purpose of coding standards is to maximize readability of the code and long-term maintainability.  And yes, I do think that is extremely important… in particular if you are writing in C, the thing to do is pick a coding standard but don’t try and be too anal about it.  There comes a point at which the effort to enforce every conformance to every minutiae of a coding standard is causing you more pain and overhead than it is actually worth in reduced maintenance costs.”

THOUGHTS ON LISP/FUNCTIONAL PROGRAMMING
“There’s a can of worms.  The first thing you need to know about me in this connection is I’m an old Lisphead…I actually cut my teeth on APL…The result of the first two languages that I learned is I have this mental measure of a programming language’s adhesiveness.  A programming language is adhesive to the degree that it sticks to your brain and cannot be displaced from your brain except by a language that is more adhesive.  I learned APL first, and then I got exposed to Lisp…My first question was ‘which one is more powerful in a practical sense?’, and yes, yes I know they are all Turing equivalent…So I decided to test the question by writing two toy implementations.  One of an APL interpreter in Lisp, and one of a Lisp interpreter in APL…That is why I switched to Lisp, and discovered that Lisp is more adhesive than APL, and it displaced APL from my brain.  Nothing has displaced Lisp from my brain.  I have not encountered any language that is more adhesive than Lisp.  Which is not to say I use Lisp a whole lot, but that it still dominates the way I think about programming.”

ON HASKELL
“I dipped my toes into Haskell, and someday I’ll have to do a significant project in Haskell.  But that time is not yet though.  I haven’t found anything for which it is better than the tools I’m already using.  The problem with languages like Haskell…and I have digested dozens and dozens of computer languages in my time and I used to be a mathematician with a specialty in formal and foundational logic.  With all these credentials, Haskell makes my brain hurt.  So if Haskell and other pure functional programming languages make your brain hurt, that’s ok.  And the thing that worries me about them, is that if they make MY brain hurt, how the hell are they going to make any traction with people who didn’t used to be foundational logicians with a specialization in logic.”

ON FUNCTIONAL LANGUAGES
“My worry is that these are beautiful tools that will never actually achieve mass acceptance because they are simply too hard for most programmers to use.  The question is, what is the attraction then?  For the class of problems that is easily addressed using a functional language, using functional languages produces solutions that are breathtakingly, devastatingly elegant, beautiful and terse.  When the tool matches the problem, there are very few things in the universe more lovely than a properly designed functional program.  The issue though, is ‘A’ – that the tools are difficult to comprehend, and ‘B’ – I said ‘when the problem matches the tool’, there are lots of problems that don’t match functional programming language tools because functional programming language tools really want to live in a universe where everything is stateless and all transactions are reversible.  Uh oh.  You run into problems with those assumptions the moment you deal with messy things like input/output operations…intrinsically not reversible.  A lot of the complexity in functional programming languages arises from this unavoidable interface, this energy barrier between the programming language’s internal world of pure logic, statelessness and reversibility and infinite backtracking, and the messy exterior world where we actually have to deal with stateful objects…They are fascinating tools, they are good for some classes of problems, I love them aesthetically.  I don’t know if they will ever be more than a small minority preference.”

ON LEARNING FUNCTIONAL LANGUAGES
“Nevertheless, even though these tools may never get huge traction, learn one anyway.  When you get deep enough into any functional language, for me it happened with Lisp…there will come a point at which you will achieve Satori, you will achieve enlightenment about how functional programming actually works and your entire universe will lurch sideways and never be quite the same again.  And even if you never use a functional programming language for a line of code after that, it will change the way you think, it will change the way you form abstractions, it will clean things up.”

ON JAVA AND PYTHON SEEMING MORE FUNCTIONAL
“Ironically in the case of Python, Guido actually doesn’t like Lisp and his personal preference would be to take the functional constructs out of the language (Python), but every time he does that a bunch of his friends and senior developers, including me, look at him and say ‘you will take away my lambdas when you pry them from my cold dead fingers’.”

PYTHON VS JAVA 
“The advantage of Python over Java is that it’s less heavyweight, there isn’t a huge syntactic thicket of declarations and codicils and stuff that from a point of view of a Python programmer is extraneous junk that gets in the way of comprehension.  There are languages that are much worse that way, see my rant about C++.  Java is a bit too syntax-heavy and cluttered for optimum long-term maintainability.  That is my opinion anyway.”

OPEN SOURCE
“We now live in a situation where lots of people can use and enjoy open source tools and an increasing number of people can make a living writing and maintaining them, and that’s a good thing.  Do I want to see all software become non-proprietary?  It wouldn’t particularly bother me if that happened but it’s not a major objective for me.  It doesn’t harm me that other people write proprietary software as long as they don’t try to infringe on my freedom to write software the way I want to.  That’s the freedom I’m concerned with protecting.  I want people who voluntarily choose to be part of the open source community to be able to continue to be a part of it, and as long that objective is achieved, what other people do is not really of much concern to me.”

Your comments are welcomed below, thanks for reading.

Letter to ’12 Grads – How to Pick a Job and a Mentor

Cue ‘Pomp and Circumstance’ – hit play below to enhance the reading experience (or don’t, it’s just a song)

Dear Graduating Senior and Future Technologist,

First, congratulations on earning your degree! A degree is generally considered as a ‘nice to have’ and not a firm requirement for most programmer slots these days, and hopefully you learned quite a bit about software development in your classes. Having that parchment could be an advantage over other candidates entering the competition for technology sector jobs.

Based on conversations I’ve had with other recent graduates, it seems you have probably received some bad advice and misinformation recently from professors, career placement advisers, your peers, and even your parents regarding your new search for employment. I certainly mean no disrespect to those trying to help guide you, but it is important that you also get some input from people ‘on the front lines‘ in the field. Some academics tend to be insulated from what is really happening in the software industry, and your parents may think that a good pension plan is what you should really be after.

First I will outline how your job search (as an entry level technologist) is unique and much of the generic material that you have read re: job searches will not be applicable. Then we will analyze how to best choose your job, and what to do when you start.

GETTING YOUR FIRST JOB OFFERS

There are quite a few things to keep in mind when trying to get your first job offer(s). I assume by now you’ve read a considerable amount of information on interview techniques and resume tips. Most interview prep info is applicable across the board for all experience levels. Regarding resumes, the first thing to keep in mind is that in most cases the value of your education > job experience, so details on your school projects and classwork should be highlighted and placed prominently on your resume. I don’t recommend an ‘objective’ section for experienced candidates, but for recent grads it is a good tool for conveying your drive and desire.

Companies are going to view many resumes and conduct several interviews with entry-level candidates. Hiring managers are well aware that a significant majority of new engineers will not be immediately productive upon hire. The decision to hire an entry level candidate is essentially an investment for the firm, where said investment has little current value (low productivity) but should hopefully reap dividends in the long-term. A company’s interview process becomes due diligence to weigh the risk and reward for any individual.

Why should someone hire you?
What makes you a better investment than your classmate?

The most important attributes for entry-level engineering hires are:

  1. Willingness to do whatever is asked, and some things that are not explicitly asked – The tasks given to an entry level engineer will generally be the least interesting, so you will need to pay some dues. Remember Ralph Macchio waxing cars and painting fences in The Karate Kid? (Oh, class of 2012, almost forgot – did Will Smith’s kid wax cars in the remake?) For the first few months of the job, you will be Ralph Macchio – go buy a headband. Sure, Ralph got a bit lippy with Miyagi from time to time, but he finished the jobs and learned his craft. Convey in your resume and during interviews that you are a team player and willing to do what is necessary to further the goals of the company. Bonus points if you can show initiative (I recently had a candidate that was given the task of writing a small application at home as part of the interview process, and she decided to write a test suite and readme file that were not part of the assignment – brilliant!).
  2. Desire and ability to learn – The desire to learn will be an intangible that may be best demonstrated by any extracurricular engineering-related activities that you do. School tech clubs, user groups, hobbies, and conferences all apply to your curiosity. Ability to learn might be shown via an anecdote about a school project where you had to pick up a new tool or language with little guidance to complete the task.
  3. Youthful exuberance and enthusiasm – Injecting young talent into an organization can give a spark to any disillusioned engineers who may be losing passion. Someone with great positive energy (even combined with limited skills) has great value as a catalyst. In sports, these are players that may be referred to as ‘good locker room guys’. Don’t do cartwheels in your interview, but showing managers a contagious energy that people can feed off is a real benefit that you could provide immediately while learning the trade.
  4. Malleability – One good thing about not having any job experience is that you should be somewhat free of any bad habits. When given a choice between entry level and someone with just a bit more experience that has some potential baggage, companies will most often take the blank slate. The team will help mold you into being productive specifically within their environment and development methodology. It’s difficult to demonstrate malleability in interviews, but be willing to let it happen.

CHOOSING YOUR FIRST JOB AND WHAT TO DO WHEN YOU START

It seems that many of you were recently told how vitally important your first job is and to be extremely selective in making a choice, and I agree that your first job in the industry can be significant. However, it is probably not quite as important as you think, and based on many conversations it is not nearly as significant as you are being told. You are entering a field that is known for a high turnover rate with available statistics tending to fluctuate in the 10-25% range (often higher for first jobs), so odds are you won’t still be at this first job in a few years anyway. So let’s consider how to get the most out of the experience.

When I speak to entry-level and junior engineers and ask them about their job search criteria, I generally get similar answers to the ones I get from more experienced pros. “Interesting technologies and problem domains, challenging responsibilities, good people/culture, competitive compensation and benefits, stability…” Does knowing that the software engineering field has historically had a high turnover rate change any of your criteria?

“But my professor said I shouldn’t take a job using certain languages, my adviser said I should be paid at least $63,200 per year, and my parents told me I need to be looking for job stability.”

No, no, and no! The language is just a tool to use while learning the trade (noting that some tools/skills are more marketable than others), the money will come to you if you take the right steps in your career, and I hate to be the bearer of bad news, but there is no such thing as stability anymore. The first job search should not be about trying to get rich quick, nor should it necessarily be about finding an employer that you will be with forever.  Did you plan on marrying the first guy/girl you dated? If it happens, great, but let’s not go into this first search with unrealistic expectations. What is really important about your first job?

The single most important thing you should be looking for at the start of your career is to work in an environment where people are both able and willing to teach you how to become a better engineer.

Other factors will obviously come into play, but be sure to weigh those with the above in mind. Just because a software shop pays the highest salary, uses the newest technology, has plenty of customers, offers you the most job responsibility and passes the Joel Test doesn’t make it the best place for a freshly minted engineer (but it does sound pretty tempting).

Being ‘taught‘ doesn’t mean that you should seek out companies that provide formal training sessions in air-conditioned lecture halls, as that was what college should have been. It also doesn’t mean that you will be coddled and have your hand held every step of the way. Swimming lessons are taught in the pool for a reason, and the deep end can be more useful than the shallow end for certain training purposes.

Able to teach would be characterized as a team with strong developers (preferred size is debatable but somewhat irrelevant) and communicators that have good habits and a track-record of writing quality code. Ideally the team is busy and productive enough where new engineers can learn to function in a fast-paced environment with deadlines, but not so chaotic that the company doesn’t have the luxury of letting you make the occasional mistake. Aside – You are going to make mistakes, so be prepared to accept some blame for a problem you created, learn from the mistake, and don’t compound the problem by passing the buck.

Willing to teach can be a little complicated with both personalities and time constraints being potential inhibitors. You want need to find a mentor, and strong technologists will need to have their egos stroked a bit (protip – you will find a few egos in the tech world). The search for a mentor is not a race and shouldn’t be taken lightly.  Some may argue that finding the ‘right’ mentor could be as important as finding the ‘right employer.

Take a few weeks to try and figure out who the best engineers are in your team/department, and who you could learn the most from (note that the best engineer often does not equal the best mentor). Which developers are tasked to explain things to other team members and which ones conduct internal training activities? Once you have some ideas as to who the best engineers are, maybe try asking them a few test questions to see how responsive they are to helping out the newbie. Finally, choose the best fit based on all these factors and tell her/him that you are interested in being mentored.  If this person likes you she/he will most often be flattered, and hopefully you now have your first guide through your early career. If this person refuses or seems hesitant, go ask your second choice.  Repeat as necessary.

Once you’ve found your mentor, pay careful attention and try to figure out what makes this person such a good engineer. Note their work habits, interactions with both technical and business teams, reading materials/bookmarks, how they handle working under duress, etc. How does he/she respond to unrealistic deadlines, his/her own bugs, dissension within the ranks? Continue to ask questions and be conscious of any social cues your mentor might be sending out (i.e. learn to differentiate the ‘Not now, kid’ leer from the ‘You could just Google that question’ stare).

Now that you have a mentor, show your mentor your appreciation by both being grateful and working hard.  Don’t be the last one in or the first one out, as people notice those things for new hires. Your performance will now reflect somewhat on your mentor, so even if your actual contribution is somewhat low your effort should never be in question.

Remember that as an entry-level developer you are an investment for the company, and the harder and smarter you work the more apt you are to begin paying dividends. Don’t make them regret their decision to invest in you. Chances are you won’t be at this first job for more than a few years, so absorb as much information as you can from your the opportunity and your mentor.

How Employers Measure Passion in Software Engineering Candidates (and how to express your passion in resumes and interviews)

Over the past few months I have had some exchanges with small company executives and hiring managers which have opened my eyes to what I consider a relatively new wrinkle in the software development hiring world.  I have been recruiting software engineers for 14 years, and I don’t recall another time where I’ve observed this at the same level.  Here are two examples.

The first incident was related to a candidate (‘A’) resume that I submitted to a local start-up.  A was well-qualified for the position based on the technical specifications the client gave me, and I anticipated that at worst a phone screen for A would be automatic.  I even went as far as to share A’s interview availability.  A day after hitting ‘send’, I received feedback that the hiring manager was not interested in an interview.  A large part of the manager’s reasoning was related to the fact that A had taken a two year sabbatical to pursue a degree in a non-technical discipline and subsequently took a job in that field for a brief stint, before returning to the software world a few years ago.  I clarified information about A to be sure that the manager had full understanding of the situation, and the verdict was upheld – no interview.
My second anecdote involves another candidate (‘B’) that I presented for a position with a different client company.  B was someone I would classify as a junior level candidate overall and probably ‘borderline qualified’ for the role.  B had roughly the minimum amount of required experience with a few gaps, and I was not 100% confident that B would be invited in.  B was brought in for an interview, performed about average on the technical portions, and shined interpersonally.

As this company does not make a habit of hiring average engineers, I was at least a bit surprised when an offer was made.  I was told that a contributing factor for making the offer was that B’s ‘extracurricular activities’ were, according to my client, indicative of someone that was going to be a great engineer (though B’s current skills were average).  B’s potential wasn’t being assessed as if B were an entry level engineer with a solid academic background, but rather the potential was assessed based on B’s interest in software.

There are obviously many other stories like these, and the link between them seems obvious.  Software firms that are hiring engineers (smaller shops in particular) appear to be qualifying and quantifying a candidate’s passion with the same level of scrutiny that they use in trying to measure technical skills and culture fit.  Historically, companies have reviewed resumes and conducted interviews to answer the question, ‘Can this candidate perform the task at hand?‘.  For my purposes as a recruiter of engineers, the question can be oversimplified as ‘Can he/she code?’.  It seems the trend is to follow that question with ‘Does he/she CARE about the job, the company, and the craft?’.

If you lack passion for the industry, be advised that in future job interviews you may be judged on this quality.  Whether you love coding or not, reading further will give you some insight.  Engineer A is a cautionary tale, while B is someone the passionate will want to emulate.  Let’s start with A.

I don’t want to be like A.  How can I avoid appearing dispassionate on my resume?

Candidate A never had a chance, and I’ll shoulder partial responsibility for that.  A was rejected based solely on a resume and my accompanying notes, so theoretically A could be extremely passionate about software engineering without appearing to be so on paper.  Applicants do take some potential risks by choosing to include irrelevant experience, education, or even hobbies on a resume, and I will often warn my candidates of items that could cause alarm.  In this case, A’s inclusion of both job details and advanced degrees in another discipline were judged as a red flag that A might decide to again leave the software industry.  A similar conclusion could have been reached if A had listed hobbies that evidenced a deep-rooted drive toward something other than engineering (say, studying for a certification in a trade).

Another related mistake on resumes is an Objective section that does not reflect the job for which you are applying.  I have witnessed candidates being rejected for interviews based on an objective, and the most common example is when a candidate seeking a dev job lists  ‘technical lead’ or ‘manager’ in the objective.  Typical feedback might sound like this:  ‘Our job is a basic development position, and if she only wants to be in a leadership slot she would not be happy with the role’.  Listing the type of  job that you are passionate about is essential if you are going to include an objective.  I prefer that candidates avoid an objective section to avoid this specific danger, as most job seekers are open to more than one possible hiring scenario.

I want to be like B.  What can I do to highlight my passion during my search?

Since the search starts out with the resume, be sure to list all of the details about you that demonstrate your enthusiasm.  This should include relevant education, professional experience, and hobbies or activities that pertain to engineering.  When listing your professional experience, emphasize the elements of your job that were the most relevant to what you want to do.  If you want to strictly do development, downplay the details of your sys admin or QA tasks (a mention could be helpful, just don’t dwell).  When listing your academic credentials, recent grads should be sure to provide specifics on classes relevant to your job goals, and it may be in your best interest to remove degrees or advanced courses unrelated to engineering.

In my experience, the most commonly overlooked resume details that would indicate passion are:

  • participation in open source projects
  • membership in user groups or meetups
  • conference attendance
  • public-speaking appearances
  • engineering-related hobbies (e.g. Arduino, personal/organizational websites you built or maintain, tech blogging)
  • technical volunteer/non-profit experience

If any of the above are not on your resume, be sure to include them before your next job search.

Assuming that you get the opportunity to interview, try to gracefully and tactfully include some details from the bulleted list above.  Your reading habits and technologies you self-study are best mentioned in interviews, as they may seem less appropriate as resume material.

Conclusion:  Most candidates should feel free to at least mention interests that are not engineering related if the opportunity presents itself, as companies tend to like hiring employees that are not strictly one-dimensional.  Just be sure not to overemphasize interests or activities that could be misinterpreted as future career goals.  Passion alone won’t get you a job, but it can certainly make a difference in a manager’s decision on who to hire (candidate B) and who not to even interview (candidate A).  Make sure you use your resume and interview time to show your passion.

If you found this post useful, you may find my ebook Job Tips For GEEKS: The Job Search very helpful.  You can also follow Job Tips For Geeks on FacebookTwitter, and Google +.