Friday, March 24, 2017

I've been coding for 4 years... here's what I've learned

I am a Test Automation consultant, I write and read code most days.  Over the past 4 years I've done many different things with code:

I've written basic Rails applications - this is how I got hired at my first job as a junior developer
I wrote web scraper scripts and used Jenkins to automate them  - At my second job - this is where I really started to get better at coding, I learned the basics of automating things.
I worked as a mid level software engineer in testing using Javascript exclusively for 6 months - I really started focusing on test automation, learned the importance of writing cleaner code.  I also realized I didn't want to become a Javascript developer.
I helped create an API web service test automation framework in Ruby - I paired with a senior Ruby developer for 6 months straight creating the framework.  The code reviews and pairing took my coding skills to a higher level.

I don't know everything but I've learned a few things along the way that I would like to share with you:

Code reviews - be mean to the code, nice to the coder - alot of people still don't know this or use it.
I had a boss who would flip me off every morning and thought it was funny, after day 210 it starts to get very annoying.  I have had about 4 developers who really knew how to do a great job at code reviews.  Code doesn't have feelings, people do.  When you are a junior level developer you are going to be getting tons of comments on your code reviews, this is a good thing as you will get better.  Developers are notorious for lacking empathy, alot of code reviews suck because of it.  My advice is to remember the humiliation and frustration when you have a *%$* reviewing your code, and to not do that to someone else when you start doing code reviews.  Also try to not take anything the developer says personally ( even if they make it personal ).

Make it run, make it right, make it fast.
I used to want to make something or write a script and I would try to plot out the perfect path to make the code awesome before ever writing a single line of code.  Instead, think about what you want to make long enough for you to be able to write a "first draft" that works, albeit it's ugly.  Get your code working and then start making it pretty and start looking at how to really improve it.  Lastly you should look at ways to improve performance before pushing your code up for review.  For me this was a very freeing concept to start writing code and not just trying to have everything perfect in my head from the start.  I think as you gain more experience you will be able to write awesome code right off the bat, I have seen very senior developers do this.  I don't think most entry level tech people will be able to for several years.

The courses you take online are not really what you do in real life.
Courses are not geared to helping you land a job in the shortest amount of time, for the most part they want you to keep paying a monthly subscription fee.  The real world trenches look very little like the clean beautiful courses you took online, which is why I recommend getting your first job as quick as possible, getting your wet and figuring out what it actually means to be a professional in the field.  This may sound backwards, but I see far too many people who are waiting to get "good enough" coding in their parents basement's for 3+ years.  There are many jobs out their with less qualified people filling them, I think the key is your passion and willingness to learn.  If you have those you will grow your skills organically as needed, when "pain points" arise you will learn enough to get through them.  Someone with 1 year of real world experience is far more hirable and productive than a 3 year "basement coder".

Algorithms are hardly used in the real world.
I have almost never used an algorithm in my professional job, I have only ever needed to know algorithms for interviewing purposes and other mind games.  Real world coding is much more about these topics:
Knowing OOP
Writing methods that only do one thing
Creating separate classes to keep the code cleaner
Writing method names as verbs
Naming variable that make sense - tip: name it what the method is returning back, also make sure to name it singular or plural depending on what is being returned.
Reading code - this is the hardest thing that is almost never taught.  It's hard to read other people's code, but that is 80% of your job.  A good IDE helps.
Debugging - senior devs are amazing at this

NOTE:  This has been my experience with web development and test automation, I think the more senior level a developer becomes that changes some.

Refactor organically - slowly as you go.
The last senior developer that I wrote the API automation framework with taught me this.  Become aware of pain points in your code.  When you are writing your code and start getting annoyed or frustrated with it, ask yourself why and how can you remove that pain point?

Simple example:  Whenever you find yourself writing the same line fo code more than once - make a method.  When you have to change your code and it takes forever or is confusing, figure out how you can make it easier.  Don't be afraid to make another class to clean something up or break methods down further.

No one is truly TDD - bet yes, have tests - unit tests are amazing.
I hate writing unit tests and really don't like the whole TDD thing ( yes I know it is important ).  I also realize that one reason Rubyists are so caught up with TDD is because Ruby is an interpreted language, and doesn't show compile errors.  I have not worked with a single developer in real life ( not at conferences ) who actually wrote tests first.  What I did see in real life was developers who wrote tests and checked their unit test coverage before pushing their code up for review.

