Before the last few years, I don’t recall anyone saying they were fans of some company. I could imagine people saying “I like Ford cars” and “I prefer Ben&Jerry ice cream.”

But being fans? No, I’m positive I’ve never heard or read anything like that.

Nowadays I read and hear it on a daily basis. People are fans of Google, Apple, Nokia. They literally cheer for their favorite company, watching their direct (patent lawsuits) and indirect (new products competing each other) battles, and hoping that it wins in the end.

Facebook, being extremely unpopular these days despite me thinking it’s no biggie, is indeed risking a damn lot just because of the cost of being uncool.

What does this tell? Is there a precise connection between the quality of one’s product and its perceived coolness? Or is there a link between the marketing and this coolness? Perhaps none, perhaps both. A company goes building an image, and it looks like each single tiny thing that happens plays a part into generating this public image.

Apple has seen a tremendous explosion of popularity since the iPhone, and that’s helped a lot with building an image. An image that’s really difficult to eradicate. Let’s be honest: the iPhone’s hardware is far from the competitors’ (see Nokia’s and HTC’s recent devices) and the software is barely catching up (multitasking? It was about time.) Still, they’re going to continue being cool, no matter how many times they’ll market thinks like Cut & Paste like the best invention since sliced bread. Why? You know it: because first impressions are hard to go.

So what has a company to do, today, to be cool? Where is the line between meeting the expectations for the sake of not disappointing the user base, and exceeding them with the risk of being ahead of the times?

I can identify a few things to keep in mind.

Confidence. Whether we’re talking about marketing, or pushing for a risky idea, having confidence matters a lot. Dealing with large user bases comes with two big problems: you can’t make everyone happy and you have to tell your user what they want while allowing them to feel that they’re getting what they thought they wanted. It is risky, but it’s the only way to lead. If your company lacks the confidence to do that, it’s in trouble.

Honesty. Your users are smart. Maybe not all, but enough of them are smart enough to make noise. Don’t try to fool them. Perhaps you’ll sell a little more units in the short term, but your public image will deteriorate.

Integrity. Making mistakes is OK, but it doesn’t work if nobody believes you. You need to have a clear set of values, and stick to them.

All in all, it boils down to the DBAA principle, i.e. Don’t Be An Ass. Do that, and make sure you are able to give your users what they want and what they don’t know they want, and people will cheer for you.

This is really silly. And by silly, I mean even sillier than unlimited data plans capped at 5GB. Mr and Mrs Verizon have apparently decided that tethering your Android phone should cost you money.

Let me remind you what tethering means: your phone will create an ad-hoc WiFi network, and will share its 3G connection with all the devices connected to that network. A typical use-case  might be paying for a 3G connection from your Android phone, and then connecting other phones, computers, tablets or whatever to the Internet, sharing the same connection.

Presumably, though, your connection has a maximum speed, and also a monthly data cap, so this means that whether you enjoy that connection from one or from ten devices, the cost of operation for Verizon will be exactly the same. Why are they charging for this, then? Because they think they can, obviously. To give you the impression that they are indeed giving you something more, buying tethering will actually bump your unlimited 5GB connection to some unlimited 10GB, which is double the amount of unlimited! Jokes apart, it looks to me as they’re selling you something you don’t want, masked as something you want but should be free.

This is even more foolish than unlimited data plans capped at 5GB, because I see how “unlimited” is a marketing word. Most people have no idea of how much 5GB is, and if that’ll be enough for them. But unlimited… that’s a different deal, isn’t it? It sounds so much better. Again, most people will never encounter the cap, because the same people that don’t know what 5GB are, are unlikely to use them in a month, from their mobile device.

So you see, I kind of see the point of playing with words with “unlimited”, even though it’s not really fair. But charging for tethering? I call that stealing; charging the users more, when they’re really getting the same, and it’s costing the operator the same.

The Internet is now completely saturated by people whining about privacy on Facebook, or lack thereof. I honestly fail to see, for instance, how its privacy settings should be a bewildering tangle of options. Facebook has hundreds of millions of users, so yes, it is going to be complicated to handle the privacy settings. Besides the fact that it really isn’t. And so what if its privacy statement has a larger word count than the Constitution of the USA? Facebook has a hundred millions users more than USA has citizens. One glove does not fit all hands, and they need their legalese.

I agree: upgrading privacy settings so that they are less secure than they used to is not the right way to go, but everybody is free to change them the best way they can. The more I observe the debate evolve, the more it looks like it’s founded on conspiracy theorist delusions.

