Skip to main content

Dear new guy: Some personal advice from an old software engineer to a new software engineer


Dear new guy (or girl), I threw together this doc based on advice I’ve given to other people in the past. Hence, it wasn’t all written with you in mind, but hopefully, there are a few useful nuggets in here.

First of all, beware of pride. Pride has been the downfall of countless individuals. Among other things, it prevents you from being open to contrary points of view which stunt growth.

Second of all, you should know that you are talented and intelligent. However, these things are not enough to succeed. There are other things such as discipline, hard work, follow through, prioritization, graciousness, negotiation skills, networking, general communication skills, etc. that are all important for success in our line of work.

Email and Slack

The keys to productivity are discipline and flow. Flow takes awhile to get into. Anything that interrupts your flow is disastrous for productivity.

Email and Slack are destroyers of productivity. I find that if I read all of my email early in the day, I’m unable to get any serious coding done for the rest of the day. Similarly, if I carry on a conversation on Slack, I’m unable to code efficiently.

Schedule time for these things. Don’t let them interrupt you constantly.

Setup a Schedule

Setting up a schedule is very important. I’ve fought it for most of my life, but have come to believe that we humans aren’t smart enough to perfectly organize our time without the help of a schedule.

My experience is that you can get into the office anytime you’d like--as long as it’s by 10:15. You can leave the office anytime you’d like--as long as it’s after 5:00 and at least 9:00 hours after when you got in (which leaves time for lunch and things like hacky sack). I generally shoot for 10:15-7:00, which is a little shy of the 9:00 hours, but it’s close enough.

In our line of work, managers like to say things like, “I don’t care how many hours you work, as long as you get your work done.” But the truth of the matter is there’s always more work to be done, and managers start getting nervous if you’re not around to do it. “Butts in seats” is much more important than managers like to admit. If you miss a deadline, managers will be much more forgiving if they see that you’re giving it your best shot.

In companies like ours, there are lots of fun things to get distracted by. However, these distractions prevent you from getting work done, so it’s best to minimize them. The one exception is hacky sack since it does a lot to help clear your mind and help you recover from burnout.

Getting back to the idea of schedules, make use of Google Calendar. You can use it to create both events as well as reminders (which are slightly different). The reminders can even be recurring. Hence, I have numerous daily reminders to remind me of things I need to take care of. For instance:

  • At 10:00 AM, I look for people sending me direct messages in Slack as well as messages sent specifically to my team.
  • At 11:00, I look for PRs that people have sent to my team to review but didn’t specifically ping me on.
  • At 11:30, I deal with email for 30 minutes.
  • At 5:30, I deal with email again for 30 minutes.
  • At 6:00, I try to spend an hour learning, although I am often unsuccessful because I’m busy.
  • At 10:15 PM, I look for meetings that are going to happen the next day, especially early meetings.

Having a schedule helps solidify the habits that you are trying to inculcate. It also provides a sense of comfort that you are spending the right amount of time on the right things.

Get Something Done

This is important, get something done.

When you get in in the morning, before you get distracted with a million things that you could get distracted by, figure out the 1-3 things that you are going to focus on today. What do you need to get done, and what can you do to help you get there? Write them down.

Remember, it’s about impact, not busyness. You can work 24 hours a day, but if you’re not doing things that have an impact, your time is wasted. Now, you’re not always in charge of the exact list of things that you’re supposed to be doing, and as an act of humility and obedience, you often must do the tasks that your manager or PM feel are important. However, you are responsible for not getting distracted doing low priority work that doesn’t have enough impact.

Beware of anxiety. Anxiety can lead to paralysis. Paralysis can lead to procrastination. Procrastination leads to not getting the important stuff done. Not getting the important stuff done leads to more anxiety. It’s a vicious cycle. Sometimes, the only way to break the cycle is to force yourself to work through some unpleasant work in order to get things done.

Figure out the important things that need to get done, and then figure out the steps to do them. Create a TODO list. I create a TODO list for the big picture of what I’m trying to do (i.e. work in general) along with every specific thing I’m trying to do. I edit and prioritize things constantly. If I have a question, I put it on the TODO list. That way I can tackle the questions when I’m ready to tackle them. I generally edit my TODO lists using a text editor, and I often times put them in Trello cards or in PRs once I’m done. I look forward to reading your TODO lists.

