Career Notes

Tips, advice, and guidance for changing your career.

What Companies Look for in Software Developers

Aaron Brager

on Tuesday, April 12 @ 8:22pm

Software developer positions are highly desired. Just as astronauts, Supreme Court justices, and Hogwarts professors must have a variety of skills and knowledge, software developers have a combination of technical knowledge and soft skills. This post explores the skills that many companies look for.

Familiarity With Multiple Languages

Read more...

More advice on changing careers

7 Traits of Effective Software Engineers

If you’re considering a career as a software engineer, then you may have heard how difficult it is to learn. But the right mindset can give you a significant advantage when learning and working in the industry. Software engineers who embody these seven character traits are valuable employees and productive contributors.

Curiosity

It’s what killed the cat, apparently, but that cat was a rock-solid engineer. Great engineers take responsibility for learning and exploration. They do not depend on their superiors to give them explicit direction for a new challenge – their curiosity guides them to reach their own conclusions.

At my first job as an engineer, I worked on an Android game. In the middle of working on a new feature, I noticed that some background tasks consumed an inordinate amount of time. After some investigation, I discovered that we relied on an Android API that took 50% longer on average to complete when compared to a simpler Java counterpart. I reported my findings and as a result, we swapped one for the other in all cases.

An engineer who seeks out new information and investigates the product may discover something new in the process. More importantly, the more versatile an engineer, the more valuable they become. Learn to serve your curiosities and feed them with research and experimentation.

Grit

All engineers require mental stamina. As a new engineer, you won’t solve the most challenging problems during your first attempts. In fact, you may have to spend days, weeks, or longer looking for a solution before finding one that meets both business and product requirements.

If you give up readily, you may not find yourself working on anything interesting, or anything at all. Engineers love solving problems and most refuse to give up until they work them out. Grit is what keeps engineers from throwing in the towel.

In 2014, the popular blogging platform, Medium, encountered a problem rendering underlines in Chrome. The author, Marcin Wichary, states that what was thought to be a one-night project turned into a month-long effort. After brainstorming seven approaches, the team settled on one and Marcin implemented it. Fixing something as seemingly trivial as a proper underline required incredible tenacity and the product is better for it.

Communication

This one is a no-brainer, but if you want to be a part of a functional team, you must communicate. If you’re shy or quiet, that’s fine. You can make up for shyness by communicating effectively in writing.

At Bloc, we rely on asynchronous communication – one out of every six employees works remotely. We use email, Slack, and GitHub to facilitate feedback and discussion. In these messages, we try to use as few words as possible and get to the point fast. This keeps our co-workers focused and eager to read and respond.

Your team needs to know what you’re working on and if they frequently ask for clarification, they may stop asking altogether. By communicating frequently and in brief but descriptive messages, your team will look forward to speaking with, and hearing from you.

Attention to Detail

Despite being another predictable member of this collection, attention to detail is vital for engineers and thus worthy of mention. If an employee at McDonalds applies two ounces of special sauce to your Big Mac instead of two and a half, will you notice?

As a software engineer, if you mistype even one line of code, it can crash an entire application. Details comprise software, and companies hire engineers to craft those details well. If you are someone that looks solely at the big picture, you have to learn to zoom in.

At Bloc, our students rely on our custom curriculum to learn the software trade. If we mistype a line of code or introduce a grammatical error, the student’s ability to learn the subject is significantly affected. We use grammar tools like spell check, linters, and Grammarly to draw attention to pain points.

Divergent Thinking

Some call this, “thinking outside of the box,” but saying that would be yet another cliché and this post has reached its limit of those. When solving challenging engineering problems, the best solutions often come from adopting a new perspective.

If everyone took a crack at a problem from the same angle, they would ultimately arrive at a similar solution. But a diverse team whose approach varies among its members will generate more ideas and non-conventional solutions. You and your team will benefit if you broaden your ability to see things that others overlook.

