10 interesting stories served every morning and every evening.
This is a system I only somewhat tongue in cheek refer to as “The Fully General System For Learning To Do Hard Things”. It’s a useful conceptual framework for how to get better at things that you currently ﬁnd difﬁcult.
I don’t always explicitly follow it, but I often ﬁnd that when I’ve succeeded my success comes from implicitly following it, and almost every time someone asks me for advice on learning to do things I just describe a specialised version of the system to them.
The system “always” works in the sense that “eventually” either you will ﬁnd out why the objective is impossible for you or you will succeed, but it’s very much the unhelpful kind of eventually where there’s no guarantee that it won’t take an interminably long time. The more likely outcome is that either you will succeed relatively quickly or get bored and give up, but that’s OK — the system is designed so that you will have gained beneﬁt from following it at every step along the way even if you do not achieve your ﬁnal goal.
I should also note that this system is not in any way a short cut. It’s a lot of work. The goal of the system is not to save you work, it’s to ensure that the work you do is useful.
When you know what success looks like but cannot currently achieve it, the system works as follows:
Find something that is like the hard thing but is easy. Modify the easy thing so that it is like the hard thing in exactly one way that you ﬁnd hard.Do the modiﬁed thing until it is no longer hard.If you get stuck, do one of the following: Go back to step 3 and pick a different way in which the problem is hard.Recursively apply the general system for learning to do hard things to the thing you’re stuck on.Go ask an expert or a rubber duck for advice.If you’re still stuck after trying the ﬁrst three, it’s possible that you may have hit some sort of natural difﬁculty limit and may not be able to make progress. If the original hard thing is now easy, you’re done. If not, go back to step 2.
The reason this works much better than just practicing the hard thing is because it gives you a much more direct feedback loop. There is exactly one aspect of the problem at any time that you are trying to get better at, and you can focus on that aspect to the exclusion of all else. When you are practicing something that is difﬁcult in multiple ways, you will be bad at it in all of those ways. More, you will be worse at it in all of those ways than you would be if you’d tried them on their own. Additionally, when you fail you have to do a complicated root cause analysis to ﬁgure out why.
Instead, by isolating one aspect of the problem that is difﬁcult, you will fairly rapidly improve, or hit the limits of your ability.
If you don’t know what success looks like, you need to do double loop learning, where you mix improving your understanding of the problem with your ability to execute the solution.
Apply the single loop system to the problem of improving your understanding of the problem space (e.g. consume lots of examples and learn to distinguish good from bad) in order to acquire a sense of good taste.Apply the single loop system to the problem of doing well according to your own sense of good taste.Get feedback on the result from others. Do they think you did it well? If yes, great! You’re good at the thing. If no, either improve your sense of taste or theirs. If you choose yours, go back to step 1 with the new example. If you choose theirs, apply the single loop system to the hard problem of convincing others that your thing is good.
Is this all a horrible oversimpliﬁcation? Well, yes, of course it is. It is however a very useful horrible oversimpliﬁcation that is very good for getting you unstuck when problems seem intractable.
How To Identify Points of Difﬁculty
Sometimes it will be obvious what you need to improve, sometimes it won’t. When it doesn’t, here are some things that can help you ﬁgure it out:
Try to do the thing as best you can. Don’t worry about failing, failing is expected, but try to pay attention to how you’re doing it. Write down a list of things you thought you did badly, and things you did adequately but struggled with. Also if at some point you got stuck, note where you got stuck.Look for beginners exercises for the area you want to work on and try a variety of those. Observe which ones are hard.Talk to an expert on the subject (ideally one who is used to teaching) and ask them to help you identify some areas you need to work on.Rather than starting from the easy thing, work in the other direction. Try taking the hard thing and removing one hard aspect of it at a time until you get it to a point where removing any hard aspect would make it easy.
Worked Example: Learning to Write Better
This is particularly good as a mechanism for improving your writing (and writing about it is a good lead in to the mechanism on a particular area, so I’d encourage everyone to work on improving their writing).
Writing can be hard in a wide variety of ways. Some common ones (in roughly the order I think it’s worth tackling them) are:
Perfectionism and/or fear of showing others your work and/or not being sure what to write about stopping you from the process of starting to write about it.
And that’s even before you get into speciﬁc forms of writing. You could also struggle with e.g. dialogue, description, etc.
Set against this is the fact that if you’re reading this you definitely can write. I promise. You might not be able to write a novel (I can’t at the moment), but you can certainly write a tweet, and it’s just a series of incremental steps to get from there to wherever you want to be.
Learn to touch type if you can’t already. If you can’t touch type you will get blocked on the basic mechanics of writing. This makes the feedback loop for everything harder. Maybe try ztype, typesy, or Mavis Beacon Learn to write in your speaking voice. If you can’t ﬁgure out how to write about a topic, try speaking about it into your phone (get a recorder app). Once you’ve started writing, try to read it out loud. This isn’t the only writing voice worth using, but it’s an important one.Practice writing without any expectation of quality. e.g. write in a private ﬁle or google doc, or create a blog with an explicit disclaimer that it’s for writing experiments. Some good writing experiments:Observational writing. Pick an object (a lit candle is an interesting one) and write down everything you notice about it.Pick a subject you are reasonably familiar with and set yourself a word count of, say, a thousand words. You can write whatever you want as long as you hit that goal. Feel free to write a stream of consciousness.Pick an opinion of yours and write a 500 word case for it.Rather than worrying about the general problem of editing, start thinking about editing with speciﬁc goals. e.g.This ties in well with getting a good writing voice. Read it out loud, ﬁgure out where good pauses are and put paragraph breaks in where natural pauses occur. Fix language that sounds awkward.Try editing purely based on word count. Can you express the same thing with fewer words? What would you do if you had to cut the length of the piece in half?Try editing ot remove speciﬁc words. Can you write the whole thing in up goer ﬁve? (Note: The result of doing so will be terrible, but the goal here is to practice editing more than produce a good piece)
There are plenty of other things to try, but these are some good starting points.
I’m sharing the story of a bad situation I had ordering a new phone through Google Fi. It turned into a two month long ordeal where the service got worse and worse. At every turn the Google Fi team was presented with a chance to make things better and every time they blew it. I’m sharing this because I hope a long form review of the process is helpful to other potential Google Fi customers.
I’ve been a Google Fi customer since Sept 2016, when it was called Project Fi. Recently I decided to update to a new phone, so I ordered a Pixel3 through their website. With Fi you can get a phone up front and then make zero-percent interest payments as part of your bill. Once you’ve paid for the phone, at no more total cost than if you’d prepaid for the whole thing, it’s yours free and clear. I bought my ﬁrst Fi-supported phone, a Nexus 5X, this way and it was very simple. I also tacked on $7/month “device protection” to my bill. So in total my bill would jump $35 a month.
The device shipped the same day I ordered it. A few days after shipping I noticed that my package had not updated on Fedex’s website. So I began to seek customer service help. That’s when things took a turn for the worse.
Google Fi has a “chat with customer support” feature that is integrated into their website and Android app. So I chatted with a rep about tracking down my phone. I got a very polite answer that yes they can conﬁrm that the last Fedex entry lists my package on truck to be delivered. The rep escalated my case to the “shipping and returns” department and said I should expect an email in a few days.
After a few days I received no email. So I started up another chat had the same response: “email coming, wait a few days, we have to complete our investigation about how your package got lost”. This happened three times over the course of a week. Each time I would wait patiently a few days, get no email, and then chat with them. On the third chat I ﬁnally got the representative to give me a case number. When they again promised an email I starting to get a little upset so I asked to speak to a customer retention specialist. At this point I wasn’t really planning to cancel my account but I ﬁgured somebody in the “customer service of last-resort” department would surely be empowered to help me out. The rep told me that they don’t have such a department and that if I wanted I could always cancel my account online. At this point I was a little stunned. I’ve never heard of a business that was receiving monthly recurring revenue act so quickly throw it away. I then realized that I couldn’t cancel my account because I’d be on the hook for the whole $600 for the phone. If I canceled my account I would also lose all access to customer support since Google Fi doesn’t have a public email or phone. I was effectively forced to stay a customer until I had this resolved.
After a few days I received my next monthly bill, the ﬁrst one to include charges for my new phone. Paying $35 for a phone I don’t yet have is a bit frustrating, so I decided to reach out to Google Fi on Twitter. I assumed a bit of public shaming would kick them into gear.
After getting strung along with a series of “we’ll get back to you in 24 hours” from @googleﬁ customer support, they would rather lose my business entirely rather than cancel a lost-in-shipping new phone order.
Hi Jason. That’s not the experience we want you to have. We’d like to look into this. Please follow us & let us know when you do so we can reach out over DM.
I thought, “Ok great now I can get this resolved.” However once we switched to a private direct message conversation I got the same “Hang tight we’re work on it”. After checking in politely for a few days they ﬁnally stopped responding to my messages.
A week later I ﬁnally called them on the phone. It took explaining and re-explaining my situation to several representatives before I was escalated to “Chris” a supervisor. Chris was the ﬁrst customer service rep to go “off script”. He was incredibly apologetic and jumped into action to, as I asked, “Cancel my phone, issue a refund, then complete your investigation on your own time.” He said “No problem. I’ll get back to you in twenty minutes.” Sure enough, after twenty minutes he called back. “Ok Jason, I’ve worked with my shipping specialist we’ve got a new phone on the way to you.” I was getting upset at this point. However I remained calm and said “What I initially told you was that I wanted was to cancel the order. I no longer want this phone. I’ve been a month since you shipped the phone and I can’t wait to get a new phone.”
His response was that “It’s too late. We’ve already processed this order. What you can do is just “refuse delivery” when Fedex delivers the package. It will get returned to us and then we can refund you.” Wow I was stunned. It took them a month to handle this. They never once reached out to me. I always had to call them directly. Now that they are able to handle the situation they acted so fast that they can’t even redact the order? If I had known how much worse it would get I would have forced them to cancel the shipment right then and there. It’s not like in the twenty minutes since my ﬁrst call with Chris that the package was already on a Fedex truck.
So I waited patiently for the new phone to arrive. I stayed home to make sure I was there when it was delivered. I had to politely tell my regular Fedex delivery man that I was refusing shipment. Luckily Fedex automatically provides return shipment tracking numbers. So over the next two days I watches as it was returned to Google and who signed for it. I thought that this would ﬁnally be the end of the situation. But no, it gets crazier.
Another week passed after they received my return. I never heard anything from them so I again called customer support. The customer service rep explained that they need to inspect the phone and make sure it’s working/functional before a full refund. That sounded a little silly since it was in the same box. But in a way it did make sense. I’m sure lots of people scam/steal phones this way: order phone, open the package, remove phone, return empty package, and get refund all before seller realizes phone is missing. So I waited patiently for a few more days.
At this point I got busy and had to travel for work (more on this later). A week went by and I got my next bill. Again with the $35 charge for the phone I still don’t have.
I called them again. This is when my frustration level hockey-sticked from “I’m mad but I’ll probably stay a customer” to “This has to be a joke, right?”.
I talked to one customer service rep and explained the whole situation. They agreed to transfer me to a supervisor. I then spent twenty minutes on hold while they waited to track one down. Eventually they said ,”We’ll have supervisor call you in ten minutes”. I said OK. After ﬁfteen minutes passed I called them again.
I then talked to “Judy” who said they’ve escalated to shipping and returns department, and that I should expect an email. I had to force her to escalate me to a supervisor. This time, after 35 mins on hold the call dropped.
So I called back a third time. This time I talked to “Nico” who immediately tried to transfer me to a supervisor. Fifteen minutes on hold and the call dropped again.
This whole time I was on the phone with headphones and I was able to keep doing work at my computer. So I had no problem calling/waiting/calling/waiting until they put me through. So I called back a fourth time and talked with “Alicia” who ﬁnally transfers me to “Steven”, a supervisor.
Steven says he’d look at my case and puts me on a brief ten minute hold. He comes back to say he was still having trouble ﬁnding the tracking numbers! I said, “No problem I have them right here in front of me.” I read him the shipping/return numbers and he put me back on hold. I made sure he had my number is case we get disconnected.
I thought “Finally, this is it. I’ve reached a supervisor, I know they have my phone. I know it’s been long enough to have checked it out. He’ll just type a few lines in his terminal and boom I’ll have a credit for $70 (two months of payments).”
Steven ﬁnally came back on the line to say he cannot refund me my money because the ‘remittance period’ had expired. At ﬁrst I thought he was joking. I did a half-nervous laugh and then he explained that he was serious. Apparently Google Fi provides a three week window where customers can return a phone if they don’t like it for whatever reason. For me, that date was the same day I ﬁrst reached out to them on Twitter! So I asked Steven, “Back when I talked to Chris and asked him to cancel phone, and he sent me a new one anyways, that my remittance period had already expired? And that as a supervisor, Chris should have known that I couldn’t actually return the phone. All of this is in-addition to the fact that I had not even received a phone yet?” He said yes. That is when I ﬁnally lost it.
I am proud to say that up to this point in my life, I had never cursed at a customer service rep, even over the phone. But I definitely dropped a few F-bombs and started yelling. In a heated voice I walked Steven through the full timeline:
3/22/2019: Last known Fedex entry: “Friday , 3/22/2019 8:11 am NORCROSS, GA On FedEx vehicle for delivery”
Several dates ﬁrst week in 4/2019: I chatted with at least three representatives. Each one said “expect an email in 24 hrs. It’s being handled by our shipping department.” Each time I never received an email. I had to then reach out to them. The last one ﬁnally gave me a case number.
4/9/2019 I receive my monthly bill. First bill with new charges for new phone
4/10/2019 Unbeknownst to me, my remittance period has expired. I can no longer send the phone back if I’m unhappy with it.
4/15/2019 I reached out to them on Twitter. They said “hang tight, we’ll respond ASAP”
4/16/2019 I followed up on Twitter asking for status, Same “hang tight”
4/17/2019 I followed up on Twitter asking for status, Same “hang tight”
4/18/2019 I followed up on Twitter asking for status. No response
4/19/2019 I followed up on Twitter asking for status. No response
4/22/2019 I called them. I ﬁnally talked to a supervisor “Chris”. They are sending me a new phone ASAP (which I did not ask for). Said it’s too late to cancel, that my new order has already been processed, and that I need to just return the package when it arrives.
4/26/2019 Return package received by Google, says Fedex. Signed by XXX
5/1/2019 I called them: They need to inspect return phone before full refund
5/9/2019 I receive my monthly bill. Second bill with new charges for new phone.
5/15/2019 5:15pm On hold for 20 minutes. I ﬁnally have to escalate to supervisor. Trying to get supervisor, will callback in 10 minutes. No phone call. I call them after 15 minutes
5/15/2019 6:03pm Talked with Judy. Again she kept me on hold for 20 minutes to then come back and say “We’ve escalated this to shipping and refunds, they will send you an email.” I have to force her to put her supervisor on the phone and only then does she actually do anything. While on hold (35 min at this point) the phone call just dropped.
5/15/2019 6:40 pm Talked with Nico, immediately tried to transfer me to supervisor. While on hold (12 min at this point) the phone call just dropped.
5/15/2019 7:05 pm Talked with Alicia who transferred me to Steven a supervisor.
At this point Steven reiterated that he did not have the authority to refund me after my remittance period and that he would escalate my case even further to his supervisor and that I should expect an email in a few days. I told him that I need to solve this problem right now and everyone along the way has promised me an email and then not delivered. I did not expect him to do anything differently. He essentially stoned walled me into hanging up.
As you can guess by now, two days went by and I didn’t receive an email from Steven. So in a ﬁnal attempt I called one last time. I talked to “Rod” an entry level customer support rep. I tried to immediately get transferred to a supervisor but Rod required me to walk through my entire case ﬁrst. I was ﬁnally transferred to a supervisor “Persh”.
I explained to Persch that I had been talking with Steven and had been expecting an email from him, that he promised me an email in two days. Her only response was “I don’t know why Steven did that. I never give out a time about when people should expect an email.”
At this point I’d already decided that unless they were going to ﬁx the problem, now two months long, I was going to cancel my account. Now that they had the phone, I was only on the hook for $70 plus half a month’s bill of unused data. So as before, I asked to speak to a customer retention specialist. Persh explained that they don’t have a customer retention department. She said that Google Fi doesn’t have contracts and its customers are free to cancel any time. She then walked me through how to cancel online. I thanked her for her time and hung up.
I want to be clear. I’m not looking for any sympathy. My grandfather always said “It’s either a good time or a good story.” Well this is (I hope) a good story, and maybe a lesson for people on both sides of customer service.
These kinds of problems don’t happen on accident. This has to be systemic at Google Fi. The ﬁrst thing I did was conﬁrm that I’m not alone in my troubles with Google Fi:
“My beef is with the internal business structures and systems that Fi has built; or rather, not built.”
“When I mentioned that it was not acceptable, and that would leave me no option but to leave Fi, she responded “you can cancel Fi any time” and incorporated the “how-to-leave” instructions in her email response.”
“Getting this ﬁxed is actually impossible”
I’ve had my fair share of bad customer support before. But eventually you work up the supervisor chain and somebody goes off script, realizes the mistake they’ve made, and in a very human way corrects the problem. This didn’t happen at Google Fi. This is not the product of a few bad customer service reps. There have to be rules/systems/metrics in place that don’t catch these mistakes or possibly even encourage them.
Customers don’t differentiate branches of a company when thinking about brand identity. I had a problem with one branch of Google: Google Fi, but that jeopardized my entire opinion of the company. I love Google as a company. Most people probably don’t say that. I pay for Google Fi, Google Fiber, Youtube Red, apps + in-app purchases through Google Play, Google Play Music subscription, and Nest products. My company pays for corporate Google apps (Gmail, Cal, Drive, etc.). Then there are all the Google services where I’m not the customer, I’m the product: Search, Chrome, Photos, and Google Home. The cherry on top is that as an Android developer, I was at Google’s yearly developer conference while this was happening. I was literally at their headquarters in Mountain View, CA during some of this. I started looking into canceling some of the lesser-needed services like Music and Youtube Red.
Escalate early. As soon as somebody in a customer service chat or email is not getting your problem solved call and talk to a real person. I wasted so much time by being a patient helpful customer. As soon as the ﬁrst promised email did not arrive, I should have been on the phone getting real answers. It is so easy for someone in a chat to read off a script and blow you off.
As soon as a telephone support person tries to pass you off with a “somebody will email you” escalate to a supervisor. You goal is not to be patient. Your goal is to ﬁnd someone who can solve your problem ASAP.
Document everything. Write down dates, times, conversation points, who will do what and when. Get peoples’ names. Then if support drags on you can maintain some sanity and hold people accountable.
Don’t lose your cool. I wish I hadn’t cursed on the phone with that rep. It brought me down to their level. It was cathartic in the moment, but in the end I probably partially justiﬁed the bad service. I know if I’d been spoken to like that my reaction after hanging up would have been “Screw that guy. He deserves it.”
You have to be willing to walk away from a company. This one is tough but you have to be willing to say “If you can’t solve my problems I’m leaving.” See what they say. If they don’t bend over backwards to keep you then you know things are not going to get better.
This isn’t a big, faceless company problem. The perfect example of this is Amazon. If you’ve ever interacted with Amazon customer service then you know how great it can be. Their initial reps are empowered to solve all sorts of problems and their one goal is to get you back to being happy ASAP. Lost a package? No problem; immediate refund. You don’t like an item and want to return it? No problem; immediate refund.
Don’t underestimate the value of a physical store. About a year ago I tried to get my parents to switch from AT&T to Google Fi. I even made a spreadsheet for my dad (who likes those sorts of things) about how much money he could save. He wasn’t interested. His one point was that at anytime he can go in and get help from an AT&T rep. I kept asking “Who cares? Why would you ever need that?”. Now I know. He was paying almost $60 a month premium for the opportunity to able to talk to a real person, face-to-face! I would gladly pay that now.
The silver lining in all of this is that instead of getting a year old Pixel 3, the process took so long that in the interim the Pixel 3A was released. So I just bought a 3A from where else.. Amazon. I also had to shop for cell plans for the ﬁrst time in three years. I didn’t realize how cheap plans have gotten. In that time I’ve used calls + text way less and data way more. So data-only plans are starting to look more appealing. Also $10/ Gb has become pretty standard.
All those extra things Google Fi is known for aren’t that great after all. I was initially drawn in because Fi phones automagically jump carrier based on reception. Being the android developer I am, I wrote a little script to track which Mobile Network Code I’m connected to. Turns out I was on T-Mobile’s network 90% of the time anyways. So a T-mobile contract-free plan was pretty comparable.
I also liked that Fi works in so many countries. I of course bought into this, thinking that I would travel all the time but honestly I haven’t. Based on other reviews that I’ve read, it’s easy to spend a bunch on Fi when traveling. It may work, but it’s going to be very expensive. The next time I travel internationally I’ll just pick up a pre-paid burner phone in the local country.
Having unlimited data allowed me to be on my phone all the time. Now that I have to think about my data usage a little bit it has really curbed my “junk time” on my phone. With all the focus lately about “Digital Wellbeing” and disconnecting from social media, the easiest way to do that is probably just limit your cell’s data plan.
It’s been a huge bummer that Google Fi screwed up so royally. I hope for other current and future customers that they can get it together.
While still in college (go Broncos!), I teamed up with Alex (@slevenbits) to create a startup. We were young, inexperienced and naive. Our ﬁrst project was called YippieMail and it was an email aggregator. Simply put, YippieMail could display all your webmail accounts (i.e. Hotmail, Yahoo and Gmail etc) in the same web interface (this was before most email providers supported IMAP, so you couldn’t use an email client). Looking back at it, YippieMail was a pretty stupid idea, but it did land us meetings with Sequoia Capital and few other VCs on Sand Hill Road. Keep in mind that this was around the time Meebo raised many millions from Sequia and DFJ to do the same thing but for Instant Messaging (IM), so at the time it probably did not seem as such of a bad idea.
It was in the early days of YippieMail, which was pivoted into YippieMove (RIP 2008-2019) my now decade-long remote experience began (some of which as a digital nomad).
When we began working on YippieMail, Alex was living in San Jose, and I was living in Mountain View. For those of you not familiar with the Bay Area, these two cities are not very far apart, but when you factor in the horrendous trafﬁc conditions, it can easily take well over an hour to drive between the two (while it might only take 20-30 minutes without trafﬁc). It was then we decided to work remotely rather than getting an ofﬁce somewhere in between. Ever since, in all our subsequent ventures (Blotter, and then Screenly) have been remote-only.
To this day, even though both Alex and I both live in London, we only get together every other month or so in person to catch up. Moreover, in my new venture (WoTT), we have adopted this remote philosophy even if both founders are located in London.
So what have I learned over this decade of working and running remote teams? Let’s dive in.
The ﬁrst thing that I would like to point out is that remote working is not for everyone. Over the years, we have had a few team members that could not work remotely. In some cases these people discovered this themselves and chose to leave, and in some other cases it became clear that it was not a match.
Usually, people who fail at remote work tend to either lack the self-discipline it requires, or they are simply socially oriented and thrive being around other people. In the latter case, working from a shared ofﬁce can help, but even then, if you lack the self-discipline and habits required, you are likely not going to thrive. While there are plenty of exceptions to this rule, young people (early 20s) tend to struggle more with this than people who have reach their late 20s and early 30s.
The bottom line is that some people excel while working remotely, while others work better in a regular ofﬁce environment. It’s hard to screen for this in an interview, but it usually becomes evident during the ﬁrst year. It is important to look out for this in team members as a manager.
Either you’re remote-only or you don’t do remote at all. Lots of companies brag about giving their staff the freedom to work remotely. However, the reality is that unless it is in your companies DNA to be a remote company, it will inevitably favor the team members that are working in the ofﬁce (in particular if this is where the leadership is). The reason for this is largely related to the ﬂow of information. People chat over the water cooler, over coffee or over drinks after work. This leads to unevenly distributed information, which easily can make people feel left out or that other team members simply assumes everyone else knows about something despite it never made it to the ofﬁcial channels. In a remote-only culture however, the information ﬂow tends to happen in a more organized fashion either over email or in the company chat rooms (or even in Github Issues).
Company summits matter a lot. Even if you’re a remote team, having everyone get together in person every year (or twice a year) can make a huge difference. While video chats is a higher context medium than email or chat, it still isn’t a full substitute for meeting face-to-face. When we did our very ﬁrst summit for Screenly at the lovely Villa Lava in Croatia (a great place for company summits), it was the ﬁrst time our team members got to meet each other in person, despite having worked alongside each other for years. In retrospect, it was a big mistake of not doing summits earlier, as we could see a big difference in how the communication changed online after the summit. Because text based chat is a low context medium, it’s very easy to misread the intent of a message. However, if you have met this person in real life, you have a lot more to work with and can use that context to read the same message in a new light. These days, the developers at Screenly get together in person every quarter (roughly) for a one week summit, and the entire company gets together annually. (You can read more about how we work at Screenly in the article How we work at Screenly that I wrote a few years ago.)
Hiring remote means a larger talent pool. I’m hardly the ﬁrst to point this out, but one of the major reasons why it makes sense to be remote-only. You are no longer limited to hiring in your geographic area. The tools for recruiting have changed a lot over the last decade since I started working remotely. That said, recruiting is far from easy. Because people from around the world are able to apply to your openings, the second you post a job ad, the ﬂoodgate opens. The reality is that 99.9% of the applicants for remote jobs are people who utilize the “spray and pray” approach. Filtering them out is fairly easy, but in best case scenario, you’ll have a handful of decent candidates for every 100 or so applicants.
The ﬁltering process that tend to work well is to have rigorous screening questions that actually requires a little bit of work and is unique. This will help you weed out all the candidates that simply put “Call me to discuss” in all the boxes (or worse).
Yes, this screening process will take a fair bit of time, but tools like Upwork make it fairly quick to reject candidates that fail to put in the effort (or are clearly poor ﬁts).
From experience I am also very reluctant to work with agencies and prefer hiring team members directly. The reason being that a number of agencies we’ve run across over the years have a small amount of talented engineers that will do the screening process and perhaps the ﬁrst few weeks, and then they gradually shift the work over to a more junior person, while charging the same rate.
It’s also worth mentioning that with the raise of the digital nomad movement, there are a lot more job boards that are “remote friendly,” including Angelist and a plethora of (IMHO overpriced) remote-focused job boards.
A ﬁnal word of warning for people hiring remote team members: don’t hire people who want to join your company just because you offer them to work remotely and subsequently have more ﬂexibility. While not always true, it is sometimes an indicator of people who want to coast along with minimal supervision (while perhaps getting their own business off the ground). What you really want is people who believe in the vision and product, and where remote is a perk, not a the reason why they want to join.
Remote work is likely easier for engineering than for other roles. In all my experiences, we have always been engineering heavy organizations. Yes, we’ve had a number of other roles too, but in terms of head count, the engineers always outnumbered all other roles. What I have noticed however is that it tends to be easier (in general) to manage engineers remotely compared to other roles (such as sales). This is likely related to a number of variables, but in general, I’ve found engineers to be more self-motivated and requiring less handholding. There is of course a large correlation with seniority too. Regardless of position, more senior people tend to require less handholding and thus work better remotely.
Remote work saves a lot of time. First, it should be said that remote work does not necessarily equal working from home. We’ve had plenty of team members over the years that preferred to work from a shared ofﬁce (including myself for a period). To each and their own. If however you work from home, you can save a big chunk of time (and money) every day. When I had an ofﬁce in Shoreditch, it took me 30-40 minutes each way. That adds up top a lot of time every week. These days I have a dedicated room as my home ofﬁce (something I strongly recommend if working from home). This means that my morning commute is roughly 60 seconds, and that includes a detour to the kitchen to fetch myself a cup of joe. What you do with this time is up to you, but I usually dedicate this 1-1.5h every day to exercise.
Habits will make or break you as a remote worker. As mentioned earlier, remote work is not for everyone. It requires a lot more self-discipline than a regular ofﬁce job where you’re constantly “supervised.” Over the years, I’ve experimented with a large number of habits, and at this point I’ve devised a set of habits that work pretty well for me (but they are likely to change as I keep experimenting). The most important habit when working remotely from home is to mentally trigger a beginning and an end of the work day. It’s easy to sit in your PJs or sweats all day just because you can, but it will likely backﬁre in the long-run.
To make this more concrete, here’s my current daily schedule:
* 07:05: Reading (Sharpen the saw from The 7 Habits of Highly Effective People)
* 08:00: Check in with the team
Clariﬁcation: This does not necessarily mean I work 10 hours per day every day (sometimes I do). I do take a lunch as well. Also, I am perfectly happy to wrap my day at 17:30 after a productive and sucessful day. The 19:30 hard stop, not as hard requirement for me to work to it every day.
As my good friend Milos (@milosgajdos) pointed out while reading a draft of this post, an early start isn’t for everyone. Shifting your day is perfectly ﬁne too. The point is not when you start your day and when you wrap it, but building and sticking to habits that make you productive.
If you want to learn more about the importance of habits, I strongly recommend reading The Power of Habit by Charles Duhigg. Also, a word of warning, don’t get obsessed with reading all about productivity. I’ve been a victim of productivity-porn myself, but I can tell you ﬁrst-hand that you’ll waste far more time reading about it than you’ll ever save.
Perhaps not related to remote work itself, but more the startup culture. VC used beat it in to young and naive early 20-something kids that it was cool (and even expected) to frequently pull all-nighters and sleep under their desk. I feel like the tide has ﬁnally turned on this. Yes, you still have the Gary Vaynerchuk-wannabees out there with their hustle-porn, but I think (and hope) they are a dying breed.
What is however related to remote work is the the importance of wrapping up your day. As you may have noticed above, I end my day at 19:30. After that I’m not allowed into my ofﬁce (unless there’s an emergency). I also try to keep my screen time to minimal in the evenings. In my younger years, I frequently worked late into the night. Yet, even if I clocked more hours, I got less done.
Switching off very is important, and it is a lot more challenging when you’re working remotely.
If you want to learn more on this, I recommend the book Why We Sleep by Matthew Walker.
Kill the distractions. Working from home is challenging for a lot of people. It’s easy to get distracted by various things around the house, but for me the biggest distraction has always been the digital kind. Cal Newport nails this in his latest book Digital Minimalism, where he talks about how distracting mobile phones and social media can be. I’ve found this ﬁrst hand. For a long time, I kept my phone next to me on the desk. However, every time the phone buzzed, I lost my focus. Even if I did not check the phone, it still got me distracted. The remedy for me was to simply move all my distractions to the living room (i.e. my phone and Apple Watch) and just check them periodically throughout the day. Alternatively, Airplane mode on your devices is another great way to kill noise.
For the hackers out there, I’ve found that running something like i3 is also great for cutting out noise on your desktop. I use this on my “developer workstation” (which is different from my other workstation).
While having good equipment is always important, you tend to have more control over your equipment when working remotely than when you work in an ofﬁce where everything is provided to you on your ﬁrst day. You are going to spend a lot of time in front of your workstation. Your body will thank you for spending a bit more money and get:
* A large 4K screen (they have crawled down a lot in price recently) on a monitor arm
* A standing desk (I use this one from Ikea)
That’s it. At least for now. I’m sure there are things that I have missed, but it should hopefully be useful for other (new and old) remote workers out there.
If you are eager to learn more, I would recommend the following additional books:
NEW YORK (Reuters) - Alphabet Inc’s Google has suspended business with Huawei that requires the transfer of hardware, software and technical services except those publicly available via open source licensing, a source familiar with the matter told Reuters on Sunday, in a blow to the Chinese technology company that the U. S. government has sought to blacklist around the world.
Holders of current Huawei smartphones with Google apps, however, will continue to be able to use and download app updates provided by Google, a Google spokesperson said, conﬁrming earlier reporting by Reuters.
“We are complying with the order and reviewing the implications,” the Google spokesperson said.
“For users of our services, Google Play and the security protections from Google Play Protect will continue to function on existing Huawei devices,” the spokesperson said, without giving further details.
The suspension could hobble Huawei’s smartphone business outside China as the tech giant will immediately lose access to updates to Google’s Android operating system. Future versions of Huawei smartphones that run on Android will also lose access to popular services, including the Google Play Store and Gmail and YouTube apps.
“Huawei will only be able to use the public version of Android and will not be able to get access to proprietary apps and services from Google,” the source said.
The Trump administration on Thursday added Huawei Technologies Co Ltd to a trade blacklist, immediately enacting restrictions that will make it extremely difﬁcult for the company to do business with U. S. counterparts.
On Friday, the U. S. Commerce Department said it was considering scaling back restrictions on Huawei to “prevent the interruption of existing network operations and equipment”. It was not immediately clear on Sunday whether Huawei’s access to mobile software would be affected.
The extent to which Huawei will be hurt by the U. S. government’s blacklist is not yet known as its global supply chain assesses the impact. Chip experts have questioned Huawei’s ability to continue to operate without help from the United States.
Details of the speciﬁc services affected by the suspension were still being discussed internally at Google, according to the source. Huawei attorneys are also studying the impact of the blacklist, a Huawei spokesman said on Friday.
Huawei was not immediately reachable for further comment.
Chipmakers including Intel Corp, Qualcomm Inc, Xilinx Inc and Broadcom Inc have told their employees they will not supply critical software and components to Huawei until further notice, Bloomberg reported bloom.bg/2VLT5QK late on Sunday, citing people familiar with the matter.
Intel, Qualcomm, Xilinx and Broadcom did not immediately respond to requests for comments on the Bloomberg report.
Representatives of the U. S. Commerce Department did not immediately comment.
Huawei will continue to have access to the version of the Android operating system available through the open source license, known as Android Open Source Project (AOSP), that is available for free to anyone who wishes to use it. There are about 2.5 billion active Android devices worldwide, according to Google.
However, Google will stop providing Huawei with access, technical support and collaboration involving its proprietary apps and services going forward, the source said.
Huawei has said it has spent the last few years preparing a contingency plan by developing its own technology in case it is blocked from using Android. Some of this technology is already being used in products sold in China, the company has said.
In an interview with Reuters in March, Eric Xu, rotating chairman of Huawei, struck a deﬁant note in anticipation of retaliatory actions by U. S. companies. “No matter what happens, the Android Community does not have any legal right to block any company from accessing its open-source license,” he said.
Popular Google apps such as Gmail, YouTube and the Chrome browser that are available through Google’s Play Store will disappear from future Huawei handsets as those services are not covered by the open source license and require a commercial agreement with Google.
But users of existing Huawei devices who have access to the Google Play Store will still be able to download app updates provided by Google. Apps such as Gmail are updated through the store, unlike operating system updates which are typically handled by phone manufacturers and telecoms carriers, which the blacklist could affect, the source said.
The impact is expected to be minimal in the Chinese market. Most Google mobile apps are banned in China, where alternatives are offered by domestic competitors such as Tencent and Baidu.
In Beijing, foreign ministry spokesman Lu Kang said the ministry had noticed the report and would look into it and pay attention to developments.
“At the same time, China supports Chinese companies to use legal weapons to defend their legitimate rights,” he added, but did not elaborate.
Huawei’s European business, its second-biggest market, could be hit as Huawei licenses these services from Google in Europe.
“Having those apps is critical for smartphone makers to stay competitive in regions like Europe,” said Geoff Blaber, vice president of research, CCS Insight.
Skip to content
A little bit geek, wonk, and nerd. Repeat entrepreneur, recovering lawyer, and former ski instructor. Co-founder & CEO of Cloudﬂare.
You can add location information to your Tweets, such as your city or precise location, from the web and via third-party applications. You always have the option to delete your Tweet location history. Learn more
Public · Anyone can follow this list
Private · Only you can access this list
Here’s the URL for this Tweet. Copy it to easily share with friends.
Add this Tweet to your website by copying the code below. Learn more
Add this video to your website by copying the code below. Learn more
Hmm, there was a problem reaching the server.
By embedding Twitter content in your website or app, you are agreeing to the Twitter Developer Agreement and Developer Policy.
Why you’re seeing this ad
Not on Twitter? Sign up, tune into the things you care about, and get updates as they happen.
» See SMS short codes for other countries
This timeline is where you’ll spend most of your time, getting instant updates about what matters to you.
Hover over the proﬁle pic and click the Following button to unfollow any account.
When you see a Tweet you love, tap the heart — it lets the person who wrote it know you shared the love.
Add your thoughts about any Tweet with a Reply. Find a topic you’re passionate about, and jump right in.
Get instant insight into what people are talking about now.
Get more of what you love
Follow more accounts to get instant updates about topics you care about.
See the latest conversations about any topic instantly.
Catch up instantly on the best stories happening as they unfold.
Oh Paul, you know better. I had to borrow money from my mom to pay my taxes when we were starting Cloudﬂare. But I certainly came from a relatively privileged background, and so did the AirBnB founders. It’s hard to take risks if you don’t have a safety net. bereal
Thanks. Twitter will use this to make your timeline better.
Loading seems to be taking a while.
Twitter may be over capacity or experiencing a momentary hiccup. Try again or visit Twitter Status for more information.
In 1960 David Latimer got curious and decided to plant a glass bottle with seed. He would have never guessed it would turn into a beautiful case study of a self-sustaining sealed ecosystem.
In fact, more than a century has passed and David’s sealed bottle garden is still thriving and robust as can be. With thriving plant life, despite not watering it since 1972.
David planted the terrarium back in 1960 by placing a quarter pint of water and compost in the ten gallon bottle. He then lowered in spiderworts seeding with a wire. Finally sealing it and placing it in a corner ﬁlled with sun. Letting mother nature do its thing through photosynthesis.
Photosynthesis puts moisture and oxygen in the air through the plants. The moisture then starts to build and begins to rain back down on the plants. Leaves will also fall and rot which produces carbon dioxide that the plants need for nutrition.
It’s a beautiful example of how nature can support itself.
Larimer did open the bottle in 1972 to water the plant. But, since then it has remained sealed without fresh water or air.
This is possible because the garden makes its own ecosystem through the magic of the sun (photosynthesis) that is self-sufﬁcient.
“It’s 6ft from a window so gets a bit of sunlight. It grows towards the light so it gets turned round every so often so it grows evenly. Otherwise, it’s the definition of low-maintenance. I’ve never pruned it, it just seems to have grown to the limits of the bottle.”
The sealed garden has been placed in the same exact spot for 27 years in the Latimer’s home. Located in Cranleigh, Surrey. First exposed to the world through Radio 4’s Gardeners Question Time on BBC by Chris Beardshaw. Chris is not only a television host, but also a garden designer. Saying that he felt David’s sealed garden was indeed the perfect cycle of life and a great example of plants recycling ability. Also adding that it is the same method that NASA is interested in bringing plants into space. Saying:
‘”Plants operate as very good scrubbers, taking out pollutants in the air, so that a space station can effectively become self-sustaining,’ he said. ’This is a great example of just how pioneering plants are and how they will persist given the opportunity.”
As stated earlier a bottle garden works by creating a ecosystem that is self-sustaining. Through plant photosynthesis and recycling nutrients.
Light is the only input needed externally. Providing energy for food and growth. The light shines on the leaves and is taken in by protein containing chlorophylls (green colored pigment). The plant stores a portion of the light as ATP (adenosine triphosphate) for energy. The remaining amount is used in the plant roots to get rid of electrons from water.
The electrons then are free to release oxygen by converting carbon dioxide to carbohydrates through chemical reactions.
To decay organic material like deal leaves the ecosystem employs cellular respiration. Which is done by bacteria that takes in waste oxygen and releases carbon dioxide that helps the plant grow.
The plant will also use a similar process of cellular respiration to break down nutrients it has stored when there is no sunlight (nighttime).
Many are skeptic of this being true and some like Bob Flowerdew (organic gardener) thinks that “It’s wonderful but not for me, thanks. I can’t see the point. I can’t smell it, I can’t eat it,”.
Shockingly David Latimer feels the same. Saying that the sealed bottle garden is pretty boring. Not really doing much, but it does interest him enough to see how long it can sustain itself.
He plans on passing on this experiment to his kids when he passes. Which if they don’t have an interest in it at that time it will then get passed on to the Royal Horticultural Society in London, England.
If this sounds interesting to you we suggest searching around the web. There are many tutorials like the video below that will help you make a bottle terrarium.
It’s a simple almost zero maintenance, fascinating experiment that just about anyone can do.
Documenting the recovery and restoration of an IBM System 360 Model 20 and potentially an IBM System 370 Model 125
In late April of 2019 Adam Bradley and Chris Blackburn were sitting in a pub on a Monday night when Chris happened across a somewhat unusual eBay listing for an IBM 360 Model 20. This eBay listing was unusual mainly because it didn’t actually list the computer as an IBM 360, but rather as an “seltene Anlage “Puma Computer IBM 2020” which roughly translates from German into “rare plant “Puma Computer IBM 2020”.
The content of the advert text was similarly odd:
“Sehr geehrte Damen und Herren,
wir bieten Ihnen eine relativ seltene Anlage Puma Computer IBM 2020 wohl aus den 1980er Jahren in Rot mit Zubehör, Regal mit Rollen u.a. an. Einzelne Teile sind gekennzeichnet mit den Nummern: SYSTEM 360, IBM 29, 3504, 2020, 1403, 3125, 5471, 2415, 2311, 2203, 2501, 2560, 2152. Da diese Anlage schon längere Zeit in einem älteren Haus steht, wissen wir nicht, ob diese komplett ist. Ob alle Teile da sind, ist für uns als ausführende Firma im Auftrag des Hauseigentümers nicht bekannt. Einzelteile sind im schlechteren Zustand und möglich korrodiert. Die Maße sind unterschiedlich, max. Höhe 1,7 m ca. Insgesamt sind sechs Teile in den Maßen ca. 1 x 1 m, Tiefe ca. 60 cm.
Bedingung für die Abgabe: Abholung in Nürnberg ebenerdig (2 Stufen) innerhalb von 14 Tagen.
Viel Erfolg und Spaß beim Bieten!
Am 08.04.19 hat der Verkäufer die folgenden Angaben hinzugefügt:Umfang: ein Mercedes-Benz Sprinter voll.”
we offer you a relatively rare plant Puma Computer IBM 2020 probably from the 1980s in red with accessories, shelf with rolls u.a. on. Individual parts are identiﬁed by the numbers: SYSTEM 360, IBM 29, 3504, 2020, 1403, 3125, 5471, 2415, 2311, 2203, 2501, 2560, 2152. Since this system has been in an older house for some time, we know that not, if this is complete. Whether all parts are there is not known to us as an executing company on behalf of the homeowner. Items are in worse condition and possibly corroded.
The dimensions are different, max. Height 1.7 m approx. In total, six parts in the dimensions of approx. 1 x 1 m, depth approx. 60 cm.
Condition for delivery: Collection in Nuremberg at ground level (2 levels) within 14 days.
On 08.04.19 the seller added the following information:
Scope: a Mercedes-Benz Sprinter full.”
Luckily, there were photos. The photos below are the only ones that the advert had on it:
As you can probably tell, these aren’t the clearest photos, but they gave us enough of an idea of what was there… a once in a lifetime ﬁnd. We decided we had to have it. Adam put in a bid of around 500 Euros and we waited. The advert ﬁnished the following day around midday. Luckily, Chris and Adam work together and as such the next morning in the ofﬁce was rather tense! There was quite a ﬂurry of bidding activity right at the end of the auction and with seconds to go and an exclamation of “Screw it!” Adam entered a bid of 4500 Euros. The hammer fell on 3710 Euros! We were now the proud owners of one IBM 360… or so we thought!
Read the blog to learn the saga that unfurled further and how we eventually tackled the problems we discovered. The core parts of the acquisition story are detailed in these posts:
There are 3 main people involved in the restoration and preservation of the IBM 360 Model 20 system:
Adam Bradley — Adam is multi-talented engineer who’s been involved in the computer history ﬁeld for over a decade at The National Museum of Computing. Adam is a Railway Software Engineer day to day, and when he’s not playing with computers he’s probably under the bonnet of a car or making something vehicle related.
Christopher Blackburn — Chris is an engineer with a strong background in Electronics. Chris has been involved in many interesting projects in the past, mostly focused around the UK Railway system. Chris has also been involved with The National Museum of Computing for some time.
Peter Vaughan — Peter is an engineer currently working in the Medical industry. He also looks after the IBM 1130 which can currently be seen in operation at The National Museum of Computing. Peter volunteers at the National Museum of Computing where he’s been a core volunteer for well over a decade.
In January 2019, I closed my Facebook account because it was no longer of any professional use to me. As a European citizen, the directive gives me the right to request the data Facebook has about me, and ask for its deletion. Unsurprisingly living up to its reputation, Facebook refuses to comply with my Subject Access Requests in an appropriate manner. This page is tracking my communication with Facebook and their responses, with the aim of attracting attention to their unlawful practices and ﬁxing the process for everyone. It provides interesting insights into the curious “legal” maneuvers by Facebook, and would at times even be funny—if only it wasn’t so sad.
On this page, you will ﬁnd links to the full text to all emails sent by Facebook and by myself. There is quite some sarcasm and cynicism in my replies, which hopefully makes the dull legal stuff a tiny bit entertaining.
If you’re a Facebook user, you might like to know that Facebook considers you too stupid to understand your own data. If you’re a lawyer, you’re probably going to cringe at their very peculiar bending of European law.
Facebook’s strategy is dissuasion. They will purposely overload you with a lot of technical, legal, or other nonsense, with the aim of making you give up. They bet on you giving up. They will send you wrong, confusing, and conﬂicting information, and will reply as late as they think they can get away with, even outside of legal boundaries.
Understand that the whole thread below comes from a company that has had a department for years, so their lack of appropriate action should be attributed to malicious intent rather than incompetence. Note how even some of their canned responses contain typos and grammar mistakes, as if they somehow were not prepared.
The latest email I received from Facebook conﬁrms that they are with their earlier statement that—and I paraphrase—they cannot give me my data, because the average person is too dumb to understand simple things like their location history.
I of course disagree and am awaiting a response to a very concrete follow-up request.
In yet another attempt to further spread confusion, Facebook’s famous philanthropist and hypocrite Mark is calling for more regulation on the Internet. The irony of course is that Facebook does not even respect existing legislation— in my case. So Mark calling for more legislation is like a 3-year old asking for more Brussels sprouts: if you know you’re not gonna eat them, it’s only show. Whereas he surely would like shedding some responsibilities (I would like him to do that, too), we should consider his strategy to be one of smoke and mirrors. People remember Facebook asking for more regulation; they tend to forget the ton of legislation Facebook conveniently ignores.
For me, it’s simple: I want my data back. Every single piece of data Facebook has about me, I want it. I want to understand what they know about me and how they (potentially) use it. And when I have it, I will ask them to delete all of it. No hard feelings: I had some alright times on Facebook, but time has come to move on, and just like when moving places, I’m taking all of my stuff with me. After all, it is my legal right.
I am not a lawyer—I am a computer scientist specializing in Web data. So I can perfectly imagine and understand the kind of data Facebook has on me. I am also involved in an initiative to separate data from apps, so Facebook seemed like a very good test case.
Facebook has a Download Your Information tool, which is part of their aforementioned smoke and mirrors strategy to give people the feeling that they can always obtain their data (and to fake goodwill toward the to make it seem they respect ).
Unfortunately, that tool only gives me all of the data I put on there myself. So nothing I didn’t already have. After all, why would I leave my only copy of a photo on Facebook? So no, this tool does not allow me to exercise my rights.
I send an ofﬁcial sounding email to email@example.com using a template I found online, which presumable contains the right legalese. Even though they do not need a copy of my passport, I did not want to give them any grounds for refusing my request after 30 days (which is their deadline).
Some minutes prior, I submitted the same request through the form on their website, which they are hiding deeply in their support section. This form is not accessible by everyone, and in particular does not seem to work from within the . Not valid, since applies to citizens everywhere, regardless of where they live.
Facebook automatically replies to my form submission (but not to my e-mail). They ask me to ensure I have provided sufﬁcient detail, which my request indeed contains.
I am slightly surprised by their sloppiness when it comes to language and spelling.
In an unintentional attempt at a self-fulﬁlling prophecy, Javier from Privacy Operations refers to my request as a .
I tell Javier I don’t appreciate his stalling of my request and request to be put in touch with his supervisor.
It’s Valentine’s Day and I’m ofﬁcially in a complicated relationship with Facebook. They did not answer within the legal term of 30 days, so I reminded them of their obligations.
A late Valentine’s Day present arrives from Sam. True to their tested smoke and mirrors strategy, Facebook sends me a list of all data they have about me, and then happily proceed with not giving me any of it. The audacity.
It took them over a month to send me a bad copy and paste of the information on their own website. The email instructs me to Go to the top right of Facebook and click, which is what you get if your image does not have an alt attribute.
I call out Sam on their lack of action, and use their own list to tell them exactly what data I want. That seems clear and simple enough.
Disappointed about the lack of appropriate action, I decide it’s time to directly contact Stephen Deadman, Facebook’s fresh Data Protection Ofﬁcer (). I also send it to some other prominent Facebookers, just to ensure it arrives well.
How did I obtain their email addresses? Turns out that the European Commission sometimes incorrectly censors documents in response to information access requests.
In their most fascinating move yet, Facebook comes up with a lot of ridiculous legal nonsense. They are obviously trying to overload me by giving the impression that they know what they are doing. Did they react on April Fools’ Day for plausible deniability?
On the one hand, they list a ridiculous amount of legal cases that have nothing to do with my request. I did not ask for raw data, but they reckon that misrepresenting my request will make me doubt myself. They even go as far as redeﬁning .
On the other hand, they make a very interesting “legal” “argument”. contains provisions to ensure that companies return data in an accessible format, to avoid that they would overload people with meaningless data dumps. However, one of the creative legal geniuses at Facebook came up with this gem:
* Facebook says that requires their response to use clear language.
* This means that their response should be understandable by the average person.
* But they consider their data is too complex for that average person.
* Hence, they feel they are not obliged to give any data.
In other words: you are too stupid to understand your own data, and this includes things like your location and which device you have used when. You know, simple things you wouldn’t understand. Or how they turn their obligation to simplify what they need to send into an excuse for not sending anything at all.
Interestingly, they also acknowledge that multiple people from their have received my forwards. That wasn’t very smart of them. You would almost think these people don’t know what they’re doing.
I send Alex a ﬂaming reply in which I call his supreme leader a hypocrite for begging for more regulation, while at the same time instructing his interns to blatantly violate existing legislation like . I’m acting a bit snubby. I’m calling him out on all of his pseudolegal nonsense and demand my data—again.
Of course Stephen Deadman and his friends are in , now that I know they are receiving my mails. I would send them a Facebook message, but I closed my account.
Facebook is satisﬁed. They are repeating themselves and act annoyed that I am still asking them concrete questions, even though they made it abundantly clear that they will not fulﬁll their legal obligations. Why am I bothering them? They are Facebook, they are above any law.
In my unsatisﬁed reply, I remind Alex that . To avoid him coming up with loads of excuses, I make him a very concrete request: give me my Network and Connections data, which clearly can be understood by .
I am passionately curious how they will try to get out of this one.
I’m sure they’re creative, but Alex might need his manager here.
This will only end with me getting my data, obviously.
And thereby giving you a clearer path to get yours.
gil at azul.com
Lumpy.local-43% docker run -it –rm openjdk:8 java -version openjdk version “1.8.0_212” OpenJDK Runtime Environment (build 1.8.0_212-8u212-b01-1~deb9u1-b01) OpenJDK 64-Bit Server VM (build 25.212-b01, mixed mode) Lumpy.local-44% date Wed May 15 11:41:12 PDT 2019
Look at the build number carefully… This was populated no later than March 27, 2019. 3 weeks before the actual 8u212 was released on April 16, 2019.
Lumpy.local-46% docker run -it –rm openjdk:11 java -version openjdk version “11.0.3” 2019-04-16 OpenJDK Runtime Environment (build 11.0.3+1-Debian-1bpo91) OpenJDK 64-Bit Server VM (build 11.0.3+1-Debian-1bpo91, mixed mode, sharing) Lumpy.local-47% date Wed May 15 11:43:12 PDT 2019
This one was populate dno later than April 3, 2 weeks before the actual 11.0.3 was released on April 16, 2019
If anyone was wondering about the importance of having version strings say “EA” (or some other “THIS IS NOT a RELEASED VERSION” warning) on any and all OpenJDK builds that are not an actual release build, the above shows you how bad things get when that practice is not followed.
Right now, anyone using the *Ofﬁcial* Docker images for OpenJDK 8 and 11 (https://hub.docker.com/_/openjdk) is probably thinking that they are running 8u212 or 11.0.3, when what they are actually running is an interim “work in progress build”, with several bugs unaddressed, several updates missing, and (critically) CVE vulnerabilities that were ﬁxed in the actual 8u212 and 11.0.3 un-addressed.
The mechanics of how this situation came about seem to be:
The docker ﬁle for openjdk:8 (https://github.com/docker-library/openjdk/blob/b8ce9eff38451de3282b2eb2bcd8b520fb95e1ce/8/jdk/Dockerﬁle ) was updated on March 27, 2019, 3 weeks before the actual release of OpenJDK 8u212 (see changes in https://github.com/docker-library/openjdk/commit/b8ce9eff38451de3282b2eb2bcd8b520fb95e1ce#diff-fef076ee1e5f270f2c5a93d075150919), and is set to use a speciﬁc Debian stretch build version (8u212-b01-1~deb9u1) that was available at that time, pulled via apt-get from debian stretch repos.
Similarly, the docker ﬁle for openjdk:11 (https://github.com/docker-library/openjdk/blob/178c542fbb93a8f8a42e331b73a1214c9d8ba81d/11/jdk/Dockerﬁle) was updated on April 3, 2019, two weeks before the actual release of OpenJDK 11.0.3 (see changes in https://github.com/docker-library/openjdk/commit/178c542fbb93a8f8a42e331b73a1214c9d8ba81d#diff-c338262eaf0fd203322a06702be174e0), and set to use a speciﬁc Debian stretch build version (11.0.3+1-1~bpo9+1) also pulled via apt-get from debian stretch repos.
Why Debian populated their repos with these builds is their business, and why docker chose to use those speciﬁc debian builds can be speculated about all we want. the details don’t matter. The end result of these cumulative “reasonable” (according to some people) choices is that the default openjdk runs done by millions of people on docker right now are using “mystery meat”, incomplete, and exposed builds while seeming to report (to the lay person) a Java version that would suggest a real 8u212 or 11.0.3 (which one would expect has the security vulnerabilities in the April update addressed, the bug ﬁxes included, etc.).
Making sure OpenJDK version string only show non-EA contents in actual release builds (which is the practice we had recently moved to for both 8u and 11u) will not necessarily prevent such unfortunate decision chains from getting interim builds to unsuspecting end users, but will at least (assuming no malice is involved and no manual removal of EA labels happens) make it clear to the end user that what they got is not an actual released version.
More information about the jdk8u-dev
From the upcoming free ebook, SOLID - An introduction to software architecture and design principles with Node.js and TypeScript.
Writing code can be like pouring concrete.
If what you’ve written in the past doesn’t suit your needs today, it can be expensive to change.
So if we’re writing code, we need to write code that can be changed.
That’s a lot harder than it sounds.
My initial approach to writing code was that “if I get enough time to do it, I can hack it together and make it work”.
I realized that making things work the ﬁrst time was easy. It’s just brute force, really.
But adding features to existing code? Making it work the second time, the third time and the fourth time? Multiple iterations on something can be hard to do without introducing bugs.
I should have changed it to “if I get enough time to do it, I can hack it together and make anything work [once]”.
Eventually, I got tired of pushing out bugs to users and getting stuck in messes that I made myself. I realized something needed to change.
When we ﬁrst start out coding, we often have little regard for software design.
Why should we? After we achieve dexterity with a programming language, we focus our efforts on ﬁghting undeﬁned errors, what this means and several other annoying things.
We’ve all done it, and it hurts… slowly.
In order to go fast, we need to go well
I think the answer is Uncle Bob’s SOLID Principles.
The SOLID principles are a set of software design principles that teach us how we can structure our functions and classes in order to be as robust, maintainable and ﬂexible as possible.
The SOLID principles are a mnemonic acronym that were popularized by Robert C. Martin (Uncle Bob) in 2004-ish. They stand for:
If you ask me, the primary beneﬁts of becoming well acquainted with the SOLID principles are that you’ll learn how to:
* write code where things are where they’re expected to be
* write code where classes narrowly do what they were intended to do
* write code that can be adjusted and extended quickly
* write code that can be adjusted and extended quickly without producing bugs
* write code that allows for implementations to be swapped out (think swapping out Email APIs, ORMs or web server frameworks)
So let’s go through em!
“A class or function should only have one reason to change.”
So, instead of thinking that we should split code up because it would look cleaner in a single ﬁle, we split code up based on the social structure of the users using it. Because that’s what really dictates change.
If we had an HR department, an Accounting department and an IT department in an enterprise application that calculates pay, and reports and saves hours, we’d better make sure that we’ve split up (or abstracted) the operations most likely to change for each each department.
This is bad, very bad. The algorithm for each department is located in the same class. If one department were to request a change to one of their respective algorithms, it has the increased potential to ripple into another department’s algorithm.
Making this work would require some nasty if or switch statements.
Design Tip: If we see lots of code in switch statements, that should be a signal to us of a potential refactoring from a switch statement to several classes.
Much better. Each employee in this social structure has a single place where we can go to in order adjust their respective algorithm that is most likely to change.
The key thing is to separate responsibility based on the social structure of the users using the application.
Intially written about by Bertrand Meyer in the 1980s, Uncle Bob calls this the “most important principle of object-oriented design”.
“A software artifact should be open for extension but closed for modiﬁcation.”
Generally, this principle is all about writing your code in such a way so that when you need to add new functionality, it shouldn’t require changing the existing code.
That’s what we strive for in software architecture 😤. Being able to design your software so that the minimum amount of code needs to change in order to take it from point A to point B.
To do this, we write interfaces and abstract classes in order to dictate the higher-level policy that needs to be implemented, and then we implement that policy using concrete classes.
Let’s say that our boss told us that he wanted us to use SendGrid for sending emails.
So we went and coded out a concrete SendGridService class, connecting to the Sendgrid API.
3 months later he tells us that he wants us to use MailChimp instead because SendGrid is too expensive.
So we go and code a concrete MailChimpService. But in order to hook it up, we’re going to have to change and potentially break a lot of code.
How could we have designed that better?
Following OCP, we could deﬁne an interface that speciﬁes what a mail service can do, and leave the actual implementation to be ﬁgured out separately.
The main idea is to keep the policy separate from the detail in order to enable loose coupling.
Higher level-components are protected from changes to lower level components.
This goes hand-in-hand with the Dependency Inversion Principle of depending on an interface instead of concretions, and closely with Liskov Substitution Principle in terms of being able to swap out implementations as long as the same type/interface is being depended on.
This principle still makes a lot of sense when we think about the larger picture of software architecture.
Imagine that this is some generic app where there’s a controller that handles requests, passes it off to Use Case (something that actually executes the business logic) and then maps the response into two different views for a Web App and a Mobile App.
It’s the Use Case!
If the Use Case were to change, it would likely affect the database, the controller and the data mappers which create views passed to web and mobile.
But if the Web or Mobile View were to change, it’s a lot less likely that that requirement will translate into something that affects the Use Case because the Use Case contains the business logic and the entities.
Higher level-components are protected from changes to lower level components.
Introduced by Barbara Liskov in the 1980s, she said:
Let Φ(x) be a property provable about objects x of type T. Then Φ(y) should be true for objects y of type S where S is a subtype of T.
The easiest way to explain it is that we should be able to swap one implementation for another.
In Uncle Bob’s “Clean Architecture”, he says:
“To build software systems from interchangeable parts, those parts must adhere to a contract that allows those parts to be substituted one for another.”
He’s talking about using interfaces and abstract classes.
I think the Mail example we gave a moment ago is the best way to think about this.
We can implement various email services, as long as they implement the IMailService interface and the required sendMail(email: Mail) method.
And then we can “Dependency Inject” it into our classes, making sure we refer to the interface it belongs to rather than one of the concrete implementations.
Now, all of these are valid.
Because we can interchange which implementation of an IEmailService we pass in, we’re adhering to LSP.
Prevent classes from relying on things that they dont need
In order to prevent this, we should make sure to really split up the unique functionality into interfaces.
And we should be depending only on interfaces or abstract classes as per the the Dependency Inversion Principle.
Let’s say we have 3 different User classes, that use 3 different methods on the same Operations class, and for each User class, we’re depending on 2 additional operations that we don’t need.
For this, it might not seem like a big deal. But it could be a big deal if the constructor for the Operations class required us to inject all different kinds of dependencies in order to satisfy the other 2 operations that we didn’t need.
That’s when it’s really a blaring no-no.
This does occasionally end up with services in CRUD-ﬁrst design, but to ﬁx it, we can start by making sure that we rely on abstractions to the things that we need.
And then, if it were cumbersome to create the Operations class because it depended on so many things, taking User1 for example, we would be able to create a class that ONLY implements U1Ops.
Now User1 can only needs that class and not all the other junk from Operations.
Abstractions should not depend on details. Details should depend on abstractions.
What’s an abstraction again? An interface or abstract class.
Abstractions should never depend on details. Ok, so that means, try not to do this:
But instead, do this.
You can normally tell when I’m using an interface (at least in my code) from the Microsoft code style, which recommends that we preﬁx interfaces with an “I”.
And this is already what you’ve beeing seeing throughout this article so far! We’ve been referring to abstractions (interfaces and abstract classes) instead of concrete ones.
We can’t never reference concrete classes. That’s how we actually hook things up to get stuff to happen.
Like hooking up an express.js router.
We need to reference those concrete CreateUserController and MailGunEmailService classes in order to hook them up.
But we only do this to hook them up. Uncle Bob calls these Main components. They’re messy but they’re necessary.
However, we shouldn’t refer to concrete classes from another concrete class directly.
This is what gives us the ability to test code, because we leave the power to the implementor to pass in a mocked dependency if we don’t want to make API calls or rely on something we’re not currently interested in testing.
Therefore, do this.
And definitely not this.
If hooking up dependencies to classes like this gets out of hand where there are potentially hundreds of dependencies, we can look to a Dependency Injection Framework to help resolve dependencies auto-magically.
Although I haven’t tried it, Inversify seems to be the most popular one at the moment.
If you’re interested in a deeper dive, check out the wiki page on this principle.
We just went through all of the SOLID principles.
If you’re using TypeScript, for you to really get the most out of your object-oriented software design efforts, I recommend re-reading this article a few times and referring back to it as you write TypeScript code, asking yourself “is this SOLID”?
And if you’re interested in having something you can download, I’m putting together an ebook (that’s free before its release) on applying the SOLID principles in Node.js and TypeScript.
Deﬁnitely grab that if you’re interested in having something you can print out.
Wow, we really talked a lot about interfaces, didn’t we?
And you know what the sad part is?