Steve Ballmer on the iPhone: pathetic

by Salvatore Iovene on 18 January 2007 — Posted in Opinions

Thanks to Digg I just found out a certain video on YouTube. Steve Ballmer, Microsoft’s CEO, is asked what he thinks about the iPhone. I wonder how much the MS guys are aware of their image, or conscious of what they do and say. I’m sorry, I don’t want to be harsh, nor I want to disrespect Mr. Ballmer, whom I don’t know personally, but his comments in that interview were outrageously ridiculous. Meaning that they made me laugh my head off.

Steve Ballmer

First of all, Mr. Ballmer was shouting pretty loud, and that’s terribly impolite. His all line of answer was about mocking the competitor (Apple, in this case) with an eery smile between sarcastic and frightened. It’s really an old technique of blabbers like him: undermining the competitors’ value, and pretending it doesn’t pose a threat at all. He says “That is the most expensive phone in the World and doesn’t appeal to business customers because it doesn’t have a keyboard, which makes it not a very good email machine”. First of all, this is totally and absolutely questionable. Secondly, the iPhone might be plugged to a bluetooth keyboard. In any case, that doesn’t matter at all. Mr. Ballmer was daring to express his lousy personal opinion on the sole obvious purpose to undermine the competitor. He’s just trying to blow smoke in the eyes of the users. I don’t want to start any anti-Microsoft issue here, but it’s definitely obvious that Ballmer is scared and falling into pathetic attempts to damage the competitor.

He then continues with “We have our strategy, we have great Windows Mobile devices in the market today, you can get a Motorola Q phone now for 99 dollars”. He stresses the “99 dollars” a lot. Well, if having low-cost lousy device (which you don’t actually build! It’s a Motorola, isn’t it?) is the only way to keep your share, then be my guest, but I see no sense in mocking Apple for the price of the iPhone, and then giving no real arguments. It looks like they want to sell their Windows Mobile powered (under powered?) devices by the pound. That’s lousy. He continues talking about the Motorola Q, saying that it’s a very capable machine, it can do music, it can do Internet, it can do email, it can do Instant Messaging. “So I kinda look at that, and I say I like our strategy, I like it a lot”. The original question he was asked was about the iPhone (which he just mocked for the price) and the Zune (which he didn’t mention at all). So the interviewer felt about having to repeat the thing, because it was obvious that Ballmer was kinda afraid of the subject. The interviewer asks, talking about the phones market and the music market, “How do you compete with that?” - and there you can see Ballmer go with a sort of dull expression for a moment - then replies “Let’s start with the phone” (apparently he really doesn’t want to go to the Zune) and says that at the moment Microsoft is selling “millions and millions and millions” (how many is that? 3 millions?) of phones, and Apple is selling zero. I’m amused: that was his argument. “How do you compete to the iPhone?” - “That’s not a threat”. That was his answer, minus the bullshit. Then he says again that the Apple iPhone will be the most expensive phone “by far” ever in the market - then smiles - and says “Let’s see”.

Then he finally mentions the Zune, and says they’ve got 20% of the market. What market? The market of the devices over 249$. That’s not the market. It’s only a part of it. I don’t know what you people will think about this, but it gives me the impression that the phones market is going to shake badly.

By the way, it’s so funny how he goes on and on about the price, when they dare selling a completely bloated Operative System for 400$ or something, but that’s just my opinion.

Crazy Steve Ballmer

Besides, Mr. Ballmer probably is not aware that when everything will settle up in one year or so, this video is going to get back at him, and be extremely hilarious. Good job, Microsoft. On the other hand, what else can you say about this man?


Get new articles via email

Related posts:

(Web) Standards actually do matter a lot

by Salvatore Iovene on 17 January 2007 — Posted in Web, Design, Articles

A week ago I stumbled upon this article from Stuart Brown, which actually even got a fair amount of Diggs. As soon as I read it, I felt obliged to reply extensively to it, as I think it mostly represent everything which is wrong in the current web design trends (or should I say all time web design trends?).

Something that really annoyed me about the article, was the lack of serious points and the abundance of useless words like “some standards evangelist”, “Obsessing over semantically correct markup”, “a few standards zealots”, “zealotry accomplishes nothing but a collection of smug faces and a collection of ‘XHTML 1.1 Compliant’ bylines”. Those were only fruitless diversions and not real arguments.

The authors gets one thing right, though, and it’s that

your users don’t care about XHTML, they care about how your site appears.

