career

How to become a better programmer/developer?

developer

From time to time I receive emails with questions “How to become better/awesome developer?”, “Should I go to college?”, “what’s the secret formula to become ultimate programmer?”. Instead of answering the same questions over, and over again – providing only partial response each time – I decided to write this blog post.

Should I go to college?

College lecture

It’s a very hard question. Especially from perspective of person who went to 3 Universities (and graduated from all of them). Thus, instead of telling you whether you should or should not go to College, I will tell you what are the benefits of going to College.

First, and foremost – the opportunity to connect with other people. Better the school is – better connections you can make. This is the real value of going to Harvard or Stanford instead of Community College. Not outstanding professors who owns secret formula that they are sharing only with their students. Of course professors at top Universities are usually better than at non-top Universities, but they do not have recipe to teach you something without your own initiative. Did you know that Stanford, and MIT publish some of their classes online, for FREE? Why you do not just study these classes instead going to college? You can, but this is like watching the moon landing from home instead of being in the space craft. This is also the reason why top schools accept only ~2% of candidates. They want to have only the smartest people to hangout together, and then have successful careers. This makes school prestigious.

The second benefit is being forced to learn things that have steep learning curve, are not very fun at the beginning, but are definitely worth to know while being developer. Most of them are actually very exciting when you connect all pieces together.

Information, knowledge, wisdom

Check out my other blog post: 10 things you should learn at University.

When you will have opportunity to choose classes to attend – first choose professors, then subjects. From my experience – when I wasn’t interested in some topic, but professor was good – I liked the class, and I learned a lot. On the other hand – when I was very interested in some topic, but professor wasn’t great – I always regretted, because I probably could have learnt more by myself.

Before making your decision, get familiar with opinion of people who recommend you to go to College (e.g., Joel Spolsky), or with those who definitely tells you to do not (e.g., DHH). You should also take into consideration path of those who went to College, and drop (e.g., Bill Gates, Steve Jobs, Mark Zuckerberg). Be aware that educational system has its issues that are amazingly explained by Sir Ken Robinson in the most watched TED talk ever Do schools kill creativity?, and Peter Thiel in one of interviews. Remember that university education is not life insurance policy. It may work exactly opposite.

I do not remember who said that, but I agree:

The best programmers learnt Computer Science at School, and programming by themselves.

What language should I learn?

Programming Languages

Most of experienced programmers will tell you: “whichever is your favorite, because you can do cool stuff in C#, but also in Ada, e.g., by writing Software for Boeing 787”. And they are right! But I feel sorry for those beginners who will try to start with Ada, because it is very likely that at the time when they will be getting their first program to compile, those who had chosen C# would already have full CRUD application with Database deployed on Azure.

My answer for this question is: learn C# and JavaScript.

Why C#? “C# is a better Java”, and those two (C# and Java) are currently the most popular compiled programming languages. Thus, there are a lot of code samples, tutorials, and community support.

Why JavaScript? Because it is the most popular programming language that allows you to write programs for the most popular platform: web browser.

Extra credit: learn also C/C++ to learn pointers, and how memory allocation works. I would even recommend you to try to write some assembly: to understand how variables are stored in the processor registers, and memory. Then spend 7 weeks with this book: Seven languages in seven weeks. Hint: after you learn first programming language, learning each next will be getting easier. There is also a great, GREAT book that will help you to understand how computers work: The Elements of Computing Systems.

You may hear from more experienced programmers that you shouldn’t try just learn another language, but to build something. Unfortunately, the difference between you and them is usually number of the languages you both know. You: 1 or 2, them: more than 5. Because of that, they are able to pick up language basics in one night, and start building something right a way. They already know how to use common programming constructs – such as loops, functions, classes – and how to use them efficiently. For you: it would be much harder.

It’s good to be proficient in one language, and know how to use a few other. I think it was Albert Einstein who said:

Know everything about something, and something about everything.

How to get a job when I do not have any industry experience?

first interview