To allow team members to share new ideas and solutions, we occasionally hold hack day events at Bloc. These hack days, like hackathons at Facebook, permit anyone in the company to work on anything. Thus, people who rarely interact with an aspect of the Bloc product can build new features or solutions that the dedicated team had not yet thought of. For example, our hack days helped us design a new payment flow, student portfolios, a student glossary for recruiters, and so much more.

Modesty

Engineers collaborate, even when managers assign a task to just one engineer on the team. Team members review each other’s code before deploying it to production, and during these reviews, they may criticize or recommend significant changes to code written by their colleagues.

Engineers open to receiving critiques and feedback receive more support from their teammates, and the engineers that receive more support make bigger contributions to the product. More importantly, the product suffers if an engineer deploys code without revising it to meet the expectations of their peers. A good engineer is modest and willing to consider a different approach suggested by their team.

At Bloc, we have a thorough review process both on the engineering and curriculum side. Before we published this blog post, it received editing passes from two individuals that looked for quality content and prose. I was responsible for accepting modifications and including content suggested by my peers; the post is better for it.

Wolf Pack Membership

It’s common for some engineers to isolate themselves and work without consulting their teammates. The industry refers to this proclivity as Lone Wolf Syndrome. Lone Wolves, much like the animals after which we’ve named them, do not survive for long. Wolves hunt in packs, and engineers must collaborate.

To be a productive engineer: seek help when needed, express yourself when overwhelmed, offer to help when you see peers struggle, and in general, engage with the group. No one on your team is excited when one person goes off and returns with unwanted or otherwise broken code. Acting as part of the team builds better relationships and trust among your co-workers.

If you believe that your personality is set in stone or that you’ve grown fixed in your ways, we recommend you read this article from Psychology Today. Those who study the mind believe that personality is flexible and with concerted effort, anyone can alter their disposition.

7 Traits of Effective Software Engineers
Why Apprenticeships Are on the Rise

Ask any VP of Engineering or CTO, and they’ll tell you hiring talented developers is getting harder. Meanwhile, ask one of the millions of underemployed millennials, and they’ll say they are willing to learn, but can’t get their foot in the door. Apprenticeship was once a commonplace feature of the American economy, but for the last 30 years it has been in decline. Apprenticeships are the critical link to closing the skills gap for employers and reducing unemployment for millennials.

To understand why apprenticeships can bridge the gap, let’s take a look at the marketplace for technical talent.

Traditional Universities are Failing Us

traditional-uni

First, the gap between supply and demand for technical talent is widening. On the supply side of the marketplace for technical talent, we have universities. According to the Department of Labor, 400,000 new CS grads will enter the workforce between 2010 and 2020. In that same period, nearly 1.4 million new tech jobs will be created. That’s a shortage – a skills gap of – 1 million more jobs than graduates.

Second, even those students graduating in computer science, aren’t prepared for careers in software engineering. Universities care about helping students become job-ready. But that isn’t their singular goal. Many also seek to teach a liberal arts education and to publish ground-breaking research. Because of this, there is no singular focus on one goal. As a result, students graduate ill-prepared for industry. According to Brad Neese, director of Apprenticeship Carolina, employers are seeing “a real lack of applicability in terms of skill level” from college graduates.

For example, top tier university computer science curricula often include courses in advanced math, physics, compilers, and operating systems. When we surveyed engineers at top companies like Twitter, Facebook, Google, and Amazon, they told us they used less than 25% of their university education in their career. According to Rob Gonzales, co-founder of Salsify, “many ‘core’ CS courses really aren’t that critical for becoming very productive engineers. I’ve never had to write a compiler or operating system in my career, and the last time I thought about finite automata was 2001 when I was studying them myself.”

Meanwhile, few universities teach essential skills a software engineer will use every day. According to Mo Kudeki, a Software Engineer at Twitter, “Although I went to a top Computer Science program, there are software engineering topics that we never covered that are crucial to being a great engineer, like how to methodically debug something, and how to give and receive a good code review.”

