From Med Tech to Software Engineer

…or my story of how pettiness, jealousy, and poor luck very nearly got me to quit the path but it all worked out.

❗This is going to be a super long post, sorry not sorry. ❗

In 2010 I was working at Mayo Clinic in Rochester, Minnesota as a Clinical Laboratory Scientist in the Cytogenetics lab and had been working there since 2007 and hated my job.  I disliked how I was reduced to productivity numbers, I disliked being told in my performance review that I was too bossy and intimidating, and I disliked doing the same thing every single day knowing that I would be doing the same thing every single day until I retired in 2050.  I felt trapped and I was angry that I worked so hard to get the science degree I got just to babysit robots all day, every day.  My boyfriend, soon to be husband, was and still is a software developer, so he encouraged me to try programming.  I had an Android phone, so he suggested I make a simple phone app.

I had never felt so dumb before in my life.

Let me back up a little bit and let you all know where I was coming from.  I was the star science fair student, winning 3rd place at the county science fair in kindergarten and winning 1st place every year from grades 1-4.  In 5th grade I was asked not to participate because participation by other kids was down because I just kept winning.  I loved science and I knew from a very early age that I wanted to study science.

Fast forward to college and I was a Microbiology major at Michigan State University when my friend, two years ahead of me, graduated with the same major and was insanely accomplished (she had 4 publications to her name as an undergrad!) who got a job washing lab equipment for $12 per hour.  I realized that my options on my current path were:

  1. Go to graduate school
  2. Go to medical school
  3. Make $12 per hour washing dishes or
  4. Find a better, more lucrative major.

I found the Medical Technology department (now known as Biomedical Laboratory Diagnostics) and it was the perfect fit for me.  Clinical science paid much better than research did and people didn’t have a difficult time finding jobs – a huge win in 2007 when I graduated! 🎉

During my time at Michigan State, I took several electives and one that I was always really interested in was computer science.  I walked into the Intro to Programming I, CSE 231, and the first day’s rant was how 2/3 of the class was absolutely going to fail this class.  It was also announced that while the title of the class said Intro to Programming, you already had to know programming in order to pass the class.  I dropped that class immediately!  I didn’t want my GPA to suffer just because of an elective, just in case I did change my mind and decide to go to grad or medical school.  It also gave me the impression that programming was hard, only certain people were capable of doing so, and that if you didn’t start learning it as a young child (like me with my science fairs…) then you were not the sort of person who should be programming.

Fast forwarding back to 2010, I got a book about Android programming and like nearly all programming books it said in the introduction that you needed some programming experience to get through the book.  I tried my best to get through the first project, but the tools were overwhelming and not up to date with what was shown and discussed in the book, leaving me feeling lost and confused.  It seemed that my preconceptions about programming, especially that I just wasn’t capable, was being proven to be true.

Fast forwarding again to 2013…now I was working at Clinical Pathology Labs (CPL) in Austin, Texas and I still didn’t like my job.  I was just about ready to get back to work after having a baby and I dreaded the idea of going back.  I hated my job.  I didn’t feel that I was valued, I felt that I was still reduced to productivity numbers,  and I felt that I was on a treadmill – running as fast as I could but going nowhere.  There was no future for me there, as promotions were unlikely and I was too specialized in my work experience to get another job in town.  I had been frustrated for years at CPL due to budget issues not allowing us to expand testing and increase productivity and I realized that it was never going to happen.  I had considered being a stay-at-home mom, and was privileged enough to be able to give that a go for seven months, but ultimately I didn’t like being a stay-at-home mom.

I tried programming again when I went on Amazon and found Hello World!: Computer Programming for Kids and yeah, it absolutely is a book for middle schoolers and yes, I was 30 years old.  It was the first resource I had found that was actually for beginner programmers and not just for people who already know how to code.  Finally things made sense.  After I finished that book I felt empowered, so I tried a free class from Harvard called CS50: Introduction to Computer Science that is a self-paced, free class available online.

I decided that I wanted to try to switch careers.  I was still working full-time and my son was seven months old.  In 2014 the programming options  in Austin were of three types: University, bootcamp, and self teaching.

