The Complexity Trap: Think Before You Leap - Daniel Westheide
imagine the unthinkable for a minute: What if we did server-side rendering of HTML instead? There wouldn’t be any need to design an evolvable JSON API, which, unlike simply exposing your domain model, is not trivial, and there would definitely be no need for defining any JSON codecs. And that’s just what you get on the server side. On the frontend side, you would have one piece of software less to maintain, you’d get faster load times and you could get rid of duplicated business logic. To sum it up, you could reduce the complexity of your frontend JavaScript code a lot.

In the words of Jorge Manrubia, who wrote a great article about how the complexity introduced by single-page applications can often be entirely avoided: “[..] what about if, instead of trying to find a solution, you put yourself in a situation where those problems don’t exist?” Eliminating problems altogether is always better than writing code to solve them, regardless of how purely functional that could is.

But why is it that we fall for technological solutions so often, especially ones that don’t reduce complexity at all? I think that maybe we love progrmaming too much. I was recently talking to someone about Rust, and that person said, “A language without higher-kinded types is completely useless!”. Yes, certain abstractions are not possible without them, but I have never seen a project fail due to a lack of higher-kinded types. Projects fail because the problem domain is not well understood, or because the architecture is not a good fit for the requirements. They also fail because of how the organisation is structured and because of politics, be it intra- or inter-organizational. Projects fail because of people, and because of people not talking to each other.
programming  complexity  team  bestpractices  spa  client-side  team_management  javascript 
6 days ago
An application [written in Crystal] for local searching of CVE data.
crystal_lang  cve  database  is:repo 
25 days ago
Tweet by Ryan Singer @rjs
Tech shouldn’t be downstream from design, and design shouldn’t be downstream from tech. You need both together from the beginning to have a viable concept. Then they take turns.
design  development  engineering  is:tweet 
25 days ago
Fundamental attribution error - Wikipedia
Fundamental attribution error (FAE) […] is the concept that, in contrast to interpretations of their own behavior, people tend to (unduly) emphasize the agent's internal characteristics (character or intention), rather than external factors, in explaining other people's behavior. This effect has been described as "the tendency to believe that what people do reflects who they are".
The classic example is driving in traffic: a driver that cuts you off is a jerk, but if you cut a driver off it is because you are rushing to the emergency room.
cognitive_bias  psychology  cognition 
11 weeks ago
cgarciae/pypeln: Concurrent data pipelines made easy

Pypeline is a simple yet powerful python library for creating concurrent data pipelines.

- Pypeline was designed to solve simple medium data tasks that require concurrency and parallelism but where using frameworks like Spark or Dask feel exaggerated or unnatural.
- Pypeline exposes an easy to use, familiar, functional API.
- Pypeline enables you to build pipelines using Processes, Threads and asyncio.Tasks via the exact same API.
- Pypeline allows you to have control over the memory and cpu resources used at each stage of your pipeline.
via:flav  is:repo  data  data_engineering  python  data_pipeline  big_data  async 
12 weeks ago
dry-rb is a collection of next-generation Ruby libraries
dry-rb helps you write clear, flexible, and more maintainable Ruby code. Each dry-rb gem fulfils a common task, and together they make a powerful platform for any kind of Ruby application.
ruby  functionalprogramming  monad 
september 2018
Google Chrome UI – Figma
A Figma recreation of the Google Chrome browser chrome; helpful for placing mockups more in situ.
design  figma  template  tool 
september 2018
Figma's Engineering Values
Direct image:

1. Communicate early and often
- Don't wait until code review to share your direction
- Solving something together is better than solving it independently
- Assume best intentions when receiving feedback

2. Prioritize impact
- We can only solve so many problems at once, so pick your battles
- Things are built with a shelf-life in mind and that's ok

3. Craftsmanship
- When solving a problem, do so sustainably
- Always strive to improve our process and learn from missteps

