Teaching the Basics of Programming to Domain Experts
We always tell potential domain-expert users of DSLs that we don’t want to make them programmers. But we do want them to use DSLs. While those are of course tailored to the domain (abstractions, notations, analyses, tooling), using these languages does require to be able to think, to some extent, like a programmer. This is crucial to make the DSL approach a success. It’s not really a revelation: in almost all domains, computers are getting more prevalent. And there is an increased requirement for professionals in all domains to communicate with computers. They don’t have to become professional programmers, but they have to understand some of the same ideas and concepts as programmers.
So how do we teach them to think a little bit more like a programmer?
The draft of a tutorial
To address this issue, I started writing a tutorial that explains the basics of (so far) functional programming, because functional programming is at the heart of almost all of our DSLs. Things like values, expressions, collections, decision tables or records, in some shape or another, are found in every non-trivial DSL.
This tutorial is quite different from a regular introductory programming course: first, it does not try to teach you a particular programming language. The language used in the tutorial, KernelF, is not widely used (outside the DSLs we build for our customers). But it embodies many ideas and concepts you will find in essentially all programming languages used in the real world. So I want to teach these ideas, not the particular language.
I don’t want to teach sophisticated algorithms. I don’t expect domain experts to become a “performance optimizer”. or to think about scalability or throughput; the language design and runtime must ensure these properties. I don’t even expect them to be able to build their own sophisticated abstractions and reusable libraries. I do want domain experts to become a competent user of high-level languages, possibly languages.
The tutorial ignores many of the typical programmer tools, and in particular, compilers. Everything is executed in an interactive, live environment, with as little hassle as possible.
Finally, the tutorial start with something everybody is familiar with: Spreadsheets. I assume that everybody knows Excel and its brethren.
Who exactly should read it?
Honestly, I think in today’s world, literally everybody should understand these concepts. It makes you more competent in almost every case where you have to use a computer. More specifically:
- You are a professional in domains such as finance, healthcare or government, and you want to be able to create executable representations of business rules.
- You are a domain expert in essentially any domain, and you want to productively communicate with software engineers
- You are an engineer and you are “forced” to effectively become a programmer, because your tools of the trade are essentially software tools
- You are a student in probably any field except the humanities
Where can I find it?
You can find it at https://markusvoelter.github.io/ProgrammingBasics/ and the associated Github repo.
What is the status, what is missing?
I wrote the first eight chapters, covering what I think are the basics that everybody should understand. The text is raw, there will be bugs.
All the examples are implemented with the KernelF language inside the the Jetbrains MPS language workbench, but I have not yet made the code easily accessible (I will, of course). This also means that the little src
links next to the code examples will not work on your machine.
What is also missing is a set of exercises, and perhaps even VMs in the cloud users can launch to play with the examples. I am thinking about a part three that looks at things like modularization, contracts, inheritance, separation of concerns and the like.
I need your help!
I need feedback on whether you think the idea works. I would like concrete suggestions of what to change, or reports about bugs in the tutorial. I am looking for volunteers who might want to help with the exercises and the setup of VMs and stuff. And if you know of members of the target audience who might want to try this out on themselves (once we have polished things and have exercises) I’d love to hear suggestions. I would love to make this a community effort.
If you want to join the project, write an email or reply in the comments here.