Maharishi University of Management
Computer Science Department
Computer Science 525
Advanced Software Development
____________________________________
Gregory Guthrie, Ph.D.
College of Computer
Science and Mathematics
Computer Science Faculty
______________________________
The goal of this course is to provide knowledge of methods which help structure software systems in a manner that realizes the goals and principles of software engineering, and to provide experience in applying this knowledge to solve real world problems.
"The whole Vedic Literature unfolds the structuring dynamics of the Veda. The Vedic Literature displays the structuring dynamics of consciousness, which promote the sequentially evolving structure of the Veda, first into Shruti, sound (frequency), and continuing the process of evolution, the sound (frequencies of sound) produces form."[1]
- Maharishi Mahesh Yogi
Language is the means to express intelligence; it is a concrete symbolic form that represents the structures of intelligence, which are knowledge. For one to communicate knowledge there are methods based on language, and literature; which describe one’s knowledge in a form intellectually available to another. Knowledge comes from experience, but since one cannot directly share one’s experience, we instead share descriptions of what we have learned from it. This is how we attempt to share our expertise in any area, including Software Development.
What makes a software developer an expert is that from repeated experience of applying their knowledge of Computer Science to various application areas, they begin to automatically see larger scale patterns in the architectures used to solve problems. They see that there are some general principles, methods, and resulting solution architectures that they gain an increasing familiarity with and breadth of areas. They then have these packages of knowledge, the generalizations from all of the specific experiences, which they can they easily draw from to solve new problems.
An important way of looking at this is that they are learning to abstract the methods from the instances in which they have applied them. Thus, there are levels of expertise that one gains; from the basics of Computer Science methods, to larger Object Oriented systems composed from these, to sub-systems of interacting objects, systems of interacting sub-systems, interacting systems, and so on.
At each level, one gains expertise through experience in applying the methods and principles of that level of organization. In this course, we study how to capture and share this expertise, and thus preserve and apply the knowledge gained by experts in software development. We will do this by looking at new ways to encapsulate this knowledge, in descriptions of system architecture (patterns), and in actual packages which embody important architectures (objects, frameworks, components).
Maharishi Vedic Science describes the intimate relationship of language and the structures of Natural Law that they describe/represent. Maharishi describes this in terms of the relationship of Veda and the Vedic Literature. He explains that the pure abstract structure of Natural Law, the Veda, is structured in consciousness; it is directly available for direct experience by anyone, on the purely abstract field of their own pure consciousness. These most fundamental qualities of Natural Law are experienced as the dynamics of Nature, the Laws of Nature. These dynamics are experienced as sound, vibrations in consciousness, and can be expressed in terms of language, and this expression is the Vedic Literature. Maharishi is clear that the Vedic Literature represents and expresses the Veda, but that Veda is in the field of consciousness; parme vyoman, transcendental pure consciousness. The fundamental value of the Vedic Literature is not in its intellectual content, but in its sound value; it expresses the progression of sounds that represent the dynamics of Natural Law, the structures of Pure Knowledge.
This intimate relationship of Veda and Vedic Literature to Natural Law has no counterpart in traditional descriptive systems. But, lacking this, we use the intellectual informational content of our symbolic descriptive systems to capture and express our knowledge of now to build computing systems, and this in itself is very useful. While not at the level of Veda, it does share the attribute that it expresses more abstract levels of knowledge of systems, and thus more general, and powerful principles.
"Once you understand the design patterns and have had an “Aha!” experience with them, you won’t ever think about object-oriented design in the same way. You’ll have insights that can make your own designs more flexible, modular, reusable, and understandable–which is why you’re interested in object oriented technology in the first place…."
Design Patterns (Preface)
Patterns and Laws at the Basis of all Development
Maharishi Vedic Science describes that there is one most basic, most fundamental source of all the Laws of Nature, which taken in its totality can be described as the One Law of Nature. This One Law, the Veda, through the process of self-referral and the resultant spontaneous symmetry breaking, gives rise to the innumerable laws of Nature, expressed in forms, structures, dynamics of the entire Universe.
By knowing that one law, that one field of all dynamics which structures everything in the Universe, one can know anything, do anything. This dynamics of Nature is best described by the Richo-Akshare verse of Rig Veda. This verse describes how only by knowing that most fundamental field can one really have access to the full extent of Natural Law, anything less, is very limited.
Similarly in CS, software, by knowing more abstract patterns of structure, one knows (understands), and can create, a wider range of systems representing Natural systems. By knowing more abstract, general, and powerful principles, one captures the basis of all possible expressions of them; one can know all possible values of some area, by knowing the more fundamental ideas, principles, and knowledge at the basis of the field.
How does this relate to software? Clearly it says that the real field of expertise is knowing the underlying principles and resultant archetypes that are at the basis of all software systems.
It can also be taken to describe how to change (evolve) an existing system into a better form, through application of these principles, and patterns of good software.
For example; Given a system S ( » syntax, existing software), one wants to optimize its Quality metrics (Q), change its structure, re-organize (re-architect, re-factor) to optimize its goodness metrics » SE metrics.
Patterns help to do this. They are underlying patterns of good software, which represent knowledge of good structure which yields Q++ .
One goes from { S » Qs } ® { R(S) » Q++ } via re-factoring, applying patterns.
The goal of the course is well described by Doug Schmidt (http://www.cs.wustl.edu/~schmidt/ ), a leading software architecture expert:
Patterns of Learning
Good design and programming is not learned by
generalities, but by seeing how significant programs can be made clean, easy to read, easy
to maintain and modify, human-engineered, efficient, and reliable, by the application of
good design and programming practices. Careful study and imitation of good designs and
programs significantly improves development skills.
Kernighan and Plauger.
"When people begin to learn to play chess they
first learn all the rules and physical requirements of the game.[1] They
learn the names of all the pieces, the way that pieces move and capture, and the geometry
and orientation of the board. At this point, people can play chess, although they will
probably not very good players. But as they progress, they will learn the principles of
the game. They learn the value of protecting their pieces, and the relative value of those
pieces. They learn the strategic value of the center squares and the power of a threat.
They learn how the king can oppose the enemy king and how even one passed pawn can win the
game.
At this point, people can play a good game of chess.
They know how to reason through the game and can recognize stupid mistakes.
However, to become a master of chess, one must study the games of other masters. Buried in
those games are patterns that must be understood, memorized, and applied repeatedly until
they become second nature. There are thousands upon thousands of these patterns. Opening
patterns are so numerous that there are books dedicated to their variations. Mid-game
patterns and ending patterns are also prevalent, and the master must be familiar with them
all.
So it is with software. First one learns the rules: the algorithms, data structures and languages of software. At this point, one can write programs, albeit not very good ones. Later, one learns the principles of software design. Structured programming, modular programming, object oriented programming. One learns the importance of cohesion and coupling, of information hiding and dependency management. But to truly master software design, one must study the designs of other masters. Deep within those designs are patterns that can be used in other designs. Those patterns must be understood, memorized, and applied repeatedly until they become second nature."
The basic idea of the course is thus the idea that there are some basic patterns at the basis of software development and architecture, and we will then study these patterns, their applications, and their interactions in larger scale levels of software architecture.
[1] Maharishi Mahesh Yogi, Vedic Knowledge for Everyone; Maharishi Vedic University, Introduction, 1994, Maharishi Vedic University Press (p.21).
[2] This chess analogy is courtesy of Robert Martin (rmartin@oma.com).
.