4. Lift your team
- Help others grow
- Strive to make people feel better, not worse
- Strive to create an inclusive culture supporting diverse opinions
- Be solution oriented
engineering  engineering_management  team  team_management  management  culture  values  is:tweet 
september 2018
Ryan Singer on Twitter re: estimation versus budgeting
Estimation requires knowing what you’re doing. That means you can estimate downhill but not uphill. You can, however, *budget* anywhere. That is, set a maximum amount of time you’re willing to spend. Budgeting != estimating.
quote  estimation  projectmanagement  software_engineering  development  is:tweet  team 
september 2018
Repeat yourself, do more than one thing, and rewrite everything
The problem with always using an abstraction is that you’re preemptively guessing which parts of the codebase need to change together. “Don’t Repeat Yourself” will lead to a rigid, tightly coupled mess of code. Repeating yourself is the best way to discover which abstractions, if any, you actually need.

As Sandi Metz put it, “duplication is far cheaper than the wrong abstraction”.
programming  abstraction  bestpractices  software_engineering  software_architecture  development  inspiration  advice  from instapaper
august 2018
Action Salzman 📎 @chrissalzman
august 2018
The Cost Of JavaScript In 2018 – Addy Osmani – Medium
*If client-side JavaScript isn’t benefiting the user-experience, ask yourself if it’s really necessary.* Maybe server-side-rendered HTML would actually be faster. Consider limiting the use of client-side frameworks to pages that absolutely require them. Server-rendering and client-rendering are a disaster if done poorly.
javascript  performace  web  webdevelopment  bestpractices 
august 2018
Create beautiful screenshots with device mockups
design  tool  screenshot  marketing 
august 2018
Elided Branches: Delegation: When being helpful is actually hurting
So the next time you find yourself tempted to volunteer to take over responsibility for something from someone who reports to you, pause. Instead of taking it over, ask them what they think the next steps should be. Give your feedback, and let them bring the follow-ups to you in the next appropriate touch base. You owe it to them to stop taking over their work in the name of helpfulness.
delegation  management  time_management  productivity  team 
august 2018
Francisco Tolmasky on generic UX flows
With mobile, UX started investing heavily into highly specialized workflows, admittedly making them much easier than in the old desktop world, but dropped the ball on the “generic” interactions of computing. So if the task wasn’t predicted, it became nearly impossible to do.

is:tweet  design  ux  mobile  truth 
august 2018
gaia-pipeline/gaia: Build powerful pipelines in any programming language.
gaia is an open source automation platform which makes it easy and fun to build powerful pipelines in any programming language. Based on HashiCorp's go-plugin and gRPC, gaia is efficient, fast, lightweight and developer friendly. Gaia is currently alpha! Do not use it for mission critical jobs yet!
go  golang  build  ci  devops  data  data_engineering  engineering  development  is:repo 
july 2018
Tweet on Slack being bad for technical decisions
There's nothing quite as nefarious as a technical decision made via Slack: stakeholders miss it if they're not around, points are poorly stated as they're strung across 50 half-baked thoughts, context exists across pages of jumbled noise, *and* it's time consuming.

I miss email.
team  management  communication  email  chat  slack  quote  is:tweet 
july 2018
Donut Manifesto | The importance of donuts | Lara Hogan

Years ago, I found that whenever something awesome happened in my career – maybe I got published, or promoted, or launched a project – I wouldn’t take the time to celebrate the achievement. I’m an achiever by nature, the kind who feels like every day starts at zero. Not deliberately marking these moments left me feeling like I wasn’t actually accomplishing anything. “Oh cool, that A List Apart article went up,” I would think, then move on with my day.

Once I realized that this was happening, I decided to be deliberate about marking achievements by eating one donut. Well, sometimes more than one, if it’s a really big deal. The act of donut-eating has actually helped me feel like I’m accomplishing my career goals. As I started to share this idea with more people, I found that it resonated with others, especially young career-driven women who are routinely achieving goals and furthering their career but don't take the time to note their own success.

