Hangout for experimental confirmation and demonstration of software, computing, and networking. The exercises don't always work out. The professor is a bumbler and the laboratory assistant is a skanky dufus.
10 Golden Rules for Teaching Computer Science. Computer science teacher Alfred Thompson just posted a great article on Andrew Tanenbaum's 10 Golden Rules for Teaching Computer Science. These rules can be your guidance to learning and mastery of cybersmithing:
The examples and explanations in Tanenbaum's slide set are not to be missed [1]. Here is a paraphrase emphasizing self-guided learning and personal practices:
The Y2K problem resulted from short-term thinking. Your software will be used longer than you think, and under more circumstances than you think. Your web site will be viewed with more browsers and from more devices by different people than you think you have to accommodate. There will be a need for maintenance of your code and you will need a way to troubleshoot incidents experienced by its users. There will be new releases of operating systems, code libraries, and developer tools. There will be changes in business systems and practices. There will be a need to replace or retire your software and the equipment it runs on. There will be outages, hardware failures, office fires, earthquakes, storms, and floods that make computer systems unusable or inaccessible.
Assignment: Consider how the other rules relate to this principle. Look for ways that you fail(ed) to think long term and identify strategies that would preserve what you know and do over time (including changing what you choose to learn and what you do as a strategy for the long term).
As a novice and budding cybersmith, you have had to absorb a mountain of facts in order to embrace a particular toolcraft. Many of those details and facts obscure important principles that will serve you beyond those particular facts and the special-case of the day. From principles, one can redevelop and confirm the details that matter. You cannot escape facts, but you can use principles to bring order to them.
Assignments: Identify principles that you have found that apply in the cybersmithing that you do. What level does the principle live at (coding, program design, development methodology, quality assurance, etc.)? Find one example of conditions where an exception to the principle applied. Identify principles by which you can operate without learning all of the relevant facts in advance. What's a common feature of exceptions to those principles?
Do not think of every change of technology as a new paradigm. Some paradigms (ways of looking at and operating in the world) bring back older paradigms in new clothes (see rule 10).
Assignment: One automatic cost of operating within a particular paradigm is that it makes other paradigms invisible and inconceivable. Find an example of this. Consider how one might become alert to occurrence of different paradigms.
There are two problems that require some understanding of what is going on under the covers. First, having an incorrect conceptual model (whether mythical, folklore, what someone else said, or your own misguided speculation) will lead to misunderstanding of the connection over what you can control and what the outcome is. Secondly, when there are breakdowns, in very many cases it is necessary to understand how things work inside because the breakdown is exposed at (and exposes) the underlying workings.
This applies to some degree in the use of computer-based systems, but it applies especially to those who are involved in the construction, support, and trouble-shooting of computer-based systems. Treating symptoms without understanding internal workings is not only wasteful and time-consuming, it can be dangerous.
Assignments: Consider the value to you of these levels of knowledge: Explaining the program build process and all that it depends on for any compiler system you use. Knowing how to find out what a compilation process is and how failures at different stages can be resolved. Knowing what it takes to deploy a computer program to a different computer than the one it is developed on. Knowing why these things are the way they are. When a program/script/web page of yours fails, knowing how to isolate the problem and also demonstrate it in a repeatable way. Now consider depths of knowledge that might be interesting but do not increase your mastery of cybersmithing at the level you practice it. Name at least two.
As suggested in Tanenbaum's slide set, there are two thrusts in the mastery of complexity: avoiding it altogether and confining unavoidable complexity.
Assignment: Find some masters to learn from. Their work may be available in books and even in computer code. Look for the principles embodied in their work.
There are scientific and mathematical principles that govern the operation of computing systems. But the construction of software (even programs that are produced as a science project) involves construction of real artifacts. The reliable, on-purpose construction of those artifacts to have important observable properties is accomplished with engineering practices. There is craft in the writing of individual elements of code, but the overall development and integration of a complete result takes engineering.
Assignments: Find a copy of Steve McConnell's Code Complete (either edition)[2]. Notice what he identifies as craft of software construction and contrast that with the full-up move to professional development as an engineering activity[3]. You won't find much emphasis on computer science here, although scientific study of software development and engineering does come up. Identify at least one subject of computer science that is usefully applied by the software developer.
As my friend Bill is always ready to remind me, it is very important to look at how software and computers are embedded systems. Software is used instrumentally on behalf of particular applications, whether by being applied by other software or exercised in the work practices of people. Those people and their activities are part of the system in which the programs and computers are instruments. The programs are not the "solutions" and they are not the applications.
Assignment: Look at who the people are who will be applying your software to some purpose that is important to them. Consider what that purpose is on behalf, and again, until you have found an entirely-human purpose that has nothing to do with technology. Now, how will what you are producing be as amenable to that purpose, with the least distraction of the human from achievement of their objectives.
Unless your development activity really is a science project, you do not want to be making theoretical explorations as part of a production software development activity. Tanenbaum suggests that the appropriate reliance on theory is the construction of a model that accurately describes the essentials of the system being developed. Don't forget rule 7 and ensure that the model embraces essential end-to-end functions.
Assignment: Consider whether you rely on theory and theory formulation at all. Do you have explainable conceptual models of how your software operates and fits into a system? Do you have concrete measures of when your software is complete and does the job it is required for?
Develop your critical judgment and hype detector. Claims made with no context and with no demonstration of how they were developed and validated are immediately suspect. Claims about improvements without any account for the cost of movement to new products, tools, methodologies or whatever are also to be viewed with skepticism.
Assignment: Notice how easy it is to believe that something that does not exist will somehow lack all of the deficiencies of that which is known. Also notice where you automatically find changing more costly and disruptive than what you are doing now. What attitude can you adopt that avoids these untenable extremes?
Tanenbaum points out that there are developments from the past (virtual machines, interpreters, and time-sharing) that have been reinvented in the present. Old ideas are not necessarily obsolete ideas. I think there is more to it than that. One needs a relationship to the work of the past by which one can appreciate how it does and does not apply now, or apply in a new way.
Assignment: Take on the practice of finding past results and experiences that you can build upon in addressing a new concern. This may involve learning how to research past work and knowing where there are resources that may support you. You'll have to accept that earlier work may not be in a form that is directly usable, and overcoming that is also important. You don't have to research everything all of the time, just have means available and have experience using them.
I've turned a few of them around to address what it is you have control over in your own practice, rather than what you might be doing when coaching or mentoring someone else.
For your first assignment in the application of rule 10, here are important resources. I could have chosen others, but these, especially the McConnell books, will provide avenues to a rich collection of resources that you can rely on:
[1] Andrew Tanenbaum: Ten Golden Rules for Teaching Computer Science.
Presentation to the 28th SIGCSE Technical Symposium on Computer Science Education, San Jose, California, February 27 - March 1, 1997. The slide set is available as a 2.3 MB PDF file.
[2] Steve McConnell: Code Complete, second edition.
Microsoft Press (Redmond, WA: 2004). ISBN 0-7356-1967-0 pbk. There is a comprehensive bibliography and useful references to other resources. The book web site provides enough materials to get a sense of what McConnell considers the craft of software construction. If you are a web site developer or are using some of the newer higher-level development systems, the examples here should be considered for the principles they reflect, illustrating them with details that arise in your own craft specialty.
[3] Steve McConnell: Professional Software Development.
Addison Wesley (Boston: 2004). ISBN 0-321-19367-9 pbk. This is toward professional level development and it features software engineering as a discipline. This is an overview book, not a how-to-be-an-engineer book. You can obtain a sense for the difference in perspective by exploring the book material on McConnell's web site.