I didn’t think I had the discipline or foresight needed to teach myself (even though all of these avenues had a large degree of self-teaching in them) and I didn’t have the time or family flexibility to dedicate 70+ hours per week that bootcamps in Austin were requiring of their students.  I approached University of Texas at Austin to see what their transfer or post-baccalaureate options were and was told (again, in 2014) that UT had too many students already and didn’t accept post-bacc transfers.  I saw on reddit that there was another option, an online post-bacc that I could complete in one to four years and so I applied for the Oregon State University Post-Bacc BS in Computer Science. 

The program consisted of C++ for the first two intro to programming courses followed by discrete math and algorithms.  My husband said it looked like a solid program, and because it was a post-bacc, you could get a full BS in Computer Science without retaking English or philosophy classes.  I loved it.  I found it frustrating at times, as I’ve learned all programming is frustrating at times, but when I was able to solve a problem I felt on top of the world.  After a year of classes, I decided to quit my job and dedicate more time to school.  I had some bad times, like when I was late finishing a project and had to take my laptop with me when my son went to the emergency room.  I had more than one break-down where I didn’t think I could do this, I didn’t think I was capable.  I had a lot of self-hate and hateful comments to myself, which I regret and wish I hadn’t done because it wasted so much time and energy.  I had a lot of projects in the program that involved working in groups, and working in groups across time zones is always tricky.  But I got through and finished in 2.75 years with a 3.4 GPA.

Then there was the job problem.

Austin, I had seen, is a hot tech market.  What doesn’t get said is that the tech market is hot for senior developers and somewhat for mid-level.  Austin is a terrible tech market for inexperienced newbies…you have UT Austin pumping out a ton of grads, people from all over the world flocking to Austin, and a habit of Austin hiring managers wanting senior developer experience for junior developer salary.   It took 7 months for me to get my first job after graduating.  I actually worked as a freelance WordPress developer for two years and had a short internship (4 months) at a local tech company and it still took 7 months to find a job.  To be fair, I was picky about what job I would take.  I wasn’t interested in being on-call all the time, I wasn’t interested in making $35k a year (way less than I made as a Med Tech, then I was averaging $55k a year) and I wasn’t interested in working with a bunch of 22 year old bros who played ping pong and drank heavily while at work.  There’s nothing wrong with an office where young men play ping pong and drink!!  However, I am not a good culture fit for that and wouldn’t enjoy working there, which is why I decided to reject offices like that.

In order to get a software developer job, I did the following things:

  • Went to local programming Meetups
    • Both for women and for mixed groups
    • Later became an organizer for Women Who Code
  • Got a BS in Computer Science
    • Online degree, not a local well known university
  • Made several large projects on my own
    • Ruby on Rails, Elixir, and PHP projects
  • Learned over a dozen languages/frameworks including:
    • Ruby on Rails
    • Elixir
    • Swift
    • Obj-C
    • Python
    • Java
    • Clojure
    • Javascript
    • React
    • C++
    • C
    • Perl
  • Attended Hackathon
    • Completed an iOS app
  • Gave talks
  • Went to conferences
    • Local and national conferences
    • Was invited to GraphConnect
      • Was invited to the Neo4j planning/future talks
  • Internship
    • 4 months at a local small company
  • Freelance
    • 2 years of freelancing

And then I got a full-time job offer and I can say that I really enjoy my job.  It combines my previous experience in the clinical lab and software and my polyglot programming experience is a huge asset.  I actually got hired as a senior specialist because of my extensive clinical background and the ability to pivot both in work and in my life.

The biggest issue I had wasn’t the programming, it was my pride and ego.  I didn’t like feeling vulnerable to being bad at something and I really feel that it was something that held me back both while learning and while interviewing.  As soon as I got good at being uncomfortable I was able to really able to move on and be confident enough to land a job.  If you aren’t confident in your abilities then you’ll probably fail to make a hiring manager confident in your abilities.

I know a lot of people talk about going to a code intensive and get a job after 3 months of learning to code.  That’s fantastic for them, but I would wager that it isn’t the norm.  I want to show people that even if it takes you 3 years, like it did for me, it’s OK.  I know that it hurts sometimes to read stories about people who get to the finish line much sooner than you, especially when you’re struggling.  But here’s the deal: you can’t let the pettiness, jealousy, or pride get you down, because it will destroy you.  Let the journey happen and you’ll be in a much better place as a result of it.

