惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

人人都是产品经理
人人都是产品经理
D
Docker
GbyAI
GbyAI
B
Blog RSS Feed
博客园 - 司徒正美
博客园 - Franky
美团技术团队
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
aimingoo的专栏
aimingoo的专栏
C
Check Point Blog
IT之家
IT之家
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
www.infosecurity-magazine.com
www.infosecurity-magazine.com
AI
AI
O
OpenAI News
Attack and Defense Labs
Attack and Defense Labs
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
T
Tailwind CSS Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
S
Secure Thoughts
博客园 - 聂微东
L
LINUX DO - 最新话题
U
Unit 42
SecWiki News
SecWiki News
A
Arctic Wolf
Schneier on Security
Schneier on Security
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
V
Visual Studio Blog
量子位
The Cloudflare Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
大猫的无限游戏
大猫的无限游戏
Google DeepMind News
Google DeepMind News
G
Google Developers Blog
T
Threat Research - Cisco Blogs
TaoSecurity Blog
TaoSecurity Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
B
Blog
博客园 - 【当耐特】
C
CERT Recently Published Vulnerability Notes
Scott Helme
Scott Helme
Last Week in AI
Last Week in AI
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Microsoft Security Blog
Microsoft Security Blog
Apple Machine Learning Research
Apple Machine Learning Research
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
A
About on SuperTechFans
博客园 - 三生石上(FineUI控件)
Latest news
Latest news

Kent C. Dodds Blog

Implementing Hybrid Semantic + Lexical Search Simplifying Containers with Cloudflare Sandboxes Migrating to Workspaces and Nx Offloading FFmpeg with Cloudflare Building Semantic Search on my Content Helping YOU ask ME questions with AI How I used Cursor to Migrate Frameworks The Dow's Start on the Covenant Path 2025 in Review The next chapter: EpicAI.pro AI is taking your job How I increased my visibility Launching Epic Web 2023 in Review Stop Being a Junior RSC with Dan Abramov and Joe Savona Live Stream Fixing a Memory Leak in a Production Node.js App 2022 in Review My Car Accident I Migrated from a Postgres Cluster to Distributed SQLite with LiteFS I'm building EpicWeb.dev A review of my time at Remix Remix: The Yang to React's Yin How I help you build better websites Why I Love Remix The State Initializer Pattern How to React ⚛️ Get a catch block error message with TypeScript Building an awesome image loading experience How Remix makes CSS clashes predictable Introducing the new kentcdodds.com How I built a modern website in 2021 How to use React Context effectively Static vs Unit vs Integration vs E2E Testing for Frontend Apps The Testing Trophy and Testing Classifications Array reduce vs chaining vs for loop Don't Solve Problems, Eliminate Them Super Simple Start to Remix Super Simple Start to ESModules in Node.js JavaScript Pass By Value Function Parameters How to write a Constrained Identity Function (CIF) in TypeScript How to optimize your context value How to write a React Component in TypeScript TypeScript Function Syntaxes Listify a JavaScript Array Build vs Buy: Component Libraries edition Using fetch with TypeScript Wrapping React.useState with TypeScript Define function overload types with TypeScript 2020 in Review Business and Engineering alignment Hi, thanks for reaching out to me 👋 useEffect vs useLayoutEffect Super simple start to Firebase functions Super simple start to Netlify functions Super Simple Start to css variables Favor Progress Over Pride in Open Source Testing Implementation Details How getting into Open Source has been awesome for me useState lazy initialization and function updates Use ternaries rather than && in JSX Application State Management with React Use react-error-boundary to handle errors in React JavaScript to Know for React How I structure Express apps What open source project should I contribute to? When I follow TDD AHA Programming 💡 How I Record Educational Videos Should I write a test or fix a bug? Stop mocking fetch Intentional Career Building Improve test error messages of your abstractions Tracing user interactions with React Eliminate an entire category of bugs with a few simple tools Common mistakes with React Testing Library Super Simple Start to React Stop using client-side route redirects The State Reducer Pattern with React Hooks Function forms Replace axios with a simple custom fetch wrapper How to test custom React hooks React Production Performance Monitoring Should I useState or useReducer? Stop using isLoading booleans Make Your Test Fail Make your own DevTools An Argument for Automation Fix the "not wrapped in act(...)" warning Super Simple Start to ESModules in the Browser Implementing a simple state machine library in JavaScript 2010s Decade in Review Why users care about how you write code Why I avoid nesting closures Don't call a React function component Why your team needs TestingJavaScript.com Inversion of Control Understanding React's key prop How to Enable React Concurrent Mode Profile a React App for Performance
First Timers Only
Kent C. Dodds 🏹 @kentcdodds · 2015-08-04 · via Kent C. Dodds Blog

