Big Tech vs Little Tech: The problems are the same, but the process is better.

I spent the first three years of my career at a small agency/consulting firm. We did a combination of standard application development and technical management consulting work. We had problems with code quality decline in older projects, issues with pushing out solutions quickly, and we had very poor feedback loops into our software. 

We tried to write quality software and did plenty of testing. The biggest gap was that we sold cloud native architectures to our clients, but we never actually ran cloud native software ourselves. 

One the companies strengths was that our Project Managers would interface with your Product Owners and business analysts to make sure we were building the right software for clients. And because our clients were bureaucratic  cable companies we needed a lot of Project Managers to work with the clients’ bureaucracies. So we ran all the latest Scaled Agile frameworks and helped train our clients to use them. 

I moved to one of the biggest tech companies recently and here we also have problems with code quality in older projects, but this company has much better feedback loops and takes a little more time on developing and vetting solutions. 

Its funny that we spent a lot of time at my last job building continuous delivery pipelines for our clients, but I still never got to work with one. Here at BigTech we have full CD to production despite running one of the biggest websites in the world. 

On the process side, Project Managers don’t exist at all. And there is a lot less ‘Agile’ process on my team. Engineering design is handled with more formal design documents and design review meetings. Designs are written in documents instead of being hashed out on whiteboards during a meeting and only partially documented after that. 

Always be Interviewing

A lot of people feel that they are underpaid or that their job sucks. But when I tell friends to update their resumes and start applying to jobs they dig in their heels. If you are not applying  you don’t have options and don’t have any leverage to get a bigger cut of the money your employer spends on salaries. As Software Engineers we are constantly bombarded by job opportunities on Linkedin and other job boards. If you want to be lazy you could just respond to one of the recruiters that contacts you each week. I have gotten most of my interviews by cold applying on jobs boards. All you need is a good resume and a slightly customized cover letter. It takes me 15-30 minutes to apply to each job, including the time I spend customizing the cover letter. My resume is usually the same for each position because I apply to similar jobs. 

How to pick which jobs to apply for.

When I am looking for jobs, I don’t just apply to anything that my credentials line up with. I am looking for particular companies in particular business sectors, that are using technology that can help me move my career forward. For instance in my last job search, I applied to local Denver startups that used technology that I am interested in. I did not apply to any companies that use Nodejs or C#/.NET as their primary stack because I don’t want to do more work with Nodejs and C#. I mainly applied to companies that had existing Ruby on Rails monoliths that needed to break them up and move them into the cloud. I also targeted companies based on their size and product type. My targets were companies with 50-200 software engineers and with software based products.

Where to find jobs.

I find jobs through the Linkedin, Glassdoor, stackoverflow and buildincolorado jobs boards. I search for ‘software engineer’ and the city I live in as my query. Then I go through around a hundred listings noting the jobs that look interesting and align with my tech stack. I make a list of jobs to apply to and once it hits around 10 in length I will spend an afternoon applying to jobs. 

The answers are much simpler than you expect

I have been a programmer for about 5 years at this point and as part of that I have read 10,000s of lines of documentation, lots of books and solved plenty of problems. I have also read tons of content trying to find solutions to the problems in my life. Add in a lot of time reflecting on what I could do to resolve those same problems and you end up with a massive amount of time spent trying to figure things out and a much smaller amount of time spent doing things to solve problems. 

As I have gone through more and more information, I have found that the solutions to my problems have gotten simpler and simpler. Lots of problems overlap and once you figure out one, the others get easier. Much like if you can solve one NP complete problem you can solve all of them. Because the solution to ‘solve a problem in your life’ is pretty basic. 

I see a lot of ‘older’ guys who give advice, aka gurus, who get frustrated, because younger guys keep asking complicated questions on the same topics, over and over. On the subreddit /r/cscareerquestions, every semester we see the same questions about applying for programming jobs. If you are having trouble finding a job after graduation the answer is the same for just about everyone. 

“I have applied to x number of jobs and no one gets back to me, am I cut out for programming?” — common question

