To give some background, my programming introductions went something like:
- 1986 – Logo on an Apple IIe
- 1994 – Programming on a Texas Instruments TI-81 graphing calculator
- 1995 – BASIC, Pascal
- 1996 – C, Java
- 2002 – Perl
- 2003 – PHP
- 2004 – C++
- 2008 – Python
All of these languages I have some experience in. Am I an expert in all of them? By no means. Could I quit doing web development today and go write Java applications? Sure, but I’d need awhile to brush up on things.
The takeaway is that once you have a solid foundation, switching languages is mostly a matter of syntax and semantics. You’re always going to be the most proficient in what you do day-in, day-out. That’s not to say you shouldn’t get out of your comfort zone and try something new. That’s how we stay fresh.
I recommend to anyone looking at programming to start with a high-level language. The point is to learn about logic, and get used to the syntax and semantics of programming in general – without overburdening yourself with the peculiarities of a particular language, library, development environment, operating system, or hardware platform. We can argue ’til the end of time about Unix vs. Windows, iOS vs. Android, etc. But if you truly want to learn, you’re going to want to put on your system-agnostic hat and focus on the big picture.
This is why many traditional universities start with BASIC, Java, or Python as the introductory language. It’s possible to get started in those languages without getting too bogged down in the details before you start making things happen.
Once you’ve got a grasp of how the logic works and want to go deeper, you typically go up or down language-wise. ‘Up’ being higher level concepts like object oriented programming. ‘Down’ being closer to the hardware.
Close to the metal
If you want to work on embedded systems or do real-time programming, where knowing the hardware is paramount, something like C with a sprinkling of assembly would suit you. Arduino boards, which are often used as prototypes for embedded projects, are a great example. If you’re programming for Arduino, you’re writing a dialect of C. Once considered a high-level language, C still has its roots firmly embedded in hardware, with the option of executing processor-specific assembly language commands inline. A friend who does real-time programming for the military said,
“You software guys wouldn’t know a piece of hardware if it bit you in the ass!”
There’s some truth to that. If you’ve got your sights set on embedded systems, it’s best to start with a traditional computer science foundation of C and assembly. Many science universities offer this path. You may have to grovel through the pointer arithmetic and register memorization, but you’ll come out with a great foundation of computer theory, algorithm optimization, and hardware interaction.
For everybody else, find a high-level language related to the field of work you’re interested in. In regards to learning and working professionally, is it possible to have your cake and eat it too?
alert() function. We both were like:
“Holy $#!t, that’s gotta be a security problem!”
Also, due to the popularity and momentum JS has enjoyed in the recent past, there are a plethora of libraries and frameworks to choose from once you get beyond the scholastic examples and into real-world projects. Some libraries adopt certain programming paradigms throughout. Some were created to solve a problem created by another library Some play nicely with others; some do not.
The maze of available options and which to choose can often be as difficult as doing the work. You have to be prepared to spend some time getting to know the ins-and-outs of any of these frameworks. No one person can know them all.
I tend to follow the industry. I don’t just work with WordPress because I like it; I work with it because 27% of the internet likes it, too. I consider adoption as part of the equation when selecting a framework or library. With backing by Facebook and adoption by Netflix, frameworks like React aren’t going anywhere. However, Vue.js (sometimes dubbed “React lite”) is a great alternative for a smaller project, and it plays nicely with other libraries like jQuery.
- Perl – Self-professed cool guy. Fast talker, hard to understand. Useful for occasional help, like driving you to the airport or helping you move, but no one wants to hang out with him for extended periods of time.
- Python – Hipster equivalent. Not sandal-wearing like Ruby, but still self-righteous in a different way. Useful in many situations, but sometimes annoying to deal with. Obsessed with white space.
- Basic – Total newb. Tries to look cool, but he’ll always be the little brother that tries too hard.
- C++ – Boyscout of the group, always prepared for anything. Hardly anyone wants to hang out with him because of all the rules you have to follow to travel in his circle.
- C# – Also self-righteous. Gotta be on the Microsoft bandwagon to hang with this guy. Super high-tech, but it’s Windows-only in this club.
- Java – The heavyweight. It takes him an hour to suit up before he can do anything useful. Under the harsh exterior may be a beautiful interior, but it’s only known to fellow Java developers.
- C – Lean and mean. Vulnerable, but skilled. The prototype all others are based on. Can be embarrassing if unkempt; stunning like Michelangelo’s David if well maintained.