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...