Friday, March 17, 2017

A day in the life of a Professional Software Engineer

Sometimes, it's important to gain perspective over what it takes to run a successful career in your industry of choice. Growing up and in college, I didn't know very many people doing Computer Science in industry. I managed to meet a few during my internships at Microsoft and Qualcomm where I got a taste of life in Computer Science and Engineering. These were the early days of blogging, YouTube, Facebook, Android and the iPhone. Things have moved rapidly in this industry and life today looks very different from life just a decade ago. 

Before college, I was taking some monumental decisions in my life - where do I go study? what do I study? what happens after college? How do I know I'm taking the right choice? 

I'd wished then that I knew some people who had an understanding of life as a professional software engineer. I was pleasantly surprised when Jaeho (from SJSU) approached me to give perspective to life as an experienced Software Engineer in Industry. Our discussion brought up some valuable points and the content turned out to be so useful that I felt it worthy to be shared more broadly.

Here's our discussion as it took place (edited, paraphrased and summarized):

... Introduction ... Greetings ... etc.

Q: How / When did you get started with Computers?
A: When I was 6 years old. I had a neighbor who had an old 486 machine. These were the days of floppy disks (3.5 inch and 5.25 inch) and a green screen. One of the first things I learnt was how to draw with a mouse. Then I gradually moved to programming in Logo and GWBASIC. I had fun drawing staircases and circles on the screen with commands like FD 20, RT 90 instructing a virtual turtle (move forward 20 steps, turn right 90 degrees). It was fun and very encouraging. I learnt a bunch of stuff from Computer Magazines (those days they would print some GWBASIC game programs in the magazine itself). In 4th grade, my school got a computer lab and I learnt more there. Eventually, I started learning how to program C++ in 7th grade and then moved on from there. In 11th grade, I got exposed to the USA Computing Olympiad which helped me significantly improve my skills. Then, when I reached college, it was quite easy for the first few years. Things ramped up later (by the 3rd year) but I just took the toughest courses and kept going to classes and studying. I enjoyed programming and I learnt a lot. Competitive coding taught me a lot of stuff...

Q: What were the things that you found most useful to study in college?
A: Graph Theory, Linear Algebra, Computational Geometry, Data Mining / Machine Learning, Compiler Theory, Functional Programming.

Q: If you had to go back, what courses would you have taken that you didn't?
A: Few more Math courses ☺

Q: What does your typical day look like?
A: LinkedIn has flexible timings:
I come in to work at 10 AM, Leave by about 6:30 PM - 7 PM
10:00 - 10:30 : Email
10:30 - 12:00 - Coding and Code Reviews
12:00 - 12:30 - Lunch
12:30 - 6:30 Coding and Code Reviews
On some days, there are a few meetings
eg. Monday mornings - 10:00 - 12:00
Friday evening 4PM - 4:30PM
I generally like to keep the bulk of the week clear
My morning email is usually co workers and organizational emails. Most of the day, communication happens on Slack. Meetings are held usually in conference rooms... Monday mornings are team meetings of 10 - 12 people. Smaller meetings are more ad-hoc. Sometimes we do Video Conferencing over BlueJeans. LinkedIn has a Cisco based Video Conference setup.

Q: What do you work on?
A: I work in Distributed Systems infrastructure.

Q: What are the skills required for this job? What do you need to know to be successful?
A: Typically C++, Java, Distributed Systems are the basics of what is required. In my daily work, I get to use my knowledge about the Linux kernel, TCP/IP, Operating Systems, Systems Architecture, Microprocessors and von Neumann Architecture (in practice, not just theory). It's a fun job that helps me use several of my skills. 

Q: Amongst all the things that you know, what do you like best?
A: "Mechanical Sympathy" - how to work as a friend of the machine rather than an enemy. How to understand what a machine does and why it does it and how to leverage the best out of it.  A lot of this has come out of my experience with C++ and Pointers. I've learnt a lot from getting a machine to do the things that I want quickly :)

Q: How many languages should one know? Many or a few?
A: You should definitely know the Industry standard languages:
Java, Python, C++, C, Bash. I would also strongly recommend that you take the time to learn and explore Lisp and a few functional languages. eg. Haskell, ML, Scala, F#. They teach a very different way of thinking about computers.

Thank you and it was a pleasure meeting you...

Overall, this was a an amazing experience. One hour of my life might help Jaeho take several critical decisions in his life. My underlying advice has always been the same: study hard, work hard and the results will follow. It's been a relatively straightforward life for me. I've come to the US because my skills were in great demand here. I owe my life to my learning. A lot of things in life just happen, some by luck, some by circumstance. Opportunities come and go, and one just needs to be prepared to seize the day. I'm humbled and grateful to be where I am. Hopefully, others will follow a similar path in life guided by the signposts that we leave for them. 

Wishing you the best of luck: may your life be better and more enlightened as a result of the efforts of those that came before you.