Moved here
Moved here
Category | Signals | State |
---|---|---|
Impact | - Outcomes were achieved - Key stakeholders are happy - Revenue targets were met - NPS going up - North star metric improving |
OK |
Morale | - Process continues to improve - High team chemistry (people escalations) - Rotations for oncall, ceremonies, etc - Engagement during meetings |
OK |
Accountability | - Project delivery - Low bug count - Low high SEV incidents - Company engagement (e.g. release notes, demo days, etc) |
WARN (recent projects were delayed) |
Productivity | - DORA metrics (e.g. TTM, deployment frequency, etc) - High developer happiness |
ALERT (local builds getting slow) |
Technical ownership | - p95 page load time - p95 API latency - Infrastructure cost is not ballooning |
OK |
Set up your environment carefully: It's important to have one canonical source of truth per environment, per platform. (i.e. iOS Development, iOS Testflight, iOS Production, ditto Android.) Every time you build, your config should propagate values from one input source (per platform) to either Java/JavaScript or Objective-C/JavaScript. Here's what we did for Android and here's what we did for iOS. I don't doubt that you can do better. Please do better. But you can't say that we didn't have one canonical source of truth that worked very simply and effectively throughout the development process.
Don't wait until the end to develop Android and iOS concurrently: Even if you're not actively focusing on both platforms, don't assume that "RN is cross platform… we can develop iOS and flip the Android switch when we'r
{ | |
"name": "AppName", | |
"version": "0.0.1", | |
"private": true, | |
"scripts": { | |
"start": "node node_modules/react-native/local-cli/cli.js start" | |
}, | |
"dependencies": { | |
"bugsnag-react-native": "^1.1.2", | |
"es6-promise": "^4.0.5", |
import scala.concurrent.Future | |
import scala.concurrent.ExecutionContext.Implicits.global | |
(for { | |
a <- Future.successful("a") | |
b <- Future.successful("b") if 1 > 0 | |
c <- Future.successful("c") if 0 > 1 | |
} yield (a, b, c)).foreach(println) |
@SqlUpdate("INSERT INTO posts(title, tags) VALUES (:title, :tags)") | |
int createPost(@BindPost Post post); |
@BindingAnnotation(BindPost.PostBinderFactory.class) | |
@Retention(RetentionPolicy.RUNTIME) | |
@Target({ElementType.PARAMETER}) | |
public @interface BindPost { | |
class PostBinderFactory implements BinderFactory { | |
public Binder build(Annotation annotation) { | |
return new Binder<BindPost, Post>() { | |
public void bind(SQLStatement q, BindPost bind, Post post) { | |
Array array = q.getContext().getConnection().createArrayOf("varchar", post.getTags()); | |
q.bind("title", post.getTitle()); |
// Mapping a string array to `varchar[]` in Postgres | |
String[] tags = ... | |
Array array = q.getContext().getConnection().createArrayOf("varchar", tags); |