Smart Disorganized (incoming)

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

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. Otherwise, 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 03, 2015 10:55 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

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

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.


  1. Purchase the season pass from iTunes. Be sure to take a screenshot of your email receipt OR “Purchased” page (you’ll need this for step 2) To take a screenshot, press ALT+PRINT_SCREEN on Windows or COMMAND+SHIFT+4 on Mac
  2. Visit
  3. Fill out this form and upload a screenshot of your purchase
  4. You’ll receive the transcripts from The Tim Ferriss Show soon thereafter, and then prizes will follow before or on May 10th.

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."

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

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.
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

Dave Winer

MyWord Editor: silo-free from start

I came back from my trip early this week, ready to ship MyWord Editor. But I decided to make it silo-free from the start. So I had a little more work to do before release.

"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.

I could have gone another way, and put up my own hosting service, as I have done with my software snacks, Little Pork Chop, Happy Friends, Radio3, Little Card Editor etc. None of those are open source, however they all run on the nodeStorage platform, which is.

I want MyWord Editor to make a very strong anti-silo statement. And even though it might make more sense from a development standpoint to do it in stages, it would muddy the message to have it be a silo when it's released. So we're going a little more slowly, to make a big strong, impossible-to-miss statement. Silos are not user-friendly. We don't want them. Not even for one version.

We'll start testing the software over the weekend, and hope to have a first public release early next week.

PS: Here's an example of a document published by MWE.

March 20, 2015 03:21 AM

March 19, 2015

Mark Bernstein

Flying Circus of Zombies

March 17 begins at the Gamergate Talk page, as many do, with the arrival of a fresh new editor. Galestar joined Wikipedia in 2009 and last edited 14 months ago. Today, he’s here to fix a problem: the Gamergate page says "misogynistic," that’s an opinion, and Galestar announces "I will be removing these adjectives as per WS:RSOPINION" .

Galestar doesn't have much editing experience and he might be excused for being rusty after 14 months away, but no: he’s got policy at his fingertips in virtually his first post. Discussion follows -- 2500 hundred words of discussion in this section alone.

This topic – the use of “misogynistic” – is not new. According to my informal survey of the million-word archives, it was discussed before on: Feb 24, Feb 11, Jan 27, Jan 25, Jan 22, Jan 9-11, Dec 22, Nov 24, Nov 13, Nov 2, Oct 27, Oct 12, Sep 19, Sep 16, Sep 11, and Sep 6. As here, the discussion is often launched by a new or zombie account; often, this account knows a ton about WikiLawyering but pretends to be unaware of all the prior discussions.

This is not the only recurrent topic. It’s just one of a half-dozen arguments which can never be settled because zombie accounts return to restart them every two weeks. This isn’t their favorite topic: those involve the sex lives of Gamergate victims. But it’s today’s topic, so away we go.

This is against Wikipedia policy, obviously. But that doesn’t matter because Wikipedia policy effectively prohibits any complaint about this kind of collusive editing. Anyone who complains – even through an indirect allusion to the existence of the phenomenon, is promptly punished. These accounts are not fresh new editors; they’re personae cultivated by Gamergate for a purpose, built from the compost of abandoned and zombie user accounts. But everyone else must pretend that brand-new editors arrive every two weeks, armed with a fresh knowledge of WikiLaw and jargon, determined to changes the consensus. Wikipedia: the encyclopedia any manilla folder on the closet shelf can edit™.

March 19, 2015 05:47 PM

March 18, 2015

Tim Ferriss


Raoul_-_MPEG_Streamclip_1_9_2_©_2004-2008_Squared_5Discussing life and investing with Mark Hart and Raoul Pal.

[DISCLAIMER: I’m not a doctor, nor do I play one on the Internet. Speak with a medical professional before doing anything medical-related, m’kay?]

There is something here for everyone.

This post details two jam-packed discussions  — one with world-renowned macro investors and investment strategists (Mark Hart and Raoul Pal), and another with a top performance doc you’ve referenced hundreds of times (Peter Attia, MD).

In both, we address dozens of topics, including:

– How do you choose an optimal investment style?
– What’s the most useful definition of “ROI” for lifestyle purposes?
– What are the 5 lesser-known physical tests you should consider?
– How does hormone therapy fit into the bigger performance and longevity picture (or not)?
– Productivity and exercise/diet tips from all participants.

Below, you’ll also find the most comprehensive show notes and links I’ve done to date. They’re DEEP.  If you like them, please let me know in the comments, as these take a TON of time to transcribe and summarize.

EPISODE 63 — I am interviewed by Mark Hart and Raoul Pal for Real Vision Television, which was created to combat the dumbed-down approach to finance in traditional media. Mark predicted and bet on the subprime mortgage crisis, the European sovereign default crisis, and more. As Forbes put it, related to Mark, “Sometimes, combing through a mountain of manager letters felt like reading the newspaper years in advance.” We talk about nearly everything in this roundtable.

EPISODE 65 — Peter Attia, MD, answers your most popular 10-15 questions (e.g. top blood tests, hormone therapy, increasing VO2 max, long-term ketosis, etc.), as voted on by thousands of you. Peter is President of NuSI and a tremendous endurance athlete in his own right.

TF-ItunesButton TF-StitcherButton

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. Order one of their dress shirts this week and get a Henley shirt (around $60 retail) for free.  Just add the two you like here to the cart, then use code “TIM” at checkout.

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 is the best investment advice you’ve ever read or heard? 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!

And here are the copious show notes and links for both episodes…

Part 1 – Investing and Life Optimization – Episode #63 (Links and Time Stamps)

People Mentioned

Companies Mentioned

Books Mentioned

Selected Links from the Episode

Time Stamps

  • Raoul sets the stage for the conversation [3:33]
  • Tim discusses his background [4:13]
  • Mark discusses his background [5:30]
  • How Tim approaches productivity improvements [8:15]
  • How Mark implemented Tim’s advice [11:15]
  • Establishing a baseline for self-tracking [13:20]
  • Hacking 10,000 hours to mastery [17:05]
  • How to hack breakfast [21:25]
  • How to hack insomnia [22:35]
  • Hacking cheat meals [23:25]
  • Genetics testing [25:10]
  • Thoughts on time management [26:10]
  • Cold (ice bath) and heat (sauna) therapy [31:03]
  • Lucid dreaming [34:35]
  • How to find out what you are good at [39:30]
  • On Journaling [41:55]
  • Feeding your subconscious mind [45:10]
  • Tim’s calling [47:50]
  • [On constantly improving [52:23]
  • On enjoying the journey [56:00]
  • Psychological dynamics of making or losing money [57:34]

Key Takeaway Show Notes

How to Approach Productivity Improvements

There are a number of ways to try and improve the performance of a company, group of people, or single person.

If you look at it like rally car racing, you have a racetrack that is designed to kill you.

  • It is not designed to be as safe as possible. The path is somewhat known, but the terrain is unknown (it could be raining, sleeting, etc.)

People tend to have this separation of mind and body, but at the end of the day you have certain levels of neurotransmitters that are produced and depleted at a certain rate, and that is the rate-limiting step in your mental performance.

  • If you want to have better levels of working memory and sustained attention, etc – you can optimize those by optimizing the car (i.e. the body in this case).

There are also process things like what are the daily habits and ways you approach turning your effort on or off for productivity and recovery throughout the day that you can tweak.

  • This would be the example of driving the car.

On Self-Tracking

You want to establish a self-tracking baseline.

  • You don’t want to make health decisions on once-annual blood tests because if you took that test the very next day the values would be different.

What you are interested in (in terms of blood values) is not just a snapshot in time, but rather you want to understand the trends.

Journaling is also a good way to establish a baseline in terms of a daily and weekly routine to identify what led you to states of flow or what 20% of activities / people are producing 80% of your negative emotions / bad decision-making.

On Hacking

There are many ways to circumvent the 10,000-hour rule for almost any skill.

  • Study the anomalies rather than discarding them as outliers.

One easy hack is to have 30 grams of protein within 30 minutes of waking up (lentils, spinach, and two whole eggs for example).

  • By doing this, it is not uncommon to lose 20 pounds in the first month if you have 20% body fat (if you are a male).

If you have trouble sleeping, it is often due to low blood sugar.

  • You could have a tablespoon of unsweetened almond butter before you go to sleep, and you will see a lot of people who are chronically fatigued fixed immediately.

If you have to have a cheat meal you could have a tablespoon of vinegar before the meal, which will help lower the glycemic index (your glucose response to that meal).

On Time Management

Time is one of several currencies.

  • A currency is something you trade for something else.

Time is non-renewable, whereas capital is renewable.

In the hierarchy of prioritization (past a certain point of Maslow’s needs), time should take priority.

If you don’t have time it is an indication of not having sufficiently clear priorities.

On Cold (Ice Baths)

Cold exposure can improve immune function, serve as anti-depressant therapy, and effects hormones like adiponectin (which leads to increased rate of fat loss in many cases).

On Lucid Dreaming

You can further reinforce or develop your skills while you’re sleeping during lucid dreaming.

  • Lucid dreaming not only improves performance, but also helps you develop present state awareness.

On Journaling

Journaling has tremendous value, especially if you don’t view yourself as a writer.

Writing allows you to freeze your thoughts in a form that you can analyze.

You should write down your fears and worries, and explore them. This will clarify what they are.

  • Sometimes they will end up unfounded, and you can remove them as an influence.
  • Other times it will clarify how those risks can be mitigated.

Part of the value is taking these muddy distractive thoughts and imprisoning them on paper so you can get on with your day.

On Constantly Improving

Seeking constant improvement and dissatisfaction do not have to go hand-in-hand.

  • If you aren’t getting stronger, you are getting weaker.

The way you reach equilibrium, or the sensation of balance, is by having appreciation and a set of activities and practices for that.

On Enjoying the Journey

At the end of the day you have to focus on the process because, due to good or bad luck, you can get a bad result after a very good process or a great result after a very bad process.

  • You can also help avoid depression that can come from bad outcomes by enjoying the process.



Part 2 with Dr. Peter Attia – Episode #65 (Links and Time Stamps)

Medical Terminology –

People Mentioned

Companies Mentioned

Books Mentioned

Time Stamps

  • What are the top 5 biological tests everyone should get? [4:53]
  • Should you eat carbs following weight training to promote anabolism within the muscle? [12:00]
  • What are the top 10 supplement recommendations? [15:11]
  • Should the ketogenic diet be a short-term intervention or a long-term lifestyle? [20:48]
  • Blood testing at home [28:45]
  • Should you not drink alcohol? [32:40]
  • The results of Peter’s insulin suppression test [38:45]
  • How do you figure out if a ketogenic diet works for you? [47:30]
  • What type of cardio is best for you? [50:54]
  • When can we expect results from the energy balance consortium? [58:05]
  • Testosterone replacement for men [1:00:00]
  • How Peter maintains his productivity [1:06:22]

Key Takeaway Show Notes

What Are the Top Five Biological Tests?

This answer depends on an individual-by-individual basis and the risks each person faces (cardiovascular disease, cancer, etc.)

Through the lens of preventing death these five tests are the most important:

  1. APOE Genotype – helps us understand what diseases you may be more (or less) at risk for.
  2. LDL Particle Number via NMR (technology that can count the number of lipoproteins in the blood) – counts all of the LDL particles, which are the dominant particles that traffic cholesterol in the body both to and from the heart and to and from the liver. We know the higher the number of these particles the greater at risk you are for cardiovascular disease.
  3. LP(a) via NMR – This is the most atherogenic particle in the body. If this is elevated (independent of the LDL particle number) it is an enormous predictor of risk and something to act on indirectly (diet and drugs don’t seem to work as effectively in mitigating this).
  4. OGTT (Oral Glucose Tolerance Test) – This is a time 0-hour, time 1-hour, and time 2-hour test that looks at insulin and glucose. The 1-hour mark is where you may see the early warning signs with elevated glucose levels (anything over 40-50 on insulin), which can represent hyperinsulinemia (a harbinger for metabolic problems).
  5. IGF-1 (Insulin Growth Factor 1 Level) – This is a pretty strong driver of cancer. Diet can help keep IGF-1 levels low.

Should You Eat Carbs Following Weight Training to Promote Anabolism Within the Muscle?

It depends what you are optimizing for.

If your primary objective is to increase you muscle size, then yes there is a benefit to consuming carbohydrates and / or whey protein.

However, if you are someone like Peter who could care less about the size of your muscles then the answer is no you should not do that.

  • Peter doesn’t even consume whey protein post workouts anymore because he is optimizing for longevity and using caloric restriction as one method for that.

What Are the Top Supplement Recommendations?

There are few things everyone should take across the board unanimously.

  • It is highly individualized based on your needs and goals.

Peter takes:

  • Vitamin D
  • Baby Aspirin
  • Methylfolate
  • B12
  • B6
  • EPA
  • DHA
  • Berberine
  • Probiotic (which he cycles on and off of)

He takes all of these because he is managing to certain targeted levels for all of these markers that he can’t get to without supplementing.

Peter does not take:

  • Multivitamin
  • Vitamin A
  • Vitamin K
  • Vitamin C
  • Vitamin E

Should the Ketogenic Diet be a Short-term Intervention or a Long-term Lifestyle?

Peter is not sure, but questions the evidence of any society (for example, the Inuit culture) that has been claimed to have lived entirely on a ketogenic diet in perpetuity.

  • However, this doesn’t mean that ketogenic diets cannot or should not be sustain long-term.

Nobody has done a long-term study of people on ketogenic diets.

  • The data we do have is generally conflicting.

There is a lot of documentation on ketogenic diets being safe and effective, at least over the short-term (less than 1-year) for type 2 diabetes and obesity.

Peter spent 2.5 years in ketosis, but hasn’t been for a little over 1 year consistently.

  • He does still get in ketosis once per week as a result of fasting, and he feels he is at his best on a ketogenic diet.
  • The main reason to move away from it today for Peter was a craving he has had for more fruits and vegetables, which makes it hard to stay in a ketogenic diet.

Going forward he would use a diet that cycles in and out of ketosis, but it is less about him believing there is long-term harm in ketosis and more about him scratching other itches in experiencing a broader array of foods.

It is pretty clear when a ketogenic doesn’t work.

  • When C-reactive protein, Uric Acid, homocysteine, and LDL Particle numbers go up it is clear that diet is not working for that person.

On Blood Testing at Home

What is interesting is what a company like Theranos is doing, which is creating a black box that allows you to use less than a thimble of blood and use that for a very broad array of testing.

  • The goal may be to have these in places like a CVS where you can go in and put a finger prick of blood on a strip and get a wide array of testing.
  • Legal hurdles could be a challenge here.

Should You Not Drink Alcohol

Peter has never seen convincing evidence that the addition of alcohol creates a health benefit.

For some people, ethanol alcohol, up to reasonable doses, has no harm.

  • Other people are prone to having an inflammatory response from drinking even a small amount of wine or beer.

Peter recommends doing an elimination-reintroduction test.

  • Knock alcohol out of your system for 1-month while making no other change, and then slowly reintroduce it.

What Type of Cardio is Best For You?

The type of cardio activity that puts an undue stress on the heart, in terms of cardiac output, is not ideal.

The heart has to expand (open much wider) to accompany the extra blood volume.

  • If that expansion sustains for a long period of time it can result in deformation of the electrical system of the heart (particularly the right side of the heart as it is less muscular than the left).
  • This can result in electrical system failures of the heart.

At very low levels of physical activity the outcomes are not good (people don’t live that long).

At medium levels of physical activity (30-45 minutes a session / 4 sessions a week / modest output) had the best outcomes where people lived the longest.

Really high levels of physical activity (greater duration / greater intensity) resulted in the curve falling down again.

Testosterone Replacement for Men

This is a complicated topic because we live in a society where somehow we have let morality get in the way of science.

Testosterone replacement is a viable option in men with whom levels are deficient and symptoms justify the use.

  • The problem is we have this belief, which is not substantiated by rigorous science, that overstates the detriment of its use.

The data is not clear that hormone replacement in men results in an increased risk of heart disease.

  • People are more willing to accept that testosterone replacement in men actually reduces the risk of prostate cancer.

The problem with all hormone replacement is that the numbers alone aren’t significant, which means you have to treat patients based on symptoms.

How Peter Maintains His Productivity

Peter is a big fan of creating to-do lists, and he carries physical cards with him for daily, weekly, and long-term professional tasks. He also carries a personal monthly to-do list.

  • Writing these things down takes the stress out of it.
  • Most of the anxiety is worrying you will *forget* something, not feeling overwhelmed about *doing* things.


by jacobseb at March 18, 2015 09:21 PM

Mark Bernstein

Pride and Prejudice

Consolation in the wake of Wikipedia/Gamergate chaos and affliction. (Is Pride and Prejudice a gender-related controversy? Oh, dear…)

March 18, 2015 04:43 PM

Fog Creek

10X Programmer and other Myths in Software Engineering – Interview with Laurent Bossavit

.little {font-size: 75%}

Looking for audio only? Listen on


We’ve interviewed Laurent Bossavit, a consultant and Director at Institut Agile in Paris, France. We discuss his book ’The Leprechauns of Software Engineering’, which debunks myths common in Software Engineering. He explains how folklore turns into fact and what to do about it. More specifically we hear about findings of his research into the primary sources of theories like the 10X Programmer, the Exponential Defect Cost Curve and the Software Crisis.


Content and Timings

  • Introduction (0:00)
  • About Laurent (0:22)
  • The 10X Programmer (1:52)
  • Exponential Defect Cost Curve (5:57)
  • Software Crisis (8:15)
  • Reaction to His Findings (11:05)
  • Why Myths Matter (14:44)




Laurent Bossavit is a consultant and Director at Institut Agile in Paris, France. An active member of the agile community he co-authored the first French book on Extreme Programming. He is also the author of “The Leprechauns of Software Engineering”. Laurent, thank you so much for joining us today, can you share a little bit about yourself.

About Laurent

I am a freelance consultant working in Paris, I have this great privilege. My background is as a developer. I try to learn a little from anything that I do, so after a bit over 20 years of that I’ve amassed a fair amount of insight, I think, I hope.

Your book, “The Leprechauns of Software Engineering”, questions many claims that are entrenched as facts and widely accepted in the software engineering profession, what made you want to write this book?

I didn’t wake up one morning and think to myself, ‘I’m going to write a debunkers book on software engineering’ but it actually was the other way around. I was looking for empirical evidence anything that could serve as proof for agile practices. And while I looked at this I was also looking at evidence for other things which are in some cases, were, related to agile practices for instance the economics of defects and just stuff that I was curious about like the 10X programmers thing. So, basically, because I was really immersed in the literature and I’ve always been kind of curious about things in general, I went looking for old articles, for primary sources, and basically all of a sudden I found myself writing a book.

The 10X Programmer

So, let’s dig into a few of the the examples of engineering folklore that you’ve examined, and tell us what you found. The first one you’ve already mentioned is the 10X programmer. So this is the notion that there is a 10 fold difference between productivity and quality of work between different programmers with the same amount of experience. Is this fact or fiction?

It’s actually one that I would love to be true if I could somehow become or if I should find myself as a 10X programmer. Maybe I would have an argument for selling myself for ten times the price of cheaper programmers. When I looked into it, what was advanced as evidence for those claims, what I found was not really what I had expected, what you think would be the case for something people say, and what you think is supported by tens of scientific studies and research into software engineering. In fact what I found when I actually investigated, all the citations that people give in support for that claim, was that in many cases the research was done on very small groups and not extremely representative, the research was old so this whole set of evidence was done in the seventies, on programs like Fortran or COBOL and in some cases on non-interactive programming, so systems where the program was input, you get results of the compiling the next day. The original study, the one cited as the first was actually one of those, it was designed initially not to investigate productivity differences but to investigate the difference between online and offline programming conditions.

So how much of that is still relevant today is debatable. How much we understand about the concept of productivity itself is also debatable. And also many of the papers and books that were pointed to were not properly scientific papers. They were opinion pieces or books like Peopleware, which I have a lot of respect for but it’s not exactly academic. The other thing was that some of these papers did not actually bring any original evidence in support of the notion that some programmers are 10X better than others, they were actually saying, “it is well known and supported by ‘this and that’ paper” and when I looked at that the original paper they were referencing, they were in turn saying rather than referencing their own evidence, saying things like “everybody knows since the seventies that some programmers are ten times more than others” and very often after chasing after all the references of old papers, you ended up back at the original paper. So a lot of the evidence was also double counted. So my conclusion was, and this was the original leprechaun, my conclusion was that the claim was not actually supported. I’m not actually coming out and saying that its false, because what would that mean? Some people have taken me to task for saying that all programmers are the same, and that’s obviously stupid, so I can not have been saying that. What I’ve been saying is that the data is not actually there, so we do not have any strong proof of the actual claim.

Exponential Defect Cost Curve

There is another folklore item called the “exponential defect cost curve”. This is the claim that it can cost one dollar to fix a bug during the requirements stage, then it will take ten times as much to fix in code, one hundred times in testing, one thousand times in production. Right or wrong?

That one is even more clear cut. When you look at the data and you try to find what exactly was measured, because those are actual dollars and cents, right? So it should be the case, at some point a ledger or some kind of accounting document originates the claim. So I went looking for the books that people pointed me to and typically found that rather than saying we did the measurements from this or that project, books said or the articles said, ‘this is something everybody knows’, and references were ‘this or that article or book’. So I kept digging, basically always following the pointers back to what I thought was the primary source. And in many cases I was really astonished to find that at some point along the chain basically someone just made evidence up. I could not find any solid proof that someone had measured something and came up with those fantastic costs, sometimes come across like, fourteen hundred and three dollars on average per bug, but what does that even mean? Is that nineteen-nineties dollars? These claims have been repeated exactly using the same numbers for I think at least three decades now. You can find some empirical data in Barry Boehm’s books and he’s often cited as the originator of the claim. But it’s much less convincing when you look at the original data than when you look at the derived citations.

The Software Crisis

There is a third folklore, called “The Software Crisis”. Common in mainstream media reporting of large IT projects. These are studies that highlight high failure rates in software projects, suggesting that all such projects are doomed to fail. Are they wrong?

This is a softer claim right, so there’s no hard figures, although some people try. So, one of the ways one sees software crises exemplified is by someone claiming that software bugs cost the U.S. economy so many billions, hundreds of billions of dollars per year. A more subjective aspect of the notion of the software crisis, historically what’s interesting, is the very notion of the software crisis was introduced to justify the creation of a group for researching software engineering. So the initial act was the convening of the conference on software engineering, that’s when the term was actually coined and that was back in 1968, and one of the tropes if you will, to justify the interest in the discipline was the existence of the software crisis. But today we’ve been basically living with this for over forty years and things are not going so bad, right? When you show people a dancing bear one wonders not if the bear dances well. That it dances at all. And to me technology is like that. It makes amazing things possible, it doesn’t always do them very well but its amazing that it does them at all. So anyway I think the crisis is very much over exploited, very overblown, but where I really start getting into my own, getting on firmer ground is when people try to attach numbers to that. And typically those are things like a study that supposedly found that bugs were costing the U.S. sixty billion dollars per year and when you actually take a scalpel to the study, when you read it very closely and try to understand what methodology they were following and exactly how they went about their calculations, what you found out is that they basically picked up the phone and interviewed over the phone a very small sample of developers and asked them for their opinion, which is not credible at all.

Reaction to His Findings

What is a typical reaction to your findings debunking these long held claims?

Well, somewhat cynically it varies between, “Why does that matter?” and a kind of violent denial. Oddly enough I haven’t quite figured out why, what makes people so into one view point or the other and there’s a small but substantial faction of people who tell me ‘oh that’s an eye opener’ and would like to know more, but some people respond with protectiveness when they see for instance the 10X claim being attacked. I’m not quite sure I understand that.

So how do myths like these come about?

In some cases you can actually witness the birth of a leprechaun. Its kind of exciting. So, some of them come about from misunderstandings. I found out in one case for instance that an industry speaker gave a talk at a conference and apparently he was misunderstood. So people repeated what they thought they had heard and one thing led to another. After some iterations of this telephone game, a few people, including some people that I know personally, were claiming in the nineties that the waterfall methodology was causing 75% failure rates in defence projects, and it was all a misunderstanding when I went back and looked at the original sources the speaker was actually referring to a paper from the seventies which was about a sample of nine projects. So not an industry wide study. So I think that was an honest mistake, it just snow-balled. In some cases people are just making things up, so that’s one way to convince people, just make something up. And one problem is that it takes a lot more energy to debunk a claim than it takes to just make things up. So if enough people play that little game some of that stuff is going to just sneak past. I think the software profession kind of amplify the problem by offering fertile ground, we tend to be very fashion driven, so we enthusiastically jump onto bandwagons. That makes it easy for some people to invite others to jump, to propagate. So I think we should be more critical, there has been a movement towards evidence-based software engineering which I think is in some ways misguided, but is good news to my way of thinking that anyone is able to think, maybe we shouldn’t be so gullible.

Why Myths Matter

Even if the claims are in fact wrong, why does it matter?

To me, one of the key activities in what we do, its not typing code, its not design, its not even listening to customers, although, that comes close. The key activity that we perform is learning. We are very much a learning-centered profession so to speak. Because the very act of programming when looked at from a certain perspective is just about capturing knowledge of the world about businesses, about… other stuff that exists out there in the real world or is written about that is already virtual, but in any way capturing knowledge and encoding that knowledge, capturing it in code, in executable forms, so learning is one of the primary things that we do anyway already. I don’t think we can be good at that if we are bad at learning in general in a more usual sense. But what happens to those claims which are easy to remember, easy to trot out, they act as curiosity stoppers, basically. So they prevent us from learning further and trying to get at the reality, at what actually goes on in the software development project, what determines whether a software project is a success or failure, and I think that we should actually find answers to these questions. So it is possible to know more than we do right now, I am excited every time that I learn something that makes more sense for me that helps me have a better grip on developing software.

Are there any tell-tale signs that we can look out for to help stop ourselves from accepting such myths?

Numbers, statistics, citations, strangely. I know that citations are a staple inside of academic and scientific writing but when you find someone inside the software engineering profession that is whipping out citations at the drop of a hat, you should take that as a warning sign. And there is more but you know we would have to devote an hour or so to that.

Thank you so much for joining us today, it has been great.

Thanks for having me, bye!

by Gareth Wilson at March 18, 2015 11:17 AM

March 16, 2015

Mark Bernstein


Good news: Over The Precipice has already been tweeted or retweeted to about 200,000 people.

Bad news: The armies of Mordor found out, and they're eager to get me topic-banned for mentioning it on my Wikipedia talk page. Looks like they’ve got plenty of sympathetic administrators willing to rid them of this troublesome hypertext researcher.

Worse News: The Gamergaters oppose my topic ban appeal with awful echoes:

While MarkBernstein, writing to us from the top of the Reichstag…–Rhoark
All we get now is Reichstag climbing over admin actions… – ColdAcid


March 16, 2015 06:36 PM

Dave Winer

When will 140-char wall come down?

Yesterday I ran a piece where I said Twitter's 140-char limit is probably in its final days. It's gotten a lot of attention.

Next question: When will the change be announced? Imho, it's not hard to read those tea-leaves either.

Facebook is having a developer conference next Wednesday and Thursday. It's likely that they will talk about their plans for news distribution at this conference.

David Carr ran an article in the NY Times last October that previewed the pitch we'll likely hear. They want publishers to post full content to Facebook. In return they are willing to share ad revenue with the publishers.

The reason this is so important? In a mobile environment, clicking on a link to read a story is a very big price. We all know that mobile is where Facebook's growth is coming from. News reading on mobile can become much more fluid. That's what Facebook wants to do.

So, with Facebook getting full content from at least some publishers, and the announcements likely coming next week, does Twitter really want to explain the magic of 140, and ancient limits of SMS, or would they rather have an equivalent proposition for publishers? Smartphones aren't just the future, they're here, now. It seems like this is the moment to say 140 was nice, it got us to where we are, but now because of mobile, we have to get more text from publishers, if only to remain competitive with Facebook in the one area Twitter still has an advantage (for now) -- news, especially mobile news.

Still reading tea-leaves. I have no direct info, but if Twitter doesn't make the change now, they will be too late. My bet: It'll happen before Facebook's announcements next week.

March 16, 2015 06:01 PM

Reinventing Business

Do What You Love

An old but very insightful article by Paul Graham describing one process for discovering your best life path. Also see Start With Why and What Should I Do With My Life?

by (Bruce Eckel) at March 16, 2015 04:45 PM

Hiring: Steps in the Right Direction

This is a nice post that describes how incompetent our hiring approaches are. In particular, interviews are a terrible way to find employees, because they basically test how well a candidate interviews and not much else. The article describes some better approaches to the problem. One of my favorite observations is that if a candidate doesn't understand a technology, buy them a couple of books and give them a couple of weeks to get up to speed.

I envision a completely different way to discover whether someone is a fit, that all but the most primitive companies will eventually use. The open-spaces conferences I hold have turned out to be fertile hiring ground, for example. You get to see a candidate in various creative situations, with the added bonus that they don't even know they're being interviewed.

by (Bruce Eckel) at March 16, 2015 04:39 PM

Giles Bowkett

And Now For A Breakdown

Here's a live drum and bass set from Mistabishi on a Korg Electribe MX.

Here's another one:

Here's a more electro-house-ish set Mistabishi recorded live at an illegal rave in London last year:

You can actually download all the patterns and patches in this from the Korg web site.

Korg also had Mistabishi demo the new Electribe – basically the next generation of the EMX – in a couple YouTube videos:

(In this one, he enters the video at around 6:45.)

The new Electribe seems pretty cool, but these videos motivated me to buy an EMX instead. The new one's untested, while the EMX is a certified classic, with a rabid fan base, tons of free downloadable sounds, tons of videos on YouTube showing you how to do stuff, forum posts all over the Internet, and rave reviews (no pun intended).

Also, the new version literally has a grey-on-grey color scheme, while the EMX looks like this:

They run about $350 on eBay, but if you find an auction ending 8am on a Sunday, you might pick one up for just $270 (I did).

It also helps that I'm a huge fan of the original Electribe, the Korg ER-1, one of the most creative drum machines ever made. I've owned two (or three, if you count the iElectribe app for iOS, based on the second iteration of the ER-1).

by Giles Bowkett ( at March 16, 2015 04:34 PM

Ladies And Gentlemen, Nastya Maslova

A very talented young multi-instrumentalist, singer, and beatboxer from Russia, with many videos on YouTube (some under her name's Russian spelling, Настя Маслова).

by Giles Bowkett ( at March 16, 2015 04:26 PM

Fog Creek

3 Steps to Clean Up Your Inbox with FogBugz

If you consider yourself a disciplined person, or want to be, that strives for inbox zero and Getting Things Done®, one of the first steps (paraphrased) is simplifying what you have to do. That’s where FogBugz comes in. FogBugz can help you simplify what you have to do when it comes to your inbox with Mailboxes, Notifications, and Filters.

Let’s start with a reasonable guess that you’re talking with your customers, or clients, over email. This happens all day, every day. The great thing about your email provider or email client is that it probably has super awesome search to help you find things when you need them. But your inbox is always full of emails, and things to do at different phases of your process(es), and you’re always losing track of that item you starred that you swore you were going to do a week ago. Have you considered what happens to your email workflow when your business grows and you hire 2 or 3 more colleagues? How do they see what’s going on and react independently? It would be great if everyone could see the same email threads without forwarding emails to each other or cc’ing everyone a million times over. And, you could start tying all these emails together with the bug reports you’re getting for your software, and your planned feature releases.

getting things done fogbugz


Here are a few steps to get your inbox cleared up, and your newly hired colleagues on the same page:

1. Let FogBugz Turn Incoming Emails into Cases


The first step is to get your group email account connected to FogBugz – we call that a Mailbox. Instead of using a distribution list like, make that an actual email account and enable IMAP/POP3 access.

create a mailbox in fogbugz

Since your customers or clients already have this email address, you don’t need to give them a new way of contacting you. Whenever you receive an email to, FogBugz turns that boring old email into a case!

You can even configure a custom automatic response for your mailbox. When anyone emails you (at, they know you’ve received their email, and that you’ll get back to them as soon as you can.

Instead of working primarily out of your inbox, you will start working primarily out of FogBugz. Your customer or client communication will be side-by-side with features and bug reports bringing everyone on your team together. Instead of your colleague yelling or putting in chat “Hey Bob, did you email Julie yet?!”, your colleague can do a quick search like below in FogBugz so that you’re not interrupted:

correspondent:"" edited:today

Note: Copy and paste the search into your FogBugz search box and hit enter. Ensure you change the email address to one relevant to you.

Running that search you then find the case yourself and you know that Julie’s bug report and feature request are being taken care of. And you haven’t interrupted Bob.

Long story short, you’re using FogBugz to email back and forth with the people you need to email with. By doing so, you automatically get full history, audit history even, and your colleagues are all on the same page.

Pro Tip: Configure you Mailbox to automatically set a due date so you don’t have to. For example, you can set it from 1 hour to several days.

2. Configure Your In-App Notifications


By default, FogBugz will send you an email to alert you about new Cases (created from emails) or updates to existing Cases. Receiving email notifications about emails isn’t, in itself, a solution that moves you toward a clear Inbox. Replace email notifications with FogBugz On Demand in-app Notifications to minimize your email clutter. This allows you to get all your notifications in the web application, and remove them from your inbox.


Quickly configure this in your FogBugz user options by choosing the “Never” option for email frequency – it’s ok, it’s not as scary as it sounds.

If you like the idea of never receiving email updates, but you want to try something in between – we have got just the thing for you! Set your email frequency to “Periodic” and you’ll get a digest of all of your notifications.

Now you’ve got a proper mailbox in FogBugz, and you’re using the in-app Notifications, what else can you do? In-app Notifications are great for interrupt-driven work, but what about when you’re trying to plan what to do next, or simply just do what’s next on the “list”?

3. Create and Share Custom Saved Searches


In short, the third step is to use Shared Filters in FogBugz. These will show you what you or someone else, is doing, and what you have to do next. Tidy up multiple Shared Filters with the new Grouped Filters feature.

First, start with everything that you might have missed yesterday – it’s ok, you don’t have to admit that you didn’t get to that one case yesterday (we won’t tell anyone, pinky swear). FogBugz can help you with that overlooked case today! Run a search for anything due up until today, like so:

due:"" orderby:due status:open assignedto:me

Note: status:open includes active and resolved cases, choose status:active if you don’t want resolved cases to show up. This may be more helpful if you’re using the postpone cases feature.

Save that filter. Then, do your colleagues a favor and share it with them so they have it too. It’ll save them precious minutes of their valuable time!

Again, those of you who are familiar with FogBugz may realize that the search above is essentially the default “My Cases” filter. Yes, in a way it is; the default “My Cases” filter will show you everything assigned to you, but it won’t order it by due date or specifically include only the cases due today – this one does.

This filter is a great start, but you should probably create another shared filter that shows all your specific Support (and/or Sales) cases due today:

due:"" orderby:due status:open assignedto:me project:inbox area:support

Pro Tip: Swap out ‘area:support’ with ‘(area:sales OR area:support)’ to get cases from both areas.

Maybe you’re managing the sales and support teams, or maybe you’re just curious if sales efforts have any yet-unmentioned positive or negative effects on the support team. Create a third filter for that and share it:

due:"" orderby:due status:open project:inbox area:support

I could go on and on about filters all day, but I’m going to stop here. The point is that you have these three filters which represent work you’re going to do, or are doing, and now you can organize them into a group, or groups, that makes sense to you. Create a “Watching” group for anything you’ll read to catch up on. Create a “Sales” group, for well, your sales cases and so on.

Screenshot of creating a new filter group and adding a filter to it

Adding your Mailbox to FogBugz, using in-app Notifications and using and sharing custom filters are three steps to get you well on your way to a cleaner inbox, and automatic collaboration with your newfound colleagues. It’s time to team up!

We offer a free 30-day trial of FogBugz – try it for free with a colleague at Each trial includes Kiln with Code Reviews, our source control product.

by Derrick Miller at March 16, 2015 02:47 PM

John Udell

What happened to customer service? Try Twitter

Last week my son was scheduled to take a train from Brattleboro, Vt., to Philadelphia, Pa. On the morning of his trip, he texted me this message:

I got a computerized message from Amtrak. They said there's an issue with my train. I don't know if it's late or cancelled or what's going on.

Had he checked Yes -- the story there: "Status unavailable due to service disruption."

[ 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. ]

I tuned into @amtrak on Twitter. There was no information about this incident, but the flow of recent messages about other travel delays suggested it might be useful to tweet this inquiry:

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

by Jon Udell at March 16, 2015 10:00 AM

March 15, 2015

Dave Winer

A Medium-size hole in Twitter

Some people call "vendor sports" what I call it tea-leaf reading. I've been doing it for decades. I like to watch, and guess, based on incomplete information, what the various forces in the tech industry are doing.

A lot of times you can discern what big companies are doing, the same way astrophysicists discern the existence of black holes, by the effects they have on smaller more visible entities.

In this case, I think perhaps Twitter is getting ready to bust through the 140-character limit. Why? Because Medium appears to have given up on merging with them. How can I tell that? Well, because they went straight after Twitter, by introducing a timeline, and short Tweet-like messages, without the 140-character limit. This was Medium blinking. I was really surprised they did this. Up to that point I thought Medium was a juggernaut. That they were cleaning up. Apparently not. Apparently they needed to tap into greater growth potential. And if anyone is likely not to be overly respectful of Twitter's internal engine, it's the founder. He knows how the sausage factory really works, where the bodies are buried, etc. The stuff that we don't know.

I always thought Medium's manifest destiny was to be acquired by or to acquire Twitter (in the same way NeXT acquired Apple in 1997). The founder returns, bringing with him a feature that users are likely to adore. I said it this way: "There's a Medium-size hole in Twitter." I thought that was funny. Funny because it was so true.

I imagine, via tea-leaf-reading, that Dick told Ev, "Sorry dude, we decided to make vs buy, you want too much money, so we decided to build our own Medium clone inside Twitter." Much the way they said that wanted too much for their URL-shortener five years ago.

One way or the other. imho, the 140-char wall is not long for the world.

PS: I thought it would be interesting to tweet a link to this piece in Medium. I had to do it by hand of course, would be nice to hook it up to Radio3 via API. :thumbsup:

PPS: When will the 140-char wall come down? See this follow-up post.

March 15, 2015 06:57 PM

Mark Bernstein

Over The Precipice

Wikipedia’s Arbitration Committee, ever a font of hilarity, has formally responded to my Request For Clarification and unanimously decided that “Campus Rape” does indeed fall under Gamergate discretionary sanctions. (Link updated) So, apparently, does the biography of Lena Dunham, and sections of NFL pages that deal with abusive players, sexual assaults by players.

From here on out, every biography of a living woman who is disliked by the American Right will be subject to the Gamergate discretionary sanctions. Male biographies would only be involved if the men have notable gender controversies: a doctor who conducts abortions, say, or who defends the right of women. Any woman can be involved in a gender-related controversy at any time: just get people to talk about her appearance, or her sex life, or her abortion, and Bob’s your uncle.

Every biography of a lesbian, gay, transgender, or gender-queer person is apparently subject to Gamergate discretionary sanctions, since it’s obvious that these are potentially controversial and gender is involved somehow. Of course, people in heterosexual relationships are not covered as there’s no potential for controversy there, right?

This mess stems, ultimately, from Wikipedia’s anti-intellectual tradition. The Encyclopedia Anyone Can Edit™ can easily become the encyclopedia where everyone is an expert with no need to seek advice or to look stuff up. Hetero-normative? Androcentic? Oblivious?

Research needs to look more closely at Wikipedia’s capture by the right. I’ve been focusing here on sexism and Wikipedia, but Wikipedia’s roots lie in Libertarian techno-utopianism and I suspect it’s increasingly dominated by an alliance of libertarians and tea partiers. It’s a tricky question: Wikipedia is also plagued by right-wing zealots from Israel, Ukraine, and the Balkans. Of course, these aren’t separate in the way they used to be: Netanyahu’s big donor is also the big money behind Newt Gingrich.

Last week, a pair of Gamergaters attempted to out a software developer on a Wikipedia talk page. Their canard was published for eight hours before someone finally obliterated it. The perpetrators have not been sanctioned.

Meanwhile, I'm being read out of meeting for having the temerity – can you imagine? – to allude, during a discussion of an article about collusive editing of Wikipedia’s Gamergate page, to (get this) collusive editing of Wikipedia Gamergate page. I wrote:

“It is fascinating that the particular group of editors who recently were so eager to cite Gamergate wikis, weblogs, and Breitbart are reluctant to inform newcomers to this article of this important new essay. Why would that be?

No doubt this was a very wicked thing to say, though I’m not sure how. I repeat it and the Wikipedians all gasp, grow pale and flutter their handkerchiefs. It might violate WP:MOMHESLOOKINGATMEFUNNY, except that's not an actual Wikipedia policy.

There are worse things: One of those worse things is outing -- the real thing, not the Wikipedia thing. It can ruin careers and cost lives. This is not a mere content dispute or a fight about infoboxes.

You can’t make this stuff up.

At yesterday’s St. Patrick’s Day breakfast, I had a brief chat with my Representative, Katherine Clark (D-MA), who recently spoke out about Gamergate and internet harassment (Mother Jones ❧ . Tech CrunchJezebelThe Hill). She makes an excellent point: it’s not just games, and accomplished women get this all the time. Even the Congresswoman was surprised at the Twitterfed vitriol heaped on her for asserting that the government ought to protect the rights of women to be software developers if that's what they want to do.

The NY Police tried to edit Wikipedia to remove criticism of police shootings. (I’m inclined to suspect that someone tied to the Aaron Swartz prosecution did the same thing last year, incidentally.) This was only caught because the police were lazy, incompetent, and edited from work; if they'd done the work at home or at the NY Public Library, they'd have been praised.

Last week, Katherine Clark was at Selma. We are all at Selma again.

March 15, 2015 03:58 PM

March 13, 2015

Mark Bernstein


Recently, Shanley Kane wrote a series of Twitter posts which explain what's going on at Wikipedia and why it matters. For ease of reading, I've reformatted into conventional paragraphs and lightly edited, and I’ve moved this from my Wikipedia user page because the Gamergate crew armies of Mordor complained of it.

They have been testing and perfecting a terrorism formula to ruin target's lives, attempt to get them murdered or drive them to kill themselves.

The first step is doxxing and death threats, which immediately destabilizes the target's most fundamental sense of safety and security. This often forces target to leave their home & immediately stop any career/family/social/community work as they work to re-establish safety. It creates the isolation needed for longer-term campaigns (100s of threatening, abusive, harassing messages per hour) to have max. impact. Under these conditions, the target's mental health will rapidly decline and suicide ideation, self-harm, anxiety and panic sets in. This causes lasting trauma that will not only temporarily silence but forever change the target's sense of safety and support in speaking.

They then start digging in detail through your past to "find"/"invent" things to justify harassing you and get more ammo. This has the nice bonus effect of "proving" to your "community" that you deserve harassment and aren't worth supporting = more isolation. In white-male dominated, misogynist environments, it is incredibly easy to signal to a target's community that they don't deserve support. Thus, abandonment by their community is easily secured as the target suffers from the campaign to dig up their past.

That campaign signals to any stalkers, past partners, etc. that now is the time to GET THEM. This often means cyber sexual assault & DV. As well as outing of gender identity, sexuality, etc. which threaten any career and family support system that may exist If ''anyone'' is defending you at this point, the same techniques are applied to supporters to make sure that stops. The message is clear: This target ''will'' be left completely isolated as we torture, terrorize and abuse them with impunity... or else.

This is a formula, it is known and documented, it has been tested and refined, and it is becoming more effective and scalable. So please, wake the fuck up and realize what we are dealing with here because for the 100th time: this is just the beginning. There are three ultimate goals: incite someone to murder the target, manipulate the cops to do it, or drive the target to suicide. Period.

March 13, 2015 03:06 PM

March 12, 2015

Fog Creek

Protecting the Maker’s Schedule From Chat

OK, we’ve all done it. You spotted a little issue, or couldn’t remember something. So you opened up Chat and quickly pinged a colleague about it. It wasn’t that important to you, but it was right there in the front of your mind, so you asked anyway. Harmless, right?

Well, maybe not. At least not for creatives. Developers, designers and anyone else who creates or builds things, work in a different way to most people. They work on a ‘Maker’s Schedule‘ as Paul Graham puts it, based around units of time of half a day at least. Unlike managers, sales people, and other team members who have fractured days – working in short, hourly blocks around meetings. Makers work best in blocks of uninterrupted time. For a maker, even a single meeting, or other interruption during this creative time can prove disruptive. What may seem like a minor interruption – a single question pinged on chat – distracts them and takes them out of their flow.

private_office (2)

Our solution is to file a case. Shocker – the creators of an issue tracker think cases are great. But along with private offices for developers and a healthy absence of meetings, it’s something that has been a critical part of our culture for a long time. And honestly, we just think it’s the solution that’s most respectful of a colleague’s time. By simply creating a case with the relevant details, the issue is documented and assigned to the maker in a manner that minimizes disruption. This allows them to prioritize and action the issue at a time that fits their workflow.

As a recent Creeker, I must admit this took some getting used to. I had cases for the smallest of tasks and even just questions. Cases didn’t seem as gentle as chat, but somehow harsher, maybe even passive-aggressive. I think it’s because by creating a case, it made it a Thing® rather than just a quick question. Cases are permanent, whereas chat feels temporary. But, in fact, if you raise a random question on chat then it’s doing the receiver a disservice. It suggests that what you want to discuss is more important than whatever they’re working on.

Chat can also be limbo for information. Whoever you pinged on chat may have read it, but this doesn’t mean they were really paying attention. The onus is on the recipient to handle the information received. So often, you just get back a lacklustre response and the problem gets forgotten about, lost amongst the Cat Gifs and integration notifications.

What’s more, a problem raised in a 1-to-1 chat prevents others from working on it too. So it can increase the communication cost if it has to be passed on to someone else. Chat also seems to demand an immediate response. Sure, you can set your status to ‘busy’, but we don’t always remember to do that, and how often is it noticed or respected anyway?

This isn’t to say don’t use chat. We use it all the time across the company. It’s more to do with using the right form of communication for the task or question. Do you really need an immediate response, and from that one person? The simplest thing for you to do at that moment isn’t without its consequences for others. So, don’t ping me. File a case.

by Gareth Wilson at March 12, 2015 12:27 PM

Blue Sky on Mars

Even More Emoji Abuse 🚧🚨

In 2012, I wrote a post titled Abusing Emoji in iOS and Your Mac 👑💩.

People seemed to like it, since I saw a lot more wifi networks and Macs on the network whose names consisted of emoji. If that's not progress for our society, I don't know what is.

Home directory emoji

After all my talks over the years, I somehow had never given a lightning talk until last night at SydPHP's meetup in Sydney. I knew I needed to go big and bring something huge to the table for my first time. Instead, I settled on giving a shitty one about emoji instead.

Language and Region

The first half of the talk comes from the aforementioned post; the second half is culled from my jetlag-addled brain. That half includes emoji at your local florist, trolling your British friends who never use emoji, and my new favorite, the Languages hack that lets you install emoji across all of OS X.



I know it got recorded; I'm going to see if I can sneak the video in here at some point in the future.

If you're reading this four years later, then it's a safe bet that I couldn't track the video down, but don't mention it to anyone so we can trick the next person who comes along and reads this.

March 12, 2015 12:00 AM

March 11, 2015

Dave Winer

What is lock-out?

As users, we're all familiar with the idea of lock-in.

A service starts. They offer something attractive. We use it. And later find out that we can't move without leaving behind everything we created there.

That's lock-in.

Lock-out applies to developers.

A service starts, offers something attractive to users. But it has no API. It can't share its data with any other application. It can't receive data either. If a user wants to create something, they have to use their editor. And if they like the editor, they can't use it to create something that lives elsewhere. The creation and serving are bound together in a closed system. No other software can enter.

A system with APIs is part of a network of software. One without APIs stands alone. If you get an idea for a feature that would make a world of difference, you can't implement it unless they offer you a job, and once inside, let you do it. And don't cancel the project before it's done. And it isn't taken over by someone else in a organization shift. There's a reason big companies don't create new stuff, they are subject to rules that individual creators aren't. They aren't free to try new ideas out.

I guess all industries have lock-out. The moneyed people own everything, and in order to create, you have to fit in. And most really creative people don't.

Then you have systems that are not locked-out, like Twitter and Facebook, but are subject to revision at any moment. This is imho better than not having APIs at all. At least the world can get a glimpse at the idea before it's shut down. In a fully locked-out system, new ideas are stillborn.

The good news is the costs on the net today are so low that there really is no technologic or economic reason for lock-out. And so many developers want to make open source contributions. It's really just a matter of organizing the work to create open alternatives to the locked-up systems created by the tech industry. We need user-oriented frameworks for free systems. This is the one area where open rebellion is not only legal, it's encouraged. At least if you listen to and believe the proponents of free markets. We're going to find out.

I wrote a story on my liveblog on Monday about my personal experiences with lock-out.

Also see an offer I made to Medium when they started, in 2012. They could lead a new wave of silo-free writing for the web.

March 11, 2015 04:03 PM

March 10, 2015

Mark Bernstein


This is impressive writing; in the guise of writing yet another restaurant recipe book. Hamilton has written an intelligent and sympathetic response to Kitchen Confidential, a delightful portrait of a chef masquerading as a cookbook. This looks like a collection of recipes, but the recipes are written (and the book designed) not as if they’re adapted for the home cook, but instead as if they’re odd sheets of instructions to be handed to new line cooks. There are lots of canny and charming words of warning and advice – including several mentions of shortcuts that we wouldn’t take if we were “a real restaurant.”

There’s an entire chapter on garbage: how to use up food that even professional kitchens would throw away. (Example: sardine heads and bones: season, deep fry, and send ’em out to guests who are chefs, line cooks, or other professionals who’ll understand. These are not to be wasted on mere VIPs.)

Cookbooks are usually meant to be instructive; here, we’re not always offering the instructions we’d expect. In prepping the paté for a bar snack sandwich, the recipe advises that for a half batch one should make a cardboard and foil partition so you can use half the paté pan, and if you don’t know how, you should “find me and we’ll do it together.” Yes, chef. In prepping a dish based on lamb-filled wontons, the recipe calls for grabbing any intern or trailer in the house that night, because the prep is such a bitch. You don’t get this stuff from Joy of Cooking.

Recipes are scaled for service — but that often works out conveniently to 8, which is to say a dinner party, and we all know division. There’s some fun reverse snobbery at work here too: the “duck liver garbure” is made with foie gras (and, we’re warned, is not really a garbure so don’t call it that if we get a job someday in a real restaurant).

March 10, 2015 05:39 PM

Fog Creek

Working Effectively with Unit Tests – Interview with Jay Fields

.little {font-size: 75%}

Looking for audio only? Listen on


In this interview with Jay Fields, Senior Software Engineer at DRW Trading, we discuss his approach to writing maintainable Unit Tests, described in his book ’Working Effectively with Unit Tests’. We cover how to write tests that are maintainable and can be used by all team members, when to use TDD, the limits of DRY within tests and how to approach adding tests to untested codebases.

For further reading, check out his blog where he writes about software development.


Content and Timings

  • Introduction (0:00)
  • About Jay (0:30)
  • Writing Unit Tests in a Team (2:27)
  • DRY as an Anti-Pattern (3:37)
  • When to use TDD (5:12)
  • Don’t Strive for 100% Test Coverage (6:25)
  • Adding Tests to an Untested Codebase (7:50)
  • Common Mistakes with Unit Tests (10:10)




Jay Fields is the author of Working Effectively with Unit Tests, the author of Refactoring: Ruby Edition, a software engineer at DRW Trading. He has a passion for discovering and maturing innovative solutions. He has worked as both a full-time employee and consultant for many years. The two environments are very different; however, a constant in Jay’s career has been how to deliver more with less. Jay, thank you so much for joining us today. We really appreciate it. Can you share a bit about yourself?

About Jay

Thanks for having me. My career has not really been focused in a specific area. Every job I’ve ever taken has been in a domain I don’t know at all, and a programming language, which I don’t really know very well. Starting with joining ThoughtWorks and being a consultant was a new thing for me. I was supposed to join and work on C# and ended up in the Ruby world very quickly. I did that for about five years, and then went over to DRW Trading to do finance, again something I’ve never done, and to do Java, something I had no experience with. That worked okay, and then I quickly found myself working with Clojure. It’s been interesting always learning new things.

Picking up on the book Working Effectively with Unit Tests, most developers now see unit testing as a necessity in software projects. What made you want to write a book about it?

I think it is a necessity in pretty much every project these days, but the problem is, I think, really a lack of literature beyond the intro books. You have the intro books that are great, and I guess we have the xUnit Patterns book, which is nice enough as a reference. It’s not very opinionated, and that’s great, we need books like that also. But, if I were to say, I prefer this style of testing, and it’s very similar to Michael Feather’s approach to testing. There’s no literature out there that really shows that. Or, I prefer Martin Fowler’s style of testing, there’s no literature out there for that. I really don’t know of any books that say, “Let’s build upon the simple idea of unit testing, and let’s show how we can tie things together.” You can see some of that in conference discussions, but you really don’t see extensive writing about it. You see it in blog books, and that’s actually how my book started. It was a bunch of blog books that I had over 10 years that didn’t really come together. I thought, if I were to say to someone, “Oh, yeah just troll my blog for 10-year old posts, they’re not really going to learn a lot.” If I could put something together that reads nicely, that’s concise, people can see what it looks like to kind of pull all the ideas together.

Writing Unit Tests in a Team

In the book you say, “Any fool can write a test that helps them today. Good programmers write tests that help the entire team in the future.” How do you go about writing such tests?

It’s really tough. I don’t see a lot written about this either, and I think it’s a shame. I think you first have to start out asking yourself, “Why?” You go read an article on unit testing, and you go, “Wow! That’s amazing! This will give me confidence to write software.” You go about doing it, and it’s great because it does give you confidence about the software you’re writing. But the first step I think a lot of developers don’t take is thinking about, “Okay, this is great for writing. It’s great for knowing that what I’ve just written work, but if I come back to this test in a month, am I going to even understand what I’m looking at?” If you ask yourself that, I think you start to write different tests. Then once you evolve past that, you’re really going to need to ask yourself, “If someone comes to this test for the first time, someone goes to this line of code in this test, and they read this line of code, how long is it going to take for them to be productive with that test?” Are they going to look at that test and say, “I have no idea what’s going on here.” Or, is it going to be obvious that you’re calling this piece of the domain that hopefully everyone on the team knows, and if they don’t, it follows a pattern that you can get to pretty easily. I think it’s a lot about establishing patterns within your tests that are focused on team value and on maintenance of existing tests, instead of focused on getting you to your immediate goal.

DRY as an Anti-Pattern

You also mentioned that applying DRY, or don’t repeat yourself, for a subset of tests is an anti-pattern. Why is this?

It’s not necessarily an anti-pattern, I think it’s a tradeoff. I think people don’t recognize that merely enough. You’re the programmer on the team. You didn’t write the test. The test is now failing. You go to that test, and you look at it, and you go, “I don’t know what’s going on here. This is not helpful at all. I see some field that’s magically being initialized. I don’t know why it’s being initialized.” At least if you’re an experienced programmer, then hopefully you know to go look for a setup method. But imagine you have some junior guy, just graduated, fantastic programmer. He’s just not really familiar with xUnit frameworks that much. Maybe he doesn’t know that he needs to look for a setup method, so he’s basically stuck. He can’t even help you at that point without asking for help from someone else. DRY’s great. If you can apply DRY on a local scale within a test. It’s fantastic if you can apply it on a global scale, or across the whole suite, so that everybody’s familiar with whatever you’re doing then that’s great too. That helps the team, but if you’re saying that this group of tests within this trial behave differently than these tests up here, you’re starting to confuse people. You’re taking away some maintainability, and that’s fine, maybe you work by yourself so no one’s confused because you did it, but recognize that tradeoff.

When to use TDD

You’re a proponent of the selective use of Test-Driven Development. What type of scenarios are helped by TDD, and when should a developer not apply such techniques?

It’s a personal thing. For me, I think I can definitely give you the answer, but I would say everybody needs to try TDD, just try it all the time. Try to do it 100% of the time, and I think you’ll very likely find that it’s extremely helpful for some scenarios, and not for others. Maybe that’ll differ by person, so everyone should give it a try. For me personally, I’ve found when I know what I want to do, if I pretty have a pretty mature idea of what needs to happen, than TDD is fantastic because I can write out what I expect, and then I can make the code work, and I have confidence that it worked okay. The opposite scenario where I find it less helpful is when I’m not quite sure what I want, so writing out what I want is going to be hard and probably wrong. I find myself in what I think is kind of a wasted cycle of writing the wrong thing, making the code do the wrong thing, realizing it’s wrong, writing the new thing that I expect which is probably also wrong, making code do that, and then repeating that over and over, and asking myself, “Why do I keep writing these tests that are not helpful? I should just brainstorm, or play around with the code a little bit, and then see what the test could look like to once I have a good idea of the direction it is going.

Don’t Strive for 100% Test Coverage

You say you’re suspicious of software projects approaching 100% test coverage. Why is this, and why is 100% coverage not necessarily a goal we should all strive for?

Earlier on I thought it was a good idea, 100%, because I think a lot of people did. I remember when Relevance used to write in their contracts that they would do 100%, and I thought, “Man, that’s really great for them, their clients.” Then you start to realize you need a test things like, say you’re writing in C#, and you have to automatically generate a set. Do you really want to test that? I think all of us trust that C# is not going to break that functionality in the core language, but if you put that field in there, then you have to test it if you want to give 100% coverage. I think there will be cases where you would actually want to do that. Let’s say you’re using some library, and you don’t really upgrade that library very often, and even though you trust it, maybe you’re writing for NASA or maybe you’re writing for a hospital system – something where if it goes wrong, it’s catastrophic. Then you probably want to write those tests. But if you’re building some web 2.0 start up, not even sure if the company is going to be around in a month, you’re writing a Rails app, do you really want to test the way Rails internals work? Because you have to, if you want 100% coverage. If you start testing the way Rails internals work, you may never get the product out there. You’ll have a great test suite for when your company runs out of money.

Adding Tests to an Untested Codebase

So that’s what’s wrong with too many tests. What about a code base with no tests? How can you approach getting test coverage on an untested code base?

I think the focus for me is really return on investment. Do you really need to test everything equally when the business value is not the same? Let’s say for instance, you’re an insurance company. You want to sell insurance policies. So you need a customer’s address, and you need a social security number, probably, to look them up, some type of unique key, and after that, you just want to charge them. Maybe you need their billing details, but you don’t really care if you got their name wrong, you don’t really care if you got their age wrong. There are so many things that aren’t really important to you. As long as you can keep sending them bills and keep getting paid and find the customer when you need to, the rest of the stuff is not as important. It’s nice. Whenever you send them the bill, you want to make sure the name is correct, but it’s not necessary for your software to continue working.

When I’m writing tests, I focus first on the things that are mission critical. If the software can’t succeed without a function working correctly, or a method working correctly, then you probably need some tests around that. After that you start to do tradeoff, basically looking at it and figuring out, “Well, I want to get the name right. If I get the name wrong, what’s the cost?” Well, getting the name wrong I’m not sure if there’s much of a cost other than maybe an annoyed customer that calls up and says, “Can you fix my name?” So, you have maybe have some call center support. I’m guessing that the call center is going to be cheaper than the developer time. So do we want to write a test with a Regex for someone’s name and now we need UTF support, and now we need to support integers because someone put an integer in their name? And you get in to this scenario where you are maintaining the code and the tests. Then maintaining the tests is stopping you from getting a call center call. It’s probably not a good tradeoff. I just look at the return in investment of the tests, and if I have way too many tests, every amount of code needs to be maintained. If I have too many tests, than I need to delete some because I’m spending too much time maintaining tests that aren’t helping me. If I have not enough tests, then it’s very simple, just start to write some more. I guess I tend to do that with whenever a bug comes in for something that’s critical. Hopefully, you caught it before then, but occasionally they get into production, and you write tests around that. I always think to myself, whenever the bug comes in, what was the real impact here?

Common Mistakes with Unit Tests

What are some of the common mistakes you see people making when writing unit tests?

I think the biggest one is just not considering the rest of the team, to be honest. It’s really easy to do TDD. You write a test, and then you write the associated code, and you just stop there. Or, you do that, and you then you apply your standard software development patterns, so you say, “How can I DRY this up? How can I apply all the other rules that have been drilled into me that I need to do with production code? What’s really important?” Now if understanding the maintenance, understanding that what will help you write the code doesn’t necessarily mean it’s going to help you maintain the code. What I find myself often doing, actually, is writing the test until I can develop the code, so I know that everything works as I expect, then deleting that test and writing a different test that I know will help me maintain it. I think the largest mistake people make is they don’t think about the most junior member of the team. Think about this very talented junior member on your team that joined not that long ago. Are they going to be able to look at this test and figure out where to go from there? And if the answer’s no, then that might not be the best test you could write for the code.

Beyond your book, can you recommend some resources for developers interested in learning more about writing effective tests?

I think that there are great books that help you get started. I think the Art of Unit Testing is a great book to help you get started. There’s the xUnit Patterns book that’s really good. The problem is, I really don’t think there’s much after that. At least I haven’t found much. Kevlin Henney has done some great presentations about test-driven development. I personally really like Martin Fowler’s writing and Michael Feathers’ writing and Brian Marick, but I don’t know of any books. I really think that there’s room for some new books. I think that, hopefully, people will write some more because unit testing’s only going to be more important. It’s not going away, it’s not like people think this is a bad idea. Everybody thinks this is a great idea. They just want to know how to do it better.

Jay, thank you so much for joining us today. It was a pleasure.

Yeah, it was great! Thank you very much for your time.

by Gareth Wilson at March 10, 2015 11:43 AM

Ian Bicking

A Product Journal: As A Working Manager

One of the bigger changes going from engineer to manager was to redefine what I meant by the question: how are we going to do this? As an engineer I would deconstruct that question to ask what is the software we need to build, and the technical barriers we need to remove, to achieve our goals. As a manager I would deconstruct that question to ask what is the process by which we achieve our goals.

When I wear my manager hat and ask “how are we going to do this?” I get a little frustrated when I get the answer “I don’t know.” But that’s unfair – there are always problems to which we do not know the answer. What makes me frustrated is when the answer comes too quick, when someone says “I don’t know” because they are missing something they feel they need to come up with an answer. I don’t know because we have to write more code before we know if the idea is feasible. I don’t know because the decision is someone else’s, and so on.

You know! If the decision is someone else’s, then the answer to the question is: we are going to do this by asking that other person what they want and how they are going to make that decision. If we don’t know if the idea is feasible, then the answer to the question is: we are going to do this by exploring the feasibility of this technique, and doing another iteration of planning once we know more. “I don’t know because…” is fine because it is an answer of sorts, it lets the team make an answer in the form of a process. “I don’t know.” – ended with a period – is even okay for a moment, if you treat it as meaning “I don’t know so we are going to do this by learning.” It’s the “I don’t know, let’s move on” that I don’t like.

But I’m being a little unfair. It’s my job as a manager to answer at the process level. While I try very hard not to pigeonhole people, maybe I should also work harder at accepting when people establish bounds to their role. When you are trying to produce it can make sense to stay focused, to resist going meta. When you are working in a team, you should rely on the diverse skills of your teammates to let go of certain parts of the project. It can be okay to go heads-down. (Sometimes; and sometimes everyone on the team must lift their heads and respond to circumstance.)

This is a long-winded way of saying that I appreciate more of the difference in perspective of an engineer and a manager. It’s hard to hold both perspectives at once, and harder still to act on both.

In my new project I am returning to development, and entering into the role of working manager, an odd way to say that I am performing the same tasks that I am also managing. I cut myself off from programming when I started management so that I would not let myself be distracted from a new role and the considerable learning I had to do. Returning to programming, I can tell I was right to do so.

Moving between these two mindsets, and two very different ways of working, is challenging. In both I want to be proactive, but as a manager towards people, and as an engineer towards code. With people I’m investing my time in small chunks, trying to keep a good velocity of communication, watching for dropped balls, and the payoffs are largely indirect and deferred. With code it takes time to navigate my next task, I want to focus, I’m constantly trying to narrow that focus. And the payoff is direct and immediate: working code. This narrowed focus is a way to push forward much more reliably, so long as I know which way is forward.

But I’m a working manager. Is now the right time to investigate that odd log message I’m seeing, or to think about who I should talk to about product opportunities? There’s no metric to compare the priority of two tasks that are so far apart.

If I am going to find time to do development I am a bit worried I have two options:

  1. Keep doing programming after hours
  2. Start dropping some balls as a manager

I’ve been doing a little of both. To mitigate the effect of dropping balls I’ve tried my best to be transparent about this. It may have been effective: I am not doing my best work on X, because I’m trying to do my best work on Y. But I won’t really know if this has worked until later, turnaround on relationship feedback takes a while.

An aside: I’ve been learning a bit about Objectives and Key Results, a kind of quarterly performance analysis structure, and I particularly appreciate how it asks people to attempt to achieve 70% of their identified goals, not 100%. If you commit to 100% then you’ve committed yourself to a plan you made at the beginning of the quarter. You’ve erased your agency to prioritize.

Anyway, onward and upward, and wish me luck in letting the right balls drop.

by Ian Bicking at March 10, 2015 05:00 AM

March 09, 2015

Fog Creek – Interview with Hakim El Hattab

#wrapperb { width: 100%; overflow: hidden; } #firstb { width: 70%; float:left; } #secondb { padding-left: 30px; overflow: hidden; } body .content .post .entry #secondb img, .previous img, .previous { border: none !important; box-shadow: none !important; } .little { font-size: 75% } .previous span { display: inline; } table.previous, .previous tbody, .previous tr, .previous td { border: 0px !important; border-bottom: 0px !important; background: transparent; text-align: center; }

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 Hakim El Hattab, a front-end developer and Co-founder of Slides, an online presentation tool. He previously worked at Qwiki and Squarespace, and he publishes experiments exploring interaction and visual effects on his site.

Location: Stockholm, Sweden
Current Role: Co-founder of Slides

How did you get into software development?

I think I was twelve years old when a computer first entered our home. It was a Macintosh Classic and I lost many hours to some of the great games it came pre-installed with. Five years later I started building HTML sites with a friend. By “building” I am referring to the process of slicing a Photoshop design into bitmaps, using Dreamweaver to piece those bitmaps together in a huge table and finally uploading the multi-megabyte spectacle to a free host.

After that, I went on to study video post-production and animation while teaching myself Flash and ActionScript on the side. Eventually, the things I had taught myself led to a job opportunity as a Web Developer and I decided to drop out of school.


Tell us a little about your current role

Last year I departed from my job as Lead Interface Engineer at Squarespace in NYC and moved back home to Sweden to go full-time on Slides. Slides is a service for creating and sharing presentations that I co-founded together with Owen Bossola. It’s based on reveal.js, an open-source HTML presentation framework that I’ve been working on for a few years now.

My typical day starts with catching up on support tickets and email, followed by product work, which includes a healthy mix of code and design. I work from home and try to make use of the flexibility that comes with that by taking a longer lunch break and heading outside with my wife and daughter. In the afternoon when Owen wakes up in NYC, we catch up on any current topics via chat.

We offer the ability to export Slides presentations to PDF, but this functionality has been plagued with issues since its release. We were originally using PhantomJS on a Linux server, but the output suffered from poor font rendering, missing web fonts and broken links.

After testing a number of options, we recently decided to switch to generating PDFs using a slightly modified version of wkpdf on an OS X server. This provides excellent font rendering and is powered by a more recent version of WebKit.

When are you at your happiest whilst coding?

I enjoy coding the most when I’m going fast. Nothing goes up against the feeling of a fresh start. A new project and a blank document. Unencumbered by legacy.


What is your dev environment?

My setup is pretty lightweight, I use a 13” MacBook Air and do all my coding in Sublime Text. An editor plugin that I really like is Git Gutter. It indicates which lines of code have changed locally in a very unobtrusive way.

One app I’ve been really happy with lately is f.lux. It adjusts the color temperature of your display depending on the time of day to make it easier on the eyes. Particularly useful when you live up north where it’s dark for most of the days.

Having survived one too many back-breaking chairs I recently decided to get myself a Herman Miller Embody. Highly recommended.

What are your favorite books about development?

I had a great laugh reading Peter Welch’s “Programming Sucks”.

What technologies are you currently trying out?

Service Workers are looking very promising. I’d love to experiment and see if that’s one way we could support offline editing in Slides.

When not coding, what do you like to do?

I recently became a Father so lately I’ve been spending a lot of time with my daughter. Besides that, I love photography and try to find time for some video games when the rest of the family are asleep.

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

Finishing and releasing projects is more important than learning every language and framework.


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


Recent Interviews

Bob Nystrom
Brian Bondy
Jared Parsons
Salvatore Sanfilippo

by Gareth Wilson at March 09, 2015 01:38 PM

John Udell

Why mobile apps are a step backward

A few years ago I attended a conference organized by Brian Fitzpatrick. Here's part of the email Brian sent to attendees:

This year we've worked out a discount rate of $119 a night with the Marriott which is about two blocks away from the Innovation Center. You can make a reservation at this rate by following this link: ORDORDA&fromDate=1/20/12&app=resvlink

Beautiful! Rather than describing where to go on the Marriott site and what information to plug into the form when I got there, Brian composed a URL that encapsulated that data and transported me into Marriott's app in the right context.

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

by Jon Udell at March 09, 2015 10:00 AM

March 08, 2015

Dave Winer

The next version of

I've had it in the back of my head for a while that I should just go all the way with a simple browser-based blog post editor, that with a single click would produce a modern essay page, like the ones Medium puts out. After all, when I complain that people post their essays in a locked-up silo, what are the easy alternatives?

Tumblr is trying to get there, apparently, but there's still a lot more to Tumblr than there is to Medium. So it's not immediately obvious how to substitute one for the other. And immediate obviousness is required for the limited attention we have these days. Miniscule attention, actually.

Last Monday I decided to spend a few days taking to the next step. To add an editor that publishes stories to their own static pages. I have a very good back-end, written in Node.js, that's all set up to do this. I started with the MacWrite demo program, and it took five days to get all the way through it. I can now publish from the browser to a static web page, with simplicity and beauty.

Now, the editor is not as good as Medium's. Mine doesn't have comments, for example. But this will serve as a way for people to relatively easily participate in the open web, without locking into a silo. And if it proves popular, there can be more versions.

Not sure when I will open this up, but I wanted to put it out there that it is coming.

PS: As always this will likely not get covered by the tech press, so if you want people to know about it, you'll have to tell them.

March 08, 2015 06:34 PM

Mark Bernstein


Obama at Selma (must-read: Fallows’ on “Finally I Hear a Politician Explain My Country Just the Way I Understand It”)

That’s what America is. Not stock photos or airbrushed history, or feeble attempts to define some of us as more American than others. We respect the past, but we don’t pine for the past. We don’t fear the future; we grab for it. America is not some fragile thing. We are large, in the words of Whitman, containing multitudes. We are boisterous and diverse and full of energy, perpetually young in spirit. That’s why someone like John Lewis at the ripe old age of 25 could lead a mighty march.

Oh my: “a mighty march.” We all know who that sounds like.

The American instinct that led these young men and women to pick up the torch and cross this bridge, that’s the same instinct that moved patriots to choose revolution over tyranny. It’s the same instinct that drew immigrants from across oceans and the Rio Grande; the same instinct that led women to reach for the ballot, workers to organize against an unjust status quo; the same instinct that led us to plant a flag at Iwo Jima and on the surface of the Moon

Men and women, torch and bridge, revolution and tyranny, ocean and river, women and labor, the world war and the moon: we know who that sounds like. That’s Lincoln. But the contraction — the contraction is purest Reagan: even now, Obama reaches out for those with ears to hear.

And what Republican today would dare mention that river?

The speech is filled with presidential echoes.

When it feels the road is too hard, when the torch we’ve been passed feels too heavy, we will remember these early travelers, and draw strength from their example.

Hello, Jack.

And once more, we close at the very beginning:

We honor those who walked so we could run.  We must run so our children soar.  And we will not grow weary.  For we believe in the power of an awesome God, and we believe in this country’s sacred promise.

We worship an awesome God in the blue states….

March 08, 2015 05:16 PM

March 07, 2015

Greg Linden

Data Maven from Crunchzilla: A light introduction to statistics

Crunchzilla just launched Data Maven!

Data Maven from Crunchzilla is a light introduction to statistics and data analysis.

For too many teens and adults, if they think about statistics at all, they think it's boring, tedious, or too hard. Too many people have had the experience of trying to learn statistics, only to get bogged down in probability, theory, and math, without feeling that they were able to do anything with it.

Instead, your first exposure to statistics should be fun, interesting, and mostly easy. Data Maven from Crunchzilla is more of a game than a tutorial. To play, you answer questions and solve problems using real data. Statistics is your tool, and data provides your answers. At the end of Data Maven, you'll not only know a bit about statistics, but also maybe even start to think of statistics as fun!

Like programming, statistics and data analysis are tools that make you more powerful. If you know how to use these tools, you can do things and solve problems others cannot. Increasingly, across many fields, people who understand statistics and data analysis can know more, learn more, and discover more.

Data Maven is not a statistics textbook. It is not a statistics class. It is an introduction. Data Maven demystifies statistics. Teens and adults who try Data Maven build their intuition and spark their curiosity for statistics and data.

Please try Data Maven yourself! And please tell others you know who might enjoy it too!

by Greg Linden ( at March 07, 2015 07:09 PM

Giles Bowkett

Why Ron Jeffries Should Basically Just Learn To Read

Dear Agile, Your Gurus Suck

Like any engineer, I've had some unproductive conversations on the internet, but I caught a grand prize winner the other day, when Agile Manifesto co-signer Ron Jeffries discovered Why Scrum Should Basically Just Die In A Fire, a blog post I wrote months ago.

I tried to have a civil conversation with him, but failed. It was such an uphill climb, you could consider it a 90° angle.

I answered Mr. Jeffries's points, but he ignored these remarks, and instead reiterated his flawed criticisms, at length, on his own blog.

If you're the type who skips drama, I'm sorry, but you want a different post. I wrote that post, and published it on my company's blog. I got some better criticism of my anti-Scrum blog posts, and I responded to it there. I also heard from Agile luminaries like Mr. Jeffries, but unfortunately, none of the insightful criticism came from them.

Because of Mr. Jeffries's high profile, I have to respond to his "rebuttal." But he failed at reading my post, and again at reading my tweets, so my rebuttal is mostly going to be a Cliff's Notes summary of previous remarks.

But let's get it over with.

It's Not Just Me

RSpec core team member Pat Maddox said this after seeing the Twitter argument:

"Ward" is Ward Cunningham – another Agile Manifesto co-signer, the inventor of the wiki, and one of the creators of Extreme Programming. I'm not a huge fan of methodologies, but in my opinion, Extreme Programming beats Scrum. Even if you disagree, for people in Agile, yes, a Ward Cunningham recommendation ought to be solid, every time.

Here's an anonymous email I got from somebody else who witnessed the flame war:
We had a local “Scrum Masters” meet up here in [my home town] maybe 5 years ago. At the time my wife was trying to figure out a career transition for herself and a friend recommended becoming a Scrum Master. I’d been doing Scrum for a couple of years and I was friends with the organizers so I sent her over to that meet up. She came back and told me it was an epic fail and Ron Jeffries was the most unprofessional, rude speaker that she’d ever seen. In hindsight, it was probably a good thing that it turned her off Scrum completely.

Ron Jeffries was rude to most of the people asking questions about how to implement Scrum. One person in particular mentioned having an offshore team and some of the challenges involved in making Scrum work with a geographically distributed development team.

Ron Jeffries’ response was “Fire all the folks not in your office. If you’re trying to work with people offshore, you’ve already failed. Next question."

Even if this was 2010 and the prevailing thought in our industry was that offshoring and remote work didn’t work, his response was just tactless. He had similar short, rude responses to nearly every question that night and it resonated negatively with everyone there. I don’t think they ever asked him back there again.
To his credit, Mr. Jeffries starts out his blog post by acknowledging that he could have been more polite with me:
My first reaction was not the best. I should have compassionately embraced Giles’s pain... But hey, I’m a computer programmer, not a shrink.
This "apology" implies my expectation of basic common courtesy is equivalent to mental illness.

Mr. Jeffries then stumbles through several failures at basic reading comprehension.

Basic Context Fail

We'll start simple. In my post, I wrote:
I've twice seen the "15-minute standup" devolve into half-hour or hour-long meetings where everybody stands, except for management.
I then gave examples.
At one company...

At another company...
Mr. Jeffries used the singular every single time he described my teams, my projects, or the companies I worked for:
Things were not going well in planning poker and Giles’s team did not fix it...

Giles’s team’s Product Owner...

Why didn’t the time boxes do that for Giles’s team?

...I’m sad that Giles suffered through this, and doubtless everyone else on the project suffered as well...

And I’m glad Giles remarks that Scrum does not intend what happened on his team. It does make me wonder why this article wasn’t entitled “Company XYZ and Every One of its Managers Should Just Die in a Fire.”
So he didn't even get that when I said I was talking about two companies, I was talking about two companies.

Advanced Context Fail

In fairness, you only had to miss the point of four or five paragraphs in a row to miss that detail, and my post contained many paragraphs. However, the point of those paragraphs was that you see Scrum practices decay at multiple companies because Scrum practices are vulnerable to decay. They have a half-life, and it is brief.

Mr. Jeffries missed this point. He also failed to recognize hyperbole which I'd thought was glaringly obvious. I said in my post:
In fairness to everybody who's tried [planning poker] and seen it fail, how could it not devolve? A nontechnical participant has, at any point, the option to pull out an egg timer and tell technical participants "thirty seconds or shut the fuck up." This is not a process designed to facilitate technical conversation; it's so clearly designed to limit such conversation that it almost seems to assume that any technical conversation is inherently dysfunctional.

It's ironic to see conversation-limiting devices built into Agile development methodologies, when one of the core principles of the Agile Manifesto is the idea that "the most efficient and effective method of conveying information to and within a development team is face-to-face conversation," but I'll get to that a little later on.

For now, I want to point out that Planning Poker isn't the only aspect of Scrum which, in my experience, seems to consistently devolve into something less useful.
These egg timers really exist. I added "shut the fuck up" to highlight the ridiculousness of waving an egg timer at somebody in order to make a serious business decision. Somehow, however, what Mr. Jeffries took away from those words was that I actually, in real life, attended a planning poker session where somebody told somebody else to shut the fuck up.

Quoting from his post:
What’s going on here, and why is planning poker being blamed for the fact that Giles seems to be surrounded by assholes?

...People do cut their fingers off with the band saw, and I guess people do get told to shut the fuck up in a planning poker session.

Should not happen. Should never happen...

No one in Scrum wants abusive behavior...

Things were not going well in planning poker and Giles’s team did not fix it. That makes me sad, very sad, but it doesn’t make me want to blame Scrum. Frankly even if Scrum did say “Sometimes in planning meetings tell people to shut the fuck up”, that would be so obviously wrong that you’d be a fool to do it...

someone with a pair could take an individual aside and tell them not to be a jerk.
I don't even get how Mr. Jeffries took that literally in the first place.

But I'll rephrase my point: building conversation-limiting rules into planning poker contravenes the basic Agile principle that face-to-face conversation is important. Additionally, these conversation-limiting rules provide an easy avenue through which the Scrum process can devolve into something less Agile – and also less productive – and I believe Scrum has several more design flaws like that.

Offensive Agreement

Since Mr. Jeffries equated asking for basic courtesy with asking for free therapy, it's probably no shock that his condescending tone persists even when he acknowledges my points. I pointed out naming errors in Scrum, and he responded:
I’m not sure I’d call those “conceptual” flaws, as Giles does, but they’re not the best possible names. Mary Poppendieck, for example, has long objected to “backlog”. Again, I get that. And I don’t care...

Giles objects to velocity. I could do a better job of objecting to it, and who knows, somewhere in here maybe I have, but the point is a good one.
This is an adult, intending his words for public consumption. Even when he sees I'm right, he dismisses my critique in favor of his own critique, even though he also acknowledges that his own critique probably doesn't exist.

Still, this is the apex of maturity in Mr. Jeffries's post, so I'll try to be grateful. We do at least agree "sprint," "backlog," and "velocity" are flawed terms. If a civil conversation ever emerges from this mess, it might stand on that shred of common ground.

But I'm not optimistic, because Mr. Jeffries also says:
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.
Apology accepted, and I'll give him credit for owning up to a mistake. But his attitude's terrible. If velocity's not good, you should get rid of it. And I don't need to deal with it, because it absolutely is going away.

Scrum's a fad in software management, and all such fads go away sooner or later. The most embarassing part of this fracas was that, while my older followers took it seriously, my younger followers thought the whole topic was a joke. Velocity is, in my own working life, less "going away" than "already gone for years." My last full-time job with Scrum ended in 2008. Since then, I've had to deal with velocity for a grand total of four or five months, and they weren't all contiguous.

Mr. Jeffries continues:
Giles has gone to an organization that pretty much understands Agile...

I’m not sure just what they do at his new company, Panda Strike, but I hope he’ll find some good Agile-based ideas there, and I think probably he will. More than that, I hope Giles finds a fun way to be productive...
I'd agree Panda Strike "pretty much understands Agile," but that's why we regard Scrum with skepticism. We also understand several flaws in Agile that I'd guess Mr. Jeffries does not. And it should be obvious I already had "a fun way to be productive" before Scrum got in my way. Why else would I dis Scrum in the first place?

For the record, at Panda Strike, we do use some Agile ideas, but that's a different blog post.

I'm publishing this on my personal blog, not the Panda Strike blog, because this is my own social media snafu. On the Panda Strike blog, I've gone into more detail about Agile and Scrum, our skepticism, the compromises we'll sometimes make, the flaws we've found in the Agile Manifesto, and the things we still like about it (and, to a lesser extent, Scrum). That blog post is more balanced than my personal attitude on my personal blog.

My post on the Panda blog is a response to the coherent criticism I've received. Please do read it. I hope you enjoy it. But here I'm responding to incoherent criticism from a high-profile source. Sorry - the man has sixteen thousand Twitter followers, and every one of them seems to want to bother me.

Also, a point of order: I am not "Giles" to you, Mr. Jeffries. I am "Mr. Bowkett" or "Mr. Bowkett, sir." Those are your only choices. You don't know me, sir. Mind your manners, please, because I'd like to use my own without feeling put upon. And your repeated claim of being "sad" on my behalf would be creepy if it seemed plausible, but it does not. It reads as insincere, so maybe you could just stop.

Ignored Tweets

My blog post argued that Scrum practices decay rapidly into non-Agile practices. Weirdly, most of my critics have repeatedly stated that my argument was not valid because I provided examples of Scrum practices which had decayed into less Agile versions.

Mr. Jeffries was one such critic. During my Twitter argument with him, I reminded him of this point repeatedly. Here's one of several such reminders:

Even after this exchange, he continued to hammer the idea that my argument – that Scrum's Agile practices decay rapidly – is invalid because the decayed versions of these practices are not Agile.
If people miss the point every time, I didn't make my point clear. But if they ignore clarification, they're arguing in bad faith.

Mr. Jeffries's Terrible Reading Comprehension May Not Be A Fluke

One of Mr. Jeffries's Twitter followers, a Scrum consultant named Neil Killick, wrote a blog post criticizing my post also:
A controversial blog post... suggests that Scrum is broken for many reasons, but one of those reasons cited is that the 15 minute time box for Daily Scrum (aka Standup) is too short to allow for meaningful conversations, and promotes a STFU culture.
This is false.

The phrase "shut the fuck up" occurred in a discussion of planning poker, not daily standups. This concept of "a STFU culture" is Mr. Killick's invention. The time-boxing in standups might undermine the Agile principle that "the most efficient and effective method of conveying information to and within a development team is face-to-face conversation" – it's certainly odd to find this "inhibiting conversation" theme in an "Agile" methodology – but a major theme in my post was that standups frequently go too long.

Having failed to grasp this, and possibly without ever reading my blog in the first place, Mr. Killick then explains how to solve a problem I never had:
IMO, in the situation the author describes, Scrum has exposed that perhaps the author and his colleagues feel their time together in the morning is so precious that they resent ending it artificially.

As the Scrum Master in this situation I would be trying to find out why they are not able to continue talking after the Daily Scrum? Perhaps they struggle to find the time or will to collaborate during the working day, so being forced together by the Daily Scrum gives them an opportunity that they do not want to cut short?
So, recap.

I write a blog post about how Scrum's a waste of time. I get two blog posts defending Scrum. Neither of the individuals who wrote these posts showed enough respect for my time to read the post they were responding to. Both of them say inaccurate things about my post. Both of them then offer me advice about how to solve problems I never had. And this is their counterargument to my claim that Scrum is a waste of time.

A Quick Defense Of Some Innocent Bystanders

Many Scrum defenders have said things to me like "if your company had a problem with Scrum, it was a messed-up company," or even "if your team had a problem with Scrum, they were incompetent."

On behalf of my former co-workers and former managers, fuck you.

One of the companies I mentioned was indeed very badly mismanaged, yet I worked with terrific people there. There were some flaws at the other, too, but it was much better. There were plenty of good people, nothing really awful going on, and Scrum still decayed.

(In fact, standups decayed to a similar failure state in each case, even though the circumstances, and the paths of deterioration, were very different.)

I saw these problems at two companies with a serious investment in Scrum, and I saw echoes of these problems elsewhere too. It's possible that I just fell into shit company after shit company, and the common theme was pure coincidence. But I doubt it. And if your best argument relies on coincidence, and boils down to "maybe you just suck," then you're not coming from a strong position.

Is that even an argument? Or is it just a silencing tactic?

The first time or two that I saw Scrum techniques fail, my teams were using them informally. I thought, "maybe we should be using the formal, complete version, if we want it to work." The next time I saw Scrum techniques fail, we got official Scrum training, but the company was already being mismanaged, so I thought, "maybe it doesn't matter how full or correct our implementation is, if the people at the top are messing it up." The next time after that, management was better, and the implementation was legit, but we were using a cumbersome piece of software to manage the process. So I thought, "maybe Scrum would work if we weren't using this software."

Eventually, somebody said to me, "hey, maybe Scrum just doesn't work," and it made more sense than any of these prior theories.

And Scrum's answer to this is "maybe you just suck"?


Maybe not.

Valid Critiques Addressed Elsewhere

As I said, I got better opposing arguments than these, and I addressed them on the Panda Strike blog. Check it out if you're curious.

by Giles Bowkett ( at March 07, 2015 08:40 AM

March 06, 2015

Decyphering Glyph

Deploying Python Applications with Docker - A Suggestion

Deploying python applications is much trickier than it should be.

Docker can simplify this, but even with Docker, there are a lot of nuances around how you package your python application, how you build it, how you pull in your python and non-python dependencies, and how you structure your images.

I would like to share with you a strategy that I have developed for deploying Python apps that deals with a number of these issues. I don’t want to claim that this is the only way to deploy Python apps, or even a particularly right way; in the rapidly evolving containerization ecosystem, new techniques pop up every day, and everyone’s application is different. However, I humbly submit that this process is a good default.

Rather than equivocate further about its abstract goodness, here are some properties of the following container construction idiom:

  1. It reduces build times from a naive “sudo install” by using Python wheels to cache repeatably built binary artifacts.
  2. It reduces container size by separating build containers from run containers.
  3. It is independent of other tooling, and should work fine with whatever configuration management or container orchestration system you want to use.
  4. It uses existing Python tooling of pip and virtualenv, and therefore doesn’t depend heavily on Docker. A lot of the same concepts apply if you have to build or deploy the same Python code into a non-containerized environment. You can also incrementally migrate towards containerization: if your deploy environment is not containerized, you can still build and test your wheels within a container and get the advantages of containerization there, as long as your base image matches the non-containerized environment you’re deploying to. This means you can quickly upgrade your build and test environments without having to upgrade the host environment on finicky continuous integration hosts, such as Jenkins or Buildbot.

To test these instructions, I used Docker 1.5.0 (via boot2docker, but hopefully that is an irrelevant detail). I also used an Ubuntu 14.04 base image (as you can see in the docker files) but hopefully the concepts should translate to other base images as well.

In order to show how to deploy a sample application, we’ll need a sample application to deploy; to keep it simple, here’s some “hello world” sample code using Klein:

# deployme/
from klein import run, route

def home(request):
    request.setHeader("content-type", "text/plain")
    return 'Hello, world!'

def main():
    run("", 8081)

And an accompanying

from setuptools import setup, find_packages

setup (
    name             = "DeployMe",
    version          = "0.1",
    description      = "Example application to be deployed.",
    packages         = find_packages(),
    install_requires = ["twisted>=15.0.0",
    entry_points     = {'console_scripts':
                        ['run-the-app = deployme:main']}

Generating certificates is a bit tedious for a simple example like this one, but in a real-life application we are likely to face the deployment issue of native dependencies, so to demonstrate how to deal with that issue, that this depends on the service_identity module, which pulls in cryptography (which depends on OpenSSL) and its dependency cffi (which depends on libffi).

To get started telling Docker what to do, we’ll need a base image that we can use for both build and run images, to ensure that certain things match up; particularly the native libraries that are used to build against. This also speeds up subsquent builds, by giving a nice common point for caching.

In this base image, we’ll set up:

  1. a Python runtime (PyPy)
  2. the C libraries we need (the libffi6 and openssl ubuntu packages)
  3. a virtual environment in which to do our building and packaging
# base.docker
FROM ubuntu:trusty

RUN echo "deb trusty main" > \

RUN apt-key adv --keyserver \
                --recv-keys 2862D0785AFACD8C65B23DB0251104D968854915
RUN apt-get update

RUN apt-get install -qyy \
    -o APT::Install-Recommends=false -o APT::Install-Suggests=false \
    python-virtualenv pypy libffi6 openssl

RUN virtualenv -p /usr/bin/pypy /appenv
RUN . /appenv/bin/activate; pip install pip==6.0.8

The apt options APT::Install-Recommends and APT::Install-Suggests are just there to prevent python-virtualenv from pulling in a whole C development toolchain with it; we’ll get to that stuff in the build container. In the run container, which is also based on this base container, we will just use virtualenv and pip for putting the already-built artifacts into the right place. Ubuntu expects that these are purely development tools, which is why it recommends installation of python development tools as well.

You might wonder “why bother with a virtualenv if I’m already in a container”? This is belt-and-suspenders isolation, but you can never have too much isolation.

It’s true that in many cases, perhaps even most, simply installing stuff into the system Python with Pip works fine; however, for more elaborate applications, you may end up wanting to invoke a tool provided by your base container that is implemented in Python, but which requires dependencies managed by the host. By putting things into a virtualenv regardless, we keep the things set up by the base image’s package system tidily separated from the things our application is building, which means that there should be no unforseen interactions, regardless of how complex the application’s usage of Python might be.

Next we need to build the base image, which is accomplished easily enough with a docker command like:

$ docker build -t deployme-base -f base.docker .;

Next, we need a container for building our application and its Python dependencies. The dockerfile for that is as follows:

# build.docker
FROM deployme-base

RUN apt-get install -qy libffi-dev libssl-dev pypy-dev
RUN . /appenv/bin/activate; \
    pip install wheel

ENV WHEELHOUSE=/wheelhouse
ENV PIP_WHEEL_DIR=/wheelhouse
ENV PIP_FIND_LINKS=/wheelhouse

VOLUME /wheelhouse
VOLUME /application

ENTRYPOINT . /appenv/bin/activate; \
           cd /application; \
           pip wheel .

Breaking this down, we first have it pulling from the base image we just built. Then, we install the development libraries and headers for each of the C-level dependencies we have to work with, as well as PyPy’s development toolchain itself. Then, to get ready to build some wheels, we install the wheel package into the virtualenv we set up in the base image. Note that the wheel package is only necessary for building wheels; the functionality to install them is built in to pip.

Note that we then have two volumes: /wheelhouse, where the wheel output should go, and /application, where the application’s distribution (i.e. the directory containing should go.

The entrypoint for this image is simply running “pip wheel” with the appropriate virtualenv activated. It runs against whatever is in the /application volume, so we could potentially build wheels for multiple different applications. In this example, I’m using pip wheel . which builds the current directory, but you may have a requirements.txt which pins all your dependencies, in which case you might want to use pip wheel -r requirements.txt instead.

At this point, we need to build the builder image, which can be accomplished with:

$ docker build -t deployme-builder -f build.docker .;

This builds a deployme-builder that we can use to build the wheels for the application. Since this is a prerequisite step for building the application container itself, you can go ahead and do that now. In order to do so, we must tell the builder to use the current directory as the application being built (the volume at /application) and to put the wheels into a wheelhouse directory (one called wheelhouse will do):

$ mkdir -p wheelhouse;
$ docker run --rm \
         -v "$(pwd)":/application \
         -v "$(pwd)"/wheelhouse:/wheelhouse \

After running this, if you look in the wheelhouse directory, you should see a bunch of wheels built there, including one for the application being built:

$ ls wheelhouse
# ...

At last, time to build the application container itself. The setup for that is very short, since most of the work has already been done for us in the production of the wheels:

# run.docker
FROM deployme-base

ADD wheelhouse /wheelhouse
RUN . /appenv/bin/activate; \
    pip install --no-index -f wheelhouse DeployMe


ENTRYPOINT . /appenv/bin/activate; \

During build, this dockerfile pulls from our shared base image, then adds the wheelhouse we just produced as a directory at /wheelhouse. The only shell command that needs to run in order to get the wheels installed is pip install TheApplicationYouJustBuilt, with two options: --no-index to tell pip “don’t bother downloading anything from PyPI, everything you need should be right here”, and, -f wheelhouse which tells it where “here” is.

The entrypoint for this one activates the virtualenv and invokes run-the-app, the setuptools entrypoint defined above in, which should be on the $PATH once that virtualenv is activated.

The application build is very simple, just

$ docker build -t deployme-run -f run.docker .;

to build the docker file.

Similarly, running the application is just like any other docker container:

$ docker run --rm -it -p 8081:8081 deployme-run

You can then hit port 8081 on your docker host to load the application.

The command-line for docker run here is just an example; for example, I’m passing --rm so that if you run this example just so that it won’t clutter up your container list. Your environment will have its own way to call docker run, how to get your VOLUMEs and EXPOSEd ports mapped, and discussing how to orchestrate your containers is out of scope for this post; you can pretty much run it however you like. Everything the image needs is built in at this point.

To review:

  1. have a common base container that contains all your non-Python (C libraries and utilities) dependencies. Avoid installing development tools here.
  2. use a virtualenv even though you’re in a container to avoid any surprises from the host Python environment
  3. have a “build” container that just makes the virtualenv and puts wheel and pip into it, and runs pip wheel
  4. run the build container with your application code in a volume as input and a wheelhouse volume as output
  5. create an application container by starting from the same base image and, once again not installing any dev tools, pip install all the wheels that you just built, turning off access to PyPI for that installation so it goes quickly and deterministically based on the wheels you’ve built.

While this sample application uses Twisted, it’s quite possible to apply this same process to just about any Python application you want to run inside Docker.

I’ve put a sample project up on Github which contain all the files referenced here, as well as “build” and “run” shell scripts that combine the necessary docker commandlines to go through the full process to build and run this sample app. While it defaults to the PyPy runtime (as most networked Python apps generally should these days, since performance is so much better than CPython), if you have an application with a hard CPython dependency, I’ve also made a branch and pull request on that project for CPython, and you can look at the relatively minor patch required to get it working for CPython as well.

Now that you have a container with an application in it that you might want to deploy, my previous write-up on a quick way to securely push stuff to a production service might be of interest.

(Once again, thanks to my employer, Rackspace, for sponsoring the time for me to write this post. Thanks also to Shawn Ashlee and Jesse Spears for helping me refine these ideas and listening to me rant about them. However, that expression of gratitude should not be taken as any kind of endorsement from any of these parties as to my technical suggestions or opinions here, as they are entirely my own.)

by Glyph at March 06, 2015 10:58 PM

Mark Bernstein


A masterful review of the history of the Gamergate Affair at Wikipedia, by Lauren C. Williams at Think Progress: The ‘Five Horsemen’ Of Wikipedia Paid The Price For Getting Between Trolls And Their Victims.

March 06, 2015 02:11 PM

Fog Creek

Knowing When to Stop – Tech Talk


There comes a point in every instance of creation when the creator steps back and says, “Done.” But how do you know when a thing is complete? And what happens when you continue past that point?

In this short Tech Talk, Matt, a System Administrator here at Fog Creek, using examples from Computer Science, Finance, and Art, explores different perspectives on this question. It acts as a cautionary tale for anyone involved in software development about the dangers of feature creep and not knowing what done looks like.


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

  • Computing (0:19)
  • Gambling and Finance (0:48)
  • Art (1:30)
  • Software (3:22)
  • Examples of Feature Creep (4:50)



We often lose track of what does done look like and when do we reach it and say, “Enough. Working on this more is not going to help anything.” When you start thinking about this… well, we’ll start with computing.


Computing has a well-defined halting problem. In computability theory, the problem of determining from description of an arbitrary computer program input whether the program will finish running or continue to run forever. This is like basic, way-down, Comp Sci stuff, where does this input associated with this algorithm actually lead and does it meet a condition or does it loop forever. When you start making this more of a human aspect, you wind up with a kind of the mathematical halting problem or the gambler’s dilemma.

Gambling and Finance

The gambler is trying to maximize their profit. They’re a min-maxer; they want to invest the least possible amount and gain the most possible amount. I’ll include finance in here, which is a kind of sophisticated gambling with a little bit more information. The notion is that you have tools, mathematical tools, that you can choose to apply to this problem to figure out what the optimal solution can be. There are tools for this. You can actually sit down with a spreadsheet or some piece of software or a pencil and paper and figure out the proper and optimal solution for this problem. For the creative, you stop when the expression of the idea is complete. When the hell is that?


Well, there are very few mathematical models you can apply to figure out when your watercolor of a beautiful waterfall is finished. There are some boundaries, which are established by the medium. If you’re doing sculpture and you’re chipping away, eventually there’s not going to be any stone to chip away anymore and you are going to have to stop because there’s nothing left, literally. If you are a painter, or a sculptor in clay you can continue to add clay, but eventually gravity is going to take over and say, “all right, you can’t really put that newfangled nose on this statue. It just doesn’t have the support.” There are realities that do apply themselves to certain media. The Statue of Liberty can’t necessarily hold her arms straight out or have forearms because the structural architectural notions of that beautiful thing out in the harbor just doesn’t support that, like Michelangelo up there. “I saw the angel in the marble and carved until I set him free. Every block of stone has a statue inside it and it is the task of the sculptor to discover it.” Michelangelo has this concept of the finished artifact in his head; he’s trying to liberate it from the medium. Ultimately, he knows what he’s looking for. Maybe he doesn’t know specifics, but he’s going to keep trying to pull it out until you wind up with something like this. There’s a more contemporary quote: “Knowing just when to declare a work of art finished is an eternal struggle for many artists. The issue is that if you don’t work on a piece enough, the work can come across as incomplete. On the other hand, overworking a piece can cause the work to appear tired and tedious. The most compelling works of art throughout history are able to establish a strong balance of gesture and spontaneity while simultaneously appearing to be substantial and fully resolved.” Much more fuzzy, no maths going into this. I’m done when I think it’s done.


Then we get to Software. We’ve kind of come full circle. We started with the computing halting problem, we came all the way through art, which is one of the most open, creative processes, and now we’re here at software, which is even more open than art. Yes, the machine implies certain things for you based on the way it acts and the way you can use it, but ultimately you can create literally fantastic worlds inside a machine. When you don’t know when to stop with software, you start suffering what’s called feature creep. Jamie Zawinsky was a programmer for Netscape, and he came up with Zawinsky’s law, which is, “every program attempts to expand until it can read e-mail. Those programs which cannot so expand are replaced by ones which can.” There’s this notion that applications are pushed well beyond their requirements and intentions. You have a program, you’re trying to solve a problem, and then you fall in love with the thing in the process of making it. Then you start thinking, “Well, what else can I add? What else can I do? Where else can I go? Oh, well this function isn’t very good; it doesn’t have that je ne sais quoi I was looking for when I was writing it. I’m going to go back and rewrite it. Oh, there’s a new library; I could re-implement this in another language. I could do this, that and the other.” You can just fall into this hole and get stuck there and never know when done is done, because you’ve lost sight of what you were originally even intending and what the finished state looked like, if you knew what it was in the beginning.

Examples of Feature Creep

This is what feature creep looks like in one image. This is Microsoft Word 2010 with every toolbar enabled; that is all you get to type in. Yes, some people might use these things. Yes, that is an interface to get people to be able to use those things, but, you have long gone past the notion of laying out documents. Here’s another example, and it’s kind of a case study, I think, in not knowing when to stop because you don’t know what it is that you’re trying to come up with.

They had a team, they were in Australia, they were isolated from the rest of the Google environment, and they spent two years working on this thing in isolation, effectively. That’s what it looked like. The paradigm they said they wanted to change was e-mail, and they said they wanted to re-implement e-mail for the 21st century. Nobody knew what Wave was or where it fit in, but it was supposed to… they got so attached to this thing that they kept adding more and more crap to it that it ceased to be e-mail for the 21st century. It turned into this communications hub. They ate so much dog food that it was poisoning them. They spent their entire life in Wave. All of their internal communications, all of their internal documentation, all of the rest of their stuff was all in Wave, and they just expected everybody to do that. This was the central focus of their working life. Whenever they encountered a thing like, “oh, I wish I could send a tweet from within Wave,” or “I wish I could read this RSS feed from within Wave, because I’m always in Wave and I want to be able to do these things,” they kept making more and more and more and more and more complex. Two years later, when they finally crack open the box and join the rest of the world, they have this monstrosity that the only way to use it successfully is to basically have it take over your life and then do all of these things within the context of Wave, which is not what people want.

The question is, ultimately, when do we stop? The answer is when it’s done, which is kind of a cop-out. Because if you don’t figure out what done looks like when you start, you’ll never figure it out along the way. We stop when it’s done. Figuring out what done is is the problem.

by Gareth Wilson at March 06, 2015 11:43 AM

Blue Sky on Mars


So I got fired from GitHub two weeks ago.

This is the tweet I wrote afterwards while walking to lunch:

I left it ambiguous because I wasn't sure what to think about it all at that point. I mean, something I'd been doing for half a decade was suddenly gone. If people knew what really happened, would they view me differently? Would they — gulp — view me as a failure? Please, please suggest that I eat babies or microwave kittens or something else far more benign, but, for the love of god, don't suggest I'm a failure.

GitHub's very first office

Do you know what happens after you leave a job you've been at for five years? You get drunk a lot, because everyone you know hits you up and says hay man, let's def get a drink this week and you can't really say no because you love them and let's face it, you suddenly have a lot of free time on your hands now and they're obviously the ones buying.

Do you know what happens after you tell them the whole story behind your termination? Virtually everyone I've had drinks with tells a similar story about the time they got fired. Seemingly everyone’s got stories of being stuck under shit managers, or dealing the fallout from things out of their control. Maybe this is selection bias and all of my friends are horrific at their jobs, but there's an awful lot of them that I'd consider to be best-in-industry at what they do, so I think it’s more likely that the answer is: It Was Probably Complicated™.

I've been pretty fascinated by this lately. Getting fired is such a taboo concept: nobody will want to hire me if they knew I got fired from my last gig. And yet, certainly a lot of people do get fired, for a lot of different reasons. Even if you spend years doing something well, when it comes to work, people tend to focus predominantly on your last month rather than the first 59.

This isn't the case with love, to choose a cliché metaphor. If you break up with somebody, it just wasn't meant to be is the catch-phrase used rather than yo you must have been a shit partner to not have forced that relationship to work out.

House of Shields

Working is such a spectrum. The company can change a lot while you're there, and you can change a lot while you're there. Sometimes the two overlap and it's great for everyone, and sometimes they don't. But I'm not sure that's necessarily an indictment of either the employer or the employee. It just is.

Unless you're embezzling money or using the interns as drug mules or something. Then yeah, that's probably an indictment waiting to happen, and your termination really does reflect something deeply flawed in your character.

Do you know what happens when you're reasonably good at your job and you suddenly leave the company? Everybody asks what's next? What do you have lined up next? Excited to see what's next for you! That's nice and all, but shit, I barely even know what I'm eating for lunch today. Or how the fuck COBRA works (to the best of my current knowledge it has nothing to do with G.I. Joe, either the action figures or the TV show, much to my dismay).

Part of the problem with not admitting publicly that you were fired is that people inevitably assume you're moving onto something bigger and better, which ironically is kind of a twist of the knife because you don't have something bigger and better quite yet. (And no, I'm not working at Atlassian, so stop tweeting me your congratulations, although I’m still cracking up about that one.)

About half of the early crew

But hey, I mostly just feel lucky. I’m lucky I got to work at the company of my dreams for five years. I got to meet and work with the people in the industry I admired the most, and, even more than that, I somehow am lucky enough to call them “friends” now. I got hired by dumb luck — I still consider it an objective mistake for them to have hired me, back then — and I was able to grow into a myriad of roles at the company and hopefully help out more than a few people across our industry. I left on great terms with leadership and the people I worked with. I feel like I can be pretty proud about all of that.

So basically what I’m saying is that I’m really excited to hear what I do next.

March 06, 2015 12:00 AM

March 05, 2015

Fog Creek

How Low Should You Go? Level of Detail in Test Cases

limbo (1)
It can be difficult to know just how much detail you should include in your test documentation and Test Cases, in particular.

Each case has a different set of needs and requirements. Who is going to use it, how often and for what purpose poses many considerations.

If it’s written at too high a level, then you’re leaving it open to too much interpretation and you risk the wrong things being tested. Too low, and you’re just wasting your own time. It makes it more difficult to maintain and there’s an opportunity cost to other projects with demands on your time.

In this post, we break down some of the factors you should consider helping you find the right level.

Understand the Wider Context

Each of your project’s stakeholders will have concerns that will impact the amount of detail you need. From your organization’s internal politics and appetite for risk to the extent to which the product is relied upon etc. This will provide the wider context for your test cases and start to inform your thinking. The documentation expectations at a lean startup will differ greatly to that at some financial institution, for example.

Test Requirements and Resources

You need to at least provide enough information to describe the intent of the test case. This should make clear all elements that need to be tested. So special consideration should be given to any specific input values or a particular sequence of actions etc.

The amount of time you have to create the test case and the human or IT resources you have to enact the tests is another obvious key factor.

test_Case (1)

Know Your Audience

Consider the audience for the case too. How technical are they? How much product knowledge do they have and how experienced at testing are they? More experienced testers, familiar with the product will need less detail. But is the team likely to change in the foreseeable future? If so, then you might want to head off later re-writes by providing extra detail now for those with less experience.

Some organizations have specific requirements to provide evidence of test coverage. Usually for compliance, to show adherence to a standard or certification, or for other legal issues.

Test and Product Considerations

Each test is different, from the importance of the test, to how long it will be in use for. If it’s likely to be converted to an automated test script in the future, then including more detail now might make that easier to do. There are similar considerations about the product you’re testing. Will the application be used in the long-term? And whereabouts is it in its lifecycle? The amount of changes that you can expect for a recently built, agile application are far greater than for some old system you’re maintaining. Unless it’s a wild, testless code beast that is.

There’s a Balance to be Found

These factors don’t necessarily mean you should include more detail. But, important and long-lasting tests justify the time if needed. However, there’s a balance to be sought. If you create highly specific tests, then even minor design changes or functionality alterations may mean you have to re-write cases. They also lead testers to raise bugs for what end up being problems with your test documentation, rather than those impacting customers. They can have a knock-on effect too. They encourage the tester to only consider the specific paths through the application detailed in the case. Meaning they might not consider the functionality more generally.

There’s no silver bullet for coming to a conclusion. Each organization’s requirements differ. And these requirements change depending on the project, product and the individual test too. But by thinking through the above factors, then you can find a level that works for you and your team.

by Gareth Wilson at March 05, 2015 04:50 PM

Dave Winer

JavaScript in-browser almost complete

As you may know, I've become a JavaScript-in-the-browser developer. My liveblog is an example of that. It's an app, just like the stuff we used to develop for Mac and Windows, but it runs in the browser.

The browser is a complete app environment except for one crucial piece: storage. It has a simple facility called localStorage, which almost fits the bill, comes close, but ultimately doesn't do what people want.

I have solved the problem in a generic and open source way. In a very popular server platform, Node.js. However it's not widely known that this problem has been solved.

Try this little app, as a demo:

You can sign in, write some text, save it, sign out.

And then sign in from a different machine, and voila, the text you entered is there.

From that little bit of functionality you can build anything.

I have a new app in development, very simple, and brain-dead obvious, and useful, that builds on this. Hopefully at that point the lights will start to come on, oh shit, we're ready to build the next layer of the Internet. It really is that big a deal. And you don't need VC backing to participate. One developer, one person, can build something useful in a week. I've just done that myself. The service will virtually run itself at almost no cost, for a lot of users. That's an interesting place to be.

March 05, 2015 01:54 PM

March 04, 2015

Tim Ferriss


kelly couch stretch - spartan pose

This post delves into the good, the bad, and the ugly of all things CrossFit.  It answers many important questions, including:

– What are the 3 most dangerous exercises in CrossFit gyms?
– What are the most common nutritional mistakes of CrossFit athletes?
– What do elite CrossFit athletes do differently than the rest? Example: How do Rich Froning and Jason Khalipa warm up?
– Is the CrossFit Games really CrossFit?
– Is CrossFit a fad?
– What is the future of CrossFit?

The man to answer all this (and much more) is Kelly Starrett.  He’s trained CrossFit athletes for more than 130,000 hours (!) and 10 years at San Francisco CrossFit, which opened in 2005 as one of the first 50 CrossFit Affiliates in the world. There are now more than 10,000 Affiliates worldwide.

Kelly’s clients include Olympic gold medalists, Tour de France cyclists, world record holders in Olympic lifting and powerlifting, Crossfit Games medalists, professional ballet dancers, and elite military personnel.

Even if you have zero interest in CrossFit, this conversation invites you inside the mind of one of the world’s top coaches.  Kelly discusses habits, strategies, and thinking that can be applied to nearly everything.

As a bonus, I’ve also included our first conversation below, which includes disgusting amounts of alcohol, my personal doctor, and our tactics for becoming the guy from Limitless.

TF-ItunesButton TF-StitcherButton

Plus, the booze-enhanced episode on all things performance enhancement (stream below or right-click here to download):

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. Order one of their dress shirts this week and get a Henley shirt (around $60 retail) for free.  Just add the two you like here to the cart, then use code “TIM” at checkout.

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: If you had to pick one sport or weightlifting movement for the rest of your life, what would it be and why? 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!

by Tim Ferriss at March 04, 2015 11:56 PM

Mark Bernstein


The first appearance of “Infamous” in a college syllabus: ITP Core 2 at CUNY, taught by Lisa Brundage and Michael Mandiberg. Interesting readings, and a prodigious set of graduate students!

March 04, 2015 05:08 PM

Whispers and Cries

Marcus Zarra laments the Dangers Of Misinformation, specifically when software developers share specific experiences that are later generalized so broadly that the overall impression is false.

For example, years ago Brent Simmons pointed out problems that were leading him to leave Core Data behind. Looking back, he says

The response to that post continues to amaze me. I come right out and say, multiple times, that you should use Core Data. And yet it’s used as a thing about how Core Data sucks.

Caves and Enclaves

Lots of software developers work in caves, using the tools and techniques they already know and adding whatever they’re required by circumstance to acquire. When they are at work they’re not at home, and when they’re at home they’re not reading journals or immersing themselves in books about software. So, when it comes to new technology, they rely on occasional hints they see or hear.

Other software developers work in enclaves – companies and clusters of companies that share a technical base and a technical attitude. Again, the common wisdom in an enclave gets formed by the bellwethers, and often that process of wisdom-formation is erratic.

Our problem is simply that lots of new ideas are actually bad ideas; things that ComputerWorld and TechCrunch tell you are the Big New Thing are sometimes yesterday’s thing and often nothing at all. Sometimes, a new system rolled out at WWDC will make your life better if you adopt it right away; sometimes, it’s going to make everyone miserable unless you wait a year or two for the dust to settle. (Years ago, Apple had a lovely technology called OpenDoc to which we made a big commitment. It was The Future. Then, one day, it was Cancelled. No more. Nice product you had there…)

Right now, Joel Spolsky’s Stack Exchange plays a crucial role in linking up caves and enclaves. It’s a technical forum, and it’s often astonishingly good: you search on the ridiculous error message that makes no sense that that you’ve certainly never seen before, and voila there’s someone else who reported exactly the same message last week, and explains who sent it and why. But lots of people on Stack Exchange don’t know what they’re talking about, and lots of them don’t have a very solid grasp of English, and so there’s also a fair amount of noise.

The Way Out

One good way out of this bind is simply to have better contacts.

Planning Tinderbox Six, I was guided by a number of warnings that Objective C++ was slow, poorly supported, doomed, or otherwise a Bad Idea. The problem was, Objective-C simply doesn't support a number of idioms on which Tinderbox relies. So I started to ask around: could we use a little Objective C++? Could we use it briefly as a transitional mechanism?

I asked lots of people who have solid Mac products and lots of experience, and the answer came back: “people say it’s a bad idea, but it’s not.”

“Are you sure?” I asked them. “Everyone says…”

“Everyone is an idiot. We’ve done everything that way for a couple of years.”

The Better Way Out

Make mistakes. Accept that code will be thrown away. Wrong turns aren’t a waste: they tell you where you didn’t want to go, and give you an idea of where you might head another time.

Find a way to be more at home with your work, and to work when you’re at home because it’s natural to do what you do. You can live with alienation, but you don’t want to.

Don’t trust the common wisdom of your technical enclave too far. Stand up, speak out, judge for yourself, and be ready to change your mind.

March 04, 2015 03:38 PM

Fog Creek

Lightweight Software Architecture – Interview with Simon Brown

.little {font-size: 75%}

Looking for audio only? Listen on


We’ve interviewed Simon Brown, a Software Architecture consultant. We discuss his lightweight approach to software architecture, expounded in his book ’Software Architecture for Developers’. We cover why software architects sometimes get a bad rep, the importance of software architecture in software projects, how even Agile teams can adopt his techniques and how much is ’just enough’ upfront design.

He writes about topics like this and there’s more resources on his website.


Content and Timings

  • Introduction (0:00)
  • About Simon (0:24)
  • A Bad Rep (1:45)
  • Importance of Software Architecture (2:38)
  • Agile Development and Software Architecture (3:29)
  • Just Enough Upfront Design (5:34)
  • Common Mistakes of New Software Architects (6:40)
  • Recommended Resources (7:20)




Today we have Simon Brown. Simon is a consultant specializing in software architecture based in Jersey and the Channel Islands. He speaks at conferences around the world and writes about software architecture, and is the author of Software Architecture for Developers. Simon thank you so much for joining us today, we really appreciate it. Why don’t you say a little bit about yourself?

About Simon

Thank you much for having me. As you said I’m an independent consultant and my background is actually working in finance so I spent about twelve years working London, mostly building software for the finance industry. And I moved back here to Jersey about 6 years ago, mostly because I have family and it’s a fantastic place to live.

The past couple of years I’ve been doing lots of jetting around the world and really teaching people about software architecture and how to adopt a modern, lightweight pragmatic approach to software architecture.

Well I wanted to touch base on the book, Software Architecture for Developers. What made you want to write the book?

I’ve written some Java books in the past, and I’ve gone through the developer to architect role myself. When I did that, I found it quite hard to understand what I should be doing as an architect. There’s lots and lots of books out there for developers, and ironically there’s lots of content and material for architect, but it’s a huge jump. You’ve got all the code stuff down here and all the really high-level enterprise architecture stuff.

When developers are trying to move into an architecture role, you get thrown into all this TOGAF and Zachman in the enterprise architecture world, so I wanted something to bridge that gap and basically make software architecture much more accessible to software developers. That’s it in a nutshell.

A Bad Rep

You mention in the book that some regard software architects as “box-drawing hand wavers”, why do you think software architecture has such a bad rep with some people?

If you look bad ten years, maybe further, we had a very prescriptive way of working in things like Waterfall where you’d hire an architect. So the architect would come in, do all the requirements gathering, put together the architecture, and then they would wield this big hefty set of documents down to the development team. Often those people never got involved with the coding, they never got feedback on their designs and that’s where a lot of the bad reputation has come from. So what I’m trying to do is take a much more hands on, pragmatic, lightweight approach, where architects are part of the team and architects are writing code as well. So we’re trying to move away from the very fluffy, conceptual, hand-waving style of architecture.

Importance of Software Architecture

You say that all software projects need software architecture, why do you think it’s so important?

It’s important because software architecture for me really solves two categories of problems. Category number one is really about building something that has a nice structure. If architecture is about structure, if you don’t think about structure, you basically don’t get structure. This is why we get lots of systems involved in that horrible big ball of mud we’ve all heard of, where everything is really interconnected and inter-tangled. So that’s one category of problems that we’re trying to solve there. And the other is really making architecture systems that work specifically from a non-functional perspective, so making sure that we factor in the important quality attributes. You know, performance if it’s important, scalability, security, and so on and so forth. And really if you look at architecture like that then software of all sizes needs structure and it needs to work. So that’s why architecture is pretty useful to all software projects.

Agile Development and Software Architecture

Software architecture and Agile are often seen as being mutually exclusive, but you think otherwise. How can the two better co-exist?

It comes back to these whole conflicts that we seem to have had in the past. Again, if you look back ten, twenty years, it’s very Waterfall, very prescriptive, process-driven, do lots of design up front. And then Agile came along, ten, twelve years ago, and it kind of reversed the trends. A lot of people’s interpretations of Agile equals “don’t do any up front design.” So we’ve got two extremes here, and there’s a sweet spot in the middle there. It’s about doing just enough up front design to satisfy the major questions.

But for those green start-ups, they barely have a functional spec around, how can they start to incorporate some of your thinking in to their working practices?

So this is that million dollar question, isn’t it? How do we do some thinking up front, but not get taken down this path of just doing it forever? It’s worth saying that a good architecture actually enables agility. If you’re building a lean start-up, and you want to pivot and change quickly, then you need to make sure that’s one of your quality attributes that you consider. Adaptability is a thing you need to bake in to your architecture.

In terms of how lean start-ups adopt lightweight architecture practices, for me it’s very simply about doing just enough up front design. I have a model I talk about in the book called the C4 Model. Basically it’s about going down to component design, nice high-level, chunky components, and then layering on risks and things like that.

You could argue that with a lean start-up you don’t have any requirements, and therefore, how can you possibly come up with a list of candidate components if you’ve got no requirements driving that process. In that case, I think you need to adopt principle-driven design. In other words, identify the list of principles that you and your team want to follow around layering strategies and technology choices, and all of those kind of things, and write them down, and then make sure that your architecture follows those principles.

Just Enough Upfront Design

You mentioned “just enough” up front design. How much is enough?

It’s about this much.

It’s one of those things, when you say it to some people they think it’s a complete breath of fresh air, and when you say it to a different set of people they think it’s a complete and utter cop out. For me, again, it’s in the middle. It’s not doing nothing and it’s not doing everything up front. So this begs the question – can you put some concrete advice about doing just nothing? And for me it’s very simple. It’s about doing enough in order to understand the structure of what you’re building, and also to be able to correct the vision that the rest of the team can understand to work from. That’s why, if you look at my book and all of my stuff online, you’ll see that a lot of the things I talk about relate to diagrams. I’m trying to bring back lightweight architecture diagrams as a way to make people think about structure, to a certain level of abstraction, and also use those diagrams to present and correct that shared vision. So that’s two-thirds of just enough.

The third process is risks. It’s about understanding, identifying and mitigating your highest priority risks. In other words, the things that are potentially going to cause your system, your project, to fail.

Common Mistakes of New Software Architects

What are some common mistakes you see those new to software architecture make?

It’s a really complex role and there aren’t many people out there teaching people how to do this role. Everything from people doing architecture and design on their own, and never asking for feedback. It’s people assuming that they must have all the answers, they are The Architect and they must know everything, which is impossible. It’s not collaborating enough. It’s not being clear with your communication. It’s not applying the right level of leadership. It’s not making sure that you’re policing your architecture principles, it’s all of that stuff.

Recommended Resources

Can you recommend some resources for developers, or those new to the role, who want to learn more about successful software architecture?

I’d recommend a couple of other books about architecture too. There’s a book by friends named Eoin Woods and Nick Rozanski and that’s called Software Systems Architecture. That takes you through lots of things including the more traditional view catalog. If you use Viewpoint Perspectives, so ways to think about and describe architecture.

There’s also a great book by another friend of mine, George Fairbanks. It’s called Just Enough Software Architecture. You can probably understand why I’m recommending that. And again, that’s a great book, George is a really super smart guy. Lots and lots of stuff in there about architecture. And again, he’s trying to bridge the ivory tower, very academic view of architecture with something a bit more grounded.

Thank you so much for joining us today.

No problem, you’re welcome. Thank you.

by Gareth Wilson at March 04, 2015 10:59 AM

March 02, 2015

Reinventing Business

Abusing Unlimited Vacation

Unlimited vacation time has become quite the rage among companies. What's happened? Have industrial-age companies suddenly seen the light and realized the benefits of treating employees really well? As you might guess, the answer is no.

It turns out that social pressures around job security outweigh the desire and need to recover from work. Across the board, when companies adopt an unlimited vacation policy, employees take LESS time off. Human resources gets a win while looking like heroes for such a liberal policy!

But it gets better. If vacation time isn't fixed, it basically doesn't exist. It's not an accounting liability on the books. Best of all, if you quit, the company doesn't have to pay you for accrued vacation! Now companies are adopting unlimited sick time, presumably to add to the benefits of unlimited vacation.

Here's a great story about the failure of a well-intentioned unlimited vacation policy (along with numerous other problems with vacation systems, and links to other articles -- especially see Jacob Kaplan-Moss' analysis), and how they fixed it: by adding in a minimum required amount of yearly vacation (I can just feel the MBAs and HR folk squirming when they read that).

by (Bruce Eckel) at March 02, 2015 06:51 PM

Greg Linden

More quick links

Some of the best of what I've been thinking about lately:
  • Great TED talk titled "The mathematics of love", but probably should be titled "A data analysis of love" ([1])

  • Manned submarines are about to become obsolete and be replaced by underwater drones ([1] [2] [3])

  • "No other algorithm scaled up like these nets ... It was a just a question of the amount of data and the amount of computations." ([1] [2])

  • What Google has done is a little like taking a person who's never heard a sound before, not to mention ever hearing language before, and trying to have them learn how to transcribe English speech ([1] [2])

  • Teaching a computer to achieve expert level play of old video games by mimicking some of the purpose of sleep ([1] [2])

  • "Computers are actually better at object recognition than humans now" ([1] [2] [3] [4])

  • The goal of Google Glass was a "remembrance agent" that acts as a second memory and gives helpful information recommendations in real time ([1] [2] [3])

  • A new trend, large VC investments in artificial intelligence ([1])

  • "Possibly the largest bank theft the world has seen" done using malware ([1])

  • "Users will prioritise immediate gain, and tend to dismiss consequences with no immediate visible effect" ([1] [2])

  • "Crowds can't be trusted". It's "really a game of spamfighting". ([1] [2])

  • SMBC comic: "All we have to do is build a trustworthiness rating system for all humans" ([1])

  • Dilbert describes most business books: "He has no idea why he succeeded" ([1])

  • Architect Clippy: "I see you have a poorly structured monolith. Would you like me to convert it into a poorly structured set of microservices?" ([1])

  • Man kicks robot dog. Watching the video, doesn't it make you feel like the man is being cruel? The motion of the robot struggling to regain its balance is so lifelike that it triggers an emotional response. ([1] [2] [3])

  • SMBC comic: "Are we ever going to use math in real life?" ([1])

by Greg Linden ( at March 02, 2015 04:38 PM

Dave Winer

Every reporter should be able to start a blog

Please read Ken Silverstein's piece, his story of First Look Media.

Watching them stay silent for so long, I suspected they lacked basic publishing ability. It made no sense to me. You can set up a blog on or Tumblr, with a custom domain, in at most a couple of hours. Anyone with basic tech knowledge could do this.

With all the talk about learning to code, and the digital native generation, it's kind of appalling that they can't do something as basic as create their own blog, to navigate around any blockage from their management.

Silverstein says, as others have, that there was no prohibition on publishing, they just didn't have a way to do it. To me, that's like saying in 1992 that you couldn't print a document on a laser printer because your boss wouldn't come and choose the New command from the File menu.

There's a basic failure of technological literacy here.

Or so it seems to this outside observer.

The tech could be easier

We're caught in the same trap tech was caught in when I started programming in the mid-70s. There was a priesthood that had no incentive to make things easier, and a built-in belief that things couldn't be easier. My generation had a different vision, we worked on ease-of-use.

WordPress, which is the choice most professional organizations make these days for publishing, never was that easy to begin with. They missed some obvious ideas that were available to be stolen from the previous generation of blogging software. And over the years, a priesthood has developed, and the software has become even more intimidating to the newbie non-technical user.

It's time to loop back the other way. Yes, some reporters should already be able to climb over the hurdles. They just aren't that high, and the current generation of journalists have had computers in their lives, all their lives.

But ease of use, and ease of getting started is something the tech industry should be working on. Yes, it might put you out of a job, but if you don't do it, someone else will. And further, you're supposed to do that -- in the name of progress, and in this case, since it's about publishing, freedom.

March 02, 2015 03:28 PM

Fog Creek – Interview with Salvatore Sanfilippo

#wrapperb { width: 100%; overflow: hidden; } #firstb { width: 70%; float:left; } #secondb { padding-left: 30px; overflow: hidden; } body .content .post .entry #secondb img, .previous img, .previous { border: none !important; box-shadow: none !important; } .little { font-size: 75% } .previous span { display: inline; } table.previous, .previous tbody, .previous tr, .previous td { border: 0px !important; border-bottom: 0px !important; background: transparent; text-align: center; }

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 Salvatore Sanfilippo, an Open-Source Software Developer at Pivotal, better known as the creator of Redis, the popular data structure server. He writes regularly about development on his blog.

Location: Catania, Sicily, Italy
Current Role: Developer at Pivotal

How did you get into software development?

My father was a computer enthusiast when I was a small child, so I started to write simple BASIC programs emulating him. My school had programming courses and it was great to experiment a bit with LOGO, but I definitely learned at home. The first computer I used to write small programs was a TI 99/4A, however, I wrote less-trivial programs only once I got a ZX Spectrum later. I got a bit better when I had the first MS-DOS computer, an Olivetti PC1, equipped with an 8086-clone called Nec V30.

I remember that in my little town there were free courses about programming in the public library. One day I went there to follow a lesson and learned about binary search. It was a great moment for me – the first non-trivial algorithm I learned.


Tell us a little about your current role

Pivotal is very kindly sponsoring me to write open-source software, specifically to work on Redis. So my typical day involves getting up at 7:15 am, taking my son and/or daughter to school, and then sitting in front of a computer from 8:00 am.

What I do then depends on what is urgent: handling the community, replying to messages, checking issues or pull requests on Github, fixing serious problems, or from time to time, designing and implementing new features.

I don’t have a fixed schedule. Since there aren’t many developers contributing to Redis, I’ve found that I can be most effective for the userbase if I’m flexible. Moreover, when I feel tired or annoyed, I use the trick of working on something about Redis that is exciting for me in a given moment. So I likely end the day with something good, even if it was a “bad day”, like when you slept too little for some reason and need a bit more motivation.

Currently I’m working on Redis 3.0.0, that is in release candidate stage right now. This release brings clustering to Redis, and it was definitely challenging. It’s non-trivial to find a set of tradeoffs in order to make a Redis Cluster that looks like Redis single-node, from the point of view of the use-cases you can model with it. In the end, I tried to overcome the limitations by sacrificing certain other aspects of the system, in favor of what looked like the fundamental design priorities.

I’m also working on a new open-source project currently – a distributed message queue. It is the first program I’ve written directly as a distributed system. I’m writing it because I see that many people use Redis as a message broker for delayed tasks, even if it was not designed for this specifically and there are other systems focusing on this task. So I asked myself ‘if Redis is not specifically designed for this, what makes people happy to use it compared to other systems?’ Maybe I can extract what is good about Redis and create a new system that is Redis-like but specifically designed for the task. So Disque was born (code not yet released currently).

When are you at your happiest whilst coding?

My preferred moment is when I write a lot of code, maybe without even trying to compile at all for days. Adding new abstractions, structures, functions, with an idea about how to combine all this to create something. Initially everything is a bit of a blur and you don’t really know if it’s going to work. But, eventually every missing piece starts to be filled with code, and the system makes sense, compiles, and suddenly you see it working on your computer. Something magical happened, something new was created where there was nothing a few days ago. I believe this is an aspect to love about programming.


What is your dev environment?

I use a MacBook Air 11″ and a desktop Linux system that I use mostly via SSH. I have an external monitor and keyboard that I attach to the MBA when I’m at home. I work at home in a room that is half office and half gym. I code sitting, doing small “sprints”, of 45 minutes to a max of 1.5 hours. Then I get up and either grab a coffee, exchange a few words with my Wife, go to collect one of my children or alike.

I don’t like music when I code, as I love the kind of music that needs pretty active listening, like Square Pusher, Venetian Snares, Classical music, and so forth. I don’t stop too late, maybe 6pm, but if I did not reach 8 hours of work, then I work again when my family goes to bed.

I use OS X on the MBA, with iTerm2 and the usual command line tools: Clang and Vim. On the Linux system, I use Ubuntu with GCC, Vim, and Valgrind. Vim and Valgrind are two fundamental tools I use every day.

From the point of view of desktop software, I use Google Chrome, Firefox, and Evernote to take a number of notes while I write code – kind of like a TODO list to avoid losing focus if I think about something the code needs.

I use Twitter a lot for work with the only Twitter client I actually like, and I wish it was more actively developed: YoruFukurou. For IRC, I use Limechat. For messaging, Telegram.

What are your favorite books about development?

A long time ago I enjoyed Structure and Interpretation of Computer Programs (SICP), but I never read it again. Books on algorithms were the ones that turned me from a Spaghetti-coder into something a bit better, probably. I’m not a fan of Best Practices, so I don’t like a lot of books like Design Patterns or The Pragmatic Programmer. Recently I re-read The Mythical Man-Month (TMMM) and The Design of Design, however, I find the latter less useful. I would love to read more actually detailed accounts of software project experiences and TMMM is more like that.


What technologies are you currently trying out?

I want an excuse to try Rust and Swift in some non-trivial software project. I don’t see Go as something that is going to serve as a “better C”, so I’m waiting for something new.

I’m not a big fan of new things in IT when they have the smell of being mostly fashion-driven, without actually bringing something new to the table. So I tend to not use the new, cool stuff unless I see some obvious value.

When not coding, what do you like to do?

Spending time with family, being a Father, is something I do and enjoy. I also try to go outside with my Wife without the children when possible, to have some more relaxed, fun together. I enjoy doing power-lifting and I also run from time to time. I like theatre – I used to watch many pieces, and recently I got interested in it again and I’m attending an acting laboratory.

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

Don’t fragment your forces into too many pieces. Focus on the intersection of things that at the same time you find valuable, and many people find valuable. Since niches are a bit of a trap.


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


Previous Interviews

Jon Skeet
Bob Nystrom
Brian Bondy
Jared Parsons

by Gareth Wilson at March 02, 2015 11:44 AM

John Udell

Tag teams: The collaborative power of social tagging

My first experiences with social tagging, in services like Flickr and Delicious, profoundly changed how I think about managing shared online resources.

The freedom of an open-ended folksonomy, versus a controlled taxonomy, was exhilarating. But folksonomies can be, and often are, a complete mess. What really got my attention was the power that flows from disciplined use of tags, governed by thoughtful conventions. Given a set of resources -- photos in the case of Flickr, URLs in the case of Delicious -- you could envision a set of queries that you wanted to perform and use tags to enable those queries.

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

by Jon Udell at March 02, 2015 11:00 AM

March 01, 2015

Mark Bernstein

Garment of Shadows

Mary Russell finds herself in Morocco. She has misplaced her memory; she can’t quite remember who she is or how she finds herself in Marrakech. We know (though she does not) that she has also misplaced her husband, Mr. Sherlock Holmes. Intrigue and action in 1920s North Africa ensues, with a lovely portrait of Hubert Lyautey, the French resident-general, and of his expert and capable majordomo, Youssef.

March 01, 2015 05:24 PM

Squiggle Birds

Dave Grey’s Squiggle Birds,

a five minute exercise to convince people that, yes, they can draw well enough.

March 01, 2015 04:49 PM

February 28, 2015

Erlang Factory

Erlang User Conference: Call for Talks open until 10 March

The conference will take place on 9-10 June. It will be followed by one day of tutorials on 11 June and 3 days of expert training on 11-13 June. 

We are currently accepting talk submissions for the Erlang User Conference 2014. If you have an interesting project you are working on or would like to share your knowledge, please submit your talk here. The deadline is 10th of March.

February 28, 2015 02:17 AM

ONE DAY ONLY: 20% off all training courses at Erlang Factory SF Bay Area Starts 6 am - Ends 11.59 pm PST on 23 Jan

Erlang Express - Robert Virding 3-5 March
Erlang for Development Support - Tee Teoh 3-5 March
Cowboy Express - Loïc Hoguin 3-5 March
OTP Express - Robert Virding 10-12 March
Brewing Elixir - Tee Teoh 10-12 March
Riak- Nathan Aschbacher 10-12 March
Kazoo - James Aimonetti 10-12 March

February 28, 2015 02:17 AM

Erlang Factory SF Bay Area : 40 Very Early Bird tickets released on 16 December

On Monday 16 December 2013, after 12:00 PST we will release a batch of 40 tickets at the Very Early Bird rate of $890. 

The new and improved website for the Erlang Factory San Francisco Bay Area is coming out on Monday, and it will feature a first batch of over 25 speakers.

February 28, 2015 02:17 AM

February 27, 2015

Dave Winer

Problem with Scripting News in Firefox?

I was working with Doc Searls this afternoon, and saw how Scripting News looks in the version of Firefox he has running on his laptop. It looks awful. One tab is visible all scrunched up in a corner of the window.

I have the latest Firefox on my Mac and it looks fine. All the tabs are where they are. If you're seeing the problem on your system and have any idea what the problem might be, please leave a comment below. It really bothers me that what Doc is seeing is so awful.

February 27, 2015 10:23 PM

Excuse the sales pitch

First, thank you for reading this blog.

Now I want to try to sell you on an idea.

The idea: Supporting the open web.

Everywhere you look things are getting siloized, but for some reason, I must be an idiot, but I keep making software that gives users the freedom to choose. If my software isn't the best for you, now or at any time in the future, you can switch to whatever you like.

I make it because I dream of a world where individuals have power over their own lives, and can help inform each other, and not be owned by companies who just want to sell them stuff they don't want or need.

I work hard. And I stay focused on what I do. But my ideas don't really get heard that much. And that's a shame, because if lots of people used my software, that would encourage more people to make software like it, and eventually we'd be back where we were not that long ago, with you in charge of your own web presence.

Anyway, I'm almost finished. I spent two years porting everything I care about to run in Node.js and in the browser. I don't plan to dig any more big holes. This is basically it.

What can you do? Well honestly, if you see something you think is empowering or useful here on my blog, please tell people about it. The tech press will not be covering it, so you can't find out about it that way. It would be a shame to have put all this effort into creating great exciting open software, only to have very few people ever hear about it.

Thanks again for reading my blog, and I hope to be making software for you and your friends for a long time to come.

PS: The place to watch, for the new stuff, the stuff that has the most potential of rewriting the rules of the web, is on my new liveblog. That's where I'm telling the story I think is so important.

February 27, 2015 04:51 PM

Mark Bernstein

Pardon The Dust

I’ve been busy as a beaver, modernizing the core classes that are the foundation of Tinderbox export templates. These have decent tests, but this weblog (especially its main page) is a key acceptance test; if you notice things that are not right, Email me. Thanks!

February 27, 2015 02:14 PM

Pardon The Dust

I’ve been busy as a beaver, modernizing the core classes that are the foundation of Tinderbox export templates. These have decent tests, but this weblog (especially its main page) is a key acceptance test; if you notice things that are not right, Email me. Thanks!

February 27, 2015 02:14 PM

Fog Creek

A Developer’s Guide to Growth Hacking – Tech Talk


Given the media hype that surrounds the term ‘Growth Hacking’, you can be forgiven for dismissing the whole thing as another marketing buzzword. But what can get lost in the hubbub are some useful, development-inspired, working practices that can help a team focus on maximizing growth.

In this Tech Talk, Rob Sobers, Director of Inbound Marketing at Varonis, tells you all you need to know about Growth Hacking. Rob explains what Growth Hacking is and describes the processes key for it to be effective – from setting goals, to working through an experimentation cycle and how it works in practice.

Rob was formerly a Support Engineer here at Fog Creek, and is the creator of his own product, Munchkin Report. He writes on his blog about bootstrapping and startup marketing.


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

  • What is Growth Hacking (0:00)
  • People (2:34)
  • Process (3:22)
  • Setting Goals (5:25)
  • Experimentation Cycle (6:12)
  • How It Works In Practice (12:03)



What is Growth Hacking

I was a developer, started out my career as a developer, kind of moved into the design space and then did customer support here, and then now I’m doing marketing. I’ve been doing marketing for the past, I don’t know, two and a half three years almost. This sort of like, phrase, growth hacker kind of cropped up. I kind of let the phrase pass me by. I just didn’t discuss it. I didn’t call myself a growth hacker. I stayed completely out of it, mainly because of stuff like this.

It’s just overwhelming. Like Google ‘growth hacking’, you’ll want to throw up. What it really comes down to is that growth hacking is not at all about tactics. It’s not about tricks. It’s not about fooling your customers into buying your software or finding some secret lever to pull that’s hidden that’s going to unlock massive growth for your company. It’s really about science. It’s about the process. It’s about discipline. It’s about experimentation. Tactics are inputs to a greater system.

If someone came up to you, you’re a Starcraft player and said, “What tactic should I use?” You would have a million questions, “Well what race do you play? Who are you playing against? Who’s your opponent? What does he like to do? What race is he playing? Is it two vs. two or is it three vs. three?” There’s so many different questions. So if someone comes up to me and says, “What tactics? What marketing channels should I use for my business?” You can’t answer it. The answer is not in the tactics.

So this is what Sean Ellis, this is how he defines growth hacking. He says, “Growth hacking is experiment driven marketing.” You walk into most marketing departments, and they’ve done a budget, and they sit in a room, and they decide how to divvy up that money across different channels. “Okay, we’ll buy some display ads. We’ll do some Google Ad Words. We’ll invest in analyst relations,” but they’re doing it blind. Year after year, they’re not looking at the results, looking at the data, and they’re not running experiments. So it’s really kind of blind. So this is really the difference.

I took it one step further. I said growth hacking is experiment-driven marketing executed by people who don’t need permission or help to get things done, because I think growth hacking’s a lot about the process. And it’s about culture, and embracing the idea of doing a whole bunch of marketing experiments week over week. But if you have a team that is only idea-driven, and tactic driven, and then they have to farm out all of the production to multiple other stakeholders in the business like teams of Devs or Designers, then you’re not able to iterate. So to simplify it I just said, “Growth hacking equals people, people who have the requisite skills to get things done from start to finish, and process.”


So let’s talk about people. You don’t just wake up in the morning and just say like, “Let’s do some marketing.” You have to know what your goals are and then break it down into little pieces, and then attack based on that. So this is a system, that was devised by Brian Balfour at HubSpot. I call it the Balfour method. A good way to measure a person, when you’re hiring to be a growth hacker and run growth experiments, is to show them this chart and say, “Well how far around the wheel can you get before you need to put something on somebody else’s to-do list?” Now granted you’re not going to always be able to hire people that can do everything. I’ve seen it work where people can do bits and pieces, but it sure is nice to have people who can do design and development on a growth team.


So before you begin implementing a process at your company, what you want to do is establish a method for testing. And then you need analytics and reporting. I’ve seen a lot of companies really miss the boat with their analytics. They’ve got it too fragmented across multiple systems. The analytics for their website is too far detached from the analytics that’s within their products. Because you don’t want to stop at the front-facing marketing site. It’s great to run A/B tests, and experiment on your home page, and try and get more people to click through to your product page and your sign-up page, but then also there are these deep product levers that you can experiment with your onboarding process, and your activation and your referral flow.

So what you’re really looking for, and the reason why you establish a system and a method, is number one to establish a rhythm. So at my company we were in a funk where we were just running an A/B test every now and then when we had spare time. It’s really one of the most high-value things we could be doing, yet we were neglecting to do it. We were working on other projects. The biggest thing we did was we had implemented this process which it forces us to meet every Monday morning and discuss, layout our experiments, really define what our goals are, and establish that rhythm.

Number two is learning, and that basically is that all the results of your experiments should be cataloged so that you can feed them back into the loop. So if you learned a certain thing about putting maybe a customer testimonial on a sign-up page, and it increases your conversion by 2%, maybe you take a testimonial and put it somewhere else where where it might have the same sort of impact. So you take those learnings and you reincorporate them, or you double down.

Autonomy, that goes back to teams. You really want your growth team to be able to autonomously make changes and run their experiments without a lot of overhead. And then accountability, you’re not going to succeed the majority of the time. In fact you’re going to fail most of the time with these experiments. But the important thing is that you keep learning and you’re looking at your batting average and you’re improving things.

Setting Goals

So Brian’s system, it has a macro level and a micro level. You set three levels of goals. One that you’re most likely to hit. So 90% of the time you’ll hit it, another goal at which you’ll hit probably 50% of the time, and then a really reach goal which you’ll hit about 10% of the time. And then an example would be let’s improve our activation rate by X%. This is our stated goal. Now for 30 to 60 days let’s go heads down and run experiments until the 60 days is up, and we’ll look and see if we hit our OKRs with checkpoints along the way. So now you zoom in and you experiment. So this is the week-by-week basis. So every week you’re going through this cycle.

Experimentation Cycle

So there’s really four key documents as part of this experimentation cycle. The first is the backlog. That’s where you catalog. That’s where you catalog all your different ideas. Then you have a pipeline which tells you what you’re going to run next, as well as what you’ve run in the past. So that somebody new on the team can come in and take a look and see what you’ve done to get where you are today. Then is your experiment doc which serves sort of as a specification.

So when you’re getting ready to do a big test, like let’s say you’re going to re-engineer your referral flow, you’re going to outline all the different variations. You’re going to estimate your probability for success, and how you’re going to move that metric. It’s a lot like software development as you’re estimating how long somethings going to take, and you’re also estimating the impacts. And then there’s you’re play-books, good for people to refer to.

So with Trello it actually works out really well. So the brainstorm column here, the list here, is basically where anybody on the team can just dump links to different ideas, or write a card up saying, “Oh, we should try this.” It’s just totally off the cuff, just clear out whatever ideas are in your head and you dump them there. So you can discuss them during your meeting where you decide which experiments are coming up this week.

The idea is that you actually want to do go into the backlog. The pipeline are the ones that I’m actually going to do soon, and I’ll make a card, and I’ll put it in the pipeline. And then when I’m ready to design the experiment, I move it into the design phase, and then I create the experiment doc. And then I set my hypothesis, “I’m going to do this. I think it’s going to have this impact. Here are the different pages on the site I’m going to change, or things within the product I’m going to change.” And then later in the doc, it has all of the learnings and the results.

So one key tip that Brian talks about is when you’re trying to improve a certain metric, rather than saying, “Okay, how can we improve conversation rate?” You think about the different steps in the process. It just sort of helps you break the problem in multiple chunks, and then you start thinking a little bit more appropriately. And this is actually where the tactics come into play when you’re brainstorming, because this is where you’d want to actually look to others for inspiration. If you’re interested in improving your referral flow, maybe use a couple of different products, or think about the products that you use where you really thought their referral flow worked well, and then you use that as inspiration to impact yours. You don’t take it as prescription. You don’t try and like apply it one-to-one, but you think about how it worked with their audience and then you try to transfer it over to how it work with yours.

Prioritization, there’s really three factors here. You want to look a the impact, potential impact. You don’t necessarily know but you want to sort of gauge the potential impact should you succeed with this experiment. The probability for success, and this can be based on previous experiments that were very close to this one. So like I mentioned earlier, the customer testimonial you had a certain level of success with that in one part of your product on your website, and you’re going to just reapply it elsewhere. You can probably set the probability to high, because you’ve seen it in action with your company with the product before.

But if you’re venturing into a new space, let’s say like Facebook ads. You never run them for your product before. You don’t know what parameters to target. You don’t know anything about how the system works and the dayparting and that, then you probably want to set the probability to low. And then obviously the resources. Do I need a marketer? Do I need a designer, a developer and how many hours of their time?

So once you move something into the pipeline, I like to have my card look like this. I have my category, my label. So this is something with activation, trying to increase our activation rate. And then I say, “It’s successful. This variable will increase by this amount because of these assumptions.” Then you talk with your team about these assumptions, and try and explain why. So the experiment doc, I had mentioned before, this is sort of like your spec. I like doing this rather than implement the real thing upfront, if you can get away just putting up a landing page, and then worrying about the behind the scenes process later, do that. Like if you’re thinking about changing your pricing. Maybe change the pricing on the pricing page, and then not do all the accounting, billing code, modifications just yet.

Implement, there’s really not much to say about that. The second to last step is to analyze. So you want to check yourself as far as that impact. Did you hit your target? Was it more successful than you thought, less successful? And then most importantly, why? So really understanding why the experiment worked. Was it because you did something that was specifically keyed in on one of the emotions that your audience has? And then maybe you carry that through to later experiments.

And then systemize, another good example of systemizing that actually comes from HubSpot is the idea of an inbound marketing assessment. It’s actually their number one Lead Gen channel which is they just offer, for any company that wants, they’ll sit down one-on-one and do a full assessment of their website, of their marketing program, et cetera. When they were doing these one-on-one discussions those became their best leads most likely to convert.

So they made something called Website Grader which is something you could find online, and it’s sort of like the top of the funnel for that marketing assessment where someone’s like, “Ah, I don’t know if my website’s good at SEO, and am I getting a lot of links?” like that. So they’ll plug it into the marketing grader. It’ll go through and give them a grade. They’ll get a nice report, and then a sales rep in the territory that that person lives will now have a perfect lead-in to an inbound marketing assessment. Which they know is a high-converting activity should someone actually get on the phone with their consultant. So it’s a good example of productising.

How It Works In Practice

So this is just sort of like how the system works. So Monday morning we have … It’s our only meeting. It’s about an hour and a half, and we go through what we learned last week. We look at our goals, make sure we’re on track for our OKR, which is our Objective and Key Result. And then we look at what experiments we’re going to run this week, and then the rest of the week is all going thought that rapid iteration of that cycle of brainstorming, implementing, testing, analyzing, et cetera.

So you kind of go through these periods of 30 to 90 days of pure heads-down focus, and then afterwards you zoom out, and you say, “How good am I at predicting success of these experiments? Are we predicting that we’re going to make a big impact, or making small impacts? Is our resource allocation predictions accurate?” And then you want to always be improving on throughput. So if you were able to run 50 experiments during a 90-day period, your next 90 days you want to be able to run 55 or 60. So you always want to be improving.

by Gareth Wilson at February 27, 2015 11:33 AM

February 26, 2015

Fog Creek

4 Steps to Onboarding a New Support Team Hire

newSupportHire (1)
At Fog Creek, every now and then the Support team has the pleasure of onboarding a new member. We know what most of you are thinking “Wait! Did they just say ‘pleasure’?” Yes, yes we did. Team onboarding does not have to be an irksome obstacle in your day-to-day work – it’s a key milestone for your new hire’s long-term success and the process should be repeatable and reusable.

If you’ve ever been in support, you know there can be a lot of cached knowledge representing the status quo, and there is usually, and sometimes exclusively, a “show and tell” style of training. This is the fire drill of knowledge transfer, and it’s an arduous process for all concerned. Not only does it take longer for the new hire to get up to speed, but you also have at least one person no longer helping your customers. For anyone who has ever worked in a queue, we’re sure you can agree that when someone steps out, the team feels the impact immediately.

Our Support team mitigates this by using a well-documented onboarding process. And we do it without a giant paperweight… err training manual. Similar to how we onboard new hires to the company, we also leverage Trello to onboard our new Support team hires. The items on the board are organized and the new hire just works down the list.

The board separates out individual items and team-oriented items. This keeps the new person accountable for their tasks, and it keeps the team involved so that they don’t accidentally abandon them.

support team onboarding new hire trello board

1. Read Up on the Essentials

The first item on the board is titled “What to read on your first day”. This card links to a wiki page that talks about the things the new person needs to know before they can do any real work.

Next, is the “Support Glossary”. This is essential as they’re going to hear words, phrases, and acronyms galore. So scanning through this card helps them start to get a feel for the “lingo”.

With this done, it’s time to join the company chat and get a few nice “hellos” and introductions from other folks in the company. Primarily, this stage helps them to start assimilating the knowledge they’ll need to be successful in the role.

The assimilation process starts with briefly describing the Support team’s role and responsibilities within the organization. This covers our two main workflows: interrupts and queue-based. Then we move on to our guiding customer service principles.

After reading several more cards, which each link off to wiki pages, the new person moves them over to the ever-so-rewarding “Done” column. Starting to feel accomplished, they can start to get their hands dirty.

You may be wondering “couldn’t they just have one card and link to a wiki page with a list of articles?” Sure. But, that process tends to be more of a rabbit hole, and we want our Support team hires to have just the right amount of information in phases, and not dumped on them all at once.

2. Dogfood Until it Hurts

supportTeam2 (1)
After reading for what probably feels like weeks (not really, a day maybe), the new person starts using our products. Since we dogfood our own products, this is a great way to discover and learn about them. They can later use this experience to relate to, and help new customers. They create production accounts, staging accounts, and start a series of configurations. This helps them get into the Support workflow.

3. Go Under the Hood

Configuring web application sites isn’t all that hard, so we up the challenge. The new hire starts creating any necessary virtual machines (VM). Each one is identified on separate cards on the board, naturally. These VMs aid the new Support member in troubleshooting customer environments by replicating them as best as they can.

Since Kiln and FogBugz sit on top of databases, the new person also starts to configure those systems and get familiar with the database schemas. This helps build an understanding of our products’ foundations.

Once they have what we call the “basics”, they can start tricking out their dev machine. This card links to another board with all the juicy details maintained by all devs in the company.

4. Get Immersed in the Workflow

supportTeam (1)
There are a several more cards which discuss process and procedures. These include when to use external resources, where they are located, and how to use them.

A key part of Support is a robust workflow. The team helps the new person get immersed into the workflow by adding them to scripts, giving the repository permissions in Kiln, adding them to recurring team calendar events, and so on. Most importantly, they start to see how the Support team shares knowledge and work on some real customer cases where they will be helping our customers be amazingly happy!

We’ve found that using a lightweight, but clearly defined process, to onboard a new hire to our Support team is key to their efficiency and long-term success. It helps the new hire become self-sufficient, as well as know where they can go for help as they gain experience.

by Derrick Miller at February 26, 2015 11:22 AM

February 25, 2015

Dave Winer

Comments on the Node Foundation

Eran Hammer posted a long piece yesterday about why he does not support a Node Foundation.

I am a relative newcomer to Node, having started developing in it a little over a year ago. I've shipped a number of products in Node. All my new server software is running in Node, most of it on Heroku. I love Node. Even though it's a pain in the ass in some ways, I've come to adore the pain, the problems are like crossword puzzles. I feel a real sense of accomplishment when I figure it out.

The server component of my liveblog is running in Node, for example.

I am new to Node but I also have a lot of experience with the dynamics Hammer is talking about, in my work with RSS, XML-RPC and SOAP. What he says is right. When you get big companies in the loop, the motives change from what they were when it was just a bunch of ambitious engineers trying to build an open underpinning for the software they're working on. All of a sudden their strategies start determining which way the standard goes. That often means obfuscating simple technology, because if it's really simple, they won't be able to sell expensive consulting contracts. He was right to single out IBM. That's their main business. RSS hurt their publishing business because it turned something incomprehensible into something trivial to understand. Who needs to pay $500K per year for a consulting contract to advise them on such transparent technology? They lost business.

IBM, Sun and Microsoft, through the W3C, made SOAP utterly incomprehensible. Why? I assume because they wanted to be able to claim standards-compliance without having to deal with all that messy interop.

As I see it Node was born out of a very simple idea. Here's this great JavaScript interpreter. Wouldn't it be great to write server apps in it, in addition to code that runs in the browser? After that, a few libraries came along, that factored out things everyone had to do, almost like device drivers in a way. The filesystem, sending and receiving HTTP requests. Parsing various standard content types. Somehow there didn't end up being eight different versions of the core functionality. That's where the greatness of Node comes from. We may look back on this having been the golden age of Node.

There are reasons why, once a technology becomes popular, it's very hard to add new functionality. All the newcomers want to make a name for themselves by authoring one of the standard packages. Everyone has an idea how it should be done, and won't compromise. So what happens is very predictable, and NOT BAD. The environment stops growing. I saw that happening in RSS, as all the fighting over which way to rip up the pavement and start over took over the mail lists. So when RSS 2.0 came out I froze it. No more innovation. That's it. It's finished. If you want to do new stuff, start a module (very much like the NPM packages of Node). Luckily, at that moment, I had the power to do that, as Joyent did with Node, when embarking on this ill-advised foundation track.

Now there are many things about Node culture that I don't understand, being a newbie, as I am. But based on what I know about technology evolution from other contexts, the lack of motion at Joyent wasn't a problem, it was realistic. It was what I, as a removed-from-the-fray developer want. I want this platform to stay what it is. I want to rock and roll in my software, not be broken every time someone decides we should hit the ball from one side of the plate, then the other, then back to the original. Nerd debates about technology never end, until someone puts their foot down and says, no more debates, it's done. And the confusion in those debates is always manipulated by the BigCo's who have motives that we'd be happier not really understanding. I know I would be. Nightmarish stuff.

I love Node. I want it to be solid, that's the most important thing to me. I'd love to see a list, in a very simple newbie-friendly language, that explains what it is that Node needs so desperately to justify both the fork, and the establishment of this foundation. Seems to me we might be pining for the good old days of last year before too long. ;-(

PS: Hat-tip to the io.js guys. In the RSS world, the forkers claimed the right to the name. At least you guys had the grace to start with a new name, so as not to cause the kind of confusion the RSS community had to deal with.

February 25, 2015 03:54 PM

Fog Creek

Help Work to Flow – Interview with Sam Laing and Karen Greaves

.little {font-size: 75%}

Looking for audio only? Listen on


We’ve interviewed Sam Laing and Karen Greaves, Agile coaches and trainers at Growing Agile, in Cape Town, South Africa. Together they wrote ‘Help Work to Flow’, a book with more than 30 tips, techniques and games to improve your productivity. We cover how software developers can improve their productivity and manage interruptions, why feedback and visible progress are important to staying motivated and how teams can hold better meetings.

They write about Agile development techniques on their blog.


Content and Timings

  • Introduction (0:00)
  • Achieving Flow (2:06)
  • Importance of Immediate Feedback (3:07)
  • Visible Progress (4:27)
  • Managing Interruptions (5:42)
  • Recommended Resources (8:50)




Today we have Sam Laing and Karen Greaves who are Agile coaches and trainers at Growing Agile based in South Africa. They speak at conferences and write about Agile development. They’ve written 8 books between them, including their latest book, Help Work to Flow, part of the Growing Agile series. Sam and Karen, thank you so much for taking your time to join us today all the way from South Africa. Why don’t you say a bit about yourselves?

We both have worked in software our whole careers and we discovered Agile somewhere along the line about 8 years ago and figured out it was a much better way to work. Then in 2012, so just over 3 years ago, we decided that’s what we wanted to do, was help more people do this and figure out how to build better software. So we formed our own company, Growing Agile, it’s just the 2 of us and we pair work with everything we do, so you’ll always find us together.

Really what we do is just help people do this stuff better and use a lot of common sense. What’s been quite exciting in the last few years is now being business owners of our own small business. We’re getting to try lots of Agile techniques and things for ourselves and it’s lots of fun and a constant journey for us.

I wanted to touch on the book, Help Work to Flow, what made you want to write that?

What actually happened is we joined the meetup called the Cape Marketing meetup and it’s for small business owners to learn about marketing techniques and how to market their small businesses. In doing that we realized that a lot of them are very, very busy and think they need to hire people to help them with their admin. We ran a mini master class with them on Kanban on how to use that as a small business owner. They absolutely loved it. They’re still sending us pictures of their boards and how it’s helping them with their workflow. We are like, well actually we have a lot of these tips that could help other people so let’s just put them together into a book.

Achieving Flow

I want to touch on flow for a bit, it’s often elusive to developers. How can developers help themselves achieve flow?

The first thing that pops in is pairing. To help with flow, having a pair, this is my pair, helps a lot. When someone’s sitting next to you, it’s very difficult to get distracted with your emails and with your phone calls and with something else because this person right here is keeping you on track and keeping you focused.

Another one would be to avoid yak shaving. I’m an ex-developer, I know exactly how this happens. You’re writing a function for something and you need to figure out some method and you go down Google and then you go into some other chat room. Next thing you’re on stack overflow and you’re answering questions that other people have asked that has nothing to do with what you were doing. Again, to have a pair to call you on that yak shaving is first prize but otherwise to recognize when you personally are yak shaving, bonus points.

Importance of Immediate Feedback

Enabling immediate feedback is said to be key to achieving flow. How can this be applied within the context of software development?

What we see lots of software teams do, is they all understand that code reviews are good and if they’re not doing pair programming then they should do code reviews. You even get teams where testers get their test cases reviewed but often what we see is teams leave that kind of to the last minute. We’ve done everything now let’s just quickly do the review.

One of the things we teach teams is instead of thinking of it as a review which is a big formal thing you do at the end, we use something that’s just called show me. I think we got it from Janet Gregory who wrote the book on Agile Testing. Literally as soon as you’re done with a small task, something that took you an hour maybe 2, you grab some else on your team or working with you and you show them for 5 minutes.

Like “Hey, could you just come and see what I did?” They quickly look at it, you get immediate feedback. Does it meet what their expectation was? Are there any obvious issues. The great thing about reviews where you get to explain what you did, sometimes you find the issues yourself. Definitely using that show me idea, versus making reviews a big thing. We’ve seen that have a radical changes in feedback for teams.

Visible Progress

The book highlights the importance of clear goals and visible progress. What do you mean by visible progress and why is it important to flow?

When you physically write down what’s top of mind, it kind of enters your brain so you don’t have to worry about those things anymore because you’ve written them down. If you’ve got, imagine a board in front of you with all these things that have been popping off of your mind, when you move those stickies across to done, you get this sense of achievement.

You automatically sending information out to those around you and to yourself on how much you’ve done versus how much you’ve still got to do. It helps you to get into the flow of getting stuff done. It also helps other people realize how busy you are and whether they should or shouldn’t add more to your workflow.

It’s really interesting, earlier today our personal task board, which is a physical board that sits between us, was like overwhelmed with too much stuff. I was like, “I just feel like we’re not getting anything done.” Sam took all the stickies and she put them on another piece of paper and said, “Okay, here are the 8 we have to do today.” Just looking at a board with 8 things, I said, “Okay, I can do 8 things today.” Before I was like, “I can’t even start anything because there’s so much stuff here.” That really, really helped.

Managing Interruptions

Here at Fog Creek every developer has a private office, to help them sort of reduce interruptions. What other techniques can you recommend to help developers manage interruptions?

Firstly, you’re quite lucky, most of the teams we encounter here are using open-plan offices and personal offices are quite rare but one of the teams we worked with had this great idea and it’s in the book and its called the point of contact for emergencies and it’s pronounced as POCE. What happens with that is they, in the team they agree who’s the person for this week who’s going to be the interrupt-able person and they even put a sign on their doors, going if you’ve got an urgent issue speak to Adrian, Adrian is going to be the POCE this week.

They rotate that within the team and so that persons going to have a lot of interruptions that week but everyone else is a lot less interrupt. The rule is, that person can then talk to team members if they can’t solve the problem but at least then team members are being interrupted by one person who’s part of their team and probably not as often as outside. That’s one idea that we can use.

Another one is, if you do get interrupted, don’t immediately do that interruption. Add it to your task list, add it to the list of work that you think you’re going to do that day and prioritize it accordingly. Often if you get disrupted with, do this and do that and do that, you’ve pushed your whole day out of sync and they’re usually not as important as other things.

We’ve touched on ways that an individual developer can help themselves but how can dev management go about encouraging flow across whole teams or organizations?

One of the biggest areas that we see waste are meetings. Often you have a lot of people involved in a meeting, it’s poorly facilitated or not facilitated at all. Also the actual goal of the meeting, sometimes is just to talk about what’s going to happen in the next meeting, which is atrocious and such a waste of time.

For management to encourage having facilitators, encourage people to get facilitation skills so that these meetings aren’t such a waste of time would already be a huge money and time saver. Also to look at having meeting free days so that people aren’t rushing from one meeting to the next or only have one hour of work between 3 meetings. Rather have one day that you are completely immersed in meetings and not going to do any work and then 2 days of no meetings, where you could focus.

I mean, we came up with that because we found with us being coaches and trainers, we’re often meeting new clients, giving them proposals or whatever. We go around quite a lot and sometimes we do onsite work and then we’re in the office. We just felt like we were getting nothing done. We did it the other way around, we came up with out-of-office days, so on 2 days a week we’ll be out of the office and everything has to fit into one of those 2 days if we’re meeting someone else. Then the other 3 days we had in the office and we actually got a lot of things done. That’s where we identified that and it still works really, really well for us.

Recommended Resources

What are some resources that you can recommend for people wanting to learn more about some of these types of techniques?

Really if you just Google productivity tips, you’ll find a whole bunch. The trick is that they’re not all going to work for you, so try a couple.

Even the ones in our book, not everything is going to work for you and it’s definitely not all going to work at the same time.

Our advice is find tips wherever you can, try them and then keep the ones that work.

Sam and Karen, thank you so much for joining us today.

Thank you.

Thanks very much.

by Gareth Wilson at February 25, 2015 11:52 AM

February 24, 2015

Dave Winer

My 'Narrate Your Work' page

I now finally have a Narrate Your Work public page.

This has been a goal of mine for many years.

I had a worknotes outline a few years back, but it wasn't like this.

It was published. This is just what I type as I type it.

I still have another level of project management in an outline that is not public, can't be, because it contains private information.

But I'm going to move more and more into the liveblog.

Also looking forward to actually liveblogging a live event with it. If I knew/cared more about the Oscars I would have done that. Maybe the NBA playoffs? We'll see.

February 24, 2015 10:33 PM

How to fix the Internet economy

Suppose you watched a movie illegally, because it was convenient to watch it at home, and you feel like a jerk for not paying the $15 for a seat in the theater.

There are lots of reasons not to go to a theater. Poor sound quality. People who bring infants to the theater, or talk about the movie loudly as if we were in their living room.

What if?

What if there was a way to pay for the movie, after-the-fact?

No movie chain is going to do this, so why not start a proxy for them?

  1. You'd log into a central site, if you're new, enter your credit card info

  2. Navigate to the page for the movie you just watched.

  3. Click the box, and click OK, and you've paid the fee.

I don't think it should be a voluntary amount. It should the the price of a ticket, either the average price, or the price at a theater local to you (think about this). This isn't charity, it's about convenience. You're not trying to avoid paying for the movie-watching experience, or negotiate a better price.

Where does the money go?

This is where it gets interesting.

At first, at least, no movie company is going to want this to exist. They might try to sue it out of existence. In the meantime, the money goes into escrow accounts, earning interest, to be paid to the rights-holder, when they demand it. Who is the rights holder? That's probably a large part of what will be litigated.

It would be like the lottery, the jackpot would keep growing, and the pressure would build (think about shareholders) to just take the money. And if that were to happen, we would have a whole new way of doing content on the Internet, for pay.


It's a way to bootstrap a new economy, one that will be useful in other contexts.

For example, I was just reminded that I could pay the New Yorker $1 per month to read all their articles. I would totally do this. If I didn't have to create an account, and give them all my info, and be subject to all the marketing these guys do. The price isn't just $1 a month. That's just what you pay so they can begin to aggressively upsell you. But I'd like to give them the money.

We need a middle-man here, some entity that doesn't belong to the vendors or the users. It cares equally for both. This would ultimately be good for the vendors, because the system is very inefficient.

February 24, 2015 09:30 PM

Question about JavaScript and XML

Update: I came up with a different solution, so this is no longer a priority for me.

I want to write a routine that emojifies an OPML file.

It takes OPML text as input, parses it, walks the whole structure, and emojifies the text, and then replaces the original text with the new text.

At the end of the traversal, it re-serializes the XML text, and returns it.

However, I get an error at the crucial point, the call to serializeToString.

Uncaught TypeError: Failed to execute 'serializeToString' on 'XMLSerializer': Invalid node value.

February 24, 2015 07:57 PM

John Udell

GitHub for the rest of us

There's a reason why software developers live at the leading edges of an unevenly distributed future: Their work products have always been digital artifacts, and since the dawn of networks, their work processes have been connected.

The tools that enable software developers to work and the cultures that surround the use of those tools tend to find their way into the mainstream. It seems obvious, in retrospect, that email and instant messaging -- both used by developers before anybody else -- would have reached the masses. Those modes of communication were relevant to everyone.

[ Also on InfoWorld: Git smart! 20 essential tips for Git and GitHub users | Navigate the rapid advances in programming with hot trends and cold spells for coders and 15 technologies that are changing how developers work. | Keep up with hot topics in app dev with InfoWorld's Application Development newsletter. ]

It's less obvious that Git, the tool invented to coordinate the development of the Linux kernel, and GitHub, the tool-based culture that surrounds it, will be as widely relevant. Most people don't sling code for a living. But as the work products and processes of every profession are increasingly digitized, many of us will gravitate to tools designed to coordinate our work on shared digital artifacts. That's why Git and GitHub are finding their way into workflows that produce artifacts other than, or in addition to, code.

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

by Jon Udell at February 24, 2015 11:00 AM

February 23, 2015

Tim Ferriss


The Tim Ferriss Show - Glitch Mob

(Photo: Ralph Arvesen)

Justin Boreta is a founding member of The Glitch Mob. Their music has been featured in movies like Sin City II, Edge of Tomorrow, Captain America, and Spiderman.

In this post, we discuss The Glitch Mob’s path from unknown band to playing sold-out 90,000-person (!) arenas.  We delve into war stories, and go deep into creative process, including never-before-heard “drafts” of blockbuster tracks!  Even if you have zero interest in music, Justin discusses habits and strategies that can be applied to nearly anything.  Meditation?  Morning routines?  We cover it all.

TF-ItunesButton TF-StitcherButton

The Glitch Mob’s last album, Love Death Immortality, debuted on the Billboard charts at #1 Electronic Album, #1 Indie Label, and #4 Overall Digital Album. This is particularly impressive because The Glitch Mob is an artist-owned group.  It’s a true self-made start-up.

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. Order one of their dress shirts this week and get a Henley shirt (around $60 retail) for free.  Just add the two you like here to the cart, then use code “TIM” at checkout.

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 music do you listen to when you work? When you really need to get in the zone? Please share in the comments.

Do you enjoy this podcast? If so, could you please leave a short review here? I read them, and they keep me going.

Scroll below for links and show notes…

Selected Links from the Episode

Website | FacebookTwitter | Instagram | YouTube

Learn More about The Glitch Mob




Commercial Work

Show Notes (Time Stamps Approximate)

  • World-class attributes of Justin Boreta
  • The Grant Korgan story
  • Unique attributes of The Glitch Mob and the feeling of being on stage in front of 90,000+ people
  • Defining “indie” and “artist owned”
  • The makeup and evolution of The Glitch Mob team
  • Tools and software of The Glitch Mob
  • What exactly is “mastering”?
  • Deconstructing audio engineering software and Ableton
  • How to have your music featured in massive motion pictures
  • The story of the Sin City II trailer
  • Justin plays Animus Vox [approx 36:30]
  • The fourth member, Kevin, and his role in the success of the business
  • Developing the creative process as success comes into play
  • Soliciting feedback, Justin Boreta-style
  • Describing a day in the studio for The Glitch Mob
  • Commonalities of the most successful songs
  • The importance of traditional instrument skills when performing/producing music
  • Justin plays the never before heard 6th version of Our Demons, followed by the finished product [57:30]
  • A rapid learning program for music production
  • The draft version of Fortune Days, followed by the finished product [1:03:15]
  • How many separate tracks are running in a Glitch Mob song?
  • What percentage of samples are custom vs. off-the-shelf?
  • Current revenue streams for The Glitch Mob
  • Favorite pastry, pre-show meditation, defining success, and advice for his 20-year old self
  • What EDM show should the uninitiated go to first, morning rituals, meditation and morning workouts
  • What is the best piece of advice you’ve ever received? [1:40:20]
  • Justin plays us out with Can’t Kill Us [1:48:45]

People Mentioned

by Ian Robinson at February 23, 2015 10:16 PM

John Udell

Literate programming is now a team sport

In the mid-1980s I worked for a company that squandered a goodly number of tax dollars on a software project for the Army. Do horrors spring to mind when you hear the phrase "milspec software"? It was even worse. My gig was milspec software documentation.

We produced some architectural docs, but our output was dwarfed by piles of that era's precursor to Javadoc: boilerplate extracted from source code. During one meeting, the head of the doc team thudded a two-foot-thick mound of the stuff onto the table and said: "This means nothing to anyone."

[ The art of programming is changing rapidly. We help you navigate what's hot in programming and what's going cold and give insights into the technologies that are changing how developers work. | Keep up with hot topics in app dev with InfoWorld's Application Development newsletter. ]

Meanwhile, we were following the adventures of Donald Knuth, who was developing an idea he called literate programming. A program, he said, was a story told in two languages: code and prose. You needed to be able to write both at the same time, and in a way that elevated the prose to equal status with the code. Ideas were explored in prose narration, at varying levels of abstraction, then gradually fleshed out in code. 

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

by Jon Udell at February 23, 2015 11:00 AM

February 22, 2015

Giles Bowkett

Rest In Peace, Carlo Flores

This is my third "rest in peace" blog post since Thanksgiving, and in a sense, it's the saddest.

My friend Carlo Flores has died. He lived in Los Angeles, and on Twitter, every hacker in Los Angeles was going nuts with grief a few days ago. None of them would say what happened. I had the terrible suspicion Carlo killed himself, and I eventually found out I was right:

I can't even imagine the pain he must have been in to seek a way out, knowing that it would make all of us miss him this way.

I love you Carlo. I'm going to rock for you today.

by Giles Bowkett ( at February 22, 2015 03:49 PM