You Can Make It Better
Posted: March 20, 2012 Filed under: regular Leave a comment »I tweeted the following early on:
Don’t make disabling ads the reason people pay for your software. #protip
Why did I say this if several app authors proved me wrong since the App Store inception, a couple of years ago? I can tell you: I’m a opinionated bastard that doesn’t believe in this kind of common sense.
I’ve been working on a couple of iOS apps for a while, and parallel to that I’ve been contemplating how to put these apps into the wild: whether I should sell ‘em or make ‘em available for free with or without ads. This is a tough decision, and even if my apps aren’t yet ready for the App Store I figured out some points that will constitute my guidelines. Here you have ‘em in first hand.
Do not use ads. Never.
I want to avoid that ads are evil motto, but I can’t help myself: ads are evil.
The point here is: what is your product? Is your app your product? Or you’re selling your app’s users to the ad network? This is subtle, but is a big change in how you treat your user base. In most cases, what I’ve observed in the App Store is that app developers throw apps that could be baked in a couple of days that don’t fulfill their user’s expectations and only serve as fishnet for the ad networks.
Additionally, according to a recent study by Abhinav Pathak, apps that display ads to their users tend to drain more battery from your device. Even if you’re cashing in some bucks, you’re doing your customer a disservice.
If you can’t give your customers a reason to pay for your app, either don’t release it or give it away for free. You can do better than charging your users to disable those stinky ads in your app. And this ties to the second point.
Charge your customers for extended functionality, if possible.
Give your customers a set of core functionality for free, no ads. Remember: you haven’t pissed ‘em off rubbing annoying ads in their faces in the first place, so even if you lose a few bucks, I bet your customer will be much happier and even consider to give you his hard-earned dollars (or euros, or…) to unlock the amazing functionalities there aren’t for free. Better yet…
Create a strong case to charge your customers right away.
Create a compelling reason for people throw their money on you. Solve their problems, one by one. Deliver the best software you can. It doesn’t need to be eye-candy, it needs to solve your customer’s problem. There are plenty of utilities that people charge right away, and even if aren’t a big hit, at least people are serious to give you feedback to make it better.
Some examples: Shush, by Daniel Jalkut and Closeby, by Collin Donnell. Their apps are simple, but they’ve put enough effort and take their work serious to ask money for the apps they’ve created.
Recap
- Do not use ads. Never.
- Charge your customers for extended functionality, if possible.
- Create a strong case to charge your customers right away.
Those are my guidelines. What are yours?
Random Notes on the Pomodoro Technique
Posted: March 16, 2012 Filed under: regular Leave a comment »Recently I’ve been diagnosed with ADD, and boy, it’s awesome.
Wait, I’ll explain.
Before I was diagnosed, I had no confidence whatsoever since I never knew why I was so different from the “normal” dudes. When the diagnose was confirmed, I finally had an answer. It wasn’t my fault, or lack of interest to make things right. It is a condition I have to accept, and others as well. Most of my everyday difficulties are ADD related, and finally I had the knowledge about my condition in order to adjust my behavior. And things got better.
One of the main characteristics about ADD is the lack of attention when executing mundane tasks or chores–on the other hand ADD people have something called “hyper focus” which is the excessive focus and immersion on activities they really enjoy–making it quite hard to finish something. If you ask any ADD person about their personal organization, you’ll find they acknowledge they suck on the topic but are always trying to get organized in some fashion–using GTD or any other methodology. Been there, done that.
Lately, I’ve been experimenting with the Pomodoro technique, and found some aspects of it having pretty interesting psychological side effects on the way I work. For the good.
Let’s talk a little about it. The Pomodoro Technique was created by …. He wanted to have simple tools to be effective on getting things done (no pun intended), and found the basis of his methodology on a simple kitchen timer–which appears to be quite common to be a tomato in his country (pomodoro is the italian word for tomato, if you haven’t figured that out).
The idea is quite simple: set the kitchen timer to 25 minutes and focus as much as possible on the task you have at hand. Once the timer rings, stop what you’re doing and go take a break. This is what I’m implementing right now since I don’t have many tasks at hand.
In the beginning it’s quite hard to not get distracted, and because of the ADD it gets even worse. I found a gotcha tho: I’m using the … application to count my pomodoros and in the first day or two I couldn’t even remember the timer was running, and obviously lost focus pretty easily. My mistake: mute all sounds from the … application. Once I turned the sounds on again, including the characteristic tic tac from analog kitchen timers things started to get better. I thought I would be annoyed by the constant tic tac, but it happened otherwise: now I have something reminding me every second that I need to focus on my work, and works like a charm.
Another thing I really like about this part of the technique, is the fact that is a time management technique, not task management. It doesn’t matter if you’re either using GTD or a task list, you can still benefit from the kitchen timer (although … provided his own take on task management as well).
My opinion: if you’re having problems procrastinating and not having things done, try it. In the end doesn’t matter if you have a system in place and still can’t manage to tick your tasks.
When We Build
Posted: January 25, 2012 Filed under: regular | Tags: Buildconf, Encouragement, Presentations Leave a comment »
Awesome presentation from Wilson Miner at Buildconf. Perfect.
Writing Testable Code
Posted: January 22, 2012 Filed under: Development, regular | Tags: Development, Objective-C, Pattern, Python 2 Comments »
In the last few years, several types of development have emerged: Test Driven Development, Behavior Driven Development and others. At the same time I see the benefits of what is stated by their creators, I don’t think that writing tests or specifying behavior upfront always a good thing for all kinds of projects. In fact, I suspect it isn’t even possible for some projects, due its natures.
Please beware I’m not discouraging you to use those methodologies in any way. My objective with this essay is to encourage you as developer to write as much testable code as possible.
What Testable Code Is?
We should start with the modern definition of code, according to Wikipedia:
In computer science, source code is a text written using the format and syntax of the programming language, or a computer language of another purpose, that it is being written in.
Basically, it is the text written in some language, defining a set of instructions, that will be transformed at some point into computer commands and executed by the computer.
For the computer, it really doesn’t matter how we write the code, as long it makes sense at the time it executes. Simple like that.
Several programing paradigms were created since the beginning of computing: procedural, functional, object oriented programming, amongst other more obscure. As I mentioned before, the net result of each one of these programming paradigms is to produce computer executable code, and it is possible that programs written in languages implementing different paradigms produce the exact same computer executable code.
What I call testable code is the code you, as developer, write and have enough hooks to enable it to be tested when necessary. For instance, take in account the following piece of Python code:
def read_input_file():
file('/tmp/input_file.txt').readlines()
This code will be interpreted and transformed correctly and does what we want: it opens the right input file, and read its contents. Now, what if we want to test the behavior of our application with a different input file? One could, quickly, change the code:
def read_input_file():
file('/tmp/test_input_file.txt').readlines()
This represents a chunk of code that isn’t testable. By doing a simple modification to our function, we can turn it into a piece of testable code:
def read_input_file(input_file_path="/tmp/input_file.txt"):
file(input_file_path).readlines()
Writing Testable Code
Of course, the example above is quite simple and doesn’t represent the whole class of cases we can find. At work once I found a class method that returned, aided by several heuristics, a database table name. This class method was quite important, since it was used by several other methods within that class to perform all sorts of operations. The problem was that there were no easy way to override the heuristics to use a test database table. The solution was to use brute force: overwrite the method to return the table name I wanted. If I had to write a Python version of the original class, it’d be something like the following:
class MyClass:
# ...
def table_name(self):
table_name = ... # use some heuristics to calculate the table name.
return table_name
To transform it to a testable piece of code, I’d do like the following:
class MyClass:
_table_name = None
# ...
def table_name(self):
table_name = self._table_name
if not table_name:
table_name = ... # use some heuristics to calculate the table name.
return table_name
We could test the code like this:
>>> obj = MyClass()
>>> obj._table_name = 'Bar'
>>> obj.table_name()
'Bar'
>>> obj = MyClass()
>>> obj.table_name()
'Foo'
Some other programming languages are more structured, with practices that allow code to be tested more easily. One example is the Cocoa framework, which makes extensive use of the Delegation Pattern, where a piece of code delegates the responsibility of certain aspects of the code path to a delegate object. This approach makes the code more testable.
Below you can see a delegate protocol definition:
@protocol MyClassDelegate
- (void)myClassDidFinishLoading:(id)obj;
- (void)myClass:(id)obj didFailWithError:(NSError *)error;
@end
And now, the implementation of a class that uses the MyClassDelegate shown above:
@interface MyClass
@property (nonatomic, weak) id<MyClassDelegate> delegate;
- (void)doSomething;
@end
@implementation MyClass
@synthesize delegate;
- (void)doSomething;
{
BOOL success = NO;
NSError *error = nil;
// Do something important here, and update the ‘success’ variable. If an error
// occurs, the error description will be stored in the ‘error’ variable.
if (success)
[self.delegate myClassDidFinishLoading:self];
else
[self.delegate myClass:self didFailWithError:error];
}
@end
We know that when the -doSomething message is sent to an MyClass instance, it’ll send either the -myClassDidFinishLoading: or -myClass:didFailWithError: messages to the delegate instance. If we want to test the code written above, it’d be as simple as this:
@interface MyTestDelegate : NSObject <MyClassDelegate>
@end
@implementation MyTestDelegate
- (void)myClassDidFinishLoading:(id)obj;
{
NSLog(@"SUCCESS");
}
- (void)myClass:(id)obj didFailWithError:(NSError *)error;
{
NSLog(@"FAIL: %@", error);
}
@end
And somewhere in your test case:
// Create a MyClass class instance.
MyClass *obj = [[MyClass alloc] init];
// Create our test delegate object.
MyTestDelegate *testDelegate = [[MyTestDelegate alloc] init];
// Assign our MyClass instance’s delegate to our test delegate object.
obj.delegate = testDelegate;
// Send a message to obj and expect to read either “SUCCESS” or “FAIL” in
// the application’s log.
[obj doSomething];
Conclusion
Some programming languages have this testability aspect built in its core, making it easier to write code that’s easy to test when required, but the majority of the programming languages require a good deal of discipline and organization from the developer’s side.
Although the Delegation Pattern is one of the signature patterns in Objective-C, nothing stops you to design software using this pattern, or even the Inversion of Control Pattern in projects using Python, Ruby or even Perl.
Gidsy
Posted: January 22, 2012 Filed under: regular | Tags: Design, Web Leave a comment »
I discovered Gidsy while booking for the blog workshop I attended last week and I immediately fell in love with it, for several reasons.
Beautiful Design
Gidsy’s design has a tremendous good taste. The color palette is well chosen and is really easy on the eyes.
The chosen types are spot on as well:
- Myriad Pro Semi Condensed used in the headers; and
- Myriad Pro used in the text and UI controls.
Another great example on good taste are the colorful icons, which are present everywhere in the website. Simple and well designed, it is an example for the “one image is worth a thousand words” motto.
![]()
Great Usability
It is simple to use. Really simple. Kudos to Andrew McCarthy for having designed this delightful web site. I can see a lot of effort put on details that will remain unseen by the majority of users, such as the mouse-over transition from the “Gidsy” logo to “Home”.
Awesome!
Awesome Idea
Other than the extreme good taste and an example of well designed website, it is an example of modern and thoughtful implementation of a concept. Its creators aim to enable normal people like you and me to host exciting activities such as workshops and tours. It is basically the idea of think locally and act globally.
There are several examples of those interesting activities already being hosted there, such as Making fresh Pasta di Mama with AH food[1] and Amsterdam Sightrunning.
In fact, I found the idea so amazing that I’m thinking about host my own workshop, but I still don’t know the subject.
I think you also should consider doing it, because in life you’re either learning or teaching. And everybody have something to teach.
-
AH stands for Albert Heijn, which is a dutch supermarket chain. This serves pretty much as example for the local thinking I mentioned before. ↩
Blog Workshop
Posted: January 21, 2012 Filed under: regular | Tags: Blog 1 Comment »
Last week I attended a Blog workshop hosted by the blogger and author Ernst-Jan Pfauth of Dutch Pro Blogger and Sex, Blogs & Rock’n Roll fame.
During three hours, myself and a group of other 14 people–with several different backgrounds, including journalists and computer developers–listened carefully about the blogging world, trying to absorb as much as possible all the knowledge provided by Ernst-Jan.
I still need to digest most of the information given by Ernst-Jan at the workshop, but some ideas started to grow on my head. And this post is part of it.
The Overjustification Effect
Posted: December 15, 2011 Filed under: link Leave a comment »The Overjustification Effect « You Are Not So Smart: “if you are offered a reward to do something you love and then agree, you will later question whether you continue to do it for love or for the reward.”
(Via Reader.)
Why Do Job Interviews Suck?
Posted: December 13, 2011 Filed under: regular | Tags: Interviews, Rants Comments OffJob interviews suck, we both know it. But what are the reasons they suck?
Recently I’ve been contacted by a recruiter for a position that, considering its name, looked quite appealing: “Innovation Engineer”. I was, must admit, quite amused by it, so I went talk with the recruiter about the opportunity. I chatted with him for about an hour, and I left the meeting with a good impression about the opening, specially because it was on a field I’ve never been involved before.
A few days later, the recruiter got back in touch with me asking to fill a “table of competencies” document. Oh well, if you’ve discussed about these stupid recruitment artifacts you know my opinion, if you haven’t, you may have an idea already. Anyways, I told the recruiter that, if the only way to move ahead with that was by filling that stupid document, I wasn’t interested anymore. I have my own problems to deal now, and spending time on something that doesn’t make any sense to talk with someone about a prospect isn’t my priority at the moment. Fast-forward a bit. I got another input from the recruiter saying they were interested in chat with me even if I refuse to fill the form. That was nice of them, I thought, and decided to have a chat with them.
During the interview they were pretty nice, and it went pretty smooth in my personal opinion. After the chat, which was quite informative to me, I left and got back to my life.
Time passed and I got a call from the recruiter, where he passed the negative feedback received from his client. I definitely can live with it, but something about this really pissed me off, and I didn’t know what was it.
Until I realized this whole candidate interview is a complete bullshit.
The Problem
We can start checking Wikipedia’s definition of interview:
An interview is a conversation between two people (the interviewer and the interviewee) where questions are asked by the interviewer to obtain information from the interviewee.
The root of the job interview issue is the interviewee is trying to convince the interviewer she has the right set of skills or enthusiasm to join their organization. In the end, the interviewee is likely to be offered a job if she said whatever the interviewer wants to hear. This is called rapport in psychology and has the following definition according to Wikipedia:
Rapport is a term used to describe, in common terms, the relationship of two or more people who are in sync or on the same wavelength because they feel similar and/or relate well to each other.
Unfortunately, the job interview process is as broken as any human made system ever made since people with the right skills can easily seduce the interviewer, properly responding to the interviewee stimuli.
Actually this is object of study of several fields of psychology such as neurolinguistics.
The Process
Job interviews like we have today should cease to exist. Both the company’s representatives and the person looking for work should behave like they’re on their first date.
Work relationships are pretty similar to romantic relationships in my viewpoint, so the same attention to the courtship applies here, since it is likely that one of the parts has more interest in finding a partner. Nobody going on a date for the first time can be enthusiastic, even if some prior research about the other part has been done.
So, starting from the beginning: if both parts–the interviewer and the interviewee–have agreed to meet, there is enough interest to at least consider a relationship. Both parts have a “no” since they’ve first met, so no frustration should be developed at this stage.
The next step of this courtship starts. Both parts start to evaluate whether they’re compatible or not, and at this stage we have the typical questions and answers game. This step is, unfortunately, the most “hackable” stage of the whole process. It is known in psychiatry that psychopaths can “use manipulation to gain what they want”. I’m not to saying in any way that only psychopaths will adapt and create a rapport with the interviewers, but this shows how it is possible to successfully manipulate others to achieve what they want.
The Question
The question is: why do the interviewers still expect they’re the ones that should be seduced?
In the past few years I’ve been interviewing developers for my employer, and I always tried to understand whether the candidate a) has a good technical and business knowledge and b) fits the company’s environment. Her enthusiasm or knowledge about the company aren’t that important for me, because I know people can have busy lives and, realistically, some people just don’t click about it and doesn’t indicate per se how good or bad the candidate is.
Fixing The Problem
In my opinion, fixing this problem is quite simple. As interviewers, we should evaluate whether she has the technical abilities required to fullfil the role we are looking for, and if she fits in the environment. This are the only things you have to do. If you’re looking for other things, you might overlook your main responsibilities about your job at that moment.
If the person isn’t enthusiastic about your business, maybe she hasn’t been exposed to it yet. If she doesn’t know what is your core business, maybe she didn’t have the time to research about it. It is your job as interviewer to lit the light and bring some enthusiasm to the candidate, and explain what is your business is about.
Expecting your interviewee knows everything about your company is the same as expecting your date to know everything about you.
Proud To Be An Asshole
Posted: November 26, 2011 Filed under: regular | Tags: Life, Rants Leave a comment »I’ve been reflecting a lot about myself and the way I related to other people during all these years, and I became really sad with the conclusions I’ve drawn: It’s pretty sad how I’ve been sabotaging myself all those years.
Basically I’ve been giving more priority to what other people wanted to have done than what I wanted to have done. You agree that’s pretty stupid, but not uncommon. The interesting bit is try to understand why I’ve been doing this. And I think I nailed it. I’ve been fighting all these years against my very own nature: being an asshole.
Yes. I have, uncountable times, been pretty miserable to make other people happy. I listened, patiently, other people miseries and while I wasn’t listened at all when I could use other people’s support and patience. I even played a business consultant role when I haven’t any interest to just to be polite. What have I got in return? I became a pretty boring person, reluctant to disagreements just to get rid of conflicts. Tedious people do not have anything interesting to say, because, well, they don’t have anything to say. On the other hand, assholes usually are heard and considered, for the best or the worst.
I’ll be really honest from now on. Honest to me, and if I need, clear and rude to whoever I need.
I will say your idea sucks if I think it sucks. I’ll ask you to shut the fuck up if you’re saying shit. I won’t listen to you anymore if you’re not interesting to me. I won’t give advice about your great-new-business-idea because I can’t care less about it. I won’t even see you if I don’t want.
Be prepared to get used to the new-old-asshole-me. If you can’t, fuck off.
“Reminders” on iOS 5.0
Posted: October 16, 2011 Filed under: regular | Tags: iOS, User Interface Leave a comment »This week Apple released the pretty much expected iOS upgrade to 5.0 together with Mac OS 10.7.2, a really big overhaul of their desktop and mobile platforms. After using it since it was officially released here in the Netherlands, the feature I liked most so far is the new “Reminders” application.
“Reminders”, other than the new name for iCal’s existing—for ages—tasks, is a well thought solution for the calendar and tasks integration problem. iCal had tasks integrated with the calendar—as I said before, for ages—but wasn’t present on iOS before version 5.0. This is a major problem for 80% of the users—myself included—that had to rely on third-parties to provide task management applications for them. Apple, once more, solved the problem for the majority of their users with this new feature.
When you add a new “reminder” in your iOS powered device, it is immediately sent to the cloud and synchronized with your other devices and desktops. One interesting twist Apple made in iCal at Mac OS 10.7.2, is a nice but somehow hidden configuration:

