10 Sites Where You Can Get Programming Practice

Watching and reading programming tutorials are great! They give a curated view of a concept or new technology that may take hours longer to understand than going at it alone. However, much like math, programming is not a spectator sport. You need to practice in order to better understand the programming concept or technology in a real program.

There are a lot of ways one can do this, though, without having to fully set up an environment for each language or framework you want to learn.

Here are 10 sites that you can use to start learning new languages and other programming concepts.

Code Wars

Code Wars profile view.

Code Wars profile view.

This is one of my favorite sites to go to, especially when I want some practice with a new language. They have most of the common languages already supported with a few more in beta so most likely you can get some practice in here.

All of the "katas", as they call the challenges, have always been challenging for me. Plus seeing other people's solutions I'm sure to learn something new.

Hacker Rank

hacker-rank.JPG

Hacker Rank is another code challenge site, but a tad bit different. They also have competitions throughout the year where you can participate and see how you rank among other competitors. I've also seen some companies use this site as a first pass for interviewing candidates.

The nice thing about this site is that it pretty much emphasizes algorithms and data structures, which I consider two things that you could get the most out of if you practice it.

Top Coder

TopCoder compete login page.

TopCoder compete login page.

TopCoder is similar to HackerRank, but you can actually get paid for the challenges you compete in. This is a good way to see how you compare with other developers in the challenges and to challenge yourself to get better at certain types of programming, such as data structures, math, and string manipulations.

Kaggle

Kaggle is more suited for data scientists, but it's a place where you can find data to play around with. They also host their own competitions that can pay out.

You don't need to use this for data science, though. Since they offer a lot of data sets you can use them in for other applications as well. Want to create a web app with some of the data? Go for it!

Project Euler

Project Euler is probably one of the first sites with programming challenges and puzzles. This site is composed of mathematical problems that you can solve in code and the further you go the harder the math problems.

Rosalind

Very similar to Project Euler, Rosalind gives challenges in regards to problems in bioinformatics. These challenges may be considsered a bit better since they solve more real world problems than just arbitrary math problems in Project Euler.

Screeps

This is a fun one, especially if you are really interested in game programming. This site gives you the opportunity to code exercises as part of a Real Time Strategy game with JavaScript. Game programming is a totally different beast than doing web sites or any other business applications as it's a different way of thinking and experience that goes with it. This is especially great to get started with some game programming when you don't necessarily have a project of your own to work on.

CodeChef

CodeChef is similar to TopCoder where they host several competitions and you can get paid for completing them. CodeChef holds those competitions monthly so you'll always have a chance to see how you stand against other programmers. There are definitely plenty of problems to practice before going into a competition and they are all ranked from easy to hard.

CodingGame

CodinGame is fairly similar to how Code Wars works, but the challenges are a bit more of a game. They are more turn based so with each "turn" you get new input and you must give new output based off of it. Similar to Screeps above, the challenges are like mini games you help code. When you run your test cases you can see your code in action as the game is being played, so you get some instant, and visual, feedback to how your code performs.

Up For Grabs

Ok, so this isn't much of an exercise site, but I feel that it's important enough to mention in this post. Why? Working on open source projects is one of the best things you can do as a developer, and this site helps make it easy. A lot of projects have been creating an "up-for-grabs" label on GitHub to let newer contributors get into their projects a lot easier by fixing easier bugs. Doing these will help you become a regular contributor to the project which will have more real world experience than doing other algorithmic or mathematical exercises.

Why C# is Still Worth Learning Today

These days with all the programming rage is JavaScript and related web frameworks or data science with Python or R, C# isn't as popular as it used to be. Of course, that makes sense. Programming languages come and go as languages and compilers are evolving. However, I think C# is still a good language not only to learn but to master.

With the recent release of StackOverflow Trends we can see how popular tags have been on the platform. Considering how popular and influential StackOverflow is in terms of getting help, this data is worthwhile to look at.

Here's a look at the current list of popular languages according to TIOBE index (we'll talk more about this further down this post).

That's a lot to gather in one chart, so let's break it down a bit.

From this graph, C# was very much used due to the amount of questions on StackOverflow back around 2009.

Sure, it has steadily gone down in time and will probably continue to decrease. But think, all of those companies who picked up C# and .NET back when it was much bigger...they need to support those applications. Some may decide to rewrite them depending on their budget and what kind of experience their current developers have, but I'm sure C# will continue to run a lot of those applications in the future.

This reminds me of the current state of Cobol. A HackerRank post mentions an interesting statistic about Cobol:

70-80% of all business transactions worldwide are written in COBOL today

That's a lot of businesses still running Cobol! I believe it'll be the same with C#.

Every year for the past few years StackOverflow has conducted a big developer survey. What they find there can be very interesting!

Here's the most popular technologies of 2016:

https://insights.stackoverflow.com/survey/2016#technology-most-popular-technologies

https://insights.stackoverflow.com/survey/2016#technology-most-popular-technologies

Most popular doesn't always mean that developers enjoy working with it, does it? In terms of C#, it seems developers still enjoy it!