I've started doing something recently that's been really rewarding. I'm the maintainer of angular-formly a fairly popular library for forms with AngularJS. I've committed a lot of code and the library has 33 contributors right now. For at least five of these contributors, it was their first time contributing to an open source library.

I've tried really hard to make it easy to contribute to angular-formly. I've done all of the common things an open source project maintainer does and some less common things...

  • Set up the (often ignored) CONTRIBUTING.md
  • Try hard to organize the code and comment where necessary
  • Add an up-for-grabs label (and angular-formly is now on up-for-grabs.net)
  • Add a githook (using ghooks) that runs the tests and checks coding standards with eslint so people don't have the frustration of going back and forth on the PR.
  • Use npm scripts so people don't have to understand or globally install any build tools

I've even recorded screencasts to demonstrate how to get things setup. But what I didn't realize was that there was still something missing...


A few months back, angular-formly got a pull request from Koen Weyn who wanted to fix some IE8 compatibility issues with the project. He submitted a good PR (pull request), we iterated on it a little bit, and it got merged. He mentioned to me that it was his first ever GitHub pull request. That was a neat experience. It was cool to be a part of someone's first ever open source code contribution.

It wasn't until a few months later that I had an idea. While developing a new feature doing TDD (Test Driven Development) all the way (and loving it), I finished the tests and was about ready to start on the implementation. Then I had a thought: “Why don't I let someone else work on this? I know exactly what I'd do. I could do some hand-holding and help someone contribute to open source for the first time.”

Small tangent… I'm a happy father of two. When teaching or playing with my kids, sometimes I have to ask my daughter to give her brother a chance to answer a question. Many people are eager to please and help out. So when I throw out a soft-ball to my son, if I don't ask my daughter to let her little brother answer, she'll spout out the answer and he'll have a harder time learning/feeling the satisfaction of answering. I think that sometimes we adults can behave the same way.

So I decided to commit the tests, but skipped (so the build wouldn't fail) (using describe.skip from Mocha), then I pushed them up and added this comment to the issue:

screenshot of the issue comment

Make it as is easy as possible. Say exactly where the code needs to go and recommend a good approach.

The hard part of getting into open source for the first time isn't the implementation of a feature, but figuring out how to actually contribute code.

So I explain exactly what to do in the issue, and then I blasted it out on Twitter, Gitter, and Slack:

It wasn't long before I had several people reach out to me on all three mediums asking if they could take a swing at it. Finally with this PR, Stephen Bluck took his first step into the open source community.

It felt awesome! So I looked for opportunities to do this some more. I've had the chance to do this three more times and it's been rewarding for both me and the contributor each time. The project now has a first-timers-only label for this purpose. Shoutouts go to Douglas Mason, Devan Beitel, and Brian Macheski for taking up the challenge. For those of you who haven't had a chance yet, don't worry, there's definitely more to come…


Now, could I have finished it quicker and moved on my way if I'd just done it myself? Of course. But that's not what it's all about as an open source contributor. It's fun delivering good software that helps other people, but also realize that there are tons of people out there who just don't know where to get started.

Some of you may be asking yourself, “what if I (and other lib users) don't want to wait days for the feature?” From my experience, people are eager to try it out. At least one PR (sometimes several) is submitted, iterated on, and merged within a matter of a few hours.

I've thought back on my first pull request. It was nothing spectacular. It was really small. I learned how to use git and GitHub. It gave me an opportunity to figure out what contributing feels like. That's a rewarding feeling. As open source project maintainers, we are empowered with the ability to help newcomers feel this for the first time and contribute back. Let's do it!


A small plea

If you are an open source project maintainer, give this a shot. Add the label first-timers-only to your project so people can find it here. You might also consider referencing makeapullrequest.com. I think that we can be more friendly to newcomers in the open source community. You never know, you may find a new main contributor to the project or even a new life-long friend. Either way, the more people we get into open source the better. And by being open like this, we're helping “Bring Kindness back to Open Source.”

See you on the githubs and twitters!


Watch my Fluent Conf 2016 talk “The First Pull Request

https://youtu.be/HjgZQeMrw6c?list=PLV5CVI1eNcJgNqzNwcs4UKrlJdhfDjshf

Read next: