“Why can’t I get a job in tech???”

The Question

I get this question a lot from people just starting out in this industry, more so now with the rise of coding bootcamps and the glorification of being a developer, our infatuation with startups and entrepreneurism, and the rise of nerd culture. It seems there are more aspiring developers than ever before, which is good because there’s a global shortage in software engineers that seems to be growing. Unfortunately, companies are still having trouble filling their software engineering roles because everybody wants to hire the best software engineers, but the best software engineers only want to work for the best companies. This could be the topic of a future post, but you see the dilemma.

Here’s an anonymized question I just received in my LinkedIn inbox:

“Hey Karim,

My name is Percy and I was hoping to get some advice on the first steps in this industry. I am a full stack developer but I am having a heck of a time landing a job because I have not accumulated enough experience. What steps could I take to overcome this hurdle?

Thanks, Percy”

My Story

Before I dole out my advice, I think it might be helpful to hear my story so you know where I’m coming from.

After having been in this business (software) since 2004, I’m now considered a veteran. I’m a senior software engineer and I’ve been managing teams of engineers since 2011. I literally have multiple recruiters reach out to me every day trying to sell me on some new job opportunity.

But it wasn’t always like this; it took a lot of work.

I graduated from UCSB in 2003 with a computer science degree, but I never did any internships over the Summer like the smart kids. I worked at the beach, as an ocean lifeguard, and went surfing every day. I didn’t build anything cool in my spare time like I should have. I just worked out and partied … or wait, maybe that was worth it. I did have a lot of fun …

Anyway, my point is that (besides earning a CS degree) I was woefully unprepared for the job market. The unfortunate reality is that a CS degree just doesn’t prepare for the real world of professional software development. I went on dozens of interviews for software engineering positions and got rejected again and again. Interestingly, the place I usually failed was in the interview. Nobody ever coached me on how to pass a software engineering interview. For those of you haven’t experienced it; it’s brutal. You have to get up in front of your interviewers and solve puzzles or write code on a whiteboard. You basically have to prove you’re smart enough to work at X company. This process has evolved slightly in the past 10 years, but it is still a stressful endeavor and I still get nervous at interviews. Heck, I even get a little nervous interviewing people.

Through all those failures, however, I never gave up. Instead I tried to learn something from every failed interview, and I started building websites … first for myself, and then for friends, and then I decided I’d start a web dev shop, and I built a website for that, and then took on more clients. They never paid very much, and some I did for free … but I was building shit, and I was learning.

Eventually, I landed my first job in tech, working for Electronic Arts as a Language Integration Technician. My job was to take assets in foreign languages, put them into video games at various stages, play through them, and make sure everything looked and felt okay. It was basically a glorified QA job.

 

The Answer

Here’s my (abridged) answer to Percy and future devs who are struggling in this market:

“Hey Percy, it’s always tough to break into the industry, especially if you didn’t do internships during school. I made the same mistake, but don’t lose hope. You’re doing all the right things, working on side projects and keeping your education up.

Are you getting interviews? or not at all? If you’re getting interviews, you probably just need to focus on your interview prep and get better at that. If you’re not, I recommend reaching out to recruiters and utilizing them to help you. Your interests are aligned; you want a job and recruiters get paid if you get a job.

Also, don’t be too proud to apply for QA jobs. It’s a way to get your foot in the door and I guarantee as long as you kick ass and show initiative, you will get promoted into that development job that you want. That’s what I did.

Also, if you haven’t already, don’t hesitate to apply for just front-end or just backend roles. I personally feel the full-stack developer is a bit of a myth, at least a good one anyway. If you really want to do full stack, your only options are probably small startups. Any mature software engineering organization knows they need their engineers to specialize in one area to get the most productivity and highest quality code out of them. Best of luck!”

Android Selectors

Android selectors can be used to give your Buttons or images the feeling that they are being pressed. Essentially, a selector defines a different drawable for different states of an image or Button. Selector files should reside in the /res/drawable/ folder in your project. Here’s what a basic selector looks like:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true"
        android:drawable="@drawable/button_state_pressed" />
    <item android:state_focused="true"
         android:drawable="@drawable/button_state_focused" /> 
    <item android:drawable="@drawable/button_state_normal" /> 
</selector>

If this XML resided in /res/drawable/imagebutton_selector, for example you’d set the android:src attribute of your button to android:src=”@drawable/imagebutton_selector”.

