Recently, I was sorting out with my drafts for blog when I found an interesting one. It was about what programming language to use for education at schools and universities. Python for sure! the draft says. Easy syntax, cross-platform, wide community and bla-bla-bla.

I’m happy I haven’t published that post so far because nowadays that way of thinking makes me ashamed. Considering any specific language as the primary key of successful education means to make a mistake. Even Python with all its benefits.

You could ask me: no Python, great, so what else could you suggest? Let me keep an answer for a couple of paragraphs. Instead, could you think just a minute on what’s the reason of IT education in general? I mean, we attend to IT department for… what?

To learn a modern language? Maybe. But once you finish the university, you’ll realize there are lots of new languages and frameworks. Your possible employers don’t need PHP + jQuery anymore, they want Ruby + React. Or substitute those tools with Java and Scala, it doesn’t matter. In a long term, you cannot reach a train that moves faster day after day. Since technologies became simpler (Python, Ruby, Node.js), there are more and more people claim on the same workplace.

One of your trump card might be a good knowledge of algorithms. I mean, you must understand how the things work rather then copying and pasting them from the Internet. The most serious problem that happens to new ones is they just don’t know how to split a huge thing into primitives. How to build abstractions. How to write a function rather than using a class with global state.

I saw an online interview one time. A junior Ruby guy was asked to write a function that reverses a string. I cannot do that, the answer was. OK, you have an hour, he was told. Deal with it. There were long 50 minutes of misery but he didn’t make it anyway.

Closer to the end, they asked to stop writing code, but to describe the algorithm in words at least. No success.

That guy knew Ruby, though. And Javascript. And Node.js, Webpack, Bower and so on. I may even think he worked on his project as well. But I would never hire him or let him join a team which I belong to. Because when you cannot express a primitive operation in words, it reveals dangerous holes in your mind. And that could cause unpredictable troubles.

As far as I see the purpose of education, it’s not to learn Python or any other language. It’s about a) how to compose abstractions using primitives and b) how to simplify abstractions, express them via primitives. Two-ways process, I guess. Up and down. Once you can rich any level at will, you are a great programmer.

Talking about Python, I consider it as a great tool to express your ideas. When you definitely know how the things should work, but don’t have much time. It is one of the reasons why it’s so popular in scientific area. Engineers and scientists are usually busy with research, but not learning patterns and SOLID. Python is a great choice for them. To build a chart, to train a neural network.

But that easiness could even kill willness to learn. For a newbie, neither a good syntax and rich standard library could help to become a good programmer. Maybe to write a web app, to find the first job, but not to teach you how to solve problems other than putting a JSON into DB.

I would never face other stuff, you may say. OK, that’s up to you. But there won’t be growth in your career. Because developing web apps becomes easier nowadays regardless Ruby, Node.js and crowds of students. How would you survive?

So after all, what language could make you high in algorithmic thinking? Suddenly, it’s Lisp =) or Scheme if talking more precisely. Scheme is the best tool to learn programming, I think. Not C, Python, or Javascript.

Scheme forces you to make everything from scratch by your own. At the end of SICP, that’s not a problem to write your own registry machine with compiler using pure lists and cons pairs. When you deal with some programming language or tool, you really understand how the things work under the hood without checking a source code. Only Lisp could bring that fillings.

Yes I know that in MIT, they stopped teaching SICP in respect of Java. It’s their decision after all. Maybe, after 20 years they’ve become really tired of it. And nobody couldn’t develop a new curriculum. But I know what did Dijkstra say about that and I cannot agree more with his opinion.

Long story short: try Lisp. It’s not a silver bullet. Perhaps you would never work with it in the future. There a quite a few jobs, I know. But even bits of its knowledge will make you a better programmer than now you are.