Alright, we all can agree that most of the average Internet users completely ignore everything about words like HTML, CSS, JavaScript, PHP and so on. We can’t, at these point blame the users: I don’t know anything about the inner workings of most of the things I use on a dally basis myself, so no big deal. In spite of this, serving the user is not quite equivalent to fooling him. Giving the user something that actually works, but whose inner workings are totally crippled, is absolutely wrong. The author of the mentioned article furthermore says:

If you can satisfy the usability needs of 100% of your users, yet your code doesn’t validate, then arguably you need do no more.

I’m really strong about my disagreement here. Validation serves a purpose: that is to minimize differences when rendering the website in different browsers. A well validated page doesn’t need any guess-based correction by the browser. And Stuart talks about usability, whereas a website that doesn’t validate will have a harder time in meeting usability requirements for impaired persons. On February 2006 there was a story about Target (a retailer), being sued because its pages were unaccessible by visually impaired users. The retailer was accused of violating the California Unruh Civil Rights Act, the California Disabled Persons Act and the Americans with Disabilities Act. Needless to say, the website still doesn’t validate (it doesn’t even have a DOCTYPE).

So, why else standards (and especially web standards) are needed?

  1. Standards make it easier for your browsers to render the pages.

    HTML or CSS are, in a way, standards. I.e. a set of rule, meant as a markup language specification, to be followed in order to design a web page. On top of these specifications, people who write browsers have done their work. Unfortunately, though, not all developers are able to, or care to, be strict regarding standards. That means that the browsers must have a way to correctly interpret some code even though it’s fundamentally incorrect. What’s the result of this? Browsers developers have to waste time into taking care of correcting the mistakes of web developers. This, in turn, gives web developers the chance to relax and write worse and worse code. And this makes browsers developers’ life worse, and their work slower. In the end the users get nothing but worse and worse products.

  2. Standards make life easier for users.

    We can take this off the Web Standards examples, and move to some “real life” cases. Ironically enough, the other day I was staring at my toilet seat for a while, and noticed that the holes in the toilet in which you can screw your seat in, are at a fixed distance, and just slightly larger than longer, so to give a little margin: i.e. if you want to buy a new toilet seat, the distance between the screws with which you attach it to the toilet must be between X and X+1 cm. So, when I went to the shop to get a new toilet seat, I didn’t have to worry about the size. Vendors of toilets and vendors of seat had just agreed on a standard size. The result? No hassle for the user (me).

  3. Search engines like standards.

    Search engines don’t like finding errors. If they have trouble parsing your pages, they may not get to your carefully chosen keywords, won’t be able to find all those tightly focused meta tags. Your site will be crippled on any search engine results page. This is not good. A well designed website creates a clear channel, a road map, for search engines, so they know to go exactly where you want them to go and see exactly what you want them to see.

End of the list? Yes. This is all that matters, in the end, to the final user. He doesn’t care how, but in the end he gets better products. Of course there are lots of side effects, e.g.:

  • Standards minimize the differences in the way your pages appear in different browsers.
  • Standards improve the quality of your code, hence the quality of your product.
  • Code that adheres to standards is easier to maintain.
  • Validating your code during the development process eases the discovery of flaws and mistakes.
  • Standards increase your value.

Before anyone could say that nobody needs a new article about web standards, let me remind you that the following websites won’t validate:

This means that the standards-aware developer are just a tiny minority. The rest, obviously, don’t think that quality is a good asset for their websites. Writing non-validating code is a big step backwards, on the path of perfection.

Bibliography


Get new articles via email

Related posts:

Fixing NVIDIA driver after a xserver-xorg-core upgrade in Debian and Ubuntu

by Salvatore Iovene on 16 January 2007 — Posted in Howtos, Articles

Using Debian Testing or Unstable, or a frequently upgraded version of Ubuntu, when doing an apt-get update && apt-get upgrade often will install a slightly newer version of xserver-xorg-code, and this will break the NVIDIA proprietary drivers, if you, like me, prefer to install them using the official NVIDIA installer. When this happens, at your next reboot, or next time you start X, this will crash.

Follow this instructions and you won’t need to reinstall the NVIDIA driver from scratch each time. First of all, stop your login manager (gdm assumed here):

/etc/init.d/gdm stop

Then move to:

cd /usr/lib/xorg/modules/extensions

Normally it should look like this:

total 956K
1 root root  19K 2007-01-09 21:13 libdbe.so
1 root root  34K 2007-01-09 21:13 libdri.so
1 root root 145K 2007-01-09 21:13 libextmod.so
1 root root   18 2007-01-15 20:42 libglx.so->libglx.so.1.0.9742
1 root root 676K 2007-01-15 20:42 libglx.so.1.0.9742
1 root root  28K 2007-01-09 21:13 librecord.so
1 root root  38K 2007-01-09 21:13 libxtrap.so

Notice the symbolic link from libglx.so to libglx.so.1.0.9742. In your case, instead, the installation of a newer xserver-xorg-core overwrote the libglx.so with the normal one provided by the X Server. What you have to do is simply restore the previous situation. Remove the libglx.so file:

sudo rm libglx.so

And make the symbolic link again:

sudo ln -s libglx.so.1.0.9746 libglx.so

Of course the version number, in my case 1.0.9746 may be different in your case. Now you can simply start the gdm login manager again:

sudo /etc/init.d/gdm start

Everything should be working again.

Thanks to http://osrevolution.wordpress.com/ for this.


Get new articles via email

Related posts:

Dear Steve Jobs, give me an SSH iPhone

by Salvatore Iovene on 14 January 2007 — Posted in Open letter

Dear Mr. Jobs,

Although I’m just a sporadic Apple user (used to have an iBook - but eventually sold it -, I have an iPod Nano), and although I’m not using any of your software (used Linux on the iBook and use Linux again on the iPod), I truly appreciate the products of Apple Inc., software included. I like OS X very much and I’ve been very keen in following Apple’s events even not being a great user myself.

I heard about the iPhone, saw the pictures and heard the rumors. At first glance, following the official presentation through Engadget’s website, I was stunned and greatly surprised, in a very good way. The iPhone looked exactly like everything I’ve always wanted. All the ideas in there, all what that kind of gadget represents, have been unconsciously floating in the backyard of my mind for some time, and suddenly all was true.

After a few days, though, some rumors said that the user won’t be allowed to install 3rd party applications. That shocked me again: the first thing I thought, when I saw the iPhone, was “Oh gee, this is the ultimate geek tool, must have it!”. In the line of Apple’s gorgeous designs, with a great software load, and fundamentally a BSD system where I could load anything I wanted. I was already dreaming of porting my favorite applications to the iPhone. Then the rumor. I’m no well known marketer, but something has been bugging me. In my humble opinion, the iPhone is (or should be) basically two great things, that represent great innovation if merged in the same device. One is the simplicity of use, which Apple is famous for. The clean and neat usability, I loved it in OS X, loved it in the iPod software. That feature, as usual, hits the greatest share of the market. Millions of people who want something that just works, and is easy to understand. Apple is always been great with that. The second thing is that such a gadget undoubtedly attracts the power user: a single device which is a beautiful phone and has the capabilities of getting to the net through WIFI. I think I’m not the only one, out there, who wished for such device. The Nokia 770 was a good start, but it wasn’t a phone. Now, there is something that we power users, or geeks, if you prefer (I don’t mind), like to do: that is tweak, customize. Having such a possibility with the iPhone would, in my opinion, gain an extra share of the market, i.e. those power users that don’t like the idea of being constrained in any way.

I surely understand that Apple’s designers and engineers know what they are doing, and there are very good reasons not to open the iPhone to external applications. A lot has been said, around, about the risks of releasing a development platform, or the threats that this would bring to the mobile operators (like Cingular), even though, I must admit, none of the articles got technical enough to convince me. And I’ll be up to take all of this as true, of course. There is, though, something which I, and a lot of other people, would really appreciate in a device like the iPhone. That is a Terminal program with an SSH client. Imagine the potentialities: I do most of my things through an SSH connection to my machine at the office. I work from home or from anywhere else in the World, that way. I use IRC that way, I read my Usenet messages that way. I read my emails that way. What’s the advantage of all this? I like to have a central and safe place where I can keep an organized and, above all, centralized way of managing my resources. I don’t need to configure email clients everywhere I go. I don’t need several webmail systems to check all my email addresses. I keep my Usenet article organized and synchronized on one single machine. I keep all my IRC logs on one machine, and so on. With an SSH client in the iPhone, I could do all this even from a bus, now that in my city wireless connections are becoming available on some buses.

I’m sure there are lots of more uses of such a thing, and literally tens of thousands, if not more, of power users like me will love it. I really hope that you will consider this issue, and give us power user an SSH client for the iPhone, or the possibility of installing custom software.

