One Month of a Remote Internship: Lessons and Observations

This is a cross-post from my article on The Practical Dev.

I have been a remote intern for dev.to for about a month now. I am really enjoying myself; teammates are great, work is challenging, and the atmosphere is really relaxed and enjoyable.

These next few paragraphs are particular to who I am and how I work and not a reflection on the company.

Dealing with “Off Days”

For the past week I have been struggling to get the proper amount of sleep. I have sleep apnea, and while I have lost a considerable amount of weight, I still need a machine to sleep.

I currently don’t have the proper equipment as sometimes your mask’s velcro can become less sticky and they need to ship you a new one, which I am waiting for. This presents a problem for me as I really need it to not wake up a million times a night as I stop breathing. This means that when I wake up in the morning, I am just about dead, and unable to think.

I usually just fake it through the day, watching Rails or JavaScript tutorials and pecking away at the feature I am working on. It is difficult, and I sometimes find myself needing a break.

Dev.to is flexible enough that I can take a break whenever I need to. This doesn’t really reduce the anxiety I feel that I may not be pushing features fast enough.

Solution

I should be getting my equipment tomorrow which means I will finally be able to think and be 10x more productive. Additionally, I need to communicate better with the team and let them know where my head’s at.

Learning When to Quit

I have a hard time, especially when in that flow state, of not quitting work. I can go for hours at a time, especially if I am close to finishing a feature or working on a bug. This isn’t a great way to behave, especially as a remote. Blurring the lines between work and home can be hazardous, and knowing when to quit is crucial to not burning out.

I found that I was wanting to work until 9, 10pm when I really should have been unwinding. And early on, Mac reminded me to slow down and not burn myself out. This is not a good way to start any job or internship.

Solution

I found an app called Freedom that allows me to not only put a block on social and news sites, but allows me to block desktop apps from a certain time to another. If I am feeling particularly feisty and in the flow state, I put a block on VS Code from 7pm till 8am. I also put a block on places like Udemy and Treehouse though I may cut myself some slack.

Pain

Programmers know back pain more than any other type of knowledge worker. We sit and stare at a screen for 8 or more hours daily. This can lead to all types of problems, not just for your back but your overall health.

Coming in I already had a bad lower back. The team was nice and got me a lumbar cushion which helped at first. Adjusting it is hit or miss, and now my back is getting bad again.

I have a Slackbot reminder to stand up that I sometimes heed and sometimes ignore. Regardless, standing is crucial as well as getting enough exercise.

Solution

The internship here at dev.to allows me to be able to do things I wouldn’t have been able to do financially. This means I can buy a bus pass now, and get around. I have a gym membership, a couple of them, actually. Now I can finally utilize them. I plan on hitting the gym again, and doing things like Jefferson Curls or bent-legged good mornings and deadlifts to strengthen my back. I used to lift a lot of heavy weights– that’s how I lost the amount of weight I lost a couple years ago. So it only fits that I continue on that path to get stronger and become pain free.

Introversion

I am a shameless introvert. I am also shy. I find being remote a benefit in this regard. But there are times when I need to reach out and talk to the team, to interact with them outside of just work stuff, and I find that extremely difficult to do.

I did it one day! I felt so proud of myself. But with the sleep issue and the feature I am working on taking longer than my first and the shame that comes with that, I haven’t really been communicating with the team. Jess, Andy and Mac have been great in this regard. Coming out of my shell is a bit hard. I am rather serious and reserved around new people. Once I get to know someone, then things begin to loosen up.

Solution

Just talk. As difficult as that is, it is a must. I need to communicate with the team. I need to be social. I am trying. This is a thing I need to overcome, either with a therapist or someone else as social anxiety is a thing for me (it’s even worse IRL). We all have to do what is difficult to actually do great things. So tomorrow, I plan on jumping in the conversations and letting myself be known.

Conclusion

This past month has been seriously enjoyable and I couldn’t ask for a better team to learn with. I need to keep up my end of the bargain. Here’s to another two months!