Create something. Whatever. Really! That’s the most popular advice from experienced programmers. While it’s true, the problem is that it is much easier to say and understand, when you already have done that. For somebody who is really entering the market for the first time – it is not that obvious. So, here, I will tell you what to do: Create a website that will allow you to browse, add, edit and delete books. Then add possibility to login, and roles for admins (who can do everything) and standard users (who can only browse books). Once you have this, create a mobile app that will allow you to browse these books like the website, and later on, also edit/delete when you are logged in as admin. You can get books from your website by creating API that will return data in JSON format.

What technology to use? You can do it in ASP.NET MVC using MSSQL Database (with Entity Framework). You can also use Node.js with Express Framework, and MongoDB database. On top of that you can use some SPA Framework like AngularJS, ReactJS, or Aurelia, to make your app more cool. For mobile app – Windows Phone is the easiest for beginner. You can also try iOS or Android if you want to. The best move would be of course to implement it for all 3 platforms. You can create native apps in C#, Objective-C/Swift, and Java, or you can use Xamarin (C#) or Apache Cordova (HTML/CSS/JavaScript).

BTW: You can learn all technologies mentioned above at Pluralsight. I really recommend you to get an account there. You can check popular courses list as a tip what it currently hot and worth to learn.

When your app is ready, publish it on github, and deploy to Azure or AWS, or Google Cloud, or to all of these platforms. Use FREE trials if you do not want to pay, or even better – figure out how to do not spend too much money when using Cloud.

Are you done? I hope you didn’t do it exactly how I said, or you did multiple versions of slightly different applications using different tools. Great! Now, you can show it to your future employer, and tell him that you are already capable to deliver software from your first day at work. You can put it in your resume, in ‘projects’ section, and describe it: “I created a website for book collection management with user authentication, and authorization. Additionally I created companion mobile apps for 3 most popular mobile platforms (iOS, Android and Windows Phone) that communicates with database through RESTful API”. If you will have thing, when you graduate from Collage, you will already beat 95% of other students, and – I am assuring you – this will give you your first job for 99%. From then – you will figure things out!

If you want to work for some of the top, tech companies like Microsoft, Google, or Facebook, I recommend you to learn a lot about algorithms. Take as many algorithms classes as possible at school, read books (1, 2, 3), and practice, practice, practice. These companies don’t care whether you can program in Java, even if you are applying for Java Programmer position. What they care about is whether you are smart, and can get things done. I really recommend to check out Sean Lee’s talk How to Get a Job at the Big 4 – Amazon, Facebook, Google & Microsoft – it’s not only about getting job at particular companies, but it’s also a great career advice.

How can I improve my coding skills?

coding

Write code. A lot! Really. Write code everyday. You can create some simple applications, like todo list, or shopping list app, or personal finances calculator. I know all of these exists, but you are going to learn by reinventing the wheel. If you want to create something more complex – go for it! Look at this women who built 180 websites in 180 days. The good way to practice programming is to compete in programming contests.

Read books to learn from more experienced programmers, and to discover what we know about programming today. If you want some reading recommendations check list of my favorite books, or all books I have read.

Check out podcast Be a better Developer in 6 months by Scott Hanselman, and article by Peter Norvig (Director of Research at Google) – Teach Yourself Programming in Ten Years.

You can also take a look at Google’s Technical Development Guide – recommendations and resources that will help you to become developer from Google.

Get Involved!

get involved

There is an amazing, free Pluralsight production by Scott Hanselman and Rob ConneryGet Involved! Check this out. Then start a blog, create twitter and github accounts, subscribe to some podcasts (e.g., Hanselminutes, .NET Rocks, This Developer’s life, StackOverflow podcast), and go to some conference for developers, local meetup, or Code Camp. Pro tip: when you want to learn something – submit proposal for local meetup, student Computer Science group, or conference about the topic that you are interested in, and would like to dive in. This will give you motivation to learn.

Remember about soft skills

soft skills

