Wednesday, March 17, 2010

Whatever happened to programming? � The Reinvigorated Programmer

Whatever happened to programming? � The Reinvigorated Programmer

So true. The fact is that the majority of computer science programs (at least in this country) adhere to the ACM / IEEE CS 2001 curriculum recommendation (which has recently been revised as of December 2008.) We strive to obtain accreditation, usually through ABET. Both of these correctly stress the importance of teaching the basic foundational concepts in computer science. But, let me wear the devil's advocacy hat for a moment. How important is this for all students in computer science? Do we need different paths to help students achieve different goals?

Consider the average CS undergraduate student from an average college. Let us suppose that they obtain a job working in any of the "hot" areas in software development today. Let's choose Java, since that still represents a large chunk of the development jobs available today. I believe that the foundational data structures (trees, lists, stacks, queues, hash tables, etc.) and algorithms need to be taught. But, to what level of detail? Does the average CS undergrad I'm speaking of here need to have detailed knowledge to the point where they could develop these data structures and their supporting algorithms themselves? Surely, they need to understand these algorithms and structures with respect to their use of computational resources. However, I could present a weak argument that perhaps it might be acceptable for some students to focus on learning the core APIs earlier and in much more depth through their career, and get them to gain more experience on large-scale software projects, while hopefully gaining some experience with team-oriented software development processes. I see far too many undergrad students graduate with no familiarity with the C++ STL beyond the vector or string class -- don't bother asking them about the wide range of algorithms and design patterns implemented in the library. The Java API is a far greater beast to master. And yet, most 4-year graduates that enter the work force will be using these libraries, or more likely involved in validation and verification testing of existing code using these facilities. It is highly unlikely that they will start their first job implementing their own low-level, foundational algorithms.

With my devil's advocate hat now taken off, I would be extremely disappointed if I saw this direction being pursued in higher-ed computer science. I think that the theoretical, mathematical, and foundational concepts are extremely important for computer science students, especially for those looking to further their education in graduate school. I think that though it is important to be aware of libraries, unless you are developing a program that provides a 100% identical mapping of all inputs to all outputs of an existing program, then you are going to need to do something unique with your program. Very basic theory of computer science will teach you that there are an infinite number of ways to solve even the simplest of problems with a computer program. The rigorous, detailed training we hope to provide the student is the knowledge to understand how to solve that problem with the most efficient use of computational resources!

Perhaps a different program or title needs to be introduced that distinguishes the true computer programmer and software engineer with one that only has high-level understanding of how to plug together libraries to form applications.

Final thought -- I agree with the author: not being able to truly program takes away the pure joy and challenge that can be had with creating software. There seems to be a substantial contradiction here with computer science -- we teach the importance of developing reusable code, and yet we all want to have the opportunity to code from scratch! I think there needs to be a balance, and an understanding that there are opportunities to do your own thing... you might just need to make them yourself.  A great example and opportunity for pure computer scientists has been looming at our doorstep: multicore processing. This topic needs to continue to move up the priority ladder in our CS courses. If you are bored with "plug and play" style software development, try to perform some profiling and detailed analysis to determine if your design is fully making use of multithreading and multiprocessing. If not, then as Picard used to say, "Make it so, #1!"

More some other time...

Thursday, January 14, 2010

CS depts. and the gaming industry

The concept presented in this article that surprised me the most was that "the demand for computer scientists capable of building games is high, with large companies like Electronic Arts reporting that 65% of their hiring demand is for programmers skilled in building games."

Two points: first, I agree that the traditional CS graduating student is not best equipped for a career in the game industry. Second, I'm not really sure Electronic Arts is the best company to use as an example of anything these days. Weren't they the focus of a coalition put together by wives of employees to tout about the horrible working conditions? They also announced a pretty large round of layoffs last year. Check out google for lots of interesting stories on them.

Despite the example used, I agree with the point that today's CS curriculum does not prep students for jobs in game development. We focus on prepping students with the skills that are required for the majority (and also most lucrative) of careers in CS. Of all of the possible jobs one can obtain with a CS degree, game development is not anywhere near the top of the list. I think we would be doing a large disservice to the majority of firms that hire computer scientists if we start incorporating game development into the curriculum.

