Portland was one of the best Mozilla events I've ever attended --- possibly the very best. I say this despite the fact I had a cough the whole week (starting before I arrived), I had inadequate amounts of poor sleep, my social skills for large-group settings are meagre, and I fled the party when the music started.
I feel great about Portland because I spent almost all of each workday talking to people and almost every discussion felt productive. In most work weeks I run out of interesting things to talk about and fall back to the laptop, and/or we have lengthy frustrating discussions where we can't solve a problem or can't reach an agreement, but that didn't really happen this time. Some of my conversations had disagreements, but either we had a constructive and efficient exchange of views or we actually reached consensus.
A good example of the latter is a discussion I led about the future of painting in Gecko, in which I outlined a nebulous plan to fix the issues we currently have in painting and layer construction on the layout side. Bas brought up ideas about GPU-based painting which at first didn't seem to fit well with my plans, but later we were able to sketch a combined design that satisfies everything. I learned a lot in the process.
Another discussion where I learned a lot was with Jason about using rr for record-and-replay JS debugging. Before last week I wasn't sure if it was feasible, but after brainstorming with Jason I think we've figured out how to do it in a straightforward (but clever) way.
Portland also reemphasized to me just how excellent are the people in the Platform team, and other teams too. Just wandering around randomly, I'd almost immediately run into someone I think is amazing. We are outnumbered, but I find it hard to believe that anyone outguns us per capita.
There were lots of great events and people that I missed and wish I hadn't (sorry Doug!), but I feel I made good use of the time so I have few regrets. For the same reason I wasn't bothered by the scheduling chaos. I hear some people felt sad that they missed out on activities, but as often in life, it's a mistake to focus on what you didn't do.
During the week I reflected on my role in the project, finding the right ways to use the power I have, and getting older. I plan to blog about those a bit.
I played board games every night, mostly Bang! and Catan. It was great fun but I probably should cut back a bit next time. Then again, for me it was a more effective way to meet interesting strangers than the organized mixer party event we had.
I recently began studying tàijíquán (“tai chi”), the Chinese martial art.
Many years ago I spent a year or two pursuing shōtōkan karate. Shōtōkan, by most standards, is a “hard” martial art: it opposes force with force, using low, stable stances to deliver direct strikes.
Tàijíquán is an internal art, mixing hard with soft. To most observers (and most practitioners!) it’s entirely a soft, slow-moving exercise form. To quote Wikipedia:
The ability to use t’ai chi ch’uan as a form of self-defense in combat is the test of a student’s understanding of the art. T’ai chi ch’uan is the study of appropriate change in response to outside forces, the study of yielding and “sticking” to an incoming attack rather than attempting to meet it with opposing force. The use of t’ai chi ch’uan as a martial art is quite challenging and requires a great deal of training.
(Other martial arts are soft, but more immediately applicable: jujutsu, judo, and wing chun, for example.)
I see some parallels between the hard/soft characterization of martial arts and the ‘lifecycle’, if you will, of software engineers.
You might find it hard to believe (HTML needs a sarcasm tag, no?), but I was once a young, arrogant developer. I’d been hired at a startup in the US on the strength of a phone call, I was good at what I did, and there was an endless list of problems to solve. I like solving problems, and I liked that I could impress by doing so. And so I did.
I routinely worked 14-hour days. I’d get up at 7, shower, and head to the office. After work I’d go out for dinner with coworkers, then work until bed. I had no real hobbies apart from drinking with my coworkers, so my time was spent writing code. It’s so easy to solve problems when you can solve them yourself.
Eventually, after one too many solo victories over seemingly impossible deadlines, I was burned out.
Hard martial arts are very tempting, particularly to the young and able-bodied: they yield direct results. The better you get, the harder and faster you hit.
The problem with hard martial arts is that the world keeps making newer, tougher opponents, while time and each engagement are conspiring to strip away your own vigor. It takes a toll on your knees, your shoulders. Bruises take longer and longer to go away.
The software industry is like this, too. It will happily take as much time as you give it. Beating that last hard problem by burning a weekend will only win you a pat on the back and a new, bigger task to accomplish. Meanwhile your shoulders hunch, RSI kicks in, your vision worsens. You take your first week off work because the painkillers aren’t enough to let you type any more. You find out what an EKG is, what a sit-stand desk is, what physical therapy is like.
And while it looks like you’re winning — after all, you’re producing software that works — you’re accruing costs, too. You’re spending your future. Not only are you personally losing your motivation, your vitality, and a large part of your self, but you’re also building more software. Either you have to own it, or nobody really does. Maybe someone else should. Maybe it shouldn’t have been built at all. You think you’re winning, but you won’t know until later. And all along, your aggressive approach to building a solution alienates those around you.
A soft martial art tries to use your opponent’s strength and momentum against them. It yields and redirects. Ultimately, it asks whether you need to engage at all.
Hard martial arts eventually force you to confront your own fragility: “I can’t keep doing this”. So does software development, if you’re paying attention. You need to learn to ask the right questions, to draw on the rest of your team, to invest your time in learning and tools, in communication, and above all to invest in other people.
As the quote above suggests, this takes practice. But it works out best in the long run.
Almost every employee and a good amount of volunteers flew into Portland past week for a sort of “coincidental work week” which also included a few common events, the “All hands”. Since it was held in Portland, home to “Portlandia“, someone started calling this week “Mozlandia” and the name stuck.
I knew it was going to be chaotic and busy and so I not only didn’t make any effort to meet with non-Mozilla-related Portlanders, but actively avoided that. When the day has been all about socialising from breakfast to afternoon, the last thing you want is to speak to more people. Also, I am not sure how to put this, but the fact that I visit some acquaintance’s town doesn’t mean that I am under any obligation to meet them. Sometimes people get angry that I didn’t tell them I was visiting and that’s not cool
Speaking about not-coolness: my trip started with two “incidents”. First, I got mansplained at the Heathrow Airport by an Air Canada employee that decided to take over my self-check in machine, trying to press buttons on the screen and answering security questions for me instead of just, maybe, allowing me to operate it as I was doing until he came and interrupted me, out of the blue. There was no one else in the area and I have no idea why he did that, but he got me angry.
Then the rest of the trip went pretty much as usual, with no incident. It was fun to spend layover time at the Vancouver Airport with Guillaume and Zac from the London office, and then share the experience of the Desolate Pod of Gates that is home to the mighty Propeller Planes.
I was really tired by the time I made it to my hotel–it was well past 6 AM in London time and I had been up for almost 24 hours with no sleep except for the short nap in the Vancouver-Portland flight, so the only thing I wanted was to make it to my room and sleeeeep. I got into one of the hotel lifts, and just as the doors were almost closed, someone waved their arm in and the doors opened again. Three massively tall and bulky men entered the lift and pressed some buttons for their floor, while I kept looking down and wondering how would the room look like and whether the pillows would be soft. And then I noticed something… something being repeated several times. I started paying attention and turns out that one of the men was talking to me. He was asking me:
How are you? How are you?
But I hadn’t replied because I was on my own world. So he repeated it again:
How are you?
So here’s the thing. When you’re that tired you have zero room for any sort of bullshit, and I was really, really tired. But those men were also really, really huge, compared to me. So I looked at him and I was really willing to give him a piece of my mind, but the only thing I said was
Maybe that is none of your business.
And luckily the doors for my floor opened and I didn’t have to stand their looks of “disappointment because I hadn’t been nice to them” any longer.
I suddenly felt very unsafe because I hadn’t been nice to them.
Were them following me? Should I request my room to be changed to a different floor? Was there anything I was wearing that would be distinctive and would they be able to identify me the following days?
It took me a while to get asleep because I kept thinking about this, but eventually I got some sound slumber, hoping for an incident-free Sunday.
And it was a great, sunny and very COLD Sunday in Portland. Temperatures were about 0 degrees, which compared to London’s 12 degrees felt even colder. I kept going to warm closed places (cafes! shops! malls!) and then back to the glacial streets, so by Monday morning my body had decided it hated me and was going to demonstrate how much with a number of demonstrations. First came the throat pain, then tummy ache, sneezing, the full list of winter horrors.
This made me not really enjoy the whole “Mozlandia” week. I was in an state of confusion most of the time, either by virtue of my sinuses pressuring my brain, or just because of the medicine I took. It was hard to both follow conversations and articulate thoughts. I hope I didn’t disappoint anyone that wanted to meet me this week for SERIOUS BSNSS, but I was generally a shambles. Sorry about that!
And yet despite of that, I still had some interesting discussions with various people at Mozilla, both intentionally and accidentally, so that was cool. Some topics included:
- how can we work better with the Platform team (the ones implementing browser APIs, for those not in the Moz-know) so we know for certain which features are planned/implemented and with which degree of completion, and so we can give better advice to interested devs, and how can we improve the way we provide the feedback we get from developers at events, blog posts, etc. By the way: there’s a huge amount of cool new APIs coming up! this is neat
- future plans for the Web Audio API and the Web Audio Editor in Firefox DevTools, and also a general discussion on the API architecture and how it often takes developers by surprise, and whether we can do anything about that from a tooling point of view or not. Also, games, performance, and mixing other APIs together such as MediaRecorder.
- the Web Animations API and support for visualising that in the devtools-with keyframes and time lines and all that good, exciting stuff! It got me thinking about whether it would be possible to make another build of tween.js or some sort of util/wrapper that uses the Animations API internally. Food for thought!
- future Air Mozilla plans, including making it easier to upload content both from a moz-space and from an offline recording, and support for subtitles in various languages. I liked that they stress the fact that content does not need to be in English–after all, the Mozilla community speaks many languages!
- Rachel Nabors told us about her animation/authoring process to create interactive experiences/comics using just HTML+JS+CSS. This was really enlightening and while I don’t have all the answers to the issues yet, it got me thinking about how can we make this easier and more enjoyable for non-super-tech-savvy audiences. There were cries for a Firefox Designer Edition too–we joked that it would come with some extra colorpickers because why not?
I had to skip a couple of evenings because my immune system was just too excited to be on call, and so I stayed at my room. I didn’t want to go to sleep too early or the jetlag would be horrible, so I stayed awake by building a little silly thing: spoems, or spam poems (sources). I want to use it as a playground to try CSS stuff since it’s mostly text, but so far it’s super basic and that’s OK.
It was funny that this… morning? yesterday afternoon…? other mozillians that were flying back to London in the same plane than me were telling about the best of the closing party and internally I was like “well, I just drank some coffee and listened to Boards of Canada and then had ramen and watched random things on the Internet, and that was exactly what I needed”.
And that was my “Mozlandia”. What about yours?
What a wonderful all hands we had this past week. The entire week was full of meetings and planning and I must say I was exhausted by Thursday having been up each day working by 6:00am and going to bed by midnight.
I’m very happy to report that I made a lot of progress on meeting with more people to discuss the future of Firefox Extended Support Release and how to make it a much better offering to organizations.
I also spent some time talking to folks about Firefox in Ubuntu and rebranding Iceweasel to Firefox in Debian (fingers crossed something will happen here in 2015). Also it was great to participate in discussions around making all of the Firefox channels offer more stability and quality to our users.
It was great to hear that we will be doing some work to bring Firefox to iOS which I think will fill a gap that has existed for our users of OSX who have an iPhone. Anyways, what I can say about this all hands is that there were lots of opportunities for discussions on quality and the future is looking very bright.
Also a big thanks to Lukas Blakk who put together an early morning excursion to Sherwood Ice Arena where Mozillians played some matches of hockey which I took photos of here.
In closing, I have to say it was a great treat for Macklemore & Ryan Lewis to come and perform for us in a private show and help us celebrate Mozilla.
Again, it’s that time of the month where we show gratitude to the best of the Reps program.
Flore Allemandou is one of the oldest mozillians around, being a Mozilla Rep for a long time too. In the last months she took lead of the WoMoz project coordinating our activities in this area. She also organized our presence at the Adacamp editions in Berlin and Bangalore.
At the MozFest she was one of the most active Reps around, helping out by leading sessions from community Building and diversity to even flash around 80 Flame devices. As part of the Mobilizers in France she organized several event in Lyon and Paris helping with our Firefox OS Launch there.
As this wasn’t enough, she organized Mozilla’s presence at Open World forum and Code of war. Locasprint was also another of the last months events together with some great photos for the Firefox 10 Celebration.
Thank you Flore for your amazing work!
Socorro has a master list of fields, called the Super Search Fields, that controls several parts of the application: Super Search and its derivatives (Signature report, Your crash reports... ), available columns in report/list/, and exposed fields in the public API. Fields contained in that list are known to the application, and have a set of attributes that define the behavior of the app regarding each of those fields. An explanation of those attributes can be found in our documentation.
In this guide, I will show you how to use the administration tool we built to manage that list.
You need to be a superuser to be able to use this administration tool.Understanding the effects of this list
It is important to fully understand the effects of adding, removing or editing a field in this Super Search Fields tool.
A field needs to have a unique Name, and a unique combination of Namespace and Name in database. Those are the only mandatory values for a field. Thus, if a field does not define any other attribute and keeps their default values, it won't have any impact in the application -- it will merely be "known", that's all.
Now, here are the important attributes and their effects:
- Is exposed - if this value is checked, the field will be accessible in Super Search as a filter.
- Is returned - if this value is checked, the field will be accessible in Super Search as a facet / aggregation. It will also be available as a column in Super Search and report/list/, and it will be returned in the public API.
- Permissions needed - permissions listed in this attribute will be required for a user to be able to use or see this field.
- Storage mapping - this value will be used when creating the mapping to use in Elasticsearch. It changes the way the field is stored. You can use this value to define some special rules for a field, for example if it needs a specific analyzer. This is a sensitive attribute, if you don't know what to do with it, leave it empty and Elasticsearch will guess what the best mapping is for that field.
It is, as always, a rule of thumb to apply changes to the dev/staging environments before doing so in production. And to my Mozilla colleagues: this is mandatory! Please always apply any change to stage first, verify it works as you want (using Super Search for example), then apply it to production and verify there.Getting there
To get to the Super Search Fields admin tool, you first need to be logged in as a superuser. Once that's done, you will see a link to the administration in the bottom-right corner of the page.
Clicking that link will get you to the admin home page, where you will find a link to the Super Search Fields page.
The Super Search Fields page lists all the currently known fields with their attributes.
On the Super Search Fields page, click the Create a new field link in the top-right corner. That leads you to a form.
Fill all the inputs with the values you need. Note that Name is a unique identifier to this field, but also the name that will be displayed in Super Search. It doesn't have to be the same as Name in database. The current convention is to use the database name but in lower case and with underscores. So for example if your field is named DOMIPCEnabled in the database, we would make the Name something like dom_ipc_enabled.
Use the documentation about our attributes to understand how to fill that form.
Clicking the Create button might take some time, especially if you filled the Storage mapping attribute. If you did, in the back-end the application will perform a few things to very that this change does not break Elasticsearch indexing. If you get redirected to the Super Search Fields page, that means the operation was successful. Otherwise, an error will be displayed and you will need to press the Back button of your browser and fix the form data.
Note that cache is refreshed whenever you make a change to the list, so you can verify your changes right away by looking at the list.Editing a field
Find the field you want to edit in the Super Search Fields list, and click the edit icon to the right of that field's row. That will lead you to a form much like the New field one, but prefilled with the current attributes' values of that field. Make the appropriate changes you need, and press the Update button. What applies to the New field form does apply here as well (mapping checks, cache refreshing, etc. ).
Find the field you want to edit in the Super Search Fields list, and click the delete icon to the right of that field's row. You will be prompted to confirm your intention. If you are sure about what you're doing, then confirm and you will be done.
We have a tool that looks at all the fields known by Elasticsearch (meaning that Elasticsearch has received at least one document containing that field) and all the fields known in the Super Search Fields, and shows a diff of those. It is a good way to see if you did not forget some key fields that you could use in the app.
To access that list, click the See the list of missing fields link just above the Super Search Fields list.
The list of missing fields provides a direct link to create the field for each row. It will take you to the New field form with some prefilled values.
I think I have covered it all. If not, let me know and I'll adjust this guide. Same goes if you think some things are unclear or poorly explained.
If you find bugs in this Super Search Fields tool, please use Bugzilla to report them. And remember, Socorro is free / "libre" software, so you can also go ahead and fix the bugs yourself! :-)