From the QA side of things, whenever I found a bug, a good developer would instantly write a unit test ( where applicable ) to cover that "missed test".  I will say from the QA / Test Automation side of things their is nothing better than seeing a ton of unit tests.  Why?  Unit tests are super fast and give a high level of confidence that the web app has been tested.  Also unit tests are awesome to run every time you pull down a new feature branch from a developer. Nothing beats unit tests  for regression testing.

Lastly unit tests will make QAs happier everywhere :-)  So the moral of the story is yes, please write unit tests, whether or not you write them first, make sure you have some written.

In a nutshell how to write better code - think of others.
You could spend your entire life on just this subject alone, but since you have a real job and must write code now what do you do?

Writing cleaner / better code really comes down to one thing:

Thinking of others.

Someone is going to have to change your code in the future, how hard or easy is it going to be?

Keeping that thought in your mind while you are writing code will help you the most.  When you are faced with the decision to write some code that will be easy to implement but hard to maintain, don't do it.  You can write code as a first "rough draft" but you should never push the code up for review knowing it will be hard to maintain.  Always take the approach that will be easier to maintain in the long run, even if it's harder for you to implement now.

Being okay with abstraction and not understanding how everything works
I used to freak out when I would be faced with a new code base or product if I didn't understand exactly how everything worked.  The truth is sometimes you are given an object and you need to take it for what it is an object and figure out what you can do with it.  Being comfortable with not understanding something is hard, I have gotten better with getting thrown into a new project or team and "rolling with the punches" until I figure out the lay of the land.

As a junior developer you need a really nice senior developer to take you under their wing.
You don't know what you don't know.  I am a very driven person and always try to improve my skills, whether it be writing code, testing, pen testing, or data science ( my latest passion ).  Finding a mentor will make you get better at a rate impossible on your own.  I have worked with lots of crappy developers and testers, don't be one of those.  You absolutely need a mentor, I can't tell you exactly how to get one, but you should always be on the lookout.  Always be the best student and do the work required to grow.  With my new endeavor ( Data Science ) I have several people who I can reach out to and ask questions whenever needed.  Find someone who will be that for you.  Pairing with the last senior developer for 6 months straight helped me grow more than I thought possible and gave me the confidence to learn my first compiled language C#.

All in all learning how to code is one of the most useful skills you can learn on the planet.  You don't ever have to be a full blown developer, but learn how to write loops, variables, how to navigate / read code, make methods and classes.  You will know how to code enough to get your feet wet in the tech field :-)  You can do this peeps!

Saturday, March 18, 2017

Becoming a Data Scientist - Part 2

Wow, thanks for the out pouring of advice and help.  A special thank you to Ryan Herr who is a Data Scientist!  Follow him on Twitter at @rrherr, I really appreciate the help!!!  Whenever you are moving into a new field, one of the fastest ways to achieve your goal is to find a mentor.  I know several people from work and online who are currently Data Scientists or have been in the past.  Find people online who can be a mentor to you or who you can follow.  Here are some basic things I am doing and recommend so far:

Listen to podcasts on the way to work:  

My commute is 25 minutes each way so I should be able to get through all or most of these podcasts in a month without too much effort.


I have started Data Quest and highly recommend it, it's like an online Data Science boot camp.  One thing I would like to note.  I used to be supportive of coding bootcamps back in 2012 - 2014, I am no longer supportive of coding bootcamps.  The reason being there is a glut of  "junior developers" on the market because of all the coding bootcamps who constantly "churn" them out.  In any new field which is in constant change, there is a huge opportunity for people who are less qualified to break into the field.  This is what it was like from 2012 - 2014 with coding bootcamps, if  you went to a bootcamp you could easily land a job afterwards.  That is not the case anymore, there are literally hundreds of people all applying for the same junior dev job. Most with virtually all have the same story: "I attended a coding bootcamp".  This is not a good way to stand out from the crowd anymore, in fact it almost makes you "unremarkable".

The reason I am doing DataQuest is that the data science field is still very new, and there are no clear paths on how to get hired as a Data Scientist.  Basically in my mind the data science field feels very much like trying to get a junior dev job back in 2011 - 2012.  It's hard because there is no clear path, but it's also very freeing because no one can tell who is truly "qualified" or not.  This is why I am trying DataQuest, I feel like they have a pretty good path ( so far ) that gently introduces you to data science topics.  I think 5 years from now there will be 100 data science bootcamps and everyone will be telling you to attend!

I have always thought and have done the following:

"Don't do what everyone else is doing.  If everyone is doing something then do the opposite"