All of these factors combined result in a tremendous mismatch between the skills with which American students graduate and the skills needed by employers.

Employers are Hungry But Ill-Equipped to Train

chalkboard

While employers are hungry to recruit great talent, their appetite for growing that talent themselves has been declining for the past decade. According to Lauren Weber of the WSJ, apprenticeships in the US have declined over 30% from 2003 to 2013.

Furthermore, even those companies that want to provision such training may be unable to do so. Training programs require experienced instructors. According to Gonzales, “you must have someone to manage the program full time, including doing daily coaching, code reviews, design sessions, planning sessions, one-on-ones, communication outside of the group to gather requirements, etc. This person should be respected throughout the organization, as getting the program started and effective is going to be a bumpy road that will draw on company resources even beyond the coach.”

Unfortunately, the shortage of technical talent has left most companies without the bench strength to fill existing headcount and also train a large pool of junior developers. According to Marcy Capron, the founder and CEO of Chicago-based Polymathic: “Companies don’t have an infrastructure for ongoing learning. We really need a guide to mentoring junior devs. Hourly consulting firms can’t afford it because you can’t bill mentoring to the client.

We’re Seeing Renewed Investment and Innovation in Technical Skills Training

pair-programming

So with universities failing us, and employers hungry but unable to grow their own talent, a new breed of apprenticeship-like programs have leveraged technology to deliver better outcomes, more affordably than ever before. Computer science bootcamps put students through compressed programs to prepare them for coding jobs. These bootcamp programs have found traction with employers and graduates alike. The first coding bootcamp was founded just four years ago, but Course Report estimates that over 150 bootcamps graduated more than 16,000 alumni in 2015 – a combined estimated market of $180M, up from $0 in 2011.

According to Western Governors University President Bob Mendenhall in the Washington Post “Neither accreditation nor regulation has caught up with the power of technology to impact both the quality and cost and accessibility of higher education.” And last month, Udacity raised $105 Million bringing their valuation to $1 billion, Dev Bootcamp was acquired by Kaplan, and Bloc recently announced a year-long Software Engineering Track, which includes a three month apprenticeship, before students start the job search. And now a slew of specialized apprenticeship programs are emerging.

Employees are also more open to non-traditional university education than ever before. According to a 2014 survey by Glassdoor, 72 percent of employees said they value specialized training over earning a degree. What’s more, 63 percent of respondents said they believe that nontraditional ways of learning new skills — such as certificate programs, bootcamps, webinars and massive open online courses — could help them earn a bigger paycheck. This growth for nontraditional skills training may be coming at the expense of graduate programs, with more than half (53%) of employees saying a graduate degree is no longer necessary to be offered a high-paying job.

What Should We Expect to See in 2016?

As apprentice-like programs cross the chasm from early adopters to early majority, we may see see savvy millennials foregoing the traditional 4-year campus experience in favor of a leaner hybrid, pairing community college with a technical apprenticeship that gets them into the workforce and learning on the job earlier and with less debt.

With the hype around coding bootcamps reaching it’s zenith, we may see these programs coming full-circle, as they begin adding-back curriculum covering the computer science theory that they once eschewed.

Why Apprenticeships Are on the Rise
The Path to Mastery in Software Engineering

Bloc’s Software Engineering Track takes approximately 2,000 hours to complete. Depending on your pace, we distribute those hours across 48 or 72 weeks. That’s a long time, and students often ask if they can complete the track faster. Our answer is unequivocally, “no.” We insist on 2,000 hours because — like mentorship, curriculum, platform, and community — adequate time is essential for learning a new skill. It can not be truncated, even in the spirit of hustle or efficiency. To understand why time is so important, you must first understand how we view the path to mastery.

Mastery