I’m glad I took the long route.

 

Photo from Tim Wright

Ruby’s Method Lookup

In many programming languages you are able to lookup methods without much trouble – just start at the receiver and work up the chain until you find the method you want.  However, in Ruby, you are able to mix in modules and singleton classes, so it gets weird fast.

There are just a few steps on how Ruby looks up methods:

  1.  Look within singleton class
    • A singleton method is a method that is defined on a instance vs. to a class where the method would be available on all instances
  2.  Look within modules that extend singleton classes
    • If you can’t find the method on the singleton class, look at modules that extend the singleton class
    • If there are multiple extend modules, the later modules are more important and take precedence
  3.  Look within methods prepended to the method and methods defined on a class
  4.  Look within modules that were mixed in when class was defined
  5.  Look up the ancestor chain
  6.  Start again checking method_missing

Chromebook OpenVPN

I recently got a new job and had the pleasure/torture of being assigned a Chromebook and needing to get it onto the VPN. This is easy on a Mac, which everybody else has, but since the ChromeOS is so lightweight, it was more challenging. I eventually got it to work though, so here are my directions!

If you don’t already, you’ll need some text editor (not Google Docs) and I had good luck with Caret and you’ll need some sort of sftp system and a shell.  I also recommend using developer mode for the Chromebook, as it makes for a lot less hassle long term.  You can also dual boot into linux, but I don’t do that as ChromeOS in developer mode has been enough for me to be pretty happy!

Network

First, have a read on Errietta’s blog and get an idea on how this will work.  I tried her directions and they weren’t entirely sufficient, but I got 90% there.
First go into your OpenVPN directory and build a key:
./build-key client1my

which will build a key and a certificate (.key and .crt) but they will be generated in the directory that the file vars specifies. I had to run:

openssl pkcs12 -export -in client1.crt -inkey client1.key -certfile ca.crt -name MyClient -out client.p12

Go into your openvpn/ccd directory and copy the most recent file . Don’t forget to increment both IPs in the file by 1 (so you don’t have conflicts later on!)

You should now have a client.p12 file.  Share this with the Chromebook in Google Docs.

 

On the Chromebook

Navigate to chrome://settings/certificates (in the browser) and in the Authorities tab, click ‘Import’ and select the ca.crt file (in the ‘shared with you’ section of Google Docs!)  You will be asked if you want to trust the ca, click on ‘trust this certificate for identifying websites’ and leave the rest blank.

Now navigate to chrome://settings/certificates and click on “your certificates” and then “import and bind to device” (NOTE: NOT JUST IMPORT, IT MUST BE IMPORT AND BIND TO DEVICE) and select the .p12 file from earlier.  You should see your (hardware-backed) by the certificate name.

ONC File

First, make your .onc file, as can be seen here: https://github.com/syedaali/configs/blob/master/openvpn-sample.onc and you will need to upload it.  In a browser tab, open chrome://net-internals and along the left side of the page, click on “ChromeOS” then click on the “choose file” button in the line “Import ONC File”

DO NOT PANIC IF NOTHING HAPPENS!  (I panicked and it was unnecessary!)

After a few short moments, the name you gave your network name should appear in the OpenVPN/L2TP screen (click on the wifi icon near your profile icon in the lower right corner of the Chromebook screen, click on VPN, and the file with your name on it should appear there!)

Fill in your password and leave OTC and group name blank.

 

Congrats, you’re all done!

How To Find Freelance Clients

First, I’m going to irritate you:

I was at an interview yesterday and my freelance business came up, since it’s the only programming work experience I have.  The developers interviewing me seemed really intrigued and a little confused on how I find freelance clients.  I’m not going to lie, when I first started freelancing in May 2015, I was looking around and couldn’t find a client in sight.  Now, in September 2016, I turn work down all the time because I’m just too busy with other clients.  I was ALWAYS irritated when reading blogs when the author bragged about turning down work…and here I am telling you just that.  There are a few things that I did that really changed my business for the better and I’m going to try to communicate that to you.  Some of it is magic/luck/#blessed, but I really don’t think that’s the only contributing factor.

Networking

I know, you have been told to get out there and network.  Usually it’s left just at that – go talk to people.  Let me fill you in on a mistake I made.

DO NOT GO NETWORKING WITH PEOPLE LIKE YOU

This was the single biggest mistake I made when trying to find clients.  I would go to https://www.meetup.com/ and look for tech meetups to go to.  DUMMY – tech people can make their own websites.  They don’t need you and they definitely won’t pay you well for something they could do just as easily.  No, instead I want you to go put on your big girl pants, grab a stack of business cards and go to a small business meetup.  Go to the chamber of commerce.  Go to coworking meetups.  Go to the farmer’s market and chat people up.  That’s where you’ll find your first clients.

I know small business meetups sound scary.  You’re a developer, not a small business person.  Actually, you can be both.  As a freelancer, you aren’t quite a small business, but you can talk their talk and understand their needs.  Remember, you are not working as a developer.  You are solving problems for people.  You just happen to use code to solve those problems.

Cold Calling/Emailing

One of my first clients was a local shop.  I was browsing their website and noticed all their image links were broken.  I knew exactly what was wrong, so I sent a quick email to the shop owner telling them what was wrong and how they could fix it.  The shop owner said they didn’t know what the hell I was talking about, but if I came into the shop with my laptop they would pay me to fix it.  I got a ton of business from that owner, because every time one of his small business friends complained about their website, he would tell them to contact me.

Cold Emailing (let’s be honest, you’re much more likely to email than to call) isn’t going to have as high of a success rate as meeting people face to face, but it works often enough that it’s worth trying.  To be clear, you need to address a problem, not say things that are asshole-y or smug.  Say the links are broken, not that a 12 year old could make a better site.  Say the site is not responsive (more on this in a bit) don’t say that the site is complete garbage.  Somebody, and that somebody is likely the owner, spent a lot of time trying to get a website up.  That’s what they heard businesses need.  Let them know, respectfully, that you can make a better site for them.  Again, you are solving a problem.

Freelance Job Boards

90% of them are crap.  Upwork, Freelancer, whatever.  They are crap.  Freelancers are racing to go be the cheapest option because they believe (and a lot of clients on those boards back up this belief) that you can compete on price alone.  That’s nonsense.  If you want, you can bid on a few projects to 1: discover that it’s a race to the bottom and 2: find out I’m right about it being mostly crap.  If you have no portfolio, then go ahead.  Honestly, making a site for you Aunt Gertrude for free will be a better experience, but go ahead and try it out.

There are some freelance job boards, however, that are not total garbage.  In Austin we have Austin Freelance Gigs, which has a lot of great jobs that pop up at all hours of the day and night.  People can tag you in job postings so you see it (again, knowing people is key to freelancing!) or you can just set aside some time to check the page.  You do have to practice some diligence to make sure you aren’t spending all your time on Facebook, but it’s a nice way to find local jobs.

Technical Jargon

This was something that took me WAY too long to figure out.  The people you are helping are not tech wizards.  Many of them will tell you straight up that they are not tech savvy at all.  Knowing that they are not tech savvy, don’t try to impress people by using jargon and concepts they have never heard nor cared about.  Treat them with respect.  If you notice their site isn’t responsive, tell them that it isn’t mobile phone friendly.  Tell them that it affects search results.  Tell them how many people use their phones for checking on websites.  Those are the problems they care about – they do not care about which framework you’ll use or what library you’ll use.  When looking for jobs, remember that Jane Businesswoman isn’t going to ask for a React JS frontend with a Ruby on Rails backend.  She’s going to ask for a site that runs on a single page and can be done quickly.  You aren’t selling Ruby on Rails, WordPress, or any tech stack.  YOU ARE SOLVING A PROBLEM!

Now What?

I would love to hear your questions or other comments about looking for clients.  There is so much work out there, you just have to be found.  Leave a comment!

Site Redesign

After some trouble with hosting issues, the website is back up!

I’ve been keeping busy with freelance projects, primarily fixing sites. In an interview recently, I was asked why I like programming. I responded with “I don’t always like programming!” and it’s true!! When I’m deep in the middle of trying to get a site to show the stupid preview image and there are 48 plugins that aren’t necessarily tested to work with the new WordPress update…I don’t like programming then.

But when I get the site working and running beautifully, I really love programming.