What many developers underestimate is the value of soft skills. Please read Dale Carnegie’s How to win Friends and influence people, and Chad Fowler’s The Passionate Programmer. Maybe at the very beginning of your career it doesn’t matter that much, but at some point you will notice how important is communication, and ability to interact with people.

Summary

I know you would like to be an awesome coder tomorrow, but this takes time. Be patient, work hard, and after some time you will realize that you are a good programmer. However, remember to maintain and improve your skills everyday, like athletes do with everyday training.

Good luck!

Wolf of Wall Street


My first year at Microsoft

I joined Microsoft on September 8, 2014. Today is my first year anniversary.

Changing the World with Holo Lens

How do I get the job at Microsoft

When I was in College/Grad School, I wanted to work for Microsoft, because of Scott Hanselman, Scott Guthrie, Steve Sanderson, Damian Edwards, Mads Kristensen, Anders Hejlsberg, Eric Lippert, and other great developers. However, I knew them only from their blogs, and conference talks. I didn’t know how day-to-day work at Microsoft looks like. When I was organizing dotNetConfPL 2013 I talked to Tomasz Janczuk, who worked for Microsoft for over 12 years, and he told me that “it is definitely worth it to work for Microsoft if you want to learn how to make software”. After that, I was sure, I wanted to work for Microsoft.

In 2013, recruiter from Microsoft came to my department at Kansas State University, and after collecting resumes, selected group of people for on-campus interviews. I was one of them. Two weeks later I had 30 minutes interview on campus. It was short 5 minutes introduction, and 25 minutes of coding. After a week I got an email informing me that I was recommended for the next round – on-site interview in Redmond. Two months later I flew from Manhattan, KS to Redmond, WA. Interview in Redmond was a set of 5 interviews, with 5 different people, 1 hour each. Every interviewer was asking briefly about myself, and then programming question. What was surprising for me, they asked me to write code in Visual Studio. Two weeks after the interview I got an offer, which I accepted and on September 2014 I joined the Azure Portal Team.

What have I done during my first year

I am working for the Azure Portal Framework team, which is delivering the core of the portal, and framework to build extensions on top of it. Each Extension, e.g. Websites, Virtual Machines, or Application Insights, is a gateway to underlying Azure infrastructure. Framework team is divided in a few subgroups. My group is responsible mainly for developing reusable controls that are part of the framework. I created a few controls, and I was fixing/improving some other. The most challenging one was to create a set of date/time controls. Why was it hard? Because JavaScript Date sucks, and it is not easy to deal with date/time at all.

In addition to controls, I was also working on keyboard support for the Portal, and keyboard shortcuts that I blogged about earlier this year (here and here). Now, it is possible to use the portal with keyboard only.

I also helped to improve our development experience. I proposed to add Sinon.JS to our testing tool-set, and helped to create strong-typed wrapper on top of it – TypeSinon (which was proposed by Steve Sanderson). In order to make our QUnit tests cleaner, I also proposed and integrated QUnit Parametrize plugin that works like TestCase attribute in NUnit. I did other small improvements, like helping to upgrade to TypeScript 1.5, and turning off verbose printing to the console during build – which saves a few dev-minutes everyday, and ultimately a few dev-hours or even days per year.

Lessons learned

The best thing about working at Microsoft is the opportunity to work with smart people, and learn from them. All developers working at Microsoft are this type of people who get things done. They do not like to talk too much about what they want to do, but they prefer doing it instead. I remember when once I was arguing with some people over the email that something should be than in one way, not the other. After a few e-mails one teammate told me: “If you really believe that something should be done in some way, do not argue with people, just do it”. I also noticed that the best developers do not ask you to do something for them, but send out a Code Review instead.

In my team there is no fear to try new things. Do you want to use the latest version of TypeScript, in production, one day before the release? One of my team leaders, personally, performed this upgrade. Do you want to introduce, a new tool? Usually, not a problem, but then you are responsible for it. When I wanted to add Sinon.JS, I sent an email to the entire team to ask what they think. A few folks had some doubts (not about if, but about how). We called a quick meeting, and resolved all of them. Next time, when I wanted to add QUnit Parametrize, I just sent out a Code Review and email to entire team. No problems, everybody was ok with that. The only price I have to pay is helping others with issues related to these libraries. “With great power comes great responsibility” 🙂

I also remember when I wanted to make some change and asked a few people if I can do it. Nobody was sure, and somebody said: “It’s better to ask for forgiveness than for permission” 🙂

Even if you fail, or create something not perfect, people at Microsoft do not criticize very often saying: “This sucks, that sucks”. They know these words would create an expectation to propose better solution, or even implement it, and then – in the future – be responsible for every issue related to that. Instead, they say: “what do you think about this alternative solution?”, or “let’s take a look if we can do it better”, or do not say anything.

From development perspective, the most valuable lesson I learned was to avoid planning for one, big refactoring in the future (which usually you will never have time for), but instead perform small refactorings with every commit. I had also opportunity to observe the real value of tests in the project. Many times when somebody, or myself, were performing some change that “there was no way it could impacted that functionality”, and test was failing – it saved us from probably many long hours of debugging and investigating. I could also observed when after a few weeks we noticed something wasn’t working from “some time ago”, and we didn’t know what caused it because we didn’t have tests. Every time when this happened we had to invest a lot of time to investigate and find the change that caused this (which is not easy in project where 40+ people contribute to one repository, and you have ~40 commits every day).

Culture

I have many friends who knows two things for sure:

  • eventually they will die
  • corporations are evil

I was afraid of the second. Especially after reading the stories about Microsoft on the Internet that can be summarized like that:

Microsoft org chart

The fact that there is enterprise overhead at Microsoft is true. It was nicely summarized by Eric Lippert in his blog post How many Microsoft employees does it take to change a lightbulb? However, now Microsoft is becoming a cool company again. The idea of One Microsoft is happening now. It feels like people are working towards the same goal. Last summer I participated in //oneweek hackathon where together with people from different teams across Microsoft we were hacking together, and it was great to be a hacker for a few days while being an engineer in everyday job (Hackers and Software Engineers). Recently I was at IoT meetup in Seattle, and one guy said: “Microsoft was a wonderful company in 90′, and then took a wrong direction in 2000′, but now they are switching back. There is many interesting things happening at Microsoft now, and they are becoming cool again”. Other people are starting notice this as well: link, link, link.

There is even a new, unofficial logo of the NEW Microsoft – Ninja Cat on Unicorn:

New Microsoft logo

I will say it again: there are many smart people working at Microsoft. What’s more: higher in the hierarchy somebody is – he is a smarter person. This goes from my teammates, through our team leaders, all the way to Scott Guthrie and Satya. What is important when you work for some company, is to believe in your leadership team. I have no doubts that people like Scott Guthrie, Mark Russinovich or Satya know what they are doing. Additionally, every month there is Q&A session with Satya, where every employee can ask him a question. I wish I could quote some of Satya’s answers here, because they are really valuable, and reasonable pieces of advice. You can find more about Microsoft under Satya in this article.

Let’s also talk about management at the lower level. Many people in Microsoft says “my boss”. I do not like calling my team leader like that, because I think he is more a leader than boss:

boss vs leader

I have 1 on 1 with him on every week. Usually 30 minutes, sometimes less or more, depends on the needs. During these meetings he is checking how I am doing, and how he can help me with any issues I have, and how he can enable me to utilize my full potential. He is doing the same for other 8 developers in the team, and in addition to that, he is doing as much development as others. His scrum update is not much different than the rest of us.

Another interesting thing at Microsoft is separate hierarchy for developers and program managers. As Joel Spolsky pointed out in this book – Joel on Software – there is a reason behind it. Instead of giving direct orders to developer, program manager has to convince developer that whatever he want him to implement make sense.

What next?

It has been a great year. I had opportunity to work with amazing people, on a very interesting project, and I learned a lot.

