@Calendee

TypeScript with Next.js

tl;dr (seriously long!) : I talk a lot about myself below. Here's the gist of it: I started a new job in mid-January and quit after only two days. I cover the mistakes I made during the interview process; problems with the new job; coping with shame, embarrassment, impostor syndrome, and depression; and how I am moving forward from here.

Why am I going to air my dirty laundry and talk about such personal matters? I hope it can help others in the tech industry avoid the same mistakes I made and help them overcome their own personal challenges with self-doubt and depression.

Also, "Rule 8 / Tell the truth - or, at least, don't lie" (see explanation below). I'm going to be looking for a new job soon. As I routinely talk about developer topics and my own career on Twitter, it would be easy for any potential employer to see that I've talked about starting a new job recently. Trying to hide this unfortunate incident would only lead to worse problems down the road. If a potential employer sees all of this and chooses not to hire me because of it, I'm better off without them.

If you just want to skip straight to my advice for interviewing and avoiding the mistakes I made, click here.

A New Opportunity as a Mobile App Developer

For the last 312 years, I was working remotely as a contract mobile app developer for a great digital agency in Arkansas. With their team, I helped develop productivity apps for the world's largest retailer and a major logistics company. I really enjoyed working there, was challenged on a daily basis, and really enjoyed my team's dynamic and energy.