I decided to start celebrating in a public way so that more people may be inspired to find their own ways of marking their career achievements.
productivity  motivation  fun  humor  team  management 
june 2018
Josh Pigford on running a software business – Twitter Thread
This whole thread on what Josh learned running a software business is solid 👌

Two good callouts:
20/ The Next Feature Fallacy is real and will cloud your thinking dramatically. Like it or not, that next feature that you’re so excited about will categorically, as an individual unit, do nothing for your business. But man if we don’t like to think it will.
“Busy” does not equal “productive”. You shouldn’t be doing 1,000 different things. Business isn’t that complicated. Very few things are urgent. Very few things actually even need to get done. As a founder, pick just 1 or 2 “must do” things each day
is:tweet  business  inspiration 
june 2018
Mikov's Blog: You Don't Like Google's Go Because You Are Small
Trust me, you don’t need the ternary operator “?:“. It is too complex for you, with your small mind.
You might end up needing something like that in a very obscure corner case which is referred by computer scientists as “calling methods of objects”.

Ultimately a good articulation of what I think of Go:
I don’t “hate” Go, I think there is lot there to like, and that is precisely why its big failings bother me even more.

I view Go as a huge wasted opportunity.
go  golang  programming  google  via:dadrian 
april 2018
Static CMS for Hugo & Jekyll |
Sync your Jekyll or Hugo site. Your editors will love it and won’t realize they’re making commits.

Seemingly a web UI CMS to update s static site with commits still as the backend changelog.
staticsite  jekyll  hugo  cms  wordpress  website 
april 2018
Tabler - Admin panel made simple
Premium and Open Source dashboard template with responsive and high quality UI. For Free!

This can act as a nice reference implementation of skinning [Bootstrap][1]

css  templates  design  web  webdesign  via:andyfowler  twitter_bootstrap  sass 
april 2018
Jason Fried @jasonfried

Twitter is beginning to feel like secondhand smoke. The amount of anger and anxiety you walk into just browsing your timeline is like walking into a cloud of cigarette smoke from the smoker in front of you.
twitter  deep_work 
april 2018
Augmenting Artworks: AR at Artsy - Artsy Engineering
Remember, React Native is native, so you can write chunks of your app without ever touching RN's toolchain:
React Native is really great for nearly every screen we deal with typically. We tend to basically build pretty screens of JSON. This experience is far from that. It requires constantly changing states between two very separate but linked worlds. One of the biggest advantages to doing it in React Native would have been using it for cross-platform work, but that’s speculative as only ARKit supports vertical plane detection today. We’d have had to either use a dependency, or build our own simpler bridge from ARKit to JS and maintain that. It just felt like a lot of work for a one-off section of the app.
react  ReactNative  reactjs  iOS  uikit  arkit  native  development 
april 2018
Ryan Singer on Twitter: ""Design decisions can have enormous, cascading effects" — Yes. That's why we "integrate uphill" at Basecamp. We learn together by building rough concepts with clickable UI and real code on staging servers with real data. There's
"Design decisions can have enormous, cascading effects" — Yes. That's why we "integrate uphill" at Basecamp. We learn together by building rough concepts with clickable UI and real code on staging servers with real data. There's no risky hand-off step.
is:tweet  design  development  prototyping  iteration  risk 
march 2018
N+1 is a Rails feature -
N+1 is a feature, which is usually seen as a bug, right?

If you have N+1 query it means you're executing one SQL query per element so if you have 50 emails in an inbox, that'd be 50 SQL calls, right? That sounds like a bug. Well in a Russian doll caching setup, it's not a bug, it's a feature. The beauty of those individual calls are that they're individually cached, on their own timeline, and that they're super simple.

