From 8f179a4d585bc8e2d697372226215ab718d39a67 Mon Sep 17 00:00:00 2001 From: aimeeu Date: Tue, 5 Nov 2019 14:30:39 -0600 Subject: [PATCH] Grokkin' the Docs: Experiences of a New Contributor blog post (#17314) * New contributor blog post Signed-off-by: Aimee Ukasick * New Contributor blog post Incorporated review feedback * New Contributor blog post Changed publication date to 11/6. Fixed numbering in Citations section. Signed-off-by: Aimee Ukasick * New Contributor blog post Fixed issue with header 9 diplay Signed-off-by: Aimee Ukasick * Update and rename grokkin-the-docs.md to 2019-11-05-grokkin-the-docs.md --- .../_posts/2019-11-05-grokkin-the-docs.md | 322 ++++++++++++++++++ .../blog/grokkin-the-docs/grok-definition.png | Bin 0 -> 14977 bytes 2 files changed, 322 insertions(+) create mode 100644 content/en/blog/_posts/2019-11-05-grokkin-the-docs.md create mode 100644 static/images/blog/grokkin-the-docs/grok-definition.png diff --git a/content/en/blog/_posts/2019-11-05-grokkin-the-docs.md b/content/en/blog/_posts/2019-11-05-grokkin-the-docs.md new file mode 100644 index 00000000000..e3800cd6480 --- /dev/null +++ b/content/en/blog/_posts/2019-11-05-grokkin-the-docs.md @@ -0,0 +1,322 @@ +--- +layout: blog +title: "Grokkin' the Docs" +date: 2019-11-05 +slug: Grokkin-the-Docs +--- + +**Author:** [Aimee Ukasick](https://www.linkedin.com/in/aimee-ukasick/), Independent Contributor + +{{< figure + src="/images/blog/grokkin-the-docs/grok-definition.png" + alt="grok: to understand profoundly and intuitively" + title="Definition courtesy of Merriam Webster online dictionary" +>}} + +## Intro - Observations of a new SIG Docs contributor + +I began contributing to the SIG Docs community in August 2019. Sometimes I feel +like I am a stranger in a strange land adapting to a new community: +investigating community organization, understanding contributor society, +learning new lessons, and incorporating new jargon. I'm an observer as well as a +contributor. + +## Observation 01: Read the _Contribute_ pages! {#observation-1} + +I contributed code and documentation to OpenStack, OPNFV, and Acumos, so I +thought contributing to the Kubernetes documentation would be the same. I was +wrong. I should have thoroughly **read** the [Contribute to Kubernetes +docs](https://kubernetes.io/docs/contribute/) pages instead of skimming them. + +I am very familiar with the git/gerrit workflow. With those tools, a contributor clones +the `master` repo and then creates a local branch. Kubernetes uses a different +approach, called _Fork and Pull_. Each contributor `forks` the master repo, and +then the contributor pushes work to their fork before creating a pull request. I +created a simple pull request (PR), following the instructions in the **Start +contributing** page's [Submit a pull +request](https://kubernetes.io/docs/contribute/start/#submit-a-pull-request) +section. This section describes how to make a documentation change using the +GitHub UI. I learned that this method is fine for a change that requires a +single commit to fix. However, this method becomes complicated when you have to +make additional updates to your PR. GitHub creates a new commit for each change +made using the GitHub UI. The Kubernetes GitHub org requires squashing commits. +The **Start contributing** page didn't mention squashing commits, so I looked at +the GitHub and git documentation. I could not squash my commits using the GitHub +UI. I had to `git fetch` and `git checkout` my pull request locally, squash the +commits using the command line, and then push my changes. If the **Start +contributing** had mentioned squashing commits, I would have worked from a local +clone instead of using the GitHub UI. + +## Observation 02: Reach out and ping someone {#observation-2} + +While working on my first PRs, I had questions about working from a local clone +and about keeping my fork updated from `upstream master`. I turned to searching +the internet instead of asking on the [Kubernetes Slack](http://slack.k8s.io/) +#sig-docs channel. I used the wrong process to update my fork, so I had to `git +rebase` my PRs, which did not go well at all. As a result, I closed those PRs +and submitted new ones. When I asked for help on the #sig-docs channel, +contributors posted useful links, what my local git config file should look +like, and the exact set of git commands to run. The process used by contributors +was different than the one defined in the **Intermediate contributing** page. +I would have saved myself so much time if I had asked what GitHub workflow to +use. The more community knowledge that is documented, the easier it is for new +contributors to be productive quickly. + +## Observation 03: Don't let conflicting information ruin your day {#observation-3} + +The Kubernetes community has a contributor guide for +[code](https://github.com/kubernetes/community/tree/master/contributors/guide) +and another one for [documentation](https://kubernetes.io/docs/contribute/). The +guides contain conflicting information on the same topic. For example, the SIG +Docs GitHub process recommends creating a local branch based on +`upstream/master`. The [Kubernetes Community Contributor +Guide](https://github.com/kubernetes/community/blob/master/contributors/guide/github-workflow.md) +advocates updating your fork from upstream and then creating a local branch +based on your fork. Which process should a new contributor follow? Are the two +processes interchangeable? The best place to ask questions about conflicting +information is the #sig-docs or #sig-contribex channels. I asked for +clarification about the GitHub workflows in the #sig-contribex channel. +@cblecker provided an extremely detailed response, which I used to update the +**Intermediate contributing** page. + +## Observation 04: Information may be scattered {#observation-4} + +It's common for large open source projects to have information scattered around +various repos or duplicated between repos. Sometimes groups work in silos, and +information is not shared. Other times, a person leaves to work on a +different project without passing on specialized knowledge. +Documentation gaps exist and may never be rectified because of higher priority +items. So new contributors may have difficulty finding basic information, such +as meeting details. + +Attending SIG Docs meetings is a great way to become involved. However, people +have had a hard time locating the meeting URL. Most new contributors ask in the +#sig-docs channel, but I decided to locate the meeting information in the docs. +This required several clicks over multiple pages. How many new contributors miss +meetings because they can't locate the meeting details? + +## Observation 05: Patience is a virtue {#observation-5} + +A contributor may wait days for feedback on a larger PR. The process from +submission to final approval may take weeks instead of days. There are two +reasons for this: 1) most reviewers work part-time on SIG Docs; and 2) reviewers +want to provide meaningful reviews. "Drive-by reviewing" doesn't happen in SIG +Docs! Reviewers check for the following: + +- Do the commit message and PR description adequately describe the change? +- Does the PR follow the guidelines in the style and content guides? + + - Overall, is the grammar and punctuation correct? + - Is the content clear, concise, and appropriate for non-native speakers? + - Does the content stylistically fit in with the rest of the documentation? + - Does the flow of the content make sense? + - Can anything be changed to make the content better, such as using a Hugo shortcode? + - Does the content render correctly? + +- Is the content technically correct? + +Sometimes the review process made me feel defensive, annoyed, and frustrated. I'm +sure other contributors have felt the same way. Contributors need to be patient! +Writing excellent documentation is an iterative process. Reviewers scrutinize +PRs because they want to maintain a high level of quality in the documentation, +not because they want to annoy contributors! + +## Observation 06: Make every word count {#observation-6} + +Non-native English speakers read and contribute to the Kubernetes documentation. +When you are writing content, use simple, direct language in clear, concise +sentences. Every sentence you write may be translated into another language, so +remove words that don't add substance. I admit that implementing these +guidelines is challenging at times. + +Issues and pull requests aren't translated into other languages. However, you +should still follow the aforementioned guidelines when you write the description +for an issue or pull request. You should add details and background +information to an issue so the person doing triage doesn't have to apply the +`triage/needs-information` label. Likewise, when you create a pull request, you +should add enough information about the content change that reviewers don't have +to figure out the reason for the pull request. Providing details in clear, +concise language speeds up the process. + +## Observation 07: Triaging issues is more difficult than it should be {#observation-7} + +In SIG Docs, triaging issues requires the ability to distinguish between +support, bug, and feature requests not only for the documentation but also for +Kubernetes code projects. How to route, label, and prioritize issues has become +easier week by week. I'm still not 100% clear on which SIG and/or project is +responsible for which parts of the documentation. The SIGs and Working Groups +[page](https://github.com/kubernetes/community/blob/master/sig-list.md) helps, +but it is not enough. At a page level in the documentation, it's not +always obvious which SIG or project has domain expertise. The page's front +matter sometimes list reviewers but never lists a SIG or project. Each page should +indicate who is responsible for content, so that SIG Docs triagers know where to +route issues. + +## Observation 08: SIG Docs is understaffed {#observation-8} + +Documentation is the number one driver of software adoption1. + +Many contributors devote a small amount of time to SIG Docs but only a handful +are trained technical writers. Few companies have hired tech writers to work on +Kubernetes docs at least half-time. That's very disheartening for online +documentation that has had over 53 million unique page views from readers in 229 +countries year to date in 2019. + +SIG Docs faces challenges due to lack of technical writers: + +- **Maintaining a high quality in the Kubernetes documentation**: + There are over 750 pages of documentation. That's _750 pages_ to check for + stale content on a regular basis. This involves more than running a link + checker against the `kubernetes/website` repo. This involves people having a + technical understanding of Kubernetes, knowing which code release changes + impact documentation, and knowing where content is located in the + documentation so that _all_ impacted pages and example code files are updated + in a timely fashion. Other SIGs help with this, but based on the number of + issues created by readers, enough people aren't working on keeping the content + fresh. +- **Reducing the time to review and merge a PR**: + The larger the size of the PR, the longer it takes to get the `lgtm` label + and eventual approval. My `size/M` and larger PRs took from five to thirty + days to approve. Sometimes I politely poked reviewers to review again after + I had pushed updates. Other times I asked on the #sig-docs channel for _any + approver_ to take a look and approve. People are busy. People go on + vacation. People also move on to new roles that don't involve SIG Docs and + forget to remove themselves from the reviewer and approver assignment file. + A large part of the time-to-merge problem is not having enough reviewers and + approvers. The other part is the [high + barrier](https://github.com/kubernetes/community/blob/master/community-membership.md#reviewer) + to becoming a reviewer or approver, much higher than what I've seen on other + open source projects. Experienced open source tech writers who want to + contribute to SIG Docs aren't fast-tracked into approver and reviewer roles. + On one hand, that high barrier ensures that those roles are filled by folks + with a minimum level of Kubernetes documentation knowledge; on the other + hand, it might deter experienced tech writers from contributing at all, or + from a company allocating a tech writer to SIG Docs. Maybe SIG Docs should + consider deviating from the Kubernetes community requirements by lowering + the barrier to becoming a reviewer or approver, on a case-by-case basis, of + course. +- **Ensuring consistent naming across all pages**: + Terms should be identical to what is used in the **Standardized Glossary**. Being consistent reduces confusion. + Tracking down and fixing these occurrences is time-consuming but worthwhile for readers. +- **Working with the Steering Committee to create project documentation guidelines**: + The [Kubernetes Repository + Guidelines](https://github.com/kubernetes/community/blob/master/github-managemen + t/kubernetes-repositories.md) don't mention documentation at all. Between a + project's GitHub docs and the Kubernetes docs, some projects have almost + duplicate content, whereas others have conflicting content. Create clear + guidelines so projects know to put roadmaps, milestones, and comprehensive + feature details in the `kubernetes/` repo and to put installation, + configuration, usage details, and tutorials in the Kubernetes docs. +- **Removing duplicate content**: + Kubernetes users install Docker, so a good example of duplicate content is + Docker installation instructions. Rather than repeat what's in the Docker + docs, state which version of Docker works with which version of Kubernetes + and link to the Docker docs for installation. Then detail any + Kubernetes-specific configuration. That idea is the same for the container + runtimes that Kubernetes supports. +- **Removing third-party vendor content**: + This is tightly coupled to removing duplicate content. Some third-party + content consists of lists or tables detailing external products. Other + third-party content is found in the **Tasks** and **Tutorials** sections. + SIG Docs should not be responsible for verifying that third-party products + work with the latest version of Kubernetes. Nor should SIG Docs be + responsible for maintaining lists of training courses or cloud providers. + Additionally, the Kubernetes documentation isn't the place to pitch vendor + products. If SIG Docs is forced to reverse its policy on not allowing + third-party content, there could be a tidal wave of + vendor-or-commercially-oriented pull requests. Maintaining that content + places an undue burden on SIG Docs. +- **Indicating which version of Kubernetes works with each task and tutorial**: + This means reviewing each task and tutorial for every release. Readers + assume if a task or tutorial is in the latest version of the docs, it works + with the latest version of Kubernetes. +- **Addressing issues**: + There are 470 open issues in the `kubernetes/website` repo. It's hard to keep up with all the issues that are created. We encourage + those creating simpler issues to submit PRs: some do; most do not. +- **Creating more detailed content**: + Readers + [indicated](https://kubernetes.io/blog/2019/10/29/kubernetes-documentation-end-user-survey) + they would like to see more detailed content across all sections of the + documentation, including tutorials. + +Kubernetes has seen unparalleled growth since its first release in 2015. Like +any fast-growing project, it has growing pains. Providing consistently +high-quality documentation is one of those pains, and one incredibly important +to an open source project. SIG Docs needs a larger core team of tech writers who +are allocated at least 50%. SIG Docs can then better achieve goals, move forward +with new content, update existing content, and address open issues in a timely fashion. + +## Observation 09: Contributing to technical documentation projects requires, on average, more skills than developing software {#observation-9} + +When I said that to my former colleagues, the response was a healthy dose of +skepticism and lots of laughter. It seems that many developers, as well as +managers, don't fully know what tech writers contributing to open source +projects actually do. Having done both development and technical writing for the +better part of 22 years, I've noticed that tech writers are valued far less than +software developers of comparative standing. + +SIG Docs core team members do far more than write content based on requirements: + +- We use some of the same processes and tools as developers, such as the + terminal, git workflow, GitHub, and IDEs like Atom, Golang, and Visual Studio Code; we + also use documentation-specific plugins and tools. +- We possess a good eye for detail as well as design and organization: the big picture _and_ the little picture. +- We provide documentation which has a logical flow; it is not merely content on a page + but the way pages fit into sections and sections fit into the overall structure. +- We write content that is comprehensive and uses language that readers not fluent in English can understand. +- We have a firm grasp of English composition using various markup languages. +- We are technical, sometimes to the level of a Kubernetes admin. +- We read, understand, and occasionally write code. +- We are project managers, able to plan new work as well as assign issues to releases. +- We are educators and diplomats with every review we do and with every comment we leave on an issue. +- We use site analytics to plan work based on which pages readers access most often as well as which pages readers say are unhelpful. +- We are surveyors, soliciting feedback from the community on a regular basis. +- We analyze the documentation as a whole, deciding what content should stay and + what content should be removed based on available resources and reader needs. +- We have a working knowledge of Hugo and other frameworks used for + online documentation; we know how to create, use, and debug Hugo shortcodes that + enable content to be more robust than pure Markdown. +- We troubleshoot performance issues not only with Hugo but with Netlify. +- We grapple with the complex problem of API documentation. +- We are dedicated to providing the highest quality documentation that we can. + +If you have any doubts about the complexity of the Kubernetes documentation +project, watch presentations given by SIG Docs Chair Zach Corleissen: + +- [Multilingual Kubernetes](https://archive.fosdem.org/2019/schedule/event/multikuber/) - the kubernetes.io stack, how we got there, and what it took to get there +- [Found in Translation: Lessons from a Year of Open Source Localization](https://youtu.be/GXkpHAruNV8) + +Additionally, [Docs as Code: The Missing Manual](https://youtu.be/JvRd7MmAxPw) +(Jennifer Rondeau, Margaret Eker; 2016) is an excellent presentation on the +complexity of documentation projects in general. + +The Write the Docs [website](http://www.writethedocs.org/) and [YouTube +channel](https://www.youtube.com/channel/UCr019846MitZUEhc6apDdcQ) are +fantastic places to delve into the good, the bad, and the ugly of technical writing. + +Think what an open source project would be without talented, dedicated tech writers! + +## Observation 10: Community is everything {#observation-10} + +The SIG Docs community, and the larger Kubernetes community, is dedicated, +intelligent, friendly, talented, fun, helpful, and a whole bunch of other +positive adjectives! People welcomed me with open arms, and not only because SIG +Docs needs more technical writers. I have never felt that my ideas and contributions were +dismissed because I was the newbie. Humility and respect go a long way. +Community members have a wealth of knowledge to share. Attend meetings, ask +questions, propose improvements, thank people, and contribute in +every way that you can! + +Big shout out to those who helped me, and put up with me (LOL), during my +break-in period: @zacharaysarah, @sftim, @kbhawkey, @jaypipes, @jrondeau, +@jmangel, @bradtopol, @cody_clark, @thecrudge, @jaredb, @tengqm, @steveperry-53, +@mrbobbytables, @cblecker, and @kbarnard10. + +## Outro + +Do I grok SIG Docs? Not quite yet, but I do understand that SIG Docs needs more +dedicated resources to continue to be successful. + + +## Citations +1 @linuxfoundation. "Megan Byrd-Sanicki, Open Source Strategist, Google @megansanicki - documentation is the #1 driver of software adoption. #ossummit." _Twitter_, Oct 29, 2019, 3:54 a.m., twitter.com/linuxfoundation/status/1189103201439637510. diff --git a/static/images/blog/grokkin-the-docs/grok-definition.png b/static/images/blog/grokkin-the-docs/grok-definition.png new file mode 100644 index 0000000000000000000000000000000000000000..9889472d51757888ce1e1c230dec7d58b656c031 GIT binary patch literal 14977 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

65%#IC#jD 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 literal 0 HcmV?d00001