0% found this document useful (0 votes)
55 views50 pages

(Ebooks PDF) Download Introduction To Software Design With Java Martin P. Robillard Full Chapters

Robillard

Uploaded by

casadpurinvy
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
55 views50 pages

(Ebooks PDF) Download Introduction To Software Design With Java Martin P. Robillard Full Chapters

Robillard

Uploaded by

casadpurinvy
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 50

Get ebook downloads in full at ebookmeta.

com

Introduction to Software Design with Java Martin


P. Robillard

https://ebookmeta.com/product/introduction-to-software-
design-with-java-martin-p-robillard/

OR CLICK BUTTON

DOWNLOAD NOW

Explore and download more ebook at https://ebookmeta.com


Recommended digital products (PDF, EPUB, MOBI) that
you can download immediately if you are interested.

VMware Software Defined Storage A Design Guide to the


Policy Driven Software Defined Storage Era 1st Edition
Martin Hosken
https://ebookmeta.com/product/vmware-software-defined-storage-a-
design-guide-to-the-policy-driven-software-defined-storage-era-1st-
edition-martin-hosken/
ebookmeta.com

Java Foundations Introduction to Program Design and Data


Structures (5th Edition) John Lewis

https://ebookmeta.com/product/java-foundations-introduction-to-
program-design-and-data-structures-5th-edition-john-lewis/

ebookmeta.com

Java Foundations Introduction to Program Design and Data


Structures 4th Edition John Lewis

https://ebookmeta.com/product/java-foundations-introduction-to-
program-design-and-data-structures-4th-edition-john-lewis/

ebookmeta.com

Different For Boys 1st Edition Patrick Ness Tea Bendix

https://ebookmeta.com/product/different-for-boys-1st-edition-patrick-
ness-tea-bendix/

ebookmeta.com
Managerial Economics 12th Edition Christopher Thomas

https://ebookmeta.com/product/managerial-economics-12th-edition-
christopher-thomas/

ebookmeta.com

Clinician s Handbook of Oral and Maxillofacial Surgery 2nd


Edition Daniel M Laskin Eric R Carlson

https://ebookmeta.com/product/clinician-s-handbook-of-oral-and-
maxillofacial-surgery-2nd-edition-daniel-m-laskin-eric-r-carlson/

ebookmeta.com

Clinical Esophagology and Transnasal Esophagoscopy 1st


Edition Peter C Belafsky

https://ebookmeta.com/product/clinical-esophagology-and-transnasal-
esophagoscopy-1st-edition-peter-c-belafsky/

ebookmeta.com

The Design Pathway for Regenerating Earth 2nd Edition Joe


Brewer

https://ebookmeta.com/product/the-design-pathway-for-regenerating-
earth-2nd-edition-joe-brewer/

ebookmeta.com

Evil Intent 1st Edition Jane Isaac

https://ebookmeta.com/product/evil-intent-1st-edition-jane-isaac/

ebookmeta.com
Advanced Practice Nursing in the Care of Older Adults, 3rd
edition Laurie Kennedy-Malone

https://ebookmeta.com/product/advanced-practice-nursing-in-the-care-
of-older-adults-3rd-edition-laurie-kennedy-malone/

ebookmeta.com
Martin P. Robillard

Introduction to
Software Design
with Java
Second Edition
Introduction to Software Design with Java
Martin P. Robillard

Introduction to
Software Design
with Java
Second Edition
Martin P. Robillard
School of Computer Science
McGill University
Montreal, QC, Canada

ISBN 978-3-030-97898-3 ISBN 978-3-030-97899-0 (eBook)


https://doi.org/10.1007/978-3-030-97899-0

© Springer Nature Switzerland AG 2019, 2022


This work is subject to copyright. All rights are reserved by the Publisher, whether the whole or part of
the material is concerned, specifically the rights of translation, reprinting, reuse of illustrations,
recitation, broadcasting, reproduction on microfilms or in any other physical way, and transmission or
information storage and retrieval, electronic adaptation, computer software, or by similar or dissimilar
methodology now known or hereafter developed.
The use of general descriptive names, registered names, trademarks, service marks, etc. in this
publication does not imply, even in the absence of a specific statement, that such names are exempt
from the relevant protective laws and regulations and therefore free for general use.
The publisher, the authors, and the editors are safe to assume that the advice and information in this
book are believed to be true and accurate at the date of publication. Neither the publisher nor the
authors or the editors give a warranty, expressed or implied, with respect to the material contained
herein or for any errors or omissions that may have been made. The publisher remains neutral with
regard to jurisdictional claims in published maps and institutional affiliations.

Cover Photograph: © 2017 Circlecreativestudio/iStock

This Springer imprint is published by the registered company Springer Nature Switzerland AG
The registered company address is: Gewerbestrasse 11, 6330 Cham, Switzerland
Preface

This book is inspired by well over a decade of teaching software design at McGill
University. At first, my focus was to explain the software design know-how avail-
able from high-quality references. Soon, however, I realized that the main challenge
of teaching software design lay elsewhere. Communicating how to apply a design
technique or use a programming language mechanism was relatively easy. The real
struggle was to convey in which context we want to use a certain design technique,
and why. To do this, I needed to explain what is going on in a software developer’s
head. Over time, my lectures came to be more about exploring the space of alterna-
tive design decisions one can make in a given context.
The goal of this book is to help readers learn software design by discovering the
experience of the design process. I share my knowledge and experience of software
design through a narrative that introduces each element of design know-how in con-
text, and explores alternative solutions in that context. The narrative is supported by
hundreds of code fragments and design diagrams.
My hope is that this book can serve as an effective resource and guide for learning
software design. However, I do not believe that it is possible to develop significant
design skills solely by reading a book. In my own learning process, I have benefited
hugely from reading other people’s code, regularly writing code, and relentlessly
refactoring existing code to experiment with alternative design solutions. For this
reason, this book emphasizes coding and experimentation as a necessary comple-
ment to reading the text. To support this aspect of the learning process, I provide a
companion website with practice problems, and two sample applications that cap-
ture numerous design decisions. An orientation through these sample applications
is provided in Code Exploration insets throughout the chapters.
As its title indicates, this book provides an introduction to software design using
the Java programming language. The code used throughout the book, as well as the
sample applications, are in Java (version 8). My use of the Java language, however,
is a means to communicate design ideas, and not the topic of the book. I aimed to
cover design concepts and techniques that are applicable in a host of technologies.
Many concepts (such as encapsulation), will be relevant in any technology. Others
(such as inheritance) will be paradigm-specific, but usable in multiple programming

v
vi Preface

languages. For both general and paradigm-specific information, it should be pos-


sible to adapt the examples to other programming languages. In a few cases, the
material needs to address a Java-specific mechanism with implications on design
(for example, cloning). In such cases, I make sure to present the mechanism as one
implementation of a more general idea.
This book is targeted at readers who have a minimum of programming experience
and want to move from writing small programs and scripts to tackling the develop-
ment of larger systems. This audience naturally includes students in university-level
computer science and software engineering programs. However, I kept the prerequi-
sites to specialized computing concepts to a minimum, so that the content is also ac-
cessible to programmers without a primary training in computing. In a similar vein,
understanding the code fragments requires only a minimum knowledge of Java, such
as would be taught in an introductory programming course. Information about Java
that is crucial to understand the text is provided in an appendix, more advanced
features are introduced and explained as necessary, and I make a minimum of ref-
erences to specific elements of the language’s class library. My hope is thus that the
book can be useful to anyone who wants to write clean, well-designed software.

Organization of the Book

The first chapter is a general introduction to software design. The subsequent chap-
ters provide a progressive coverage of design concepts and techniques presented as
a continuous narrative anchored in specific design problems. In addition to the main
content, the book includes different features to orient readers and help use the book
as a launchpad for further exploration and learning.
• Chapter Overview: At the beginning of each chapter, a callout lists the concepts,
principles, patterns, and antipatterns covered in the chapter.
• Design Context: Following the overview, a paragraph titled Design Context in-
troduces the design contexts that are used as running examples in the chapter. It is
thus not necessary to read all previous chapters to understand the code discussed
in a given chapter.
• Diagrams: Each chapter includes numerous diagrams that illustrate design ideas.
Although they are provided to illustrate the ideas in the text, the diagrams are also
realistic illustrations of diagrams that can be used in practice as part of design
discussions.
• Code Fragments: Each chapter includes many code fragments. The code gen-
erally follows the conventions presented in Appendix B, with occasional con-
cessions made to make the code more compact. A complete version of the code
fragments can be downloaded from the companion website (see below).
• Insights: In each chapter, the main numbered sections are followed by an un-
numbered section titled Insights. This section forms an actionable summary of
the key information and advice provided in the chapter. It is meant as a catalog of
applicable design knowledge, and assumes the material in the chapter has been
mostly assimilated. The insights are in bullet points to be easily perused.
Preface vii

