A Costly Failure to Design for Performance and Robustness
We have added shopping cart functionality to our web shop, using a backend service to provide most of the functionality and to hold the state. The design focus was on simplicity - the front-end is stateless, any change to the cart is sent to the backend and the current content of the cart is always fetched anew from it to avoid the complexity of maintaining and syncing state at two places. Even though the backend wasn't design for the actual front-end needs, we work around it. The front-end doesn't need to do much work and it is thus a success in this regard.
Continue reading →
Troubleshooting And Improving HTTPS/TLS Connection Performance
Continue reading →
Moving Too Fast For UX? Genuine Needs, Wrong Solutions
Cross-posted from the TeliaSonera tech blog
Our UX designer and interaction specialist - a wonderful guy - has shocked us today by telling us that we (the developers) are moving too fast. He needs more time to do proper user experience and interface design – talk to real users, collect feedback, design based on data, not just hypotheses and gut feeling. To do this, he needs us to slow down.
We see a common human "mistake" here: where the expression of a genuine need gets mixed in with a suggestion for satisfying it. We are happy to learn about the need and will do our best to satisfy it (after all, we want everybody to be happy, and we too love evidence-based design) but we want to challenge the proposed solution. There is never just one way to satisfy a need – and the first proposed solution is rarely the best one (not mentioning that this particular one goes against the needs of us, the developers).
Continue reading →
Upgrade or not to upgrade dependencies? The eternal dilemma
Cross-posted from TeliaSonera Tech blog.
Handling dependencies is one of important challenges in any software project - and especially in the fast-moving JavaScript world. Our Nettbutikk team just had a heated discussion about handling upgrades of our dependencies that continuous our learning journey lined with failures (or rather "experiments that generated new knowledge" :-)).
Failed attempt one: Let tools do it
Originally we let
npm automatically do minor upgrades but that turned out to be problematic as even minor version changes can introduce bugs and having potentially different (minor) versions on our different machines and in production makes troubleshooting difficult.Continue reading →
Storytelling as a Vehicle of Change: Introducing ClojureScript for the Heart and Mind
I have recently talked about Functional programming (FP) in JavaScript and compared it to ClojureScript, which was designed for FP. To my surprise the team proposed to give ClojureScript a try and we agreed to have a live coding session, implementing a new functionality in our internal part of our webshop using ClojureScript. But how to kindle this little flame of motivation to keep it going, despite hurdles that will certainly come? And here I got a few interesting ideas.
- An experienced speaker once recommended sharing personal experiences (even - or especially - if they make me vulnerable) as it is much easier for people to relate to them than to general statements.
- A Cognicast eposide mentioned storytelling as a great tool for introductory guides. We humans are natural storytellers, we think in stories and relate to them much more easily - so a story should be great also to communicate the value of a change.
- My ex-colleague Therese Ingebrigtsen gave an inspiring talk presenting some points from The Switch - mainly that we need to address the recipient's minds with rational arguments, but also their hearts to involve their emotion (e.g. by drawing a picture of the new bright future), and that it is important to show a clear path forward.
Continue reading →
An answer to CircleCI's "Why we’re no longer using Core.typed"
Continue reading →
Refactoring & Type Errors in Clojure: Experience and Prevention
The core of the problem is that I write chains of transformations based on my sometimes flawed idea of what data I have at each stage. The challenge is that I cannot see what the data is and have to maintain a mental model while writing the code, and I suck at it. Evaluating the code in the REPL as I develop it helps somewhat but only when writing it - not when I decide to refactor it.
Continue reading →
Nginx: Protecting upstream from overload on cache miss
Continue reading →
Shipping a Refactoring & Feature One Tiny Slice at a Time, to Reduce Risk
My colleagues have been working on a crucial change in our webshop - replacing our legacy shopping cart and checkout process with a new one and implementing some new, highly desired functionality that this change enables. We have decided to decrease the risk of the change by doing it first only for product accessories. However the business wanted the new feature included and that required changes to the UI. But the UI has to be consistent across all sections so we would need to implement it also for the main products before going live - which would necessitate implementing also the more complex process used by the main products (and not yet supported by the new backend). And suddenly we had a a load of work that would take weeks to complete and would be released in a big bang deployment.
Such a large-scale and time-consuming change without any feedback from reality whatsoever and then releasing it all at once, having impact on all our sales - I find that really scary (and have fought it before). It is essentially weeks of building risk and then releasing it in a big kaboom. How could we break it down, to release it in small slices, without making the business people unhappy?
Continue reading →
AWS ebextensions: Avoiding "Could not enable service" (or .. disable ..)
.ebextensions/
Continue reading →
Running Gor, the HTTP traffic replayer, as a service on AWS Elastic Beanstalk
Continue reading →
Fixing a mysterious .ebextensions command time out (AWS Elastic Beanstalk)
.ebextensions/ to customize the environment. I have been just trying to get Gor running on our leader production instance to replay some traffic to our staging environment so that we get a much richer feedback from it. However the container_command I used caused the instance to time out and trash the environment, against all reason. The documentation doesn't help and troubleshooting this is hard due to lack of feedback and time-consuming. Luckily I have arrived to a solution.Continue reading →
AWS: Passing private configuration to a Docker container (via S3)
Continue reading →
Book Review & Digest: Release It! Design and Deploy Production-Ready Software
My digest and review of the book.
Review
Of the books I have read, Release It! is the one I would require all "senior" developers to read (together with something like Architecting Enterprise Solutions: Patterns for High-Capability Internet-based Systems). Especially the first part on stability with its patterns and anti-patterns is a must read. Without knowing and applying them, we create systems that react to problems like a dry savannah to a burning match. I found also to next to last chapter, #17 Transparency, very valuable, especially the metrics and design of the OpsDB and observation practices.
One thing I have left out of the digest which is really worth reading are the war stories that introduce each section, they are really interesting, inspiring, and educational.
Extra Links
- Release It! slides: http://gotocon.com/dl/jaoo-sydney-2009/slides/MichaelT.Nygard_FailureComesInFlavoursPart2.pdf
- https://github.com/Netflix/Hystrix/
- Netflix's Dependency Command talks about using circuit breakers and a thread pool limit http://techblog.netflix.com/2012/02/fault-tolerance-in-high-volume.html
- MSDN Guidance for Cloud Applications: Design Patterns - Circuit Breaker and many more highly useful patterns
Stability
Stability x longevity bugs
Selected (anti)patternsStability antipatterns
Integration points
Integration point = call to a DB, WS, ... . Stability risk #1.
Continue reading →
NDC Oslo 2015: Talk notes, recommended talks (security, FP, etc.)
To (perhaps) check later
Wednesday
- Practical CSS tips & tricks for backend developers - really useful tips! video
- No Estimates, Let's Explore the Possibilities video
- Form with Function: Adding Behavior with CSS - recommended by a friend (modal dialogs, tab switching, ...) video
- ? Anti-fragile and feedback. Trying to make up for the failures of "agile." video
- ? JavaScript Forensics - not sure what this is about but it might be interesting
- ? Designing and Programming Accessible Website and App UIs video
Thursday
- ? Declarative REST: State Machines for the Web video
- Continuous Delivery for Architects - Neal Ford video
- ? Desktop applications using JavaScript and Electron video
- ? High Performance in the Critical Rendering Path - how to make pages to load fast video
- This is Water - Neal Ford - an excursion into a strange, fantastical world with things like immutable database server, phoenix machines, and lambdas. video
- Securing Web APIs – Patterns & Anti-Patterns video
- ? Functional Data - event sourcing & FP video
- Authentication and authorization in modern JavaScript web applications – how hard can it be? video
- ? Taking other peoples money: A guide to online payments video
- ? Running Docker and Containers in Development and Production video
- Not Even Close: The State of Computer Security
Friday
- 595 billions income - untouched by human hands video
- Boosting security with HTTP headers video
- The rest of ReST - we'll look at the challenges of building usable real-world ReST APIs: Hypertext Application Language (HAL), HTTP Patch, ... video
- ? How do you scale a logging infrastructure to accept a billion messages a day? - DB -> ELK -> ELK + Kafka video
- ? Learning Client Hypermedia from the Ground Up - how to move specific knowledge of 1) addresses, 2) inputs, and 3) workflow out of the client app and place it into the message => a more robust, adaptable, and resilient client video
- ? Make it Faster - Lessons Learned from Benchmarking NoSQL on the AWS Cloud - best practices for performing database benchmarking on the AWS cloud & how to get more speed and efficiency in your production workloads video
- ? Crafting Evolvable Web API Representations - like structuring for evolution, sizing for optimum caching, the different ways to include metadata, ... video
- ? Mob Programming, A Whole Team Approach video
- ? Removing barriers - JetBrains's good and bad expericences with minimizing management video
Keynote Data and Goliath ☆☆☆☆
Continue reading →