We Need Your Answers
As I posted about the other day we are doing Bad Voltage Live in Los Angeles in a few weeks. It is on Fri 22nd Jan 2016 at 8pm at the SCALE14x Conference in Los Angeles. Find out more about the show here.
Now, I need every one of you to help provide some answers for a quiz we are doing in the show. It should only take a few minutes to fill in the form and your input could be immortalized in the live show (the show will be recorded and streamed live so you can see it for posterity).
You don’t have to be at the live show or a Bad Voltage listener to share your answers here, so go ahead and get involved!
If you end up joining the show in-person you also have the potential to win some prizes (Mycroft, Raspberry Pi 2 kit, and more!) by providing the most amusing/best answers too. Irrespective of whether you join the show live though, we appreciate if you fill it in:
Go and fill it in by clicking here
Thanks, everyone!
Bad Voltage Live in Los Angeles: Why You Should Be There
On Friday 22nd January 2016 the Bad Voltage team will be delivering a live show at the SCALE14x conference in Pasadena, California.
For those of you unfamiliar with Bad Voltage, it is a podcast that Stuart Langridge, Bryan Lunduke, Jeremy Garcia, and myself do every two weeks that delves into technology, open source, linux, gaming, and more. It features discussions, interviews, reviews and more. It is fun, loose, and informative.
We did our very first Bad Voltage Live show last year at SCALE. To get a sense of it, you can watch it below:
Can’t see the video? Watch it here.
This year is going to be an awesome show, and here are some reasons you should join us.
1. A Fun Show
At the heart of Bad Voltage is a fun show. It is funny, informative, and totally irreverent. This is not just four guys sat on a stage talking. This is a show. It is about spectacle, audience participation, and having a great time.
While we discussed important topics in open source last year we also had a quiz where we made video compilations of people insulting our co-hosts. We even had a half-naked Bryan review a bottle of shampoo in a hastily put together shower prop.
You never know what might happen at a Bad Voltage Live show and that is the fun of it. The audience make the evening so memorable. Be sure to be there!
2. Free Beer (and non-alcoholic beverages)
If there is one thing that people enjoy at conferences is an event with free beer. Well, thanks to our friends at Linode the beer will be flowing. We are also arranging to have soft drinks available too.
So, get along to the show, have a few cold ones and have a great time.
3. Lots of Prizes to be Won
We are firm believers in free stuff. So, we have pulled together a big pile of free stuff that you can all win by joining us at the show.
This includes such wonderful items as:
A **Pogo Linux Verona 931H Workstation** (thanks to Pogo Linux)
A **Zareason Strata** laptop (thanks to Zareason)
A Mycroft AI device (thanks to Mycroft)
We will also be giving away a Raspberry Pi 2 kit, Amazon Fire Stick and other prizes!
You can only win these prizes if you join us at the show, so be sure to get along!
4. Free Entry
So, how much does it cost to get into some fun live entertainment, free beer, and a whole host of prizes to be won?
Nothing.
That’s right, the entire show is free to attend.
5. At SCALE
One of the major reasons we like doing Bad Voltage Live at SCALE is because the SCALE conference is absolutely fantastic.
There are a wide range of tracks, varied content, and a wonderful community that attends every year. There are also a range of other events happening as part of SCALE such as the Ubuntu UbuCon Summit.
So, I hope all of this convinces you that Bad Voltage Live is the place to be. I hope to see you there on Friday 22nd January 2016 at 8pm. Find out more here.
Thanks to our sponsors, Linode, Microsoft, Pogo Linux, Zareason, and SCALE.
In Memory of Ian Murdock
Today we heard the sad news that Ian Murdock has passed away. He was 42.
Although Ian and my paths crossed relatively infrequently, over the years we became friends. His tremendous work in Debian was an inspiration for my own work in Ubuntu. At times when I was unsure of what to do in my work, Ian would share his guidance and wisdom. He never asked for anything in return. He never judged. He always supported the growth of Open Source and Free Software. He was precisely the kind of person that makes the Open Source and Free Software world so beautiful.
As such, when I heard about some of his erratic tweets a few days back as I landed back home from the UK for Christmas, I reached out with a friendly arm to see if there was anything I could do to help. Sadly, I got no response. I now know why: he had likely just passed away when I reached out to him.
While it is natural for us to grieve his passing, we should also take time to focus on what he gave us all. He gave us a sparkling personality, a passion for everyone to succeed, and a legacy of Open Source and Free Software that would be hard to match.
Ian, wherever you may be, rest in peace. We will miss you
Why You Should Go To UbuCon in Los Angeles in January
The 21st – 22nd January 2016 are some important dates you need to pencil into your calendar. The reason? That is when the UbuCon Summit is happening in Pasadena, California, USA.
Many moons ago there used to be the Ubuntu Developer Summit events. They brought together Ubuntu developers, community members, Canonical employees, and partners from all over the world. They were important not just for sharing and evolving ideas and projects but also getting people together socially.
While the Ubuntu Developer Summits were switched to an online setting, it left a gaping hole for an in-person event that brings people together. This, my friends, is what the UbuCon Summit in Los Angeles is going to help provide.
Now, to be clear, this isn’t an Ubuntu Developer Summit. It is a different type of event. It is designed for a much wider demographic: users, developers, artists, educators, partners, businesspeople, and more. The goal of the event is to have fun with Ubuntu and share ideas and opportunities, and build relationships.
The goal of the event is to share some interesting and thought-provoking content. It will feature both keynote and presentation sessions, as well as an unfconference where the audience can shape the content.
It is going to be phenomenal for content. There will be talks by Mark Shuttleworth, Elizabeth K Joseph, Stuart Langridge, David Planella, Nathan Haines, Manik Taneja, John Lea, and even my little old self. The unconference will be a wonderful opportunity to delve into a diverse range of topics that relate to the real-world conditions and needs of Ubuntu users.
Importantly though, it will be the networking and social side of the event that will be the most valuable. A big contingent from Canonical will be there, many LoCo teams and members, community members from around the world and more. It is going to be a wonderful opportunity to get the Ubuntu family together and I can’t wait to be a part of it.
Finally, the UbuCon Los Angeles is front-loading the incredible SCALE14x conference. So, not only can you get out to UbuCon but you can also join what I feel is one of the greatest Linux and Open Source conferences in the world. Oh, and as a total sweetener, myself and the rest of the Bad Voltage team will be doing a live show on the second evening of the UbuCon (which is the first day of SCALE14x).
Entrance to UbuCon (and the Bad Voltage live show) is entirely free, and entrance to SCALE14x is a really inexpensive.
So, you basically have no excuses, people. Be sure to come out and join us for an incredible time at the UbuCon in Los Angeles.
Recommendations For New Runners
Recently I started running. I blame Jason Hibbets for this. While at the Community Leadership Summit earlier this year we got chatting about running and through some gentle persuasion he convinced me to give it a shot.
So I did. Based on Jason’s recommendations I went and bought some running shoes and started using an app called Couch To 5K. The app basically provides a series of workouts that gradually increase in intensity. Each workout involves a mixture of warming up (walking), jogging, brisk walking, and cooling down (walking).
Things were going well. Surprisingly to myself I was really quite enjoying it (more on this later) and I was sticking to the three workouts each week.
Then I made a mistake. I decided I was impatient with the app’s growing intensity and I decided to notch it up a bit. I switched the app off and significantly increased my runs, clocking in some much better workouts.
It felt great but my celebration was short-lived. Knee pain set in. After some research it became clear that the knee pain was because I pushed myself too hard. Many runners warned me of this but I ignored them. Well, I was wrong.
Fortunately though, the experience of buggering up my knee helped me to learn a lot about running that I wish I knew when I started. Thus, I wanted to share five key learnings here.
Now, to be clear: I am not a running expert. I am still very much a novice, so some experts may challenge these recommendations, but I welcome all feedback in the comments!
1. Buy The Right Shoes
Even in my first conversation with Jason the importance of getting good shoes was emphasized. I presumed though that this was mainly about getting “running shoes” as opposed to bog-standard shoes (sneakers/trainers etc).
What I didn’t realize was that we all run in slightly different ways and the purpose of a good shoe is to support you to run in the most optimal way.
As an example, it seems I tend to put a lot of press on the inside of my foot. As such, I need shoes that provide a lot of support on the inside to prevent my knee rotating as much (this was the cause of my knee pain).
Interestingly, when I went to a running store to buy shoes after my knee injury the chap in there could tell a lot about how I run from the state of my first pair of shoes. They noticeably drooped on one side, showing the impact of my foot on the inside.
So, don’t just get running shoes, but pay attention to the impact you have on your shoes and use that to make a decision about future shoes too.
2. Take It Slow
Again, one thing that was made clear to me when I started was to take it slow. Although I was using Couch to 5K, I didn’t feel like much of a couch potato, so I jacked up my pace to get my heart racing.
As I mentioned above, this was a mistake.
Running places quite a bit of stress on different parts of your body. It affects your feet, ankles, knee, quads, hams etc. Part of the reason why Couch To 5K and similar apps go so slowly is to ramp up your body gradually to get used to the impact running has on it.
As my case demonstrates, if you push yourself too hard you get injured. So, don’t do what I did: take it a step at a time (pun intended).
3. Stretch
When I started running my wife told me to stretch when I finished my run. She showed me a few stretches and I did them for a few minutes when I got home.
When the knee injury set in, I asked one of Erica’s friends, Tabitha, who is a runner, what she thought the problem may be. She asked me to do some simple stretches and it became obvious that my body was…well…not all that stretchy. Tabitha made it clear that I needed to stretch both before and after a run.
Fortunately there are plenty of videos on YouTube that show you how. Again, I wished I had realized the importance of stretching when I got started.
4. Strengthen Your Muscles
On a related note to both taking it slowly and stretching, my interest in running helped to illustrate some basic anatomy and the importance of building strength.
What became clear to me is that muscles throughout your body play a role on different elements of running. As an example, your quads play an important role in your knee working effectively. If you don’t have strong and stretched quads, it can result in some knee pain.
As such, I discovered that the actual run is not the only important piece. Stretching before and after and taking time to build strength is important too. Again, there are plenty of videos online that can help with this.
5. The Runners High
For quite some time friends of mine who are runners have talked about the runners high. Now, it seems different people have a different idea of what this is, but it is basically a special sense of pleasure when running or afterwards.
I have to admit, I was a bit cynical about this. I don’t enjoy exercise. I never have. It feels like a neccessary evil I need to do to stay in shape and healthy.
That changed though. On my first few runs I noticed that I really enjoyed being out of the house and running. I enjoyed the feeling of the wind against my face as I ran. I felt a sense of decompression as the blood flowed and my mind detached from work. I found myself genuinely enjoying the 30 minutes or so that I was out getting started running.
This sensation continued after the run too, particularly when I was out of the shower and dressed. I felt lighter, more nimble, and a real sense of accomplishment. I am not sure if this is the runners high others get, but it is a great feeling.
What was really odd was that when I got my knee injury I really started missing getting out there to run. I would have never have imagined I would have felt this way but I love it.
So, for those of you who have read this far and are not convinced that running might be both good for you and enjoyable, give it a shot. You never know, you might just enjoy it.
Bonus: Shopping List
Before I wrap up I thought it might also be handy to share a few handy things I have purchased that can enhance the overall running experience:
- Compression Underwear – this is important for the gentlemen out there (in much the same way a sports bra is important for the ladies). You just don’t want things bouncing around down there, so get some good compression undies. I have some Asics and Adidas undies.
- Socks – good sock choice is important. Poor socks can result in blisters so get some runners socks. I use Asics white socks.
- Belt – I got myself a FlipBelt which is a handy tubular belt you can put your phone, credit card, and ID into. It saves you having to carry them separately or have bulky pockets.
- Bluetooth Headphones – I tend to listen to music sometimes when I run and sometimes I listen to audio books. I tried wired headphones on my first run and they kept falling out of my ears. So, I picked up a MPow Cheetah headset which I love. It pairs with my phone easily and sounds great.
- Water Bottle – I didn’t buy anything fancy – just a cheap plastic bottle I picked up at a conference. I shove a little ice in there on a hot day and it works fine.
Anyway, I think that is about it. Be sure to share your additional running tips or questions in the comments!
Perceptions and Methods of Good Customer Service
This week I had a rather frustrating customer experience. Now, in these kinds of situations some folks like to take to their blogs to spew their frustration in the direction of the Internet and feel a sense of catharsis.
To be honest, what I found frustrating about this experience was less the outcome and more the way the situation was managed. The frustration then turned into an interesting little thought experiment about the psychology going on in this experience and how it could potentially be improved.
So, I sat down and thought about why the experience was frustrating and came away with some conclusions that I thought might be interesting to share. This may be useful for those of you building your own customer service/engagement departments.
The Problem
A while ago I booked some flights to take my family to England for Christmas. Using an airline Erica and I are both big fans of, we managed to book the trip using miles. We had to be a little flexible on dates/times, but we figured this would be worth it to save the $1500+.
Like anyone picking flights, the times and dates were carefully considered. My parents live up in the north of England and it takes about four hours to get from Heathrow to their house (with a mixture of trains and taxis). Thus we wanted to arrive at Heathrow from San Francisco earlier in the day, and for our return flight to be later in the day to accommodate this four hour trip.
Recently I was sent an email that the airline had decided to change the times of our flights. More specifically, the return flight which was due to leave at 3.15pm was now shifted to closer to 12pm. As such, to get to Heathrow with the requisite few hours before our flight it would have mean’t us leaving my parents house at around 5am. Ugh.
Now, to help illustrate the severity of this issue, this would mean getting a 3 year-old up at 4.15am to embark on a four hour journey to London and of course the 11 hour flight back to San Francisco. The early morning would make the whole trip more difficult.
As you can imagine, we were not particularly amused by this. So, I went to call the airline to see if we could figure out a better solution.
The Response
I called the airline and politely illustrated the problem, complete with all the details of the booking.
I was then informed that they couldn’t do anything to change the flight time (obviously), and there were no other flights that day (understandable).
So, I asked if they could simply re-book my family onto the same flight the following day. This would then mean we could head to the airport, stay in a hotel that evening near Heathrow, and make the noon flight…all without having to cut our holiday short by a day.
I was promptly informed that this was not going to work. The attendant told me that because we had purchased a miles-based ticket, they could only move us to miles-based ticketed seats the following day without a charge. I was also informed that the airline considers anything less than a 5 hour time change to be “insignificant” and thus are not obliged to provide any additional amendments or service. To cap things off I was told that if I had read the Terms Of Service this would have all been abundantly clear.
To explore all possible options I asked how much the change fees would be to move to the same flight the following day but in non-mileage based seats and the resulting cost was $1500; quite a number to swallow.
As I processed this information I was rather annoyed. I booked these tickets in good faith and the airline had put us in this awkward position with the change of times. While I called to explore a flexible solution to the problem, I was instead told there would be no flexibility and that they were only willing to meet their own defined set of obligations.
As you can imagine, I was not particularly happy with this outcome so I felt it appropriate to escalate. I politely asked to speak to a manager and was informed that the manager would not take my call as this was merely a ticket-related issue. I pressed further to ask to speak to a manager and after a number of additional pushbacks about this not being important enough for a manager and that they may not take my call, I was eventually put through.
When I spoke to the manager the same response was re-iterated. We finished the conversation and I made it clear I was not frustrated with any of the staff who I spoke to (they were, after all, just doing their job and don’t set airline policy), but I was frustrated with the airline and I would not be doing business with them in future.
Now to be clear, I am not expecting to be treated like royalty. I just felt the overall situation could have possibly been handled better.
A Better Experience
Now, to be clear before we proceed, I am not an expert on customer service, how it is architected, and the methodology of delivering the best customer service while protecting the legal and financial interests of a company.
I am merely a customer, but I do think there were some underlying principles that exist in people and how we engage around problems such as this that the airline seems to be ignoring.
Let’s first look at what I think the key problems were in this engagement:
Accountability and Assurance
At no point throughout the discussion did one of the customer service reps say:
“Mr Bacon, we know we have put you in an awkward situation, but we assure you we are going to do our level best to find a solution that you and your family are happy with.”
A simple acknowledgement such as this serves three purposes. Firstly, it lets the customer feel the company is willing to accept responsibility. Secondly, it demonstrates a collaborative human side to the company. Finally, and as we will explore later, it equalizes the relationship between the customer and the company. This immediately gets the conversation off to a good start.
Obligations vs. Gestures Of Goodwill
Imagine your friend does something that puts you in an awkward position, for example, saying they will take care of part of a shared project which they then say they are not going to have time to deliver.
Now imagine the conversation looks like this:
You: you have kind of put me in an awkward situation here, friend. What do you think you can do to help resolve it?
Friend: well, based upon the parameters of the project and our friendship I am only obliged to provide you with a certain level of service, which is X.
This is not how human beings operate. When there is a sense that a shared agreement has been compromised, it is generally recommended that the person who compromised the agreement will (a) demonstrate a willingness to rectify the situation and (b) provide a sense of priority in doing so.
When we replace thoughtful problem-solving with “obligations” and “terms of service”, which while legally true and accurate, it changes the nature of the conversation to be one that is more pedantic and potentially adversarial. This is not what anyone wants. It essentially transforms the discussion from a collaboration to a sense that one party is covering their back and wants to put in minimal effort to solve the problem. This neatly leads me to…
Trust and Favors
Psychology has taught us that favors play an important role in the world. When we feel someone has treated us well we socially feel a responsibility to repay the favor.
Consequently in business when you feel a company goes above and beyond, consumers will often repay that generosity significantly.
In this case the cost to me of reseating my family was $1500. Arguably this will be a lower actual cost to the airline, let’s say $1000.
Now, let’s say the airline said:
“Mr Bacon, as I mentioned it is difficult to move you to the seats on the flight the following day as you have a mileage ticket, but I have talked to my manager and we would be happy to provide a 30% discount.”
If this happened it would demonstrate a number of things. Firstly, the airline was willing to step outside of their published process to solve the customer’s problem. It demonstrates a willingness to find a middle-ground, and it shows that the airline wants to minimize the cost for the customer.
If this had occurred I would have come away singing the praises of the airline. I would be tweeting about how impressed I was, telling my friends that they are “different to the usual airlines”, and certainly keeping my business with them.
This is because I would feel that they took care of me and did me a favor. As such, and as we see elsewhere in the world, I would feel an urge to repay that favor, both with advocacy and future business.
Unfortunately, the actual response of what they are obliged to do and that they are covered by their terms of service shows an unwillingness to work together to find a solution.
Thus, the optimal solution would cost them a $500 loss but assure future business and customer advocacy. The current solution saves them $500 but means they are less likely to get my future business or advocacy.
Relativity and Expectations
People think largely in terms of relativity. We obviously compare products and services but we also compare social constructs and our positions in the world too.
This is important because a business transaction is often a power struggle. If you think about the most satisfying companies you have purchased a product or service from, invariably the ones where you felt like an equal in the transaction was more rewarding. Compare for example the snooty restaurant waiter that looks down at you versus the chatty and talkative waiter who makes you feel at ease. The latter makes you feel more of an equal and thus feels like a better experience.
In this case the airline customer service department made it very clear from the outset that they considered themselves in a position of power. The immediate citing of obligations, terms of service, an unwillingness to escalate the call, and other components essentially put the customer in a submissive position, which rarely helps contentious situations.
The knock-on effect here is expectations: when a customer feels unequal it sets low expectations in the business relationship and we tend to think less highly of the company. The world is littered with examples of this sense of an unequal relationship with many cable companies getting a particularly bad reputation here.
Choice Architecture
Another interesting construct in psychology is the importance of choice. Choices provide a fulfilling experience for people and it makes people feel a sense of control and empowerment.
In this case the airline provided no real choices with the exception of laying down $1500 for full-price tickets for the non-mileage seats. If they had instead provided a few options (e.g. a discounted ticket, an option to adjust the flight time/date, or even choices for speaking to other staff members such as a manager to rectify the situation) the overall experience would feel more rewarding.
The Optimal Solution
So, based on all this, how would I have recommended the airline handled this? Well, imagine this conversation (this is somewhat paraphrased to keep it short, but you get the drift):
Me: Good afternoon. We have a bit of a problem where your airline has changed the time my family’s return flights. Now, we have a 3 year-old on this trip and this is going to result in getting up at 4.15am to make the new time. As you can imagine this is going to be stressful, particularly with such a long trip. Is there anything you can do to help?
Airline: I am terribly sorry to hear this. Can you let me know your booking ID please?
Me: Sure, it is ABCDEFG.
Airline: Thank-you, Mr Bacon. OK, I can see the problem now. Firstly, I want to apologize for this. We know that the times of reservations are important and I am sorry your family are in this position. Unfortunately we had to change the time due to XYZ factors, but I also appreciate you are in an uncomfortable situation. Rest assured I want to do everything to make your trip as comfortable as possible. Would you mind if I put you on hold and explore a few options?
Me: Sure.
Airline: OK, Mr Bacon. So the challenge we have is that because you booked a mileage-based ticket, our usual policy is that we can only move you to mileage-based seats. Now, for the day after we sadly don’t have any of these types of seats left. So, we have a few options. Firstly, I could explore a range of flight options across dates that work for you to see if there is something that works by moving the mileage-based seats free of charge. Secondly, we could explore a refund of your miles so you could explore another airline or ticket. Now, there are normal seats available the day after but the fee to switch to them would be around $1500. We do though appreciate you are in an uncomfortable position, particularly with a child, and we also appreciate you are a regular customer due to you booking mileage seats. Unfortunately while I am unable to provide these new seats free of charge…I wish I could but I am unable to…I can provide a discount so we provide a 1/3 off, so you pay $1000. Another option is that I can put you through to my manager if none of these options will work for you. What would you prefer?
Me: Thanks for the options. I think I will go for the $1000 switch, thanks.
Airline: Wonderful. Again, Mr Bacon, I apologize for this…I know none of us would want to be in this position, and we appreciate your flexibility in finding a solution.
If something approximating this outcome occurred, I would have been quite satisfied with the airline, I would have felt empowered, left with a sense that they took care of me, and I would be sharing the story with my friends and colleagues.
This would have also mitigated taking a manager’s time and reduced the overall call time to around 10 – 15 minutes as opposed to the hour that I was on the phone.
To put the cherry on top I would then recommend that the airline sends an email a few days later that says something like this:
Dear Mr Bacon,
One of my colleagues shared with me the issue you had with your recent booking and the solution that was sourced. I want to also apologize for the change in times (we try to minimize this as best we can because we know how disruptive this can be).
I just wanted to follow up and let you know that if you have any further issues or questions, please feel free to call me directly. You can just call the customer service line and use extension 1234.
Kind Regards,
Jane Bloggs, Customer Service Team Manager
This would send yet another signal of clear customer care. Also, while I don’t have any data on-hand to prove this, I am sure the actual number of customers that would call Jane would be tiny, thus you get the benefit of the caring email without the further cost of serving the customer.
Now, some of you may say “well, what if the airline can’t simply slash the cost by a third for the re-seating?”
In actuality I think the solution in many cases is secondary to the handling of the case. If the airline in this case had demonstrated a similar optimal approach that I outline here (acknowledging the issue, sympathizing with the customer, an eagerness to solve the problem creatively, providing choices etc), yet they could not provide any workable solution, I suspect most people would be reasonably satisfied with the effort.
Eventually they never solved the problem in our case, so a 4.15am wake-up and a grumpy Jack it is. While rather annoying, in the scheme of things it is manageable. I just thought the psychology behind the story was interesting.
Anyway, sorry for the long post, but I hope this provides some interesting food for thought for those of you building customer service platforms for your companies.
Supporting Software Freedom Conservancy
There are a number of important organizations in the Open Source and Free Software world that do tremendously valuable work. This includes groups such as the Linux Foundation, Free Software Foundation, Electronic Frontier Foundation, Apache Software Foundation, and others.
One such group is the Software Freedom Conservancy. To get a sense of what they do, they explain it best:
Software Freedom Conservancy is a not-for-profit organization that helps promote, improve, develop, and defend Free, Libre, and Open Source Software (FLOSS) projects. Conservancy provides a non-profit home and infrastructure for FLOSS projects. This allows FLOSS developers to focus on what they do best — writing and improving FLOSS for the general public — while Conservancy takes care of the projects’ needs that do not relate directly to software development and documentation.
Conservancy performs some important work. Examples include bringing projects under their protection, providing input on and driving policy that relates to open software/standards, funding developers to do work, helping refine IP policies, protecting GPL compliance, and more.
This work comes at a cost. The team need to hire staff, cover travel/expenses, and more. I support their work by contributing, and I would like to encourage you do too. It isn’t a lot of money but it goes a long way.
They just kicked off a fundraiser at sfconservancy.org/supporter/ and I would like to recommend you all take a look. They provide an important public service, they operate in a financially responsible way, and their work is well intended and executed.
Atom: My New Favorite Code Editor
As a hobbyist Python programmer, over the years I have tried a variety of different editors. Back in the day I used to use Eclipse with the PyDev plugin. I then moved on to use GEdit with a few extensions switched on. After that I moved to Geany. I have to admit, much to the shock of some of you, I never really stuck with Sublime, despite a few attempts.
My Requirements
Going into this I had a set of things I look for in an editor that tends to work well with my peanut-sized brain. These include:
- Support for multiple languages.
- A simple, uncluttered, editor with comprehensive key-bindings.
- Syntax highlighting and auto-completion for the things I care about (Python, JSON, HTML, CSS, etc).
- Support for multiple files, line numbers, and core search/replace.
- A class/function view for easily jumping around large source files.
- High performance in operation and reliable.
- Cross-platform (I use a mixture of Ubuntu and Mac OS X).
- Nice to have but not required: integrated terminal, version control tools.
Now, some of you will think that this mixture of ingredients sounds an awful lot like an IDE. This is a reasonable point, but what I wanted was a simple text editor, just with a certain set of key features…the ones above…built in. I wanted to avoid the IDE weight and clutter.
This is when I discovered Atom, and this is when it freaking rocked my world.
The Basics
Atom is an open source cross-platform editor. There are builds available for Mac, Windows, and Linux. There is of course the source available too in GitHub. As a side point, and as an Ubuntu fan, I am hoping Atom is brought into Ubuntu Make and I am delighted to see didrocks is on it.
As a core editor it seems to deliver everything you might need. Auto-completion, multiple panes, line numbers, multiple file support, search/replace features etc. It has the uncluttered and simple user interface I have been looking for and it seems wicked fast.
Stock Atom also includes little niceties such as markdown preview, handy for editing README.md
files on GitHub:
So, in stock form it ticks off most of the requirements listed above.
A Hackable Editor
Where it gets really neat is that Atom is a self-described hackable text editor. Essentially what this means is that Atom is a desktop application built with JavaScript, CSS, and Node.js. It uses another GitHub project called Electron that provides the ability to build cross-platform desktop apps with web technologies.
Consequently, basically everything in Atom can be customized. Now, there are core exposed customizations such as look and feel, keybindings, wrapping, invisibles, tabs/spaces etc, but then Atom provides an extensive level of customization via themes and packages. This means that if the requirements I identified above (or anything else) are not in the core of the editor, they can be switched on if there are suitable Atom packages available.
Now, for a long time text editors have been able to be tuned and tweaked like this, but Atom has taken it to a new level.
Firstly, the interface for discovering, installing, enabling, and updating plugins is incredibly simple. This is built right into Atom and there is thankfully over 3000 packages available for expanding Atom in different ways.
Thus, Atom at the core is a simple, uncluttered editor that provides the features the vast majority of programmers would want. If something is missing you can then invariably find a package or theme that implements it and if you can’t, Atom is extensively hackable to create that missing piece and share it with the world. This arguably provides the ability for Atom to satisfy pretty much about everyone while always retaining a core that is simple, sleek, and efficient.
My Packages
To give you a sense of how I have expanded Atom, and some examples of how it can be used beyond the default core that is shipped, here are the packages I have installed.
Please note: many of the screenshots below are taken from the respective plugin pages, so the credit is owned by those pages.
Symbols Tree View
Search for symbols-tree-view
in the Atom package installer.
This package simply provides a symbols/class view on the right side of the editor. I find this invaluable for jumping around large source files.
Merge Conflicts
Search for merge-conflicts
in the Atom package installer.
A comprehensive tool for unpicking merge conflicts that you may see when merging in pull requests or other branches. This makes handling these kinds of conflicts much easier.
Pigments
Search for pigments
in the Atom package installer.
A neat little package for displaying color codes inline in your code. This makes it simple to get a sense of what color that random stream of characters actually relates to.
Color Picker
Search for color-picker
in the Atom package installer.
Another neat color-related package. Essentially, it makes picking a specific color as easy as navigating a color picker. Handy for when you need a slightly different shade of a color you already have.
Terminal Plus
Search for terminal-plus
in the Atom package installer.
An integrated terminal inside Atom. I have to admit, I don’t use this all the time (I often just use the system terminal), but this adds a nice level of completeness for those who may need it.
Linter
Search for linter
in the Atom package installer.
This is a powerful base Linter for ensuring you are writing, y’know, code that works. Apparently it has “cow powers” whatever that means.
In Conclusion
As I said earlier, editor choice is a very personal thing. Some of you will be looking at this and won’t be convinced about Atom. That is totally cool. Live long and edit in whatever tool you prefer.
Speaking personally though, I love the simplicity, extensibility, and innovation that is going into Atom. It is an editor that lets me focus on writing code and doesn’t try to force me into a mindset that doesn’t feel natural. Give it a shot, you may quite like it.
Let me know what you think in the comments below!
If you thought this was interesting, you might want to Join As a Member. This will ensure you never miss an article, you get access to exclusive member-only content, early-access to new projects and member-only events, and the possibility of winning free 1-on-1 workshops. It is entirely FREE and I will never sell your information or spam you (those people suck). Find out more here.
Blogging, Podcasting, or Video?
Over the course of my career I have been fortune to meet some incredible people and learn some interesting things. These have been both dramatic new approaches to my work and small insights that provide a different lens to look at a problem through.
When I learn these new insights I like to share them. This is the way we push knowledge forward: we share, discuss, and remix it in different ways. I have benefited from the sharing of others, so I feel I should do the same.
Therein lies a dilemma though: what is the best medium for transmitting thoughts? Do we blog? Use social media? Podcasting? Video? Presentations? How do we best present content for (a) wider consumption, (b) effectively delivering the message, and (c) simple sharing?
# Back of the Napkin
In exploring this I did a little back of the napkin research. I ask a range of people where they generally like to consume media and what kind of media formats they are most likely to actually use.
The response was fairly consistent. Most of us seem to discover material on social media these days and while video is considered an enjoyable experience if done well, most people tend to consume content by reading. There were various reasons shared for this:
* It is quicker to read a blog post than watch a video.
* I can’t watch video at work, on my commute, etc.
* It is easier to recap key points in an article.
* I can’t share salient points in a video very easily.
While I was [initially attracted to the notion](https://plus.google.com/+JonoBaconProfile/posts/a6p919RuzbG) of sharing some of these thoughts in an audio format, I have decided to focus instead more on writing. This was partially informed by my back of the napkin research, but also in thinking about how we best present thoughts.
# Doing Your Thinking
I recently read online (my apologies, I forget the source) an argument that social media is making us lazy: essentially, that we tend to blast out thoughts on Twitter as it is quick and easy, as opposed to sitting down and presenting a cogent articulation of a position or idea.
This resonated with me. Yesterday at a conference, [Jeff Atwood](https://www.codinghorror.com) shared an interesting point:
> “The best way to learn is to teach.”
This is a subtle but important point. The articulation and presentation of information is not just important for the reader, but for the author as well.
While I want to share the things I have learned, I also (rather selfishly) want to get better at those things and how I articulate and evolve those ideas in the future.
As such, it became clear that blogging is the best solution for me. It provides the best user interface for me to articulate and structure my thoughts (a text editor), it is easily consumable, easily shareable, and easily searchable on Google.
So, regular readers may notice that [jonobacon.com](https://www.jonobacon.com) has been spruced up a little. Specifically, my [blog](https://www.jonobacon.com/blog) has been tuned quite a bit to be more readable, easier to participate in, and easier to share the content with.
I am not finished with the changes, but my goal is to regularly write and share content that may be useful for my readers. You can keep up to date with new articles by following me on either [Twitter](https://twitter.com/jonobacon), [Facebook](https://facebook.com/jonobacon), or [Google+](https://plus.google.com/u/1/+JonoBaconProfile). As is with life, the cadence of this will vary, but I hope you will hop into the articles and share your thoughts and join the conversation.
An Experiment In Reviving Dead Open Source Projects
Earlier this week I did a keynote at [All Things Open](https://allthingsopen.org/). While the topic covered the opportunity of us building effective community collaboration and speeding up the development of Open Source and innovation, I also touched on some of the challenges.
One of these challenges is *sustainability*. There are too many great Open Source projects out there that are dead.
My view, although some may consider it rather romantic, is that there is a good maintainer out there for the vast majority of these projects, but the project and the new maintainer just haven’t met yet. So, this got me thinking…I wonder if this theory is actually true, and if it is, how do we connect these people and projects together?
While on the flight home I started thinking of what this could look like. I then had an idea of how this could work and I have written a little code to play with it. This is almost certainly the wrong solution to this problem, but I figured it could be an interesting start to a wider discussion for how we solve the issue of dead projects.
# The Idea
The basic crux of my idea is that we provide a simple way for projects to indicate that a project needs a new maintainer. The easiest way to do this is to add a file into the source tree of the project.
This file is an `.adopt` file which basically includes some details about the project and indicates if it is currently maintained:
For example:
[Project]
maintained = no
name = Jokosher
description = An audio multitracker built for the GNOME desktop.
category = Audio
repo = https://www.github.com/the-project
discussion = https://mymailinglist.com/jokosher
languages = Python
[Contact]
name = Bob Smith
email = [email protected]
Now, this is a crude method of specifying the main bits of a project and much of this format will need tuning (e.g. we could pull out languages and frameworks out into a new block). You get the drift though: this is metadata about a project that also indicates (a) whether it is maintained, (b) what the key resources are for someone to get a good feel for the project, and (c) who the contact would be to help a new potential maintainer come in.
With this file available in the source tree, it should be publically available (e.g. the raw file on GitHub). A link to this file would then be pasted into a web service that adds it to a queue.
This queue is essentially a big list of `.adopt` files from around the web. A script then inspects each of these `.adopt` files and parses the data out into a database.
This database is then used to make this list of unmaintained projects searchable in some way. For example, you could search by category or programming languages. While `maintained` continues to be set to `no` the project will remain on the list.
When a suitable maintainer steps up and the project is alive again, all the maintainer needs to do is set this `maintained` line to `yes`. On the next scan of the queue, that particular `.adopt` file will be identified as now maintained and it will be removed, thus not appearing in the database.
# A First Step
To provide a sense of how this could work I threw some Python together at [https://github.com/jonobacon/adopt-a-project](https://github.com/jonobacon/adopt-a-project).
It is built using [CherryPy](https://www.cherrypy.org/) to keep it simple. I wanted to avoid a full-fledged Django-type framework until the core premise of how this works is fleshed out. A caveat here: this is a really quick, thrown-together prototype designed to encourage some discussion and ideation.
It works like this:
* Run `website.py` to spin up a local webserver on `127.0.0.1:8080` that will display the empty queue. You can then add some remotely or locally hosted `.adopt` files by clicking the button at the top of the page. I have included three examples on GitHub [1](https://raw.githubusercontent.com/jonobacon/adopt-a-project/master/exampleadopts/example1.adopt) [2](https://raw.githubusercontent.com/jonobacon/adopt-a-project/master/exampleadopts/example2.adopt) [3](https://raw.githubusercontent.com/jonobacon/adopt-a-project/master/exampleadopts/example3.adopt). These are added to `queue.list`.
* You then run the `adopt-queue.py` that will scan the queue and create a sqllite3 database with the data.
* The website then includes a really simple and crude list of projects and the links to the relevant resources (e.g. code, discussion).
Now, as you can tell, I have only spent a few hours knocking this together and there are many things missing. For example:
* It doesn’t include the ability to search for projects or search by language.
* The schema is a first cut and needs a lot of care and attention.
* The UI is very simplistic.
* There is barely any error-checking.
# Topics For Discussion
So, this is a start. I think there are a lot of interesting topics for discussion here though:
* Is this core concept a good idea? There is a reasonable likelihood it isn’t, but that is the goal of all of this…let’s discuss it. 🙂
* If it is the core of a good idea, how can the overall approach be improved and refined?
* What kind of fields should be in an `.adopt` file? How do we include the most important pieces of information but also keep this a low barrier for entry for projects.
* What should be the hand-off to encourage someone to explore and ultimately maintain a project? A list of dead projects is one thing but there could be instructions, guides, and other material to help people get a sense of how they maintain a project.
* Maintaining a project is a great way for students to build strong skills and develop a resume – could this be a carrot and stick for encouraging people to revive dead projects?
* What kind of metrics would need to be tracked in this work?
To keep things simple and consistent I would like to encourage this discussion over on the [project’s issue tracker](https://github.com/jonobacon/adopt-a-project/issues). Share your comments, thoughts, and methods of improvement there.
Thanks!