• Code Exploration: At various points in the text, insets titled Code Exploration
provide a discussion of software design in practice. To facilitate good flow and
avoid getting lost in details, the design contexts discussed in the main chapters
are kept as simple as possible. As a result, some interesting aspects of the soft-
ware design experience do get lost in the simplification. The code exploration
activity is the opportunity to consider how some of the topics presented in the
chapter manifest themselves in reality. The Code Exploration insets points to
specific parts of the code of the sample applications. In concert with reading the
text of a Code Exploration inset, I recommend reviewing the code referenced
and trying to understand it as much as possible. The sample applications are de-
scribed in Appendix C. They include JetUML, the application used to create all
the diagrams in the book.
• Further Reading: The Further Reading section provides pointers to references
that complement the material presented in the chapter.
• Companion Website Additional resources for this book are available in the
repository https://github.com/prmr/DesignBook. The material in the repos-
itory includes a complete and commented version of the code that appears in the
chapter content, as well as practice exercises and their solutions.
• Sample Applications The two Java applications described in Appendix C were
developed following many of the principles and techniques described in the book,
and are provided as an accessible basis for additional study and exploration.

Acknowledgments

I am most grateful to Mathieu Nassif, who carried out a detailed technical review
of the entire manuscript of the first edition, providing me with hundreds of correc-
tions, suggestions, and interesting points for discussion. I warmly thank Jin Guo for
reviewing most of the chapters and testing some of the material in her own teach-
ing, and Alexa Hernandez, Kaylee Kutschera, Brigitte Pientka, and Clark Verbrugge
for feedback on various parts of the manuscript. I am also thankful to Ralf Gerst-
ner, the executive editor in charge of computer science at Springer, for believing
in the project from the start and for seeing it through with his usual diligence and
professionalism.
As this is the second edition, I am also very grateful to my readers and to the
instructors who have adopted the book to support their teaching. The enthusiasm
many have expressed has been a major source of motivation for me to continue this
project. The feedback I received, and the numerous interesting discussions I had
about the content, were an invaluable contribution to this revised text.

Martin P. Robillard
April 2019
December 2021
Contents

1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1 Defining Software Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2 Design in the Software Development Process . . . . . . . . . . . . . . . . . . . 6
1.3 Capturing Design Knowledge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.4 Sharing Design Know-How . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Insights . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

2 Encapsulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.1 Encapsulation and Information Hiding . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.2 Encoding Abstractions as Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.3 Scopes and Accessibility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.4 Object Diagrams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.5 Escaping References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.6 Immutability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.7 Exposing Internal Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.8 Input Validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.9 Design by Contract . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Insights . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

3 Types and Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43


3.1 Decoupling Behavior from Implementation . . . . . . . . . . . . . . . . . . . . . 43
3.2 Specifying Behavior with Interface Types . . . . . . . . . . . . . . . . . . . . . . 46
3.3 Class Diagrams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.4 Function Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.5 Iterators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
3.6 The I TERATOR Design Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
3.7 The S TRATEGY Design Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
3.8 Dependency Injection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
3.9 The Interface Segregation Principle . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

ix
x Contents

Insights . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

4 Object State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
4.1 The Static and Dynamic Perspectives of a Software System . . . . . . . 67
4.2 Defining Object State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
4.3 State Diagrams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
4.4 Designing Object Life Cycles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
4.5 Nullability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
4.6 Final Fields and Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
4.7 Object Identity, Equality, and Uniqueness . . . . . . . . . . . . . . . . . . . . . . 83
4.8 The F LYWEIGHT Design Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
4.9 The S INGLETON Design Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
4.10 Objects of Nested Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Insights . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97

5 Unit Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
5.1 Introduction to Unit Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
5.2 Unit Testing Framework Fundamentals with JUnit . . . . . . . . . . . . . . . 102
5.3 Organizing Test Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
5.4 Metaprogramming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
5.5 Structuring Tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
5.6 Tests and Exceptional Conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
5.7 Encapsulation and Unit Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
5.8 Testing with Stubs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
5.9 Test Coverage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Insights . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

6 Composition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
6.1 Composition and Aggregation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
6.2 The C OMPOSITE Design Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
6.3 Sequence Diagrams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
6.4 The D ECORATOR Design Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
6.5 Combining C OMPOSITE and D ECORATOR . . . . . . . . . . . . . . . . . . . . . 142
6.6 Polymorphic Copying . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
6.7 The P ROTOTYPE Design Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
6.8 The C OMMAND Design Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
6.9 The Law of Demeter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
Insights . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
Contents xi

7 Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
7.1 The Case for Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
7.2 Inheritance and Typing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
7.3 Inheriting Fields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
7.4 Inheriting Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
7.5 Overloading Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
7.6 Polymorphic Copying with Inheritance . . . . . . . . . . . . . . . . . . . . . . . . 171
7.7 Inheritance Versus Composition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
7.8 Abstract Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
7.9 Revisiting the D ECORATOR Design Pattern . . . . . . . . . . . . . . . . . . . . . 181
7.10 The T EMPLATE M ETHOD Design Pattern . . . . . . . . . . . . . . . . . . . . . . 182
7.11 Proper Use of Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
Insights . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193

8 Inversion of Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195


8.1 Motivating Inversion of Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
8.2 The Model–View–Controller Decomposition . . . . . . . . . . . . . . . . . . . 198
8.3 The O BSERVER Design Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
8.4 Applying the O BSERVER Design Pattern . . . . . . . . . . . . . . . . . . . . . . . 209
8.5 Introduction to Graphical User Interface Development . . . . . . . . . . . . 217
8.6 Graphical User Interface Component Graphs . . . . . . . . . . . . . . . . . . . . 219
8.7 Event Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
8.8 The V ISITOR Design Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
Insights . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242

9 Functional Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243


9.1 First-Class Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
9.2 Functional Interfaces, Lambda Expressions, and Method References 245
9.3 Using Functions to Compose Behavior . . . . . . . . . . . . . . . . . . . . . . . . . 252
9.4 Using Functions to Supply, Consume, and Map Objects . . . . . . . . . . 257
9.5 First-Class Functions and Design Patterns . . . . . . . . . . . . . . . . . . . . . . 261
9.6 Functional-Style Data Processing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
Insights . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274

A Important Java Programming Concepts . . . . . . . . . . . . . . . . . . . . . . . . . . 275


A.1 Variables and Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
A.2 Objects and Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
A.3 Static Fields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
A.4 Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
A.5 Packages and Importing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
A.6 Generic Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
A.7 Collection Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
A.8 Exception Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
xii Contents

B Coding Conventions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283

C Sample Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287

References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289

Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
Chapter 1
Introduction

In 1988, a fascinating little piece of code hits the limelight. That year, one of the
winners of the annual International Obfuscated C Code Contest features a program
that writes out to the terminal console the text of an eighteenth-century poem titled
The Twelve Days of Christmas. Figure 1.1 shows the first three verses of the text, as
they appear on the output console when executing the code. This poem is particular
in that its text has a regular structure. Text with such a structure is amenable to being
constructed by software in a way that goes beyond printing hard-coded data. With
a poem like The Twelve Days of Christmas, there was thus opportunity for creating
a clear and compact solution for displaying a poem on the console. However, as
promised by the name of the contest where it was featured, the program is anything
but clear. If fact, its inner workings are unfathomable. Figure 1.2 reproduces the
complete code of the program.

On the first day of Christmas my true love gave to me


a partridge in a pear tree.

On the second day of Christmas my true love gave to me


two turtle doves
and a partridge in a pear tree.

On the third day of Christmas my true love gave to me


three French hens, two turtle doves
and a partridge in a pear tree.
...

Fig. 1.1 Partial output of The Twelve Days of Christmas program of Figure 1.2

This quirky piece of computer science trivia illustrates the impact of a lack of
self-evident structure in software. Here, we have a programming problem with triv-
ial requirements: the functionality of interest requires no input and produces a sin-

© Springer Nature Switzerland AG 2022 1


M. P. Robillard, Introduction to Software Design with Java,
https://doi.org/10.1007/978-3-030-97899-0_1
2 1 Introduction

main(t,_,a ) char* a;{return!0<t?t<3?main(-79,-13,a+main(-87,


1-_,main(-86, 0,a+1 )+a)):1,t<_?main( t+1, _, a ):3,main(-94,
-27+t, a )&&t == 2 ?_<13 ? main ( 2, _+1,"%s %d %d\n" ):9:16:
t<0?t<-72?main( _, t,"@n’+,#’/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+\
,/w{%+,/w#q#n+,/#{l,+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/’r :’d*’\
3,}{w+K w’K:’+}e#’;dq#’l q#’+d’K#!/+k#;q#’r}eKK#}w’r}eKK{nl]\
’/#;#q#n’){)#}w’){){nl]’/+#n’;d}rw’ i;# ){nl]!/n{n#’; r{#w’r\
nc{nl]’/#{l,+’K {rw’ iK{;[{nl]’/w#q#n’wk nw’ iwk{KK{nl]!/w{\
%’l##w#’ i; :{nl]’/*{q#’ld;r’}{nlwb!/*de}’c ;;{nl’-{}rw]’/+,\
}##’*}#nc,’,#nw]’/+kd’+e}+;#’rdq#w! nr’/ ’) }+}{rl#’{n’ ’)# \
}’+}##(!!/"):t<-50?_==*a?putchar(31[a]):main(-65,_,a+1):main
((*a == ’/’)+t, _,a+1):0<t?main ( 2, 2 , "%s"):*a==’/’||main
(0,main(-61,*a,"!ek;dc i@bK’(q)-[w]*%n+r3#l,{}:\nuwloca-O;m\
.vpbks,fxntdCeghiry"),a+1);}

