I’ve come to believe there is a definite void between CS and what developers are really doing. [I do understand there is a need for pure CS – but it is an economy of scale problem.] I’m not sure American universities are keeping up either. Based on what I see coming out of major CS programs there is definitely a breakdown between what is needed and what’s being taught. I do understand that this is a gross generalization. Cutting to the chase, the real problem is that most students don’t know how to learn (especially on their own) software engineering. The field of software “stuff” is so dynamic that there is no way possible that you can constantly bridge theory with practical application. So, I need to add one more objective to the list:
- The need for self-starting, self-learners
I’ve got a couple thoughts on this. First, you need a starting point. I suppose the logical thing would be a language. But, I’m not so sure about this – though I’ll leave the conversation for another blog. Also, The notion of Computer Science being the entry point for software engineering is a little problematic. To understand we must break down exactly what CS is – which we’ll do in a second. Second, we need to arrive early at the understanding that software engineering is a continuously changing environment – and that there are many different potential career tracks that fall out from the top. Lastly, the community around that particular track must be exposed and introduced – so the self-starting can begin.
Computer Science program comparo (I’ll provide the link and you can follow if you want)
- advanced math
- machine organization
- data structures and algorithms
- foundations of computing
- comparative programming languages
- software design
Ok, now a search of Bachelor of Software Engineering at Google – reveals no American universities. But, there is another problem: over at Wikipedia the definition of Software Engineering is said to equate to Computer Science. Wrong.
Without creating a “science versus engineering” debate let me make the statement that science is the study of the problem, and engineering is the derivation and application of the solution. I also think it is OK to make the assumption that computer science can be applied to all sciences, as well as engineering. I mean you can solve the problem, unless you understand it. But, most people assume that computer science is the art of programming – and universities appear to somewhat agree, based on general curriculums. I believe software engineering is a bit more straight forward: software engineering is the process of analyzing the problem; designing, developing, testing the solution; and ultimately, the delivery and support of the solution.
Now that we’ve somewhat defined Computer Science, I’ll point you to the Wikipedia version. Note that Software Engineering is one “field” within Computer Science. Back to why I care. Two points: the first is that I still want to write this book. Secondly, I’m struggling with finding recent college graduates from Computer Science programs who can “do the work”. Maybe it is simply the void between Wikipedia’s two definitions?
Part of the problem is that the world of computing in general is extremely fluid. There’s no chance to really keep up and catch your breath. By the time you’ve mastered one thing, the next shiny object comes along. There are two key skill sets that fall out of this. First, you must be able to “weed” through all of the content and filter down to the most important stuff. Second, you must be able to break-down the documentation and technology to understand how it works, how to use it, and probably most importantly when to use it. I’ve only come across a few people in my working career who can do this well for their specific focus – and they are all considered subject matter experts. How you go about learning is the hard part – which I believe escapes with the general laziness (relative to the difficulty of the subject matter) of our cultures. But, the solution is rather quite simply: Active Participation. Every technology has its community. Dive in and be proactive. Read, write and collaborate. The Open Source communities are shining examples of how knowledge is distributed throughout – by active users and developers alike.
The other piece of this “self-starting self-learning” equation is the necessity for self-investment. I think there are a lot “workers” out there is do make it just a job. Show up at work, do your job, go home and that’s it. In order to even stay afloat in the techno-world one must invest in constant learning, and on personal time. I suggest keeping a list of “items of interest” and constantly doing the background research on them. Use some sense here to, make sure that the list tracks well, and that the items are pertinent and practical.
Back to the community and Open Source concept. Open Source in general is so much more than free software, or source code. The tribal knowledge (or potential) that flows throughout each of the individual projects is an incredible model for how to empower engineers. Contributing to projects is painless, and can be done in so many different capacities – covering everything from documenter, tester, to actual developer (and don’t forget user). Many corporate and academic environments are learning to adopt similar cultures and practices.
So, back to the point of this blog…writing a Software Engineering (Practical Computer Science) book for kids. The outflux of IT and techno-savvy jobs to far off lands is a real concern. We, the computing community need to make Software and Computer Engineering attractive to high school and early college students. We also need to create more technically-aware employees in general. I believe education is the starting point…and thus a book.
More to come on the book concept, and possibly a potential Table of Contents.
Please comment: blog comments powered by Disqus