Rote Answer:

  1. Can you solve FizzBuzz or Hacker rank easy questions in 30min after practicing? 
  2. Get help with your resume, either on reddit or pay a professional.
  3. Apply for more jobs, don’t come back until you have applied for 100 more.

Your situation is unique in all sorts of ways, but if you are a college senior applying for programming jobs your unique factors probably do not matter compared to the three points above. 

There is only so much information that is relevant and if it takes a decade to go through the important bits, at some point you have to stop reading.

KIS (Keep it Stupid) as a Design Philosophy 

On my last project as an architect, I found myself drifting into an architecture strategy of keeping everything as simple as possible. In choosing a database I would look at our projected usage, multiply the number by ten and evaluate which database would be the simplest given our requirements. Given the size of an external library is it better to import it as a black box or to write the functionality as a single file module? The project being in Go made a few of the choices easier because Go does not offer many higher level features. Instead of worrying about class hierarchies you just write the functionality you need. 

Keeping it stupid means choosing an architecture that anyone would understand at first look. Other people should always assume that they could have come up with the architecture when they read it. There shouldn’t be any surprises or ‘cool’ technology choices. There is a blog post out there about how a startup or software team can afford to pick one risky technology before going bust. In KIS architecture you never pick a risky technology. 

In the 2018 Software Engineer’s toolbox are dozens of technologies that are both proven and incredibly powerful. We have access to many of the common tools as managed services in the cloud making things even easier. Save yourself the trouble, keep your architecture stupid until its proven that it needs to be more complicated.

It took me over a year to find my next job

I am moving to a new job in a different state. While my job search ended up being much longer than I expected, I learned a lot about interviewing and the salary ranges in Denver.  I ended up with 2 competing offers at the same time and managed to get a look at the maximum amount each company was willing to pay me. 

I started looking for a new job after the company I work for was acquired in 2017. I did this mainly in waves of 5~ applications with around a 50% response rate. Some companies got back to me right away, others took 3 months before starting the interview process. I did around 3 serious waves of applications and in total applied to 20 different companies. Considering that I applied to over 50 jobs before getting each of my internships this was a pretty good rate. Still it took over a year and thousands of dollars worth of vacation time. On the positive side my income will increase into the 6 figure range.

Part of why it was easier this time is that I have 3+ years of professional experience so I am not competing with new grads or junior engineers for jobs anymore. Additionally, my last promotion put me into a line management position where I was overseeing the work of others and led the project, which made behavioral questions much easier. The biggest difference here was the response rate. As a college student my response rate was 10% or less, now it is over 50%. 

Because my response rate was so much higher during this job search, I ended up doing a lot more actual interviews than when I was looking for internships. While time consuming, interviewing is probably the best way to practice interviewing. I have done enough interviews now that they start to flow together. The questions are all pretty similar. Whiteboarding has always been pretty natural for me because of my college background, but the questions repeat too. The last in person interview I did was 2 rounds of white boarding and a couple non-technical ones. But the questions were easy and I was almost bored. Luckily the people I was interviewing with were fun and it was a blast. 

It was also interesting to get a feel for the company tiers and what the technical level of my local area is. Most of the companies here in Denver ask technical questions of around the same difficulty. The hardest of which are Leetcode easy questions. I have only run into Leetcode medium questions from companies like Google or Uber. 

I have done around 20 Leetcode questions in total, which could be accomplished in a couple weeks. Interviewers want to see how you solve problems not how you already knew the solution to the problem. If the company is known for giving hard level problems you want to be totally solid on medium level problems and have done a bunch of hard problems. But grinding hard problems for months is not necessarily a good use of your time. Unless you must get into Jane Street. But I think focusing on just one company is probably bad for your career and mental health. 

While my job search took a long time and cost me some money, the increase to my income is more than enough to make up for it. I also got a chance to take advantage of Josh Doody’s Fearless Salary negotiation. Paying $50 to get an extra $5000 each time you switch jobs is worth it.

The rule of switching jobs every 3 years early on in your career seems to have held true in my case. Even if I had decided not to relocate, my income would have received a solid boost.