https://insights.stackoverflow.com/survey/2016#technology-most-loved-dreaded-and-wanted

https://insights.stackoverflow.com/survey/2016#technology-most-loved-dreaded-and-wanted

C# is here to stay

Developers still ejoy working with it, but what about the industry itself? All of the data presented so far was from StackOverflow which was derived from surveys, where people can lie if they want, or from their own data with tags, which just means people ask a lot of questions about it. The TIOBE index mentioned earlier gathers a lot more data. Here's their list of the top five languages:

Source: www.tiobe.com

Source: www.tiobe.com

Still impressive to be in the top five and I don't see it getting below that very much in the near future.


With all the debate about what will be next to learn to keep you on the edge in terms of development, a good solid understanding in C# is still a contender. Not bleeding edge, of course, unless you're getting alpha of the newest C# versions to try out new language features.

C# is a great languge to learn from since the tooling is great and there is no shortage of tutorials and courses for it.

Git Commands I Can't Live Without

Git has definitely become the main version control system developers use lately, and I admit, I got on that bandwagon when I got more into GitHub. I wanted to be more familiar with Git since I was doing more and more with GitHub.

I'll also admit, and I may be dating myself here, my first version control system that I used was StarTeam. Never heard of it? I don't blame you. Just look at the interface it had:

StarTeam interface

I used that for a few years until the company got rid of that and went to Team Foundation Server. Definitely a step up from StarTeam, but then I got started using Git. The more I use it the more I enjoyed using it.

However, I didn't get an appreciation for how powerful it was at first. I first started using Git when GitHub had their GitHub Desktop applications and used that for a while. I also used SourceTree on one project I was on.

While these applications are great, I still wanted to learn more about the commands these applications are running in the background. That's when I started to only use Git through the command line. From that challenge I set myself, I realized there was way more to Git than these applications may show. Below is a list of commands I've been using quite often, but feel they may not be as well known.

Stash

If you ever need to quickly put your current changes away so you can help work on something more important than your current task? Well, git stash is here to the rescue!

Just type in git stash and your changes are "stashed" away.

Stash newly tracked file

Stash newly tracked file

Now I can move on to working on something else while keeping my changes away for me to come back to.

You can have many as many stashes as you need, as well. If you're not sure of the ones you have, just do a git stash list and you'll see them all.

List of git stashes

List of git stashes

Oh, but you want a meaningful message when you stash to you have an idea what changes are in it? Git has you covered there, too! Just do a git stash save <message here> and git will save the stash with your message.

Save git stash with a message

Save git stash with a message

So we can save stashes in a couple of different ways, but what if we want to go back to a stash to continue our work? We have a couple of ways to do that, as well.

If you want to just apply the latest stash, just do a git stash apply.

Applying the latest stash

Applying the latest stash

If we want to apply a specific stash we can just do git stash apply <stash name>.

Apply stash by name

Apply stash by name

Note that, if you’re in PowerShell and try this command it won’t work. To get it to work, you’d have to put the stash name in quotes.

Diff

Sometimes, you just want to double check the changes you've done before adding and commiting. In that case git diff is there for that.

Git diff results

Git diff results

No need to go to a separate application just to see what the changes are. You can just look at them in the command line.


With all this said, though, there is still a ton more commands and uses that Git has that I probably have never even heard of. Because of that, as y'all could probably guess, I got a book for it!

 
 

I'll definitely be reviewing this after I go through it to let y'all know how it is overall. Just going through the table of contents indicates that it covers a lot of really useful commands.

What git commands can you not live without?

Why I'm Reading Research Papers

In my recent post on doing deliberate practice to become a better developer I mentioned that I was going to spend some time to read and understand some research papers. This may seem a like an odd thing to do in order to become better at my craft, but I figured a little experimentation couldn't hurt. At the worst, I'll have a few research papers read and understood. Perhaps I'll even meet one of the co-authors and have something to engage in discussion with. However, I believe I may get a bit more out of it than just that.

Understand Latest Research

Seeing what the latest research trends are, I feel, can be quite beneficial in a practical sense. For instance, there's a paper that suggests that simple testing can prevent most critical failures in software. From reading the paper and Adrian Colyer's post about it one can get a lot of insight about preventing most crashes in software. One having that insight, you can put it to good use in all of the software that you currently are developing.

See Cutting Edge Technologies

I'm sure most of y'all have seen this graph on emerging technologies.

CC BY 2.5, https://en.wikipedia.org/w/index.php?curid=11484459

Keeping up with new research articles allows me to be a part of the early adopters. Whereas now, I'm most likely split between the Early Majority and the Late Majority. Getting in early to new technologies will give multiple advantages, such as being among the first to submit pull requests if they have their code on GitHub, or generating the first set of blog posts on the subjet.

For example, Elm, a functional web language that outputs to JavaScript, was first introduced as a research paper. While I would say it is still in the late stages of the Early Adopter phase, if I was able to get on it earlier soon after this paper came out I could be considered one of the go-to people for this technology and even could help contribute to future releases of it.

Try to Understand More Math

A lot of computer science, and especially most of the research done in the field that I've seen, has a good bit of math behind it. While I took some math in my own studies of computer science, a lot of that was lost due to just not using it or keeping up with it.

While it's not necessary in day-to-day programming, it can be a bit helpful. Learning the math can help develop that extra bit of logic that will help in my daily programming, whether business logic or debugging.


With these benefits in mind, I plan on reading a paper a quarter this year and see how that goes. I'll definitely report back any benefits, or lack of any, that I believe I receive during that process.

My Deliberate Practice Plan to Become a Better Programmer

In the previous post, I reviewed the book So Good They Can't Ignore You. I wanted to take the ideas and advice from there and to create my own plan for deliberate practice as a software developer. Here's what I came up with...

Continuous learning

Being a software developer means to always be learning. Whether it's a new framework, new programming language, or a whole new programming paradigm learning something new is integral.

There are several ways to do this and I will try to incorporate all of them, though more will take more presidence and attentnion than others.

  • Use sites like Pluralsight and Udemy for on-demand tutorials and training.
    • Watch at least one course each one or two weeks, depending on the length of the course.
  • Watch at least one software presentation on YouTube or similar site.
    • Watch one at least each week. This should generate some "Top 10" posts for everyone to enjoy or, if it's really good enough, a post about a specific presentation.
  • Read at least one technical book each quarter.
  • Read and try to understand at least one journal paper on programming each quarter.

Practicing

Of course, one of the biggest and best things to do as a developer is to actually program something...anything to help put into practice what I've learned. The above methods are great for learning new things, but they have to be put to use, as well, otherwise I won't be able to retain what I've learned.

  • Have at least one personal project going at a time.
  • Blog about things learned and always have a demo project for it, if possible.
  • Get certified, if available.

Being uncomfortable

Doing deliberate practice often means being uncomfortable during the practice. This is an easy way to know if the practice is good or not. Here a couple of ways I can step outside of my comfort zone.

  • Speak at a local user group at least once each quarter.
  • Try to speak at a conference at least once this year.
  • Do more screencasts instead of regular text posts for the blog.

Keeping track

Now, none of the above doesn't mean all that much if I don't keep track and accoutable for each of these. Saying I'm going to do it doesn't mean I am going to do it.

  • Once again, blogging about each of the above items as much as possible
  • Use a time tracker such as Plan to keep a digital record and for some nice reports.

Since it's very close to the 2017 year, this is a great time to get started with this.

Do you have something you've done work very well for you but wasn't mentioned? What are your plans for having deliberate practice?

Using GIFs on Bug Reports

If you've been developing software for any length of time you've fixed a bug or two that someone has reported. Whether for a customer or a user within your organization, sometime's words of how something is fixed or how to duplicate an issue may not be enough.

Using screenshots is great to show if something is working, especially if it is something easily to show like a UI element working. However, to show that a series of steps is working with the end showing that the fix is there, I believe GIFs are a great way to include in your bug reports after a fix has been implemented.

But How Do I Make A GIF?

I primarily run a Mac, so I really love how easy Screenflow is for this. Sure it's primarily for screencasting, and I use it for that, too, but it's really easy to make GIFs with this.

Of course, there are free alternatives (before Screenflow I was using Recordit with good results) and they all are good to use in their own right. One thing I really like with Screenflow is that it is really easy to edit after recording your GIF.

Why Does Editing GIFs Matter?

The primary reason why I'd want to edit a GIF is to remove unneeded parts of what I was recording. The same thing you'd do with any video, remove any dead or time consuming parts. If you're recording a GIF to show that something is working after a fix is put in, you may have times where you're waiting for a process to execute in order to show the fix is working. Editing your GIF to remove the time it takes for the process to launch and load will reduce the length of the GIF as well as to make it smaller for uploading or viewing.

Another awesome reason I like using Screenflow for GIFs is that you can use all the advanced screencasting features Screenflow provides for you inside of your GIFs. For instance, I can zoom in on places I want to show in the GIF or highlight specific areas of the screen so the viewer can know what I want them to see.

Let's take a look at an example. I did a very quick recording of some F# using VS Code and running a selection in the FSI. Here's the GIF of that using Screenflow's editing tools.

Not the best edited example, but I hope it helps illustrate some of the things Screenflow can do to make GIFs that much better to include in bug reports.

There are a couple of things of note, though.

  • Screenflow allowed me to specifiy what area I wanted to be recorded. I just adjusted the preview window right before recording to the size I needed.
  • I did a small zoom to better show the FSI output.
  • I did a callout to show to viewers the specific output in FSI of the input I gave it.

I got Screenflow to start doing some screencasting, but since they've introduced GIF support I've been using it much more for caputuring GIFs for projects at work and uploading them to whatever bug tracker we're using (Jira, Visual Studio Team Services, GitHub) and, to me, it's been quite helpful. Often I've recorded a GIF and found something else I needed to work on for that issue before it should have been sent back as fixed.