1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267
|
// vim:expandtab:autoindent:tabstop=4:shiftwidth=4:filetype=txt:textwidth=80:
/** \page presentation Libsmbios Concept/Design Review Presentation
<H2>Why libsmbios?</H2>
<p>Many systems management applications require access to data stored in the
system SMBIOS table. Some sort of uniform mechanism is needed by diverse
groups across Dell to access SMBIOS information. Currently there are
numerous disjoint libraries within Dell used by various groups to get this
information. This is not acceptable because we are collectively duplicating
work instead of solving the underlying problem.
<p>In this presentation, I have attempted to list all of the various reasons
I have seen for the existing lack of code reuse and sharing in Dell in this
specific area. I have then listed the specific ways in which libsmbios has
sought to address each of these problems. Most of the existing
implementations of code to obtain information from SMBIOS present one or
more of the following difficulties:
\li Dependency Management
\li Changing Requirements
\li Rigidity
\li Fragility
\li Immobility
\li Viscosity of Design
\li Viscosity of Environment
Here is a brief description of each of the above problems, an example of the
problem, and the ways in which libsmbios sets out to help with this problem.
<hr>
<H3>Dependency Management</H3>
<b>Problem:</b> Bringing in one small piece of code necessitates bringing in a pile of
supporting code just to use the one component you want. Developers
become hesitant to bring in code due to this. Some projects have tight
space/depencency requirements that others may not have. Libs that do not
target lowest common denominator are likely to be shunned.
<b>Example:</b> DUP/SVM: managing compatibility against N prior versions of
Disney because they have to work with existing installed version of
Disney.
How libsmbios helps:
- The open nature of libsmbios means users can
"have it their way"(TM) Users/clients can statically link
libsmbios for 'embedded, zero-install' use. Others can depend on a
normal system library compiled.
- The driverless nature of libsmbios means users/clients need not
manage driver dependencies for existing installs.
- Open source means we can get this accepted into the Base OS and
depend on there being a current version installed all the time.
<hr>
<H3>Changing Requirements</H3>
<b>Problem:</b> Code originally written for one project may not be suitable for another
project due to differences in requirements between the projects. For
example, one project might assume a static install on a target system,
while another assumes that it must run with zero-install footprint.
Obviously the latter will have great difficulty using the former,
depending on the assumptions made by the former.
<b>Example:</b> Autry/SVM cannot rely on existing, installed version of Disney
to gather data, neither can they rely on Disney _not_ being installed
and use their own because Disney lacks a contention resolution
mechanism. Catch-22 results.
How libsmbios helps:
- Libsmbios was designed to be 'splittable', ie. the core smbios
parsing code has no external dependencies, and should be able to
be used in any environment.
- Libsmbios is open. Users can submit code to help libsmbios fit
into places the original designers never thought to put it.
- Libsmbios is based upon best-practice design with a solid unit
testing framework. The development team can make changes to the
framework and be confident that the design still works because of
the depth of testing.
<hr>
<H3>Rigidity</H3>
<b>Problem:</b> "Tendency for software to be difficult to change, even in simple ways."
For example, if the software does not have a clear and concise way of
extending the code to support future systems, then people will be
confused about how to add this support when it is needed. They may
attempt to do it the "wrong" way, degrading the design.
<b>Example:</b> Existing code for SMBIOS parsing from almost everywhere has no
automated unit test framework to back up changes to the code. Every
change to the code must undergo an extensive, manual unit test phase to
ensure that problems are caught on every system, from legacy to
yet-to-be released systems. If there are holes in the manual unit test
plan, then there are potential "test escapes".
How libsmbios helps:
- Extensive, in-depth, thorough, and automated unit test suite.
Every change that a developer makes to the core library can
immediately be tested to ensure that it works on every system,
from legacy to development machines. There are over 20 platforms
in the unit test database, with a clear, easy-to-use way to add
new systems to the database. Over 1000 tests are run every time
you run the unit test framework.
- Built-in code coverage analysis. Every time you add code, you can
inspect the code coverage analysis to ensure that the unit test
framework is actually hitting the code that has been changed or
added.
- Built-in leak-detection analysis. Built-in leak detection when
automated unit tests are run ensure that no memory leaks are added
to the codebase.
- To sum up: you can make changes to the codebase with confidence
that you will not break working code.
<hr>
<H3>Fragility</H3>
<b>Problem:</b> "Tendency of software to break in many places each time it is changed."
Closely related to Rigidity. This describes that aspect of software
engineering where adding a new feature breaks previously-working
features, or fixing a bug in one configuration breaks another
configuration.
<b>Example:</b> Everybody can supply their own example here where a change in
one spot of the code broke a completely unrelated module. :-)
How libsmbios helps:
- see above under "Rigidity".
<hr>
<H3>Immobility</H3>
<b>Problem:</b> "Inability to reuse software from other projects or from parts of the
same project."
<b>Example:</b>
How libsmbios helps:
- Open nature of libsmbios encourages everybody do both do their own
thing and also contribute back their findings or new code.
- Portable design. Libsmbios is designed from the ground up to be
portable to different OSs with minimal work and with little to no
impact on existing platforms.
- Existing projects within Dell cannot do things like support a
completely new OS, for example SuSE, Debian, FreeBSD, Solaris, or
BeOS without official support by the development team. Few
development teams would go out of their way to support non-Tier-1
OSs. The Open nature of libsmbios, combined with a design that
keeps an eye open for portability helps. People like Custom
Engineering can maintain support for these platforms without
impacting the mainline code. This means that Custom Engineering
can benefit from the design and bugfixes in the mainline version
without having to keep their own complete standalone version
around and in-sync.
<hr>
<H3>Viscosity of Design</H3>
<b>Problem:</b> When "design preserving" methods of change are harder to employ than
design-destroying methods of change.
<b>Example:</b> Disney code to get System ID. One 300-line C function that
covers all platforms. Developers adding a new system to this
function are faced with the daunting task of figuring out _how_ to do
this with no concrete way of knowing that their change broke no legacy
platforms.
How libsmbios helps:
- All functions where it is anticipated that there will be a
different way of doing things in the future have been made
extensible from the start. This makes it easy for engineers to
come in later and do the "right" thing to add new support.
For example:
- "Workarounds" framework to deal with BIOS bugs.
- Clear, extensible system for getting System ID
- Clear, extensible system for getting System Name
<hr>
<H3>Viscosity of Environment</H3>
<b>Problem:</b> When development environment is slow and inefficient. Long compile
times, long checkin times, etc.
<b>Example:</b> ClearCase
How libsmbios helps:
- Come on guys, libsmbios can't fix <i>everything</i> :-)
<hr>
<hr>
<H2>Design Principles</H2>
<H3>The Open Closed Principle (OCP)</H3>
We should write our modules so that they can be extended, without
requiring them to be modified.
We want to be able to change what the modules do without changing the source
code of the modules.
How this is applied to libsmbios:
- All user/client visible interfaces are expressed in terms of abstract
interfaces. All object creation is done by abstract factories, so
people who want to extend libsmbios can supply their own factory to make
new, user-defined types.
<H3>The Dependency Inversion Principle (DIP)</H3>
Always depend on abstractions rather than concrete implementations.
How this is applied to libsmbios:
- All user/client interfaces are abstract.
<H3>Package Architecture</H3>
The Release Equivalency Principle (REP)
"The granule of reuse is the granule of release"
The Common Closure Principle (CCP)
"Classes that change together, belong together"
The Common Reuse Principle (CRP)
"Classes that are not reused together should not be grouped together."
<H3>Package Coupling</H3>
The Acyclic Dependencies Principle (ADP)
"The dependencies between packages must not form cycles."
The Stable Dependencies Principle (SDP)
"Depend in the direction of stability."
How this is applied to libsmbios:
- Libsmbios is meant to be "stable". The base smbios parsing code
has no external dependencies that would drive libsmbios to
unexpectedly change.
<hr>
<hr>
Statistics:
\li Total .cpp size: ~5200 Raw LOC
<p>~1300 Raw LOC for SMBIOS table parsing
<p> ~800 Raw LOC for SMBIOS CMOS Token parsing/manipulation
<p> ~700 Raw LOC for XML-Enhanced SMBIOS Parsing
<p> ~400 Raw LOC for common
<p> ~450 Raw LOC for Memory access (Linux/Windows)
<p> ~500 Raw LOC for CMOS access (Linux/Windows)
\li Interface size (public .h files, incl docs): ~1600 LOC
\li Implementation headers (private .h, incl docs): ~1200 LOC
\li Portability headers: ~1500 LOC
\li Total code size: ~9500 Raw LOC
- all headers and code files, not including generated headers.
<hr>
<hr>
credits:
\li Material and descriptions shamelessly pulled from:
http://www.objectmentor.com/publications/Principles%20and%20Patterns.PDF
<hr>
<p>
<p><small>there isn't anything else here. go back to the main page and look at the
pretty pictures. :-)</small>
<p>
*/
|