<p>We don't have Scheme in our entire country (here in India) but that honour goes to C programming language. </p>

<p>For the purpose of my answer, substituting C for Scheme, I keep asking myself, why bother with C. After that 1 semester of C, I have never used C professionally anywhere. In fact, once I step out of educational purposes, C becomes useless. That begs the question, after almost 25 years, why are they still teaching C? Why not something else? </p>

<p>I think, why they are still teaching C (in my country) and Scheme (in yours) is probably because it is ubiquitous. there are any number of books written on C. More importantly, the faculties who teach them ( I think most faculties change their jobs once in 60 years) can teach the same thing for the rest of their lives, use the same lab manual, and use the same code, and ask the same questions, use the same evaluations. From a strictly logistical point of view, it makes sense to teach C 30 years ago, and 30 years hence. </p>

<p>Can you image the mess, if every five years, the universities change their syllabus? Thats a logistical nightmare (not to forget other challenges) no one wants to deal with. For instance, one university could decide to go with C sharp, and another with Java. That creates all kind of problems. However, if all universities agree (which is how things are now) to simply keep using Scheme (in your case) and C (in my case), life becomes simple. </p>

<p>Further, the foundation that you get by learning an ancient language is that, everything that came after it, be default, would be easier. I learnt to ride a bike (as in motorcycle, not bicycle) in my dads old bike which was, well not that good. However, because I drove the tough one, all of today's bikes seem like child's play. Although I don't use C itself, anytime I learn a new language, I unconsciously compare it to C, and learn from that. </p>

<p>Update 1 : To add some context, I have been part of the IT industry for 11 years, and 5 of them as a developer/trainer/educator who travels widely. I am sure C is used somewhere, I haven't seen one single enterprise usage of C and I have worked for startups, small companies (less than 100 employees) and for MNCs (more than 2000 employees) and never ever has any division, anywhere talked about C, used C or implemented C.</p>

<p>Again, no disrespect to C (or its legion of fans) but I request that my opinion be taken in this context.  </p>

CC BY-SA 3.0
2017-09-03T16:43:31.330Z
I don't think you can compare Scheme and C in this way.  C _is_ used out there in real world projects. Operating systems and hardware related stuff is still a domain for C programmers. There is much less Scheme outside of education.
BlackJack
CC BY-SA 3.0
2017-09-03T18:19:50.860Z
There are enough uses for Scheme et al in an educational context to avoid assuming this rather sarcastic viewpoint...
AnoE
CC BY-SA 3.0
2017-09-04T02:01:31.107Z
@BlackJack I picked the closest reference I could pick to write my answer. May be C is used somewhere, but I was only explaining my exposure in the industry and the prevalence of C, not the entire software industry's and the prevalence of C.
Jay
CC BY-SA 3.0
2017-09-04T02:01:39.163Z
@AnoE I had no idea I was going for sarcasm above. I cannot rewrite the entire answer but I can issue an apology if it offended you.
Jay
CC BY-SA 3.0
2017-09-04T08:48:05.050Z
No apology necessary, I am not angry at you. I just like to give feedback for votes.
AnoE
CC BY-SA 3.0
2017-09-04T11:53:50.813Z
Your reasoning is flawed.  You are likely correct that teaching C is mainly due to inertia preventing a switch to something more modern.  C has little to recommend it for the purpose of teaching program except that *at one point in time* it was the most popular language around.  Neither of these is true for Scheme.
Jules
CC BY-SA 3.0
2017-09-04T12:07:27.010Z
Then, Scheme has my compliments that it does not have any of the baggage that C has. Further, I hope that someday, the universities here in India will adopt Scheme so the youth in India can also benefit from it. You know, prosperity for everyone :)
Jay
CC BY-SA 3.0
2018-04-14T17:16:44.223Z
Re, "We don't have Scheme in our entire country." Nobody?... in all of India?... has _ever_ downloaded a copy? Well hey! That means you can be the first:  http://www.gnu.org/software/mit-scheme/
Solomon Slow
CC BY-SA 3.0
2018-04-16T08:13:52.023Z
perhaps some day I will take it up.
Jay
CC BY-SA 4.0
2022-07-16T15:32:52.207Z
I suspect they keep teaching C simply because it has *all* the basic concepts, and none of the more complicated ones.
Steve
CC BY-SA 3.0
2017-09-03T13:32:31.790Z
2017-09-04T02:09:44.017Z
2017-09-04T02:09:44.017Z
Jay
<p>I think that the purpose of such a course is not to teach you a language. After all, Scheme, with its abstract syntax, is pretty minimal as a language. The purpose of a course like that is to teach you to <em>think abstractly</em>. If you can do that now, several years later, you can probably thank the course for getting you started. Abstraction, after all, is the big idea about computer languages. </p>

<p>A course in Python or another language can do similar things, but not in quite the same way, since in those languages you also need to learn the language syntax, idioms, and other structures. Scheme pushes all that aside for the opportunity to focus on abstraction. The things that are <em>not</em> in the language make it easier to focus on the big ideas. </p>

<hr>

<p>This isn't really related to your question, but I note that many language designers start out with a lisp- (scheme-) like syntax to try out ideas in the language before they think very hard about its concrete syntax. It turns out to be very good for such experimentation. </p>

CC BY-SA 3.0
2017-09-02T17:18:27.690Z
2017-09-02T20:38:58.490Z
2017-09-02T20:38:58.490Z
Buffy
<h1>Simplicity</h1>

<p>You can write the definition of scheme on the back of a postage stamp. Therefore as @Buffy says, you don't have to learn the language at the same time as learning the concepts.</p>

<h1>It is a pure functional language.</h1>

<p>You will be a better programmer, because you learnt functional. Better to do it first, few people learn functional second.</p>

<h1>Education vs training</h1>

<p>Education is about learning the concepts, training is about leaning a language. Education is long term, training is short term. Training is about learning, Education is about learning how to learn (meta learning).</p>

<h1>A personal experience</h1>

<p>I leant scheme late, after basic,pascal,C,C++,C#,python,tcl, et al. I have never done it again, but I have not stopped using it, in the way I program in other languages.</p>

CC BY-SA 3.0
2017-09-03T06:31:46.637Z
Scheme is not a pure functional language.
Derek Elkins left SE
CC BY-SA 3.0
2017-09-03T12:09:21.413Z
That depends on the Scheme.
Racheet
CC BY-SA 3.0
2017-09-03T12:31:41.170Z
@Derek it was originally, but some variants add mutation. Thing is you don't need much to implement mutation, just the basic building block. Therefore functional programming is a state of mind. The best way to get this state of mind is to learn a pure functional language such as scheme. And then add mutation your self, when and only when you need it.
ctrl-alt-delor
CC BY-SA 3.0
2017-09-02T18:51:20.127Z
2017-09-02T18:51:20.127Z
ctrl-alt-delor
<p>Scheme is not that widely used in the industry, but that is not the point. The purpose of CS is not to teach you any particular language, but to teach fundamental concepts. When you know the fundamental concepts, learning any particular language is pretty easy. Anybody with a solid CS background would be able to learn Python in a few hours of self-study.</p>

<p>Scheme is well-suited to teach fundamental concepts for a few reasons:</p>

<ul>
<li>Built on very simple and logical concepts. </li>
<li>Syntax may be unconventional and somewhat tedious, but it is also totally logical and consistent, which means you don't waste a lot of time on surface issues.</li>
<li>Extremely flexible which means you can implement almost any CS concept and paradigm in it.</li>
</ul>

<p>You can consider scheme more of a "blank slate" than Python. For example the SICP book teaches object oriented programming by having the student implement an object system from scratch in Scheme. Now in industry you might prefer a language which already have a solid built-in object system (like Python), but for teaching it gives a much deeper understanding to implement one yourself. </p>

CC BY-SA 3.0
2017-09-08T16:25:23.550Z
Also you have macros.  This is similar to pointers in that the concept is _hard_ to wrap  your mind around.  "Now it is data, now it is code, now it is data again".  Very few languages get this.
Thorbjørn Ravn Andersen
CC BY-SA 3.0
2017-09-03T11:33:25.937Z
2017-09-03T11:33:25.937Z
user2892
<p>There's one more reason I'd like to add to those here, less high-minded, but also a genuine consideration. One of the practical difficulties of teaching an introductory course is that the students come in at vastly different levels. Some are quite competent already and some are brand new. It is rare for kids to come in with <em>any</em> experience outside of imperative languages, though.</p>
<p>By utilizing a functional language in your first course, you get to have a classroom full of kids who have more similar footing.  And when you move on later to imperative programming, you no longer have any kids with no experience. It's a simple trick to keep your cohorts more on-level without wasting the time of the advanced students.</p>

CC BY-SA 4.0
2017-09-02T19:32:30.510Z
2022-05-16T19:17:38.480Z
2022-05-16T19:17:38.480Z
Ben I.
<p>Every second you spend explaining a programming language is a second you are not teaching programming, software development, software engineering, software design, or computer science.</p>

<p>You can teach the entirety of Scheme in a single lesson. You can probably teach the entirety of Scheme in 10 minutes. Python is significantly more complex than Scheme, so, you will spend significantly more time explaining Python and not teaching CS.</p>

<p>Oh, and BTW: the world's most widely-deployed programming language is essentially Scheme with syntax. (And an object system inspired by NewtonScript, Act-1, and Self.) Personally, I didn't understand ECMAScript until I learned Scheme and Self. Teaching Scheme will get your students halfway there. So, in <em>that</em> sense, Scheme is one of the most "real world" languages out there.</p>

CC BY-SA 3.0
2017-09-04T02:07:33.513Z
Perhaps I'm corrupted by already knowing programming languages that are so different from Scheme, but I've been poking at Scheme for quite some time now, and still don't feel like I understand it.  The closest thing I've found to "learn Scheme in 10 minutes" is this: http://web-artanis.com/scheme.html.  I've also read [Norvig's claims](http://www.paulgraham.com/avg.html) that he could do in 3 days what it took his Java competitors 30 days to do.  I'd love to have that kind of productivity spike, but I remain skeptical.
Robert Harvey
CC BY-SA 3.0
2017-09-04T02:14:10.027Z
Scheme, therefore, remains one of those simple, elegant tools that can be compared to a surgeon's scalpel: powerful, but taking years to master.  Most people apparently don't have that kind of patience, as evidenced by the ubiquity of curly-brace languages and the ongoing obscurity of s-expressions.
Robert Harvey
CC BY-SA 3.0
2017-09-05T08:04:58.837Z
@RobertHarvey but then when pushed, Peter Norvig moved to Python: https://news.ycombinator.com/item?id=1803815. Said 10x productivity boost has there become "has the edge". And, presumably, not enough edge to bring Google to LISP.
TessellatingHeckler
CC BY-SA 3.0
2017-09-05T15:01:29.440Z
Scheme's grammar is easier to specify to yacc than that of Python (it's probably simpler to just write a Scheme parser freehand), but where's the need to hyper-optimize an operation that happens *once per compiler*? The popularity of curly-brace languages and the ubiquity of byzantine natural-language grammars suggests that learning silly arbitrary grammar rules is massively cheaper for our brains than specifying those rules in BNF. That's not to say there isn't value in kids learning Scheme, of course. Just not because it's "easy to learn".
Ed Plunkett
CC BY-SA 3.0
2018-04-14T08:25:11.070Z
Huh?  COBOL  is scheme with syntax? Since when?
pojo-guy
CC BY-SA 3.0
2018-04-14T20:58:19.560Z
@pojo-guy: I am willing to bet there are more deployed JavaScript runtimes in the world than there are COBOL runtimes. For example, in my (tiny) flat, there are over 20 JavaScript runtimes (7 on my laptop alone), and 0 COBOL runtimes. Almost every adult in the (so-called) developed world is carrying at least one in their pocket.
Jörg W Mittag
CC BY-SA 3.0
2018-04-14T21:02:08.167Z
@JörgWMittag Ok, that explains it.  Without that additional information I had no clue what you were talking about. Scheme has never been on my radar before today. Around 80% of the world's actively used code is COBOL (220 billion lines and increasing).
pojo-guy
CC BY-SA 3.0
2017-09-03T03:02:22.800Z
2017-09-03T03:02:22.800Z
Jörg W Mittag
<p>With Scheme, you start teaching programming <em>concepts</em> on day 1 - and also implementing them as working code on day 1.</p>

<p>With a typical procedural language (C++, Java, etc) you first have to crawl through the swamp formed around 20+ years of accumulated obsolescent and deprecated <em>syntax</em>. The survivors from that experience <em>might</em> get to learn some concepts eventually, but only if the course doesn't run out of time first!</p>

<p>Recent languages like Python have the great educational <em>disadvantage</em> of features like duck-typing, etc. Of course that makes them very effective tools in the hands of <em>good</em> programmers, but not so effective as teaching languages it's too easy to make subtle mistakes. (And don't even mention the mess that Python got itself into over <em>syntax</em> changes in the upgrade from Python 2 to Python 3...)</p>

CC BY-SA 3.0
2017-09-02T20:49:00.227Z
Woah. Maybe a _bit_ overstated. A couple of teaspoon fulls maybe. But yeah. It explains why those other languages require more pedagogy and support, most likely.
Buffy
CC BY-SA 3.0
2017-09-05T07:14:21.277Z
Why would Python change the meaning of 5/2 or make print "a" an invalid syntax, I can't understand. But at least it's not like Swift which has many breaking changes in every subversion...
EralpB
CC BY-SA 3.0
2017-09-05T11:56:14.770Z
"__Recent__ languages like Python" in contrast to languages like C++, Java, is a bit confusing. Python was first published 1991, a quarter century ago. Java 1995. C++ was standardized 1998 (though dating back to 1979).
Sebastian Mach
CC BY-SA 3.0
2017-09-02T20:38:52.193Z
2017-09-02T20:38:52.193Z
alephzero
<p>Procedural approach.   Not a joke: with functional programming students are very quickly faced with the necessity to write their code as a set a (reusable) functions with a clearly defined role.</p>

<p>With the traditional approach of imperative/OO languages, they learn functions after a lot of other concepts : loops, arrays, etc. Probably too late.</p>

<p>For example: if you ask them a program to compare the average value of an array, a lot of them will write a loop to sum the values,  not use a function for the sum of the array. Even if it was a previous exercice.</p>

CC BY-SA 3.0
2017-09-02T18:51:57.440Z
“Procedural approach”?
ctrl-alt-delor
CC BY-SA 3.0
2017-09-02T20:26:21.817Z
@ctre-alt-delor Imperative approach: a program is seen as a "sequence" (maybe structured)  of actions. Procedural: relies on procedures (functions, subroutines, whatever) for the division of work.
Michel Billaud
CC BY-SA 3.0
2017-09-02T21:31:54.453Z
@MichelBillaud [*Procedural*](https://en.wikipedia.org/wiki/Procedural_programming) does not mean the same as *functional*. It usually refers to structured imperative programming.
Bergi
CC BY-SA 3.0
2017-09-03T09:39:14.213Z
@bergi Learning to decompose a task into smaller subtasks,
write code for subtasks, and combine it, is the key to successful programming. Once learnt, transposable to any prog. language.
Programming languages provide mechanisms to express subtasks: functions,  procedures,... It's better to learn use them as soon as possible, systematically. That's probably taught within the first 2 hours in the case of functional languages (except if you insist on writing bad Fortran in Scheme). Much later with C, C++, Java, etc. Functions unfortunately considered "an advanced topic".
Michel Billaud
CC BY-SA 3.0
2017-09-03T12:17:53.220Z
Procedural is imperative, functional can be imperative, imperative can and should be structured, however functional ≠ procedural. Procedural is about doing and side-effects, functional is about return values. Both use subroutines.
ctrl-alt-delor
CC BY-SA 3.0
2017-09-03T12:20:02.190Z
@MichelBillaud Yes. We think it would improve your answer if you replaced "procedural" with "functional" in the first sentence.
Bergi
CC BY-SA 3.0
2017-09-04T02:38:45.940Z
@Bergi Notice that the answers says "Procedural _apporoach_", __not__ "Procedural _programming_". The approach to teaching in _functional_ languages is to reduce tasks until each subtask is a single function. That process is a _procedural approach_ to the task, while not being _procedural programming_. Let's not argue with terms and definitions when discussing _concepts_ to begin with.
Gypsy Spellweaver
CC BY-SA 3.0
2017-09-02T18:06:32.017Z
2017-09-04T11:39:53.873Z
2017-09-04T11:39:53.873Z
Michel Billaud
<p>There are some great answers here already, but I have one thing that was not said yet directly:</p>
<h2>Forcing students to learn a second language before proceeding further</h2>
<p>I strongly believe that knowing multiple languages is crucial for proper programmer development. Every language has it's own ways of modelling reality, and devs using (even worse: knowing) only one language get very strongly tied to it's idioms and quirks. Offering Scheme as the first language should force students to learn something more practical (no offense) quickly, giving them grasp of 2 significantly different approaches, and more or less untie their abstract thinking from any specific language.</p>

CC BY-SA 3.0
2018-04-14T17:05:41.337Z
Long ago, I enrolled in a "Comparative Programming Langauges" class that required me to write at least one program in each of; Pascal, Lisp, SNOBOL, Prolog, Forth, and OPS5.  Even if I never had used any of those languages in a paying job, I still would have ranked that class among the most important that I ever attended.
Solomon Slow
CC BY-SA 3.0
2018-04-14T17:34:35.130Z
In the University I graduated from, the bachelor CS studies (3 years) required people to submit code in about 8-10 languages, including Haskell and Prolog  (+ stuff like html and sql). For me it was one of the best things there, though pretty tough for some.
Frax
CC BY-SA 3.0
2018-04-15T02:05:37.020Z
Very much this. Back in school (1980s) the CS curriculum started using Pascal, and to acquaint ourselves with a completely different programming paradigm, we had to chose either Common Lisp or Prolog. I chose Common Lisp, and it was instrumental in drastically expanding my computational thought process (and was a lot of fun to boot). I never used Lisp in a professional capacity later other than for some Emacs customization. I also took a "Comparative Programming Languages" class, but it didn't require submitting code, so had much less of an impact.
njuffa
CC BY-SA 3.0
2018-04-14T03:04:35.910Z
2018-04-14T03:04:35.910Z
2020-06-18T08:36:57.023Z
Frax
<p>user2892 mentioned the book SICP (Structure and Interpretation of Computer Programs). This book alone is enough of a reason to justify Scheme as a major contender for an introduction to computer science class. This book is a must-read for anyone truly into computer science. See Brian Harvey's essay...</p>

<p>Brian Harvey: "In 2011, to celebrate the 150th anniversary of MIT, the <em>Boston Globe</em> made a list of the most important innovations developed there. They asked me to explain the importance of SICP, and this is what I sent them:"</p>

<p><a href="https://people.eecs.berkeley.edu/~bh/sicp.html" rel="nofollow noreferrer">https://people.eecs.berkeley.edu/~bh/sicp.html</a></p>

CC BY-SA 3.0
2017-09-06T16:54:39.553Z
Hey, thanks, this is good material. However, you didn´t answer my question :D Could you extract what you think is most important in the sources you mentioned so the question can be answered? That would be great.
Kenny Barrera
CC BY-SA 3.0
2017-09-06T19:14:39.667Z
Thanks for posting about my favorite CS book, and welcome to CSE Stack Exchange! Answers are supposed to be self-contained, so could you please summarize why SICP rocks?
Ellen Spertus
CC BY-SA 3.0
2017-09-07T17:25:58.013Z
I'm sorry, I thought I added one reason for using Scheme - that one of the best introductory computer science textbooks is based on Scheme. Other major reasons for using Scheme as an introductory language have already been presented in answers provided prior to my note, e.g., its syntax simplicity and its emphasis on data and procedural abstraction. I believe that one should use a language best suited to introducing computer science/programming in an introductory class. Students can learn other languages in common use in follow-on classes.
gmh
CC BY-SA 3.0
2017-09-06T16:44:49.557Z
2017-09-06T16:44:49.557Z
gmh
<p>When I started my Computer Science studies, Scheme was the first thing we learned in our first programming course. Almost 8 years later, I ask a friend of mine, and it seems that they are still teaching Scheme for beginners. Besides the annoying amount of parenthesis, I found Scheme helpful, and I was able to understand important concepts as how interpreted languages work, anonymous functions, recursion and so on.</p>

<p>My question comes, because, except for that semester, I have never used Scheme again, and even though it was helpful I have always thought why not teach another <em>real world</em> use language.</p>

<p>Wouldn't, for example, Python help in the same way? Why Scheme?</p>

CC BY-SA 3.0
2017-09-04T14:14:28.560Z
For new learners it is better nowadays to call it [**Racket**](http://racket-lang.org/), solving an old [communication problem](http://racket-lang.org/new-name.html). Scheme is the ancestor and was generally associated to one perspective (R5RS). Racket supports this, R6RS and the latest developments from the PLT team.
Armfoot
CC BY-SA 3.0
2017-09-04T19:26:34.527Z
@Armfoot I don't know about other universities, but Berkeley uses it's own scheme, which is distinct from racket.
k_g
CC BY-SA 3.0
2017-09-04T21:12:56.073Z
@k_g interesting, I thought that Scheme implementations used in schools were derived from the PLT group. Did Berkeley implement their version from a particular standard/perspective (RnRS)?
Armfoot
CC BY-SA 3.0
2017-09-04T21:21:47.020Z
Creating a level playing field and forcing people to think differently. Too many kids show up knowing one curly-brace language or another and thinking that's all they ever need know.
Bob Jarvis - Слава Україні
CC BY-SA 3.0
2017-09-04T22:30:34.603Z
@armfoot, I'm not sure exactly what the origin is, we've been using our own scheme for at least a decade.
k_g
CC BY-SA 3.0
2017-09-05T12:43:56.097Z
Why would you learn Latin as a first language? Similar question, and I regret it to this day.
Peter - Reinstate Monica
CC BY-SA 3.0
2017-09-05T12:46:08.463Z
@BobJarvis WHy would you *want* to level the playing field? Teach people at their respective levels. Let people who can code already skip that introduction. Teach them something that moves them forward.
Peter - Reinstate Monica
CC BY-SA 3.0
2017-09-05T12:51:12.323Z
Interestingly, I think MIT switched a few years ago from Scheme to Python in the first programming class in course 6.
Barmar
CC BY-SA 3.0
2017-09-05T16:26:08.020Z
I was in college for CS(Software Engineering) between 2006 and 2012, never once touched Scheme. I believe it was part of the higher level CS curriculum though. The first language taught there was Python. Another university nearby starts off with C/C++.
selectstriker2
CC BY-SA 4.0
2022-05-16T20:32:51.197Z
You may want to read Hansen, M. R., & Kristensen, J. T. (2008). Experiences with functional programming in an introductory curriculum. In Reflections on the Teaching of Programming (pp. 30-46). Springer, Berlin, Heidelberg. Their paper is not about Scheme, but FP in general, but they do enumerate a number of advantages of using FP as the introductory programming language.
Edwin Dalorzo
<curriculum-design><language-choice><scheme>
What could be the possible advantages of teaching Scheme as first programming language?
# What could be the possible advantages of teaching Scheme as first programming language?

(Asked by: username_0 on 2017-09-02)

When I started my Computer Science studies, Scheme was the first thing we learned in our first programming course. Almost 8 years later, I ask a friend of mine, and it seems that they are still teaching Scheme for beginners. Besides the annoying amount of parenthesis, I found Scheme helpful, and I was able to understand important concepts as how interpreted languages work, anonymous functions, recursion and so on.

My question comes, because, except for that semester, I have never used Scheme again, and even though it was helpful I have always thought why not teach another *real world* use language.

Wouldn't, for example, Python help in the same way? Why Scheme?

**Tags:** curriculum-design, language-choice, scheme

> **Comments:**
> **username_1**: For new learners it is better nowadays to call it [**Racket**](http://racket-lang.org/), solving an old [communication problem](http://racket-lang.org/new-name.html). Scheme is the ancestor and was generally associated to one perspective (R5RS). Racket supports this, R6RS and the latest developments from the PLT team.  
> **username_2**: @username_1 I don't know about other universities, but Berkeley uses it's own scheme, which is distinct from racket.  
> **username_1**: @username_2 interesting, I thought that Scheme implementations used in schools were derived from the PLT group. Did Berkeley implement their version from a particular standard/perspective (RnRS)?  
> **username_3**: Creating a level playing field and forcing people to think differently. Too many kids show up knowing one curly-brace language or another and thinking that's all they ever need know.  
> **username_2**: @armfoot, I'm not sure exactly what the origin is, we've been using our own scheme for at least a decade.  
> **username_4**: Why would you learn Latin as a first language? Similar question, and I regret it to this day.  
> **username_4**: @BobJarvis WHy would you *want* to level the playing field? Teach people at their respective levels. Let people who can code already skip that introduction. Teach them something that moves them forward.  
> **username_5**: Interestingly, I think MIT switched a few years ago from Scheme to Python in the first programming class in course 6.  
> **username_6**: I was in college for CS(Software Engineering) between 2006 and 2012, never once touched Scheme. I believe it was part of the higher level CS curriculum though. The first language taught there was Python. Another university nearby starts off with C/C++.  
> **username_7**: You may want to read Hansen, M. R., & Kristensen, J. T. (2008). Experiences with functional programming in an introductory curriculum. In Reflections on the Teaching of Programming (pp. 30-46). Springer, Berlin, Heidelberg. Their paper is not about Scheme, but FP in general, but they do enumerate a number of advantages of using FP as the introductory programming language.  

---

## 10 answers

### Answer by username_14 on 2017-09-02. Score: 36 | Accepted answer

I think that the purpose of such a course is not to teach you a language. After all, Scheme, with its abstract syntax, is pretty minimal as a language. The purpose of a course like that is to teach you to *think abstractly*. If you can do that now, several years later, you can probably thank the course for getting you started. Abstraction, after all, is the big idea about computer languages.

A course in Python or another language can do similar things, but not in quite the same way, since in those languages you also need to learn the language syntax, idioms, and other structures. Scheme pushes all that aside for the opportunity to focus on abstraction. The things that are *not* in the language make it easier to focus on the big ideas.

---

This isn't really related to your question, but I note that many language designers start out with a lisp- (scheme-) like syntax to try out ideas in the language before they think very hard about its concrete syntax. It turns out to be very good for such experimentation.


---

### Answer by username_20 on 2017-09-02. Score: 25

There's one more reason I'd like to add to those here, less high-minded, but also a genuine consideration. One of the practical difficulties of teaching an introductory course is that the students come in at vastly different levels. Some are quite competent already and some are brand new. It is rare for kids to come in with *any* experience outside of imperative languages, though.

By utilizing a functional language in your first course, you get to have a classroom full of kids who have more similar footing. And when you move on later to imperative programming, you no longer have any kids with no experience. It's a simple trick to keep your cohorts more on-level without wasting the time of the advanced students.


---

### Answer by username_21 on 2017-09-03. Score: 17

Every second you spend explaining a programming language is a second you are not teaching programming, software development, software engineering, software design, or computer science.

You can teach the entirety of Scheme in a single lesson. You can probably teach the entirety of Scheme in 10 minutes. Python is significantly more complex than Scheme, so, you will spend significantly more time explaining Python and not teaching CS.

Oh, and BTW: the world's most widely-deployed programming language is essentially Scheme with syntax. (And an object system inspired by NewtonScript, Act-1, and Self.) Personally, I didn't understand ECMAScript until I learned Scheme and Self. Teaching Scheme will get your students halfway there. So, in *that* sense, Scheme is one of the most "real world" languages out there.

> **Comments:**
> **username_22**: Perhaps I'm corrupted by already knowing programming languages that are so different from Scheme, but I've been poking at Scheme for quite some time now, and still don't feel like I understand it.  The closest thing I've found to "learn Scheme in 10 minutes" is this: http://web-artanis.com/scheme.html.  I've also read [Norvig's claims](http://www.paulgraham.com/avg.html) that he could do in 3 days what it took his Java competitors 30 days to do.  I'd love to have that kind of productivity spike, but I remain skeptical.  
> **username_22**: Scheme, therefore, remains one of those simple, elegant tools that can be compared to a surgeon's scalpel: powerful, but taking years to master.  Most people apparently don't have that kind of patience, as evidenced by the ubiquity of curly-brace languages and the ongoing obscurity of s-expressions.  
> **username_23**: @RobertHarvey but then when pushed, Peter Norvig moved to Python: https://news.ycombinator.com/item?id=1803815. Said 10x productivity boost has there become "has the edge". And, presumably, not enough edge to bring Google to LISP.  
> **username_24**: Scheme's grammar is easier to specify to yacc than that of Python (it's probably simpler to just write a Scheme parser freehand), but where's the need to hyper-optimize an operation that happens *once per compiler*? The popularity of curly-brace languages and the ubiquity of byzantine natural-language grammars suggests that learning silly arbitrary grammar rules is massively cheaper for our brains than specifying those rules in BNF. That's not to say there isn't value in kids learning Scheme, of course. Just not because it's "easy to learn".  
> **username_25**: Huh?  COBOL  is scheme with syntax? Since when?  
> **username_21**: @username_25: I am willing to bet there are more deployed JavaScript runtimes in the world than there are COBOL runtimes. For example, in my (tiny) flat, there are over 20 JavaScript runtimes (7 on my laptop alone), and 0 COBOL runtimes. Almost every adult in the (so-called) developed world is carrying at least one in their pocket.  
> **username_25**: @JörgWMittag Ok, that explains it.  Without that additional information I had no clue what you were talking about. Scheme has never been on my radar before today. Around 80% of the world's actively used code is COBOL (220 billion lines and increasing).  

---

### Answer by username_26 on 2017-09-02. Score: 15

With Scheme, you start teaching programming *concepts* on day 1 - and also implementing them as working code on day 1.

With a typical procedural language (C++, Java, etc) you first have to crawl through the swamp formed around 20+ years of accumulated obsolescent and deprecated *syntax*. The survivors from that experience *might* get to learn some concepts eventually, but only if the course doesn't run out of time first!

Recent languages like Python have the great educational *disadvantage* of features like duck-typing, etc. Of course that makes them very effective tools in the hands of *good* programmers, but not so effective as teaching languages it's too easy to make subtle mistakes. (And don't even mention the mess that Python got itself into over *syntax* changes in the upgrade from Python 2 to Python 3...)

> **Comments:**
> **username_14**: Woah. Maybe a _bit_ overstated. A couple of teaspoon fulls maybe. But yeah. It explains why those other languages require more pedagogy and support, most likely.  
> **username_27**: Why would Python change the meaning of 5/2 or make print "a" an invalid syntax, I can't understand. But at least it's not like Swift which has many breaking changes in every subversion...  
> **username_28**: "__Recent__ languages like Python" in contrast to languages like C++, Java, is a bit confusing. Python was first published 1991, a quarter century ago. Java 1995. C++ was standardized 1998 (though dating back to 1979).  

---

### Answer by username_15 on 2017-09-02. Score: 12

# Simplicity

You can write the definition of scheme on the back of a postage stamp. Therefore as @username_14 says, you don't have to learn the language at the same time as learning the concepts.

# It is a pure functional language.

You will be a better programmer, because you learnt functional. Better to do it first, few people learn functional second.

# Education vs training

Education is about learning the concepts, training is about leaning a language. Education is long term, training is short term. Training is about learning, Education is about learning how to learn (meta learning).

# A personal experience

I leant scheme late, after basic,pascal,C,C++,C#,python,tcl, et al. I have never done it again, but I have not stopped using it, in the way I program in other languages.

> **Comments:**
> **username_16**: Scheme is not a pure functional language.  
> **username_17**: That depends on the Scheme.  
> **username_15**: @Derek it was originally, but some variants add mutation. Thing is you don't need much to implement mutation, just the basic building block. Therefore functional programming is a state of mind. The best way to get this state of mind is to learn a pure functional language such as scheme. And then add mutation your self, when and only when you need it.  

---

### Answer by username_18 on 2017-09-03. Score: 10

Scheme is not that widely used in the industry, but that is not the point. The purpose of CS is not to teach you any particular language, but to teach fundamental concepts. When you know the fundamental concepts, learning any particular language is pretty easy. Anybody with a solid CS background would be able to learn Python in a few hours of self-study.

Scheme is well-suited to teach fundamental concepts for a few reasons:

* Built on very simple and logical concepts.
* Syntax may be unconventional and somewhat tedious, but it is also totally logical and consistent, which means you don't waste a lot of time on surface issues.
* Extremely flexible which means you can implement almost any CS concept and paradigm in it.

You can consider scheme more of a "blank slate" than Python. For example the SICP book teaches object oriented programming by having the student implement an object system from scratch in Scheme. Now in industry you might prefer a language which already have a solid built-in object system (like Python), but for teaching it gives a much deeper understanding to implement one yourself.

> **Comments:**
> **username_19**: Also you have macros.  This is similar to pointers in that the concept is _hard_ to wrap  your mind around.  "Now it is data, now it is code, now it is data again".  Very few languages get this.  

---

### Answer by username_29 on 2017-09-02. Score: 5

Procedural approach. Not a joke: with functional programming students are very quickly faced with the necessity to write their code as a set a (reusable) functions with a clearly defined role.

With the traditional approach of imperative/OO languages, they learn functions after a lot of other concepts : loops, arrays, etc. Probably too late.

For example: if you ask them a program to compare the average value of an array, a lot of them will write a loop to sum the values, not use a function for the sum of the array. Even if it was a previous exercice.

> **Comments:**
> **username_15**: “Procedural approach”?  
> **username_29**: @ctre-alt-delor Imperative approach: a program is seen as a "sequence" (maybe structured)  of actions. Procedural: relies on procedures (functions, subroutines, whatever) for the division of work.  
> **username_30**: @MichelBillaud [*Procedural*](https://en.wikipedia.org/wiki/Procedural_programming) does not mean the same as *functional*. It usually refers to structured imperative programming.  
> **username_29**: @bergi Learning to decompose a task into smaller subtasks, write code for subtasks, and combine it, is the key to successful programming. Once learnt, transposable to any prog. language. Programming languages provide mechanisms to express subtasks: functions,  procedures,... It's better to learn use them as soon as possible, systematically. That's probably taught within the first 2 hours in the case of functional languages (except if you insist on writing bad Fortran in Scheme). Much later with C, C++, Java, etc. Functions unfortunately considered "an advanced topic".  
> **username_15**: Procedural is imperative, functional can be imperative, imperative can and should be structured, however functional ≠ procedural. Procedural is about doing and side-effects, functional is about return values. Both use subroutines.  
> **username_30**: @MichelBillaud Yes. We think it would improve your answer if you replaced "procedural" with "functional" in the first sentence.  
> **username_31**: @username_30 Notice that the answers says "Procedural _apporoach_", __not__ "Procedural _programming_". The approach to teaching in _functional_ languages is to reduce tasks until each subtask is a single function. That process is a _procedural approach_ to the task, while not being _procedural programming_. Let's not argue with terms and definitions when discussing _concepts_ to begin with.  

---

### Answer by username_32 on 2018-04-14. Score: 3

There are some great answers here already, but I have one thing that was not said yet directly:

## Forcing students to learn a second language before proceeding further

I strongly believe that knowing multiple languages is crucial for proper programmer development. Every language has it's own ways of modelling reality, and devs using (even worse: knowing) only one language get very strongly tied to it's idioms and quirks. Offering Scheme as the first language should force students to learn something more practical (no offense) quickly, giving them grasp of 2 significantly different approaches, and more or less untie their abstract thinking from any specific language.

> **Comments:**
> **username_12**: Long ago, I enrolled in a "Comparative Programming Langauges" class that required me to write at least one program in each of; Pascal, Lisp, SNOBOL, Prolog, Forth, and OPS5.  Even if I never had used any of those languages in a paying job, I still would have ranked that class among the most important that I ever attended.  
> **username_32**: In the University I graduated from, the bachelor CS studies (3 years) required people to submit code in about 8-10 languages, including Haskell and Prolog  (+ stuff like html and sql). For me it was one of the best things there, though pretty tough for some.  
> **username_33**: Very much this. Back in school (1980s) the CS curriculum started using Pascal, and to acquaint ourselves with a completely different programming paradigm, we had to chose either Common Lisp or Prolog. I chose Common Lisp, and it was instrumental in drastically expanding my computational thought process (and was a lot of fun to boot). I never used Lisp in a professional capacity later other than for some Emacs customization. I also took a "Comparative Programming Languages" class, but it didn't require submitting code, so had much less of an impact.  

---

### Answer by username_34 on 2017-09-06. Score: 2

username_18 mentioned the book SICP (Structure and Interpretation of Computer Programs). This book alone is enough of a reason to justify Scheme as a major contender for an introduction to computer science class. This book is a must-read for anyone truly into computer science. See Brian Harvey's essay...

Brian Harvey: "In 2011, to celebrate the 150th anniversary of MIT, the *Boston Globe* made a list of the most important innovations developed there. They asked me to explain the importance of SICP, and this is what I sent them:"

<https://people.eecs.berkeley.edu/~bh/sicp.html>

> **Comments:**
> **username_0**: Hey, thanks, this is good material. However, you didn´t answer my question :D Could you extract what you think is most important in the sources you mentioned so the question can be answered? That would be great.  
> **username_35**: Thanks for posting about my favorite CS book, and welcome to CSE Stack Exchange! Answers are supposed to be self-contained, so could you please summarize why SICP rocks?  
> **username_34**: I'm sorry, I thought I added one reason for using Scheme - that one of the best introductory computer science textbooks is based on Scheme. Other major reasons for using Scheme as an introductory language have already been presented in answers provided prior to my note, e.g., its syntax simplicity and its emphasis on data and procedural abstraction. I believe that one should use a language best suited to introducing computer science/programming in an introductory class. Students can learn other languages in common use in follow-on classes.  

---

### Answer by username_8 on 2017-09-03. Score: -2

We don't have Scheme in our entire country (here in India) but that honour goes to C programming language.

For the purpose of my answer, substituting C for Scheme, I keep asking myself, why bother with C. After that 1 semester of C, I have never used C professionally anywhere. In fact, once I step out of educational purposes, C becomes useless. That begs the question, after almost 25 years, why are they still teaching C? Why not something else?

I think, why they are still teaching C (in my country) and Scheme (in yours) is probably because it is ubiquitous. there are any number of books written on C. More importantly, the faculties who teach them ( I think most faculties change their jobs once in 60 years) can teach the same thing for the rest of their lives, use the same lab manual, and use the same code, and ask the same questions, use the same evaluations. From a strictly logistical point of view, it makes sense to teach C 30 years ago, and 30 years hence.

Can you image the mess, if every five years, the universities change their syllabus? Thats a logistical nightmare (not to forget other challenges) no one wants to deal with. For instance, one university could decide to go with C sharp, and another with Java. That creates all kind of problems. However, if all universities agree (which is how things are now) to simply keep using Scheme (in your case) and C (in my case), life becomes simple.

Further, the foundation that you get by learning an ancient language is that, everything that came after it, be default, would be easier. I learnt to ride a bike (as in motorcycle, not bicycle) in my dads old bike which was, well not that good. However, because I drove the tough one, all of today's bikes seem like child's play. Although I don't use C itself, anytime I learn a new language, I unconsciously compare it to C, and learn from that.

Update 1 : To add some context, I have been part of the IT industry for 11 years, and 5 of them as a developer/trainer/educator who travels widely. I am sure C is used somewhere, I haven't seen one single enterprise usage of C and I have worked for startups, small companies (less than 100 employees) and for MNCs (more than 2000 employees) and never ever has any division, anywhere talked about C, used C or implemented C.

Again, no disrespect to C (or its legion of fans) but I request that my opinion be taken in this context.

> **Comments:**
> **username_9**: I don't think you can compare Scheme and C in this way.  C _is_ used out there in real world projects. Operating systems and hardware related stuff is still a domain for C programmers. There is much less Scheme outside of education.  
> **username_10**: There are enough uses for Scheme et al in an educational context to avoid assuming this rather sarcastic viewpoint...  
> **username_8**: @username_9 I picked the closest reference I could pick to write my answer. May be C is used somewhere, but I was only explaining my exposure in the industry and the prevalence of C, not the entire software industry's and the prevalence of C.  
> **username_8**: @username_10 I had no idea I was going for sarcasm above. I cannot rewrite the entire answer but I can issue an apology if it offended you.  
> **username_10**: No apology necessary, I am not angry at you. I just like to give feedback for votes.  
> **username_11**: Your reasoning is flawed.  You are likely correct that teaching C is mainly due to inertia preventing a switch to something more modern.  C has little to recommend it for the purpose of teaching program except that *at one point in time* it was the most popular language around.  Neither of these is true for Scheme.  
> **username_8**: Then, Scheme has my compliments that it does not have any of the baggage that C has. Further, I hope that someday, the universities here in India will adopt Scheme so the youth in India can also benefit from it. You know, prosperity for everyone :)  
> **username_12**: Re, "We don't have Scheme in our entire country." Nobody?... in all of India?... has _ever_ downloaded a copy? Well hey! That means you can be the first:  http://www.gnu.org/software/mit-scheme/  
> **username_8**: perhaps some day I will take it up.  
> **username_13**: I suspect they keep teaching C simply because it has *all* the basic concepts, and none of the more complicated ones.  

---

