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

推荐订阅源

The Last Watchdog
The Last Watchdog
S
Securelist
T
Threat Research - Cisco Blogs
Forbes - Security
Forbes - Security
AI
AI
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Attack and Defense Labs
Attack and Defense Labs
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Know Your Adversary
Know Your Adversary
P
Privacy International News Feed
W
WeLiveSecurity
P
Palo Alto Networks Blog
O
OpenAI News
V2EX - 技术
V2EX - 技术
H
Heimdal Security Blog
L
Lohrmann on Cybersecurity
NISL@THU
NISL@THU
T
Tor Project blog
T
Threatpost
G
GRAHAM CLULEY
T
The Exploit Database - CXSecurity.com
云风的 BLOG
云风的 BLOG
人人都是产品经理
人人都是产品经理
A
Arctic Wolf
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Latest news
Latest news
Application and Cybersecurity Blog
Application and Cybersecurity Blog
T
Tenable Blog
量子位
L
LINUX DO - 最新话题
Webroot Blog
Webroot Blog
F
Fortinet All Blogs
C
CERT Recently Published Vulnerability Notes
Hacker News: Ask HN
Hacker News: Ask HN
U
Unit 42
T
Tailwind CSS Blog
WordPress大学
WordPress大学
N
News | PayPal Newsroom
C
CXSECURITY Database RSS Feed - CXSecurity.com
N
Netflix TechBlog - Medium
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Stack Overflow Blog
Stack Overflow Blog
Cloudbric
Cloudbric
C
Check Point Blog
V
Visual Studio Blog
The GitHub Blog
The GitHub Blog
The Hacker News
The Hacker News
B
Blog

Peter Steinberger

