Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Open Source Maintenance — RailsClub Moscow
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Eric Hodel
September 28, 2013
Programming
180
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Open Source Maintenance — RailsClub Moscow
Presented at RailsClub Moscow 2013
Eric Hodel
September 28, 2013
More Decks by Eric Hodel
See All by Eric Hodel
Building maintainable command-line tools with MRuby
drbrain
0
700
Introduction to Rake
drbrain
0
400
Lazy Enumeration
drbrain
0
140
Lessons in Mentorship
drbrain
1
260
Open Source Maintenance — Ruby on Ales 2014
drbrain
1
150
drbdump
drbrain
2
550
Other Decks in Programming
See All in Programming
Even G2とAWSで推しのエージェントを召喚しよう!
har1101
1
140
Contextとはなにか
chiroruxx
1
380
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
1
320
The NotImplementedError Problem in Ruby
koic
1
990
Strategic Design in the Frontend: Moduliths & Micro Frontends @DDDEurope
manfredsteyer
PRO
0
130
エージェンティックRAGにAWSで入門しよう!
har1101
9
1.8k
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
4.7k
Honoでのサプライチェーン侵害対策 〜 3つのライブラリに学ぶ
yusukebe
7
1.5k
なぜ型を書くのか? TSKaigi2026で改めて考える #tskaigi_smarthr
kajitack
0
170
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
180
Skillsは効率化、Agentsは"自分の拡張"——Builder時代のエージェント編成(CC Night 2026)
wemra
1
180
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
800
Featured
See All Featured
GraphQLとの向き合い方2022年版
quramy
50
15k
HDC tutorial
michielstock
2
730
The World Runs on Bad Software
bkeepers
PRO
72
12k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
630
Building AI with AI
inesmontani
PRO
1
1.1k
Claude Code のすすめ
schroneko
67
230k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
120k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
340
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Transcript
Open Source Maintenance Eric Hodel -
[email protected]
Open Source is My Job
Projects •RubyGems •RDoc •net-http-persistent •… many more
Responsibilities Maintenance Stewardship Understanding
Why Open Source?
“programming is rather thankless. you see your works become replaced
by superior works in a year. unable to run at all in a few more.” _why
“Here’s what becoming eFamous made me realize: Everyone is sincere
and doing it because they care. I was very surprised to learn this.” @garybernhardt
“I get paid to do something I love. Something I’ve
done in my spare time since I was a kid. That’s awesome. That’s why I care.” @lindseybieda
I Care
Pleasant Surprises net-http-persistent single connection ~750,000 requests
Pleasant Surprises rdoc -C shows documentation coverage for your library
used in contracts
Values
Open Source Values •Community •Collaboration •Sharing •Re-use
Proprietary Software “Your team should work like an open source
project” bit.ly/1byoEiK Ryan Tomayko
OSS Constraints •Electronic Communication •Visible Work •Asynchronous •Lock-free
Commits
Commits Create History
Tell a Story
Commit Small •History is easier to read •Easy to revert
•Easy branch maintenance •github user page bragging
Atomic Commit Convention bit.ly/160ia91
Small Commits •Fix only one bug •Add one method •Whitespace
cleanup •Reformat a line
Current status: Not sure where I was going with this
“One thing Clojure has taught me is that good commit
messages are a luxury of people that know what […] they are doing” @tpope
Be Descriptive Descriptive messages make history easy to understand
git commit --help “begin the commit message with a single
short line summarizing the change”
Short Summary •The URI argument to Gem::Request.new must be a
URI •Only display relevant release notes upon update •Allow `gem uninstall foo --all`
git commit --help “followed by a more thorough description”
Thorough Description The URI argument to Gem::Request.new must be a
URI The tests were lazy and used a String which was converted internally. This causes problems on older ruby versions which don't allow `URI(URI("http://example"))`. Now the argument given is always a URI in the tests.
Thorough Description •Old behavior •Why it needs to change •New
behavior
Thorough Description •Commit references •Issue references •Don't assign blame •Except
to yourself
Issues
Organize
Issue Labels •Status •Type •Category
Milestones •Release boundary •Allow slippage •Feature freeze
Keep an Open Mind
Random Test Failure -{"SHA512"=> +{"SHA1"=>
Random Test Failure •Rarely occurs •Probably hash order problem •Must
be hash order problem!
Hash Mismatch +"data.tar.gz"=>"14413052..."}, -"data.tar.gz"=>"c6465bbb..."},
gzip Timestamp •One second resolution •Test gzipped two files •Sometimes
in different seconds
It's OK to Be Wrong
rubygems/rubygems #510 them: The chmod should be included in the
publishing guide
rubygems/rubygems #510 me: Why? The file is created with the
correct permissions
rubygems/rubygems #510 them: The guide says to run: curl -u
username [...] > ~/.gem/credentials
rubygems/rubygems #510 me: I'm sorry, I didn't read that section.
RubyGems creates the credentials file for you. I'll rewrite the offending section.
Pursue Understanding
“‘X’ is Hard to Use” •“Hard”, “Broken”, “Doesn't Work” •You
think “X” is easy, works •They might be right!
Maintenance & New Features
Find the Root Cause
“Trying to force myself to keep asking, ‘rather than *solve*
[hard problem X], is there a way to make [X] irrelevant?’ Typical answer: yes.” Kathy Sierra — @seriouspony
Hard → Easy •Hide details when possible •Avoid configuration •Provide
broad defaults
“The worst thing about writing clever code is not being
clever enough to understand it.” Eleanor McHugh — @feyeleanor
Keep it Simple •Small commits •Minimum change •Document when you
can't
rails/rails@ba0568e “In the past we used Hash[columns.zip(row)] […], the verbose
way is much more efficient both time and memory wise cause it avoids a big array allocation”
Refactor •Simplify methods •Improve API •Improve understanding •Don't forget tests
Good API
Compact API •Minimum objects •Minimum arguments •Minimum configuration •Self-check through
tests
Good Names •Hardest •Do your names fit? •Reveal intention?
Semantic Versioning
2.3.4 •Incompatible API changes
2.3.4 •Incompatible API changes •Backward-compatible features
2.3.4 •Incompatible API changes •Backward-compatible features •Backward-compatible bug fixes •http://semver.org
SemVer and RubyGems 'rake', '~> 10.0.3' 10.0.3 to 10.0.99…
SemVer and RubyGems 'rake', '~> 10.0', '>= 10.0.3' 10.0.3 to
10.99…
Reduce Barriers
“This is what your tool chain looks like to people
not ‘in the know’. They just want to do a thing” @jessenoller
How Do I Start? •CONTRIBUTING.txt •run: bundle •How do I
run the tests? •hoe: rake newb
CONTRIBUTING.txt •Your process •fork, edit, test, pull request •Code conventions
•Vocabulary
Automate Everything •Travis-CI •Generate files •Run tests •Release
How to Contribute
What Gems do You Use?
Gems You Use •Report bugs •Report bad documentation •Hard to
understand •Missing examples
Pull Requests •Contact the maintainers: “How would I fix issue
#XXX” •Start small •Try different projects
Scratch Your Own Itch
Code Climate •Free for github projects •Uses flog and flay
•Refactoring targets •Method duplication •Complexity
Thank You