Also I look at trends and which jobs are getting outsourced or are easier to outsource.  I also know that the reason brain surgeons make so much money is because they are hard to replace.  Not many people can do what a brain surgeon does, brain surgery is a real skill.  The tech field is the same way, the more people who have a certain skill the lower the income, and the easier to outsource the job.  I also believe in doing something that I am passionate about and enjoy doing, it's not only about which job makes the most money.  You need to enjoy what you are doing, this is the reason I am not interested in becoming a Javascript developer, I simply do not enjoy using Javascript.  I was a mid level software engineer in testing for 6 months and realized it wasn't for me.

The whole key it to learn the basics of programming, once you do there are so many different opportunities for jobs out there!  Spend at least an hour every day learning something new in the tech field, for me it is data science.  Get moving peeps, you can do this!!! :-)

Wednesday, March 15, 2017

Watch me become a Data Scientist!

You may or may not remember me, I am that guy who used to do this for 8 years:

My "secret technique" was shoeing large angry horses all day, putting my kids to sleep, then spending time with my wife, and finally from 10pm - 1am ( or till I fell asleep on the couch ) learning how to code.  I did this for 9 months, 2 days straight without missing a day.  I am a very driven person and believe in pushing myself to new levels, I also get bored very easily and love to learn new things.  One of my favorite sayings is: "You can sleep when you're dead" :-)

I had thousands of people follow me on my journey of learning to code and eventually landing a junior developer role.  After getting hired I was inundated with hundreds of emails asking how a "dumb Blacksmith / Farrier" learned how to code, so I wrote a book.  After a few years in the tech field I started coaching people how to land jobs. I soon realized that coaching was way too time intensive, and I could never keep up with all the coaching requests.  I also realized that the reason people weren't getting hired had very little to do with their technically ability, and way more to do with their ability to network and market themselves.  So I created an online course teaching people how to get hired super fast.

Why am I telling you this???   Bragging? 


I am embarking on another equally exciting and challenging journey, and I have decided to let anyone who would like to follow along with me on this journey.  In August 2013 I thought I wanted to be a senior Rails developer in 5 years, that is no longer my goal.  I am currently a Test Automation and QA consultant for a very well known company who shall be nameless.  My journey has been successful, but my journey is not over.  I thought I wanted to be a "Ethical Hacker" so I got a mentor, and learned as much as I could for 4 months.  I decided that wasn't the path for me.  This time around I thought I would let you watch me struggle and learn a new field, one that is not very well charted at this point in the tech industry.  I am going to become a Data Scientist.

I don't know all the answers about how I am going to make this happen, but I do know that success for me will be landing a Data Science job.  I was going to wait for a while until I knew a lot more about the field. Instead I decided to let you in on the "ground floor".  I have been doing my homework, studying the industry for the past month in the evenings after work, and have come up with a basic plan.  I will tell you more about my plan as time goes along.  One of the biggest issues that people face is not starting with the end in mind.  I have a very clear target: Data Scientist position.  Having "analyis paralysis" is another common problem, too many options so they don't pick any.  Others find themselves with too many choices and resources!!! So they keep bouncing around and switching material constantly.
If something is not working for you, then by all means stop using it and try something else.  If however you are constantly chasing the new shiny thing, then you will never accomplish your goal of landing a job.  Make no mistake, I do not live in my parents basement, I live in the real world with real world bills.  The best way to see if you are "good enough", is to go out and try to land a job in your chosen field.  Becoming a professional in the industry is tough, being a "Monday morning quarterback" is not hard.  Waiting until you are perfect is a waste of time, and something that will never happen in the tech industry as it changes too quickly.  I say jump in the game, get your feet wet, that is the best way to learn and push yourself to new levels.

If you would have told me that I would be a highly paid consultant 3 years 8 months ago I would have laughed at you.  I have worked at 4 companies in 4 years, I have seen some awful situations. I have experienced good management and horrible management.  I have seen first hand the problems of "technical debt", I don't need to read about it or take a test, I have lived it. I have had to learn entire new frameworks of code and start contributing to them in a matter of weeks.  The only thing that is constant about tech is that it will always change, and that in order to stay ahead you will have to always be learning!  No hand holding here, this is the big leagues, you will have to figure it out fast or get laid off ( true story ).

So here I am again, ready to crawl and fight for every shred of knowledge about Data Science. It's scary too when you say things like this in public.  People send you mean emails, call you stupid just because you set big goals.  I don't care, when people tell me I can't do something it just gives me more fuel to my fire!  This blog has always been about helping people, and making it easier for others to navigate the crazy tech field.  I won't blog everyday, but I will share with you anything and everything I find out along the way.  I hope you will follow along and watch me acheive my goal!!!

You can do this, never let anyone say that you can't!