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

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Microsoft Azure Blog
Microsoft Azure Blog
Cloudbric
Cloudbric
I
InfoQ
V
V2EX
博客园_首页
The Register - Security
The Register - Security
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
S
Secure Thoughts
Vercel News
Vercel News
Forbes - Security
Forbes - Security
云风的 BLOG
云风的 BLOG
PCI Perspectives
PCI Perspectives
L
LINUX DO - 最新话题
D
DataBreaches.Net
H
Hacker News: Front Page
Application and Cybersecurity Blog
Application and Cybersecurity Blog
B
Blog RSS Feed
A
About on SuperTechFans
N
News and Events Feed by Topic
Apple Machine Learning Research
Apple Machine Learning Research
Help Net Security
Help Net Security
Attack and Defense Labs
Attack and Defense Labs
N
Netflix TechBlog - Medium
Spread Privacy
Spread Privacy
F
Full Disclosure
Recorded Future
Recorded Future
AWS News Blog
AWS News Blog
博客园 - 【当耐特】
The Cloudflare Blog
T
Threatpost
T
Tor Project blog
Google DeepMind News
Google DeepMind News
C
CXSECURITY Database RSS Feed - CXSecurity.com
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recent Announcements
Recent Announcements
M
MIT News - Artificial intelligence
A
Arctic Wolf
C
Check Point Blog
Stack Overflow Blog
Stack Overflow Blog
T
Threat Research - Cisco Blogs
Security Archives - TechRepublic
Security Archives - TechRepublic
Hacker News - Newest:
Hacker News - Newest: "LLM"
WordPress大学
WordPress大学
Cyberwarzone
Cyberwarzone
小众软件
小众软件
C
Cyber Attacks, Cyber Crime and Cyber Security
P
Proofpoint News Feed
Security Latest
Security Latest
The Last Watchdog
The Last Watchdog

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 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 Hiring a distributed team | 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
How to Use Slack and Not Go Crazy | Peter Steinberger
Peter Steinberger · 2018-06-21 · via Peter Steinberger

Communicating well is one of the key attributes of highly effective teams. We currently have 40 people at PSPDFKit, and because we’re spread across many countries and time zones, it’s a challenge to keep everyone in the loop. For a long time, we were small enough that email worked well. As we grew, we progressed to a single room in Campfire (now retired). But eventually we moved — like so many other companies — to Slack.

This is the first part of a two-part series on communication at PSPDFKit. The second part is about Effective Remote Communication and focuses on everything that’s not inside Slack.

Slacklash

Slack is both amazing and awful. It’s great because it really does feel like an office and makes it easy to see what everyone’s up to — that’s especially important as a remote company. But it’s also bad because it feels like an office, with all the noise, distractions, and interruptions. The honeymoon phase is long over, and many companies have moved away from Slack — AgileBits (1Password) is a famous example with their “Curing Our Slack Addiction” blog post. But The Atlantic and Vice have also transitioned. There is even an entire website dedicated to companies quitting Slack.

We understand some of this reasoning, but ultimately, we decided we want to keep using Slack. However, we knew we needed to finetune our processes to make it work well for us. And while we offer annotating PDF documents in real time on all platforms, it’s not really a Slack competitor ;)

It took a good while to get the most out of Slack. Initially, our public channels were very silent, as most communication took place in DMs. This caused a lot of interruptions to my day-to-day work, because people treated it like a chat and expected a fast response. To counter this, we began to push people toward using public channels, even when they just wanted to talk to one person. The motto was, everything that doesn’t have to be discussed by only two people should happen in the main channel that everyone could see. And often, the questions people had could be answered by more than one person, which resulted in less stress overall.

I had always evaluated Slack from the point of view of “Does it make me more productive?” and “Does it help my team ship a better product?”. I had never considered the more important question “Does Slack make me look and feel like a dick?”

— Dave Teare, AgileBits.

