Don't Make Students Use Eclipse
nora.codes
nora.codes
And you don't even begin to grasp what all those steps you just took in the IDE did until you're at least 1+ years in, and you don't learn what all of those magic words even remotely mean by at least halfway into your second semester.
I felt like every single thing I ever did was magic, never having a clue why it ever actually worked the way it did, and as a result nearly dropped out. The only time things _finally_ started to make sense is when I got to Computer Architecture/Organization with MIPS followed by some work in C.
But for intermediate/advanced classes I think Java is a must learn for every CS graduate.
1. While it is bloated, it has so many modern and not so modern concepts into it, that learning it makes you understand those concepts better. (eg: It is hard to understand Generics if your favorite language doesn't have them)
2. A lot of enterprises (and major tech) backends still run on Java. I thin knowing it is a must to be competitive in the job market as a fresh grad
3. Learning Java (and probably disliking it) it will make you appreciate and perhaps make you better at learning other more nimble languages (aka. GoLang and friends)
Wouldn't have wanted it any other way.
For example, in C# IList<Foo> and IList<Bar> are two different interfaces that happen to have similar methods. Whereas in Java, List<Foo> and List<Bar> are the same interface. This means you can do things like this in Java:
List<?> list = ...
Object o = list.get(0);
To do something similar in C# is significantly more effort. You either have to duplicate all of your interfaces (IList + IList<T>), use `dynamic`, or use reflection to compile delegates at runtime.A common complaint is "but erasure lets you add an integer to a list of strings". But as long as you follow PECS[1] rules you can avoid most of those situations.
[1] Producer: extends. Consumer: super
C# creates one instance of a generic for all reference types. The general consideration in instantiating multiple versions is object size. All reference types are the same size, so not a concern. Value types, however, range wildly in size and so generally get their own specialized versions during code generation.
The same choice effects the ability to wildcard. C# probably could implement wildcards over reference types, but it would feel inconsistent without value types. And, honestly, a good portion of wildcarding in my experience is to handwave away the compiler when you know what you're doing without reified types. Simply not an issue in C# -- its stronger guarantees around generic types means I can make that same code generic over the type I'm wildcarding in Java.
In C#, you can do:
class MyClass : IList<Foo>, IList<Bar> { ... }
In Java, you can't do: class MyClass implements List<Foo>, List<Bar> { ... }
I know this is commonly viewed as an annoying restriction, but, IMO, it's rather an indication that you're writing code that doesn't respect the contract of the generic interface. For example, what should the `Count` property return if you're implementing IList<T> twice? (C# wiggles around this with explicit interface implementations, but I think it's fair to argue that that's not a strictly superior approach to Java's).It'd definitely different if you work for an IT company, but not always.
CS programs aren't to let you make some easy money in the next few years. CS programs are to provide an thorough and high level of computing, from which writing code is just a small part. Having a CS degree much more than learning a language and framework.
If one's goal is just to earn some money in the next few years, he would be better served by taking an Udemy course.
University didn't teach me how to code, I did that myself before going to university. What it did teach was the why's and how's of computing without which I would be just a code monkey churning code without having a better understanding.
It is the same difference between someone who make an course learning how to repair electrical appliances and electronics and the engineer who designs them.
Thanks to C and C++ I did understand the most important bases of programming, how a program runs, how hardware works and the most important algorithms and data structures.
I think it's important to learn something that doesn't do too many abstraction but it isn't too low level like the assembly language.
It could be my chauvinism speaking. I'll admit to having some. My CS program taught us three relatively small programming languages (Scheme first, followed by C, and then MIPS assembly) in the first year before introducing OOP in the second year. So we ended up getting exposure to a variety of programming paradigms and environments, and came away with a lot of tools in our belt, and a fairly deep understanding of programming language theory and paradigms. And I did eventually find myself settled in a Java shop. When I did, I found that within only a couple months I had already developed a deeper understanding of the language than colleagues who had spent their entire careers working in it. And I believe a lot of that is because I had enough background knowledge to distinguish between, "This is how programming is done," and, "This is how programming is done in Java."
And before someone points out that, actually-technically, Java is always pass by value, I will pre-retort that reference-as-value isn't an argument we should ever be having about an intro programming language.
Either teach a systems language with unambiguous pointers, or teach something that abstracts consistently.
I understand why (now), but at the time, it just added unnecessary cognitive load on top of already learning hardware models.
C and Pascal require fewer exceptions, despite a larger base knowledge requirement.
C++ is ok. Students can use a very simple subset of C++, they don't have to use the more advanced parts of it.
C is even better.
Go is fine, too.
Typescript is a good enough choice.
You need to understand
* access modifiers (public/private)
* classes
* static methods
* void return values
* the main() function
* modules (System.out.println)
Just to understand a basic "hello world". It's too much for first-time programmers.
> * access modifiers (public/private)
I think you can omit the "public"s in the Java hello world (thereby making everything package protected, and sneakily sidestep the issue), but I don't want to ruin this machine by installing Java on it to make sure.To be super thorough, you would also have to understand:
- semicolons (and the related issue of newlines being semantically equivalent to normal spaces)
- naming conventions (to explain why it's not "System.Out.Println" and "Main")
Sounds like excellent training for a long and successful career in enterprise Java.
class Test {
public static void main(String[] args) {
System.out.println("Hello world");
}
}
And then javac Test.java
java Test
The class acts as a kind of namespace here, you don't need to go into OOP concepts for hello world at all. The beginner will have to understand* Class is in file with the same name ¯\_(ツ)_/¯ and contains functions (maybe it'll help me later in organizing code?).
* Command line arguments (not strictly necessary concept but not too problematic either)
* Types - why is there String[] in the definition? (A must have in a statically typed language anyway)
* void - the function doesn't return anything (OK)
* public (not OK, some magic here)
* static (not OK, some magic here)
* Compilation vs. run step (a must have in a compiled language)
So IMHO there are just two concepts that could be thrown away. Or three, if you accessed CLI args from a library. But the meaning of public and static will come naturally when the students will learn about OOP.
If someone applying for an architecture degree or engineering degree is required to have basic drawing skills and basic math knowledge, why we shouldn't assume the same for CS?
If I was a teacher and I'm going to teach someone what a linked list is, or what a binary tree is, I can of course use natural language and drawing, I can use abstract algebraic concepts.
But the student should be also able to construct said structures and observe how they work. The same for any other concept.
It wasn't until the final year of my 4 year Software Engineering degree I used an IDE for the first time (Eclipse, actually) and I was totally disoriented, not understanding how all the magic was happening.
The upshot of this was that I didn't have a clue what Maven was until I started working, but you can learn tooling on the job.
Then I found this new kid on the block Python and it was a completely different story. I fell in love with programming and hacking in general and finally at the end of the study I knew enough of python to bootstrap myself with Java which I still think is an abomination.
I can't imagine why people start teaching teens from C and Java and make them think programming is boring and annoying. Absolutely worse than not taking the class.
1. Java enums
2. Java's generics, especially covariance/contravariance with wildcards (erasure really isn't as bad as people make it out to be)
3. Java's standard collections library
4. Java's method override rules (lets you extend return types on derived classes)
5. Default interface methods (.Net has them too now, but Java was first)
6. @Functional interfaces. They may seem a bit funny at first, but they are very useful (especially when combined with default interface methods)
- portability is not a high priority.
- garbage collection is not a high priority.
Those are 2 reasons why you don't want to start with Java. You can teach it later, sure. But it's not a good start.
Here I disagree. I would not start teaching programming in a manual memory language (though that is how I started) because memory corruption is really hard to deal with and completely inconsequential to the basics of programming.
I do think it's important that every programmer should know how to work with raw memory and pointers, but it is a good subject for an intermediate class, after you have the basics of what you are supposed to do while programming.
And then over the next few years it would be great to dissect this. CPU, ALU, ASM, raw memory, network basics, IP (BGP ~ distance vector routing), TCP, buffers, syscalls. RDBMS, MVCC, B-trees, merge sort, heap sort, and so on.
Oh well, one can dream. But usually students are just bombarded with completely disconnected courses.
I struggled with the Java, but got my teeth into it on my own time to the detriment of my marks in other modules. Eventually it clicked enough, I got a degree and walked into a career where my skills have been in demand for 15 years. I'm pretty happy with that, I'd go so far as to say Java was by far the best part of the course for me.
Fast forward to 2 years ago, I did MsC at the same University and most courses were done using Java. I guess that's due to the long arm of Sillicon Valley.
Although Java was used for teaching material, the teachers allowed assignments in your language of your choice if the problem permitted. I did most of the assignments in C#. One I did in Java because I needed a powerful search tool and C# version of Apache Lucene was old. Other people used Java for assignments, one guy was using Python.
I have nothing against Java or using Java for teaching. I think it's better to use Java than Python since it has strong typing, enables parallel computing and it's faster being a compiled language.
However, I dread Java and I avoid it as much as I can. It feels verbose, boilerplate code is too much, it lacks some features. C# feels a lot cleaner. Even if it does have many libraries and enables you to target anything and do all kind of programming, it lacks the massive ecosystem of Java.
If someone would force me to choose between C++ and Java, I'd happily choose C++ if the task permits (i.e. I won't use C++ for web). And that says a lot since I am not very fond of solving the kind of bugs C++ almost guarantees you will have if the code is large enough. I'd rather solve C++ bugs than deal with the boilerplate and bloat and verbosity of Java.
That being said, I don't blame Java or people who designed Java and Java libraries. Allmost all old systems have their share of problems and Java is kind of old now.
Never programming languages and their ecosystems are solving some of Java's problems but if they will still exist in 20 years, we'll see they will bring their own baggage of problems.
I guess a perfect programming language is like an unicorn: we strive to catch it even if we know it doesn't exist.
What matters to me most these days is productivity, the speed something decent can be brought to market. By decent I mean something somewhat testable, somehow easy to understand in the future, somehow extendable and somehow maintainable.
There will always going to be trade-offs, making the right trade-offs based on the particular problem and resources is an art.
What I do instead, though, talk about the architecture and backgrounds, show different ways and let them make the mistakes that help learn to solve problems.
I was thought through Java but it was all command-line and jacvac.
I did once sort a much better programmers final year project for him though - years later that I worked with - cos he had a CLASSPATH issue. That did make me realise there are people thought the way you say that miss some of the basics.
Such a misguided article. The Java language has (quite literally) nothing to do with `javac`. In fact, there's a lot of other compilers out there. Taking a Java class should not focus on the intricacies and weirdness of Java compiler command line interfaces. It seems pretty amateurish to argue in favor of it. Case in point: back in high school, I learned C++ using a Borland compiler (and I haven't touched `bcc` in the 15 years since then, even though I've written plenty of C++ in the meantime).
> ... imports and file naming requirements.
These, again, are (compiler) implementation details and should not be part of a generalized Java curriculum.
> And of course, mathematics is the foundation of computer science.
Stuff like this can be misleading and even though not completely wrong (discrete math, logic, metalogic, mathematical logic are sorta' kinda' similar), it's just wrong enough[1] to lead people astray.
In my personal case, knowing about classpaths the hard way was my only path to salvation. Otherwise I was blindly tweaking IDEs project configs without any idea what was happening.
Learning a programming language has nothing to do with how it's seen by a computer. That's a different class (a class on compilers, maybe). You can even turn Java into Javascript if you want to[1]. The fact that the compilation/transpilation flow here is Java -> Java Bytecode -> JS is meaningless in the context of learning Java.
Learning the syntax of a progaming language might not have much to do with how it's seen by a computer but it's important if you want to learn how to use a language properly. If you don't know how Java(or any language) works fundamentally, the code you write may work, but it'll likely be more inefficient both in terms of program and programmer speed.
Debugging sessions will be more frustrating and take longer and generally the quality of the programs you write will be lower compared to programs written with a language's quirks and peculiarities taken into account. Which you learn by understanding how a language works.
I'm not saying they should be able to write a Java compiler or interpreter, but they should have a decent idea how they work at least fundamentally.
It's harder to learn this when it all happens at the push of a button and you never learn to appreciate that button because you've never had to do it yourself and if something goes wrong with that button for some reason, you won't understand how to fix it or work around it.
Knowing Java runs in a VM very much affects how you have to code. Sure, when you are learning in a 100/200 level class it doesn't, but by the time you graduate if you don't understand the implications, that is bad. Why not make a very simple change early on that gives context for students later on? We shouldn't be teaching students that Java runs in a virtual machine in a 200/300 level class, by that time we should have moved on to why that matters.
Forcing students to continually use java/javac will make them start learning the concepts on how a computer actually processes their program. It makes them think a bit more about it and the concepts are not foreign when they learn it in a full class. The IDE just turns the whole process into a single button with little context.
The author, Leonora Tindall, is a woman.
A lot of my peers in college were very bright and could write great code, but they were absolutely useless as developers because they didn't know any tooling. They couldn't compile, run, test, or source control their code if the professor didn't set it up for them.
Yes, tools change, but the knowledge from one tool is almost always transferable. Once you're comfortable on the CLI and understand the concept that Java source is compiled to bytecode and then run on a VM, it's easy to switch to a new compiler.
If you only want to know the absolute bare minimum, go to a boot camp. People go to college to learn, and being comfortable with tools is an essential part of being a developer that students need to learn.
being a useless developer doesn't make it not computer science. not all of computer science is software development.
IDEs change more frequently.
My point about Git is an example of this. Teaching Git is hard, partly because Git's command line UX is bad, but layering the complexity of, e.g., EGIT on top doesn't really remove most of that and makes it harder to teach (because expressing what to do in a GUI is strictly harder than communicating text commands, among other things).
It's not simpler! It's way more confusing to figure out that your make file told your compiler to run a command with some unknown set of obscure options that are causing an error than to just have the IDE pop a dialog and tell you in plain words, or better, not even let you set an option incorrectly in the first place.
In the CLI, you have to be explicit about what actions are taking place. You have to physically type in what command you want to run and the different arguments to it.
The convenience of a GUI is fantastic, but the abstraction makes it a very bad learning tool. Being able to open up a terminal and fix the inevitable git / build / configuration errors is a very valuable skill that developers should have.
It doesn't matter whether I tick a checkbox for compiler warnings or add that option to the command line. The only difference is the IDE makes options easier to discover.
It's the same for Git. A decent GUI gives you a much better visual picture of the state of your working copy.
Build and CI systems don't go through a GUI IDE, making it required for developers to understand the CLI anyway.
I don't think that's really true, at least for the Java ecosystem which is implicated here. Eclipse does not call out to command line tools for most things, as far as I've seen
This is no fluke! If you don’t know how a classloader works with the Java classpath, how to set various JVM flags for operating the JVM, etc., then I’d argue that you’re an amateur, and I wouldn’t trust you to write correct code in a production setting. It’s critical knowledge to know how your code runs, and if you don’t know that, then stay away from production systems. If the goal of these courses is to teach students enough about Java to use it in a professional setting, then knowing how classfiles are produced, bundled, distributed, loaded, and executed by a JVM is critical knowledge.
More succinctly, if you don’t know how your code makes it to a production server and gets executed, you’re not ready to work on it.
(And if the goal isn't to teach students how to use Java in a professional setting, then why are they learning it at all? Use a teaching language so students can focus on the concepts instead of Java's idiosyncracies.)
But I don't think it is such a key to anything. It is sort of stuff that is easy to learn when you need it, easy to forget and not useful most of time. It makes sense to read when you done learning other things, but not for beginners.
I’d agree that some focus on that in CS programs would extremely valuable. Maybe things are better now, but when I went in 2008-2012 git wasn’t even mentioned and basically all tooling was learned on your own.
Edit - I should mention that my last sentence was the perspective of 18 year old me. I was 18, but in my defence I was 18. :)
The problem is the IDE makes it so easy to never have to look under the hood, to the point when people take a peek the get overwhelmed and quickly return to the comfort of the IDE.
However, in real world of production environments there will be no IDE holding your hand and as such you can't get away without a good understanding of the engine under the hood.
In real world, you always use tools and in real java world there is always ide or application server or something.
Plus downloading the actual Java SDK was confusing, the versioning, it not being free anymore...
> These, again, are (compiler) implementation details and should not be part of a generalized Java curriculum.
In Java, these are language details. You cannot write Java without following them.
Eh, javac is the reference implementation and the language specification makes several references to it, it's also by far the most widely used. It's also good to understand what goes on behind the scenes in your IDE because the IDE is even more removed from the language than the compiler. C++ is somewhat different because it does not have a reference implementation and has a somewhat more diverse set of implementations. Though I think it's still very useful know your way around the gcc or clang command line.
> These, again, are (compiler) implementation details and should not be part of a generalized Java curriculum.
Imports and naming are not implementation details... they are defined in the specification.
The only thing you need an ide for is autocomplete and refactoring, and in a small project like you have in school, it’s simpler to use a text editor imho and you can fully understand your project that way too
Using the tools directly serves to re-enforce all these concepts.
They can get to know other tools for that same language like in your Borland example, sure. But if you didn't know the compiler existed, you would be in trouble. And in C you will also want to understand the preprocessor and linker.
I also think that Java is perhaps the worst possible choice for that.
It's a language created with the "build once run anyway" mentality that tries to abstract away the system, it's the poster child of languages married to an IDE, and verbose to the point that forcing people to write java code without autocompletion features probably violates the Geneva convention.
At this point in time if you want your students to learn about tooling it would be more useful to teach them to use chrome's JavaScript console than to teach them to use a Java compiler through the command line.
I'm happy to use just emacs. The naming conventions make it easy enough to remember. I've never been a fan of heavy IDEs. Maybe that is just me as a solo developer/entrepreneur, but I don't think that I am the only one.
Once you decouple yourself from the IDE and all of the bloated enterprizey (ahem spring) frameworks, it is actually pleasant to work with. Most of that stuff is superfluous when you have a command of the environment.
There's more typing with a text editor and javac, but it's much simpler to understand IMHO.
All of this must be understood in the context of first year programming. For my class, there were no libraries that one needed, and at most 10 or so java files to compile. The classpath would never need to be more than the working directory.
And to this day I find junior devs struggle with the same things unless they have a maven/gradle project all set up for them.
I'm all for folks learning these skills eventually, but in a first-year CS class I'd really rather students worry about the language and general concepts of writing software.
Lots of javascript tutorials start off with opening and browser's javascript console and typing out some simple stuff and I don't think people would tell them they need to jump straight into node.js and webpack.
All the other intricacies of writing systems will come to them but I find something uniquely wonderful about sitting and writing code, and if we're lucky we'll find students who can have that same experience. I'd rather meet them where they are and talk purely of the language and core concepts, and introduce them to the ugly details as their progress dictates.
Especially if it is their first experience writing code. Until a student learns to tolerate the discomfort of "the machine isn't doing what I want for some inscrutable reason", it makes no sense to throw them into package-management errors.
Working for many years in the python world professionally some people are still amazed that I'm essentially using more or less a normal text editor. IDE is optional for many languages but for some languages it's a strong requirement.
And it was as painful as you'd expect, put me right off Java (most of my learning was in Python), and didn't really teach me much that I now use as a developer in a JVM shop.
For other languages, e.g. go, which i currently like, I don't use an IDE because I don't feel like I need one.
In my opinion IDEs are often just a crutch for bad languages and I can understand the sentiment in the article, but yeah, java.
Personally I’m still shocked that learning the common build tools for whatever language is used for a CS course is not the standard. If you’re teaching Java you should be teaching Maven, if you’re teaching C++ you should be teaching CMake. Not to the “I can write my own plugins/macros level” necessarily but at least to “I can create a project that will build without my specific IDE or needing to recite compiler arcana”.
Nobody in their right mind works without these things, and while knowledge isn’t going to directly transfer from one to the next you should at least have enough to know where to look in the documentation for “how do I specify dependencies”, “how do I tell it where to find my source”, etc.
For a first year course where you aren’t pulling in the kitchen sink the IDE project format works well enough, but if you’re entering the workforce you should know damn well how to create a basic project in the standard tools of your language of choice.
no you shouldn't, because the premise is invalid. A university student shouldn't be "learning java". They should be learning programming, and theory of computing (and algorithms etc), and perhaps use java as the language. None of this requires maven, build tools or any tool chains beyond some unit testing framework (and GUI framework if displays are necessary).
Don't teach "industry standard tools" to a uni student learning CS.
I would not expect a new graduate to know maven, or know the intricacies of the spring framework. That's something to be learnt on the job. I expect them to be capable enough to learn this on the job - given that they're well versed in the theoretical aspect of computer science. It's easy to explain maven's core by telling them that it's a directed graph of dependencies.
A student that just learns the "industry standard tooling" should need a bootcamp, not uni degree.
What is the real world difference between "learning java" and "learning programming, theory of computing (and algorithms etc), using java as the language"?
Surely to learn all that shit (using java as the language) you at some point have to, you know, learn java?
Pretty sure they're reading "learn java" as "learn the language + the common build tools + more", instead of just the language, as we are.
Almost all beginners absolutely need to be taught the language first (so they have something concrete to mentally latch on to), not concepts and algorithms. However, Maven is not one of those things - either a GUI with a compile button or "javac" is sufficient at that level.
Programming with a build system, with a vcs and/or an editor with intellisense features will unnecessarily burden the student with learning these extra things. vanilla java, taught using a pure text editor (like pico, or notepad++, that has a simplistic syntax highlighting), and make sure the students type out their own imports, etc, is going to teach them more basics.
Until the day you need to build actual working software to ship to people, there's no need for a build system, and until they need to work in groups, there's no need for VCS. And until they start writing something _very_ complex, like a full game using many libraries, they don't need intellisense.
Most CS exercises fit in one class. And when it comes time to design something reasonably complex, the student would've learnt all the fundamentals (like 6 months in), and can move to using an IDE with little issue. And then when group projects come, the students can learn VCS as it makes group work simpler. But till then, showering the first year student with these tooling is just noise.
VCS is essential in a solo project of any real complexity because you will reach intermediate milestones, go off on tangents that don't pan out, and then desperately wish you had a way to get back to the working state you had hours previously. A true VCS with branching and merging is technically overpowered, since you could just make copies of the source for each "commit," but you may as well just use Git.
Build system is not about shipping to people, it's about running what you just wrote on your own machine when it's bigger than one unit of compilation (C file, Java class, whatever). You don't need anything fancy, can just be Make or a shell script, but building and running the whole project should take no more than a few keystrokes. Kids should be fumbling with GCC flags for maybe one assignment, not 4 years.
On the very first day of programming, all you need is a REPL. But once students are doing programming projects of nontrivial size, they should be invited to try incorporating the tools that make them manageable.
This is the critical point. By the time a curriculum is in place around one set of "industry standard" tools, new tools will have come out, in a lot of fields (see, for instance, `npm` and `yarn`.)
> They should be learning programming, and theory of computing (and algorithms etc), and perhaps use java as the language.
I would argue that using Java as the language for introductory CS courses is not a good idea. We have better, simpler languages to teach foundational functional (Racket, Scheme) and imperative (Python) languages.
There's nothing wrong with Java in general, but if your goal is teaching "programming, and theory of computing (and algorithms etc)", there's nothing that Java can do that Python can't that helps with that goal.
In fact, I'd give my optimal progression of languages as starting with Python for basic imperative and OO programming, or Racket for basic functional programming, then switching to the other one, and then looking at Kotlin (or Java if you really must) for advanced OO programming and C (or, in a few years, maybe Rust) for systems programming.
I've been programming very advanced C++ for close to 20 years now.
Never had any reason to use CMake.
Plain old make for when you just want to build something without expending effort and brain cells, or (nowadays) nix if you're putting together an industrial-strength build environment.
CMake is the worst of all worlds, and provides no benefit unless you really want to build Windows exe's with Microsoft's proprietary tooling. (And let's face it, Windows is a legacy dying platform here in 2020.)
This is a big part of why I recommend that another language should be used to teach introductory level courses. Java has too much additional complexity. That complexity has benefits in production, but not for first-year undergrads.
I started my programming career writing C and C++ using the cli and a text editor.
Some years later I ended doing some Java and to me I found it quite easy as I could see similarities with things I had learned writing C and C++.
I could see the classpath and jar files where roughly equivalent to the concept of libraries and libpath found in the C and C++ linker (only much easier to use) and the javac was roughly equivalent to the gcc or g++ command line compilers.
I transition quickly into more visual / abstracting tools, but that first foray into the guts really helps ground me with a better understanding of what's actually happening.
http://web.cs.ucla.edu/classes/spring20/cs131/homework.html
The languages change over the years, but the goal is to have them touch different programming paradigms.
"Universities should offer a class on comparative programming languages and language tooling." is much different than "Intro-to-programming classes should not have a strongly-recommended IDE"
The assignments aren't trivial. Take look at them:
Understanding the details of packages and javac and other things should be left for a later class which can put them in the context of other languages.
Very interesting to see how our mind is shaped by the tools we use.
There is no question in my mind that you are correct, in principle. But I wonder if what you propose would in fact result in higher attrition rates. With the current approach, the majority benefit from an IDE that reduces the 'cognitive surface' of the "programming environment", and for those who prefer or gravitate towards the underlying layers, no one will prevent them from firing up e.g. Vim and maven.
That said, yes, don't make students use Eclipse. Make them use IDEA or VS something. /g
I don't think that it's true that the general goal of University of CS programs is to prepare students for the software dev industry.
Hell, they're even learning version control (mainly Git, some SVN) in CS degrees now, which was a nice change to see start coming through in the grads we interview.
Although we're seeing universities now start offering Engineering degrees in software with a far more "real-world" requirement including mandatory internships and an industry sponsored research project.
University programs as I know them prepare the enrolled for a career in science and are typically far removed from concerns of practicability or applicability.
And even then, we only have them for the trades - plumbers, sparkies, joiners etc.
- C
- Python (+ Flask)
- JavaScript
- SQL
I think this was the order. They learn C the most.
It feels like the use of Eclipse or IntelliJ in intro CS courses is so common in large part because Java has such relatively complex tooling and language conventions. I've never seen someone intro Python with an IDE, because it's extremely easy to use Python without one. The same goes for C, and indeed all of the intro C classes I've seen have gone without an IDE. Java, though... you really could spend an extended part of the course just getting everyone setting up their first file and using the compiler correctly, if it's the first language.
Using an IDE in Java is a choice just like picking PyCharm is for python.
While that's partially true of Java, it's less true of Java. More of the tooling around Java is de facto required.
It is both, but I started with the IDEs because they are the chicken of this chicken and egg problem. Java is too complex, so schools reach for IDEs, which just makes things more complicated, et cetera.
If a standard development environment could be devised that hides the incidental complexity of Java without hiding the essential complexity of file systems, etc., I think it would solve the problem just as well as teaching Python.
It was tedious as hell to learn everything else in real world development, like static versus dynamic linking, include/linker paths, make, system libraries, and so on. Like as in myself nor my classmates would have any idea those things existed after two semesters of C++ programming courses.
The moral here is that education needs a degree of breadth. Teaching CS students involves three concepts - Computer Science, Writing Code, and Writing Software. The dependency graph between those topics on what knowledge and tools are needed contains cycles.
Not sure why the aggressive comments here, but I agree with this. IDE for learning programming ends up shielding you from reality that you should probably understand before you use an IDE.
An IDE is fine to hide programming related magic for a beginner, but if it needs to hide things like a filesystem, file extensions, navigating through advanced options in simple software like word and internet browsers, or how to use google to help diagnose technical issues, that person is in way over their heads.
This is might be an argument against a particular IDE setup for a class, but it isn't an argument against IDEs in general. Instead it is an argument for providing a config file to make these problems go away.
> When students have only ever programmed in Java using some bespoke learning library provided by their professor, it will take them much longer than necessary to figure out other languages, other libraries, and other approaches.
The article doesn't support the case that an intro class using an IDE prevents students from learning anything else. The class doesn't set people back--it merely fails to move them forward in that way. I agree that it is important to teach this eventually. But it should be through teaching it deliberately. (EDIT: Someone else posted a link to a class which compares different languages and their tooling side-by-side. That sounds fantastic.)
I have yet to see a class which can do a good job of teaching how package management works to a degree that the student can then confidently debug weird setuptools errors.
I've been looking for such a class since 2009.
http://charlespetzold.com/etc/DoesVisualStudioRotTheMind.htm...
> This is valuable in an introductory course, as it avoids wasting class time and lowers the barrier to entry
and then proceeds to argue why other things are more important than that.
I don't like Eclipse or other IDEs, having watched my fellow students get stymied by basic issues that I could resolve with one or two relatively simple instructions on the command line. I think IDEs can be a crutch that programmers ought to learn to do without. Learning what the "real" tools are will pay dividends—quickly too.
That being said, I think it's important that the barrier to entry be low. Java almost necessitates the use of an IDE. There's so much "enterprise" cruft involved in doing the simplest things that, unless you have an IDE to hide it, you're going to confuse beginners.
A better choice of language and tooling can help here. I think starting off with something like Racket would be best. Those who need an IDE (out of laziness, familiarity, whatever) can use DrRacket, and then switch to running their programs from the command line shortly thereafter with next to no transition overhead.
Nonsense.
If we went this way, young people would get completely turned off from programming in the first hours.
Show them Python, Javascript, Scratch. Get them to display something on the screen, anything.
Get that spark.
And once they're hooked, now you can start showing them more details about the wonderful world they have just uncovered.
The author of this article needs to spend a solid five more years thinking about computer science and education because right now, her writing is just dangerously naive.
she[0], but yeah.
The first skill is learning to program, and in particular learning to program data structures, or algorithms, or whatever. For this you don't care at all how your code builds, you care about correctness and easy to use testing infrastructure, and an IDE like IntelliJ or Eclipse is going to be almost frictionless for that. Teaching command line necessities together with this provides nothing of value for this skill. If I'm trying to get an algorithm right, I don't care at all about how my code builds, I care that it is easy to hit the "recompile and run tests" button. I also think that Java is a decent choice of language for this.
The second skill is learning how to build, version control, package and distribute software, and for this you really need to learn the common tools used in the industry. Which in addition to the IDE, is use of the Unix/Windows command line, git, compilers, Makefiles and build systems, and so on. Here you really need to care about the details - for example, such a project could be to take a previous project and package it so that it runs on a computer without Java/Python/etc installed.
I think the problem is that many universities never have a course on this second skillset, and so while for teaching the first skillset they choose appropriate tools (in my opinion), they leave this second skillset behind completely. But I think the debate is more nuanced than IDE = Good or IDE = Bad, I think we should carefully figure out what skills should be taught, and what the best way to teach those skills are, keeping in mind that for a lot of first-year university students this may be their first introduction to using anything other than a web browser, office programs, and video games on a computer.
This is absolutely spot on. I used IDE Good/IDE Bad mostly as a way to get people to think about this, and clearly it worked :)
Out of interest, your original article pointed out the potential use of repl.it as an alternative to Eclipse and friends, but isn’t it still the whole build-in-a-box experience?
I've worked with enough really good developers who were lost when not given an IDE. Most of the time, it takes a few days to teach "here's how to build at the command line" and here's how to use git (followed by the eventual day lost to finding a way to break git completely). The IDE centrism seems especially common in Windows and Java shops (and every Java shop I've worked with was using Windows).
U.S. drivers licenses are too easy to get as it is... I don't think my sister even had to parallel park on hers.
I think you would find that the vast majority of drivers in the US don't parallel park even once per year. Furthermore, an increasing fraction of new cars can park automatically.
The chief value of having a road test, in my mind, is to force most teens to learn to drive in a structured program that introduces rules of the road and safe habits. Parallel parking is rare and not dangerous, so we shouldn't waste the limited hours that teens spend with professional driving educators on it.
In the UK, I had the exact opposite experience. Immediately after passing my test, I was parallel parking daily, and I've frequently been in situations where parallel parking is the only way to find a parking space. IMO it _would_ have been dangerous had I not learnt how to do it and was confident doing it. I'd have likely have been too distracted thinking about what I'm trying to do rather than paying sufficient attention to my surroundings. I know I was when I was first learning, and I failed my first driving test because I didn't adequately check my surroundings before starting to reverse.
An auto transmission is so much better in every respect, and the performance improvements in manual hardly comes into play during every day use.
I consider the ability to use manual transmission vehicles, of which there are many, a benefit. Last year I visited my aunt for a week and traveled around the state with her in her car. I couldn't share in the driving, because she has a manual transmission.
I'm not saying you can't be a productive professional without knowing lower-level fundamentals, though I don't think you legitimately lay claim to be an expert in the field without them.
Also, in the last section:
> or UC Berkeley (oh, I’m sorry, “Cal”)
A bit off-topic, but as a Berkeley student, I was a bit amused/confused here, what's the sarcasm in the parenthetical about? According to our official branding guidelines[1] both are acceptable, though Cal is mostly used in athletic contexts.
[1] pg34-35, https://brand.berkeley.edu/wp-content/uploads/2019/07/Berkel...
Mostly a dig at the UCB faculty and admin, who act like they're better than the rest of the UC. (I'm a UCSD brat.)
When you ask them to put a breakpoint somewhere you get a puzzled look back: "what's a breakpoint?".
They don't even know that debuggers exist!! Instead they add printf all over the place, recompile and rerun. Mind you these are people whose CV claim 5+ years of experience.
It's terribly ineffective. University should teach the fastest way to iterate logic, Being able to pause your code, introspect the data and then step through it slowly line by line is the best way to really understand and learn the theory of what is going on. Autocomplete is also a fantastic inspiration on what else that's possible to do that's not covered in your lab handouts.
How to import libraries and configure your build system will come later by necessity and will have changed by the time you start your next project. Knowing that debuggers exist and how to use them is a more general knowledge and it's something you have to be shown first before you miss it, (if Henry Ford asked what people wanted they would have said faster horses). Build systems and compiler flags can also be very challenging and uninspiring to understand before you even know what a linked list is. As someone else said below, after decades of experience i still have problems understanding the intricacies of CLASSPATH, or PYTHONPATH, ask a student to get this right and they'll just blindly copy-paste the first answer from stackoverflow so they can continue their printf-debugging session and finish their assignment before deadline.
This is all trade-school stuff, really. It's like learning how to wire electric power, with wire size, type, and color rules, fixtures, grounding, and in the US per the National Electrical Code. There's little academic content there; it's just a mass of detail. Not too hard if it's written down and the documentation is current. Which it won't be at many companies.
An argument against teaching the details in college is that students will need to know the one they're using in great detail. Knowledge about unrelated build systems doesn't transfer much.
Then there's the machine learning parallel universe, with notebooks and YAML.
* Online tools to run & visualize code execution directly from the online textbook (ex: https://composingprograms.com/pages/16-higher-order-function...) * Easy submission for students (no git in CS1, no scp, no printing) * Instructor autograding for all assignments so the course staff could focus on reviewing code for style/other components. * Automatically backing up student code * In some assignments, there were automated hints for syntax, styling, and even correctness [2, 3] * Online collaborative editing for partner assignments [4] * Full time staff allocated to building teaching infrastructure to "reduce accidental complexities when using code to solve problems" * Completely hosted environments (via Jupyter Notebooks or Scratch) for courses with a lot of non-majors.
[1] https://cs61a.org [2] https://dl.acm.org/doi/10.1145/3059009.3059058 [3] https://okpy.org/about/publications/ [4] https://www.youtube.com/watch?v=polTBnMXGQI&rel=0
I'm not sure what the difference is between a student learning about Eclipse idiosyncrasies or .DS_STORE files. One topic is as pointless as the other.
Autocompletion and integrated documentation do increase discoverability and learning of the language, not the reverse.
BTW intellij has launched an IDE specialized for teaching: https://blog.jetbrains.com/idea/2019/10/intellij-idea-edu-ea...
Most of the problems the author is pointing out existed there as well.
The author is misguided in assuming that IDE's are the cause.
But I greatly disagree about students using IDEs on languages like Java. Getting familiar with debuggers, stepping around, that's absolutely a necessary skill--unless you want to go into stdio, or echo based debugging (which is what I'd do with the languages above).
I get it. It shields them from understanding what's happening underneath. But not everybody is interested or needs to know all the things happening underneath, and its okay. If they're going to learn the whole stack, they will.
"public static void main string bracket bracket args"
"public static void main string bracket bracket args"
kind of sad that my first exposure to programming of any kind at University was just repeating that mantra.
public static void main(String... args)
;)In many ways Eclipse is one of the less problematic IDEs because it does expose a lot of the underlying warts... it's one of the reasons people dislike it (among others, to be clear - memory usage, less fluid ergonmics in many other ways). But one of the reasons I have stuck with it is that, like when you understand Git at a fundamental level it all "makes sense", Eclipse has a better direct relationship to the underlying mechanics than other IDEs I've used.
Much less mental overhead and less things to worry about on the Linux command line. Plus, I can do more with the commandline tools.
I think students in general will be more versatile if they start with the command line, and then graduate to Eclipse. That way, they'll realize what they lose and gain in an IDE.
I do not understand the Java bashing. Python is nice, but it is an interpreter, does not compile, link or create executables. It misses so much in the compilation chain that it is neither a good language in the regard of this post.
C++ has all, but well, editors are crappy and pointers for a first lesson student are hard.
* Year 1, term 1: ML, on a Windows machine, using Cambridge ML (for the practicals; the actual course, Foundations of Computer Science, used any Standard ML and recommended Moscow ML)
* Year 1, term 2: Java, on a Linux machine[1], using javac; Eclipse was introduced in another course
* Year 2, term 1: Further Java, on a Linux machine, using Eclipse, Verilog on a Windows machine with a DE2 Board, MIPS assembler using a soft processor (same board) plus one or both of:
* * C/C++, non-compiler specific, no recommended IDE/editor, must run against gcc -std=c99 -Wall --pedantic sourcefile.c or g++ -std=c++98 -Wall --pedantic sourcefile.cc (your choice) with no warnings
* * Prolog, on a Linux machine, using SWI-Prolog
* Year 2, term 2: Group project - group's choice (we used C on an Arm mBed board in whatever IDE that came with and Java in Eclipse)
Everything else (the bulk of the course) was either abstract/theoretical or used you/your supervisors' choice of tools - courses used a varying mix of pseudocode/ML/Java/C where useful, but you didn't necessarily have to use them outside of the lectures and there were no practical exams on these (someone I knew used Haskell for his group project and dissertation, and for testing concepts in supervisions).
The idea was to make you comfortable with the fundamentals and moving between technologies, and not be reliant on any particular set of tools. IMO, the contrasting concepts (Windows vs. Linux; functional vs. object-oriented; high-level vs. low-level; hardware vs. software) did this rather successfully. It didn't necessarily get you completely fluent in any particular language (you were largely expected to do this in your own time if it was a direction you wanted to pursue), but it did prepare you for jumping into pretty much any language/environment and getting up to speed quickly.
(There were also digital electronics and physics practicals in the first year, but they're a bit of a different thing)
[1] It gave you enough bash to run javac and manipulate files. There was a follow-up course the next year that went into a bit more depth on shell, and introduced make/Perl/LaTeX/MATLAB.
When I took courses in the late 90's & early 00's, from assembly, c++, java and python the focus was on minimal text editors and command line compile, link etc. Though for python, Idle was promoted, but that's pretty bare bones relatively speaking.
I wasn't aware that a shift away from basics had occurred.
The question is somewhat loaded given the previous statement based on my own biases but I've never written java professionally so excuse my ignorance.
But after like 2 files, it's easier to learn the language due to autocomplete and errorchecking.
The whole compilation / dependency stack, well I don't think that's the issue here.
So "for computer science students".
Which seems like too major a thing to miss out of the title.
Also, how does webdev fit in here: seems like webdevs should probably be using IDEs from lesson 2. And I say that as someone who started their web content production path writing HTML in pico.
I don’t think students should start with Eclipse - it’s a while learning curve on its own.
But they should definitely be familiar with it by the time they graduate.
It’s not unlikely that a programmer with a full-time job could put in more hours in just one month than a student would for an entire introduction to programming paper.
It’s unrealistic to expect to be able to cover all aspects of programming in such a short time.
I take exception to this line of thinking. Students should not be using the command line for programming. I believe that forcing students to learn to use command line tools is the reason why so much software has such horrible user experience. They learn that users don't matter unless they've steeped themselves in the arcana of each particular program and have practically become programmers themselves.
> Second, it catches some basic mistakes and allows the student to defer learning about the finnicky language requirements that aren’t deemed core to the curriculum, like imports and file naming requirements.
I had the exact opposite experience. At university, they sat us down at a Unix shell with almost no instruction on the shell or the compiler. We spent so much time learning the finicky shell requirements (and which we had no clear understanding were part of the shell and not the compiler itself or something else), that we were sidelined from understanding what the compiler was telling us or how it worked. You'd run your program and if it gave you an error 11, well, you just read and re-read it until you noticed something off.
Nowadays with an IDE and a static analyzer, it can show my code and show the exact path of execution that will lead to an invalid memory access before I've even run it. Students can learn to find problems themselves because it's laid out right in front of their eyes in relatively-understandable java or C or whatever language they're programming in. They don't need to worry about, "Oh when I compile on this machine, I have to specify the -I argument to the compiler for includes, but on machines I actually use in real life, I don't have to specify anything because it finds all the files I'm actually using because I put them into the IDE myself and can see their relationships."
> it’s crucial to introduce these inconvenient details eventually.
Why? If I'm going to be downloading my IDE from the Internet or an App Store why the heck should I ever learn fiddly Unix commands? I'm writing GUI-based applications. I don't need to understand any of that crap if I don't want to. It's like saying you can't be a taxi driver if you don't understand how the carburetor works. Really? My job is to drive the car around, not to fix it. I know a good mechanic who can do that if the need arises. If they want to learn it, then all the better, but it shouldn't be a requirement.
> What they can’t do, unless they’ve figured it out on their own, is operate a computer outside of the confines of the IDE they’ve been taught.
On the contrary, I had no problem operating the GUI-based computers of my day. It was the bizarre, often contradictory commands in the Unix shell that baffled me. Their names were often stupid puns, their "help" pages did no such thing, and I wasted years learning a bunch of stuff that ended up not being very helpful in the real world.
> When students have only ever programmed in Java using some bespoke learning library provided by their professor, it will take them much longer than necessary to figure out other languages, other libraries, and other approaches.
That has nothing to do with IDEs. That has to do with a deficient teaching environment, and is the exact same problem I described above, which sounds like what the author is advocating.
> Teaching someone to use git is very difficult if they’ve never been taught that a file is an logical unit composed of bytes and metadata.
No, teaching someone to use git is very difficult because it was designed to be difficult because the self-absorbed creator thinks that people should have to suffer to become good programmers. It's just sadistic.
> Students need to know how to use computers before they can program them in a serious way.
I agree, and what the author is proposing sounds like the opposite of that to me.
> After the first foray into programming, take time to teach students about the UNIX command line.
Ugh. I disagree strongly with this sentiment. CS students need to get away from the mentality that Unix is the be-all-end-all of operating systems and programming environments and the quicker that happens the better in my opinion.
When you hire a developer you usually need them to also be at least be something of an expert computer user, especially if they're going to be working on a small team without 20 other experts to micromanage them.
Over-reliance on the IDEs leaves people appliance operators that are lost when there isn't a magic button to press.
It isn't just an issue in the job market. "Programmers" who aren't sufficiently advanced computer users can't advance their own projects in academia either-- they're stuck working on precooked assignments. I suspect this is one of the forces that has resulted in academic research being utterly starved for competent software engineering (though the main one remains that competent software engineers can get stable high paying jobs, and academia provides them with neither).
At some point, the training wheels need to come off.
Understanding what a file is and what a text editor should be prerequisites for entering a computer science department. Someone who doesn't understand these concepts has no business learning to program.
At my "not MIT" school, it was expected that most incoming CS students understood some basic programming before they entered school.
A CD department that tolerates students who don't know what a file is probably has other problems.
I never did any programming before my first year, I was planning on going into economics. But then I took an elective in CS and it became my major. I wasn’t alone either, most of the students were not programmers previously.
At Cambridge (UK), this is _not_ the case. They merely note that "some knowledge of procedural programming is useful"[1] and "[n]o prior knowledge of programming is required"[2]. The main thing they are looking for, in terms of qualifications, is mathematics, so you'd typically see an A-level in mathematics plus two further ones in further mathematics, the physical sciences, or computing depending on what your school offers.
At interview (for two colleges), I was not asked about programming - the first was purely mathematics based, and the second was primarily maths based with some CS concepts introduced to see how you thought about and were able to manipulate the information given in the interview. It's not something you were necessarily expected to know.
Until this year, the introductory CS modules (making up 25% of the first year's content) were available to natural sciences students, so you would have students from a fairly wide range of backgrounds _successfully_ learning CS and to program (the maths modules, also making up 25%, are still shared, for what it's worth).
[1] https://www.cst.cam.ac.uk/admissions/undergraduate/entry
[2] https://www.undergraduate.study.cam.ac.uk/courses/computer-s...