Don’t get stuck. If you do get stuck, figure out a way to get unstuck. Ask people questions if you need to. Is there a temporary workaround that you can make use of to get yourself unblocked? If you do use a temporary workaround, make sure you put a reminder on your calendar or Trello board to clean things up when such workarounds are no longer necessary.

Since distractions are the enemy of productivity, it’s important to spend chunks of time where you do not allow yourself to be interrupted. You’d be amazed at what you can accomplish in 30 minutes of time when you do not permit yourself to be interrupted. If something does come up, just put it on your TODO list in a prioritized manner so that you can deal with it at an appropriate time.

Sometimes it helps to have a bunch of easy cards lying around in order to both:

  • Get something done.
  • Get warmed up.
  • Build up your confidence so that you can tackle something larger.

Getting little things done is still really valuable--as long as you’re working on things that have an impact.

One more piece of advice in this category: don’t tell me what you can’t do. Tell me what you can do.


Aim for simple, readable, and clean.

Clean stuff up as you go; that way it makes it easier and easier to work on the codebase instead of harder and harder. However, don’t get distracted with large refactors. Put them on your TODO list or create a card for them so that you can tackle them later.

Don’t strive for perfect code, but always strive to perfect your code. Perfect is a journey, not a destination.


Beware of yak shaving. I’ve spent years using Linux as a desktop, and I’ve spent countless hours learning and futzing with numerous editors. Take my advice and beware of things that you can spend all your time fiddling with but don’t give you enough return on investment.

Look at what the successful engineers are doing. Why are they doing things that way? What can you learn from them? What are the tradeoffs?

I’m going to tell you something that you may not like, but I want you to listen to me as an act of humility.

Install Sublime Text 3 for simple text editing. Don’t bother with configuring it at all.

Install PyCharm for editing Python, JavaScript, etc. Follow our setup guide exactly. Do not turn on Vim emulation.

Spend just enough time to learn the hotkeys to do the most important things. Don’t be afraid of the mouse. It won’t hurt you.

You will probably be slower than you are used to in Vim. That’s okay. Although you’ll be slower at raw text editing, PyCharm will help enough in other ways that you’ll get that productivity back plus some. Best of all, you’ll reduce the amount of time you spend futzing with your editor.

One day, when you’re a powerhouse of productivity, you can do things any way you want to. I know talented engineers who use Vim and talented engineers who use Emacs. I know talented engineers who are happy with just using Nano, as impossible as that seems. But for right now, stick with what I said above. You can ask your co-workers for help using the IDE if you need to. But remember to avoid yak shaving.

Scope, Quality, and Schedule

You know that saying, “Scope, quality, and schedule, pick two”? It’s useful. However, let’s consider the details.

Your quality should be relatively high and relatively constant. You can take on a little bit of technical debt once in awhile, but you should avoid it whenever possible, and you should remember to pay it back.

You should also work a relatively constant (and professional) schedule. You can pull a little bit of overtime once in awhile, but this hits a point of diminishing returns very quickly.

Hence, what’s left? Your manager can pick a fixed amount of work as long as the schedule is flexible. Or, your manager can pick a fixed schedule, as long as the amount of work they expect to get done is flexible.

We tend to have fixed sprints with relatively flexible scopes. Hence, what’s left for managers and PMs to manage? Priority! That’s the way it should be. Let them pick the priority, and then you get to pick a sane approach to quality and a sane approach to the number of hours you work.

Here’s a slightly different take on the same situation. At Twitter, we used to have two competing core values, “Be rigorous. Get it right.” and “Ship it.” There’s a natural tension between these two. However, if you find that it’s becoming impossible to satisfy them both, I say you should find a way to use another one of Twitter’s core values, “Simplify.” Ask yourself: is there a simpler, less featureful approach that will allow me to ship something while at the same time maintaining a healthy degree of quality?


Spend at least 10 minutes a day every day (except Sunday) working out. It’ll help you feel and look better. It’ll also help you build confidence and discipline.

Find a way to help feed the homeless. It can be as simple as buying them a burger. It’ll help get your focus off yourself and onto others.

Go to sleep on time. There are lots of fun things to do, especially as a single guy in San Francisco. However, don’t let them cause you to stay up so late that it impacts your ability to get to work on time without being tired.

In general, beware of pleasant distractions that get in the way of achieving your goals.

