Saturday, April 15, 2017

Freelancing for the gainfully employed

I've been professionally employed for a very long time and I was self-employed before then. Life has changed significantly for me, having come to the US from the small college town of Roorkee and my hometown of Jamshedpur.

Over the past few years, I've been knee deep in technology at Google and now recently at LinkedIn. One of the things that I've missed in both these jobs is the freedom of execution that's inherently present when you pick up work of your own volition. 

There's a lot to be said about companies and the infrastructure they provide and there's a lot more to be said about the problems they abstract away. When working for a large firm, you just don't have to deal with the nitty gritty and some skills go to rust. But every single time I've had the opportunity to pick up a project or a hobby outside of work, I've been amazed at the rapid pace of change out in the marketplace: new frameworks, new technologies and new systems keep coming up and dying out. Systems inside companies are much slower to evolve.

So, to just get a quick pulse on the market, I've realized that there's really nothing better than finishing off a quick side project and grounding myself in the current state of the world. When looking at the freelancing marketplace, there were really 3 options of interest: (too competitive, mixed bag of projects, lowest price wins), Upwork (good mix of jobs at various skill levels, top of the market projects are thin though) and Toptal (top of market, top pricing, pickier customers). 

Amongst the 3 options, Toptal seems to suit my needs beautifully. They have a Software Programmers Group and Customers come there expecting to get great work and are willing to pay top dollar for it. That's exactly what I'm looking for. I'm going to be giving Toptal a try over the next few weeks and I'll see how it goes. Wish me luck!

Excellent Book on Advanced Data Structures and Algorithms

This book draft by a competitive programmer has an excellent overview of advanced algorithms and data structures. It's dense and packed with information and covers many tips and techniques not found in any other "standard" algorithms text. 

If you're looking to learn Competitive Programming and solve some of the more advanced challenges, go through it:

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.