first I want to apologize for my bad English.

I am a teacher at a secondary school in Germany. Some of these students specialize in computer science.

Maybe I am the teacher of one of these courses next year

The students have to learn these basic concepts in the first year:

  • variables

  • constants

  • types

  • operators

  • conditionals

  • loops

  • arrays

  • IO

  • GUIs

  • exceptions

They also have to learn these OOP concepts

  • objects

  • classes

  • constructors

  • attributes

  • methods

  • encapsulation

In the second year, they learn about

  • inhertiance

  • interfaces

  • polymorphism

  • associations

  • overloading and overwriting of methods

Most of the students have no prior experience in programming. There are only two or three students in every class that learned to program in their free time.

In another parallel course, they learn some basic C.

Teachers at this school and on a lot of other schools use Java to teach these concepts.

I also think that Kotlin and Python are good beginner languages. I think the advantage of Python, is that it looks very friendly and you can use simple editors like Thonny for it.

The advantages of Kotlin are the type system and the C-like syntax. Unfortunately you have to use InteliJ for Kotlin.

I really like functional languages like Haskell and OCaml but they obviously don't fit to these OOP concepts.

I am very interested to hear your opinion about the best language for such a course.

  • 2
    $\begingroup$ Have you seen some of the existing threads, like What is a good introductory language for high school?? That said, it's hard to argue with Python or Java. Both are basically ubiquitous in education and industry. Kotlin, Haskell and OCaml seem like sidelines for specialized uses that won't transfer well to other classes or industry. Kotlin isn't too wild an idea, just not top 5 language material yet, mainly used for mobile app development, which is well out of scope of your curriculum. $\endgroup$
    – ggorlen
    Commented Apr 14 at 9:20
  • $\begingroup$ I didnt saw this thread. I saw this link. I know that Haskell and OCaml are not a good choice for this course. The OOP-concepts are not a part of Haskell. $\endgroup$
    – brucesp
    Commented Apr 15 at 6:18
  • 1
    $\begingroup$ @brucesp the "not having OOP concepts" is exactly what makes them excellent for learning at the very initial stage. See also the language used in HTDP, specifically designed for those learners. $\endgroup$
    – user9137
    Commented Apr 17 at 17:57
  • $\begingroup$ @brucesp I recommend also reading over my answer to a similar question here: cseducators.stackexchange.com/a/6379/9157 $\endgroup$
    – lfalin
    Commented Apr 27 at 13:47
  • $\begingroup$ What did you mean secondary school, is it high school or less well known university ? $\endgroup$ Commented May 24 at 10:42

4 Answers 4


HTDP and the language therein used and specifically designed for initial learners.

It has everything needed, but especially and most importantly it lacks everything that must be postponed.

  • $\begingroup$ It is also missing a substantial amount of the features that were listed as requirements in the question. Note that secondary school teachers in Germany don't have the freedom to just not cover certain topics if they think they are not important. The German curriculum was very much designed with mainstream OOP languages in mind, and while I personally sympathize with the approach of using a LISP-like language for the introduction, it's just not a good fit for this particular situation. $\endgroup$ Commented May 7 at 9:42

For those topics to be covered above, I always use Java.

In our school system, high school/middle school already tackled C as one of the programming language they learned in their computer classes/subjects. I prioritized that the next language is easy to be recognized for my students to catch-up.

For Java, it is easy to setup to your student's computers (whether it's Windows, Mac or Linux), and they can use any free IDE to link to the compiler (I usually recommend VSCode or Eclipse, both are free and being used by DevOps and SysEng in the industry/corporate work), and they can even have it even pushed to GitHub to learn basic versioning control (and easier to check assignments and lab exercises there too).

I usually use Java for college programming 1, OOP, data structures and algorithms subject.


The best language is likely whatever language is most familiar to them.

Particularly in early development, there is little to recommend switching programming languages without good reason. The goal at first should be depth, not breadth. It is fairly easy to move what you already know to a new language, but switching out languages is an impediment for a month or two while you adapt to the new language. This is a month of two in which the progress your students make will be needlessly limited.

A course in C is not a needless switch, since the concepts taught are substantively different, and it is hard to teach the systems programming concepts you encounter in C in Java, and hard to teach the OOP concepts of Java in C.

If the students are coming in with Java, stick with Java. This will give them the best progress within the time you have in your course.

  • $\begingroup$ Sorry, I didn't made it clear, that we assume that these students have no prior experience in programming. There are only two or three students in every class that learned to program in their free time. $\endgroup$
    – brucesp
    Commented Apr 14 at 6:33
  • 1
    $\begingroup$ @brucesp Are there other teachers in the program? Ideally, year 1 and year 2 would remain the same language, so this would be an issue to coordinate within your department. That said, the vast majority of programs that teach imperative programming begin with Java or Python, with Java by far the most common starter language. I suspect that Java is so much more common because of the advantages to keeping it for the second year. $\endgroup$
    – Ben I.
    Commented Apr 14 at 18:02
  • $\begingroup$ Yes there are other teachers, but one course has only one teacher for all three years in software. There is another teacher for hardware for the same course. I also think that Java has benefits, because it is widely used and you it is good to learn OOP concepts. But maybe the benefit of Python is that it is easier to get started. The students are 16 or 17 years old and most of them never programmed before.They are also not used to think abstract. $\endgroup$
    – brucesp
    Commented Apr 15 at 6:23
  • $\begingroup$ @brucesp Then it sounds like you are headed in the right direction. In your circumstances, I'd choose my language mostly based on years 2 and 3 - what do you ultimately want the students to achieve? Both languages are strong choices. $\endgroup$
    – Ben I.
    Commented Apr 15 at 15:50

Go with Python.

Python has a number of advantages that make it uniquely well suited for your situation:

  • It is very easy to set up. Installing a Python interpreter is straightforward on any platform and many environments will already come with a pre-installed interpreter. This is absolutely essential since you want students to be able to play with the language at home on their own machines. There is no compilation step required. You don't need to talk about build systems or even IDEs for quite a while. Be sure to point out the differences between Python 2 and Python 3 to your students though, as that can be a common pitfall when setting up a dev machine on your own.
  • Python's programming paradigm aligns well with the curriculum you are describing. It has all of the required features and seems to be a good fit for this kind of course.
  • Python is extremely well documented and accessible to non-professional programmers. Your students will have no trouble finding additional material to either deepen their understanding of what is covered in the course, or expand their knowledge to new topics.
  • Python has real value to students outside of your course. Be sure your students understand its potential for use in mathematical, science or economics classes and even for personal use at home.

That being said, Python has one major disadvantage from a Computer Science perspective: It's not a good language for Computer Scientists. It's untyped, it encourages writing quick and sloppy code, and it often hides away the essential properties of the code behind convenient syntax.

For a secondary school course, that's okay. Strong typing can be perceived as discouraging and frustrating. Languages with a lighter syntax like LISP or Haskell require a high degree of abstract thinking that is often beyond what students at this age are willing to put up with. If your class seems particularly motivated and time allows, give them a glimpse of how those other languages approach problems in a different way. But let Python be their main vehicle for this initial journey.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.