June 17, 2014
1002 views

Musk Delivers (again)

Elon Musk has long been a visionary, the champion of the modern technology culture. At 28 years old, he sold his first technical start-up, called Zip2, for $341 million to Compaq (of which he saw a $22 million payout) and has used those earnings to launch a series of impressive and successful ventures: PayPal, SpaceX, Tesla Motors, and SolarCity. Each of these companies has been revolutionary in their own category, and each has an ambitious social mission; and each has been incredibly successful, and he remains highly visible in two still today. Given his insane work ethic, his desire to change the world for the better, and his seemingly insatiable appetite for challenging problems, it is no wonder that he has been recognized as a flesh-and-blood Tony Stark. And yet, even with an impressive legacy already secure at so young, Musk made waves again recently in the world of patents, and has cemented his status as a man who truly gets "it."

Technology patents are broken.

That statement is, for the vast majority of the technical world, a statement of fact rather than opinion. While the spirit of the patent may be good and promote competition in theory, the reality of the patent system has actually squashed competition and set profitable companies to war at the expense of the consumer. While I would never begrudge the small innovator the protections of the patent system (and Musk himself explains his prior covetous actions toward patents), at a certain point of growth and opportunity, the patent simply breeds a legal desert of innovation (or litigation). Tesla, having seen the vast potential in the electric market, and able to benefit financially from an expansion in battery powered vehicles, made the bold decision to refuse all legal action on those who infringe on their patents.

"Technology leadership is not defined by patents, which history has repeatedly shown to be small protection indeed against a determined competitor," Musk said in the June 12th press release, "...but rather by the ability of a company to attract and motivate the world's most talented engineers. We believe that applying the open source philosophy to our patents will strengthen rather than diminish Tesla's position in this regard."

Once again, in bold and daring fashion, Musk has proven his intelligence, insight, and timing while bolstering the argument for patent reform. Tesla Motors has an expansive vision for the future of the all-electric automobile, and the king of tech has only made that vision more capable and competitive. I hope the whole of the technology world is paying close attention; Musk is putting on a clinic, and we should all be taking notes.

September 23, 2013
1201 views

Talking About Hiring

I recently gave a talk on my opinions and experiences regarding hiring best practices (with a focus on hiring for start-up companies) at Northeast PHP Conference 2013 (August 18, 2013), and the video has just been made public! Check it out below.


July 03, 2013
1455 views

Standards, Fear Not

Writing code is like writing a book: The entire work should be logical, have a rythmic flow, and be understandable to the common reader. When particularly complex chunks of prose arise, they must be explained in "the footnotes" (comments). And for the sake of any time-constrained readers, there should be a summary explanation that is external to the total work (documentation). Unfortunately, this pattern is very rarely followed; the amount of terrible literature that pollutes the technology world is staggering. For every well-built chunk of code, there are dozens of poorly constructed, illogically organized and grammatically invalid applications (most of which are being actively used by customers right now). This is particularly troubling for any new developer; there is nothing more horrifying than to, on the first day of employment, clone a git repo and be exposed to a horror of syntax that you will be shortly expected to repair.

But, fear not! There is a solution, and it is such a simple thing as to be obvious: Standards.

The entire technology industry utterly depends on codified and understandable standards. If it were not for such standards, we would today not have the internet or the web, or video encoding, or programming languages (or much of anything else). Standards give the programmer the necessary guidelines to create wonderful works of engineering without having to design their own microprocessor, or write machine code. And yet so many developers fail to extend this beautiful abstraction into their own code, seemingly oblivious to the monsters they weave with every click of the keyboard. Code reviews, management insight and education are the only viable solutions to the absense of standards, and should be priority numero uno for any new technology leader.

The first thing I am going to say is: No, I will not create your standards for you. Development standards need to come from within, and will be dependent on the size of the team, the turnover rate, the languages and technologies used, and the spread of responsibility. For example, a small start-up with one engineer probably needs to focus largely on rapid development rather than a need to follow a robust documentation standard. That being said, good coding typically involves the following:

1. Logical indentation and consistent framing.
2. Some convention for naming functions, variables, constants, etc.
3. Basic commenting (be consistent and use keywords for context - ie. Javadoc, PHPDoc)
4. Logical file structure
5. Programmatic best practices (OO conventions)

Before you hire any new engineers, QA or designers, you should set about writing down the standards you want your engineers to follow. Be explicit, be expository, and be cautious. Don't be so rigorous as to make development arduous (99% code coverage and 100% documentation on frontend projects is probably a little excessive), but don't be disjointed either. If you create a worthy set of standards, development should be effortlessly transitioned between engineers throughout the life cycle of the product, and no new employee will panic and flee at the first sight of code.

June 27, 2013
1456 views

Hire Right, Worry Less

I truly believe, from the very depths of my soul, that the most important thing that any manager can do is hire, and hire well. A team that is composed of motivated and complimentary talent is a team that will produce efficiently and consistently, and require minimal guidance. I have personally observed a lot of (easily preventable) turnover from only poor hiring practices, and it saddens me. A bad hire is one of those few management acts that is universally bad at every level; it's bad for the engineer, bad for the manager, bad for the company and bad for the product. No one is happy when a manager does a poor job evaluating a candidate, and so it must be given the greatest focus.

Part of the problem is that no one really knows how to best evaluate a technical candidate (not even the technologists themselves). Everyone thinks that they know the best approach, but when put to the fire almost everyone defaults to the same unreliable and inconsistent methods that have been used for decades. The most common pitfalls of the technical interview are:

1. Focusing on memorization.
2. Not letting the candidate do the talking.
3. Requiring a college degree, certification or fancy internship.
4. Having poor conversational skills.
5. Falling in love / out of love too fast.

Fortunately, each of these problems is easily solved!

The most important thing you need to do is stop focusing on memory-dependent questions. If a question is easily answered with a quick Google search, then it is a wrong question. It is an industry rule that no technologist should be willing to waste precious brain space memorizing every little tidbit about any specific technology. We have the internet nowadays, and it is remarkably good at helping us solve common problems in no time at all. A good technologist is not made by how many different regular expressions they have memorized; rather, a good technologist is made by having a well-developed ability to think critically and logically and quickly... And I should continue here by saying that logic puzzles and word problems are not the solution, either! It became fashionable in the last few years to substitute technical questions for New York Times style brain teasers (such as "How many golf balls would fit inside an airplane"). These questions are useless; a good engineer wouldn't waste time conceptualizing the issue, but would write a program that fills a mock airplane with golf balls and maintain an accurate count!

The second most important thing you need to do is stop worrying about college degrees! The same goes for certifications, that Google internship, or any other flashy resume tidbit. Why, you ask? Because such trophies are often, in practice, terrible indicators of success. Some of the most talented and respected technologists I've ever worked with have never finished college (and some didn't even bother starting), while some of the worst I've ever worked with have had advanced degrees and a resume a mile long. The ability to study diligently and prepare for tests might demonstrate good organizational skills, but it is not an incubator for successful engineering. Software development is all about thinking logically and creatively, responding to adversity with mettle and gumption, and finding pragmatic ways to solve non-obvious problems, and those skills are learned in the fires, not in the classroom.

Is education important? Of course! And given two candidates of equal practical talent and personality, the educated candidate will get the nod. But it isn't the most important thing, and it gets far too much focus. Even at Google, the tech giant with an infamous penchant for academics, has recently recanted their philosophy. The evidence is clear and becoming increasingly obvious to a larger number of companies: education, while valuable, is not the best marker for employment success.

So, given the above, what should you do?

The first thing you need to do is hone your conversational skills. Learn to be friendly and inviting. Don't dominate the conversation, of course, and don't let the candidate rule the meeting, either. Make the individual comfortable, be open, and get them to spill their guts. Get to know their technical background, how they got into technology, how they learned their skills, the companies they've worked for and why they left; ask about past projects and what they're most proud of, and what they are working on now, and what difficult problem was most fun to solve. Learn what technologies they like to work with and why; find out what is their favorite baseball team. What do they do for fun? Get to know the candidate as thoroughly as you can, both professionally and personally, and take diligent notes. That is the only way you can expect to make reasonable assumptions about how best their skills and personality might fit with your team. This is the first step...

The second thing you need to do is make the candidate write some code. And don't waste their time with some stupid recursive loop function taken from a 1994 textbook that anyone could do in five minutes with half a brain; make them really code. Give them some minor, but very real problem and ask them to solve it. Keep instruction to a minimum and let them do their thing (while aware that they can ask questions freely). Give them some time away from the interview to complete it (consider paying them a small contract fee) and scrutinize the result. You can learn an awful lot about a programmer just from reading a little original code.

Finally, don't be afraid to let them go. I don't care how amazing a resume may seem, or how great of a talent you think they are; if they are not the right fit, then they are not the right fit. Don't try to force someone into your organization just because they seem to be a good technologist. That is a recipe for a very bored programmer and an unhappy team. Similarly, don't dismiss a candidate out of hand just because you don't like their resume; have a conversation with everyone. At worst, you will waste 15 minutes of your day, and at best you might find a diamond in the rough. Also, (and this is the part that requires just a little bit of intuition) don't be too strict on position requirements. You don't need the perfect candidate (titans of technology are rare finds), you need the right candidate that fits with the team at the right time. For example, don't be afraid to hire a junior Ruby developer for a mid-level PHP position if you truly believe that they can do the job; hell, I wouldn't be afraid to hire a junior Ruby developer for a senior leadership position if I truly believed they had the personal and professional chops to do it. Every person is different, every skillset is unique, and a good manager has to apply a little judgement.

If you work hard and pay attention, hiring a quality team will become the greatest thing a manager ever does. It will lower stress levels, raise productivity and keep everyone happy. It is truly the most important thing.

June 18, 2013
1173 views

The Great Scourge

A recurring problem that I have encountered in nearly all of my professional life is the scourge of the unfocused meeting. I find this issue so prevalent, in fact, that I can think of no company, past or present, that has not suffered from it in some form or another. And it is a particularly insidious problem specifically because it so often manifests cautiously in the normal, taking an ideal and tearing it apart slowly through a lack of direction and purpose. Even something as theoretically focused as a morning stand-up can, with little warning, morph into endless bickering without the proper application of a scrum master.

Yet the entire matter is solved so simply with the injection of the all-important question: "Why are we here?"

You must ask this question, slightly modified, even before the meeting is conceived. First, ensure that the meeting is even necessary; might you be able to organically solve the problem without a formal gathering? And if you're set toward asking other people, possibly many other people, to take time out of their day (possibly even interrupting mental work that requires continuous concentration, as is so often the case in software development), then you had better know exactly what you want from each participants and be prepared to guide and direct the conversation toward that end. Don't be afraid to interrupt (politely, of course) those who fall into a tangent or raise matters irrelevant to the discussion; this is your meeting, you are the master of the moment, and you want to get what's needed quickly and painlessly so everyone can go back to their work.

I believe that many fail to follow this common-sense adage out of a subconscious fear of rudeness. Perhaps I may then assure that there is nothing rude about a directed meeting; in fact, it is quite rude to allow an undirected meeting to continue, as it will capture so much valuable time from so many people for so little need. These are not to be social gatherings, but purpose-driven professional tools. It is even likely that many in the room, especially at times of divergent conversation, silently wish for direction, anxious at the constant expansion of time and energy that such an unfocused meetings incubate. If you have a team struggling in this area, a good starting point is to set strict and inflexible time limits on meetings. And bring a bulleted-list, representing every question or idea that needs addressing, to every meeting and mark each item complete as you go along.

Summed up: Meet infrequently, ruminate and reduce before gathering, and keep what meetings are needed focused and short.

« Previous
Next »