However, my extended contract looked like it might be wrapping up at the end of December 2018 with the major client I was currently assigned to(Mistake #1). In November, I was contacted by a recruiter about a React Native developer position literally down the street from me. Since I was going on an extended vacation at the beginning of January and was in doubt about my future prospects, I was intrigued by this new opportunity and began interviewing. I was excited about something new and challenging. Working in an office again with others seemed like a good opportunity to grow after 16 years of working from home(Mistake #2).

The Interview Process

My first step in the interview process was a coding challenge. It was all about dates and had to be completed without the aid of any date libraries or built-in date functions of whatever language I chose to write it in (JavaScript in my case). Ugh... dates...

In my 15 years as a professional developer, I've never had a coding challenge and was quite stressed about it. I'm a self-taught developer and have always questioned my skill level and expertise as compared to other developers. I've never felt like a "real developer" and have fallen prey to the impostor syndrome almost constantly.

So, I froze... big time. I literally stared at the problem for almost 4 hours without making any progress. I was beating myself up inside the whole time thinking what a loser I was. I almost walked out several times. Finally, I got control of my stress and started making progress. Four hours later, I had a mostly working solution that had a few bugs. I discussed the status with the lead developer and promised to work on it some more that evening. Overnight, I basically rewrote the entire codebase, tidied it up with lots of documentation, and emailed the solution back to the lead developer. I seriously expected to never hear from them again.

Amazingly, a few days later, I got called back and was asked to come in for a formal interview and code review. During this meeting, I walked the CTO and another lead developer through the coding challenge. They were pleased with all my documentation and my perseverance despite a few remaining bugs! I felt validated!

The rest of the interview was them asking me about my experience, past jobs, etc. They were quite thorough in ensuring I had the past experience to do the new job. When offered to ask questions of my own, I stupidly asked some lame questions that provided little real information(Mistake #3).

After the interview, I believed my new job was going to be co-developing the company's new React Native app with a digital agency and doing some maintenance work to keep the existing app running until it could be replaced.

Eventually, I was offered a senior mobile developer position and after a bit of back and forth negotiating, I accepted the job. That day, I informed my current employer that I would be leaving at the end of the year for my vacation and not coming back. The CTO asked me if there was anything he could do to change my mind. I told him I had already committed to the new company and wasn't looking for a counter offer or any changes(Mistake #4).

After that meeting, I already felt a sense of dread. I was leaving something I had really enjoyed for something completely new. I was definitely having misgivings and doubts. Something felt wrong. However, I dismissed that simply as jitters and natural worry about starting something new.

The New Job

IMPORTANT : I'm not going to name the company I was working for or bash them as they are not here to defend themselves. Additionally, I'm in no way throwing shade on any of the hard-working people at the company. They are doing their best with their circumstances. Many of them love it there and would completely disagree with my perspective on the situation. I'll just cover enough about my experience to help explain my reaction and final decision to leave the job.

After my vacation, I started the new job in the middle of January. On the first day, I was very pleased to see the company provided me with a brand-new laptop instead of a previously used hand-me-down. The lead developer spent much of the first day walking me through the existing backend code base and databases. Right away, I was dismayed. The code base was extremely complex and almost completely undocumented. The database had dozens and dozens of tables, many of which the lead developer explained he had no idea what they were for or if they were still used.

Later that day, the second lead that had been maintaining their existing Sencha Touch mobile app walked me through that code base. In reality, he cheerfully brought me the build computer for the app and essentially said, "I had it, now you've got it!". We spent a few hours going through the code base and trying to get a sample build to work. Unfortunately, none of the build process was under version control. Any changes were tracked by simply making copies of the entire code base and date-stamping the new directories. We left that day without having a working build. It was clear that a build had not worked in many months and was a struggle every single time.

I walked home that day and spent the whole time thinking, "Oh no! What have I gotten myself into?". That night, I could not sleep and was absolutely dreading the next day.

On my second day, things did not get any better. For about an hour, I worked with the other developer trying to get the build process to work. Then, he left me to work it out myself and explained that's why I'd been hired. Based on our conversations, the existing backend team had been forced to manage the mobile app as a side job. They were extremely happy to be able to go back to their primary roles and leave this responsibility with someone else. Shortly afterwards, my email lit up with support tickets for the existing mobile app that needed to be resolved. They were many months old and were transferred to me immediately.

Later in the day, I had a conference call with the CTO and the company developing the new mobile app. At the end of the meeting, I was asked to promise that I would have the build process working and get a new build of the old app deployed by the end of the day.

Based on that meeting, the volume of support tickets, and feature requests, it was clear to me that my expected job of working with the outside agency to develop the new React Native app was not really going to happen. Instead, I was going to spend the next many months trying to keep an existing app(with outdated tooling and an unsupported framework - Sencha Touch was deprecated in June 2015), running and adding new features. In the meantime, there would have been virtually no time left to actually participate in the development of the new app, let alone be the lead on it.

Miraculously, I did get the build process working by the end of the day and a new app deployed that evening. I honestly have no idea how I got it to work. I tried so many things with the build process and one of them happened to work.

In just 2 days, I had witnessed 2 distinct instances of a team that did not have each other's back. In one conversation, a very new employee was essentially told, "It's not my problem! It's yours now! Figure it out.", right in front of the entire development team. This was a stark departure from my previous team that always had time to help someone out if they were stuck.

While walking home that evening, I was in complete despair. I knew I had made a tragic mistake and would be miserable there for the foreseeable future. I started attacking myself internally, telling myself I was an idiot, a loser, not up to the task, I'd never work as a developer again... etc. I was in free fall. That evening, I didn't want to be with my family and went to bed very early to avoid them and stew in my misery.

I spent that time in bed berating myself. Telling myself I was never actually a good programmer anyway. The software world moves too quickly for an old guy like me to keep up. I can't be a developer anymore - it's for younger people. I should just look for less stressful, challenging work. Maybe I could find some customer support roles that weren't too challenging. Basically, I was spiraling out of control and discounting all my past accomplishments.

Beating Depression and Never Allowing Myself to Fall Back

WARNING: Very personal information follows: I have suffered from depression my entire life. Starting at 10 years old, I was self-harming. From 14 to about 24, I was suicidal. I never told anyone about any of this(except in a few drunken instances with other drunk friends - after which they forgot it all or at least pretended to do so) because I thought it was embarrassing and too shameful to bring up. Only losers were depressed. At 22 at the urging of my future wife, I finally sought help and was diagnosed with Major Depression.

For almost 28 years after that diagnosis, no amount of counseling, self-help books, or medications really brought me significant relief. I was better overall and had many good periods. Having a loving and supportive wife and children helped. I put on a good show of being happy and confident and did my best to never let my kids see anything was wrong. But inside, I was suffering greatly. My depression was always there. Lurking. Dragging me down every time I was weak or uncertain. Ironically, depression is very comforting and hard to give up. It was like an old lover encouraging me to come back into its welcoming arms.

Then, about 7 months ago, something changed my life. I stumbled across the book "12 Rules for Life" by Jordon B. Peterson". I'll warn you the book is a very philosophical, technical read. However, it struck a chord with me. In just 2 chapters ("Rule 1/ Stand up straight with your shoulders back", "Rule 2/ Treat yourself like someone you are responsible for helping"), I immediately saw how my sense of being in the world had shaped me into a person that had no choice but to be depressed. Internally, I considered myself lower than everyone else on the totem pole and not worthy of attention, love, or respect. I was the lowest of the low lobsters(see the book). I was very introverted because I always felt judged(and found wanting). Externally, I appeared to do well in extensive social settings, but inside I was scared stiff and needed days to recover from the stress.

I know it sounds silly and unrealistic that a single book could have such an impact(after having read many), but this newfound understanding changed me almost overnight. I now believe in myself. Almost every day since finding this book has been a great day. I routinely walk 5 miles for exercise and find myself whistling or humming a happy tune. In the past while waking, I just dwelled on my short comings, failures, or fears for the future. Needless to say, exercising wasn't the uplifting, motivating experience that many people enjoy.

I used to dread social situations(but forced myself to do them anyway), but now I actually like talking to and meeting new people. Now, I look forward to each day and my future adventures and challenges. I've shared my experience with my boys and explained the book's concepts to them hoping it will help them never fall into the hole I had been living in. In short, I can finally say I understand what "normal" people feel - a general well-being without overwhelming fear, doubt, and self-loathing.

Needless to say, my experience with the new job was jeopardizing this newfound joy in life. In just 2 days, I was regressing quickly. I can't imagine the state I'd be in after weeks or months in this situation. It was clear I had two options:

1) Stay in the new position and "tough it out" - a.k.a. "man up". That's the advice I would have received from most people in my old life. Surely it would get better, right?
2) Make a clean break now. If it didn't get better, and I finally reached a breaking point, surely it would be even more detrimental to me and the new company to quit several weeks or months down the road.