Because the whole way you get around doing N+1 queries is you do joins; you do more complicated queries that take longer to compute, and tax the database harder. If you can simplify those queries so that they're super simple, but there's just more of them, well, you win if and only if you have a caching strategy to support that.
activerecord  rails  sql  database 
march 2018
Distributed “versus” HQ Org Structures – Learning By Shipping
Industry experiencing helping support [Conway's Law](

Early on when it comes to balancing work and assigning who does what, the skills of people almost always defines who does what. […] the next derivative of this is that the overall product architecture is thus defined by the location of people. This is literally shipping the org chart, but without really deliberately deciding that.

Very tough to over-state how massive a future constraint this will be. When we say “don’t ship the org chart” baking in these architectural boundaries literally cements the path the team will take to evolve the product. Very risky while establishing P-M-Fit.

As an example, if you allocate work to people based on front-end/back-end simply because of skills and those people are remote, as you scale these teams (in terms of number of people) you are “cementing” this definition of an API between subsystems (you can take this to any level of granularity — not just UI/back end, but where data resides, how subsystems communicate, etc.). These APIs come to define not just the elegance of how a product works BUT importantly the seams to overcome and constraints in what can be done over time.

Many say things like “separate UX from back end” for ex., because those are two types of Eng. BUT where to put code is often a competitive/feature advantage not something done simply for consistency of strategy/architectural purity. Innovation breaks old notions of abstraction.


APIs seem like such an elegant and desirable approach for how remote teams work. In practice, APIs are great for external users of products to extend them because they are “contracts”. But why enforce and live with a contract internally? A role of a company can be to operate without such hard boundaries within the company. There’s a massive execution challenge that comes from building a single product composed of APIs across components. It slows innovation and builds “dependencies” across what would otherwise be “teammates”. It becomes very tough to scale and manage over time.
conways_law  team  management  product_management  engineering  engineering_management  remote-work  microservices  api 
march 2018
Google Takeout – Download your data
Create an archive with your data from Google products.
backup  google  gmail  privacy  tools 
march 2018
Create and share beautiful images of your source code.
Start typing or drop a file into the text area to get started.

Great for generating nice looking code examples in Keynote slides. The only problem with an image is the lack of text and hence copy-and-paste capabilities of your slides.
tool  code  presentation 
march 2018
Three flavours of iteration

- Scientific iteration is about shipping to prioritise learning. This is where the Eric Ries Lean Startup fans hang out.

- Greedy iteration is about shipping incrementally to get the value of each increment sooner. This is where the Dan Reinertsen Cost of delay kids are.

- Defensive iteration is building incrementally parts of a whole, not for the value of any increment specifically, but so you’ve defended against having an incoherent whole when an arbitrary product cycle closes. This is the domain of “potentially shippable increment” scrum types.

In short: iteration can mean a few different things, each thing has pros and cons but misalignment is all cons, so double check you’re all aligned and be kind to each other.
via:andyfowler  team  iteration  development  product_management  agile 
february 2018
Remote Starter Kit by Hanno
Get off to a flying start as a remote team with these mighty-fine tools that are tried and tested by the Hanno team. We’ll help you to power your team’s virtual collaboration and happiness.

A good rundown of tools and processes that seemingly applies to all teams that value asynchronous communication and non-interruption, not just remote teams.
collaboration  tools  reference  remote-work  team 
february 2018
brunnolou/react-morph: Morphing Ui transitions made simple
I was blown away by [the storybook demo][1].

I’m interested in trying it to see where it could breakdown, but at first glance it looks like a sweet API.

animation  react  is:repo  javascript  design 
february 2018
The Push Train
This is a presentation I've given about managing the human side of continuous delivery. In my experience, the challenges of deploying dozens of times per day are mostly interpersonal rather than technical.

Similarly, check out


Some key takeaways:
The thing you should know about writing web-driving integration tests is that doing this well is at least as hard as writing a multithreaded program. And that’s a domain where human competence isn’t estimated to be high. The other problem with testing across process boundaries is that failure is a thing that can’t be entirely avoided.

So what you tend to wind up with there is a lot of tests that work most of the time. Even if you’re really good and prevent most race conditions, you’re still going to have some defects. Given enough tests, that means that one is always failed.
We realized that the whole point of tests is to gain confidence before changing things. And to the extent that there are false negatives in the tests, or the tests gum up the works, they’re doing the opposite of that.

Tests are one way to gain some confidence that a change is safe. But that’s all they are. Just one way.

Ramping up code very gradually in production is another way
via:andyfowler  development  deployment  devops  ci  team  culture  testing  is:presentation 
february 2018
<bockquote>Build Apps, not Infrastructure
Heroku User Experience in your cloud account within minutes.
deployment  devops  cloud  google_cloud  aws  heroku  docker  cli 
february 2018
How to Disable Caps Lock on Happy Hacking Keyboard – Takashi Yoshida's Blog
toggle Caps Lock on and off on Happy Hacking Keyboard: Press Shift + Fn + Tab.
keyboard  hhkb  happy_hacking_keyboard 
february 2018
Timezones and Python | Julien Danjou
A good, simple, articulate read on dealing with timezones it datetime objects.
python  date  datetime  time  timezones 
february 2018
Weather in your iOS and macOS Calendars
A cool little trick! I like having a weather forecast in my calendar.

Subscribing to Ann Arbor weather:
calendar  tips  ical  weather 
february 2018
Choose Boring Technology
Slide version of the classic Dan McKinley essay
software_engineering  technology  team  via:andyfowler 
january 2018
Some thoughts on security after ten years of qmail 1.0
Daniel Bernstein is the author of qmail. Bernstein created qmail because he was fed us with all of the security vulnerabilities in sendmail. Ten years after the launch of qmail 1.0, and at a time when more than a million of the Internet’s SMTP servers ran either qmail or netqmail, only four known bugs had been found in the qmail 1.0 releases, and no security issues.
bug  security  software_engineering  bestpractices  engineering 
january 2018
« earlier      
aaron_swartz actormodel aeropress afnetworking alternativeto amazon analytics android andyfowler animation annarbor api apple arc architecture autolayout backup bdd bestpractices blocks book bunny business c c++ chrissalzman chrome ci clang cli clojure clothing cocoa cocoapods codeoptional coffee collaboration color complexity concurrency cool coreanimation coredata coregraphics couchdb css cucumber culture data database debugger design designpattern development devops documentation dokku dropbox dsl dynamiclanguage dzombak editor education elixir email encryption engineering erlang facebook falsedichotomy figma focus font fonts formobject framework from:dribbble frp functional functionalprogramming futures gcd gif git github github_repo golang google goos graphql gtd guide guitar hardware hateoas health heroku home http humor hypermedia iconography icons ifttt innovation inspiration instagram interface ios ios7 ios8 ipad iphone is:repo is:tweet java javascript javascriptcore jenkins jmsto json jsonapi jvm kvo layout library lisp llvm mac machine_learning management markdown material_design math memorymanagement mobile mutability mvc mvvm native native-vs-web networking nsa nsfetchedresultscontroller nsmanagedobjectcontext objective-c office omnifocus onethingwell oop osx performance photography php podcast presentation privacy product_management productivity programming projectmanagement promises prototyping python quote rails rails4 react reactive reactivecocoa reactiveprogramming reactjs reactnative recipe redux reference resources rest reveal-controller review rss ruby rubymotion rust rust_lang rxjava rxjs scala search security shell simplicity sketch smalltalk software software_engineering srp ssl startups static_analysis statictyping storyboard struct swift swift_lang swiftlang sync tdd team technicaldebt testing tips tool tools tshirt tutorial twitter types typography ui uicollectionview uiimage uikit uitableview uiview uiviewcontroller unix ux valueobject via:androidweekly via:andyfowler via:cdzombak via:github via:henrik via:iosdevweekly via:mikelinington video vim web webapps wishlist writing xcode

Copy this bookmark: