Novell Home

OpenEd - Computing: Theory and Practice in Context

From Developer Community

Aims and objectives of Open Education
OpenEd aims to link the development of software to rigorous mathematically based engineering practices and to provide educational materials to facilitate the spread of such practices.

Project Outline

Open Education (OpenEd) will be an on going project to develop educational resources to relate the theory of computing to the practice of computing. Resources will be developed using open source software and at the same time relate these to commercial products. For example an area of interest is the Mono project. When developing examples for Mono consideration will be given to the .NET framework and cross platform development.

The resources will try to be language and platform neutral, one aim being overtime to develop the same examples in different environments and compare the differences.

The general strucuture of the project will be based around the IEEE Computer Society's and ACM's curriculum for computing. Initially the project will concentrate on the Computer Science Volume and the Software Engineering Volume.

NOTE: The area under active devlopment at the moment is the MS 70-536 exam.

Road Map

  • Develop some example resources and add them to the wiki
  • Develop Project Outline and Apply for Novell Project
  • Outline Project Structure

Notes

Project License

The content of the project will be licensed under the GNU Free Documentation License (FDL).

The licensing of code samples will primarily use GNU GPL version 2.

Courses

Courses will target open source platforms with cross platform refeneces to proprietry platforms.

Labs

The initial aim of the project is to produce a number of labs. A lab will be a guided exercise with hands-on examples to illustrate the points being made. The labs under active development are indicated below.

Example Labs:


Resources

Resources are split into primary and secondary. A primary resource is a resource available under an open licence and does not require any form of subscription. A secondary resource requires some form of subscription or purchase. Secondary resources will be replaced if suitable primary resources become available.

Primary Resources

wikipedia

Secondary Resources

First Steps in the Verified Software Grand Challenge

Test Driven Development and Formal Methods - BEAT - The Middle Ground

NOTE: This section will be moved into its own area.

There is considerable emphasis on TDD in the software community, yet when it comes to the details the design of tests seems to be fairly adhoc. At the most rigourous end of software development are formal methods and though these promise great improvements in software quality and reliability they are not yet readily applied. Core to formal methods is the concept of invariants, pre-conditions and post-conditions. To apply this concept consistently means that for every method call during testing, the invariant and pre-condition must be tested before executing the method. While the invariant and post-conition must be tested after the methods executes:

  • Test Before Method
    • Assert Invariant
    • Assert Pre-Condition
  • Execute Method
  • Test After Method
    • Assert Invariant
    • Assert Post-Condition

This may seem like an onerous task, but if interfaces are used the Before Execute After Testing can be implemented in a wrapper class. Using the normal example to start with consider the following interface definition for a stack:

public interface IStack {
        bool IsEmpty { get; }
        void Push (object o);
        object Pop ();
}

The folliwng BEAT class can be defined:

public class IStackBEAT : IStack {

        private IStack stack;
        private IStack before;

        public IStackBEAT (IStack stackToTest)
        {
                stack = stackToTest;
        }

        bool IStack.IsEmpty
        {
                get { return stack.IsEmpty; }
        }

        void IStack.Push (object o)
        {
                AssertInvariant ();
                AssertPushPreCondition (o);
                CopyStack ();
                stack.Execute
                AssertInvariant ();
                AssertPushPostCondition (o);
        }

        object IStack.Pop ()
        {
                AssertInvariant ();
                AssertPopPreCondition ();
                CopyStack ();
                object o = stack.Execute
                AssertInvariant ();
                AssertPopPostCondition(o);
                return o;
        }

        private void CopyStack ()
        {
                before = stack.Clone ();
        }

        private void AssertInvariant ()
        {
                Assert.IsTrue (stack.IsEmpty || !satck.IsEmpty);
        }

        private void AssertPushPreCondition (object o)
        {
                Assert.IsTrue (true);
        }

        private void AssertPushPostCondition (object o)
        {
                Assert.IsFalse (stack.IsEmpty);
        }

        private void AssertPopPreCondition ()
        {
                Assert.IsFalse (stack.IsEmpty);
        }

        private void AssertPopPostCondition (object o)
        {
                Assert.IsTrue (true);
        }
}

Novell® Making IT Work As One

© 2008 Novell, Inc. All Rights Reserved.