I chose option 2. I simply could not allow my concerns and dread about the job to impact the fragile peace and happiness I have just recently discovered. Literally, no job is worth that.

The next morning, I emailed (I was too embarrassed to go to the office) the CTO and explained why I was quitting. I offered some suggestions about finding a replacement that might help them recovery more quickly from my sudden, unexpected departure. I haven't heard back from them since.

P.S. If you suffer from depression, please don't make the same mistakes I did for so many years. Reach out to someone for help. It can be a friend, a family member, someone in your company (HR department?), a clergy member, or a medical professional - just get help. I spent a massive part of my life embarrassed by something I had no control over. There is no shame in suffering from a medical disease. If someone in your life doesn't support you improving your life, mentally or verbally abuses you, or derides you when you seek assistance, try to move on. Find new friends. Find someone that loves you and will support your journey to a newer and healthier life. Don't try to face this alone.

My Plan to Recover

Needless to say, this situation left me feeling a bit down on myself and unsure how to proceed. As I mentioned, I've always doubted my skills as compared to other developers. Now, I felt in an even bigger rut.

For the previous 512 years as a mobile app developer, I was almost solely focused on the 1.x versions of AngularJS and Ionic Framework. The software world has moved on drastically since then and I am feeling out of date. I've only had about 6 months of experience with modern React (on a personal side project) and React Native (on a development team for a major logistics company).