That said, I wanted to share some tips about things we did to make Slack work for us.

Channels

Accept that you cannot read everything that’s written in a channel. This is difficult to do when you’ve built a culture of making quick decisions via immediate Slack discussions. When you rely on Slack as a tool for dropping bombshells, so to speak, this will cause you to check it every few minutes and always be stressed about missing something.

Don’t do that. Treat channels as an async medium, to say “Hi, I am here.” Use them for status updates or for chit-chat. Meanwhile, important decisions should be posted elsewhere less fleeting, like GitHub Issues or Jira. You can even discuss them during a meeting with an agenda. What’s most important is that big discussions need to take place somewhere where you can easily chime in later on without missing out. If you find a bug, don’t just drop it into a channel, but write an issue. You can always ping people with the issue URL. Dropping it in Slack is lazy and creates a sense of urgency, which ultimately hurts everyone.

Be decisive about what to post into a channel. At PSPDFKit we have various special channels, with their own rules. (Yes, we even have a #cats channel.)

#announcements

#announcements is a channel we created for important messages in our company. Everyone can post in #announcements if it’s something that everyone should know. We use it for announcing releases, announcing new hires, updates on workflows that everyone should know about (e.g. the localization process), special days (we do Marketing Fridays and Experimental Fridays, which is 20 percent time for people to work on their own ideas/blog posts), reminders to answer Know Your Company questions when they are really important, new products, retreat announcements, and so on.

Questions are allowed, but only in a thread. We keep the channel very low noise and make it a requirement for everyone to read.

Reviewbot

Reviewbot Logo

Use automations sparingly. We keep most integrations in special channels that are muted. Some integrations do make a lot of sense, like our Reviewbot that checks GitHub every morning and posts all pull requests that are ready to be reviewed and relevant for a specific team into the appropriate team channel. This helps to get a common format, and people simply react with a :taking this over: emoji if they are going to review it later that day. Learn how you can set up your own Reviewbot — we recently open sourced our implementation.

Declutter your sidebar by hiding all channels that don’t contain unread messages and are not starred. You still won’t miss anything, as they pop up if there’s chatter, and you can always use ⌘-T to open the Jump menu. It’s amazing how much better it feels if there aren’t 50 channels you need to scroll through all the time.

Slack Sidebar Preferences

Mute and Leave

Mute service channels or really any channel that pushes content in from another source. Do you really need a ping when someone replied to the company Twitter? Do you really need an unread marker for #cats? (OK, that one might be allowed.) Mute all channels that you only want to read from time to time. And if it’s not relevant for you, just leave. Nobody will take it personally if you work on Android and leave the iOS channel after a topic that was relevant to your work has been discussed.

By default, Slack posts an “X has left the channel” message. These messages are completely unnecessary and just make it harder for people to leave. You can disable them if you’re the admin of your Slack org.

Join & Leave Messages Slack menu

Threads

Threads took a while to figure out — when to just ramble on in a channel and when to respond in a thread? We mostly settled on discussing specific questions in a thread, with a twist. We added two emojis with a special meaning: :taking this over: and :done:. If somebody asks for a quick review on a pull request, I might just have time and react with :taking:. I might comment that I’ll do it right after lunch to set expectations, and ultimately react with :done: when I’m done. This also shows everyone else that they do not need to read the thread contents — it’s handled, it’s not interesting, and if it would be, I’d ping you.

Slack Threads

Feel free to use our emojis: pspdfkit-slack-emoji.zip

Remind Me about This

Slackbot has a built-in reminder. Treat it as a lightweight to-do list that you shouldn’t keep around for long. It’s great if you stumble upon something that requires follow-up work but don’t want to switch context right away.

Remind Me About This UI

However, don’t let these reminders pile up — the Slack UI isn’t great for having a lot of reminders. I try to get through them at least once a week, if not daily.

Direct Messages (DM Hell)

It’s very easy to overuse DMs and see Slack as a real-time chat. In the default configuration, Slack will instantly send the recipient of a message a notification as soon as you send the first word. Please skip the politeness of writing only a “Hi” and then making me stare at a “Person is typing” message for 5 minutes. When there’s a lot going on, it’s extremely unsettling to be notified early. Same goes for “Hey, do you have a moment” spoilers where you get curious, only to ping the person back and then not receive a reply until much later.

PSA: when sending a slack to a busy person, never say “hi” and wait for a response before typing what you need to say.

— Eric Sammer (@esammer) May 24, 2018

Instead of DM, consider writing an email. If it doesn’t require an immediate response, don’t DM. Email is amazing. There are no notifications. (If you really get a notification for every new email, I don’t know how you get anything done.) Plus, it better pushes longform conversations. You can even say “Hi” at the beginning :)

