In 2011 Atlassian launched "Atlassian University", an interactive training environment for Atlassian products built entirely on Magnolia CMS. In 2013, after suffering through a series of problems, we ripped all of it out and rebuilt it from scratch in a way that will actually scale. The one piece of architecture we kept was that the guts of the system is still built on Magnolia. This talk covers the history of the system, how it was originally built, the problems we encountered, and how we eventually moved past them.
68. VERSION 1
How it works
MAGNOLIA
• App Pages
(Freemarker,
HTML,
JavaScript)
• User
Managment
• Data Storage
• Licenses
• Lesson
Completion
• Content
70. VERSION 1
How it works
MAGNOLIA
• App Pages
(Freemarker,
HTML,
JavaScript)
• Content
• User
Managment
• Data Storage
• Licenses
• Lesson
Completion
JIRA
• Sample Data
72. VERSION 1
How it works
MAGNOLIA
• App Pages
(Freemarker,
HTML,
JavaScript)
• Content
• User
Managment
• Data Storage
• Licenses
• Lesson
Completion
JIRA
• Sample Data
SHERPA JS
75. VERSION 1
How it works
MAGNOLIA
• App Pages
(Freemarker,
HTML,
JavaScript)
• Content
• User
Managment
• Data Storage
• Licenses
• Lesson
Completion
JIRA
• Sample Data
SHERPA JS
LESSON
COMPLETE
API
77. VERSION 1
How it works
MAGNOLIA
• App Pages
(Freemarker,
HTML,
JavaScript)
• Content
• User
Managment
• Data Storage
• Licenses
• Lesson
Completion
JIRA
• Sample Data
SHERPA JS
LESSON
COMPLETE
API
78. VERSION 1
How it works
MAGNOLIA
• App Pages
(Freemarker,
HTML,
JavaScript)
• Content
• User
Managment
• Data Storage
• Licenses
• Lesson
Completion
JIRA
• Sample Data
CONFLUENCE
• Sample Data
JIRA + GH
• Sample Data
SHERPA JS
SHERPA JS
SHERPA JS
LESSON
COMPLETE
API
LESSON
COMPLETE
API
LESSON
COMPLETE
API
79. VERSION 1
How it works
MAGNOLIA
• App Pages
(Freemarker,
HTML,
JavaScript)
• Content
• User
Managment
• Data Storage
• Licenses
• Lesson
Completion
JIRA 4.0
• Sample Data
CONF 3.5
• Sample Data
GH 5.7
• Sample Data
SHERPA JS
SHERPA JS
SHERPA JS
LESSON
COMPLETE
API
LESSON
COMPLETE
API
LESSON
COMPLETE
API
JIRA 4.1
• Sample Data
CONF 4.0
• Sample Data
GH 5.9
• Sample Data
SHERPA JS
SHERPA JS
SHERPA JS
80. VERSION 1
How it works
MAGNOLIA
• App Pages
(Freemarker,
HTML,
JavaScript)
• Content
• User
Managment
• Data Storage
• Licenses
• Lesson
Completion
JIRA 4.0
• Sample Data
CONF 3.5
• Sample Data
GH 5.7
• Sample Data
SHERPA JS
SHERPA JS
SHERPA JS
LESSON
COMPLETE
API
LESSON
COMPLETE
API
LESSON
COMPLETE
API
JIRA 4.1
• Sample Data
CONF 4.0
• Sample Data
GH 5.9
• Sample Data
SHERPA JS
SHERPA JS
SHERPA JS
JIRA 4.2
• Sample
CONF 5.
• Sample
GH 6.0
• Sample
SHER
SHER
SHER
81. VERSION 1
• Didn’t Scale
• In Product Training didn’t created
Administrative problems.
• Shared training environment (junk data)
• Magnolia Data Module falling down.
• Clunky navigation
• Required separate login
• Hard to QA!
Problems with Version 1
82. VERSION 1
• Single Company
• Calculations Slow
• Admin Pages Slow
• Reporting Slow
• Content Not Searchable or SEO Friendly
• Always maintaining - never innovating.
Problems with Version 1
87. VERSION 2
How it works
MAGNOLIA
• App Pages
(Freemarker,
HTML,
JavaScript)
88.
89.
90. VERSION 2
How it works
MAGNOLIA
• App Pages
(Freemarker,
HTML,
JavaScript)
ATLASSIAN ID
• User Management
91.
92. VERSION 2
How it works
MAGNOLIA
• App Pages
(Freemarker,
HTML,
JavaScript)
• Content
JIRA SCREENSHOT
• Sample Data
ATLASSIAN ID
• User Management
93.
94.
95.
96.
97.
98.
99. VERSION 2
How it works
MAGNOLIA
• App Pages
(Freemarker,
HTML,
JavaScript)
• Content
JIRA SCREENSHOT
• Sample Data
CONFLUENCE SCREENSHOT
• Sample Data
JIRA + GH SCREENSHOT
• Sample Data
ATLASSIAN ID
• User Management
100. VERSION 2
How it works
MAGNOLIA
• App Pages
(Freemarker,
HTML,
JavaScript)
• Content
JIRA SCREENSHOT
• Sample Data
CONFLUENCE SCREENSHOT
• Sample Data
JIRA + GH SCREENSHOT
• Sample Data
SHERPA JS
SHERPA JS
SHERPA JS
ATLASSIAN ID
• User Management
101.
102. VERSION 2
How it works
MAGNOLIA
• App Pages
(Freemarker,
HTML,
JavaScript)
• Content
JIRA SCREENSHOT
• Sample Data
CONFLUENCE SCREENSHOT
• Sample Data
JIRA + GH SCREENSHOT
• Sample Data
SHERPA JS
SHERPA JS
SHERPA JS
POSTGRESQL
• Data
• License Data
• Lesson
Completion
Data
ATLASSIAN ID
• User Management
103. VERSION 2
How it works
MAGNOLIA
• App Pages
(Freemarker,
HTML,
JavaScript)
• Content
JIRA SCREENSHOT
• Sample Data
CONFLUENCE SCREENSHOT
• Sample Data
JIRA + GH SCREENSHOT
• Sample Data
SHERPA JS
SHERPA JS
SHERPA JS
API
API
API
POSTGRESQL
• Data
• License Data
• Lesson
Completion
Data
ATLASSIAN ID
• User Management
104.
105. VERSION 2
How it works
MAGNOLIA
• App Pages
(Freemarker,
HTML,
JavaScript)
• Content
JIRA SCREENSHOT
• Sample Data
CONFLUENCE SCREENSHOT
• Sample Data
JIRA + GH SCREENSHOT
• Sample Data
SHERPA JS
SHERPA JS
SHERPA JS
API
API
API
POSTGRESQL
• Data
• License Data
• Lesson
Completion
Data
ATLASSIAN ID
• User Management
106. VERSION 2
How it works
MAGNOLIA
• App Pages
(Freemarker,
HTML,
JavaScript)
• Content
JIRA SCREENSHOT
• Sample Data
CONFLUENCE SCREENSHOT
• Sample Data
JIRA + GH SCREENSHOT
• Sample Data
SHERPA JS
SHERPA JS
SHERPA JS
API
API
API
POSTGRESQL
• Data
• License Data
• Lesson
Completion
Data
ATLASSIAN ID
• User Management
107.
108.
109.
110.
111. VERSION 2
• Scaling better, but not perfectly
• Creating a lot of content.
• Created another “Training Silo”
Problems with Version 2
160. CurateCurated Content
Course
JIRA
JIRA 6.0
Customize JIRA Forms
Curated Content / JIRA / JIRA 6.0
Customize JIRA Forms
Add Lesson
Info
This course does not have any lessons. Click ‘Add Lesson’ to get
started.
<Embed Code> 12.6 KB
161. CurateCurated Content
Course
JIRA
JIRA 6.0
Customize JIRA Forms
Curated Content / JIRA / JIRA 6.0
Customize JIRA Forms
Add Lesson
Info
This course does not have any lessons. Click ‘Add Lesson’ to get
started.
<Embed Code> 12.6 KB
162. CurateCurated Content
Course
JIRA
Creating Custom forms in JIRA
Curated Content / JIRA
Creating Custom forms in JIRA
Add Lesson Embed Course
Info
This course does not have any lessons. Click ‘Add Lesson’ to get
started.
Create Cancel
Create Lesson
External Link
Content that lives on an external site.
Interactive Tutorial
Create an interactive tutorial by uploading screenshots and creating pointers
Blank Page
Write some fresh content.
Transition
Add a transitional step between lessons such as a quiz to test comprehension.
Video
Embed a video and description.
Call to Action
This is usually the last step in a course and the desired action for the user. Example: Try JIRA Now.
163. CurateCurated Content
Course
JIRA
Creating Custom forms in JIRA
Curated Content / JIRA
Creating Custom forms in JIRA
Add Lesson Embed Course
Info
This course does not have any lessons. Click ‘Add Lesson’ to get
started.
Create Cancel
Create Lesson
External Link
Content that lives on an external site.
Interactive Tutorial
Create an interactive tutorial by uploading screenshots and creating pointers
Blank Page
Write some fresh content.
Transition
Add a transitional step between lessons such as a quiz to test comprehension.
Video
Embed a video and description.
Call to Action
This is usually the last step in a course and the desired action for the user. Example: Try JIRA Now.
164. CurateCurated Content
Course
JIRA
Creating Custom forms in JIRA
Curated Content / JIRA
Creating Custom forms in JIRA
Add Lesson Embed Course
Create Cancel
Create Video Lesson
Lesson Name *
Description
Custom Fields and Forms
See JIRAs Product manager explain
custom fields and forms.
Length 3m32s
Embed Code <embed width="640" height="360"
src="//www.youtube.com/v/
XIn1zxAbrv8?
hl=en_US&version=3&rel=0"
165. CurateCurated Content
Course
JIRA
Creating Custom forms in JIRA
Curated Content / JIRA
Creating Custom forms in JIRA
Add Lesson Embed Course
Create Cancel
Create Video Lesson
Lesson Name *
Description
Custom Fields and Forms
See JIRAs Product manager explain
custom fields and forms.
Length 3m32s
Embed Code <embed width="640" height="360"
src="//www.youtube.com/v/
XIn1zxAbrv8?
hl=en_US&version=3&rel=0"
166. CurateCurated Content
Course
Curated Content / JIRA / JIRA 6.0
Customize JIRA Forms
Lesson Type
Custom Fields and Forms (Video) Video
Add Lesson <Embed Code> 12.6 KB
JIRA
JIRA 6.0
Customize JIRA Forms
167. CurateCurated Content
Course
Curated Content / JIRA / JIRA 6.0
Customize JIRA Forms
Lesson Type
Custom Fields and Forms (Video) Video
Add Lesson <Embed Code> 12.6 KB
JIRA
JIRA 6.0
Customize JIRA Forms
168. CurateCurated Content
Course
JIRA
Creating Custom forms in JIRA
Curated Content / JIRA
Creating Custom forms in JIRA
Add Lesson Embed Course
Info
This course does not have any lessons. Click ‘Add Lesson’ to get
started.
Create Cancel
Create Lesson
External Link
Content that lives on an external site.
Interactive Tutorial
Create an interactive tutorial by uploading screenshots and creating pointers
Blank Page
Write some fresh content.
Transition
Add a transitional step between lessons such as a quiz to test comprehension.
Video
Embed a video and description.
Call to Action
This is usually the last step in a course and the desired action for the user. Example: Try JIRA Now.
169. CurateCurated Content
Course
JIRA
Creating Custom forms in JIRA
Curated Content / JIRA
Creating Custom forms in JIRA
Add Lesson Embed Course
Info
This course does not have any lessons. Click ‘Add Lesson’ to get
started.
Create Cancel
Create Lesson
External Link
Content that lives on an external site.
Interactive Tutorial
Create an interactive tutorial by uploading screenshots and creating pointers
Blank Page
Write some fresh content.
Transition
Add a transitional step between lessons such as a quiz to test comprehension.
Video
Embed a video and description.
Call to Action
This is usually the last step in a course and the desired action for the user. Example: Try JIRA Now.
170. CurateCurated Content
Course
JIRA
Creating Custom forms in JIRA
Curated Content / JIRA
Creating Custom forms in JIRA
Add Lesson Embed Course
Info
This course does not have any lessons. Click ‘Add Lesson’ to get
started.
Create Cancel
Create External Link Lesson
Lesson Name *
Description
Configuring a Custom Field
Atlassian documentation on custom
fields
BrowseURL https://confluence.atlassian.c
171. CurateCurated Content
Course
JIRA
Creating Custom forms in JIRA
Curated Content / JIRA
Creating Custom forms in JIRA
Add Lesson Embed Course
Info
This course does not have any lessons. Click ‘Add Lesson’ to get
started.
Create Cancel
Create External Link Lesson
Lesson Name *
Description
Configuring a Custom Field
Atlassian documentation on custom
fields
BrowseURL https://confluence.atlassian.c
172. CurateCurated Content
Course
Curated Content / JIRA / JIRA 6.0
Customize JIRA Forms
Lesson Type
Custom Fields and Forms (Video) Video
Configuring a Custom Field External Link
Add Lesson <Embed Code> 12.6 KB
JIRA
JIRA 6.0
Customize JIRA Forms
173. CurateCurated Content
Course
Curated Content / JIRA / JIRA 6.0
Customize JIRA Forms
Lesson Type
Custom Fields and Forms (Video) Video
Configuring a Custom Field External Link
Add Lesson <Embed Code> 12.6 KB
JIRA
JIRA 6.0
Customize JIRA Forms
174. CurateCurated Content
Course
JIRA
Creating Custom forms in JIRA
Curated Content / JIRA
Creating Custom forms in JIRA
Add Lesson Embed Course
Info
This course does not have any lessons. Click ‘Add Lesson’ to get
started.
Create Cancel
Create Lesson
External Link
Content that lives on an external site.
Interactive Tutorial
Create an interactive tutorial by uploading screenshots and creating pointers
Blank Page
Write some fresh content.
Transition
Add a transitional step between lessons such as a quiz to test comprehension.
Video
Embed a video and description.
Call to Action
This is usually the last step in a course and the desired action for the user. Example: Try JIRA Now.
175. CurateCurated Content
Course
JIRA
Creating Custom forms in JIRA
Curated Content / JIRA
Creating Custom forms in JIRA
Add Lesson Embed Course
Info
This course does not have any lessons. Click ‘Add Lesson’ to get
started.
Create Cancel
Create Lesson
External Link
Content that lives on an external site.
Interactive Tutorial
Create an interactive tutorial by uploading screenshots and creating pointers
Blank Page
Write some fresh content.
Transition
Add a transitional step between lessons such as a quiz to test comprehension.
Video
Embed a video and description.
Call to Action
This is usually the last step in a course and the desired action for the user. Example: Try JIRA Now.
176. CurateCurated Content
Course
JIRA
Creating Custom forms in JIRA
Curated Content / JIRA
Creating Custom forms in JIRA
Add Lesson Embed Course
Info
This course does not have any lessons. Click ‘Add Lesson’ to get
started.
Create Cancel
Create Lesson
External Link
Content that lives on an external site.
Interactive Tutorial
Create an interactive tutorial by uploading screenshots and creating pointers
Blank Page
Write some fresh content.
Transition
Add a transitional step between lessons such as a quiz to test comprehension.
Video
Embed a video and description.
Call to Action
This is usually the last step in a course and the desired action for the user. Example: Try JIRA Now.
177. CurateCurated Content
Course
JIRA
Creating Custom forms in JIRA
Curated Content / JIRA
Creating Custom forms in JIRA
Add Lesson Embed Course
Create Cancel
Create Interactive Tutorial Lesson
Lesson Name *
Description
Fields and Field Configurations
University tutorial on fields and field
configurations
178. CurateCurated Content
Course
JIRA
Creating Custom forms in JIRA
Curated Content / JIRA
Creating Custom forms in JIRA
Add Lesson Embed Course
Create Cancel
Create Interactive Tutorial Lesson
Lesson Name *
Description
Fields and Field Configurations
University tutorial on fields and field
configurations
179. CurateCurated Content
Course
Curated Content / JIRA / JIRA 6.0 / Customize JIRA Forms
Fields and Field Configurations
Section
Introduction
Navigation with Tabs
Dashboard
Browse Projects
Add Step <Embed Code> 12.6 KB
JIRA
JIRA 6.0
Customize JIRA Forms
Find Issues
Create Issues
Summary
Browse Projects
180. CurateCurated Content
Course
Curated Content / JIRA / JIRA 6.0 / Customize JIRA Forms
Fields and Field Configurations
Section
Introduction
Navigation with Tabs
Dashboard
Browse Projects
Add Step <Embed Code> 12.6 KB
JIRA
JIRA 6.0
Customize JIRA Forms
Find Issues
Create Issues
Summary
Browse Projects
181. CurateCurated Content
Course
JIRA
Creating Custom forms in JIRA
Curated Content / JIRA
Creating Custom forms in JIRA
Add Lesson Embed Course
Info
This course does not have any lessons. Click ‘Add Lesson’ to get
started.
Create Cancel
Create Lesson Step
External Link
Content that lives on an external site.
Interactive Screenshot Step
A screenshot with an instructional dialog.
Blank Page
Write some fresh content.
Transition
Add a transitional step between lessons such as a quiz to test comprehension.
Video
Embed a video and description.
Call to Action
This is usually the last step in a course and the desired action for the user. Example: Try JIRA Now.
182. CurateCurated Content
Course
JIRA
Creating Custom forms in JIRA
Curated Content / JIRA
Creating Custom forms in JIRA
Add Lesson Embed Course
Info
This course does not have any lessons. Click ‘Add Lesson’ to get
started.
Create Cancel
Create Lesson Step
External Link
Content that lives on an external site.
Interactive Screenshot Step
A screenshot with an instructional dialog.
Blank Page
Write some fresh content.
Transition
Add a transitional step between lessons such as a quiz to test comprehension.
Video
Embed a video and description.
Call to Action
This is usually the last step in a course and the desired action for the user. Example: Try JIRA Now.
183. CurateCurated Content
Course
JIRA
Creating Custom forms in JIRA
Curated Content / JIRA
Creating Custom forms in JIRA
Add Lesson Embed Course
Info
This course does not have any lessons. Click ‘Add Lesson’ to get
started.
Create Cancel
Create Lesson Step
External Link
Content that lives on an external site.
Interactive Screenshot Step
A screenshot with an instructional dialog.
Blank Page
Write some fresh content.
Transition
Add a transitional step between lessons such as a quiz to test comprehension.
Video
Embed a video and description.
Call to Action
This is usually the last step in a course and the desired action for the user. Example: Try JIRA Now.
184. CurateCurated Content
Course
Curated Content / JIRA / JIRA 6.0 / Get to Know JIRA
Section
Introduction
Navigation with Tabs
Dashboard
Browse Projects
Add Section <Embed Code> 12.6 KB
JIRA
JIRA 6.0
Get to Know JIRA
Find Issues
Create Issues
Summary
Browse Projects
Create Cancel
Create Interactive Screenshot Step
Section Name * Introduction
BrowseScreenshot
Instruction Text This tour shows how to create custom
fields in JIRA.
Action Text Click ‘Next’
Preview
Tip Location x axis y axis
If not set the dialog is centered, drag dialog
in preview to move
Up DownPointer Direction Left Right
185. CurateCurated Content
Course
Curated Content / JIRA / JIRA 6.0 / Get to Know JIRA
Section
Introduction
Navigation with Tabs
Dashboard
Browse Projects
Add Section <Embed Code> 12.6 KB
JIRA
JIRA 6.0
Get to Know JIRA
Find Issues
Create Issues
Summary
Browse Projects
Create Cancel
Create Interactive Screenshot Step
Section Name * Introduction
BrowseScreenshot
Instruction Text This tour shows how to create custom
fields in JIRA.
Action Text Click ‘Next’
Preview
Tip Location x axis y axis
If not set the dialog is centered, drag dialog
in preview to move
Up DownPointer Direction Left Right
186. CurateCurated Content
Course
Curated Content / JIRA / JIRA 6.0 / Customize JIRA Forms
Fields and Field Configurations
Section
Introduction
Add a Custom Field
Field Configurations
Browse Projects
Add Step <Embed Code> 12.6 KB
JIRA
JIRA 6.0
Customize JIRA Forms
Associate a Project
Summary
Browse Projects
187. CurateCurated Content
Course
Curated Content / JIRA / JIRA 6.0 / Customize JIRA Forms
Fields and Field Configurations
Section
Introduction
Add a Custom Field
Field Configurations
Browse Projects
Add Step <Embed Code> 12.6 KB
JIRA
JIRA 6.0
Customize JIRA Forms
Associate a Project
Summary
Browse Projects
188. CurateCurated Content
Course
Curated Content / JIRA / JIRA 6.0
Customize JIRA Forms
Lesson Type
Custom Fields and Forms (Video) Video
Configuring a Custom Field External Link
Fields and Field Configurations Interactive Tutorial
Add Lesson <Embed Code> 12.6 KB
JIRA
JIRA 6.0
Customize JIRA Forms
189. CurateCurated Content
Course
Curated Content / JIRA / JIRA 6.0
Customize JIRA Forms
Lesson Type
Custom Fields and Forms (Video) Video
Configuring a Custom Field External Link
Fields and Field Configurations Interactive Tutorial
Add Lesson <Embed Code> 12.6 KB
JIRA
JIRA 6.0
Customize JIRA Forms
190. CurateCurated Content
Course
Curated Content / JIRA / JIRA 6.0
Get to Know JIRA
Lesson Type
JIRA Overview (Video) Video
JIRA 6 Tour External Link
Basic Navigation Interactive Tutorial
Add Lesson <Embed Code> 12.6 KB
JIRA
JIRA 6.0
Get to Know JIRA
Embed Course
Close
Embed Code
Info
Put this code in your HTML to embed the entire course into another site.
<script src="//cdn.atlassian.com/js/accu1096093.js"></script>
<accu:course course=‘1096093’ type=‘lightbox’ class=‘grey’
completedClass=‘green’>Customize JIRA Forms</accu:course>
197. Good Work!
Go to Customizing a Field
You just completed step 1 in a 3 step tutorial on
Custom JIRA Forms.
1. Custom Fields and Forms (Video)
2. Configuring a Custom Field
3. Fields and Field Configurations
Close
Custom Fields
and Forms
(Video)
Configuring a
Custom Field
Fields and Field
Configurations
198. Good Work!
Go to Customizing a Field
You just completed step 1 in a 3 step tutorial on
Custom JIRA Forms.
1. Custom Fields and Forms (Video)
2. Configuring a Custom Field
3. Fields and Field Configurations
Close
Custom Fields
and Forms
(Video)
Configuring a
Custom Field
Fields and Field
Configurations
202. Custom Fields
and Forms
(Video)
Configuring a
Custom Field
Fields and Field
Configurations
Good Work!
Go to Fields and Configurations
You just completed step 2 in a 3 step tutorial on
Custom JIRA Forms.
Close
1. Custom Fields and Forms (Video)
2. Configuring a Custom Field
3. Fields and Field Configurations
205. Good Work!
Close Tutorial
You just completed the Custom JIRA Forms
tutorial
Sign In
You are using this tutorial in
Anonymous Mode. If you want to keep
track of your progress between
browsers sign up for an Atlassian ID.
1. Custom Fields and Forms (Video)
2. Configuring a Custom Field
3. Fields and Field Configurations
Custom Fields
and Forms
(Video)
Configuring a
Custom Field
Fields and Field
Configurations
206. Good Work!
Close Tutorial
You just completed the Custom JIRA Forms
tutorial
Sign In
You are using this tutorial in
Anonymous Mode. If you want to keep
track of your progress between
browsers sign up for an Atlassian ID.
1. Custom Fields and Forms (Video)
2. Configuring a Custom Field
3. Fields and Field Configurations
Custom Fields
and Forms
(Video)
Configuring a
Custom Field
Fields and Field
Configurations
221. VERSION 3
How it works
MAGNOLIA
• Content
JIRA
SCREENSHOT
CONFLUENCE
SCREENSHOT
JIRA + GH
SCREENSHOT
SHERPA JS
SHERPA JS
SHERPA JS
API
API
API
POSTGRESQL
• Data
• License Data
• Lesson
Completion
Data
• Content Lists
ATLASSIAN ID
• User Management
ANGULAR JS
• App Pages
(HTML/JS)
API
API
API
222. VERSION 3
• We don’t know yet :)
Problems with Version 3
227. We believe that sharing knowledge is important... but it isn’t
easy at scale.WHY
WHAT
HOW
228. We believe that sharing knowledge is important... but it isn’t
easy at scale.
Organize content into repeatable steps to guide each user
to shared understanding.
WHY
WHAT
HOW
229. We believe that sharing knowledge is important... but it isn’t
easy at scale.
Organize content into repeatable steps to guide each user
to shared understanding.
A.H.C.C.U.
Spreading knowledge is as easy as spreading germs.
WHY
WHAT
HOW