Software Creation Mystery -

From Beginner to Master Programmer: The First Language and More


Cross Talk complains that the selection of Java as the first programming language in Computer Science education weakens programmers skills and lead to decline in qualification.

The irresistible beauty of programming consists in the reduction of complex formal processes to a very small set of primitive operations. Java, instead of exposing this beauty, encourages the programmer to approach problem-solving like a plumber in a hardware store: by rummaging through a multitude of drawers (i.e. packages) we will end up finding some gadget (i.e. class) that does roughly what we want. How it does it is not interesting! The result is a student who knows how to put a simple program together, but does not know how to program. A further pitfall of the early use of Java libraries and frameworks is that it is impossible for the student to develop a sense of the run-time cost of what is written because it is extremely hard to know what any method call will eventually execute.

Authors noticed other worrisome trends in teaching software professionals:

  1. Mathematics requirements in CS programs are shrinking.
  2. The development of programming skills in several languages is giving way to cookbook approaches using large libraries and special-purpose packages.
  3. The resulting set of skills is insufficient for today’s software industry (in particular for safety and security purposes) and, unfortunately, matches well what the outsourcing industry can offer. We are training easily replaceable professionals.

I want to look into this problem from the broader perspective: what is the best way to become a good programmer for a beginner? There are two fundamental ways:

  1. Strong theoretical foundation: learn applied math, theories of algorithms and computational complexity, read Knuth’s The Art of Computer Programming, solve problems with Turing machine, etc.
  2. Shu Ha Ri – learning by experience: learn programming by solving practical problems with modern languages and platforms (Java, .Net, Ruby On Rails, PHP). Fundamental knowledge emerges from experience in solving real problems.

Definitely, there are some domains that require and intensively use CS theoretical knowledge: science, engineering, hardware and system programming. However, majority of software professionals build software for solving business, personal and other non-rocket science problems. I know a PHP programmer, who doesn’t know how to write a sort algorithm (without looking somewhere), but still have built several successful web applications. And I’m confident that there are strong computer science theorists who cannot write easy-to-use programs and make their customers happy.

So, what is the best approach? I believe any beginner should excel in following three areas:

  1. Train clear logical thinking. The ultimate end result of any programming is a program (I hope it is not a surprise), which is a set of instructions for a computer. You cannot write instructions if you don’t know how to achieve end result. Any language which allows clear procedural expression of logic is fine for start (e.g. Pascal). I would add object-oriented and functional languages on later stages (e.g. Ruby and Lisp).
  2. Understand modern software concepts and environments: computer architecture, networking, web, mobile, concurrent programming, cloud computing, etc. High level knowledge will give better orientation, starting points and overall understanding of software systems mechanics.
  3. Learn to effectively implement customer needs. Happy customers and useful software is the end result of any healthy software project. Learning evolutionary, agile development and user experience (including communication and psychology) practices is essential for the effective software developer.

I believe that software development is empirical in nature. Math and computer science theories are great, but in many case they will be only brain exercises without practical results, especially for beginners. On the contrary, beginners will become excellent master programmers by succeeding in discussed above three fundamental areas and relentlessly learning from experience in applying them.

What do you think?

Computer Science Education: Where Are the Software Engineers of Tomorrow?, Dr. Robert B.K. Dewar and Dr. Edmond Schonberg
Is Software Development Empirical or Rational?

AddThis Social Bookmark Button AddThis Feed Button


I never forgive my educational-system. First language must be Scheme (or if anybody hates the parenthesis Dylan, Goo or REBOL) ; something Lisp-derived and dynamically typed. Because this learns us how to think in abstractions. So I will not get confused when I encounter a new data structure for solving a specific problem (I do not mean the academic RBTrees; I mean for example a lazy list or a hierarchical one for demonstrating a xml tree).
When the first bullshit I learn is “int” and I think the other one (other data structure) should be something like “float” then whole software engineering is a piece of bullshit indeed!

Comment by Kaveh Shahbazian | January 9, 2008 2:32 am

I have to agree with you. Especially with your first point, “Train clear logical thinking”. This is essential for any kind of programming you will ever do. If you cannot solve a problem from a logical point of view, you would not be able to solve it on a computer.

I also agree on the path you describe by first learning a procedural language (Pascal is a great first language) and then introducing other levels of abstraction. I always thought Python will be a great starting language because it supports different styles of programming (the fact that everything is an object can be dismissed, as opposed to other pure OO languages) and you can start programming Python using a procedural approach and introduce object orientation later.

Unfortunately, this is not the way programming is teached these days. Using languages as Java, C#, VB as introductory languages requires focusing first on the frameworks and libraries provided by the language, neglecting the importance of being able to solve a simple problem in a nice structured way.

Comment by Isaac Rodriguez | January 9, 2008 9:59 pm

First of all, let me just say that this is a pretty cool blog, and I’ll be adding it to my daily (hopefully!) reads.

I recently decided that I enjoy coding in general; be it messing around in PHP, throwing simple python scripts together, or even playing with simple DHTML documents. I further decided to get a CS degree and am currently in the process of finding something good in my general area.

Anyway, add me on digg (foxter) and I will definitely digg your future articles.

Comment by Emil Arsenov | January 23, 2008 1:39 pm

[…] From Beginners to master programmers – First Language and More is a problem that faces every training organization. When I started working on Learning Point, this was one of my constant worries. I have seen several threads of discussions on the choice of first language for programming. […]

Pingback by LinkLog: Software « Dorai’s LearnLog | February 29, 2008 12:43 am

I feel somewhat vindicated by this – I recently decided not to try for a CS course at a uni, on the principle that I’ve been learning programming for six years and don’t need to learn it all again – this revelation adds more bulk to my opinion 🙂

Comment by Halfbin | August 13, 2008 1:40 pm

Well I’ll be starting in January and will hopefully enjoy it. They do introduce us using Java as one of the first languages but looking at the syllabus they go into C and assembly in the higher courses. Hopefully I will get the education I pay for because I definitely want to be a great programmer.

Comment by sean | November 27, 2010 11:18 am

This blog have little value without you and your comments, thoughts and discussions. Please, leave your comments. You are welcome to debate and criticize any idea, but, please, don't attack other people. Thanks for your contribution!

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Subscribe without commenting

Software Creation Mystery -
This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 License .