A Kind Message from Software Developers to Recruiters

Dear Recruiters,

I write this message to you on behalf of all software developers as I know that most us feel the same way.

Let me start off by saying that I appreciate what recruiters do. I don’t appreciate what they do for the corporate world, or for technology, as I could argue either way for those benefits. I appreciate what recruiters have done for me personally. If it wasn’t for recruiters, I’d probably be making about half the income I make I right now. Also, if it wasn’t for recruiters, I probably never would have moved from San Francisco to Seattle and then from Seattle to Los Angeles. It’s not that I couldn’t have figured out how to make more money on my own or that I couldn’t have moved around the country on my own. It’s just that the motivation to leave companies for more money or to move to a different city to go work for a different company isn’t really an inherent motivation for me. Recruiters have supplied much of this motivation, and for that I’m thankful.

Now to what I don’t appreciate:

  • Not reading my resume / LinkedIn profile:
    I don’t appreciate you pitching jobs to me for which I’m obviously not qualified or interested in. Take a minute and read the entire thing. At the bottom of my LinkedIn profile, there’s even a section where I spell out for you which types of jobs I’d be interested in interviewing for.
  • Calling me while I’m at work:
    You know I have a job, right? You know I get paid to write code, not talk on the phone, right? Do I call you while you’re at your job and try to get you to take a job somewhere else? No, I don’t. It’s called respect. If you give us respect, we’ll give you  respect.
  • Scheduling a phone interview during the middle of my day:
    This goes back to my previous point. Why would I want to interview for a different position during the middle of my work day? Who does that? Only unemployed people. Get a clue please.

Sorry if this sounds harsh. I realize you are just trying to make a living the best way you can. Think about this though. Maybe if you stopped treating developers like your next paycheck, they would actually have some semblance of loyalty to you or your recruiting firm and not treat you like a commodity.

Happy head hunting,
Karim

Android: How to Hide Keyboard By Touching Screen Outside Keyboard

If you’ve ever worked for a mobile software company that builds both an iOS app and an Android app, many times the product people will ask that a certain feature be implemented consistently across both platforms.  This week I was tasked with implementing a popular iOS feature, the ability to hide the virtual keyboard when the user touches outside of the keyboard, on Android.

The methodology is simple, but not entirely intuitive. Let’s look at how it’s done. Basically, you get a handle on the layout in question. In this example, we’ll use a LinearLayout:

LinearLayout layout = (LinearLayout) findViewById(R.id.layout);

 

Then, override the layout’s OnTouchListener.onTouch() like so:

layout.setOnTouchListener(new OnTouchListener()
{
    @Override
    public boolean onTouch(View view, MotionEvent ev)
    {
        hideKeyboard(view);
        return false;
    }
});

 

The code to hide the keyboard is fairly popular:

/**
* Hides virtual keyboard
*
* @author kvarela
*/
protected void hideKeyboard(View view)
{
    InputMethodManager in = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    in.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}

Software Engineers, Don’t Waste Your Time Any Longer, Build Your Future

Today, I came to the full realization of something that’s always been an itch in the back of my mind. If you’re a software engineer and you’re not utilizing your talents to help build a company or gain a stake in a company, you are wasting your time.

You may say, “Oh Karim, that’s mighty hypocritical for you to say. After all, you work for Fandango as a consultant and have no stake in NBC Universal, the parent company of Fandango. You get no benefit and no share of Fandango’s immense success.” If you said this, you are right, and don’t get me wrong, Fandango is an awesome place to work. From our catered lunches and company movie outings and an incredible location just three miles from my apartment, it’s difficult to imagine a better place to work right now.

I’m not resting on my laurels, however; I’m actively doing things to build my future. For instance, I’m about half way through with business school at the University of Florida. I’m also attending the AT&T Mobile App Hackathon – Los Angeles in a few weeks. There, I plan to build my first commercial mobile app.

As software engineers, we have the unique ability to not only think something up, but to go out and build it. We have the power to create software that millions of people will use. We have the power to create this with nothing more than our brains, our fingers, and a computer. Even with a world economy in the midst of a deep recession, the demand for software engineers has been increasing faster than the supply. Don’t waste your talent; go build your future. If you have a good idea, and are interested in working with me, hit me up. Let’s chat!

Android: How to Include Line Numbers, Class Names, and Method Names in Your Log Statements