(In the following, feel free to swap Saturday and Sunday if you feel so inclined.)

Don’t work on Sundays. You need to give your body and brain a chance to recover. Every time I work on Sundays, my productivity goes down for the next three days, and in the end, it’s just not worth it.

Use Saturdays strategically. You can do a little work on Saturdays once in awhile in order to help you get caught up with something. Just don’t do it every Saturday. Once in awhile, you can take both Saturday and Sunday off; you’ll be amazed at how this makes your productivity go way up the next week.

Obedience is really important. So is accepting responsibility, even when things go wrong. Avoid playing blame games, and be quick to apologize.

As I said at the beginning, beware of pride and learn to embrace humility. It’s something that we’re not very good at in our society, but it’s incredibly important.

Start building your network, both inside and outside the network. Having a strong network is like having a super power.


I’ve already given you a lot to chew on, so throw these on your TODO list, one per day:

Watch GOTO 2012 • Scaling Yourself • Scott Hanselman. It’s particularly good. It also covers much of what I covered above.

I’m not sure if this is exactly the right video, but Time Management for Systems Administrators is famously good.

Here’s an older version of my talk, Best Practices for Software Engineers, although you may have seen it before.

Everyone has a brain that is flawed in one way or another. I found this book particularly helpful in learning to deal with my own flaws, Emotional Intelligence: Why It Can Matter More Than IQ. Create a calendar reminder to start reading this book six weeks from now.

This book is life changing, and I recommend it to almost everyone, Getting More: How You Can Negotiate to Succeed in Work and Life. Create a calendar reminder to tackle this book four months from now.

I’m pretty sure both of the books above are on Audible if you would prefer that.

Finally, set a calendar reminder for yourself to re-read this doc two weeks from now.


Popular posts from this blog

Ubuntu 20.04 on a 2015 15" MacBook Pro

I decided to give Ubuntu 20.04 a try on my 2015 15" MacBook Pro. I didn't actually install it; I just live booted from a USB thumb drive which was enough to try out everything I wanted. In summary, it's not perfect, and issues with my camera would prevent me from switching, but given the right hardware, I think it's a really viable option. The first thing I wanted to try was what would happen if I plugged in a non-HiDPI screen given that my laptop has a HiDPI screen. Without sub-pixel scaling, whatever scale rate I picked for one screen would apply to the other. However, once I turned on sub-pixel scaling, I was able to pick different scale rates for the internal and external displays. That looked ok. I tried plugging in and unplugging multiple times, and it didn't crash. I doubt it'd work with my Thunderbolt display at work, but it worked fine for my HDMI displays at home. I even plugged it into my TV, and it stuck to the 100% scaling I picked for the othe

ERNOS: Erlang Networked Operating System

I've been reading Dreaming in Code lately, and I really like it. If you're not a dreamer, you may safely skip the rest of this post ;) In Chapter 10, "Engineers and Artists", Alan Kay, John Backus, and Jaron Lanier really got me thinking. I've also been thinking a lot about Minix 3 , Erlang , and the original Lisp machine . The ideas are beginning to synthesize into something cohesive--more than just the sum of their parts. Now, I'm sure that many of these ideas have already been envisioned within , LLVM , Microsoft's Singularity project, or in some other place that I haven't managed to discover or fully read, but I'm going to blog them anyway. Rather than wax philosophical, let me just dump out some ideas: Start with Minix 3. It's a new microkernel, and it's meant for real use, unlike the original Minix. "This new OS is extremely small, with the part that runs in kernel mode under 4000 lines of executable code.&quo

Haskell or Erlang?

I've coded in both Erlang and Haskell. Erlang is practical, efficient, and useful. It's got a wonderful niche in the distributed world, and it has some real success stories such as CouchDB and Haskell is elegant and beautiful. It's been successful in various programming language competitions. I have some experience in both, but I'm thinking it's time to really commit to learning one of them on a professional level. They both have good books out now, and it's probably time I read one of those books cover to cover. My question is which? Back in 2000, Perl had established a real niche for systems administration, CGI, and text processing. The syntax wasn't exactly beautiful (unless you're into that sort of thing), but it was popular and mature. Python hadn't really become popular, nor did it really have a strong niche (at least as far as I could see). I went with Python because of its elegance, but since then, I've coded both p