OpenClaw, OpenAI and the future | Peter Steinberger Shipping at Inference-Speed | Peter Steinberger The Signature Flicker | Peter Steinberger Just Talk To It - the no-bs Way of Agentic Engineering | Peter Steinberger Claude Code Anonymous | Peter Steinberger Live Coding Session: Building Arena | Peter Steinberger My Current AI Dev Workflow | Peter Steinberger Essential Reading for Agentic Engineers - August 2025 | Peter Steinberger Just One More Prompt | Peter Steinberger Poltergeist: The Ghost That Keeps Your Builds Fresh | Peter Steinberger Don't read this Startup Slop | Peter Steinberger Essential Reading for Agentic Engineers - July 2025 | Peter Steinberger Self-Hosting AI Models After Claude's Usage Limits | Peter Steinberger Logging Privacy Shenanigans | Peter Steinberger VibeTunnel's first AI-anniversary | Peter Steinberger Making AppleScript Work in macOS CLI Tools: The Undocumented Parts | Peter Steinberger Peekaboo 2.0 – Free the CLI from its MCP shackles | Peter Steinberger Command your Claude Code Army, Reloaded | Peter Steinberger Essential Reading for Agentic Engineers | Peter Steinberger Slot Machines for Programmers: How Peter Builds Apps 20x Faster with AI | Peter Steinberger My AI Workflow for Understanding Any Codebase | Peter Steinberger stats.store: Privacy-First Sparkle Analytics | Peter Steinberger Showing Settings from macOS Menu Bar Items: A 5-Hour Journey | Peter Steinberger VibeTunnel: Turn Any Browser into Your Mac's Terminal | Peter Steinberger Vibe Meter 2.0: Calculating Claude Code Usage with Token Counting | Peter Steinberger llm.codes: Make Apple Docs AI-Readable | Peter Steinberger Automatic Observation Tracking in UIKit and AppKit: The Feature Apple Forgot to Mention | Peter Steinberger Peekaboo MCP – lightning-fast macOS screenshots for AI agents | Peter Steinberger Migrating 700+ Tests to Swift Testing: A Real-World Experience | Peter Steinberger Commanding Your Claude Code Army | Peter Steinberger Code Signing and Notarization: Sparkle and Tears | Peter Steinberger Vibe Meter: Monitor Your AI Costs | Peter Steinberger Claude Code is My Computer | Peter Steinberger Stop Over-thinking AI Subscriptions | Peter Steinberger Introducing Demark: HTML in. MD out. Blink-fast. | Peter Steinberger The Future of Vibe Coding: Building with AI, Live and Unfiltered | Peter Steinberger MCP Best Practices | Peter Steinberger Finding My Spark Again | Peter Steinberger Top-Level Menu Visibility in SwiftUI for macOS | Peter Steinberger Fixing keyboardShortcut in SwiftUI | Peter Steinberger Supporting Both Tap and Long Press on a Button in SwiftUI | Peter Steinberger On Using Apple Silicon Mac Mini for Continuous Integration | Peter Steinberger Apple Silicon M1: A Developer's Perspective | Peter Steinberger Gardening Your Twitter: Curating Your Timeline | Peter Steinberger Gardening Your Twitter: Growing Your Followers | Peter Steinberger Forbidden Controls in Catalyst: Optimize Interface for Mac | Peter Steinberger Disabling Keyboard Avoidance in SwiftUI's UIHostingController | Peter Steinberger The State of SwiftUI | Peter Steinberger Logging in Swift | Peter Steinberger Building with Swift Trunk Development Snapshots | Peter Steinberger Calling Super at Runtime in Swift | Peter Steinberger zld — A Faster Version of Apple's Linker | Peter Steinberger How to Fix LLDB: Couldn't IRGen Expression | Peter Steinberger Updating macOS on a Hackintosh | Peter Steinberger InterposeKit — Elegant Swizzling in Swift | Peter Steinberger The Great Mac Catalyst Text Input Crash Hunt | Peter Steinberger Jailbreaking for iOS Developers | Peter Steinberger Network Kernel Core Dump | Peter Steinberger How to macOS Core Dump | Peter Steinberger Kernel Panics and Surprise boot-args | Peter Steinberger The LG UltraFine 5K, kernel_task, and Me | Peter Steinberger Let's Try This Again | Peter Steinberger How We Work at PSPDFKit | Peter Steinberger Swizzling in Swift | Peter Steinberger WWDC for First-Timers, 2019 Edition | Peter Steinberger Challenges of Adopting Drag and Drop | Peter Steinberger Marzipan: Porting iOS Apps to the Mac | Peter Steinberger How to Use Slack and Not Go Crazy | Peter Steinberger Hardcore Debugging - Heavy Weapons for Hard Bugs | Peter Steinberger Binary Frameworks in Swift | Peter Steinberger Even Swiftier Objective-C | Peter Steinberger The Case for Deprecating UITableView | Peter Steinberger Running tests with Clang Address Sanitizer | Peter Steinberger UI testing on iOS, without busy waiting | Peter Steinberger Writing Good Bug Reports | Peter Steinberger Real-time collaboration, Apple, and you | Peter Steinberger Converting Xcode Test Runs to JUnit, the Fast Way | Peter Steinberger Efficient iOS Version Checking | Peter Steinberger Investigating Thread Safety of UIImage | Peter Steinberger Swifty Objective-C | Peter Steinberger Running UI Tests on iOS With Ludicrous Speed | Peter Steinberger A Pragmatic Approach to Cross-Platform | Peter Steinberger Surprises with Swift Extensions | Peter Steinberger Using ccache for Fun and Profit | Peter Steinberger UITableViewController designated initializer woes | Peter Steinberger Researching ResearchKit | Peter Steinberger The curious case of rotation with multiple windows on iOS 8 | Peter Steinberger UIKit Debug Mode | Peter Steinberger Retrofitting containsString: on iOS 7 | Peter Steinberger A Story About Swizzling "the Right Way™" and Touch Forwarding | Peter Steinberger Hacking with Aspects | Peter Steinberger Fixing UITextView On iOS 7 | Peter Steinberger Fixing What Apple Doesn't | Peter Steinberger How To Inspect The View Hierarchy Of Third-Party Apps | Peter Steinberger Fixing UISearchDisplayController On iOS 7 | Peter Steinberger Smart Proxy Delegation | Peter Steinberger Adding Keyboard Shortcuts To UIAlertView | Peter Steinberger How To Center Content Within UIScrollView | Peter Steinberger UIAppearance for Custom Views | Peter Steinberger Hacking Block Support Into UIMenuItem | Peter Steinberger
Hiring a distributed team | Peter Steinberger
Peter Steinberger · 2016-09-20 · via Peter Steinberger

