Pathway for a budding programmer

There are so many kids that I know, who want to be a “programmer”. Many of them don’t really understand what programming really means, except they see cool games or apps or programs, and they want to be able to do it. Of course, it is not an easy path to reach to that point, but I am hoping that the advice and links on this page, will help those seeking to go down this path.

Let me first start with just noting down some questions I have been asked.
These are the questions I will attempt to address in this blog.

  1. What does programming mean?
  2. What is a programming language?
  3. Why do we have so many programming languages?
  4. What programming language should I learn?
  5. What hardware should I use?
  6. What is the difference between a programming language and a development framework?
  7. Do I need to know programming to be a computer nerd?

I will add more questions here as I update this blog.

This blog is written in an interview style. Just sit back, relax and read. A lot of information here is just my brain dump. So, I will periodically update the blog to fine tune and add some details as they are required.

Why do I think I am qualified to write this blog?
Well, I have been in the computer programming world since the 1990′s, before many of you reading this blog may be born. I have always been a jack-of-all and never claimed (or really wanted to be) a master of one. For this reason, I have kept myself in the know of the various languages as they have emerged, as much as one person can, in this super fast changing landscape. While I can safely say that the language of my love is “C”, I have programmed in C++, Pascal, Java, MS Basic, Php, Python, javascript, 4GL, UVBasic, bash scripts, SQL, MS Batch scripts, MS Powershell scripts. Some of the languages that I have not had a chance to work with are Swift, R, Ruby. Of course, I am sure there are more languages out there that I have not needed, and thus are not in this brain dump.

Why do we need so many computing languages?
Let’s start with a brief historical lesson in computer languages, a very simplified version. Computers are just electronics which perform actions given the instructions. At the very lowest level, the instruction is a binary instruction – Zero (0) or One (1) / Do this or Don’t do this / Turn on or Turn off / Enable or Disable. The first computers were programmed by specifying these lowest level instructions in a sequence, specified as a sequence of 1′s and 0′s, directed towards specific electronics in the computer at specific times. Was it tedious – of course. Was it error prone – of course. If you want to imagine, each character on this page was a sequence of 7 bits – each bit being either 0 or 1. The sequence of 7 bits determined the character you wanted to computer to interpret. So, if a programmer in the early day had to write the text on this blog, they would be punching a lot of 0′s and 1′s – similar to Morse code – another historical relic, luckily before even my time.

Very soon it was recognized that writing the instructions (or programming the computer, as it was soon referred to) needed to improve. So, each “sequence of bits” or each instruction was mapped to a human readable text. So the instructions were written as a sequence of these human readable words, which were “read” by a computer and it performed the tedious job of taking each word and translating it to the sequence of bits the word represented. Here is an example
MOV 0xE345,10
This is an instruction to move the number 10 in a memory location address 0xE545. The computer would convert this to a sequence of bits such as
10101100 11111110 00000011 00000100 00000101 00000110
I am sure you can appreciate the difference between the two options. The human readable version was label assembly language and thus computer languages were born. You had a set of assembly language syntax for every different variant of computer (to be more accurate, the processor) out there. Now programmers could write more complex programs.

This was also the initial instance of computers helping computing evolve. Recall, computers were needed to translate the assembly programs into bit sequences.  This methodology of using computers to help computing evolve has been the heart of programming, and in fact is at least one reason for all these different computer languages out there. Fast forward to today, after assembly came some more human readable languages, the key among those was “C”. C language then became the foundation for other languages such as C++, python etc. all that way till now. C is still a very very popular language, used by many low level programmers because it is a language that takes you as close to the hardware as possible, just above assembly. In fact, many very low level programmers ever program in assembly, for some very very high performance reasons. But – as a budding programmer, I don’t think you ‘need’ to learn assembly, unless you want to.

But, that still doesn’t answer Why we “need” so many computing languages?
Agreed. Ok, the early languages were meant to just make programming easier and programs easy to read. After that, programs came about for different reasons. I am not really gonna go in detail on each – but here is a list
1. Improve programming design – C++ and other object oriented languages came from this need
2. Improve quick programming tasks – Python, Perl and many scripting languages help in this area
3. Improve hardware portability – Java and many scripting languages help here.
4. Improve with specific tasks in a specific domain (e.g. web page development) – Php, python, javascript were created with this in mind.
Many of these languages are written in C or C++. However, they were meant to help with a particular type of problem that was faced by many developers. And, just like animals in the jungle, a well built language with good community support survived while there are many that failed along the way.

It is difficult, no impossible, to claim that any language (even after so many years) is perfect for everything. Programming is just too wide a field for this to be the case. It is almost thinking there should be a glue out there which is perfect for everything. Strong, quick acting, waterproof, heat-resistant, easy to apply, easy to get off, cheap – see my point. And glue’s have been around much longer than programming languages. But, every language has a “core” strength, and can do “most other things too”. So, if you want to just master one language and do everything in that one language, you most definitely can. However, you may not be very efficient all the time.

So, do I have to learn all the languages out there?
Of course not. That, while not impossible, is truly not essential. With that said, it would be beneficial to learn some. And this may just be my opinion. I would really encourage everybody to have a working knowledge of the following languages
1. C/C++ (Syntactically they are very similar, C++ is just a object oriented language)
2. Bash scripting language (Very likely you will be programming on/for linux/unix platforms. This is great for quick tasks as you will learn yourself over time)
3. python or perl or ruby, some higher level scripting language. These languages fall between the first two. They are simpler, easier, quicker to write than C/C++ and more structured, powerful than bash scripting.
4. Finally, java – After C/C++, this is a core language that is almost a defacto ‘college teaching language of choice’.

Apart from these 4, depending on your leanings, you may want to learn a domain language. Given most programmers are gonna need web site development skills at some level, a web language like php, javascript etc. may be worth. However, other domains have their own languages such as R, Matlab for Data Science. Do some googling to find this. Note, a language is not the same as a framework, which we will cover later.

Ok, but I have heard of Laravel, Ruby-on-rails, Express, jQuery, matlib. Are these also languages?
No. These are not languages in the pure sense. They are frameworks or libraries. A framework is a collection of programming tasks, bundled together to make it easier to perform some specific task. Wait, isn’t that also what a language is? Well, no and yes. A language is more primitive and contains some basic operations such as file read/write, network data read/write, etc. A framework on the other hand focuses on higher level operations such as web page handling, forms processing, database access etc. With that said, while most frameworks are written atop a core language, they extend the core language capabilities by providing some additional language constructs – such as functions, libraries, variables etc, which makes learning them almost as challenging as the core language itself. Also, it many cases, the frameworks are very well suited for the exact task they were built for. A good framework makes it easy for it to be extended. One problem with frameworks though is that they are many. While, I would say there are a handful of languages that dominate 90% of the programming world out there, that is not so true for frameworks. There are multiple frameworks for a single domain for a single language. So …. you get the picture. In many cases, people create a framework on top of a language which was never meant for it in the first place. In these cases, typically, once you fall outside of the realm of the framework capabilities, you run into difficulties.

So, what is a recommended set of languages somebody can start with?
Well, this answer may surprise you. Start with ANY language. In all cases, you will get exposed to some basic concepts such as variables, loops, functions and even classes, objects, methods. As I mentioned before, many colleges use java as their language of choice – so that is a good choice. But python or php is equally good language to start with. Once you get the basics in, you can migrate to another language and you would be learning the syntax and some other differences. A much smaller mountain to climb at that point. While I would not recommend starting with C or C++, if you do, you will in fact get the other languages much faster. My first programming language was assembly :-) Now I would not want you to go that far – not unless you really want to.

Here are two recommended paths
1. Start with basic java programming.
2. Learn bash scripting.
3. Learn php (plus html) and basic web application development.
4. Learn basic C++ programming.

or

1. Start with basic python programming.
2. Learn bash scripting
3. Learn php (plus html) and basic web application development.
4. Learn basic C++ programming.

As you can see, only the 1st step is different. Now, I only mention python because it is very widely used and thus has a lot of support for you out there.

A word of caution, libraries, modules, add-ons, stay away while learning.
One of the biggest problem I see is that people try to learn a language while they are learning a framework, or they are given a graphics library as a means to learn a language. While these are entry points to learn (as you will learn best when you are making something useful), just beware that you are not sucked into learning the framework or library extensions instead. It is a slippery slope that is easy to fall into. So, if you are looking to learn php – don’t look for tutorials such as “make a webpage using php”. These may actually use a php framework like laravel to make the webpage, and you may be slipping already. You may never grasp php properly. Instead search for “php for beginners” or “crash course in php” etc. Same goes for python – dont search for “how to make graphs using python”. This will take you into matplotlib or similar. For C/C++ on Winodws, using Visual Studio, you may be sucked into MFC libraries without even knowing it. So, beware. Once have the base language down, you are free to migrate to the framework or library. You will benefit much more at that point. And, never be afraid for your first application to be the classic “Hello World!”, written in the language you are learning.

What hardware/operating system is best for a programmer.
In this day and age, any hardware should be fine. Same goes for the operating system. You are learning, you do not need high performance, fast hardware. However, in my 30+ years of programming, I have always found myself programming for/on a unix (and now linux) platforms. So, it would not be a bad idea to have access to a linux machine (just make a virtual machine on your computer) or get a unix based machine (like MacOS). But, then again, there are millions of programmers out there who may have never intentionally started a unix shell. They are always on some programmers software (also called IDE – Integrated Development Environment) like Eclipse, Netbeans, XCode, IntelliJ, PhpStorm etc., which allows them to stay away from the command line. Also, if you decide all your programs are always going to be either Microsoft Windows applications or web-applications, you may not need linux/MacOS access. But, since this is my blog, I would recommend it. Virtual machines are free and made easy now and it is just a good idea to have one. As for hardware, I use both Windows and MacOS hardware interchangeably.

Anything else before we start looking at learning resources?
Yes, just one thing. Remember, being a programmer is just one way of being part of this wonderful computer nerd community. You can be a hardware geek, a network guru, a security specialist, a Ux design specialist, a project management specialist, a quality control/test specialist and so much more. Not all these require you to know programming. However, many of these, which may not seem like in the first place, do benefit immensely if you know at least one programming language/programming concepts. As an example, as a hardware geek, you may be faced with microcode programming, which is just a fancy name for just programming except the target is just a component in the computer, not the computer itself. Many hardware components now, are just small generic processing units themselves, with the microcode making them unique for the operation they perform. A graphics processor is a classic example of this. So, having some level of programming knowledge will be useful, no matter where this journey takes you.

Now, lets start looking at some learning resources.
This is one of those things, which will probably be obsolete before I am done writing here. Instead of just giving you some links (which I will give anyway), I would rather give you google search phrases I used to come up with my list, along with my topmost YouTube URL. You may see a pattern.

Java – “Basic Java Language Tutorial for Beginners” – Java Tutorial for Beginners – Made Easy
Python – “Basic Python Language tutorial for Beginners” – Learn Python – Full Course for Beginners
Php – “Basic Php Language tutorial for Beginners” – PHP Tutorial for Beginners
C++ – “Basic C++ Language tutorial for Beginners” – C++ Tutorial for Beginners
Bash scipting – “Basic Bash Scripting tutorial for Beginners” – Shell scripting Tutorial
Javascript – “Basic Javascript language tutorial for Beginners” – JavaScript Crash Course For Beginners
H
TML and CSS – “Fundamentals of HTML and CSS” – HTML Crash Course For Absolute Beginners

Now, other than languages, here are some frameworks and concepts that I have come across that I have found useful. However, as mentioned above, frameworks are varied and many, so this is by no means even close to an exhaustive list.

1. Node.JS – A javascript based web development engine. In many cases, it is used instead of a traditional web server (like apache or nginx) to serve up web pages. – Node.js Crash Course
2. IOS App for beginners with XCode and Swift – How to make an App for Beginners (2019)
3. Android App with Android Dev Studio – Android App Development for Beginners
4. What is MVC (Model-View-Controller) – What is programming MVC

Leave a Reply