JavaScript Template Literals

Photo credit by Hongkiat

Traditionally, strings in JavaScript were limited, especially if you were working in languages like Ruby and Python. In both of those languages string interpolation meant that you could substitute strings and have multiline string concatenation without wonky hacks.

In JavaScript, there wasn’t anything like this until ES6. Now, we have JavaScript Template Literals or template strings.

Syntax

Template strings use back-ticks rather than quotes to denote a string. A template string could look like this:

let hello = `Hello World!`;

String Substitutions

What’s nice about string substitutions is that you can take any JavaScript expression and place it inside a Template Literal and it will be output as part of the string.

The syntax for this:

let name = “Tiffany”;
console.log(`Hey, ${name}!`);

Since string substitutions in Template Literals are JavaScript expressions we can evaluate any type of expression we want in the Template Literal. We can evaluate a mathematical expression such as:

let a = 13;
let b = 20;
console.log(`The Mac first launched ${a+b} years ago. I, for one, welcome my bitten fruit overlord.`);

//  => The Mac launched 33 years ago. I, for one, welcome my bitten fruit overlord.

console.log(`I am old, but not ${2 * (a+b)} yet.`);

//  => I am old, but not 66 yet.
// I know. It doesn’t make sense. Bear with my pitiful examples.

You can even put functions or method calls inside a Template Literal:


// Functions inside expressions function func() { return “I am the result of foo” } console.log(`bar ${func} baz.`); // => I am the result of foo bar baz. //Method calls let hacker = {name: ‘Elliot Anderson’} console.log(`You forgot to quit Vim, ${hacker.name.toUpperCase()}`); // => You forgot to quit Vim, ELLIOT ALDERSON

Multiline Strings

Multiline strings in JavaScript required hacks like the backslash hack and string concatenation like:

let greeting = “Hello “ +
“World”;

Template strings make this a whole lot easier. Add new lines where you need them and the whitespace inside the backticks inside the Template Literal will be included inside the string like so:

console.log(`I'm a string on one line
I’m a string on another line`);

Tagged Templates

Tagged Templates can be used for powerful string transformations. You create a Tagged Template by placing a function name before the template string. Here’s an example of auto escaping an HTML function such that:

html`<p title="${title}">Hello ${name}!</p>`

returns a string with the appropriate variables substituted but with all the unsafe characters replaced.

Nicholas Zakas goes over this in detail in his book Understanding ES6.

Summary

Template Literals or Template Strings are a powerful addition to the JavaScript language that brings it much needed string interpolation and transformation.

Use Cases for the Spread Operator

One of the coolest features of ES6 is the Spread Operator. The syntax looks a bit like:

let a = [4, 5, 6];
let b = [7, …a, 8];

console.log(b);

This will give us:

View post on imgur.com

The spread operator replaces the concat function in ES5:

“use strict“;
var a = [4, 5, 6];
var b = [7].concat(a, [8]);

console.log(b);

This is a great little feature, but what can we do with it?

Some Uses for the Spread Operator

We can do a lot with the spread operator.

Combine Arrays

You can use the spread operator to combine arrays:

let test = () => {
  let arr1 = ['foo', 'bar', 'baz'];
  let arr2 = ['fizz', 'buzz'];
  arr1.push(...arr2); // Will append the contents of arr2 to arr1
};

test(); // Runs function

Copying Arrays

We’ve used Array.prototype.slice to make copies of arrays. Now we can do that with the spread operator.

let arr = [7, 8, 9];
let arr2 = […arr];
arr2.push(10); // Will return a deep copy of the array with 10 appended to the end
//of the values

More At the MDN

You can find more uses for the spread operator at the MDN

Things I Am Cooking Up

I am thinking of starting another podcast.

Most of the shows will be 15 > minutes as I really, really, really hate audio editing and cannot afford a dedicated editor for a weekly, seasonal show.