Any craft can be mastered, barring physical limitations. That is to say, I believe that I could become a masterful guitar player; but my dream of playing quarterback for the New York Giants is undoubtedly limited by my age, height, speed, strength, and my body’s inability to absorb blind-side sacks delivered by 250 pound linebackers.

mastery-football

But most crafts can be mastered, and the path to mastery has been well-defined for hundreds of years. During the middle ages, an apprenticeship system emerged where young adults lived, worked, and learned from an experienced mentor — a master. An apprentice signed a contract and spent seven years learning a craft like metalwork, medicine, cobbling, or tailoring. After their apprenticeship, the apprentice became a master, established their own business, and mentored apprentices of their own.

mastery-anvil

The apprenticeship system of the middle ages was successful, and still applies to current crafts, like electrical work, which has a standard apprenticeship of four years. The apprenticeship system is successful because of three factors: mentorship, practice, and time. In the middle ages, masters provided the mentorship and the apprenticeship contract ensured that practice and time were accounted for. Let’s discuss each of these factors.

Mentorship

A mentor is more than a teacher. Mentors know how to teach, but they are also masters of their craft. A mentor adapts to their apprentice and their apprentice’s learning curve. They understand when to pressure the apprentice, when to help, and when to challenge. A mentor can predict when the apprentice will struggle and adjust their lesson accordingly.

A mentor ensures that the apprentice practices realistically; they know that the apprentice can get only so far with drills and menial tasks, the apprentice must also work on real projects. The mentor knows how to administer these lessons effectively. In Mastery, Robert Greene discusses the benefits of learning from a mentor:

Mentors do not give you a shortcut, but they streamline the process. They invariably had their own great mentors, giving them a richer and deeper knowledge of their field. Their ensuing years of experience taught them invaluable lessons and strategies for learning. Their knowledge and experience become yours; they can direct you away from unnecessary side paths or errors.They observe you at work and provide real-time feedback, making your practice time more efficient. Their advice is tailored to your circumstances and your needs. Working Closely with them, you absorb the essence of their creative spirit, which you can now adapt in your own way. What took you ten years on your own could have been done in five with proper direction.

Practice

When you commit to learning a craft, you accumulate personal debt. “I will become a grandmaster chess player” is a lofty goal that will require an arduous apprenticeship. The only way to pay down a debt is with consistent payments over the course of months or years. In an apprenticeship, your payment is practice.

Your payment may be small one day and large the next – 30 minutes of practicing chess tactics or 4 hours of match play – but the key is that you keep paying. Any debt can be paid off, as long as you commit to a regular payment schedule. Consistent practice is absolute with an apprenticeship, without it there is no path to mastery.

Practice is effective enough to overcome the lack of natural abilities. Bill Bradley was tall as an adolescent, but not athletically gifted. Despite his lack of natural aptitude for the game, he fell in love with basketball and committed himself to playing it well. In another excerpt from Mastery, Robert Greene explains Bradley’s approach:

Managing to get his hands on the keys to the high school gym, he created for himself a schedule–three and a half hours of practice after school and on Sundays, eight hours every Saturday, and three hours a day during the summer. Over the years, he would keep rigidly to this schedule. In the gym, he would put ten-pound weights in his shoes to strengthen his legs and give him more spring to his jump. His greatest weaknesses, he decided, were his dribbling and his overall slowness. He would have to work on these and also transform himself into a superior passer to make up for his lack of speed.

mastery-jersey

Through disciplined and consistent practice, Bradley became an all-time great professional basketball player. He mastered a craft that’s constrained by physical attributes, which is a remarkable achievement. After he retired from basketball, Bradley applied similar rigor and work ethic to another craft he was not naturally suited for – politics. He served three terms as a U.S. Senator for New Jersey, and a campaigned for the 2000 Democratic presidential nomination.

Time