Today, I’m going to share with you a handy tip for getting the most out of your Android log. I recommend that you create a wrapper class around the native Android Log class in order to:

  1. Have the ability to turn on or off logging.
  2. Have the ability to log handy things like line number, class names, and method names.

I’m going to show you a simple implementation of a Logger class that does these things:

import android.util.Log;

public class Logger
{
    private static boolean LOGGING_ENABLED;

    private static final int STACK_TRACE_LEVELS_UP = 5;

    public static void verbose(String tag, String message)
    {
	if (LOGGING_ENABLED)
	{
            Log.v(tag, getClassNameMethodNameAndLineNumber() + message);
	}
    }

    /**
     * Get the current line number. Note, this will only work as called from
     * this class as it has to go a predetermined number of steps up the stack
     * trace. In this case 5.
     * 
     * @author kvarela
     * @return int - Current line number.
     */
    private static int getLineNumber()
    {
	return Thread.currentThread().getStackTrace()[STACK_TRACE_LEVELS_UP].getLineNumber();
    }

    /**
     * Get the current class name. Note, this will only work as called from this
     * class as it has to go a predetermined number of steps up the stack trace.
     * In this case 5.
     * 
     * @author kvarela
     * @return String - Current line number.
     */
    private static String getClassName()
    {
	String fileName = Thread.currentThread().getStackTrace()[STACK_TRACE_LEVELS_UP].getFileName();

	// kvarela: Removing ".java" and returning class name
	return fileName.substring(0, fileName.length() - 5);
    }

    /**
     * Get the current method name. Note, this will only work as called from
     * this class as it has to go a predetermined number of steps up the stack
     * trace. In this case 5.
     * 
     * @author kvarela
     * @return String - Current line number.
     */
    private static String getMethodName()
    {
	return Thread.currentThread().getStackTrace()[STACK_TRACE_LEVELS_UP].getMethodName();
    }

    /**
     * Returns the class name, method name, and line number from the currently
     * executing log call in the form <class_name>.<method_name>()-<line_number>
     * 
     * @author kvarela
     * @return String - String representing class name, method name, and line
     *         number.
     */
    private static String getClassNameMethodNameAndLineNumber()
    {
	return "[" + getClassName() + "." + getMethodName() + "()-" + getLineNumber() + "]: ";
    }
}

 
As you can see, this uses Thread.currentThread().getStackTrace()[] to climb up the stack trace and get the information from the proper line of code. In my case, it has to climb 5 levels up to get this information. Yours could be different depending on how many levels of abstraction you have when you call getStackTrace(). I found the easiest way is just to experiment with different numbers.

Android FrameLayout Example

The Android FrameLayout is one of the lesser used layouts in the Android system, but it definitely has its purposes. The main reason you’d use a FrameLayout is when you only want to show one View at a time inside that FrameLayout. You can think of the Views as if they were in a stack with the most recently added View at the top.
Let’s walk through a simple example. The following code will first draw a red square with width 250dp in the FrameLayout and then draw a white square with width 150dp in the FrameLayout. Since the white square comes after the red square, the white square will be drawn on top of the red square.
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainlayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <!-- kvarela: Red square -->
    <View
        android:layout_width="250dp"
        android:layout_height="250dp"
        android:background="#FFFF0000" />

    <!-- kvarela: White square -->
    <View
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:background="#FFFFFFFF" />
</FrameLayout>

Here’s a screen shot:

FrameLayout Example
FrameLayout Example

Agile Methodology Possibly Not Best For Programmer Productivity

I’m currently working in a strictly agile-based development team. It’s ironic, but I love the nimbleness and high-level of communication that a structured agile environment gives us. I think agile methodologies are the best way to properly manage everybody’s expectations — developers, project managers, product owners, and any other stakeholders.

I’m not sure, however, that agile methodologies are the best way to get every ounce out of every programmer. I think that agile methodologies limit a programmer’s vision in a couple of ways:

  1. Grandiose epics are split up into smaller stories and even smaller tasks. Sometimes a programmer can get tunnel vision only focusing on a small task and overlooking the epic.
  2. Daily stand-ups don’t encourage strategy and vision; they only encourage task completion. When do the programmers, who are undoubtedly the smartest people in the office 🙂 give their input into strategy and vision?

What do you think? Are programmers’ brains fully utilized in an agile environment?