Friday, December 28, 2007

Interviews

I have great faith in people. I believe that everyone deserves a chance to prove themselves. But if one fails... that's a different story.
In the past week I've been interviewing computer scientists for various jobs. Usually, I'm looking for those top 20%. It doesn't matter it they excel in programming, algorithmic thinking or other technical topics, only that they excel at something. I don't mind spending time at teaching the material required to successfully fulfill a certain job, only that the person would be one that I'd know I'm not completely wasting my time on. Some of the best computer scientists I know, haven't touched a computer until they started their degree (or even later), the others are programming since they were 10-years-old, and speak Java better than Hebrew. So there is no formula to find the best people for the job. This is why interviews aren't simple, for both sides. It is very important to ask technical questions from different fields of computer science, and also to test the way one is thinking. So the interview might be long, stressing, dynamic and tiresome. But those who made good impression would usually know that, since they'll have this good feeling inside them after leaving the interview. I'm not a bad person, but there are some people who made me (yes, they made me) ask them "So, why did you learn computer science?", in the end of the interview (such question at the beginning is legitimate and makes sense). Think about that.

Saturday, December 22, 2007

Reverse engineering

Every now and then I find myself reading source code of some of the commercial products we use at my office. I won't specify the products' names, but I will mention some of the biggest vendors are in the list. When it comes to open source software, there is nothing wrong with what I'm doing: I'm having a problem, Google doesn't help much, after some time I decide it'll be best to see how the problematic piece of software is written and after some more time, the issue is solved (and a patch suggestion is submitted). But, when it comes to commercial products, the process involves and extra stage: reverse engineering. Also, almost never a code-fix suggestion is sent to the vendor.
So, what do we reverse engineer at our office? Things that don't require much to "reverse", such as Perl and JSP (yes, vendors do supply these) and things that require decompiling, such as Java classes (usually packed inside archives of some sort). Most major software companies use these technologies, so after reverse engineering one's code, it's not difficult to do this for another. The problem begins when trying to understand how the code works, and where is the culprit. No matter if it's Java of Perl, such code is usually unreadable. Usually, few hours or so are required to make progress.
Here are some examples for reasons for what we do:
* Product installation fails with no obvious reason. This is where the vendor blames our environment, and we have to prove it the problems lies at their code.
* Some product's features are failing. See above.
* The product is badly documented, if documented at all. The only way to understand the way it expects inputs or using resources, is by finding the right place in the code.
* Some programming framework (which are usually open source, such as Struts), is misbehaving, or deeper understanding is required.
One final word about this topic: Every professional developer and a system administrator should be able to do such tricks. Otherwise, one will have to rely on answers found in Google, or worse, patches from the vendors, both of which might come too little and too late.

Monday, December 17, 2007

Legacy Horror

Were you ever ordered to debug an application written ages ago? Did the original programmer was still around? Did the users contributed any valuable info besides "it's not our fault" or "the other guy knew how to solve this"? Did you think that the people who wrote software in technologies which are now obsolete, are idiots or incompetent programmers (no offense)?
Well, since I'm writing these questions, you can guess what would be my answers. This week I got to work on an issue, in an application written before the turn of the century, for people who still thinks (!) they should solve every problem with VB and Oracle Forms. Of course the issue was critical, and the blame was on us - the IT and IS departments. After three days of hard working, and the complete waste of time of about 5 software developers, the issue was solved. And still, after solving the problem, we still don't know what caused it. Code just disappeared from the application. We consider it "voodoo", and blame ourselves that we gave the users complete control over the application, so they could destroy it by accident (they'll never admit that, and we cannot prove that).
Some would say I'm too harsh, or mistaken. These things happen, and they might be our complete fault. But I believe our only mistake was to let users continue to work on such legacy application.
What is the life span of software developed in-house? 7 years? 10 years? And what are the costs of prolonging legacy applications' life? which is better: to rewrite using modern methodologies, or to patch the software until computer architecture changes so dramatically, so the software simply wouldn't work?
I wish I had school answers. Now I remember why I hate in-house software development so much. Nothing good comes out of it. And when problems arise, it happens so many years after the software was written, that nobody knows how to solve them. So, the software costs money (and resources) when written, when fixed, when rewritten, and all over again.

Friday, December 14, 2007

More than a cell phone

Recently I purchased a Nokia E65. This is my first smartphone. For sometime I knew I wanted a device that combines my cell phone (used to have a cell phone of every Israeli cellular telcom. at the same time), my MP3 player (had a Sandisk Sansa E140 which broke last week), a simple camera (to catch everyday events), a GPS (lost without it) and some gaming and office on-the-go (like a pocket PC). It's impressive to see how far mobile technology has advanced, since I can get all of the above (after buying a GPS antenna) in a single lightweight device.
After a day or two of using my new super-smart-phone, I decided to look for some extra software. This is where the story really gets better. There are thousands of applications written for S60 (the platform on which SymbianOS runs). Many of them are freeware/open source software. Simple googling finds everything, from games, such as Frozen Bubble, to applications, such as MySQL and a Python interperter. So i rushed and downloaded it all. Now my device is bloated with software I don't need, and applications I'll never use. But I'm happy.
A week after, I downloaded the SDK from Forum Nokia. It amused me to see they have a platform called MOSH (MObile and SHaring. which is also my nickname). Anyway, using the SDK, I can develop and sign application on my own, using one of my favorite programming languages - Java. Of course I plan to release these applications to the wild, with their source code. I just hope there are enough programmers out there, who are interested in helping developing software for S60.