However, in the end, I decided I CAN still learn new things and stand evenly alongside other developers. I've made the decision to spend 1 month catching up on all the modern tools and frameworks in order to feel comfortable looking for new opportunities. Here's my study plan:

  • (Completed) TypeScript : Todd Motto's extensive TypeScript Basics and TypeScript Masterclass. I actually took these courses during my vacation between jobs. While I'm no sudden expert at TypeScript, I understand the basics and can go from there. I've even managed to get a TypeScript specific PR accepted in a major OSS project.

  • (In Progress) Fullstack Advanced React & GraphQL by Wes Bos. I've really enjoyed using React in a side project for a local organization. Along with React Native, this is the direction I want to take with my career. GraphQL is also a very intriguing replacement for standard APIs written in traditional backend stacks. I'm looking forward to trying it out on some side projects. After, completing this exhaustive course, I'll have no doubts about my ability to develop in React.

  • (Upcoming) Testing JavaScript with Kent C. Dodds : One of my biggest weaknesses as a developer is my limited testing experience. I've frequently struggled with TDD and BDD approaches and have skipped them in most projects. I've only done a small bit of E2E testing on one AngularJS project and more extensive unit testing on a React Native project. Kent's highly rated course should help me understand how to properly test almost any JavaScript application.

  • (Upcoming) Production Ready React Native: I've started and deployed many Cordova based Ionic Framework apps to the Apple and Google app stores. However, even with 6 months of React Native development experience, I've never actually started a project from scratch and taken it all the way to deployment. This course by Handlebar Labs should help me feel confident in completing the process from beginning to end.

After working on the Fullstack Advanced React & GraphQL course for almost a week now, I'm realizing I might need more than 1 month to complete all the courses. However, I'm feeling very comfortable and still excited about my progress. Before I finish, I'll begin looking for new work and explain my plan to any potential employer.

Impostor Syndrome

Do you write ANY HTML, CSS, C, Basic, Visual Basic, JavaScript, PHP, Go, Rust, Excel macros, SQL, or just about any other language for fun or profit? Does your work improve someone else's life or productivity? You're a developer! It's that simple. You're not an impostor.

Maybe you're not an expert (very few people are). Maybe you're a "Junior Developer". Maybe you're a "Senior Developer" in one tech stack and just getting your feet wet in another new skill. That doesn't make you an impostor. In fact, it makes you something special - a self-learner.

Not many jobs require a near constant devotion to learning and self-development that programming does. If you've started on this path, you've already proven yourself capable of learning. Maybe you can only learn a little bit at a time. Maybe you pick up new skills quickly.

Whatever your pace, you're improving your skills for yourself and your employer. Be proud of that!

Don't compare your skills to your co-workers or others in the development community. There will always be someone significantly better than you. Instead of judging yourself against them, use their knowledge to improve yours. Learn from their code. Pair with them. Ask for assistance when you've exhausted your resources. Don't be ashamed of not knowing all the answers.

The only real impostors are those not bothering to make progress in their personal and professional lives.

Advice to Anyone Looking for New Opportunities and Interviewing

I made several mistakes when deciding to interview for the new job, leaving my existing job, and during the interview itself.

Mistake #1 (from above) : Never assume anything about your current job's circumstances. If you have doubts about it(talks of losing a big deal or potential new customer, etc.), ask your employer to provide some insight. If I had talked to my CTO, I might have known whether or not they had new projects lined up for the coming year.

Mistake #2: The grass is not always greener on the other side. Yes, change can be good for you. However, make sure you really understand why you're considering change. What do you want out of it? Are you just considering change for the sake of change? If you're pretty happy where you're at, could some less drastic change in your life be just what you're looking for? For example, I could have attended more meetups or gotten involved in the local startup scene (I used to do both of those things).

Mistake #3: Never forget that an interview is a two-way street. The employer is going to do everything they can to ensure you are qualified for the job and can fit in with their current team. You might be expected to perform a minor to major (1 or 2 day) sample project/challenge.

You have a responsibility to yourself to make sure THEY are a good fit for you as well. Ask revealing questions such as:

  • What is the turnover rate in your department?
  • What is the shortest time someone has worked here before leaving?
    • If it's a short period, ask about why they left and if the underlying cause has been rectified.
  • How long have the other team members worked here?
  • How long has the most senior person been here?
  • If necessary for either of these previous questions, follow up with, "Why is turnover so high?" or "Why are there so many new employees?" (This might not actually be a problem).
  • IMPORTANT: Can you show me the code base I'd be working in?
    • If the answer is no, try to get an explanation as to why. In some situations, it might be reasonable that the code cannot be viewed in advance. Perhaps you need a security clearance first, for example.
    • Keep in mind that you might be working in this code base for 2000+ hours per year for potentially several years.
    • Is the code documented? Does it have consistency of style or is it a jumble of different styles and indentations due to many developers contributing to it? Do they user linters or tools like Prettier to ensure consistency?
    • Are there tests - end to end &/or unit?
    • Is there an automated build process?
    • What form of version control is in use? Do the commit messages provide meaningful info?
    • If there is no time in an initial interview to look at their code, ask if a developer could spend an hour after hours via screensharing to let you see what you'd be working with.