Who you hire can have a dramatic effect on your team’s culture and company’s productivity. People are the most influential factor in determining the success or failure of a company. Hiring is difficult and comes with high stakes. Make the wrong hire and you could be living with the consequences for longer than you’d expect. Make the right hire and you might be surprised by the asset the person becomes to your company. Add the additional variable of hiring someone who is distributed for a remote team and it gets even more complex. During the past six years at PSPDFKit, we’ve slowly learned what’s important, what works, and what doesn’t work, at least for us.

working at computer

Our process

Our hiring process for a prospective candidate usually takes 1-2 weeks - we try to never drag it out longer than two weeks, but are flexible if a candidate only has limited time for calls. It all starts with an email response to one of our job openings from a potential candidate. We publish open jobs on our careers page and also advertise the role at various sites and newsletters.

Our job post is fairly straightforward and lists a few things that we’d like to see in an application. We ask a few open questions like “Who are you as a programmer” and “Send us a piece of code that does something you find interesting, and explain why.” The most important thing we look for at this stage from potential candidates is how much they care about applying for the position. Sadly, over 90% of the candidates flat out ignore the few questions, which makes it quite easy to just filter them out.

We have an internal goal of answering every email we receive, since we’ve all experienced the feeling of sending out an application into the job hunt abyss and never hearing anything in return. We have various default snippets for rejection. If people follow up and ask for details, we usually provide more insight into our decision. Candidates that look promising are forwarded to the team lead to gauge interest. If the team lead is interested then it’s on to pre-screening.

We do not use recruiters or agencies - hiring is driven by the team leads and the company owners directly.

Since the post has been released some people asked about the rejection snippets. Initially we provided more detailed, honest feedback why we believe it would not work out. Some people really appreciated the honesty and used it as a way to improve themselves; some others responded with very harsh words or even insults. Accepting constructive criticism is a hard skill and after some “special” emails, we opted to what most of the industry does - using a default snippet, without any reason given. However, sometimes candidates follow up and ask for a reason. With explaining the above problematic and that we’re just being honest and want to help, there have been no more insults, and some people even thanked us for the feedback.

Pre-screening

If a potential candidate looks interesting, the next step is to send out our pre-screening form. We use a simple Google Form for this step, and it has worked really well. It’s structured to include both basic questions and open-ended free form questions. The form checks for a few very pertinent topics for us:

  • Full-Time? This is a check to confirm that we look for a full-time role.
  • Personal References for later follow-ups.
  • Salary expectations. We ask for a rough range to be able to gauge whether this is a non-starter from the beginning.
  • Earliest start date.
  • Experience with remote work.
  • What other companies have you applied to recently?
  • Why do you want to work for us?
  • What’s your ideal work environment?

Pre-screening Form

And a few more - I don’t want to spoil all surprises. Apply with us and find out :)

The pre-screening form has proved to be a huge time saver and helps protect us from any surprises. In the past, we’ve had people go through hours of interviews, only to find out that their salary expectations were outlandish or that they were actually looking for a part-time role for the next 1.5 years. The free-form questions also are a great way to start a conversation and give us an idea of what is important to a candidate. Again, we still are looking to see how much a candidate cares and this is generally evident in the amount of time they spend on answering the form.

At this point we also take a closer look at Twitter, GitHub, open source contributions, comments on mailing lists, StackOverflow and any other online resource we can find. We’re not interested in Facebook feeds but how a candidate interacts with other engineers, the work approach, how commit messages look or how issues are handled. We might also ping the personal references listed in the form to get more opinions from people who have already worked with the candidate.

FaceTime interview with PSPDFKit

Face time

