I applied to GitHub through their careers page. I heard back from them a little over 3 weeks later. A month after that they made me an offer. It was a great experience! Here were the steps I went through:
1. The recruiter reached out asking me to complete a pre-technical exercise. This is the same exercise mentioned in other comments here to build a REST API. I had 5 hours to complete in the language of my choice. I was able to finish the assignment under the time allotted and used the remaining time to make improvements and add test coverage. In retrospect, I don't think that was necessary as this assignment didn't come back up in later stages of the interview. It took them a day to respond saying that I had passed that test.
2. A couple of days later I had an interview with the recruiter. She had a few questions about diversity and inclusion and it felt very much like a conversation. She also spoke a little bit about the role, although at this point, the team I was interviewing for wasn't defined yet. They were basically putting all SWE candidates through the same process and only assigning us to specific teams in the later stages.
3. Then came the technical interview. This took a couple of weeks to happen because of a holiday and they wanted to schedule candidates for a Tuesday and Thursday of the same week. On Tuesday, I had 2 pairing technical interviews, 90 minutes each, with a 30 minute break in between. There were 2 different GitHub engineers for each of the 90-minute blocks that were all part of different teams. The first 30 minutes of the first block were all behavioral questions. A lot of questions about managing technical debt, managing projects, resolving conflicts. Then, we started working on a problem together. I had to build a client app / script that did some data wrangling and posted to an API. It mostly involved talking out loud as I solved the problem and them asking why did I choose to do something or "what if" questions. Then I had a 30 minute break and I started the second 90 minute block with 2 different engineers. We picked up the problem where I had left off. At this point, we started working through edge cases, validations, and other considerations. Once there were 30 minutes left, they started asking behavioral questions around similar topics the previous engineers were asking me.
4. Final round of interviews. The technical interview described above happened on a Tuesday. On Wednesday, they got together to decide whether I made it through and which org I'd be a candidate for. On Thursday, I had my final interviews, which were 30 minutes with a director and 30 minutes with the hiring manager. The first thing the director asked me was how the process was going so far and I mentioned it was very positive and that I didn't have high expectations given the kinds of comments I had read on Glassdoor. He said that they had dropped the ball in the past and that they were working to improve it and I loved that. Very honest about previous mistakes and embraced continuous improvement. The director asked things like why do you want to work at Github and general experience. The hiring manger had some good questions about diversity and inclusion and also about general process of working in a production application. Both were incredibly nice and felt much more like a chat than an interview. I received an offer the following Monday.
Some general thoughts:
* Everyone was incredibly nice and made me feel as comfortable as possible.
* They were really big into behavioral questions and no one was really asking follow-up questions to my responses, so just make sure your response is clear.
* Everyone left time for me to ask questions, so I would recommend having some good questions ready.