About Offensive SEO

How many millions of football coaches have said, “the Best offense is a good defense.” While I wouldn’t advise anyone to go on a negative smear campaign against their competitors:

1. In some states it can fall under liable which in some cases can even be a felony

2. If the war of negative reviews hasn’t started yet, don’t start it

The best thing is to take care of your customer and confront them head on and see what you can do to fix the problem and maybe mention having them remove or update that negative review. Some people are just mean, no matter what you do they will never be satisfied and that’s one of the challenges of business.

But say, one of your competitors does decide to go to war with you by doing an army of faults reviews or any other way to disparage your business online it is a very difficult case to prove in court, but if you want to go “Fight fire with fire.” We can make the guy wish you’d never written a negative thing about you ever.


Go first

You can’t expect people to be open with you, if you’re not open with them first.

You’re at a swimming pool. The water looks nice. It’s not quite a warm enough day… But it’s almost summer so why not jump in?

You want others to join you in the pool (it’s more fun that way!). So you wander around and ask each of the pool loungers: “Hey, care to jump in the pool with me? The water looks warm…”

Think anyone jumps in? Especially, if you’re not in the pool yourself?

Not likely.

I view the process of getting honest feedback from employees the same way. If you want everyone in your company to be open and honest with you — if you want everyone to jump into that swimming pool with you — you’ve got to take the first dive.

I call this “going first” as a leader. You must take the first step to show it’s safe to speak up (particularly given that fear plays such a large role in why employees don’t give feedback). You must be forthcoming and candid with your employees first, as a leader. You can’t expect someone else to do something if you don’t do it yourself first.

Here are a few ways to “go first” as a leader and jump into that swimming pool to create a safe environment for employees to speak up…

Share what you’re struggling with.

One of the best ways to “go first” is by sharing something that you’re struggling with. If this makes you feel a little vulnerable as a leader… that’s a good thing! You’re modeling the honesty that you’re similarly looking for from an employee. As a result, you diffuse some of the anxiety and fear an employee may have about offering a critical opinion. An employee may now think, “Well if she, my manager, is struggling with this, then I guess it’s okay to share this…”

Try saying this: I’m struggling with…” or “Can you help me understand something that I’m having trouble grasping?” or “Hey, I don’t have all the answers…

Play devil’s advocate with your own opinion.

Another way to “go first” as a leader is to challenge your own opinion in front of your team. The next time you’re explaining a new idea, pose an opposing viewpoint to it yourself, and then ask for feedback. By playing devil’s advocate with your own opinion, you invite others to give dissenting viewpoints. When you’re a contrarian to your own ideas, you give your team permission to be contrarian too.

Try saying this: I could also take a devil’s advocate point-of-view and say ___. What do you think?” or “Another way to look at it is ____. Would you agree or disagree?

Commend vulnerability when you see it.

“Going first” as a leader also means to positively reinforce the behavior you want to see. If you want meaningful, honest feedback to be given to you more often, be sure to publicly recognize it when you do see it. A CEO who is a Know Your Company customer here in Chicago makes a point to do this every month during her company all-hands meeting. She’ll publicly commend an employee for her vulnerability, and say, “Thank you for sharing an opinion that might not be popular. It’s important.” When you do this, you set the expectation that you want to hear frank, non-sugar-coated information in the future.

Try saying this: That’s a great thought — your honesty is appreciated and important to the team…” or “I’m so glad you’re disagreeing with me. It’s helping me understand a new perspective…” or “Thank you for bringing that up. I’m sure that was not an easy thing to share, so I value you doing that.

As a leader, it’s your job is to make your employees feel as safe as possible to speak up. You can’t sit back and ask other people to be candid and forthcoming without doing it yourself first.

Want others to jump into the pool of honesty and openness? Go first.

I wrote this piece as the latest chapter in our Knowledge Center. Each week, we release a new chapter on how to create an open, honest company culture. To get each chapter sent straight to your inbox, sign up below…


P.S.: Please feel free to share + give this piece ❤️ so others can find it too. Thanks 😊 (And you can always say hi at @cjlew23.)

Go first was originally published in Signal v. Noise on Medium, where people are continuing the conversation by highlighting and responding to this story.

[

Using Kotlin to make Android APIs fun again

Kotlin announcement at Google I/O 2017

If you haven’t heard, Kotlin is now a first class citizen on Android and we couldn’t be more thrilled at Basecamp. We’ve been using Kotlin since it hit 1.0 last year and we recently got to 100% Kotlin in the Basecamp 3 Android app.

One of my favorite features in Kotlin is extension functions. They let you extend functionality in classes without inheriting from them. We make great use of extension functions at Basecamp to simplify and add clarity to Android APIs that are verbose (or that we just don’t like). Below are a few example of ways that we leverage extension functions to make Android development easier on a day-to-day basis.

Set a View height

Setting the height on a View programmatically in Android is annoying (and I’m being nice). With a Kotlin extension, you can pretend that Android makes it easy for you:

fun View.setHeight(height: Int) {
val params = layoutParams
params.height = height
layoutParams = params

Now when you want to set a height for your view instance, you just need to call view.setHeight(newHeight). Super easy!

Set View visibility

To make a view visible or gone by writing view.visibility = View.VISIBLE or view.visibility = View.GONE over and over is tedious. Never again! We have extension functions to make that nicer:

fun View.visible() {
visibility = View.VISIBLE
fun View.gone() {
visibility = View.GONE

Now we can just write view.visible() and view.gone() and… that’s it.

Read an Asset file into a String

Quick, how do you read one of your packaged asset file resources into a String? The answer is verbose input stream code. No thanks! We wrote an extension function:

fun AssetManager.fileAsString(subdirectory: String, filename: String): String {
return open("$subdirectory/$filename").use {

To retrieve the String, now we can write :

val json = context.assets.fileAsString("json", "config.json")

Retrieving a Color resource across API levels

Up until API 23, the way to retrieve a color resource was context.getColor(R.color.my_color). But starting at API 23, the signature added a new parameter for a theme resource. If you don’t need to specify a theme resource, you can make this easier on yourself so the same code can work on all API levels:

fun Context.color(@ColorRes id: Int) = when {
isAtLeastMarshmallow() -> resources.getColor(id, null)
else -> resources.getColor(id)

Now call context.color(R.color.my_color) anywhere you like and you have a clean wrapper. You could even make the theme resource an optional parameter with a default, since Kotlin supports this.

Inflate a Layout

Wish it was easier to inflate a new layout?

fun Context.inflate(res: Int, parent: ViewGroup? = null) : View {
return LayoutInflater.from(this).inflate(res, parent, false)

We can now write context.inflate(R.layout.my_layout) and avoid the mandatory parameters that Java required. (If you needed to attach your new view to the parent, you’d need account for that above.)

Use the Anko Library from JetBrains

JetBrains has already done a lot of work to make Android development easier. They’ve created many extension functions in their Anko library that you can use without writing any custom extension functions yourself.

For example, obtaining a System Service involves verbose syntax and error-prone type casting. With Anko it’s a lot easier:

val manager = context.notificationManager

That’s it. Under the hood, their extension property looks like this:

val Context.notificationManager: NotificationManager
get() = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

(Note that this is an extension property not an extension function — another great tool in Kotlin that you should explore.)

Android has many rich and powerful APIs, but they often cater to its legacy and limitations in Java. With Kotlin, you now have the power to shape the APIs you use most often. Imagine how nice it would be to be free of the API annoyances you’ve been living with for years!

I’d love to hear — what are some of your favorite extension functions that you’ve written for Android? Please share!

We’re hard at work making the Basecamp 3 Android app better every day (in Kotlin, of course). Please check it out!

Using Kotlin to make Android APIs fun again was originally published in Signal v. Noise on Medium, where people are continuing the conversation by highlighting and responding to this story.

[

What’s that mystery in your inbox costing you?

The inbox is the center of everything. Whether it’s email, assignments, messaging, chatting, IM, whatever, if someone wants you to see something, it shows up in an inbox of some kind.

The design of the inbox has more impact on our daily decision making than any other part of any piece of software we use. It’s fucking important.

If you use a group chat tool like Slack, HipChat, Microsoft Teams, or something similar, your inbox — and, therefore, your day — is filled with mysteries, secrets, and “Whats?”. You’re probably so numb to it that you don’t realize how much of your time and attention is being wasted.

“To see what is in front of one’s nose needs a constant struggle.” -George Orwell

You’re stumbling around in the dark all day long because of a simple design pattern. The pattern is core to group chat, no matter the tool. It’s a fundamental flaw of the medium hidden in plain sight.

The inbox in the sidebar of Slack, Hipchat, and Microsoft Teams is stacked with rows like this:

There’s a category, room, or channel name on the left and an unread indicator on the right. But wait, what’s that 28 mean?

28 what? 28 things I have to see? 28 things I could see? How many of those things matter to me? Are any of them relevant? The category attached to the number is so broad, that anything, everything, or nothing important could be hiding behind the number.

If you use a group chat tool, there’s only one way to find out if the unread number is relevant: You have to click through and read everything just to figure out if there was anything worth reading. That’s the very definition of wasting time. Doing work to see if there’s work to do.

This design lacks context. General categories are too roomy to provide specific context, and specific context is what we use to determine if something’s worth digging into or not. Without it, we’re unable to use our time wisely. An absence of detail wastes our attention.

4 of those lines could have been jokes. 9 of them mildly interesting anecdotes. 3 of them relevant to you. 8 of them random observations. And 4 questions and followups that didn’t pertain to you. Or some other combination. Maybe all 28 were completely unrelated to anything you’re working on, even if 34 things earlier were. Who’s to know when all you have to go on is a number?

Surely not every single thing said in #design or #general or #marketing or #engineering or #projectname is relevant to you. And if it is — if you have to follow along with hundreds or thousands of individual lines a day — communication problems across your company run deep.

And that’s just one room/channel. Add in a few more, and you start to run into big numbers of unknowns, lot of whats?

I got 99 problems, and maybe these are some of them? Or not?

Making matters worse, if you’re like most people, your sidebar lists a whole lot more than just 3 rooms/channels. Many people keep a dozen or more up there. Multiply that by dozens or hundreds of people at a company, and you can only imagine how much time, money, and attention is being wasted every day. You’re paying for software that makes people do extra work just to see if there’s any real work worth doing.

We took a different approach with Basecamp 3

When we set out to design Basecamp 3, we put people’s time and attention at the center. Everything that matters must be surrounded with context and detail that gives you the information you need to make good decisions about how you spend individual moments throughout your day.

In Basecamp 3, there’s no sidebar that’s constantly pulling your attention away and to the left. Instead, there’s a menu at the top called Hey! When you choose to pull that menu down, revealing what’s inside, you’ll see rows that look like this:

At 3:08pm, Kris commented on the Client HQ: Design Update topic in the “BC3: Clientside 2.0 (Cloudripper)” project.

This design is full of context. Each row gives you the who, the kind of thing (an @mention, a to-do you’ve been assigned, a to-do that’s been completed, a comment, a new document, a new message, etc), the specific subject/topic that’s relevant to the discussion, which project or team it relates to, and when it happened.

Here’s my actual Hey! menu right now:

The context and detail above helps me know, act, or dismiss. A lack of context forces me to guess.

At a quick glance, I can see who’s said/done the most recent thing in each thread. I can judge relevance and timeliness. For example, I’m not working on the Business Cards stuff day-to-day, so I can ignore that one at the moment, but there’s a Highrise Board Meeting coming up shortly, and because Lynette, the Highrise COO posted something, then it’s important that I check that out. I can also see that Scott completed a to-do that I assigned to him. And that Zach @mentioned me in a conversation on a to-do about the Clientside feature we’re working on.

The Basecamp 3 Hey! menu is full of context. It lets me scan without committing. I’m informed simply by looking at it. I can jump in selectively and make my own decisions how to spend my attention because all the information is in front of me. I can pull it down, glance, and step right back out. When things are out of the way in a menu I can decide to get to them later.

Contrast that with the group chat style sidebar where I only have a scant, general idea what I’m jumping into. At a glance I can’t really tell if there’s anything behind the curtain that’s worth my time right now. So I have to go look at everything. What a distraction. The fact that you can’t know what’s behind the number actually entices you to waste time finding out. It’s a dark pattern.

This adds up

We tend to judge how things affect us personally. But when you’re using a group tool with others, the effects are wide ranging. If you’re wasting 15 minutes every hour peering through irrelevant chat logs and getting inadvertently pulled into unnecessary conversations, imagine all the other people at your company doing the same thing. Every hour. Every day. 1500 minutes wasted every hour? More? Quantify the waste. Bad design adds up.

So stop. Take note. Pay attention to how often you have to jump in to determine if jumping in was worth it. How often you have to read everything to see if there was anything worth reading. How many times you’re pulled away by secrets and mysteries in your inbox. If you start counting, you’ll be surprised how high the number goes.

Stop your day from feeling like this

Your time is too valuable to put up with this.

Tired of wasting your time and energy on the chat treadmill? Graduate from group chat to Basecamp 3. It’s the calmer, saner way to work. Stop spinning your wheels or running in place — Basecamp 3 helps you get traction with new projects. Since switching to Basecamp 3, 89% of our customers have a better handle on their business, 84% report more self-sufficient teams, and more than half save over 10 hours of busywork a month. Give it a try, for free.

What’s that mystery in your inbox costing you? was originally published in Signal v. Noise on Medium, where people are continuing the conversation by highlighting and responding to this story.

[