This isn’t simply a matter of “Facebook is the only game in town, so they can and will do whatever they want”. Facebook comes for free, and it’s not really something I would include amongst the must-have services, like fresh water. So you don’t need it, and don’t have to use it. If the sole fresh water supplier in your town started to pollute the water intentionally, say so that they could sell medicine with the other company they own, then you would have a problem.

Otherwise, there’s nothing here. What? Raising public awareness? I see. You can do that without trying to organize Facebook-quitting days. It’s OK to talk about it, and indeed I’m doing it right now myself. But I’m just doing it in a more constructive way: check the safety of your privacy settings by following the instructions at http://www.reclaimprivacy.org/, and fix them to suit your needs.

Just don’t go blogging that Facebook is evil. You think you can just found a start-up and make a non-evil Facebook replacement? How long until you’re sinking in the bills from the hosting company, and start thinking that “hey, maybe I should put ads on this thing”, and then, when the ads don’t pay enough, you start thinking that “hey, perhaps I should target the ads better: I need to share more information about the users with the ad providers”. And so on.

Tweakr 0.0.16

Hi. I have released tweakr 0.0.16, which you should be able to install from Maemo Testing in a matter of minutes. A couple of bugs fixed and the Silent profile hardcoded is what’s new. Update!

Hi, a quick update on Tweakr: it has now been promoted to extras-testing, since the reboot loop bug (thanks, hildon-home!) has been fixed.

Also a new feature present: the Profile button in the Status Menu gets replaced by Tweakr’s own button (which looks identical), so that you won’t have get your Status Menu too crowded.

A new feature in Tweakr allows you to extend the sound Profiles to more than just General and Silent.

Tweakr introduces the concept of Profile preset. Presets are Profile settings which can be saved, deleted and assigned to the General profile. This allows you to practically use as many profiles as you want on the N900.

The normal use-case is to first tune the General profile for the new preset you want to save, then open Tweakr and choose the Save current General profile to new preset button. This will allow you to save the settings of the General profile with a new name.

After that, you will find a new button in your Status Menu, as shown in the following screenshot:

You can now select whatever preset you have created before, and its settings will be applied to the General profile.

If you’re not using Tweakr yet, go get it from its download page!

Introducing Tweakr

I have been working on a little utility package for Maemo 5, called Tweakr. It’s a Settings applet that lets you tweak little known settings that could otherwise be changed only by editing configuration files by hand.

It has a plugin architecture, so you could write your own plugin too. The ones I have so far are Desktop and Hardware keys.

Desktop

This plugin allows you to edit the labels of the bookmark shortcuts you have on your desktop.

Hardware keys

You can configure the behavior of the Power Key, and whether uncovering the camera lens unlocks the device.

More plugins and feature coming soon!

Here’s some screenshots:

Tweakr entry in the
Settings

Tweakr

When writing source code, indenting is very important. Having a neat and clean programming style, let alone a precise and uniform one, is probably one of the most important keys when attaching example source code with a job application. I was myself asked to show some of my source code in my last two interviews. Nobody ever asked me to show any running program that I had made, though. Wonder why? A lot can be understood about the author just by glancing quickly at some source code.

Indenting makes the source code easier to read for us human beings, whereas the compiler doesn’t really care (except for some languages, where indentation applies as a syntax element). Even if you’re not a programmer, you can see the differences here:

Compiler friendly

Compiler
readable

Badly indented

Badly
indented

Properly indented

Properly
indented

There is, I guess, no question that the last one, labelled as “Properly indented”, is the most readable. Problem arise, though, when people start wondering what they should use as indenting character. Some prefer TABs, other prefer blank spaces. A TAB, the key on the left of the Q of most Qwerty keyboards, is a single character that a text editor can represent whatever way it wants. This is usually customizable by the user, of course, so she can decide that a TAB will be shown as 8 spaces, or 4, or 2.

You can hear all the time someone claiming, in turn, that TABs are evil or that spaces are evil, but the truth is that none is wrong, as long as you can indent.

I’ll use, as an example, a piece of source code taken from the ext3 module of the Linux kernel. The Linux programming guidelines recommend using TABs for indenting, and that they should be 8 spaces wide. Let’s have a look at some code.

8-space TAB

8-space.jpg

4-space TAB

4-space.jpg

2-space TAB

2-space.jpg

As you can see, the original intent of the author, was to have the variable names aligned. But that alignment gets screwed up as soon as a reader has a different space-size for her TABs. What’s wrong there? Let’s use a very useful Vim tip: the :set list command.

:set list

set-list.jpg