I am also not sure if I’ll hop on the S01E01 bandwagon or not. Seems it is all the rage in the podcast community but I am not certain it works for developer podcasts though one of my favorites works that way.

On Developer on Fire

I recorded an episode of Developer of Fire. It will be out sometime at the end of the month or beginning of next year.

First Feature and Pull Request

 

I spent a good week working on our CodePen Liquid Tag feature. It was my first time working with a team on a feature for an app that wasn’t solely mine.

I was nervous. But it was really fun.

Mac, our Senior dev instructed me. He remarked that it didn’t take me long to pick it up and off I went, getting the feature built with time to spare1.

Shortly after, I created my first PR. I can’t tell you how long I’ve waited to make a PR on a project I believed in. I got that chance and it went well.

Feature and PR

I find that, since I spent a lot of time learning JavaScript, Mongo, Mongoose, Node and the like, that digging into Ruby, Rails, ActiveRecord, and things like this aren’t too difficult.

One of the things that helped me was when Mac and Ben told me to look at another file. I was able to discern what to do, and cobbled together a basic framework of the feature. I then built upon that and continued to ask Mac questions which he patiently answered.

I submitted the PR and it was merged shortly after.

Yassssssss

I submitted a PR to another project but it wasn’t merged. I wasn’t ready then. But now, I have had two PRs merged and am working on a third feature.

Work Is Fun

The team is great. The perks are great, even for an intern like me. And I absolutely believe in what we’re trying to build.


  1. We don’t have hard deadlines, though, unless it is a critical bug or security flaw. 

The Simplicity of Ruby

When I first started this blog, I was learning Ruby and I loved it.

This was before starting freeCodeCamp or Zed Shaw’s Learn Python the Hard Way series 1.

When I decided I wanted to program for a living, I found some meetups and went to my first one in 2014, Code & Supply where Ruby was the topic; getting it set up on our systems and writing a pretty simple Ruby program.

Ruby was so simple. Take this, for example:

class MyClass
  def initialize(name, age)
    @name = name
    @age = age
  end
end

If you know anything at all about OOP, you know what is happening here.

Where the beauty of Ruby lies is in its eerily easy to read syntax.

class MyClass

creates a class where we’ll hold all our objects and methods.

def: define. Here we are defining a method initialize with two local variables
name and age. We assign them to the instance variables @name and @age in order to use them outside of the object’s scope. We end the method and class with the end keyword.

Outside of the OOP instance variable syntax, this is super easy to read and understand.

First Day Feels

It is 10pm and I really need to get to bed soon. But I just wanted a chance to write about how patient the team at The Practical Dev has been with me as I learn the ropes.

On-boarding was a breeze and I have already started digging into the codebase.

My first day was fraught with nerves and expectations that I had for myself 2.
Remembering that I am not the sole developer on a project and I have a team to refer to is taking some getting used to. The team is great and I definitely ask questions: have never been shy about that. I am just so damn shy and quiet. This is something I am working on.

They even purchased a lower lumbar cushion and keyboard for me, which I can purchase when I move on.

It has been a great first week so far and I am looking forward to the weeks to come.


  1. LPTHW is quite opinionated and I am not sure if it is still recommended to new developers. 
  2. And very little sleep. Trying to fix that. 

I Am Now Doing This Thing For Real

I have recently joined the The Practical Dev as an apprentice software developer.

Remember when I said that good things were happening? That was one of the things.

Ben reached out in a Twitter DM and it kicked off.

I filled out the required application. We had a video conference yesterday and today they made the offer.

I can’t tell you how excited I am to be joining the team 1. This transcends just being in tech or having a career.

There is so much I would like to day, to be quite honest. There are some things I can’t or don’t want to explain but.

I have lived a miserable existence, from the day I popped out of my mom’s womb. She was an addict. I was adopted but that drug use left me with some residual side effects.

I spent my youth and teenage years in a very bad state. Emotionally I was a mess. I was a bright kid, a great student. Things came super easy to me. But because of trauma and emotional issues, I couldn’t really go to college after high school. I eventually went as a 24 year old. But, as it was, emotional issues, depression, angst. All that prevented my from being successful.

When I was 22 my grandmother died. She was my rock. She was in my corner, even when I was a little shit. She was there. She protected me.

I was in a place where I could remain safe when I was in my early 20s. I was poor and out of it. She died and I felt like I let her down; I wasn’t much of anything. I was just another listless 20 something black girl from the hood drifting in and out of placements and falling through the cracks. I always felt like I let her down. I couldn’t help it, but the guilt has followed me.

I didn’t start feeling like I had something to live for until I was 28. I had been through hell and back, an emotionally violent relationship, I had been through the ringer. But something came around for me as a 28 year old young woman starting to realize that yeah, life is shit. It really is. But you literally crawled out from the jaws of death and now what are you going to do with your life?

30 Something…

I went back to school when I turned 30. I was a humanities major. I was still pretty poor. Making ends meet was hard.

I went to school, making good grades for a while. I decided that tech was where I wanted to work. As much as I liked to write, I liked tweaking my sites even more. I also knew that I would remain poor as a humanities major because I didn’t want to teach.

I got a Mac in 2014, a code editor, and I was off to the races.

I went to Pitt from 2015-2017 as a CS major. You may remember it.

Starting the University of Pittsburgh

Had a breakdown in the middle of those two years.

I couldn’t go back to school this year and instead dove head first into every project on my GitHub that isn’t for school.

I’ve built some pretty cool things that I am proud of and am working on even more things.

But now I get to do it for real.

Whew

I have not been eating much. That is how bad it has gotten for me. I am not complaining though. I have good friends and family. They have helped me through the rough times I have been having. I have been really coding for my life, not just for a cushy job. It means so much more to me because of that.

I have been searching for a couple months now. I was using a little Chrome extension called Streak CRM to track the process. Rejections would come in. Now, I have a CRM with an offer that I accepted.

Mom

My mom is 71. She told me she would like to stick around long enough to see me be something. She qualified that with, “Well, you are already something but. Still. You know.”

I knew what she meant. We haven’t always been on good terms. But I love her and I, too, wanted her to see this. I didn’t want another regret of letting another important woman to me see me floundering.

I bought my mom a little something from Amazon and added a note and gift bag that said:

“Mom, I did it. From now on Xmas for you will be special. I’m grateful for your support. Love you. Tiffany”

Makes me feel good.

Thanks, Ben and Peter

I mean, really. You two have taken a chance on an old lady who doesn’t have a degree but has a fire in her belly to actually learn and grow as a developer. I can’t thank you two enough. Truly. Thank you.

Well

Everyone has a story. I am glad mine is ending up like this. I hope for happiness and success for anyone who is on the outside looking in in tech. You got this. 🍻🙌🏽


  1. I am old. I am the oldest person on the team. Haha. I am young at heart though. Goes to show someone pushing 40 can break into the industry if they work their asses off. 

Update: Lots of Things Happening

I thought I’d post a short update about why I haven’t been blogging as much.

These past two months have been a whirlwind for me. I am looking for jobs and I have gotten some interest. I can’t say too much right now, but things are looking up.

The tweets that started it:

It was during a #DevDiscuss Twitter chat. Initially, Pablo Rivera tweeted to Stephanie Hurlburt about getting me a job. She tweeted back to tweet to her my portfolio, resume, etc and that I am looking for work. She would then retweet it to her large following of potential employers and companies.

I did:

And awesome…things…started…happening.

That’s all I can really say but I have honestly just been trying to process what is happening and how, when it comes together and tries, the tech community is the best there is…

Finishing YelpCamp and Lessons Learned

So I have finished The Web Developer Bootcamp and the final project, YelpCamp, a full-stack Yelp clone built with Node, Express, Mongo, Mongoose, Passport.js, and Bootstrap.

It took me four months and some change to completely go through the 45 hour course and finish YelpCamp. Here are some of my thoughts on the process.

Reviewing the Basics

A lot of what I learned in the beginning was a refresher on topics I have already learned. I did it anyway, just to make sure I was completely solid on my understanding of the basics.

I thought this was a very important step: there were some things I wasn’t exactly clear on, like DOM manipulation and CSS classes, etc, things I should have mastered before taking the course. It was evident right from the beginning I should continue to go over these introductory parts, as I really needed it.

Meat and Potatoes

Eventually we started going over things like Node, Express, etc. I found that, while these are intermediate topics, these libraries make working with JavaScript much, much easier. They abstract away so much of tediousness of writing JavaScript that I wished I had learned them first which is never a good idea 1.

These sections were the longest and the most hastily explained. For newcomers, this might be a turnoff but Colt has one of the highest rated courses on Udemy 2 so I am sure newcomers won’t be too scared of these sections.

Building YelpCamp

First, let me say: I am somewhat happy with it. It is my first full-stack app, I built it right alongside Colt. I have recently added modifications and with Ian Schroover, I am going to add even more modifications. It is also helping me in my other full-stack app, Check Yo Self as I can apply what I learned in YelpCamp to that app.

The problem is, the course came out almost three years ago. Web dev changes at a breakneck pace. Everything was out of date. Take this snippet for example:

//INDEX - show all campgrounds
router.get("/", function(req, res) {
  if (req.query.search && req.xhr) {
    const regex = new RegExp(escapeRegex(req.query.search), 'gi');
    // Get all campgrounds from DB
    Campground.find({
      name: regex
    }, function(err, allCampgrounds) {
      if (err) {
        console.log(err);
      } else {
        res.status(200).json(allCampgrounds);
      }
    });
  } else {
    // Get all campgrounds from DB
    Campground.find({}, function(err, allCampgrounds) {
      if (err) {
        console.log(err);
      } else {
        if (req.xhr) {
          res.json(allCampgrounds);
        } else {
          res.render("campgrounds/index", {
            campgrounds: allCampgrounds,
            page: 'campgrounds'
          });
        }
      }
    });
  }
});

This is a mess of callback hell that doesn’t 3 exist anymore in 2017. There are promises in ES6, and async/await in ES7. I am sure Colt knows this now and has references to these features in his new course. However, this app is probably over a thousand lines of JavaScript over several modules. I don’t have the time, or the want, to refactor this. I didn’t come up with this idea but it does look good on my portfolio.

End Game

My mission in all this was to learn the basics of full-stack web dev in a pace and learning style I could be successful in. I have done that. Now, it is taking what I learned and working it into Check Yo Self. Pop on over to YelpCamp and give it a look. Tell me what you think.


  1. Some people think you can learn libraries right away without learning the basics. This is erroneous thinking. If you are a junior, like I am, learning the basics will get you hired. There are concepts you need to fully understand before calling yourself a professional JavaScript developer. It’s that simple. 
  2. His newest course, The Advanced Web Developer Bootcamp has a similarly high rating though it isn’t as well-thought out, and it shows in ratings from his previous course’s students. The course uses several teachers but is more up to date and uses React, ES6 and so much more. I plan on buying it when it is on sale again. 
  3. And shouldn’t 

My First Interview: A Love Story

Okay, so not really a love story, but a good one nevertheless.

A while back, maybe a month and a half ago, I was in the Code & Supply Slack, a local code meetup in Pittsburgh, perhaps the largest one here. Listless, I went to the #jobs channel.

Scrolling through all the positions I found one that intrigued me: a JavaScript developer position. Great!, I thought. Just what I want.

The job posting was by a company I found three years ago 1 when I wanted to be UX girl. I remembered their unique logo and branding and dug into their site back then. I wasn’t ready for a job yet but I did remember them.

I applied right away.

The application process was simple. Upload your resume, tell us why you want to work for us, drop your links in this box. I did all that. Up until I applied I had gotten 3 rejections for positions I’d applied for. I knew I had a shot at getting an interview with this company.

Emails Sometimes Get Lost…

I have a habit of checking my email too much. After discovering important emails were ending up “All Mail” in my G Suite account, I would go in there daily to see what I had missed.

Unfortunately, I didn’t see the initial email asking for a video chat by the company. And it just so happened, two weeks later, I popped into All Mail and the HR person’s email was at the top, asking if I had received the email and that they really wanted to chat with me.

WTF? Is this real life?

I responded, perhaps a bit too enthusiastically. We set up a time within the next couple of days.

That day after I received that email, I literally could have run around my neighborhood 2. I could hardly sleep.

The Day of The Interview

I went to bed at 7 PM after taking three melatonin for sleep 3. The next day, I showered, got dressed up and sat in front of the webcam 10 minutes early. I was pumped and nervous.

They came on and introduced themselves. Asked me to tell them something about me. I mentioned I was originally an English major. They were both English majors in college.. We talked about my projects. The tech lead said he saw that I was coding a markdown grammar checker and hoped it would be named, Check Yo Self and it was.

I mean, you can’t start an interview better than this.

The tech lead didn’t get too technical with me, just asking about my projects, mentioning that Check Yo Self is a big undertaking. I was happy he felt that way. I need that.

He mentioned testing, and a few other things. I don’t have any testing experience. There were things I didn’t know. And I let them know it.

After the Interview

They let me know they would contact me in a couple days to let me know if I moved on to round 2. There were four or five rounds. The second round was meeting with more technical people. The third was meeting the bosses. Fourth round was meeting in their headquarters with that team. And the fifth was meeting with the team in Pittsburgh.

I felt like I had a great shot at the second round, the interview went so damn well. They have in their emails that they are committed to diversity and inclusion and if you didn’t have access to video equipment they would accommodate you. This is so rare. So so rare. I felt extremely lucky to have an interview with such a great company with these great people.

I didn’t do anything at all that night except bask in the fact that I had nailed that interview. It was catharsis for me. I have spent the past three years learning and that interview was validation that people have seen I am working hard and know what I am doing. It felt like a weight had been lifted and now I could have more confidence.

I also wasn’t stupid. I knew I needed to apply elsewhere because nothing is guaranteed.

The Follow-up

The next day I received this email:

Hi Tiffany,

Thank you so much for taking the time to chat with [redacted] and me yesterday to discuss the JavaScript position at [redacted].

While we enjoyed chatting with you and were impressed with your personality and passion for web development, we will not be moving forward with your application. This particular role will require a broad perspective and professional experience for building for the web, so we need to ensure that the person we hire is ready to hit the ground running in those ways on our larger projects. We’d encourage you to continue on the road you’re already on and to consider applying again in the future! You’re incredibly smart and capable, so we’re excited to see you continue building on your web development knowledge base.

Don’t hesitate to reach out if you have questions of any kind!

Thanks and best wishes!

I read that email five times in a row. It stung but that email was so…I don’t know. It is rare to get an email like that from a company that isn’t going to hire you, with feedback, etc. They really liked me, thought I was incredibly smart and wanted me to apply again when I gained more experience. I may not have gotten the job but I can’t be mad. I’d been validated, even in rejection.

What’s Next

I’ve decided to take some time to learn testing and React, as well as user auth with Passport.js, as well as Locomotive, an MVC framework built on top of Express. I will start applying again after the holidays.

I want a more solid foundation and breadth of knowledge before diving in again.

I’m excited for my future in this field.


  1. I got my first Mac three years ago with my first Mac bundle: a code editor and several learn to code courses. Up until that point I was a techie who wanted to write for a living and code on the side. After going through a few courses and falling in love with OS X, I decided programming was for me. The rest is history. 
  2. Except I am really out of shape and live in a bad area and it was 9 PM. 
  3. Because of some faulty brain wiring, I need medication and it helps me fall asleep. Usually. If not I suffer from crippling insomnia and because I was so excited, I knew sleep was not in the cards.