Best regards,
Salvatore Iovene.



Get new articles via email

Related posts:

How to write robust code

by Salvatore Iovene on 13 January 2007 — Posted in Coding, Design, Articles

As software is one of the most important issues in our era, writing good robust programs is essential. This article is an in-depth essay focused on Object Oriented software and large projects. Everything said here, though, scales well to good directives for small projects as well.

Our time is dominated by software. There is basically software everywhere around us; most of the object you can see right now around you, have something to do with software, probably because they were created using some sort of machine. Given the importance of software nowadays, I just have to find bugs unacceptable. Of course you might argue that a small and rare bug is a minor software won’t harm anyone, and is not nearly as important as a bug that could affect the software of an airplane, and I’m going to agree with that. But as time goes by, everything has to be going towards perfection, and current trends about software seem to be going nowhere: there were bugs in software 30 years ago, and there are today. There was a time, in the beginning, where scientists thought that it would be relatively easy to write bug free programs right away, but then they realized pretty soon that it wasn’t quite so. After all, software is written by us human beings, and we are doomed to make mistakes or omissions. The point of this article is not that software should be always bug free, but that we, coders, should always get them to the minimum, and here I’m going to present some ways to deal with programming in general.

One huge problem, as I’ve faced quite often, is that as a program grows in size and dependencies, its developers start losing trace of its components, get further away from the big picture, and ease the introduction of bugs. Note, I’m not talking here about bugs caused by a single human error that can be labeled as a cheap error by anyone who would look at the code. I’m talking about the sort of nasty bugs that nobody can spot right away with a glance at the code. I’m talking about system wide bugs, usually emerging as a result of hardly related subsystems of the program. Usually connections between dependencies and libraries.

Anyway, the path to write bug free code, is the one you step when you write robust code. What do I mean by that? Robust code has some features:

  • Well designed
  • Neat and tidy
  • Well named
  • Well commented
  • Well tested
  • It never segfaults

As a result of some of these, robust code is also:

  • Exstensible
  • Reusable
  • Lasting in time

Well designed.

Having already talked about this somewhere else, I’ll be brief on this section. Writing a complex program, a program made of hundreds of thousands lines of code, is a damn complicated thing: it takes many people and a lot of time. Usually, the more people you involve in the project, the less robust code you’ll get in the end. People will use different conventions and different styles. For this reason, not only it’s crucial to hire the right developers, but it’s essential to have a very strict and detailed specification of the project. Programming is a creative work, no doubt, and coders need to have freedom so they can breathe. A constrained coder is a chained coder, hence a dead coder and a threat to the quality of the end product. But, in spite of how much we care for the freedom and openness of initiative from the developers, we have to be aware that loosing control means lowering the quality. A large project must be designed thoroughly and carefully, in every single details. Even though programmers love freedom, most of them also love exhaustive documentation. If you want to make a good coder happy, and get the best out of him, flood him with docs and specs. Nothing pisses off the good coder as the lack of documentation: it tears his motivation apart. “Why should I start to read their minds and run by guesses” - he thinks, “when they didn’t even get the time to write good specs?”. Furthermore, a project without good specs looks superficial, destined to failure and without a future. A very good coder is hardly going to stay in a company that doesn’t make good design for the projects. He will think that it’s a loser company, and start looking around.

But what does good design mean? A good design is:

  • Exhaustive
  • Non redundant
  • Non contradictory
  • Easy to understand
  • Related 1:1 to the implementation

We want to cover every possible outcome in our specification, let be them exhaustive so that nothing will be left to case. We don’t want to repeat the same information more than once, and be redundant for several reasons, e.g. information should be retrievable in exactly one place, and it would ease up contradictions. Documentation should be for the developers, i.e. written in the most straightforward way for the right audience: simplicity of language and straightforwardness of tables and schemes will spare some curses from the developers. Furthermore, as a specification is just a way to put a program in words before it’s written, developers should be easily able to translate what they see on paper to code. Think about a shopping list: when I get one, I just go to the shop and take care of translating each item on the list to a physical item in my shopping cart. Direct and easy.

Neat and tidy

