Glossary of Services
I call this a Glossary of Services because it explains the various
services I can perform for you as well as other terms (some of which I
created) used by me. Please note that I have delivered all of these
services over my 30 year career. If you have any questions about these
and how I can apply them to your Perl needs, feel free to ask me about
them.
Engineering is all about making informed choices in the problem
domain. Software Engineering is about choosing speed vs. space, simple
vs. complex, flexible vs. fixed, etc. based upon the project requirements, specifications and the training and
experience of the engineer. This page lists many aspects of Software
Engineering but unfortunately many coders only know a few of these and
that limitation affects the quality of their work. I call myself a
software engineer and architect because I apply all of my extensive
training and experience to my projects.
I use the term "granularity" to express different levels of looking at
a software solution. In a computer granularity can range from
microcode (in CISC chips) to assembler to C to Perl to modules to
complete systems. I view software architecture, design
and coding as three different levels of
granularity of the same problem and similarly for system, integration
and unit testing. Choosing the best Granularity to attack a
software issue is paramount if you want to create a effective and
maintainable system.
Architecture is the highest level of granularity in software engineering. Architecture
defines how the system is broken into large
scale components and how they interact with each other. The result of
an Architecture are the public APIs and interfaces, modules and
classes, communication pathways, data flows, etc. Too often developers
skip the Architecture phase and delve directly into design and coding but they
pay for it later on. A good Architecture makes for a cleaner design and much lower maintenance costs. All of my
development projects have been architected first based on proper specifications and that has been proven to
be beneficial over time. I put a larger portion of the project
schedule into architecture than many others do, as much as 20%. When I
created Stem, I spent three months (part time)
working out its Architecture before I even wrote anything down. The design and coding of the
first version took only three more months which reflects on the effort
put into the architecture.
I use the term "Universal API" for the architectural motif where each component can
interact with any of the others in a standardized way. The most well
known universal API is in the set of common text stream utilities on
*NIX systems such as head, grep and sed. They all can be used in
pipelines and read their STDIN, process text and output to
STDOUT. Each such filter used in a pipeline doesn't know anything
about the neighboring programs - that is only known by the higher
level shell script that creates the pipeline. Another example is Stem, where its modules all communicate via message
passing (two-way vs. one-way for shell pipelines) and each module
doesn't know nor care to whom it is communicating. And Stem's configuration files which specify the modules
and their connections to each other are analogous to the shell
pipeline commands. A universal API is a great architecture when you need to create a very
flexible and powerful system but want to keep
the components small and focused. See extreme modularity for another useful
architectural idea.
I use the term "extreme modularity" to describe a way of creating
small focused components in an architecture. It means the components should
be as smart as possible about a very small problem space. As with a universal API, *NIX utilities and Stem are good examples of this concept. *NIX
utilities such as head knows how to get the first lines of a file and
not much else and it does it well. Stem's
Stem::Proc module knows how to fork a process, manage its I/O and
other parts of it. It doesn't know nor care which process it runs nor
how it interacts with other Stem modules as that
is handled in the higher level configuration. The key to a good
extremely modular architecture is choosing
the right granularity of the
components. Too small and you need to use and interconnect too many
components. Too large and you defeat the purpose of focused and small
components by creating monolithic modules.
Design is a middle level of granularity in
software engineering. It is the
translation of the architecture in more
concrete results such as algorithms, data structures, non-public APIs
and interfaces, and other lower level components. This is where you
concern yourself with efficiency and resourse usage. An important
aspect of design is that it should be language independent. Many
developers design in their target language and that can affect things
for the worse because they let a coding
implementation change the general way something should have been
done. You shouldn't do (much) coding when you
are desiging a system. But actual coding from a design should be very straightforward
and not be a complex task. Also testing is
usually designed in parallel with the design of the main project.
Coding is the lowest level of granularity
in software engineering. It is
where you translate the design into actual code
of the chosen language (which should be Perl if possible! :).
Reviewing and commenting on Perl code is one of the most enjoyable
support services I do. That is why it it a key Perl On Call service
and has its own page.
Refactoring is the process of iteravely rewriting reorganizing code
while keeping its current API stable and also consistantly passing a
set of regression tests. This is another service that can be done
incrementally and is an extremely valuable way to improve your code
base and skills. An excellent book on refactoring and dealing with
legacy Perl systems is Peter Scott's Perl Medic.
Best practices are a collection of coding rules
and styles adopted to make your coding more
consistant. They can be a short list used by one developer or a long
manual used corporate wide. There isn't one fast set of Best Practices
as they need to be created to best suit the development team's
needs. A very good resource for this is Damian Conway's new book
called (what else? :) "Perl Best
Practices" which is due out in August 2005. (Read the FAQ for a
surprise regarding this book!).
A system is a set of components and their relationships. Software
components are typically processes, modules and objects. Their
relationships are communication, APIs and interfaces. Creating a
software system is the primary goal of software engineering.
Regular expressions are one of the key components to Perl and can be
difficult to master. I can help solve your regular expressions
problems, improve their efficiency, explain complex ones, and teach
you ways to write better regular expressions.
Technical documentation is hard to make readable and also be accurate.
I have been a technical editor of four Perl books and have written
several articles and talks on Perl. My English skills mesh with my
technical understanding to allow me to create and edit coherent and
clear technical writing.
Stem is a network application toolkit and framework I created. It
emphasizes the two architectural concepts of extreme modularity and universal API. It uses a high level
configuration to specify module instances (objects) and how they
interconnect with each other. Inter-object communication is via
message passing which is its universal
API. Stem's modules are architected to be very smart about focused
issues which is the goal of extreme
modularity. Stem can be used to create simple or complex
applications with much less work designing and coding due to its
powerful architecture. Stem can be found on CPAN and you can read more
about it at stemsystems.com.
Perl comes with over 1000 pages of free well written and accurate
documentation. But that can still be daunting to Perl users who are
learning the language. I can help point out the manual pages that are
related to the topics you are learning and also help clarify anything
that is not completely clear to you.
There are over one million Perl programmers world wide and they form a
very active community. On-going activities include maintaining Perl 5,
developing Perl 6/Parrot, CPAN, conferences, local
user groups (Perl mongers) dozens of mailing lists, web sites, books,
articles, etc. I am very active in the Perl Community in many areas
and I can help your shop become more involved with it. The Perl
Community is a very valuable resource and is something that other
language groups try to emulate (but not always successfully :-).
I am not a classic 9-5 classroom trainer. I teach by using a wide
range of resources such as email, IRC, talks, articles, books, and
documentation. I work with your staff on helping them learn what they
need to solve their Perl problems. I call this Integrated Training
since it combined those resources with techniques such as code review and by using your own code base as
the source for examples. Perl on Call is a very cost effective way to
provide your staff with Integrated Training.
No one learns all they need from a single class. Learning is
incremental process and Perl On Call is a great way to support it. On
a day to day basis, your staff is able to ask questions and getting
good answers. Perl topics important to your staff will be brought up
and discussed so that everyone can learn new useful
techniques. Incremental Learning naturally occurs in the on-going
relationship that I will build with your staff.
CPAN is public repository of free to use
Perl modules and is a resource that is the pride of the worldwide perl community (and the envy of other
languages). But can be hard to navigate and to quickly find the best
module for your needs. In some cases, there are multiple modules which
overlap in function. I can help you find the module for your needs and
help you learn how to best use it.
For some reason Perl has an ill gotten reputation for being tough to
hire programmers. I helped alleviate this when I created (and still
co-manage) the Perl jobs list
(jobs.perl.org). It currently averages over 80 job postings a
month and has thousands of subscribers world wide. Beyond that,
accurately assessing the Perl (and general programming) skills of
applicants is difficult. I can help with resume and candidate reviews
and other aspects of the hiring process.
Requirements are what the your client or boss tells you what they
want. They are should be written from the point of view of the end user
and/or the goals of the product/project. Too often requirements are very
vague and poorly written. It becomes a major task for the developer to
analyze them and convert them into proper specifications
Quality Specifications are a must for any properly engineered
system. They are used both to guide the architecture and design as
well as the test plans. Loose specifications leave too many open
issues that make the development tricky and fraught with testing
issues. Too much detail in a specification can constrain architects
and designers and limit their engineering choices. As with other
software engineering decisions, the right level of granularity in a specification is important.
The FAQ-O-Matic is a simple tool I created that will email Perl FAQ
entries to your staff on a daily basis. This has proven to be an
excellent training method and it instigates many interesting threads.
Copyright © 2005 Sysarch, Inc -- Last Modified Sat Jun 25 04:23:10 2005