Commented Code

Nov 07, 2012

Expand your horizons...learn a new language

In the past couple of weeks I've noticed that I've been pulled away from my current projects to help others get things done. This is not in itself abnormal for most developers, but I've found that if you compare all the topics I was helping on it spread well beyond the communication protocol work I normally do. I looked over code being developed to create an generic API for system calls to be used on multiple architectures, helped do research on backend web server code to create a responsive JavaScript based UI, and even lead the effort in resolving a system solution design bug.

All of these task are well outside my daily job description but I get pulled in on all sorts of different projects because I've gradually become the guy "in the know". This is due in part to my ability to broaden my knowledge of expertise far outside my current position. I study up on new developments on all sorts of technologies, keep my ear to the ground at work to have an understanding of what all is going on and try to find ways to grow my skills. And this week is the beginning of my next cycle of learning a new Programming Language.

A bit of history

In middle and high school I learned Pascal, C and C++ and up into college that was what most of my classes covered with a little Java thrown in. I noticed that everyone around me was pretty much at the same level and my knowledge in Programming, in general, was not advancing by leaps and bounds as it had in the past.

This was until I started in on my main course work. My focus was on Software/Hardware Interactions so I did a lot of work in Assembly and Hardware Description Languages like Verilog and VHDL. These languages were a huge departure from the typical Algol-like languages I had been using up to this point. I was now writing software that broke down larger tasks into small pieces that, by the selves, do not elude to the larger pictures but are used as building blocks to create the solution to your problem.

At my job during college I worked on developing web services for distance education and had to learn a lot of Perl and Python to write CGI scripts. This forced me to learn to develop software that operated in a single state from start to finish as compared to the programs I had written for class that were your typical "Start, loop through states, operated on I/O and complete."

Eventually I found my current job working on control systems for liquid and gas measurement. I have now come back full circle writing C/C++ applications with PC based UI, mouse and keyboard inputs and well defined data gathering and information processing.


Now that I'm back to mostly working on C and C++ I found that my learning of new development philosophies has slowed. In the past, each new language I picked up taught me to look at problems in a completely different way. I wanted to get that momentum back.

So a couple of years ago I decided to start learning AND using a new language. I found that a lot of my R&D was being written in C/C++ because its what my main deliverable was to be written in. Since no one was going to use any of this code, this was a perfect time to try and train my new skills.

The first language choice came easily. The firmware flashing utility I was using on my current project was based on tlc/tk and allowed for custom plugins written in the same language. To add support for some special cases I was running into, I picked up a book and taught myself the language. I started looking around at a lot of the other repetitive tasks I was doing and was able to script many of them.

Step outside your comfort zone

As any good developer will tell you, picking up a language is easy once you know one. It felt good learning a new language and really forcing myself to use it but the expansion of general programming knowledge wasn't really there. The purpose of learning a new language was mostly an attempt to pick up new ways of problem solving so my next language had to be a huge step outside my comfort zone. What stranger looking language to a C/C++ developer is there than Common Lisp?

Common Lisp (or CL for short) caused a complete shift in my way of thinking. Primarily a Functional Language, learning CL taught me (again) to break down problems into smaller, easier to swallow problems. I learned about new concepts like Lazy Evaluation to reduce the computation time of a problem to only the amounts I actually needed. CL even got me to write software that wrote software to solve problems. All of these were easy to grasp concepts that I never would have thought twice about unless I forced myself to learn something new.

Every language has its place

I've picked up a few more languages of the few years, some of them I use a lot and some of them I don't. I script a lot of mathematical calculations and message parsers in CL, but haven't really needed to use tcl since my previous project. One has a use for me and one doesn't. The purpose of learning both languages was to expand my view on development and in the end it was worth learning both.

I've now started working on learning JavaScript, CoffeeScript and Ruby as I see our non-embedded development has started to move more web-based. Not a huge departure from my base languages but it will help me stay ahead of the game when it comes to being "in the know."

Lets learn some languages

If you have time to browse through reddit you have time to learn a new language. I'm sure if you look around you'll probably have a space it can fill as well. Just remember to keep using the language after you've learned most of the basics. Try to keep it as your primary scripting, R&D, simple task solving, or general purpose "Getting Things Done" language for a few months and see what happens. You might just learn something.

<perm> | /devel | 2012.11.07-07:47.00 | <comments> | <reddit> | <digg> | <stumbleupon> | <tweet>