I am staying with the Azure Portal team. We have a lot of work to do. Especially, because Azure is growing exponentially. One year ago, when you clicked ‘Browse’ on the portal, there was ~10 types of services on the list. Now, 1 year later, there is over 40 items on that list. This requires from us to enable other teams to develop at very fast pace using our framework. We keep improving the programming model, APIs, performance, and usability. There is also a lot of requests from users that we constantly monitor, and make happen (150/739 are fulfilled for today). We really appreciate your feedback!

I am very excited about the future of the Azure Portal. From a developer point of view – it’s a dream place to work. We are using the latest, greatest technologies. We are doing things that exercise browsers to such an extent that we are finding bugs in them, or have to fix/patch Open Source libraries that we are using. There is also a few features, I will be working on, that I am very excited about. Stay tuned!

Additionally, in upcoming months I will be speaking at a few conferences, and on October 31 there is the third edition of dotNetConfPL – online conference for .NET developers that I co-founded together with Michal Franc and Pawel Sawicz.

I would like to say thank you for every member of my team. It’s a pleasure to work with you, and be part of Microsoft in these days. I has never been a better time to work for Microsoft!


Basecamp books: Getting Real, Rework and Remote

Getting Real: The Smarter, Faster, Easier Way to Build a Successful Web ApplicationRework (David Heinemeier Hansson and Jason Fried)Remote: Office Not Required (David Heinemeier Hansson and Jason Fried)

Recently I read 3 books written by founders of Basecamp (formerly 37 Signals): David Heinemeier Hansson (creator of Ruby on Rails framework) and Jason Fried:

Getting Real was written almost 10 years ago, and it talks about the same things as most recent Remote. So you can skip it. However Rework, and Remote are definitely worth to read. They present the new(?) approach for work, and productivity.

Rework focuses on pragmatic ways to improve your (and your company) productivity.

Remote presents how remote working can be applied in your company. All Basecamp employees are remote workers.

Of course authors present ideas that works for them, and may not necessary work for you. However, I am sure you will appreciate more than one of their advises.

This is one of my favorites quotes from Remote:

remote - quote

As a teaser you can watch Jason Fried’s Ted talk: Why work doesn’t happen at work. I also recommend David’s talk: Unlearn Your MBA (from Stanford University).

Both Rework, and Remote goes to my favorite books list.


Guest Speakers in Computer Science

I got an opportunity to participate in Guest Speakers in Computer Science program as a guest speaker.

The goal is to connect students via Skype with people working in tech to solve one of the biggest talent problems in the world today. By 2020, it is estimated that one million computer science jobs in America will go unfilled because there are not enough students graduating with the right skills.

Computer Science gap

What is amazing in Computer Science, in my opinion, is the opportunity to build things. It was about 10 years ago when I was in middle school, and I discovered that I can create a website that everybody in the World can see. Another great thing is the opportunity to solve other people’s problems.

I love my job, because it gives me different challenges every day. And it is not only about writing the code. Good Software Developer has to be also a good marketing person. He has to understand the market, and the customer needs. He has to know whether an application or feature he is working on is worth his effort, and whether this is what the customer needs.

Today, Computer Science is not a single person coding in the basement. Nowadays, it is all about the people, cooperation and team effort. I love it, because I think that a group of people can always achieve more than a single person.

Computer Science is hard. Sometimes you are spending hours debugging a nasty bug. You are getting more and more frustrated. But finally, once you solved the problem, you feel a lot of satisfaction. Especially because you did it! This is amazing in Computer Science. When you work hard, it always pays you back.

I wanted be a part of Guest Speakers in Computer Science program, because I wanted to share my experience. I know how much it means for a person who want to start a career, to hear from somebody who already did it. I have been there, and I know how much the people who I met helped me to drive my career. I wanted to pay it back somehow.

So far I gave 4 talks, and it was very fun! The most common question was: “Have you met Bill Gates?”. This is something I need to work on 🙂 There were also more practical questions like: “what programming languages should I learn?”, “how to prepare for College if I want to study Computer Science?”, or “how to choose the right things to do out of millions possibilities?”.

If you are IT professional I encourage you to join this program as well!