This configuration will ensure that reminders set for a given due-date won’t appear in your iCal until it is time to. This is a major improvement—even if technically minor—on un-cluttering your iCal’s daily view. If you have, like me, been trying to use unsuccessfully all kind of GTD applications to manage your small reminders list, you’ll enjoy this a lot.
Another welcome feature in the “Reminders” application is what we call “geo-fences”. When you create a new reminder, you can ask “Reminders” to remind you either when you arrive at some location or when you leave some location. Let’s say that I’m planning my trip to Paris, and I can’t forget to buy my tickets for the Eiffel Tower as soon as I arrive there. The reminder will look like this:

As soon as you reach to the “Tour Eiffel” in Paris, your iPhone will remind you to buy your tickets! Another interesting usage patterns could be:
- Put your groceries list in a reminder’s note, and let your iPhone remind you of that when you leave your work.
- Organize your holidays trip, reminding you of doing random things when you either arrive or leave some location.
Some improvements I’d like to see in future improvements from Apple, both in Mac OS and iOS are:
- Ability to setup reminders with geo-fences in your desktop, and then synchronizing with the iPhone; and
- More natural and complex ways of reminders, for scenarios such as: “Remind me to go to the gym every monday, wednesday and friday when I leave work”.
I really like to see how Apple is improving the platform for the “regular users” out there.