If things still look good after reading the pre-screening form, we’ll follow up to find a date for a video call. We generally run all candidates through 4 to 5 video interviews, where some are more technical and some are more here to get to know the candidate. After each interview we write down our thoughts into a shared document. This helps us to track the process and allows us to identify spots where we should ask more and also makes the process efficient.

With “value/cultural-fit” we look for people who understand that sometimes things need be hacked, but that we come back and do it right at a later time. That the line between getting things done and delivering a superb user experience is sometimes a hard one to walk. That working in a team is different than working on your own. That at PSPDFKit, nothing is somebody else’s problem. That we help each other. That there might be times where there’s a lot to do, but that it’s not the norm. That we spend more time on getting things right than most other companies and often have unique challenges. We pride ourselves in having people from currently 11 countries, and while all these different cultural influences are sometimes a challenge, it’s also very valuable and interesting to have so many different people, with different backgrounds and different mind-sets working on a common goal.

For the technical interviews, depending on what role we hire, we ask various questions, or even let people code a small challenge or review a pull request. We skipped this part in the past for people coming from well-known companies like Google, however we now know better - everyone has to go through this process.

We’ll then conclude with interviews by our CEO and COO so that we can get to know the candidate better and explain more about the company. If the candidate gets through the interview process then we get the hiring team together and decide as a group if we make an offer or not. Every member in the interview chain can raise objections. We then have a group discussion in our #hiring channel with everyone involved in the process so far, and make a decision to continue, or stop the interview process. In most cases, if there’s one person on the team who doesn’t approve, we’ll pass.

We learned over the past couple years that although this process is extensive and lengthy, it is well worth the investment in getting hiring right.

How to attract great people

Finding great engineers is a challenge. Just look at how much effort every tech company in Silicon Valley is putting into attracting talent. It’s obviously much easier if your company is already known. However, we’ve found that giving back to the community you are in really pays off. At PSPDFKit, we made a goal this year to write a blog post every single week. On our blog, we share our approach, knowledge, debugging stories, tips and much more. We’re not talking about cheap content marketing, but articles written by our engineers about things they are currently working on. These articles give people a great deal of insight into how we work, what problems we face and the solutions we’ve found. More importantly, it shows that we care about the health of the community we belong to and wish to do our part to contribute to that community. This takes considerable time and effort, but pays off in so many different ways. Not only does sharing knowledge within the community feel good, it also is a neon advertisement for the culture of our company and the ideals we hold dear. We believe conveying your company’s culture is the number one way to attract great people.

Of course, when we have an opening, we do not want to rely solely on organic traffic. There’s always people that are outside the groups or circles you spend your time in that could be valuable assets to your company. A perfect example of this was when we needed to find Android developers when the company founders had mainly been connected into the iOS development community. Finding great spots to advertise for these roles is still something we’re figuring out. So far sponsoring emails like iOS Dev Weekly or Android Weekly have worked best for us. Twitter is also a phenomenal resource. We’re often experimenting, like for instance for Android Devs we tried We Work Remotely but found some of these other channels have a higher noise to quality ratio.

Keeping great people

Don’t stop at hiring. Building an environment where people can do their best work and where process doesn’t get in the way of productivity is even more important than hiring. The best hires are always the ones you don’t have to make. The place to be cheap is not on things like new hardware or software for your team. Take good care of your people and they’ll take good care of you. At the same time, act as soon as you see an issue. People like working with people that care and work hard. We’ve been quite lucky in building a phenomenal team. However, we have had to let go of people in the past who were not performing and no longer enjoyed their work. Firing someone sucks and should never be taken lightly. At the same time, it is also sometimes necessary for the health of your team, company, and the individual. While we don’t like this fact, firing can sometimes be as important as hiring too.

If this doesn’t scare you away, check out our careers page. Even if you can’t find your role listed, we might still be interested if you made it this far.

Oh - and send your resume as a PDF. We’re a PDF company :)

Then again, 1 in 5 CVs we get are in .doc format. FOR A PDF COMPANY. 😶

— Peter Steinberger (@steipete) August 22, 2016

This document has been updated on Nov 7, 2018, as we constantly improve our processes.