//
//  Licensed to the Apache Software Foundation (ASF) under one or more
//  contributor license agreements.  See the NOTICE file distributed with
//  this work for additional information regarding copyright ownership.
//  The ASF licenses this file to You under the Apache License, Version 2.0
//  (the "License"); you may not use this file except in compliance with
//  the License.  You may obtain a copy of the License at
//
//      https://www.apache.org/licenses/LICENSE-2.0
//
//  Unless required by applicable law or agreed to in writing, software
//  distributed under the License is distributed on an "AS IS" BASIS,
//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//  See the License for the specific language governing permissions and
//  limitations under the License.
//
:imagesdir: images/
:icons: font

== Apache Training™ (Incubating)

=== Purpose
The purpose of the Training project is to create high-quality training material for various projects in an open source form. Up until now everyone who wants to offer a Training course for one of the Apache projects needs to create her or his own slides/labs and keep them up-to-date. This is a significant investment of time and money. This project aims to spread that burden and help all Apache projects as we can create shared resources and we can also create cross-project training resources.

To sum up, the main goals for this project:

- Develop shared material that can be used for training
- Cross-project
    - Focused on Apache but also 3rd party projects where it makes sense
    - Develop “labs” or “hands-on” exercises
- Develop or document an infrastructure that can be used for those labs
- Potentially develop tools to manage the material (e.g. a “slide” repository that contains “modules” that can be easily reused and combined)

These are non-goals for this project:

- Some kind of official “Apache Training Program” with certifications etc.
    - Based on feedback and future developments this may change but we believe it’s out of scope initially
- Project documentation
- The training material we develop is not necessarily self-explanatory. It still benefits from an experienced instructor but it will make it possible for talented people without the time and resources to develop material to still train others.

=== Rationale
There are tons of companies offering training for and around the Apache ecosystem. From our experience, everyone is building a very similar set of slides and labs (there’s only so many ways you can explain a concept). This project aims to create and use synergies. By also bringing these resources closer to their origin we hope to improve quality, the freshness of the content and versatility (e.g. more language options).

It is the mission of the Apache foundation “to provide software for the public good” and we believe this project can help with that mission by making the software more accessible for a broader audience.

=== A Short Word About Linguistics
The plural form of training was used frequently in the early stages of the project, which is strictly speaking not grammatically correct, as well as misleading from the perspective of this project.
Training, being a gerund (verb used as noun) does not have a plural form, so should always be followed by a quantifiable noun like _sessions_ or _slides_.

Additionally, the existence of this project is to a large extent based on the believe that a good training session consists of much more than just the material that is being shown, a distinction that is distracted from by the use of _training_ as all-encompassing term.

While we will not tell anybody how to phrase this, as a project we will try to keep any official wording as concise as possible and stay away from the use of _training_ or _trainings_.

=== Next steps
The initial goal for the first few weeks or months is to have discussions and agreements on various scoping and technical issues as well as integrating existing donated material.

From there we want to start building a library of content.

=== Getting involved

The main resource for any discussion around this project is the dev mailing list (see below). If you have any specific question or want to get involved in any way, by all means, do so and reach out and say hi!

The following resources are currently being used by the project:

Dev Mailing List: link:++https://lists.apache.org/list.html?dev@training.apache.org++[Archive]  -  mailto:dev-subscribe@training.apache.org[Subscribe]

Issues Mailing List: link:++https://lists.apache.org/list.html?issues@training.apache.org++[Archive]  -  mailto:issues-subscribe@training.apache.org[Subscribe]

Commits Mailing List: link:++https://lists.apache.org/list.html?commits@training.apache.org++[Archive]  -  mailto:commits-subscribe@training.apache.org[Subscribe]

Wiki: https://cwiki.apache.org/confluence/display/TRAINING

Jira: https://issues.apache.org/jira/browse/TRAINING