A good definition of neat is: in a pleasingly orderly and clean condition. How does that apply to software? What is neat software? One nice word that I like in that definition is “pleasingly”. Neat software pleases the eye and the mind. Don’t want to be cocky here, but neat software is something written by a good programmer, and will be appreciated by another good programmer. If somebody known as a good programmer points at some software and says “That’s neat” and you find yourself looking at it and replying “Huh? That’s just code”, I’m sorry but chances are that you are not a good programmer. A good programmer appreciates the beauty of some code, both on a small scale and on a large scale. Neatness of software on a small scale means that you’re able to look at one function and appreciate the simplicity of it. Neat pieces of code are easily readable and use good name conventions. Please read this article if you want to know more about good code on a small scale. Neat code on a larger scale, on the other hand, means neat integration between components and subsystem of a project. A bad integration would mean, e.g., having a project-wide global variable that points to a certain subsystem, and using it everywhere in the project. Or having two subsystems that, in a messed and intertwined way, mutually call each other’s methods violating several layers of abstraction. Proving what neat code is, turns up to be very difficult. It’s a bit like the opposite of what happens with common logic: if I want to prove you that, say, lions exist, I can just go to Africa, pick one and show it to you, then say “That’s a lion, ergo lions exist”. But how can I prove that unicorns or dragon don’t exist? You probably agree that it’s much more difficult. It’s just the opposite with neat code. I can show you bad code, and you will easily agree that it’s bad. But looking at neat code doesn’t it prove it neat right away. It takes probably years and years of experience, writing a lot of code and reading a lot.

Well named

This topic has already been discussed here, but repetuta juvant. As code is managed by possibly dozens or more people, being understood is an important key to increase robustness of the code. Writing robust code also means writing code that will easily stay robust when other people will modify of expand it, unless they have no clue, of course. The most your code is understood by others, the most likely they will not break your ideas, and keep the code robust. There are several ways of making own code easily understood, and having a good, consistent and solid naming convention is one of them. Of course, as discussed later, code needs to be well documented also.

Well commented

I know, I know. Everybody says that you should comment your code. That’s what I say and that’s what I’ve been told. Still I’m now comment my own code enough as I should. Before you can then tell me “Who are you, then, to tell me to comment my code, if you don’t do it enough with yours?” let me remind you that we learn from mistakes. What they don’t tell you about the importance of commenting code, is some subtle and psychological little thing. If you are a bad programmer, you’ll never produce good code. But if you are a good programmer, sometimes being in a hurry will make you produce really bad code. There are two reasons why this can happen: 1) you are in a hurry because you’re late with your deadlines. With this, there’s nothing to do. 2) you are in a hurry because you’re just coding fast, on the rush of some ideas that flashed you. In this case, commenting your code a lot will improve drastically the quality of your code. Always write your comments before writing the actual code. This will make you realize it, if your function is not really going to do what it’s supposed to do. Writing the comment will also help you think more about what you’re doing, and being more conscious about it. It will keep your state of mind clear and precise. I strongly recommend using Doxygen to generate a browseable HTML version of your comments, especially if you’re writing a library. Otherwise, it’s still going to keep you on a professional line, which is always a good thing.

Well tested

Write and use unit tests. If your code is well designed, there are good chances that each function in your code, or each class, performs a specific task in a certain way, and nothing more. Given a certain input, it will reliably return the same output. Right? You have to make sure of that, by writing test cases. Testing the smallest units of your program doesn’t ensure that the whole is working perfectly, but helps. Possibly, append a hook to your Source Code Versioning System (SVN? Darcs?) so that the automatic testing suite will run automatically on the server that hosts your repository, before it accepts your patch. This is quite easy with Darcs.

It never segfaults

Of course this point applies to the languages that allow segmentation fault, or NullPointerException (in Java). It’s easy to get: if your code segfaults, there are no excuses. No matter how stupid the provided input was, your program should not segfault. A good practice, is that each and every function/method would check it’s argument before doing anything. A solid exception handling structure is required. Again, you can object that I’m not really saying anything useful here: “Of course programs shouldn’t segfault, I knew it!”, but think about it: it’s a matter of attitude. You want to write a perfect program, and there are some things you have to keep in mind. Be paranoid with segfaults will implicitly and secretly improve the general quality of your code, without you even noticing.

Conclusion

Writing perfect code is impossible. Especially as the code grows in size and number of programmers. Achieving the impossible, then, is beyond any good intentioned coder. What we can do, though, is just try to have the right attitude, which is about precision, care and, sometimes, paranoia. Writing complex programs is not an easy thing, and, as such, should be handled with extreme care.


Get new articles via email

Related posts: