Should Students Be Taught With or Without an IDE?
bblazer asks: "Beginning this next school year, there is a strong possibility I will be teaching an intro to Java and an intro to Python course at the local community college. I was wondering what the prevailing wisdom is when it comes to teaching languages - should students be taught with or without an IDE? I am a bit old school and wouldn't mind having them all use vi or emacs, but using a good IDE does have some advantages as well. I should note that the students I will be teaching will have had at least 1 semester of programming in VB or C++." Even though there is limited time in a semester, could a curriculum be constructed to accommodate both methods?
I'd have to go with a non-IDE approach initially and introduce an IDE later on so as to avoid teaching dependence on something which shouldn't be required. Incidentally - vi would be a bad idea, it's got to much of a learning curve when they're really supposed to be learning programming - gedit or notepad might be better.
Yes, students should: Part of teaching programming is showing students how to best use all tools at their disposal. IDEs have some valuable features that are vital to professional programmers.
IMO, the best time to go without the IDE is around the same time that you teach assembly. The non-IDE experience is mainly valuable to students who are going to be professional programmers. For into-type classes where there will most likely be non-major students, keeping them in the IDE will help them be more effective if/when they ever need to program in the future. Likewise, once you reach very advanced CS classes, your students will have better things to worry about then command-line switches, and thus will be able to make good use of the IDE's features.
Again, the above statements are just my opinion.
No, I will not work for your startup
It depends on what your goal is for teaching, but by your words, "I will be teaching an intro to Java and an intro to Python course", using an IDE will mask much of what could be valuable in learning, to the extent students don't even "get" some of the important underlying principles.
I've seen kids of friends who ostensibly have taken "programming" classes, and virtually all of them are IDE based curricula. And every one of these kids lacked the most basic understanding of programming. They could cobble together a simple form, but lacked skills to extend much beyond.
Sometimes it's the school/teacher's fault. I know of one example where a teacher had to teach java, and had never used java before. The kid I know who took the class constantly complained about how stupid the teacher was (he mentioned she had a "Java for Dummies" book for herself). She not only didn't know and understand java, but picked an inferior IDE (I won't start any flame wars by naming it, but it was lesser known, and lacking in features).
Admittedly I'm from old school, I started with a 3Gl (PL/I) as an introduction, and my second course was assembly. Things are obviously different today, but I'm glad I understand technology at the level I was required to learn it. I don't think I'd have insights for solutions today without that background.
Since you're asking for opinions: If you want students who'll come back later and thank you, try to emphasize the language and its semantics in your curriculum, and sprinkle in a little exposure to IDE late in the course (that indeed will server a useful purpose).
Good luck.
YMMV.
There's good reason for any developer to be familiar with a good IDE and with tools like vi and Emacs, but do you really want to spend valuable classroom time teaching them about editing tools instead of the language?
You probably should spend some time during one class to discuss the choices available and what your own preferences and biases are, but they'll probably have to use whatever their employer uses when they get into the workplace. Better to spend your time teaching them to be carefull and thoughtfull coders and they'll use that skill to decide what environment to code in themselves.
I'd recommend emacs. You'd be giving them a tool powerful enough to let them get work done, but not yet a tool that would remove the burden of thinking from them. They'd have to spend time learning a couple of handfuls of command key sequences, but all in the service of competently manipulating the source text, not in the service of learning how a given IDE wants to frame the software development process for them. If you wanted to help them put their code together, you could give out handouts for Jakarta Ant.. that way they'd get to directly touch and view the construction process for their programs.
Emacs and Ant are also available on all platforms your students might conceivably be using, whether it be Windows, Mac, or Linux.
- jon
Ganymede, a GPL'ed metadirectory for UNIX
Going by this logic, should we not let them use a shell, but rather force them to launch the compiler through execve calls (how one would write the launcher program itself and run it is beyond the scope of this comment).
Or should they start off coding in assembly or even machine code?
At some point, it makes sense to abstract away details so that students can understand important concepts. Now, if your assignments or understanding of the concepts you were taught required knowledge of javadoc or jar, then I agree that your teacher did not use the right tool(s) to teach these concepts, or should have modified the course so that these tools weren't needed (e.g. generate documentation in eclipse should have been all that they needed to run).
So, given this, do you still believe that an IDE abstracts away too much of the detail needed to understand OO, Algorithms, and Data Structures? If so, which needed details are left out?
Our university introduced students who are otherwise not programmers and will not be programmers - Java with Vi (or Pico - most students preferred that due to the learning curve). After the black unix terminal screen, now the students think programming is a black art. Those that started programming with Access and VB atleast are not afraid of programming and can create some simple data tools for their work (They however over estimate their skill but I prefer this outcome for our specific course). Since, real learning happens outside class, I think it is very important to make the students get interested in programming and let them have little rewards (It's a lot more fulfilling for students to get a GUI app that manages a database than see number crunching at the terminal).
I think the environment should not interfere with the actual subject content since the instructor will often leave the students alone in this area. I thoughts are to first determine what you want to teach - and choose the easiest tools for the students.
Don't teach vi. That's a waste of time if the class is about programming. Let the students use whatever they want and figure that out on their own.
Visual C++ really sucks. You've got all these weird autogenerated project files. With C++ it's simpler to just not use an IDE at first. Python IDEs are much easier since python programs don't need a build system or any of that.
Teach whatever will let you focus most on Python or Java and the IDE.
In an intro to programming class, you should be teaching true programming concepts... Not Python or Java or anything else. Teaching from a book like How to Design Programs using Scheme is the way to go in my opinion. Give them the concepts, not knowledge of Java or an IDE that will be obsolete in five years. If they know how to truly *program*, they can handle the IDE themselves later.
not saying what you said isn't insightful, but what you said is like saying people should type essays without a spell checker. honestly, you won't be able to use an IDE if you didn't know how to program. IDEs make it simpler by catching simple and common mistakes like forgetting to close your braces or missing an ending parenthesis. forgot which method it was called, no need to open the source code again, just have it display all the method names of the given class. it's not like the IDE will magically write code for you if you didn't know what you wanted.
using an IDE has nothing to do with learning debugging in my opinion. most IDEs themselves already contain great debugging tools, unless you're thinking about the non-GUI ones. at that point, it's just preference, both debuggers are just as powerful, one having advantages that the other doesn't, but also has disadvantages the other doesn't.
I agree when you first learn, notepad would be useful to teach skills, but by the time you get to even like emacs or vi, they already come with a bunch of tools like auto-ident and coloring (which is another thing that IDE supports). IDE makes life easier, and that's that. Just like a spell checker or autoformatting document. even with a spell checker and grammer checker, one still needs to double check for mistakes that the tools don't see. if you think a spell checker finds every problem, you're wrong. Just like those who have the same mentality of an IDE.
HD Trailers
Several years ago (early 90s), I was hired as an adjunct faculty member to teach some night classes at my local university. The first class I taught was "Advanced C++", which was a fourth-year CS class, and presumed that the student had previously taken "C++", and before that had taken a variety of other programming and theory classes, working in Pascal, assembler and C, at the least.
During the first week of class, I gave them a quick review of C++ syntax. One evening I touched briefly on the 'static' keyword and gave a quick rundown of its meanings in various contexts. When I mentioned what it does in a global scope (make the symbol local to the current compilation unit), I could see glazed eyes and baffled expressions so I started asking some questions.
Well, they didn't know what a compilation unit was, so I explained that, but they were still confused. After digging further it dawned on me that the root of the problem was that these students had never even heard of a linker, had only the vaguest idea what a compiler was, and weren't sure how the editor was different from the compiler. They were quite certain that single-stepping through code made use of the compiler, though.
These were Computer Science seniors, most of them one semester away from a Bachelor's Degree. I was shocked and dismayed to think they they could have gotten that far without ever understanding these pretty basic concepts. I'm still confused as to how they could have passed their compiler design course without figuring out what a compiler is.
The reason the students all lacked this basic understanding was, of course, the fact that they had used nothing but IDEs (specifically Turbo Pascal and Borland C++), except in their assembler class, and that had been done entirely on paper, so they never actually had to use an editor or an assembler.
I didn't have time to teach them these things, of course; I'd also discovered that most of these students had also managed to pass their previous C++ course without learning hardly anything at all about C++, so we had a great deal of material to cover. My solution was very simple, and probably somewhat cruel: I announced that I would compile and run all of their programming assignments on a Sparcstation, using the GNU compiler. I required all assignments to be e-mailed to me in a .tar.gz file that included source, makefile and any necessary supporting files. I informed the students that they were welcome to do their development on any platform they wanted (everyone had PCs and Borland C++, of course), but that any assignment that failed to build and run on the Sun would get a maximum of 50% credit, and probably far less, so testing on the Sparcstation was highly recommended. There were plenty of X-Window terminals in the lab, so there was no problem getting access to the equipment.
Nearly a quarter of the class dropped that week. The rest learned something, though, so I don't think that was such a bad outcome.
Note to ACs: I usually delete AC replies without reading them. If you want to talk to me, log in.
Unless you are specifically teaching a Unix class, an IDE is really the only good way to get a useful programming environment on Windows. You know, Windows, that funny OS that runs on 99% of the x86 laptops that students now have.
Using Eclipse, for example, allows all of the students access to JUnit and CVS via a consistent interface.
The biggest shock for most of my students was automated testing. Projects had a base set of tests that ran automated up until the deadline. After the deadline, I would run an extra set of tests to make sure that they were solving the problem rather than just writing to my tests.
All students had to do was check correct code into the CVS repository and the automated testing system would take over from there and produce a web page with the test results. Of course, creating correct code was always the trick ...
I'm a teacher for 5 years already and i lecture courses in java, LAMP, linux and some other stuff depending on the demand. I can speak from experience when i say the following: When you are teaching students which have already had course in Microsoft Visual studio (Visual basic) You will have a hard time arguing with your students(they gravitate to lazyness). Even though, we teach the first year using a simple text editor for all of the obvious reasons: somethinmes you need to now some things by heart. The years after that we use netbeans, the all in one IDE. When using a simple text editor and a command line you will never get as far (at first sight) as the IDE crew, but i'm convinced that in the long run they will have a better understanding. You shouldn't try to teach advanced topics that requires an ide thinking about bigger programs, enterprise technologies, writing unhuman readable xml formats etc... the main thing to remember is not about the language or the ide itself its about grasping the concepts and a good teacher is able to explain them without a language on a chalkboard.
> Vi and emacs are to an IDE what a Ford model T is to a 2006 Lexus.
I won't talk about vi, but this is a terrible analogy for Emacs. If an IDE is a 2006 Lexus, then Emacs is the car from the movie Batman Begins. It's much more intimidating and harder to learn how to use, but under that hard exterior there is all sorts of functionality that you previously never realized was possible.
Cut that out, or I will ship you to Norilsk in a box.
Would you care to cite a source for that incredibly high number?
If you disagree, post your argument. (-1, Overrated) isn't your personal censorship tool for views you don't like.
Maybe something in between would be appropriate. Instead of a full-fledge IDE or barebones vi/notepad, try a text editor with syntax highlighting (like TextPad or NotePad2). Helps with those easy things like unclosed braces, but leaves you to do the more in-depth debugging. Also gives line numbers (not so with notepad). I live on line numbers...
Nobody in the department liked the idea of teaching kids Java straight from the beginning from an IDE. so instead, we decided CS1 would be kept the same (emacs, vi, basic no-frills editors) for all classes. Then, we decided we would teach two seperate classes CS2 and CS3 using the Eclipse IDE.
The results were stunning. Not only did the students using the IDE write better, cleaner code, but they also enjoyed coding much more. After realizing the painfullness of writing it all out in a terminal-based program, Eclipse recieved a warm welcome from both the students and the faculty. We will be doing the test over again next year with a larger experimental section (maybe 50/50).
So as for your answer to whether or not to use an IDE? I would say the answer is yes to both. I think its important for students to learn how to use a unix terminal, compile code "the long way" and get down and dirty with a no-frills editor. But using an IDE just makes life simpler sometimes (especially in our case), so why not use it. I think that the solution is to do both, and students will be more productive and have a broader range of knowledge.
p.s. sorry for any spelling, im too lazy to use OO.o :-P
When I was interviewing for my current position, they asked me two questions:
.25 seconds to collect the sample, and .8 seconds to process it. Write a program to make sure you don't drop any data.
1. What is the integral of x^2? You'd be surprised how many MATH MAJORS they interview that get this question wrong (my degree is in Mechanical Engineering, but I learned programming along the way and it is now most of what I do, with some Engineering sprinkled in there). (btw, the answer is ((x^3)/3) + C)
2. You have a real time system collecting data into a temporary buffer and processing this data. It takes
They asked me to solve this problem on the whiteboard using C, right there in front of them. It had been awhile since I programmed without an IDE, but because I learned to program without ever using an IDE, it wasn't a problem.
On the other hand, there's another guy at my office who started working there doing something else and somehow got dragged onto a programming project.
After a year, he still can't grasp what the devil a pointer is. I'm not saying someone needs to understand pointers to be a good programmer (although it helps you understand what higher level languages are doing under the surface), but the project we were working on required it. He's so used to using drag and drop stuff like Visual Studio and LabView that really comprehending the inner workings of a language for writing efficient code is just too hard.
I agree when you call this a handicap that just doesn't go away - it has alot to do with how the brain first learns to conceptualize programming, and that's a very, very hard thing to un-learn.
We are the fire that lights our world.. and we are the fire that consumes it.
" Any learning programmer who makes mistakes that IDEs will catch will also make other mistakes that IDEs won't catch."
The problem is, compiling a program and being forced to fix the error on your own will help you remember not to make that mistake next time.
When the IDE auto-fills something for you, you never really get that lesson. You might go "oh yeah" every time, but it's far less likely that the lesson will really stick.
At least, that's my experience.
Also, being able to put something together using an IDE that is doing drag-drop and autocomplete for you will never really teach you the basics of things like FIFO queues or binary search algorithms.
While these are often already implemented in higher level languages, it's good to know the basics; for me, even using C# where I don't have to worry about things like that, it still prevents me from doing things like searching a list twice when I really only need to do it once, because I might write the code to do that and then go "Oh duh, that's not necessary," whereas the compiler would happily compile that for me.
And there is alot of work where intimate knowledge of those algorithms is STILL necessary. In the end, programming isn't about being able to use a particular language or an IDE, but about understanding what the software is doing, what your algorithms are doing, and how everything fits together.
I have simply found that using an IDE to learn to PROGRAM gets in the way of learning those concepts. IDE's are great for learning LANGUAGES; they are horrible for learning computer science, because they can't teach you how to write algorithms or understand what the compiler is doing.
We are the fire that lights our world.. and we are the fire that consumes it.
A syntax highlighting newbie useable (e.g. notepad like interface) editor with buttons to invoke the compiler (avoiding the need to screw with the command line directly) seems like a bloody good idea.
Full IDEs with powerfull debuggers and pinpoint resoloution error reporting are imo something that should be saved for later.
note: i'm known as plugwash most places but i screwd up registering that here somehow in the past and now can't register
Heck, I consciously switched *to* Vim from Emacs, after using the latter for *years*. Why? Primarily because RSI, particularly in my pinky finger and my mousing shoulder, has become a bit of a problem for me, and Vim allows me to do all things I can do in Emacs (and a few things I couldn't, or at least never learned how to do :) without the need to chord or move to the mouse all the time. 'course, the fact that Vim is lightening fast to start up, works great in GNU screen (which I use to migrate my shells between work and home), and is amenable to laptop keyboards (which have funky modifier key positions) and ssh sessions (which can sometimes mangle modifiers, like meta) is pretty nice, as well. :)
If you are teaching an IDE then use an IDE and treat the language as an afterthought. If you are teaching a programming language then teach them the language and then introduce an IDE as a productivity tool if you so desire. Note: IDEs come and go in and out of vogue and if they are vendor specific as may be true in programming shops where the students will work that particular ventor's package, and of cource IDE, may be gone in 6 months. That is not an assumption on my part but an observed fact of life. IDE's do not reflect the raw behavior of the language and more to the point often can and do make underlying assumptions or operational decisions. Being second guessed by a programmer 2 years ago who thougt that feature of the IDE was cool can be an annoying experience at the best and a fatal one at the worst. It is difficult enough to get a clean behavior of a particular language relative to its specification in a bare bones environment much less as an embedded component in a complex IDE. IDE debuggers don't always reflect the true behavior of the program under general hardware/OS conditions. There are also debugging issues, especially in production environments where the IDE cannot be used in many cases. One of the side effects is often the failure of putting in reasonable program logging and debugging statements because the IDE debugger makes them unnecessary. That can leave you holding the bag at 2:00 am. trying to solve a critical production problem without any usable information. IDE's can become crutches in that a basic understanding of the programming process is assumed to be the process behavior of the IDE, especially by a novice. Sometimes IDE environments can be buggy (after all they are just an added layer of programming complexity from an operational standpoint). You don't have to create expert System Programmers with all the nuances of hardware/assembler/compilier specifices, just give them a basic development environment that can edit/compile/build the basic language for the available hardware/os. After you've gotten them working with the basic language give them the option of using an IDE but have some work that is independent of the IDE always included in the exercises for the rest of the course. If you don't want to be pedantic then after the initial introduction make the non IDE related exercises extra credit. There is nothing wrong with an IDE as a tool, but that is all that it is a tool to managing the programming environment. What counts is what actually ends up running on the hardware and the student's basic understanding of it. Consider that a student properly exposed in this manner can then move from one IDE to another and even work when necessary without one. Basic programming practices (Structured logic, Object Related Design), and a real understanding of the basic language behavior relative to the state machine coupled with some workable knowledge of the standard associated libraries goes a long way to building a competent programmer.
My father was a community college professor in a technical subject. In his case, diesel engine service. The particular course in which this incident took place required students to tear down and rebuild a variety of fuel injectors, then hook them up to a test stand to prove they operated correctly and held under pressure, then adjust them on the stand to the proper flow rates.
One particular kid just could not tune his injector right. He could tear it down, rebuild it, and hook it up to the stand, but when it came to adjustment he just couldn't get his first injector to come into line. Adjustment was a simpe matter of turning a screw: one way for more fuel, another way for less. Eventually, my dad just stood there and watched the kid work. Eventually dad had his eureka moment that revealed the problem. Being an old-school industrial instructor, he just grabbed the guy by the wrist, pulled him away from the test stand, and pointed him at the wall clock.
"What time is it?" my dad asked.
The student tried to look at the digital watch on his wrist, but dad's wrench-hardened hand had his wrist clamped tight and covered the watch. The kid looked at the analog wall clock again, and couldn't say what time it was.
He couldn't read an analog clock. He didn't have know what was meant by "clockwise for less" and "counterclockwise for more" and had been too embarassed to ask.
Sometimes the basics really matter.
With reasonable men I will reason; with humane men I will plead; but to tyrants I will give no quarter. -- William Lloyd
You might want to read this short article: Musings of an "Old-School" Programmer by Stephen B. Jenkins. I just found it in the May issue of Communications of the ACM. He describes how he works without an IDE and whay he thinks it is the best way of working for him.
http://erichsieht.wordpress.com/category/english/
As a CIO and IT manager for nearly 2 decades, I have to comment that I am appalled that many young programmers in recent years are clueless about text editors in general. I have found with employees in the last 10 years, the "Windows" generation if you will, they use notepad on occasion, which has limited functionality, and when developing on Unix/Linux systems, they are completely useless. A number of systems that we maintain are slimmed-down systems. The development of apps for these happen on larger systems, and after testing, the apps are moved to the slim systems. I've had to dedicate a lot of money to training resources for these newer hires so they can edit even a simple text config file... We now prefer knowledge of vi as an entry level skill. And if someone claims they have it, we test them.