Fig. 1.2 Source code of the 1988 The Twelve Days of Christmas C program by Ian Phillips. This
code compiles and executing it will produce the output illustrated in Figure 1.1. © 1988, Landon
Curt Noll and Larry Bassel. Reproduced with permission.

gle, unchangeable output. Yet, the code to support this functionality cannot be un-
derstood by a normal human being. But what is the problem, if the code works?
Software needs to change, and for software to change, at least one person must
be involved at some point. Software needs to change for a variety of reasons, from
fixing bugs to adapting the code to an evolving world. For example, many of the
gifts referred to in the poem are European birds (e.g., partridge, turtle doves, French
hens). Contemporary software development best practices include the localization
of software applications, namely, the option to tailor a software application to ac-
count for region-specific characteristics. It would thus be nice to adapt the code of
the application to replace the name of European birds to some that readers could re-
late to based on their own region (for example, to replace partridge with turkey for
North American users). To modify a piece of code, however, one must understand
its structure, and this structure must, to a certain extent, accommodate the change.
In the case of The Twelve Days of Christmas, any ambition to ever change the code
is hopeless.
The example of The Twelve Days of Christmas is facetious for sake of illustration.
Because this code was obfuscated on purpose, it would be comforting if we could
discount it as irrelevant. Unfortunately, because writing messy code is often the
path of least resistance in the complex social, technological, and economic reality
of software development, badly designed code is not hard to find. For example, in a
famous high-profile case where automotive software was determined by the courts
to be responsible for a fatal accident, the experts who reviewed the software likened
its structure to that of a bowl of spaghetti. Whether code is cryptic purposefully
or accidentally, the result is similar: it is hard to understand and change without
introducing errors.
1 Introduction 3

To explore the contrast, let us design a version of the program where the structure
is evident. Consistently with the rest of the code in this book, the program is in Java.
First, we can tackle the issue of producing the first line of a verse:
static String[] DAYS = {"first", "second", ..., "twelfth"};

static String firstLine(int day) {


return "On the " + DAYS[day] +
" day of Christmas my true love gave to me:\n";
}

This code is clear because the function is short, it abstracts an obvious concept
(the creation of the first line), and the only parameterization involved maps directly
to the problem domain (changing the day).
The second sub-problem is to create the list of gifts for a given day. In this case
we can leverage the inherent recursion in the poem’s structure to organize the code
in a function that creates a list of gifts by adding the last gift to a smaller list of gifts:
static String[] GIFTS = { "a partridge in a pear tree",
"two turtle doves", ... };

static String allGifts(int day) {


if( day == 0 ) {
return "and " + GIFTS[0];
}
else {
return GIFTS[day] + "\n" + allGifts(day-1);
}
}

The allGifts function provides a classic implementation of a recursive algo-


rithm. In this case, the code’s structure is explicit because it trivially realizes a foun-
dational strategy in computing.
At this point the only thing left it to put the poem together by assembling the
twelve verses. Here the only small issue is that in the first verse, we do not add the
conjunction and in front of a partridge. No matter how small a program, it can be
difficult to completely avoid annoying corner cases.
static String poem() {
String poem = firstLine(0) + GIFTS[0] + "\n\n";
for( int day = 1; day < 12; day++ ) {
poem += firstLine(day) + allGifts(day) + "\n\n";
}
return poem;
}

At a glance, we see the overall structure of the code: a special case for the first
verse, then an iteration through the remaining eleven verses, where each verse is
created by concatenating the output of two functions: one to create the first line, and
the other to create the list of gifts.
4 1 Introduction

1.1 Defining Software Design

Software design is a mysterious activity. For many software development projects,


if you ask for “the design” for the software system, you may get a blank look.
The “design” is not necessarily something you can retrieve and look at. Similarly,
very few people walk around with the title of “software designer”. In that sense,
designing software is not like designing furniture or clothing.
There are many definitions of software design, each with a different focus. The
word design is also both a verb and a noun, which adds to the ambiguity because
it can thus refer to both a process (to design) and the outcome of this process (a
design). My working definition of software design (the process) is the construction
of abstractions of data and computation and the organization of these abstractions
into a working software application. At first this may sound overly restrictive, but
when we consider everything that the term abstraction can mean (variables, classes,
objects, etc.), we see that we are afforded quite a bit of flexibility for interpreting
what software design means.
In practice, the design process is essentially one of decision making. Should we
use a list or a stack? What services should this interface offer? Where should this
error be handled? Considering design as decision making leads to the concept of
a design space. A design space can be imagined as an n-dimensional geometric
space where each dimension corresponds to a design quality attribute. Typical de-
sign quality attributes for software include understandability, reusability, and ease
of implementation. Within such a design space, each specific design decision (or co-
herent set of decisions) corresponds to a coordinate in the space that represents the
consequence of the decision. Figure 1.3 illustrates the idea with two dimensions. In
practice, any design decision is likely to be good in some dimension, but less good
in other dimensions, something we call a design trade-off.
Two sub-spaces of the design space that are useful to consider are the space of
possible solutions, and the space of acceptable solutions. We can observe that the
theoretically optimal solution, which best satisfies all dimensions at the same time,
is unlikely to be possible. Design is a decision process for which there is rarely a
single “right answer”, only solutions that are better or worse in some dimensions
(including some solutions that are pretty bad in most dimensions).
The concept of a design space may make it look like selecting a design decision is
a systematic, almost mathematical process. This is not the case. Where the analogy
breaks down is that a geometric space is completely defined, whereas the reality of
software design is rife with uncertainty. First, not all possible decisions are known
and, in complex situations, there may be an infinity of them. Second, estimating to
what extent a design decision fulfills a given quality attribute (e.g., understandabil-
ity) is a very approximate process. Consequently, there is no standard formula for
arriving at a point in the design space. In most realistic software development con-
texts, it will not be the case that to design and implement a software requirement,
we can follow a pre-determined set of steps. Software design is a highly heuristic
process: it consists of iterative problem-solving guided by experience, general prin-
Other documents randomly have
different content
den einder, waar Brendel stond, hoog, klaar, met schitterend kuras
en manmoedig den aanval des jongelings afwachtend.

Herebaeld staarde hem na, hoe hij reed op ’t witte ros door het
hooge gras, moedig op Brendel aan en dacht:

„Zoo waar, ik geloof dat de kloeke jonge vorst ons wreken zal.” En
zijn vuist tegen de ster ballend zeide hij: „Wacht du, misleider. Du
zult weten, dat du ons op dwaalwegen hebt gevoerd.”

Onderwijl reed prins Istovar in woesten galop voort, op den vijand


aan. Maar deze, hoewel voorzien van een gouden kuras, week laf
terug en hoe sneller Zeven draafde, des te sneller vluchtte Brendel.
[98]

„Kortzwaard tegen kortzwaard!” riep prins Istovar. „Sta zeg ik, als du
kampen durft!”

Maar Brendel week steeds achterwaarts en Zeven begon reeds te


hijgen. De prins spoorde zijn ros opnieuw aan, toen dit plotseling
zijn vaart inhield, de voorpooten gestrekt voor zich uitspalkend en de
achterpooten inhurkend.

Prins Istovar buitelde schier over den kop van Zeven heen. Hij steeg
af, nam het paard bij den teugel en keek om zich heen om te
ontdekken, wat het paard verschrikt had. Boven aan den hemel was
een zware wolk voor de sterren geschoven. De prins keek op en
merkte het:

„Dus zijt du dan toch eindelijk afgestegen! Welaan, kom op,


kortzwaard tegen kortzwaard. Hier staat prins Istovar thoe Mjellego!”

In ’t vage duister van den laten avond zag de prins nu uit een
boschje Brendel naderen, maar in zwarte rusting, gelijk roovers die
plegen te dragen. Het was een groote, zware vijand, die vooraf werd
gegaan door een klein, zwart paard. Nu hij nader kwam zag hij, dat
Brendel op een wagen zat en dat achter in de wagen nog drie
roovers hadden plaats genomen.

De prins steeg weder te paard, stuurde Zeven zoo dat het ros met
een sprong midden voor de kar van Brendel stond en met Thoering
dreigend riep hij:

„Bij Baduhenna, stel di te weer, kortzwaard tegen kortzwaard.”

Brendel hield zijn klein ros in en nu, in het vage duister zag de prins
hoe de vier roovers samenspraak hielden.

„Bij Baduhenna … weert di … Thoering tegen één, Thoering tegen


twee, Thoering tegen drie, Thoering tegen vier … Eén tegen vier …
hier staat prins Istovar thoe Mjellego … weert di!”…

Opeens sprongen de vier roovers uit de kar en elk vluchtte naar een
andere zijde.

De prins gaf een ruk aan den teugel van Zeven en rende een roover
na. Deze, zich omkeerend riep: [99]

„Niet ik, de andere draagt het kortzwaard!”

Daarom wendde de prins den teugel en vervolgde nu den tweede.


Ook deze hield stil en riep:

„Niet ik, de andere draagt het kortzwaard!”

En de derde nu naderend, verwees deze hem naar den vierde.

De vierde hield stand en wachtte den ruiter af.

„Kortzwaard tegen kortzwaard!” schreeuwde de prins, blakend van