Time is the most misunderstood factor in the path to mastery, because a beginner underestimates how long it takes to become proficient at a new craft. In Outliers, Malcolm Gladwell postulates that it takes roughly 10,000 hours of deliberate practice to master a craft. This has become commonly known as the “10,000 hour rule,” and has proliferated in both supporters and detractors. Gladwell defended the rule in his article Complexity and the Ten-Thousand-Hour Rule. Gladwell cited the conclusion of a 40 year old study about expertise, regarding their research of chess grandmasters:

There are no instant experts in chess—certainly no instant masters or grandmasters. There appears not to be on record any case (including Bobby Fischer) where a person reached grandmaster level with less than about a decade’s intense preoccupation with the game. We would estimate, very roughly, that a master has spent perhaps 10,000 to 50,000 hours staring at chess positions…

mastery-chess

The time it takes to master a craft depends on the person, the craft, and the mentor, though 10,000 hours seems to be a reasonable average for most cognitive crafts. For 99.99% of people, there are no exceptions to this average. Mastery takes time, and there are no shortcuts.

An Apprenticeship for the 21st Century

The need for cobblers isn’t what it once was, but as software eats the world, the need for software engineers grows. The craft of software engineering lends itself to the apprenticeship system. It is complex and requires skills in reasoning, logic, art, math, and theory. Software’s complexity requires masters to develop it, and teach it.

Unfortunately constraints such as time, money, and competition in business impact the ability for masters to train apprentices. Formal software apprenticeships exist – thoughtbot, 8th Light, and Trunk Club offer paid apprenticeships where apprentices train with master software developers – but these apprenticeships are limited. They last only several months, are offered in specific locations, and admit a small number of apprentices.

These limitations demonstrate the difficulty with scaling apprenticeship programs. Coding bootcamps attempt to solve the problem of scale by offering online and and classroom-based focused training, but they lack the key factors of mentorship and time. The average coding bootcamp lasts 12 weeks, or approximately 500 hours.

master-learning-curve

This is the average learning curve for becoming a software professional. The minimum number of hours needed to become a proficient, entry-level full stack web developer is approximately 1,000 hours. After consulting with world-class engineering teams, we learned that there is a skills gap between a full stack web developer and software engineer, which neither coding bootcamps nor universities are addressing.

We believe that this skill gap can be closed with an additional 1,000 hours of focused practice, which is why we require a minimum of 2,000 hours for our Software Engineering Track. We support this requirement with a tuition reimbursement policy – if you’re not able to start a career as a software engineer after graduation, we’ll refund your entire tuition. We are able to make such a guarantee because we know that the apprenticeship model is effective, given proper mentorship and 2,000 hours of consistent and focused practice.

Bloc’s mission is to offer software engineering mentorship at scale; to provide a way for anyone, anywhere to learn software engineering as an apprentice. The tuition pays for the factors required in the path to mastery:

  • Our mentors and curriculum teach students and provide realistic practice through building software and contributing to open-source software.
  • Our platform ensures that students develop a consistent and focused practice schedule.
  • Our track is paced for 2,000 hours, which ensures that a student has spent enough time as an apprentice to begin work as a professional software engineer.

While it would be interesting to offer a 10,000 hour program for software engineering mastery, we believe that 2,000 hours is an appropriate amount of time to start a new career as a professional software engineer. A graduate of our Software Engineering Track will understand how to learn from a mentor, they will have disciplined habits and practice consistently, and with these skills internalized, they will know that the path to mastery is simply a matter of time.

It’s an inspirational idea – to think that you can master a craft with such a simple formula. Seek mentorship, find realistic ways to practice your skills, develop consistency in your schedule, and practice for years. You will become a master.

The Path to Mastery in Software Engineering
How to Succeed in an Online Coding Program

Learning online is hard

