Recently I completed a pretty simple weekend hack project; A country quiz using React, Typescript, Apollo & emotion. Try the quiz or view the code.
In 2015 I was writing React in Coffescript, using Redux as the data layer. I thought the developer experience was pretty awesome and it was, but we’ve come a long way:
Apollo abstracting data fetching, caching & relationships is a so much simpler and more powerful than architecting a relational database in Redux.
Thanks to Typescript I barely switched to my browser to check the code and when I did it almost always worked.
React has come along way. Yet it feels closer to it's functional programming roots and the additions just "make sense".
Front-end development has come along way. Anyway, check out the code or take a quiz yourself.
Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
âś“ Live Streamingâś“ Interactive Chatâś“ Private Showsâś“ HD Qualityâś“ Free Actions
Free to watch • No registration required • HD streaming
One of the interesting things about product management is how varied it can be. One moment you’re project managing, next you’re collaborating with marketers, designers, developers or data analysts, then you’re trying to convince and get broad alignment, or perhaps you’re doing market or user research. It’s nothing if not varied which necesitates some pretty varied reading material.
Here’s a few of my favorites from the last 6 months…
Getting to yes is a great book on principled negotiation, an approach that seeks to align competing objectives and move past positional bargaining.
The 22 immutable laws of marketing whilst a little dated is still very relevant. How many of the tech products we know and love have followed these rules? I’d say quite a few.
How to create tech prodcts customers love is a pretty broad breakdown of the field of product management. I particuarly love it’s insights into how to structure cross collaborative teams for success. Recommended reading for any product manager.
Sprint is a framework for solving big product problems in a testable, collaborative way in just 5 days. We’ve used a similar approach for big design projects at Fullscript.
Humble Inquiry is all about building positive relationships by asking questions. Something that’s essential to the kind of soft leadership that can help product managers be sucessfull.
Crossing the Chasm describes how many high growth startups can die if they are unable to branch out from a small niche to a late adopting majority. More importantly it describes how to avoid it.
I've always been interested in the big picture that affects the success of my employer. To that end, I’ve recently taken on more product management responsibilities at FullScript. One key thing I’ve learnt is that a lot of product management is about translation. To illustrate I'll give two examples; Digging beyond and speaking the right language.
Digging BeyondÂ
A colleague says to you "we need to develop X". Do you go ahead and develop it? Or do you do your research and translate their solution to the underlying problem so that you can propose an more impactfull solution?
A customer says "I can't use this". Why? Is it a design language issue? Missing functionality? Did you develop the wrong thing? Is this the wrong user type.
To dig beyond I find the most important question is why. Why? Why? Why? Why? And finally... Why?
Speaking The Right Language
Product sits at the intersection between design, development, support, customer success, marketing, sales, leadership, data and more. In one project, product might translate:
An opportunity into potential business impact.
An opportunity into a feature.
The feature into development tasks and timelines.
The feature into support documentation.
A release into actual measurable business impact.
A release into marketing and sales messaging.
To do all this, product needs to speak many different languages. Speaking the right language is about knowing who your audience is and what they care about. In this regard speaking at conferences, delivering workshops and writing articles has helped me a great deal. As has been highly curious about how each function of a business contributes to it's success.
The Big Picture
In every company I've worked for I've always strived to understand the big picture. Now I can help steer the big picture at a company that's growing at pace, has an awesome development culture and is doing something really meaningful. I’m very grateful.
How many of the processes that we hold dear as developers actually add value? It’s an interesting question, one I’ve found myself asking a. One process that definately adds value, and the data shows it, is code reviews. But how do you make sure a code review is effective?
That's the topic of two posts I think are worth reading. 100 duck size pull requests by Kurtis Funai (VP of engineering at FullScript) and a collaborative post I helped write at Server Density: How to do code reviews. Check them out. Afterall reviewing code is something most developers do every day, it's worthwhile being good at it!
A while back I started a project to re-write Server Density's time series charts using React, D3 and Redux and I was lucky enough to write about the process. In the blog post for Server Density I covered:
The development process.
Architecture.
Declaritive components with React.
Gaining performance through Redux.
Since I wrote that blog post the charts have been released and Server Density has also released an update which included drag to zoom functionality. Functionality made possible by the architecture we defined and the performance we gained via redux.
For me the memorable part of this project will be just how declaritive React components can be. If this sounds interesting, then give it a read: Time Seres Charts with React, Redux and D3
Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
âś“ Live Streamingâś“ Interactive Chatâś“ Private Showsâś“ HD Qualityâś“ Free Actions
Free to watch • No registration required • HD streaming
Any long running code-base will have rough edges. It will have areas of the code that are harder to debug, more error prone, or areas where design or usability are less than ideal.
Rough edges are a natural thing that should be expected and not feared. Sure, we can attempt to prevent them, but you’ll never be 100% successful. Plus, focussing too much on prevention is likely to slow down the shipping of revenue-increasing features.
Instead, I think it’s better to identify the rough edges, and to improve them slowly and steadily over time. Heres how...
What Rough Edges?
The Server Density UI definitely has some rough edges. This isn’t something I’m embarrassed about; instead I prefer to be honest about these things so they can be addressed.
CSS: We have one CSS file that is over 5000 lines long. It hides plenty of dead CSS, and it is very difficult to work with. It also contains far too many uses of !important.
Backbone Views: Our old Backbone views tend to contain UI elements that aren’t usability tested, are less composable and less performant than their React counterparts. In our codebase, Backbone views tend to not have unit tests, whereas our React components always do.
Backbone Models: Transitioning to Redux means we are in a phase where we have redux code that duplicates Backbone Models/Collections. Fixing this duplication would lead to less loading states as data fetched for one page is easily shared with another page.
Improving the situation
If we recognise these rough edges (and we should) we should start to think about what to do about them. How do we know it’s a rough edge? How do we know if it’s getting better? How do we measure it?
If it’s measurable we can track it over time, but how? At Server Density we use simple scripts like measure React component re-use to track 4 areas of the codebase every month:
Asset file size: This is more about how much duplicate or dead code we managed to remove. Byte counting is not that useful but removing dead or duplicate code is.
CSS health: Our new CSS is composed of little files where each file has 1:1 mapping to a component and a very specific namespace. Our old CSS is a very large file, a lot of which can probably be deleted. Plus, our old CSS uses !important too much and has weak namespaces or selector depth that is too deep.
Component reuse: This is about how generic and re-usable our components are, which is about productivity and UI consistency. This read-me is a good overview.
Backbone views: How successful we are at removing Backbone views in favour of more usable, more consistent, better tested, more composable React components.
Every month we measure these stats and add them to a spreadsheet, which allows us to compare where we are this month vs last month.
Does this work?
Sometimes it’s easy to see a benefit. Prior to monthly stats the CSS file-size was increasing, but now it’s decreased every month for 10 months by 27% overall. The important point here is the amount of dead or undesirable code that has been removed or replaced and how much easier the CSS is to work with now.
Tracking JavaScript file-size has also been positive. After 10 months of monitoring, the file-size is roughly the same. Pretty good considering we ship code almost every day, and have released major features like alert costs in that time. Again, the file size is not the important point, it’s the increased composability and the removal of dead code that this indicates which is important.
Other times it’s harder to say. Component composability has increased, and anecdotally this has improved productivity because new features have comprised mostly of pre-existing code. However, I can’t say if this would have happened without the stats. I also think focussing too much on further increases would make the codebase too tightly woven.
The danger inherent in focusing too much on instances per component reveals some interesting take aways from monitoring stats like these:
Stats should be a way to tell the story of a code-base, and should not be the end goal.
Stats should be taken with a pinch of salt.
The stats you monitor might have to change as a code-base changes.
Stats need to be really specific to the codebase. Stats that are valuable for one codebase might not be valuable for another.
That being said monitoring stats has been positive for us. I’m a big believer that they affect all the micro decisions you make because you’re much more likely to put in the extra work if you know it’s monitored. It’s a chance for reflection, and a chance to foster a team culture of making things better. It’s also something to celebrate every month, and those monthly celebrations add up to a serious amount of progress over time; progress that is addictive.
Any long term codebase has what I’m going to call opportunity cost moments. These are opportunities to improve the lives of developers or users made possible because of an organisational or technical change.
An opportunity is not without a cost though, hence opportunity cost. If you subscribe to the belief that Programmers know the benefits of everything and the tradeoffs of nothing then it's the cost, or the tradeoffs that should be given more thought.
At Server Density I think the product interface has had two major opportunity and cost moments…
React
Almost 3 years ago we took the decision to switch to React. This has substantially improved the lives of our developers and our customers:
Because components are a function of props and state, they are easy to unit test. This opportunity allowed us to enforce unit tests at the view layer for the first time, making the UI more robust and less prone to regressions.
Because components are much quicker to implement than backbone views we had more time. This led to two new policies; new functionality must be usability tested and new functionality must support keyboard controls.
Because components are so much more composable than Backbone views we had a real opportunity to improve productivity and user-interface consistency. To make sure we were doing this we started to measure component re-use and document generic components.
These opportunities have proven to be huge wins for improving productivity, reducing regressions and improving usability.
However, there have been costs; the time it takes to convert backbone views to react components, the extra complexity of maintaining two very different approaches within one codebase, the cost of implementing bad components due to relative naivety and learning React.
In this case was the cost worth it? Yes, absolutely. But that doesn’t mean the cost is without consequence, in fact I expect us to be dealing with these costs for many months/years to come.
Redux
Recently we’ve taken the decision to move our data layer from backbone to Redux. Redux’s opportunities are:
Debugging how data changes over time is now much simpler thanks to immutability and tools like redux debugger
With Backbone (in our codebase at-least) each view instantiates the data it needs. This means different views will often fetch the same data multiple times as a user navigates the app. With Redux, after the first fetch, data is always available. This means the user should only ever see a loading state for specific data once, rather than several times.
Still there is a cost: We now have redux code duplicating backbone model/collection code, we’ve had to add seamless-immutable to our codebase, initial development has been slower (but is speeding up), and we’ve had to figure out how to hook backbone events to Redux action creators (eww).
Will this cost be worth it? Yes, eventually, mostly because we will be able to remove so many loading states from the app and massively improve user experience. But this will take many months/years to be completely fulfil and in the mean time we’ll be dealing with the costs.
Why does this matter?
I think using opportunity and cost as a framework for making technical decisions is important. Think:
What are the opportunities?
How long until we realise these opportunities?
What are the costs?
How long until we pay back these costs?
How can we measure if we capitalise these opportunities?
Do the opportunities substantially outweigh the costs?
Hindsight is a wonderful tool. It can and should be used to judge past decisions to improve future decisions.
At Server Density we used Backbone for 2 years without upgrading to any of the more advanced variants like Ampersand.js and Marionette. All that time I wondered whether upgrading would be worth it, but with hindsight I’m glad we didn’t. If we had upgraded we’d still be dealing with upgrade costs as well as the costs of switching to React & Redux.
When I look at technical decisions in this way, I realise that most new libraries and frameworks can be avoided. Not ignored; we still need to understand their approach, but is the opportunity cost ratio worth using it right away? 99% of the time, probably not.
One of the things we've put a lot of effort into at Server Density is usability. Why? Because we know from support tickets it's a prime influencer in churn and it's central to building a great product.
I believe great usability requires a lot of deliberate effort and it's not something you can just nail on the first attempt. It's the result of reading support tickets, analytical data, customer satisfaction surveys, automated life-cycle e-mails, usability tests, pointed questions and many iterations.
So, how do we do usability at Server Density? Well, I've written an article on exactly that: How to Improve Usability in Software. It contains lots of tips and tricks and also shares a few of the things that we've been able to improve as a result of our usability efforts. Check it out!
Backbone to React: good UI code in large codebases.
Server Density's journey from a large backbone codebase (60K custom lines) to a large Reactjs codebase continues to be an interesting one. Starting 16 months ago, it has highlighted a great deal about good code vs bad code, or good code vs great code depending on your perspective.
In this talk I was hugely excited to share some of the "aha!" moments this journey has lead to. Essentially it was an attempt to answer the questions "Just why is Reactjs so simple?" and "What can that teach us about how to write good code?". To do this I broke the talk down into three concepts: simplicity vs complexity, predictability and composability.
This was a very technical presentation, but I wanted to make it clear that good code is a means to an end, not the end itself. Good code is great n all, but it needs to achieve things like shipping faster, shipping higher quality, fewer regressions, better usability. Without that, it's all just very academic. Have we achieved these things at Server Density? Yes, 100%, and using stats and experience gained from our codebase I tried my best to prove this.
If this topic is of interest then check out the video and the slides and tweet me your thoughts. Lastly, thanks very much to the very successful and very well organized FrontendNE for having me. Meet-ups like this are the lifeblood of the tech industry and I know from experience how much effort they take to run.
One of the neat tools we have at Server Density is grunt scaffold.  Taking it’s inspiration from Ruby on Rails, It’s a grunt command that will quickly create the component, unit tests and CSS for a new component based on 3 prompts: The path and filename for the component, the components css class and the displayName.
It’s a neat tool because it saves time, but also because it helps with consistency.  Components are much more likely to be authored consistently if the tooling makes it easy to do so. Â
Here is a GIST for the GruntFile, a GIST for the component template and a screenshot of it in action.Â
Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
âś“ Live Streamingâś“ Interactive Chatâś“ Private Showsâś“ HD Qualityâś“ Free Actions
Free to watch • No registration required • HD streaming
User on-boarding can be the difference between a loyal customer and a customer you'll never see again. Â At Server Density we've spent a lot of time on our on-boarding flow. It's an interesting topic because designing on-boarding is designing for users with little or no experience. Â Not easy.
That's why I was happy to give a presentation on the topic and Northern UX. The presentation covered 3 main topics:
Three on-boarding concepts you must understand
Seven Tips for designing great on-boarding experiences
Four accidental on-boarding mistakes you can avoid
I enjoyed the talk.  I also enjoy the fact that it’s a bit more UX’y than most of my talks.  Front-end developers need to understand UX, indeed it’s fundamental to the work I do at Server Density.  Anyway, you should check out the slides for the on-boarding concepts, tips and mistakes I covered.
Analytical data, support tickets, market research, metrics like NPS, usability testing and iteration are all great tools for designers. These tools can be the difference between a successful project and one that is a failure.
Recently, during a 2 months redesign, my colleagues and I have been lucky enough to employ all of these tools.  As a result, I’m quite proud of the UI we designed and developed.  I’m also very lucky that I’ve been able to write about the process on the Server Density Blog
“Redesigning server monitoring: Configuring alerts” contains tidbits about design research, usability testing, iconography and keyboard controls. I hope it’s a good insight into what design is like at a design focussed, data driven, product based company.Â
In 2014 I gave presentations or workshops in Sheffield, Berlin, Hannover, Vienna, Barcelona, Dundee, Newcastle and Huddersfield and I gave my first ever conference presentations at Bacon Conference and Web Visions Barcelona. I look back most fondly on What shouldn’t happen will happen. Why? Because defensive programming is a core skill that is too easily neglected in favour of more exciting topics like hype.js.
I'm very proud of the presentations I gave and I can't state enough what a privilege it is to be able to share things I love with so many passionate people. I've improved as a speaker and I think I've become a better developer too; You have to take really understand your topic when stood advocating it to 100+ people at a time.
That being said giving so many presentations led to some of my worst moments in 2014. In 2014 I worked to make each talk better than the last, which meant a lot of evening and weekend work. Add the pressure of standing up in front of so many people and I become very tired and very stressed. This is not something I'm proud of. You simply can't be at your best when you inflict this on yourself. But all in all, 2014 was a good year. One of the reasons was presentations.
Recently I was thrilled to give a presentation on defensive programming entitled "What shouldn't happen will happen". It's an important topic because programming defensively makes code easier to understand and products more robust, forgiving, and less error prone.
This presentation is about attitude and approach and that's why I'm so proud of it. We need to take ownership over our code, it's bugs and the experience it creates. These things are as important as the tools we use, if not more.
I think I did the topic justice and I hope the presentation was entertaining, educational and easy to follow. I'm proud because Bacon Conference is a fantastic event and I'm happy I was part of it. You can watch the video, check out the slides and let me know what you think on twitter.
Public speaking is a skill that our day to day jobs in development or design don't really prepare us for. I've given quite a few presentations now and I hope the presenter I was when I first started is unrecognisable to the presenter that I am now. In other words I hope I've learnt a lot. Here I will share 13 things I've learnt about public speaking.
Meet-ups and lightning talks are a great place to gain experience. Send the organisers an email and say you would like to present and what your experience is.
Rehearse, multiple times. On your own at first and then in front of some-one you trust to give honest feedback and be very grateful to this person. After each rehearsal improve the slides. If there is a slide, quote or concept you consistently find difficult to articulate remove it.Â
Stories are powerful. Even just saying the word story can have a positive effect on how attentive an audience is.
A picture says a thousand words but a video can say a million, especially if you are trying to explain something that is time-based, like user interaction.
Less is more. Put less information on your slides and cover less information in your presentation. Presentations that try to cover too much are rarely successful.Â
Watching a video of yourself presenting is the only real way to pick up on bad habits and put an end to them. It's painful, but it's worth it.
Don't think out-loud. Instead of saying "um", or "er", or "like", stop speaking for as long as it takes to formulate the next sentence. It won't be that long and the break will do your presentation good.
Don't live code. I've seen presentations by very clever, very confident programmers falter as soon as they switch to their text editor. You can probably show the concepts you would live code in slides anyway.
Ask a question and then answer it. Or introduce a problem and then provide the solution. You can do this for the whole of the presentation, or you can do this multiple times through the course of it. This keeps your audience thinking.
Design your presentation for your audience. Is your audience made up of managers, designers, developers, others or a mixture? Designers might not be interested in code samples, but developers might be disappointed if there aren't any.
Define a clear structure for your presentation and if you have time, tell your audience what that structure is. This might not apply to shorter presentations.
If your presentation is split into sections choose a color scheme for each section. Â This helps you be aware how you talk is progressing compared the the time you have available, but it also tells the audience that the topic has changed.
Be yourself. You may really like a particular presentation but if that presenter has a style that does not match your personality don't try to copy it.Â
Be opinionated. Sure, acknowledge the subtleties in a statement, but don't shy away from being bold in what you say.
Public speaking is a very personal thing, so these tips might not work for you, or you may completely disagree. But these have worked for me.
Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
âś“ Live Streamingâś“ Interactive Chatâś“ Private Showsâś“ HD Qualityâś“ Free Actions
Free to watch • No registration required • HD streaming
Recently a good friend of mine Wes Mason asked if I had any advice for giving his first workshop. I've found giving workshops immensely rewarding, but I also experienced a steep learning curve. The following list will help might be helpful to anyone whose thinking about giving a workshop..
Define what you will cover, what you won't cover and experience that will be required to enjoy the workshop. Make this very obvious to people before they sign up.
People learn differently so use a variety of teaching methods. I usually have a presentation, code demonstrations and then exercises.
Keep live coding to a minimum. For me this means uncommenting and re-commenting code not writing lines and lines of it.Â
Exercises should be well documented and flexible so that people can complete them at their own pace and in their own time.
For every new method, function or concept try to provide a link to documentation or a blog post that contains an alternative explanation.
Always ask "does everyone understand" and then ask again, but phrased differently a few seconds later. It's amazing how many times people will stay quiet the first time, but then say they don't understand the second time.
Focus on concepts first and syntax second; If some-one understands a concept they can learn the syntax through repetition. It's harder the other way around.Â
Use analogies where appropriate, but test your analogies on people who understand the concept before the workshop.
Try to provide enough material so that it will be impossible to complete it all in the workshop. People love to take material away with them.
Define your development environment and if necessary ask participants to install this before the workshop. You don't want to have to set this up on the day
Encourage questions during the workshop and provide a way in which participants can get more help after the workshop.
If you are unsure if you want to give a workshop you might want to read this article I wrote for netmag: You should give a workshop.
Over the past 2 weeks I've been fortunate enough to talk about D3, Rickshaw and Backbone at 5 events in Dundee, Dublin, Basel, Vienna and Hannover. This has been a great experience and I am very gratefull that Server Density values this sort of activity.
Over the last two weeks I've learnt alot:
Knowing a presentations audience is key. Subtle changes in content or audience can have a massive impact on how a talk is recieved
In every major city in Europe there are tech meetups full of smart, open and enthusiastic designers and developers that are crying out for people to share their experiences.
There is huge value in presenting the same topic multiple times to different audiences. It allows you to iterate, respond to feedback and test theories.
Travelling for work is not glamourous, it's tiring and can be lonely. But the conversations with like minded individuals make it worthwhile, as does the opportunity to show a product that you are very proud of to a new audience.
I've learnt that Data Visulisation is a topic that every designer, developer or business person can get alot out of and thoroughly enjoy.
If your interested in D3, Rickshaw and backbone you might want to check out the slides on slideshare.