krijgsvuur.
„Prins!” antwoordde de roover, „niet ik ben di waardig, doch mijn
hoofdman. Hij nadert daar ginds met zijn stoet. Als du moed hebt,
kamp dan met deze. Maar ik vrees, dat du den strijd zult verliezen!”

Prins Istovar antwoordde niet; hij zag in de verte, vaag in ’t half


duister Brendel zitten op een hoogen triomfwagen, ’t kortzwaard aan
de zijde en omgeven door een stoet van piekeniers. Onvervaard
snelde hij op den vijand af en voor diens karos inhoudend, hield hij
Thoering vooruit en schreeuwde:

„Hier staat prins Istovar thoe Mjellego, kortzwaard tegen


kortzwaard!”

Een vreeselijke verwarring ontstond in den stoet van Brendel. De


piekeniers wierpen op ’t gezicht van den dapperen prins hoog op
Zeven met Thoering dreigend in de vuist, hun pieken weg en renden
naar alle zijden in ’t hooge gras om zich te redden. Alleen Brendel op
den triomfwagen hield koen stand en trok zijn kortzwaard, terwijl
achter hem drie donkere gestalten oprezen, die in de triomfwagen
zich hadden bevonden.

„Hier staat prins Istovar thoe Mjellego—Vrijheid alle tijd! Noem dijn
kampspreuk!”

„Ik worstel en kom boven!” antwoordde Brendel, van de wagen zich


latend glijden en nu, met getrokken kortzwaard onvervaard
toeloopend op den prins.

De prins steeg nu ook van Zeven en Thoering recht voor zich


houdend, met de punt hemelwaarts, vroeg hij: [100]

„Dappere kampioen—uw strijdnaam?”

„Koning Gise van Bedekoog!” klonk het in ’t half duister van den
stillen nacht.
„Koning, aan u den eersten streek.”

Koning Gise, naar de regelen der schermkunst met het kortzwaard,


liet zijn zwaard glijden langs het zwaard van den prins, zoodat beide
kampioenen zich overtuigen konden, dat de zwaarden even lang
waren. Daarna, eveneens volgens de regelen, bleven de beide
hooggeborenen zoo staan en zeiden elk hun laatsten wensch, opdat,
mocht na den eersten stoot reeds een kampioen vallen, de
tegenpartij den laatsten wensch kon overbrengen of vervullen.

„Dat Harimona wete, dat mijn bloed voor haar vloeide!” riep prins
Istovar.

„Dat Harimona wete, dat mijn bloed voor haar vloeide!” antwoordde
Koning Gise.

„Wat? Ook du?”

„Wat? Ook du?”

De beide kampioenen lieten dadelijk het zwaard zinken.

De prins wilde wel een roover bekampen maar niet een eerlijken
mede-minnaar en daarom stak hij Thoering op, zich
verontschuldigend bij Koning Gise over zijn uitdaging.

„Hoe kwam du er toe jongeling, mij uit te dagen?” vroeg Koning


Gise.

„Die voor di uit reden, zeiden mij, dat du Brendel waart, den grooten
roover, den vijand van Sigbert, den Batouwer. En daar ik avonturen
zoek, wilde ik di te lijf.”

„Hoe jammer, dat du niet vroeger mijn weg gekruist hebt. Want dan
hadde du uw kloeken arm kunnen leenen in het groote gevecht, dat
ik en mijn mannen gevoerd heb met Fridbold, den beruchten roover
uit het woud van Gibick en zijn veertig rotgenooten.”

„Waar is de roover?” vroeg de prins, Thoering al weder trekkend.

„Du komt te laat, moedige borst. Ik zelf heb den gruwelijken


[101]booswicht en zijn gezellen verjaagd. Maar als du wilt, zoo sluit di
aan bij mijn stoet en neem het opperbevel over mijn garde. Ook zal
ik di dan bekostigen en grooten lof doen toezingen door mijn drie
koks. Doch het is al laat vriend. Mijn stoet is vermoeid en de
dagreizen zijn lang. Kom mede en leg di ter ruste.”

Onderwijl was Melle, doodelijk bevreesd voor ’t lot van den prins, die
alleen in den laten avond op een ster was toegerend, zijn heer
gevolgd. Hij liep langen tijd een eind achter Zeven aan, maar het
gelukte hem niet, het paard in te halen. Toen de prins door de
ontmoeting met Koning Mise en zijn drie dichters eenig oponthoud
had, kwam de waakzame dienaar, eindelijk buiten adem bij den prins
en hoorde juist hoe Koning Mise, den moedigen jonkman alleen op
een troep gevaarlijke roovers afzond, het verderf te gemoet. Daar
Melle, ademloos, Zeven die weder in galop verder rende, niet
vermocht te volgen, keerde al zijn verbittering zich tegen Koning
Mise, dien hij, bij den schouder vattend toeriep:

„Sta ellendige. Werwaarts zondt di mijn heer?”

„Naar den grooten roover Brendel, ginds!” antwoordde Mise.

De drie dichters, hun Koning in gevaar ziende en wel wetend, dat


een strijd van vier tegen één, veel stof tot grollen en heldendichten
zou opleveren voor elk der vier, kwamen voorzichtig nader. Melle, de
drie uitgehongerde kerels ziende in hun gescheurde en besmeurde
grijze pijen, twijfelde nu in ’t geheel niet meer er aan, of deze vier
schoeljes behoorden zelf tot de troep roovers, waarover zij spraken
en was er van overtuigd, dat zij den prins in een hinderlaag
gezonden hadden.

Hij greep daarom ook Pimm bij de schouder en hem tegen den
Koning met kracht aankwakkend riep hij: „Grendeldebliksem,
geboefte, du hebt mijn heer verraden. Wacht, dat zult di met den
dood boeten.”

Weder schudde hij den Koning tegen zijn dichter en [102]met zooveel
geweld, dat beiden neusbloedingen kregen.

„Koning!” riep Pimm, „help mij!”

Pill en Pinn wisten niet wat zij zouden doen. Melle had wel is waar
nu zijn beide handen vol, doch toen Pill tot ontzet naderde, gaf hij
hem zulk een schop, dat de magere, verzwakte dichter achterover
tuimelde en zijn handen voor den buik houdend, kreet van pijn.

En weer kwakte Melle den Koning met kracht tegen zijn dichter aan,
zoodat beiden zich voelden bezwijmen.

Nu naderde Pinn, maar de les, die Pill gekregen had, zich ter harte
nemend, bedenkend, dat wie niet sterk is, slim moet zijn, riep hij:

„Sta, du eerlooze. Kampt men zoo tegen vrije lieden? Kortzwaard


tegen kortzwaard, indien du een vrije man zijt en niet een hoorige
hond!”

Melle, op den wapenroep, greep instinctmatig meteen naar ’t gevest


van zijn zwaard. Daardoor liet hij Koning Mise los, die snel terzijde
springend, liep wat hij loopen kon naar den eerstvolgenden boom en
zich niet om de drie dichters bekommerend, klom hij in den boom,
vastbesloten dezen aanvaller op dezelfde wijze in ’t zand te doen
bijten als hij het den roover Fridbold had gedaan. Doch een katuil
vloog verschrikt op en liet een angstig „oehoe!” hooren. Melle, dit
geluid vernemend, dat den dood van een bloedverwant of na-
staande kond, verging opeens alle lust tot gevecht en in een
hartstochtelijk snikken uitbarstend jammerde hij: „O Baduhenna,
ontferm u over uw armen knecht … O Baduhenna, dat het toch mijn
prins niet zijn mochte.… O Baduhenna, neem mij en spaar hem!”

Melle bracht de slip van zijn jachthemd aan de oogen en van dit
oogenblik maakte Pinn gebruik om den slag, dien hij lang beraamd
had, toe te brengen. Melle met zijn vuist een stomp tegen de slapen
gevend, dat de toch al oververmoeide man omtuimelde, kreet hij:
„Vaar naar Balduwina, Friesche stijfkop!” [103]

Toen verdwenen de drie dichters met snelle passen in de richting


van den boom, waaruit de kauts was opgevlogen en troffen hun
Koning, die bezig was met de voorbereiding van zijn aanval.

„Spil geen kracht!” riep Pinn, „ik heb den woesteling neergeveld. Het
was een Fries, want hij roept Balduwina aan. Maar ik gaf hem iets
tegen zijn Friesche kop, dat nog harder was.”

„Is hij goed dood?” vroeg Koning Mise, van boven uit het loover.

„De slag kwam zoo aan,” antwoordde Pinn, „dat hij met zijn kop naar
den grond boog.”

„Is dijn vuist nog heel?”

„Ja, Koning.”

„Dan moeten wij maken, dat wij ver zijn voor hij weer ontwaakt.
Friesche koppen buigen niet—die breken.”

Zelf langs den stam naar beneden glijdend, gaf hij zijn drie dichters
het waardige voorbeeld en vluchtte naar de zijde, vanwaar de prins
op Brendel was aangereden. Zij liepen als lieden, die weten dat het
leven van hun snelheid afhangt. Terugkeeren naar ’t kamp van
Koning Gise dorsten zij niet, voor zij bij helderen dag konden zien,
hoe den afloop geweest was van ’t gevecht des dolzinnigen prinsen
met den dikken Koning Gise. Blijven was al even gevaarlijk, daar de
prins kon terugkeeren of Melle zijn bezinning herkrijgen. Daarom
renden zij steeds voorwaarts tot aan het woud, waar Herebaeld
wachtte op de terugkomst van prins Istovar thoe Mjellego, die
Brendel was gaan bekampen.

De blonde jongeling in zijn hemelsblauw overkleed, stond tegen een


eik geleund en staarde naar de schoone ster, die nog altijd helder en
ongekwetst aan de lucht straalde.

„Pas op!” riep Koning Mise, „daar staat het gevolg van den dollen
prins.”

„Kortzwaard tegen kortzwaard!” gilde Pinn moedig, bedenkend dat


vier man tegen één knaap veel stof voor [104]sproken, heldendichten,
sagen, grollen en boerten zou kunnen opleveren.

Herebaeld, de vier magere schooiers ontwarend, verschrok.

„Vrienden!” zeide hij smeekend, „hoewel ik eens heerschen zal, ben


ik nu nog maar een boerenzoon en niet gerechtigd ’t kortzwaard te
voeren en te strijden met zulke hooge lieden als du zijt. Maar als du
kamp zoekt, helpt dan mijn beschermer en medeminnaar prins
Istovar thoe Mjellego die kloekmoedig is uitgetrokken om Brendel te
tuchtigen.”

„Staat gij hier alleen jongeling?” vroeg Koning Mise streng en


waardig.

„Ja heer, mijn vader Sigbert de Batouwer en mijn twee dappere en


kloeke broers zijn ginds in ’t veld en slapen. Ook ’t gevolg van den
prins is daar, veertig uitgelezen lieden onder leiding van den
behoedzamen en onvervaarden Melle, alle Friezen, vaardig met de
saks, de fram, het kortzwaard en de celt.”

„Verwacht du ze niet spoedig hier?”

„Dezen nacht niet, heer. Zij zijn allen zeer vermoeid en slapen en
Melle, die de wacht hield, is opgetrokken om zijn heer bij te staan bij
de tuchtiging van Brendel, die ons op dwaalwegen heeft gevoerd.”

Koning Mise als zijn drie hofdichters, nu geheel gerust gesteld,


zeide:

„Jongeling, wij zijn vier helden, die op avontuur zijn uitgegaan. Het
zou ons weinig moeite kosten di neer te slaan, maar wij zijn
grootmoedig. Blijf hier en wacht tot de dappere prins terugkeert en
zoodra du hem ziet, haast di ons het te voren te melden, opdat wij
hem waardig kunnen ontvangen. Wij zijn in zijn kamp.”

De vier schoeljes, na zich aldus voor verrassingen behoed te


hebben, slopen naar ’t kamp waar het gevolg van prins Istovar sliep.
Zij naderden voorzichtig en na zich wel overtuigd te hebben, dat
niemand waakte, begonnen zij de slapende krijgslieden te bestelen.
Zij sneden de bronzen [105]knoopen van hun jachtrokken, haakten de
bronzen sluitspelden van de mantels, sneden voorzichtig stukken
bont uit de nachtpelzen, ledigden de lederen tasschen met de kleine
stukjes barnsteen, oostersche kralen, schelpjes en schijven albast,
die als pasmunt gebruikt werden en de sterke, schoongewerkte
riemsandalen ziende, die de Friesche krijgslieden droegen, kwam in
den Koning zoowel als in zijn drie dichters, het verlangen op, er een
paar mede te nemen, daar hun voeten, door het vele loopen, reeds
pijnlijk waren en ook omdat zij wel wisten, dat als zij Friesche
sandalen droegen, meer eerbied af te zullen dwingen in Renigo dan
wanneer zij als hoorigen of slaven barrevoets liepen. Voorzichtig
trokken zij een viertal slapers de sandalen van de voeten en nu,
bevreesd betrapt te worden, namen de drie dichters en hun Koning
elk een pak buit en slopen het kamp uit.

Toen zij weder bij Herebaeld kwamen, liep Koning Mise vooruit en
sprak tot den jongeling:

„Vriend, haast di naar het kamp. Wij zijn gevlucht voor de


overmacht, na ons dapper geweerd te hebben. De verfoeielijke
Brendel waart rond in ’t kamp in de gedaante van een kobold met
wel honderd dwergen. Zij kruipen en sluipen en berooven de
getrouwe lieden. Ik zelf trachtte drie kobolden neer te slaan, maar
nauw had ik mijn kortzwaard getrokken, daar veranderden die
schurken zich in muizen en ratten en waren weg voor ik ze kon
treffen.”

Herebaeld voelde ’t hart van angst kloppen. „Hebben zij mijn vader
ook bestolen en mijn broers?”

„Wie zijn dat?” vroeg Koning Mise.

„Sigbert de Batouwer, Reri de zwemmer en Tjeerd, de springer.”

„Waren het die drie groote lieden, die naakt sliepen op berehuiden
met bloote voeten en onder een dek van grauwe wol?”

„Ja … die zijn het.” [106]

„Vriend, haast di. Ik geloof, dat de kobolden hun nog niet beroofd
hebben … Maar haast di, als dijn erfdeel di heilig is!”…

Toen Herebaeld wegsnelde, konden de drie dichters zich niet


weerhouden te lachen en Pill sprak:

De koningen wel gaarne ’t erfdeel laten,


Aan wie, behalve ’t leven, niets bezaten.

Pimm sprak:

Hier snelt een bloed te hulp, beangst om wat?


Daar vâar noch broer een luttel schelpje had.

Pinn sprak:

Wijl Mise weet, hier was geen zool te halen,


Zegt hij den bloed: Red vaderliefs sandalen!

Koning Mise besloot:

Den rijke zult di stelen,


Den arme zult di deelen.

En hij stapte waardig voorwaarts op een paar schoonbewerkte


Friesche snoer-sandalen, gevolgd door zijn drie dichters, die
eveneens flink stapten in de geroofde schoenen.

Een eind verder, terzijde van den weg, veilig voor overval, vloten zij
’t ezeltje, legden den buit neder in ’t karretje, ontstaken een vuur,
hulden zich in hun overkleederen en vleiden zich ter ruste. Maar
voor zij, vroolijk na den welgelukten rooftocht insliepen, sprak Pill:

Wie eerlijk barvoets gaat is maar een poen,


Maar eere werft, wie draagt geroofden schoen.

Pimm sprak:

Geroofde schoen,
Geeft ook fatsoen.

Pinn sprak:
Al kan men niet betalen,
Dan draagt men toch sandalen.

Koning Mise besloot:

In schoenen staand van eerelijke lieden,


Zal men ons voortaan nu veel eere bieden.

[107]
[Inhoud]
HOOFDSTUK XII.

Myst, de oude priester, was den dag nadat hij Sogol in de


Ravenstroth had gevonden, ziek geworden. De lange voetreizen, de
gestadige onrust en de overmatige inspanning van zijn longen,
hadden het lichaam van den ouden man gesloopt. Hij lag nu op een
bed van berevellen in de hut van Sogol, en werd trouw verpleegd
door den Nervischen prins en Haun. Sogol brandde kruiden op
houtskool, wanneer de grijsaard hoestte en hij gaf hem aftreksel te
drinken van gekookt zoethout en klaprozen. Hij bracht gedroogde
hanevoet, iring, rosmarijn en vogelkruid in een uitgeholden steen,
stampte deze kruiden fijn tot poeder, vermengde dit met versche
slakken en gaf dit mengsel den priester te slikken, om den hoest
losser te maken. Doch de lijder kreeg koortsen en voelde zijn einde
naderen. Dikwerf speelde Haun uren achtereen wijsjes om de
gedachten van den zieke af te lijden, maar ook de schoonste wijzen
werden plotseling door benauwde hoest-buien onderbroken. Sogol
had den priester verteld, hoe zijn moeder gestorven was en welke
schandelijkheden de priesters en priesteressen in de heilige hagen
bedreven. Hij verzweeg hem niet, dat hij hier, in de Ravenstroth
gevlucht was uit menschenvrees en menschenhaat. Hoe hij hier nu
al jaren geleefd had, altoos peinzend over het bestaan der goden.
Dat de Stroth door de menschen gemeden werd, omdat ze bang
waren voor den Nickelman uit de Gröhl, maar dat er geen Nickelman
in was. Ook vertelde hij den priester, dat hij zelf door de lieden
rondom voor een wildeman werd gehouden, dien men zeer vreesde,
hoewel hij toch een zachtaardig en hulpvaardig mensch was, die
alleen omdat hij eenzaam in [108]’t bosch leefde, zulke lange haren
en zulk een ruwe baard had gekregen.
Waren de werkelijk geesten en goden niet juist zoo ontstaan als de
meening, dat hij een wildeman was? Had het volk zijn moeder niet
voor een tooverkol gehouden, terwijl hij toch maar al te goed wist,
welk een vroede vrouw ze geweest was? De priesters en de
priesteressen waren met elkaar bedriegelijk volk. Zij bedrogen het
volk met praatjes, waaraan zij zelve niet geloofden met geen ander
doel dan om te kunnen zwelgen en in luiheid en onzedelijkheid te
leven.

De oude priester lag stil op het leger en luisterde toe. Hijzelf, hoewel
diep in ’t gemoed ook twijfelend, voelde zich bevreesd om den
jongen prins, te sterken in diens twijfel. Daarom verdedigde hij het
geloof. Hij sprak van de voorspellingen, die uit waren gekomen, van
de onbedriegelijke voorteekenen, van de berichten van
geloofwaardige lieden, die toch met eigen oogen elfen, nixen,
kabouters en bosch-geesten hadden gezien. Zijn eigen vader was
eens in den winternacht van een verre reis huiswaarts gekeerd. Hij
verdwaalde, hoewel hij een gewijde fakkel had ontstoken, die zijn
pad verlichtte. Het was beginnen te misten. De nevel om hem heen
werd steeds dichter en natter en eindelijk kwam hij aan een groote
woning. Deze trad hij binnen en nu kwam bij in een ruimen hal, hel
verlicht, waar terzijde vreemde, groote potten stonden. Uit een pot
riep een stem: „Ik ben het, dijn grootvader. Mij heeft het zeewijf in
de diepte getrokken en bewaakt mij in haar oelkenpot. Du bent hier
diep in ’t kolle-water en hadde du de gewijde fakkel niet gedragen,
dan zoude du reeds lang verdronken zijn. Want wat du voor mist
hield was water, in welks kolk du bent gezonken, tot in het huis van
het zeewijf. Vlied vóór ze terugkomt want anders bent du gevangen.”
Toen had Myst’s grootvader de ziel uit den pot bevrijd, die als een
lichtje voor hem uit [109]zweefde en hem den weg wees. Eindelijk
zwond de vochtige nevel en de sterren fonkelden hoog aan de lucht.
Den volgenden morgen zag hij, dat zijn schoenen vol zeeslik zaten,
hoewel de wegen overal hard bevroren waren.

„Waarom sloeg dijn grootvaêr niet alle potten stuk en nam de


scherven mee? En waarom wachtte hij het zeewijf niet af om de
staart af te houwen en mede te nemen?” vroeg Sogol duister.

„Een voerman zag eens op de weide,” ging Myst voort, „dat nixen
heldere witte wasch aan den rand van een bron te drogen lagen.
Eén nix zat bij de wasch en wiegde haar kind. Zij vroeg hem het kind
voor haar te wiegen en nadat hij het gedaan had, schonk zij hem
een zweep met barnsteen-versiering. Ik zelf heb de zweep gezien.”

„Het waren beter meester, als du de nix gezien had! Hebt di ooit een
geest gezien?”

„Nooit. Zoo gelukkig ben ik al mijn leven niet geweest,” zei Myst
neerslachtig.

„Dat is het meester. Ook ik zoek en ik vind niet. Ik heb gesmeekt,


geroepen, uitgedaagd, gescholden, getart … alles zonder gevolg. De
geesten toonen zich nooit en wat wij voor het werk van geesten
houden is altijd na te gaan en dan blijkt, dat het geen geest geweest
is maar een dier of een vallende tak of een ander zichtbaar ding.

„Ik had hier een grooten houtmijt en ’s nachts hoorde ik daarin


dikwijls vreemde geluiden. Het was alsof daar iemand zuchtte. ’s
Morgens was er niets te zien en ook niets te hooren, maar zoodra
het duister was, begon het zuchten. Ik hoopte, dat er een kobold
onder zat en heb de heele mijt afgedragen en vond nog altijd niets.
Toch hoorde ik ’s nachts het zuchten weer. Toen ben ik midden in
den nacht moedig met een fakkel gaan kijken en nu hoorde ik ’t
zuchten weer maar onder den grond, waarop de mijt had gestaan.
Ik stak een puntstok in den grond. Het zuchten bleef voortduren. Ik
riep, maar kreeg geen antwoord. Toen [110]legde ik mijn oor op den
grond en luisterde. Ik hoorde nu niet alleen het zuchten maar ook
een brommerig geruisch, alsof daar beneden veel geesten te samen
waren. „Unhold en getwaas!” riep ik, „het gaat tusschen di en mi.” Ik
greep een spade en wierp met krachtige stooten den bodem op. Hoe
dieper ik kwam, des te meer ik ’t zuchten hoorde en ik hield mijn
celt gereed om toe te slaan, als er een zich vertoonde. Opeens werd
de bodem opgewoeld van onderen op en er sloegen met kracht
steenen naar boven en slik en stralen stinkend helle-water, maar ik
wilde zien en sloeg met mijn celt er op in en riep: „Bij Grendel, kom
er uit, stinkend getwaas!” Doch er kwam een wèl stinkwater
opborrelen en dat bleef zoo doorloopen tot nu. Ik heb lang gezocht
in ’t wel-gat om te vinden, wat daar zat. En ik heb het gevonden.…
want later hoorde ik verder weer gezucht en geruisch en ik sloeg
weer den grond stuk en weer spoot een wèl op van stinkwater. Het
zuchten komt van het opslaan van ’t gesmoorde water tegen de
steenen, die den wèl boven afsluiten. Slaat men den steen stuk, dan
schiet de wel uit en ’t zuchten houdt op en ’t onderaardsch
gerommel. Er is daar geen geest.… er is daar niets anders dan een
gröhl diep in den grond, zooals de andere, die vroeger al
doorgebroken is, en waarvan toen domme en laffe lieden
verhaalden, dat er een Nickelman inzat. Ik kan hier wel twintig
wellen slaan met Nickelmannen van die soort. Het is alles leugen van
de geesten; godendienst ontstaat door domheid en lafheid en wordt
door luiheid en leugen in leven gehouden.”

Maar de oude priester, hoewel twijfelend, durfde niet toegeven.

„En wat denkt du dan van Wotan en van Thor en van Frija en van de
Asen? Zou du dan ook die willen verklaren voor bedrog?”

„De groote goden heb ik nog niet onderzocht. Als ik kon vliegen
gelijk de adelaar en opstijgen hoog in de [111]luchten, altoos maar
hooger tot daar waar de zonneschijf staat, dan zoude ik kunnen
weten wat de waarheid is omtrent de groote goden. Als ik
teruggekeerd ben in mijn land en ik ben tot Koning gekozen, zal ik
een vloot van groote schepen doen bouwen. Maar niet om zooals
vader naar ’t Paarden-eiland te gaan om buit en roem, maar ik neem
reuzenzwaarden mee en knappe speerwerpers en dan vaar ik den
verren oceaan in, tot daar waar de wereld eindigt en de groote hel
begint, waar de zeeslangen kruipen en de draken dreigen en de
Nevelingen zweven. Daar meester wil ik zien, zoeken en weten.”

„Bent di niet bang?” vroeg de meester ontzet.

„Ik ben het geweest meester, toen ik den beukengeest naspoorde en


een eekhoorn vond; toen ik den Nickelman zocht en een aal ving;
toen ik den zuchtenden kobold wilde verlossen en een stinkwel zag
opspuiten. Daar ginds meester, zal ik voor op de plecht gereed staan
met mijn speer en ze in den ondergrond drillen. Ik ben wel zeker al,
dat de neveling een groote visch zal blijken te zijn en de afgrond een
groote gröhl, die naar een nieuw land voert.…”

„En als du met dijne schepen dan eens afvalt van de wereld en stort
in ’t niet?”

„Het is dapperder zoo te vallen, dan zooals vader, verzwolgen door


den storm met roofgoed of met de saks in de hand tegenover een
vijand, die dijn vriend had kunnen zijn. Want of zij er zijn of niet zijn,
de groote goden, dat weet ik nog niet. Maar wèl weet ik, meester,
dat zij, zoo zij er zijn, ons slechts kwaad willen en als vijanden
bekampt moeten worden. Een vriend maakt zich bekend maar een
vijand verbergt zich en verstopt zich in geheimen.…”

Terwijl de eenzame denker zoo sprak met den zieken grijsaard, liep
Haun in het woud en zocht naar noten en vruchten of schoot met
zijn speer naar kleinwild en zette strikken op voor vossen en wilde
hoenders. Maar ’t liefste toch blies hij op zijn horen, zich
verbeeldend dat hij krijgers [112]aanvoerde in den oorlog of dat hij
de reidansen mocht blazen bij de offermaagden. Op een dag,
vroolijk toeterend door de stroth loopend, daar hoorde hij weder
denzelfden geest, die ook kon toeteren op den horen. Hij blies een
wijsje en elke toon werd tot drie maal toe herhaald. Den ganschen
dag bleef hij hier spelen, beproevend den boschgeest er toe te
brengen met hem samen te toeteren zooals de Dingher gedaan had.
Maar de boschgeest begreep hem niet, speelde geen eigen ranken
en loovertjes, doch bleef maar altoos driemaal naspelen wat Haun
voorspeelde. Hij riep den boschgeest toe, dat deze zou aanvangen
met de elfenstem en dat hij dan zou invallen met het reckengeluid,
doch de boschgeest riep driemaal terug, dat Haun zou aanvangen
met de elfenstem en hij zou invallen met het reckengeluid. Toen
Haun toegaf en begon met de zoete, hooge tonen begon echter de
boschgeest ook. Dat maakte Haun moedig en hij begon met den
boschgeest te spotten, die niets uit zichzelf kon en altoos na-blies.
Hij werd elken dag moediger Haun, hoewel hij niets ervan zeide tot
den meester en tot Sogol, vreezend dat zij hem zouden bestraffen
wegens zijn spotternij. Haun begon naar den boschgeest te zoeken,
beloofde hem vossevellen en versche eieren, wanneer hij zich liet
zien. Toen de boschgeest niet kwam, legde hij drie vellen van vossen
neer en daarop twaalf versche eieren en riep, dat hij weg zou gaan
en dat de boschgeest ze ongezien mocht wegnemen. De boschgeest
antwoordde hetzelfde terug, maar toch ging Haun naar de woning.
Den volgenden morgen echter lagen de eieren er niet meer, maar
waren leeggegeten, doch de vellen waren er nog.

„Waarom nam di die vellen niet?” riep Haun.

„Waarom nam di die vellen niet?” riep de boschgeest driemaal terug.

„Du bent een ouden praatvaâr!” riep Han.


„Du bent een ouden praatvaâr!” riep de boschgeest driemaal. [113]

„Du bent een blaaskaak!” riep Haun.

„Du bent een blaaskaak!” riep de boschgeest

„Dijn moeder is verdobbeld!” schold Haun.

„Dijn moeder is verdobbeld!” schold de boschgeest

„Dat liegt du. Ik heb bij den Dingher de schat gelaten en zij is al
lange weder vrij!”.…

„Dat liegt du. Ik heb bij den Dingher de schat gelaten en zij is al
lange weder vrij!” riep de boschgeest.

„Du.. du bent nooit bij den Dingher geweest. Die zou di gauw den
schop hebben gegeven, omdat du zoo slecht toetert.”

Toen de boschgeest ook dat herhaalde en zeggen dorst, dat Haun


slecht toeterde sprong hij, zijn speer gereed houdend, in ’t hout en
zocht en riep en sloeg, en tartte en schimpte, maar de boschgeest
antwoordde wel, doch telkens van een andere zijde.

Nu eerst ging Haun er toe over, zijn avontuur aan Sogol te vertellen.

Die lachte en toen de jongen hem zeide, hoe hij den boschgeest had
uitgescholden en hoe hij hem met den speer was nagerend, maar
dat deze niets anders had gedaan, dan zich verstoppen en de
schimpen herhalen, nam Sogol het hoofd van den knaap tusschen
de handen en kuste hem op voorhoofd en wangen en zeide:

„Braaf zoo mijn jongen. Du bent een echte Nerviër. Ik zal di tot
krijgstoeter verheffen op mijn groote reis en di een wapenspreuk
geven.”
„Welke?” vroeg Haun.

„Vreezeloos en trouw!”

Dien dag gingen Sogol en Haun samen naar den boschgeest. Sogol
liet Haun enkele tonen blazen, dan hier, dan daar, dan verder en hij
luisterde scherp naar het antwoord.

’s Avonds, bij ’t haardvuur, sprak hij met Myst over den boschgeest,
den eenige in den stroth, dien hij niet had kunnen verklaren. Hij
bewoonde een zeker deel van den [114]stroth, onder den grond of
terzijde van twee dikke eiken. Zijn gebied was niet heel groot en
Sogol wist precies waar de geest antwoordde en waar niet. Ook had
hij, juist als Haun, den geest op velerlei wijzen genoodigd om zich te
vertoonen, eveneens zonder gevolg. Nu de jongen vertelde, dat de
geest de vossevellen niet had genomen, maar de eieren had
uitgezogen, begon Sogol na te denken. Hij legde op dezelfde plaats
nu ook eieren neder en met een celt gewapend, bleef hij met Haun
dien avond en dien nacht de wacht houden achter een beuk, dicht
bij de eieren, besloten om als de boschgeest de eieren kwam halen,
hem staande te houden of neer te vellen.

Midden in den nacht hoorde zij een geritsel in de dorre bladeren op


den grond. Haun, bevend van vrees, drukte zich tegen Sogol aan,
die onbewegelijk, den steel van den celt vast in de vuist geklemd,
gereed was voor den aanval. Toen zagen zij den boschgeest naar de
eieren sluipen.

„Sta geest!” schreeuwde Sogol op de eieren toespringend.

„Sta geest!”, schalde het driemaal, maar meteen sprong een


gedaante op en vluchtte.

Sogol wierp haar de celt na en raakte haar zoo, dat zij neerstortte.
Haun was Sogol nagesprongen, maar nu zij den geest zagen vallen,
juichten zij beiden een: Ojo, Ojo!

Doch de boschgeest antwoordde van een andere zijde met een ojo!
en de gedaante kon dus niet de boschgeest zijn geweest.

Sogol liep tot daar, waar de gedaante was neergevallen en greep er


naar.

„Grendeldebliksem!” kreet hij, „’t Is een vos!”

En toen zij een toorts hadden aangestoken door een stuk droog hout
te draaien in een doorboord houtblok, zagen zij bij den vlam dat een
magere oude vos, schier tandeloos, die geen dieren meer kon
aanvallen, zich aan de eieren wilde te goed doen. [115]

„Zoo zal de boschgeest ook dijn eieren hebben opgepeuzeld Haun en


de vossevellen hebben laten liggen … hij had er zelf een en dat was
hem genoeg … Ik geloof, dat er geen boschgeest is …”

„Maar wie zou dan hier toeteren?” vroeg Haun.

„Dat zullen wij morgen nog eens onderzoeken.”

Zij gingen met den dooden vos naar de hut. Doch al ’s morgens
vroeg liepen ze weer beiden naar den boschgeest. Nogmaals liet
Sogol Haun toeten.. nu hier, dan daar, dan op een boom en met een
punthout trok hij lijnen langs den grond en maakte teekens om te
onthouden, waar de geest driemaal antwoordde en waar tweemaal
en waar eenmaal en waar de geest niet antwoordde.

Bij de twee eiken was ’t geluid altoos het sterkst.

„Als hij hier is, moet hij hier wonen. Ik zal die eiken omwerpen.”
En nu zag Haun hoe Sogol alleen, gedurende dagen bezig was om
de twee eiken om te werpen. Dat deed hij heel vreemd, niet zooals
in ’t land der Nerviërs, waar zij met lange bronzen messen heen en
weer sneden, doch Sogol groef een geul rondom den stam en wierp
deze vol stukken hars, die hij dan met een grooten steen
fijnstampte. Ook boorde hij in den stam beneden diepe gaten en
stopte die vol met harspoeder. Onderwijl vermaakte Haun zich met
toeteren en nu bij de grenzen van het gebied van den boschgeest
wist, vond hij een aardig spel uit. Hij blies eerst een wijsje, daar
waar de boschgeest niet antwoordde. Dan blies hij in ’t gebied van
den boschgeest ’t zelfde wijsje gedempt, door zijn vuist in den horen
te steken en daarna weer snelde hij buiten ’t gebied en speelde
weder zonder drieschal. En nog voor Sogol de beide eiken zoover
gereed had, dat het hars kon worden aangestoken was Haun zoover,
dat hij, beurtelings op en buiten ’t gebied van den boschgeest
loopend en hij alleen zijn horen blazend, den indruk wekte, alsof er
vier mannen op vier horens speelden. [116]

En weer kuste Sogol den jongen, toen deze hem zijn kunststuk
vertoonde.

Dien dag stak hij het hars niet aan, maar wilde denken en spreken
met Myst, die zich wat beter begon te gevoelen en op vertrekken
aandrong. Sogol vertelde Myst van ’t geen hij en Haun beleefd
hadden, sprak over de onverklaarbare snaakschheid van den geest
en hoe hij hoopte, door het vellen der eiken, hem uit zijn gebied op
te jagen en hen zoo te zien te krijgen … als hij te zien is en als hij
werkelijk bestaat.

„Maar aan hem is het niet mogelijk te twijfelen. Hij laat zich toch
hooren.”

„Dat is de vraag juist. Hij laat zich hooren, maar nooit anders dan
wanneer een ander zich heeft doen hooren. Hoewel wij zijn stem
vernemen, zegt die stem niets anders dan een herhaling van ’t geen
wij gezegd hebben. Met dezen boschgeest gaat het al niet anders
dan met de andere goden, die hun stem niet doen hooren. Deze
schalt onze stem terug.. de anderen zijn herhalingen van
verbeeldingen. Deze twee eiken vormen mijn laatste proefneming.
Zie ik ditmaal niet een echten geest, dan is ’t met mijn geloof voor
goed gedaan en ik zal uit mijn rijk de priesters verjagen.”

Myst maakte zwakke tegenwerpingen. Hij zelf was geneigd Sogol


gelijk te geven, maar hij voelde zijn dood naderen en het denkbeeld,
dat er wellicht geen Walhalla zou zijn, verschrikte hem zoo zeer, dat
hij in stilte begon te bidden tot Wotan en Donar en offers beloofde,
wanneer de boschgeest zich zou vertoonen.

Den volgenden morgen wilde de grijsaard met Sogol en Haun


medegaan. Daar hij nog te zwak was om veel te loopen, legde Sogol
hem op een baar en spande er den beer voor, die na een paar
fiksche slagen begreep, dat hij trekken moest. Haun mocht nu niet
toeten, want de beer, door Sogol in zijn uren van eenzaamheid
afgericht op ’t [117]dansen naar de wijs van den horen, zou ondanks
slaag, het trekken er aan geven om den dans uit te voeren,
denzelfde, die Myst en Haun eens zoo verschrikt hadden. Maar nu
was Haun met den beer vertrouwd en hij bracht hem dikwerf wilde
honing mee uit het woud en de beer duwde gaarne zijn ruige kop
speelsch tegen den jongen muzikant aan.