(In the NSSpain talk, I made the argument to just see DM as async, but as my team pointed out, “It’s hard to ignore a phone when it rings 😉.”)

If it’s about a larger project, just create a new channel! DMs can’t easily be “lifted” to include more people, so often you start a conversation, realize you need someone else, and then have to copy or write it all again. Just make ad-hoc channels.

Oh, and if you’re about to write something longer, consider using a Google Doc. Or — again — good old email.

I know it's cool to hate on email but sometimes I wake up to 176 Slack notifications and think pls pls condense this into a coherent email

— Lauren Goode (@LaurenGoode) August 25, 2015

Today and Out for Today

We’ve been using “Today” for a long time as a form of async daily stand up and to let everyone know what the plans are. Recently we started adding an “Out for Today” to close the day. Turns out, this is much more useful and often contains many more details. People are proud when a pull request is ready for review or explain how and why they are stuck. It also “fixed” the bad feeling some people had when they posted the same thing in Today multiple days in a row, because they had a plan, but then more important things took priority over the course of the day. Out for Today gives everyone the opportunity to show the work they’ve accomplished, even if it isn’t what they set out to do.

Again, keep it short, and add links to relevant pull requests, issues, or documentation. Make it easy for people to dig deeper, but allow it to be read quickly.

Video Calling

Whenever threads explode, people at our company generally jump on a call. If somebody forgets that in the heat of the argument, a reminder to “go on a call” helps a lot. It’s easy to forget that calling is just a /call away and you can discuss something easily that way. But the rule is to never call a person out of the blue. Either it’s an agreed-upon time on the calendar, you’re in a discussion already and someone proposes a call, or you simply ask via DM.

Calls are more efficient and convey so much more nuance — even more important when you throw different cultures into the mix. I’ve seen chats escalate, but that almost never happens with calls.

For calls with more than two people, we mostly switch to zoom.us. Slack’s call feature isn’t very reliable, and there’s nothing more annoying than video issues or spotty audio. Zoom is a full-blown conference solution and our preferred meeting tool. You can share your screen, it is highly configurable, and the quality is superior to even Slack. Oh, and the best feature is that it cuts you off after 40 minutes in the free version. There is rarely a reason for any meeting to be longer than 40 minutes, so we consider this one of its best features. :)

Notifications & Focus

We encourage people to be mindful about notifications. No DM is so important that it can’t wait half an hour. In fact, I see this still underused. Slack has a Do Not Disturb feature and Atlassian’s HipChat successor, Stride, made this one of its cornerstones, which they refer to a “Focus Mode.” If something is really urgent, people will call you on your phone. Everything else can wait a bit. Uninterrupted time is important — don’t let Slack take that away from you because someone is bored and asks you how your day is.

Snooze

Talk at NSSpain

This is the first part of a two-part series on communication at PSPDFKit. The second part is about Effective Remote Communication and focuses on everything that’s not inside Slack.

If you’d like to learn more, watch my talk from NSSpain where I talked about Effective Remote Communication and our experience here at this PDF SDK product company.

Effective Remote Communication - Peter Steinberger from NSSpain on Vimeo.