As online education proliferates (read: online coding programs), its proponents and detractors develop increasingly stronger opinions on its effectiveness. Proponents tout online education’s low cost, accessibility, and flexibility. Students can learn anywhere, according to their schedule, and usually at a reduced expense. Detractors, on the other hand, cite high dropout rates and a lack of effectiveness. While both sides of this debate are correct, there is a strategy for succeeding in an online program.

Create a dedicated home office, and make it awesome

A dedicated home office doesn’t require a large investment. As an online student you’ll work from home most of the time. You must find a space that’s quiet, clean, and allows for ergonomic amenities. 100 square feet should be plenty of space to create an office. You can find high-quality office furniture at IKEA, or buy used from a site like craigslist. Consider using a standing desk, or treat yourself to an ergonomic desk chair. Better yet, you can buy a sitting desk and build a modular standing desk, so you can stand or sit.

After your desk and chair are positioned, build the rest of the office around them. Hang pictures or paintings and buy a small bookshelf to fill with inspirational books. Save your money for perhaps the most expensive things, like a computer and monitor. It’s essential that you have a capable computer, and I recommend splurging on a large monitor. You’ll need to have multiple windows open from time to time, and a large monitor provides the real estate to do this.

Finally, if you live with other people, ask them to respect your office space. A clean, organized, and comfortable office will set you on the right path for succeeding in an online program.

Immerse yourself

When you take an in-person program, immersion in the topic is inherent. You’re physically near your classmates which means that you’re likely to discuss the program and share knowledge. As an online student, immersion is not necessarily inherent – you have to force the issue. Your program will probably have a community – forums, chat rooms and mail lists – and while those are good places to hang out, you shouldn’t stop there. Subscribe to blogs and podcasts and find people to follow on Twitter. Get to know the lingo of your topic of study, and some of its key figures. It doesn’t matter if you understand everything right away, it’s important to become comfortable with the “language” you’re learning.

Study every day

In-person programs impose a routine of study because you have to go to class at specific times. Online programs offer more flexibility, so you have to manufacture a routine. Without a consistent and disciplined routine of study, you will not succeed in an online program. Whether you spend 15 minutes or 8 hours studying, you must study every single day. Create a habit for yourself. How long it takes to form a habit depends on the person, but you’ll know once you develop it because it will feel wrong not to study. Make sure that your study time is scheduled when you are at your mental best, and not when you’re tired or easily distracted. Find a method that helps you get into a relaxed zone, and make sure you schedule your study time around it.

Find meetups

The fact that you don’t have a classroom doesn’t mean you should avoid people and in-person interaction. An online program offers many benefits over an in-person program, but interaction in real life is something it can not offer. Fortunately, there are many options for meeting people in real life for many different areas of interest.

For example, if you’re studying to become a Rails web developer, there is almost certainly a Ruby or Rails meetup in your area. Join the meetup group, discuss your program with others, tell them what you’re working on and what you’re having trouble with. You’ll learn a lot from these experiences, and often in ways that are hard to duplicate virtually.

Rebase iteratively, and celebrate

No matter how great your virtual community is or how many meetups you attend, as an online student you’ll spend most of your time alone. It’s easy to forget how much you’ve learned when nobody is there to remind you. You must make it a habit to remind yourself. At the end of every day, you should rebase. That is, think about what you know, compared to the prior day. Think about the problem you’ve been toiling over, and that you finally solved. Even though these may seem like small wins, celebrate them! Treat yourself to a beer, order a pizza, or do something to spoil yourself for every little win.

Celebrating your wins is as important as embracing your struggles. If you focus too much on either, you’ll derail your progress. Develop a balanced mindset for both, and you’ll create momentum to capitalize on your wins, and grit to push you through struggles.

Will an online program work for you?

It certainly can, but whether it does or not ultimately depends on your commitment, consistency, and discipline. The strategy outlined in this blog will ensure that you succeed in your program, but you have to embrace every part. If you do, an online program will provide you with a quality education, at a reduced cost, and on your own schedule.

How to Succeed in an Online Coding Program