Bij de twee eiken werd de beer losgemaakt en met een stokslag


naar huis gejaagd. Toen moest Haun nog eens toeteren, opdat Sogol
zich de teekens wel zou herinneren, waar de boschgeest driemaal
antwoordde, waar tweemaal, waar éénmaal en waar zijn gebied uit
was. Nu draaide Sogol een drogen stok tot vlam en stak het hars
aan rondom in de geul om de eiken en in de gaten in den stam. De
drie mannen gingen nu op een afstand staan, opdat zij niet door de
vallende boomen zouden kunnen worden getroffen of door den rook
stikken.

Langzaam begon de hars te branden. Een fijne, aromatische geur


verbreidde zich in ’t bosch, tot daar zelfs waar de drie mannen
stonden, hoewel ze boven den wind naar den brand stonden te
kijken. In den kring van zwarten walm beneden aan den voet der
stammen, vuurde het rosse licht van de vlammen. Het hars in de
gaten vatte nu ook vuur en na een poos stonden de twee
reusachtige eiken aan den voet in brand. De vochtige boomen vatten
geen vlam maar verkoolden langzaam en in de boorgaten, waar de
gloeiende hars gesmolten kwam uitvloeien, sisten de vochten
smorend in ’t roet.

„Blaas nog eens Haun,” zei Sogol.

De jongen blies op zijn hoorn en nog altijd klonken driemaal


dezelfde tonen terug.

De eiken begonnen aan de voeten der stammen doorgebrand te


raken. De trage smook krinkelde en walmde langs de stammen op
en dreef als een nevel van roet onder het loover. Daaruit vielen nu
vogeltjes, bedwelmd door den [118]rook, die Haun snel opraapte en
door ze te beademen, weder wilde opwekken. Maar hoewel de lijfjes
nog warm waren, met de vreemde warmte van vogels, bleven de
oogjes geloken en alleen een trekje met de pooten toonde soms, dat
’t leven nog natrilde.

„Achteruit Haun … Meester, een beetje achterwaarts … ze zullen naar


die zij vallen …”

Met de punt van een lans, hoopte Sogol het hars dat afvloeide,
weder tegen de stamvoeten op, die nu zwart en verkolend door ’t
vuur ingevreten, begonnen over te hellen. Myst was terzij op een
stronk gaan zitten en wachtte angstig maar met groote verwachting
op ’t verschijnen van den boschgeest. Opeens begon een der eiken
te hellen en plotseling nu, eenmaal aan ’t vallen, zonk de zware
boom neer, sleurde met de takken den tweeden mede, die hoewel
nog in den kern vast, met een knak afbrak en meeviel …

„Blaas mijn jongen, blaas!” riep Sogol, verrijzend midden tusschen


het groen der takken, zelf een boschgod gelijkend met zijn bruin
gelaat, zijn donkere, ernstige, glimmende oogen, zijn ruwe, lange,
zwarte baard en zijn lang donkerbruin hoofdhaar, dat den machtigen
rechterschouder gedeeltelijk bedekte, over den linkerschouder, waar
’t berevel met een fibel was vastgestoken, naar achteren was
geworpen.

Haun blies … ditmaal weerklonk geen schal.

„Hij is gevlucht!” riep Myst … „Hebt di hem gezien?”

Sogol sprong door de takken heen en den hoorn van Haun nemend,
liep hij een eind terzijde en blies … Nu kwam de schal flauw éénmaal
terug … Hij snelde naar een andere plaats, daar waar de stem van
den boschgeest gewoonlijk uit de diepte scheen te komen, en blies.
Maar geen schal antwoordde. Hij liep in rechte lijn naar de
tegenovergestelde plaats. Nu weerklonk de hoornstoot eerst luid en
dan iets verder heel zacht

„Wat denkt di ervan?” vroeg Myst, half hopend, dat [119]Sogol in de


vlucht van den boschgeest zou gelooven: „Zou hij gevlucht zijn?”

Sogol lachte bitter.

„Wij zijn dwazen en lafbekken bij elkaar, meester. Er is geen


boschgeest. De boschgeest ligt hier, hier, hier!”
Hij trapte met driftige verachting op de takken der twee gevelde
eiken.

„Als ik ze weer oprichten kon, zooals ik ze heb geveld, dan zou de


boschgeest weer terug komen. Ik heb nu ik zelf blies, het te duidelijk
gehoord. Niet een ander blaast, maar de toon, die ik blies,
denzelfden toon meester, schalde terug. En hier, tegen deze eiken is
de toon altoos aangebotst, zooals een zwaard, dat op een schild
stuit en door de kracht van den slag, terugdrilt. De eigen toon viel
terug en nogmaals terug en nogmaals terug, steeds zwakker omdat
zijn kracht verminderde. Hier tegen den eik en dan tegen dien eik en
dan tegen den grond, zoodat het scheen of ’t geluid uit den grond
kwam, terwijl het van den grond terugsloeg, zooals de bikkel
terugslaat bij het kootjes-spel. Dit is mijn laatste proef geweest
meester—er zijn geen geesten en er zijn geen goden …”

„Sogol wacht di!” riep de oude priester ontzet.

Sogol knarsetandde en zijn borst verheffend alsof hij tegen


onbekende machten met kloeken moed zich ten strijd zette,
trappend op de ameren van ’t vuur:

„Neen meester … er zijn geen goden … noch in, noch op, noch boven
de aarde … Wat daar leeft is de weerklank van ons leven, is de schal
die terugvalt op onzen roep … Wijzelf zijn de goden en als een god
zal ik voortaan strijden tegen hen, die den weerschal hooger stellen
dan den toon des horens zelf …”

Hij plukte eikenloof van de takken der gevallen reuzen, vlocht er


kronen van, zette er een op de witte haren van den priester, een op
de blonde lokken van den jongeling en toen, zichzelf kronend, riep
hij in vervoering uit: [120]
„Blaas den barditus, den Nervischen barditus mijn jongen. Wij zijn
drie goden, grijsheid, wijsheid en jeugd. Hier aan onze voeten liggen
de twee slechte reuzen, die ik geveld heb, vrees en domheid … Wij
zijn de goden en wat daar anders bestaat is de weerklank van ons
zelf … Blaas mijn jongen, blaas, den strijdzang tegen de valsche
goden …!”

En terwijl Haun, blijde met zijn eikenkrans, den Nervischen barditus


blies, met krachtige stooten, die nu niet meer angstig driemaal
weerschalden, liep Sogol, hoog de celt boven zijn hoofd zwaaiend als
snelde hij ten strijd tegen een onzichtbaren vijand vooruit, dansend
van overmoed, roepend in de holle linkerhand, luide het: „Wij zijn de
goden, wij, wij, wij alleen,” tartend omziende tusschen ’t hout en
boven in ’t loover, terwijl achteraan, angstig en nog altoos twijfelend,
de oude priester liep, biddend inzichzelf voor ’t heil van den jongen
prins en toch, diep-in, diep-in nog altijd met vreeze verwachtend,
dat daar een bliksem zou neerslaan uit de lucht van de groote
goden, die de hoovaardij immers bestraffen!… [121]
[Inhoud]
HOOFDSTUK XIII.

Het was sedert dagen feest in Renigo. Harimona, de goddelijke


jonkvrouw, had door Maresag doen aanzeggen, dat zij in deze maan
zitting zou houden. Er waren terzijde van de groote beukenlaan,
loofhutten opgericht voor de priesters, de priesteressen en de
voorname personen, die met hun geschenken wachtten op hun
beurt van toelating. Ver, daar achter aan de lager gelegen delling,
naar de zijde van den breeden Rîn toe, stond het gewone volk
wachtend op de toestemming om haar voorbij te mogen loopen in
den stoet, die gevormd zou worden. In de laatste dagen was het
zeer rumoerig geweest, want de toeloop was groot en de
verschillende stammen, hier bijeen komend, raakten vooral als er
veel bier gedronken was, al licht in strijd en dan riepen de
hoofdlieden hun saks van honderd bijeen en de hoofdman aan de
spits stormden ze, in wigvormige slagorde, op de tegenpartij aan.
Rondom stonden de feestgangers om te genieten van dat schoone
oorlogsspel, en de vrouwen en moeders en bruiden, die mede
gekomen waren, moedigden de mannen aan. Na den strijd lagen
dan de gewonden en de stervenden op het veld en nu weenden en
weeklaagden de vrouwen, maar de mannen, die zich zonder een
klacht verbinden lieten, waren beschaamd omdat zij ’t verloren
hadden en ook wel dreef er ’s avonds een lijk op den stroom van
een, die een wonde in den rug had ontvangen en niet zoo
geschandvlekt, terug wilde gaan naar zijn stam of van een, die zijn
schild had verloren en door een eed gebonden was, zich na dat
verlies het leven te nemen. Maar gruwelijker was het, wanneer
maagden [122]zich verdronken, omdat de bruigom laf was geweest of
gevallen was.

You might also like