10 things you should learn at the University

I graduated last year, and I would like to summarize things I learnt. In the StackOverflow Podcast #36Eric Sink said: 

The best students learn Computer Science in class and programming on their own.

I remember when back in days my friends from the University were talking about their first job, and 9/10 of them were saying something like that: “During this one month Internship I learnt more than for 3 years in College”. I couldn’t say that about my job. At the beginning I thought that they probably got much better job or internship than me. It took me 3 years to understand this phenomena…and it wasn’t phenomena. They thought, they learnt a lot, because they were able to get something done using some framework that did magic in the background (like creating simple CRUD web application with database configuring everything automatically). However, there is a lot of stuff between framework and hardware. I noticed, that lot of Developers don’t care about it. Moreover, you can live without it. Like taxi driver doesn’t need to know the city, as long as he has GPS. I think it is good to know the fundamentals.

There are some courses, which can help you to learn things, about which you probably will not bother once you get a job. In the same time, they are worth to learn, will help you to understand how computers work, and in my opinion will help in your future job.

Here is my top 10 things/courses you should learn at University (which is the best time for it):

  1. Computer Architecture: to know how computer works, how they represent data (Two’s complement system, IEEE 754). There are two books good books about that: Computer Architecture: A Quantitative Approach and The Elements of Computing Systems.
  2. Compilers: sort of supplement to computer architecture. It is connector between Software and Hardware. Classic book about compilers is Compilers: Principles, Techniques, and Tools (AKA Dragon Book).
  3. Algorithms and Complexity (O notation): this is hard and challenging topic. Require a lot of practice, but pays off in the future. The bible for algorithms and computational complexity is Cormen’s book: Introduction to Algorithms.
  4. Automatas (DFA, NFA, Turing Machine, etc.): “Recognizing the strings in a language is a formal way of expressing any problem”. This is fundamental of Computer Science, as a Science, on top of which all software and hardware is built.
  5. Assembly Language: it helps to understand concurrent applications, and bugs occurring in them e.g. caused by instruction reorder.
  6. System programming: in the world of Cloud Computing and Virtual Machines, this is still useful subject that can gives you an insight into how software communicate with the hardware.
  7. Embedded devices: the Internet of Things is the future. Additionally it is fun (check Jon Gallant blog post who joined Internet of Thing team at Microsoft).
  8. Artificial Intelligence: every year devices are more intelligent (from your phone, through medical devices to Google Car). According to Bill Gates AI will explode in next 10 years. University is great place to learn AI fundamentals.
  9. Computer Networks: it is good to learn about networks, how data is flowing in the wires (packets), what is DNS, CDN, what challenges, and limitations do we have in fast and reliable data exchange. Recommended book: Computer Networks (by A. Tanenbaum).
  10. Computer Security: everyone would like to be a hacker. First, you need to know the basics, and be aware that this topic is changing every year (sha1 is being replaced by sha2, because it is not “secure enough” anymore). Because it is changing so fast, there is no universal book that is up to date. However Practical Internet and Unix Security book is still very valuable. To be up to date with security issues, I strongly recommend you to follow Troy Hunt’s blog (in my opinion: one of the best blogs in the Internet).

One can say: “Turing Machine? Would I need it for something?…Probably not.”. But again, I am talking about Computer Science, not programming. You can live without that knowledge, and do amazing things. Like mentioned taxi driver, who can take customers from place A to place B. But…what he will do, when GPS run out of battery or GPS will be wrong? What if there are two streets with the same name? Maybe GPS will indicate it, maybe not. Additionally, good taxi driver knows which way is faster, and where he will stuck in traffic on certain hours better than GPS.

Very often we do not appreciate the knowledge gained at the University, but it helps us in everyday job in the same way like swimming and running helps the boxer in his fight.

What is cool nowadays, you can learn Computer Science online for free.

At the end, it is totally up to you if you want to learn about Computer Science, or just learn how to program. I think it is good to know both. What do you think? Would you add/remove something to/from my top 10 list?