This way, we can actually see the TABs, as “>––-“. Of course there will be less dashes if part of the TAB area is occupied by some text. So, can you see what’s wrong with that? The author of that source code is using TABs not only for indenting, but also for aligning! That way his alignment gets messed up when somebody uses a different TAB size. The solution of this problem is to simply just use what ever you want for indenting, but use spaces for aligning. Indenting must only be that left margin that you give to some lines, but it’s not to be confused with alignment. If the author of that source code had used TABs at the beginning of the lines, but just blank spaces between the type and the name of the variables, his code would be as he meant it whatever indenting style one’s editor would use.

So, in the end, it doesn’t matter whether you use TABs or space, for indenting, as long as you use just spaces for aligning.

Useful Vim/Emacs tip

I like spaces, and add the following to the end of all of my source files:

/*
Local Variables: mode:c++ c-basic-offset:2 c-file-offsets:((innamespace .
0)(inline-open . 0)(case-label . +)) c-tabs-mode:nil End:
*/
// vim: filetype=cpp:expandtab:shiftwidth=2:tabstop=8:softtabstop=2

This way, if the reader uses Vim or Emacs (and maybe also gedit), her settings will be temporarily overridden by mine, so, if she’s going to change my code, there are little chances that she’ll mess up my indenting.

The :set line options I use are the following:

set listchars=tab:>-,eol:$,trail:.,extends:#

It helps me to also spot trailing spaces. I recommend everybody to use the :set list, as it will prevent you to accidentally mess up other’s indentation.

After claiming that most programmers just can’t program, and actually addressing most of the problems to the lack of passion of people who decide to start a career as a programmer, I would also like to express my point of view on a tightly related subject: what can be done to improve the situation? The problem that I was trying to bring up in the spotlights, is that a lot of people just start (or wish to start) a career in the IT for no particular reasons. Those are the ones who don’t love and don’t loathe programming, and they just see it as something that pays their bills. Well, maybe the first question that I should address, actually is: why is this bad? Sure there are so many jobs which don’t require passion at all, and people just do them because a job is just a job, and don’t really care. In my opinion, being a programmer is different.

There are many people, especially the ones who sit high in the hierarchy of a company, who see programmers as the last and least important step of a ladder. They often think that programming is quite of an automated and repetitive task, and it could basically be done by anyone, with just a little training. Unsurprisingly, this seems to be the opinion of most common people, who ignore what programming really is. I wouldn’t want to discriminate among different types of programming, or different programming languages, but it’s obvious to me that programming, to some extent, actually can become an automated an repetitive task. That’s quite the minority of cases, though, so I will simply ignore them, and focus on the rest.

As anybody who’s a programmer knows, programming is a highly creative task, that requires good imagination and great problem solving skills. Everybody else might just see it as “typing stuff on a computer”, and believe me, there’s a whole lot of educated people who think that programming is a monkey matter. Hence the term “code monkey”. This term has historically been abused a lot, by even programmers themselves. A “code monkey” is said to perform a programming task so easy that even a monkey could do, as the image suggests. There are two truths about this phenomenon: first of all, luckily, programming requires far more skills than it’s usually believed; secondly, and sadly, the majority of people just ignore it.

The problem with lousy programmer is kind of similar to a medal: it’s double faced. You could actually call it a dog trying to bite its own tail: as programming is believed to be an easier and easier task, more programmers are needed; as more and more programmers are needed, more people will jump on the field; as more and more people try to become programmers, the lousier the average quality of programmers gets. Unfortunately, what average non-programming people miss to understand is that although it doesn’t really take a hard training to become a lousy programmer, it takes a damn hard one to excel in the art of programming. Moreover, most people just lack the innate logic mechanisms that make you a potential programmers. Such mechanisms are developed in your mind when you’re very young, and it’s quite rare to develop them after your twenty-somethings. With this, though, I’m not denying that there are a lot of people who actually do develop those mechanisms in advanced age. I’m just trying to think of the big numbers, here.

So, getting to the point, what went wrong and how can it be fixed? I don’t think it would be wise to say that what’s wrong is that there’s too much need of programmers, ergo the average quality was inevitably doomed to lower and lower over the time. I rather think that the problem is with education. Of course I can’t speak for all the universities and colleges in the world, but I can at least try and speak for the one I’ve known personally, or through people who have studied there. It seems that, as more and more people apply to Computer Science or related departments, the easier it gets to get in (sorry for the pun), and to get through with it, i.e. to graduate.

I know this happens most likely in any other faculties, but seeing that there are people who have been studying CS for three or more years, and still can’t get through the most simple concepts, just doesn’t seem right to me. Yesterday night, I was sitting in an IRC channel about the C programming language, when somebody joined in and asked:

I just started studying structures in C, and I don’t get them. Can anyone explain to me what’s the use for them?”

Ok, I don’t really think there’s anything wrong in not getting the point of C structures right away, but after a little chatting, it turned out that the guy was in his second year of Computer Science, and this was the second time he took the C class. Still that wouldn’t be a reason of hatred, of course (not that I have any hatred), but after another small while it turned out that the guy didn’t like programming at all, but he just got himself into it because he applied to CS since he liked to “fiddle around with computers”.

What’s really needed, in my opinion, is a harder and less tolerant educational system, that would be more selective, rather than pushing everyone forward. People that find out to be really not made for it, should just give up and move their focus on something less.

I’m actually very well aware that a lot of programming work, nowadays, is not really rocket science, still this doesn’t mean that it should be done by completely unqualified people. If what Jeff Atwood says in his post about programmers who can’t program is true, and that is that 199 out of 200 applicants (not programmers, applicants) can’t write any code whatsoever, than it obviously means that something is wrong. Looking at the numbers provided by Joel Spolsky, it looks like a lot of these basically incompetent people are going to end up working on an actual programming job, and maybe their code will end up on The Daily WTF (Paula, are you there?).

Unfortunately, the education is not the only one to blame. No matter how much education will improve, there will always be unqualified people who are going to apply for jobs that require a lot of skills, and in the end the odds will help them, so they’ll manage to get a job as a programmer. Is it so bad, considering that it’s most likely not going to be any critical position, and the only ones that will be damaged will be the owners of the company that hired them? Well, the point is that this is not true. There’s someone else who gets damaged, in this scenario. I’m talking about the community out there, the good programmers, who find themselves competing with newbies who’re happy to earn peanuts. The salaries keep going down, and customers are not able to distinguish a good job from a good one.

In a comment on the previous post of mine about this subject, Hoowie Goodell really gets a great point with this paragraph:

There has been a great effort to industrialize programming, too. Again, there are many good features, and it’s a field I’m interested in. Building a large program requires a structured approach. Language design, libraries, programming frameworks and IDEs can and should incorporate as much existing human knowledge as possible: computer science, domain knowledge, solid pre-written code and human interface principles. (Check out Thomas Greene’s “Cognitive Dimensions of Notations” for some of the latter: I think of how programming tools fail to use them on a daily basis!)”

In a way, this suggests that the whole system is not ready yet, as it’s indeed years and years behind several other engineering fields, and that’s a good reason, probably, to explain why it’s so easy to fail at being a good programmer. Let’s just try to get some insightful inspection points, in order to build better generation of programmers:

  1. Better education. The whole higher educational system should be improved in several way. Worldwide. Nowadays, it looks to me that in many countries graduation is just a direct consequence of applying to an University. Unfortunately, this kind of problem must be addressed on a country-basis, to properly identify the specific issues, but still the options that I would like to consider are worth mentioning. It all comes down to a single point: there should be less tolerance towards people that don’t learn. The thresholds for succeeding in a course should be raised to greater difficulty. Current models of testing should be seriously revised, so to ensure that students that really didn’t understand the subject are not going to make it.

  2. Better tools. Are we trying to make programming just like a factory chain or are we not? If we are, as it seems nowadays, then the tools are not ready yet to second our intentions. Programming is too error prone and too time-consuming.

  3. Better process. Software process that doesn’t conform to some standards, say ISO-9000 (sorry if it’s inappropriate, I’m not an expert on this kind of standards), shouldn’t be allowed to sell. Quality insurance committees should be taken more seriously as being part of the process. This might be against all principles of liberalism, I know, as bad software, you may say, will not sell anyway. I know many bad software that did sell well, for greatly different reasons than its (non) good quality.

  4. Better judgment when hiring. I’m not going to try to teach you how to run your company, nor how to hire your crew. But sometimes really crazy thing happen (again, is Paula around?). A very interesting post by Joel Spolsky (I’m sorry, I can’t find it anymore: does anybody know the link?) talks about only hiring “A”-people, where “A” means top class. If you’re ever hiring a “B”-person, he’s quite likely to hire a “C”-person, someday. After that, it’s chaos. I recommend anyone not to lower their canons of perfections. Here’s another great article by Joel, about hiring good developers, I recommend it.

Concluding, improving the quality of programmers seems really to be a tough issue, and the whole thing depends on so many factors that tracking a precise problem is impossible. Cultural and technical difficulties arise all the time, and getting clues is hard. I’ve tried to get around the problem and give some insightful opinions: what do you people think?

« Page 12 / 14 »