But, I can easily take the other side of the argument. Consider how many more students would be interested in a degree in CS today if we could talk about our opportunities to develop games! Attracting student interest and dealing with retention are two hot topics in CS academia. I think there can be a balance, where some aspects of game development are used in some earlier courses, perhaps up to the point where data structures are taught.

Tuesday, July 14, 2009

The new video Kodu game will teach you (or your kid) about programming. - By Chris Wilson - Slate Magazine

The new video Kodu game will teach you (or your kid) about programming. - By Chris Wilson - Slate Magazine

Interesting... I wonder how this compares to Alice as a possible (very) introductory teaching language for CS newbies in high school and college? Alice continues to get rave reviews, though (as with every language) there are critics. At first glace, Kodu seems to be too elementary to be a platform to use in a "programming for non-majors" CS class. We want a class that can be used as a way to open the eyes of students that never thought about CS as their major. Our plan was to adopt Alice for this purpose.



Thursday, July 09, 2009

The Scala Programming Language

As if we didn't have enough choices for programming languages to teach...

The Scala Programming Language

I like everything I've seen with the language so far. In particular, I like that it plays well with Java.

Yet, seriously, the number of languages out there is truly astounding (and ridiculous.) Forget the trials of the professor considering what languages to teach. Let's look beyond my responsibilities. What about the student? And, consider the challenges of the IT sector looking to adopt development strategies, including selection of a language or two for development. Which do they choose?

It is absolutely impossible for one language to satisfy all needs. But, it seems that the number of choices available for each need in software development today is much more of a hindrance than an asset to both the developer and the software development industry. As a CS professor, I strive to keep myself aware of the latest trends and technologies, in order to incorporate aspects of them in my advanced classes. (i.e., I want my students to get jobs!) So, should I teach a wide range of languages at a very introductory level so they can put huge lists of "technologies and skills" on their resume? No! The problem with this approach is that the student does not learn the depth in any language required to complete a large-scale project that they will be given when they get a job. They do not get a chance to get beyond the headache of syntax and program structure and really learn problem solving skills. I think that 2 languages should be taught in depth to CS undergraduates, with essential focus on constructs common to all programming languages. I don't think many will disagree with this. The disagreement among CS faculty is in regard to what languages to teach. If a couple of languages are taught in depth, the student will most likely be able to adapt what they've learned to other languages with relative ease. 

Do you think I'm being ridiculous? Check out this list:

So, who is to blame? Some of the blame is on industry (e.g. Microsoft's unwillingness to embrace Java, and therefore create C# and an entirely new JVM clone called CLR), some is on academia (e.g., Scheme), and some is simply the work of CS gurus and zealots and those in the open source community that thrive on anything that is anti-establishment. Of course, all of these players have created some nice languages. but they all claim to adopt aspects of some prior language, and incorporate something that is supposedly new. And unfortunately, some of these lesser known languages thrive because there are groups that thrive on adapting and going against any technology that is mainstream. (Maybe I'm being too cynical... but, I've witnessed these attitudes in industry and academia!) They often take a certain pride in being able reject any mainstream industry, and/or say they know something that nobody else in IT does. So, are they wrong? Quite often, their rants are right on the money! Can you blame them? There are reasons some of the better academic institutions have all Linux labs.

Sigh... can't we all just get along?!?!? Ehhhh.... no, but at least most of those in CS industry and academia are willing to have an open mind and see what hype is about. We love to learn new things and see how to develop better systems. If we didn't love change, we would have chosen a different field.

Whatever the case may be, it is my opinion that the number of development languages available today is a bit of a hindrance. But, if students can learn fundamental programming constructs in detail, learn foundational algorithms and data structures, gain experience with design patterns before leaving college, and gain some good problem solving skills, then the language of choice is mostly just syntactical goo to put around the solid structure and scaffolding of your design.

Syntactical goo... hmmmm... I'm sure I'm not the first to use that phrase.