If the company or people you are interviewing with show resistance or feedback to these questions, that might be a "tell" or it might just surprise them as not many people ask these types of questions. Make a judgement call and keep in mind they expect to know everything about you. It's only fair that you get the same information about their workplace. A good employer/manager will see these questions as refreshing and appreciate you being very conscientious about making sure the job is right for you.

Mistake #4: When you inform you current employer of your decision to leave and they ask if they can convince you to stay, LISTEN to them and explain your reasoning. You should not use a new job offer as leverage against your employer. However, they might really be surprised by you leaving. Maybe they can offer you more money (that's nice but not always the right solution or even possible). Maybe they can adjust your hours to better suit your needs or let you work from home a few days a week. Maybe they will tell you they were actually about to win a big new contract and were considering you for a new position/role in the company. If they do convince you to stay, graciously tell the new company you've accepted a counter offer and wish them well in finding another candidate. Let them know you'll be sure to send them any referrals you can.

Maybe they can't satisfy your desire to move on. However, having a real conversation about what spurred you to look and about why you're ready to move on might help them avoid this problem with other employees. Maybe it will make life better for everyone else there. Give useful, constructive feedback that will make them a better place for your eventual replacement.

General Suggestions

  • Blog! Nothing is more critical to increasing your personal knowledge than being able to explain a complex problem in writing. This is also a great way for employers to see your style and understand that you are committed to your craft.
  • Use StackOverflow: Again, posting relevant, well-formed questions on StackOverflow or answering questions is a great way to improve your knowledge and demonstrate your skills.
  • Use your favorite framework or language's public forums. Make yourself known and help others at the same time.
  • Use Twitter or LinkedIn: Believe it or not, my last 3 contracts over the last 5 years came from contacts on Twitter. I never submitted resumes or filled out job applications. Twitter in particular helps you grow your network, keep abreast of technology trends, and learn from other people.
  • Have some small personal projects on GitHub. Maybe it's just a simple demo app. Maybe it's a fork of a major OSS project that you've submitted a PR request for. Whatever the case, demonstrating an ability to use version control and participate in the wide community will go a long way in increasing your knowledge and opportunities.
  • Share this info in your cover letter/resume: If you've made a name for yourself online, be sure to point it out to your employer. If you have a private repo that you'd like to demonstrate to them, point that out.

Suggestions for Employers

Coding Challenges

Personally, I never want to take a coding challenge again. However, I understand many companies require them and will do so when necessary. However, I'd suggest you use them sparingly.

If a candidate has a public code repo with sample projects, perhaps that's all you need to review in order to make a decision about their skills. Have they contributed to any open source projects? Are they active on forums or have a presence on StackOverflow and show a pattern of assisting others or posting revealing questions? Do they have a Twitter account that appears to be primarily tech related?

If you still need to have them perform a coding challenge, ask them if they'd prefer to take it at home. Yes, seeing someone working to a deadline or under moderate stress can be revealing. However, it can also weed out candidates that are perfectly capable of performing day-to-day but can't do so under such an unusual circumstance and stress.

If knowing how long it took to complete is a factor for you, consider having them commit the code to a repo. That way, you can see their start and end times, and all commits in between. You can see what their commit messages look like. This can be very informative.

No, don't worry about someone else completing the challenge for them or getting extensive help. I seriously would never suspect this of someone. If used in conjunction with some simple reviews of their online professional portfolio, this issue could be disregarded completely.

First Day

If your new employees are going to work in an office, make them feel welcome and comfortable on the first day. Nothing is lonelier and isolating than not knowing what to do about lunch on day one as a new hire.

If the whole team can't go to lunch together, ask for one or two people to volunteer to take the new person out for lunch - perhaps on the company dime. That way, they make some new acquaintances and feel like part of the team from the get-go.

As usual, if you have suggestions or feedback, please let me know on Twitter.