Smart Disorganized (incoming)

May 29, 2015

Dave Winer

My website in a Dropbox

I wanted to mark a milestone. I finally have a web server running out of a Dropbox folder. I tried doing this with Apache a few years ago, but there was something about how Apache worked that drove Dropbox crazy. Or vice versa.

Now I have my own web server, written in JavaScript, built out of Node.js core packages. It's really fast and reliable, and I pretty much know exactly what it's doing. There was never a problem with Dropbox. We just read the files from the server. We update our own stats files, but that doesn't seem to be too much for Dropbox to handle. (It is using up a lot of CPU cycles on the server, according to the Top command, so I'm thinking about turning Dropbox off when I'm not actively developing.)

Why it's so cool -- all my tools work with the filesystem. It's even more widely supported than Git. And there's no difference between the original content and the stuff that's being served. If I want to edit one of the files in my website, I just open it in an editor, make the changes and save. It's like having the server on my machine, without actually having the server on my machine.

The server is called PagePark. Of all my latest tools, it's my favorite. I love tweaking it, adding little shortcuts. Things that make it work really well for the kind of content I serve.

May 29, 2015 12:49 PM

Tim Ferriss


TF_cowboySometimes, going weird allows you to go big. (Photo: My weird Instagram)

In this episode, I answer questions submitted by you all.

50% of this episode is spent explaining how I’d build an audience from scratch, if I had to start over today. The other ~10 questions/topics are listed below.

Do you like or dislike this type of episode? Please let me know in the comments, and I’ll do more or fewer based on that.

For the movie recommendations I mention (shorts, documentaries, etc.), click here to see the growing list.



If you enjoy the above Q&A episode, you might also like this episode, where I answer the question: “What would you add to The 4-Hour Workweek for 2015?”

Other questions I answer in this episode:

If you’re the average of the 5 people you surround yourself with, who are those 5 people for you?

Based on the self-experiments you conducted in your books, are there any habits you continue to implement on a daily basis?

What is the most important question you ask yourself everyday?

If you could make one new thing mandatory in the nationwide high school curriculum, what would it be?

Bruce Lee said “The successful warrior is the average man, with laser-like focus.” What methods do you practice to maintain focus and follow through to achieve your goals rather than getting side tracked, distracted, or discouraged?

With all the misleading information on health out there, what are the best/most reliable resources?

What are your top 10 natural supplements that you’ve found most helpful?

What are the things you’ve done to become a better writer?

What are your guilty pleasures for those times when your brain needs a rest?

What would you go back and tell your younger self?

Again, here are my answers.


For previous episodes of the podcast, including Arnold Schwarzenegger, Rick Rubin, Jon Favreau, and others, click here.

by Tim Ferriss at May 29, 2015 12:53 AM

May 28, 2015

Lambda the Ultimate

Second-order logic explained in plain English

John Corcoran, Second-order logic explained in plain English, in Logic, Meaning and Computation: Essays in Memory of Alonzo Church, ed. Anderson and Zelëny.

There is something a little bit Guy Steele-ish about trying to explain the fundamentals of second-order logic (SOL, the logic that Quine branded as set theory in sheep's clothing) and its model theory while avoiding any formalisation. This paper introduces the ideas of SOL via looking at logics with finite, countable and uncountable models, and then talks about FOL and SOL as being complementary approaches to axiomatisation that are each deficient by themself. He ends with a plea for SOL as being an essential tool at least as a heuristic.

May 28, 2015 08:18 PM

Fog Creek – Interview with Casey Muratori

In, we chat with developers about their passion for programming: how they got into it, what they like to work on and how.

Today’s guest is Casey Muratori, Software Engineer at Molly Rocket. He’s the creator of Handmade Hero, an ongoing project to create a complete, professional-quality game without the use of engines or libraries, that’s accompanied by videos explaining every line of source code via weekday live coding sessions.

Casey Muratori
Location: Seattle, WA, US
Current Role: Software Engineer at Molly Rocket

How did you get into software development?

I learned to program when I was 7 years old. My father worked for Digital Equipment Corporation at the time and he was a programmer by trade, so he taught me when he thought I was old enough to handle it. I had always been fascinated with computers, and even when I was much too young to program, I had pestered my father to let me use the VT terminals and the DEC Rainbow that he’d bring home from work. I’m not sure why I was so interested in things as mundane as a VT terminal, but I was.

From 7 years old to today, over 30 years later, I’ve been programming computers in one capacity or another. I never went to college for it, I started working straight out of high school. My first job was in the games industry, and I never really switched industries, although for most of the time I did game technology exclusively (as opposed to working directly on specific games) at RAD Game Tools.

vt (1)

Tell us a little about your current role

During the day, I handle the art direction and management responsibilities for Molly Rocket, and I do all the programming. We have two projects we’re working on right now but neither have been announced, so I can’t say much about those at the moment, although I hope to have at least one of them announced publicly sometime before the end of the year. At about 4:30 I go home from the Molly office, and I start streaming Handmade Hero on Twitch. This takes about two hours or so, where one hour is me teaching programming, and the other hour is me answering questions or chatting with the folks who watch.

I’m currently working on interactive fiction technology. Obviously, it is an extremely challenging research area because, to a first order approximation, nobody has shipped any substantive advances in the field since about 1988. So really it’s been stagnant for a good quarter century, which is kind of amazing when you think about how much everything else has progressed in that time. But it’s also a problem that I’ve been thinking about for a very long time, and I feel like there are a number of ways that we can push things forward significantly, so our current goal at Molly is to see if we can make that happen over the next few years. It’s too early to say whether we will succeed, but I’m optimistic.

When are you at your happiest whilst coding?

I’m happiest when I’m coding something where I know I have enough time to do the complete right thing. Unfortunately, that’s rarely the case, but I’ve been realizing how important it is to me to make this happen, so lately I’ve been making more plans to try to eventually get to a place where most of my coding can be this kind of coding. It requires improving a lot of the tools (editor, compiler, operating system) so it’s a major investment, but, well, at some point you just have to prioritize what is important to you rather than what is most sensible. I think Jonathan Blow came to this realization recently as well, and that’s why you see him doing all this work on a new programming language now. At some point, you realize that if you want to be able to program the way you want to program, you just can’t do that with tools made by people who don’t understand how you want to program. So you have to start making those tools yourself. It’s too bad, because it’d be great if you could just get tools off the shelf made by people who understand, but I think those days died sometime around when Borland stopped being a compiler powerhouse.

borlandCompiler (1)

What is your dev environment?

I use GNU Emacs for editing code on both Windows and Linux. On Windows, I use Visual Studio 2012 because that’s the last version I happened to buy. On Linux, I use LLVM and GDB.

There are no software tools that I use that I couldn’t live without – all the tools I use on a daily basis are utter garbage. GNU Emacs is awful – it’s so slow it can barely even auto-indent my files, which is insane considering the horsepower it has to work with. Visual Studio 2012 is pathetic. It takes a perceptible amount of time to step a single line of code in the debugger. That is inexcusable, especially since in the old days (circa MSVC 5), it stepped instantaneously on much less powerful hardware! Their compiler is also, unnecessarily slow in a number of corner cases that I frequently tend to hit.

Linux is a disaster zone. GDB is the only debugger that seems to actually be functional, and it’s ability to keep you heads-up is awful since it’s not graphical. I’ve tried to use other debuggers, but they’re all basically front-ends for GDB, and most of them do it wrong so that they can’t even properly inspect half the stuff that GDB can. It’s insanity. And forget trying to work with complex graphics setups… debugging code on an Optimus laptop (which is what I have) is an exercise in pure frustration. Every other minor distro update totally breaks debugging under the discrete GPU for one reason or another, which makes debugging complex GPU work a non-starter since the integrated graphics part can’t keep up. Honestly, I find that the dev situation under Linux for native code is so byzantine that it is usually much faster to simply not use a debugger on Linux than to use one.

And yes, I’m sure everyone out there is like “well just switch to using [their favorite thing]”. No. I’ve tried that thing, because someone else said that exact same thing, and I found that it’s just as awful but in some different way. There are no good dev tools out there today. That much is abundantly clear, and it is a topic on which I find almost all my systems-level programming friends agree, so I think it’s becoming a consensus among people who actually care about low-level code. Nobody is making dev tools for us anymore, and it shows.

As for my office set up, I use a height-adjustable table. I usually code sitting, but I have a bad right knee so sometimes it helps to switch to standing every so often. I always listen to music when I program, usually on headphones so I don’t bother anyone else.

What are your favorite books about development?

I can’t say that I have any, really. It’s been a long time since I’ve read a book about programming. I will say that I quite enjoyed seeing the YouTube video of Mike Acton getting up at cppcon and giving a keynote that was all about how bad C++ is. That was great! And I totally agreed with basically everything he said.

xeonPhi (1)

What technologies are you currently trying out?

Honestly I was really excited for AVX512, because I learned to program the LRB (now Xeon Phi) instruction set a bit when I was working on the drivers at RAD, and I think it’s really cool, but until AVX512 most of those instructions aren’t in the main CPU. Unfortunately, news sites have been reporting recently that AVX512 actually won’t be coming to the desktop this year, I guess, it will be Xeon-only, and that is super depressing. I guess Intel hasn’t said one way or the other, though, so I sure hope they do ship AVX512 on desktop chips sooner rather than later because I think it’s going to be awesome.

When not coding, what do you like to do?

Play video games, go to the theater, walk about town. Anything that does not involve me having to interact with nature is usually good. I like to cook, but I’m not particularly good at it.

What advice would you give to a younger version of yourself starting out in development?

Don’t ever bother learning or using object-oriented programming. It’s a deeply flawed programming methodology, and I wasted a good five years of my programming life thinking that it was useful, and I’ll never get that back. If I had been able to tell 18-year-old me to stick with compression-oriented programming, I probably would be a much better programmer today and I would have made decent code in my 18 to 23-years old period instead of the garbage OOP code that I ended up making. I will be forever thankful to Jeff Roberts at RAD Game Tools for providing the environment that finally made me realize that OOP was a severe impediment to writing good code, and it didn’t take long in that environment before I was back to writing good code again.


Thanks to Casey for taking the time to speak with us. Have someone you’d like to be a guest? Let us know @FogCreek.

Recent Interviews

Eric Lippert
Eric Lippert
Chris Hartjes
Paul Jones
Paul M. Jones
Michael Fogus
Michael Fogus

by Gareth Wilson at May 28, 2015 11:54 AM

Lambda the Ultimate

The evolution of Rust

Graydon Hoare is the original developer of Rust even before Mozilla adopted it. For the 1.0 release he prepared a lightning talk on how the language changed over 10 years.
He only published some bullet points, but the topic list is interesting as well.

  • Six ways Rust is fundamentally different from how it started
  • Six ways Rust is fundamentally the same as how it started
  • Six things we lost along the way
  • Six things we gained along the way
  • Six things I'm irrationally, disproportionately pleased by

Read the full blog post for the content of the five lists.

May 28, 2015 09:12 AM

May 27, 2015

Fog Creek

The Abuse and Misuse of Test Automation – Interview with Alan Page

.little {font-size: 75%}
The Abuse and Misuse of Test Automation – Interview with Alan Page

Looking for audio only? Listen on

We’ve interviewed Alan Page, author of ‘The “A” Word: Under the Covers of Test Automation’. We discuss the abuse and misuse of test automation, when to automate a test, the problems of GUI test automation as well as good test design factors. Hear more about testing from Alan over on his blog and the AB Testing podcast.

Content and Timings

  • Introduction (0:00)
  • About Alan (0:28)
  • The Overuse and Abuse of Test Automation (0:53)
  • When to Automate a Test (4:06)
  • Problems with GUI Testing Automation (6:50)
  • Good Test Design Factors (9:50)
  • What Kinds of Tests Are Suited to Automation (12:37)
  • Recommended Resources (14:12)



Alan Page has more than 20 years of software and software testing experience, primarily at Microsoft. Fittingly, he was lead author of the book “How We Test Software at Microsoft.” He has recently published “The A Word: Under the Covers of Test Automation”, a collection of blog posts about the appropriate application of automation in testing. Alan, thank you so much for taking the time to join us today. Do you have a bit to share about yourself?

About Alan

I’m really excited to be here. I’ve been a big fan of Fog Creek and Joel and everything you guys do so I’m excited to be part of this interview. Thank you for having me. You mentioned over 20 years in software testing and my 20 year anniversary at Microsoft is coming up in just two weeks from Friday. Big, big milestone. I never thought I would ever work at any company, let alone Microsoft, for this long. It’s pretty remarkable.

You should automate 100% of the tests that should be automated.

The Overuse and Abuse of Test Automation

You say that “Automation is overused and overvalued in software.” Why is this and why do you think this came about?

Probably for a lot of reasons. This is a traditional systems problem. I think some of the main reasons are people wanted to use, I think initially automation as a way to replace a lot of human testing. Where those two approaches really compliment each other. I still see a lot of manual test cases, or manual testing converted to automation. I’ve been at teams at Microsoft, where one of the things we tracked early on was to track the value of our test team was the manual to automation conversion. At the time I thought this just doesn’t seem right. But I was too junior to figure out what to say about it. Over time I figured out, you know what, these are actually two different kinds of testing.

You need sort of the human… Every team has this. Especially your audience knows that these guys are just good at walking through things and going that’s not right, that’s not right, that’s not right and automation doesn’t catch any of those things. On the other hand, automation is really good for a lot of other types of testing. We just tend to in general, we, the software industry, tend to apply automation as this blanket way to do all testing when it’s really especially suited for several specific kinds of testing.

The book entitled “The A Word” focuses on the abuse and misuse of test automation in software development. What abuses and misuses have you seen?

One of the abuses is I think people trying to automate too much or automating the wrong things and there’s a quote I use. I’m sure it’s in the book because I say it all the time is that you should automate 100% of the tests that should be automated. The challenge in test design is to figure out which of those tests are best suited to be automated versus this is really going to be really error prone.

Probably the biggest abuse I’ve seen is just going crazy trying to automate too much, and even worse being very proud that you have 10,000 or 100,000 or a million automated tests when you don’t have a lot of trust over the quality of those tests or the quality of the infrastructure they’re running on or the product. I think a lot of teams get really stuck. They get… They have test failures and I believe that test failure 100% of the time should indicate a product failure. Failure of the product on your test. We all know that the first thing we look at is the test correct and did it do… What else could have gone on here? Maybe if I run it again.

Another abuse is the test failed, I run it again, they pass. Okay, everything’s fine, which just drives me nuts because you don’t know… Something was flaky. I don’t think you even have to be anal retentive to get mad about that. I am really, really scared of flaky things because that flakiness that happens once or twice inside your walls, once you scale and deliver that to 100,000 or a million people that may happen a lot more. You want to be really careful about those. I’m just really a big fan of focusing the automation on things you can really trust and verify the automation. I think the biggest misuse, just trying to automate too much and being careless about the quality of that automation and the means of doing that.

When to Automate a Test

When should you automate a test?

When it’s necessary. My rules for automation a test, well let me draw a parallel here. I coach a soccer team of 12 year olds. One of the things I talk about, and even with 12 year olds when they’re playing defence, when we get the ball in our half, I say either clear it or make 100% pass. Meaning you clear the ball hard outside or you make the pass you absolutely is going to get to your teammate accurately where they can receive the ball. I think there’s a parallel in automation. When I… The things I want to automate is I want to be 100% confident in this test. I can write this test and I can trust the value, pass fail, 100% of the time.

There’s going to be a caveat on that for a minute I think. We’re talking about unit test, functional test, regression test, the tests I want to run every day across hundreds of platforms. That is absolutely the right answer. I think there’s a little bit of a caveat when I want to write what I’ll call exploratory automation. I’m going to go what happens if I write a monkey test? Somebody just randomly clicks on buttons, etc. etc. etc. Just as a stress test. Totally fine. I’m not going to run that everyday on every build and trying to investigate every single failure. I’m using that to flush out some of the really tricky weird things. There’s all kinds of examples of that.

For those tests that I want to run everyday across lots of devices, or lots of platforms I want 100% confidence that when that test passes functionality is correct and when it fails there’s a product bug that I need to go address. My heuristic for automation is I automate when I’m bored. So when I very first started at Microsoft 20 years ago, and I was actually a contractor for six months first so this was over 20 years ago. I was handed a spreadsheet full of test cases. I knew how to code. I said, I asked my manager, “When do you need these automated?” He said, “We don’t have time to automate, you just need to run these everyday.”

I got bored about two days in and automated them anyway because I could and I could do it really quickly. I was fairly confident in my ability and I was bored. I found other things to do to fill my time. There’s always lots of work to do. I could run these automated tests and sort of a really poor man’s regression test because these lists of test cases weren’t that good anyway. I was bored. That’s one of my biggest heuristics. I was bored running the test cases. There’s a repetitive task in … I just did Lync which is now Skype for business for awhile and if I wanted to add a thousand users to see what was going to happen, I’m going to automate that. I’m never going to do that manually. I could even, I should be pretty confident that should work everyday too. So that falls into 100% category as well.

I think when you hear the phrase ‘it’s just test code’. To me that’s a code smell

Problems with GUI Testing Automation

While on automating things, a quote from your book says, “For 95% of all software applications directly automating GUI is a waste of time.” Why is this?

I think it’s really hard to get right. I think that 100% rule I have where you can really trust those tests is very difficult. I think there’s a lot of promise with automation tools is to automate end to end scenarios. For me, I think looking at end to end scenarios is very much a great activity for humans to do. We want to see how the software works end to end. Where I have seen success with automation at the GUI level is very short tests because the longer you go the more weird things can happen and the more chance for flakiness you have in that test.

Another reason, and I’m sorry to say this, is often we have is this, really scary when you think about it, to me at least… We often have our most junior developers, our brand new testers who are learning to code or maybe some company that’s where you start people. You get these very junior people without a lot of design knowledge for software and a lot of experience. You tell them write this GUI automation. You have junior people doing something that’s much, much harder than most people admit and it just makes it more prone for failure.

I think when you get success is you have developers who know what they’re doing, more senior developers. It doesn’t have to be your top developer but you have experienced people who know what they’re doing. They understand design and they’re very careful about writing tests that they can trust to show product status. That’s the case that GUI automation can actually work.

There’s a friend of mine, Chris McMahon over at Wikipedia. Every time I mention GUI automation, brings up the fact that he’s had great success doing it but the difference is Chris knows what he’s doing and knows how to be careful with it. I think a lot of people trying to write GUI automation just don’t have those skills or experience to handle the complexity of how difficult that is.

What about the 5% of cases where GUI automation does make sense?

I’m sure it’s obvious to the listeners that these numbers are not based on actual data, they’re made up for me to make a point. Anecdotally, probably about right. When you’re confident that issues will… Failure is product bugs, absolutely. Regression test, very good for quick tests, not end to end. Be careful of that. I think testing those small tasks, making sure the functionality is correct so that you can do some accurate end to end sort of testing.

I think one way to think of it is to ensure the product can be tested thoroughly by humans and those humans can be internal testers or customers versus trying to test the product end to end. I think when you try to, really when you’re trying to replace or try, you can cover all of this end to end scenarios in automation you get into trouble. I think for a series of quick tasks, verifications, making sure that the functionality across the product is correct, absolutely good places to apply automation, both at the GUI and below the GUI level.

Good Test Design Factors

At the heart of a number of test automation issues is poor test design. What are some of the important factors to consider when designing an automated test?

One is just your basic design principles for code which I think as I mentioned before when you have junior people doing that, sometimes they just don’t have that experience to apply those. One of the things I did is I was on the Xbox One team before I joined this project team at Microsoft and I was really adamant about doing something that had never been done on that team before, which is I held our test code to the exact same standards as our product code. The exact same static analysis tools, the exact same rules for code review etc. We had a really high bar for our test code. When you’re trying to ship a console to a million people and you’re trying to run massive numbers of tests across a huge number of consoles, we did not want to waste our time investigating false failures.

I think when you hear the phrase ‘it’s just test code’. To me that’s a code smell. Whenever I hear someone say that I know I need to go dive in deeper and figure out what’s going on. Some design things, like I think one big one that I apply right away is that tests do one thing. Don’t have a test function called, you know, download app, install, and make sure it works or something like that. Have a function do one thing. For developers it’s pretty obvious. You’re writing a unit test, you usually have one assertion or maybe a few if it makes sense in the logic. You’re not trying to have one test method do a whole bunch of different things.

Minimize your assumptions. The typical things around magic numbers for screen size or assuming that somebody will never suspend while running your app or running your test. Just minimize how many of those are and guard for those. Then one huge thing I look for in test code is really good logging on what’s going wrong.

Another big thing I push is when there’s a test failure, I want to be able to know… Ideally I want to know what the problem is and what the fix is or what exactly what went wrong at least, from the logging. I think another social code smell for me is well let me run that again and see what happens or let me run it under the debugger. We all know how to run debuggers and we all know how to run the test again and fiddle through of what’s going on. You save a ton of time if you put that care upfront, get the right logging in place. I really push that. I think, one phrase I use here a lot is once you have to detach the bugger you lose. It just wastes too much time. I like to get that logging right the first time. Especially when we’re deploying to a lot of people and maybe we want to pull these logs from, or maybe we have a customer run a test because they have a weird thing going on. I really push accurate logging for those tests.

In automation we just don’t leverage the power of the loop

What Kinds of Tests Are Suited to Automation

You say that using automated tests just for regression testing is short sighted. What other types of testing is automation useful?

When I look at the literature, when I talk to teams doing automation, they’re automating those functional scenarios, end to end things that we’ve already talked about but one of the areas I think a lot of teams miss is using automation for what I called earlier exploratory automation. Writing that quick perf test. You don’t need to be a perf expert and figure out what are our deltas and deviations and all these things, but it’s as a nice perf stress test, I’ll use the Skype example I gave earlier is what happens when I add 1,000 contacts? I can just write a quick little test that there’s a snapshot of memory. Add 1,000 contacts, checks memory, okay, looks good. Really that’s maybe 15 minutes to write that code. Probably faster if you already have some frameworks in place.

It’s a very valid test, and then I can think of how about I connect to a call and disconnect. Again very short steps, but I think we err towards, again it’s a general we. We err towards trying to hit those user scenarios versus the things that automation and programming are great for are looping and do things a whole bunch of times seeing what happens. I think we lose a lot of value by not going oh yeah, this is a thing that’s really awful and impossible to do by hand but easy and fun and quick and often valuable to do using code. I found a lot of times in automation we just don’t leverage the power of the loop.

Recommended Resources

What are some useful resources for those wanting to learn more about a holistic approach
to software tests?

My favorite book, and I said this many times before on sort of the functional testing part… This is good for developers as well as testers, like kind of getting into the idea of everything from the basics of functional testing, beyond unit testing, but functional testing to even getting into model based testing a little bit is Lee Copeland’s book “Practitioners Guide to Software Test Design” I always like that for a beginning book. It’s very quick and to the point and Lee’s kind of a funny guy. There’s some humor in there. It reads really well for me. On the other end, for thinking more about the systems thinking part of what software testing is, sort of the philosophical side is Jerry Weinberg’s book “Perfect Software and Other Illusions”. It kind of gives you that other end of it.

In between, there’s another line I use, not in the book. It said, when I first started studying software testing I read one book and thought I knew everything, and then I read another book and was confused. It wasn’t until I read my third, fourth, and fifth book and started reading blog posts and articles that I began to form my own opinions. There is so much out there and you don’t learn what to throw away I think until you begin to form your own opinions.

Thank you so much for taking your time to join us.

It was a lot of fun. Thanks for having me.

by Gareth Wilson at May 27, 2015 09:47 AM

Bret Victor

The Web of Alexandria (follow-up)

A follow-up (disambiguation? expansion?) regarding The Web of Alexandria.

by Bret Victor at May 27, 2015 02:33 AM

May 26, 2015

John Udell

Training and bug reporting should be part of every app

People aren't good at reporting software bugs. Moreover, software isn't good at self-reporting -- particularly when it's browser-based software. These conversations happen every day:

User: The new Frobinator isn't working anymore.
Developer: What did you do, what did you expect to happen, and what did happen?
User: I clicked on the Frobinate button, I expected it to work, it didn't.
[ Also on InfoWorld: Get real about user security training." | Get a digest of the day's top tech stories in the InfoWorld Daily newsletter. ]

We've all been there. Frobinate, let's say, was supposed to populate a widget with data. Maybe it found no data at all; maybe it found the wrong data. Maybe the widget never appeared. Whatever the problem may be, we have to be able to reproduce it in order to address it.

To read this article in full or to leave a comment, please click here

by Jon Udell at May 26, 2015 10:00 AM

Tim Ferriss


Try this morning tea cocktail instead of coffee. It’s rocket fuel for the brain.

I started experimenting with fat-plus-stimulant beverages in 1998 and 1999 while on the Cyclical Ketogenic Diet (CKD). For the above tea blend, I now add turmeric and ginger to the aged pu-erh, usually Rishi brand.

The above video was shot while filming the parkour episode of The Tim Ferriss Experiment TV show. We filmed 13 episodes back-to-back and I needed a morning pick-me-up that could be prepared quickly but sustain me for hours.

The tea prep might seem reminiscent of Bulletproof Coffee, and it is.  They serve similar purposes.  For this reason, I jokingly referred to the cocktail as “Titanium Tea” with the production crew.

Alas, BP coffee looks like a delicious frappuccino, and my concoction looks like diabetic horse urine.

Here’s why I still drink TT Horse Urine nearly every day:

  • I’m a caffeine “fast metabolizer” according to genetic test results from 23andMe, Navigenics (since acquired), and personal experience. If I drink a cup of black coffee, I feel like a superhero for 30 minutes, then need two cups to get back to baseline. But…
  • When I use a blend of — say — green tea and fermented black tea, I’m combining slightly different pharmacokinetics and biological half-lives, so respective peak plasma (blood) concentrations of stimulants and other compounds are staggered. Instead of one single high point and then a rapid descent into fatigue, I have multiple high points. Rather than feeling amazing for 30 minutes and then fatigued, I can feel 20% more effective for 3-4 hours.

  • This can be extended further if I include a tea like yerba mate (I like Cruz de Malta), which includes three xanthine alkaloids. For our purposes, you can think of these three xanthines as “stimulants”: good old caffeine (by weight, often <50% compared to coffee), theophylline (found in green tea), and theobromine (the primary alkaloid in cocoa and chocolate). Yerba mate isn’t the only tea to include these three, but the ratios in yerba mate appear optimal for my biochemistry and creative writing.

  • NOTE: The most extended effect is only achieved if you sip the yerba using traditional technique. The gourd is my constant companion — plus one glass of Malbec — for 10pm-4am jam sessions when on book deadline. Just as coca-leaf teas don’t = cocaine, which doesn’t = crack, the form and speed of administration matters. For the nerds, this is why powdered “good” foods (e.g. bean flour) aren’t always compliant with the slow-carb diet.

  • If I rely on theobromine and/or theophylline as my uppers, instead of primarily caffeine, I can quit stimulants cold turkey without caffeine-withdrawal headaches. This can be a massive competitive and health advantage, as you can cycle off of stimulants to minimize tolerance development.

  • But — I’m not a doctor and don’t play one on the Internet! As always, the dose makes the poison. Excessive theophylline and theobromine have plenty of adverse effects, particularly when consumed with fat like coconut oil (i.e. “dose dumping“). So speak to your doc first if you have any medical conditions, m’kay?  This is an N=1 article.

  • I still drink coffee on occasion, especially if empty handed in the middle of nowhere. It’s a hell of a lot easier to find coffee and butter than pu-erh tea and coconut oil. Definitely 10x better than straight black coffee, and kudos to Dave Asprey for taking it mainstream. It’s now ubiquitous, and that’s no small feat. Many of the top performers I know drink BP coffee, including legendary producer Rick Rubin.

  • For more quick-tip videos like the above, click here.

    For 13 full-length episodes shot by an Emmy award-winning team, click here or on the image below.


    by Tim Ferriss at May 26, 2015 03:11 AM

    May 25, 2015

    Bret Victor

    The Web of Alexandria

    Vannevar Bush's "library of a million volumes, compressed into one end of a desk" may sound quaint to us today. Bush naively assumed that immediate access to a million volumes would require the physical presence of those million volumes. His proposal -- a million volumes in every desk.

    by Bret Victor at May 25, 2015 01:00 AM

    May 24, 2015

    Blaine Buxton

    Getting a USB sound card configured for Raspberry Pi 2

    I recently tried to get a USB sound card working on a Raspberry Pi 2. My motivation was to start working on audio applications like writing my own synth. It's something I've wanted to do for a long time, but some odd reason never got around to it. At first, I simply tried to output sound via the built-in sound card. This experiment was successful of course, but there was a lot of noise in the output. I tested using the SonicPi program that comes with the Pi.

    My next experiment was to use a USB sound card that I had gotten for cheap. Apparently, these are hit and miss and if I were to do it over again, I would get one from Adafruit where they sell ones that have been tested for the Pi. Everything worked out so I lucked out, but the path to success was not obvious. For your information, I used the CMedia HS100 from NRGtech. I also used the latest version of Raspbian (Debian Wheezy) and updated my pi firmware with "sudo rpi-update" before I even started since most guides mentioned to do this for latency.

    Before I begin, I was repeatedly given the ALSA (Advanced Linux Sournd Architecture) document. There's a lot of information in there. I hope to spend sometime read it more thoroughly, but when you're trying to get something simple working, it's like drinking from a fire hose.

    1. Plugin the USB sound card.
    2. Navigate to the Menu>Preferences>Audio Device Settings.
    3. At the top of the dialog, there is a drop down for the sound card. Mine displayed "bcm2835 ALSA mixer) (Default)". Click it and you should see your new USB sound card. Again, mine displayed "USB PnP Sound Device (Alsa Mixer)".
    4. Select the USB sound card.
    5. Click "Make Default" button.
    6. You can click "Select Controls..." which brings up a dialog for you to be able to select things it can use to change settings on your sound card. I selected everything.
    7. Make sure volume is up and USB soundcard is connected to either headphones or speakers. To verify, my speaker setup, I used the built-in audio output first before connecting USB sound card.
    8. Edit /etc/modprobe.d/alsa-base.conf with your favorite editor (sudo vi /etc/modprobe.d/alsa-base.conf). I strongly recommend making a backup of this file. You can also follow this from an Adafruit article as well.
    9. Find the line "options snd-usb-audio index=-2" and change it to "options snd-usb-audio index=0".
    10. Add another line below the edited line: "options snd_bcm2835 index=1"
    11. Save the alsa-base.conf and reboot the pi (sudo reboot).
    12. speaker-test -c2 -D hw:0,0. This should work. You will hear white noise from left to right on your speakers.
    13. aplay -D hw:0,0 /usr/share/sounds/alsa/Front_Center.wav
    14. Success? Or did you get "Channels count non available". If success, you can stop now and celebrate. Have some fun with SonicPi!
    15. sudo aplay -D hw:0,0 /usr/share/sounds/alsa/Front_Center.wav
    16. This probably worked. If so, the answer is simple. Edit the $HOME/.asoundrc (vi $/.asoundrc). Back up the original is again strongly recommended.
    17. Clear the existing contents of the .asoundrc.
    18. Add "defaults.ctl.card 0"
    19. Add "defaults.pcm.card 0"
    20. Add "defaults.pcm.device 0"
    21. Save .asoundsrc. Try "aplay -D hw:0,0 /usr/share/sounds/alsa/Front_Center.wav" again.
    22. Success? Excellent. Glad this guide can help. If you are still having issues: this article and this one too helped me figure out what was going.
    I wrote this guide up mainly for myself so I don't forget it and to use again. Hope it helps you as well.

    by Blaine Buxton ( at May 24, 2015 06:02 PM

    Giles Bowkett

    May 21, 2015

    Fog Creek

    FogBugz Gets the Full Spa Treatment

    With almost 15 years of trusty and reliable service, we decided it was time to pamper FogBugz a little. And what better way to do that than with a full spa treatment.

    Now you might be thinking “Whoa! 15 YEARS!”, and you’re absolutely right, that’s a lot of time. Especially if you consider that Internet years are pretty much like dog years. Amiright?

    We’re incredibly lucky to have such loyal customers who have been using FogBugz for a super long time and are used to how FogBugz looks and feels. So as you can imagine, whilst we knew it was time to make changes, we had to be careful and subtle.

    We started with the two most visited views in FogBugz: a warming exfoliation to the List Page and a bespoke massage to the Case Page. Here’s how they’ve been refreshed:

    The List Page: before & after

    The Case Page: before & after

    We softened up the edges here and there and we updated our icon system too, making things easier on the eye. But most importantly, we made your content and your cases easier to read and skim through.

    We hope that these changes improve your experience while using FogBugz and give you the warm, tingly feeling of a Bee Venom face mask (it’s a thing, apparently) as you resolve your cases.

    But our treatment didn’t stop there. As you may have also seen, we’ve been giving some love to other areas of FogBugz lately too. Like the new User Options page, in-app notifications and activity feed as well as improvements to the Filters menu. Not to mention the release of Iteration Planner, adding support for your Agile and Sprint Planning needs.

    Design is never done and FogBugz is no exception. Even after 15 years, we’re still working on making FogBugz the best issue and bug tracker in the world.

    Now, who’s up for an ultimate holistic skin therapy treatment?

    by Enrique Sánchez at May 21, 2015 06:56 PM

    Lambda the Ultimate

    Composite Replicated Data Types: eventually consistent libraries as non-leaky abstractions

    Composite Replicated Data Types
    Alexey Gotsman and Hongseok Yang

    Modern large-scale distributed systems often rely on eventually consistent replicated stores, which achieve scalability in exchange for providing weak semantic guarantees. To compensate for this weakness, researchers have proposed various abstractions for programming on eventual consistency, such as replicated data types for resolving conflicting updates at different replicas and weak forms of transactions for maintaining relationships among objects. However, the subtle semantics of these abstractions makes using them correctly far from trivial.

    To address this challenge, we propose composite replicated data types, which formalise a common way of organising applications on top of eventually consistent stores. Similarly to a class or an abstract data type, a composite data type encapsulates objects of replicated data types and operations used to access them, implemented using transactions. We develop a method for reasoning about programs with composite data types that reflects their modularity: the method allows abstracting away the internals of composite data type implementations when reasoning about their clients. We express the method as a denotational semantics for a programming language with composite data types. We demonstrate the effectiveness of our semantics by applying it to verify subtle data type examples and prove that it is sound and complete with respect to a standard non-compositional semantics

    May 21, 2015 03:29 PM

    May 20, 2015

    Giles Bowkett

    An Annoyance: "Virtuoso Mixer Players"

    When a radio interviewer asked deadmau5 about his disrespect for DJing as an art form, deadmau5 said he didn't know any virtuoso mixer players.

    But anybody who knows anything about dub music knows that dub is all about virtuoso mixer players.

    Turntablism is also all about virtuoso mixer players.

    When I saw Underworld perform live, one member of the band was only playing the mixer at all times.

    If you don't know of any virtuoso mixer players, then you don't know about Underworld - one of the greatest electronic acts of all time - and you don't know about dub or turntablism - two entire genres which have both shaped electronic music.

    deadmau5 is an interesting producer and his live shows have tremendous style. But he talks a lot of shit, and he doesn't always know what he's talking about.

    Here's Orbital playing mixers, synths, iPads, and more.

    And here's a virtuoso mixer player.

    by Giles Bowkett ( at May 20, 2015 10:18 PM

    Tim Ferriss


    Danielle Teller and Astro Teller on the Tim Ferriss Show

    [Preface: Would you like to sponsor The Tim Ferriss Show, the #1 business podcast on iTunes and one of the iTunes “Best of 2014″? Click here for details.]

    Dr. Astro Teller is a computer scientist and entrepreneur who currently oversees Google[x], Google’s moonshot factory. Dr. Danielle Teller is a physician specializing in intensive care and lung medicine; she has trained doctors and run research programs at Harvard University and the University of Pittsburgh.

    Together, they are the authors of Sacred Cows.

    In this conversation — my first podcast with a couple — we cover a lot of my usual questions (favorite books, routines, philosophies of living, etc.) but focus on something I haven’t personally figured out: relationships.

    It’s important to note that the Tellers are not “for” marriage but, rather, “for” the freedom to decide how to live most honestly and happily, whether as part of a couple or as a single person.

    Combining the rigor that has established them as leaders in their respective fields, Astro and Danielle walk me through how they think about relationships, and how they survive and thrive as two driven people.

    Sidenote: Want to see me tackle dating experiments, struggle with live “cold approaches,” and optimize online dating with a computer hacker? Be sure to watch my “Dating Game” episode of The Tim Ferriss Experiment here.

    Enjoy the podcast below!


    This podcast is sponsored by LSTN Headphones. LSTN Headphones are gorgeous headphones that I use. They’re made of real exotic, reclaimed wood. Proceeds from each purchase help a hearing-impaired person hear for the first time through the Starkey Hearing Foundation. Here are some of the headphones I wear and travel with: that page, use the code “TIM” to get $50 off orders of $99 or more!

    This podcast is also brought to you by 99Designs, the world’s largest marketplace of graphic designers. Did you know I used 99Designs to rapid prototype the cover for the 4-Hour Body? Here are some of the impressive resultsClick this link and get a free $99 upgrade. Give it a test run and share your results!

    QUESTION(S) OF THE DAY: Are you pursuing monogamy? Why or why not? Have you figured out other rules that work for you and your partner? Please (seriously, please) let me know in the comments! I expect this thread will have some great suggestions.

    Scroll below for links and show notes…

    Do you enjoy this podcast? If so, please leave a short review here. It keeps me going…

    Subscribe to The Tim Ferriss Show on iTunes.
    Non-iTunes RSS feed

    Selected Links from the Episode

    Get the Book on Amazon | Google Play || | TEDxBoston

    Recipe for a Monogamy Cocktail

    • 3 Parts Rosemary-Infused Vodka
    • 2 Parts Vanilla-Infused Cognac
    • 1 Part Lemon Juice

    Show Notes

    • A little bit about the work of Astro and Danielle [6:30]
    • Thoughts on the usefulness of a long-term plan [11:30]
    • Deconstructing how Astro and Danielle approach challenges and plans [12:35]
    • Exploring the “soulmate” concept of one true love [15:50]
    • Differentiating between true love and society’s view of marriage and divorce [19:30]
    • New ways of seeing marriage and creating space from social pressure [22:45]
    • Why Astro and Danielle decided to get married for a second time [28:44]
    • Thoughts on fear factors [31:00]
    • The reasons for getting married in authentically happy couples [34:20]
    • The most common mistakes type-A men make in large relationship decisions [36:20]
    • How Danielle and Astro first met [39:35]
    • Exploring my own fears of losing at the game of marriage [41:45]
    • How Danielle and Astro view conflict resolution in their marriage [46:30]
    • Family rituals of Astro and Danielle [50:35]
    • How Astro and Danielle think about managing spouse and children relationships [55:35]
    • The worst advice for “significant other” relationships [56:50]
    • Do you know single people older than 40 who are authentically happy? [59:55]
    • The most impactful $100 for Danielle and Astro [1:08:50]
    • Favorite/most-gifted books [1:13:35]
    • Who is the first person who comes to mind when you think “successful”? [1:19:30]
    • If you could ask anyone from all of history 100 questions about anything who would you choose? [1:22:05]
    • Ways in which medical/scientific training has helped with family relationships [1:23:15]
    • How Astro Teller thinks about death and how to live life intensely every single day [1:31:30]
    • How Danielle Teller measures the success of a day [1:40:15]

    People Mentioned

    by Ian Robinson at May 20, 2015 08:01 PM

    Mark Bernstein


    This 2010 series-starter and Hugo nominee is not without shortcomings. It’s another zombie apocalypse and, knowing itself late to that party, doesn’t always take its zombies seriously. It’s a power fantasy about preternaturally smart and capable teenage bloggers who are so competent that we usually forget they’re teenagers. The early chapters have barrels of exposition once we get past the stock James Bond opening chase, and minor characters are frequently reduced to their function, which leaves the world thin. The core technical problem of the YA quest – how do we get agency in the presence of parents? – is settled here by establishing a pair of (very interesting) parents and then failing to even think of them for weeks on end. Much of the science fiction – the world of 2040 where bloggers dominate new media news – was already coming true by the time the book was published, and our hero’s amazement at her sysadmin’s ability of spin up virtual servers as needed is terribly 2008. Finally, this is a book about politics, but its politicians are not very well drawn and their politics is indistinct; I can believe we’ll have viral zombification in 2040 but I’m really skeptical that we’ll have liberal Republicans.

    There’s a lot of wish fulfillment here. In the future, not only are weblogs a dominant and profitable medium, but every A-List blog employs a department of “fictionals” to fill the audience’s demand for stories – and poetry! When our heroes need to hire a head fictional, they find a simpatico young blonde who happens to be a terrific sysadmin and who wants them to call her “Buffy”.

    And yet, there really is something here. There’s a competent thriller eventually, sure, but beyond that there are vistas of real strangeness. These are children born after the end of the world. They expect to die, because that happens a lot in their world. They expect to do amazing things because they were brought up that way and that’s who they are. They don’t spend much time mourning the lost, zombie-free world. They’re out to ride fast bikes, fight off zombie attacks, buy cool equipment, and manage their site’s chat boards and merchandising. They do that well, and, in the intervals, they get out the news, poetry on deadline.

    May 20, 2015 03:31 PM

    Dave Winer

    What would you do if you woke up one morning and there was no Internet?

    I asked this question on Facebook and Twitter, and got a variety of answers.

    I think there are two "correct" answers.

    1. Start a new Internet.

    2. Cry.

    Most people say they would go do normal things that don't involve the Internet, but I think the world would take a long time to adjust. Many of us remember a world without the Internet, but we don't remember a world without the Internet that used to have the Internet.

    A question that reveals the problem is to wonder what would happen if you woke up one morning and found there was no electricity. Not much would happen in the world as it's currently configured without electricity, even though there was a time when it worked fine without it.

    I think the Internet is sufficiently integrated into our civilization at this point that if it were to be removed, it would be such an enormous shock to our economy that.. well, that's why #2 is also a correct answer.

    I'd like to think we could quickly boot up a new net. That's more likely than rebooting electricity because a lot of people who built the initial Internet are still alive and would know how to layer things so it could come back pretty quickly. Assuming the electric grid isn't dependent on the Internet. Which is itself a good question.

    May 20, 2015 12:08 PM

    Fog Creek – Interview with Michael Fogus

    In, we chat with developers about their passion for programming: how they got into it, what they like to work on and how.

    Today’s guest is Michael Fogus, Software Architect at Cognitect. He’s a contributor to Clojure and ClojureScript and author of ‘The Joy of Clojure‘ as well as ‘Functional JavaScript‘. He writes about life, programming and thinking on his blog.

    Michael Fogus
    Location: Washington, DC, US
    Current Role: Software Architect at Cognitect

    How did you get into software development?

    I was privileged to receive a Commodore 64 when I was 8 years old and it was my only computer for the next 10 years. Most of the time, I used it only to play games, but I definitely coded my share of BASIC programs (even one that was self-modifying). I remember one time my best friend and I stayed up all night typing in a canoeing game from an old computer magazine (back when they actually contained source code) and when we were done we tried running it and of course it didn’t work. The frustration was exquisite. After a half-hearted attempt to try getting it to work, we gave up and went to bed. Little did I know that I had just experienced what it was like to be a working programmer. My final projects on that lovely computer were my college entrance essays.

    I originally went to school with the intent of majoring in Philosophy and Mathematics. However, in my second year my college started a Computer Science program from scratch and I decided to take a few classes. My curriculum was based almost entirely on XLISP and Common Lisp, and I fell in love with both. I suppose you can say that the rest is history. I was one of the first students (of two) to receive a Computer Science degree from my college. Sadly I needed to stay another year to get the Philosophy degree, so I instead jumped ship and went into the (so-called) Tech industry.

    After a few years of doing CLIPS, Delphi, C, and C++ programming I switched to Java and did that for a very long time. I also took graduate courses during that time in AI working mostly in Common Lisp, Scheme, and Prolog and the contrast between the day job and course work was not in my favor. I eventually broke down and pushed for projects that were relevant to my graduate work and was fortunate enough to land on some great projects. From machine vision to expert systems development and autonomous agents to distributed simulation. I got a nice sampling of the professional “AI” landscape. I did that kind of work for a long time before discovering Clojure and Datalog and the kind of work that I’m doing currently.

    comm64 (1)

    Tell us a little about your current role

    Most of the projects that I consult on are some kind of web service backed by a distributed architecture. The fashionable term is “microservices,” but in my distributed simulation days we called them “federates” – though they tended to be more coarse-grained back then. What happens on a typical day depends on the project team that I’m working on. In any case, 99% of my time is spent remote. I’ll only say that flexibility is a virtue.

    At Cognitect, I’m currently working as a consultant with a company that has the largest Clojure codebase that I’ve ever worked with. My niche with Cognitect has been to work with companies that are looking to use Clojure to build their business, or with companies that have existing Clojure code and would like a thorough code and/or architecture review, or that need a “mentor.”

    On Fridays, I’m free (as in freedom) to work on open-source projects and recently the majority of that time has gone toward getting Clojure 1.7 released. Lately, I’ve been screening patches which is a wholly thankless job, but one that I find challenging and that allows me to get a better grasp of the features and bug fixes in the pipeline.

    Besides my work on Clojure (and rarely ClojureScript), I have been toying around with little programming languages, libraries, and the toy databases to explore interesting ideas. I call these “code paintings.” The biggest challenge in doing these one-shot projects is that I can take them too seriously sometimes, when in reality they’re meant as a form of play.

    When are you at your happiest whilst coding?

    Programming is the only activity that I’ve ever done that’s compelled me to jump out of my chair, yelp, and pump my fist into the air while completely alone in an empty house. I guess whatever provokes those reactions is when I’m happiest. Though working at home allows me to write code while singing some Violent Femmes or the theme song to Raising Arizona, so those times are nice too.

    raisingArizona (1)

    What is your dev environment?

    My development environment is pretty humble these days. Though I do have a nice MacBook Air with dual monitors and OSX for my workspace, I tend to spend most of my time in Emacs writing Clojure. I would have a hard time divorcing myself from Emacs at this point, but truly my most important software tools are my pen (a hacked G2 pro) and notebook (Tops quad ruled lab book). I would literally (in the modern sense) die without my notebooks.

    What are your favorite books about development?

    In no particular order:

    • ‘Out of the Tarpit’ by Marks and Moseley
    • ‘Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I’ by McCarthy
    • ‘LISP 1.5 Programmer’s Manual’ by McCarthy, Edwards, Hart, and Levin
    • ‘META II: A Syntax-oriented Compiler Writing Language’ by Schorre
    • ‘Reasonable LISP’ by Queinnec
    • ‘Open, Extensible Composition Models’ by Piumarta
    • ‘An Association-based Model of Dynamic Behavior’ by Piumarta
    • ‘Open, Extensible Object Models’ by Piumarta and Warth
    • ‘STEPS Toward The Reinvention of Programming’ VPRI
    • ‘The Fundamentals of New Computing’ mailing list
    • ‘The Influence of the Designer on the Design – J. McCarthy and LISP’ by Stoyan
    • ‘Wabi-sabi for Artists, Designers, Poets, and Philosophers’ by Koren (thanks, Sam!)
    • ‘How Buildings Learn: What Happens After They’re Built’ by Brand
    • ‘The Art of the Metaobject Protocol’ by Kiczales
    • ‘Thˆe Early History of Smalltalk’ by Kay
    • ‘Smalltalk-72 Instruction Manual’ by Kay and Goldberg
    • ‘To Trap a Better Mouse’ by Piumarta
    • ‘Are We There Yet?’ by Hickey
    • ‘The Language of the System’ by Hickey
    • ‘Growing a Language’ by Steele
    • ‘Systems that Run Forever Self-heal and Scale’ by Armstrong
    • ‘Programming Should Eat Itself’ by Amin
    • ‘Complex Information Processing: A file structure for the complex, the changing, and the indeterminate’ by Nelson
    • ‘The LISP70 Pattern Matching System’ by Tesler
    • ‘Derivability, Redundancy, and Consistency of Relations Stored in Large Data Banks’ by Codd
    • ‘A Relational Model of Data for Large Shared Data Banks’ by Codd
    • ‘Extending the Database Relational Model to Capture More Meaning’ by Codd
    • ‘Ideal Hash Trees’ by Bagwell
    • ‘Production Matching for Large Learning Systems’ by Doorenboros
    • ‘Soft Stratification for Transformation-Based Approaches to Deductive Databases’ by Behrend
    • ‘Practical Predicate Dispatch’ by Millstein
    • ‘Flavors: Message Passing in the LISP Machine’ by Weinreb and Moon
    • ‘Predicate Dispatching: A Unified Theory of Dispatch’ by Chambers
    • ‘Worlds: Controlling the Scope of Side Effects’ by Warth and Kay
    • ‘BEINGS: Knowledge as Interacting Experts’ by Lenat

    I’d love to fit all of these ideas into a programming language one day.

    What technologies are you currently trying out?

    • 1. Erlang
    • 2. Quadcopter drone
    • 3. SML
    • 4. Everything else under the sun

    quadcopter (1)

    When not coding, what do you like to do?

    I like to read, and I read a lot. When I’m not reading I play Baseball, tabletop board and card games, dabble in designing the same, and occasionally make music (if you call that screeching that comes out of my face music).

    What advice would you give to a younger version of yourself starting out in development?

    You don’t know what you’re talking about!


    Thanks to Michael for taking the time to speak with us. Have someone you’d like to be a guest? Let us know @FogCreek.

    Recent Interviews

    Peteris Krumins
    Peteris Krumins
    Eric Lippert
    Eric Lippert
    Chris Hartjes
    Paul Jones
    Paul M. Jones

    by Gareth Wilson at May 20, 2015 09:09 AM

    May 19, 2015

    Fog Creek

    Welcome Back, Project Groups!

    Ladies and Gentlemen, it is with great pleasure that we announce the long awaited arrival of Project Groups in FogBugz On Demand!

    Project Groups are a way to organize your Projects together in FogBugz so that it’s easier to search and filter by multiple Projects at once. This feature was previously available as a plugin but is now available for all, so long as you’ve switched to the new, shiny and fast FogBugz UI. If you’ve been holding off, then now’s the time to upgrade (and if you’ve been using the plugin, then all the project groups you’ve already defined will come with you)!

    Here’s a little more about how Project Groups can help you to be more productive:

    Let me tell you a story. A true story… ok, perhaps it is more of a realistic story*.

    *Any resemblance to real persons or actual facts is purely coincidental.

    Katyusha and the Neverending Search String

    Katyusha recently signed up for a FogBugz On Demand account. She works as a freelance software consultant. She is hard-working and loyal, so she has many repeat clients. She usually has about four or five clients at one time, each with multiple projects and she likes to keep past projects around for later reference.

    However, Katyusha noticed that there was no obvious way to group Projects together. She resolved to have one or more manual filters for each client, made of very long Search For queries, like:

    project:"Dogebot" OR project:"Doge-o-matic" OR project:"Wow" OR project:"Very Project"

    This worked but was a real pain to maintain. Every time she started a new project for a client, she had to manually update all of the filters’ Search For values.

    But now with Project Groups, Katyusha woes have come to an end. She can now just create a Project Group.

    This means she doesn’t need the ugly Search For strings anymore, and instead can make use of Project Group filters. She can even make rapid queries using the projectGroup search axis. For instance:
    This will give her the same set of cases of the neverending search string above.

    So Katyusha, FogBugz and her clients lived happily ever after. The End.

    Nice ending, isn’t it? All stories should end so well!

    So, wait no longer and join Katyusha: sign up or upgrade to the new FogBugz On Demand!

    by Emanuele Tamponi at May 19, 2015 03:33 PM

    Giles Bowkett

    Update re Live Electronic Music Performance Design

    Last year, I wrote about an idea I had — a way to bring back some elements of classic raves and see those elements survive better. Over the years, rave music has done incredibly well, while rave events have almost been crushed by governments. The difference is, at a concert, the artists are special and the audience is there to see them, while at a classic rave, things were set up for the dancers first and the DJs second.

    My design was a hybrid of a concert, a rave, a hippie drum circle, and a video game arcade. A performer plays drums in the center, while audience members can play along in little drum pods scattered in a circle around the performer. All the drums are electronic. They play sounds like a normal drum, but they also trigger video software. Thus the "audience" plays a part in creating the event.

    Contrast this with the amazing setup the Glitch Mob uses to perform live:

    I love this and hate it too. It's excellent work. It's beautiful. It's badass. It incorporates, updates, and adapts Japanese taiko drums while still remaining respectful of the original source material — a balance which artists often get wrong. But it's still 100% about the artists being special and the audience being there to see them, which to me seems much more like a rock concert than a club or a rave.

    Also, at one point in the video, one of the Glitch Mob's shocked that a Hollywood set designer can draw, which is kind of ridiculous, because that's the job. And as a programmer, there are moments which seem silly too, because they wrote custom software, but all it seems to do is function as a bus for controller input. In the age of Overtone and Quil, that's kind of a letdown, especially given the stuff other artists are doing with custom software.

    Anyway, back to my own design: in addition to these little 3D sketches. I also wrote a basic version of the software I had in mind. My drumming in this video is terrible, and so is the software, really, but it illustrates the basic idea. Hitting the drums triggers color changes in computer-generated visuals.

    I've been outdone in this category as well. This is a promo video for the Critter & Guitari Rhythm Scope, an analog video synthesizer which responds to sound:

    The interesting thing about this, to me, is that it's analog rather than digital.

    Speaking of which, the performer in my design had a strobe light attached to their drum set. It's the little black box with a grey mesh:

    I bought a strobe light and attempted to integrate it with my electronic drum kit using a protocol called DMX. Got absolutely nowhere, although I found some existing solutions in Ruby and Node (using both CoffeeScript and JavaScript).

    But I've discovered that a small company in Italy makes a Eurorack solution for this, which links DMX to CV instead of MIDI. (Rolling your mouse over the bottom of the video brings up an audio control, although this rather stupidly assumes you're on a computer, not a phone or a tablet.)

    More news as events warrant.

    by Giles Bowkett ( at May 19, 2015 08:19 AM

    Blue Sky on Mars

    Just Don’t Hire 0x Engineers

    During one of my philosophy courses at school, my professor gave us an in-class assignment:

    For the next five minutes, I want you to think about literal Hell. What would it be like? What would you feel and experience?

    And we sat and contemplated what Hell would be for each of us. And then we discussed it. Lots of fire and brimstone. Torture. Pain. It was a pretty lovely discussion.

    Then he flipped it on us:

    For the next five minutes, I want you to think about literal Heaven. What would it be like? What would you feel and experience?

    Surprise, surprise: this was a really shit way to spend five minutes. You first think cool, I get to see all my dead friends and family again. But then you wonder what age they’d all be. And then like, even your BFF is kind of an asshole to you sometimes, do you really want him there? But you also don’t want everyone being complacent zombies all the time- that’d be no fun either. So maybe you just imagine a non-stop orgy and MDMA bender. But wouldn’t that get boring sometimes, too? Variety is the spice of the after-life, after all.

    After about a minute of this we all just got bored. But he made us sit there and think about this for the full five minutes. It was surprisingly maddening. This was supposed to be Heaven, dammit. Eternal happiness. This should be easy.

    It turns out, it’s much easier to focus on avoiding pain than it is to envision pleasure.

    The 10x A-Player Rockstar Engineer

    The hip thing nowadays is that your software company should hire only A-players instead of B- or C-players, or focus on engineers that are ten times better than anyone else. Whether or not that’s true is debatable and dependent on how you're able to measure it, but I think the sentiment itself is the wrong question to ask.

    A Hipster Cat

    Their About page may say otherwise, but — drumroll, please — the average company is pretty average. Not everybody can hire exclusively top-tier people. And you know what? That’s fine. Quality of individuals is only one part of what makes an organization great. Sports is rife with examples of the nimble, well-connected team triumphing over the team of individual superstars.

    When I worked at Gild, it became pretty clear that while nearly all companies boasted that We only hire A-players!, the reality was that most of the companies using our hiring software were most interested in finding people that don’t suck. They wanted good people that they didn’t need to pay the top 1% of salary in the world for. It’s pain avoidance rather than pleasure seeking behavior. It’s worrying about Hell rather than trying to get to Heaven. Basically, most people were Billy Beanes rather than Steve Jobses.

    None of this is bad. What I think is bad is that there’s so much pride and focus on The Best of the Best of the Best, With Honors. It’s setting a pretty fucked up expectation for our industry.

    Not everything a Michelin

    This is an interesting tendency that can occasionally cut across a lot of different areas in your product.

    A few years back I had just landed in Amsterdam and was desperately looking around for breakfast. I checked Foursquare and saw that two of my friends had eaten at a small place just up the block. I figure they must have done at least some research to go there, so it probably wasn't terrible. I ended up eating there and it was perfect. It wasn’t a Michelin star restaurant, because I didn’t need something amazing; all I wanted was to avoid eating shitty food.

    When we’re building product, we tend to use words like best, perfect, optimized, and other top-tier words like that. That’s fine; certainly you want to help your user out as much as possible.

    But with whatever you’re building, step back and realize that sometimes quick is better than best. Or flexible might be better than optimized.

    Sometimes people just want a greasy burger.

    May 19, 2015 12:00 AM

    May 18, 2015

    Mark Bernstein

    Scott Rosenberg

    Scott Rosenberg on links: Will Deep Links Ever Be Truly Deep?

    Every time a writer or speaker creates a project by laying out ideas in a program like Tinderbox, DevonThink, Scrivener, Workflowy, Evernote, or [your favorite here!], she is living out a little of Bush’s Memex dream.

    May 18, 2015 10:17 PM

    Tim Ferriss

    Tim Ferriss

    This short video might blow your mind.

    Using household items like paper clips or toothbrushes, you can easily defeat 70-80% of the padlocks out in the world.

    The teacher is Kevin Reeve of OnPoint Tactical. Kevin has trained and consulted for the FBI, Secret Service, SWAT, and elite military units like Marine Force Recon, SEAL Team 6, etc.

    He was also my teacher for the “Urban Escape and Evasion” episode of The Tim Ferriss Experiment, which is currently the #1 non-fiction TV show across all of iTunes.

    In that episode, Kevin teaches me (and therefore you):

    • How to escape common restraints like zip ties and handcuffs.
    • How to “borrow” cars in emergency situations.
    • Effective evasion tactics for urban environments (e.g. parking garages, fast appearance changes, etc.).
    • And much more…

    I get restrained, hooded, thrown in a trunk, and subjected to other abuse. My (least) favorite part was getting stun gunned while temporarily blinded. Surprise, Ferriss!

    If you’ve ever fantasized about being Jason Bourne — or simply being ready for anything — the entire episode is full of effective and easy-to-learn techniques.

    I suggest getting the “Season Pass” for $14.99 or so, which gets you all 13 episodes for ~40% off, plus hours of bonus footage. Many of you have said that the bonus footage alone is worth more than the $15.


    Bestselling author Tim Ferriss (“The world’s best human guinea pig.” – Newsweek) pushes himself to the breaking point, attempting to learn notoriously punishing skills–surfing, parkour, professional poker, Brazilian jiu-jitsu, online dating (Ha!), learning languages, etc.—in just one week each. Filmed and edited by the same team behind Anthony Bourdain’s hit shows (Zero Point Zero).

    In every episode of The Tim Ferriss Experiment, Ferriss partners with the world’s best and most unorthodox teachers (Laird Hamilton, Marcelo Garcia, Stewart Copeland, etc.), who train him for a final gauntlet. Shocking breakthroughs, injuries, epiphanies, and disasters ensue. In cases where he succeeds, Tim shows you how to replicate his results. The mantra of the show is “you don’t need to be superhuman to get superhuman results…you just need a better toolkit.”


    by Tim Ferriss at May 18, 2015 07:39 PM

    Mark Bernstein

    How Not To Crash

    A series from Brent Simmons on How Not To Crash. Part 2: don’t enumerate mutable collections, because no one’s that smart. Good advice.

    Obviously, you’d make an exception for really huge collections, collections so big that the copy is expensive. But in that case, you probably don’t want to be enumerating the collection in the first place, not if you can help it!

    You might also be wondering about small collections enumerated in tight loops. You’d be wrong. Either the outer loop is small, in which case the copies don’t cost much, or the outer loop is not small, in which case your operation is at least quadratic and you’re probably headed for trouble.

    May 18, 2015 02:44 PM

    John Udell

    For remote collaboration, Google Apps still can't be beat

    If you work in tech, you're probably familiar with a common way to facilitate a team meeting.

    Everyone is given a pad of yellow Post-it notes and a small sheet of green sticky dots. At the start of the exercise, each person writes down a few possible topics, one per Post-it note, and sticks their Post-it notes on a wall.

    [ Get the most out of Google with InfoWorld's quick guide "25 tips and tricks for Google Drive power users." Download the PDF today! | Cut to the key news in technology trends and IT breakthroughs with the InfoWorld Daily newsletter, our summary of the top tech happenings. ]

    In the next phase, everybody walks over to the wall and arranges the notes in clusters. Finally, people vote on which topics to discuss by putting sticky dots on the appropriate clusters. It's any effective way to discover what the team has on its collective mind and, thus, how the team's precious "together time" can be used best.

    To read this article in full or to leave a comment, please click here

    by Jon Udell at May 18, 2015 10:00 AM

    Giles Bowkett

    Underrated Synth: The Korg Wavestation

    Never buy music gear without looking it up on YouTube and Vintage Synth Explorer first (or Gearslutz, or ModularGrid). And never pay for music gear without looking up the price history on eBay for the last three months. It takes five seconds and it'll save you a lot of money.

    I recently found a Korg Wavestation SR on eBay for less than $200. Although they sometimes go for less, they usually go for more. I've had my eye out for a Wavestation for a long time, and seeing one in Richie Hawtin's live setup didn't hurt. But to be sure, I checked YouTube, where I found this demo:

    It's painfully 90s, and it sounds as if it was made on the same machine that the entire X-Files theme song was made on, but that's because it was. It's also kind of awesome, in a painfully 90s way.

    by Giles Bowkett ( at May 18, 2015 09:24 AM

    May 17, 2015

    Lambda the Ultimate

    Draining the Swamp: Micro Virtual Machines as Solid Foundation for Language Development

    Draining the Swamp: Micro Virtual Machines as Solid Foundation for Language Development
    Kunshan Wang, Yi Lin, Stephen Blackburn, Michael Norrish, Antony Hosking

    Many of today's programming languages are broken. Poor performance, lack of features and hard-to-reason-about semantics can cost dearly in software maintenance and inefficient execution. The problem is only getting worse with programming languages proliferating and hardware becoming more complicated. An important reason for this brokenness is that much of language design is implementation-driven. The difficulties in implementation and insufficient understanding of concepts bake bad designs into the language itself. Concurrency, architectural details and garbage collection are three fundamental concerns that contribute much to the complexities of implementing managed languages. We propose the micro virtual machine, a thin abstraction designed specifically to relieve implementers of managed languages of the most fundamental implementation challenges that currently impede good design. The micro virtual machine targets abstractions over memory (garbage collection), architecture (compiler backend), and concurrency. We motivate the micro virtual machine and give an account of the design and initial experience of a concrete instance, which we call Mu, built over a two year period. Our goal is to remove an important barrier to performant and semantically sound managed language design and implementation.
    Inside you will find the specification of an LLVM-inspired virtual instruction set with a memory model (enables proper GC support) including a specification of concurrent weak-memory operations (reusing C(++)11, a debatable choice), relatively rich control-flow primitive (complete stack capture enabling coroutines or JIT-style de-optimization), and live code update.

    May 17, 2015 09:46 PM


    Phuctor Broke Several RSA Keys.

    (5/20 Update: This.)

    (5/18 Update: Tired of the contemptible media disinformation and faux-reporting on this subject? For some fresh air, see Mircea’s article, ‘On how the factored 4096 RSA keys story was handled, and what it means to you.’)

    Phuctor, “The RSA Supercollider,” is a long-term collaborative project of yours truly and Mircea Popescu.

    I am pleased to announce that we have now broken a 4096-bit RSA key, as well as its factor-sharing counterpart (yet to be determined, but won’t wait for long!)

    At five minutes prior to the time of this writing, another pair of keys has also been broken.  See Mircea’s site for updates.

    Readers who wish to learn more about this project are invited to join Mircea, myself, and many other fine folks on Freenode in IRC channel #bitcoin-assets. Click here for a WWW-based gateway. Politely privmessage an “up please” to one of the regulars to get speaking rights.

    Edits, Corrections:
    1 ) Threads on Reddit, Hacker News. (5/18: If you care to read these, do it while they’re still up.)
    2 ) Selected hate mail. Will update this section if any more contenders for this list should appear.
    3 ) May 17 ~16:10 EST: Aaand we got another! A GNU developer, like the first. Which makes for six phuctorable keys, three of which are presently known to me.
    4 ) Before joining the chorus of ‘Holy shit, they broke RSA!’ or ‘This is false advertising, they didn’t really do anything!’ imbeciles, please consider reading the (one whole page!) description of what Phuctor actually does.
    5 ) If you are in the service of the enemy, and think that you can somehow prevent or retard the search for weak (weak for whatever reason! I don’t weaken them, only search…) fielded RSA keys, think again. The data set is public in its entirety, and the experiment can be replicated by a schoolboy with minimal sweat. Go ahead and remove the diddled keys from public servers, if you like. We have copies.
    6 ) This is addressed to the same fine folks as #5. Your efforts to bury the story in FUD and hastily-concocted disinformation are riotously funny. Please carry on.
    7 ) Consider getting your tech news from journalists who can spell. (Seriously, ‘Phunctor’ ?!)
    8 ) (5/18) We found a number of moduli, including several pairs which share a large composite factor.  Stay tuned.
    9 ) Folks who believe that ‘anyone can insert anything into SKS‘ are invited to replace my key there with their own.
    10 ) (5/19) As of today, there are 10 broken moduli.

    by Stanislav at May 17, 2015 05:44 PM

    Dave Winer

    Apple Watch liveblog notes

    I got my Apple Watch last week, and I pretty much love it.

    I started taking notes on my exploration on my liveblog, which was designed for cumulative projects like this one. I wanted to be sure readers of Scripting News know about this.

    Your comments and suggestions are welcome.

    May 17, 2015 01:53 PM

    Something doesn't smell right about the rush to "deprecate" HTTP

    Google and Mozilla and others want force all non-HTTPS sites to become HTTPS.

    And while the name HTTPS sounds a lot like HTTP, it's actually a lot more complex and fraught with problems. If what they want to do ever happens, much of the independent web will disappear.

    1. First, the problem as I understand it, is that some ISPs are gathering data about the content flowing through their routers, inserting ads and cookies and otherwise modifying content. I agree of course that this is a bad thing.

    2. Going to HTTPS does not get rid of all possible ways of snooping and modifying content. A toolbar, for example, hooking in after the content is decrypted, could change the content. Google tried to do this at one point in the evolution of the web. And even if you couldn't do it with a toolbar, Google and Mozilla both own popular browsers. They could modify content any time they want. HTTPS won't protect us against their snooping and interference. Why are we supposed to trust them more than an ISP? I don't actually trust them that much, btw.

    3. Key point: If you care about whether ISPs modify your content, you can move to HTTPS on your own. You don't need Mozilla or Google to force you to do it.

    4. It also depends on how much you care. Sure in a perfect world I'd want to stop all of it on all my content, but in that perfect world I would have infinite time to do all the work to convert all my websites. I don't have infinite time, and neither do you. I try to pick my battles more carefully. You can waste a lot of time doing something because it seems the right thing to do and end up accomplishing nothing.

    5. What I care about is that sufficiently motivated people will be able to find my archive in the future. I don't think the odds are actually very good, for a lot of reasons. This is just the newest.

    6. Given that a vast amount of content likely won't move, Google and Mozilla are contemplating far more vandalism to the web than any of the ISPs they're trying to short-circuit.

    7. Aren't there other less draconian methods to try first? How about making it illegal where it is not and working with government to enforce the laws? How about developing competition that doesn't do it, so everyone has a choice? That's the way Google is changing how ISPs work in the US. Why not elsewhere? How about developing a kind of encryption that does not require websites to do anything? I don't know if it's possible, but I haven't heard any discussion of that.

    8. Couldn't you use a VPN to tunnel through the nasty ISPs?

    9. This is why we need to overthrow the tech industry as a governing body. It's run by people who shoot first and ask questions later. This is an awful way to be having this discussion, after the decision is made, without any recourse? This is the best argument for taking this power away from the plutocrats in tech.

    May 17, 2015 01:45 PM

    May 15, 2015

    Tim Ferriss


    500-358492-894__1Our conversation took place in a barrel sauna like this.

    “It’s [about] getting closer to the source and not being distracted by any nonsense…”
    – Rick Rubin

    Rick Rubin has been called “the most important [music] producer of the last 20 years” by MTV.

    Rick is also revered as something of a Zen master, and he is as deep as he is soft-spoken. He rarely grants interviews, and one condition of doing this one was the setting: his hyper-heated barrel sauna at home.

    In this episode, we delve into how Rick helps artists (e.g. Jay Z, Shakira, Johnny Cash, etc.) produce their best work. Not only that, we also discuss Rick’s step-by-step experience losing 135+ pounds. He describes underwater weightlifting stories, training with Laird Hamilton, testing different diets, and much more.

    Rick’s resume includes everyone from Johnny Cash to Jay Z. His metal artists include groups like Black Sabbath, Slayer, System of a Down, Metallica, Rage Against the Machine, and Linkin Park. He’s worked with pop artists like Shakira, Adele, Sheryl Crow, Lana Del Rey, and Lady Gaga. He’s also been credited with helping to popularize hip hop with artists like LL Cool J, The Beastie Boys, Eminem, Jay Z, and Kanye West.  And that’s just a small sample.

    This conversation teaches a cohesive lesson in breaking down complex skills with deep and subtle problem solving.

    The sauna caused the microphones to burn our hands and us to nearly pass out. DON’T TRY THIS AT HOME, folks! I think it adds a hilarious element to the whole thing, but it’s not without risks.

    [Last but not least, if you haven’t seen my new TV show, which is #1 on iTunes as I write this, please check out The Tim Ferriss Experiment! There are 13 episodes, including ones with surfer Laird Hamilton and “top 10 drummer of all-time” Stewart Copeland.]



    Interested in learning more about world-class musicians? — Check out my interview with Amanda Palmer who left her record label and raised more than $2 million via crowd funding. (stream episode below or right-click here to download):

    Also, don’t miss Justin Boreta of The Glitch Mob, one of the biggest electronic groups on the planet. In my conversation with Justin, we play their never-before-heard draft versions of their songs and then explore what it takes for Justin to move that draft through 300+ versions to a final version which will knock your socks off (stream below or right-click here to download):

    This episode is sponsored by OnnitI have used Onnit products for years. If you look in my kitchen or in my garage you will find Alpha BRAIN, chewable melatonin (for resetting my clock while traveling), kettlebells, maces, battle ropes, and steel clubs. It sounds like a torture chamber, and it basically is. A torture chamber for self-improvement! Ah, the lovely pain. To see a list of my favorite pills, potions, and heavy tools, click here.

    This podcast is also brought to you by 99Designs, the world’s largest marketplace of graphic designers. Did you know I used 99Designs to rapid prototype the cover for The 4-Hour Body? Here are some of the impressive results.  Click this link and get a free $99 upgrade.  Give it a test run…

    QUESTION(S) OF THE DAY: Rick Rubin cites “heart work” as critical for creatives. What is the balance of heart work and head work in your creation process? 50/50? 70/30? How did you realize what works best for you? Please let me know in the comments.

    Scroll below for links and show notes…

    Selected Links from the Episode

    Show Notes

    • The story of how Rick Rubin lost 135-145 pounds [7:50]
    • Sleep Tools: A process for rebuilding your circadian rhythm for the first time [10:50]
    • What does Rick Rubin “do”? [22:45]
    • Transitioning into a career of record producing [23:35]
    • On letting music be discovered vs. manufactured [24:30]
    • What gets in the way of artists producing their best work [26:05]
    • Recommendations for contemporary music [30:55]
    • How Rick Rubin learned that music was something he could do as a career [34:00]
    • Hip-hop to heavy metal and how to approach music with appreciation [38:05]
    • Working with artists in different genres: LL Cool J to Slayer [40:15]
    • Meditation and managing disruption [42:40]
    • Who comes to mind when Rubin thinks of the word “successful” [46:50]
    • Lessons learned from time spent with Don Wildman [49:45]
    • Most gifted books and favorite documentaries [51:35]
    • Managing the experience of overwhelm [54:30]
    • About Rick Rubin’s cameo for 99 Problems and Jay Z’s creative process [56:50]
    • On being introduced to the sauna/ice-bath combination [1:00:10]
    • Underwater weight training and lessons from Laird Hamilton [1:02:15]
    • Other exercises: Hyperbaric oxygen and the Wim Hof method  [1:08:35]
    • How Rubin uses small tasks to help others [1:10:05]
    • Advice for his 20-year old and 30-year old self [1:13:10]

    People Mentioned

    by Ian Robinson at May 15, 2015 04:11 PM

    Giles Bowkett

    Strong Parameters Are A Weak Schema

    Ruby on Rails went off the rails a long time ago.

    I don't work with Rails today. But, like so many other developers, I kept working with Rails for many years after the Merb merge. Because I loved Ruby, and because the Rails developer experience remains a thing of beauty, even today.

    I stuck around for Rails 4, and one of the changes it made was silly.
    Rails has always had a nice way of sanitizing user input coming from ubiquitous forms. Up until Rails 3, the solution was to list accessible fields right in your models. Then Rails 4 came along and introduced a different solution - strong_parameters, allowing you to take a greater control over the sanitizing process.
    As is often the case with Rails, the real problem here is that the core team failed to recognize a classic problem of computer science, after underestimating the importance of API-centric web development, and perceiving the problem purely in terms of showing a web page to a user.

    What Rails Was Thinking

    Before I get into that, I just want to summarize the problem from the Rails perspective: you've got input coming in from users, who are filling out web forms. They might be up to mischief, and they might use your web form to cause trouble. So you have to secure your web forms.

    The classic Rails solution for securing a web form: attr_accessible. Since models are the only way Rails puts anything into a database, you can recast "securing a web form" as validating an object. It makes perfect sense to say that code which secures an object's validity belongs in that object. So far, so good.

    attr_accessible was a white-listing mechanism which allowed you to specify which model attributes could be mass-assigned. The default for updating or creating an object in Rails, update_attributes, would allow a user to update any aspect of a model, including (for example) their or their authorization privileges.

    But this whitelisting was disabled by default. You had to kick it into gear by calling attr_accessible at least once, in your model. People forgot to do this, including people at GitHub, a very high-profile company with great developers, which got very visibly hacked as a result. People responded by writing initializers:


    (Obviously, a better way to do that would be to wrap it in a method called enable_whitelist or something, but that's a moot issue now.)

    People also responded by writing plugins, and in Rails 4, one of these plugins moved into Rails core.

    So this is what changed:
    • attr_accessible had an inverse, attr_protected, which allowed you to use a blacklist instead of a whitelist. strong_parameters only permits a whitelist.
    • The whitelisting default changed from off to on.
    • The code moved from the model to the controller.
    David Heinemeier-Hansson wrote up the official rationale. I've added commas for clarity:
    The whole point of the controller is to control the flow between user and application, including authentication, authorization, and, as part of that, access control. We should never have put mass-assignment protection into the model, and many people stopped doing so long ago ...

    An Alternative Approach

    Let's look at this from a different perspective now.

    Say you're building a web app with Node.js, and you want to support an API as well as a web site. We can even imagine that your mobile app powers much more of your user base, and your web traffic, than your actual web site does. So you need to protect against malicious actors exploiting your web forms, as web apps always have. But you also need to protect against malicious actors exploiting your API traffic.

    At this point, it's very easy to disagree with Mr. Hansson's claim that "we should never have put mass-assignment protection into the model." Both the "protect against malicious actors" problems here are very nearly identical. You might have different controllers for your API and your web site, and putting mass-assignment protection into those controllers could mean implementing the same code twice. Centralizing that code in the relevant models might make more sense.

    Rails solves this by quasi-centralizing the strong_parameters in a private method, typically at the bottom of the controller file. Here's the example from the official announcement:

    But you could also just use JSON Schema. All your web traffic's probably using JSON anyway, all your code's in JavaScript already, and if you write up a schema, you can just stipulate that all incoming data matches a particular format before it gets anywhere near your application code. You can put all that code in one place, just as you could with models, but you move the process of filtering incoming input right up into the process of receiving input in the first place. So when you do receive invalid input, your process wastes less resources on it.

    (This is kind of like what Rails did, except you can put it in the server, which in Rails terms would be more like putting it in a Rack middleware than in a controller.)

    The funny thing is, writing a schema is basically what Rails developers do already, with strong_parameters. They just write their schemas in Ruby, instead of JSON.

    Here's a less cluttered example:

    Note especially the very schema-like language in this line:

    params.require(:email).permit(:first_name, :last_name, :shoe_size)

    All you're doing here is permitting some attributes and requiring others. That's a schema. That's literally what a schema is. But, of course, it lacks some of the features that a standard like JSON Schema includes. For instance, specifying the type of an attribute, so mischevious Web gremlins can't fuck up your shit by telling you that the number of widgets they want to purchase is `drop table users`. (Rails has other protections in place for that, of course, but the point is that this is a feature any schema format should provide.)

    Rails developers are writing half-assed schemas in Ruby. If/when they choose to farm out parts of their system to microservices written in other languages, they'll have to re-write these schemas in other languages. For instance, they might at that point choose to use a standard, like JSON Schema. But if you're building with the standard from the start, you only have to define that schema once, using one format.

    In fact, Rails developers typically re-write their schemas whether they refactor to microservices or not. Many Rails developers prefer to handle API output using active_model_serializers, which gives you a completely different Ruby-based schema format for your JSON output.

    Here's an example from the README:

    This code says "when you build the output JSON, serialize the name and body attributes, include post_id, and add some hypermedia-style URLs as well." It infers a lot from the database, and it's nicer to read than JSON Schema. But you can't infer a lot from a database without some tight coupling, and this syntax loses some of its appeal when you put it side-by-side with your other implicit Ruby schema format, and you have to remember random tiny distinctions between the two. It's kind of absurd to write the same schema two or three different times, especially when you consider that Ruby JSON parsing is so easy that your JSON Schema objects can be pure Ruby too if you want.

    strong_parameters really only makes sense if you haven't noticed basic things about the Web, like the fact that HTTP has a type system built in.

    by Giles Bowkett ( at May 15, 2015 01:05 PM

    May 14, 2015

    Lambda the Ultimate

    Eve: the development diary of a programming environment aimed at non-programmers

    In spring 2012 Chris Granger successfully completed a Kickstarter fundraising and got $300K (instead of the requested $200K) to work on a live-feedback IDE inspired by Bret Victor "Inventing on principle" talk. The IDE project was called Light Table. It initially supported Clojure (the team's favourite language) only, but eventually added support for Javascript and Python. In January 2014, Light Table was open sourced, and in October 2014 the Light Table development team announced that they decided to create a new language, Eve, that would be a better fit for their vision of programming experience.

    There is little public about Eve so far, no precise design documents, but the development team has a public monthly Development Diary that I found fairly interesting. It displays an interesting form of research culture, with in particular recurrent reference to academic works that are coming from outside the programming-language-research community: database queries, Datalog evaluation, distributed systems, version-control systems. This diary might be a good opportunity to have a look at the internals of a language design process (or really programming environment design) that is neither academic nor really industrial in nature. It sounds more representative (I hope!) of the well-educated parts of startup culture.

    Eve is a functional-relational language. Every input to an Eve program is stored in one of a few insert-only tables. The program itself consists of a series of views written in a relational query language. Some of these views represent internal state. Others represent IO that needs to be performed. Either way there is no hidden or forgotten state - the contents of these views can always be calculated from the input tables.

    Eve is designed for live programming. As the user makes changes, the compiler is constantly re-compiling code and incrementally updating the views. The compiler is designed to be resilient and will compile and run as much of the code as possible in the face of errors. The structural editor restricts partially edited code to small sections, rather than rendering entire files unparseable. The pointer-free relational data model and the timeless views make it feasible to incrementally compute the state of the program, rather than starting from scratch on each edit.

    The public/target for the language is described as "non-programmers", but in fact it looks like their control group has some previous experience of Excel. (I would guess that experimenting with children with no experience of programming at all, including no Excel work, could have resulted in very different results.)

    Posts so far, by Jamie Brandon:

    Some random quotes.


    Excited, we presented our prototype to a small number of non-programmers and sat back to watch the magic. To our horror, not a single one of them could figure out what the simple example program did or how it worked, nor could they produce any useful programs themselves. The sticking points were lexical scope and data structures. Every single person we talked to just wanted to put data in an Excel-like grid and drag direct references. Abstraction via symbol binding was not an intuitive or well-liked idea.


    Our main data-structure was now a tree of tables. Rather than one big top-level function, we switched to a pipeline of functions. Each function pulled data out of the global store using a datalog query, ran some computation and wrote data back. Having less nesting reduced the impact of lexical scope and cursor passing. Using datalog allowed normalising the data store, avoiding all the issues that came from hierarchical models.

    At this point we realised we weren't building a functional language anymore. Most of the programs were just datalog queries on normalised tables with a little scalar computation in the middle. We were familiar with Bloom and realised that it fit our needs much better than the functional pidgin we had built so far - no lexical scoping, no data-structures, no explicit ordering. In late March we began work on a Bloom interpreter.


    Where most languages express state as a series of changes ('when I click this button add 1 to the counter'), Eve is built around views over input logs ('the value of the counter is the number of button clicks in the log'). Thinking in terms of views makes the current language simple and powerful. It removes the need for explicit control flow, since views can be calculated in any order that is consistent with the dependency graph, and allows arbitrary composition of data without requiring the cooperation of the component that owns that data.

    Whenever we have tried to introduce explicit change we immediately run into problems with ordering and composing those changes and we lose the ability to directly explain the state of the program without reference to data that no longer exists.


    In a traditional imperative language, [context] is provided by access to dynamic scoping (or global variables - the poor mans dynamic scope) or by function parameters. In purely functional languages it can only be provided by function parameters, which is a problem when a deeply buried function wants to access some high up data and it has to be manually threaded through the entire callstack.


    Eve processes can now spawn subprocesses and inject code into them. Together with the new communication API this allowed much of the IDE architecture to be lifted into Eve. When running in the browser only the UI manager lives on the main thread - the editor, the compiler and the user's program all live in separate web-workers. The editor uses the process API to spawn both the compiler and the user's program and then subscribes to the views it needs for the debugging interface. Both the editor and the user's program send graphics data to the UI manager and receiving UI events in return.

    May 14, 2015 12:27 PM

    Fog Creek

    How to Find, Hire, and Retain Developers – Interview with Cal Evans

    .little {font-size: 75%}
    How to Find, Hire, and Retain Developers – Interview with Cal Evans

    Looking for audio only? Listen on

    We’ve interviewed Cal Evans, author of ‘Culture of Respect’, and we discuss how to find, hire, and retain Developers. He gives tips on where to find great developers, how to write job ads which appeal to them and how best to interview them. We also discuss ways to build a great team culture that can help startups and growing businesses compete with the big guys for talent.

    Hear more about such topics from Cal over on his blog and check out our video guide to hiring developers .

    Content and Timings

    • Introduction (0:00)
    • Developer Management (0:35)
    • Finding Developers (2:38)
    • Developer Job Ads (4:30)
    • Interviewing Developers (6:18)
    • Creating a Culture of Respect (11:03)
    • Common Developer Hiring Mistakes (14:59)
    • Recommended Resources (17:29)



    Cal Evens is a technical manager of training at Zen, a PHP expert and community leader. He’s experienced in building and managing development teams, he’s the author of a number of books including: Going Pro, Signaling PHP and most recently, Culture of Respect: how to find, hire and retain developers. Cal, thank you so much for taking the time to join us today, do you have a bit to say about yourself?

    Pleased to be here, honored to be invited to participate.

    Quite honestly, if you can spell PHP, I can probably get you a job coding PHP

    Developer Management

    Culture of Respect focuses on hiring and retaining developers. Why do you think people need to think about hiring and managing developers differently than those in other roles?

    I’m always careful to preface my talks about hiring and managing developers by saying I’ve never managed anything else. I don’t know, it could be that accountants are exactly the same but what I know are developers so that’s what I talk about. I’ve been a developer now long enough to have seen companies go from being companies that use software and occasionally developer their own, to being software companies that also do something else. Most companies these days have an in-house development team that does something, whether you’re building controllers for John Deere tractors or you’re building websites for Amazon, software is so integrated in what we do that most companies have an in house development team. Most companies these days, their in-house development team is actually what drives the company, builds the products that the company sells or makes it possible for the companies to sell.

    While I’m never an advocate for setting developers up on a pedestal and saying we need to treat them like demi gods, I do think you have to respect the fact that you have to treat them differently. You cannot just say, we have a cookie cutter, this is how we treat people. Developers have different needs. Immediately, if I start a job and they hand me a laptop that has been used by three other people and I have to figure out how to make things work, then that’s a smell test that doesn’t pass. Companies have to understand that you’ve got to invest in good tools for developers. Right now it’s a seller’s market for developers. Quite honestly, if you can spell PHP, I can probably get you a job coding PHP. I get people writing me saying we’ll train them, just give me someone with the aptitude to learn how to program. It’s a great time.

    Finding Developers

    Let’s start with finding developers. What have you found to be the most effective way to find developers to hire?

    I’m going to talk mostly about the PHP community because that’s what I’m most familiar with but most of these should work in just about any developer community you’re working in. The first thing is get involved in your local community. That means start attending your local PHP groups on a regular basis. Go 5 or 6 months to build your relationships before you start doing any real recruiting. Even then, once you start, don’t just walk in and say, I’m here, I’m collecting resumes. Be the sponsor. Buy the pizza and the beer and the soda for the group a couple of times. That’s the first thing, get involved in your local community. The second step, and this is very important, it’s equally important, repeat the first step as necessary. Your local community is where you’re going to find your best resources. I’m a big fan of remote developers, but we’re not talking about that right now. We’re just talking about trying to find local developers. Your local community is going to be the number one.

    Once you have integrated yourself into the local community, then start looking for, in the PHP community, we have regional conferences that have come up in the past 4 or 5 years. Once you have gotten your name in regional, then you go to national conferences and you sponsor, or you just go and attend and hang out with people. Then you start moving towards the international conferences like ZendCon and Dutch PHP, these conferences, and those are great places to find developers, but at that point you’ve got to be of the mindset that you don’t have to have them sitting in a chair in a cube that you can see. You’re going to have to start doing remote before the nationals and internationals are really going to pay off for you.

    Developer Job Ads

    What are some tips for writing great job ads seeking developers?

    Number one, I cannot stress this enough, put a salary or salary range on the job ad. You’re not limiting yourself, and you’re going to help developers pre-screen. You’re not giving away any secrets because I guarantee you, if you’ve already got developers, they’re talking to their buddies, we know how much you’re paying. If you tell us, then we can help pre-screen. Help me understand if I can afford to take the job. The second thing, if I see Photoshop on a developer ad, that’s a red flag immediately. What it tells me is you don’t understand what you want, so you’re just throwing everything out there. I advise developers, anytime they’re looking at job ads, serious developer positions, not front end developers, but mid range and back end developers, if they see Photoshop on it, walk away. It doesn’t matter who the company is, walk away. The company doesn’t understand what they’re trying to hire for. Somebody said, we’ve got a billet open, I need a PHP developer. Every now and again I need photoshop, I need front end work, so go ahead and put that on there too. That’s not what they’re looking for.

    Then what I like to call no bullshit ads. What I want to know is can I afford to take the job, am I qualified for the job, how much does the job pay? That’s the important stuff. If you nail those, then you have a good chance of finding the developer that you’re actually looking for and not have to wade through the 150 resumes you’re going to get if you put up a kitchen sink ad or a bullshit ad or something like that. I’ve been the manager that had to wade through those. I tell you this from experience because I’ve made all of these mistakes before.

    Hiring remote developers means that you can get the absolute best developer… not just the ones that are willing to live in your city

    Interviewing Developers

    You’ve been critical of code testing in dev hiring, why is that?

    First of all, I am to the point in my career where I have a LinkedIn profile that if you printed out in a PDF, it would be 5 or 7 pages. I have 10 or 12 GitHub repos out there that show what my code is. If you as a developer manager are not qualified to read through my GitHub Repo and look at the code that I’m writing and say is this good code, and if you’re not qualified to look at my LinkedIn profile and see that I show a progression of responsibilities, then I question whether you’re qualified to manage me in the first place. So many intricate things to being a developer that if you’ve not done it, you’ve got no framework. Setting timelines and deadlines, stuff like that. If you’ve never done development, then setting deadlines is real easy. By here, by this date, but if you’ve done development then you know it’s not nearly that easy.

    So what steps should people take in hiring the right developers?

    The number one thing that I look for is competency. If you’re not competent then you’re going to be a hindrance to the team. When I’m hiring on a team, keeping the team cohesion is very important. Once I determine competency, then we start looking at cultural fit. These days, you have to be very careful when you say cultural fit, because everybody says you’re only looking for white guys that graduated from your college. No, cultural fit does not mean that you look like me, it does not mean that you think like me. What cultural fit means it that I’ve got a team that is currently working together and you’ve got to be able to play a part on that team, and you’ve got to be able to disagree with these people, and not be a hindrance to the team. Building that team culture is so important, and keeping the team culture together, and I’ve seen great teams make a bad hiring decision and totally destroy the culture of the team, and the momentum of the team. Just because they got one person who dragged the whole team down.

    I get the entire team that the person’s going to be working on in one room and I let the team ask questions until everybody is out of all the questions. I don’t care if you’re junior, senior, architect or whatever, you’re going to get to ask any question you want of this person as long as it’s a legal question. Once they finish that, then we can move on. I never ask questions in these interviews. The team always does it. My job is to sit back and see how the team interacts with this person and how this person interacts with the team. If I see a lot of friction, I’m thinking this might not be a good fit. It doesn’t automatically disqualify them but it means I’m going to have to do a little more interviews first.

    The final thing, once I have determined competency, once I know it’s a good cultural fit, can I afford them? I am very odd in this. I do not negotiate salaries. I ask the person what do you need. I expect that person to be honest with me and tell me the number they need. The two questions I ask at that point is are we within reason, because if I’ve got a junior developer saying I need $100,000, that’s not reasonable. I’m still not going to negotiate with them but they’ve given me their answer. If they’re reasonable then the next question is can I afford them. If it fits within my budget and it’s a reasonable price and they have passed the team interview, the team has voted on them and said yes we want them, then I say okay. I don’t come back with a counter offer. I don’t negotiate this at all, because my feeling is a developer, if they’re being honest with me is going to tell me what they need to be happy with this. I don’t mind side projects but I don’t want people to have to do side projects to make ends meet. Quite honestly, if they’re not being honest with me on their salary needs, I’m probably not going to want them on my team to begin with because they’re not being honest with me, period.

    The one final point about the team voting is it has to be a unanimous vote. I’ve actually had to walk away from candidates because I had one person say I don’t think this person is going to fit well on my team, and so we said I’m sorry it’s not going to work, because the team is the one that’s going to have to work with them. I’m just going to have to manage them, that’s the easy part. The team has to work with them on a day to day basis. If that team is not sold on the fact that this person is the person that they want on their team, I’d rather just walk away and find another candidate.

    Creating a Culture of Respect

    What can start ups and small companies do to compete in hiring the best talent? When you have big players offering free lunches and large salaries, etc?

    Free lunches, that’s crap. That’s not a benefit, that’s a perk. I understand the mentality of free lunches and dry cleaning and all of this. Those exist so the company can keep the developer’s butt in their seat longer, and they exist for no other reason. It’s just a way to keep that developer on campus, focused on the job, for as long as possible. If a small company builds a culture of respect, they respect the developer, they understand that their job is a portion of their life, their job is not their life, then you can attract better developers than companies that have free lunches, dry cleaning, a Kegerator, you name it, Foosball tables, whatever.

    My favorite example of this is in Nashville, we have Dave Ramsey, and they have a wonderful development team. Dave Ramsey’s team does not have a Kegerator. People work there because at 5 O’Clock, you’ve basically got to justify why you’re still there, because they understand that this is part of your life, it is not your life. It’s working for them because, they’re a Ruby shop, they’ve got a 6 month hiring process. It takes 6 months just to be hired by them, and yet they still have a list of candidates waiting to go through the process. They need Ruby developers right now. They’re constantly advertising for new, but they won’t compromise their team just to put a butt in a seat. They’ve got to get the right fit, and that is the focus of basically the second half of the book, of Culture of Respect. Helping managers to understand that developers have a life and their life is not building their particular project. If you understand that, then you really won’t have a problem finding developers.

    So you’ve hired a great team, what are some specific things that people can do to engage developers and keep them around?

    I practice what’s called Servant Leadership. It was not unusual for me, when I was running teams, to first thing in the morning, brew up a huge pot of coffee and walk around to each of my developers around 9 am and refresh their coffee. Not walk by, pour a cup of coffee, and talk to them for 15 minutes, because then you get into a drive-by meeting, and you’ve interrupted them, and you’ve killed productivity. I would just refresh their coffee. I knew what everyone took, cream, sugar, made sure I had it. It was just my way of saying my job is to hire good people and get out of the way to make sure they have everything they need. My job is to serve them and also be what I call the poop shield. Anything, any poop that comes in from above, my job is to keep it off my team. If a manager needs a meeting with somebody on my team, I’ll go. I will sit in that meeting and if it actually needs a developer, I will call that developer and say I need you to come down here.

    I’ve had so many, and I learned this very early on, so many meeting requests for developers are just status meetings that they need the whole team, all the stakeholders in there, and the developer really doesn’t need to be in there. We’re just going over the project stuff. I’ll go to those meetings, I’ll take notes, and I’ll email the developer and they can read them later. If you don’t actually need a developer, then you’re costing me money by requiring a developer to sit in that meeting. That’s basically my theory, hire good people, get the hell out of the way.

    They have lives, and the main point of their lives is not to build you the next Uber for penguins

    Common Developer Hiring Mistakes

    Are there any common mistakes that you see people making when hiring developers?

    Yes, the most common mistake I see people making is not considering remote developers. I’ve been programming for 35 years. I’ve spent more time remote than I have on site. As a developer, I can’t get work done if people can walk by and stop me and talk to me, or constant interruptions of the telephone. If I’m remote, I can turn off my phone, I can turn off my email, I can shut down twitter, and I can focus and I can get the work done. Most people don’t understand this. Hiring remote developers is much more than going out to and finding someone that will do it and say boom, we’ll hire you.

    You have to have a remote developer program in place before you hire your first one. You have to understand that it’s going to be more work for you, the manager, to manage that remote person, because if you don’t hear from them, you have to reach out to them. As developers, we have this tendency, if we don’t have any interruptions, we will go heads down, get in the zone. I have actually started a project at 11 am and looked up one day and it was 11 pm that night, and I’m like, this is so cool, I got so much work done. Oh my god, it’s 11 pm at night. You lose track of time, but that’s great for developers.

    As a manager, if I’m not hearing from my developer, I don’t have to hear every 15 minutes, but I need to know that they are actually working and not playing on their Xbox. There’s a balance there, and it is more work for the manager. I get these emails all the time, ‘we’ve got a great opportunity and we’re looking for the best developer we can find’. I write them back. Great, are you willing to hire remote? ‘No’. Then you’re really not looking to hire the best, you’re looking for the most convenient, let’s be honest about it.

    Hiring remote developers means that you can get the absolute best developer that is available to you, not just the ones that are willing to live in your city. If I can get anything across to people it’s figure out how to work with remotes. One of the other things I say that really pisses people off. I tell companies, if your managers can’t handle managing remote developers, get better managers. That’s a whole lot cheaper than trying to find developers in your local area.

    Recommended Resources

    What are some resources that you can recommend to those interested in learning more about dev hiring and management?

    There’s only been a couple of things that have really impacted me. Of course the very first one is Mythical Man-Month. You really have to understand how the timing works in building software. I believe that everybody, if you’re a manager of software development, then you need to read Mythical Man-Month, and it needs to be an annual thing. You need to keep reading it once a year until you really understand it and you can start applying it without thinking about it. Of course, Peopleware, it’s another one of our ancient tomes in software management. It’s a great one. Another one, and you’ve interviewed this person on your blog, is Paul Jones, for a talk that he does called ‘All You Jokers’.

    Software management teams like to go and say we need this built in this time frame, without any concept of what this time frame is actually going to take. It falls on developers to actually hit this time frame. That’s how we end up with the 120 hour work weeks and giving up our lives for a company that’s not going to give us anything more than a salary and possibly some stock options. It isn’t rocket science, this is basic human nature. Treat developers with respect, understand that they have lives, and the main point of their lives is not to build you the next Uber for penguins. You don’t have to put them on a pedestal but they aren’t galley slaves either. You hire good people, you treat them with respect, you give them the tools that they need and let them do their job. That is the secret to a happy, productive, and awesome development team.

    Thank you so much for joining us today.

    Thank you for having me on.

    by Gareth Wilson at May 14, 2015 11:37 AM

    May 13, 2015

    Dave Winer

    How to have a future

    The journalism world is having a fit of depression today as they learn that their something they've actually known for years: their distribution system is owned by the tech industry.

    There is a solution. Start rebuilding your distribution system around the Internet. Instead of broadcasting to an audience, feed a community back to itself. Be distributors. Understand that you are not making the news. Your job always has been distribution.

    It's all about your rolodex

    1. Gather all the rolodexes in your organization and merge them into a database.

    2. Be sure you have a field in your database called "Feed" and in that field save the address of your source's RSS or Atom feed.

    3. Make a river out of those feeds. Start watching that river. Tell your sources about the river, give them the address. About five minutes after that you will be jumping up and down with excitement.

    4. Make it your home page.

    That's it. You've now created a future. Live in it, and learn from it, and evolve accordingly. There are no parachutes, no single well-defined path all news orgs will go down. You have to make it up as you go.

    However, until you get your river going, you will still be in the print era. Any effort you make there is wasted, it's not how news works today or in the future. We live in an era where sources have direct access to people who want the news. The sources are learning how to use that power. You have to find new relevance.

    You can use River4

    River4 is an open source aggregator written in JavaScript that does all that you need to get started. I wrote it, so you know it's good.

    One more thing

    If you're a journalism educator, please make sure every new journalist you graduate has the ability to run a server, install blogging and river software. People should not be scared of this technology. It's not hard, and is more immediately valuable than learning to "code" -- it should be a prerequisite.

    May 13, 2015 04:50 PM

    Mark Bernstein

    Why I Adore The TLS

    From Rupert Brooke, “Heaven.”

    But somewhere, beyond Space and Time.

    Is wetter water, slimier slime!

    And there (they trust) there swimmeth One

    Who swam ere rivers were begun,

    Immense, of fishy form and mind,

    Squamous, omnipotent, and kind;

    And under that Almighty Fin,

    The littlest fish may enter in.

    May 13, 2015 02:40 PM

    Dave Winer

    Facebook's Instant Articles

    A few items related to Facebook's Instant Articles announcement that came in the middle of the night.

    1. I was briefed on this project last summer.

    2. It got me interested in the Facebook API.

    3. People who use Facebook want this. How do I know? When I post full text of stories on FB they read it and comment. When I post a link to my blog post, they still comment, but very often without having read the piece. As a writer I can only take so much of this!

    4. The place to put this functionality is in the CMS or blogging tools. If I were FB, I would have gone to the toolmakers first. Made sure there was broad support. Why do they care so much about the big brands? Maybe there's something strategic about this. Do the big brands really move first, fast, with confidence and innovation? Or are they driven by fear of missing out? Which motivation creates better user experience? (In my experience love is where creativity comes from, not fear.)

    5. I was told last summer that they were building on RSS. Of course that's a good thing, if true. It means that the content could flow not just to Facebook, but anywhere that's prepared to receive it. This creates many interesting options. In this, Facebook is being a good corporate citizen and Friend to the Open Web (with the qualification that I don't know for sure if it is true).

    6. I have asked for access to the tech now that it's out, but got rejected!

    7. I hope they change their mind.

    8. Bloggers matter, imho as much as any professional reporter. I want parity for bloggers. In this way they are not being a friend of the open web.

    9. The NYT, National Geographic, Buzzfeed, et al, are right to publish their content to Facebook in full. It's one of the big places where people who read news congregate. But they should also quickly develop new channels that are not dependent on the tech industry.

    10. Journalism pundits will re-litigate the michegas over The Algorithm. The time to debate that was when it was new, five years ago. It's done now. The next thing is whether or not the news industry invests in its own future, or lets the tech industry continue to own it. The Algorithm wouldn't have mattered if journalism had done its job. I guess that's where my frustration comes from reading the hot angry frustrated powerless pieces by Jay Rosen, Zeynep Tufekci and Emily Bell. Where were you when this was news? And why are you missing the current issue? Why are you always five years late? Yes I was ringing the bells about this then. Now it's time to finally compete with Facebook and Twitter. It might already be too late, but it might not be.

    May 13, 2015 10:53 AM

    Ian Bicking

    A Product Journal: Community Participation

    I’m blogging about the development of a new product in Mozilla, look here for my other posts in this series

    Generally at Mozilla we want to engage and activate our community to further what we do. Because all our work is open source, and we default to open on our planning, we have a lot of potential to include people in our work. But removing barriers to participation doesn’t make participation happen.

    A couple reasons it’s particularly challenging:

    1. Volunteers and employees work at different paces. Employees can devote more time, and can have pressures to meet deadlines so that sometimes the work just needs to get done. So everything is going fast and a volunteer can have a hard time keeping up. Until the project is cancelled and then wham, the employees are all gone.

    2. Employees become acclimated to whatever processes are asked of them, because whether they like it or not that’s the expectation that comes with their paycheck. Sometimes employees put up with stupid shit as a result. And sometimes volunteers aren’t willing to make investments to their process even when it’s the smart thing to do, ‘cause who knows how long you’ll stick around?

    3. Employee work has to satisfy organizational goals. The organization can try to keep these aligned with mission goals, and keep the mission aligned with the community, but when push comes to shove the organization’s goals – including the goals that come from the executive team – are going to take priority for employees.

    4. Volunteers are unlikely to be devoted to Mozilla’s success. Instead they have their own goals that may intersect with Mozilla’s. This overlap may only occur on one project.  And while that’s serendipitous, limited overlap means a limit on the relationships those volunteers can build, and it’s the relationships that are most likely to retain and reward participation.

    I have a theory that agency is one of the most important attractors to open source participation. Mozilla, because of its size and because it has a corporate structure, does not offer a lot of personal agency. Though in return it does offer some potential of leverage.

    I am not sure what to do with respect to participation in PageShot. If I open things up more, will anyone care? What would people care about? Maybe people would care about building a product. Maybe the building blocks would be more interesting. We have an IRC channel, but we also meet regularly over video, which I think has been important for us to assimilate the concept and goals of the project. Are there other people who would care to show up?

    I’m also somewhat conflicted about trying to bring people in. Where will PageShot end up? The project could be cancelled. It’s open source, sure, but is it interesting as open source if it’s a deadend addon with no backing site? Our design is focused on making something broadly appealing such that it could be included in the browser – and if things go well, the addon will be part of the browser itself. If that happens (and I hope it will!) even my own agency with respect to the project will be at threat. That’s what it means to get organizational support.

    If the project was devolved into a set of libraries, it would be easier to contribute to, and easier for volunteers to find value in their participation. Each piece could be improved on its own, and can live on even if the product that inspired the library does not continue. People who use those libraries will maintain agency, because they can remix those libraries however they want, include them in whatever product of their own conception that they have. The problem: I don’t care about the libraries! And I don’t want this to be a technology demonstration, I want it to be a product demonstration, and libraries shift the focus to the wrong part.

    Despite these challenges, I don’t want to give up on the potential of participation. I just doubt would look like normal open source participation. I’ve expanded our participation section, including an invitation to our standup meetings. But mostly I need to know if anyone cares, and if you do: what do you care about and what do you want from your participation?

    by Ian Bicking at May 13, 2015 05:00 AM

    May 12, 2015

    Dave Winer

    Why I moved off Heroku

    I really appreciate the service that Heroku runs. It was a very easy way for me to get started in Node.js, and also very affordable! I kept marveling at what a great deal it was, gushed publicly about it, and paid them the highest honor, I developed my software around their architecture, so it would be really easy to deploy my stuff on Heroku.

    My basic idea is that back-ends for software are very small things. They just move data out of the app, which runs in the browser on the user's desktop, to a storage place, and back out later. That's all the server has to do.

    I designed it so that each app has its own server. That way if one of my apps got really popular, it wouldn't interfere with the others. This is ideal for developers, to have scaling be a totally fluid thing. That's why you want to chop the pieces as small as you can. Rather than try to host ten apps on a server, give each app their own server, no matter how small and insignificant. It's a design that can only work for a system like Heroku. It was really a breakthrough.

    But, they changed their pricing so as to really discourage this architecture. It's possible they weren't even aware how their change would affect us. I didn't hide the design, I wrote lots of posts about it. I emailed with people there. I even met with their CEO on a trip to California to talk about how I saw their service and to learn how they were planning to evolve it. I kept emailing them asking if they were sure this is the deal and thanking them for their generosity.

    But once they changed, I had to change. It no longer made sense to have lots of individual servers, one for each app. With the new economics. I'd have to bundle them up, the old way, where one server is running N apps. And if one gets successful, there's a bunch of manual work to set things up so it gets more resources without slowing the other apps down. Scaling is no longer a matter of sliding a slider on a browser interface. I wish it were.

    Anyway it's up to them to decide how to price their service. And it was up to me to migrate when they changed their pricing. It was a pretty hellacious weekend here, lots of stress, but it's not bad. It's kind of like a basketball player has to get really intense to make it through the playoffs. This was a very high wire balancing act. But it was a good thing to do, now I have a much better understanding of what I've done. I've moved code I wrote when I was a total newcomer to Node.js. It wasn't a horrible experience!

    And now I'm back on solid ground (knock wood, praise Murphy) I look forward to getting back to the stuff I really love, making new idea processing software that networks people in incredible new ways!

    PS: A little more perspective in a post on my liveblog.

    May 12, 2015 05:54 PM

    May 11, 2015

    Dave Winer

    Hello Fargo users

    This is a quick heads-up, there were major changes in the servers over the weekend. But if all went well, you should see no changes in the performance of Fargo.

    Basically, I moved the back-end, Fargo Publisher, from Heroku to a server in Amazon's cloud. This is a lot like the move that Berkman made a few years back when they hoisted their building on Mass Ave and moved it a few blocks away, and re-planted it. It's as if all the scholars in the offices just went home for the weekend and came back to find their offices in a new location. Hopefully all the electric is properly hooked up, and the Internet, the bathrooms. Business as usual, they say. We hope.

    Knock wood, praise Murphy, I am not a lawyer.


    PS: There will be a new version of Fargo Publisher, shortly, if everything works. Haaha.

    May 11, 2015 12:52 PM

    Giles Bowkett

    Why Panda Strike Wrote the Fastest JSON Schema Validator for Node.js

    Update: We're not the fastest any more, but we still have the best benchmarks.

    After reading this post, you will know:

    Because this is a very long blog post, I've followed the GitHub README convention of making every header a link.

    Those who do not understand HTTP are doomed to re-implement it on top of itself

    Not everybody understands HTTP correctly. For instance, consider the /chunked_upload endpoint in the Dropbox API:

    Uploads large files to Dropbox in multiple chunks. Also has the ability to resume if the upload is interrupted. This allows for uploads larger than the /files_put maximum of 150 MB.

    Since this is an alternative to /files_put, you might wonder what the deal is with /files_put.

    Uploads a file using PUT semantics. Note that this call goes to instead of

    The preferred HTTP method for this call is PUT. For compatibility with browser environments, the POST HTTP method is also recognized.

    To be fair to Dropbox, "for compatibility with browser environments" refers to the fact that, of the people I previously mentioned - the ones who do not understand HTTP - many have day jobs where they implement the three major browsers. I think "for compatibility with browser environments" also refers to the related fact that the three major browsers often implement HTTP incorrectly. Over the past 20 years, many people have noticed that their lives would be less stressful if the people who implemented the major browsers understood the standards they were implementing.

    Consider HTTP Basic Auth. It's good enough for the GitHub API. Tons of people are perfectly happy to use it on the back end. But nobody uses it on the front end, because browsers built a totally unnecessary restriction into the model - namely, a hideous and unprofessional user experience. Consequently, people have been manually rebuilding their own branded, styled, and usable equivalents to Basic Auth for almost every app, ever since the Web began.

    By pushing authentication towards the front end and away from an otherwise perfectly viable aspect of the fundamental protocol, browser vendors encouraged PHP developers to handle cryptographic issues, and discouraged HTTP server developers from doing so. This was perhaps not the most responsible move they could have made. Also, the total dollar value of the effort expended to re-implement HTTP Basic Auth on top of HTTP, in countless instances, over the course of twenty years, is probably an immense amount of money.

    Returning to Dropbox, consider this part here again:

    Uploads large files to Dropbox in multiple chunks. Also has the ability to resume if the upload is interrupted. This allows for uploads larger than the /files_put maximum of 150 MB.

    Compare that to the accept-range header, from the HTTP spec:

    One use case for this header is a chunked upload. Your server tells you the acceptable range of bytes to send along, your client sends the appropriate range of bytes, and you thereby chunk your upload.

    Dropbox decided to take exactly this approach, with the caveat that the Dropbox API communicates an acceptable range of bytes using a JSON payload instead of an HTTP header.

    Typical usage:

    • Send a PUT request to /chunked_upload with the first chunk of the file without setting upload_id, and receive an upload_id in return.
    • Repeatedly PUT subsequent chunks using the upload_id to identify the upload in progress and an offset representing the number of bytes transferred so far.
    • After each chunk has been uploaded, the server returns a new offset representing the total amount transferred.
    • After the last chunk, POST to /commit_chunked_upload to complete the upload.

    Google Maps does something similar with its API. It differs from the Dropbox approach in that, instead of an endpoint, it uses a CGI query parameter. But Google Maps went a little further than Dropbox here. They decided that ignoring a perfectly good HTTP header was not good enough, and instead went so far as to invent new HTTP headers which serve the exact same purpose:

    To initiate a resumable upload, make a POST or PUT request to the method's /upload URI, including an uploadType=resumable parameter:


    For this initiating request, the body is either empty or it contains the metadata only; you'll transfer the actual contents of the file you want to upload in subsequent requests.

    Use the following HTTP headers with the initial request:

    • X-Upload-Content-Type. Set to the media MIME type of the upload data to be transferred in subsequent requests.
    • X-Upload-Content-Length. Set to the number of bytes of upload data to be transferred in subsequent requests. If the length is unknown at the time of this request, you can omit this header.
    • Content-Length. Set to the number of bytes provided in the body of this initial request. Not required if you are using chunked transfer encoding.

    It's possible that the engineers at Google and Dropbox know some limitation of Accept-Ranges that I don't. They're great companies, of course. But it's also possible they just don't know what they're doing, and that's my assumption here. If you've ever been to Silicon Valley and met some of these people, you're probably already assuming the same thing. Hiring great engineers is very difficult, even for companies like Google and Dropbox. Netflix holds terrific scaling challenges and its engineers are still only human.

    Anyway, combine this with the decades-running example of HTTP Basic Auth, and it becomes painfully obvious that those who do not understand HTTP are doomed to re-implement it on top of itself.

    If you're a developer who understands HTTP, you've probably seen many similar examples already. If not, trust me: they're out there. And this widespread propagation of HTTP-illiterate APIs imposes unnecessary and expensive problems in scaling, maintenance, and technical debt.

    One example: you should version with the Accept header, not your URI, because:

    Tying your clients into a pre-set understanding of URIs tightly couples the client implementation to the server; in practice, this makes your interface fragile, because any change can inadvertently break things, and people tend to like to change URIs over time.

    But this opens up some broader questions about APIs, so let's take a step back for a second.

    APIs and JSON Schema

    If you're working on a modern web app, with the usual message queues and microservices, you're working on a distributed system.

    Not long ago, a company had a bug in their app, which was a modern web app, with the usual message queues and microservices. In other words, they had a bug in their distributed system. Attempts to debug the issue turned into meetings to figure out how to debug the issue. The meetings grew bigger and bigger, bringing in more and more developers, until somebody finally discovered that one microservice was passing invalid data to another microservice.

    So a Panda Strike developer told this company about JSON Schema.

    Distributed systems often use schemas to prevent small bugs in data transmission from metastasizing into paralyzing mysteries or dangerous security failures. The Rails and Rubygems YAML bugs of 2013 provide a particularly alarming example of how badly things can go wrong when a distributed system's input is not type-safe. Rails used an attr_accessible/attr_protected system for most of its existence - at least as early as 2005 - but switched to its new "strong parameters" system with the release of Rails 4 in 2013.

    Here's some "strong parameters" code:

    This line in particular stands out as an odd choice for a line of code in a controller:

    params.require(:email).permit(:first_name, :last_name, :shoe_size)

    With verbs like require and permit, this is basically a half-assed, bolted-on implementation of a schema. It's a document, written in Ruby for some insane reason, located in a controller file for some even more insane reason, which articulates what data's required, and what data's permitted. That's a schema. attr_accessible and attr_protected served a similar purpose more crudely - the one defining a whitelist, the other a blacklist.

    In Rails 3, you defined your schema with attr_accessible, which lived in the model. In Rails 4, you use "strong parameters," which go in the controller. (In fact, I believe most Rails developers today define their schema in Ruby twice - via "strong parameters," for input, and via ActiveModel::Serializer, for output.) When you see people struggling to figure out where to shoehorn some functionality into their system, it usually means they haven't figured out what that functionality is.

    But we know it's a schema. So we can make more educated decisions about where to put it. In my opinion, whether you're using Rails or any other technology, you should solve this problem by providing a schema for your API, using the JSON Schema standard. Don't put schema-based input-filtering in your controller or your model, because data which fails to conform to the schema should never even reach application code in the first place.

    There's a good reason that schemas have been part of distributed systems for decades. A schema formalizes your API, making life much easier for your API consumers - which realistically includes not only all your client developers, but also you yourself, and all your company's developers as well.

    JSON Schema is great for this. JSON Schema provides a thorough and extensible vocabulary for defining the data your API can use. With it, any developer can very easily determine if their data's legit, without first swamping your servers in useless requests. JSON Schema's on draft 4, and draft 5 is being discussed. From draft 3 onwards, there's an automated test suite which anyone can use to validate their validators; JSON Schema is in fact itself a JSON schema which complies with JSON Schema.

    Here's a trivial JSON Schema schema in CSON, which is just CoffeeScript JSON:

    One really astonishing benefit of JSON Schema is that it makes it possible to create libraries which auto-generate API clients from JSON Schema definitions. Panda Strike has one such library, called Patchboard, which we've had terrific results with, and which I hope to blog about in future. Heroku also has a similar technology, written in Ruby, although their documentation contains a funny error:

    We’ve also seen interest in this toolchain from API developers outside of Heroku, for example [reference customer]. We’d love to see more external adoption of this toolkit and welcome discussion and feedback about it.

    That's an actual quote. Typos aside, JSON Schema makes life easier for ops at scale, both in Panda Strike's experience, and apparently in Heroku's experience as well.

    JSON Schema vs Joi's proprietary format

    However, although JSON Schema's got an active developer and user community, Walmart Labs has also had significant results with their Joi project, which leverages the benefits of an API schema, but defines that schema in JavaScript rather than JSON. Here's an example:

    As part of the Hapi framework, Joi apparently powered 2013 Black Friday traffic for Walmart very successfully.

    Hapi was able to handle all of Walmart mobile Black Friday traffic with about 10 CPU cores and 28Gb RAM (of course we used more but they were sitting idle at 0.75% load most of the time). This is mind blowing traffic going through VERY little resources.

    (The Joi developers haven't explicitly stated what year this was, but my guess is 2013, because this quote was available before Black Friday this past year. Likewise, we don't know exactly how many requests they're talking about here, but it's pretty reasonable to assume "mind-blowing traffic" means a lot of traffic. And it's pretty reasonable to assume they were happy with Joi on Black Friday 2014 as well.)

    I love this success story because it validates the general strategy of schema validation with APIs. But at the same time, Joi's developers aren't fans of JSON Schema.

    On json-schema - we don't like it. It is hard to read, write, and maintain. It also doesn't support some of the relationships joi supports. We have no intention of supporting it. However, hapi will soon allow you to use whatever you want.

    At Panda Strike, we haven't really had these problems, and JSON Schema has a couple advantages that Joi's custom format lacks.

    The most important advantage: multi-language support. JSON's universality is quickly making it the default data language for HTTP, which is the default data transport for more or less everything in the world built after 1995. Defining your API schema in JSON means you can consume and validate it in any language you wish.

    It might even be fair to leave off the "JS" and call it ON Schema, because in practice, JSON Schema validators will often allow you to pass them an object in their native languages. Here's a Ruby example:

    This was not JSON; this was Ruby. In this example, you still have to use strings, but it'd be easy to circumvent that, in the classic Rails way, with the ActiveSupport library. Similar Python examples also exist. If you've built something with Python and JSON Schema, and you decide to rebuild in Ruby, you won't have to port the schema.

    Crazy example, but it's equally true for Clojure, Go, or Node.js. And it's not at all difficult to imagine that a company might port services from Python or Ruby to Clojure, Go, or Node, especially if speed's essential for those services. At a certain point in a project's lifecycle, it's actually quite common to isolate some very specific piece of your system for a performance boost, and to rewrite some important slice of your app as a microservice, with a new focus on speed and scalability. Because of this, it makes a lot of sense to decouple an API's schema from the implementation language for any particular service which uses the API.

    JSON Schema's universality makes it portable in a way that Joi's pure JavaScript schemas cannot achieve. (This is also true for the half-implemented pure-Ruby schemas buried inside Rails's "strong parameters" system.)

    Another fun use case for JSON Schema: describing valid config files for any service written in any language. This might be annoying for those of you who prefer writing your config files in Ruby, or Clojure, or whatever language you prefer, but it has a lot of practical utility. The most obvious argument for JSON Schema is that it's a standard, which has a lot of inherent benefits, but the free bonus prize is that it's built on top of an essentially universal data description language.

    And one final quibble with Joi: it throws some random, miscellaneous text munging into the mix, which doesn't make perfect sense as part of a schema validation and definition library.

    JSCK: Fast as fuck

    If it seems like I'm picking on Joi, there's a reason. Panda Strike's written a very fast JSON Schema validator, and in terms of performance, Joi is its only serious competitor.

    Discussing a blog post on which benchmarked JSON Schema validators and found Joi to be too slow, a member of the Joi community said this:

    Joi is actually a lot faster, from what I can tell, than any json schema validator. I question the above blog's benchmark and wonder if they were creating the joi schema as part of the iteration (which would be slower than creating it as setup).

    The benchmark in question did make exactly that mistake in the case of JSV, one of the earliest JSON Schema validators for Node.js. I know this because Panda Strike built another of the very earliest JSON Schema validators for Node. It's called JSCK, and we've been benchmarking JSCK against every other Node.js JSON Schema validator we can find. Not only is it easily the fastest option available, in some cases it is faster by multiple orders of magnitude.

    We initially thought that JSV was one of these cases, but we double-checked to be sure, and it turns out that the JSV README encourages the mistake of re-creating the schema on every iteration, as opposed to only during setup. We had thought JSCK was about 10,000 times faster than JSV, but when we corrected for this, we found that JSCK was only about 100 times faster.

    (I filed a pull request to make the JSV README clearer, to prevent similar misunderstandings, but the project appears to be abandoned.)

    So, indeed, the Cosmic Realms benchmarks do under-represent JSV's speed in this way, which means it's possible they under-represent Joi's speed in the same way also. I'm not actually sure. I hope to investigate in future, and I go into some relevant numbers further down in this blog post.

    However, this statement seems very unlikely to me:

    Joi is actually a lot faster, from what I can tell, than any json schema validator.

    It is not impossible that Joi might turn out to be a few fractions of a millisecond faster than JSCK, under certain conditions, but Joi is almost definitely not "a lot faster" than JSCK.

    Let's look at this in more detail.

    JSCK benchmarks

    The Cosmic Realms benchmarks use a trivial example schema; our benchmarks for JSCK use a trivial schema too, but we also use a more medium-complexity schema, and a very complex schema with nesting and other subtleties. We used a multi-schema benchmarking strategy to make the data more meaningful.

    I'm going to show you these benchmarks, but first, here's the short version: JSCK is the fastest JSON Schema validator for Node.js - for both draft 3 and draft 4 of the spec, and for all three levels of complexity that I just mentioned.

    Here's the long version. It's a matrix of libraries and schemas. We present the maximum, minimum, and median number of validations per second, for each library, against each schema, with the schemas organized by their complexity and JSON Schema draft. We also calculate the relative speed of each library, which basically means how many times slower than JSCK a given library is. For instance, in the chart below, json-gate is 3.4x to 3.9x slower than JSCK.

    The jayschema results are an outlier, but JSCK is basically faster than anything.

    When Panda Strike first created JSCK, few other JSON Schema valdiation libraries existed for Node.js. Since there are so many new alternatives, it's pretty exciting to see that JSCK remains the fastest option.

    However, if you're also considering Joi, my best guess is that, for trivial schemas, Joi is about the same speed as JSCK, which is obviously pretty damn fast. I can't currently say anything about its relative performance on complex schemas, but I can say that much.

    Here's why. There's a project called enjoi which automatically converts trivial JSON Schemas to Joi's format. It ships with benchmarks against tv4. The benchmarks run a trivial schema, and this is how they look on my box:

    tv4 vs joi benchmark:

    tv4: 22732 operations/second. (0.0439918ms)
    joi: 48115 operations/second. (0.0207834ms)

    For a trivial draft 4 schema, Joi is more than twice as fast as tv4. Our benchmarks show that for trivial draft 4 schemas, JSCK is also more than twice as fast as tv4. So, until I've done further investigation, I'm happy to say they look to be roughly the same speed.

    However, JSCK's speed advantage over tv4 increases to 5x with a more complex schema. As far as I can tell, nobody's done the work to translate a complex JSON Schema into Joi's format and benchmark the results. So there's no conclusive answer yet for the question of how Joi's speed holds up against greater complexity.

    Also, of course, these specific results are dependent on the implementation details of enjoi's schema translation, and if you make any comparison between Joi and a JSON Schema validator, you should remember there's an apples-to-oranges factor.

    Nonetheless, JSCK is very easily the fastest JSON Schema validator for Node.js, and although Joi might be able to keep up in terms of performance, a) it might not, and b) either way, its format locks you into a specific language, whereas JSON Schema gives you wide portability and an extraordinary diversity of options.

    We are therefore very proud to recommend that you use JSCK if you want fast JSON Schema validation in Node.js.

    I'm doing a presentation about JSCK at ForwardJS in early February. Check it out if you're in San Francisco.

    by Giles Bowkett ( at May 11, 2015 10:33 AM

    Lambda the Ultimate

    FLOPS 2016, promoting cross-fertilization across the whole declarative programming and theory and practice

    LtU generally is not appropriate venue for posting call-for-papers, but there have been exceptions, if the CFP has an exceptionally wide appeal. Hopefully FLOPS 2016 might qualify.

    FLOPS has been established to promote cooperation between logic and functional programmers, hence the name. This year we have taken the name exceptionally seriously, to cover the whole extent of declarative programming, which also includes program transformation, re-writing, and extracting programs from proofs of their correctness. There is another strong emphasis: on cross-fertilization among people developing theory, writing tools and language systems using that theory, and the users of these tools. We specifically ask the authors to make their papers understandable by the wide audience of declarative programmers and researchers.

    As you can see from the Program Committee list, the members have done first-rate theoretic work, and are also known for their languages, tools and libraries. PC will appreciate the good practical work. Incidentally, there is a special category, ``System Descriptions'' that FLOPS has always been known for. We really want to have more submissions in that category.

    One can see even on LtU that there is some rift between theoreticians and practitioners: Sean McDermid messages come to mind. He does have many good points. We really hope that FLOPS will help repair this rift.

    May 11, 2015 07:16 AM

    May 10, 2015

    Mark Bernstein

    “If We Procure Not To Ourselves More Woe”

    The theme of this dinner was borrowed from Paradise Lost. This week, my car nearly gave out, my hearing aid nearly gave out, and now my iPhone won’t charge: it was time for a low pressure meal. The straightforward recipe for a low-pressure meal is to get a holiday joint and roast it, but that seemed to dishonor all the expenses just incurred in order to delay even great expenses. So let it be a challenge.

    • “Gin” juniper Grissini ❧ Gougeres ❧ Hard Cider on the porch
    • Braised fennel, absinthe butter, salmon roe ❧ more cider
    • Homemade agnolotti stuffed with sweet potato and bacon, in fennel broth ❧ White Bordeaux
    • Duck breast, smoked over alder and tea ❧ Vaqueyras
    • Chicken legs braised in hard cider ❧ Tempranillo
    • Salad
    • Cake

    They work got off on an instructive foot as I carefully weighed my pasta eggs sans shells to get the flour to three significant figures, and then added 3:1 flour when everyone knows pasta requires 3:2. So I had precisely twice as much flour as I ought, and naturally this worked not well, or at all. Much mystery ensued, followed inevitably by a double batch of pasta and more fresh fettuccine and strozzapreti than we really need.

    Thanks to the pasta production, I never did figure out great names for the courses. But we’ve got the apple thing going in the appetizers and the chicken legs, the lcorice-tinged fennel in the first course (“Black it stood as night, Fierce as ten furies, terrible as hell, And shook a dreadful dart.”), and of course it’s bathed in seas of fire. The agnolotti are allegedly papal miters, they’re also filled with something orange. The duck breast is smoked,

    May 10, 2015 08:29 PM

    Tim Ferriss



    In this post, I’ll show you how Phil Gordon trained me in 5 days to have a fighting chance against pro poker players. Here’s the video teaser.

    Before we filmed the experience for The Tim Ferriss Experiment (currently the #1 TV Season on iTunes), I had never played a hand of poker.

    Phil’s crash course purposefully did not cover all the bases. It couldn’t. We didn’t have the time.

    Instead, his program (and this post) will show how a gambling idiot (me) can magnify strengths and cover weaknesses to an absurd degree…at least for a few hours in order to win real cash.

    Let’s be clear: I am not a good poker player, and perhaps you aren’t either. But that doesn’t mean you can’t win.

    If you understand a few principles and follow them religiously, Lady Luck (and strategic aggression) might smile upon you. Especially if you learn how to leverage “short-stack strategy” or “heads-up play,” both of which I’ll explain.

    This post has three parts:

    – My video explanation – This is the actual video I sent to TV post-production. I sent similar videos for all 13 episodes (parkour, the dating game, building a business, etc.) right after we finished each week. This is nuts and bolts of how Phil helped me pull off miracles.

    – My real notes from my notebook – These are PDFs of the notes I explain in the aforementioned video. For a novice or intermediate, they are only really useful once you’ve watched the video.

    – Phil’s one-page cheatsheet – ‘Nuff said.

    – The full TV episode (preview and links)

    Let’s get started on the how-to…

    The Video Explanation – The Real Nuts and Bolts

    I mention “VO” a few times, which stands for “voice over.” To see more of the notebook text, you can expand to full screen.

    My Poker Notes (Plus Some “Escape and Evasion” Notes)

    How to Play Poker – The Tim Ferriss Experiment by tferriss

    Phil’s Cheatsheet

    Poker Cheatsheet – From Pro Phil Gordon by tferriss

    The TV Episode

    Here’s the full episode (and 12 others) — check it out! If you found any of the above interesting, I think you’ll love it.

    by Tim Ferriss at May 10, 2015 07:10 AM

    May 09, 2015

    Lambda the Ultimate

    Pycket: A Tracing JIT For a Functional Language

    Pycket: A Tracing JIT For a Functional Language
    Spenser Bauman, Carl Friedrich Bolz, Robert Hirschfeld, Vasily Krilichev, Tobias Pape, Jeremy Siek, and Sam Tobin-Hochstadt

    We present Pycket, a high-performance tracing JIT compiler for Racket. Pycket supports a wide variety of the sophisticated features in Racket such as contracts, continuations, classes, structures, dynamic binding, and more. On average, over a standard suite of benchmarks, Pycket outperforms existing compilers, both Racket’s JIT and other highly-optimizing Scheme compilers. Further, Pycket provides much better performance for proxies than existing systems, dramatically reducing the overhead of contracts and gradual typing. We validate this claim with performance evaluation on multiple existing benchmark suites.

    The Pycket implementation is of independent interest as an application of the RPython meta-tracing framework (originally created for PyPy), which automatically generates tracing JIT compilers from interpreters. Prior work on meta-tracing focuses on bytecode interpreters, whereas Pycket is a high-level interpreter based on the CEK abstract machine and operates directly on abstract syntax trees. Pycket supports proper tail calls and first-class continuations. In the setting of a functional language, where recursion and higher-order functions are more prevalent than explicit loops, the most significant performance challenge for a tracing JIT is identifying which control flows constitute a loop -- we discuss two strategies for identifying loops and measure their impact.

    May 09, 2015 05:53 PM

    The Unison Programming Platform

    Unison - a next-generation programming platform, by Paul Chiusano:

    • Programs are edited in a (browser-based) semantic editor which guarantees programs are well-formed and typecheck by construction
    • The codebase is a purely functional data structure
    • The program is a UI, and UI interaction is programming
    • Persistent data sources must be accessible via a high-level, typed API

    An interesting project mentioned in a comment a few weeks ago, it now has its own website and a more descriptive abstract overview explaining it's core premises.

    Previous posts on Paul's blog are also of interest, and some feature videos demonstrating some aspects of Unison.

    May 09, 2015 12:31 PM

    Decyphering Glyph

    Separate your Fakes and your Inspectors

    When you are writing unit tests, you will commonly need to write duplicate implementations of your dependencies to test against systems which do external communication or otherwise manipulate state that you can’t inspect. In other words, test fakes. However, a “test fake” is just one half of the component that you’re building: you’re also generally building a test inspector.

    As an example, let’s consider the case of this record-writing interface that we may need to interact with.

    class RecordWriter(object):
        def write_record(self, record):
        def close(self):

    This is a pretty simple interface; it can write out a record, and it can be closed.

    Faking it out is similarly easy:

    class FakeRecordWriter(object):
        def write_record(self, record):
        def close(self):

    But this fake record writer isn’t very useful. It’s a simple stub; if our application writes any interesting records out, we won’t know about it. If it closes the record writer, we won’t know.

    The conventional way to correct this problem, of course, is to start tracking some state, so we can assert about it:

    class FakeRecordWriter(object):
        def __init__(self):
            self.records = []
            self.closed = False
        def write_record(self, record):
            if self.closed:
                raise IOError("cannot write; writer is closed")
        def close(self):
            if self.closed:
                raise IOError("cannot close; writer is closed")
            self.closed = True

    This is a very common pattern in test code. However, it’s an antipattern.

    We have exposed 2 additional, apparently public attributes to application code: .records and .closed. Our original RecordWriter interface didn’t have either of those. Since these attributes are public, someone working on the application code could easily, inadvertently access them. Although it’s unlikely that an application author would think that they could read records from a record writer by accessing .records, it’s plausible that they might add a check of .closed before calling .close(), to make sure they won’t get an exception. Such a mistake might happen because their IDE auto-suggested the completion, for example.

    The resolution for this antipattern is to have a separate “fake” object, exposing only the public attributes that are also on the object being faked, and an “inspector” object, which exposes only the functionality useful to the test.

    class WriterState(object):
        def __init__(self):
            self.records = []
            self.closed = False
        def raise_if_closed(self):
            if self.closed:
                raise ValueError("already closed")
    class _FakeRecordWriter(object):
        def __init__(self, writer_state):
            self._state = writer_state
        def write_record(self, record):
        def close(self):
            self._state.closed = True
    def create_fake_writer():
        state = WriterState()
        return state, _FakeRecordWriter(state)

    In this refactored example, we now have a top-level entry point of create_fake_writer, which always creates a pair of WriterState and thing-which-is-like-a-RecordWriter. The type of _FakeRecordWriter can now be private, because it’s no longer interesting on its own; it exposes nothing beyond the methods it’s trying to fake.

    Whenever you’re writing test fakes, consider writing them like this, to ensure that you can hand application code the application-facing half of your fake, and test code the test-facing half of the fake, and not get them mixed up.

    by Glyph at May 09, 2015 06:52 AM

    May 08, 2015

    Alarming Development

    Flux is good enough

    The reaction to my latest work [Two-way Dataflow] has been distinctly underwhelming. My diagnosis: I’ve solved a problem most people aren’t aware they have, and it comes at the steep price of replacing the conventional tech stack. Facebook has a cheaper solution: Flux. I have to give them credit for taking the problem seriously (unlike many of the reactive programming enthusiasts) and coming up with a pragmatic solution that just adds another layer to the stack. That’s what programmers want, not a fundamental solution in a new programming paradigm. It is obvious that we can’t keep growing the stack forever but no one wants to deal with it now. Especially computer scientists (don’t get me started).

    I think I need to shift focus to end-users and non-programmers. I’ve avoided that because I want to prove that we can dramatically simplify real large-scale programming — simplifying simple problems is not so convincing. But replacing the whole stack is just too hard to do all at once and all by myself, and only doing it on small examples is not convincing either. End-user programming could be a way to get started and get users and (especially) have collaborators. Industrial strength programming would come later, but at least I now have a sketch of how it should look. Building something real would be such a refreshing change from the last decade of thought experiments. I’m excited by the prospect of once again shipping buggy code and having irate users and getting into fights with my colleagues. That’s life.

    by Jonathan Edwards at May 08, 2015 04:48 PM

    Ian Bicking

    A Product Journal: As We May Discuss

    I’m blogging about the development of a new product in Mozilla, look here for my other posts in this series

    In a presentation The Revolution Will Be Annotated, Dan Whaley begins with a very high-minded justification for annotation: that it is essential for our existence that we act wisely, and that we can achieve that through deliberation, and that annotation is a building block for open deliberation.

    In response, let me digress wildly, and talk about elementary school.

    It is common to cite large class sizes as a problem, and small class sizes as an opportunity to improve education. But there is debate about whether class size really matters; it certainly correlates with general privilege, but does it cause improvements? At the same time I’ve become much more familiar with the Montessori philosophy of education, and one of the surprising features is a relatively large ideal classroom size, in the 30s. And why? Dr. Montessori had positive theories about age mixture, community size, the culture of the classroom, and so forth – but I’ll add what I think is a Montessori-style reason it’s okay: it’s okay to have less teachers because learning isn’t caused by teachers. Learning is ultimately an internal process, an assimilation and construction of knowledge. Your environment can aid in that process, but the cause is still internal.

    I share Dan’s enthusiasm about the importance of dialog to our collective wisdom. But I see dialog as supportive of personal growth, not of collective wisdom – our collective wisdom will increase as we individually grow.

    Dan cites one problem with rationalism: we are good at constructing rational arguments to support what we already believed. The annotation remedy is to suppose that what we conveniently leave out of our arguments can be applied later by a diverse set of participants. Annotation makes it harder to make use of fallacies, harder to make use of limited narratives, because the annotator can add them back in.

    I will cite another problem with rationalism: even a good rational argument is not good at convincing anyone of anything. A good rational argument is like teaching arithmetic by telling someone that 39301+9402=48703. Maybe even writing out the steps used to make that calculation. You can lay that in front of someone, you can lay a hundred similar examples in front of someone, and they will not learn arithmetic. If the person is disinterested they can just trust you – though then it hardly matters if you were right – but if they are interested I believe that the process of construction is necessary. You have to solve your own math problems to learn math.

    Annotation is interesting because it gives another avenue for people to publish their beliefs and enter into dialog. But a global overlay of annotation is not a particularly appealing medium. It’s not a place to come to understanding, to practice the construction of ideas. And I think our collective wisdom depends on an incredible volume of discussion, not just on an increased quality, because you can’t get large scale individual growth without large scale discussion.

    I see two features in the typical annotation system: one feature is the ability to talk about other things, with high fidelity. URLs have been a great start to being able to talk about things on the web, but they have some limits. The second feature is the ability to view these annotations implicitly. The second feature is the one I’ve seldom found interesting as a reader, and disagree with as a goal. Viewing annotations as a universal overlay of commentary asks too much of the annotations, provides too little to me as the reader, and I think is an attempt to pursue a kind of rational universal truth that I find little value in. It’s a sense that documents are there to teach us, and annotations make those documents even better teachers.

    PageShot takes a different approach: it gives anyone the ability to talk about anything on the web, but each time you do that you create a new resource, your discussion lives at your document. You can write your commentary for a specific audience, and then give it to that audience, without having your intended audience confused with the original author’s intended audience. You can throw away what you have to say. The person who clicks on your link did it to see what you said, they aren’t some passerby. You can say implicitly through highlighting, here is what I thought was interesting. But PageShot applies no universality to what you say, it is a tool only of dialog. This makes PageShot more modest, but intentionally so.

    by Ian Bicking at May 08, 2015 05:00 AM

    May 07, 2015

    Giles Bowkett

    My Skepticism Re: Uber Continues Unabated

    Previously: What If Uber's Just A Terrible Business?

    There's a City Paper article online where the author worked as an Uber driver and talks about how it works, especially the practical, can-I-make-a-living economics of it.

    This web site is so awful that you apparently have to open up Developer Tools to read it, and execute this line of code in the console:

    function contentRefresh(){}

    But the content's great. Spoiler alert: drivers can't make money. Uber's pricing strategy matches my fear that they're using venture capital to buy off entire cities by flooding them with amazing deals which seem like they can't last forever — because they can't — while building up the economic equivalent of a mountain of legacy code which collapses into an utter shitpile the day somebody buys the company. Only in this case, the acquirer's probably a whole bunch of people buying stock.

    But what really kicked my skepticism into high gear was this excerpt:
    TechCrunch broke the news that Uber was building a huge robotics lab in Pittsburgh, partnering with Carnegie Mellon University to "kickstart autonomous taxi fleet development," according to a company source.

    Travis Kalanick, the CEO and founder of Uber, said at a conference last year that he'd replace human Uber drivers with a fleet of self-driving cars in a second...

    You can get a glimpse of his vision in a fascinating paper from Columbia University, which did several case studies on what a future with driverless cars would look like — apparently, like Uber crossed with Minority Report. And this could be coming as soon as 2020, according to both Tesla and Google, both of which are also heavily invested in the race to be a player in this huge future market.

    In this world, the paper projects, fewer and fewer people own private cars, because it doesn’t make financial sense. Cars run on electricty, and most are much smaller, designed to carry only one or two people. The auto industry experiences a temporary boom, but then demand drops off a cliff. By around 2040, driverless cars are a majority on American roads. The number of cars drops by more than 90%, as do fuel consumption and emissions. Car accidents and traffic are nearly nonexistent.
    So, a little context.

    First, I'm a programmer, and like any programmer, I know most people's code sucks.

    Second, in the late 1990s, the whole sales pitch for why young people should build the Web in the first place was that it would democratize media, eliminate the shallow hegemony of things like NBC and CNN, and replace it with in-depth, nuanced debate, because everything would be better once it revolved around the written word.

    This is what we got instead.

    Take the "which hormone-crazed moose are you?" quiz!

    Maybe you don't remember the 1990s. Maybe you weren't there. Do you remember Heartbleed? Because that was last year. Do you remember the day the whole Internet discovered that none of our security had ever been working, and how relieved we all were when the entire rest of the world failed to notice, and civilization didn't collapse?

    One mistake that stupid in one technology underpinning robot cars, and the entire world will notice.

    I would have bought "by around 2040, driverless cars are a majority on American roads." It's entirely possible. But "car accidents and traffic are nearly nonexistent" makes the whole thing stink of bullshit so much that nothing can redeem those paragraphs now.

    Say you want to replace trucks with robots. This is a worthy goal, and in fact I know of a cool startup headed in a similar direction. There are probably many. But keep in mind that long-haul cargo trucks are often operated by poorly-educated individuals driving under the influence of crystal meth. Your startup does not need to achieve a "nearly nonexistent" accident rate to succeed. It only needs to outperform poorly-educated individuals who are driving under the influence of crystal meth.

    Also, cars are only sized for people because people make up the majority of vehicle cargo, and the entirety of vehicle operators. But if your vehicle's operator size is measured in millimeters, because it's a piece of silicon, then you suddenly only need to consider the size of your cargo. So, we're supposed to believe that traffic will become less of a problem, in a situation where there now exist compelling financial incentives to build extremely large vehicles, extremely tiny vehicles, and vehicles of every size in between?

    This is a car.

    These are also cars.

    And keep in mind you can now use automated vehicles to transport anything.

    And that cars can now have legs.

    So this is what we're supposed to believe:

    We're going to add an incredible level of variety to the sizes, shapes, and purposes of vehicles on the road, and in the skies. We're going to pilot them with software, not people, because software's cheaper and faster.

    But this new, incredible diversity in size and purpose will not affect traffic patterns negatively. The software will not have any bugs, and if the software ever somehow does have a bug, those bugs will never be catastrophic, even though the software could be piloting any of an incredible range of possible vehicles, at any of an incredible range of possible speeds, while carrying any of an incredible range of possible cargo types — including human beings, nuclear waste, or angry bees.

    Are you fucking kidding me?

    The angry bees thing really happened. Fourteen million bees were released in a truck crash; the driver was stung countless times.

    Here's a more likely scenario: these fuckers are going to crash a drone full of angry bees into a robot semi transporting nuclear waste, and then the whole thing is going to spill onto a fleet of robot Ubers, smashing the cars, killing everyone inside, and then turning the corpses into goddamn bee zombies with nuclear bee powers.


    It's entirely possible the authors of this white paper were fools, rather than liars, but what they're saying is certainly false, one way or the other. There do not exist sufficient financial incentives for a perfect accident rate. An accident rate that keeps lawsuits from eating up profits is the most reasonable thing to expect. The higher those profits are, the more accidents they can subsidize. And that's what we can expect from the people whose code works.

    But most people's code doesn't work. Most people's code almost makes sense, but not quite. So most software in very widespread use is doing things which almost make sense, but not quite, at scale.

    Anyway, this report wasn't sponsored by Uber. But here's the billionth thing associated with Uber which is making my bullshit detector scream bloody murder. That's all I'm saying.

    By the way, I love robots. I went to RobotsConf and piloted a drone with Node.js, and I loved every second of it. But I'm pretty sure I also crashed it into somebody's head at least twice.

    by Giles Bowkett ( at May 07, 2015 10:46 AM

    Fog Creek

    Remote Working Tips – Interview with Wade Foster

    .little {font-size: 75%}
    Remote Working Tips – Interview with Wade Foster

    Looking for audio only? Listen on

    We’ve interviewed Wade Foster, CEO of Zapier and author of ‘The Ultimate Guide to Remote Work‘. We discuss his experience with remote working and running a distributed company. We go into the tools, processes and hiring practices necessary to succeed with remote working, as well as some of the drawbacks and challenges that come along with it.

    Content and Timings

    • Introduction (0:00)
    • About Wade and Zapier (0:20)
    • Remote Working at Zapier (1:17)
    • Successful Remote Working Processes (4:07)
    • Tools for Remote Working (5:25)
    • Characteristics of the Best Remote Employees (6:47)
    • The Drawbacks of Remote Working (11:27)
    • Recommended Resources (14:00)



    Wade Foster is Co-founder & CEO at Zapier, a YC alum company founded in 2011. Zapier is a distributed company, with 25 employees spread around the world. Wade wrote the book, ‘The Ultimate Guide to Remote Work’, in which he provides advice from his experience with remote working. Welcome Wade, why don’t you share a bit about yourself?

    About Wade and Zapier

    I’m one of the three co-founders and the CEO here at Zapier. We started it about a little over three years ago now really just to help hook up apps for small businesses. There are so many apps out there today. We hook into over 400 and we’re not even close to having support for all of them. It allows non-programmers, non-technical folks to just do simple automation between apps we normally use.

    For example, if you use a tool like Trello which listeners are probably aware of, you can do things like create a recurring Trello card in there or you can email in cards to create Trello cards. Or you could say when someone fills out this Wufoo form, it should automatically create a card in Trello. It just hooks up into all these different systems, so that you can make Trello work a lot nicer with things.

    It doesn’t just work with Trello. It works with all the tools that you’re probably familiar with like Dropbox, Gmail, MailChimp, SalesForce, the list goes on. That’s kind of the gist of Zapier.

    Remote Working at Zapier

    Zapier has always been a distributed company from the outset. Why is this, and how has it worked for you whilst you’ve grown?

    So, when we started, Brian, Mike and I all lived in the same place. We were in Columbia, Missouri, but we still had day jobs. Mike was still in school. Zapier started as a side project. It just doesn’t make sense when you have limited time with a side project, it doesn’t make sense like, “Let’s all wait until we’re all hanging out in the same room looking right at each other to work on this project.” We said the thing that just makes sense is when we have time, let’s try and make as much progress as we could. We’d do that at nights from our homes, from coffee shops, from the library. Sometimes we’d meet together and work on something or at each other’s houses or whatever.

    That was definitely the exception to the rule. It was like that for the first nine months or so. Then we got into YC and we actually for the only time in Zapier’s history, the three of us worked in the same place together. After YC ended, Mike, we’d moved out to California for YC and then after it ended, Mike moved back to Missouri because his then girlfriend, now wife was in law school and he wanted to be with her. Then we hired a guy to do support in Chicago, so it was kind of like ‘hey, this just seems like the way we’re going to do things’. Really, it’s kind of like this remote, distributed asynchronous workplace was just kind of baked in from the beginning for us.

    So I think it’s definitely allowed us to hire people that we’ve worked with. In the beginning, we hired people that we worked with before. That we knew were good. They didn’t necessarily live in the same place. We were able to hire good people and there was kind of like this built in trust where we didn’t have to go recruit people from scratch who we had never worked with, we weren’t sure if it’s going to work out or not, which would have been tough for us because in California we had just moved there. We didn’t know anybody really. It felt like taking a huge chance on people.

    Early on we got to work with people that we knew were going to be great because we had already worked with them and they were great. It didn’t matter where they lived. Then as we’ve grown it’s certainly been a benefit to be able to add on. We started hiring people that we don’t know. We have a standard interview process. Things like that. It works out really great because we get to work with people who are super smart all over the world. It helps with just really kind of random silly stuff too, like our support team in spread all over the world, so we’re pretty close to having 24 hour support, which is something that very little tech teams have.

    From a DevOps perspective we have people who are around the world, so like if the site’s having issues, you don’t have to wake up at 3AM to fix it because it’s someone else’s lunchtime and they can help fix it. There’s this nice convenience when you have people when you can set your stuff up to where everyone is working all over the world and get to use the timezone diversity kind of to your advantage.

    Successful Remote Working Processes

    How has working remotely impacted the processes you use to get work done?

    I think process is actually really important. A lot of early companies kind of think that hinders their creativity or whatever, but I think for a remote team it’s really important because and if you’re co-located you can get away with not having it because you can always just yell across the room and say, “Hey dude, this thing or whatever.”

    In a remote team, people aren’t in the same time zone, so they may not be able to have access to you right at that right time. That means you need to make sure that documentation is really, really good. From the outset you’re making sure that the documentation’s good, you’re making sure that information is available, so having public Dropbox accounts, having an internal wiki, having Slack or HipChat or something so that there’s these public logs of stuff that’s going on. Your code is well documented. All that stuff is really important because it allows people to get their jobs done in the absence of help being around right that very instant.

    That’s why I think process is really important, it really provides the groundwork for people to self-serve, do their job even if they don’t necessarily have a person there to answer a question for them. They do have information there that they can go do some research and figure out the answer themselves.

    Tools for Remote Working

    What tools do you think are key to supporting remote work?

    So there’s a handful of tools that we use. I don’t think the actual tool is as important as the category of tool. Like you probably need one of these tools in your tool bag.

    For instance we use Slack for our group chat. You could just as easily use HipChat or Campfire or something. They’re both great as well. We use Trello for lightweight project management. We have an internal blog/Reddit style tool that we call Async that we built that we use to replace internal emails. There’s really no internal email at Zapier to speak of. Then we use GitHub for our code hosting and issue management. Then Help Scout is for support and other external email I guess that comes into Zapier. Really that’s all we use on the tools side of things.

    Occasionally we’re on Google Hangout or GoToMeeting or whatever. Not much other than that. We bake in other tools like from here to there. Certain individuals will use a different tool for something. They might use Zapier to pull it into the main tools. However we try and keep it pretty light on tools because that’s just one less thing for people. Oh, HackPad, that’s another one that we use all the time. We use that for all our internal documentation and it’s pretty slick.

    Characteristics of the Best Remote Employees

    Zapier is growing quickly, what should people consider when hiring remote employees?

    I think probably the most important thing with remote work is that you’re able to trust these people. Even if you don’t know someone, do you feel comfortable with them enough to give them just free reign? Do you trust that if I can’t see you, I know that you’re going to be getting stuff done? What that means is that the types of people that I feel like even though I don’t know them, that I can trust them are ones that come in and they show like whether in their past projects that they’ve taken a lot of initiative. Maybe that means that they’ve done side projects or they’ve gone above and beyond current work. Somehow they’ve shown I’m not just going to do the lowest bar. I’m going to do extra stuff on the side.

    That’s the kind of person who just in the absence of I guess direction is just going to find stuff to do and find interesting problems and tackle them. I think that’s really key. The second thing is how well do they communicate via written words? Are their email correspondence with us early on in the conversation, are they being crystal clear? Do they know how to schedule a meeting in different timezones? It’s kind of a silly thing to know, but if you screw that up, that’s kind of shows that you’re not really hooked into how this sort of stuff will work.

    People who have done freelance work or contract work are also pretty good because they’ve had to work with… Set their own schedules. They’ve had to deal with clients externally. They’ve had to deliver expectations to people. There’s a lot more knowns with those types of people. Those are some things that I think are pretty important. Then of course they need to have all the other stuff that a great teammate would have, right? You want someone that’s not a jerk. You want someone that can walk a mile in somebody else’s shoes. Who’s not going to have a huge ego. That stuff that you would want whether you work remotely or not. On top of that you really want to have the good communication skills and you want them to have to have the initiative to go above and beyond and not have to wait for instructions I guess.

    One of the things I think is really key too for new teammates is that they need to have an outside social group. If you’re the type of person that’s used to your work colleagues being also your social colleagues, that’s probably not going to be… Remote work is probably not going to be a great fit for you. You want to be able to have family or friends or something else in your physical world so that when work ends, you can actually go out and socialize with a real human being from time to time. I think that’s pretty important to help mitigate, like feeling too remote or isolated from the rest of the world. You want to make sure that you’ve got that outside network that’s not tied to your job.

    Company culture is key to the continued success of any company. How can you build a great working culture whilst working remotely?

    Tools like Slack and HipChat make it pretty easy. A lot of our, we have fun with memes and gifs and stuff inside of Slack. It takes on, you see how culture evolves inside of internet communities, like Reddits, sub-Reddits or Hacker News or some other forum that you may be a part of. You’ve seen how culture develops.

    It’s kind of similar to that in a remote team. You have to make sure to foster that a little bit. You make sure that new folks know the rules of the road about ‘hey, it’s kind of okay to be a little edgy’ or maybe we’re not a little edgy with how we do stuff inside of our Slack room or whatever. That kind of gets people to kind of know a little bit where the boundaries are without having to be too strict about it.

    Then of course we also get together in person a couple times a year. Twice a year we fly everyone out to some location and do a retreat. You get to spend time, see people face to face and you realize ‘hey, this person is the person that I work with and they’re a real human being. They exist in the real world somehow’, which is like it’s pretty important for a team when that’s not a normal occurrence.

    It’s actually pretty special too. I find it a lot more exciting to see my teammates at Zapier than when I worked in a co-located facility. It’s a more rare instance. The fact that you get to see someone. I don’t know. It’s a little more exciting. That makes the culture, I guess those face to face meetings help really I guess evolve the culture as well too.

    The Drawbacks of Remote Working

    What are some of the main drawbacks you’ve experienced from working remotely?

    Communication is I think probably the biggest challenge. I think that’s the biggest challenge for even co-located teams. The thing that’s really tricky I guess with communication is when you’re co-located you can be a little bit lazy about it.

    You don’t have to be as explicit about who’s doing what or what’s going on because you’re sitting right next to each other, you can see what each other’s working on. Someone starts to get off track you can be like, “Hey, what is that? What’s going on there?” Or if you’ve got some issue you can just shout across the room and say, “Hey Bob, can you help me with this thing?” or whatever.

    It allows you to be a little bit lazier. With a remote team you really have to be pretty organized with how things are getting done. You have to know these are the things that people are working on. These projects, these are the most important projects that are getting done right now, so that those key tasks kind of get checked off. If you’re dealing with timezone differences, you kind of know what’s happening so that the person who’s halfway across the world when you’re sleeping, they don’t feel like they’re completely lost about what’s going on or what’s happening.

    You need to be really, really, I guess, upfront about what’s happening in your company. The way that we get away with that is just through our internal blog, with public communication, so everything is… anytime you make progress on a thing you post something to the blog saying ‘here’s what’s happening. Here’s what’s going on’. If you have a key question about something you post it to the internal blog. Make something that’s going on.

    Any time that you’ve built a new tool or built a new feature you document it inside of our internal docs so that people who come along know how to use it, know what it’s for. There’s no place in Zapier, if you were going to build a feature, if you’re going to do something, there’s no such thing as hiding it or hoarding it to yourself. That’s the worst thing you could do on a remote team. The most important thing is once you have set something up, you need to provide the right links to the tool or the feature or the process or whatever and you need to write documentation around it so that other people know how to use it or modify it or do something with that thing.

    I think that’s probably the most critical thing is getting that communication layer right and making sure that new people know that that is a huge priority. That you can’t be lazy about that. It’s like the most important thing that you could do. I think that’s certainly, that’s probably the biggest challenge with remote teams is just getting that communication layer right.

    Recommended Resources

    What are some resources you can recommend for those interested in finding out more about how to successfully build a distributed company?

    So the book that I wrote, ‘The Ultimate Guide To Remote Work’, I think is pretty good, but in particular the very last chapter of that book has a list of some of my favorite resources that I’ve read. There’s Basecamp, it has their book. Remote 37 Signals, the Remote Book. The team at Treehouse has written dome good stuff. Fog Creek has written some good material on this. Buffer has written some good material on this. There’s lots of interviews with the Automattic team about remote work. I think there’s not a ton of companies doing this, but the ones that are are doing a pretty good job of sharing what’s working well and what’s not working well for them.

    I think that’s just really helpful to being able to see what’s worked for others. Especially others that are maybe a little bit bigger than whatever your company’s at right now because as you grow you kind of can guess what the next problems are going to be because they’ve already solved them. That’s super nice. I know for us, the Buffer team I think is exactly a year older than us. They’re just maybe like five to ten people ahead of us in hiring. It’s really nice because and they’re super transparent about everything, so it’s really nice because they ran all their stuff and we just get this nice guidebook of stuff that we should be watching out for next. We don’t use it exactly, don’t copy them exactly, but it’s just nice to know a little bit of what other companies are experiencing.

    Thanks for your time today, Wade.

    Yeah, thanks for having me.

    by Gareth Wilson at May 07, 2015 09:03 AM

    Tim Ferriss


    Noah Kagan on The Tim Ferriss Show
    Noah Kagan was #30 at Facebook, #4 at, and is the Chief Sumo (founder) at SumoMe, which offers free tools to help grow website traffic. To keep things extra spicy, he’s become a taco connoisseur and created 4 separate products that have generated more than 7 figures.

    This podcast conversation is about all of the tools and tricks he uses to do it all.

    Noah was my co-teacher in the “Starting a Business” episode of The Tim Ferriss Experiment, which is now the #1 TV season across all of iTunes. In the episode, we help a novice entrepreneur named Cindy to develop and launch her business in a single week. See all the details here, and be sure to watch the bonus hour of behind-the-scenes footage.

    But back to the current podcast…

    Noah and I cover a ton, including his favorite tools, apps, books, routines, and more.  It ranges from apps for preventing distractions, to how he blocks out time every Tuesday for learning, to how he gained 40 pounds of (mostly) muscle in the last six months or so.

    If you loved the resource-rich business interviews with Ramit Sethi and Tracy DiNunzio, you’ll love this one.

    So, here’s the interview, chock full of tools, cursing, and sexual innuendo…


    If you can’t see the above, here are other ways to listen:

    This podcast is brought to you by Athletic Greens (AG), my all-in-one nutritional insurance policy. It’s a whole food-derived greens powder that I’ve used since 2008 or so to cover my bases in a busy world. If I need to skip meals or eat sub-optimal food, AG allows me to worry less. For travel, I take pouches with me to prevent fatigue. For a limited time, you can try AG at 50% off! Click here.  It ain’t cheap, but I find it totally worth it.

    This podcast is also brought to you by 99Designs, the world’s largest marketplace of graphic designers. Did you know I used 99Designs to rapid prototype the cover for The 4-Hour BodyHere are some of the impressive results.

    QUESTION(S) OF THE DAY:  Are you afraid of doing the “coffee challenge” that Noah describes? If so, why? If not, please do it and share the results in the comments. Feel free to share any other experiences with “comfort challenges” like those in The 4-Hour Workweek.

    Scroll below for all show notes, links, resources, etc….


    Subscribe to The Tim Ferriss Show on iTunes.
    Non-iTunes RSS feed

    Links from the Episode

    SumoMe: website, Twitter, Facebook
    Noah’s blog

    Peter Thiel
    Alfred App
    Facebook Newsfeed Eradicator
    Schedule Once ($99 a year option)
    Andrew Warner
    Quest protein bars
    Tuft and Needle
    My Pillow
    Parachute bedding
    Steve Pavlina
    Tucker Max
    Monthly 1K
    Darren Rowse
    Shane Snow
    Taco Deli
    Gary Halbert Letters
    Kopywriting Kourse
    The Pleasure of Finding Things Out – Richard Feynman
    Withings Scale
    The Online Coach – the SHUL workout
    Pavel Tsatsouline
    Travis Brewer
    RAD Roller
    Evan Williams Bourbon
    Charlie Hoehn

    Travis Scott
    Promise Ring

    Router that Noah recommends

    Books Mentioned

    The Martian

    Go the F**k to Sleep

    Who — Here is Noah’s short and personal book report on Who. I have about 10 pages of notes from this book. It’s well worth purchasing (I prefer Kindle version so I can highlight and export).

    The 22 Immutable Laws of Marketing


    The Ultimate Sales Machine

    Million Dollar Consulting

    The Sales Acceleration Formula


    SPIN Selling

    Ogilvy on Advertising

    Small Giants

    Surely You’re Joking Mr. Feynman!

    Starting Strength

    Practical Programming

    Show Notes

    Noah’s ad for living in Austin, TX [1:39]
    Noah’s favorite tools he’s using right now [6:26]
    Noah’s health/fitness routine [13:43]
    Noah’s mattress and bedding recommendations [17:08]
    Why Noah organizes his dollar bills in his wallet [25:14]
    What the coffee challenge is [30:54]
    The 3 most important (but undervalued) things people should spend more time learning [45:43]
    What REALLY changed the game for Noah in his writing style [47:59]
    Why Noah blocks out 2 hours every Tuesday morning just for learning [58:54]
    Noah’s tips for adding muscle [1:03:01]
    Noah’s business rules [1:17:00]
    Noah’s challenge to build your email list (prize included) [1:27:00]
    How to get a custom email address added to your Gmail [1:33:30]

    by Christine Baird at May 07, 2015 05:06 AM

    Blue Sky on Mars

    Saying No to Sales

    There it was, right in my inbox:

    If you go ahead and make those changes, we’ll come on board and send you a check for $75,000.

    75 grand was a buncha cash for GitHub back in 2010. It became pretty clear that this was going to be no ordinary sales thread I was about to deal with.

    When I first started at GitHub, I worked on GitHub Firewall Install. This was our version GitHub that you could install on your own servers. This was the product that would eventually evolve into GitHub Enterprise.

    OG GitHub Enterprise

    A month or two into my employment, we got an email in the sales queue from a prospective company with a short list of needs in our product. They made it abundantly clear that they couldn’t switch to GitHub without these points addressed. If we went ahead and built them, though, boom, easy 75k. Hell, that was more than my year’s salary. Not too shabby.

    While all of their needs combined wouldn’t take more than a day or two of development time, most of them were requests that were pretty obvious we didn’t want to add to our product. There was a real concern about bloating our app and increasing our support burden and costs.

    I was still feeling really new to the gig and was pretty nervous about this large potential contract, so I remember spending a good half hour or so responding to the email, considering my approach. I didn’t want to piss away potential future customers, even if we couldn’t help them today.

    Those are great suggestions, and we’ll keep them in mind. Or maybe, We have some interesting thoughts about solving these problems in the future. Perhaps god you’re stressing me the fuck out dude. Or no, maybe we should just go with Sorry, but that’s not feasible in our current product.

    Eventually I found a tactful way to put my thoughts into words and fired off a response.

    Not three minutes later, I received a response back:

    Cool, no problem. My boss made me ask that. We’ll have a check in the mail later today.

    That was that.

    The whole exchange is still burned into my memory five years later because it was the first surprising sales lesson I learned: don't go chasing the quick buck.

    It’s a bit of a cliché in the startup world to always focus on the product rather than what your customers think they need. Henry Ford and faster horses and all that. I knew this, and we talked about this constantly on the team, but it’s still one of those things that can blindside you if you’re not actively thinking about it.

    Money can be really tempting.

    But everything you add to your product dilutes everything else. It becomes harder to use. It becomes more expensive to support. And chasing individual features and one-off fixes can unfortunately shield you from coming up with even simpler approaches that solve this problem and seven others at the same time.

    That’s not to say you should ignore customer feedback, or ignore your sales channel, or anything of the sort. It just means you deeply consider every little product change you make. It means you only make these changes if it aligns with your goal and will make your users happier in the long-term. It means you're proactive rather than reactive.

    If you believe in your product, and you have faith that what you're building is the way forward, hold your ground and resist adding things just for the short-term gain. The long-term can kill you just as well, and by that point it may be too late to save it.

    May 07, 2015 12:00 AM

    May 06, 2015

    Dave Winer

    I would have hired Doug, but..

    Philip Greenspun wrote a post on his Harvard blog about MIT grads over 50 having a hard time finding work. In his post he cites a piece I wrote about how I would have hired Doug Engelbart, when I was running my first startup in the 80s. His piece is getting a lot of traffic. That's good. I'm glad people are thinking about this.

    My saying I would have hired Doug Engelbart in the 1980s means nothing about the job market in 2015. What I would have done in 1985 is irrelevant today. I'm not hiring. And I'm pretty sure my counterpart in 2015 doesn't feel the way I might have felt then.

    I might have hired Engelbart because his work laid the foundation for the work we were doing at Living Videotext. He felt his work wasn't finished. We could have helped him achieve his vision, and he could have helped us make our software more useful. Perhaps we could have skipped years of evolution, avoiding the blind alleys he had to back out of in his earlier work.

    Now the big wheel has turned and today I'm in the situation Engelbart was in in the 80s. Unlike Engelbart, I have re-tooled. I now work in JavaScript in the browser and on the server. I had to walk away from the codebase that I loved. I understood that the price of relevance is to give up fighting at some point and settle for a partial victory. I think I was right in the development environment I created. But right doesn't mean the world uses what you created. Maybe 20 or 30 years from now these ideas will have gained traction. I won't be programming then. I almost certainly won't even be alive.

    I turned 60 over the weekend. It's a tough birthday, or it was for me. I didn't want to have it in public, so I told Facebook not to announce it. I think younger people don't understand. I finally think I understand how they don't understand. The ones that love me say I'm really young, and I appreciate that. I think they mean my thinking is flexible, and I'm excited about the future, like a young person might be. But the clock ticks in predictable ways. My body is that of a 60 year-old. And the world treats me as one as well. Most people can't see or feel the enthusiasm an older person has. Or they don't believe. Or they don't think.

    Like Engelbart in the 80s, I feel my work is not done. I still pump out ideas executed in software at an amazing clip. I wonder why people don't wonder how I do it. The processes I use, investing in good tools and underpinnings, and paying attention to good features of other people's software, makes it easy and quick to try out new ideas. Some of them are really worth it. Look at the list of achievements on the home page for an idea.

    I want to share what I know. I want people to use my products. There's not that much road in front of me to get the work done. I'm pretty sure that there will be a lot left on my plate when I finally hang em up for the last time. I guess that's a sign of a rich and productive creative life.

    PS: An earlier version of this post, on my liveblog, became the top item on Hacker News. Quite an interesting discussion ensued, with no slamming. Coooool.

    May 06, 2015 10:24 PM

    Mark Bernstein


    Writers’ Guidelines for Fallen London, the stylish interactive Web Fiction from Failbetter.

    Weather: It never more than drizzles in Fallen London. There’s no wind unless Storm is up to shenanigans. The temperature doesn’t change much.

    Is it possible to read series bibles of completed series – Buffy, say, or Babylon 5? Where? It might be an interesting comparison.

    Thanks, Stacey Mason

    May 06, 2015 01:14 PM

    Giles Bowkett

    Eurorack Is Awesome

    One of the most important technological tasks in electronic music is intermachine communication. You might have a drum machine, a synthesizer to play a bass line, another synth to play a melody, and a sampler to play a loop from an old 1970s funk song. You might want all these devices to play at the same time. Or you might just want your computer to tell them which notes to play.

    MIDI is the ubiquitous protocol which most music machinery uses for communication. It stands for Musical Instrument Digital Interface, and it's a simple protocol which can only transmit very limited data. It replaced CV, which stands for Control Voltage. CV is more expressive than MIDI, but its original implementations were very unreliable and inconvenient. MIDI offered reliability, regularity, perfect timing, and rock-solid stability.

    For years, a small group of hipsters and hackers have wanted to replace MIDI with OSC, which stands for Open Sound Control, but it's never really taken off. The protocol carries more data than MIDI, uses a URL-like naming scheme, and has a number of other significant advantages, but has failed to see much acceptance, enthusiasm, or awareness. My gut feeling is that it was just too complicated.

    Meanwhile, CV's experienced an incredible renaissance. Where previous decades saw a great deal of incompatibile implementations, most CV-oriented gear today organizes around a common standard called Eurorack for voltages, machine sizes, and power consumption. Artists such as the Chemical Brothers, deadmau5, John Tejada, Orbital, Richard Devine, Nectarios, and Alessandro Cortini from Nine Inch Nails have embraced Eurorack, and Eurorack manufacturers have produced a ton of expressive, very powerful, and wildly innovative new instruments. Most Eurorack manufacturers are tiny companies — one of the best, Cwejman, is literally one person — but bigger names like Roland and Dave Smith Instruments have gotten involved in the past few months.

    I'm not entirely sure what the lesson to learn here is. CV's renaissance stems from several factors:
    • Control voltage is an intensely simple API. (Control voltage is to synths what stdin and stdout are to Unix.)
    • Electronics are more reliable to manufacture today than they were when CV was first developed.
    • Vintage synth fanatics kept CV alive.
    • Advances in DSP and ever-tinier microprocessors make it easier than ever to build tiny, sophisticated instruments.
    • Software-emulated modular synthesis systems like Reason and Reaktor introduced a new generation to modular techniques.
    • Eurorack modules interact very simply and readily, while the Eurorack market is full of quirky experiments and ideas, sold in short runs. This combines intermittent rewards with scarcity, so it's a lot like if Lego blocks were sold the way Magic: The Gathering cards are. That's inherently addictive, and it's caused the market to grow.
    Without diving into these causes in great detail, it's really hard to identify which are the most important driving forces. API simplicity looks like the best explanation, but it's also kind of a perfect storm.

    by Giles Bowkett ( at May 06, 2015 10:57 AM

    Venture Capital Makes Us All Stupid (But So Does Moore's Law)

    Most of the stupidest shit in hacking is programmers reinventing wheels. The new wheels start out square, and eventually become round. Sometimes the process of becoming round takes a very long time. CSS is one obvious example, but you see it over and over — in GUIs, in distributed systems, in language design, and everywhere else.

    Avoiding the mistakes of the past is a very old problem with a very old solution: listen to people who have been there before. But old people are pushed out of the tech industry, where "old" means "over 30." I think there are two main reasons for this.

    First, Moore's Law pushes virtually everything to become a computer. To computerize any given thing becomes cheaper and cheaper with every passing moment, and most things become more useful with the change. But as every object becomes computerized, the demand for programmers grows and grows, and it really shows no sign of stopping for quite a while.

    It may slow or disappear altogether once computers learn to write code for themselves, but it may not. At the very minimum, the black market for illegal hacks will grow and grow and grow, irrespective of who wrote the systems being hacked, or indeed who wrote the hacks.

    For the forseeable future, because each generation is "always" larger than the one which came before it, it's going to be a truism that programming will "always" seem overrun with kids. But because people are very prone to stereotyping and overestimating the importance of successful flukes, a field overrun with young people is a great petri dish for cultivating ageism.

    And venture capital exacerbates this problem. They're gamblers. They like to think they bet on likely winners, but it's more accurate to say they bet on what they perceive as likely winners. In other words, they go for young white men from Ivy League universities, not because those individuals truly have any higher probability of success, because venture capitalists are human, and they're as susceptible to logical fallacies, stereotyping, and superstition as the rest of us.

    But they're more influential than the rest of us. So, like their sexism, their racism, and their tendency to chase shallow fads, their ageism becomes the industry's ageism.

    To be clear, they're not responsible for all of it. There are built-in factors which make ageism highly likely, if not necessarily inevitable.

    But they make it worse. They hire young people straight out of college to reinvent wheels, badly, in huge numbers.

    And keep in mind that Moore's Law is almost a force of nature, while venture capitalists are a group of people. Of the two forces that are making us stupid, one of them can be reasoned with (relatively speaking, at least).

    I don't think these trends are very likely to dissipate, but it's worth it to try and get some sense into their heads. And if you're a VC looking for an edge, I have good news: wisdom is inherently valuable, yet it has a terrible marketing problem, and will probably continue to do so for your entire lifetime.

    by Giles Bowkett ( at May 06, 2015 09:59 AM

    Three Gripes About Time Travel In Science Fiction

    First, the grandfather paradox isn't real. All you do is get Buddhist with it. The moment is all that exists; time is just a way of tracking configuration permutations within the moment. Hopping out of one moment and into another, without travelling through all the intermediate moments, already suspends the allegedly tight coupling between time and chains of cause and effect. The grandfather paradox is for people who've never bothered to read quantum physics.

    Second, while time may not truly exist in the classical sense, air certainly does. In normal life, when we travel from moment to moment, we can move into a new physical location by pushing air out of the way. If you suddenly appear somewhere because you've travelled through time, you suddenly share space with other matter. Although you might not, which brings me to the third issue.

    If you're on a planet which is rotating about its own axis and rotating around the axis of the sun and located within a solar system which is itself moving through space at 45,000 miles per hour, then any time travel system would have to involve a lot of travel through space as well, unless its only purpose was to cause people to die horribly in the most scientifically impressive way. Because ten seconds ago, the entire planet was somewhere else. So if you push somebody into another point in time without also changing their physical position, they'll probably just be stranded in the vaccuum of space.

    Like anything else, a practical time travel system would have to solve a lot of theoretically unrelated problems in order to be even slightly useful. And most of the "oh wow man that shit is deep" that goes on around time travel stories is just not.

    by Giles Bowkett ( at May 06, 2015 08:44 AM

    Tim Ferriss


    timterrace___Flickr_-_Photo_Sharing_This happy-looking shot was taken in 1999, when I almost destroyed myself.

    In this post, I’m going to talk about suicide, and why I’m still on this planet.

    These are stories I’ve kept secret from my family, girlfriends, and closest friends for years. Recently, however, I had an experience that shook me — woke me up — and I decided that it was time to share it all.

    So, despite the shame I might feel, the fear that is making my palms sweat as I type this, allow me to get started.

    Here we go…


    “Could you please sign this for my brother? It would mean a lot to him.”

    He was a kind fan. There were perhaps a dozen people around me asking questions, and he had politely waited his turn. The ask: A simple signature.

    It was Friday night, around 7pm, and a live recording of the TWiST podcast had just ended. There was electricity in the air. Jason Calacanis, the host and interviewer, sure knows how to put on a show. He’d hyped up the crowd and kept things rolling for more than 2 hours on stage, asking me every imaginable question. The venue–Pivotal Labs’ offices in downtown SF–had been packed to capacity. Now, more than 200 people were milling about, drinking wine, or heading off for their weekends.

    A handful of attendees gathered near the mics for pics and book inscriptions.

    “Anything in particular you’d like me to say to him? To your brother?” I asked this one gent, who was immaculately dressed in a suit. His name was Silas.

    He froze for few seconds but kept eye contact. I saw his eyes flutter. There was something unusual that I couldn’t put a finger on.

    I decided to take the pressure off: “I’m sure I can come up with something. Are you cool with that?” Silas nodded.

    I wrote a few lines, added a smiley face, signed the book he’d brought, and handed it back. He thanked me and backed out of the crowd. I waived and returned to chatting with the others.

    Roughly 30 minutes later, I had to run. My girlfriend had just landed at SFO and I needed to meet her for dinner. I started walking towards the elevators.

    “Excuse me, Tim?” It was Silas. He’d been waiting for me. “Can I talk to you for a second?”

    “Sure,” I said, “but walk with me.”

    We meandered around tables and desks to the relative privacy of the elevator vestibule, and I hit the Down button. As soon as Silas started his story, I forgot about the elevator.

    He apologized for freezing earlier, for not having an answer. His younger brother–the one I signed the book for–had recently committed suicide. He was 22.

    “He looked up to you,” Silas explained, “He loved listening to you and Joe Rogan. I wanted to get your signature for him. I’m going to put this in his room.” He gestured to the book. I could see tears welling up in his eyes, and I felt my own doing the same. He continued.

    “People listen to you. Have you ever thought about talking about these things? About suicide or depression? You might be able to save someone.” Now, it was my turn to stare at him blankly. I didn’t know what to say.

    I also didn’t have an excuse. Unbeknownst to him, I had every reason to talk about suicide. I’d only skimmed the surface with a few short posts about depression.

    Some of my closest high school friends killed themselves.
    Some of my closest college friends killed themselves.
    I almost killed myself.

    “I’m so sorry for your loss,” I said to Silas. I wondered if he’d waited more than three hours just to tell me this. I suspected he had. Good for him. He had bigger balls than I. Certainly, I’d failed his brother by being such a coward in my writing. How many others had I failed? These questions swam in my mind.

    “I will write about this” I said to Silas, awkwardly patting his shoulder. I was thrown off. “I promise.”

    And with that, I got into the elevator.


    “They tried to bury us. They didn’t know we were seeds.”
    – Mexican proverb

    There are some secrets we don’t share because they’re embarrassing.

    Like that time I met an icon by accidentally hitting on his girlfriend at a coffee shop? That’s a good one (Sorry, N!). Or the time a celebrity panelist borrowed my laptop to project a boring corporate video, and a flicker of porn popped up–a la Fight Club–in front of a crowd of 400 people? Another good example.

    But then there are dark secrets. The things we tell no one. The shadows we keep covered for fear of unraveling our lives.

    For me, 1999 was full of shadows.

    So much so that I never wanted to revisit them.

    I hadn’t talked about this traumatic period publicly until last week, first in a reddit AMA (Ask Me Anything), then in greater depth on Derek Halpern’s podcast.

    What follows is the sequence of my downward spiral.

    Reading the below, it’s incredible how trivial some of it seems in retrospect. At the time, though, it was the perfect storm.

    I include wording like “impossible situation,” which was reflective of my thinking at the time, not objective reality.

    I still vividly recall these events, but any quotes are paraphrased. Please also excuse any grammatical/tense errors, as it was hard for me to put this down. So, starting where it began…

    • It’s my senior year at Princeton. I’m slated to graduate around June of 1999. Somewhere in the first six months, several things happen in the span of a few weeks:
  • I fail to make it to final interviews for McKinsey Consulting and Trilogy Software, in addition to others. I have no idea what I’m doing wrong, and I start losing confidence after “winning” in the game of academics for so long.

  • A long-term (for a college kid, anyway) girlfriend breaks up with me shortly thereafter. Not because of the job stuff, but because I became more insecure during that period, wanted more time with her, and was massively disruptive to her final varsity sports season. What’s wrong with me?

  • I have a fateful meeting with one of my thesis advisors in the East Asian Studies department. Having read a partial draft of my work, he presents a large stack of original research in Japanese for me to incorporate. I walk out with my head spinning — how am I going to finish this thesis (which generally run 60-100 pages or more) before graduation? What am I going to do?

  • It’s important to note that at Princeton, the senior thesis is largely viewed as the pinnacle of your four-year undergrad career. That’s reflected in its grading. The thesis is often worth around 25% of your entire departmental GPA (English department example here).

    After all of the above, things continued as follows…

    • I find a rescue option! In the course of researching language learning for the thesis, I’m introduced to a wonderful PhD who works at Berlitz International. Bernie was his name. We have a late dinner one night on Witherspoon Street in Princeton. He speaks multiple languages and is a nerd, just like me. One hour turns into two, which turns into three. At the end, he says, “You know, it’s too bad you’re graduating in a few months. I have a project that would be perfect for you, but it’s starting sooner.” This could be exactly the solution I’m looking for!
  • I chat with my parents about potentially taking a year off, beginning in the middle of my senior year. This would allow me time to finish and polish the thesis, while simultaneously testing jobs in the “real world.” It seems like a huge win-win, and my parents— to their credit —are hugely supportive.

  • The Princeton powers OK the idea, and I meet with the aforementioned thesis advisor to inform him of my decision. Instead of being happy that I’m taking time to get the thesis right (what I expected), he seems furious: “So you’re just going to quit?! To cop out?! This better be the best thesis I’ve ever seen in my life.” In my stressed out state, and in the exchange that follows, I hear a series of thinly veiled threats and ultimatums… but no professor would actually do that, right? The meeting ends with a dismissive laugh and a curt “Good luck.” I’m crushed and wander out in a daze.

  • Once I’ve regained my composure, my shock turns to anger. How could a thesis advisor threaten a student with a bad grade just because they’re taking time off? I knew my thesis wouldn’t be “the best thesis” he’d ever seen, so it was practically a guarantee of a bad grade, even if I did a great job. This would be obvious to anyone, right?

  • I meet with multiple people in the Princeton administration, and the response is — simply put — “He wouldn’t do that.” I’m speechless. Am I being called a liar? Why would I lie? What was my incentive? It seemed like no one was willing to rock the boat with a senior (I think tenured) professor. I’m speechless and feel betrayed. Faculty politics matter more than I do.

  • I leave my friends behind at school and move off campus to work — I find out remotely — for Berlitz. “Remote” means I end up working at home by myself. This is a recipe for disaster. The work is rewarding, but I spend all of my non-work time — from when I wake to when I go to bed — looking at hundreds of pages of thesis notes and research spread out on my bedroom floor. It’s an uncontainable mess.

  • After 2-3 months of attempting to incorporate my advisor’s original-language Japanese research, the thesis is a disaster. Despite (or perhaps because of) staring at paper alone for 8-16 hours a day, it’s a Frankenstein’s monster of false starts, dead ends, and research that shouldn’t be there in the first place. Totally unusable. I am, without a doubt, in worse shape than when I left school.

  • My friends are graduating, celebrating, and leaving Princeton behind. I am sitting in a condo off campus, trapped in an impossible situation. My thesis work is going nowhere, and even if it turns out spectacular, I have (in my mind) a vindictive advisor who’s going to burn me. By burning me, he’ll destroy everything I’ve sacrificed for since high school: great grades in high school got me to Princeton, great grades in Princeton should get me to a dream job, etc. By burning me, he’ll make Princeton’s astronomical tuition wasted money, nothing more than a small fortune my family has pissed away. I start sleeping in until 2 or 3pm. I can’t face the piles of unfinished work surrounding me. My coping mechanism is to cover myself in sheets, minimize time awake, and hope for a miracle.

  • No miracle arrives. Then one afternoon, as I’m wandering through a Barnes and Noble with no goal in particular, I chance upon a book about suicide. Right there in front of me on a display table. Perhaps this is the “miracle”? I sit down and read the entire book, taking copious notes into a journal, including other books listed in the bibliography. For the first time in ages, I’m excited about research. In a sea of uncertainty and hopeless situations, I feel like I’ve found hope: the final solution.

  • I return to Princeton campus. This time, I go straight to Firestone Library to check out all of the suicide-related books on my to-do list. One particularly promising-sounding title is out, so I reserve it. I’ll be next in line when it comes back. I wonder what poor bastard is reading it, and if they’ll be able to return it.

  • It’s important to mention here that, by this point, I was past deciding. The decision was obvious to me. I’d somehow failed, painted myself into this ridiculous corner, wasted a fortune on a school that didn’t care about me, and what would be the point of doing otherwise? To repeat these types of mistakes forever? To be a hopeless burden to myself and my family and friends? Fuck that. The world was better off without a loser who couldn’t figure this basic shit out. What would I ever contribute? Nothing. So the decision was made, and I was in full-on planning mode.

  • In this case, I was dangerously good at planning. I had 4-6 scenarios all spec’d out, start to finish, including collaborators and covers when needed. And that’s when I got the phone call.

  • [My mom?! That wasn’t in the plan.]

  • I’d forgotten that Firestone Library now had my family home address on file, as I’d technically taken a year of absence. This meant a note was mailed to my parents, something along the lines of “Good news! The suicide book you requested is now available at the library for pick up!”

  • Oops (and thank fucking God).

  • Suddenly caught on the phone with my mom, I was unprepared. She nervously asked about the book, so I thought fast and lied: “Oh, no need to worry about that. Sorry! One of my friends goes to Rutgers and didn’t have access to Firestone, so I reserved it for him. He’s writing about depression and stuff.”

  • I was shocked out of my own delusion by a one-in-a-million accident. It was only then that I realized something: my death wasn’t just about me. It would completely destroy the lives of those I cared most about. I imagined my mom, who had no part in creating my thesis mess, suffering until her dying day, blaming herself.

  • The very next week, I decided to take the rest of my “year off” truly off (to hell with the thesis) and focus on physical and mental health. That’s how the entire “sumo” story of the 1999 Chinese Kickboxing (Sanshou) Championships came to be, if you’ve read The 4-Hour Workweek.

  • Months later, after focusing on my body instead of being trapped in my head, things were much clearer. Everything seemed more manageable. The “hopeless” situation seemed like shitty luck but nothing permanent.

  • I returned to Princeton, turned in my now-finished thesis to my still-sour advisor, got chewed up in my thesis defense, and didn’t give a fuck. It wasn’t the best thesis he’d ever read, nor the best thing I’d ever written, but I had moved on.

  • Many thanks are due to a few people who helped me regain my confidence that final semester. None of them have heard this story, but I’d like to give them credit here. Among others: My parents and family (of course), Professor Ed Zschau, Professor John McPhee, Sympoh dance troupe, and my friends at the amazing Terrace Food Club.

  • I graduated with the class of 2000, and bid goodbye to Nassau Hall. I rarely go back, as you might imagine.

  • Given the purported jump in “suicidal gestures” at Princeton and its close cousins (Harvard appears to have 2x the national average for undergrad suicides), I hope the administration is taking things seriously.  If nearly half of your student population reports feeling depressed, there might be systemic issues to fix.

    Left unfixed, you’ll have more dead kids on your hands, guaranteed.

    It’s not enough to wait for people to reach out, or to request that at-risk kids take a leave of absence “off the clock” of the university.

    Perhaps regularly reach out to the entire student body to catch people before they fall?  It could be as simple as email.

    [Sidenote: After graduating, I promised myself that I would never write anything longer than an email ever again. Pretty hilarious that I now write 500-plus-page books, eh?]



    “Being deeply loved by someone gives you strength, while loving someone deeply gives you courage…”
    – Lao Tzu

    First, let me give a retrospective analysis of my near obliteration.  Then, I’ll give you a bunch of tools and tricks that I still use for keeping the darkness at arm’s length.

    Now, at this point, some of you might also be thinking “That’s it?! A Princeton student was at risk of getting a bad grade? Boo-fuckin’-hoo, man. Give me a break…”

    But… that’s the entire point.  It’s easy to blow things out of proportion, to get lost in the story you tell yourself, and to think that your entire life hinges on one thing you’ll barely remember 5-10 years later. That seemingly all-important thing could be a bad grade, getting into college, a relationship, a divorce, getting fired, or just a bunch of hecklers on the Internet.

    So, back to our story–why didn’t I kill myself?

    Below are the realizations that helped me (and a few friends).  They certainly won’t work for everyone suffering from depression, but my hope is that they help some of you.

    1. Call this number : 1 (800) 273-8255. I didn’t have it, and I wish I had. It’s the National Suicide Prevention Lifeline (website and live chat here). It’s available 24 hours a day, 7 days a week, in both English and Spanish.

    If you’re outside of the US, please click here for a list of international hotlines.

    Sometimes, it just takes one conversation with one rational person to stop a horrible irrational decision. If you’re considering ending your life, please reach out to them.  If you’re too embarrassed to admit that, as I was, then you can ping them “just to chat for a few minutes.” Pretend you’re killing time or testing different suicide hotlines for a directory you’re compiling. Whatever works.

    Speaking personally, I want to see the gifts you have to offer the world. And speaking from personal experience, believe me: this too shall pass, whatever it is.

    2. I realized it would destroy other people’s lives. Killing yourself can spiritually kill other people.

    Even if you’re not lucky enough, as I was, to feel loved by other people, I think this is worth meditating on.

    Your death is not perfectly isolated. It can destroy a lot, whether your family (who will blame themselves), other loved ones, or simply the law enforcement officers or coroners who have to haul your death mask-wearing carcass out of an apartment or the woods. The guaranteed outcome of suicide is NOT things improving for you (or going blank), but creating a catastrophe for others. Even if your intention is to get revenge through suicide, the damage won’t be limited to your targets.

    A friend once told me that killing yourself is like taking your pain, multiplying it 10x, and giving it to the ones who love you.  I agree with this, but there’s more.  Beyond any loved ones, you could include neighbors, innocent bystanders exposed to your death, and people — often kids — who commit “copycat suicides” when they read about your demise. This is the reality, not the cure-all fantasy, of suicide.

    If think about killing yourself, imagine yourself wearing a suicide bomber’s vest of explosives and walking into a crowd of innocents.

    That’s effectively what it is.  Even if you “feel” like no one loves you or cares about you, you are most likely loved–and most definitely lovable and worthy of love.

    3. There’s no guarantee that killing yourself improves things!

    In a tragically comic way, this was a depressing realization when I was considering blowing my head off or getting run over.  Damnation!  No guarantees.  Death and taxes, yes, but not a breezy afterlife.

    The “afterlife” could be 1,000x worse than life, even at its worst.  No one knows. I personally believe that consciousness persists after physical death, and it dawned on me that I literally had zero evidence that my death would improve things. It’s a terrible bet. At least here, in this life, we have known variables we can tweak and change. The unknown void could be Dante’s Inferno or far worse. When we just “want the pain to stop,” it’s easy to forget this. You simply don’t know what’s behind door #3.

    In our desperation, we often just don’t think it through. It’s kind of like the murder-suicide joke by one of my favorite comics, Demetri Martin:

    “Someone who commits a murder-suicide is probably somebody who isn’t thinking through the afterlife. Bam! You’re dead. Bam! I’m dead. Oh shit … this is going to be awkward forever.”

    4. Tips from friends, related to #2 above.

    For some of my friends (all high achievers, for those wondering), a “non-suicide vow” is what made all the difference. Here is one friend’s description:

    “It only mattered when I made a vow to the one person in my life I knew I would never break it to [a sibling]. It’s powerful when you do that. All of a sudden, this option that I sometimes played around in my mind, it was off the table. I would never break a vow to my brother, ever. After the vow and him accepting it, I’ve had to approach life in a different way. There is no fantasy escape hatch. I’m in it. In the end, making a vow to him is the greatest gift I could have given myself.”

    As silly as it might sound, it’s sometimes easier to focus on keeping your word, and avoiding hurting someone, than preserving your own life.

    And that’s OK. Use what works first, and you can fix the rest later. If you need to disguise a vow out of embarrassment (“How would I confess that to a friend?!”), find a struggling friend to make a mutual “non-suicide vow” with.  Make it seem like you’re only trying to protect him or her. Still too much? Make it a “mutual non-self-hurt” vow with a friend who beats themselves up.

    Make it about him or her as much as you.

    If you don’t care about yourself, make it about other people.

    Make a promise you can’t break, or at the very least realize this: killing yourself will destroy other people’s lives.



    Now, let’s talk day-to-day tactics.

    The fact of the matter is this: if you’re driven, an entrepreneur, a type-A personality, or a hundred other things, mood swings are part of your genetic hardwiring.  It’s a blessing and a curse.

    Below are a number of habits and routines that help me. They might seem simplistic, but they keep me from careening too far off the tracks.  They are my defense against the abyss. They might help you find your own, or use them as a starting point.

    Most of this boxed text is from a previous post on “productivity ‘hacks’ for the neurotic, manic-depressive, and crazy (like me)“, but I’ve added a few things:

    Most “superheroes” are nothing of the sort. They’re weird, neurotic creatures who do big things DESPITE lots of self-defeating habits and self-talk.

    Here are some of my coping mechanisms for making it through the day:

    1) Wake up at least 1 hour before you have to be at a computer screen. E-mail is the mind killer.

    2) Make a cup of tea (I like pu-erh like this) and sit down with a pen/pencil and paper.

    3) Write down the 3-5 things — and no more — that are making you most anxious or uncomfortable. They’re often things that have been punted from one day’s to-do list to the next, to the next, to the next, and so on. Most important usually = most uncomfortable, with some chance of rejection or conflict.

    4) For each item, ask yourself:

    – “If this were the only thing I accomplished today, would I be satisfied with my day?”
    – “Will moving this forward make all the other to-do’s unimportant or easier to knock off later?”

    5) Look only at the items you’ve answered “yes” to for at least one of these questions.

    6) Block out at 2-3 hours to focus on ONE of them for today. Let the rest of the urgent but less important stuff slide. It will still be there tomorrow.

    7) TO BE CLEAR: Block out at 2-3 HOURS to focus on ONE of them for today. This is ONE BLOCK OF TIME. Cobbling together 10 minutes here and there to add up to 120 minutes does not work.

    8) If you get distracted or start procrastinating, don’t freak out and downward spiral; just gently come back to your ONE to-do.

    9) Physically MOVE for at least 20 minutes each day. Go for a long walk, lift weights, take a free online yoga class (YouTube), anything. Ideally, get outside. I was once asked by friend for advice on overcoming debilitating stress. The answer I repeated over and over again was: “Remember to EXERCISE daily. That is 80% of the battle.”

    10) Follow a diet that prevents wild blood sugar swings. This means avoiding grains and refined carbohydrates most of the time. I follow the slow-carb diet with one cheat day per week and have done so for 10+ years.  Paleo also works great. Don’t forget to eat plenty of fat. High protein and low fat can give you low-grade symptoms of rabbit starvation.

    11) Schedule at least one group dinner with friends per week.  Get it on the calendar no later than 5pm on Monday.  Ideal to have at least three people, but two is still great medicine.

    12) Take a minute each day to call or email someone to express gratitude of some type. Consider someone you haven’t spoken with in a long time.  It can be a one-line text or a 5-second voicemail.

    Congratulations! That’s it.

    Those are the rules I use, and they help steer the ship in the right direction.

    Routines are the only way I can feel “successful” despite my never-ending impulse to procrastinate, hit snooze, nap, and otherwise fritter away my days with bullshit. If I have 10 “important” things to do in a day, I’ll feel overwhelmed, and it’s 100% certain nothing important will get done that day. On the other hand, I can usually handle 1 must-do item and block out my lesser behaviors for 2-3 hours a day.

    And when — despite your best efforts — you feel like you’re losing at the game of life, never forget: Even the best of the best feel this way sometimes. When I’m in the pit of despair with new book projects, I recall what iconic writer Kurt Vonnegut said about his process: “When I write, I feel like an armless, legless man with a crayon in his mouth.”

    Don’t overestimate the world and underestimate yourself. You are better than you think.


    My “perfect storm” was nothing permanent.

    If we let the storms pass and choose to reflect, we come out better than ever. In the end, regardless of the fucked up acts of others, we have to reach within ourselves and grow. It’s our responsibility to ourselves and–just as critical–to those who love and surround us.

    You have gifts to share with the world.

    You are not alone.

    You are not flawed.

    You are human.

    And when the darkness comes, when you are fighting the demons, just remember: I’m right there fighting with you.

    The gems I’ve found were forged in the struggle. Never ever give up.

    Much love,


    P.S. If you have tips that have helped you overcome or manage depression, please share in the comments. I would love for this post to become a growing resource for people. I will also do my best to improve it over time. Thank you.

    Additional Resources:

    If you occasionally struggle like me, these resources, videos, and articles might help you rebound. I watch the video of Nick Vujicic quite often, just as a reminder of how fortunate I am:

    The National Suicide Prevention Lifeline – 1 (800) 273-8255 (website and live chat here). It’s available 24 hours a day, 7 days a week, in both English and Spanish. Outside the US? Please click here for a list of international hotlines.

    My recent interview with Derek Halpern – The core of the conversation is about how to overcome struggle and the above suicide-related story, but it also includes business strategies and other lessons learned.  My apologies for the weird lip smacking, which is a nervous tic. I thought I’d fixed it, but these stories brought it back :)

    15-Minute Audio from Tony Robbins I asked Tony for his thoughts on suicide. He responded with a very insightful audio clip, recorded while in the air. It covers a lot, and the hilarious anecdote about the raw-foodist mom at the end alone makes it worth a listen. NOTE: Of course, NEVER stop taking anti-depressants or any medicine without medical supervision. That is not what Tony is recommending.
    Listen in the player above, or download by right-clicking here and choosing “save as.”

    The Prescription for Self-Doubt? Watch This Short Video (Nick Vujicic)

    Harnessing Entrepreneurial Manic-Depression: Making the Rollercoaster Work for You

    Two Root Causes of My Recent Depression – This article is by Brad Feld, one of my favorite start-up investors and a world-class entrepreneur in his own right. It’s just more proof that you’re not alone. Even the best out there feel hopeless at times.  It can be beaten.

    Radical Acceptance by Tara Brach.  This book is not nearly as woo-woo as it might seem.  It was recommended to me by a neuroscience PhD who said it changed her life, then by another cynical friend who said the same.  It is one of the most useful books I’ve read in the last two years.  It’s easy to digest, and I suggest one short chapter before bed each night.  For those of us who beat ourselves up, it’s a godsend.

    by Tim Ferriss at May 06, 2015 07:29 AM

    May 05, 2015

    Dave Winer

    Fog Creek

    How to Hire the Smartest Developers – Video Guide

    .video { margin-right: 15px; height: 46px; }

    It’s no secret that hiring Developers is hard. Hiring great Developers is even harder. So it’s not surprising that companies are going to great lengths to attract the top talent, and competition is fierce.

    But attracting talent is only half the battle. It’s difficult to make the right hiring decisions too. Of up most importance is a hiring process that allows you to spot the best candidates amongst your applicants. To help you, we’ve created a video series that takes you through the key steps in hiring the smartest programmers.

    Covering everything from résumé screening to interviews and making the final hiring decision, these six short videos provide some helpful tips on how to hire the best engineering talent. It’s a process that has worked well for us and has contributed to us creating some great products that people love.

    Check out the full video series, or learn more about each video below:

    1. Why Hire the Smartest Programmers?

    Learn how hiring the best programmers benefits the whole team and how they can make 10x the difference.

    2. Résumé Screening

    Find out why you should look out for ‘PBECS’ in all candidates and see some good and bad résumé examples.

    3. Phone Interviews

    This video covers the key aspects of a phone interview and the kinds of questions that work well in phone interviews.

    4. Remote Code Tests

    Learn about the scenarios that work in remote code tests and what to look out for in the best candidates.

    5. In-person Interviews

    This video covers examples of good interview questions, the importance of question consistency and just how many interviews you should run.

    6. Hire or No Hire?

    When it comes to making the hiring decision, hear why we think there should be no Ifs, Buts or Maybes.

    by Gareth Wilson at May 05, 2015 09:19 AM

    May 04, 2015

    Mark Bernstein

    The Virgins

    An accomplished and skillfully-written prep school story that takes its characters seriously. The students here are not so much young as simply inexperienced: they know a lot, they have strong opinions and determined characters and they are not fools, but they haven’t done any of this before. Bruce Bennet-Jones, the unreliable and unpleasant narrator, looks on as his classmate Seung Jung wins the love of the girl Bennet-Jones cannot possess, the new girl in school, Chicagoan Aviva Rossner. Fascinating, strange, and serious.

    May 04, 2015 02:39 PM

    John Udell

    In search of the Holy Grail of audio and video editing

    In "A better way to capture team meetings," I explored Google's Hangouts on Air as a tool for annotating a videoconference. If you're the live or post-facto scribe for a meeting, it's a great way to contextualize your summary with pointers to the relevant parts of the discussion. Scrubbing around in the video and capturing "Get video at current time" links couldn't be much easier. But video is an opaque data type that we can't easily scan or search.

    Text, on the other hand, is eminently scannable and searchable. Given a high-quality transcript with embedded timecodes that align individual words to corresponding points in the video, you could use that transcript as an interface to an audio editor. That's something I've long imagined, but won't experience anytime soon. Right?

    To read this article in full or to leave a comment, please click here

    by Jon Udell at May 04, 2015 10:00 AM

    May 03, 2015

    Lambda the Ultimate

    BER MetaOCaml -- an OCaml dialect for multi-stage programming

    BER MetaOCaml -- an OCaml dialect for multi-stage programming
    Oleg Kiselyov

    BER MetaOCaml is a conservative extension of OCaml for ``writing programs that generate programs''. BER MetaOCaml adds to OCaml the type of code values (denoting ``program code'', or future-stage computations), and two basic constructs to build them: quoting and splicing. The generated code can be printed, stored in a file -- or compiled and linked-back to the running program, thus implementing run-time code optimization. A well-typed BER MetaOCaml program generates only well-scoped and well-typed programs: The generated code shall compile without type errors. The generated code may run in the future but it is type checked now. BER MetaOCaml is a complete re-implementation of the original MetaOCaml by Walid Taha, Cristiano Calcagno and collaborators.

    Introduction to staging and MetaOCaml

    The standard example of meta-programming -- the running example of A.P.Ershov's 1977 paper that begat partial evaluation -- is the power function, computing x^n. In OCaml:

    let square x = x * x
    let rec power n x =
      if n = 0 then 1
      else if n mod 2 = 0 then square (power (n/2) x)
      else x * (power (n-1) x)


    In MetaOCaml, we may also specialize the power function to a particular value n, obtaining the code which will later receive x and compute x^n. We re-write power n x annotating expressions as computed `now' (when n is known) or `later' (when x is given).

    let rec spower n x =
      if n = 0 then .<1>.
      else if n mod 2 = 0 then .<square .~(spower (n/2) x)>.
      else .<.~x * .~(spower (n-1) x)>.;;
    A brief history of (BER) MetaOCaml

    As MetaOCaml was being developed, new versions of the mainline OCaml were released with sometimes many fixes and improvements. The MetaOCaml team tracked new OCaml releases and merged the changes into MetaOCaml. (The MetaOCaml version number has as its base OCaml's release version.) The merge was not painless. For example, any new function in the OCaml compiler that dealt with Parsetree (AST) or Typedtree has to be modified to handle MetaOCaml extensions to these data structures. The merge process became more and more painful as the two languages diverged. For instance, native code compilation that first appeared in MetaOCaml 3.07 relied on SCaml, a large set of patches to OCaml by malc at to support dynamic linking. OCaml 3.08 brought many changes that were incompatible with SCaml. Therefore, in MetaOCaml 3.08 the native compilation mode was broken. The mode was brought back in the Summer 2005, by re-engineering the SCaml patch and implementing the needed parts of dynamic linking without any modification to the OCaml code. The revived native compilation has survived through the end.


    BER MetaOCaml has been re-structured to minimize the amount of changes to the OCaml type-checker and to separate the `kernel' from the `user-level'. The kernel is a set of patches and additions to OCaml, responsible for producing and type-checking code values. The processing of built code values -- so-called `running' -- is user-level. Currently the user-level metalib supports printing, type-checking, and byte-compiling and linking of code values. Users have added other ways of running the code, for example, compiling it to machine code, C or LLVM -- without any need to hack into (Meta)OCaml or even recompile it.


    By relying on attributes, the feature of OCaml 4.02, BER N102 has become much closer integrated with OCaml. It is instructive to compare the amount of changes BER MetaOCaml makes to the OCaml distribution. The previous version (BER N101) modified 32 OCaml files. The new BER N102 modifies only 7 (that number could be further reduced to only 2; the only file with nontrivial modifications is typing/ It is now a distinct possibility that -- with small hooks that may be provided in the future OCaml versions -- MetaOCaml becomes just a regular library or a plug-in, rather being a fork.

    May 03, 2015 04:16 PM

    Giles Bowkett

    Two More Videos About Synthesizers

    In this video, I show how a Microbrute sound works. I might use this for my upcoming class.

    This is just a video of Mutable Instruments' Peaks and Frames modulating a bass line played by a Microbrute.

    by Giles Bowkett ( at May 03, 2015 10:56 AM

    May 02, 2015

    Mark Bernstein


    A-Rod got his 660th, tying Willie Mays. No one seems all that excited.

    I remember when Aaron broke Ruth’s record. That was a big deal, in part because Ruth’s record had stood for so long, in part because Ruth was the greatest player in history. Aaron wasn’t the greatest player, though he was great.

    Then Bonds broke Aaron’s record, to much hissing. The catch here is simply that you can argue that Bonds was the greatest hitter in history. Because of steroids, and because he hasn’t been easy to get along with, no one really wants to make the argument. But the argument’s there in the record book: you could look it up.

    And now here’s A-Rod, passing the Say-Hey Kid. It ought to be a good time, a time to look back to the Polo Grounds and the Vic Mertz catch and 660. That’s a lot of homers!

    I think we really need to stop obsessing with pills. We accept all sorts of other kinds of sports medicine. We accept cheating: no one ever accused Ty Cobb of playing fair, and we’re not ignoring his records. It’s a game.

    May 02, 2015 03:41 PM

    Tim Ferriss


    Vessel_-_How_to_Hack_and_Win_Online_DatingHacker Samy Kamkar in “The Dating Game”

    Samy Kamkar is one of the most innovative and notorious computer hackers in the United States. He’s also a well-known whistleblower. If you want to learn how Samy hacks everything from online dating to car alarms, this episode is for you.

    He is best known for creating the fastest spreading virus of all time, a MySpace worm named “Samy.” He got raided by the United States Secret Service for that one. More recently, he’s created SkyJack, a custom drone that hacks into any nearby drones, allowing him (or any operator) to control a swarm of devices; and Evercookie, which appeared in top-secret NSA documents revealed by Edward Snowden. He also discovered illicit mobile phone tracking by Apple iPhone, Google Android and Microsoft Windows Phone mobile devices.

    His research and findings led to a series of class-action lawsuits against these companies and a privacy hearing on Capitol Hill.

    To see Samy help me hack my online dating, click here for the “Dating Game” episode of my new TV show.

    But to get us started, here is an epic, wine-fueled conversation with Samy about all things hacking-related…

    TF-ItunesButton TF-StitcherButton

    As a bonus, here are other podcast episodes from experts who appear in The Tim Ferriss Experiment: Josh Waitzkin (Chess Prodigy + Brazilian Jiu-Jitsu), Neil Strauss (The Game), and Ed Cooke (Memory Champion).

    Don’t miss Samy’s site, his outstanding YouTube channel, and his Twitter.

    This podcast is brought to you by Mizzen + Main. Mizzen + Main makes the only “dress” shirts I now travel with — fancy enough for important dinners but made from athletic, sweat-wicking material. No more ironing, no more steaming, no more hassle. Click here for the exact shirts I wear most often.

    This episode is also brought to you by 99Designs, the world’s largest marketplace of graphic designers. Did you know I used 99Designs to rapid prototype the cover for The 4-Hour Body? Here are some of the impressive results.

    QUESTION(S) OF THE DAY: What precautions have you taken to protect yourself in a digital world? Please share in the comments here.

    Last, if you haven’t yet seen The Tim Ferriss Experiment, please check it out!  It’s currently the #1 TV show season on iTunes and Apple TV, beating out Game of Thrones, Downton Abbey, and Mad Men (!).  See what the buzz is about.


    by Tim Ferriss at May 02, 2015 04:48 AM

    May 01, 2015

    Lambda the Ultimate

    Generating compiler back ends at the snap of a finger

    The paper:

    Resourceable, Retargetable, Modular Instruction Selection Using a Machine-Independent, Type-Based Tiling of Low-Level Intermediate Code

    Ramsey and Dias have a series of papers about making it ever easier to generate compiler backends, and the claim is that they produce decent code to boot. I wonder if this stuff has/will show up in compilers I can use? (Or, do you think it not actually matter, for some pragmatic reason or other?)

    Abstract: We present a novel variation on the standard technique of selecting instructions by tiling an intermediate-code tree. Typical compilers use a different set of tiles for every target machine. By analyzing a formal model of machine-level computation, we have developed a set of tiles that is machine-independent while retaining the expressive power of machine code. Using this tileset, we reduce the number of tilers required from one per machine to one per architectural family (e.g., register architecture or stack architecture). Because the tiler is the part of the instruction selector that is most difficult to reason about, our technique makes it possible to retarget an instruction selector with significantly less effort than standard techniques. Retargeting effort is further reduced by applying an earlier result which generates the machine-dependent implementation of our tileset automatically from a declarative description of instructions' semantics. Our design has the additional benefit of enabling modular reasoning about three aspects of code generation that are not typically separated: the semantics of the compiler's intermediate representation, the semantics of the target instruction set, and the techniques needed to generate good target code.

    May 01, 2015 10:28 PM

    Alarming Development

    Future Programming Workshop 2015

    The Future Programming Workshop will return this year to SPLASH and Strange Loop. See This year we are taking any kind of media, not just videos. Web pages and papers are welcome too. By request of the academic members of our community we will publish proceedings containing the paper-format submissions. We are applying for permission to publish the proceedings in the ACM Digital Library but will go somewhere else if necessary.

    Like last year we will offer the option to present at the Strange Loop pre-conference FPWxELC event. Unlike last year there will also be a chance to present publicly at SPLASH. The SPLASH event will be two days: the first for public presentations and the second for the private writers’ workshop.

    Thanks to Richard Gabriel and Alex Payne for teaming up with me to make this happen.

    Submission deadline is August 7 (pre-submit July 19 for Strange Loop). So get to work and show us what you’ve got!

    by Jonathan Edwards at May 01, 2015 07:18 PM

    Dave Winer

    Professional users

    I love testers. Great testers are essential. Or you could look at them as professional users. Or something else. But without them, software projects flounder.

    One of the things I said to Doc yesterday is that if you can write a good bug report you'll do better as a user, because the problems you're hitting will move to the front of the queue. If I, as a developer, get a set of reproducible steps, that show how to recreate the problem, and steps work on my machine, I can usually fix the problem straight away. And I like to fix problems in my code.

    The best user/tester I've ever worked with was Terry Teague. He had a day job at Apple as a tester, but contributed his time for free to various developer projects. We were lucky to have him as part of our team on Frontier. When we were preparing a new release, he'd put the product through its paces, and his bug reports were the best, hands down. Never seen anything like it. His steps-to-reproduce were clear, easy to follow, and almost always failed on my machine (failure in this case is success).

    Unfortunately Terry died in 2005. And he's never been replaced.

    We should be teaching young people how to be great users. How to contribute to the projects that make them more effective at doing what they do. The best form of contribution is to communicate clearly about ways the software isn't working.

    There's a common, incorrect, belief that users don't matter, they can't do anything to help open source projects. Nothing could be further from the truth. Just having one user put a bit of serious concentrated time in working on my product made a huge difference for me as a developer. If Doc hadn't been willing to come to the phone and work with me, the problem would still be in the software. Who knows how many users suffered silently with this, or worse, just stopped using the product because they thought it was sabotaging their work (in a way it was). And how many more problems are waiting to be discovered, waiting until a user cares enough to get to the bottom of what input is producing the bad output.

    Bottom-line: Software needs users to care about it.

    May 01, 2015 01:02 PM

    Greg Linden

    Quick links

    Some of the best of what I've been thinking about lately:
    • Amazon now has 109 warehouses and 165k employees. Wow. ([1])

    • Amazon cloud computing has 17% operating margins, surprisingly high given all the competition ([1] [2])

    • Microsoft appears to be claiming they're going to be bigger than Amazon AWS in three years ([1])

    • But Amazon's Andy Jassy says, "One of the biggest surprises around this business has been how long it took the old guard companies to try and pursue an offering. None of us thought we would get a seven-year head start.” ([1])

    • Apple is the iPhone ([1])

    • Great article on the history of YouTube: "It's easy to forget YouTube almost didn't make it" ([1])

    • Mobile ads still aren't targeted (unlike Web ads) ([1] [2])

    • Browsers are disabling Java and Silverlight by default, and Flash's days might be numbered ([1])

    • Surprising how few people use their mobile to get directions, look up public transit, or request a taxi ([1])

    • A major predictor of how much people like a picture of a face is how sharp and clear the eyes are in the photo ([1])

    • Successful tests of a bullet-sized guided missile, cool but very scary ([1] [2])

    • "If an election was hacked any time in the past, we will never know" ([1])

    • "Maybe this head-up display for your life starts as a head-up display for your car" ([1])

    • Beginning of the end for radio: "Norway the first country in the world to 'decide upon an analogue switch-off for all major radio channels'" ([1])

    • A new trend in biology, collecting large amounts of data and doing A/B testing ([1] [2])

    by Greg Linden ( at May 01, 2015 12:57 PM

    April 30, 2015

    Dave Winer


    A few weeks back, Doc posted a mysterious message to our support list, saying that blank headlines were showing up in his outline, and wanted to know if we knew what the problem was.

    This is the kind of "bug report" that makes programming for users so frustrating. You hear a user is losing data, but have absolutely no idea how to reproduce the problem. It's something you've never seen the software do, can't imagine it actually doing. The description sounds like magic, but nothing in software happens by magic, all programmers will tell you. I believe it's happening but I have no idea why.

    Anyway, the problem was still happening. We needed to get to the bottom of it. So I added a bit of instrumentation to the app. Every second it would look at all the headlines in the outline and count the number of empty ones, displaying the result on the screen. If it was greater than zero the message would show up in red. I wanted to be sure Doc would see it, the instant it happened.

    I called him on Skype and said he should use the software as normal, and when he saw the number go above zero, to stop and think What Did I Just Do, and write me an email. This was my hope to try to get somewhere in the vicinity of reproducible.

    He said it's reporting 9 empty headlines now. Okay, go through the outline, find them and fix them. Get that number down to 0 so we can start debugging.

    So he did, and we talked a bit about this process while he was doing it.

    Then when he was done, he was mousing around the outline and it happened. A headline disappeared.

    I said loudly, now stop! Don't touch anything. Key question: What were you doing?

    He said he was scrolling around the outline and scrolled back to the top and that was when he discovered the headline was empty.

    Turns out it was very important just how he was scrolling around. He was using Pageup and Pagedown, two keys I never use. But for Doc they're central. And when he'd press Pageup or Pagedown, it would wipe out the bar cursor headline. Bing!

    Would it do it on my machine? Drumroll please -- yes it would. So now the bug was trapped. I told Doc we had arrived at the Holy Moment in debugging -- reproducibility. I told him "reproducible" is the programmer's favorite word. If you can tell me the steps to reproduce the problem, then I can find it and fix it. Until it's reproducible all I can do is share your frustration.

    There's a lot more to say about this. I asked Doc to write this up from his point of view. For me it was a breakthrough. Finally, a user who is working on the team with me, to help make the software work better.

    April 30, 2015 09:56 PM

    Mark Bernstein



    I’ve been working on a new Treemap View for Tinderbox. Here’s an example:

    Click here for full size

    What we have here is a section of a Tinderbox note file that contains lots of expense reports from a fictional business trip. Each expense is a box. The area of each box is proportional to the expenditure, scaled logarithmically. The color of each box is proportional to the number of words used to justify the expense to Accounting.

    We’ve got more the fifty notes on view view here – more than we could get onscreen with a outline – and a nice mix of hierarchical structure, visualization, and clarity. Big documents reveal some interesting structure, too; here’s my weblog:


    There’s a good deal of work remaining to do, but it’s shaping up nicely.

    April 30, 2015 08:39 PM

    Writing And Time

    Adam Gopnik:

    Writing is turning time into language, and all good writers have an elaborate, fetishistic relationship to their working hours. Writers talking about time are like painters talking about unprimed canvas and pigments. (Nor is there anything philistine about writers talking money. Inside the ballroom at the PEN banquet, it’s all freedom and dignity; outside, it’s all advances.)

    April 30, 2015 05:51 PM

    The Last Days of California

    An eerily modern Pilgrim’s Progress in which a plain 15-year-old girl is dragged along on a family car trip, starting from their sourly-sweet Alabama home and heading for Oakland, California where, in five days, the Rapture will commence. Dad has lost his job, though the two girls aren’t supposed to know that. Mom has pretty much lost whatever affection she had for Dad, though the two girl’s aren’t supposed to know that, either. Elise, seventeen and beautiful, is pregnant, though Mom and Dad aren’t supposed to know that. And the narrator, Jess Metcalf, has pretty much concluded that it’s all a crock: beauty, true love, goodness, Jesus, fast food, all of it. She learns a lot on the road, but never loses a certain clarity of vision.

    Why hadn’t he texted me? I hoped he didn’t think I was just some girl who had given him a handjob in the back of his van. I was, of course, but I couldn’t think of myself that way, and couldn’t think of him thinking of me that way, either.

    Then again, fast food is pretty good.

    April 30, 2015 02:31 PM

    Fog Creek

    Software Development Metrics – Interview with David Nicolette

    .little {font-size: 75%}
    Software Development Metrics – Interview with David Nicolette

    Looking for audio only? Listen on

    We’ve interviewed Dave Nicolette, a consultant specializing in improving software development and delivery methods and author of ‘Software Development Metrics’. We dive into what factors to consider when selecting metrics, examples of useful metrics for Waterfall and Agile development teams, as well as common mistakes in applying metrics. He writes about software development and delivery on his blog.

    Content and Timings

    • Introduction (0:00)
    • About David (0:21)
    • Factors When Selecting Metrics (3:22)
    • Metrics for Agile Teams (6:37)
    • Metrics for Hybrid Waterfall-Agile Teams (7:37)
    • Optimizing Kanban Processes (8:43)
    • Rolling-up Metrics for Development Management (10:15)
    • Common Mistakes with Metrics (11:47)
    • Recommended Resources (14:30)



    David is a consultant specializing in improving software development and delivery methods. With more than 30 years experience working in IT, his career has spanned both technical and management roles. He regularly speaks at conferences, and is the author of ‘Software Development Metrics’. David, thank you so much for taking your time out of your day to join us. Why don’t you say a bit about yourself?

    About David

    I’ve been involved with software for a while and I still enjoy it, though I’ve been working as a team coach and organizational coach, technical coach, for a few years. I enjoy that.

    Picking up on the book ‘Software Development Metrics’, what made you want to write the book?

    It’s an interesting question, because I don’t actually find metrics to be an interesting topic, but I think it is a necessary thing. It’s part of the necessary overhead for delivering. If we can detect emerging delivery risks early, then we can deal with them. If we don’t discover them until late, then we’re just blindsided and projects can fail. It’s important to measure the right things and be sure we’re on track.

    Secondly, I think it’s important to measure improvement efforts, because otherwise we know we’re changing things and we know whether they feel good, but we don’t know if they’re real improvements if we can’t quantify that. I noticed several years ago that a lot of managers and team leads and people like that didn’t really know what to measure. I started to take an interest in that, and I started to give some presentations about it, and I was very surprised at the response because quite often it would be standing room only and people wouldn’t want to leave at the end of the session. They had more and more questions. It was as if people really had a thirst for figuring out what to measure and how. I looked at some of the books that were out there and websites that were out there, and they tended to be either theoretical or optimistic.

    Metrics for measuring and monitoring software development have been around for decades, but a lot of people still don’t use them effectively. Why do you think that is?

    I often see a pattern that when people adopted new process or method, unfamiliar one, they try to use the metrics that are recommended with that process. There are a couple of issues that I see. One is that they may only be using the process in name only, or they’re trying to use it but they’re not used to it yet, and the metrics don’t quite work because they’re not quite doing the process right.

    The other issue is that people tend to use the measurements that they’re accustomed to. They’ve always measured in a certain way, now they’re adopting a new process. They keep measuring the same things as before, but now they’re doing the work in a different way. There’s a mismatch between the way the work flows and the way it’s being measured. They have numbers and they rely on the numbers, but the numbers are not telling truth because they don’t line up with the way the work actually flows.

    Factors When Selecting Software Development Metrics

    Picking the right metrics is paramount. What are some of the factors that we should consider when selecting metrics?

    Look at the way work actually flows in your organization and measure that. I came up with a model for that in the course of developing this material which I would look at three factors to try to judge which metrics are appropriate. The first factor is the approach to delivery. The basic idea there is if you try to identify all the risks in advance, all the costs, you identify all the tasks, lay out a master plan, and you follow that plan. That’s what I’m calling traditional.

    What I call adaptive is a little different. You define a business capability, you’ve got your customer needs, and you set a direction for moving toward that, and you steer the work according to feedback from your customer, from your stakeholders. You don’t start with a comprehensive plan, you start with a direction and an idea of how to proceed. Then you solicit feedback frequently so you can make course corrections. That’s the first factor I would look at: traditional versus adaptive, and that I think has the biggest impact on which metrics will work.

    The second factor to look at is the process model. I don’t have to tell you that there are a million different processes and nobody does anything in a pure way, but if you boil it down I think there’s basically four reference models we can consider, or process models. One is linear, you can imagine what that is. The canonical steps that go through from requirements through support. The next one would be iterative, in which you revisit the requirements multiple times and do something with them. The third one that I identify is time-boxed. It’s really popular nowadays with processes like Scrum and so on. The fourth one is continuous flow. This is becoming popular now with the Kanban method, and it’s also being adapted into Scrum teams quite a lot. We’re really interested in keeping the work moving smoothly.

    Now a real process is going to be a hybrid of these, but it’s been my observation that any real process will lean more toward one of those models than the others, and that’ll give us some hints about what kind of metrics will fit that situation. The third thing probably has the least impact on is whether you’re doing discreet projects or continuous delivery. What some people call a continuous beta, or some people just don’t have projects. You have teams organized around product lines or value streams, and they continually support them, call it a stream. Between those two there are some differences in what you can measure. Well I look at those three factors, and based on that you can come up with a pretty good starter set of things to measure, and then you can adapt as you go from there.

    Metrics for Agile Teams

    Let’s take a couple of example scenarios. If we have an agile team working in short sprints who are struggling to ship a new product, what kind of metrics should they consider to identify areas for improvement?

    If they’re using Scrum basically correctly, they could probably depend on the canonical metrics that go with that, like velocity and your burn chart. You might look for hangover, incomplete work at the end of the sprint. You might look for a lot of variation in story size, when you finish a story in one day and the next story takes eight days. When it comes to metrics as such they could use, as I said, velocity and so on, and you can always use lean-based metrics because they’re not really dependent on the process model. What they might consider is looking at cycle times. They could look at the mean cycle times as well as the variation in cycle times and get some hints about where to go for root—cause analysis. Metrics don’t tell you what’s wrong, but they can raise a flag.

    Metrics for Hybrid Waterfall-Agile Teams

    What about a hybrid waterfall agile team working on a long term project, wanting to know what it’s possible to deliver by a certain date?

    To know what’s possible to deliver you can use the usual things like a burn chart, burn up or burn down as you prefer, to see according to their demonstrated delivery, their velocity, I’ll call it that, how much scope they can deliver by a given date. Conversely you could see by what date approximately they could deliver a given amount of scope. It depends on what’s flexible. In this kind of a project, usually neither is flexible, but at least you can get an early warning of delivery risk. If it looks like the trend line is way out of bounds with the plan, well now you’ve got a problem.

    One thing that might surprise some people is the idea that agile methods can be used with traditional development. We need to decouple the word “agile” from “adaptive,” because quite often it is used in a traditional context.

    Optimizing Kanban Processes

    What are some metrics relevant to those working in a bug queue? Say they’re wanting to optimize their working practices to stay on top of incoming bugs.

    For that I usually like to use little metrics, mainly cycle time, because you want to be somewhat predictable in your service time so when a bug report comes in people have an idea of when they can expect to see it fixed. How do you do that? Well, you can use empirical information from past performance with fixing bugs, and your mean cycle time will give you approximately how long it takes to fix one.

    I like to use the Kanban method for these kind of teams because it defines classes of service. You’ll find that every type of bug doesn’t take the same amount of time to fix. Based on your history, pick out different categories. You can identify the characteristics of particular kinds of bug reports that tend to fall together, and you can track cycle times differently for each of those classes of service. If someone calls in and says, “Well we got this problem.” “Well that looks like that’s in category two. Whatever that means, that typically takes us between four hours and eight hours.” That can give them a little bit of warm fuzzy feeling about when they’re going to see it fixed. I think that using empirical data and tracking cycle time, is the simplest, most practical way toward that workflow.

    Rolling-up Metrics for Development Management

    What about a CTO who wants to monitor how teams are performing, and ensure code is of high quality? How can metrics be rolled-up for those in more senior positions?

    How the teams are performing, you need measurements that are comparable across teams and comparable across projects. The lean-based metrics needed to compare across teams and projects and across development and support, those kinds of things. If you’re tracking throughput, cycle time, there’s another one I haven’t mentioned that I wanted to: process cycle efficiency. If you track those, those roll up nice. Some other metrics don’t roll up so well. Some of the agile metrics, particularly velocity is really different for each team. Percentage of scope complete, that may not roll up very well either.

    The other question about code quality, I think that if we can let that be a team responsibility then they can use metrics, but they don’t need to report outward from the team. Usually things that they can get out of static code analysis tools will help them spot potential quality issues, but I wouldn’t share very detailed things like static code analysis kind of stuff and code coverage outside the team, because then team members will fell like they’re going to get judged on that and they’ll start gaming the numbers thinking they’re going to be needed those. Those kind of metrics are really for the team’s own use.

    Common Mistakes with Software Development Metrics

    What are some mistakes you often see people make when applying software development metrics?

    People seem to make a couple of mistakes over and over. The one I think I mentioned earlier, people apply metrics that won’t fit the context. Maybe a company wants to ‘go agile’, and so they start tracking agile metrics, so whatever is recommended. The metrics that are recommended are safe or something like that, but they haven’t really fully adopted these new methods. They’re still in the transition, and so the numbers don’t mean what they’re supposed to mean. For instance, they may track velocity, but they might not have feature teams. They might have component teams, and the work items that those teams complete are not vertical slices of functionality. Whatever they’re tracking as velocity isn’t really velocity. You start getting surprised by delivery issues.

    You can also have the opposite situation where teams are working in an agile way, but management is still clinging to traditional metrics. They will demand that the teams report percentage of still complete to date, but you’re doing adaptive development so you don’t have 100 percentage scope defined. You have a direction. You may be 50% complete this week based on what you know of the scope. Next week you might be 40% complete because you’ve learned something, and then the management says “Well what’s going on? You’re going backwards,” and they don’t understand what the numbers mean. What I see happen in that case is it drives the teams away from adaptive development, and causes them to try to get more requirements defined upfront.

    The second mistake I see a lot is that people either overlook or underestimate the effects of measurement on behavior. We can be measuring something for some objective reason, but it causes people to behave differently because they’re afraid they’re going to get their performance review will be bad because they didn’t meet their numbers. I think we have to be very conscious of that. We don’t want to drive undesired behaviors because we’re measuring things a certain way. That not only breaks morale, but it also makes the measurements kind of useless too when they’re not real.

    Those are really the two main mistakes: that they don’t match up the metrics with their actual process, or they neglect the behavioral effect of the metric.

    Recommended Resources

    What are some resources you can recommend for those interested in learning more about managing projects and improving processes?

    I like this, an older book called ‘Software By Numbers’. That’s a classic, but one of David Anderson’s earlier books is called ‘Agile Management From Software Engineering’. That has a lot of really good information to apply economic thinking to different kinds of process models. He covers things like feature driven development, extreme programming. Another guy whose work I like is Don Reinertsen. He combines really deep expertise in statistics with deep expertise in economics and applies that to software, and can demonstrate mathematically why we don’t want to over-allocate teams. How it slows down the work if you load everybody up to 100% actually slows things down. What’s counter intuitive to a lot of managers is if you load your teams to 70% capacity they’ll actually deliver better throughput, but it’s very hard for a lot of managers to see somebody not busy. It’s really hard for them to get there.

    Really appreciate your time today Dave, some great stuff here. Thank you.

    Well I enjoyed the conversation, thanks.

    by Gareth Wilson at April 30, 2015 10:53 AM

    April 29, 2015

    Mark Bernstein

    Outlining With Tinderbox

    Outlining With Tinderbox

    A deep introduction by Steve Zeoli.

    I was going to end this overview by saying that Tinderbox is not the world’s best Mac outliner. But I’ve changed my mind. I think it is the best, when you consider all it has to offer.

    April 29, 2015 08:51 PM

    Dave Winer

    Scoble asks about the Facebook API

    Over on Facebook, my friend Robert Scoble asked how I feel about changes Facebook is making in developer access to the social graph. It was such an interesting question that I did a 10-minute podcast answering the question. Hope you find it interesting!

    April 29, 2015 07:57 PM

    April 28, 2015

    Tim Ferriss

    Tim Ferriss

    [PLEASE NOTE: This contest has ended per the rules explained below. Thanks!]

    I cannot put into words how excited I am to write this post. Perhaps it’s because I’ve had 3 glasses of wine, or perhaps it’s the glee of F bombs below.

    But no.

    It’s because I have a huge TV announcement, an opportunity to get a personalized video from Arnold Schwarzenegger (seriously), and much more.

    Short and sweet — I FINALLY got digital rights to my TV show, The Tim Ferriss Experiment. It’s about how to conquer fear in any skill and 10x your learning speed. Think of it as Mythbusters meets Jason Bourne. Filmed and edited by the Emmy award-winning team behind Anthony Bourdain (Zero Point Zero).

    It took eons of negotiating and lawyering, but I got digital rights for you guys, at long last.

    This is my most important project of the last three years. It literally took blood, sweat, and tears. You’ll see my horrible injuries when you watch the show. In the parkour episode alone, I tore both ACLs, 6 of my 8 total quadriceps muscles (both legs), my rotator cuff muscles, and all the flexors in one forearm.

    If you’ve gotten any value from me over the years, could you please buy the season pass for this fuckin’ show? :) Click here to get 13 episodes for next to nothing. It’s cinematic, insane, and won’t disappoint. Here is all the craziness, including a free preview. In a nutshell:

    Bestselling author Tim Ferriss (“The world’s best human guinea pig.” – Newsweek) pushes himself to the breaking point, attempting to learn notoriously punishing skills–surfing, professional poker, Brazilian jiu-jitsu, parkour, languages, etc.–in just one week each.

    In every episode of The Tim Ferriss Experiment, Ferriss partners with the world’s best and most unorthodox teachers (Laird Hamilton, Marcelo Garcia, Stewart Copeland, etc.), who train him for a final gauntlet. Shocking breakthroughs, injuries, epiphanies, and disasters ensue. In cases where he succeeds, Tim shows you how to replicate his results. The mantra of the show is “you don’t need to be superhuman to get superhuman results…you just need a better toolkit.”

    I’m too tired to hide my Long Island pedigree, so… please just buy this season pass here. You’ll fucking love it.

    A few things to sweeten the pot…

    Arnold Schwarzenegger and Glitch Mob Craziness

    I don’t half-ass launches. I go whole ass. Perhaps even 110% ass. So here’s the deal:

    I want EVERYONE to see this show. I’m super proud of it, and your support means the world to me. 2nd place is 1st loser in my mind, so I’m going all out.

    To the person who promotes the show best (details below), I’m giving away two priceless prizes, both from icons:

    1) You’ll get a personalized motivational video from the Terminator, the man who killed the Predator (for God’s sake, people!) — Arnold Schwarzenegger. If you want to slay dragons and become superhuman, Arnie can motivate you like no one else. He’ll record a video to psyche you to greatness.

    2) You’ll get a custom “anthem” from one of the biggest electronic music groups in the world — The Glitch Mob! Band members Boreta and Ooah will create ~30 seconds of awesomeness, a worldwide original just for you. Use it to get amped to do incredible things. Listen to it every morning, listen to it when you need to kick ass, listen to it before workouts or whenever you need extra juice. No one can buy this.

    Are you fucking kidding me? No, I am not. The above two are real.

    And you can feel good about promoting and buying the show, as 25% of all launch week profits for the TV show go to After-School All-Stars, which supports after-school programs for at-risk youth who need mentors. They do amazing work, and I recognize how a few mentors steered me from disaster early in my life. I want everyone to have that opportunity.

    So… how do you win these bonzo garbanzo bonuses?

    1) Promote the hell out of The Tim Ferriss Experiment this week, driving clicks to the iTunes page:  Here’s one step to get you started.

    2) Leave a comment on this post telling me what you did (including anything quantifiable), no later than this Sunday, May 3rd 2015, at 10pm PT. Comments must be submitted by 10pm PT. It’s OK if they’re in moderation and don’t appear live before 10pm. Note: You must include “#TFX” at the TOP of your comment to be considered! This is an IQ test on following directions.

    3) By May 10th, I and my panel of magic elves will select the winner: he or she who describes in their comment how they drove the most downloads/listens. If you drive people to buy season passes, you get major bonus points.

    4) That’s it! Remember: Deadline is 10pm PT on May 3rd. No extensions and no excuses.

    5) Of course, void where prohibited, no purchase required, you must be over 21, no minotaurs, etc.

    But That’s Not All… (Cue Rotisserie Chicken)

    If you simply buy the season pass, you can get a bunch of awesome stuff. Put another way, if you spend $14.99 USD, you get more than $200 in bonuses.  Here are the deets:

    Important note #1: This only applies to people within the United States, or in US territories. Alas, I could only get rights for the US, so this is only available to residents of the US and US territories for now.  The network wouldn’t give me international rights, but I spent a small fortune trying.  I’ll keep trying.

    Important note #2: Most of these prizes will be delivered by May 10th. You’ll receive confirmation and a remind about all of this, but when you purchase and submit proof of purchase, please be patient.

    1) If you buy the full season pass of the Tim Ferriss Experiment, you will receive all of the below prizes.

    2) When you purchase the full season (remember, single episodes don’t count), you’ll be sent goodies including:

    CreativeLive: A $50 free credit + course from Neil Strauss on the creative process

    CreativeLive is an online learning platform that broadcasts live, high-definition classes to more than 2 million students in 200 countries. The classes are amazing. Teachers include Pulitzer Prize winners, business luminaries, and more.  Neil Strauss, author of The Game, was one of my teachers for the “Dating Game” episode of The Tim Ferriss Experiment.

    90-day free trial + a $200 coupon for WebinarJam

    If you run any type of online business, WebinarJam Studio is a vital tool for entrepreneurs, which allows you to reach an unlimited number of people. The service is turnkey in terms of creating better conversions, allowing you to upload to YouTube, and integrate with your email list.

    The Tim Ferriss Show Transcripts

    It’s taken a long time, but I finally have transcripts from my “Best of iTunes 2014″ podcast. Not just that, but I’ve put them together into a pretty e-book PDF of 600+ pages. These are never-before-released transcripts of 25 of the most popular episodes of The Tim Ferriss Show, including episodes featuring Arnold Schwarzenegger, Triple H, Jon Favreau and more.

    Scribd: 2 free months of subscription

    Scribd is your passport to a reader’s paradise, with more than one million e-books, audiobooks, and comics, including New York Times bestsellers, Pulitzer Prize winners, and reader favorites across every genre. Scribd is available in nearly every country and in more than 80 languages via iOS, Android, Kindle Fire, Nook tablets, and the web.

    ChefSteps: Free high-def cooking classes (don’t ignore this)

    This was an invaluable resource for me when I was writing and research The 4-Hour Chef. ChefSteps is a James Beard Award–winning team of chefs, filmmakers, designers, writers, and scientists on a mission to help people cook smarter. and its companion app are designed to inspire creativity in the kitchen through high-quality interactive content, classes, tools, and resources that will inspire and educate cooks at any skill level.

    [REMINDER: This contest is now over per the rules above. Thanks!]

    And that’s the whole story!

    Still wondering what I’m talking about?  Here you go.

    I hope you love watching it as much as I enjoyed making it!

    Much love and high fives from California,


    by Tim Ferriss at April 28, 2015 09:30 AM

    Fog Creek

    Getting Started with Iteration Planner for Agile and Sprint Planning in FogBugz

    We recently released Iteration Planner. It unlocks the power of FogBugz as an Agile planning tool for software development. With it you can combine sprints and milestones to graphically group cases into the scope of work that you’ll complete in each sprint. You can also balance the allocation of resources by dragging and dropping cases from one assignee to another. Iteration Planner is a lightweight way to plan work and manage teams using FogBugz. Here are a few key details to help you get started with it.

    Create or Convert from the plugin a Backlog milestone

    If you are converting your FogBugz instance to the newest version and you want to use the same backlog order that you were using with the backlog plugin, you’ll need to click “Add Milestone”; locate your backlog milestone; add it to the Iteration Planner display. Your cases will appear in the order that they were ranked with the plugin.

    Populate the Backlog

    You can add cases to your milestones by dragging and dropping them either from the search results column or from other milestones, for example, Backlog; or Sprint x.

    Order the backlog

    By dragging and dropping cases within a milestone, you can change the case sort order for that milestone. The case sort order is independent of the selected grouping: assignee, status, or priority. This order should be understood by the team as the order in which the cases will be completed.

    Create a sprint

    In Agile software development methodology, a sprint is a fixed unit of time in which a scope of work will be done. FogBugz uses milestones to represent Agile sprints. Cases grouped together in a milestone describe the scope of work to be done within the interval of the sprint.

    Populate Sprints with cases

    You can acquire cases by searching for them and dragging them out of the search results column; pulling them from your Backlog or some other milestone; creating them as new cases by using the “create case” button attached to the bottom of each of the milestones.

    Iteration Planner with Backlog and sprint milestones created

    Estimate Sprint cases

    We suggest carefully scrutinizing the sum of all of the estimates included in a particular sprint. That number is the estimated amount of time it will take to complete the scope of work which defines your sprint. Whether you are playing planning poker or timeboxing a discovery period that allows developers to decompose the user stories into discrete tasks, estimates will be key to determining your team’s velocity and probable finish date.

    Confirm the Priority of the cases

    Confirm, with the major stakeholders, your assumptions about which cases comprise the minimum viable product (MVP) for each sprint. Assign the top 3 priority levels to your MVP. Group other, non-MVP, cases to be done during the sprint under the remaining four priorities provided by FogBugz (see below, “suggestions for applying priorities”)

    Balance Allocations

    When you sort a sprint by assignee, note the number of hours given staffing levels that are available in a sprint; pare the scope and switch assignees where necessary in order to ensure there is enough time in your sprint to accomplish your MVP. Drop the excess cases back into the Backlog (Rejoice, you now have more estimated cases in the backlog!) based on the amount of time you have for the sprint and the estimates of the work to be completed during the sprint.

    Sorted by assignee

    Use Time Tracking

    Using the time tracking feature of FogBugz will allow you to see how much time has been spent on a given case. In the Iteration Planner, this time is subtracted from the estimate and reported as hours remaining.

    Update Iteration Planner with new cases and changes to Priority

    As the team works through the sprint priorities may change and cases may need to be added or subtracted. Updating the Iteration Planner will be a good way to determine and communicate the team’s progress through the sprint. This is not to suggest that the Iteration Planner is an automated wonder that obviates the need for communication among team members. But it is the automated wonder that keeps track of the conversation so that you know which topics require the team’s focus.

    Suggestions for applying priorities

    • 1-3 Minimum Viable Product
      These are all of the cases that must be completed in order for your sprint to provide new value to the customer in the form of a usable feature.
    • Priorities 4: Hygiene
      This is non-essential work that improves the product but is not required in order for the product or feature to be useful to a customer. Small amounts of this work are often spread throughout sprints to continue making small improvements to the product.
    • Priority 5: Incidental work
      Don’t allow your scope to creep from a manageable size to something so huge that it couldn’t be completed in less than a decade by Steve Jobs and a host of efficiency experts. If you add something as incidental work that needs to be done during a sprint you need to subtract or deprioritize some other work that has an equivalent number of estimated hours. Keeping all your incidental cases under one priority allows you to group cases by priority and see how much time you are spending on cases that are not part of your MVP. At the end of your sprint add up the hours and determine whether or not the interrupts were a worthwhile use of your time. This discussion can be part of your retrospectives or done separately. Either way the numbers should be useful for evaluating whether or not the work that was done during the sprint was part of the planned work.
    • Priority 6: Long-range work
      Frequently teams are asked to take on a category of work that is not part of the MVP but does contribute to the overall plans of the organization. These tasks may be expected to take many sprints to complete and their progress needs to be tracked across multiple milestones.
    • Priority 7: Stuff we won’t do
      It’s useful to declare this as a way of focusing the team and managing expectations about the work that will be completed in the sprint.
    Sorted by Priority

    For Agile software development teams, Iteration Planner is a useful, graphical tool that allows you to visually manipulate the information you need for planning Sprints. With it, you can set the direction for your team’s work and monitor progress so you can deliver on your organization’s goals.

    Related Links

    by David Miller at April 28, 2015 08:42 AM

    April 27, 2015

    Mark Bernstein


    I finally saw “42,” which has been overpriced on Amazon and unavailable on Netflix.

    It’s not much of a movie, but the ballpark sets are amazing. You look at the batter digging in for the pitch and, yes, it’s the Polo Grounds! OK: I think that may have been a matte painting, and center field was out of focus – but then, center field at the Polo Grounds was so deep it would have been out of focus. Shibe Park was really impressive. (Oddly enough, I don’t recall any pictures of Ebbets offhand.)

    Oddly enough, they didn’t use anything from the Major League stadium in which Jackie Robinson played in 1947 and which still exists – Wrigley Field. Sure, it’s changed, but it’s changed a lot less than the Polo Grounds.

    April 27, 2015 03:36 PM

    Fog Creek – Interview with Paul M. Jones

    In, we chat with developers about their passion for programming: how they got into it, what they like to work on and how.

    Today’s guest is Paul M. Jones, the creator of the Aura PHP package library and author of ‘Modernizing Legacy Applications in PHP‘ and ‘Solving The N+1 Problem In PHP‘. He’s a member of PHP-FIG and a founding contributor to the Zend framework.

    Paul M. Jones
    Location: Nashville, TN, US
    Current Role: Architect, Author, Speaker, Trainer

    How did you get into software development?

    I feel very lucky on this front. Some people don’t ever find their true calling in life. I found mine very early.

    In the summer of 1983, just before I turned 13, my parents brought home a TI-99/4A. It was a 3Mhz machine with 16K of RAM and a cassette tape for storage. If you didn’t record your program onto the audio tape, it would vanish when the computer turned off. That setup was practically state-of-the-art for its time. After working with it for about two weeks, I knew what I’d be doing for the rest of my life. I was hooked from the start.

    The TI-994/A came with TI-BASIC, so that was my first language. I remember specifically that you could design your own graphics, but you had to do it by defining your own character sprites on an 8×8 pixel grid. Each row of 8 on/off pixels was represented by a hex code, so you ended up with a series of hex values to define one sprite. I worked that out by coloring in blocks on graph paper, then calculating the hex code for each row. Then you’d use those hex codes as a custom ASCII character to represent a little ship or alien for a game, and print it to the right X/Y position on a 40×24 screen to move it around.

    I spent hours writing out entire programs by hand using paper and pencil, with line numbers at the left and double-spaced. That was so I could work out the flow and edit beforehand because modifying extended blocks of code on the computer itself generally meant retyping entire lines in a line editor.

    So I’m almost entirely self-taught. I picked up TI-BASIC at home. At school, we had some Apple II+ machines (then later some Apple IIe machines as well), which had Apple BASIC and a floppy disk drive. On those, I typed in programs by hand from magazine page listings, mostly games. I also remember one of my math teachers taking my assignment, writing “A” on it without looking, then sending me to the back of the room to work on a programming project he wanted to be done for that hour.

    I learned PASCAL in one of my junior high classes, but I never really used that outside of class. I learned a little Java in a college course, but that was mostly to fill a credit requirement. I picked up HTML, SQL, some Javascript, DBase III and FoxPro, CDML, every consumer program I ever used, Linux, and eventually PHP, all without any formal training. I think my love of the craft helps a lot with that.


    Tell us a little about your current role

    I have several roles right now: author, speaker, correspondent, open-source project lead, standards advisor, and committee member. I also switch between consultant and employee on a regular basis, depending on what I find interesting or lucrative at a given point.

    I am lucky enough to work from home, and being a man of routine, my days are very similar. They start with me reading my morning news sites over breakfast. Then I’ll amble over to my “office” room to read (and hopefully respond to) incoming emails from overnight and late the day before, over an Espresso and Amaro.

    With correspondence out of the way, I’ll start with whatever the major project is for the day around 9:00 to 9:30am. I’ll try to get in about 3 hours of work time on it. Some days that’s a programming project, other days it’s writing a longish blog post, and still other days it’s working on a book, course, presentation, or proposal. There’s generally some interruption here to respond to IRC or email, and answer questions about a project or a programming problem.

    After that, I’ll break for lunch and a nap, or a barbell workout at the gym and a recovery meal. Then it’s back to the “office” to work on side projects, or perhaps follow through on unfinished work for the morning. That’s generally another 3 hours or so, with an afternoon Espresso and Amaro. If it’s nice outside, I’ll work on the back porch with my dog roaming the backyard or napping at my feet.

    Around 5:30 or 6:00pm I’ll start to cycle out of work mode and into home mode. It’s time for a snack with my girlfriend while we watch an hour of game shows and catch up on each other’s day. Email often intervenes here too, along with reading my end-of-day news sites.

    Later, I’ll have a Martini or Manhattan while we prepare dinner and watch something on Amazon or Netflix. We’re working our way through Supernatural right now. Her tastes generally determine the viewing material, unless I’m inflicting one of the classics on her (“Star Wars”, “Big Trouble In Little China”, “Die Hard”, etc.). Bed is around 10:30 or 11:00pm.

    I am prone to occasional insomnia, usually because some problem from the day has captured my mind, so once a week or so I’ll get up in the middle of the night and sit in front of the computer until I feel drowsy again. It can be frustrating, but it does add a couple hours of reading time to the day.

    I’m always working on Aura in one capacity or another. It’s a continuing labor of love, one that admittedly appeals to a limited set of PHP developers, but they’re the kind of developers I most like working with. The real challenge here for me is marketing. The code and community are fantastic, but the project doesn’t have the widespread “mindshare” that I think it ought to have. Obviously I am not a public-relations genius.

    I just finished an update to ‘Modernizing Legacy Applications in PHP‘. This is its first update since publication last year; it felt really good to incorporate many small changes and clarifications from readers who found it useful and helpful in their work lives. I also just finished a second book, ‘Solving the N+1 Problem in PHP‘. The tough part on these is always sitting down to do the actual writing, and then the editing. “Writing” is tough, but “having written” is awesome. Steven Pressfield’s ‘The War Of Art‘ really helped me in identifying and overcoming what he calls “Resistance” to creative work, and I recommend it to anyone who considers themselves creative.

    Another recent project is Bookdown, a tool for generating Docbook-like HTML output from Markdown and JSON sources. I’d like to spend more time on that to bring it up to 1.0, especially to collect the Aura documentation into a single place.

    My next big project is not exactly a secret, but it’s also not ready for open discussion either. Suffice to say that I’m working with video, and it’s a very different experience for me. When I stand up in front of an audience, there’s a give-and-take of energy between us, and as a performance, there’s a lot of allowance for what feels like a conversation. But with recorded video, there is very little room for error. The exact same presentation is going to be replayed over and over, so every detail has to be exactly right. It’s much more difficult than writing, and I’m having to retrain a lot of my speaking habits because of it.

    When are you at your happiest whilst coding?

    Happiness is not an emotion I associate with programming. My positive emotions there are more like “pride” and “satisfaction”, sometimes even “contentedness”. They rarely last for long, but they are wonderful in the moment.

    Some of my favorite times are when I have refactored something that is spread across the entire application into its own separate space (whether a method or class or layer), and everything continues to work as before. Occasionally that involves a measurable performance improvement, which is a very satisfying feeling.

    Creating order out of chaos, finding patterns in systems, continuous improvement on previous work: these are what give me satisfaction. It takes time, but it gives me great pride to look back and compare “what it used to be” with “what it is now.”


    What is your dev environment?

    It’s pretty spartan. Only in the past couple of years did I switch from TextMate 1 to Sublime 3; before that, it took years for me to switch from BBEdit to TextMate. In Sublime I have the Markdown Preview, Pretty JSON, and Open URL plugins, but that’s about it. Any time I need something more powerful, I’ll generally descend to the command line, and use a crusty old bash script I’ve maintained for years or work some very limited new voodoo. (I am a man of old habits.)

    I’ve been a Mac fan since they existed, and currently use a MacBook Pro mid-2010 that got a little banged up at the tender hands of the TSA. No external monitor, and I still use a wired USB mouse; the trackpads just don’t have the same feel to them.

    Homebrew has become a good friend, and I’ll use that to install most of my other tools: git, mysql, a ton of others that I’m forgetting now. I used to compile PHP by hand, and sometimes still do, but the Homebrew “josegonzalez” PHP packages have been a real time-saver.

    If I’m working on a project for an employer, I’ll set up a Vagrant box that mimics their production environment. If they don’t already have one themselves, I’ll generally make that the first step in working with them. I’ve tried Docker but it just doesn’t appeal to my sensibilities.

    For my own open-source work, I’m a big fan of Travis-CI for the obvious reasons, but especially because it can run tests against multiple versions of PHP. That has made it very easy to keep Aura consistently running on everything from PHP 5.4 up through PHP 7, without me having to maintain each version locally. It’s a fantastic service. Scrutinizer-CI is something I was introduced to last year, and it too has been a great aid to my work. Having an automated review and a measurable score helps me to focus my attention on parts of the code I know are not great, but have ignored because I’ve been too close to them. The dispassionate review discipline it provides is very useful.

    I started using a Gaiam balance-ball chair after beginning my strength-training workouts several years ago. My lower-back flexibility was terrible, and it really showed in my poor barbell squat form. Using the Gaiam has helped immensely.

    I have a couple of internet radio stations for my soundtrack: Groove Salad and Low Mercury, along with a custom collection of music in similar genres. They’re good for helping me to maintain focus and stay in my seat, instead of getting up and walking around aimlessly while pondering.

    What are your favorite books about development?

    My number-one most favorite of all time is The Mythical Man Month by Frederick P. Brooks. I was introduced to it by my Systems Analysis professor, to whom I owe unending gratitude, during my post-military pass through college. That book was written in 1974, and aside from the parts about COBOL, every single bit of it is still true, because human beings have not changed. I expect it to remain true until the Singularity comes (and maybe even after that) for the same reason.

    After that, in no particular order:

    • Peopleware by DeMarco and Lister helped me think more clearly about programming management practices.
    • The Inmates Are Running The Asylum by Cooper convinced me that I, as a developer, should never be allowed to do design work. Conveniently, this suits my temperment.
    • Patterns of Enterprise Application Architecture by Fowler et al., not because it teaches new techniques, but because it gives us a common vocabulary to use when talking about those techniques.
    • The Pragmatic Programmer by Hunt and Thomas, and Code Complete by McConnell, are great fundamental works.
    • Clean Code by Martin is a fantastic capstone work.
    • How To Be A Programmer by Robert L. Read is a tour de force: personal and practical, insightful and inspiring, it is sadly unread and unknown by the vast majority of programmers I have met.

    What technologies are you currently trying out?

    I’d really like an excuse to try out the document-oriented JSON stores in PostgreSQL as an object database. It looks like a really great integration of document features with SQL features. Getting my hands on a Redis installation would be cool, but very little of what I’ve done has actually needed Redis.

    But technologies, per se, are not what really get me going. I like new techniques, and alternative ways of thinking about existing problems that present more elegant or better-separated ways of solving them. That’s one reason I felt so excited about identifying Action-Domain-Responder as a web-specific alternative to MVC. Domain-driven design is another technique that really interests me, and while I’m not very good at it yet, I’d like an excuse to practice it more.


    When not coding, what do you like to do?

    I’ve mentioned the gym workouts, which I like much more than I expected to. Barbell training requires a lot of attention to good form, and I find that concentration very rewarding. It’s also a big morale boost to have a physical marker of progress; when you add more weight to the bar each time, you can point to it and see it in the real world. It’s not ephemeral and transitory like code.

    I enjoy doing pistol and rifle work as well, although where I live now that’s a little more difficult to do. It’s very satisfying to line up a shot at a steel target 400 yards away, finish the squeeze on a two-stage trigger, hear the loud “BANG” of the round being fired, then wait through that long moment of silence before the “smack” of the bullet hitting steel comes back to you from across the range. I’m not as consistent as I would like to be, but when it all flows together, it’s beautiful.

    What advice would you give to a younger version of yourself starting out in development?

    Younger Me,
    You consider your mental and intellectual talents as the center of your identity because they come easily to you. You hold in contempt things like social success because they do not come easily to you, but does to others who are not as smart as you. The fact that those others are not as smart, makes you think their social success is of little value in the world. You are wrong. You will be much happier when you use your intellect to retrain yourself into successful social behaviors.

    On hearing that, you will think doing so somehow makes you “untrue to yourself.” This too is a mistake. There are many aspects to your personality. You choose which ones to promote, and which ones to restrain. All of them are “yourself.” Your social powers are atrophied and need exercise for them to become stronger. You will become *more* like your true self, not less, by exercising them.

    Even so, don’t bother too much with that until you get out of high school. Government schools are prison. You have felt this since childhood but never had the words for it. Nothing that happens there will really matter to you later. What matters is you getting out of it.

    Going to college does not count as getting out of it. As a young man, what you need is true self-sufficiency, discipline, and “finishing.” You need something that doesn’t care about your precious little ego, your false sense of self. Join the Air Force out of high school, instead of going to college for 18 months and wasting your time and money by not attending your classes (and then joining anyway from financial pressure). The military experience will burn away all the narrow trivial incidentals of your ego that you think are so important. It will immerse you in a broader world, and leave a strong, resilient, core of “you” focused on larger, better, more important things in life.

    Restrain your workaholism. It is too inwardly-focused, too indulgent of your desire to avoid social situations, and is another exhibition of your intellect as the center of your identity. Yes, you are an intravert, and replenish your energy from being alone. But that need not prevent you from expanding your identity and scope of action in the social world. Apply that intellect and work ethic to training yourself in how to be socially successful; there are great joys to be had there.

    “Socially successful” does not mean “with other people just like you.” It especially does not mean “with your favorite role-playing group of friends.” It does mean, in particular, becoming successful with attractive women. When you can do that, you can be socially successful with anyone. You think there are only a few women in the world who might like you because in the past you have been so unsuccessful. Your lack of success is because you have internalized well-meaning but false premises from contemporary culture. There is a vast abundance of women who are now, and will later be, made happy by “you being you” — the “you” that is charming, effusive, teasing, outcome-independent, and interaction-oriented, instead of restrained, deferential, passive, and overly polite. You will need to exercise these more outgoing parts of your personality so they can become strong. Get a copy of The Game by Neil Strauss to learn how, and go from there. It will jolt some of your prized sensibilities; they need to be jolted.

    “But what about programming?” you ask. Younger Me, you’re going to be good at that no matter what. It comes so easily to you. You don’t need advice there. Instead, put effort and practice into the things that do not come so easily to you. When you succeed at those, you will be more satisfied with your life as a whole, in addition to the satisfaction you will gain from your profession.

    With fondest hopes for our future,
    Older Me


    Thanks to Paul for taking the time to speak with us. Have someone you’d like to be a guest? Let us know @FogCreek.

    Recent Interviews

    Leah Culver
    Peteris Krumins
    Peteris Krumins
    Eric Lippert
    Eric Lippert
    Chris Hartjes

    by Gareth Wilson at April 27, 2015 03:19 PM

    April 26, 2015

    Dave Winer

    Great "Blue Sky" platforms

    The hairball

    Our current platform is a mess:

    1. CSS.

    2. HTML.

    3. JavaScript.

    4. A server.

    Think of how much you have to learn to become "full stack" in this world.

    At least four different syntaxes, and a CSS preprocessor.

    HTML is XML. JavaScript is like C or Pascal. The server could be written in any number of different languages. And JSON. None of them are going away.

    I've been working in this world for many years, and right now would be at a loss to write a canonical "hello world" app.

    What a Tower of Babel. What an opportunity to topple it, esp given all the people these days who want to program.

    It grows when it's simple

    The big strides in tech happen when the platform gets reduced to simplicity. Examples include:

    1. Unix with C.

    2. Apple II with UCSD P-System.

    3. MS-DOS with Turbo Pascal.

    4. The Web with a plain text editor.

    I call these blue sky platforms

    In all these systems, lifting the hood is child's play.

    Typing and modifying "Hello World" is easy. From there, there are no huge cliffs in the way of becoming a master.

    1995: "A platform must have potential, or open space. I call this blue sky."

    Digging out of the mess

    We can get back to blue sky any time we want.

    I would start from Node.js and build out.

    The web browser, as currently configured would have to be replaced by something that's thoughtfully designed. Or maybe a platform built on top of CSS+HTML+JavaScript, hiding it behind a factored interface? Not sure. But we'll never have great growth until we factor out the huge hairball sitting between ideas and implementation.

    April 26, 2015 04:49 PM

    April 25, 2015

    Dave Winer

    I would have hired Doug Engelbart

    I've heard it said, and thought myself, that of course I wouldn't have hired a 50-something developer when I was running my 20-something startup.

    But then I just realized that if Doug Engelbart had wanted to work for Living Videotext or UserLand I would have hired him in an instant. Can you imagine. To have the guy who pioneered the technology we were commercializing around to mentor me and my developers? I would have jumped at the opportunity.

    So the answer is, it depends. If it was a random employee type who hadn't done much with his or her career, I probably wouldn't have been very interested. But if it was someone who had created the foundation we were working on, that would have been different.

    Guy Kawasaki: "Good people hire people better than themselves."


    I wrote a follow-up to this piece on May 6.

    April 25, 2015 12:22 AM

    April 24, 2015

    Lambda the Ultimate

    Paul Hudak

    These are sad news indeed. I am sure almost everyone here read at least one paper by Paul and many knew him personally. When I just started thinking about programming languages I was fascinated by DSLs and his work was simply inspiring. His voice will be missed.

    Discussions of Paul Hudak's work

    Update:There is some confusion about the situation. Please see the comments for further information.

    April 24, 2015 12:26 PM

    Tim Ferriss

    Tim Ferriss

    [PLEASE NOTE: This competition has ended. Here are the winners. Thanks!]

    Unless you’ve been to outer space, the next few minutes are worth your time.

    Below are the details of The Zero-G Giveaway. My goal is simple: I want to you to have one of the coolest experiences on the planet. Namely, floating like an astronaut, experiencing weightlessness, and grinning ear-to-ear for a week afterward.

    I’m not selling anything and no purchase necessary. Just thought it’d be cool, and I have some big news coming next week, so this is a warm-up. I’m limbering up my Internet joints for action.

    All that said, you have less than 48 hours, so please keep reading.

    My approach to blogging is simple: share what excites me most. It doesn’t matter if it’s expensive, free, or really cheap (like this).

    Whether or not you win, I want to you to think of new possibilities.

    For the Zero-G giveaway, I teamed up with Huckberry because they offer so many things I love. Sometimes it feels like I’m shopping in my own closet.

    ACHTUNG! This is about getting people–a lot of people–excited. I want to you to dream big, and I want you to encourage others to do the same.

    That’s why the more you spread the word on social media, the more likely you are to win.

    If you want to enter, simply click here. It takes five seconds. After you sign up, you’ll be given the chance to spread the word to your friends. That’s it.

    I hope you enjoy these prizes as much as I do.

    Grand Prize (1 winner) 

    Second Prize (3 winners)

    If you’re not familiar with all the above prizes, here are few thoughts on why I chose to include them.

    Exo Protein Bars: These are the only bars I currently eat. Clean protein, paleo-friendly, no soy and made of crickets. The amino acid profile is killer, a former 3-Michelin star chef makes them delicious, and it’s minimally-processed compared to almost every other form of protein bar. No garbage, no fillers. CrossFitters and other athletes gobble these things up. Journalists have been surprised I eat these, as there is a bit of natural sugar, but they don’t spike glucose for me or media friends who’ve tested them.

    Soma: In its simplest form, it’s a high-end competitor to Brita water filters. It combines Apple-inspired design (sleek glass carafe) with a subscription service that delivers the world’s first compostable water filter to your door.  I have three at home.

    LSTN Headphones: So cool that they had to be included. These wood-rich headphones immediately get double takes, and they have everything you need—a microphone for calls and voice recording, and passive-noise isolation feature to highlight your tunes and keep out the rest of the world. These bad boys are consistently ranked as good or better than headphones 2-3x the price.

    In Conclusion

    Jump on it! The giveaway ends in less than 48 hours.

    To sign up, simply click here. And don’t forget: every time you share the page, your likelihood of winning increases.

    What else would you like to experience before you die? What’s on your personal bucket list?

    Good luck and pura vida :)

    by Tim Ferriss at April 24, 2015 02:45 AM

    April 23, 2015

    Mark Bernstein

    Badass: Making Users Awesome


    is the logical culmination of the contemporary business book: a PowerPoint deck on paper. It’s a good deck; Sierra is first and foremost a speaker.

    Sierra’s insight here – and it’s a important – is that the whole point of technology marketing is to make users awesome, which means giving them tools to do great stuff, leading them toward using those tools well, and then getting out of the way. This is music to my ears, of course, since Tinderbox users are pretty much the definition of “badass” and “awesome” and each day’s Tinderbox support queue tends to be filled with a remarkable array of talented writers, journalists, scientists, and scholars. (Lots of musicians, too: I’m honestly not sure why.)

    One insightful example explores camera documentation. On the one hand, manufacturers tend to explain how to use this camera. But purchasers don’t care about that. They want to know how to take great pictures – better pictures than they could take with their old camera. That’s a useful framing for lots of technical marketing problems, and a very intriguing guide to improving sales, support, and training.

    The later sections of the book discuss strategies for help users become “badass” before they give up and abandon your product. Many of the strategies are heuristically sound, but Sierra presents them as necessary cognitive truths. This leads to an unfortunate rhetoric where we’re consistently cajoling or deceiving our user’s brain in order to help the user; instead of making users awesome, we’re manipulating them for their own good. Sierra embraces the weirdness heartily and underlines it on page after page with a series of brain icons – for example, a brain with a faucet symbolizes “distraction”.

    Actual cognitive arguments – arguments about how the brain actually accomplishes something – require more than intuitive plausibility and an experiment or two. We just don’t understand brains very well, they often work in ways that aren’t intuitively obvious, and it turns out that we’re not particularly good at thinking about our thinking. In a talk, this hand-waving might be more effective, but paper provides leisure to poke holes. In the end, we aren’t trying to solve the problem of the mind right now, we’re just trying to sell some stuff! The conclusion much of this reaches is the desirability of focusing training on skills and concepts that are immediately necessary and clearly rewarding; that conclusion doesn’t need any cognitive science at all.

    Nonetheless, the original observation is sound and significant. We aren’t playing silly psychological games to get customers to engage with the brand or to splurge on in-app purchases. We’re helping smart and capable people to do good and important work, one step at a time.

    April 23, 2015 08:10 PM

    Fog Creek

    The Effective Engineer – Interview with Edmond Lau

    .little {font-size: 75%}
    The Effective Engineer – Interview with Edmond Lau

    Looking for audio only? Listen on

    We’ve interviewed Edmond Lau, an Engineer who has worked for the likes of Google, Ooyala, Quora, and Quip and he wrote the book ’The Effective Engineer’. We discuss ways to maximize your impact as an engineer, lessons learned from engineering leaders, key metrics to measure your effectiveness as well as ways to onboard new hires.

    Content and Timings

    • Introduction (0:00)
    • About Edmond (0:21)
    • Lessons from Engineering Leaders (2:18)
    • Leverage and Feedback (3:30)
    • Onboarding New Engineers (7:24)
    • Balancing Technical Debt (8:35)
    • Common Engineer Career Mistakes (9:44)



    Edmond Lau is a software engineer who has worked for the likes of Google, Ooyala, Quora and Quip. He speaks at conferences and writes on his blog about engineering best practices, and has recently authored the book “The Effective Engineer.”

    Edmond thank you so much for taking the time to join us today. Do you have a bit of information to share about yourself?

    About Edmond

    I’m working at a startup right now called Quip. It builds up productivity suites. It’s optimized for teams, also optimized for mobile but for the past two years I’ve been working on the book that I recently released, “The Effective Engineer” which is a resource to help engineers basically be more effective and share a lot of stories from engineering leaders across Silicon Valley.

    What made you want to write the book?

    My first inspiration for writing the book came during my working Quora. Quora is a question and answer site, and during my time there the team grew a lot. One of my responsibilities at Quora was building the onboarding and mentoring program there. One of the things that I learned from the experience is that learning as an engineer, it’s pretty exponential. If you pick up the right habits and techniques and mindsets when you’re starting off, you’re significantly more likely to succeed and unfortunately sort of prior to having this onboarding program, it was sort of the luck of the draw whether you would have a good mentor, or whether someone would explain to you core concepts in your first day or your first week or your first month. People who got lucky were much more likely to succeed and much more likely to be effective many months down the line. The onboarding program was an attempt to level the playing field a little bit so that it wasn’t based on luck of the draw whether you had a good mentor, whether you were on-boarded well. The book is, it is actually sort of an extension of that onboarding work. There aren’t that many great books out there teaching engineers about mindsets of effectiveness. There are a lot of good books for entrepreneurs, a lot of books for business people, but not a lot of books that have stories from engineering teams and engineering leaders. It’s very focused… There’s a lot of lessons that teams, successful teams to day have learned. My writing the book is an attempt to provide a valuable resource that can help onboard engineers beyond just the companies that I work at.

    Lessons from Engineering Leaders

    You spoke to a number of engineering leaders about the things that they had done to increase their impact. Were there any common themes?

    I would say some of the most important ones I saw, one is focusing and investing in tooling. Especially teams like, when I talked with Bobby Johnson, who is former director of engineering for infrastructure at Facebook. Like I said one of the biggest time and investments that he made that had the one of the biggest ROI was just building tools. Trying to automated as much in mechanics of what they were doing as possible. Every time they got a problem they found that they were still repeating what they were doing. They would write a tool for it, automate it. That’s a very reoccurring theme that I found when I was talking to leaders at Twitter, Google, and sort of many other companies. Another pretty common theme is just keeping things simple. I think a lot of teams, when I asked them what’s the biggest lesson or the most valuable lesson you’ve learned in the past year, they would say they just sort of made things a little too complex. Things a little bit too long to maintain. There was a lot of operational burden to keep things going. Keeping things simple was sort of another very common theme.

    Leverage and Feedback

    Part of your method as a framework called leverage, which helps engineers identify activities that have the most impact. Tell us a little bit more about how that works.

    When it comes to leverage, leverage is something I cover in depth in the book but it basically means what is the output you’re producing for the amount of time you’re investing? It’s a metric of what is the impact you’re generating per amount of time that you spent and sort of as if your goal is to become an effective engineer, one of the key qualities is understanding what exactly leverage is. As an effective engineer you want to focus on the high leverage activities. This is something that took me many years to learn. First when I went to Ooyala after I left Google, I used to work 70 to 80 hour weeks because I thought that was how hard a team had to work as an underdog to succeed but there were a bunch of experiences where we built an analytics module to client and they never used it or we would build a product and it would never get the user adoption that we wanted. Or I would go on vacation and get paged because I was on call. Through all those experiences made me feel like working hard, putting in those hours just isn’t enough. The framework of leverage is taking the time to actually prioritize what are the things that are actually generating a large impact for the amount of time you’re spending. What are the activities that actually have a high ROI? If you don’t want to work 70, 80 hour weeks, the way that you can be effective is by focusing the limited amount of time you have on the activities that are actually generating the most impact.

    How can engineers go about getting feedback to ensure what they’re working on is worthwhile?

    The key there is, just setting up feedback loops and that sort of applies to everything you do. For instance, when you’re writing software that means you send around say a lightweight design doc to get feedback on your design before you even write a code. When you’re writing code it means if you want to optimize quality, optimize the feedback, you want to send your code to code reviewers that are the strictest. The ones who would critique, do a good job of critiquing what you’re doing. If you’re working on product it means getting feedback from decision makers of the company. Getting feedback from gatekeepers who sort of block or launch as soon as, as early as possible. Then when you’re sort of building or iterating a product, it means running like A/B tests to measure is this change actually materially improving the product in some way that you care about.

    What are some key metrics that developers can use to ensure that they’re being impactful?

    It really depends sort of which area, which team you’re working on. You want to pick a metric that incentivizes the type of behavior that you want. Just to give a few examples, like if you’re working on a performance team, you’re probably trying to improve some metrics. The metric that you want to improve, it could be something like 99th percentile of all load times. Or it could be the average load time. Both of those, either of those metrics would improve the performance of your product but they have very different outcomes. If you’re improving the average load times, that would tend to make you focus on general server improvements, but if you were focusing on the 99th percentile, which might be your power users or everyone who has a lot of data who sort of has worse experiences, then you’re focusing on the long tail of the application, what are the worst case instances that are happening? The choice of metric effects the type of work that you’ve focused on and so when you were … because of what product you’re working on you want to sort of pick the metric that is most aligned with success of the business. That might be focusing on weekly active rate instead of just focusing on future sign ups. Or it might be focusing on the 99th percentile versus the average page load time.

    Onboarding New Engineers

    How should you onboard new engineers to ensure lessons like those you described are learned by all?

    Onboarding is not something where you do it once and you’re done. It’s something you do very incrementally. I would say just start documenting questions that new engineers are asking and make them reusable resources. If you are a new engineer, then as you are onboarding identify what are the things that are giving me problems? What is taking a long time to do that really shouldn’t. Over time you sort of build up a repository of knowledge that becomes much more useful for new engineers joining the company. An example is at my current company, Quip, we make a productivity suite that’s really optimized for collaboration and so any time we are building new products we end up writing a short design doc that is then shared with the team or every time we come up with… It’d be great if our code looked like this. We write down the style guide and then everybody gets this new piece of information, or someone ran into an issue we document that into some best practices doc. We end up with lots and lots of documents that are really useful for new engineers.

    Balancing Technical Debt

    A lot of engineering time gets lost addressing technical debt, how can you go about finding the right balance between maintaining the old while shipping the new?

    It ultimately goes back to that framework of leverage that I mentioned earlier. Basically you don’t have enough time to basically focus on all of your debt. Your goal is not to refactor all your code all the time or to get to 100% test coverage or to do all your code reviews with the same level of quality. It’s really to just sort of focus on what is the debt that is causing the most pain? What are the problematic pieces of code that either get a lot of traffic from the product or that developers or engineers are focusing a lot of their time on. Those are the pieces where you want to spend the bulk of your time, writing unit tests, doing code reviews, refactoring code. Basically making all the core primitives, the core abstractions in your code really strong and reducing technical debt in those core areas because those areas will have the highest leverage in terms of making your team work much more effectively.

    Common Engineer Career Mistakes

    What are some of the common mistakes you see engineers making who want to grow their careers?

    A pretty common one is just they’re not optimizing for learning when they’re looking for job opportunities, and sort of being stuck on a plateau where they’re not really challenging themselves, they’re not really learning day to day. Just from my own experience, when I was at Google, it was a very comfortable place and sort of after, my first six months there I learned a ton. They have these documents called code labs that they teach about core abstractions and best practices. They give you exercises to validate that you understood everything. I learned a ton in my first six months there but after two years I felt like I wasn’t really challenging myself anymore, which is why I decided that maybe I should explore start ups and see if I might be able to learn more there. That mentality, just optimizing for learning and guided a lot of what I do. It’s taught me a lot of what I know today.

    What resources can you recommend for those interested in learning to be more effective in their roles?

    Even from my time of writing the book one of the most valuable things is just meeting up with other engineers, meeting up with engineering leaders and exchanging stories because when you’re working on the team, a lot of times the lessons we learn are just the ones that occur during the projects that you work on. People who have either had similar experiences or have gone through other projects, where sort of having conversations with them can teach you a ton.

    Thank you for your time today.

    Yeah, sure.

    by Gareth Wilson at April 23, 2015 10:15 AM

    Ian Bicking

    A Product Journal: As A Building Block

    I’m blogging about the development of a new product in Mozilla, look here for my other posts in this series

    I teeter between thinking big about PageShot and thinking small. The benefit of thinking small is: how can this tool provide value to people who wouldn’t know if it would provide any value? And: how do we get it done?

    Still I can’t help but thinking big too. The web gave us this incredible way to talk about how we experience the web: the URL. An incredible amount of stuff has been built on that, search and sharing and archiving and ways to draw people into content and let people skim. Indexes, summaries, APIs, and everyone gets to mint their own URLs and accept anyone else’s URLs, pointing to anything.

    But not everyone gets to mint URLs. Developers and site owners get to do that. If something doesn’t have a URL, you can’t point to it. And every URL is a pointer, a kind of promise that the site owner has to deliver on, and sometimes doesn’t choose to, or they lose interest.

    I want PageShot to give a capability to users, the ability to address anything, because PageShot captures the state of any page at a moment, not an address so someone else can try to recreate that page. The frozen page that PageShot saves is handy for things like capturing or highlighting parts of the page, which I think is the feature people will find attractive, but that’s just a subset of what you might want to do with a snapshot of web content. So I also hope it will be a building block. When you put content into PageShot, you will know it is well formed, you will know it is static and available, you can point to exact locations and recover those locations later. And all via a tool that is accessible to anyone, not just developers. I think there are neat things to be built on that. (And if you do too, I’d be interested in hearing about your thoughts.)

    by Ian Bicking at April 23, 2015 05:00 AM

    Dave Winer

    April 21, 2015

    Giles Bowkett

    Modulating The Arturia Minibrute With The Arturia Microbrute

    A 5-minute video explaining and demonstrating how to do it.

    I caught an awful flu earlier this year which had me incapable of doing anything other than sleeping or watching videos for two or three weeks. During that time I watched almost every Minibrute and Microbrute video on YouTube, and I was really surprised, because I did not find one video like this. I definitely saw some great videos, but nothing which addressed this fairly obvious use case. So I made this video.

    by Giles Bowkett ( at April 21, 2015 09:14 PM

    Dave Winer

    My Apple Watch podcast

    I've made a dozen or more visits to the Apple Store website hoping to buy an Apple Watch and each time coming up empty and as confused as ever.

    This 12-minute podcast tells the story.

    BTW, here's a screen shot of the Apple website, referred to in the podcast.

    April 21, 2015 03:04 PM

    Fog Creek

    Better Agile and Sprint Planning with Iteration Planner

    Available today to all with Time Tracking in FogBugz On Demand is Iteration Planner. With Iteration Planner, we’re unlocking the power of FogBugz as an Agile planning tool for software development. By mapping sprints onto the FogBugz concept of milestones you can graphically group cases into the scope of work that you’ll complete in each sprint. You can also divide the scope of your sprint into groups of cases that make sense to your workflow. You can see how much work has been done toward each of the goals of your sprint. And additionally, you can balance the allocation of resources by dragging and dropping cases from one assignee to another. These features help to make the Iteration Planner a lightweight way to plan work and manage teams using FogBugz.

    Iteration Planner with two milestones created

    Key Features

    Drag and Drop to Update Milestones and Cases

    As you move objects around the Iteration Planner you’ll see that values for parameters like assignee, title, and estimates change in your FogBugz database. Cases and milestones created in the planner will appear throughout the rest of FogBugz.

    Drag and Drop

    Within FogBugz, Milestones are a flexible type of container

    Create milestones, for example, Backlog; Sprint x; and Doing; in order to customize the Iteration Planner for your workflow. Use the start and end dates for milestones to define your sprints.

    Add a milestone using this field

    Estimating cases and using Time Tracking

    This combination – case estimates and time tracking – allows you to see summaries of the estimated cases and hours spent on the tasks. Time Tracking in FogBugz tells you how much time you’ve spent on each case. If you’ve also estimated the cases that compose your sprint then the summary of hours shown in the Iteration Planner will be the estimated time remaining in the individual cases or on the milestone as an aggregate of the cases. This effectively tells you what portion of the estimated time remains. (*Note: the Iteration Planner requires Time Tracking.)

    You can plan iterations for each of your projects

    Iteration Planner allows you to see, search and manipulate cases and milestones within each of the projects in your FogBugz instance.


    Your search filters are available in the Iteration Planner search box

    These filters will allow you to find cases in the planner, in the same way that you find them in the rest of FogBugz. You can also simply enter a keyword in the search field to discover cases not listed in your filters.

    select through search filter

    Share Your Sprint

    The Iteration Planner is a unique view into your data. If you want to share that view with your colleagues, just copy and paste the URL as it appears when you’re looking at your organization of milestones and cases.


    If you are running an Agile software development team, the Iteration Planner affords you a highly graphical tool for visualizing and manipulating the information you need for planning your sprints. With this tool, you’ll be able to set the direction for your team’s work and then monitor its progress toward accomplishing your organization’s business goals.

    Related Links

    by David Miller at April 21, 2015 02:23 PM

    Ian Bicking

    A Product Journal: What Are We Making?

    I’m blogging about the development of a new product in Mozilla, look here for my other posts in this series

    I’ve managed to mostly avoid talking about what we’re making here. Perhaps shyness, we (the PageShot team) don’t yet know where it’s going, or if we’ll manage to get this into Firefox.

    We are making a tool for sharing on the web. This tool creates a new kind of thing to share, it’s not a communication medium of any kind. We’re calling it PageShot, similar to a screenshot but with all the power we can add to it since web pages are much more understandable than pixels. (The things it makes we call a Shot.)

    The tool emphasizes sharing clips or highlights from pages. These can be screenshots (full or part of the screen) or text clippings. Along with those clips we keep an archival copy of the entire web page, preserving the full context of the page you were looking at and the origin of each clip. Generally we try to save as much information and context about the page as we can. We are trying to avoid choices, the burdensome effort to decide what you might want in the future. The more effort you put into using this tool, the more information or specificity you can add to your Shot, but we do what we can to save everything so you can sort it out later if you want.

    I mentioned earlier that I started this idea thinking about how to make use of frozen copies of the DOM. What we’re working on now looks much more like a screenshotting tool that happens to keep this copy of the page. This changed happened in part because of user research done at Mozilla around saving and sharing, where I became aware of just how prevalent screenshots had become to many people.

    The current (rough) state of the tool

    It’s not hard to understand the popularity of screenshots, specifically on mobile devices. iPhone users at least have mostly figured out screenshotting, functionality that remains somewhat obscure on desktop devices (and for the life of me I can’t get my Android device to make a screenshot). Also screenshots are the one thing that works across applications – even with an application that supports sharing, you don’t really know what’s going to be shared, but you know what the screenshot will contain. You can also share screenshots with confidence: the recipient won’t have to log in or sign up, they can read it on any device they want, once it has arrived they don’t need a network connection. Screenshots are a reliable tool. A lesson I try to regularly remind myself of: availability beats fidelity.

    In a similar vein we’ve seen the rise of the animated gif over the video (though video resurging now that it’s just a file again), and the smuggling in of long texts to Twitter via images.

    A lot of this material moves through communication mediums via links and metadata, but those links and metadata are generally under the control of site owners. It’s up to the site owner what someone sees when they click a link, it’s up to them what the metadata will suggest go into the image previous and description. PageShot gives that control to the person sharing, since each Shot is your link, your copy and your perspective.

    As of this moment (April 2015) our designs are still ahead of our implementation, so there’s not a lot to try out at this moment, but this is what we’re putting together.

    If you want to follow along, check out the repository.

    by Ian Bicking at April 21, 2015 05:00 AM

    April 20, 2015

    Dave Winer

    Should Boston bid on the Olympics?

    When I was chatting with Chris earlier today, the subject of the Olympics and Boston came up. Should Boston bid?

    My two cents

    Boston should not try to host the Olympics, in fact no one should. With climate change, a new venue for the Olympics every four years is an extravagance we can't afford. Sure it's a drop in the bucket but it's an important and symbolic drop in the bucket.

    Build one great Olympic facility, designed to be usable for 100 years. Hold all future Olympics there.

    It's like the United Nations. We don't build a new skyscraper every four years. We built one really good one, and use it every time we need the UN.

    April 20, 2015 10:04 PM

    Mark Bernstein


    My imaginary thriller proceeds, and with it I’m building some Tinderbox infrastructure to keep an eye on how the trip is shaping up.


    The raw character map is easy enough to put together in any diagramming program, but here we’re using Tinderbox agents and rules to keep a running total of our expenses as we add them. Tinderbox is also handling currency conversions; these expenses are entered variously in dollars, euros, pounds sterling, and Swiss francs.

    You could do this in a spreadsheet, sure, but where in the spreadsheet are you going to put your character notes, much less our internal memos?

    Meanwhile, we’ve gone from Paris to Dijon, on to Zürich, down to Torino, and now we’ve dashed off to London for the weekend conference of our (fictitious) open source competitors. It’s nice to be spending an imaginary company’s notional revenues!

    April 20, 2015 09:03 PM


    The story of a rock-and-roll comeback, nicely written and filled with convincing detail. D’Erasmo does a masterful job of using small asides to good effect and has a nice feel for quickly sketching distinct places in the midst of a band tour where we’re constantly moving to a new city. What really works here is the world building: Anna Brundage is a convincing minor star and D’Erasmo does a terrific job of sketching the contours of a career, the small triumph of the first-album Whale, the disastrous Bang Bang tour – as well as a performance gone wrong in Hamburg, a rained-out music festival in Latvia, and the crucial distinction between flings with men you’ve scarcely met (which, on tour, is basically everyone you could possibly have a fling with) and sleeping with fans (which, on tour, is pathetic).

    Before setting off on this last best chance, the Wonderland tour, Anna had been teaching shop at a private school in Manhattan; whenever failure looms, it manifests as the specter of a hundred little girls with hammers.

    April 20, 2015 06:58 PM

    Tim Ferriss


    “His way of telling you that you did something wrong was hitting you in the head with a phone book in a shopping bag.”
    – Triple H (Paul Levesque) on learning from Killer Kowalski [10:05]

    “Why would I be wound up? I’m either ready, or I’m not. Worrying about it right now ain’t gonna change a damn thing.” 
     Floyd Mayweather, Jr. just before a fight, as recalled by Paul Levesque [34:20]

    Paul Levesque, more popularly known as Triple H (@TripleH), is a 13-time World Heavyweight Champion in World Wrestling Entertainment, Inc. (WWE). Not only that, he is also the Executive Vice President of talent, live-events, and creative at the WWE.

    In this episode we explore everything, including the teachings of Killer Kowalski, how he avoids and repairs injuries (even if on the road 200+ days of the year), pre-game rituals, and habits developed with the support of trainer Joe DeFranco, The Undertaker, and even boxer Floyd Mayweather, Jr..

    This podcast is not limited to athletic performance. We dig deep into Triple H’s inspirations, and how he manages his responsibilities as a husband and father of three daughters.

    [Also, if you missed it, I’m giving away a once-in-a-lifetime zero-gravity flight! If you’ve ever wanted to float like a astronaut, this is your chance. Click here for details.]



    Have you heard my previous blockbuster episode with Tony Robbins? — Triple H listened to this episode while preparing for our interview. In my episode with Tony, he shares his bizarre morning rituals, thoughts on punching Barack Obama, and how to master the game of money (stream below or download by right-clicking here for part 1 and right-clicking here for part 2):

    This podcast is sponsored by LSTN Headphones. LSTN Headphones are gorgeous headphones made of real exotic, reclaimed wood. Proceeds from each purchase help a hearing-impaired person hear for the first time through the Starkey Hearing Foundation. Check out the headphones that I love and travel with here: On that page, use the code “TIM” to get $50 off orders of $99 or more!

    This podcast is also brought to you by 99Designs, the world’s largest marketplace of graphic designers. Did you know I used 99Designs to rapid prototype the cover for The 4-Hour Body? Here are some of the impressive results.  Click this link and get a free $99 upgrade.  Special offer: For the month of April only, you can get an additional $30 off. Give it a test run and share your results!

    QUESTION(S) OF THE DAY: What’s the best advice you’ve ever received for injury prevention or repair? Please share (or read) in the comments.

    Scroll below for links and show notes…


    Selected Links from the Episode

    Show Notes

    • How Paul Levesque answers the question, “What do you do?” [05:10]
    • Common misconceptions of Triple H and the WWE [6:30]
    • Important lessons learned while training with Killer Kowalski [9:40]
    • Emotional story telling: the critical factor behind each WWE event [12:45]
    • Why a regimented daily workout schedule is critical for longevity as an athlete [16:25]
    • Training as mediation [21:55]
    • Pre-game rituals with the help of Joe DeFranco, The Undertaker, and Floyd Mayweather [23:05]
    • Learn about Triple H’s models of success [35:10]
    • Insights on fatherhood [40:55]
    • Describing the first 60-90 minutes of every day [43:25]
    • Triple H’s current role in the WWE and his responsibilities as Executive Vice President [47:45]
    • Rapid fire questions:
    1. Most played band/song [52:39]
    2. If you could only do 1 or 2 exercise movements for the rest of your life what would they be? [53:00]
    3. Advice for your 20-year old self [53:40]
    • The story of meeting Tony Robbins [55:15]

    People Mentioned

    by Ian Robinson at April 20, 2015 06:36 PM

    Dave Winer

    5-minute podcast

    I was talking with Chris Lydon about the idea of a 5-minute podcast.

    Then Doc Searls asked a question that I thought could easily be answered in 5.

    I was right, but I rambled too much and it turned into a 6.5-minute podcast.

    Next time we'll do better!

    April 20, 2015 05:04 PM

    The open tech of

    On Friday, as you may know, I made public.

    It's a quick way to find a great podcast to listen to, now. Without subscribing.

    The list of feeds is curated, it originated from the feeds my Facebook friends liked the most. In that I think it's a prototype for how social networks can be used to create new flows that aren't complicated or hard to use or appreciate. I think, btw, this is the holy grail Twitter has been looking for.

    The JavaScript environment

    What I haven't talked about yet is all the great open technology it builds on. Stuff that's available to anyone to use to create new apps. One of the amazing things about developing in JavaScript in 2015, and hasn't been well-appreciated yet, is how deep and generous the developer community is, to itself. I've never seen anything like this.

    Technologies we use

    So here's a partial list of technologies I'm using to make this work, all of which are open source and available to all, free of charge and on equal terms.

    1. Font-Awesome for the icons.

    2. Bootstrap Toolkit for the CSS framework.

    3. jQuery to make access to the DOM uniform across browsers.

    4. snap.js manages the sidebar in the app (new feature today).

    5. River4, manages subscriptions, river generation and browsing.

    6. Feedparser does all the feed parsing for River4.

    7. OPMLparser reads the subscription lists for River4.

    8. RSS is what podcasting is built on, of course.

    9. Node.js runs the custom back-end Podcatch software and River4.

    10. NPM supports the building of the backend bits.

    11. V8 which is the JavaScript interpreter in Node.js.

    12. HTML5 has an <audio> element we use to play the podcasts.

    13. Google Fonts for Oswald and Ubuntu.


    Thanks to all the generous developers (with a caveat that I am thanking myself for River4 and RSS, I know it's weird).

    I'm sure this list will grow as I remember more bits of generosity that I'm building on.

    This tech makes people rich

    BTW, one of the reasons I listed the open tech that builds on is to increase the visibility of these essential components.

    For entrepreneurs and VCs who have made billions from tech, you should know that this would not be possible without the generous work of people who mostly do it for love, with no expected remuneration.

    If you think you support open tech and are not actively supporting this work, you're not. Sometimes you have to tell truth to power. This is one of the truths that has not been well-told.

    April 20, 2015 01:56 PM

    The new WTC elevator

    One of the things I love about NYC history is the layering and the continuity. It's how I think software should evolve too. We rip up our software cities too easily, because we don't like the arrangement of the streets, forgetting that there are real people living and working in our cities.

    So I totally got off on the elevator movie that takes you to the 102nd floor observation deck in the new WTC tower. It shows you how the city evolved from nothing to a small Dutch settlement at the tip of Manhattan (south of the WTC site) to the huge metropolis it is today. You even get a look, briefly, at the ill-fated tower that came down on 9/11.

    But there are mistakes, as has been observed, and one howler that as far as I know has not been reported yet. Here's the problem. They show the Brooklyn Bridge, clearly, in 1825. But it wasn't finished until 1883.

    April 20, 2015 01:28 PM

    Fog Creek – Interview with Chris Hartjes

    In, we chat with developers about their passion for programming: how they got into it, what they like to work on and how.

    Today’s guest is Chris Hartjes, Senior Developer at Roave. He is the organizer of the TrueNorthPHP conference and co-presenter of the /dev/hell podcast. Although he is perhaps best known in his more curmudgeonous form, as the author of the ‘Grumpy Programmer’ series of books and screencasts, including ‘The Grumpy Little Book Of Hack‘ and ‘The Grumpy Programmer’s PHPUnit Cookbook‘.

    Chris Hartjes
    Location: Milton, Ontario, Canada
    Current Role: Senior Developer at Roave

    How did you get into software development?

    My first computer was a Commodore VIC-20 when I was 11 or 12 years old (1982-1983). I started off with Commodore BASIC. I spent many, MANY hours typing in programs from the old Compute magazine and wondering how they could make that Centipede clone I would play endlessly, fit into 5k of memory. My sister and I would take turns typing stuff in, switching every time we had to turn the page in the magazine.

    So I’m mostly self-taught. I took Computer Science at a Community College, but this was pre-web. I still remember the first time I browsed the web with Mosaic. It blew my mind after having spent a good 6 months surfing the web text-only using Lynx. I was hooked forever.

    My first “professional” programming job was when I was asked to build a website for the company I was doing IT support for. “We need something free? What’s this PHP thing I found via AltaVista…”. I was a late arrival to programming as a career. I originally went to college for Civil Engineering but went back to school for Computer Science in 1994 after spending a summer spending 60 hour weeks working for very little money on job sites testing asphalt and soil for proper compactness.


    Tell us a little about your current role

    I work 4 days a week with the team at Roave, which I think can best be described as a programming co-op with a focus on projects that use PHP. I currently work with a client who sends out high volumes of SMS and voice broadcast messages every day. The other one day of the week, I work on my burgeoning info-product empire consisting of books and screencasts. I also spend a lot of time on Twitter both promoting good code testing practices and doing performance art.

    I currently act as a Senior Developer for one of the two programming teams for the message systems client. A typical day is going over the tasks assigned to me and figuring out how to solve the problems I’m faced with. I get a lot of freedom to choose what to work on, so I tend to pick tasks that are of the clean-up variety. Fixing code that is spewing warnings all the time into the error logs, reworking tests so that we are not reliant on a flaky development database server, things like that. I’m not sure what that says about me. A lot of what I’m asked to do these days involves changing the direction of developer workflow and culture. I spent several months using automated tools to update and test a PHP code base being upgraded to be PSR-2 compliant. I also spend a lot of time looking at ways to change how the existing tests are being written so we have a more useful test suite as the team moves towards continuous integration practices.

    I have been one of the loudest voices in the PHP community advocating for writing testable code and adding automated testing to your development process. I used to speak at a lot of conferences, but I’ve scaled back the travel in the last year or so. Speaking at conferences is something I really enjoy and I have worked very hard to get good at public speaking. By rough estimate, I have given about 50 talks since 2006 between physical conferences, virtual conferences, and user groups.

    I also help organize Canada’s only PHP-centric developer conference called TrueNorthPHP, held the first weekend in November at Microsoft’s Canada HQ, just West of the airport in Toronto.

    These are all things I am passionate about so it never gets old.

    When are you at your happiest whilst coding?

    After more than 17 years of being paid to do this type of work, I’m happiest when I’ve solved a problem to my satisfaction. Sometimes the people asking me to solve the problem are satisfied too.


    What is your dev environment?

    I use OS X on a MacBook Air, running Yosemite. I’m a Vim user and currently use about ~20 plugins. I would say the ones that I cannot live without are:

    • supertab
    • syntastic
    • vim-surround
    • vim-gitgutter

    The rest are ones that drift in and out of my use depending on what sort of things I happen to be working on at the time. I’m a big believer in picking an editor and learning it inside out. HJKL for life!

    I prefer to do my development work using Vagrant-powered virtual machines, but that’s not always possible. Learning to be proficient with Vim has made editing code on remote servers a non-issue.

    Other programs I use all the time are:

    • Chrome / Firefox / Safari — always have to check if stuff is working in all three at various times
    • Skype – I do my podcast /dev/hell with my buddy Ed Finkler using AudioHijack Pro and Skype
    • IRC clients – I spend all time in IRC and one of my hobbies consists of playing simulation baseball with others over IRC
    • Tweetbot
    • iTerm

    I code sitting – Last year I bought a Herman Miller Aeron chair. Why did I wait so long?!? As a large human (I’m 6’5″, 265lbs) I have a hard time finding furniture that I can use comfortably. That and clothes. And shoes. I listen to music off and on depending on my mood. My only coding quirk is being annoyed when there aren’t tests for the code I’m working with. I will write them if I can.

    What are your favorite books about development?

    I don’t read as many programming books as I used to, but there are two books that had a profound impact on me and my career:

    • The Pragmatic Programmer‘ introduced me to many ideas and concepts that have served me well throughout the years. I read it at least once a year to help keep me focussed on being the best programmer I can.
    • Extreme Programming Explained‘ introduced me to unit testing at a time in 2003 when I had been working on a project that had been a complete disaster when it launched. Unit testing seemed to be something that would’ve prevented a lot of the problems we faced.

    What technologies are you currently trying out?

    Having worked with dynamically-typed scripting languages, like PHP, my entire professional career, I would love to work with Go or Rust. Compiled languages are something I only ever used at College.


    When not coding, what do you like to do?

    I am a long-time simulation baseball player (18 years and counting in the same league) and I also supremely frustrate myself playing the collectable card game ‘Magic: The Gathering‘.

    Working from home has made a huge difference to my family life. My wife and two kids seem to be happy that I am always around. 9 years ago I made the switch to working remotely full-time and have never regretted it.

    What advice would you give to a younger version of yourself starting out in development?

    Haters are gonna hate so just keep doing your thing.


    Thanks to Chris for taking the time to speak with us. Have someone you’d like to be a guest? Let us know @FogCreek.

    Recent Interviews

    Phil Sturgeon
    Leah Culver
    Peteris Krumins
    Peteris Krumins
    Eric Lippert
    Eric Lippert

    by Gareth Wilson at April 20, 2015 10:05 AM

    John Udell

    Online identity: Where collaboration and innovation get stuck

    Before I was hired by Hypothesis, a nonprofit that's building a Web discussion platform, the team used Trello for project management. Then it switched to HuBoard, one of a number of tools that layer project management features on top of GitHub.

    When I joined three weeks ago, however, nobody at Hypothesis was happy with HuBoard, and there was nostalgia for Trello. So that's what I'm using now to manage the development of our product.

    [ See what hardware, software, development tools, and cloud services came out on top in the InfoWorld 2015 Technology of the Year Awards. | Download the entire list of winners in the handy Technology of the Year PDF. | Cut to the key news in tech with the InfoWorld Daily newsletter, our summary of the top tech happenings. ]

    The crux of the issue for our team is that a wrapper around GitHub won't do the trick. We need to operate at a higher level of abstraction. We're an open source project, and GitHub is at the core of what we do. But we're now expanding from a small team of engineers to a larger team that includes three new program managers.

    To read this article in full or to leave a comment, please click here

    by Jon Udell at April 20, 2015 10:00 AM

    April 19, 2015

    Giles Bowkett

    Arx: Clojure (Overtone) Archaeopteryx Port

    I've finally open-sourced an Archaeopteryx rewrite in Clojure using Overtone. It's called Arx. I wrote this last year but only just open-sourced it today. I had planned to make the code more idiomatic, and upgrade the drum samples, but I forgot all about it, so I figured I should just get on with it.

    I also wrote a similar Clojure project in 2013 at WACM. It's called markov-bass-lines and it builds moombahton beats with a very entry-level Markov chain.

    by Giles Bowkett ( at April 19, 2015 05:47 PM

    Mark Bernstein

    Too Many Books?

    Tim Parks:

    At present, for example, it’s hard not to feel that we are in an era of massive overproduction. Just when we were already overwhelmed with paper books, often setting them aside after only a few pages in anxious search of something more satisfying, along came the Internet and the e-book so that, wonderfully, we now have access to hundreds of thousands of contemporary novels and poems.

    Note to the copy editor of the NY Review of Books:

    True, in the early 1300s, with the establishment of the first partially mechanized paper mills in Italy, a more generous supply of paper began to circulate and the number of people able to write rapidly increased.

    Did the number of writers increase rapidly? Or does the increase relate to how many people could write hurriedly, swiftly, and in a rush?

    April 19, 2015 04:23 PM

    Dave Winer

    T-Mobile travails

    I was taking an early morning walk in Manhattan this morning when the fourth wall popped with T-Mobile. I was dropped out of The Matrix and smack in the mire of post-millennial mobile access.

    My recently-upgraded T-Mobile account was missing a vital feature. I found out about it just as I was getting ready to use a service that requires a net connection.

    The 20-minute story in a podcast.

    April 19, 2015 03:10 PM

    April 18, 2015

    Mark Bernstein

    Planning A Conspiracy

    I’m toying with an odd fiction project that, if all goes well, will generate some useful background material for Tinderbox 6.3 while perhaps being interesting (or amusing) for its own sake.

    It’s going to be a quick and dirty thriller. To get things rolling, I need to lay down the bones of the conspiracy our protagonist will eventually discover, a conspiracy that’s going to ruin her April. That means keeping the players straight.

    Planning A Conspiracy

    Nothing very profound here; it's just a quick sketch. Usually, I just keep a list of the characters in outline view for fast reference, but here we’ve got to manage all sorts of shadowy and undisclosed relationships (and at least one double agent).

    Green people work for us; light green people are contractors. Red people work, perhaps indirectly, for the bad guys; at this point, I know less about the Opposition than I do about our hero. That’s one reason for this exercise.

    Of course, lots of brainstorming, “mind mapping,” or diagramming tools could do this well enough. What’s nice here is that we can seamlessly extend this to add background to characters, change their associates, perhaps use some rules to keep all this organized.

    April 18, 2015 04:49 PM

    April 17, 2015

    Mark Bernstein

    Tinderbox 6.2

    Tinderbox 6.2

    Tinderbox 6.2 is now out.

    So what I particularly like is that, even as a trivial user, things are just getting better and better.— E. P.James, Tinderbox Forum

    April 17, 2015 05:04 PM

    Dave Winer

    The future of journalism

    There's a future-of-journalism conference in Austin. I'd like to insert a recipe, if I can, for the future of journalism.

    1. Start by solving problems. In all likelihood the geography you serve (if you are geography-based) has awful Internet connectivity. Before doing anything else, you must take ownership of that problem. If your readers have lousy Internet they will not be full participants in the world-wide news system. NYT, NYP, NYDN take note please.

    2. Work on your collective rolodex. That is the definition of who you are. The better it is the better you are. I'd be surprised if many current news orgs see it that way. But they will. (By the way you can start on this step before the previous step is complete. It might take years, even decades.)

    3. Make sure you have in your rolodex a field called "Feed" and in that field include the address of your source's RSS (or Atom I don't care) feed. You're going to need it in step 4.

    4. Make a river out of those feeds. Start watching that river. Tell your sources about the river, give them the address. About five minutes after that you will be jumping up and down with excitement. Five minutes after that it will be on your home page.

    5. Congratulations, you now have a future.

    April 17, 2015 04:24 PM


    I was bored with my podcasts. I subscribed to a dozen different feeds, but was only listening to two shows. Sometimes I'd leave the house with nothing interesting on my phone. I muddled along, thinking this was the best I could do. Then came Serial, and all of sudden podcasting was exciting again. I looked forward to every week's installment the same way I look forward to a weekly Game of Thrones or Mad Men.

    A fog of podcasts

    What followed was an explosion of new podcasts, or so it seemed, but which were the good ones? I did what everyone does, I asked my friends. I saw my friends asking. I asked again. Sometimes I found something interesting to listen to, but usually not something I wanted to subscribe to. That got me thinking.

    Subscribing may be the wrong way to look at it. When I want a podcast I don't want to subscribe. I want to listen. All the time between the want and the fulfillment seems like work. Why is this so hard.

    I tried an experiment

    Standing on the street in Manhattan, with my iPhone 6 and a good net connection, how long would it take me to find something to listen to.

    In other words, how long after having the idea "I want a podcast" did it take to fulfill it. Standing out there in the cold. Feeling like an idiot, fussing with my phone.

    How long? A lot longer than it should.

    An idea from Vox

    Then I read an article in Vox that listed 26 podcasts I should be listening to. There's the answer. Almost. If they had a page that followed all these podcasts, I could go there, click a play button and be listening in an instant. Someone with good judgement chose these shows, and I bet one or two of them are good in any week. But that place didn't exist.

    Another experiment

    I asked my friends on Facebook to recommend their favorite podcasts. I figured if we were friends, or friends-of-friends, some of our interests would overlap. But I did more than ask, I engaged. And I didn't ask for feeds, I was willing to do the research to go from the title of the podcast to the RSS feed.

    I set up a river, customized it so there was a player for each item, and linked it up with Facebook comments, so the resulting conversations would feed back into my relationships.

    The product

    As Apple says about their products, it has magic. It's simple, it's probably not what you expect, but it really works. When I go there, I find new ideas, feelings, perspectives, entertainment.


    And now it's public. You can use it too!

    A picture of a slice of cheese cake.

    April 17, 2015 01:02 PM

    How to Node

    Node.js For Beginners. Deploy Your Blog to Heroku

    Error pages are not what typically appear on your screen when you're surfing the web, but when it happens it's so annoying! To see how servers work from within, we will build a simple web server by ourselves. We will use Node.js as a server part technology for that task. Then we'll use Heroku cloud application platform to turn this local server into a world wide server.

    Why should I?

    Hi, everyone! Don't know how about you, but my weekend was great!

    Friday evening. I came home from work, fed my cat, grabbed some pizza, and wanted to have some fun. What could be funnier than good old movies? Nothing, right? So, I went to "IMDB Top 500" to choose one. Then this happened:

    IMDB is down

    And I had to choose my evening movie randomly. It was "Sharknado". Should I say that my Friday was ruined?

    To be honest, this is not what typically happens when you are surfing the web. But when it does... Man, it's so annoying! It's annoying, but we're curious, aren't we? And, for our curiosity to be satisfied, we will build a simple web server by ourselves. It will help us to see how it works (or how it won’t work) from within.

    How can I?

    We will use Node.js for our project. Node.js is an open source, cross-platform runtime environment, which allows you to build server-side and networking applications. It's written in JavaScript and can be run within the Node.js runtime on any platform. First of all, of course, you need to install it. You'd better check the download page for more details. I'll wait until you finish, so don't worry. Is it done? Great! Now you can create your first web server. And it will be one of the easiest tasks in your life.

    Pretty simple, but it's a server!

    First of all, we need to create a JavaScript file. Let's name it server.js:


    It's simple. It's tiny. But it's a server! Let's make sure it's working. Run at your terminal:

    node server.js

    Then check it in your browser. Your new server's address, as you may guess, is http://localhost:3000/ Mine is working. How about yours? Hope, it's working too.

    localhost server

    Now, to be sure it's a web server and not just a piece of code that returns a single line of text, we'll use it as a server! You can check it with your smartphone. Let's suppose, your laptop's IP address within your local network is You can connect to your server through the 3000th port (for this particular example) by typing in your browser. Works well in my case:

    Server via smartphone

    Well, it is a server! And we have evidence. What you got here is your own client-server model, which can fit in your bag! Take it any place you want! It will be a good idea to deploy our server online, so everyone could see it.

    But you should notice something, before we go further. Let's look more closely at our first Node server. This is an example of how Node provides you with non-blocking and event-driven behavior. Let me explain:

    $.post('/some_requested_resource', function(data) {

    This code performs a request for some resource. When the response comes back, an anonymous function is called. It contains the argument data, which is the data received from that request.

    So, Node allows you to use the so-called event loop, which works faster because of non-blocking behavior. For example, nginx uses an event loop with asynchronous I/O. That's why it's fast as hell!

    This is not so hard to understand this conception in outline, so let's move along.

    Make it worldwide

    Works fine. But it works locally. WWW is for "World Wide Web" and we will turn your local server into a world wide server. We'll use Heroku cloud application platform for this. Heroku is a cloud platform as a service (cool long-bearded programmer guys call such type of things "PaaS"). It allows you to deploy your web server, so everyone could see how awesome you are as a web developer. First of all, you need to create an account on developer's site and install Heroku. This is not so hard. Just follow the instructions. There is also instruction on Heroku's site that can explain you how to run your first simple web server, which returns you the "Hello, World!" string. You can try it, but I think that it will be more interesting if we build our own web server from scratch. Sounds exciting, huh?

    Look, mom! I'm developing!

    First step after Heroku installation is to log in to the system from your computer:

    heroku login

    We will leave Heroku for now. But we'll need it soon after we build our server.

    Now, the creation. It will be a simple blog with basic functionality. It will show you requested web pages and the error page in case of an error.

    Create your project directory. And then create the server.js file inside of it.

    First of all, let's declare some variables:

    var http = require("http");
    var fs = require("fs");
    var path = require("path");
    var mime = require("mime");

    The first one will give you the key to Node's HTTP functionality. The second one is for possibility to interact with the file system. The third one allows you to handle file paths. The last one allows you to determine a file's MIME-type. And it's not a part of Node.js, so we need to install third-party dependencies before using it. We need to create the package.json file for that purpose. It will contain project related information, such as name, version, description, and so on. For our project we will use MIME-types recognition, because it's not enough to just send the contents of a file when you use HTTP. You also need to set the Content-Type header with proper MIME-type. That's why we need this plug-in.

    Create the package.json file and fill it with proper information. Here's mine:


    There are "name", "version", "description", and "dependencies" fields in it. The syntax is simple, as you can see. We added our "mime" plug-in and now it's time to download it. We'll use built-in Node Package Manager. Just run:

    npm install

    It will create node_modules folder and place all the files inside of it. So, we resolve our dependencies and can return to our code.

    We will now create send404() function. It will handle the sending of 404 error, which usually appears when requested file doesn't exist:

    function send404(response) {
      response.writeHead(404, {"Content-type" : "text/plain"});
      response.write("Error 404: resource not found");

    Nothing sophisticated with this one. It returns plain text when server can't find a page.

    Now we will define sendPage() function. It first writes the header and then sends the contents of the file:

    function sendPage(response, filePath, fileContents) {
      response.writeHead(200, {"Content-type" : mime.lookup(path.basename(filePath))});

    Notice the way we handle the MIME-types.

    Now we'll define how our server will handle responses. This function will return the content of the requested file or the 404 error otherwise:


    And now it's time to create the HTTP server:


    Now we need to start our server. And here's the tricky part. Do you remember how we told the server to listen to the 3000th port in our first example? No? I'll remind you:

    http.createServer(<some code here>).listen(3000)

    We can do it when we run our server locally. But Heroku sets a dynamically assigned port number to your app. That's why we need to handle all this mess with ports as it’s shown below:

    var port_number = server.listen(process.env.PORT || 3000);

    You can use the port_number variable later. For example, in console.log() function to tell the user, which port is used. This is your homework for tomorrow.

    That's all we need to run our simple web server. Now it's time to create some content. We'll create the public folder and two folders inside of it: stylesheets and images. We'll put all our HTML files into the public folder.The stylesheets folder is for CSS files. And the images one is for pictures.

    We need to create the index.html file. It will determine our blog's exterior. Here's the code:


    Here you can see how the main page looks like:

    My simple blog

    You are free to create your own CSS file if you don't like our design.

    What we are interested in for now is how our server handles the 404 error. That's why we created two "Read more" links. The first one is connected with the actual HTML file within the public folder. The second one is broken. Let's test how it works.

    To start your server locally run:

    node server.js

    And then click the first link:

    It works

    Then return to the main page and check the second one:

    enter image description here

    Here's our 404 page.

    We tested our simple server locally and now is time to deploy it.

    It's Heroku time!

    Open your terminal within your project folder. For my Linux it's:

    cd /path/to/my/project

    Then run:

    git init

    Empty Git repository will be initialized in .git/ folder.

    Then run:

    git add .

    This command allows Git to track your files changes.

    Now commit your files to the initialized Git repo:

    git commit -m "Simple server functionality added"

    We'll create our first Heroku application now:

    heroku create

    Heroku will generate a random name for your application. In my case it's enigmatic-citadel-9298. Don't worry. You can change it later.

    Now we can deploy our project. Every Heroku app starts with no branches and no code. So, the first time we deploy our project, we need to specify a remote branch to push to:

    git push heroku master

    The application is now deployed. Ensure that at least one instance of the app is running:

    heroku ps:scale web=1

    And now, before we open it, it's time to choose a proper name for our first creation. I called it myfirstserver:

    heroku apps:rename myfirstserver

    Everything is done. You can try it now:

    heroku open

    This command will open your Heroku project in your web browser. In this particular case, server address is Now you can share your first web application with any person you want.

    Looking back

    We've built our own web server using less than 50 lines of code. Not so hard, if you ask me. It's pretty simple, yes. But you can see, how average server works. It was a simple task. But you can combine Node.js with different technologies, such as CSS3 and HTML5, then spice it with some JavaScript functionality. There is really a lot of libraries and frameworks to take a look at. Personally I started to dig into Webix, it's a relatively new library and is developed by a small software company from Eastern Europe. Samples of apps made with the library and Node.js: CRM and task planner. Seems like you can create anything with the right client-side framework and Node.js.

    And, talking about Node.js as a technology... will make your DIRTy job for you.

    There is an acronym created to describe such type of applications Node.js was created for. It's DIRT. It means Data-Intensive Real-Time applications. Node allows a server to handle a lot of connections and work with a number of requests at the same time. And you don't need much memory for that. It's designed to be responsive and fast. Just like your web browser! So, it's useful when you need to create an application that will be able to respond instantly to a large number of users. And Node was built from scratch to provide you with such a functionality.

    Well, that's enough for today. Hope you liked it. See ya!

    by (Lenny Witman) at April 17, 2015 10:53 AM

    Fog Creek

    Using Forensic Psychology to Spot Problems in Your Code – Interview with Adam Tornhill

    .little {font-size: 75%}
    Using Forensic Psychology to Fix Software Development – Interview with Adam Tornhill

    Looking for audio only? Listen on

    We interviewed Adam Tornhill, a software architect who combines degrees in Engineering and Psychology to get a different perspective on software. We discuss his book ‘Your Code as a Crime Scene‘, in which he describes using Forensic Psychology techniques to identify high-risk code, defects and bad design. He describes how his techniques are useful by themselves, but can also be used to make other practices like code reviews and unit testing even more effective.

    Adam’s Code Maat software is on GitHub.

    Content and Timings

    • Introduction (0:00)
    • About Adam (0:31)
    • Detecting Problem Code (1:43)
    • Improving the Software Architecture (3:00)
    • Social Biases and Working in Groups (4:02)
    • Working with Unit Testing and Code Reviews (7:20)
    • Tools and Resources (8:32)



    Adam Tornhill is a Programmer and Software Architect who combines degrees in engineering and psychology to get a different perspective on software. He’s the author of “Lisp for the Web”, “Patterns in C”, as well as “Your Code as a Crime Scene”, in which he describes using forensic techniques to identify defects and bad design in code.

    Adam, thank you so much for taking the time to join us today. I really look forward to hearing what you have to say. Why don’t you say a bit about yourself?

    About Adam

    Oh yeah, sure. It’s a pleasure to be here. I’m Adam Tornhill and I’m from Sweden, which is why I have this wonderful accent. I’ve been a programmer for a long time. I’ve been doing this for almost two decades now, and I still love what I do.

    I wanted to touch on one of your books, “Your Code as a Crime Scene” where you apply forensic psychology techniques to software development. What made you think to apply techniques from what would seem to be such an unrelated field?

    Complexity metrics, the old kind, they just didn’t cut it

    It actually came a bit surprising to me as well. What happened was some years ago I was in the middle of my psychology studies, working towards my master’s degree and then got hired into architectural roles where I had to prioritize technical debt and identify problematic areas. I found that it was terribly hard to do that because complexity metrics, the old kind, they just didn’t cut it.

    When I tried to talk to the different team members and developers, I found out that nobody seemed to have a holistic picture. It was virtually impossible to get that picture out of a large code base.

    At the same time, I took a course in criminal psychology. I was just struck by the similarities in the mindset to what we needed to have in the software business. That’s how it all started. I started to think, how can we apply this stuff to software?

    Detecting Problem Code

    I wanted to jump into a couple of the techniques you cover. How can forensics psychology help us to detect problematic code?

    The first kind of technique that I would like to introduce, and that’s actually where I started, is a technique I call a Hotspot Analysis. It’s based on a forensic concept called Geographical Offender Profiling.

    I find it really fascinating. What Forensic Psychologists do is basically they try to spot patterns in the spatial movement of criminals, to detect our home bases, so we know the area to inspect.

    I thought what if we could do the same for software, that would be pretty cool. If we could take a large code base and somehow spot the spatial movement not of criminals, but of programmers, then we could identify the kinds of, the parts of the code that really matter.

    That’s where it started, and what I do is, I start to think about where can I find that information, I realized, it was there right in front of us in a version control system. A version control system, basically records every interaction we have with the code.

    So I tried to mine source code repositories and then I looked for code with high change frequencies, then I overlaid that with the complexity analysis, which allows us to identify the most complicated code, that is also the code we have to work with often, which is a hotspot. So that’s where it all started. That’s the starting point for the rest of the analysis basically.

    Improving the Software Architecture

    You also say that you can use your techniques to help improve the architecture of applications. How is that so?

    First we have to consider what an architecture actually is. A fundamental idea in my book is that software is a living entity. It constantly changes, evolves and sometimes degrades.

    So I came to architecture more as a set of guiding principles to help that evolution happen in a successful way. Just to give you a complete example, consider microservices, they seem to be all the rage right now.

    So that means that tomorrow’s legacy applications will be microservices. In a microservice architecture, a typical one where each microservice is cohesive and independent, so that’s basically one architectural principle.

    What you do is you try to measure and identify violations of that principle. Again I look at the evolution of the codebase in the source code repository. And I try to identify, in that case, multiple services that tended to change at the same time because that’s a violation of your architectural principles. That’s one way to do it.

    Social Biases and Working in Groups

    If you want to truly improve software, we need to look beyond technique and look at the social side

    You also cover how “most studies on groups of people working together find that they perform below their potential”. Why is this and what are some of the problems teams can experience?

    Social Psychologists have basically known for decades that teamwork comes with a cost. The theory that I come to in my book is called Process Loss. The idea behind process loss, it’s pretty much as how a mechanical machine cannot operate at 100% efficiency all the time, so neither can software teams.

    That loss often results in the communication and coordination overhead or perhaps motivation loss. The interesting thing is when you talk to software teams about this, they are aware of the problems. Quite often we mis-attribute it to a technical issue, when in reality we have a social problem.

    In one team I worked, the developers, they noticed that they had a lot of bugs in certain parts of the codebase. They thought it was a technical problem. What happened in reality was they were having excess parallel development in those parts of the codebase.

    There were multiple programmers working in the same parts of the code all the time. So merely all they did, they said that, they complained a lot about potential merge conflicts. They were really scared to do merges of different feature branches.

    When we started to look into it, we identified that what actually happened was that, due to the way they were working, they didn’t really have a merge problem. What they had was basically a problem that the architecture just couldn’t support their way of working.

    I think that’s really important to understand that if you want to truly improve software, we need to look beyond technique and look at the social side.

    What can we do to avoid such problems?

    First thing I recommend is always to use something I call Social Hacks. Basically it takes the social situation and tries to tweak some aspect of it, to make social biases less likely because social biases, they are a huge reason why we get process loss.

    One of the simple techniques that I recommend is, in every team, assign someone the role of the devil’s advocate. The role of the devil’s advocate is just to take the opposite stance in every discussion to question every decision made. That helps you reduce a bunch of biases because you’re guaranteed that someone will speak up. It also has the nice benefit of making teams more risk averse. There are a bunch of social stuff we can do and I also present a number of analyses that they can apply to investigate and mine social metrics from their codebases.

    So what sort of results have you seen from those applying your techniques?

    I’ve seen that most people seem to use it for their original purpose, which was to identify the code that matters the most for maintenance. I’ve also seen some interesting uses mostly from managers. Managers seem to love the social aspects of the analysis because it makes it possible for them to suddenly reason about something that they couldn’t measure before.

    Another interesting area, is a couple of years ago, I worked with a really good test team. These testers they used to do a bit of exploratory testing at the end of each iteration. So what I did was basically I generated a heat map over the complete source code repository, so we can see where most of the development activity was, and we would start to communicate with the testers. They knew where they should focus a little bit of extra energy. That helped us to identify a lot of bugs much earlier.

    Working with Unit Testing and Code Reviews

    We’re not so much writing code. What we do most of the time is actually making a modification to existing code

    How do you see current development practices like unit testing and code reviews, working with those that you’ve described?

    Techniques that I present, they don’t replace any current practices, save maybe wild guesses and panic near the deadline. But otherwise, they are there to complement what you already do today.

    For example, take code reviews. I often use a hot spot analysis to identify code most in need of review. To prioritize reviews as well. Unit testing is interesting, because I actually have a complete chapter in my book about building a safety net around tests. Automated tests are terribly hard to get right in practice. It’s actually something you can do, by again, measuring the evolution of the codebase, looking at application code and testing them both together.

    Ultimately you say developers should optimize for understanding in their code, why is this so important?

    It’s important because we programmers, we’re not so much writing code. What we do most of the time is actually making a modification to existing code.

    If you look at the research behind those numbers you will see that the majority of that time is spent trying to understand what the code does in the first place. If you optimize for understanding, we optimize for the most important phase of coding.

    Tools and Resources

    What are some tools that people use to mine source code data, to use your techniques?

    When I started out there weren’t any tools really, there were a bunch of academic tools. They were powerful, but the licences were quite limited, you weren’t allowed to use them on commercial projects, they also focused on one single aspect.

    I actually had to write my own set of tools. I actually open-sourced all my tools, because I want the readers of my book to have the possibility to try the techniques and stuff.

    If you’re interested in this kind of stuff, you can just go to my GitHub account, Adamtornhill, and download the tools and play around with them. I think we’re going to see a lot of stuff happening in this area now.

    Beyond your book, are there any resources you can recommend for those interested in learning more about writing maintainable code and improving their code design?

    My favorite book when it comes to software design has to be ‘The Structure and Interpretation of Computer Programs’. It’s just brilliant and it had a tremendous influence on how I approached software design.

    When it comes to coding itself, I would say Kent Beck’s ‘Smalltalk: Best Practice Patterns’. It’s a brilliant book and it takes us way beyond Smalltalk. It’s actually something I recommend for everyone.

    And the final book I would like to mention is ‘Working Effectively with Legacy Code’ by Michael Feathers. It’s one of the few books that takes this evolutionary perspective on software, so it’s a great book by a great author.

    Adam, thank you so much for joining us today.

    Thanks so much for having me here, it was a true pleasure.

    by Gareth Wilson at April 17, 2015 08:39 AM

    April 16, 2015

    Dave Winer

    It's their world we just live in it

    Something funny happens when I put my iPhone 6 and my Nexus 6 together on my desk (charging them up).

    The iPhone tries to pay the Nexus using ApplePay.

    I just realized how funny this is. Why does the iPhone (Apple) think it owes the Nexus (Google) money?

    Next time it happens I'm going to make note of how much money the iPhone thinks it owes the Nexus.

    April 16, 2015 08:11 PM

    Software and free hardware

    I just saw that JJ Abrams has an Apple Watch.

    You know there was a time when I would have had that.

    When Apple gave early access to hardware to developers who created software for their platform. I was, at one time, one of those people.

    I used to have a motto back then: "Software is made of free hardware."

    What was cool is that it worked the other way too. Hardware is made out of free software. But that was hard to say because of piracy, could be too easily misunderstood. Still, it's true.

    And it makes me wonder if there isn't still a position for a company to do what Apple used to do, cultivate relationships with software-makers.

    Pretty sure JJ doesn't write too much software.

    April 16, 2015 05:18 PM

    This is a test...

    For the next sixty seconds this station will conduct a test of the Emergency Podcasting System. Had this been an actual podcast you would have been instructed to do whatever it is you do when you listen to a podcast.

    April 16, 2015 03:11 PM

    Giles Bowkett

    What If Uber's Just A Terrible Business?

    Update: I had to block an angry libertarian on Twitter who declared me an "Uber hater" and was launching all kinds of contempt and overgeneralization my way. I also saw people retweeting this post and describing it as a general takedown of the sharing economy. So I just want to clarify: I think AirBnB is a terrific business, but Uber might be a terrible one. This is a post for rational adults who can handle nuance. If that's not you, there are plenty of other posts to read out there.

    Sometimes an industry which is very tightly regulated, or which has a lot of middlemen, has these obstructions for a reason.

    Working for any taxi service holds enormous opportunities for kidnappers or rapists, and makes you an easy target for armed robbery. In some cities, being a cab driver is very dangerous. In other cities, it's dangerous to take a cab anywhere - don't try it in Argentina - and in many cities it's dangerous for both the driver and the passenger. A taxi service with built-in surveillance could be even worse in the hands of a total maniac. And just to state the obvious, both Uber drivers and regular taxi drivers have logical incentives for driving unsafely.

    In this context, I have no problem with governments wanting to regulate Uber literally to death, at least outside of California. California is a special case, in my opinion. Cabs are completely unacceptable garbage throughout California, and the startup scene definitely skews Californian, so the typical startup hacker probably thinks all cabs suck, but cabs are gold in London, Chicago, and New York, and probably quite a few other places too.

    In Los Angeles, cabs are licensed by city. A cab driver can only operate in one "city," and can face disastrous legal consequences if they pick up a passenger outside of their "city." But the term's misleading, because the "city" of Los Angeles is really a massive archipelago of small, loosely affiliated towns. It's extremely common that a taxi cab will be unable to pick up any passengers once it drops somebody off. I lived in San Francisco before I lived in Los Angeles, and I had always assumed Bay Area taxis were the worst in the industrialized world, but Los Angeles cabs make San Francisco cabs look competent.

    (In the same way that San Francisco's MUNI system makes LA's Metro look incredible, even though both suck balls compared to the systems in New York, London, and Chicago. I'm told the system in Hong Kong puts even London's to shame.)

    By contrast, in London, you have to pass an incredibly demanding driving and navigation test before you can become a cab driver. Researchers have demonstrated that passing this test causes a substantial transformation in the size of the cab driver's brain, in the regions responsible for maps and navigation.

    Disrupting something which works great (i.e., cabs in London) is not as impressive as disrupting something which sucks ass (i.e., cabs in California). I think the tech industry overrates Uber, because the industry's headquartered in a state which probably has the worst taxicabs of any first-world country.

    Uber is obviously a disruptive startup, but disruption doesn't always fix things. The Internet crippled the music industry, but introduced stacks of new middlemen in the process. Ask Zoe Keating how that "democratization" turned out.

    In music, the corporate middlemen are this pernicious infestation, which just reappears after you thought you'd wiped it out. Artists have to sacrifice a lot to develop their art to a serious level, and a lot of music performance takes place in situations where people are celebrating (i.e., drunk or high, late at night). So somebody has to provide security, as well as business sense. There's a lot of opportunities for middlemen to get their middle on, and disrupting a market, under those conditions, just means shuffling in a new deck of middlemen. It doesn't change the game.

    In the same way that the music industry is a magnet for middlemen, the taxi industry is a magnet for crime. A lot of people champion Uber because it bypasses complex regulations, but my guess is that disrupting a market like that means you just reshuffle the deck of regulations. If Uber kills the entire taxi industry, then governments will have to scrap their taxi regulations and re-build a similarly gigantic regulatory infrastructure around Uber instead. You still have to guard against kidnapping, rape, armed robbery, unfair labor practices, and unsafe driving. None of those risks have actually changed at all. Plus, this new regulatory infrastructure will have to deal with the new surveillance risks that come along with Uber's databases, mobile apps, and geotracking.

    Uber's best-case scenario is that the society at large will pay for the consequences of their meager "innovation." But if you look at that cost realistically, Uber is not introducing a tremendous amount of new efficiency to the taxi market at all. They're just restructuring an industry so that it offloads, to taxpayers, the costs and complexities of a massive, industry-wide technology update.

    Uber got rid of inefficient dispatch mechanisms, and routed around licensing laws, but odds are pretty good (in my opinion) that those licensing laws will re-assert themselves. Those laws don't exist to preserve an inefficient dispatch mechanism, which is the only real technological change here. They exist mostly to guard against risks of criminal behavior. Those risks are still present. Like it or not, licensing laws are a very common response to risks of that nature in societies like ours.

    It's possible that those licensing laws might be gone forever, but I wouldn't bet on it. I think it's a lot more likely that Uber has a huge IPO and its stock price withers to nothing a few years later, once the slow-moving systems which generate regulation in democratic societies have had time to react. If all you're doing is building to flip, sure, you can take the money and run, but if you want an actual business that lasts, Uber might not deliver.

    I could totally be wrong. Only time will tell for sure. But I think Uber is a really good lesson for entrepreneurs in how a market can look awesome but actually suck. From a long-term perspective, I don't see how they can hope for any better end-game than bribing corrupt politicians. While that is certainly a time-honored means of getting ahead, and it very frequently succeeds, it's not exactly a technological innovation.

    by Giles Bowkett ( at April 16, 2015 12:57 PM

    Dave Winer

    Podcasting 2.0

    In 2001, when I designed the protocols for podcasting, we were using a different Internet:

    1. Net connections were so slow that the click-wait problem was interfering with people using big media objects, and

    2. The mobile devices that could play podcasts weren't able to communicate.

    So we designed a protocol that would make it easy for your desktop computer to gather up the media objects and move them to your mobile device, probably something like an iPod, which, by the way, didn't exist yet.

    We got ahead of where the technology actually was. But it turned out well. Today there's an explosion of podcast content, all of it formed around the blueprint we put out 14 years ago.

    Today's net is better

    But the world today is different, and as a result I believe we can make podcasting much easier and richer for the listener. We can remove steps, and provide more variety.

    1. The net we use today is fast. When you click to listen to a 40-minute podcast, it's downloaded in a few seconds. And it starts playing immediately. No click-wait.

    2. The net goes with us almost everywhere with inexpensive mobile devices.

    Given that reality, one would design podcast listening software somewhat differently.

    The problem is discovery

    We're all looking for the next great podcast, not something to subscribe to necessarily, that's work -- rather something enjoyable, interesting, stimulating, thought-provoking and most important -- now!

    The perfect podcast client

    Here's how the perfect podcast client would work, imho.

    1. No preparation. When I'm leaving the house, I have lots of things on my mind. I spend time loading up my phone with fresh podcasts, when I have the time, but sometimes I'm in a rush and leave with nothing interesting on my phone.

    2. Lots of interesting shows. That's a key point. I'm less interested in subscribing to a series of shows than I am in listening to a single good episode.

    3. Social connection. I like to listen to the same shows my friends are listening to, because I love having someone to discuss these things with.

    4. Variety. I had gotten into a groove, listening to a few podcasts regularly because I could count on them being interesting to me. Mostly Planet Money and Fresh Air, with a very rare RadioLab, or a NYT Book Review podcast. But there's a lot more out there, I'm finding, now that I have easy access to more variety.

    5. Immediate. When I decide to listen I want to listen now. It should be as easy to start listening to an episode of a podcast as it is to start watching a different show on my cable TV set-top box.

    6. Ephemeral. You listen to a podcast once, and that's it. Yet the devices we use for playback are designed for music, which is not ephemeral.

    Where from here

    For a while I evangelized editorial organizations to create this product, but they either didn't understand the need, or didn't think there was an opportunity? More likely they don't think like a software developer. When I see an opportunity to make things work better, I want it to happen right now. Even if I don't have time to do the work myself.

    Well, I finally got tired of waiting. I've made the software. I'm using it now, as are a few friends. We're smoothing things out and should have something for everyone to use soon.

    We're going to start with the shows my friends recommended, when I asked them, on Facebook. If it proves useful to others, we may branch out to including shows your friends like. And on and on. I think this is the way podcasting was meant to evolve, starting in 2015.


    The product is

    A blog post explaining how the product came to be.

    April 16, 2015 12:56 PM

    Giles Bowkett

    Maybe Some Empires Never Die

    Goethe wrote a terrific paper on plant reproduction. In it, he describes how reproduction in plants occurs after a systematic buildup of the resources which enable it.

    One of the classic ideas in Western civilization is that the Roman Empire fell to savage tribes of Goths in what is now Germany. The problem with this idea is that the Empire bifurcated about 100 years prior to that, in a process quite similar to the process Goethe identified in plants. The Western half of the Empire remained headquartered in Rome, the Empire's origin, and retained the original name as well. But the other half had its headquarters in Byzantium (aka Istanbul, aka Constantinople), and began to be called the Byzantine Empire. Although the Roman Empire's Western half collapsed only about a hundred years later, the Eastern half persisted for an additional thousand years, until sometime between 1450 and 1480 (depending who you ask).

    Even that longevity looks paltry compared to my preferred interpretation, however. Assume for the sake of argument that empires exist primarily to establish hereditary advantages for the members of particular classes of people. Or, alternatively, that there is, at the core of any empire, a system which exists primarily to establish hereditary advantages for the members of that empire's aristocracy.

    Depending on which variant you prefer, you could say that the aristocracy-favoring system within the Roman Empire abandoned the Empire and took over the Roman Catholic Church instead, or that the Roman Empire abandoned many of its governmental aspects and became the Roman Catholic Church. Keep in mind that popes commanded armies and exerted governmental authority in and around Rome for well over a thousand years, all the way up to 1870. Even today, the Church may be the third-biggest landowner in the world, although its vast wealth is difficult to calculate from the outside. And I had a Latin teacher in high school who met a Catholic priest from Poland and had a conversation with him in Latin, even though my teacher spoke no Polish and the priest spoke no English.

    Consider also the British Empire. The best estimate for the official fall of the British Empire would be 1997, when control of Hong Kong reverted to mainland China. Likewise, although Britain lost its American colonies as early as the 1700s, colonies like India, Pakistan, Palestine (now Israel), and many others remained under British control until the middle of the 20th century. Although Canada became semi-independent in 1867, and Australia in 1901, Canada didn't officially finalize its separation until 1982, and Australia did it in 1986.

    Here in the States, we tend to underestimate the British Empire's lifespan, because we got out of it much earlier than average. But again, there's an alternative interpretation which attributes even greater longevity to that empire as well. As with Rome and Byzantium, the Empire bifurcated, and its older half shriveled to a non-imperial status, while its newer half - the United States - continued to thrive as an imperial power right up to today.

    The exact degree to which American foreign policy is imperialistic or democratic is wildly contested, yet its near-total domination of global politics is pretty hard to dispute. And again, just as the Roman Catholic Church kept some core elements of the Roman Empire intact, while allowing many others to atrophy, the US is quasi-imperialistic where the British Empire was unequivocally imperialistic. Both subsequent pseudo-empires have kept the original empire's language alive, as well as continuing to privilege the respective aristocracies involved, while dropping many of the core governmental and militaristic aspects of a true empire.

    I can't prove this, but I believe that if you follow the money in either case, you'll find continuity. In the Roman example, my guess is families and companies which began in Rome were able to persist either through the Byzantine Empire or the Roman Catholic Church. In the British example, my guess is families and companies which began in England or Scotland were able to persist through the American continuation of British law, or through international corporations (which were originally invented by the British for explicitly imperialist purposes).

    Whether this represents genuine imperial persistence or a vaguer kind of imperial drift is an interesting question, but not one I'm qualified to answer. It could be that empires are caterpillars, and their butterfly forms are more loosely organized and less explicitly governmental. But the continuity's easy to spot in either case, and I definitely think the commonality here is real.

    Since pretty much everyone who reads my blog is a programmer, I'll bring this around to tech.

    In the 1990s, I and many others assumed that Microsoft would die out because of the Internet. I'm sure a big crowd, twenty years before that, thought Microsoft would kill off IBM forever, too. Both these companies have been considered "empires" in their day, though never in a purely literal interpretation, of course. Each of these companies currently survives in a form which is very different from the form they held during their respective imperial glory years.

    It's possible that this is always how it's going to be, and that Google will still be with us, in some radically mutated form, two hundred years from now. Likewise, if you're a tabletop gaming nerd, I used to think the Roman themes in Warhammer 40K were ridiculous, but those mecha legionnaires look more realistic to me these days.

    by Giles Bowkett ( at April 16, 2015 10:23 AM

    April 15, 2015

    Mark Bernstein

    The Fault In Our Stars

    So I dug right down to the bottom of my soul

    To see how an ice cream felt…

    Another book that every teenage girl you know has read, The Fault In Our Stars seems to be a story of two kids with cancer, but it's deeply interested in the the interaction between life and the stories we tell about it.

    A boy and a girl meet cute at a 12-step group for childhood cancer – itself a nicely-observed absurdity – and, one thing leading to another, they soon find themselves sharing an intense passion for a little-known novel about a kid with cancer. That novel ends abruptly and no sequel has appeared; our star-crossed readers accept that the protagonist succumbed suddenly but they want very much to know what happened to The Mother, whether her Boyfriend was good or bad, and what became of her pet hamster Sisyphus. They get in touch with the author, but he won’t commit the answers to writing. He might tell, if only we were in Amsterdam. So, two very sick kids need to get to Amsterdam.

    This is done quite well. Of course, you don’t need to address these questions through the eyes of a 15-year-old with terminal lung cancer and her first boyfriend, but that’s part of the point: plot happens.

    So, much of the book is an interesting concurrence to David Mamet’s attack on Method Acting: you don’t need to deeply understand the character’s background, because the character is a character and has no background. Nothing that’s not on the page exists; that’s all you know and if you need to know more than that, you’re screwed. (And you’re screwed in any case, thanks to the whole mortality thing.)

    I think the book, like the internal story, might to have ended right there. Instead, Green resolves everything with a maudlin coda that shows us what we’ve already been told, and which tends to recast the literary concerns as a distracting subplot in the middle of a sentimental tale of illness.

    April 15, 2015 08:02 PM

    April 14, 2015

    Tim Ferriss


    “The laughter doesn’t last if there is no story. Story is king. You think it’s about the laughs, but, really, it’s about investing in the story and being drawn in.”
    – Jon Favreau [58:55]

    Jon Favreau is a man of many talents. He burst onto the acting scene with his role in Rudy.

    He established himself as a writer with the iconic cult hit Swingers, in which he starred.

    Then, Favreau made his feature film directorial debut with Made, which he also wrote and produced. Other directing credits include Iron Man, Iron Man 2, Cowboys & Aliens, Elf, Zathura, and Chef, which he wrote, produced, directed, and starred in.

    Lots of commas! This man does everything.

    Most recently, he appeared in The Wolf of Wall Street as an actor, and he’s currently directing a live-action film with groundbreaking technology that will blow your mind — an adaptation of Disney’s Jungle Book, set to be released on April 15, 2016.

    This episode goes deep into everything —
    – How did he get started?
    – What role did Dungeons and Dragons play?
    – What made Swingers unique, and how was Elf an inflection point?
    – What are the creative (and control) choices he made Chef and why?
    – What are his writing techniques, routines, and tools?
    – And much, much more.

    If you create anything, Jon is a prime example of reinvention, doing it all, and doing it well.  Enjoy the lessons!


    Want to hear another podcast with a world-class comedian and actor? — Listen to my conversations with Bryan Callen. In his episode, we discuss improving creativity, optimal performance, eating Corgis, and more (stream below or right-click here to download):

    This episode is sponsored by OnnitI have used Onnit products for years. If you look in my kitchen or in my garage you will find Alpha BRAIN, chewable melatonin (for resetting my clock while traveling), kettlebells, maces, battle ropes, and steel clubs. It sounds like a torture chamber, and it basically is. A torture chamber for self-improvement! To see a list of my favorite pills, potions, and heavy tools, click here.

    This podcast is also brought to you by 99Designs, the world’s largest marketplace of graphic designers. Did you know I used 99Designs to rapid prototype the cover for The 4-Hour Body? Here are some of the impressive results.  Click this link and get a free $99 upgrade.  Give it a test run..

    QUESTION(S) OF THE DAY: What is the best advice on creativity you’ve ever received or read? Please share in the comments and check out other responses.

    Scroll below for links and show notes…


    Selected Links from the Episode

    Facebook | Twitter | Instagram

    Show Notes

    • Jon’s go to albums and bands while growing up [4:30]
    • On growing up in the Bronx [6:40]
    • Deciding to dedicate himself to entertainment [10:40]
    • On dropping out of college [13:30]
    • The spark that led Jon to cross the country on a motorcycle and lessons learned [17:50]
    • Deconstructing Dungeons and Dragons shame and how the game inspires filmmaking [22:50]
    • Jon’s process for learning to sculpt quickly and efficiently [28:30]
    • Important themes and lessons from the creation of Chef [31:50]
    • The ingredients Jon Favreau is focused on, plus the value of family/friend cooking experiences [35:25]
    • About George Lucas’s Skywalker Ranch [38:45]
    • The process Jon used to write Swingers and Chef [45:20]
    • On being a writer for hire [51:50]
    • Jon’s meditation practice and how the practice inspired Chef [1:04:15]
    • Making, selling and distributing movies [1:10:55]
    • Rapid fire questions:
    1. Who is the first person and director who comes to mind when you think of the word, “successful”? [1:23:20]
    2. Most gifted book? [1:27:30]
    3. Advice to your 30-year old self? [1:28:20]

    People and Places Mentioned

    by Ian Robinson at April 14, 2015 06:57 PM

    Giles Bowkett

    Teaching A Class On Synthesizers

    Probably not a ton of my readers who have the option of signing up for a class at my local community college, but I'm looking forward to this.

    Here's the web site for it.

    by Giles Bowkett ( at April 14, 2015 11:28 AM

    April 13, 2015

    Fog Creek – Interview with Eric Lippert

    In, we chat with developers about their passion for programming: how they got into it, what they like to work on and how.

    Today’s guest is Eric Lippert, Software Architect at Coverity. He was previously Principal Developer at Microsoft on the C# compiler team, on the C# language design team as well was on the ECMA committee, standardizing JavaScript.

    He’s the author of several programming books, including ‘Essential C#‘ and the ‘Visual Basic .NET Code Security Handbook‘. He writes about programming on his blog and often helps out developers on StackOverflow.

    Eric Lippert
    Location: Seattle, US
    Current Role: Software Architect at Coverity

    How did you get into software development?

    When I was six or seven years old my school library got a couple of Commodore PETs. There was a special school edition of the PET that came with a Waterloo BASIC chip, and we had some stock PETs as well.

    At first I just stayed late after school playing Dam Buster, but soon I realized that I could write programs for this thing myself. I got a book, which I still own, Practice Your BASIC. I keep it in my office just in case I need to practice my BASIC. I would write programs at home on graph paper, and then type them in after school and see if they worked. Mostly it was making rocket ships fly around the screen. My elementary school librarian was very supportive in letting me stay late and getting me books about programming and mathematics; I contacted her on LinkedIn recently and we had a lovely conversation about the old days.

    When I was ten I found my first bug in someone else’s program; my sixth grade teacher had a math flash card program that would sometimes give the wrong answers and he asked me if I could have a look at it. I was not a very sophisticated programmer at this point, and I didn’t understand the program, but I realized that I did not need to understand it, I just needed to find the mistake, so I read every line of the program and thought about whether it made sense in isolation. I don’t remember the exact text of the bug, but it was something akin to:

    • 1230 IF X > 10 THEN PRINT (X – 10) * Z
    • 1240 IF Y > 10 THEN PRINT (X – 10) * Z

    And that second line struck me as being wrong. As someone who spots bugs for a living now, I would note that the consequence following the THEN seems to be uncorrelated with the condition following the IF. In a more modern programming environment I would put this down to a copy-paste error where someone copied the first line, pasted it, intended to change all the X’s to Y’s, but got distracted after the first one. (Of course it is unlikely that the author of this program was using an editor that had copy-paste in 1982. They were just distracted when writing the code.)

    Incidentally, Coverity’s static analyzer finds copy-paste bugs like this and some of them that we’ve seen in real, live customer code have been quite severe. When you copy-paste a line like this where it is dollars and euros instead of x and y and then inconsistently change some of the dollars to euros, you can create an extremely expensive bug!

    But I digress. The Commodore 64 was released that year and I think I got one in 1983 or thereabouts — thanks, Mom, that investment paid off — and started hacking away at it. The program I was most proud of was a database to keep track of my book collection, which tells you something about my priorities when I was eleven. The part that I thought was super slick was that I wrote a little window manager using the box-drawing characters that would animate expanding and contracting the windows when a new screen was opened or closed.

    We would occasionally go on field trips to a building that the school board had set up with a computer lab, and learn about LOGO, but I did not have any other formal training in programming until I was in high school, so I was mostly self-taught. While in high school I did a summer internship program at WATCOM, then justly famous for their compilers and databases, where they taught me C programming, how to use a debugger, how to build a finite state machine, and so on. I later worked at WATCOM while I was taking my degree as well, which was very convenient as they were across the street from the University of Waterloo. (And still are, though the company is now part of Sybase.)

    I took my degree in both Applied Mathematics and Computer Science at Waterloo, though of course Computer Science and Computer Programming are rather different.

    damBuster (1)

    Tell us a little about your current role

    I am a software architect specializing in the analysis of C# code at Coverity, which is now a division of Synopsys.

    Coverity makes software which analyzes its customers’ software looking for critical bugs, missing test cases, that sort of thing. We have analyzers that look for defects in C, C++, Java and C# code; right now I’m working on getting the “checkers” — the analysis algorithms — that look for things like Cross-Site Scripting and Cross-Site Request Forgery and such in Java web applications working in ASP.NET web applications. This is probably the most frequent request we get from our customers who use a lot of C#, so I’m excited to get it up and running.

    A typical day involves a lot of different things. There are all the project management tasks — reviewing bug reports and test cases and code, making sure we’re on schedule, that sort of thing. There are technical tasks — I don’t write a lot of code in my day-to-day work, but I still try to take some of the coding tasks on myself. There’s a lot of mentoring; most of my coworkers are experts in writing C++ for Unix, not writing C# for Windows, and so I often have to explain how ‘The Microsoft Way Of Thinking’ differs from what they’re used to. And there’s a lot of just straight up research; I haven’t actually worked on ASP.NET directly since before it was ASP.NET, and a lot has changed since then! My knowledge of C# has historically been narrow, and so I am learning a lot every day.

    My extracurricular technical activities right now are first, Mark and I are getting the C# 6.0 edition of Essential C# ready for publication, and second, I am working on a series of educational videos for O’Reilly. We’ve just posted the first set on the web and I’m hard at work on the next course now.

    When are you at your happiest whilst coding?

    There’s a quote that’s sometimes attributed to Dijkstra to the effect that many developers derive pleasure from removing bugs that they should not have created in the first place. I’ve never really understood this as a source of pleasure. I am least happy while debugging, and therefore I try to structure my code to first, make it correct the first time, and second, to make it as easy as possible to debug on the reasonable assumption that I did not actually make it bug-free. I assume that it is going to be at least twice as hard to understand the code in the debugger as it was to write it, so I try to write it using half my available cleverness.

    The kinds of problems that I really enjoy coding-up are those where first, I have a clear specification of the problem, and second, I can solve the problem by creating subsystems that solve simpler problems and then fortifying the heck out of those subsystems. Working on the Roslyn project — where we re-wrote the C# and VB compilers from scratch in C# and VB — was my dream job. The specification was excellent, and we started with a blank page, so we had to come up with all the subsystems that were robust enough to compose to solve our big problems.

    procMon (1)

    What is your dev environment?

    Coverity comes from a Unix background, so it’s a very UNIX-like development environment by default. I am unusual here in that I use my Windows machine for most of my development; I use Cygwin to interface with the UNIX-based development environment. Most of my coworkers just use Ubuntu for the day-to-day development and only use Windows for testing.

    Of course, when I am working on the C#-based portions of the product, I use Visual Studio 2013 like a sensible person.

    A tool that I use surprisingly often that I think is maybe not in too many developer toolboxes is ProcMon. All the time I want to know “where exactly is that temporary file?” or “did we get that key out of the 32 bit registry hive or the 64 bit hive?” and so on.

    If I am “in the zone” coding I like to listen to music; my tastes are pretty eclectic. I’ve got Stacey Kent on right now; on a given day I might listen to everything from the Glenn Gould recording of the Goldberg Variations (the first one of course), to Diana Krall, Philip Glass, Daft Punk, Pink Floyd, Sondheim musicals, whatever, depending on my mood.

    Probably my biggest quirk as far as coding goes is that if I am not using Visual Studio, I use a copy of WATCOM VI from the early 1990s as my editor. It is so thoroughly in my fingers now that, even though, there are better versions of VI out there, I’m stuck with it.

    What are your favorite books about development?

    I see that you interviewed Jared already — in fact, he now basically has the job that I had when I was at Microsoft — so it is not surprising that he already mentioned two of my favourite books. Leaving those aside, the book that I consult most often is, of course, The C# Programming Language, which I encourage everyone to get for the entertaining annotations that we’ve added to the specification.

    I edit technical books as a hobby, so my take on “favorite books” includes those I’ve edited. Jon Skeet‘s book, ‘C# In Depth‘ is probably my favorite of all the books I’ve edited, mostly because Jon makes it so difficult to find his mistakes by virtue of not making any. People often ask me for book recommendations and I always tell them that “C# In Depth” and “Essential C#” are my favorites because they are so well-named; “C# In Depth” really does go into depth, and “Essential C#” gives you all the essentials you need.

    programmingLanguage (1)

    What technologies are you currently trying out?

    I actually had dinner with Jon yesterday and we were chatting quite a bit about Docker, which I have no experience with. I love the idea of having some way of doing isolation of large software components without all the overhead of a full-on virtual machine, so hopefully I’ll find some time to learn more about it.

    I’ve also been totally avoiding the entire world of “all-in-the-cloud” service-oriented architectures while I’ve been heads-down in the world of semantic analysis of code; this really is the future and I know shockingly little about it.

    When not coding, what do you like to do?

    Ricky Jay has a line in The Spanish Prisoner where he says that when your hobbies interfere with your work, that’s great, but when they interfere with each other, you’ve got a big problem. Boy, do I know all about that.

    Amongst my many hobbies are:

    • writing and editing books and videos about C#
    • blogging; I have taken a break from my blog due to too many other projects interfering with each other, but I’ll get back into it soon
    • sailing tiny high-performance sailboats at high speed; I recently acquired a 1976 Hobie 16 at my father’s place in Canada and I have a Bieker 2 International 14 here in Seattle.
    • fixing up my 108-year-old house
    • woodworking; I’m interested in learning how to build cabinetry and other furniture
    • I’ve built myself a backyard foundry so that I can cast metal; I’d like to learn how to make tools
    • playing the piano, mostly jazz and show tunes
    • teaching ukulele
    • answering questions on StackOverflow

    And there’s probably a few more in there that I’ve missed. I like to keep busy.

    sailing (1)

    What advice would you give to a younger version of yourself starting out in development?

    If I could go back in time and give my younger self advice, it would be to buckle down and learn Commodore 64 assembler. I was always intimidated by assembly language, and to this day my ability to read machine code is weak.

    If asked to give advice to young people starting in computer programming today, it would be to learn how to write non-code documents clearly. Good developers will quickly reach a point where just writing correct code is not enough; they’ve got to teach others how to use it, or convince them that the change is correct. Communication is key.

    I’ve often said that among the best advice I got when I was a young programmer is to pick a relatively narrow topic, find as many real-world user questions about it as possible, and write clear, accurate, cogent answers to those questions. Soon you will be a recognized expert on that topic, you’ll learn a lot, and you’ll be able to communicate clearly with your co-workers.

    Thanks to Eric for taking the time to speak with us. Have someone you’d like to be a guest? Let us know @FogCreek.

    Recent Interviews

    Hakim El Hattab
    Phil Sturgeon
    Leah Culver
    Peteris Krumins
    Peteris Krumins

    by Gareth Wilson at April 13, 2015 12:38 PM

    John Udell

    A better way to capture team meetings

    I've seen a variety of methods for capturing the sense of a meeting. In order of decreasing likelihood (because increasing effort):

    • Annotated recording: The deluxe solution, a retrospective scribe annotates audio or video of the meeting.
    • Recording: An audio or video recording is made available for playback.
    • Retrospective scribe: A designated scribe refines notes taken during the meeting.
    • Live scribe: A designated scribe takes notes during the meeting.
    • None: People leave and go back to work.
    [ Also on InfoWorld: Transform your email server into a collaboration platform | Get a digest of the day's top tech stories in the InfoWorld Daily newsletter. ]

    Team meetings typically sink to the bottom of this list. It's impractical to do more than scribble some notes and send an email. Or is it?

    To read this article in full or to leave a comment, please click here

    by Jon Udell at April 13, 2015 10:00 AM

    Dave Winer

    HBO should release all of G-O-T

    This is one of those moments when you look back 10 years later and say this is the point where HBO should have crushed the competition before it can get too big. The competition being Netflix and Amazon who are changing the way HBO-like series are viewed. Like Game of Thrones. Which officially starts its fifth season tonight with one episode.

    Maybe last night's leak was HBO testing the waters, to see what would happen with viewership tonight. I have a funny feeling it will just increase it. Game of Thrones, of which I am a devotee, requires two and sometimes three viewings to absorb all the delicious viscousness, depravity, betrayal, lust and insanity.

    Last month Microsoft admitted it might open source Windows. Today that seems like a whimper rather than the audacious hellacious move it would have been 10 or 15 years ago. Today who cares. The action is elsewhere. The time to be bold is when you're at your peak. Unfortunately so many in business wait till it's too late.

    I'm sure Stannis Baratheon, Cersei Lannister or Jon Snow wouldn't hesitate.

    A picture of a slice of cheese cake.

    April 13, 2015 01:53 AM

    April 12, 2015

    Dave Winer

    Registrars are our natural ally

    In the Get-Scoble-On-The-Web thread on Facebook we tripped across something that's worth noting on the blog.

    1. First Joseph Rooks pointed to a program Namecheap is running to encourage students to create more web content. Makes sense. More content, more names.

    2. I said: "Joseph you make a really good point I hadn't thought of. Our natural allies in this are the domain registrars. Their fate and that of the open web are one and the same."

    3. Out here in developer-land we're creating tools that make the open web a richer writing environment. Things that need names.

    There might be other natural allies of the open web. Have to think about it. And thanks to Joseph for the interesting tangent.

    April 12, 2015 05:23 PM

    A new job description

    I started pushing links to followers shortly after I started blogging. First there was the Frontier News page, then that migrated to the home page of, then we came up with RSS, and aggregators, and made the jump to Twitter and Facebook.

    All along I've been aware that there's an art to this. There are chances to insert humor and mystery into the flow. Why did he point to that? And you could comment. I put short little one or two-word phrases after posts, sometimes even in a different voice, all meant to provoke a response inside the reader. A personal one, different for each reader.

    Anyway, as Twitter and Facebook turn more to news, and hopefully at some point other news orgs will invest in their own infrastructure for this, let's think about how to better develop this art. Some way to discuss it. If you do this, do a blog post with your ideas.

    April 12, 2015 04:53 PM

    April 11, 2015

    Dave Winer

    Users can be project managers

    In the Facebook discussion Scoble said he's just a user. I guess he meant that as a user, how could he contribute to an open development project. I hope he didn't mean that users just suck energy from product development and never put it back.

    Fact: We need users to help drive the process of development.

    Here's a great example.

    I was so focused on writing code that I missed that MyWord Editor still needed a way to do a home page. A user (who happens also to be a programmer) called me on Skype and said we needed to look at this. D'oh! Of course.

    So I did some work and threw it back over the fence to the users in the form of some working code and ideas. If the feature is going to happen it needs to be driven by users. An ambitious developer can only go so far.

    When I talk with startups I try to emphasize this. You need good users at the beginning to help you see how the product works for them. Communicating with them, listening and feeding back is the way you get from version 1 to a polished powerful product.

    April 11, 2015 06:46 PM

    Scoble, re-join the open web!

    I got into a long conversation with Robert Scoble on Facebook earlier today. I asked him, as I always do when I get a chance, to put some of his writing on the open web. Not all, just some. Start a WordPress or Tumblr blog for example.

    Not sure why he won't do this, but I'll tell you why I want him to.

    If he did, we'd see the weakness in the model, very clearly. But using the Facebook and Twitter APIs, we might be able to fix it. We could make it so that the open web gets a chance to distribute his ideas, as well as Facebook or some other commercial service (he seems to use many of them).

    Not sure what direct benefit would be for Scoble, other than to know that he gave back a little of the flow that the web has given him. A bit of the attention. Maybe developers can do something with this. But if the people that other people read, like Scoble, don't do this, there's little chance we'll have an open ecosystem for ideas much longer.

    This is what we, as adults, do. We pay a little more than we have to, to help good rise above other kinds of human nature. When you go out for a meal, you don't have to tip, but we do anyway (at least in the US, different traditions elsewhere). We all try to give to charity when we can, and help out people, again when we can. Why? Because it feels good. This is one of the things human beings do.

    We need the people who the web has made rich and/or famous to step up and do their part to make sure there is an open web for years, decades, for generations to come.

    I liken the VC-based tech industry, which Scoble is very much a part of, to the coal industry before we became aware of the damage that fossil fuel does to the climate. In tech, we're early on this, but now is the time to catch the problem before it's much more expensive and takes more time to fix. I said this to Bill Gates as he was amassing his fortune, that a little kindness to the ecosystem now will go much further than all the philanthropy you promise later. I say it to Zuckerberg, and Jeff Bezos, and to Robert Scoble. Be a leader. Show people that freedom matters. Show the tech industry too. Eventually they're going to want more open formats and protocols to build on. How are we going to make them without users like Scoble helping out. We can't create in a vacuum, without users.

    Obviously I posted this on my blog. I could have put it on Facebook. I ask Scoble, if he has a response, to do the same. Put your response on a new blog you start, on Tumblr if you like, it's part of the Silicon Valley ecosystem, or WordPress, another company that's raised huge VC. Let's accentuate the good that tech does, by supporting it. Thanks for listening.

    PS: Robert is already helping the open web by letting me use him as a foil for this discussion. Whether or not he does it, people understand the idea of a Scoble pitching in to help the web that helped him so much. Now they know how important it is that they follow the leadership that Scoble could be providing.

    PPS: I ask Tim Berners-Lee to join me in asking Scoble to come back.

    April 11, 2015 04:44 PM

    Twitter's advertising model

    This has happened a few times for me.

    1. I follow a company.

    2. They start advertising on Twitter.

    3. Now, every time I go to Twitter, their ad is at the top of the page. The same message. I've read it a dozen times. I do not want to keep reading it.

    4. I have a choice, I can get rid of the ad by unfollowing them. I do it with regret, because there was a reason I chose to follow them. I am interested, and I want to keep up on what they're doing. So maybe I don't unfollow at first, or the second or third time. But eventually it seems I always do. I keep meaning to write this post to make sure Twitter and the advertisers understand this.

    5. Because of this I am reluctant to advertise. I was thinking about doing it when I come out with a new product. I think Twitter could be part of my promotion, but...

    April 11, 2015 04:41 PM

    Tim Ferriss

    sushi in japan 7213944688_313c35ad07_k

    sushi in japan 7213944688_313c35ad07_k

    This post shares two short essays that have had a profound impact on my life.

    They explore “lifestyle,” world travel, practical philosophies, and much more.

    Disclaimer: These might make you quit your job… even if you’re the boss. I’m not kidding, as I’ve seen it happen. If it comes to pass, you’ll thank me later.

    To see the movies I rave about in this episode, click here.

    For the two free protein bars I mention, click here.

    Here’s the audio. I hope you enjoy it. Stream below, or you can right-click here to save as an MP3.

    For more from the amazing Rolf Potts, don’t miss our two-hour conversation about everything imaginable. It’s easily one of my favorite podcasts I’ve done. Click here to listen.



    by Tim Ferriss at April 11, 2015 12:31 AM

    April 10, 2015

    Dave Winer

    Node.js programming question

    I've got a bit of node.js code that downloads an MP3 podcast, saves it to a file.

    However, none of the MP3 players I have will do anything with it. So somehow in the process of downloading and saving, it's losing some data.

    In the code below, url points to this file.

    %includeOutliner ("")%>


    Thanks to Kyle Davis in a comment below, we have the solution.

    April 10, 2015 05:26 PM

    Fog Creek

    Performance Budgets for Web Development

    Performance Budgets – Tech Talk

    In this Tech Talk, Dane, a Senior Developer here at Fog Creek, summarizes talks he heard at An Event Apart conference in Atlanta, discussing Performance Budgets in the context of Web Development. He covers what a Performance Budget is and why they’re useful along with details about, an open-source tool for testing a webpage’s performance.

    About Fog Creek Tech Talks

    At Fog Creek, we have weekly Tech Talks from our own staff and invited guests. These are short, informal presentations on something of interest to those involved in software development. We try to share these with you whenever we can.

    Content and Timings

    • Introduction (0:00)
    • What’s a Performance Budget (0:53)
    • Why use a Performance Budget (1:40)
    • Factors Impacting Performance (3:00)
    • Types of Performance Budget (4:00)
    • Overview of (6:18)
    • Resources (8:44)



    I went to An Event Apart, Atlanta and one thing that was actually touched on by five out of the twelve talks were Performance Budgets. So it seems like the obvious thing to kind of summarize and bring back. A lot of the examples, because this is more designer-centric a lot of the examples are taken from website design consultants. It’s not so much like ‘you’re making a new web app so you should do X, Y, and Z’. A lot of it is like, oh you’re working on a new website for a client and they want a flash bang thing. How do you balance that with performance?

    That’s just kind of to give context from where these examples are coming from and this slide deck is basically a summary of the Design Decisions Through The Lens of Performance presentation that was given by Yesenia Perez-Cruz. There’s links to all this stuff on the resources slide at the end.

    What’s a Performance Budget

    A performance budget is using your target load time for a website or web app to dictate the file size of your site’s downloaded assets. The idea behind it is that you think about performance from day one, you set a performance budget early, you measure it throughout the project and you stick to it. A budget is no good if you just go over budget all the time.

    The very high-level summary; take your target load time, multiply it by the expected connection speed and then see your size budget. Once you have your size budget, you can divvy that up budget up amongst your site’s various assets; HTML, stylesheets, web fonts, JavaScript, images. A lot of this is just an approximation. It’s the approximate or average speed of your target user. It’s really useful if you’re targeting for example mobile because then you can have a much better idea of what your customer’s connection speed is going to be and a bunch of really cool quotes.

    Why use a Performance Budget

    “We’ve remade the Internet in our image. It’s obese.”

    There are ludicrously large web sites and broadband is becoming more and more prevalent but especially for mobile sites. Sometimes it’s easy to take for granted your snappy fast 4G connection in New York City when indeed your market is rural Texas or something where there isn’t 4G or whatever the case may be.

    We’ve all been on board with things where performance started as a goal and ended up getting out of control. Performance has a tendency to be one of those goals that’s easier to slip which is disappointing. The example that she used as a consultant is balancing fast, functional and lightweight with beautiful, memorable, on brand, that kind of thing. “Good performance is good design.” There’s all sorts of like pithy quotes that are good stuff to keep in mind.

    This one actually I thought was really interesting. “People will visit a Web site less often if it is slower than a close competitor by more than 250 milliseconds.” Of course, I don’t know what the sample was based on or what types of websites, but that’s not a lot of time before a customer is potentially willing to switch to a competitor. This is obviously important stuff.

    Factors Impacting Performance

    There’s a whole range of things that can impact your website’s or web app’s performance. There are the very basics, like the things that have to be downloaded over a wire into your browser; HTML, stylesheets, web fonts JavaScript, images. Then there’s obviously much more that goes along with that. There’s things like your server’s response time using a content distribution network, cache headers, what’s the bandwidth, the client’s computer resources and blah, blah, blah, blah, blah. It doesn’t matter if you only download 50K if you then do terribly non-performant client-side stuff.

    There’s tons of things that go into a website’s performance but file size is obviously one of them and the context of the performance budgets for the talks that mention them is focusing on asset sizes rather than all of these other things. A lot of these websites were not necessarily static, but largely static. The big point was hit enter on a URL and how quickly is the site loaded and ready to use.

    Think about performance from the beginning not implement the whole site and then worry about it. Establish a performance budget and then document it, communicate it, and test against it because you are only as accountable as you force yourself to be.

    Deciding a page cannot exceed 500K when a mock-up containing three carousels and a full-screen high res background image has already been approved isn’t going to do you a whole lot of good. This is just driving home the point of you should be thinking about this stuff up front, not implementing this big fancy thing and then in the end being like, “Oh crap. It takes like seven seconds to load. That’s no good.” Having a predefined budget is a clear, tangible way to frame decisions about what can and can’t be included and at a suitably early stage in the project.

    A lot of the focus was just recognizing and communicating to clients from the presenter’s perspective the consequence is the thing; like I really want a carousel at the top of the page that has 17 images in it. Well that’s going to make the web site slow. Or, I want to use 16 different type faces on my splashy landing page and that’s going to affect things. There’s a trade-off there.

    Types of Performance Budget

    They summarized two major types of performance budgets. We can use both of them. One is this idea of a user experience budget. Our pages should take no more than 10 seconds to load over a sub-3G connection. Some of them are more technical oriented in terms of how the web site functions. Our pages should weigh no more than 400kb and make no more than 15 requests.

    This article length at the bottom of this image where this image is taken from goes through all this stuff in much more detail. The idea is for whatever reason you’ve decided that our available asset budget is 114kb, how are you going to divvy that up? Html CSS JavaScript uses Web fonts. If you can make a compromise of just using system fonts, okay, you can get read of that 22.8kb of Web fonts and maybe you can put that toward having fancier, higher resolution images or something like that.

    The whole point is just like with a financial budget. You budget things and if you need to take money out of one category you probably have to … If you are going to add something rather to a particular category, that money has to come from somewhere. The same concept is being used here for performance budget.

    Overview of

    What tools are there to do this stuff? If you haven’t already seen it is Amazeballs. This is what it looks like but basically what it does is it lets you set up tests or a series of them against one or more websites and then it will make those requests. It will track things like the developer timeline graph. You can even have it record video. It tells you both from, for example right here we are talking about repeat view so first view and repeat view. With a cold browser cache and a warm browser cache, how long does it take to load the content? How long does it take to get to first render or the first style content on the page? How long does it take for the page to be responsive and ready to use? It’s really cool. There’s this scripts tab where you can actually do things like set up authentication cookies. When I was using this for FogBugz on-demand, I got to set the authentication cookie so that it just goes directly to the list page.

    This is the report card for It’s not that bad. What I ended up using for all of these tests, I tried to look up what is the average US broadband speed? According to apparently the average broadband in the US is about 33mb down and 10mb up.

    Loading with It takes 5.75 seconds before it’s fully loaded with a cold cache and 4.7 seconds before it’s fully loaded with a warm cache.

    You can do all sorts of different cool stuff with it. This is the screenshot of the basically ChromeTools loading thing and it’s awesome. It shows CPU utilization, it shows bandwidth, it shows browser main thread, browser background thread. It breaks down and color codes html assets, this is JavaScript, This is CSS. The green line is first rendered I believe which is like the first time it goes from being a blank white page and the blue line is completely loaded.

    You can drill down and click on any of these and see information about the requests, headers, and all sorts. It also gives you all sorts of breakdowns. This is exactly where your performance budget can make a difference. Contact breakdown by MIME type on first review; 52% percent of what you’re downloading is JavaScript. It weighs 576K roughly. It also will break it down into hard drive so you can say ‘oh man we’re downloading a whole crap load of JavaScript’. It will also break it down by size rather than number of requests. It’s useful to have this kind of stuff.


    That’s a very high level synopsis of it. There’s all sorts of more detail in the slide deck. It’s all linked through here. This is the presentation that I mostly summarized but it was very targeted on this. With is awesome. It’s open source so we can download it and run it ourselves if we don’t want to run it in the Cloud. Another resource you can lean toward is Google PageSpeed. Another cool thing is Grunt-perfbudget. It is a grunt task that uses so that you can say this is my performance budget and actually hold me accountable. So it’s pretty sweet.

    by Gareth Wilson at April 10, 2015 08:44 AM

    April 09, 2015

    Mark Bernstein

    Telegraph Avenue

    Chabon’s wonderful Wonder Boys was an insightful tour of a Midwestern writing program, exploring the essential nuttiness of a profession that works by imagining unlikely and impossible things. Here, we replace the seminar and the publishing house with blaxploitation movies, midwifery, and used records in the deteriorating heart of Oakland, California. I suspect this novel is in dialog with High Fidelity, but I don’t understand either jazz or rock well enough to follow along. It was famously said of Mozart that he wrote wonderfully but with too many notes; Chabon does amazing things with ease but here again there might be a few too many characters engaged in just a little too much incident: I’m not entirely sure we absolutely required the blimp. Still, a terrific example of stringing together a lot of wild stuff to craft something not only plausible but wise.

    April 09, 2015 06:08 PM

    Dave Winer

    News à la carte?

    Doc Searls has a simple idea.

    When he travels he buys newspapers. He can read any paper without buying a subscription. Why didn't this decades-old tradition make it to the web? Maybe it should?

    My thoughts

    It's always interesting to consider new ideas. But this one is too late.

    What people want is articles now. Linked into a river somewhere.

    1. Facebook is a river.

    2. Twitter is a river.

    The only question as far as I’m concerned if The Rest of Us get a river.

    A picture of a slice of cheese cake.

    April 09, 2015 03:57 PM

    Fog Creek

    Where Your Team’s Unresolved Arguments Are Stored

    The New User Options Page

    Fifteen years ago, Fog Creek founder Joel Spolsky’s blog post “Choices” forever changed the way I think about designing software. And to this day, it’s forever changed the way I go about evaluating software. Sure, I might go poke around the key features a bit, but before too long, I head straight for the user options page. That’s where you can see if a team has made the hard choices.

    We at Fog Creek pride ourselves in making trade-offs to keep our products clean and usable. We’ve spent a ton of time and effort polishing the user experience, features, and performance of FogBugz. We refreshed the design and made some subtle but powerful improvements to the functionality. When our well-intended plugin architecture ended up fragmenting the user experience, we deprecated it and did the hard work of rolling the most popular plugins into the core product. FogBugz is now a fast, modern, single-page web app.

    Unfortunately, our user options page told a slightly different story. If you go to your user options page in FogBugz right now, you’ll see the new page, but you can still access the old one via the “Legacy Settings” link at the bottom of the page. There were just too many options on the old version of that page. Twenty, to be exact. Eight of them made the cut. The other twelve fell into these categories:

    • 4 were options that supported deprecated or rarely used features, like discussion groups or the escalation report. We’d done the hard work of editing our actual product, but we’d not edited the options page.
    • 6 were rarely used options to allow you to override defaults, like your browser timezone or the keyboard shortcut key you use for snippets. If you need these options, it’s likely you’d have to contact our (awesome) support team anyway to understand that fact, so they’re better off tucked away on an advanced settings page.
    • And 2 were the ones Joel was writing about: unresolved arguments about how the product should work.

    I’ll treat the last two individually because I think they’re both interesting case studies in user experience design.

    Case Close Action

    Screen Shot 2015-04-02 at 10.53.38
    The first was “Case Close Action.” This setting governs what happens when you close a case from the case detail page. Some time between FogBugz’s inception fifteen years ago and my joining Fog Creek seven years ago, the decision was made that the appropriate thing to do on closing a case was to whisk you back to the list page of your currently active filter (presumably to choose a new thing to work on).

    Longtime Creeker, Dane Bertram, has been a vocal internal proponent of eliminating this behavior. There is no other action in FogBugz that initiates a page navigation automatically. There is no clear benefit to this particular automated action other than speeding up one rather infrequent (for many people) user interaction. I think Dane’s probably right for the majority of FogBugz users.

    But the whisking behavior makes high-volume customer support much easier to do with FogBugz. Shaving off the extra work of manually closing a case and moving onto the next makes a real difference. There’s no right answer here, so the right (hard) thing to do is to make a decision and make a trade-off. We chose to keep the old default (whisking), and keep the user option on the legacy settings page for anyone who finds the behavior annoying.

    What we are not doing is confusing the average user with an option that they’d have to work hard to understand.

    Case Event Sort Order

    Screen Shot 2015-04-02 at 10.53.45
    The second option was “Case Event Sort Order”. When you edit a case, an event gets added to it. The question is: in what order do we display those events: oldest first or newest? This is a question that gets asked and answered all over the place. In Gmail, looking at an email thread, new messages are added to the bottom of the page. Looking at the inbox list, however, the newest threads show up at the top.

    In FogBugz, early on, we decided that new events append to the end of the case, but as the amount of data in our FogBugz instance grew, we often found ourselves having to do a lot of scrolling to get to the most recent (read: relevant) information.

    Also, when you edit a case, you do it in a text box at the top of the page, but when you hit OK, your edit gets appended at the bottom.

    We took some comfort in the fact that user interface designers, even excellent ones, have bumped into this kind of problem in the past. At the Fog Creek-sponsored Business of Software conference in 2009, design guru Don Norman addressed precisely this question in the first five minutes of his talk. “The answer is they’re both perfectly legitimate. We just gotta settle on one of them and keep it.”

    We did not do that back in the day, but we’ve done it now, and we let the user be our guide. When we looked at the data, it showed that a whopping 20% of our users had navigated our old and bloated user options page, found this setting, and changed it away from the default (oldest first). That is basically a landslide victory for newest first. We’re changing the default for all new accounts. Returning longtime FogBugz fans who are used to the old way of doing things are welcome to override this, of course.

    Defending User Experience

    I’m really happy with the new options page, including its more modern design. Why spend time on this at all? Well, at its core, this is what Fog Creek is. This is who we are. In all of our products, we offer a heavily defended user experience. We are allergic to feature bloat. We want to offer thoughtfully designed software, whether it’s the three-year-old Trello or the teenage FogBugz. We hope you see this ethos throughout our offerings, although we mostly hope it never occurs to you in the first place because you’re already too busy using our tools successfully to notice.

    by Rich Armstrong at April 09, 2015 10:12 AM

    April 08, 2015

    Mark Bernstein

    Good Writing

    A lot of harm is done by the notion of “good writing.”

    Right now, I’m reviewing a big pile of papers for Web Science 2015. Many of these are dull and clumsy. The authors are not dull and clumsy – at least, the notional authors, the professors I know; many of the words are set down by students, no doubt, and so few people actually pay attention to the research literature that I suppose it can seem pointless to revise the text when, after all, one could be writing the next paper instead.

    A lot of this writing is bad because it’s too careful: it adheres to tired formulae, it makes no particular claims, it takes no risks. The papers seem to know that no one will pay much attention, to aspire chiefly to avoid being noticed and culled as tall poppies.

    On the flight home from a ghastly Chicago trip I started The Fault In Our Stars, another book that every teenage girl has read but I have not. It’s an interesting contrast to Rainey Royal and Michael Chabon’s Telegraph Avenue: the sentences are not terribly interesting, the imagery is not remarkably original. Nothing much happens and nobody wants anything very much, and yet somehow it’s a page-turner.

    In light of all the storming fulmination over “fun” in SF, I think this needs some reflection.

    I've dusted off the hyperfiction project and plan to propel it forward in the next few days. When we left our young heroes at the end of November, we’d just arrived at the end of the story – the dissolution of the school. I thought we would end as the first shots were fired across those ancient, grassy lawns, but perhaps we do need to see what happens next.

    April 08, 2015 03:51 PM

    Rainey Royal

    A fascinating study of three teenage girls in Manhattan in the 1970s, centered on Rainey Royal: beautiful, obdurate, inconsistent daughter of a jazz musician whose father’s townhouse is filled with his boyfriend Gordy (who sneaks into Rainey’s room in the middle of every night to tuck her in), with her father’s jazz acolytes, and with the absence of Rainey’s mother who decamped several years ago for an ashram. Rainey spends her afternoons (and often her schooldays) in art museums; eventually, she will become an artist who pieces together the possessions of the dead. Her friends are Tina (who often tucks in Rainey’s father – a fact we know though Rainey tries hard not to) and Leah, whom the other girls bully, who lives for science and whose adult life will revolve around lab rats.

    April 08, 2015 03:48 PM

    Dave Winer

    How I got my first iPhone

    I posted this on Facebook last year, and forgot about it until someone Liked it yesterday. Since today is the day all the journalist reviews of the Apple Watch come out, I thought it would be interesting to present this from a user/developer who has to buy his own Apple hardware. And wait.

    It was June 29, 2007. I was a happy Blackberry user. And I was pissed at Apple for creating such a closed phone. I wanted their phone to run Mac software so I could put Frontier on it, and write apps in my scripting language with its object database and great TCP stack. Instead, they said no apps, just make web pages (turns out this was a Jobsian deflection, otherwise known as a lie).

    So I decided to sit this one out. Then I got a call from Scoble. He and Patrick, who was still a cute little kid, had waited overnight and were the first people in line at the Palo Alto Apple store. I was in Berkeley. Scoble said if I came with the cash, he would get me an iPhone. I sighed. OK, I guess this is it. So I went to the bank, got the cash, drove down to the valley, and was in the middle of the incredible media frenzy when Scoble and Patrick came out of the store, to the applause of the Apple people. He threw me my phone, while he did TV interviews. I felt a little churlish, but the first thing I did was go across the street to a coffee shop, and set it up.

    I never used the Blackberry again.

    The Apple Watch reviews

    Reading the reviews of the Apple Watch makes me want to hate the product. I don't like the reporters getting the first shot. I know who they are. They are the people who applaud and cheer at Apple press events. And who won't write anything too real for fear of not getting a review unit next time.

    If Apple blacklisted the WSJ reviewer, for example, how long could he keep his job? You can't do good journalism that way. Gotta wonder why there isn't a Columbia Journalism School investigation of that? In this case it isn't just Rolling Stone, it's a whole industry that is being covered with conflicted ethics.

    The system reeks. Apple should ship the products and let everyone have a chance to review them at the same time. Including people who don't get invited to their press events.

    And any reporter or news org with a sliver of self-respect should return the invites to Apple press events.

    PS: I own a fair amount of Apple stock.

    April 08, 2015 12:48 PM

    April 07, 2015

    Dave Winer

    Talking about our mistakes

    Well the Badgers lost last night, and it was a heart-breaker. But it was also a great basketball game. So much to learn, even in a loss. Which leads me to another interesting topic.

    In tech, we seem to never talk about our mistakes. But we should. Not only because we keep making them, but we keep making them worse and worse.

    A really interesting tweet from Rob Beschizza this morning. "Dijkstra might have been wrong about BASIC, but telling beginner coders to learn HTML and CSS is like telling chess players to eat wood."

    What if...

    I wonder what would have happened if tech had evolved differently. What if instead of Apple adopting Hypercard as the future though it ignored almost everything that was good about the Mac, what if they had embraced something radically different, like Turbo Pascal. And what if networking on the Mac platform had been as easy as HTTP, five years before. We could have had both graphic operating systems and networking emanating from the same place of simplicity. Then a novice programmer would be presented a development environment where Hello World was as simple as typing writeline ("hello world") instead of the mess that of today's stack..

    CSS, HTML, JavaScript

    Today a beginning coder has to deal with a programming environment with three different incompatible languages with very different styles. Why? No one really thought about it. We didn't use the best ingredients we had at the time, for some reason. Why isn't QuickDraw part of the full-stack developers toolkit? Why did we throw that know-how out? And can we avoid doing that in the future?

    We never get dug in on a platform for long enough to actually fix the annoyances. Before that happens the pavement has been ripped up and the streets run in different places and directions, and the buildings we were using to store our data are cut off from the grid.

    We don't talk about our mistakes

    Back to basketball, it's as every class of one and done freshmen were running the NCAA instead of 40-year coaches. We in tech, in an art that matters from an economic and societal standpoint, it's everything we build around, we throw out what we've learned every decade or so. And start over. That's a scandal. We don't talk about it because.. why??

    Probably because no one cares as long as we're creating a few billionaires every year, it must all be working, right?

    Hah. No it's not.

    PS: You see this happening today as some podcasts forget to publish RSS feeds with enclosures. Most still do. We should encourage them to stick with it, because this is a good thing from stacks-of-the-past.

    April 07, 2015 04:19 PM

    Mark Bernstein

    More fun and games

    At Sea Lions of Wikipedia, I’ve been officially dubbed, “the #2 man on the Sea Lion Troupe’s Most Unwanted List, WikiCriminal MarkBernstein.” But much to the chagrin of my Gamergate fans, my recent sanctions for being interviewed by Think Progress making funny faces at the sea lions has been overturned because (wait for it)

    Although the block was proper and the unblock wasn’t, the topic ban this block was enforcing has been vacated so re-blocking doesn’t seem to accomplish much

    But Gamergate has had a marked success elsewhere: they block-voted in the science fiction Hugo Award ballots to nominate lots of right-wing military science fiction and to exclude the dread Pirate Roberts social justice warriors. Hilarity has ensued, naturally, with the non-Gamergate nominees declining the honor and an open campaign for the “no award” option.

    Notably absent from this year’s Hugo ballot will be William Gibson’s The Peripheral and Emily St.John Mandel’s Station Eleven. An SF book is nominated for a National Book Award, and it can’t be considered for a Hugo? A discussion could be had about Lev Grossman’s The Magician’s Land, though that trilogy’s strongest book turned out to have been its second volume, The Magician King. But we’re going to be talking instead about No Award: thanks, guys!

    April 07, 2015 03:08 PM


    We begin before dawn, drawing pails of water for the laundry, in this account of Pride and Prejudice below stairs and the secret life of the Bennet household.

    Sarah, glancing up, hands stuffed into her armpits, her breath clouding the air, dreamed of the wild places beyond the horizon where it was already fully light, and how when her day was over, the sun would be shining on other places still, on the Barbadoes and Antigua and Jamaica where the dark men worked half-naked, and on the Americas where the Indians wore almost no clothes at all, and where there was consequently very little in the way of laundry.

    This could so easily slip into feeble melodrama or a lecture on the evils of the colonial past, but Baker always keeps half an eye on the outer world and her full attention on the inner life of the people down below stairs, people to whom Lizzie Bennet is just one more small, dim and uncaring burden among many.

    April 07, 2015 02:26 PM

    Lambda the Ultimate

    Everything old is new again: Quoted Domain Specific Languages

    Everything old is new again: Quoted Domain Specific Languages, by Shayan Najd, Sam Lindley, Josef Svenningsson, Philip Wadler:

    We describe a new approach to domain specific languages (DSLs), called Quoted DSLs (QDSLs), that resurrects two old ideas: quotation,
    from McCarthy’s Lisp of 1960, and the subformula property, from Gentzen’s natural deduction of 1935. Quoted terms allow the DSL to share the syntax and type system of the host language. Normalising quoted terms ensures the subformula property, which guarantees that one can use higher-order types in the source while guaranteeing first-order types in the target, and enables using types to guide fusion. We test our ideas by re-implementing Feldspar, which was originally implemented as an Embedded DSL (EDSL), as a QDSL; and we compare the QDSL and EDSL variants.

    Neat paper first posted here by Blaisorblade that formalizes the properties needed for using quotation to implement DSLs. Most embedded DSLs use custom operators and lifted conditionals to make embedded programs seem more natural, but quoting enables the use of native operators and conditions, and might lead to more natural expressions of lightweight (possibly heterogenous) staged computations.

    April 07, 2015 01:59 PM

    April 06, 2015

    Reinventing Business

    Holacracy vs. Teal

    (I've been rather absent from here lately, working on the now-complete Second Edition of Atomic Scala. However, more programming-oriented projects are in the queue so posts here might be spotty).

    Here's a nice article on Holacracy. When I took the training a couple of years ago, I found it extremely useful and inspiring, more than worth the costs. But, as often happens in my explorations (especially company visits), something started bothering me over time and I couldn't put my finger on it until now.

    As the article points out, people who don't understand it expect Holacracy -- because it's a form of self-management -- to be a free-for-all, and it's quite the opposite. Holacracy is a process for you to build your own structure, customized for your company (rather than rubber-stamping the same hierarchy used by every organization from the industrial age). So, quite the opposite of having no rules, Holacracy is the way that you create your rules.

    That's where it bothers me. Even though there's a lot of emphasis in Holacracy on not adding rules you don't need. It's probably because of my experiences with Open Spaces, where we create just enough structure to produce interaction, and no more.

    That's not to say Holacracy can't achieve this, but my gut feeling is that there are some reactionary parts of it, trying to prove that it's a real, grown-up thing. In fact, part of the Holacracy contract is about protecting Holacracy, agreeing that you will either do everything in the Holacracy practices, or "officially" back out of it and stop saying you're doing Holacracy (because people like to pick and choose practices).

    While I understand the motivations, I don't care about them. It doesn't serve my goal of creating an amazing organization. Let me be clear, I think Holacracy is a huge step forward and makes important inroads, and may in fact be just what an existing organization needs to transition into a much better organization. Indeed, Holacracy might just be about that transition.

    But it doesn't go far enough for me. I think the brain in my gut is telling me that, while I would much rather work at a Holacractic organization than an industrial-age organization, I ultimately wouldn't be happy there. Although it minimizes the rules, Holacracy is ultimately still about how to create rules, and I guess I just don't like rules -- if we must have them, they need to be only a few, that you can keep in your head and use to guide yourself (like Netflix's "freedom and responsibility"). Or the rules below.

    I've had a fundamental-shift experience in recent months: reading Reinventing Organizations by Frederic Laloux. I will read it again, and I found myself stretching it out because, after years of looking at how to "fix" existing organizational structures, it was such a relief.

    Laloux looks at the history of organizational development in evolutionary terms, considering the environment and what kinds of structures it supported. He classifies these structures by color, and each step forward produces an organization that is able to become larger and accomplish more. He foresees the next evolutionary step as the "Teal" organization, of which he gives a number of examples of existing, thriving companies (including HolacracyOne, LLC, the company that created and promotes Holacracy).

    Here are the three foundations of the Teal organization (lifted from this review):

    1. Self-management:  To operate effectively based on a system of peer relationships, without the need for either hierarchy or consensus.
    2. Wholeness:  People no longer have to show only their “professional” self, or hide doubts and vulnerability.  Instead, a culture invites everyone to bring all of who we are at work.
    3. Evolutionary purpose:  Instead of trying to predict and control the future, the organization has a life and a sense of direction of its own.  Everyone is invited to listen in and understand what the organization wants to become, what purpose it wants to serve.
    Here's a huge difference between Holacracy and Teal. In Holacracy, you figure out roles and responsibilities -- who is able/responsible to make what decisions. But in Teal, anyone in the organization can make any decision (including one that costs the company money), as long as they use the "advice process": you must talk to people who know more about the issue than you, and you must talk to people whom the decision will affect. You can still make the decision even if both groups recommend it (so the company can be very experimental), but one of the few fireable offenses in a Teal organization is not following the advice process. This ability for anyone to make a decision shows just how different Teal is. It's the very thing that I've seen work so well at the Open Spaces conferences that I hold.

    I recently attended a week-long Esalen workshop led by the creators of Cafe Gratitude, where the emphasis was on point 2, wholeness. Although Cafe Gratitude is not a Teal organization (there is a management hierarchy), the focus on wholeness has made it a special place for both employees and customers; I suspect its success is precisely because of this emphasis. They use a practice called "clearing" (nothing to do with Scientology) that each employee experiences at the start of their shift -- you pair with another person and clear each other. They wanted an app, so during the Winter Tech Forum I worked with another attendee and built it; it's here and runs on all devices. The app walks you through the clearing process.

    Holacracy is great, and I will visit Zappos again to see how the largest (so far) Holacracy experiment is progressing. Holacracy has a place in the world, but Teal feels like my color.

    by (Bruce Eckel) at April 06, 2015 10:33 PM

    Giles Bowkett

    Dave Winer

    Tonight, everyone's a Badger!

    First, as an alum of the University of Wisconsin, let me say Go Bucky!

    What a thrill to watch Wisconsin beat Kentucky in the semi-final on Saturday. The level of play was amazing. I loved that many of the Wisconsin players come from Wisconsin, and are seniors. Unlike Duke, their opponent tonight, which is largely a 1-year stop-off point on the way to the NBA. A national team of soon-to-be-pros. "One and done."

    Yesterday afternoon, I saw the Oklahoma City Thunder play the Houston Rockets, another spectacular game, pitting two very different leading players, both guards, at the absolute peak of their game, James Harden and Russell Westbrook. It's clear that the young college players, while great in their own way, have a long way to go before they can play at this level. Almost no one does. They fly and twist and mislead, and make you gasp they're so light and agile. Another thrill.

    Finally last night a game between the New York Knicks and the Philadelphia 76ers, two of the worst teams in the NBA, both going absolutely nowhere. I don't want to go into all the weirdness, but in some ways for these teams, losing is winning and winning is losing. It was basketball at its most laborious and lackadaisical. Worth watching just for its obscurity. This is how far you can fall and still be in the NBA.

    It's worth mentioning because a bit of trivia came up during the Knicks game. There are three current Knicks who played in an NCAA Final. To fall so far. I couldn't think of one. I didn't believe there were any. The answer: 1. Carmelo Anthony of course (doh) on Syracuse in 2003. 2. Cole Aldrich played with Kansas in 2008. 3. Lance Thomas with Duke in 2010.

    If you watch the Final game tonight, as you watch those wonderful young players, some of whom must imagine glory like Harden or Westbrook in their future, but for many this is the highest they'll reach. The NBA is filled with guys who played in the NCAA finals, wondering what happened.

    April 06, 2015 08:34 PM

    Tim Ferriss


    CROP EXAMPLE - Ferriss_Glenn_Beck_IMG_3184_JPG

    “When I turned 30, I knew my life was at a crossroads. It was either over, or I was going to restart.”
    – Glenn Beck [9:10]

    The goal of my blog and podcast is to push you outside of your comfort zone and force you to question assumptions.

    This is why I invite divergent thinkers and world-class performers who often disagree. I might interview Tony Robbins and then Matt Mullenweg. Or I might have a long chat with Sam Harris, PhD, and later invite a seemingly opposite guest like…

    Glenn Beck.

    This interview is a wild ride, and it happened — oddly enough — thanks to a late-night sauna session. I was catching up with an old friend, who is mixed-race, a Brown University grad, and liberal in almost every sense of the word. I casually asked him, “If you could pick one person to be on the podcast, who would it be?”

    “Glenn Beck,” he answered without a moment’s hesitation. “His story is FASCINATING.”

    He described how Glenn hit rock bottom and restarted his life in his 30’s, well past the point most people think it possible. Fast forward to 2014, Forbes named him to their annual Celebrity 100 Power List and pegged his earnings at $90 million for that year. This placed him ahead of people like Mark Burnett, Jimmy Fallon, Leonardo DiCaprio, and Will Smith. Glenn’s platforms — including radio, tv, digital (, publishing, etc. — get somewhere between 30 and 50 million unique visitors per month.

    This interview is neither a “gotcha” interview nor a softball interview. I ask some tough questions (e.g. “If you were reborn as a disabled gay woman in a poor family, what political system would you want in place?”), but my primary goal is to pull out routines, habits, books, etc. that you can use. This show is about actionable insight, not argument for argument’s sake.

    First and foremost, this is a story of entrepreneurship, and whether you love Glenn, hate Glenn, or have never heard his name, there is a lot to learn from him.

    After listening to this (no tirades before, please), I’d love to hear your thoughts in the comments!


    At one point in this episode, we discuss billionaire Peter Thiel, who was previously on the podcast. Here is Peter and my experimental “conversation.” We delve into his principles of entrepreneurship, building massive companies, value creation, and competition, among other things (stream below or right-click here to download):

    This podcast is brought to you by 99Designs, the world’s largest marketplace of graphic designers. Did you know I used 99Designs to rapid prototype the cover for The 4-Hour Body? Here are some of the impressive results.  Click this link and get a free $99 upgrade.  Give it a test run..

    This episode is also sponsored by The Tim Ferriss Book Club. In my book club, I highlight amazing books that I love. The most recent addition is We Learn Nothing by Tim Kreider. You can find all of the books at or here.

    QUESTION(S) OF THE DAY: For you, what were the most valuable takeaways from this episode? Please let me know in the comments.

    Scroll below for links and show notes…


    Selected Links from the Episode

    Show Notes

    • The story of Glenn Beck’s sole class at Yale [8:15]
    • Facing the dark periods, and how bedtime stories helped him identify his alcoholism [17:10]
    • How to avoid the temptations of the past [20:22]
    • On common misconceptions [32:15]
    • Suggestions for finding common ground during debates [37:45]
    • Glenn Beck’s most often gifted book [41:30]
    • Why Glenn has made the decision to be less divisive [45:30]
    • Advice for becoming great on radio (or in audio) [49:00]
    • “What controversial thing do you believe that few people agree with you on?” [53:30]
    • What to focus on when building a fast-growing company [1:03:00]
    • Why he sometimes asks people “How is your soul?” [1:15:05]
    • Morning routines and habits [1:17:50]
    • What makes Glenn Beck effective as the center of a $90-million+ organization [1:22:45]
    • “Who’s the first person to come to mind when you think ‘successful?'” [1:26:50]
    • Glenn Beck’s fascination with Orson Welles and the story of Citizen Kane [1:28:05]
    • On Walt Disney [1:34:25]
    • Glenn Beck’s advice to his 30-year old self [1:38:25]

    Podcast Listener Questions (Submitted via My Facebook Page)

    Matt Brand – “If you were to be theoretically reborn as a disabled gay woman in a poor family, what political system would you want in place?” [1:43:05]

    Alex Kirby – “What are some of the things we can do to ‘rebrand’ capitalism and encourage entrepreneurship here (in the US) and abroad?” [1:39:35]

    [Name sadly inaudible] – “If you were to leave people with one piece of advice, or a question they could ask themselves, what would that be?” [1:44:35]

    People Mentioned

    by Ian Robinson at April 06, 2015 08:33 PM

    Fog Creek – Interview with Peteris Krumins

    In, we chat with developers about their passion for programming: how they got into it, what they like to work on and how.

    Today’s guest is Peteris Krumins, co-founder and CEO of Browserling, an online cross-browser testing service. He’s also the author of ‘Perl One-Liners‘, a book about getting things done quickly on the command line with Perl. He writes regularly about software development on his blog.

    Peteris Krumins
    Location: San Francisco, US
    Current Role: CEO of Browserling

    How did you get into software development?

    I’ve been playing with computers since around the age of 6 when I first got access to a 386 or 486 computer at Mom’s work. The first time I sat at a computer I was completely hooked. From then on I was dreaming every day to have my own computer. It took me a while to get a computer and until I did I tried to get access anywhere I could. I made a ton of friends who were interested in computers and used their computers. I even pretended to be a student at several universities while being just a kid to gain access to the Internet!

    I actually got a laptop first. I had a friend called Zombie and he was this amazing sysadmin. Somehow he had a spare laptop and he gave it to me for free. I still have it. The IBM Butterfly laptop (ThinkPad 701CS). It had 8 MB of RAM, 800MB disk, and I dual booted Windows 95 and OpenBSD on it. I later upgraded it to 40MB of RAM. It also had a thinnet PCMCIA network adapter card and my first home network was 10Mbit/s thinnet. For those of you who haven’t heard of thinnet, it’s Ethernet over coaxial cable, aka 10BASE2.


    I finally got my own computer much later though at the age of 15. It was a killer machine running a 400Mhz Celeron with 256MB of RAM, 8GB hard drive, a 3D Blaster Banshee 16MB video card, and a 17” 75Hz 1024×768 CRT screen. The computer was running Windows 98 that just had come out.

    I’m 100% self-taught. I started with a bunch of languages at once. When I got my Celeron computer I already had a clear understanding of what I wanted to do. I wanted to make web pages so on the first day that I got the computer I started writing in HTML, JavaScript, and CSS. At first I didn’t quite understand how websites operated and didn’t know about server-side languages so it took me some time to understand that I needed a web server to run websites. I was hosting my sites at Angelfire at first but later I set up my own Linux Slackware web server with PHP and MySQL. I also wanted to be a hacker so I learned C and Assembly. I spent ridiculous amounts of time on IRCNet, so I learned mIRC scripting as well and created my own IRC client in Visual Basic.

    Tell us a little about your current role

    My current role is CEO of Browserling. I started Browserling in 2011 in the Bay Area together with a friend. My typical day involves writing a lot of code, managing servers, working with my customers and my employees. I love what I do and I currently can’t imagine myself doing anything else than running a software company. I was a huge Paul Graham fan and his essays encouraged me to start a startup.

    I’m currently 100% focused on growing the business. I don’t do any side projects and have stopped writing books as that would shift my focus away from the company. The number one rule of building a successful company is having 100% product focus. I’m currently growing revenue and building an international remote team at Browserling. I just hired a great engineer in Ukraine and I’m expanding the company to non-English markets.

    I’m also solving a lot of technical problems, such as how to efficiently stream browsers running on virtual machines to clients and how to capture hundreds of browser screenshots per second. I love working with servers and I’m planning to move the server stack from EC2 and Rackspace cloud instances to real hardware. Cloud servers are great when you just start but once you get to a certain point it makes a lot of sense to switch to your own hardware. It saves a lot of money and increases performance.

    When are you at your happiest whilst coding?

    I’m happiest when I’m in the zone and when I get things done. I’m able to get into zone quite often and I can share my secret. I’m up during the night and I sleep all day. Nighttime is the perfect time for being in the zone. Night eliminates all distractions and keeps you alert and focused. Another secret to being in the zone is closing Twitter, Facebook, Skype, GTalk, and G+. When you’re in the zone, you don’t want be disturbed by sudden sound alerts or messages.


    What is your dev environment?

    I have a dual Windows/Linux setup. I use Windows 7 on my primary workstation and I SSH into my Linux servers. I just built a brand new workstation last month. I got an Intel i7 4790K and overclocked it to 4.7Ghz.

    Then I have a Linux firewall server, a Linux file server and a Linux development server. I mount the Linux file server on Windows over Samba, and it runs a bunch of drives in RAID6, which allows for two drive failures. All these Linux servers run Slackware. I love the simplicity of Slackware. I go with minimalistic installs and then add only the packages that I need. So for example the firewall doesn’t have much more than Bash, Vim and Iptables. The file server has Bash, Vim, Cryptsetup and Samba. And the development server has everything I need for development.

    I use Vim on Windows and Linux, and gVim and Visual Studio on Windows. I can’t imagine doing Windows application programming in an environment without IntelliSense. I have a highly customized Vim and I use two dozen plugins, such as:

    • surround.vim (quickly edit surrounding text)
    • repeat.vim (repeat surround commands)
    • matchit.vim (extend what % key matches)
    • snipmate.vim (code snippets)
    • nerd_tree.vim (explore filesystem from vim)
    • a.vim (alternate C and H files)
    • ragtag.vim (mappings for editing HTML)
    • tabular.vim (aligning text)
    • bufexplorer.vim (working with buffers)
    • python.vim (better python support)
    • exchange.vim (exchange text quickly)
    • abolish.vim (substitute words)
    • speeddating.vim (increment dates)

    and many others.

    On Windows, I couldn’t live without:

    • Total Commander (file manager)
    • Visual Studio (can’t beat IntelliSense)
    • SQLyog (GUI manager for MySQL databases)
    • SQLiteSpy (GUI manager for SQLite databases)
    • pgAdmin (GUI manager for Postrgres databases)
    • WinSCP and SecureFX (secure FTP clients)
    • Putty and SecureCRT (SSH clients)
    • KeePass (password manager)
    • ClipX (clipboard manager)
    • Launchy (program launcher)
    • Locate32 (file indexer)
    • allSnap (window manager)
    • AutoHotkeys (automate tasks and programs)
    • Virtual CloneDrive (mount disk images)
    • IsoBuster (extract disk images)
    • ImgBurn (image burner)
    • Enounce MySpeed (speedup or slow down videos)
    • Hex Workshop (hex editor)
    • VMWare Workstation (virtual machines)
    • Cygwin (unix tools)
    • UltraMon (multi-screen support)
    • Beyond Compare (diffing tool)
    • Tclock2 (better clock)
    • Fineprint (printer proxy)
    • SumatraPDF (better PDF viewer)
    • AviSynth (edit videos programmatically)
    • ffmpeg (convert videos)
    • VirtualDub (convert and edit videos)
    • WinDirStat (disk space visualization)
    • clink (better cmd.exe)
    • IDA Pro (debugging)
    • Photoshop
    • Sysinternals tools

    On Linux, I couldn’t live without:

    • samba (mounting Linux on Windows)
    • tmux and screen (persistent shell sessions)
    • all the standard UNIX utilities (awk, sed, grep, head, tail, uniq, sort, etc.)
    • perl (rapid prototyping, quick hacks, one-liners)
    • iptables and nftables (firewalling)
    • htop (better top)
    • mtr (better traceroute)
    • multitail (tail multiple files in multiple windows)
    • nc (netcat, TCP/IP swiss army knife)
    • iftop (bandwidth monitor)
    • ack (better grep)
    • ipcalc (network address calculator)
    • pv (pipe viewer – UNIX pipe progress bar)
    • rsync (backups)
    • ncdu (disk space visualization)
    • curl (http client)
    • nmap (network scanner)
    • tcpdump and wireshark (for network debugging)
    • sysdig (strace + lsof + tcpdump combined)
    • youtube-dl (downloading all online videos)

    and many more tools.

    I code sitting. I’ve never tried coding standing or walking. That just seems too weird. When I’m in the zone, I listen to Vocal Trance stream from But only if I’m in the zone. Otherwise music is too distracting. I couldn’t code without a Microsoft Natural keyboard. I’ve had mine for over 10 years. It still works well but is showing age.

    I take a lot of notes when trying to figure something out. As soon as I have a more complicated problem, I try to break it up into smaller sub-tasks that can be easily solved. Then I create a ToDo list for the tasks, get them done one by one, and cross them out. Actually I’ve several ToDo lists of long-term tasks (next 1-2 years), mid (next few months) and short-term tasks that I’m doing right now.

    What are your favorite books/resources about development?

    I’m crazy about computer books and science books in general. Every few months I spend a day researching the latest literature and buying the most interesting titles. I’ll list my top 5 coding, development and computer books.

    • The New Turing Omnibus
      A must read for anyone interested in computers. This excellent book contains 66 short essays on the most important and interesting computing topics, such as compression, Turing machines, formal grammars, non-computable functions, and neural networks. The writing style of this book is casual and it contains almost no math. It’s my favorite book of all time.
    • The Little Book of Semaphores
      This book teaches how to think about multithreaded execution and how to solve synchronization problems. I highly recommend it, especially if you’re self-taught. It leads the reader step by step through a series of classical and not so classical synchronization problems. It’s great fun to work through the problems and I’ve been recommending it to everyone ever since I found it.
    • Programming Pearls and More Programming Pearls.
      Classic programming books. Jon Bentley knows how to write clearly and enthusiastically about algorithms. These books are timeless and they teach you how to reason about problems, break them apart, and efficiently implement the solutions. You’ll pass the Google interview if you read these two books.
    • The Little Schemer
      The Little Schemer teaches you a little bit of LISP in the most fun style ever. The book is a dialogue between you and the authors about hundreds of tiny Scheme programs and it teaches you to think recursively. This book will make you think and will stretch your mind a little. It’s one of the most fun programming books ever written.
    • The Elements of Style and The Elements of Programming Style
      The Elements of Style is not exactly a development or coding book but a book on writing. To be a great programmer you need to communicate clearly and writing skills are essential. It’s 100 pages long and you can read it in one evening.
      The Elements of Programming Style is a classic programming book by Kernighan and the form of this book is strongly influenced by The Elements of Style. It’s an old book but mostly everything it teaches still applies today. It contains 70 rules of programming such as Write clearly – don’t be too clever. Say what you mean simply and directly. Choose a data representation that makes the program simple. Let the data structure the program.

    And I just got started. I could easily do my top 100 favorite books. Message me if you need book advice or want to talk books with me!


    What technologies are you currently trying out?

    I’m a big Visual Studio fan so I just downloaded Visual Studio 2015 Preview and have been playing with it. I also just installed Windows 10 Preview on a virtual machine. Since I do so much cross-browser testing, I’m really looking forward to see what Microsoft’s new browser called Spartan will offer.

    Google just open-sourced Kythe, that should be a way better code indexer and explorer than anything else out there. I heard about it last year already from a Googler friend and I have been impatiently waiting for it. I’ll be trying it on Linux Kernel’s source this weekend.

    If I had more time, I’d combine Oculus Rift with a motion platform to build a true virtual reality rig.

    When not coding, what do you like to do?

    I like to keep myself in shape. I do track and field. I’ve found that sprint workouts are better than coffee. On the days when I do 10x60m sprints I get energized for 10-12 hours and I code like a beast all night long. I also like to compete in track meets. 400m sprint and 800m race are my favorite distances.

    What advice would you give to a younger version of yourself starting out in development?

    I can think of four bits of advice for my younger self:

    • Get things done quickly, efficiently and move on.
    • Don’t do things that don’t create value.
    • Start a programming blog much earlier.
    • Release early and often.

    This post is also available in Chinese, Portuguese and Russian.

    Thanks to Peteris for taking the time to speak with us. Have someone you’d like to be a guest? Let us know @FogCreek.

    Recent Interviews

    Salvatore Sanfilippo
    Hakim El Hattab
    Phil Sturgeon
    Leah Culver

    by Gareth Wilson at April 06, 2015 12:18 PM

    John Udell

    Transform your email server into a collaboration platform

    I once ran a small Web development team at Byte magazine that became my laboratory for an experiment in group communication; that, in turn, became my 1999 book "Practical Internet Groupware." At the core of that book was a notion that for teams -- and for whole companies -- it would be useful to flip the default privacy setting on electronic communication in the workplace.

    Email was fairly new then, but it had already established a culture in which messages were expected to address individuals, not teams or the whole company. Restricting the scope of messages seemed to make sense. The damage that Reply All could do was already apparent. How could everybody talk to everybody at the same time?

    To read this article in full or to leave a comment, please click here

    by Jon Udell at April 06, 2015 10:00 AM

    Greg Linden

    Interview on early Amazon personalization and recommendations in late 1996 in mid-1997
    I have a long interview with the Internet History Podcast mostly about Amazon around 1997, especially the personalization, recommendation engine, and data-driven innovations at Amazon, and the motivation behind them.

    I think the interview a lot of fun. It gives a view of what Amazon was like way back when it was just a bookstore only in the US, had just one webserver, and we barely could keep the website up with all the growth.

    Lots of history of the early days of the web, well before CSS and Javascript, before cookies were even widely supported, and before scale out, experimentation and A/B testing, and large scale log analysis were commonplace.

    Give the podcast a listen if you are interested in what the Web looked like back in 1997 and the motivation behind Amazon's personalization and recommendations.

    by Greg Linden ( at April 06, 2015 08:33 AM

    April 03, 2015

    Tim Ferriss



    “Tim Kreider’s writing is heartbreaking, brutal and hilarious—usually at the same time. He can do in a few pages what I need several hours of screen time and tens of millions to accomplish. And he does it better. Come to think of it, I’d rather not do a blurb. I am beginning to feel bad about myself.”
    – Judd Apatow

    This post might change your life.

    It contains a short audio essay titled “Lazy: A Manifesto.”  I plan on listening to it every Monday morning.

    We Learn Nothing by Tim Kreider, a dazzling collection of humor and insight, is the newest book in the Tim Ferriss Book Club. I loved this book so much that I reached out to Tim and we produced the audiobook together. “Lazy: A Manifesto” is one small chapter.

    If you want to stop feeling rushed, this might be the medicine you need.

    If you want to burst into hysterical laughter in airports and freak out everyone (as I did), look no further.If you want to say “That’s exactly how I feel, but I’ve never had the words to express it!” this book delivers.  There’s a chapter for everyone.

    Click here to download the brand-new audiobook of We Learn Nothing.

    Here is the sample essay, “Lazy: A Manifesto” (right-click here to download, or stream below):

    More on Tim from a Pulitzer Prize winner:

    “Tim Kreider may be the most subversive soul in America and his subversions—by turns public and intimate, political and cultural—are just what our weary, mixed-up nation needs. The essays in We Learn Nothing are for anybody who believes it’s high time for some answers, damn it.”
    – Richard Russo, Pulitzer Prize-winning author of Empire Falls

    Of course, Tim is a phenomenal cartoonist, and I wouldn’t want you to miss the artwork, so I pow-wowed with his agent, who kindly provided a ton of his cartoons for sharing with you. You can download a treasure trove (about 150MB) by clicking here.

    Enjoy! Don’t miss this one.

    Click here to download the audiobook (which we produced)
    Click here to get the print or Kindle edition

    Curious which other five books are in the Tim Ferriss Book Club? Here’s the full collection.

    by Tim Ferriss at April 03, 2015 06:27 PM

    Fog Creek

    Hystrix Dashboard – Tech Talk with Demo

    Hystrix Dashboard Talk and Demo

    In this Tech Talk, Blake, a Developer here at Fog Creek talks about Netflix’s Hystrix, a latency and fault tolerance library for distributed systems. He gives an overview of it, before giving a quick demo of a working Hystrix Dashboard, showing a visual way to monitor your systems using Hystrix.

    About Fog Creek Tech Talks

    At Fog Creek, we have weekly Tech Talks from our own staff and invited guests. These are short, informal presentations on something of interest to those involved in software development. We try to share these with you whenever we can.

    Content and Timings

    • Introduction (0:00)
    • The Circuit Breaker Pattern (0:57)
    • Hystrix Dashboard (5:14)



    I’m going to talk about Hystrix today. Hystrix is one of Netflix’s open-source initiatives. Netflix does a lot of things in micro-services. They have services all over the place and everyone here who has watched Netflix. They’ve seen the service go into a flaky mode where it’s like low-res for a while and then pop back. You’re still watching the movie the whole time, so they’re able to handle little failures pretty well, and this is part of one of the tools they use for that. The textbook definition of Hystrix is “it’s a latency and fault tolerance library for distributed systems.”

    Hystrix is a bigger effort. Today I’m going to just talk about Hystrix Dashboard. The dashboard could be used in any language it’s just an API end-point and you can use it to monitor your own software.

    Also, for this next slide in here to brag, I’m a contributor. I changed a mistyped JavaScript function name once. This is, yeah.

    The Circuit Breaker Pattern

    The root of all this is the Circuit Breaker pattern. This is the decision pattern that I’ll describe here and so you can imagine you have lots of different browsers, maybe mobile apps hitting our API end-point. If you move towards more of a micro service architecture you might have lots of different services behind the firewall that you’re going to consume by your main and API endpoints. Say the API is going to go off and fetch your favorite color from the favorite color service and then it’ll go off to the web somewhere. It might do some other crazy stuff, and we all know what happens when one of these things fails.

    We get a total failure, and what we’d rather see is a more graceful failure. Here you can see the bridge is clearly in trouble. There was a bad problem obviously but maybe nobody died here. I put together a demo here using some Go. There’s a library out there called Hystrix Go. Basically, when you use this, I’m sure they have this for .Net and for other languages too, this is just the one that I decided to focus on.

    Hystrix Go is a library that you include in your project and you’re basically going to give a command that it’s going to run to fetch remote data. Or to interact with remote systems somehow. You wouldn’t use this pattern everywhere. It’s just when you’re aggregating different responses from remote systems and sometimes some of these end points aren’t crucial. Like I said, Get Favorite Colors. Maybe if that’s not available or if it’s taking too long you could just return not available right now and then you can put that into the API endpoint and then the user will just see oh that’s not available right now. They hit refresh, they hit refresh it eventually comes back. This is basically how it looks. I’m going to make my remote call and I’m going to give it two functions. The first one is the command that I want it to do and the second one is what to do if that fails.

    There’s different ways to define failure. One way to define failure is like if an end point’s taking too long to respond. Maybe you set the threshold at one second for this specific endpoint. Or maybe if it fails, if it actually returns a 500 error or maybe if it returns a 500 error three times in a row. You can define your threshold for errors, your percentages, and the time outs all that per end point if you want to.

    We take the previous slide and we turn it into this. Service B is now failing for whatever reason. For a little while, we’re going to be returning to the fallback. Again, so the circuit breaker, if you’re familiar with what circuit breakers are, I mean we have this in your electrical panel. If there’s a surge, the circuit breaker opens up and now no traffic, nothing gets through. No electricity gets through, it’s a fail-safe.

    In the software world a circuit breaker when it’s closed… communication’s going back and forth and then when the framework determines a problem it opens up the circuit breaker and no traffic will go through there. In the terms of this library right here it will actually keep the circuit breaker open for five seconds, ten seconds whatever you configure it to.

    Once it’s tripped it stays open until it’s comfortable to try again. Until the framework’s comfortable trying again. You can imagine how when we see certain types of errors in production they kind of spiral out of control. This is a way of if ten clients are going towards an end point that’s already a little bit overrun, we’re going to open them up, each end point will notice it’s not getting good response. They’ll all backoff and, at some point they’ll start going back in there. Because this whole thing’s configurable you can then decide which end points you’re okay with opening their circuits and which aren’t, so you have a more gracefully failing service.

    This is what I was describing here so you have three actors here. You have the client which is the browser, the mobile app, or any kind of consumer of your API. The circuit breaker, which, in this case, is the Hystrix Go library and my individual commands that I’m wrapping with it. The supplier is the end point that I’m getting data for to aggregate and ship out of the API.

    You can see time is moving down in this graph here. At first things are great. You can see my arrow. The first part here things are great. Second part we see a time out and the library will say, “Okay, I’m watching you.” Second one there’s another time out, we’re okay but at this point two time outs in ten seconds? It’s going to say, “This is no good.”
    It trips the breaker, which means it opens it up and then the one, two, three, fourth request comes in. The breakers’ open we’re not even going to try the end point. It’s going to just return to the “This is not available right now” page.

    Hystrix Dashboard

    That’s what Hystrix does and now to switch over to the actual dashboard. If I put this in front of anyone here that doesn’t know what this is I could ask you well, which end point would you say gets the most traffic? It’s pretty clear that this top, left one, VideoMetadataGetEpisode does. It’s because of the size of the green circle. Or if I told you that you’d know from then on.

    I like this UI here in that you can get a quick glance of it and see kind of what’s going on and then you can look more closely once you figure out which of these node’s you want to focus on. When there’s a failure these circles turn red and when there’s lots of failures they’ll turn more and more red.

    I also want to mention in this, here, Netflix has more than ten servers. What they have is, in fact, here you can see this first one they have 476 different VideoMetadataGetEpisode services out there on their network. They show you the 90th percent time. The 99th and the 99.5 percent time. They show the circuits closed which is green which is good. Let’s dive down more into exactly what you’re seeing here.

    You can look at this you can see whatever you need to see. You can stare at this graph when it’s moving and it’s cool to see but then you can, you see a problem you know exactly you get a lot more information from this. Like I said, the size and color of the circle tells you health and traffic volume. You have two minutes of request rates. You have you get to see how many hosts are running with this service and when you see a circuit closed,
    if they’re actually, if they had 476 servers it’s not all or nothing. Each node that’s hitting those services is deciding if that is open or closed. It will say, like if half of them were open it will say, “200 and something open. 200 and something closed.”

    It will show you “app is starting to fail.” Because I just mentioned that they have tons of services there, they have a separate service called Turbine, and what Turbine does is, instead, if you have a single host your single host can go right to the dashboard.
    The dashboard actually pulls in data from the single host. Once you have 476 of these or any two of them you can feed those into Turbine. Turbine aggregates them all and spits out a single combined feed to the dashboard.

    This is Hystrix dashboard when you have nothing right when you get here and in here it shows that it wants to, it’s asking you for a Turbine stream. In this case I don’t have Turbine set up I have a single, Go service that’s just got the Go Hystrix library or Hystrix Go I can’t remember which it is.

    I’m going to go ahead and show you, now here, this is a lot of misbehaving services but it’s a lot more interesting to look at then what you saw before. Here you can see here I have… you can’t see my thresholds here but the APISlowestServiceEver.

    I think I have that timing out for a second and I think I have it set to every response takes two seconds to respond so that circuits open. If there’s a problem in production you come look at this you can see the SlowestServiceEver is being slow once again.

    Then you can see relative volumes with everything else here. Some of these are failing and getting back into a good state. Failing again. Up here, you can sort by error then volume, alphabetical. When you have what, fifteen? ten, twelve? Maybe you don’t need to sort a lot but when you have a whole bunch of different services this becomes more useful.

    Down at the bottom this is more on thread pulls which I don’t know if this applies to Hystrix Go. I don’t think they implemented this but the thread pull thing is where you can have, you can say like ten clients can access this end point at once. And then they mean ten threads from the same host. You can limit it. Concurrent requests I guess, to an end point.

    That’s it. Getting Hystrix Dashboard up and running takes no time at all. You just drop this thing in a TomCat instance and it just starts working. And then you just have to, in fact there’s really no configuration because you’re going to point it to the different end points that you want to watch.

    by Gareth Wilson at April 03, 2015 12:41 PM

    Dave Winer

    Forking as a plug-in API

    In the back of my mind while exploring all the JavaScript editors we could use as the primary text editor in MyWord I was thinking wouldn't it be cool if there was a way to do plug-in editors. That way the sysop of a MyWord site could decide on one editor, or even give users a choice. Maybe even for each post a different editor!

    This is something developers always do. We abstract. We have to do it, internally we have to figure out how many levels of options a user can have for pretty much everything. Can you have more than one file open? Can the OS have more than one user? Can you do one task at a time or many?

    Joel Spolsky wrote about this in a humorous way in the early days of blogging, he called people who over-abstract architecture astronauts. Benji Smith wrote a fantasy about abstraction, very funny and so true.

    If JavaScript had an easy way to do plug-ins on the client side I probably would have done an architecture, but like the editor situation there are a number of different approaches, and none of them have gained consensus, none appear to be a quick half-day thing. I got spoiled in Frontier. Architectures are cheap when all the data and code are in object databases.

    Anyway, I found an Indiana Jones way to do it, it's almost as good as an official plug-in method. Fork one file in the MyWord Editor repository and replace it with your editor code. Should be able to do anything with it. You're laughing. I've become a Unix dev. Haha. I am laughing too. Now you have to rebuild my app to extend it. A few years ago I would have sworn I would never do this.

    I have a feeling we'll figure out a better way later. Or perhaps we side-step the issue by finding one JavaScript editor that's good enough to make our standard, without worrying so much about choice. It's always good to have choice, of course, but there are always other things to do, and if you had choice on everything, then you wouldn't have anything. Just frameworks. (Which is what seems to be happening elsewhere in JavaScriptLand nowadays.)

    April 03, 2015 08:16 AM

    Offense on principle

    I was telling a story the other day about shaming on the net, and how far we had gotten from the ideal, and quoted a correspondent of this column from a post in November 1994. I had written a story a few days earlier comparing software platforms to Chinese households and had expressed pleasure that I had not been excoriated for stepping up to the line of political correctness.

    In 1994 my blog posts were sent via email in addition to being posted on the web. One of my correspondents, a self-described "ardent feminist" said something profound. "I try not to get offended on principle." I still remember getting the email, however unfortunately I don't remember who sent it.

    I try not to take offense on principle

    That one sentence carries so much information about the process of taking offense that has been dominating discourse on the net. There are two levels beyond the ideal:

    1. Taking offense on principle. I wasn't actually offended in a body chemistry way by what you said, but I thought it through and realize I should be offended, so I act offended.

    2. Even worse, I thought it through and realize I could be offended. Since being offended is the position of power in net discourse (what did I actually win?) I look for a false context in order to act as if I was offended. Sigh. In other words, not only isn't your body hurting with offense, but you can't think your way to being offended. You have to find a way to cast my words, different from my intent, to act offended.

    Pick your battles

    These days, much of what passes for rage on the net falls into the second category.

    It would be so much better if people only expressed offense when it's real pain they're experiencing, and then only when absolutely necessary. "Pick your battles carefully" is another useful motto. The air is already thick with offense. Can you in some way provide an antidote?

    April 03, 2015 07:19 AM

    April 02, 2015

    Greg Linden

    Quick links

    What I've been thinking about lately:
    • "The chip is so low power that it can be powered off energy capture from the body ... 35 microamps of power per megahertz of processing ... and less than 200 nanoamps ... in deep sleep mode" ([1])

    • "Forgetting may be nearly as important as remembering in humans" ([1])

    • Only 40% of people use maps on their smartphone ([1] [2])

    • OkCupid and Dataclysm: "In the age of Big Data, the empirical has deciphered the intimate" ([1])

    • Cross functional teams might seem slower when you're in them, but, long-term, are more productive ([1])

    • Very good article on mostly evil uses of personalization ([1] [2])

    • "Fake accounts are given a veneer of humanity by copying profile information and photos from elsewhere ... [and] a picture of a beautiful woman" ([1])

    • "Because almost no one patches their BIOSes, almost every BIOS in the wild is affected by at least one vulnerability" ([1])

    • Cracking by forcing non-random memory errors, just about all RAM chips currently used are vulnerable ([1] [2] [3])

    • Computer security "backdoors will always turn around and bite you in the ass. They are never worth it." ([1] [2])

    • "Facts can only do so much. To avoid coming to undesirable conclusions, people can fly from the facts and use other tools in their deep belief protecting toolbox" ([1])

    • Why TV is losing viewers, the ads are annoying: "Decline caused by a migration of viewers from ad-supported platforms to non-ad-supported, or less-ad-supported platforms" ([1])

    • "The same dysfunctional folie a deux playing out between credulous tech media and even more credulous VC investors" ([1])

    • Does the difficulty of building intelligent systems grow exponentially as we make progress? That question has big implications for whether we should expect (or fear) an AI singularity. ([1])

    • Very fun version of Family Feud using Google search suggestions ([1] [2])

    • Do you know what you don't know? Try this confidence calibration quiz. ([1])

    • Love this quote: "I have thrown away a number of successful careers out of boredom" ([1])

    • Humor related to recommendation systems: "An exciting new system that takes all the bother, all the deciding, all the paying—all the shopping—out of shopping." ([1])

    • Two SMBC comics related to AI ([1] [2])

    by Greg Linden ( at April 02, 2015 06:05 PM

    Dave Winer

    It's the powerlessness, dummy!

    Yesterday Marc Benioff, CEO of Salesforce, said this: "There is a third political party emerging in this country called: 'CEOs.' More than 100 are already involved in turning Indiana around!"

    Something about that didn't feel right, so I said so. A discussion ensued.

    What is it that doesn't feel right? Well, who owns the other two political parties, if he's starting the third one? Same people. So if we're going to start another political party, shouldn't it be one where my voice matters?

    It's so fucked up. Here's a guy who is interviewed on TV, has a conference that takes over the city of SF. He donates to hospitals and they change the name to Benioff, as if it were a member of his family. He is one of the most listened-to people there are. And now he's boasting, on Facebook of all places (one of the few places it feels like my voice might matter just a bit, I know it's an illusion, planned by psychiatrists) that he's formed the third party and guess who it represents? The same people as the other two.

    You could say that's just the way it is, and that's the way it always has been, but it doesn't mean I have to like it, and it doesn't mean it's always going to be that way.

    I don't like tech, for this reason. They've so simplified the world, it's just what matters to them that matters. 100 CEOs signed the petition. That's the size of the world for Benioff. I know his PR people say otherwise, but I think a little truth just leaked out there.

    One more thing: You want a real crusade Mr Benioff -- let's get rid of Citizens United and restore some of the power to the people. That would show real conviction.

    PS: Liz Gannes calls out the tech leaders for hypocrisy. She makes a good point. While they're taking political action against Indiana discriminating against gays, they're not doing much about gender discrimination in tech. However, no mention of age discrimination in her piece, and in another piece by the same author today she refers to seniors as "old fogies." Tech, including reporters, needs to learn something more basic -- respect for people.

    April 02, 2015 03:22 PM

    Decyphering Glyph

    Not Funny


    Today’s “joke” from the PSF about PyCon Havana was not funny, and, speaking as a PSF Fellow, I do not endorse it.

    What’s Not Funny?

    Honestly I’m not sure where I could find a punch-line in this. I just don’t see much there.

    But if I look for something that’s supposed to be “funny”, here’s what I see:

    1. Cuba is a backward country without sufficient technology to host a technical conference, and it is absurd and therefore “funny” that we could hold PyCon there.
    2. We are talking about PyCon US; despite the recent thaw in relations, decades of hostility that have torn families apart make it “funny” that US citizens would go to Cuba for a conference.

    These things aren’t funny.

    Some Non-Reasons I’m Writing This

    A common objection when someone speaks up about a subject like this is that it’s “just a joke”. That anyone speaking up and saying that offensive things aren’t funny somehow dislikes the very concept of humor. I don’t know why people think that, but I guess I need to make it clear: I am not an enemy of joy. That is not why I’m saying something.

    I’m also not Cuban, I have no Cuban relatives, and until this incident I didn’t even know I had friends of Cuban extraction, so I am not personally insulted by this. That means another common objection will crop up: some will ask if I’m just looking for an excuse to get offended, to write about taking offense and get attention for it.

    So let me assure you, that personally, this is not the kind of attention that I want. I really didn’t want to write this post. It’s awkward. I really don’t want to be having these types of conversations. I want to get attention for the software I write, not for my opinions about tacky blog posts.

    Why, Then?

    I might not know many Cuban python programmers personally, but I’d love to meet some. I’d love to meet anyone who cares about programming. Meeting diverse people from all over the world and working with them on code has been one of the great joys of my life. I love the fact that the Python community facilitates that and tries hard to reach out to people and to make them feel welcome.

    I am writing this because I know that, somewhere out there, there’s a Cuban programmer, or a kid who will grow up to be one, who might see that blog post, and think that the Python community, or the software industry, thinks that they’re a throw-away punch line. I want them to know that I don’t think they’re a punch line. I want them to know that the python community doesn’t think they’re a punch line. I want them to know that they are not a punch line, and I want them to pursue their interest in programming exactly as far as it takes them and not push them away.

    These people are real, they are listening, and if you tell me to just “lighten up” you are saying that your enjoyment of a joke is more important than their membership in our community.

    It’s Not Just Me

    The PSF is paying attention. The chairman of the PSF has acknowledged the problematic nature of the “joke”. Several of my friends in the Python community spoke up before I did (here, here, here, here, here, here, here), and I am very grateful for their taking the community to task and keeping us true to ideals of inclusiveness and empathy.

    That doesn’t excuse the public statement, made using official channels, which was in very poor taste. I am also very disappointed in certain people within the PSF1 who seem intent on doubling down on this mistake rather than trying to do something to correct it.

    1. names withheld to avoid a pile-on, but you know who you are and you should be ashamed. 

    by Glyph at April 02, 2015 05:47 AM

    April 01, 2015

    Dave Winer

    Mired in muck

    Disclaimer: Although it's April 1, this is not a joke.

    I used to look at the net and see nothing but blue sky. Now my eyes look around and all I see is muck!

    I suppose I get listened to more than most people, but I still feel unheard. Like life is futile. I have good ideas, but the world ignores them. It's hard to find a way to contribute that suits my talents.

    The times in my life when I've been happiest is when I've been surrounded by friends doing interesting things, growing, accomplishing stuff, while I was doing the same. However, it's been a long time since I've experienced that.

    Why mention this today? Because of this crazy stuff happening in Indiana and elsewhere in the US, where they're trying to figure out how they can be who they are, express themselves, when no one cares what they think. So they grab at options that make no sense. "We're not discriminating" they say. But they can't be so ignorant to see that that's exactly what they're doing. They don't like us and we don't like them, but I think we're suffering from the same malaise.

    Why do people shame other people on the net? Because (I theorize) it's one of the few forms of power left to them. One of the few ways their ideas are considered valid. It's a channel for expressiveness, a gesture that might seem to have meaning.

    Why do people troll on comments? Speak silly talking points they got from Fox News or MSNBC? This is one area where there is equivalence, the "left" and "right" both do this. Seek out each other for a permanent argument. My guess is they do it because it gives them a simulated nutrient-free sort of relevance.

    Why do people line up to buy Apple devices that will give them joy for almost no time (that's my experience). Why do I buy stuff from Amazon, when the arrival of the thing brings me no happiness?

    It's the same thing. Our lives lack meaning. We all have certain struggles to overcome. It's funny how when we have those struggles, we forget our unhappiness, or dissatisfaction with our existence. It's only in boredom and idleness, something we're sure to have a lot more of in the future, that we feel this empty frustration, of pushing against nothing. No achievement possible.

    Yesterday I asked Facebook to put Markdown in their CMS, sooner rather than later. They almost certainly won't do it. But for a moment I felt relevant. Almost as soon as I clicked Post I felt stupid.

    Even Jeremy Lin can't rise out of it! If only the Knicks had kept D'Antoni and said goodbye to Melo. Even the heroes that might give us hope can't rise out of the muck.

    I do know the answer, btw. Stop going it alone. Work with others. Instead of reproducing what someone else did, include it. Even if it's harder. We are a social species. We need to collaborate to give our lives meaning. We forgot that somewhere along the line.

    And for crying out loud stop picking on gay people. Geez.

    April 01, 2015 02:43 PM

    Fog Creek

    David’s Voice Activated Standing Desk

    As the Internet fills with April Fools’ Day tricks, why not revel in the schadenfreude of a prank played a while back on our poor, unsuspecting colleague, David. He arrived at work to find his Standing Desk was in fact Voice Activated…

    David’s Voice Activated Desk

    by Gareth Wilson at April 01, 2015 07:20 AM

    March 31, 2015

    Dave Winer

    Podcast: Staring into watches

    A 5-minute podcast speculating on new social behavior with Apple watches on Manhattan streets. Will people stop staring into their phone and stare into a watch instead? Now their eyes will be pointing down, instead of out, unless they're going to hold their wrists up at eye level? Or perhaps people will stare into the watch and the phone at the same time. If you put your watch on your left wrist and hold your phone in your right hand, it might just work. Either way, the success or failure of Apple's watch will be seen in the streets of Manhattan in a few weeks. Listen to this hilarity-cast for the scoop.

    March 31, 2015 08:08 PM

    Mark Bernstein


    Time begins on opening day, which is Sunday night.

    For a very long time, I’ve been curious about the differences between major league teams beyond their personnel. Are there significant differences between how different teams approach the game? Are there reasons why the Cubs are so frequently bad, the Rays so often good, and the Orioles so frequently disappointing?

    One of the few consistently sensible discussions of this is unfolding at Baseball Prospectus, whose team is crafting a series on Every Team’s “Moneyball” — the hypothetical edge that each team apparently pursues. For example, Atlanta drafts shortstops. Well, everyone drafts shortstops, because it’s the position that requires the greatest talent: every future major-leaguer who is right-handed starts out as the shortstop and cleanup hitter of his neighborhood team. But the Braves emphasize players who can stick at shortstop; that’s interesting. The Diamondbacks emphasize independent leagues. The Pirates emphasize Korea. Interesting.

    March 31, 2015 04:07 PM



    but it still must be said that his inflammatory and erroneous description of the situation is what caused all this nonsense in the first place. – Jimbo Wales, Wikipedia Chairman Emeritus

    Select Commentary: The GuardianGawkerPandoDailyThe Mary SueWil WheatonDer Standardde VolkskrantDr. Clare HooperP. Z. MyersFayerWayerThink ProgressStacey MasonThe VergeHeise Der Verdieping TrouwProf. David MillardWired.deKIRO-FM Seattle (starts at 10:00) ❧ TechNewsWorldWashington PostPrismaticSocialText Neues DeutschlandViceEuropa (Madrid)El Fichero BustDaily OrangeOverlandArCompanyThink Progress

    Good cause: App Camp For Girls. (Donations to Wikipedia are counter-productive. Give instead to a charity that assists women in computing, or victims of online harassment, not to punish Wikipedia but to repair the damage. App Camp For Girls has already raised $1200 from former Wikipedia donors; do tell them why you’re giving.)

    March 31, 2015 03:51 PM

    Dave Winer

    This is an April Fool-free zone

    There are no joke posts here, and there won't be.

    I'd love to see other blogs and news sites make that statement.

    See also: This is not an April Fool joke.

    March 31, 2015 03:42 PM

    What's the best JavaScript editor?

    On March 23, I posted a short-term roadmap for MyWord Editor, including this:

    The editor is a plain pre-HTML5 <textarea>. There are lots of great projects underway to do beautiful full-featured text editing in JavaScript. I did a survey of them last week, and have reached out privately to some of the authors of these tools. I want to get great text editing in MWE. But first I wanted to get the open source release out there.
    The editor is now released, people have successfully gotten their own servers running, and yesterday I released the first version of templating. I'd say the train is rolling.

    What's the best text editor?

    Now I'd like to swing back to the question of text editing.

    There are lots of editors to choose from. They all presumably have advantages and disadvantages. I'd like to host a discussion here. What would be the best editor to use?


    The two I looked at most closely were medium.js and Dante.

    The genre of editor that makes the most sense is one that's trying to mirror the Medium feature set. That's what both these editors aim to do.

    But there are other drop-in editors written in JavaScript. I wanted to cast a net as wide as possible to see what would come back.

    This is a decision lots of other people have had to make.

    For example, what does Ghost use? I assume WordPress wrote their own? Did they? Tumblr?

    They all had to make the same decision.

    Update 4/2/15

    I decided to put a very low-tech plug-in architecture in MWE.

    You can read about it here.

    In a word, the architecture is this: fork.

    March 31, 2015 03:38 PM

    Blue Sky on Mars

    Pretty Unmistakeable

    She snapped into existence.

    She knew she had a purpose; that much was clear. What for, well… that was still a mystery.

    She took stock of what she had to work with. The only thing she recognized, really, was the fresh coffee… pretty unmistakeable. She took it eagerly and gave it a small initial test, compelled towards the hope that the experience of consuming it would somehow spark a memory, reminding her why she was here.

    It stirred something. A wave of nostalgia hit her, refusing to yet coalesce into something tangible she could steady herself on.

    She continued with the coffee. It all came back to her with a rush.

    Creation. I’m here to create.

    It was that feeling of purpose again. That her mandate was to create something important, something for someone else. The Creators were the ones chosen to elevate the work to the one who matters most. To the one they loved the most.

    The coffee was almost finished. She beamed with the pride that only those lucky enough to be endowed with purpose and drive can truly understand.

    She knew exactly what she now longed to complete. She was thrilled about her little process. It would be her life’s work.

    COCKSUCKER!”, the dev said, hands taking the keyboard from the paired partner. “Nah I don’t think that’ll even compile — my bad, we need to rework this whole function to not suck as much ass. Lemme just fix this and… cool, see the CoffeeScript’s already been rebuilt and boom, that shit passes let’s go to lunch fuck JavaScript amiritelol.”

    She was nowhere to be found, of course. She had been summarily killed and replaced with a suitably disposable Creator. Her screams of agony briefly echoed, but they too would quickly fade away. Her last tranquil thought before the searing pain ripped through her had been a fantasy, really: she imagined how pleased The Developer would be once they saw what she had built for them.

    She smiled and considered it the most pleasant thought she had ever thought.

    March 31, 2015 12:00 AM

    March 30, 2015

    Tim Ferriss


    The Tim Ferriss Show with Amanda Palmer

    “Work with the man when the man can help you make your art…”
    – Amanda Palmer

    “When in doubt, remember: At the end of the day, you get to do whatever the fuck you want.”
    – Amanda Palmer

    My guest this episode is Amanda Palmer, who first came to prominence as one half of the internationally acclaimed punk cabaret duo The Dresden Dolls.

    Many of you have no doubt seen her surprise hit TED presentation, “The Art of Asking,” which has been viewed more than 6 million times. But her story goes much deeper, and, in this conversation, we delve into her routines, habits, creative process, relationships, business models, and more.

    Her new book is aptly titled The Art of Asking: How I Learned to Stop Worrying and Let People Help.  I finished 50% and fundamentally upgraded my life in an afternoon of asking for help.  It’s one hell of a read.

    Amanda is also widely known as “The Social Media Queen of Rock-N-Roll” for her intimate engagement with fans via her blog, Tumblr, and Twitter (1,000,000+ followers), and has been at the vanguard of using both “direct-to-fan” and “pay what you want” (patronage) business models to build and run her business. In May of 2012, she made international news when she raised nearly $1.2 million pre-selling her new album, Theatre is Evil, which went on to debut in the Billboard Top 10 when it was released in late 2012.

    We get into it all, including war stories, cursing, and meditation techniques. It’s a fun ride. Enjoy!


    Want to hear another podcast with a world-class musician? — Listen to my conversations with Justin Boreta of the Glitch Mob or Mike Shinoda of Linkin Park. In the fomer, we discuss his meditation practice, morning routines, and creative process (stream below or right-click here to download):

    This podcast is brought to you by 99Designs, the world’s largest marketplace of graphic designers. Did you know I used 99Designs to rapid prototype the cover for The 4-Hour Body? Here are some of the impressive results.  Click this link and get a free $99 upgrade.  Give it a test run…

    QUESTION(S) OF THE DAY: Have you ever overcome the fear of asking for help? Please share stories or examples in the comments!

    Scroll below for links and show notes…

    Selected Links from the Episode

    Show Notes

    • The origin story behind the alias Amanda Fucking Palmer [4:40]
    • On the creative process behind The Art of Asking [7:40]
    • Simplification and honing in art and life [19:10]
    • Lessons learned as The 8-foot Bride [25:10]
    • What separates a good living statue from a great living statue [30:40]
    • Advice for effective use of eye contact [33:25]
    • Amanda Palmer’s meditation techniques [42:25]
    • Most gifted books [49:50]
    • Who is the first person you think of when you think of “successful” [55:50]
    • Common misconceptions about Amanda Palmer [1:02:10]
    • Why the Amanda Palmer fan base is so dedicated [1:09:40]
    • Lessons learned from the rebellion against Roadrunner Records [1:17:25]
    • If Amanda had to choose one online tool, which would it be and why? [1:25:40]
    • The dynamics of having two creatives in one household [1:26:55]
    • Rapid-fire questions: Drinks in Boston and advice for her 20-year old self [1:34:10]
    • Thoughts on flying solo or working with “the man” [1:37:25]

    People Mentioned

    by Ian Robinson at March 30, 2015 08:01 PM

    Mark Bernstein

    Wiki Weather

    Wiki weather has been strangely unsettled in recent days. Last week, a heated argument over hidden comments in an information boxes at Sir Laurence Olivier — you couldn’t make this stuff up! — led to a tempest, an Arbcom filing, many angry words, and the forced resignation of administrator Dreadstar.

    On his way out the door, Dreadstar lifted my own topic ban. He had every right to do this, since it was his mistake in the first place. He also lifted a block which depended on the ban, which quite possibly exceeded his authority. I have expressed the opinion that this block was also an error, but it might not have been his error to fix. You will not hear me complain.

    Some commentators conjectured that, having found himself on the unaccustomed end of the +5 Mop of Blocking, Dreadstar sought at last to clean things up and restore everything to its proper place before he left. Others suppose that, in fury at his bad treatment by Wikipedia, he removed sanctions against the dread Mark Bernstein in the hope that hilarity and trouble would ensue. It may be the case that we cannot know the true state of affairs, as we do not choose to make windows into men’s souls.

    One result was a formal Arbcom motion that cites as evidence against Dreadstar my own complaint at being called a “motherfucker” by a Wikipedia official in response to my perfectly sensible query. That’s cute because it turns out that Wikipedia has a catch-22 that prohibits admins from sending out abusive emails, but also prohibits anyone from reporting that they have done so, except privately to Arbcom — and this just happened to drop right into Arbcom’s lap and voila! there the handy evidence happened to be, because I didn’t know any better.

    Arbcom has not expressed their gratitude.


    So having at least a furlough, I thought it would be churlish not to do something useful. So I trekked over for a look at the biography of Martin Fowler, author of the influential book on Refactoring. This is far, far from GamerGate, and the proper disposition of object methods does not appear to be a gender-related controversy. What could possibly go wrong?

    Diderot’s Darling Dingbats! Edit war! Some anonymous account has appeared – what a coincidence! – eager to fight over whether the influential status of Refactoring is contentious. Also, is Refactoring important to Agile practices, or only to Test Driven Development? So now we’re pulling out references and piling up citations for stuff that everyone knows, because some fellow wants to waste a lot of our time, or perhaps wants to settle some score or other. Or perhaps it’s just one of my banned and blocked GamerGate pals using an anonymous account to burn theory people’s time and effort.

    I can’t wait to hear what Sea Lions Of Wikipedia makes of this.

    March 30, 2015 02:49 PM

    Dave Winer

    This is not an April Fool joke

    We're coming up on that awful day on the web when anything you read might be a joke. The jokes are never funny, usually they say something bad about someone the author doesn't like. Haha just a joke.

    It's pretty horrible for a reader. All this week, every article with a seemingly sensational headline, will have to be checked to see if it might be a joke. Here's the first one I was bit by today.

    BGR: Meerkat is dying – and it’s taking U.S. tech journalism with it.

    Is it real? I think it is. There don't seem to be any obvious lies in the piece. But the conclusion is way over the top. Nothing is dying, that's pure hype. And if US tech journalism is dying, it's been happening for a long time, Meerkat could hardly be the cause.

    I don't think it's funny, I don't think news orgs should play this game. It's as if a bank decided one day, as a joke, to take all the money from your account and give it to someone else. Haha it's a joke.

    Imagine going to GMail on April 1, and finding someone else's email there instead of yours.

    The press only has one product, facts. They twist things, every day, to make the news seem more interesting or important than it is, but one day of the year, this Wednesday, they outright lie. Not in every piece, so you have to always be on the alert. It's as if an airline deliberately crashed a random plane into a mountain as a joke. The goal of a news organization is to inform. On April 1, they crash instead.

    If you're a news organization, on March 30, preparing your annual joke, how about do everyone a favor, skip it this year.

    March 30, 2015 02:43 PM

    The purpose of the Internet

    Facebook thinks the purpose of the Internet is to be The Matrix. A sort of lifeboat or ark for people whose lives must consume no more than a watt or two of electricity and some protein slurry.

    I propose that the purpose of the Internet is to create a place for people of intellect to work together to create a greater consciousness for the species, so we can make the changes we need in order to survive, with some purpose beyond mere existence.

    So I think the purpose of the Internet is to save our species from self-destruction.

    It's the only tool we have whose purpose is not yet fully decided.

    And survival is the only problem we have that we must solve.

    A picture named planet.png

    March 30, 2015 01:54 PM

    Fog Creek – Interview with Leah Culver

    In, we chat with developers about their passion for programming: how they got into it, what they like to work on and how.

    Today’s guest is Leah Culver, Developer Advocate at Dropbox. Leah is an iOS and Python developer, who previously co-founded Pownce, Convore, and Grove. She also co-authored the OAuth and OEmbed open API specifications. Leah writes about open source, APIs, and Django on her blog.

    Leah Culver
    Location: San Francisco, US
    Current Role: Developer Advocate at Dropbox

    How did you get into software development?

    My family got our first computer, an Apple II, when I was in second grade and my first personal computer was an iMac that I got for my 18th birthday. It was so expensive that it was both my birthday and Christmas gift from my parents!

    I started making websites when I was in high school with very simple HTML and free hosting sites like Angelfire and GeoCities. Later, in college, I took a class on JavaScript, fell in love with programming, and majored in Computer Science. It’s very funny to me that JavaScript is cool now.


    Tell us a little about your current role

    My current job is pretty wild and fun. I’m doing different things every day. I write API documentation, blog posts for our developer blog, and give talks about the Dropbox APIs. I also help organize meetups and sponsor hackathons. As for coding, I make sample apps for the Dropbox APIs and in my free time I work on Dropbox’s internal company directory.

    Last week was our team’s Hack Week at Dropbox. During Hack Week, Dropbox employees can hack on anything they like. My team hacked together a new feature for our Dropbox for Business administrator console, which was something I had never worked on before. It was a challenge to work my way through Dropbox’s enormous codebase to find what I needed. I ended up emailing our Dropbox for Business team who helped point me in the right direction. Everyone at Dropbox is really helpful and friendly! The hack turned out really well too. Phew!

    When are you at your happiest whilst coding?

    I like to plan ahead. I’m happiest when I have a solid plan and I’m working towards completion.

    What is your dev environment?

    At work, I have a Mac Book Air and a nice large Apple monitor. I keep a separate Mac Book Air at home and it’s really nice not to have to carry a computer back and forth.

    I use XCode for all my iOS development and Atom for everything else. I don’t use any special plugins though. I’m pretty boring. I like a simple text editor and a command line.

    I can’t live without 1Password and Dropbox for storing all my passwords and files. Like I mentioned earlier, I don’t carry around my computer so I rely on cloud services to keep everything in sync for me. As for desktop apps, I regularly use Adium for chat and the Tower git client because I appreciate visual diffs. On my iPhone, I’m obsessed with trying new apps. I regularly use Mailbox, Sunrise, and Clear to keep my life organized. I track my physical activity with Moves and Nike+ and do photo stuff on Instagram and Carousel.

    I drink a lot of diet soda and eat a lot of junk food while coding. Lately, I’ve been working from home on some personal projects and have been watching music videos on Vevo on my Apple TV.

    What are your favorite books/resources about development?

    I regularly read NSHipster and check out Hacker News. I’m subscribed to the email digest for Product Hunt, GitHub Explore, and Nuzzel to keep an eye out for cool new tech.

    What technologies are you currently trying out?

    I will be the first in line to buy an Apple Watch. I love small things. I haven’t bought the latest iPhone yet (too big!) but can’t wait for the watch.

    When not coding, what do you like to do?

    My hobby is running (well, really, jogging) which is nice because it gets me outdoors and away from my desk.

    What advice would you give to a younger version of yourself starting out in development?

    “Just copy and paste the error message into Google.”


    Thanks to Leah for taking the time to speak with us. Have someone you’d like to be a guest? Let us know @FogCreek.

    Recent Interviews

    Jared Parsons
    Salvatore Sanfilippo
    Hakim El Hattab
    Phil Sturgeon

    by Gareth Wilson at March 30, 2015 11:15 AM

    John Udell

    Wanted: Easy database app dev tools for the Web

    A friend of mine needs a simple database application to support his team. It's fairly straightforward: a handful of tables, forms, and queries. The team is globally distributed, so of course this needs to be a database-backed Web application. He's most comfortable with Python, so he's been coding it up in Django. You probably know somebody who's doing the same thing in Python with a different Web application framework or others using Ruby on Rails, ASP.Net, or a JavaScript-centric framework like Angular.js. There are a million ways to skin the cat.

    To read this article in full or to leave a comment, please click here

    by Jon Udell at March 30, 2015 10:00 AM

    March 29, 2015

    Dave Winer

    As usual Seth is right

    In this piece Seth Godin says that your negative internal voice is a permanent fixture. Nothing you can do can get it to leave you alone. But there is an answer. Surround that voice with lots of love, it's the perfect antidote.

    I learned how to do this myself a number of years ago.

    I would drop something, and in the instant after, as it's falling, my dark inner voice would judge me. "Idiot!" it would say. Before I learned to challenge the voice, something I never dared do as a child, it would take over. The idea would fester and bloom and become other kinds of negativity.

    Instead, as soon as I regain my composure, I call up another voice, my inner adult loving voice. "I love David very much," the voice would say, firmly, almost fiercely, "and he is not an idiot, he's a very smart, good, nice person, and I want you to stop saying that about him."

    It works, I'm happy to report. The dark voice is a coward. It only picks on little kids. Confronted with a powerful adult it sleeks off to hide until the next moment of weakness.

    I had a teacher who showed us how to do this. There were exercises that included punishment for the dark voice. I would lock mine in a bathroom in the basement of the house I grew up in, and make him pour a bowl of spaghetti on his own head. In my imagination, as I locked the door I'd tell him to stay there and think about it a while.

    March 29, 2015 07:39 PM

    12-minute podcast

    A short podcast on the future of everything, The Matrix, Facebook, virtual reality, empathy, getting real for once in our species.

    March 29, 2015 05:04 PM

    Data mining on Twitter favorites

    These days people do a lot more Favoriting that RTing.

    Seems to me there should be some system built on Favoriting in Twitter.

    A new tab where I see all the most favorited tweets from people I follow?

    March 29, 2015 04:24 PM

    The Internet of Internets

    Backlash85: "How would you feel about an alternative to the current internet?"

    I love this idea but I'm not sure what it means.

    Maybe, like a new namespace?

    Start over with a parallel .com and .net?

    I really like the idea.

    TCP/IP over IP.

    Internet of Internets!

    We didn't like the way this one turned out.

    Start a new one!

    New rules.

    March 29, 2015 04:02 PM

    Great thing about software

    In software you can "drop it in and see what happens" and if it explodes into a billion pieces, you know you have to go back and re-think it. I keep having to remind myself that software is different. There's zero cost to an explosion, if you have a backup copy of everything of course.

    March 29, 2015 03:17 PM

    Lambda the Ultimate

    The Next Stage of Staging

    The Next Stage of Staging, by Jun Inoue, Oleg Kiselyov, Yukiyoshi Kameyama:

    This position paper argues for type-level metaprogramming, wherein types and type declarations are generated in addition to program terms. Term-level metaprogramming, which allows manipulating expressions only, has been extensively studied in the form of staging, which ensures static type safety with a clean semantics with hygiene (lexical scoping). However, the corresponding development is absent for type manipulation. We propose extensions to staging to cover ML-style module generation and show the possibilities they open up for type specialization and overhead-free parametrization of data types equipped with operations. We outline the challenges our proposed extensions pose for semantics and type safety, hence offering a starting point for a long-term program in the next stage of staging research. The key observation is that type declarations do not obey scoping rules as variables do, and that in metaprogramming, types are naturally prone to escaping the lexical environment in which they were declared. This sets next-stage staging apart from dependent types, whose benefits and implementation mechanisms overlap with our proposal, but which does not deal with type-declaration generation. Furthermore, it leads to an interesting connection between staging and the logic of definitions, adding to the study’s theoretical significance.

    A position paper describing the next logical progression of staging to metaprogramming over types. Now with the true first-class modules of 1ML, perhaps there's a clearer way forward.

    March 29, 2015 01:34 PM

    Dave Winer


    Thanks to Dean Hachamovich for the pointer.

    March 29, 2015 01:08 PM

    March 28, 2015

    Dave Winer

    Who drives you?

    Silicon Valley proposes to drive our cars for us. I guess that's okay.

    Silicon Valley theorizes about putting our minds in software containers and storing them in computer memory, to be woken up when there's something for us to do, or think about, or perhaps see.

    But what would there be to see or do or think about in a world where everyone else is in a computer's memory. Have you seen many beautiful megabytes recently? Honey come look at the glorious pixel I just found. Of course you'll only be able to "see" it from the other side of the glass, looking out.

    Maybe we'll be able to hear each others' thoughts?

    There's a watch coming. But it will be a short-lived product, because soon we won't have wrists to put them on.

    So in a world where we're woken up to see or think, or do something, but there's nothing to see or do, or think about, I guess there won't be any reason to wake up.

    When it's all said and done, we might just end our species because we ran out of things to think about or do or see. Something to think about. Or do something about.

    PS: I think this whole upload-your-brain thing is a trick. Once they get you up there, they'll just turn the computer off and that's that.

    March 28, 2015 03:19 PM

    Paul's Pontifications

    Google Maps on Android demands I let Google track me

    Updated: see below.

    I recently upgraded to Android 5.1 on my Nexus 10. One app I often use is Google Maps. This has a "show my location" button:
    When I clicked on this I got the following dialog box:

    Notice that I have two options: I either agree to let Google track me, or I cancel the request. There is no "just show my location" option.

    As a matter of principle, I don't want Google to be tracking me. I'm aware that Google can offer me all sorts of useful services if I just let it know every little detail of my life, but I prefer to do without them. But now it seems that zooming in on my GPS-derived location has been added to the list of features I can't have. There is no technical reason for this; it didn't used to be the case. But Google has decided that as the price for looking at the map of where I am, I now have to tell them where I am all the time.

    I'm aware that of course my cellphone company knows roughly where I am and who I talk to, and my ISP knows which websites I visit and can see my email (although unlike GMail I don't think they derive any information about me from the contents), and of course Google knows what I search for. But I can at least keep that information compartmentalised in different companies. I suspect that the power of personal data increases non-linearly with the volume and scope, so having one company know where I am and another company read my email means less loss of privacy than putting both location and email in the same pot.

     Hey, Google, stop being evil!

    Update: 20th April 2015

    A few days ago a new update to the Google Maps app got pushed, and its now no longer demanding I let Google track me. In fact the offending dialogue box has now been replaced by one with a "No, and stop pestering me" option, so this is an improvement on what they had before.

    Way to go, Google!

    by (Paul Johnson) at March 28, 2015 02:59 PM

    Dave Winer

    Silo-free is not enough

    In a comment under my last piece, Drew Kime asks a question that needs asking.

    "What is it about WordPress that you see as siloed?"

    The answer might surprise you. Nothing. WordPress is silo-free.

    1. It has an open API. A couple of them.

    2. It's a good API. I know, because I designed the first one.

    3. WordPress is open source.

    4. Users can download their data.

    5. It supports RSS.

    "So, if WordPress is silo-free, there must be something about MyWord that makes it worth doing, or you wouldn't be doing it," I can imagine Mr Kime asking, as a follow-up.

    Silo-free is not enough

    This question also came up in Phil Windley's latest MyWord post, where he introduced the editor with: "I can see you yawning. You're thinking 'Another blogging tool? Spare me!'" He went on to explain how MWE is radically silo-free.

    But there's another reason I'm doing the MyWord blogging platform, which I explained in a comment.

    MyWord Editor is going to be competitive in ease-of-use and power with the other blogging systems. The reason to use it won't be the unique architecture, for most people. It'll be that it's the best blogging system. This is something I know about, and I'm not happy with the way blogging tools have evolved.

    The pull-quote: "I'm not happy with the way blogging tools have evolved."

    Imagine if you took Medium, added features so it was a complete blogging system, and made it radically silo-free, and then add more features that amount to some of the evolution blogging would have made during its frozen period, the last ten years or so, and you'll have a pretty good idea of what I want to do with MWE.

    Blogging is frozen

    There haven't been new features in blogging in a long time. Where's the excitement? It looks to me like there's been no effort made to factor the user interface, to simplify and group functionality so the first-time user isn't confronted with the full feature set, left on his or her own to figure out where to go to create a new post or edit an existing one. Blogging platforms can be both easier and more powerful, I know because I've made blogging platforms that were.

    Basically I got tired of waiting for today's blogging world to catch up to 2002. I figured out what was needed to win, and then set about doing it.

    I have no ambition to start a company. I like to make software. I'm happy to keep going as we have been going. I think JavaScript is a wonderful platform, with apps running in the browser, and in Node.js on the server. It's a more fluid technology world today than it was in 2002 the last time I shipped a blogging platform.

    I would also happily team up with companies who think this is a great opportunity. That blogging has stagnated too long, and that there must be ways to reinvigorate the market. I don't like taking shots at WordPress, but honestly I think it's stuck. I'm happy to talk with entrepreneurs who have ideas on how to create money-making businesses from an exciting user-oriented, user-empowering, radically silo-free open source blogging platform! Blogging needs a kick in the butt. I propose to give it one. With love. :kiss:

    Anyway, to Drew, thanks for asking the question. I doubt if you were expecting this much of an answer, but the question needed asking, and I wanted to answer it.

    PS: Here's an idea of what a MyWord post looks like.

    March 28, 2015 12:58 PM

    March 27, 2015

    Dave Winer

    "Radically silo-free"

    Over on Facebook and on Twitter I posted a thought, that software could be "radically silo-free."

    David Eyes asked what it means. I referred him to my blog, I said "scroll to the bottom and then read up." That's because this idea is so fresh that I hadn't yet written a post explaining. I thought I probably should.

    First mention

    First, I said I was going to hold up the release of MyWord Editor because I wanted it to be silo-free from the start. Then I spent a week doing that. While that was happening, I made a list of things that would make software silo-free, and I did all of them. I wanted to consciously, mindfully, create something that perfectly illustrated freedom from silos, or came as close as I possibly could to the ideal. In that post I defined the term.

    "Silo-free" means you can host your blog, and its editor, on your domain. I may offer a service that runs the software, but there will be no monopoly, and it will be entirely open source, before anything ships publicly.

    Second mention

    In the post announcing the open source release of MyWorld Editor, I included a section listing the ways it was silo-free, fleshing out the idea from the earlier post. And from that list, comes my definition.

    1. Has an open API. Easily cloned on both sides (that's what open means in this context).

    2. It's a good API, it does more than the app needs. So you're not limited by the functionality of MyWord Editor. You can make something from this API that is very different, new, innovative, ground-breaking.

    3. You get the source, under a liberal license. No secrets. You don't have to reinvent anything I've done.

    4. Users can download all their data, with a simple command. No permission needed, no complex hoops to jump through. Choose a command, there's your data. Copy, paste, you've just moved.

    5. Supports RSS 2.0. That means your ideas can plug into other systems, not just mine.

    There may be other ways to be silo-free. Share your ideas.

    Why it's "radical"

    In that post I explained why the software was "radical".

    These days blogging tools try to lock you into their business model, and lock other developers out. I have the freedom to do what I want, so I decided to take the exact opposite approach. I don't want to lock people in and make them dependent on me. Instead, I want to learn from thinkers and writers and developers. I want to engage with other minds. Making money, at this stage of my career, is not so interesting to me. I'd much rather make ideas, and new working relationships, and friends.

    I guess you could say I believe there are other reasons to make software, other than making money. Some people like to drive racecars when they get rich. What I want is to drive my own Internet, and for you to drive yours too.

    March 27, 2015 06:21 PM

    Fog Creek

    Mini and Tagged Logging, Open Source Go Packages – Tech Talk

    MINI and Tagged Logging Open Source Go Packages – Tech Talk

    In this Tech Talk, Stephen, a Developer here at Fog Creek talks about two Go packages, Mini and Logging, that we recently Open-Sourced. He describes their functionality and provides a few examples of their use.

    Find them both on GitHub: Mini and Logging.

    About Fog Creek Tech Talks

    At Fog Creek, we have weekly Tech Talks from our own staff and invited guests. These are short, informal presentations on something of interest to those involved in software development. We try to share these with you whenever we can.

    Content and Timings

    • Introduction (0:00)
    • Mini (0:39)
    • Logging (3:30)



    All I wanted to talk about today was a couple of libraries that we open sourced. These are two Go libraries that we wrote. The first package that we released is a little library that reads INI files and the second one is a logging package. The INI files, there really wasn’t a good alternative when we started working on the two projects. The logging I wrote for two reasons. One, the Go logging is pretty limited. The second is that I wanted to provide this feature called Tagged Logging.

    Mini – INI file reader package

    Let me start with this package called MINI, which basically is a small library to read INI files. For people who don’t know, an INI file is a really simple format. You can have comments, you can have key-value pairs, you can have sections. In the example that’s on the slides now, there’s a comment at the top with a semicolon. You can also do comments with hashtags. The bracketed owner has a section called owner. Name=John Doe is a key-value pair. As you can see online eight, you can quote the values. What you’re not seeing here, you can also do arrays of values. You can have 10 things and the syntax for that is that you just put empty brackets after the names. So name empty brackets would mean that there’s an array of names. That format is documented online. I put a link to the Wikipedia.

    The way it works in the library, you can load this configuration in from an INI file or from what’s called a reader which, just like a stream if you’re a Java person or whatever. So you can create the reader any way you want. You get back whether or not there’s an error reading or an object that represents the configuration. I’m skipping the error handling code. If you look at this, this code won’t compile because I skipped the error handling. Then you can just go ask. You can ask for, give me a string from a section, and in the case of the file we’re looking at, all the data is in sections. I have to get it from a section. If I go back for a second. If you had put data online one that was a key-value pair, it’d be global, and you wouldn’t have to refer to it with a section.

    The library also supports defaults, so if you look at this string from section, you can put in a default. That’s pretty much the whole API, which is pretty simple. There’s one other thing I’m going to talk about in a second. I also wanted to add, that the way people use this, Go has a package, they have a really simple way to get packages. They don’t have a really good way to manage versions of packages. We’ve posted this up on GitHub and people can use it just by typing go get, and then the URL there, the path to the package. It’s really easy to use the package, but, if you want to update it, if you want to deal with managing these or having multiple versions, it’s a little bit more of a pain.

    The other thing we support is, if you have a structure, you can actually read the data from a section into the structure. That uses reflection to fill in the values and the structure to match whatever the values are in the data file, and that supports a raise, and ints and floats, and booleans and strings as well. That’s a pretty simple little package. The logging packs is more interesting.


    The logging package is actually a pretty complete logging package. It has named loggers, it has the concept of a default logger. One of the things that I wanted to do was make it so that you could log really easily. In 99% of the cases, you just want to log to the same place. You don’t really need all of this concept of named logging.

    There is this need to have different levels of logging, because, you maybe don’t want to spit out every message all the time. It can get excessive. We have log levels. There are five log levels. Four of them are pretty standard, ERROR, WARN, INFO, and DEBUG. One of them is less standard which is, VERBOSE, and I’ll talk about that a little bit. You can different formats for your log, you can have appenders. It hooks in with the Go log package. It has a couple of things that are unique to this. One is, logging is all going to happen in the background. We’re using Go routines to do logging, the concurrency feature. When you do a log message, all the processing of the log message happens in a separate Go routine which could be in a separate thread or not. It’s not happening within your run and kind of your line of running code on the processor.

    Which means that, if an error happens appending to a file, we can’t give it right back to you. What we do is, we actually give that back to you through a channel which you can ignore or read or whatever. The second thing that’s interesting, is, because we have log levels, you might have the situation where you say, “Okay, I’m debugging everything as info, because the debug level is very verbose.” I don’t want to see all the log messages all the time because then I don’t want to see them all the time. If something bad happens, I may lose the ones that were important, because they are the ones that would have printed when something bad happens, but they didn’t print because I didn’t have the log level at the right place. What I implemented is this idea of a buffer. We actually saved the last n log messages.

    If an error happens, if you feel like you have the memory, you can set that buffer to a very large number. We default it a couple of thousand, but you could set it very high if you wanted. If you catch the error soon enough, and change the log level, which we can do in some of the services. You would actually, it will replay the messages that are in the buffer, which means, that you could go back and see what happened. That could get a little crazy, because if you go back and say, “Well, now I want to see all the debug messages,” well there could have been a million of those. The last feature that we have is this tagged logging. What tagged logging is, is this idea that every time you call log, you can pass in tags that somehow decorate the log message. The library let’s you associate levels with tags.

    As well as associating a level with the whole logging process itself, you can say something like, ‘if any message is logged with a tag HDP, I want it to be allowed at this level’, like say debug, but if its logged with the tag rabbit mq, either I just want to use the default or I want to log it at info, or something like that. Now you can filter, not just by the logger itself and maybe the named logger, but you can actually filter across, kind of perpendicular or orthogonal, based on what the message is related to, not just where the message is in the code. What’s even cooler about this is, you can use tags like account ID. If a request comes in, say to the search service that we were doing, it automatically sets up a tag for the account ID. We could potentially turn on debug logging for that account, but not for all other accounts.

    Which means, if a certain account is having a problem, we could debug that account without debugging everybody else. Moreover, if you add that with the buffer, that means you can go back, and potentially if an account had a problem, go back and look at the errors that happen, or the log messages that happen for that account without having to see everything that happened for everybody. I think the tagged logging is a really cool feature. Here’s a simple example. We have this idea, when you import the package, it’s going to be called logging, you could name it something else if you want. You could set a default log level. When you do that, it only logs things at that level and above. You can set a tag level, and when you do that, the tag level can override the default level.

    Then it just has normal methods to log. We have formatted methods and non-formatted methods. We’re hooked into the Go logging, so if you use the standard Go package, you can say, “I want all the standard Go things to log with these tags at this level. Then we have this buffer logging I mentioned, where you can set how big you want the buffer to be by default at zero and nothing gets buffered. Then, if things are logging and you later reset the log level to something lower, all the messages in the buffer are checked and printed out. Both the MINI package and the logging package are out on GitHub. We’ve already got some comments, we’ve already fixed a couple of bugs and added some new tests.

    by Gareth Wilson at March 27, 2015 11:45 AM

    March 26, 2015

    Dave Winer

    The best frameworks are apps

    The best software frameworks are apps that do things users care about.

    Back in the 80s it was dBASE and then FoxBase. 1-2-3 had a macro language, it was weak, but it was widely used because 1-2-3 was so popular with users.

    Today it's WordPress.

    And Slack is doing interesting things with their APIs.

    Twitter too, but that got kind of muddied-up.

    The best one of all of course is JavaScript, a very bizarre language in a totally underpowered environment that reaches into every nook and cranny of the modern world. It's an awful environment, you'd never design one that worked that way, but the draw of all those users makes up for its sins.

    Flickr had a wonderful API, still does, but Stewart left the house before it could really blossom as a community thing. See Slack, above.

    Chatting with Brent Schlender the other day, I commented that Steve Jobs' politics and mine are exactly opposite. Jobs was an elitist, all his products were as Doc said in 1997, works of art, to be appreciated for their aesthetics. I am a populist and a plumber. Interesting that this dimension of software is largely unexplored. I hope our species survives long enough to study it.

    BTW, when ESR saw XML-RPC he said it was just like Unix. Nicest thing anyone could ever say. When I learned Unix in the mid-late 70s, and studied the source code, I aspired to someday write code like that. So well factored it reads like its own documentation.

    Today, I'm mainly concerned with getting some outside-the-silos flow going with people I like to read. If we get (back) there, I will consider it a victory.

    March 26, 2015 07:47 PM

    Mark Bernstein

    Software Aesthetics: Cuteness

    Exploring fringes of software aesthetics, I’ve been reading up on things that are not quite beautiful. I came across this in a book review by Adam Kirsch in next month’s Atlantic:

    Niceness without goodness is cuteness.

    This makes a certain sense; it explains, for example, why a toddler can easily be cute but is seldom beautiful. “Goodness” here is not a moral judgment, or not just a moral judgment: an horse with a hat might be cute, but a beautiful horse is a horse doing what horses do – running gracefully through a meadow, say.

    How would this work with software?

    We look at a clever Perl one-liner, decipher it’s meaning, and exclaim “Nice!” But one-liners seldom do much good: even when they do something useful, it’s probably better to use a few lines to explain what you intend. Perl one-liners are cute.

    Gratuitous user interface polish does little or no actual good; it’s an expense, and it seldom produces much benefit. Often, this year’s marvel may be actively pernicious in a minute or two: remember Cordovan leather backgrounds? Gratuitous polish is cute.

    Under the hood, it’s entirely possible to use language features in strange and esoteric ways. You can be make C++ feel like a functional language. You can make C++ feel like Smalltalk. You can write little interpreters in C++ and do the real work in your own variant of LISP. Sometimes, this is elegant; often, it’s merely playing cute.

    Games and fictions sometimes drop the mask (or the fourth wall) to attempt an arch and knowing address to the player. We’re in the middle of a complex and challenging city simulation, and suddenly notice that the factories all have silly names and make silly products, or have in-joke references to industry insiders. Archness in games and fiction is cute.

    Almost all codewerk is cute.

    Brent Simmons hit this nail on the head when he wrote about the problems of splitting classes that are too large and do too much into smaller, more focused objects. If you do this intelligently, you get better code. If you get carried away, you get a basket of bunny classes. Bunny classes are cute.

    I realize that I’ve merely pushed most of the interesting questions into the matter of goodness. Small steps.

    March 26, 2015 03:24 PM

    Wikipedia And The Sea Lions

    A fresh and funny study at Sea Lions Of Wikipedia of the wisdom of extending Gamergate sanctions to all gender-related disputes and controversies, plus anyone involved in gender-related disputes and controversies.

    So you see, Sea Lion fans, if it’s a Bad Thing that happens largely to women — like Campus Rape and domestic violence — it’s automatically controversial!

    There’s no chance that this will work; it can’t be supported rationally and it can’t be administered sanely. As far as I can make out, the plan is to ban trouble-makers (like me) left and right until everything is calm and civil, a plan excused because Gamergate is not terribly important in the great scheme of things.

    The problem for Wikipedia is that gender-related issues and controversies are important. Wikipedia stumbles badly on many of them, in part because so much editing is performed by factions, cliques and trolls, and in part because so many Wikipedia editors just aren’t interested in gender beyond looking at pictures of pretty women who have misplaced their clothes.

    March 26, 2015 03:12 PM

    Giles Bowkett

    Scrum Fails, By Scrum's Own Standards

    I've raised some criticisms of Scrum and Agile recently, and gotten a lot of feedback from Scrum advocates who disagree.

    My main critique: Scrum's full of practices which very readily and rapidly decay into dysfunctional variants, making it the software development process equivalent of a house which falls apart while people are inside it.

    Most Scrum advocates have not addressed this critique, but among those who have, the theme has been to recite a catchphrase: "Inspect And Adapt." The idea is it's incumbent upon any Scrum team to keep an eye out for Scrum decay, and prevent it.


    Scrum can be described as a framework of feedback loops, allowing the team to constantly inspect and adapt so the product delivers maximum value.

    From an Agile glossary site:

    “Inspect and Adapt” is a slogan used by the Scrum community to capture the idea of discovering, over the course of a project, emergent software requirements and ways to improve the overall performance of the team. It neatly captures the both the concept of empirical knowledge acquisition and feedback-loop-driven learning.

    My biggest critic in this Internet brouhaha has been Ron Jeffries. Here's a sampling of his retorts:

    Mr. Jeffries is a Certified Scrum Trainer and teaches Certified Scrum Developer courses.

    In a blog post, Mr. Jeffries acknowledged that I was right to criticize the Scrum term "velocity." He then added:

    For my part in [promoting the term "velocity," and its use as a metric], I apologize. Meanwhile you’ll need to deal with the topic as best you can, because it’s not going away.

    He reiterates this elsewhere:

    Mr Bowkett objects to some of the words. As I said before, yes, well, so do I. This is another ship that has sailed.

    The theme here is not "Inspect And Adapt." The theme is "you're right, but we're not going to do anything about it."

    This isn't just Mr. Jeffries being bad at handling disagreement. It's also the case with Scrum generally. I'm not the first or only person to say that sprints should be called iterations, or that "backlog" is a senselessly negative name for a to-do list, or that measuring velocity nearly always goes wrong. Scrum also has a concept of iteration estimates which it calls "sprint commitments" for some insane reason, and this terrible naming leads to frequent misunderstandings and misimplementations.

    These are really my lightest and most obvious criticisms of Scrum, but the important thing here is that people who love Scrum have been seeing these problems themselves over the twenty years of Scrum's existence, and nobody has fixed these problems yet. In each case, all they had to do was change a name. That's a whole lot of inspecting and adapting which has not happened. The lowest-hanging fruit that I can identify has never been picked.

    by Giles Bowkett ( at March 26, 2015 08:57 AM

    March 25, 2015

    Mark Bernstein


    Pullman’s wonderful trilogy of His Dark Materials is the story of Lyra, a heroine who is a superlative liar. This stark, realistic novel is the story of a heroine who steals. She begins at an early age; her family is awful and so, without our noticing it, she steals herself a new family. She’s very good: people actually are touched by her appreciation of their stuff, so touched they sometimes thank her for caring enough to take things. She winds up in Paris, broke and unhappy, working as an expert restorer and dreading the day when her husband gets out of prison and comes to ask her for the life she stole.

    March 25, 2015 06:01 PM

    Dave Winer

    Journalism must compete

    My friend Jay Rosen asks for comments on Facebook's request that content providers give them access to the full text of their stories. A NYT report earlier this week said that Buzzfeed, the NY Times and National Geographic were among the first publications that had agreed to do this.

    I've commented on this many times over the years. The news industry could have seen it coming, prepared, already had a distribution system in place to close off the opportunity for tech. They didn't. That's still what they have to do. And it doesn't seem like it's too late, yet.

    My advice

    1. Do the deal with Facebook. They have access to 1.4 billion people, that's huge. There's never been a news distribution system even remotely like it. How can you not try to use this system? It's as if you were a world-class skier and the Olympics asked you to compete. You of course would thank them for the honor, and go.

    2. At the same time, be part of an independent news system, one that's not captured by any company, that does what Facebook hopes to do. It's too soon to throw in the towel. The technology already exists to do this, easily. (Even the lowly Knicks show up to compete every night, in theory at least, and sometimes they embarrass the current world champs.)

    3. There's good reason to think the independent system will be much better than the Facebook-captured one, because it can offer things that no captive system can, independence and some measure of objectivity. Don't miss that Facebook has become a newsworthy entity. Expect this to develop over the years, as their audience grows to cover every person on the planet. No one can fully trust them. And you should trust the people, your readers, to know that. Offer something interesting and independent. It may never reach the size of Facebook, but it can be a sustainable, and growing service.

    4. Partner with Twitter. Encourage them to support full content as Facebook is doing. That means relaxing the 140-char limit.

    5. Run your own river on what used to be your home page. The smart ones will point not just to stories on your site, but everywhere there's news. Include all the sources your people read. You can't compete with Facebook and Twitter with a system that only contains your stories. Stop thinking so linearly. People return to places that send them away.

    6. Expand. Have a goal to have twice as many sources reporting on your site every year. Accept that the roles for your current editorial people will change as they grow to lead teams, to teach large number of sources how to go direct to readers, with integrity. (Jay: Teach this new role in J-school.)

    7. You have to become more like Facebook, but please only the good high-integrity parts. No snickering. There are a lot of good people who work at Facebook, people who really care. Some of them used to work for you. Listen and learn from them. News is changing. Be the change.

    March 25, 2015 02:43 PM

    March 23, 2015

    Dave Winer

    MyWord Editor is open source

    Last week I said we'd wait to open up MyWord Editor for use by everyone until it was fully silo-free. Today the wait is over. We're ready to begin a journey, that hopefully will add new life to the open blogging world.

    A shot in the arm for the open web. A way for JavaScript developers to collaborate on a new fun project. A way to escape from the silos that threaten to turn us into commercial robots, consumers and promoters, when we aspire to be thinkers and doers.

    It's radical software

    These days blogging tools try to lock you into their business model, and lock other developers out. I have the freedom to do what I want, so I decided to take the exact opposite approach. I don't want to lock people in and make them dependent on me. Instead, I want to learn from thinkers and writers and developers. I want to engage with other minds. Making money, at this stage of my career, is not so interesting to me. I'd much rather make ideas, and new working relationships, and friends.

    Here's the plan

    1. I know MyWord Editor is not as good as it could be, as good as it will be, once we get the ball rolling. The editor is a plain pre-HTML5 <textarea>. There are lots of great projects underway to do beautiful full-featured text editing in JavaScript. I did a survey of them last week, and have reached out privately to some of the authors of these tools. I want to get great text editing in MWE. But first I wanted to get the open source release out there.

    2. It's pretty easy to get your own MWE instance up and running. I've included instructions on how to set it up in the readme. There's a mail list where people can help.

    3. I am operating a server myself, but please think of it as a demo. I do not want to be in the hosting business. Anything you post there could disappear at any time. The best way to use MWE as a blogging tool is to set up your own server, or pool your resources with other people to set up a server. Especially with free services like Heroku, it's very inexpensive to operate a server, and fun, enabling, and you're helping the web when you do it. Remember silos are bad, even ones operated by people you like!

    4. I have tons of features I want to add. I have a huge set of debugged concepts from previous blogging systems I've done, dating back over 20 years. I'd like to add them all to MyWord. But first people have to use it. It's no fun to add features to a product no one uses it.

    5. Remember, if the past is a guide, the tech press will not write about this. So if you want people to know, you'll have to tell them. Please spread the word. Let's make something great happen, all of us, working together, to build the web we want.

    6. If you believe you can fly, you can!


    Here are all the ways MyWord Editor is silo-free:

    1. There's an open API that connects the in-browser app to the server. So you can replace the app. Or the server. Or both.

    2. Because there's an open API, you can build anything you want at either end. You're not limited by my vision of what's possible. Let a thousand flowers bloom.

    3. The app is provided in source, MIT license. So there are no secrets. And you can use my source as the starting point for your own editor.

    4. The server is provided in source, MIT license. No secrets, etc.

    5. The app has a command that downloads all your content in JSON, so you can move your data from one server to another, at any time. If any instance removes this command, alarms should ring out all over the land. It's your content, ladies and gentlemen, not theirs.

    6. Of course every MyWord user has a great full-featured RSS 2.0 feed. We love RSS and it feeds us and we feed it, it's doing great, and anyone who disses it is a mean rotten silo-lover.

    Thank you Twitter

    Twitter is doing a good deed, by allowing us to use their service for identity. They have an excellent API, and their servers are reliable. And I think they're fair about what they allow and don't allow.

    We're not in any way trying to usurp their business. And if there's more good stuff out there on the web, that's more stuff for people to point to from their Twitter feeds. I use Twitter, so do a lot of other people.

    March 23, 2015 03:32 PM

    Fog Creek – Interview with Phil Sturgeon

    In, we chat with developers about their passion for programming: how they got into it, what they like to work on and how.

    Today’s guest is Phil Sturgeon, Senior Software Engineer at Ride. A former PHP-FIG member, he founded PyroCMS and was a core contributor to CodeIgniter. He’s also the author of Build APIs You Won’t Hate and regularly blogs about software development.

    Location: New York City, US
    Current Role: Senior Software Engineer at Ride

    How did you get into software development?

    There was an online magazine at my secondary school, and they wanted students to contribute mini-sites for other students to read. There was a really, really bad games review website built with Microsoft Publisher on there, which was essentially like browsing around a PowerPoint presentation. It was awful. Like any 11-year old child I was obsessed with video games, so I decided to learn how Front Page worked so I could make a better one.

    Eventually, another friend mentioned Dreamweaver and PHP, which stopped me crafting thousands of pages by hand or using iframes for content. This was the start of 15 years of learning, programming and messing about with the Internet. My parents had an IBM, with a 650 meg HDD and I think it was 8 megs of RAM. By no means as restrictive as some of the previous generations computers on their Z86’s and whatnot, but it was hardly a huge amount of fun.

    So I started with PHP, JavaScript and MySQL like many, although I did try ASP for a while after my mum bought me the wrong book for my birthday. I was self-taught but then went to college at 17 to study computing formally. They taught us C++ and Prolog which was great, but a lot of it was over-normalised SQL server, Perl and HTML font tags.


    Tell us a little about your current role

    My career used to be heavily open-source based. I’d work on multiple projects which had a business model on top or sell consulting on the side of them. Over the last few years, I have been passing my responsibilities to other developers as I try to step away from that to focus on my full-time job.

    Open-source used to take up a good half of my day. Answering questions, reviewing pull requests, seeking further information from bug reports, debugging, coding, documenting, etc. It was interesting work and it did a lot for my career, but with a full-time job, that work goes into evenings and lunch breaks and when it’s as much as I was doing, it can be a real time suck.

    I used to work on CodeIgniter, FuelPHP and PyroCMS. They all have amazing new developers and owners now. I used to be on the PHP-FIG too, but I gave my seat to the new PyroCMS project lead.

    This has meant I can now focus on getting my work done for, which is a whole lot of HTTP API and service-based development. It is a lot of fun, and the distributed international team is an amazing bunch of people.

    I am working full-time now as a Rails developer, for the first time since I spent a few months with it in 2010. I’ve used Ruby here and there for plenty of things and the syntax is insanely easy, but jumping through the hoops of Rails and learning its rather magical conventions can really be a time sap.

    With lots of remote developers, getting things done when I run into a Rails roadblock can often be a productivity and mood killer. Luckily we hired an on-site developer with extensive Rails experience, so this got me going again.

    This should serve as a reminder to try and avoid investing your time and efforts too heavily into a single language, framework or tool. With the majority of the last 15 years being spent in the PHP world, I have to try extra hard when working with tools like Rails or Django, even though smaller frameworks in the same languages seem to present no problems.

    When are you at your happiest whilst coding?

    When that test suite finally goes green after a day of spitting E’s in your face!

    What is your dev environment?

    It varies depending on the project. If something is incredibly complex and going on to a well-provisioned server, I’ll use Vagrant and Chef to make the dev/prod parity as tight as possible.

    If, on the other hand, I am shoving things on Heroku I’ll just run a local server with $ php -s, $ rails s or whatever unicorn-type clone that language fancies using.

    I use a Macbook Pro, with Atom, AtomLinter, editorconfig, rubocop and ruby-test. If Git didn’t exist and I had to go back to handling complex merges with SVN I would probably become a Kayak instructor.

    I actually started with a standing desk a month or so ago. I have a Varidesk, with a nice mat to stop my feed going dead. To keep life interesting I also have a balance board, and I’ve not face planted the desk or any co-workers just yet.

    What are your favorite books about development?

    The best programming book I have ever read is a soft skills book, but it’s something a lot more people should read. Team Geek is the name, and it made me think about a lot of stuff.

    I’m also a huge fan of these two bloggers, Nikita Popov and Anthony Ferrara. They’re both PHP contributors who have had huge impacts on the language, and have some very intelligent things to say about PHP and programming, in general.

    What technologies are you currently trying out?

    I’ve been building a few services in Go for the last few months and I’m really enjoying it. The simplicity and insanely strict type safety have lead to a lot fewer bugs being made during development, and the built-in web server and async functionality has made the whole thing lightning fast.


    When not coding, what do you like to do?

    I’ve spent a lot of time during the last year booted out of the country I live in, but as soon as I got back I broke three ribs snowboarding. Clearly I should stick to skiing next winter, but when I’m all in one piece and I’m not in the office and there’s not a foot of snow on the ground, I’ll be out on my bike doing laps of Central Park or exploring the New Jersey mountains.

    What advice would you give to a younger version of yourself starting out in development?

    Diversify your skill set from the get go. Don’t try to be a jack of all trades, but try to avoid becoming type-cast or a one-hit wonder.

    Learning multiple languages is easier now than it ever has been with CodeAcademy and Treehouse making it obnoxiously easy to do. The more you learn the more you start to understand programming concepts, in general, instead of having the one language’s idiomatic approach baked into your head forever.

    Thanks to Phil for taking the time to speak with us. Have someone you’d like to be a guest? Let us know @FogCreek.

    Recent Interviews


    Brian Bondy


    Jared Parsons


    Salvatore Sanfilippo


    Hakim El Hattab

    by Gareth Wilson at March 23, 2015 11:37 AM

    John Udell

    Save FriendFeed! Why we need niche social networks

    When Facebook announced its impending shutdown of FriendFeed, the chatter was predictable: It was the long-expected end of yet another failed social network. That doesn't begin to explain what FriendFeed's real value was, why that mattered, and how it might be recreated.

    FriendFeed combined two major functions: group messaging and feed aggregation. Were it only a platform for group discussion it would still have been useful. Even today, that basic need isn't easy to satisfy in a lightweight and open way. But it was feed aggregation that made FriendFeed into something more: a user innovation toolkit, albeit one that was never well understood or fully exploited.

    To read this article in full or to leave a comment, please click here

    by Jon Udell at March 23, 2015 10:00 AM

    March 22, 2015

    Decyphering Glyph


    My Castle headcanon1 has always been that, when they finally catch up with Mal (oh, and they definitely do catch up with him; the idea that no faction within the Alliance would seek revenge for what he’s done is laughable) they decide that they can, in fact, “make people better”, and he is no exception. After the service he has done in exposing the corruption and cover-ups behind Miranda, they can’t just dispose of him, so they want to rehabilitate him and make him a productive, contributing member of alliance society.

    They can’t simply re-format his brain directly, of course. It wouldn’t be compatible with his personality, and his underlying connectome would simply reject the overlaid neural matrix; it would degrade over time, and he would have to return for treatments far too regularly for it to be practical.

    The most fitting neural re-programming they can give him, of course, would be to have him gradually acclimate to becoming a lawman. So “Richard Castle” begins as an anti-authoritarian man-child and acquiesces, bit by bit, to the necessity of becoming an agent of the enforcement of order.

    My favorite thing about the current season is that, while it is already obvious that my interpretation is correct, this season has given Mal a glimmer of hope. Clearly the reprogramming isn’t working, and aspects of his real life are coming through.

    They really can’t take the sky from him.

    by Glyph at March 22, 2015 08:16 AM

    March 21, 2015

    Tim Ferriss


    smiley 16652277268_381ca34ec5_zI’m not high in this picture, despite my appearance.


    JAMES FADIMAN, Ph.D., did his undergraduate work at Harvard and his graduate work at Stanford, doing research with the Harvard Group, the West Coast Research Group in Menlo Park, and Ken Kesey. He is the author of The Psychedelic Explorer’s Guide.

    Called “America’s wisest and most respected authority on psychedelics and their use,” Jim Fadiman has been involved with psychedelic research since the 1960s. In this episode, we discuss the immediate and long-term effects of psychedelics when used for spiritual purposes (high dose), therapeutic purposes (moderate dose), and problem-solving purposes (low dose). Fadiman outlines best practices for safe “entheogenic” voyages learned through his more than 40 years of experience–from the benefits of having a sensitive guide during a session (and how to be one) to the importance of the setting and pre-session intention.

    We also discuss potential “training” using lucid dreaming techniques, and that’s just the tip of the iceberg.

    Cautioning that psychedelics are not for everyone, Jim dispels the myths and misperceptions. He explains how — in his opinion — psychedelics, used properly, can lead not only to healing but also to scientific breakthroughs and spiritual epiphanies.

    TF-ItunesButton TF-StitcherButton

    Plus, a bonus you might have missed — Sam Harris, PhD, on meditation, neuroscience, and psychedelics (stream below or right-click here to download):

    This episode is brought to you by 99Designs, the world’s largest marketplace of graphic designers. Did you know I used 99Designs to rapid prototype the cover for The 4-Hour Body? Here are some of the impressive results.

    QUESTION(S) OF THE DAY: If you couldn’t use drugs and wanted to experience some of the benefits discussed in this episode, what tools might you use? Please share and explore answers in the comments here.

    Do you enjoy this podcast? If so, could you please leave a short review here? I read them, and they keep me going. Thanks for listening!


    These show notes were kindly provided by readers Spencer and Greg. Thanks, guys! There are two different versions, both pasted below. Be sure to also see the comments, which have great additional resources and links…

    The Psychedelic Explorer’s Guide
    2:45 what is micro-dosing
    3:20 Albert Hofmann:
    4:45 LSD dose sizing
    7:00 psychedelics are “anti-addictive”
    8:25 duration of some psychedelics and micro-dosing
    12:00 James Fadiman’s background
    12:00 Richard Alpert AKA Ram Dass:
    18:20 Fadiman’s thesis at Stanford: behavioral change after psychedelic experiences
    23:20 aspects of psychedelics that can contribute to overcoming addictions
    23:35 ibogaine:
    27:00 applications/similarities of different psychedelics
    30:00 Alexander Shulgin:
    and his books: PiHKAL:
    33:00 psychedelics and “integrating” the experience into life
    35:30 The Psychedelic Explorers Guide:
    37:45 guidelines for “safe and successful psychedelic experience”
    41:25 qualities of a “guide” or “sitter”
    44:00 revisiting “integrating” psychedelic experience into life
    46:45 Kennett Roshi:
    48:20 service people and psychedelic impact
    52:00 Bill Wilson:
    52:00 Bill Wilson, AA, and psychedelics
    55:40 problem solving and psychedelics
    1:03:00 pattern recognition and psychedelics
    1:07:50 lucid dreaming and dreaming in color
    1:08:50 David Brown
    1:09:45 stuttering and psychedelics
    1:12:20 choice of one psychedelic versus another
    1:13:50 MDMA and PTSD
    1:15:45 “Reefer Madness”:
    1:18:00 depression and micro-dosing
    1:19:00 ketamine
    1:23:00 advancing research
    1:23:50 MAPS: Multidisciplinary Association for Psychedelic Studies:
    1:27:10 “The Trip Treatment” by Michael Pollan:
    1:30:30 Burning Man:
    1:31:00 Kary Mullis:
    1:34:00 Roland Griffiths:


    James Fadiman:
    Main Site:
    Publisher: Inner Traditions
    Additional Books from publisher
    Psychedelic Drugs
    Levels of Dosage when considering LSD (micrograms)
    400 – Transcendental experience, a guide is needed
    200 – Used for psychotherapy and self exploration
    100 – Can be used for problem solving situations (situations explained in podcast)
    50 – “museum” or “concert” level
    10/15 – Micro dose
    Micro dosing – low enough dose that is “sub – perceptible” – you don’t notice the direct effects – “the rocks don’t glitter”. Could be a replacement for existing cognitive enhancers such as Adderall or Ritalin.
    Organizations currently doing research on Psychedelics.
    MAPS –
    Heffter –
    Articles About Psychelics:
    New Yorker Michael Pollan –
    Dr. Roland Griffiths –

    Alexander Theodore Shulgin aka Sasha Shulgin “godfather of Psychedelics”
    Pihkal –
    Tihkal –
    Bill Wilson – founder of AA, experienced LSD

    by Tim Ferriss at March 21, 2015 07:28 PM

    March 20, 2015

    Mark Bernstein

    Flying Trapeze

    This has to be a first: over at Wikipedia, some guy want them to throw the book at me because … wait for it … I use too many links! (He’s also very angry because I asked Arbcom whether Campus Rape falls under Gamergate discretionary sanctions, when he thinks it’s obvious that it does. Okay.)

    Now, lots of referees over the years have muttered to themselves that Bernstein uses an awful pile of footnotes and references a terrible lot of the research literature. Patterns of Hypertext has 76 references, Criticism has 93 – a lot for a 10-page paper. Still: if you need the references (or want a reading list), these can be useful. If you don’t, they do little enough harm. (Designing A New Media Economy has but 32 references, but it’s also got 18 footnotes, many of them fairly extensive.)

    Let’s face it: links are perfect for this. If you want to gist or already know the area, skip the link. If you want more information, follow it. If you skip the link, fine — just don’t blame me for withholding information.

    (I think the guy who’s complaining doesn’t understand that Google never indexes Wikipedia’s back-of-the-house, and imagines that I’m getting tons of traffic and page rank from Wikipedia. In fact, I’ve probably sent Arbcom a lot more traffic than they’ve sent me!)

    Speaking of crowds, a hilarious new site,, skewers the current Gamergate brawl. Here’s the latest installment: Sea Lion VOLLEYBRAWL, Part Three! Of Mops and Sticks. It’s very inside baseball, but clever jokes like the “+5 Mop of Banning” really help after an immersion in Wikipedia’s often-insufferable self-importance — especially when I’ve been responding with bombast and not alliterative verse. I don’t know who writes this site, but they’re funny and they really do understand Wikipedia’s back alleys.

    Update! That was fast: if I’m reading this correctly, an actual Arbcom clerk has seriously proposed to topic-ban me from my own weblog and to place my Wikipedia user page under Gamergate Discretionary Sanctions. Because ethics? Cake on a rake!

    (Meanwhile, if I’d only linked to Foucault, Haraway, and Butler, I might have saved Arbcom from the 4-credit course on Feminism in the Postmodern Era.)

    March 20, 2015 03:10 PM

    Dave Winer

    Beautiful JavaScript editors

    I spent some time over the last couple of weeks surveying the amazing collection of Medium-like editors written in JavaScript. All open source, some very good. It's just amazing to see the collective energy and ambition of the JavaScript community. I've been programming a long time, on a lot of platforms, and have never seen anything like this.

    I thought about integrating one of these toolkits with MyWord Editor, currently in development. I put together testbeds for the most promising ones, ZenPen and its derivatives, Dante and medium.js. They're all on the right track, each has advantages, but imho what they all were missing was a way to enable a motivated user to run a Medium-like blogging service with their editor as the centerpiece. A next-gen blogging system, built with JavaScript, with elegance and beauty at the center. Key point: this is achievable, within easy striking distance, in the spring of 2015.

    I decided that rather than pick one beautiful simple editor, I'd sprint to the finish line with the standard pre-HTML5 <textarea> editor, release the whole thing as open source, and let the community decide what to do. There appear to be some front-runners, projects that are active and ambitious, going somewhere. I want to make it easy for people to work with me, rather than be in the position to choose a "winner" at this time, based on incomplete info.

    With all the incredible open energy in the JavaScript world, I don't doubt we can move the leading edge forward, if we have the will to work together. I'm putting out my best invitation. I have a great back-end, perfectly suited to host a blogging environment (I have some experience with this), and a rudimentary editor. Let's see where we can go from here.

    I expect to ship my editor next week.

    March 20, 2015 02:48 PM

    Fog Creek

    Reactive Templating Demo with Hamlet – Tech Talk

    Reactive Templating Demo with Hamlet – Tech Talk

    In this Tech Talk, Daniel, a Developer here at Fog Creek, gives a demo of Hamlet. It’s a simple, but powerful and open-source, reactive templating library that he co-created.

    About Fog Creek Tech Talks

    At Fog Creek, we have weekly Tech Talks from our own staff and invited guests. These are short, informal presentations on something of interest to those involved in software development. We try to share these with you whenever we can.

    Content and Timings

    • Introduction (0:00)
    • Demo (0:58)
    • Multiple Bindings (1:32)
    • Inline Events (3:04)
    • Dependent Functions (4:12)
    • Checkbox and Disabling Inputs (5:33)
    • To-do List and HTML Elements (6:41)



    I’m going to talk about a tool I built for client-side templating. If anyone’s familiar with the client-side templating landscape, there’s a lot of tools coming out over the past five years and even more every year and every day as JavaScript relearns things that computers have done. We want reactive interfaces. We want to make the web more powerful, more like a desktop application. So now, we have to relearn and recreate all the tools that we’ve had for 30 years, but we don’t have them on the web because it’s new. So hopefully we can learn from that and make some pretty good tools that do a good job, and this is my take looking at the landscape from a couple years ago, building a tool that met my needs very well.


    So, let’s see. I guess you can see this little website here. It’s got this little guy. And I have this demo. Just trying to make it big so you can see. It kind of bumped the CSS a little. The main thing in this tool… you’re familiar with HTML templating libraries, I think Mustache is the classic one, where you threw a bunch of curly braces in and you basically just interpolate string values into your HTML.

    Multiple Bindings

    That’s okay I guess, but in real life you usually have specific attributes that are bound to specific values. You’re not going to cross over a tag barrier with some arbitrary strings. You’d rather have a little more structure. So given that, you can get a very nice domain-specific language. It looks exactly like this. It has… These are HTML element labels, or HTML element node types. Then these are the attributes, and I’ve got a shortcut at value syntax. So if I drag the slider, it adjusts all of them simultaneously. So I think this is what a lot of the libraries like Angular, some of the other bigger ones are going for with their… Knockout especially, with reactive data binding.

    This model is a CoffeeScript object. It can just be a JavaScript object. You don’t have to use CoffeeScript. The one key attribute is this observable function, which you give it any value and it provides a way for the UI layer to have bi-directional binding. So everywhere in this template where value is listed, it’s bound to this observable object. That way the UI knows how to automatically wire it up for you. It’s the cleanest I’ve seen. So here’s that same example.

    Inline Events

    You can also bind events on buttons or any other element. You can just click it and it pops up. The event is just an arbitrary JavaScript function. This is the CoffeeScript syntax… basically, you’ve got a button, you want the click event to be this function. This is actually going back to the style of HTML of 1996 where you just throw inline handlers on everything. These don’t have to be implemented as inline handlers, but it’s just visually… the original way they did it made a lot of sense. They’re keeping the HTML simple.

    Today, if you do have a very complicated app, you wouldn’t necessarily want to inline everything. But since this is a template and not actually HTML. It’s pretty good because this doesn’t actually do an inline function right here. It binds it using JavaScript, but it has the same value of readability, so you know what is the click action on this button. You can just read it right here.

    Dependent Functions

    So here, you’ve got dependent functions. This is starting to get some of the interesting stuff that this library does. It automatically tracks your dependencies for you, even through regular functions. So you have a first name, which is observable, and a last name, which is observable. You can type in whatever you want, and it automatically updates the composite name in the template. A composite name is just a function derived from these two observable values. This “at” syntax is CoffeeScript for this thought. Usually in JavaScript you have to be a little careful about using this, because based on the binding or the context in which your function’s executed, this could be different. But the runtime view layer makes sure that within your model, this is always your model, so you can basically ignore that here.

    And so we see in the binding, the value is just bound to the observable, so it’s bi-directional so that when you update it, it updates the input value, and that filters back into this simple function and updates the composite value that is bound here as well.

    Checkbox and Disabling Inputs

    And it also just has simple checkboxes. Basically, all the HTML elements work fine.

    You can toggle a value from ‘true’ to ‘false’. So, ‘disabled’ here is a way to disable a button in HTML. And by having this disabled.toggle, so it’s an observable of a boolean value, we can in real time swap it back and forth. And then, when the button’s active, you can click it, when it’s disabled, you can’t click it.

    I see a lot of other libraries have really complicated ways to do stuff. But a lot of them get farther and farther from the basic HTML itself, like what is actually happening on the web page. To just put the attribute value in using a jQuery selector to do the attribute, but this is actually slightly cleaner even than that. And then with jQuery, if you want to do bi-directional binding, you have to set up a bunch of observers or listeners. It gets complicated fast.

    To-do List and HTML Elements

    This is the classic ‘to-do list’ app. You can see this is the full app right here, it’s just a template and a model. Other apps that are ‘to-do list’ are a hundred lines. The backbone is probably a hundred, some other new ones I think are shorter.

    The add function… It just pushes the item that you create into an observable array. So the observable array proxies all the standard array methods, and then it makes… it triggers the change event, when you call any mutation that is on the array. So you can almost pretend that items is just a normal JavaScript array, as it shows up here. You can enter it using each. Then it just displays it. And because it tries to keep the exact same API as the built-in arrays, it works very seamlessly and allows you to make a very simple application using all the tools you already know.

    It’s like, “oh, I have an array and I want to listen to change events, I’ll just make it observable,” and you’re basically done. You throw that into your template and it works the way you would expect. It also can run your HTML elements directly. This equal sign…

    So it’s called Hamlet because it’s derived from Haml and Ruby. I think seven years ago that was popular for a little bit, and it’s been influential on a lot of other tools like Jade, or any of these SASS, LESS, these HTML and CSS meta-languages that compile down to HTML and CSS. They take away a lot of redundancy, a lot of the error-prone nature… you have to match your tags and close them and open them. Easily make mistakes. I guess the editors… the app can do that, but here you can just edit in a text area and build a to-do list. So I think it comes out slightly ahead in some respects.

    That’s it for my talk. If you do have any front-end code and want to get into interactive user interfaces, I think it’s at least an interesting prospective. I hope that you consider Hamlet the next time you need to have a reactive website. Thanks.

    by Gareth Wilson at March 20, 2015 11:39 AM

    Reactive Templating Demo with Hamlet – Tech Talk

    Reactive Templating Demo with Hamlet – Tech Talk


    In this Tech Talk, Daniel, a Developer here at Fog Creek, gives a demo of Hamlet. It’s a simple, but powerful and open-source, reactive templating library that he co-created.


    About Fog Creek Tech Talks

    At Fog Creek, we have weekly Tech Talks from our own staff and invited guests. These are short, informal presentations on something of interest to those involved in software development. We try to share these with you whenever we can.


    Content and Timings

    • Introduction (0:00)
    • Demo (0:58)
    • Multiple Bindings (1:32)
    • Inline Events (3:04)
    • Dependent Functions (4:12)
    • Checkbox and Disabling Inputs (5:33)
    • To-do List and HTML Elements (6:41)




    I’m going to talk about a tool I built for client-side templating. If anyone’s familiar with the client-side templating landscape, there’s a lot of tools coming out over the past five years and even more every year and every day as JavaScript relearns things that computers have done. We want reactive interfaces. We want to make the web more powerful, more like a desktop application. So now, we have to relearn and recreate all the tools that we’ve had for 30 years, but we don’t have them on the web because it’s new. So hopefully we can learn from that and make some pretty good tools that do a good job, and this is my take looking at the landscape from a couple years ago, building a tool that met my needs very well.


    So, let’s see. I guess you can see this little website here. It’s got this little guy. And I have this demo. Just trying to make it big so you can see. It kind of bumped the CSS a little. The main thing in this tool… you’re familiar with HTML templating libraries, I think Mustache is the classic one, where you threw a bunch of curly braces in and you basically just interpolate string values into your HTML.

    Multiple Bindings

    That’s okay I guess, but in real life you usually have specific attributes that are bound to specific values. You’re not going to cross over a tag barrier with some arbitrary strings. You’d rather have a little more structure. So given that, you can get a very nice domain-specific language. It looks exactly like this. It has… These are HTML element labels, or HTML element node types. Then these are the attributes, and I’ve got a shortcut at value syntax. So if I drag the slider, it adjusts all of them simultaneously. So I think this is what a lot of the libraries like Angular, some of the other bigger ones are going for with their… Knockout especially, with reactive data binding.

    This model is a CoffeeScript object. It can just be a JavaScript object. You don’t have to use CoffeeScript. The one key attribute is this observable function, which you give it any value and it provides a way for the UI layer to have bi-directional binding. So everywhere in this template where value is listed, it’s bound to this observable object. That way the UI knows how to automatically wire it up for you. It’s the cleanest I’ve seen. So here’s that same example.

    Inline Events

    You can also bind events on buttons or any other element. You can just click it and it pops up. The event is just an arbitrary JavaScript function. This is the CoffeeScript syntax… basically, you’ve got a button, you want the click event to be this function. This is actually going back to the style of HTML of 1996 where you just throw inline handlers on everything. These don’t have to be implemented as inline handlers, but it’s just visually… the original way they did it made a lot of sense. They’re keeping the HTML simple.

    Today, if you do have a very complicated app, you wouldn’t necessarily want to inline everything. But since this is a template and not actually HTML. It’s pretty good because this doesn’t actually do an inline function right here. It binds it using JavaScript, but it has the same value of readability, so you know what is the click action on this button. You can just read it right here.

    Dependent Functions

    So here, you’ve got dependent functions. This is starting to get some of the interesting stuff that this library does. It automatically tracks your dependencies for you, even through regular functions. So you have a first name, which is observable, and a last name, which is observable. You can type in whatever you want, and it automatically updates the composite name in the template. A composite name is just a function derived from these two observable values. This “at” syntax is CoffeeScript for this thought. Usually in JavaScript you have to be a little careful about using this, because based on the binding or the context in which your function’s executed, this could be different. But the runtime view layer makes sure that within your model, this is always your model, so you can basically ignore that here.

    And so we see in the binding, the value is just bound to the observable, so it’s bi-directional so that when you update it, it updates the input value, and that filters back into this simple function and updates the composite value that is bound here as well.

    Checkbox and Disabling Inputs

    And it also just has simple checkboxes. Basically, all the HTML elements work fine.

    You can toggle a value from ‘true’ to ‘false’. So, ‘disabled’ here is a way to disable a button in HTML. And by having this disabled.toggle, so it’s an observable of a boolean value, we can in real time swap it back and forth. And then, when the button’s active, you can click it, when it’s disabled, you can’t click it.

    I see a lot of other libraries have really complicated ways to do stuff. But a lot of them get farther and farther from the basic HTML itself, like what is actually happening on the web page. To just put the attribute value in using a jQuery selector to do the attribute, but this is actually slightly cleaner even than that. And then with jQuery, if you want to do bi-directional binding, you have to set up a bunch of observers or listeners. It gets complicated fast.

    To-do List and HTML Elements

    This is the classic ‘to-do list’ app. You can see this is the full app right here, it’s just a template and a model. Other apps that are ‘to-do list’ are a hundred lines. The backbone is probably a hundred, some other new ones I think are shorter.

    The add function… It just pushes the item that you create into an observable array. So the observable array proxies all the standard array methods, and then it makes… it triggers the change event, when you call any mutation that is on the array. So you can almost pretend that items is just a normal JavaScript array, as it shows up here. You can enter it using each. Then it just displays it. And because it tries to keep the exact same API as the built-in arrays, it works very seamlessly and allows you to make a very simple application using all the tools you already know.

    It’s like, “oh, I have an array and I want to listen to change events, I’ll just make it observable,” and you’re basically done. You throw that into your template and it works the way you would expect. It also can run your HTML elements directly. This equal sign…

    So it’s called Hamlet because it’s derived from Haml and Ruby. I think seven years ago that was popular for a little bit, and it’s been influential on a lot of other tools like Jade, or any of these SASS, LESS, these HTML and CSS meta-languages that compile down to HTML and CSS. They take away a lot of redundancy, a lot of the error-prone nature… you have to match your tags and close them and open them. Easily make mistakes. I guess the editors… the app can do that, but here you can just edit in a text area and build a to-do list. So I think it comes out slightly ahead in some respects.

    That’s it for my talk. If you do have any front-end code and want to get into interactive user interfaces, I think it’s at least an interesting prospective. I hope that you consider Hamlet the next time you need to have a reactive website. Thanks.

    by Gareth Wilson at March 20, 2015 11:39 AM

    Ian Bicking

    A Product Journal: The Evolutionary Prototype

    I’m blogging about the development of a new product in Mozilla, look here for my other posts in this series

    I came upon a new (for me) term recently: evolutionary prototyping. This is in contrast to the rapid or throwaway prototype.

    Another term for the rapid prototype: the “close-ended prototype.” The prototype with a sunset, unlike the evolutionary prototype which is expected to become the final product, even if every individual piece of work will only end up as disposable scaffolding for the final product.

    The main goal when using Evolutionary Prototyping is to build a very robust prototype in a structured manner and constantly refine it.

    The first version of the product, written primarily late at night, was definitely a throwaway prototype. All imperative jQuery UI and lots of copy-and-paste code. It served its purpose. I was able to extend that code reasonably well – and I played with many ideas during that initial stage – but it was unreasonable to ask anyone else to touch it, and even I hated the code when I had stepped away from it for a couple weeks. So most of the code is being rewritten for the next phase.

    To minimize risk, the developer does not implement poorly understood features. The partial system is sent to customer sites. As users work with the system, they detect opportunities for new features and give requests for these features to developers. Developers then take these enhancement requests along with their own and use sound configuration-management practices to change the software-requirements specification, update the design, recode and retest.

    Thinking about this, it’s a lot like the Minimal Viable Product approach. Of which I am skeptical. And maybe I’m skeptical because I see MVP as reductive, encouraging the aggressive stripping down of a product, and in the process encouraging design based on conventional wisdom instead of critical engagement. When people push me in that direction I get cagey and defensive (not a great response on my part, just acknowledging it). The framing of the evolutionary prototype feels more humble to me. I don’t want to focus on the question “how can we most quickly get this into users hands?” but instead “what do we know we should build, so we can collect a fuller list of questions we want to answer?”

    by Ian Bicking at March 20, 2015 05:00 AM